Sebastians Blog http://sgaul.de Neues aus den Softwareminen... Sun, 28 Jun 2015 20:13:25 +0000 de-DE hourly 1 http://wordpress.org/?v=4.2.2 Require und Rails http://sgaul.de/2015/06/28/require-und-rails/ http://sgaul.de/2015/06/28/require-und-rails/#comments Sun, 28 Jun 2015 20:13:25 +0000 http://sgaul.de/?p=2761 Weiterlesen ]]> 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

Dies wird vor allem während der Entwicklung zu Problemen führen, da Rails bei einer Änderung die Klasse zurücksetzt und nur die geänderte Datei neu lädt. Die andere Klassendefinition geht verloren, was zu merkwürdigen Ergebnissen führen kann.

Die Lösung für Rails ist ein spezielles Require, welches sich mit Autoloading verträgt:

# railsapp/app/models/user

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

Im Rails-Guide wird Single-Table-Inheritance als weiteres Einsatzgebiet genannt.

]]>
http://sgaul.de/2015/06/28/require-und-rails/feed/ 0
Weniger Abstraktion ist manchmal mehr http://sgaul.de/2015/04/05/weniger-abstraktion-ist-manchmal-mehr/ http://sgaul.de/2015/04/05/weniger-abstraktion-ist-manchmal-mehr/#comments Sun, 05 Apr 2015 11:47:08 +0000 http://sgaul.de/?p=2749 Weiterlesen ]]> 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

Dieser verschachtelte Ansatz erlaubt einen intuitiveren Blick auf das Geschehen, als es beispielsweise bei stark getrennten Ansätzen wie Rails der Fall ist:

# Routes

resouces :users, only: [:index, :show, :update]

# UsersController

before_action :authorize_login
before_action :assign_user, only: [:show, :update]

def index
  @users = User.all
end

def edit
end

def update
  @user.update(params[:user])
  redirect_to action: :show
end

private

def assign_user
  @user = User.find(params[:id])
end

Wer sich für einen solchen Routing-Tree-Ansatz interessiert, sollte sich einmal Roda ansehen.

]]>
http://sgaul.de/2015/04/05/weniger-abstraktion-ist-manchmal-mehr/feed/ 0
Konkatenation von Ruby-String-Literalen http://sgaul.de/2015/03/06/konkatenation-von-ruby-string-literalen/ http://sgaul.de/2015/03/06/konkatenation-von-ruby-string-literalen/#comments Fri, 06 Mar 2015 14:24:59 +0000 http://sgaul.de/?p=2745 Weiterlesen ]]> 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.

]]>
http://sgaul.de/2015/03/06/konkatenation-von-ruby-string-literalen/feed/ 1
Deponia startet nur noch im Fenster http://sgaul.de/2015/03/05/deponia-startet-nur-noch-im-fenster/ http://sgaul.de/2015/03/05/deponia-startet-nur-noch-im-fenster/#comments Thu, 05 Mar 2015 19:17:39 +0000 http://sgaul.de/?p=2740 Weiterlesen ]]> 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…

]]>
http://sgaul.de/2015/03/05/deponia-startet-nur-noch-im-fenster/feed/ 0
Kreative Rails-Environments http://sgaul.de/2015/03/05/kreative-rails-environments/ http://sgaul.de/2015/03/05/kreative-rails-environments/#comments Thu, 05 Mar 2015 18:59:00 +0000 http://sgaul.de/?p=2738 Weiterlesen ]]> Rails-Environments sind mächtig, einfach einzurichten und schnell zu wechseln. Fast zu schade sich auf die Klassiker Test, Development und Production zu beschränken. Auch nach zehnmaligem Ändern der Mail-Einstellungen kam bei uns niemand auf die Idee, dass hier eine zweite Development-Umgebung nach Aufmerksamkeit schreit.

Mit erweitertem Horizont sind viele mehr oder weniger nützliche Umgebungen denkbar:

  • Development mit Mail-Versand um Mails im Mailprogramm zu testen
  • Development mit präkompilierten Assets
  • Development mit Production-Datenbank für Notfall-Debugging
  • Testing ohne Class-Cache um in einer Capybara-Session etwas anzupassen
]]>
http://sgaul.de/2015/03/05/kreative-rails-environments/feed/ 0
Pub-/Sub-System Faye: Ein kleiner Test http://sgaul.de/2015/02/18/pub-sub-system-faye-ein-kleiner-test/ http://sgaul.de/2015/02/18/pub-sub-system-faye-ein-kleiner-test/#comments Wed, 18 Feb 2015 16:04:36 +0000 http://sgaul.de/?p=2732 Faye-Server aufsetzen und starten:

docker run -d -p 127.0.0.1:8000:8000 cravler/faye-app

Ein Browsertest auf localhost:8000/pub-sub bescheinigt mir einen Bad Request. Scheint zu laufen.

Auf einen Post-Request gibt es eine bessere Antwort:

curl http://localhost:8000/pub-sub -d 'message={"channel":"/moin", "data":"Moin!"}'
[{"channel":"/moin","successful":true}]
]]>
http://sgaul.de/2015/02/18/pub-sub-system-faye-ein-kleiner-test/feed/ 0
Docker ohne sudo http://sgaul.de/2015/02/17/docker-ohne-sudo/ http://sgaul.de/2015/02/17/docker-ohne-sudo/#comments Tue, 17 Feb 2015 20:32:56 +0000 http://sgaul.de/?p=2728 Weiterlesen ]]> Wie wohl alle Docker-Pakete erfordert auch das PPA von Dotcloud Root-Rechte für alle Aktionen:

me ~ docker ps
 FATA[0000] Get http:///var/run/docker.sock/v1.17/containers/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?

Um dies zu umgehen, kann man den eigenen Nutzer in die Gruppe docker aufnehmen:

sudo gpasswd -a ${USER} docker
sudo service docker restart

Durch die Gruppenänderung muss man sich noch einmal ab- und anmelden, anschließend läuft Docker sudofrei.

]]>
http://sgaul.de/2015/02/17/docker-ohne-sudo/feed/ 0
Datenbanken im Home-Verzeichnis speichern http://sgaul.de/2015/01/18/datenbanken-im-home-verzeichnis-speichern/ http://sgaul.de/2015/01/18/datenbanken-im-home-verzeichnis-speichern/#comments Sun, 18 Jan 2015 16:44:35 +0000 http://sgaul.de/?p=2725 Weiterlesen ]]> Mit PostgreSQL ist es sehr einfach einen Datenbank-Cluster im Home-Verzeichnis eines Nutzers anzulegen. Dies kann sehr hilfreich sein, wenn beispielsweise nur das Home-Verzeichnis verschlüsselt wird und die Datenbank nicht offen herumliegen soll.

Unter Ubuntu 14.10 installieren wir Postgre und betrachten das automatisch angelegte Standard-Cluster:

sudo apt-get install postgresql

pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
9.3 main 5432 online postgres /var/lib/postgresql/9.3/main /var/log/postgresql/postgresql-9.3-main.log

Es gehört dem Nutzer postgres und ist unter /var/lib beheimatet. Beides ist auf meiner Entwicklungsmachine nicht erste Wahl. Ich droppe daher den Cluster und erstelle einen neuen, den ich meinem eigenen Nutzer zuordne:

sudo pg_dropcluster --stop 9.3 main
sudo pg_createcluster --user sg -d /home/sg/.postgresqldata 9.3 main

pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
9.3 main 5432 online sg /home/sg/.postgresqldata /var/log/postgresql/postgresql-9.3-main.log

Abschließend muss die Datenbank ggf. noch gestartet werden und man kann mit dem Standardnutzer ganz normal arbeiten:

sudo service postgresql start
createuser -dPER my-project-db-user
]]>
http://sgaul.de/2015/01/18/datenbanken-im-home-verzeichnis-speichern/feed/ 0
Bundler is using a binstub that was created for a different gem? http://sgaul.de/2014/12/04/bundler-is-using-a-binstub-that-was-created-for-a-different-gem/ http://sgaul.de/2014/12/04/bundler-is-using-a-binstub-that-was-created-for-a-different-gem/#comments Thu, 04 Dec 2014 14:45:23 +0000 http://sgaul.de/?p=2718 Weiterlesen ]]> In regelmäßigen Abständen wirft unsere Konfiguration aus Bundler 1.7, Rails 4.1, Rspec 2.14 und Spring 1.1 bei jedem Rails-, Rake- oder Rspec-Befehl die folgende Warnung:

Bundler is using a binstub that was created for a different gem.
This is deprecated, in future versions you may need to `bundle binstub rspec` to work around a system/bundle conflict.

Auch andere Nutzer scheinen davon verwirrt zu sein, eine klare Erklärung des Problems und seiner Lösung konnte ich bisher nicht finden. Folgender Reset der Binstubs funktioniert für mich als Workaround:

rm -rf bin/*
bundle exec spring binstub --all
bundle binstub rspec-core --force
]]>
http://sgaul.de/2014/12/04/bundler-is-using-a-binstub-that-was-created-for-a-different-gem/feed/ 0
Bracket-Balancing in Ruby http://sgaul.de/2014/11/29/bracket-balancing-in-ruby/ http://sgaul.de/2014/11/29/bracket-balancing-in-ruby/#comments Sat, 29 Nov 2014 20:35:44 +0000 http://sgaul.de/?p=2712 Weiterlesen ]]> Ich kann mir nicht helfen, nach zwei Jahren Ruby sieht Java manchmal nur noch umständlich aus. Gerade bei kleinen, in sich geschlossenen Programmen sollte man die Sprache mit Bedacht wählen. Wie aufwendig kann es sein herauszufinden, ob die verschiedenen Klammerarten in einem String ausbalanciert sind? Diese Frage stellte sich auch Code Corner und lieferte diese Lösung in Java:

http://www.corejavainterviewquestions.com/code-corner-bracket-balancing/

http://www.corejavainterviewquestions.com/code-corner-bracket-balancing/

Als Rubyist juckt es da in den Fingern, das muss doch schneller gehen.

require 'test/unit/assertions'
extend MiniTest::Assertions

class String

  BRACKETS = {
    "(" => ")",
    "[" => "]",
    "{" => "}",
  }

  def balanced?
    stack = []
    each_char do |char|
      if BRACKETS.keys.include? char
        stack.push char
      elsif BRACKETS.values.include? char
        return false if BRACKETS[stack.pop] != char
      end
    end
    stack.empty?
  end

end

assert "".balanced?
assert "([Hell{} T(h(e[r]e))]boom)".balanced?
assert not("(a[b{c)d]e}".balanced?)
assert not("([{".balanced?)
assert not("}])".balanced?)
]]>
http://sgaul.de/2014/11/29/bracket-balancing-in-ruby/feed/ 0