So sehr ich Redmine auch als Tool schätze, so sehr hasse ich es auf eine neue Version umzustellen. Das ist bei Redmine noch kein einziges Mal reibungslos verlaufen. So auch diesmal nicht. Nachdem ich ein Upgrade auf die neue Ubuntu-Version 12.04 gefahren habe, funktionierte meine Redmine-Installation (Version 1.2.1) nicht mehr. Das lag daran, dass mit dem Ubuntu-Upgrade auch Rails auf eine neuere Version (2.3.14) aktualisiert wurde. Diese Rails-Version wird aber erst ab Redmine 1.3.x unterstützt. Die ersten drei Schritte des Migrations-Guides waren ja schnell umgesetzt, nur das Update der Datenbank wollte nicht so richtig. Als Ausgabe kam folgendes:
sudo rake db:migrate RAILS_ENV=production –trace
Please install RDoc 2.4.2+ to generate documentation.
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
rake aborted!
Object is not missing constant Project!
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:443:in `load_missing_constant’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:106:in `const_missing’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:118:in `const_missing’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:124:in `send’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:124:in `const_missing’
/var/www/rails_apps/redmine/1.4.2/app/models/attachment.rb:37
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:184:in `require’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:184:in `require’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:291:in `require_or_load_without_engine_additions’
/var/www/rails_apps/redmine/1.4.2/vendor/plugins/engines/lib/engines/rails_extensions/dependencies.rb:132:in `require_or_load’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:451:in `load_missing_constant’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:106:in `const_missing’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:118:in `const_missing’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:463:in `load_missing_constant’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:106:in `const_missing’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:463:in `load_missing_constant’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:106:in `const_missing’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:463:in `load_missing_constant’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:106:in `const_missing’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:463:in `load_missing_constant’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:106:in `const_missing’
/var/www/rails_apps/redmine/1.4.2/vendor/plugins/acts_as_attachable/lib/acts_as_attachable.rb:33:in `acts_as_attachable’
/var/www/rails_apps/redmine/1.4.2/app/models/message.rb:23
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:184:in `require’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:184:in `require’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:291:in `require_or_load_without_engine_additions’
/var/www/rails_apps/redmine/1.4.2/vendor/plugins/engines/lib/engines/rails_extensions/dependencies.rb:132:in `require_or_load’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:451:in `load_missing_constant’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:106:in `const_missing’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:118:in `const_missing’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/inflector.rb:364:in `constantize’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/inflector.rb:363:in `each’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/inflector.rb:363:in `constantize’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/core_ext/string/inflections.rb:162:in `constantize’
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.14/lib/active_record/observer.rb:157:in `observed_class’
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.14/lib/active_record/observer.rb:183:in `observed_classes’
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.14/lib/active_record/observer.rb:166:in `initialize’
/usr/lib/ruby/1.8/singleton.rb:94:in `new’
/usr/lib/ruby/1.8/singleton.rb:94:in `instance’
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.14/lib/active_record/observer.rb:38:in `instantiate_observers’
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.14/lib/active_record/observer.rb:36:in `each’
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.14/lib/active_record/observer.rb:36:in `instantiate_observers’
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.14/lib/action_controller/dispatcher.rb:15:in `define_dispatcher_callbacks’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:182:in `call’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:182:in `evaluate_method’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:166:in `call’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:90:in `run’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:90:in `each’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:90:in `send’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:90:in `run’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:276:in `run_callbacks’
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.14/lib/action_controller/dispatcher.rb:51:in `send’
/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.14/lib/action_controller/dispatcher.rb:51:in `run_prepare_callbacks’
/usr/lib/ruby/gems/1.8/gems/rails-2.3.14/lib/initializer.rb:631:in `prepare_dispatcher’
/usr/lib/ruby/gems/1.8/gems/rails-2.3.14/lib/initializer.rb:185:in `process’
/usr/lib/ruby/gems/1.8/gems/rails-2.3.14/lib/initializer.rb:113:in `send’
/usr/lib/ruby/gems/1.8/gems/rails-2.3.14/lib/initializer.rb:113:in `run’
/var/www/rails_apps/redmine/1.4.2/config/environment.rb:21
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:182:in `require’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:182:in `require’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:547:in `new_constants_in’
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.14/lib/active_support/dependencies.rb:182:in `require’
/usr/lib/ruby/gems/1.8/gems/rails-2.3.14/lib/tasks/misc.rake:4
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `execute’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `invoke_with_call_chain’
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:176:in `invoke_prerequisites’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:174:in `each’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:174:in `invoke_prerequisites’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:157:in `invoke_with_call_chain’
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `top_level’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `top_level’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `run’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run’
/usr/lib/ruby/gems/1.8/gems/rake-0.9.2.2/bin/rake:33
/usr/bin/rake:19:in `load’
/usr/bin/rake:19
Tasks: TOP => db:migrate => environment
Ich war aber nicht der Einzige, der diese Fehlermeldung zu Gesicht bekam: Link. An mir lag es allerdings an was anderem. Das MySql-Gem war bei mir nicht installiert. Ein einfaches
gem install mysql
eingegeben und schon lies sich die Datenbank updaten. Das hat mich etliche Stunden gekostet, um das herauszufinden. Dagegen war der Fehler, dass ich mich danach nicht einloggen konnte, relativ leicht zu beheben (respektive lies sich die Information zur Problemlösung relativ leicht finden). Einfach Mongrel 1.2.0.pre2 installieren.
In meiner Wicket-Anwendung besteht die Möglichkeit Datensätze über einen AjaxLink zu löschen. Damit da nicht aus versehen drauf geklickt wird, gibt es vorher noch einen Dialog, ob man den Datensatz auch wirklich löschen möchte. Das sah unter Wicket 1.5 wie folgt aus:
AjaxLink deleteLink = new AjaxLink("deleteLink") {
@Override
public void onClick(final AjaxRequestTarget target) {
//[Datensatz löschen]
}
@Override
protected IAjaxCallDecorator getAjaxCallDecorator() {
return new AjaxCallDecorator() {
@Override
public CharSequence decorateScript(final Component c, final CharSequence script) {
return "if(!confirm('Soll dieser Datensatz wirklich gelöscht werden?')) return false;" + script;
}
};
}
};
Das funktioniert unter Wicket 1.6 nicht mehr, da es keine CallDecorator mehr gibt. Statt dessen müssen wir einen Listener registrieren, so dass der Code wie folgt aussieht:
AjaxLink deleteLink = new AjaxLink("deleteLink") {
@Override
public void onClick(final AjaxRequestTarget target) {
//[Datensatz löschen]
}
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
AjaxCallListener myAjaxCallListener = new AjaxCallListener() {
@Override
public CharSequence getPrecondition(Component component) {
return "if (!confirm('Soll dieser Datensatz wirklich gelöscht werden ?')) return false;" + super.getPrecondition(component);
}
};
attributes.getAjaxCallListeners().add(myAjaxCallListener);
}
};
Wicket 1.6.0 beta – erste Eindrücke
Die erste Beta-Version des neuen Entwicklungszweiges von Wicket ist draußen. Da konnte ich ja nicht wiederstehen, mal zu schauen, wie schwer eine Migration auf die neue Version werden könnte. Ich sag mal: hui! Während der Schritt von 1.3 auf 1.4 und danach auf 1.5 meines Erachtens nach relativ schmerzfrei war, so kann ich das diesmal nicht wirklich behaupten. Der Migration-Guide ist recht überschaubar und vieles davon (z.B. Imports fixen) ist auch recht schnell gemacht. Bis man dazu kommt, die Teile zu migrieren, die Ajax in irgend einer Art und Weise einsetzen. Da wird es nämlich echt unschön. Die Wicket-Entwickler setzen jetzt nämlich im Hintergrund auf JQuery (was ja erst einmal zu begrüßen ist) und haben dann auch gleich mal die gesamte API umgeschmissen (zumindest fühlt es sich für mich gerade so an, wobei auch hier wieder die Wiki-Seite recht überschaubar ist). Wer also viel Ajax einsetzt, darf sich schon auf ein paar Refactoring-Marathons freuen. Und wer hier auch noch fremde Komponenten, wie zum Beispiel die von Wicketstuff, einsetzt, kann nur hoffen, dass diese noch gepflegt werden und an die neueste Version angepasst werden.
Die Wicket-Entwickler sagen ja, dass sich der Einsatz von Ajax durch die ganzen Änderungen vereinfachen wird. Ich bin gespannt, ob es den ganzen Aufwand wert ist, denn zum jetzigen Zeitpunkt mag ich mir da noch kein Urteil darüber erlauben. Wer darüber nachdenkt, seine Applikation zu migrieren um diese zukunftssicher zu machen, sollte, wenn er sich nicht gerade durch den Wicket-Source kämpfen möchte, aber noch ein wenig warten. Denn an Dokumentation mangelt es leider wieder ein wenig und da die Beta erst ein paar Tage alt ist, kann man von der Mailingliste wohl auch keine (wie sonst gewohnt) schnelle Antwort erwarten.
Wer sich seit Freitag, dem 06.01.2012 fragt, ob seine Webseite Fehler produziert oder ob Referrer nicht korrekt auf die Landingpages übergeben werden, darf versichert sein: Das Problem liegt bei Google. Unter dem großartigen Feature “Echtzeit BETA” -> “Content” werden vermehrt nicht mehr die korrekte URL des Users angezeigt, sondern auch:
Undefined parameter – STRING1 …Undefined parameter – STRING2
Der title=”" des Links zeigt aber die richtige URL und somit scheint Google Analytics einen Fehler beim Auflösen des Quelllinks zu haben. Zusätzlich hat Google Adwords Forum einen Fehler bestätigt, wobei das Problem noch nicht lokalisiert oder gar behoben wurde wurde.
Da mein tolles neues iPhone 4S aus Gründen, auf die ich jetzt nicht näher eingehen will, aus 50 cm flach auf den Rücken gefallen und somit (?) die Rückenscheibe gebrochen ist, dachte ich heute Mittag, “Geh doch mal bei Apple vorbei!”.
1. Zuerst nannte man mir im Erdgeschoss, dass die Kosten 80 Euro betragen (15:34).
2. Ein weiterer Apple-Mitarbeiter meinte, die gebrochene Scheibe koste 29 Euro (15:35).
3. Ich habe einem Termin zum Austausch (“Max. 10 Minuten”) um 18:50 Uhr zugestimmt (15:36)
4. Ich bin bei Apple (18:51).
5. Ich soll 90 Minuten in der Queue warten (18:56).
…
Update1:
Ich warte – natürlich – immer noch (19:24). Dafür tippe ich gerade auf einem schnieken MacBook Pro herum. Tolles Ding. Zwei-Finger-Scrolling ist grandios.
…
Update2:
Jan ist Apple-Fanboy, Hobbyschrauber, sehr freundlich und schon da (19:43). Er kuckt nach der Ersatzscheibe. Sie ist da und kostet tatsächlich 29 Euro. Fein. Nachdem der bürokratische Aufwand und der mutierte “iPod-Touch-mit-Scan” nicht wirklich gut über die WLAN-Spots kommuniziert hat, geht’s los: Jan ist auf dem Weg und in prognostizierten 12 Minuten (“Vielleicht auf sieben!”) den Austausch vorzunehmen. Sehr interessant ist, dass Jan ziemlich offen und gesprächig ist. Entweder sehr netter Typ und/oder gut geschult?! Es ist 19:53 Uhr.
…
Update3:
Jan hat Wort gehalten, denn er ist zurück und es ist 19:59 Uhr. In weltrekordverdächtigen 6 Minuten hat Jan die neue Scheibe auf dem Rücken des iPhone 4S geschraubt und das gute Ding noch mal rundum poliert. Sieht fast aus wie neu. Und das Schöne: Jan sagt, es koste nix. Wohl weil ich über eine Stunde gewartet habe und er so ein netter Typ sei. Ich tippe auf Ersters und meine “Chapeau”. Top-Service von Apple. Kurzweilig, da man kostenlos im Netz mit dem MacBook surfen konnte und sehr kompetente Mitarbeiter!
Empfehlung. 5 Sterne!


