Download - Offline Arbeiten

Transcript
Page 1: Offline Arbeiten

Offline Arbeiten(wie im letzten Jahrtausend)

rails-konferenz.de 2007

Jens-Christian Fischerhttp://blog.invisible.ch

Page 2: Offline Arbeiten

Notizen einer Reise

Page 3: Offline Arbeiten

„The Internet is a series of tubes“– Ted Stevens

Page 4: Offline Arbeiten

Das Internet wiegt ca. 60 Gramm

http://adamant.typepad.com/seitz/2006/10/weighing_the_we.html

Page 5: Offline Arbeiten
Page 6: Offline Arbeiten
Page 7: Offline Arbeiten
Page 8: Offline Arbeiten
Page 9: Offline Arbeiten
Page 10: Offline Arbeiten
Page 11: Offline Arbeiten
Page 12: Offline Arbeiten
Page 13: Offline Arbeiten
Page 14: Offline Arbeiten
Page 15: Offline Arbeiten
Page 16: Offline Arbeiten

Web No Web

Page 17: Offline Arbeiten

Web No Web

Page 18: Offline Arbeiten

Flugzeug, Bahn, Auto

Beim Kunden (Firewalls)

In der Wüste

...

Offline Szenarios

Page 19: Offline Arbeiten

Lösung 0.1

Page 20: Offline Arbeiten
Page 21: Offline Arbeiten

Lösung 1.0

Page 22: Offline Arbeiten

Lösung 1.0

1986

Page 23: Offline Arbeiten

Lösung 1.0

1986

Page 24: Offline Arbeiten

Lösung 1.0

1986

Lotus Notes 1.0

Page 25: Offline Arbeiten

Replikation

Page 26: Offline Arbeiten

Replikation

Page 27: Offline Arbeiten

Redundanz ist gut

Page 28: Offline Arbeiten

Redundanz ist gut

• keine Relationen

Page 29: Offline Arbeiten

Redundanz ist gut

• keine Relationen

• keine „richtige“ Datenbank

Page 30: Offline Arbeiten

Redundanz ist gut

• keine Relationen

• keine „richtige“ Datenbank

• free-form „Dokumente“

Page 31: Offline Arbeiten

Redundanz ist gut

• keine Relationen

• keine „richtige“ Datenbank

• free-form „Dokumente“

• skaliert nicht

Page 32: Offline Arbeiten

Redundanz ist gut

• keine Relationen

• keine „richtige“ Datenbank

• free-form „Dokumente“

• skaliert nicht

Page 33: Offline Arbeiten

Redundanz ist gut

• keine Relationen

• keine „richtige“ Datenbank

• free-form „Dokumente“

• skaliert nicht

• aber repliziert! (prä Internet)

Page 34: Offline Arbeiten

Telefon

netz

Laptop Benutzer

Server 1

Server 2

beliebige Topologienbeliebig viele Repliken

Page 35: Offline Arbeiten
Page 36: Offline Arbeiten
Page 40: Offline Arbeiten

Realität

Page 41: Offline Arbeiten

Realität

Page 42: Offline Arbeiten

Realität

Page 43: Offline Arbeiten

Offline Lösungen

• Adobe Integrated Runtime (AIR)

• Google Gears

• Joyent Slingshot

Page 44: Offline Arbeiten

AIR

Page 45: Offline Arbeiten

AIR

Flash standalone

Page 46: Offline Arbeiten

AIR

Flash standaloneFlash!

Page 47: Offline Arbeiten

AIR

Flash standaloneFlash!

Offline Möglichkeiten

Page 48: Offline Arbeiten

AIR

Flash standaloneFlash!

Offline Möglichkeiten (roll your own)

Page 49: Offline Arbeiten

Google Gears

Page 50: Offline Arbeiten
Page 51: Offline Arbeiten
Page 52: Offline Arbeiten
Page 53: Offline Arbeiten

The Rails Way?

Page 54: Offline Arbeiten

Slingshot

• Lokaler Applikationsserver (mongrel)

• Datenbank (SQLite)

• Applikation mit Webbbrowser (Mac OS X, Windows)

• Desktop Integration (Drag & Drop)

Page 55: Offline Arbeiten

Demo

legacy Rails Applikation

Page 56: Offline Arbeiten

Demo

legacy Rails Applikationverschoben

Page 57: Offline Arbeiten

Implementation

Page 58: Offline Arbeiten

hic sunt dracones

Page 59: Offline Arbeiten

Appsvn co http://svn.joyent.com/slingshot/osx

Page 60: Offline Arbeiten

To-Do Liste

• Datenbank anpassen

• SyncController

• Sync Up / Sync Down

• Haare ausreissen

• HTTP Authentication

• Drag & Drop

• Packaging

Page 61: Offline Arbeiten

DatenbankAlle synchronisierten Tabellen müssen created_at und updated_at Spalten enthalten

Ich bin mir nicht sicher, ob das eine gute Idee ist...

Timezone...

Page 62: Offline Arbeiten
Page 63: Offline Arbeiten

SyncController

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

Page 64: Offline Arbeiten

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

Page 65: Offline Arbeiten

Sync Controller

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

Page 66: Offline Arbeiten

Sync Controller

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

Tasc

Page 67: Offline Arbeiten

Down Sync Testen

Page 68: Offline Arbeiten

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

Page 69: Offline Arbeiten

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

Page 70: Offline Arbeiten

Lokal bearbeitenArwen:~/dev/rtime-s/VM/trunk jcf$ ruby script/server

Slingshot

Server

Page 71: Offline Arbeiten

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>

Page 72: Offline Arbeiten
Page 73: Offline Arbeiten

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?

Page 74: Offline Arbeiten

Replikationskonflikt

Page 75: Offline Arbeiten

Replikationskonflikt

Page 76: Offline Arbeiten

id

Page 77: Offline Arbeiten

42

Page 78: Offline Arbeiten
Page 79: Offline Arbeiten

e9638f8c-200c-11dc-a6c3-0016cb8a850e

Page 80: Offline Arbeiten

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

Page 81: Offline Arbeiten

DB Adapter hacking

Page 82: Offline Arbeiten

DB Adapter hacking

Page 83: Offline Arbeiten

DB Setup

Page 84: Offline Arbeiten

DB Setup

Page 85: Offline Arbeiten

DB Setup

Page 86: Offline Arbeiten

DB Setup

Page 87: Offline Arbeiten

Model

Page 88: Offline Arbeiten

Slingshot Hackinglib/slingshot.rb

Page 89: Offline Arbeiten

Slingshot Hackinglib/slingshot.rb

Page 90: Offline Arbeiten
Page 91: Offline Arbeiten
Page 92: Offline Arbeiten
Page 93: Offline Arbeiten

Der Weg ist das Ziel

Page 94: Offline Arbeiten

== 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

Page 95: Offline Arbeiten

Gotcha 2

• Beim synchronisieren in die lokale DB wird AR.save aufgerufen

• Aufpassen auf Validierungen, before_create, before_save etc...

Page 96: Offline Arbeiten

Gotcha 3

Page 97: Offline Arbeiten

Gotcha 3

Page 98: Offline Arbeiten

Gotcha 3

Page 99: Offline Arbeiten

Gotcha 4

ActiveRecord::Base.default_timezone = :utc

Page 100: Offline Arbeiten

Gut

Page 101: Offline Arbeiten

Gutes funktioniert

Page 102: Offline Arbeiten

Gutes funktioniert

(irgendwann)

Page 103: Offline Arbeiten

Gutes funktioniert

(irgendwann)Windows & Mac Version

Page 104: Offline Arbeiten

Gutes funktioniert

(irgendwann)Windows & Mac Version

OpenSource

Page 105: Offline Arbeiten

Gutes funktioniert

(irgendwann)Windows & Mac Version

OpenSource(irgendwann)

Page 106: Offline Arbeiten

Schlecht

Page 107: Offline Arbeiten

Schlecht

Applikation ist 100MB gross

Page 108: Offline Arbeiten

Schlecht

Applikation ist 100MB gross(noch)

Page 109: Offline Arbeiten

Schlecht

Applikation ist 100MB gross(noch)

Sehr primitives Syncing

Page 110: Offline Arbeiten

Schlecht

Applikation ist 100MB gross(noch)

Sehr primitives Syncingkeine Auflösung von Konflikten

Page 111: Offline Arbeiten

Schlecht

Applikation ist 100MB gross(noch)

Sehr primitives Syncingkeine Auflösung von Konflikten

kein erkennen von Konflikten

Page 112: Offline Arbeiten

Vorwärts in die Vergangenheit

Page 113: Offline Arbeiten

Vorwärts in die Vergangenheit

verteilte Datenhaltung und Abgleich sind keine trivialen Probleme...

Page 114: Offline Arbeiten

Vorwärts in die Vergangenheit

verteilte Datenhaltung und Abgleich sind keine trivialen Probleme...

vor allem in relationalen Datenbanken

Page 115: Offline Arbeiten

Vorwärts in die Vergangenheit

verteilte Datenhaltung und Abgleich sind keine trivialen Probleme...

vor allem in relationalen Datenbanken

Page 116: Offline Arbeiten

Einsatzgebiete (heute)

Page 117: Offline Arbeiten

Einsatzgebiete (heute)

Single User Anwendungen (ToDo Liste)

Page 118: Offline Arbeiten

Einsatzgebiete (heute)

Single User Anwendungen (ToDo Liste)strikte Trennung der generierten /

bearbeiteten Daten (Zeiterfassung)

Page 119: Offline Arbeiten

Einsatzgebiete (heute)

Single User Anwendungen (ToDo Liste)strikte Trennung der generierten /

bearbeiteten Daten (Zeiterfassung)File Upload / Download (Drag & Drop)

Page 120: Offline Arbeiten

Einsatzgebiete (morgen)

Page 121: Offline Arbeiten

Einsatzgebiete (morgen)

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

Page 122: Offline Arbeiten

Einsatzgebiete (morgen)

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

Überall, Immer, Jederzeit

Page 124: Offline Arbeiten

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.

Page 125: Offline Arbeiten