View
3.096
Download
0
Category
Preview:
DESCRIPTION
Rails Applikationen Offline nehmen. Ein Überblick über Techniken und vertiefte Betrachtung zu Joyent Slingshot
Citation preview
Offline Arbeiten(wie im letzten Jahrtausend)
rails-konferenz.de 2007
Jens-Christian Fischerhttp://blog.invisible.ch
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
Flugzeug, Bahn, Auto
Beim Kunden (Firewalls)
In der Wüste
...
Offline Szenarios
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 repliziert! (prä Internet)
Telefon
netz
Laptop Benutzer
Server 1
Server 2
beliebige Topologienbeliebig viele Repliken
Lösung nach DHH
http://www.37signals.com/svn/posts/347-youre-not-on-a-fucking-plane-and-if-you-are-it-doesnt-matter
Lösung nach DHH
http://www.37signals.com/svn/posts/347-youre-not-on-a-fucking-plane-and-if-you-are-it-doesnt-matter
Lösung nach DHH
f*** youhttp://www.37signals.com/svn/posts/347-youre-not-on-a-
fucking-plane-and-if-you-are-it-doesnt-matter
Realität
Realität
Realität
Offline Lösungen
• Adobe Integrated Runtime (AIR)
• Google Gears
• Joyent Slingshot
AIR
AIR
Flash standalone
AIR
Flash standaloneFlash!
AIR
Flash standaloneFlash!
Offline Möglichkeiten
AIR
Flash standaloneFlash!
Offline Möglichkeiten (roll your own)
Google Gears
The Rails Way?
Slingshot
• Lokaler Applikationsserver (mongrel)
• Datenbank (SQLite)
• Applikation mit Webbbrowser (Mac OS X, Windows)
• Desktop Integration (Drag & Drop)
Demo
legacy Rails Applikation
Demo
legacy Rails Applikationverschoben
Implementation
hic sunt dracones
Appsvn co http://svn.joyent.com/slingshot/osx
To-Do Liste
• Datenbank anpassen
• SyncController
• Sync Up / Sync Down
• Haare ausreissen
• HTTP Authentication
• Drag & Drop
• Packaging
DatenbankAlle synchronisierten Tabellen müssen created_at und updated_at Spalten enthalten
Ich bin mir nicht sicher, ob das eine gute Idee ist...
Timezone...
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 => 'up' sync.down 'sync/down', :action => 'down' sync.log 'sync/log', :action => 'log'end
Sync Controller
auch in slingshot_task.rake in vendor/plugins...!
Sync Controller
auch in slingshot_task.rake in vendor/plugins...!
Tasc
Down Sync Testen
Down Sync TestenArwen:~/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
Down Sync TestenArwen:~/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/syncresponse.body <?xml version="1.0" encoding="UTF-8"?><SlingshotDown> <CurrentMigration>2</CurrentMigration> <SyncTime>Wed Jun 20 20:27:26 UTC 2007</SyncTime> <ValidIDBlock>customers,1projects,1tasks,1users,1
Lokal bearbeitenArwen:~/dev/rtime-s/VM/trunk jcf$ ruby script/server
Slingshot
Server
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_upSyncing upward/Users/jcf/dev/rtime-s/VM/trunk/config/..offline mode is #<Tasc:0x2482320><SlingshotUp><CreatedRecords><tascs><tasc> <billable type="boolean">true</billable> <created-at type="datetime">2007-06-21T08:16:44Z</created-at> <description>blubber</description>
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?
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=Using-UUID/GUID-as-Primary-Key-in-Rails
DB Adapter hacking
DB Adapter hacking
DB Setup
DB Setup
DB Setup
DB Setup
Model
Slingshot Hackinglib/slingshot.rb
Slingshot Hackinglib/slingshot.rb
Der Weg ist das Ziel
== AddSlinghotColumns: migrating ==============================================-- add_column(:customers, :created_at, :datetime)rake aborted!SQLite3::SQLException: near "ADD": syntax error: ALTER TABLE customers ADD "created_at" datetime
Gotcha?
unterschiedliche Version von SQLite3 auf derEntwicklungsmaschine und im Slingshot Verzeichnis
$ source jenv.sh
Gotcha 2
• Beim synchronisieren in die lokale DB wird AR.save aufgerufen
• Aufpassen auf Validierungen, before_create, before_save etc...
Gotcha 3
Gotcha 3
Gotcha 3
Gotcha 4
ActiveRecord::Base.default_timezone = :utc
Gut
Gutes funktioniert
Gutes funktioniert
(irgendwann)
Gutes funktioniert
(irgendwann)Windows & Mac Version
Gutes funktioniert
(irgendwann)Windows & Mac Version
OpenSource
Gutes 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 Syncingkeine Auflösung von Konflikten
Schlecht
Applikation ist 100MB gross(noch)
Sehr primitives Syncingkeine Auflösung von Konflikten
kein erkennen von Konflikten
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...
vor allem in relationalen Datenbanken
Vorwärts in die Vergangenheit
verteilte Datenhaltung und Abgleich sind keine trivialen Probleme...
vor allem in relationalen Datenbanken
Einsatzgebiete (heute)
Einsatzgebiete (heute)
Single User Anwendungen (ToDo Liste)
Einsatzgebiete (heute)
Single User Anwendungen (ToDo Liste)strikte Trennung der generierten /
bearbeiteten Daten (Zeiterfassung)
Einsatzgebiete (heute)
Single User Anwendungen (ToDo Liste)strikte Trennung der generierten /
bearbeiteten Daten (Zeiterfassung)File Upload / Download (Drag & Drop)
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@invisible.ch
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.
Recommended