PostgreSQL Error Full Dump auf manfrotto.com
Bastler.
Sonntag, 5. März 2017
PostgreSQL Error Full Dump auf manfrotto.com
Bastler.
Tags: Manfrotto, Postgres, PostgreSQL, Ruby, Stack Trace
Labels: Web
Freitag, 25. Februar 2011
Nachfolgend eine Sammlung von Ruby on Rails 3-Kleinigkeiten, die den Umstieg von PHP-Programmierern auf diese Programmiersprache/dieses Framework erleichtern sollen.
Werden mit # eingeleitet.
Um die Views schlank zu halten, empfiehlt es sich, häufig benutzte (respektive umfangreiche) Funktionen in den jeweiligen Helper auszulagern. Eine gute Einleitung in die Thematik findet sich im Artikel Using helper methods in Ruby on Rails.
Das besondere an Ruby-Methoden: Das Resultat der letzten Zeile einer Methode wird automatisch zurückgegeben, man muss also keine aus anderen Sprachen gewohnte return-Anweisung notieren.
Um mit Ruby on Rails 3 eine Helper-Methode HTML-Code zurückgeben zu lassen, muss das Resultat als „safe“ gekennzeichnet werden (via Ruby on Rails Helper Method – HTML is displayed as plain text). Ansonsten werden „<“ „>“ im Rückgabewert automatisch in HTML-Entities umgewandelt. Konkret:
def machHtml html = "<h1>Titel</h1>" html.html_safe end
Wie PHP kennt auch Ruby die Heredoc-Notation (via Heredocs – oder – Code in der 2. Dimension), mit welcher man HTML-Code zeilenübergreifend notieren und Ruby-Variablen einfügen kann:
html = <<HTML <tr> <td></td> <td></td> <td></td> </tr> HTML
Das besondere ist hierbei, dass man bei der Angabe eines Bindestrichs „-“ beim Beginn des Heredocs den EOL auch einrücken kann, um den Programmcode lesbarer zu machen:
html = <<-HTML <tr> <td></td> <td></td> <td></td> </tr> HTML
Um in Heredoc Ruby-Variablen auszugeben, werden diese als #{variable} notiert.
rounded = "%.2f" % val
Das Template der Standardseite (HTML Header und Footer) ist unter ~/app/views/layouts/application.html.erb abgelegt.
Sobald man ein CSS-Stylesheet in ~/public/stylesheets ablegt, wird dieses automatisch in das Template eingebunden.
In ~/config/application.rb sollte man die richtige Zeitzone notieren:
... config.time_zone = 'Bern' ...
Um den erwarteten Wert herauszufinden, bemüht man sich folgenden Befehls:
$ rake time:zones:local
Um die locale auf Deutsch zu ändern, muss zuerst eine vorgefertigte locale-Datei heruntergeladen und in ~/config/locales abgelegt werden. Leider ist de-CH.yml kaputt, de.yml funktioniert hingegen:
$ cd ~/config/locales $ wget --no-check-certificate "https://github.com/svenfuchs/rails-i18n/raw/master/rails/locale/de.yml"
Anschliessend passt man ~/config/application.rb an:
... config.i18n.default_locale = :de ...
Hierzu stellt Ruby on Rails 3 eine Locale-Funktion bereit:
l(date, :format => '%a %d.%m.%Y')
Im Controller der Applikation unter ~/app/controllers/stamps_controller.rb kann man nach dem Scaffolding natürlech eigene Anpassungen vornehmen:
def index #@stamps = Stamp.all @stamps = Stamp.find(:all, :order => 'date_start') respond_to do |format| format.html # index.html.erb format.xml { render :xml => @stamps } end end
Mit @stamps = Stamp.find(:all, :order => 'date_start') macht man im Grunde dasselbe wie mit @stamps = Stamp.all, doch sortiert die Resultate datenbankseitig (!) bereits nach einem bestimmten Feld. Die Sortierrichtung kehrt man um, indem man noch DESC an den Befehl anhängt.
Tags: Programmierung, RoR, Ruby, Ruby on Rails, Web-Entwicklung
Labels: Web
Donnerstag, 24. Februar 2011
Nachdem man Ruby on Rails 3 auf seinem Entwicklungsserver eingerichtet hat, kann man sich sofort hinter die Entwicklung einer ersten Testapplikation machen.
Meine Anleitung richtet sich an Web-Entwickler, die mit einem PHP-Hintergrund Ruby on Rails ausprobieren möchten und mit dem MVC-Paradigma vertraut sind (sprich schon mit dem Zend Framework, Symfony, CakePHP etc. produktiv gearbetiet haben).
Im Netz gibt es unzählige How-Tos und Tutorials um eine erste Rails-Applikation hinzubiegen — sehr hilfreich war für mich Enabling Rails 3 for your application. Leider beziehen sich die wenigsten Anleitungen auf Ruby on Rails 3. Leider vernachlässigen es die Autoren solcher Werke oftmals zudem, darauf hinzuweisen, auf welche Rails-Version sich die Anleitung denn eigentlich bezieht. Dies hole ich hier explizit vor — meine Version lautet:
$ rails -v Rails 3.0.4
Notabene: Es gibt anscheinend die Möglichkeit, mit der neuesten Rails-Version auch Projekte anzulegen, welche nach einer der älteren Versionen aufgebaut sind (rails _2.3.5_ APP_NAME via How can I create previous version rails in rails 3?). Wenn aber jemand Rails lernen möchte, sollte er dies mit der aktuellsten Version tun — so meine Überzeugung.
Um rasch Gemeinsamkeiten und Unterschiede zu PHP aufzuzeigen, habe ich mich hierbei entschlossen, eine bestehende PHP-Webapplikation mit Ruby on Rails nachzubauen: Das Arbeitsjournal. Mit diesem führe ich für einen meiner derzeitigen Jobs Buch, wie lange ich arbeite und welche Aufgaben ich wann erledigt habe. Das Tool zeigt mir die Gesamtarbeitszeit für einen Monat und berechnet auch gleich, ob ich die gemäss Arbeitsvertrag erforderlichen Stunden abgearbeitet habe oder nicht.
Der Projekttitel liegt auf der Hand: arbeitsjournal.
Ich habe mich entschieden, meine Projekte unter /var/rails abzulegen. Nachdem ich dieses Verzeichnis erstellt habe, welches alle zukünftigen Ruby-Projekte enthält, wechsle ich da hinein und erstelle mir die Projektstruktur. Dank Rails ist dies Sache eines einzigen Befehls:
# mkdir /var/rails $ cd /var/rails $ rails new arbeitsjournal -d mysql
Die Option -d gibt an, dass man die Modelle und Daten in einer MySQL-Datenbank abgelegt haben möchte (Standard ist sqlite3)
Als Datenbank habe ich MySQL gewählt. Das Vorgehen ist identisch wie bei PHP-Web-Projekten: Zuerst erstellt man sich eine Datenbank (bei mir ruby_arbeitsjournal), einen MySQL-Benutzer (ruby) mitsamt Passwort und weist ihm Schreibrechte auf die neu erstellte Datenbank zu. Nach einem FLUSH PRIVILEGES; liest die MySQL-Datenbank den neuen Benutzer ein. Ich verwende dazu als Relikt vergangener Tage das GUI phpMyAdmin, obwohl ich auf der MySQL-Kommandozeile mittlerweile viel rascher ans Ziel kommen würde.
Unter Rails gibt man die Datenbankoptionen in der Datei ~/config/database.yml an:
... development: adapter: mysql database: ruby_arbeitsjournal host: localhost username: ruby password: ******** ...
Nun ist es an der Zeit, das Modell zu erstellen. Da es sich um eine Applikation mit ein, zwei Datenbanktabellen handelt, welche wiederum kaum Felder beinhalten, kann man dies bequem auf der Kommandozeile machen. Als Objektbezeichnung für einen Arbeitszeiteintrag habe ich mich an die gute, alte Stempeluhr erinnert und das Objekt deshalb Stamp genannt:
$ rails generate scaffold Stamp date_start:datetime date_end:datetime description:text
Das Objekt heisst Stamp und es weist drei Felder auf: date_start, date_end und description, denen die jeweiligen Titel zugewiesen werden. Nützlich war mir hier eine Liste der für’s Scaffolding verfügbaren Feldtypen.
Dies erstellt den Controller, welcher für das Auflisten (index), Anzeigen (show), Erstellen (new), Speichern (create) Editieren (edit), Aktualisieren (update) und Löschen (destroy) zuständig ist. Natürlich ohne, dass ich als Entwickler eine einzige Zeile Code schreiben muss. Genial!
Zuletzt erstellen wir nun die physische Tabelle in MySQL:
$ rake db:migrate --trace
Ich habe einige Zeit damit verbraten, die Applikation über Apache 2 bereitzustellen. Leider momentan noch fruchtlos, u.a. weil sich die Anleitungen auf Rails 2 beziehen, welches offenbar noch ein dispatch.fcgi mit sich brachte. Dies fehlt im DocumentRoot ~/public einer 3er-Applikation.
Die Verwendung von Apache ist dabei gar nicht zwingend nötig — für Web-Entwickler stellt Rails (natürlich!) einen eigenen rudimentären Web-Server zur Verfügung. Man startet diesen über
$ cd /var/rails/arbeitsjournal # rails server
Aus dem Intranet kann man nun auf den Testserver zugreifen, indem man Port 3000 anspricht. In meinem Falle war dies mad4you.homeip.net:3000.
Wer obigen Link aufruft, erhält die Standard-Willkommensseite für Rails-Projekte zu gesicht, die unter ~/public/index.html abgelegt ist.
Benennt man diese Datei kurzerhand um, kriegt man eine Fehlermeldung zu Gesicht. Rails kann nämlich nicht hellsehen und weiss nicht, was der Benutzer eigentlich für eine Seite angezeigt erhalten möchte. Ein Abstecher in die Routing-Datei ~/config/routes.rb und eine klitzekleine projektbezogene Anpassung hilft weiter:
... root :to => "stamps#index" ...
Auf Deutsch: Diese Anweisung sagt Rails, dass falls ein Request namens GET / reinkommt, dieser auf die Stamps-Objekte weitergeleitet werden soll und dort die Auflistung aller Datenbankwerte
Jetzt folgt die Knochenarbeit — zum ersten Mal muss Ruby programmiert werden. Hier sollte sich jeder Web-Entwickler rasch heimisch fühlen, denn abgesehen von einer anderen Programmiersprache ist das Vorgehen nun jedem mit dem MVC-Paradigma vertrauten Entwickler bekannt: Views anpassen, Helper-Funktionen entwickeln und im Controller Kollisionsabfragen etc. implementieren.
Die Pfade zu den entsprechenden MVC-Elementen lauten in meinem Fall:
Insbesondere in ~/app/views/stamps/index.html.erb kann man genügend rumfuhrwerken. Hier vermischen sich HTML-Code und Ruby-Code, und hier kann der Entwickler genauestens steuern, wie die erfassten Daten ausgegeben respektive ausgewertet werden sollen.
Sehr wichtig ist ~/app/helpers/stamps_helper.rb, um die View nicht mit Ruby-Code zu überladen. Dorthin lagert man sich alle nützlichen kleinen Methoden aus, die mehrmals im Code benutzt werden und es deshalb Sinn macht, Redundanzen zu vermeiden.
Ab jetzt verfügt man über eine funktionierende Web-Applikation, um Arbeitsstunden zu erfassen. Rails hat die entsprechenden Controller-Aktionen automatisch bereitgestellt und ich kann sofort mit dem Einfüllen von Daten beginnen.
In einem weiteren Artikel werde ich mich um einige Finessen kümmern, die für PHP-Entwickler anders, ungewohnt, oftmals aber äusserst erleichternd sind.
Tags: Howto, Programmierung, RoR, Ruby, Ruby on Rails, Web-Entwicklung
Labels: Web
Mittwoch, 23. Februar 2011
Aus gegebenem Anlass habe ich mich heute Morgen das erste Mal seit langem wieder mit dem Web-Framework Ruby on Rails aus der Küche von David Heinemeier Hansson (einer der Partner hinter 37signals) auseinandergesetzt.
Nachfolgend habe ich zusammengefasst, wie ich das Framework auf meinem heimischen Entwicklungsserver zum Laufen gekriegt habe.
(Ich folge der englischen Anleitung Debian Lenny – Ruby on Rails von SliceHost)
Zuerst lädt man Debian-Pakete herunter und installiert diese:
# apt-get install ruby-dev ruby ri rdoc irb libreadline-ruby libruby libopenssl-ruby sqlite3 libsqlite3-ruby libsqlite-dev libsqlite3-dev
Anschliessend lädt man die Quellen von RubyGems herunter und kompiliert diese (man sollte auf das vorkompilierte Debian-Paket verzichten weil es mit Version 1.2.0 unglaublich veraltet ist):
# cd /tmp # wget "http://rubyforge.org/frs/download.php/74234/rubygems-1.5.2.tgz" # tar xvzfz rubygems-1.5.2.tgz # cd rubygems-1.5.2 # ruby setup.rb
Nun noch die obligatorischen Update-Anweisungen, die man sich als Linux-Benutzer von vielen Paketmanagern kennt, und dann ist man bereit:
# gem update
Bei mir erhielt ich bei der Ausführung von gem update folgende Fehlermeldung zu Gesicht:
# gem -v /usr/bin/gem:10: undefined method `manage_gems' for Gem:Module (NoMethodError)
Der Anleitung unter RubyGems: undefined method ‘manage_gems’ for Gem:Module (NoMethodError) – easy fix folgend wurde ein veraltetes Binary installiert, welches zuerst mit einer aktuellen Version ersetzt werden muss:
# mv /usr/bin/gem /usr/bin/gem-backup # ln -s /usr/bin/gem1.8 /usr/bin/gem
Anschliessend aktualisiert man das System (nun hoffentlich erfolgreich):
# gem update # gem update --system
Notabene: Bei mir wurden keine Updates nachgeladen, alles war bereits auf dem neuesten Stand …
Damit Ruby mit der Datenbank sqlite3 sprechen kann, muss ein entsprechender Treiber bereitgestellt werden. Falls bei
# gem install sqlite3
die Fehlermeldung
Fetching: sqlite3-1.3.3.gem (100%) Building native extensions. This could take a while... ERROR: Error installing sqlite3: ERROR: Failed to build gem native extension. /usr/bin/ruby1.8 extconf.rb extconf.rb:3:in `require': no such file to load -- mkmf (LoadError) from extconf.rb:3 Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/sqlite3-1.3.3 for inspection. Results logged to /usr/lib/ruby/gems/1.8/gems/sqlite3-1.3.3/ext/sqlite3/gem_make.out
erscheint, hat man im obigen apt-get für die Grundinstallation vergessen, die Header-Pakete von Ruby zu installieren (via Stackoverflow). Dies holt man mit folgendem Befehl nach:
# apt-get install ruby-dev libsqlite3-dev
Obwohl man Ruby (on Rails) natürlich auch mit sqlite3 benutzen könnte, ist der LAMP-Web-Entwickler primär mit MySQL vertraut — so kann diese Datenbank mit der ansprechenden GUI phpMyAdmin administriert werden und ist bei grösseren Datenmengen auch klar performanter als sqlite3.
Um den Treiber zu installieren, bemächtigt man sich folgender Debian-Pakete:
# apt-get install libmysql-ruby libmysqlclient-dev
Anschliessend ist
# gem install mysql
Problemlos möglich.
Mit dem Ruby-Paketmanager gem kann man sich nun endlich Rails aus dem Netz herunterladen und installieren lassen:
# gem install rails
Fertig! Jetzt sollte man eine funktionierende Ruby on Rails-Installation auf dem Server liegen haben und man ist bereit, mit Bordmitteln das erste Projekt anzulegen. Wie dies genau vor sich geht, folgt in einem weiteren Artikel.
Tags: Debian, Howto, RoR, Ruby, Ruby on Rails, Web-Entwicklung
Labels: Linux, Web