SlideShare a Scribd company logo
1 of 49
LESS TIME
      LESS CODE
    LESS HEADACHE
Lithium: the framework that tries to suck less
THE GOAL
• Posting   with photo upload

• RSS   updates

• Geo-tagged      images & geo-spatial search

• Logging?
$ git clone 
  git://dev.lithify.me/lithium.git 
  photoblog



Bonus Points – add the li3 command to your system PATH:
http://bit.ly/li3path
http://path/to/web/photoblog
$ cd photoblog/app
$ chmod -R 777 resources/
http://path/to/web/photoblog
photoblog/config/bootstrap.php
require __DIR__ . '/bootstrap/connections.php';




photoblog/config/bootstrap/connections.php
use lithiumdataConnections;

Connections::add('default', array(
    'type' => 'MongoDb',
    'host' => 'localhost',
    'database' => 'photoblog'
));
ALTERNATIVES...
photoblog/config/bootstrap/connections.php
use lithiumdataConnections;

Connections::add('default', array(
    'type' => 'http',
    'adapter' => 'CouchDb',
    'host' => 'localhost',
    'database' => 'app'
));
ALTERNATIVES...
photoblog/config/bootstrap/connections.php
use lithiumdataConnections;

Connections::add('default', array(
    'type' => 'database',
    'adapter' => 'MySql',
    'host' => 'localhost',
    'login' => 'web',
    'password' => 'sekrit',
    'database' => 'app'
));
$ li3 create Photos
Photos created in appmodels.
PhotosController created in appcontrollers.
PhotosTest created in apptestscasesmodels.
PhotosControllerTest created in apptestscasescontrollers.
http://path/to/web/photoblog/photos
photoblog/controllers/PhotosController.php
class PhotosController extends lithiumactionController {

    public function index() {
        $photos = Photos::all();
        return compact('photos');
    }

    // ...
}
photoblog/views/photos/index.html.php
<?php if (!count($photos)): ?>
    <em>No photos</em>.
    <?=$this->html->link('Add one', 'Photos::add'); ?>.
<?php endif ?>
http://path/to/web/photoblog/photos
photoblog/controllers/PhotosController.php
  public function add() {
      $photo = Photo::create();


      if (($this->request->data) && $photo->save($this->request->data)) {
          $this->redirect(array('Photos::view', 'id' => $photo->_id));
          $this->redirect(array('Photos::view', 'id' => $photo->_id));
      }
      $this->_render['template'] = 'edit';
      return compact('photo');
  }
photoblog/views/photos/edit.html.php
<?=$this->form->create($photo, array('type' => 'file')); ?>
    <?=$this->form->field('title'); ?>
    <?=$this->form->field('description'); ?>
    <?php if (!$photo->exists()) { ?>
        <?=$this->form->field('file', array('type' => 'file')); ?>
    <?php } ?>
    <?=$this->form->submit('Save'); ?>
<?=$this->form->end(); ?>
http://path/to/web/photoblog/photos/add
photoblog/models/Photos.php
class Photo extends lithiumdataModel {

    public $validates = array();

    protected $_meta = array('source' => 'fs.files');

}
http://path/to/web/photoblog/photos/add
http://path/to/web/photoblog/photos/add
photoblog/config/routes.php
Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}.{:type}', array('id' => null));
Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}');
photoblog/config/routes.php
Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}.{:type}', array('id' => null));
Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}');




                                  {:id:[0-9a-f]{24}}
http://path/to/web/photoblog/photos/view/...
photoblog/views/photos/view.html.php
<h1><?=$photo->title; ?></h1>
<p><?=$photo->description; ?></p>
<p>
     <?=$this->html->link('Edit', array('Photos::edit', 'id' => $photo->_id)); ?>
</p>

<?=$this->html->image("/photos/view/{$photo->_id}.jpg", array(
    'alt' => $photo->title,
    'width' => 500
)); ?>
http://path/to/web/photoblog/photos/view/...
photoblog/config/bootstrap.php
/**
 * This file contains configurations for handling different
 * content types within the framework, including converting data to
 * and from different formats, and handling static media assets.
 */
require __DIR__ . '/bootstrap/media.php';



photoblog/config/bootstrap/media.php
Media::type('jpg', 'image/jpeg', array(
    'cast' => false,
    'encode' => function($data) {
        return $data['photo']->file->getBytes();
    }
));
http://path/to/web/photoblog/photos/view/...
Router::connect('/.../{:id:[0-9a-f]{24}}. {:type}
                                          {:type}', array(...));




                       Controller
                        $photo


                         Media

       HTML              JSON                  JPEG
  templateView          => array( )          Media type
                                               handler
View         Layout      json_encode( )
photoblog/config/routes.php
use appmodelsPhotos;
use lithiumactionResponse;

Router::connect('/photos/view/{:id:[0-9a-f]{24}}.jpg', array(), function($request) {
    return new Response(array(
        'headers' => array('Content-type' => 'image/jpeg'),
        'body' => Photos::first($request->id)->file->getBytes()
    ));
});
photoblog/views/photos/index.html.php
<ul>
<?php foreach ($photos as $photo): ?>
     <li>
         <?=$this->html->link($photo->title, array(
             'controller' => 'photos',
             'action' => 'view',
             'id' => $photo->_id
         )); ?>
     </li>
<?php endforeach ?>
</ul>
http://path/to/web/photoblog/photos
photoblog/views/photos/index.html.php
<ul>
<?php foreach ($photos as $photo): ?>
     <li>
         <?=$this->html->image(
             "/photos/view/{$photo->_id}.jpg",
             array('width'=> 100)
         ); ?>
         <?=$this->html->link(
             $photo->title,
             array('Photos::view', 'id' => $photo->_id)
             array('Photos::view', 'id' => $photo->_id)
         ); ?>
     </li>
<?php endforeach ?>
</ul>
http://path/to/web/photoblog/photos
photoblog/config/bootstrap/media.php

Media::type('rss', 'application/rss+xml');
photoblog/views/layouts/default.rss.php
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel>
        <title>Photos</title>
        <pubDate>
            <?=date("D, j M Y H:i:s", gmmktime()) . ' GMT'; ?>
        </pubDate>
        <?=$this->content(); ?>
    </channel>
</rss>
photoblog/views/photos/index.rss.php
<?php foreach ($photos as $photo): ?>
<item>
    <title><?=$photo->title; ?></title>
    <link><?=$this->url(array('Photos::view', 'id' => $photo->_id)); ?></link>
    <description><?=$photo->description; ?></description>
</item>
<?php endforeach; ?>
http://path/to/web/photoblog/photos.rss
http://path/to/web/photoblog/photos.json
[{
     "photo": {
         "_id": "4d70c5017675ab4de900001f",
         "title": "FML",
         "description": "How the subway schedule sometimes makes me feel.",
         "filename": "FML.jpg",
         "uploadDate": 1299236097,
         "length": 452751,
         "chunkSize": 262144,
         "md5": "e74c961185efdd69acbccaa59b7b13c0",
         "file": { ... }
     }
}]
$ cd libraries/

$ git clone 
  code@dev.lithify.me:li3_geo.git


Note – you will need an account. Sign up here:
http://dev.lithify.me/users/add
photoblog/config/bootstrap/libraries.php
/**
 * Add some plugins
 */
Libraries::add('li3_geo');
photoblog/models/Photos.php
use li3_geoextensionsGeocoder;
use li3_geoextensionsdatabehaviorLocatable;

class Photos extends lithiumdataModel {

    // ...

    public static function __init() {
        parent::__init();

        Locatable::bind(__CLASS__, array('fields' => array(
             'location.latitude', 'location.longitude'
        )));
    }
}
photoblog/models/Photos.php
   public function save($entity, $data = null, array $options = array()) {
       if ($data) {
           $entity->set($data);
       }
       if (!$entity->exists() && isset($entity->file->tmp_name)) {
           $entity->location = Geocoder::exifCoords(
               exif_read_data($entity->file->tmp_name)
           );
       }
       return parent::save($entity, null, $options);
   }
photoblog/controllers/PhotosController.php
use li3_geoextensionsGeocoder;

// ...

    public function near($place = null) {
        $this->_render['template'] = 'index';
        $location = Geocoder::find('google', $place);
        $photos = Photos::near($location, array('limit' => 5));
        return compact('photos');
    }
http://.../photos/near/New+York,+NY
photoblog/config/bootstrap/logging.php
use lithiumanalysisLogger;
use lithiumdataConnections;

Logger::config(array(
    'default' => array('adapter' => 'File')
));
photoblog/config/bootstrap/logging.php
Connections::get('default')->applyFilter('read', function($self, $params, $chain) {
    $query = $params['query'];

      Logger::debug(
         'Read:   ' . $query->source() . ': ' . json_encode($query->conditions())
      );

      return $chain->next($self, $params, $chain);
});
photoblog/config/bootstrap/logging.php
Connections::get('default')->applyFilter('update', function($self, $params, $chain) {
    $query = $params['query'];
    $data = json_encode($query->conditions()) . ', ' . json_encode($query->data());
    Logger::debug('Update: ' . $query->source() . ": {$data}");

      return $chain->next($self, $params, $chain);
});
photoblog/resources/tmp/logs/debug.log
2011-03-04 18:37:07 Read:   fs.files: {"location":{"$near":{"latitude":
40.7143528,"longitude":-74.0059731}}}
2011-03-04 18:37:07 Read:   fs.files: {"_id":"4d710afc7675ab95d0000004"}
Thanks, y’all!
Getting connected              AOP Resources
lithify.me                   bit.ly/aop-design

github.com/UnionOfRAD         bit.ly/aop-gwoo

#li3   on irc.freenode.net      bit.ly/aop-li3

@nateabele                      bit.ly/aop-oop

@UnionOfRAD                   bit.ly/mwop-aop

More Related Content

Viewers also liked

Introducing Zend Studio 10 Japanese Edition
Introducing Zend Studio 10 Japanese EditionIntroducing Zend Studio 10 Japanese Edition
Introducing Zend Studio 10 Japanese EditionSatoru Yoshida
 
Measuring Your Code 2.0
Measuring Your Code 2.0Measuring Your Code 2.0
Measuring Your Code 2.0Nate Abele
 
Practical PHP 5.3
Practical PHP 5.3Practical PHP 5.3
Practical PHP 5.3Nate Abele
 
Building Apps with MongoDB
Building Apps with MongoDBBuilding Apps with MongoDB
Building Apps with MongoDBNate Abele
 
City of Salina Brochure - Tenants Know Your Rights (Spanish)
City of Salina Brochure - Tenants Know Your Rights (Spanish)City of Salina Brochure - Tenants Know Your Rights (Spanish)
City of Salina Brochure - Tenants Know Your Rights (Spanish)City of Salina
 
INFLIGHT LUXURY web
INFLIGHT LUXURY webINFLIGHT LUXURY web
INFLIGHT LUXURY webAna Zeković
 
Cadison R10
Cadison  R10Cadison  R10
Cadison R10CADISON
 
ExperienceGuru - ASAE Meetings Journey Mapping
ExperienceGuru - ASAE Meetings Journey MappingExperienceGuru - ASAE Meetings Journey Mapping
ExperienceGuru - ASAE Meetings Journey MappingJohn Pytel
 
Prevención, detección y contención de ataques de denegación de servicio
Prevención, detección y contención de ataques de denegación de servicioPrevención, detección y contención de ataques de denegación de servicio
Prevención, detección y contención de ataques de denegación de serviciodcerezo
 
Eleva tu Estilo con Calvin Klein - Campaña
Eleva tu Estilo con Calvin Klein - CampañaEleva tu Estilo con Calvin Klein - Campaña
Eleva tu Estilo con Calvin Klein - CampañaRodrigo Torres
 
FINANCIACION Y SUBVENCIONES SECTOR HOTELEROS
FINANCIACION Y SUBVENCIONES SECTOR HOTELEROSFINANCIACION Y SUBVENCIONES SECTOR HOTELEROS
FINANCIACION Y SUBVENCIONES SECTOR HOTELEROSMentor Day
 
Iftm university prospectus 2016 17 educationiconnect.com 7862004786
Iftm university prospectus 2016 17 educationiconnect.com 7862004786Iftm university prospectus 2016 17 educationiconnect.com 7862004786
Iftm university prospectus 2016 17 educationiconnect.com 786200478600007123
 

Viewers also liked (19)

Introducing Zend Studio 10 Japanese Edition
Introducing Zend Studio 10 Japanese EditionIntroducing Zend Studio 10 Japanese Edition
Introducing Zend Studio 10 Japanese Edition
 
Measuring Your Code 2.0
Measuring Your Code 2.0Measuring Your Code 2.0
Measuring Your Code 2.0
 
Practical PHP 5.3
Practical PHP 5.3Practical PHP 5.3
Practical PHP 5.3
 
Building Apps with MongoDB
Building Apps with MongoDBBuilding Apps with MongoDB
Building Apps with MongoDB
 
City of Salina Brochure - Tenants Know Your Rights (Spanish)
City of Salina Brochure - Tenants Know Your Rights (Spanish)City of Salina Brochure - Tenants Know Your Rights (Spanish)
City of Salina Brochure - Tenants Know Your Rights (Spanish)
 
INFLIGHT LUXURY web
INFLIGHT LUXURY webINFLIGHT LUXURY web
INFLIGHT LUXURY web
 
Telefono ladrillo
Telefono ladrilloTelefono ladrillo
Telefono ladrillo
 
Cadison R10
Cadison  R10Cadison  R10
Cadison R10
 
ExperienceGuru - ASAE Meetings Journey Mapping
ExperienceGuru - ASAE Meetings Journey MappingExperienceGuru - ASAE Meetings Journey Mapping
ExperienceGuru - ASAE Meetings Journey Mapping
 
O trem e a cidade
O trem e a cidadeO trem e a cidade
O trem e a cidade
 
Prevención, detección y contención de ataques de denegación de servicio
Prevención, detección y contención de ataques de denegación de servicioPrevención, detección y contención de ataques de denegación de servicio
Prevención, detección y contención de ataques de denegación de servicio
 
El ejercicio es salud
El ejercicio es saludEl ejercicio es salud
El ejercicio es salud
 
Danske Kommuner
Danske KommunerDanske Kommuner
Danske Kommuner
 
Reino Plantae
Reino PlantaeReino Plantae
Reino Plantae
 
Que es-ingenieria (1)
Que es-ingenieria (1)Que es-ingenieria (1)
Que es-ingenieria (1)
 
Connectivism and Connected Knowledge 2012
Connectivism and Connected Knowledge 2012Connectivism and Connected Knowledge 2012
Connectivism and Connected Knowledge 2012
 
Eleva tu Estilo con Calvin Klein - Campaña
Eleva tu Estilo con Calvin Klein - CampañaEleva tu Estilo con Calvin Klein - Campaña
Eleva tu Estilo con Calvin Klein - Campaña
 
FINANCIACION Y SUBVENCIONES SECTOR HOTELEROS
FINANCIACION Y SUBVENCIONES SECTOR HOTELEROSFINANCIACION Y SUBVENCIONES SECTOR HOTELEROS
FINANCIACION Y SUBVENCIONES SECTOR HOTELEROS
 
Iftm university prospectus 2016 17 educationiconnect.com 7862004786
Iftm university prospectus 2016 17 educationiconnect.com 7862004786Iftm university prospectus 2016 17 educationiconnect.com 7862004786
Iftm university prospectus 2016 17 educationiconnect.com 7862004786
 

Recently uploaded

Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 

Recently uploaded (20)

Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 

Less Time, Less Code, Less Headache

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n