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

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

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

„Idee für DB2CSV2DB“ weiterlesen

ActiveAdmin: Standard-Datumsformat ändern

ActiveAdmin erkennt und formatiert die meisten Zeit- und Datumsangaben. In Tabellen kann es jedoch störend sein, wenn das Datum mit dem ausgeschriebenen Wochentag beginnt: Es frisst Platz und sorgt aufgrund unterschiedlicher Länge vor allem in Tabellen für eine ungleichmäßige Ausrichtung. Mit den Standardeinstellungen von ActiveAdmin und Rails-I18n ist das leider der Fall. Ich ändere das Format daher meist auf etwas wie 30.08.2015, 13:39 Uhr.

Hierfür ändere ich das Format, das ActiveAdmin für die Lokalisierung verwendet, auf default. Im vorgegebenen Initializer steht die Konfiguration aktuell nicht drin, so dass ich es am Ende ergänze:

ActiveAdmin.setup do |config|
  # ...
  config.localize_format = :default
end

„ActiveAdmin: Standard-Datumsformat ändern“ weiterlesen

ActiveAdmin verstehen: Von der Application zur ResourceDSL

ActiveAdmin ist gut dokumentiert und auch ohne Verständnis der Interna gut zu benutzen. Spätestens wenn man eigene Erweiterungen schreiben möchte, muss man aber verstehen, wie die Engine funktioniert. Ein Anfang für Version 1.0.0.pre1:

Das Modul ActiveAdmin realisiert mittels class << self eine singleton-ähnliche Instanz von ActiveAdmin::Application:

module ActiveAdmin
  class << self
    def application
      @application ||= ::ActiveAdmin::Application.new
    end

Beim Setzen der Routen in der routes.rb wird automatisch load! ausgelöst:

module ActiveAdmin
  class Application

    def routes(rails_router)
      load!
      router.apply(rails_router)
    end

Dieses lädt alle Dateien (üblicherweise app/admin/*) und erzeugt den Default-Namespace :admin:

    def load!
      files.each{ |file| load file }
      namespace(default_namespace)
    end

„ActiveAdmin verstehen: Von der Application zur ResourceDSL“ weiterlesen

10 Tote, zum Glück nur Männer!

Ich habe gerade eine interessante Kritik an Star Wars Episode II gesehen. Hier wird auf Anakin Skywalkers Geständnis eingegangen, dass er im Sandmenschen-Dorf nicht nur die Männer, sondern auch Frauen und Kinder getötet hätte. Dass ein angeblich moralpachtender Jedi in spe den Tot von Männern relativiert, indem er den Tot von Frauen und Kindern gegenüberstellt, empfanden komischerweise weder Filmschaffer Lucas noch Kritiker ungewöhnlich. Kein Wunder, kennt man diese Form sexistischer Moral nur zu gut aus den Medien:

Unglücksmeldung:
„22 Tote, darunter Frauen und Kinder.“
Warum ist das wichtig?
Ich warte, daß es mal heißt:
„10 Tote, zum Glück nur Männer!“

Volker Pispers

Im Seerecht scheint der vergleichbare Anachronismus „Frauen und Kinder zuerst!“ mittlerweile behoben zu sein. Hier bekommt üblicherweise derjenige als erster Hilfe, der sie am meisten benötigt. Es geht voran…

Require und Rails

Rails‘ Autoloading macht einen guten Job, so dass man Abhängigkeiten selten per Hand auflösen muss. Will man aber etwa eine bestehende Modelklasse aus einer Engine öffnen um eigenen Code zu ergänzen, so muss das Original notwendigerweise vorhanden sein:

# userengine/app/models/user

class User < ActiveRecord::Base
  belongs_to :user_group
end
# railsapp/app/models/user

require User::Engine.root.join('app', 'models', 'user')

class User < ActiveRecord::Base
  belongs_to :user_group
end

„Require und Rails“ weiterlesen

Weniger Abstraktion ist manchmal mehr

Zunächst war ich kritisch: Kann ein Konferenzbeitrag über Routing-Ansätze brauchbare Erkenntnisse bieten? Schlussendlich ist das Routing ein sehr kleiner Teil und Rails liefert einen funktionierenden Ansatz mit. Performance-Sprünge im gesamten Kontext sind nicht zu erwarten.

Interessant finde ich aber, wie durch das Entfernen der Abstraktion zwischen Router und Controller wesentliche Konzepte vereinfacht werden können. So lassen sich die unschönen Before-Action-Hooks samt Only-Beschränkungen viel eleganter ausdrücken:

route.is 'users' do
  authorize_user_session!

  route.get do
    @users = User.all
    view(:index)
  end

  route.is ':id' do |id|
    @user = User.find(id)
    
    route.get do
      view(:edit)
    end
    
    route.post do
      @user.update(params[:user])
      redirect_to action: :show
    end
  end
end

„Weniger Abstraktion ist manchmal mehr“ weiterlesen

Konkatenation von Ruby-String-Literalen

Ich bin gerade über folgende Code-Zeile gestolpert und dachte schon etwas hilfreichem auf der Spur zu sein:

irb
2.1.3 :010 > "aaa" "bbb"
 => "aaabbb"

Es wirkt, als füge Ruby aufeinanderfolgende Strings automatisch zusammen. Leider ist diese Funktion auf reine Stringliterale beschränkt,  so dass sie in der Praxis leider kaum einen Nutzen haben dürfte:

2.1.3 :018 > "aaa" 3.to_s
SyntaxError: (irb):18: syntax error, unexpected tINTEGER, expecting end-of-input
"aaa" 3.to_s
       ^
       from ~/.rvm/rubies/ruby-2.1.3/bin/irb:11:in `<main>'

Schade drum, dennoch interessant zu wissen.

Deponia startet nur noch im Fenster

Am Wochenende habe ich mir bei gog.com das Begrüßungsangebot Deponia für 50 Cent gesichert. Spiel und Humor gefallen mir sehr, doch schon am zweiten Tag wollte es nicht mehr im Vollbild starten. Grund war wohl die viel zu hohe Auflösung, die meinen Laptopbildschirm übertraf und deshalb in einem nur halb sichtbarem Fenster endete.

vim .local/share/Daedalic\ Entertainment/Deponia/config.ini

RESOLUTION = 1600x900

Nach der entsprechenden Korrektur startet es wieder im Vollbild. Mal hoffen dass es so bleibt…

Nachtrag: Ab und an muss ich die Einstellung erneut korrigieren, da  der Wechsel mit und ohne externem Monitor wieder seine Änderungen reinschreibt.