Offline Arbeiten

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

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