tja, es ist passiert. ich hab meinen ipod mini in der waschmaschine mitgewaschen.
hab dann einschalten probiert... nix
dann hab ich ihn an den strom angesteckt, und tatsaechlich ist das apple logo erschienen,
und nach dem booten funktionierte er wieder einwandfrei!
das einzige, die obere plastikabdeckung (wo der hold button integriert ist) ist ein wenig verformt (wahrscheinlich vom heissen wasser)
also echt, ich bin baff!
man glaubt es kaum, aber ich hab mich seit 10 jahren wieder mal auf eine windows installation gefreut. nun ja und somit hab ich heut windows7 unter vmware fusion2 installiert. als host-system hab ich "windows server 2008" gewaehlt und tatsachlich nach max. 10 clicks, bzw 20min war windows7 installiert. noch schnell die vmware-tools und los gings.
und ich muss sagen, ich bin nicht schockiert! finds zwar immer noch nicht so toll wie os x, aber "so ein schas" kann man sicher nicht dazu sagen!
naja... mein test ist immer als erstes, ob jetzt endlich ein neues besseres terminal verfuegbar ist --> leider fehlanzeige..
weiters, ist waerend ich diesen beitrag geschrieben hab windows mit einem bluescreen gecrashed, ok es ist vmware und windows-beta, darum will ich das ignorieren und windows weiterhin eine cache geben.. :)
wie alle, so hab auch ich jetzt webtek auf github gehostet, warum?
- weils alle verwenden
- weil ich zu faul war trac aufzusetzten (und ich es schon oefters gebraucht haett)
- ist lustig wieder mal was neues auszuprobieren... und hat auch alles gut funktioniert
also ab jetzt bitte:
git clone git://github.com/prozessor13/webtek.git WebTek
also folgendes script:
for (var i=0; i<2; i++) {
var j = i;
setTimeout(function() { alert("i:" + i + ", j:" + j) }, 1);
}
was wuerde man hier erwarten: also ich:
- 2 alerts
- wobei im einen i:2 j:0
- und im andern i:2 j:1 steht
wieso?
- also die variable i wird ausserhalb vom for scope deklariert, d.h. die zaehlt durch und bleibt bei der 2 stehen.
- und die variable j wird innerhalb vom for scope deklariert, d.h. dadurch dass ich bei setTimeout eine closure uebergebe, sollte der wert einmal 0 und dann 1 aufweisen.
aber! das ergebnis ist zweimal i:2 j:1, und dass versteh ich ueberhaupt nicht. kann mir das jemand erklaeren? oder ist das so eine nicht ganz logische JS optimierung der browser (damit die j variable nicht jedesmal deklariert werden muss ????).
kommt am montag, den 29. um 21.00 auf arte. fuer alle die den film noch nicht gesehen haben, zahlt es sich echt aus ihn anzusehen!

sind etwas sehr tolles, aber eben doch so stark mit gewohnheiten belastet. darum passiert es mir immer wieder, dass ich:
https://trac.knallgrau.at/maptoolkit
anstatt:
https://trac.toursprung.com/maptoolkit
schreibe (wer findet den fehler). und, by the way, liebe knallgrau's: ich hab noch immer trac/svn zugang zu euren servern, vielleicht sollte man mich mal rausschmeissen :)
UPDATE: ok, der zugang war eh nimmer da! unnoetig laute schreie meinerseits, aber lang ist's noch nicht her, dass mich rausgehaut habts ;)
hab jetzt grad auf ajaxian einen artikel ueber sproutcore gelesen, und dann auch gleich das tutorial durchgemacht, und ich muss sagen. ich bin begeistert. man kann wie gewohnt eine MVC applikation entwickeln, die dann aber client-seitig laeuft, und die verbindung zum backend passiert einfach ueber JsonRPC. das ganze erinnert mich sehr an das extjs framework, nur dass das look&feel eher an eine apple applikation erinnert!
so denn, ich rate allen man das tutorial durchzumachen, denn u.a. fuer admin-tools ist das ein wirklich tolles framework.
The only way to enforce unique constraints on a database table is by asking the database to do it. Create the table, create the unique constraint, do an insert, and parse the error message if the insert failed, to see if it was a unique constraint violation. Any kind of "select count(*)" before an insert will not work.
This is now available automatically from WebTek.
If the underlying table has any unique constraints, if they are violated, you want to let the user know of this. Unfortunately databases provide unhelpful constraint violation messages such as:
ERROR 1062 (23000): Duplicate entry 'abc' for key 2
In case of multiple constraints on the table, the only way to know which one has been violated is the "key 2" part of the message. The front-end needs to know which field should be highlighted with the error, so the UNIQUE_CONSTRAINTS method in a Model should be defined in your model having a relationship from the "key" in the error message to the column which should be highlighted as having the error in the front-end. For example:
sub UNIQUE_CONSTRAINTS { { 2 => 'name' } }
In the case that the above error is received, an error will be displayed on the "name" field. If the model being defined is MyModel then the following message key will be searched for:
Model.MyModel.name.alreadyexists
(by Adrian)
hab mir soeben das rails 2.1 changelog angesehen, und dort gibt es folgende nette erweiterungen.
- zimezones
- dirty tracking
- gem dependencies
- names scope
- utc-migrations
- better-caching
wie immer hat rails gute ideen, und eine sehr schoene umsetzung. aber es freut mich umso mehr, dass webtek bereites schon die haelfter der features hatte :)
timezones
in rails setzt man einen before_filter:
class ApplicationController < ActionController::Base
before_filter :set_timezone
def set_timezone
# current_user.time_zone #=> 'London'
Time.zone = current_user.time_zone
end
end
in webtek macht man das mit einem event:
event->register(
'name' => 'request-prepare-end'
'method' => sub { request->timezone(session->user->timezone) }
)
dirty tracking
hiermit kriegt man informationen welche felder in einem model neu sind (d.h. noch nicht in der db), und welche geaendert wurden (nach einem partial update). hier in rails:
article = Article.find(:first)
article.changed? #=> false
# Track changes to individual attributes with
# attr_name_changed? accessor
article.title #=> "Title"
article.title = "New Title"
article.title_changed? #=> true
# Access previous value with attr_name_was accessor
article.title_was #=> "Title"
# See both previous and current value with attr_name_change accessor
article.title_change #=> ["Title", "New Title"]
und wieder in webtek
$article = app::Model::Article->find_one;
$article->_lazy; # => [] liefert ein leeres array;
# Track changes to individual attributes with
# attr_name_changed? accessor
$article->title #=> "Title"
$article->title("New Title")
$article->_lazy; # => ['title']
# Access previous value with attr_name_was accessor
$article->{'persistent_content'}->{'title'};
# => 'Title' ... gut nicht so schoen aber machbar
# See both previous and current value with attr_name_change accessor
# das geht nicht, aber man weiss zumindest was geaendert wurde
# nach dem speichern
$article->save;
$article->_updated; # => ['title']
... zugegeben, rails macht es schoener, aber immerhin, dieses feature hatte webtek schon lange
utc-migrations
gut, das ist jetzt zwar nix besonderes, aber die webtek migrations funktionieren auch genauso. hier wieder in rails
> script/generate migration one
create db/migrate/20080402122512_one.rb
> rake db:migrate:up
...
> rake db:migrate:down
...
und webtek:
> ./webtek migrate create Test
=> create /WebTek/app/Test/scripts/migrate/20080610220557_Test.pl
> ./webtek migrate up
...
> ./webtek migrate down
...
also in perl gibt es packages:
package MyApp::Model::X;
...
sub x { ... }
soweit so gut. aber in einem modularen Framework kommt man oft mit packagenamen nicht weit, denn diese sind normalerweise in irgendeinem namespace. z.b. gib es in der MyApp application u.a. folgende Packages.
package MyApp::Model::Comment;
...
package MyApp::Model::Text;
use MyApp::Model::Comment;
...
wenn man jetzt aber modular programmiert, hat man optimalerweise die comment-funktionalitaet in einem modul gekapselt, damit man das bei einer anderen applikation auch gleich verwenden kann. nur heisst die andere applikation dann z.b. MyApp2 und somit wird auch das Comment package in dem MyApp2 namespace geladen. d.h. das Text package muesste so definiert sein.
package MyApp2::Model::Text;
use MyApp2::Model::Comment;
damit man jetzt ein modul in mehreren namespaces verwenden kann, gab es in webtek den trick mit folgender definition:
package MyApp2::Model::Text;
use app->Modul->Comment;
das app->Modul->Comment wurde dann fuer die jeweilige applikation in z.b. MyApp2::Module::Comment uebersetzt. diese logik ist aber alles andere als gut, da es dann bei folgendem aufruf:
app->Model->Comment->find_one(id=>123)
keine unterscheidung mehr zwischen dem packetnamen, und der methode die aufgerufen wird, gibt. darum heisst die neue syntax jetzt wie folgt:
package MyApp2::Model::Text;
use app::Model::Comment;
my $comment = app::Model::Comment->find_one(id=>123);
intern wird das app::Model::Comment allerdings weiter in MyApp2::Model::Comment uebersetzt (mittels einem source-filter). d.h. weiters, dass man die module zusatztlich noch in jeder applikation in einem eigenen namespace liegen (= geladen) hat.
ich hoffe es hat jetzt irgendwer verstanden, was ich gemeint hab. wenn nicht, dann bitte nachfragen.