Sebastians Blog http://sgaul.de Neues aus den Softwareminen... Wed, 18 Feb 2015 16:04:36 +0000 de-DE hourly 1 http://wordpress.org/?v=4.1.1 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
Spring ohne Bin-Präfix nutzen http://sgaul.de/2014/11/18/spring-ohne-bin-praefix-nutzen/ http://sgaul.de/2014/11/18/spring-ohne-bin-praefix-nutzen/#comments Tue, 18 Nov 2014 15:05:00 +0000 http://sgaul.de/?p=2707 Weiterlesen ]]> Spring lässt sich sehr einfach installieren: Gem eintragen und die Binstubs erzeugen:

bundle exec spring binstub --all

Um nun rake routes oder rails generate statt bin/rake routes oder bin/rails generate nutzen zu können, einfach die folgenden Funktionen in beispielsweise die bash_aliases eintragen:

rake() { if [ -f bin/rake ]; then bin/rake "$@"; else bundle exec rake "$@"; fi }
rails() { if [ -f bin/rails ]; then bin/rails "$@"; else bundle exec rails "$@"; fi }
rspec() { if [ -f bin/rspec ]; then bin/rspec "$@"; else bundle exec rspec "$@"; fi }

Mein Dankeschön für den Ansatz geht an Arne.

Um die ursprünglichen Varianten ohne Spring zu nutzen kann command verwendet werden:

command rake routes
]]>
http://sgaul.de/2014/11/18/spring-ohne-bin-praefix-nutzen/feed/ 0
Eleganterer Stringvergleich mit StringInquirer http://sgaul.de/2014/10/18/eleganterer-stringvergleich-mit-stringinquirer/ http://sgaul.de/2014/10/18/eleganterer-stringvergleich-mit-stringinquirer/#comments Sat, 18 Oct 2014 10:14:08 +0000 http://sgaul.de/?p=2703 Weiterlesen ]]> Unschön:

if user.role == "admin" or user.role == "guest"

Lösung:

class User
  def role
    ActiveSupport::StringInquirer.new(super)
  end
end
if user.role.admin? or user.role.guest?

Der ActiveSupport::StringInquirer ergänzt einen String um beliebige Testmethoden, welche die Gleichheit von String und Methodenname (ohne Fragezeichen) überprüfen. Ein prominenter Anwendungsfalls ist die Environment-Variable Rails.env von Rails, die sich auch in der Form Rails.env.production? prüfen lässt.

]]>
http://sgaul.de/2014/10/18/eleganterer-stringvergleich-mit-stringinquirer/feed/ 2
Methoden für Active-Record-Relationen definieren http://sgaul.de/2014/09/24/methoden-fuer-active-record-relationen-definieren/ http://sgaul.de/2014/09/24/methoden-fuer-active-record-relationen-definieren/#comments Wed, 24 Sep 2014 20:26:35 +0000 http://sgaul.de/?p=2693 Weiterlesen ]]> Ein Scope in Active Record ist nichts anderes als syntaktischer Zucker für das Definieren einer Klassenmethode. Die folgenden User-Models führen zum selben Ergebnis:

class User < ActiveRecord::Base
  scope :admins, -> { where(role: "admin") }
end
class User < ActiveRecord::Base
  def self.admins
    where(role: "admin")
  end
end

Da man Scopes verketten kann drängt sich der (berechtigte) Verdacht auf, dass dies mit jeder Form von Klassenmethode möglich ist.

class User < ActiveRecord::Base

  scope :admins, -> { where(role: "admin") }

  def self.names
    pluck(:name)
  end

end

Dies funktioniert. Man kann auf diese Weise jede zusammengestellte Relation beliebig verarbeiten. Obiges Beispiel ließe sich etwa folgendermaßen anwenden:

User.create(name: "Klaus", role: "admin")
User.create(name: "Markus", role: "admin")
User.create(name: "Max")

puts User.admins.names # ["Klaus", "Markus"]

Dies ist eine interessante Eigenschaft, die mir in den bisherigen Rails-Dokumentationen nicht aufgefallen ist. Erst nach gezielter Suche konnte ich einen Hinweis in den API-Docs finden.

]]>
http://sgaul.de/2014/09/24/methoden-fuer-active-record-relationen-definieren/feed/ 0
Pakyows Ansatz für Views in Web-Applikationen http://sgaul.de/2014/08/24/pakyows-ansatz-fuer-views-in-web-applikationen/ http://sgaul.de/2014/08/24/pakyows-ansatz-fuer-views-in-web-applikationen/#comments Sun, 24 Aug 2014 11:33:38 +0000 http://sgaul.de/?p=2685 Weiterlesen ]]> Auch wenn die Vertreter der Client-Seite den Kampf um die Frage, wo Views künftiger Web-Applikationen gerendert werden, schon lange gewonnen haben, so bleiben doch einige Diskussionspunkte offen. Was wird aus Suchmaschinen, Javascript-Verweigerern und den Nutzern von schwacher Hardware oder alter Browser? Der Schritt zur Client-Side-Web-Application ist an Konsequenzen geknüpft, die nicht jeder in Kauf nehmen möchte. Ich halte immer die Augen nach Projekten offen, die das Rendern sowohl auf Server als auch Client mit möglichst wenig Overhead ermöglichen.

Das Pakyow-Projekt erfüllt diese Anforderung nicht, zeigt aber einen interessanten Ansatz für Views. Sicher nicht der erste oder gar einzige seiner Art, aber einer mit konkreter Umsetzung. Zudem scheint eine weitere Entwicklung in Richtung Client- und Server-Seite möglich, da Entwickler Bryan Powell bei dem Thema recht euphorisch wirkt.

<article data-scope="post">
  <h1 data-prop="title">My First Post</h1>
  <div data-prop="body">Lorem ipsum dolor sit amet</div>
</article>

Das einfache Beispiel führt dabei zum selben Ergebnis wie das folgende HAML-Beispiel, nur dass die obigen Data-Attribute für spätere Updates erhalten bleiben.

- @posts.each do |post|
  %article
    %h1= post.title
    %div= post.body

Man beachte die Each-Schleife: Das obige Template erzeugt das Article-Element für jeden Post der Datenquelle.

Das obige Beispiel hat gegenüber der HAML-Notation entscheidende Vorteile.

Der Template-Entwickler kann die Templates mit beliebigen Inhalten befüllen (siehe oben „My First Post“) und ohne Backend-Logik ein sinnvolles Ergebnis sehen. Template und Backend sind besser getrennt.

Der wesentliche Vorteil ist aber, dass das Template mit einfachen Datenstrukturen, üblicherweise einem JSON-Dokument, bestückt werden kann. Eine solch relativ einfache Template-Engine ließe sich für Server (z. B. in Ruby) und in Javascript für den Client realisieren. So kann der Server den mit korrekten Werten befüllten View ausliefern. Weitere Updates würde er nur als JSON schicken, welches der Browser anhand der gegebenen Data-Notationen ins DOM einbaut.

Der Backend-Entwickler muss sich somit nur noch um die JSON-Struktur sorgen. Ob die Response als HTML oder JSON ausgeliefert wird, ließe sich weitgehend im Framework abstrahieren.

Für mich als Rails-Gefangenen ist das Hauptproblem mit Pakyow, dass es Rails ersetzen statt ergänzen würde. Einen Ansatz zur Integration konnte ich bisher nicht finden, so dass hier eigene Überlegungen notwendig wären.

]]>
http://sgaul.de/2014/08/24/pakyows-ansatz-fuer-views-in-web-applikationen/feed/ 0
Ruby: Testvollständigkeit testen http://sgaul.de/2014/05/20/ruby-testvollstaendigkeit-testen/ http://sgaul.de/2014/05/20/ruby-testvollstaendigkeit-testen/#comments Tue, 20 May 2014 14:23:59 +0000 http://sgaul.de/?p=2679 Weiterlesen ]]> Eine Wissenschaft für sich im Test-Driven Development ist die Frage, wie jede einzelne Funktion getestet werden muss: Sind die Tests vollständig, hat man jeden Spezialfall bedacht? Hat man es zu gut gemeint und eine schwer überschaubare, redundante Testsuite geschaffen?

Einen recht ungewöhnlichen Weg zur Beantwortung der ersten Frage geht Markus Schirp. Sein Gem Mutant betrachtet Code und die zugehörigen, grünen Tests. Es verändert nun immer wieder bestimmte Teile des Applikations-Codes (nicht die Tests) und prüft, ob die Tests dadurch fehlschlagen. Tun sie dies nicht lässt sich schlussfolgern, dass diese Stellen des Codes nicht vollständig durch Tests abgedeckt oder tot sind.

Die Code-Änderungen sind dabei vollautomatisch. Ifs werden durch Unless ersetzt, boolsche Default-Werte von Argumenten werden negiert oder ganze Statements weggelassen. Solange die Tests dadurch fehlschlagen ist es egal wie viel Unsinn sich hieraus ergibt.

Der Ansatz klingt auf jeden Fall interessant und erscheint um einiges aussagekräftiger als die üblichen Code-Coverage-Statistiken. Ob er wirklich praxistauglich ist kann ich aufgrund mangelnder Erfahrung nicht beurteilen. Im Weg steht leider auch der etwas sperrige Einstieg. Ich konnte etwa keine Beispiele finden wie man Code mit Rails-Abhängigkeiten testet – und von diesem Code habe ich eine Menge. Ein Gem Mutant-Rails gibt es zwar schon, ist aber mit einem entmutigenden „This gem does not yet work“ überschrieben. Aber der Kurs scheint zu stimmen.

Auf der Rails-Conf 2014 gab es einen Vortrag zu Mutant. Dieser kratzt leider nur an der Oberfläche, zeigt aber immerhin ein Live-Beispiel.

]]>
http://sgaul.de/2014/05/20/ruby-testvollstaendigkeit-testen/feed/ 0