Sebastians Blog Neues aus den Softwareminen…

Neuste Beiträge

Jump ’n‘ Run Maldita Castilla auf Ubuntu

Maldita Castilla ist sehr charmantes, kostenloses Jump ’n‘ Run à la Ghouls ’n Ghosts des spanischen Ein-Mann-Entwicklers Locomalito. Netterweise gibt es sogar eine Ubuntu-Version (die laut Entwickler möglicherweise auch auf anderen Distributionen läuft). Beim Start ergaben sich für mich jedoch kleinere Problemchen.

Maldita Castilla

Weiterlesen

Veröffentlicht unter | Verschlagwortet mit , | Hinterlasse einen Kommentar

ActiveRecord: Klasse einer Model-Instanz ändern

ActiveRecord erlaubt das direkte Ändern der Klasse einer Model-Instanz mittels #becomes. Dies kann zum Beispiel hilfreich sein, wenn man für einen Spezialfall weitere Funktionen oder Validierungen zu einem Model hinzufügen will:

> company = Company.last
> company.persisted?
 => true
> company.valid?
 => true 
> company = company.becomes(RestrictedCompany)
> company.is_a?(RestrictedCompany)
 => true 
> company.is_a?(Company)
 => true 
> company.persisted?
 => true
> company.valid?
 => false

Ähnliches ließe sich zwar auch mit bedingten Validierungen erreichen, würde aber ab einem gewissen Umfang schlicht nicht mehr skalieren.

Ein weiterer, oft gesehener Ansatz wäre RestrictedCompany.find(company.id). Dieser ist jedoch von der Datenbank abhängig und somit vermutlich weniger performant. Zudem benötigt er wirklich persistierte Instanzen. Dies ist vor allem nervig, wenn man in Tests gerne Stubbing nutzt.

Zum Speichern der Klassenänderung kann man #becomes! verwenden. Dies passt auch die STI-Vererbungsspalte (in aller Regel type) an.

Veröffentlicht unter | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Action-Mailer-Previews im Spec-Verzeichnis

Die Mailer-Previews in Rails 4 sind ein Segen. Wer Rspec statt der üblichen Testsuite verwendet kann das Verzeichnis von test in spec ändern, so dass alle Testdateien zusammen bleiben:

# config/application.rb

# ...
config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"

Nach einem Serverneustart sollten die Previews gefunden werden:

# spec/mailers/previews/user_mailer_preview.rb

class UserMailerPreview < ActionMailer::Preview
  def send_invitation
    UserMailer.send_invitation(Invitation.first!)
  end
end

Die Vorschau kann man dann unter den üblichen URLs betrachten, z.B.:

http://localhost:3000/rails/mailers/user_mailer/send_invitation
Veröffentlicht unter | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Rails 4: Already initialized constant APP_PATH?

Ein Fehler, der mir in Rails-4-Projekten öfter unterkommt:

bin/rails:6: warning: already initialized constant APP_PATH

Dies deutet auf ein Problem mit Spring hin. Es kann daher helfen, die Projekt-Binaries neu zu generieren:

rake rails:update:bin

Dies ist oft schon die Lösung oder sollte zumindest eine Fehlermeldung liefern, anhand derer man das tatsächliche Problem finden kann.

Veröffentlicht unter | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Suchstatus in ActiveAdmin deaktivieren

Der Suchstatus des Active-Admin-Masters funktioniert momentan fehlerhaft. Weder Scope-Namen noch Ransack-Suchen werden korrekt übersetzt.

Suchstatus in ActiveAdmin

Da ich das Konzept ohnehin nicht sonderlich gewinnbringend finde, schalte ich es zentral im Active-Admin-Initializer ab:

Wer das Konzept, wie ich, nicht sonderlich gewinnbringend und eines umständlichen Workarounds wert findet, kann es zentral im Initializer von ActiveAdmin abschalten:

# config/initializers/active_admin.rb

ActiveAdmin.setup do |config|
  # ...
  config.current_filters = false
end
Veröffentlicht unter | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

ActiveAdmin: Authentifizierung für Browser und API

Eine einfache API-Authentifizierung lässt sich in ActiveAdmin durch Wiederverwendung des Standard-Admin-Users im Initializer erreichen:

 # config/initializers/active_admin.rb
 ActiveAdmin.setup do |config|
   config.prepend_before_filter do
     if active_admin_config.namespace.name == :api
       authenticate_or_request_with_http_basic('API') do |name, password|
         user = AdminUser.find_by_email!(name)
         sign_in(:admin_user, user) if user.valid_password?(password)
       end
     end
   end

Dies erlaubt die Angabe des Benutzernamens und Passworts im Browser als Popup (HTTP-Basic-Authentication) und als Header für APIs:

curl -u admin@example.com:password http://localhost:3000/api/my_resources.json

Weiterlesen

Veröffentlicht unter | Verschlagwortet mit , , , , , | Hinterlasse einen Kommentar

API-Namespace für ActiveAdmin

In ActiveAdmin kann man neben dem Standard weitere Namespaces definieren. Hierfür wird bei der Ressourcen-Registrierung die entsprechende Option angegeben:

# app/admin/api/my_resource.rb

ActiveAdmin.register MyResource, namespace: :api do
 # ...

Das Namespace-Verzeichnis kann unter app/admin abgelegt werden, ohne das „admin“ Teil der URL, des Controller-Namens o. ä. wird:

rake routes
# ...
api_my_resources GET  /api/my_resources(.:format)  api/my_resources#index
# ...
Veröffentlicht unter | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Taskwarrior-Server auf dem Pi bauen

Die meisten Schritte habe ich eins zu eins von der sehr guten Taskwarrior-Dokumentation übernommen:

sudo apt-get update
sudo apt-get install task build-essential uuid-dev
curl -O http://taskwarrior.org/download/taskd-1.1.0.tar.gz
tar xzf taskd-1.1.0.tar.gz
cd taskd-1.1.0/
cmake -DCMAKE_BUILD_TYPE=release .
make
sudo make install
Veröffentlicht unter , | Verschlagwortet mit , , | Hinterlasse einen Kommentar

SSH-Passwort als Argument

Aus Sicherheitssicht ein Graus, in einigen Situationen ein einfacher Workaround: sshpass erlaubt es, den sonst interaktiven Passwortprompt beim Anmelden mittels SSH zu überspringen:

sshpass -p 'raspberry' ssh pi@mein-pi

Auf meinem Ubuntu war es nicht dabei, befindet sich aber in den Paketquellen:

sudo apt-get install sshpass
Veröffentlicht unter | Verschlagwortet mit , , | 1 Kommentar

Idee für DB2CSV2DB

Egal welch schöne Verwaltungsoberflächen man strickt, manchmal ist es einfach angenehmer den Datenbankinhalt in den Editor zu schieben, dort zu Suchen und Ersetzen und das Ergebnis wieder in die Datenbank zu schieben. Ich denke da an einen einfachen Query-Generator, der die Tabelle als CSV in einer Textarea ausgibt und diese direkt als Update akzeptiert:

db2csv2db

Weiterlesen

Veröffentlicht unter | Verschlagwortet mit , , , | Hinterlasse einen Kommentar