Offline Arbeiten
(wie im letzten Jahrtausend)
         rails-konferenz.de 2007

         Jens-Christian Fischer
         ht...
Notizen einer Reise
„The Internet is a series of tubes“
                    – Ted Stevens
Das Internet wiegt
    ca. 60 Gramm




http://adamant.typepad.com/seitz/2006/10/weighing_the_we.html
Web No Web
Web No Web
Offline Szenarios

Flugzeug, Bahn, Auto
Beim Kunden (Firewalls)
In der Wüste
...
Lösung 0.1
Lösung 1.0
Lösung 1.0
  1986
Lösung 1.0
  1986
Lösung 1.0
   1986




Lotus Notes 1.0
Replikation
Replikation
Redundanz ist gut
Redundanz ist gut
• keine Relationen
Redundanz ist gut
• keine Relationen
• keine „richtige“ Datenbank
Redundanz ist gut
• keine Relationen
• keine „richtige“ Datenbank
• free-form „Dokumente“
Redundanz ist gut
• keine Relationen
• keine „richtige“ Datenbank
• free-form „Dokumente“
• skaliert nicht
Redundanz ist gut
• keine Relationen
• keine „richtige“ Datenbank
• free-form „Dokumente“
• skaliert nicht
Redundanz ist gut
• keine Relationen
• keine „richtige“ Datenbank
• free-form „Dokumente“
• skaliert nicht

• aber replizi...
Laptop Benutzer




               Telefon
                netz




    Server 2



                            Server 1

...
Lösung nach DHH




http://www.37signals.com/svn/posts/347-youre-not-on-a-
       fucking-plane-and-if-you-are-it-doesnt-m...
Lösung nach DHH




http://www.37signals.com/svn/posts/347-youre-not-on-a-
       fucking-plane-and-if-you-are-it-doesnt-m...
Lösung nach DHH


   f*** you
http://www.37signals.com/svn/posts/347-youre-not-on-a-
       fucking-plane-and-if-you-are-i...
Realität
Realität
Realität
Offline Lösungen

• Adobe Integrated Runtime (AIR)
• Google Gears
• Joyent Slingshot
AIR
AIR

 Flash standalone
AIR

 Flash standalone
       Flash!
AIR

  Flash standalone
        Flash!
Offline Möglichkeiten
AIR

  Flash standalone
        Flash!
Offline Möglichkeiten
  (roll your own)
Google Gears
The Rails Way?
Slingshot

• Lokaler Applikationsserver (mongrel)
• Datenbank (SQLite)
• Applikation mit Webbbrowser
  (Mac OS X, Windows)...
Demo


legacy Rails Applikation
Demo

                  en
                b
legacy Rails Applikation
             ho
          sc
       er
      v
Implementation
hic sunt dracones
App
svn co http://svn.joyent.com/slingshot/osx
To-Do Liste
• Datenbank anpassen
• SyncController
• Sync Up / Sync Down
• Haare ausreissen
• HTTP Authentication
• Drag & ...
Datenbank
Alle synchronisierten Tabellen müssen
created_at und updated_at Spalten enthalten


Ich bin mir nicht sicher, ob...
SyncController

$ ruby script/plugin install ... slingshot_plugin
$ ruby script/generate sync_controller
routes

map.with_options(:controller =>
                  'slingshot_sync') do |sync|
    sync.up   'sync/up', :action => ...
Sync Controller




auch in slingshot_task.rake in vendor/plugins...!
Sync Controller


                    Tasc




auch in slingshot_task.rake in vendor/plugins...!
Down Sync Testen
Down Sync Testen
Arwen:~/dev/rtime jcf$ ruby script/server -p 3030
=> Booting Mongrel (use 'script/server webrick' to forc...
Down Sync Testen
Arwen:~/dev/rtime jcf$ ruby script/server -p 3030
=> Booting Mongrel (use 'script/server webrick' to forc...
Lokal bearbeiten
Arwen:~/dev/rtime-s/VM/trunk jcf$ ruby script/server
    Slingsho
               t


                   S...
Up Sync Testen
Arwen:~/dev/rtime-s/VM jcf$ ./bin/sync_up.sh jcf 123456 localhost:3030
(in /Users/jcf/dev/rtime-s/VM/trunk)...
Quiz!

• Was passiert, wenn Änderungen sowohl in
  der lokalen Kopie und auf dem Server
  gemacht werden?
• Was passiert, ...
Replikationskonflikt
Replikationskonflikt
id
42
e9638f8c-200c-11dc-
 a6c3-0016cb8a850e
UUID statt ID

   $ sudo gem install uuidtools
   app/helpers/uuidhelper.rb




http://codesnipers.com/?q=node/143&title=U...
DB Adapter hacking
DB Adapter hacking
DB Setup
DB Setup
DB Setup
DB Setup
Model
Slingshot Hacking
    lib/slingshot.rb
Slingshot Hacking
    lib/slingshot.rb
Der Weg ist das Ziel
Gotcha?
== AddSlinghotColumns: migrating
==============================================
-- add_column(:customers, :created...
Gotcha 2

• Beim synchronisieren in die lokale DB wird
  AR.save aufgerufen
• Aufpassen auf Validierungen, before_create,
...
Gotcha 3
Gotcha 3
Gotcha 3
Gotcha 4


ActiveRecord::Base.default_timezone = :utc
Gut
Gut
      es funktioniert
Gut
      es funktioniert
       (irgendwann)
Gut
         es funktioniert
           (irgendwann)
  Windows & Mac Version
Gut
         es funktioniert
           (irgendwann)
  Windows & Mac Version
            OpenSource
Gut
         es funktioniert
           (irgendwann)
  Windows & Mac Version
            OpenSource
           (irgendwann)
Schlecht
Schlecht



    Applikation ist 100MB gross
Schlecht



    Applikation ist 100MB gross
                         (noch)
Schlecht



    Applikation ist 100MB gross
                          (noch)
         Sehr primitives Syncing
Schlecht



     Applikation ist 100MB gross
                           (noch)
          Sehr primitives Syncing
  keine A...
Schlecht



     Applikation ist 100MB gross
                           (noch)
          Sehr primitives Syncing
  keine A...
Vorwärts in die Vergangenheit
Vorwärts in die Vergangenheit




verteilte Datenhaltung und Abgleich sind keine
             trivialen Probleme...
Vorwärts in die Vergangenheit




verteilte Datenhaltung und Abgleich sind keine
             trivialen Probleme...
    vo...
Vorwärts in die Vergangenheit




verteilte Datenhaltung und Abgleich sind keine
             trivialen Probleme...
    vo...
Einsatzgebiete (heute)
Einsatzgebiete (heute)

Single User Anwendungen (ToDo Liste)
Einsatzgebiete (heute)

Single User Anwendungen (ToDo Liste)
      strikte Trennung der generierten /
    bearbeiteten Dat...
Einsatzgebiete (heute)

Single User Anwendungen (ToDo Liste)
      strikte Trennung der generierten /
     bearbeiteten Da...
Einsatzgebiete (morgen)
Einsatzgebiete (morgen)

 Beliebige Web 1.0, 1.5 und Web
        2.0 (beta) Anwendungen
Einsatzgebiete (morgen)

 Beliebige Web 1.0, 1.5 und Web
        2.0 (beta) Anwendungen


       Überall, Immer, Jederzeit
Ressourcen

http://developer.joyent.net
http://invisible.ch/projects/rtime/branches/slingshot
http://blog.invisible.ch
jcf...
Photo Credits
•   road: http://flickr.com/photos/glennharper/49536169/

•   Karte: http://www.maphist.nl/ill/glareanus.jpg
...
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Offline Arbeiten
Upcoming SlideShare
Loading in …5
×

Offline Arbeiten

1,989 views

Published on

Rails Applikationen Offline nehmen. Ein Überblick über Techniken und vertiefte Betrachtung zu Joyent Slingshot

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,989
On SlideShare
0
From Embeds
0
Number of Embeds
34
Actions
Shares
0
Downloads
42
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Offline Arbeiten

  1. 1. Offline Arbeiten (wie im letzten Jahrtausend) rails-konferenz.de 2007 Jens-Christian Fischer http://blog.invisible.ch
  2. 2. Notizen einer Reise
  3. 3. „The Internet is a series of tubes“ – Ted Stevens
  4. 4. Das Internet wiegt ca. 60 Gramm http://adamant.typepad.com/seitz/2006/10/weighing_the_we.html
  5. 5. Web No Web
  6. 6. Web No Web
  7. 7. Offline Szenarios Flugzeug, Bahn, Auto Beim Kunden (Firewalls) In der Wüste ...
  8. 8. Lösung 0.1
  9. 9. Lösung 1.0
  10. 10. Lösung 1.0 1986
  11. 11. Lösung 1.0 1986
  12. 12. Lösung 1.0 1986 Lotus Notes 1.0
  13. 13. Replikation
  14. 14. Replikation
  15. 15. Redundanz ist gut
  16. 16. Redundanz ist gut • keine Relationen
  17. 17. Redundanz ist gut • keine Relationen • keine „richtige“ Datenbank
  18. 18. Redundanz ist gut • keine Relationen • keine „richtige“ Datenbank • free-form „Dokumente“
  19. 19. Redundanz ist gut • keine Relationen • keine „richtige“ Datenbank • free-form „Dokumente“ • skaliert nicht
  20. 20. Redundanz ist gut • keine Relationen • keine „richtige“ Datenbank • free-form „Dokumente“ • skaliert nicht
  21. 21. Redundanz ist gut • keine Relationen • keine „richtige“ Datenbank • free-form „Dokumente“ • skaliert nicht • aber repliziert! (prä Internet)
  22. 22. Laptop Benutzer Telefon netz Server 2 Server 1 beliebige Topologien beliebig viele Repliken
  23. 23. Lösung nach DHH http://www.37signals.com/svn/posts/347-youre-not-on-a- fucking-plane-and-if-you-are-it-doesnt-matter
  24. 24. Lösung nach DHH http://www.37signals.com/svn/posts/347-youre-not-on-a- fucking-plane-and-if-you-are-it-doesnt-matter
  25. 25. Lösung nach DHH f*** you http://www.37signals.com/svn/posts/347-youre-not-on-a- fucking-plane-and-if-you-are-it-doesnt-matter
  26. 26. Realität
  27. 27. Realität
  28. 28. Realität
  29. 29. Offline Lösungen • Adobe Integrated Runtime (AIR) • Google Gears • Joyent Slingshot
  30. 30. AIR
  31. 31. AIR Flash standalone
  32. 32. AIR Flash standalone Flash!
  33. 33. AIR Flash standalone Flash! Offline Möglichkeiten
  34. 34. AIR Flash standalone Flash! Offline Möglichkeiten (roll your own)
  35. 35. Google Gears
  36. 36. The Rails Way?
  37. 37. Slingshot • Lokaler Applikationsserver (mongrel) • Datenbank (SQLite) • Applikation mit Webbbrowser (Mac OS X, Windows) • Desktop Integration (Drag & Drop)
  38. 38. Demo legacy Rails Applikation
  39. 39. Demo en b legacy Rails Applikation ho sc er v
  40. 40. Implementation
  41. 41. hic sunt dracones
  42. 42. App svn co http://svn.joyent.com/slingshot/osx
  43. 43. To-Do Liste • Datenbank anpassen • SyncController • Sync Up / Sync Down • Haare ausreissen • HTTP Authentication • Drag & Drop • Packaging
  44. 44. Datenbank Alle synchronisierten Tabellen müssen created_at und updated_at Spalten enthalten Ich bin mir nicht sicher, ob das eine gute Idee ist... Timezone...
  45. 45. SyncController $ ruby script/plugin install ... slingshot_plugin $ ruby script/generate sync_controller
  46. 46. routes map.with_options(:controller => 'slingshot_sync') do |sync| sync.up 'sync/up', :action => 'up' sync.down 'sync/down', :action => 'down' sync.log 'sync/log', :action => 'log' end
  47. 47. Sync Controller auch in slingshot_task.rake in vendor/plugins...!
  48. 48. Sync Controller Tasc auch in slingshot_task.rake in vendor/plugins...!
  49. 49. Down Sync Testen
  50. 50. Down Sync Testen Arwen:~/dev/rtime jcf$ ruby script/server -p 3030 => Booting Mongrel (use 'script/server webrick' to force WEBrick) => Rails application starting on http://0.0.0.0:3030 => Call with -d to detach => Ctrl-C to shutdown server ** Starting Mongrel listening at 0.0.0.0:3030
  51. 51. Down Sync Testen Arwen:~/dev/rtime jcf$ ruby script/server -p 3030 => Booting Mongrel (use 'script/server webrick' to force WEBrick) => Rails application starting on http://0.0.0.0:3030 => Call with -d to detach => Ctrl-C to shutdown server ** Starting Mongrel listening at 0.0.0.0:3030 Arwen:~/dev/rtime-s/VM jcf$ ./bin/sync_down.sh jcf 123456 localhost:3030 (in /Users/jcf/dev/rtime-s/VM/trunk) Syncing downward /Users/jcf/dev/rtime-s/VM/trunk/config/.. offline mode is http://jcf:123456@localhost:3030/sync response.body <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <SlingshotDown> <CurrentMigration>2</CurrentMigration> <SyncTime>Wed Jun 20 20:27:26 UTC 2007</SyncTime> <ValidIDBlock>customers,1 projects,1 tasks,1 users,1
  52. 52. Lokal bearbeiten Arwen:~/dev/rtime-s/VM/trunk jcf$ ruby script/server Slingsho t Server
  53. 53. Up Sync Testen Arwen:~/dev/rtime-s/VM jcf$ ./bin/sync_up.sh jcf 123456 localhost:3030 (in /Users/jcf/dev/rtime-s/VM/trunk) ** Invoke joyent_slingshot:sync_up (first_time) ** Execute joyent_slingshot:sync_up Syncing upward /Users/jcf/dev/rtime-s/VM/trunk/config/.. offline mode is #<Tasc:0x2482320> <SlingshotUp> <CreatedRecords> <tascs> <tasc> <billable type=quot;booleanquot;>true</billable> <created-at type=quot;datetimequot;>2007-06-21T08:16:44Z</created-at> <description>blubber</description>
  54. 54. Quiz! • Was passiert, wenn Änderungen sowohl in der lokalen Kopie und auf dem Server gemacht werden? • Was passiert, wenn neue Einträge lokal und auf dem Server gemacht werden?
  55. 55. Replikationskonflikt
  56. 56. Replikationskonflikt
  57. 57. id
  58. 58. 42
  59. 59. e9638f8c-200c-11dc- a6c3-0016cb8a850e
  60. 60. UUID statt ID $ sudo gem install uuidtools app/helpers/uuidhelper.rb http://codesnipers.com/?q=node/143&title=Using-UUID/GUID-as-Primary-Key-in-Rails
  61. 61. DB Adapter hacking
  62. 62. DB Adapter hacking
  63. 63. DB Setup
  64. 64. DB Setup
  65. 65. DB Setup
  66. 66. DB Setup
  67. 67. Model
  68. 68. Slingshot Hacking lib/slingshot.rb
  69. 69. Slingshot Hacking lib/slingshot.rb
  70. 70. Der Weg ist das Ziel
  71. 71. Gotcha? == AddSlinghotColumns: migrating ============================================== -- add_column(:customers, :created_at, :datetime) rake aborted! SQLite3::SQLException: near quot;ADDquot;: syntax error: ALTER TABLE customers ADD quot;created_atquot; datetime unterschiedliche Version von SQLite3 auf der Entwicklungsmaschine und im Slingshot Verzeichnis $ source jenv.sh
  72. 72. Gotcha 2 • Beim synchronisieren in die lokale DB wird AR.save aufgerufen • Aufpassen auf Validierungen, before_create, before_save etc...
  73. 73. Gotcha 3
  74. 74. Gotcha 3
  75. 75. Gotcha 3
  76. 76. Gotcha 4 ActiveRecord::Base.default_timezone = :utc
  77. 77. Gut
  78. 78. Gut es funktioniert
  79. 79. Gut es funktioniert (irgendwann)
  80. 80. Gut es funktioniert (irgendwann) Windows & Mac Version
  81. 81. Gut es funktioniert (irgendwann) Windows & Mac Version OpenSource
  82. 82. Gut es funktioniert (irgendwann) Windows & Mac Version OpenSource (irgendwann)
  83. 83. Schlecht
  84. 84. Schlecht Applikation ist 100MB gross
  85. 85. Schlecht Applikation ist 100MB gross (noch)
  86. 86. Schlecht Applikation ist 100MB gross (noch) Sehr primitives Syncing
  87. 87. Schlecht Applikation ist 100MB gross (noch) Sehr primitives Syncing keine Auflösung von Konflikten
  88. 88. Schlecht Applikation ist 100MB gross (noch) Sehr primitives Syncing keine Auflösung von Konflikten kein erkennen von Konflikten
  89. 89. Vorwärts in die Vergangenheit
  90. 90. Vorwärts in die Vergangenheit verteilte Datenhaltung und Abgleich sind keine trivialen Probleme...
  91. 91. Vorwärts in die Vergangenheit verteilte Datenhaltung und Abgleich sind keine trivialen Probleme... vor allem in relationalen Datenbanken
  92. 92. Vorwärts in die Vergangenheit verteilte Datenhaltung und Abgleich sind keine trivialen Probleme... vor allem in relationalen Datenbanken
  93. 93. Einsatzgebiete (heute)
  94. 94. Einsatzgebiete (heute) Single User Anwendungen (ToDo Liste)
  95. 95. Einsatzgebiete (heute) Single User Anwendungen (ToDo Liste) strikte Trennung der generierten / bearbeiteten Daten (Zeiterfassung)
  96. 96. Einsatzgebiete (heute) Single User Anwendungen (ToDo Liste) strikte Trennung der generierten / bearbeiteten Daten (Zeiterfassung) File Upload / Download (Drag & Drop)
  97. 97. Einsatzgebiete (morgen)
  98. 98. Einsatzgebiete (morgen) Beliebige Web 1.0, 1.5 und Web 2.0 (beta) Anwendungen
  99. 99. Einsatzgebiete (morgen) Beliebige Web 1.0, 1.5 und Web 2.0 (beta) Anwendungen Überall, Immer, Jederzeit
  100. 100. Ressourcen http://developer.joyent.net http://invisible.ch/projects/rtime/branches/slingshot http://blog.invisible.ch jcf@invisible.ch
  101. 101. Photo Credits • road: http://flickr.com/photos/glennharper/49536169/ • Karte: http://www.maphist.nl/ill/glareanus.jpg • Beach: http://flickr.com/photos/bryce_edwards/522900051/ • angel: http://flickr.com/photos/jesst7/396824760/ • bike: http://flickr.com/photos/vrogy/514733529/ • devil: http://flickr.com/photos/annia316/312666478/ • pipes, philosophers stone, bangkor library, bowl, cat cabling, alp-pc: from flickr with cc licenses, urls lost in crash - please contact me for proper credits • book: iStockPhoto • Lotus Notes: IBM Corp.

×