<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>acts_as_blog - :home</title>
  <id>tag:acts-as-blog.net,2008:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.8.0">Mephisto Drax</generator>
  <link href="http://acts-as-blog.net/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://acts-as-blog.net/" rel="alternate" type="text/html"/>
  <updated>2008-06-24T13:26:59Z</updated>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2008-06-24:667</id>
    <published>2008-06-24T13:24:00Z</published>
    <updated>2008-06-24T13:26:59Z</updated>
    <category term=":datenbank"/>
    <category term=":rails"/>
    <category term="apache"/>
    <category term="capistrano"/>
    <category term="deployment"/>
    <category term="mephisto"/>
    <category term="mongel"/>
    <category term="plesk"/>
    <link href="http://acts-as-blog.net/2008/6/24/mephisto-per-capistrano-deployen" rel="alternate" type="text/html"/>
    <title>Mephisto per Capistrano deployen</title>
<summary type="html">&lt;p&gt;Nach dem Ausfall des Servers letzte Woche, mußte ich dieses Blog auf einem neuen Server aufsetzen. Ein passender Augenblick, das ganze sauber mit &lt;a href=&quot;http://capify.org&quot;&gt;Capistrano&lt;/a&gt; zu machen. Dies ist eine kurze Zusammenfassung, wie auch du &lt;a href=&quot;http://mephistoblog.com/&quot;&gt;Mephisto&lt;/a&gt; auf einem Server mit openSuSE 10.2 und Plesk 8.4 (wie sie bei 1&amp;amp;1 angeboten werden) deployen kannst. Die Beispiele haben &#8220;acts-as-blog.net&#8221; als Beispieldomain. Du solltest entsprechend die Daten deinen Anforderungen anpassen.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Nach dem Ausfall des Servers letzte Woche, mußte ich dieses Blog auf einem neuen Server aufsetzen. Ein passender Augenblick, das ganze sauber mit &lt;a href=&quot;http://capify.org&quot;&gt;Capistrano&lt;/a&gt; zu machen. Dies ist eine kurze Zusammenfassung, wie auch du &lt;a href=&quot;http://mephistoblog.com/&quot;&gt;Mephisto&lt;/a&gt; auf einem Server mit openSuSE 10.2 und Plesk 8.4 (wie sie bei 1&amp;amp;1 angeboten werden) deployen kannst. Die Beispiele haben &#8220;acts-as-blog.net&#8221; als Beispieldomain. Du solltest entsprechend die Daten deinen Anforderungen anpassen.&lt;/p&gt;
&lt;p&gt;Als allererstes solltest du eine Domain inklusive Webspace über Plesk anlegen. Plesk erzeugt daraufhin in &lt;samp&gt;/srv/www/vhosts/$DOMAIN&lt;/samp&gt; unter anderem ein &lt;samp&gt;httpdocs&lt;/samp&gt;- sowie ein &lt;samp&gt;conf&lt;/samp&gt;-Verzeichnis. Die übrigen Verzeichnisse sind für das Deployment selbst uninteressant. Natürlich darf auch Ruby und die Rubygems auf dem Server nicht fehlen. Auch ein passendes Gem für deine Datenbank (MySQL, PostgreSQL) solltest du installieren. Dies kannst du über yast erledigen. Ich hatte ursprünglich auch Rails 2.1 installiert, doch wie sich später herausstellte, läuft Mephisto derzeit nur mit Rails 2.0.x, so daß ich Mephisto mit Rails 2.0.2 im Vendor-Verzeichnis deployen mußte. Das tzinfo-gem kannst du auch entweder direkt auf dem Server installieren oder &lt;a href=&quot;http://mephistoblog.com/2006/8/8/installing-mephisto-without-required-gems&quot;&gt;im Vendor-Verzeichnis mitliefern&lt;/a&gt;. Zu guter Letzt habe ich auch noch den Mongrel mitinstalliert. Dies ist kein Muß, vermutlich würde es mit Webrick genauso funktionieren.&lt;/p&gt;

&lt;p&gt;Der Apache (Version 2.2) muß natürlich als Proxy arbeiten. Dazu müssen die entsprechenden Proxy-Module geladen werden. Ich fand keinen Menüpunkt in Plesk, um diese Einstellung vorzunehmen, also habe ich in der &lt;samp&gt;/etc/sysconfig/apache2&lt;/samp&gt;-Datei die Zeile, die mit &lt;samp&gt;APACHE_MODULES&lt;/samp&gt; anfängt um &#8221;&lt;kbd&gt;proxy proxy_http proxy_balancer&lt;/kbd&gt;&#8221; erweitert. Spätestens jetzt sollte auch dir klargeworden sein, daß du ohne &lt;samp&gt;sudo&lt;/samp&gt; nicht auskommen wirst. Einen &lt;samp&gt;sudo&lt;/samp&gt;-losen Weg habe ich bislang nicht weiter ausprobiert.&lt;/p&gt;

&lt;p&gt;Da &lt;a href=&quot;http://capify.org&quot;&gt;Capistrano&lt;/a&gt; das Projekt unbedingt aus einem SCM-Repository deployen möchte, kannst du entweder das Vanilla-Mephisto von &lt;a href=&quot;http://github.com/&quot;&gt;GitHub&lt;/a&gt; damit deployen, Mephisto auf &lt;a href=&quot;http://github.com/&quot;&gt;GitHub&lt;/a&gt; forken oder ein komplettes eigenes Repository auf einer eigenen Maschine einrichten. Letztenendes ist es egal, für welchen Weg du dich entscheidest, solange du die korrekte URL für das Repository in der config/deploy.rb angibst.&lt;/p&gt;

&lt;p&gt;Mephisto benötigt eine Datenbank, um deine Artikel zu speichern. Lege eine Datenbank und einen Benutzer für diese Datenbank mit Plesk an. Die Zugangsdaten für diese Datenbank solltest auch in den Production-Abschnitt der database.yml-Datei eintragen. Damit wäre die Datenbankverbindung konfiguriert.&lt;/p&gt;

&lt;p&gt;Das Skript, was zuständig für das Starten des Mongrel ist, heißt &lt;samp&gt;script/spin&lt;/samp&gt;. Bei mir sieht dieses Skript so aus:&lt;/p&gt;

&lt;pre&gt;
#!/bin/sh
script/process/spawner -a 127.0.0.1 -p 8010 -i 3
&lt;/pre&gt;

&lt;p&gt;Damit werden 3 Mongrels auf Port 8010-8012 gestartet. Wie viele Mongrels tatsächlich benötigt werden, ist abhängig davon, wie stark besucht die Webseite ist. Da ein Mongrel mit ca. 64MB Speicherverbrauch zu buche schlägt, sollte man auch nicht zu viele Mongrels auf einmal starten. Vergiß nicht, dieses Skript ausführbar (chmod +x script/spin) zu machen und es wieder einzuchecken!&lt;/p&gt;

&lt;p&gt;Der Apache muß noch als Proxy für den Mongrel konfiguriert werden. Hierzu bietet Plesk an, daß man die Konfiguration der einzelnen virtuellen Hosts um eigene Konfigurationseinstellungen erweitern kann. Diese Einstellungen gehören in die &lt;samp&gt;/srv/www/vhosts/$DOMAIN/conf/vhost.conf&lt;/samp&gt;-Datei. Ich habe eine entsprechende &lt;samp&gt;vhost.conf&lt;/samp&gt;-Datei vorbereitet, die beim Deployment mithochgeladen und aktiviert wird. Hierzu habe ich in meinem Verzeichnis mit der Working-Copy von Mephisto die Datei &lt;samp&gt;config/vhost.conf&lt;/samp&gt; mit folgendem Inhalt erstellt:&lt;/p&gt;

&lt;pre&gt;
# Mongrel cluster configuration
&amp;lt;Proxy balancer://actsasblog_mongrel&amp;gt;
        BalancerMember http://127.0.0.1:8010
        BalancerMember http://127.0.0.1:8011
        BalancerMember http://127.0.0.1:8012
        Order deny,allow
        Allow from all
&amp;lt;/Proxy&amp;gt;

RewriteEngine On

# Check for maintenance file and redirect all requests
RewriteCond %{DOCUMENT_ROOT}/current/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ /current/system/maintenance.html [L]

# Rewrite index to check for static
RewriteRule ^/$ /current/index.html [QSA]

# Rewrite to check for Rails cached page
RewriteRule ^([^.]+)$ $1.html [QSA]

# Redirect all non-static requests to cluster
RewriteCond %{DOCUMENT_ROOT}/current/%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ balancer://actsasblog_mongrel%{REQUEST_URI} [P,QSA,L]
&lt;/pre&gt;

&lt;p&gt;Damit wäre alles bereit, mit Capistrano auf den Server hochgeschossen zu werden. Hierzu mußt du deine working copy capifien. Gib im Hauptverzeichnis deiner Working-Copy einfach &lt;kbd&gt;capify .&lt;/kbd&gt; ein und Capistrano erzeugt zwei neue Dateien in deiner Working-Copy. (&lt;samp&gt;Capfile&lt;/samp&gt; und &lt;samp&gt;config/deploy.rb&lt;/samp&gt;) Es ist eine Glaubensfrage, ob du diese Dateien ins Repository einchecken solltest. Letztere ist bei Mephisto sogar explizit in der &lt;samp&gt;.gitignore&lt;/samp&gt; aufgeführt. &lt;/p&gt;

&lt;p&gt;Die &lt;samp&gt;config/deploy.rb&lt;/samp&gt;-Datei solltest du nun an deine Anforderungen anpassen. Als Vorlage kannst du meine Datei benutzen:&lt;/p&gt;

&lt;pre&gt;
set :application, &quot;acts_as_blog&quot;
set :repository, &quot;git://meinrepository/acts_as_blog.git&quot;

role :web, &quot;acts-as-blog.net&quot;
role :app, &quot;acts-as-blog.net&quot;
role :db,  &quot;acts-as-blog.net&quot;, :primary =&gt; true

default_run_options[:pty] = true
set :deploy_to, &quot;/srv/www/vhosts/acts-as-blog.net/httpdocs&quot;
set :user, &quot;actsasbloguser&quot;
set :scm, :git
set :ssh_options, { :forward_agent =&gt; true }
set :use_sudo, false

set :common_dirs, ['public/assets']

namespace :deploy do
  desc &quot;upload database configuration&quot;
  task :upload_database_configuration, :roles =&gt; :app do
    run &quot;mkdir -p #{shared_path}/config&quot;
    config = File.read(File.join(File.dirname(__FILE__), &quot;database.yml&quot;))
    put config, &quot;#{shared_path}/config/database.yml&quot;
    run &quot;ln -nfs #{shared_path}/config/database.yml #{latest_release}/config/database.yml&quot;
  end

  desc &quot;update virtual host configuration&quot;
  task :update_vhost_conf, :roles =&gt; :web do
    run &quot;mkdir -p #{shared_path}/config&quot;
    config = File.read(File.join(File.dirname(__FILE__), &quot;vhost.conf&quot;))
    put config, &quot;#{shared_path}/config/vhost.conf&quot;
    sudo &quot;ln -nfs #{shared_path}/config/vhost.conf #{deploy_to}/../conf/vhost.conf&quot;
    sudo &quot;/usr/local/psa/admin/bin/websrvmng --vhost-name=acts-as-blog.net&quot;    # update plesk
    sudo &quot;/usr/sbin/rcapache2 configtest&quot;   # test apache configuration
    sudo &quot;/usr/sbin/rcapache2 reload&quot;      # reload apache configuration
  end

  desc &quot;symlink common directories on server&quot;
  task :symlink_common_dirs, :roles =&gt; :web do
    unless fetch(:common_dirs, []).empty?
      fetch(:common_dirs).each do |dir|
        run &quot;rm -rf #{release_path}/#{dir} &amp;&amp;\
              ln -nfs #{shared_path}/#{dir} #{release_path}/#{dir}&quot;
      end
    end
  end

  desc &quot;set up common directories on server&quot;
  task :setup_common_dirs, :roles =&gt; :web do
    unless fetch(:common_dirs, []).empty?
      dirs = fetch(:common_dirs).map { |d| File.join(shared_path, d)}
      run &quot;umask 002 &amp;&amp; mkdir -p #{dirs.join(' ')}&quot;
    end
  end

  after &quot;deploy:finalize_update&quot;, &quot;deploy:symlink_common_dirs&quot;
  after &quot;deploy:setup&quot;, &quot;deploy:setup_common_dirs&quot;

  after &quot;deploy:finalize_update&quot;, &quot;deploy:upload_database_configuration&quot;
  after &quot;deploy:upload_database_configuration&quot;, &quot;deploy:update_vhost_conf&quot;
end
&lt;/pre&gt;

&lt;p&gt;Da ich sowohl die &lt;samp&gt;config/database.yml&lt;/samp&gt; als auch die &lt;samp&gt;config/vhost.conf&lt;/samp&gt; explizit von der Revisionsverwaltung ausgeklammert habe, muß ich diese separat auf dem Server ablegen. Das erledigen die &lt;samp&gt;upload_database_configuration&lt;/samp&gt;- und &lt;samp&gt;update_vhost_conf&lt;/samp&gt;-Tasks. Die &lt;samp&gt;setup_common_dirs&lt;/samp&gt;- und &lt;samp&gt;symlink_common_dirs&lt;/samp&gt;-Tasks hatte ich bereits schon mal &lt;a href=&quot;http://acts-as-blog.net/2007/8/29/statische-verzeichnisse-nach-deployment&quot;&gt;hier&lt;/a&gt; vorgestellt.&lt;/p&gt;

&lt;p&gt;Damit wäre alles zum Deployment vorbereitet. Das eigentliche Deployment läuft dann so ab:&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;
cap deploy:setup  # Verzeichnisse vorbereiten
cap deploy:check  # Prüfen, ob alle Schreibrechte ausreichen
cap deploy:cold   # Hoch damit!
&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;Beim letzten Befehl sollte ein Haufen Zeilen vorbeiscrollen. Dies ist normal und kein Grund zur Besorgnis. Irgendwann wird sudo nach dem Paßwort fragen, um die vhost.conf einzubinden. Danach wird der Apache reloaded und die Mongrels gestartet. Damit sollte nun ein frisches Mephisto auf dem Server laufen. Sollten Probleme auftreten, so solltest du dir die Ausgaben von &lt;kbd&gt;cap deploy:cold&lt;/kbd&gt; genau anschauen. Oft ist in den Meldungen das Problem klar zu erkennen.&lt;/p&gt;

&lt;p&gt;Spätere Updates von Mephisto kannst du mit &lt;kbd&gt;cap deploy&lt;/kbd&gt; durchführen. Alles weitere findest du in der Dokumentation auf der &lt;a href=&quot;http://capify.org&quot;&gt;Capistrano-Website&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2008-03-27:324</id>
    <published>2008-03-27T12:55:00Z</published>
    <updated>2008-03-27T13:06:13Z</updated>
    <category term=":datenbank"/>
    <category term=":mac"/>
    <category term=":rails"/>
    <category term="build"/>
    <category term="leopard"/>
    <category term="mac"/>
    <category term="postgresql"/>
    <link href="http://acts-as-blog.net/2008/3/27/building-postgresql-on-mac-os-x-leopard" rel="alternate" type="text/html"/>
    <title>Building PostgreSQL on Mac OS X Leopard</title>
<summary type="html">&lt;p&gt;Some time ago I wrote a german article on how to install PostgreSQL on Leopard. It seems I struck a chord with many people. So I decided to make this article accessible to a wider audience by translating it to English. I modified and updated parts of it where appropriate. So here it is without further ado.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Some time ago I wrote a german article on how to install PostgreSQL on Leopard. It seems I struck a chord with many people. So I decided to make this article accessible to a wider audience by translating it to English. I modified and updated parts of it where appropriate. So here it is without further ado.&lt;/p&gt;
&lt;p&gt;In the course of this article I will install PostgreSQL from source. While I tried to describe all the steps along the way, you should have at least some basic experience with the terminal. Be also aware that you will be required to make changes to vital system settings. Mistakes can render your system unusable if not completely dead. Don&#8217;t say I didn&#8217;t warn you! Having said that let me reassure you that most readers of the original article have succeeded in installing PostgreSQL.&lt;/p&gt;

&lt;p&gt;To build PostgreSQL on your system you will need a C compiler. If you haven&#8217;t already done so please install the Xcode tools that came on your Leopard install DVD or grab a fresh copy from &lt;a href=&quot;http://developer.apple.com/&quot;&gt;Apple&#8217;s Developer Connection&lt;/a&gt;. I will be installing PostgreSQL 8.3.1 which is the latest version at the moment but these instructions should work with later versions, too.&lt;/p&gt;

&lt;p&gt;Grab the latest sources from &lt;samp&gt;http://www.postgresql.org/ftp/latest/&lt;/samp&gt;. The file you will need is usually named &lt;samp&gt;postgresql-8.x.x.tar.gz&lt;/samp&gt; or &lt;samp&gt;postgresql-8.x.x.tar.bz2&lt;/samp&gt;. Extract the contents of that archive to some place convenient. Open the terminal and change into the directory containing the extracted sources. From there start the build process with this command.&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;./configure --prefix=/Library/PostgreSQL --enable-thread-safety \
--with-krb5 --with-bonjour --with-openssl --with-gssapi \
&amp;&amp; make &amp;&amp; sudo make install&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;NB Even though Leopard and PostgreSQL now support &lt;a href=&quot;http://en.wikipedia.org/wiki/DTrace&quot;&gt;DTrace&lt;/a&gt; you currently will not be able to build PostgreSQL with DTrace support as this only works on Solaris right now. Later versions of PostgreSQL might get fixed but no luck so far.&lt;/p&gt;

&lt;p&gt;PostgreSQL usually runs with privileges of a special user. I chose user and group id 183 since it was unused on my system. To make sure this user/group id not already taken on your system use the following two commands to list all users/groups on your system and pick some other unused ids between 100 and 500 if neccesary.&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;dscl . -list /Users UniqueID
dscl . -list /Groups PrimaryGroupID&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;Unlike other Unix systems Leopard uses Open Directory to store user accounts. I&#8217;m going to be using &lt;a href=&quot;http://developer.apple.com/documentation/Porting/Conceptual/PortingUnix/additionalfeatures/chapter_10_section_9.html&quot;&gt;&lt;samp&gt;dscl&lt;/samp&gt;&lt;/a&gt; to create a user and group for PostgreSQL. (Adjust user and group ids if neccesary)&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo dscl . -create /Groups/_postgres 
sudo dscl . -create /Groups/_postgres RealName 'PostgreSQL Server'
sudo dscl . -create /Groups/_postgres PrimaryGroupID 183          
sudo dscl . -create /Groups/_postgres UserShell /usr/bin/false
sudo dscl . -create /Groups/_postgres Password '*'
sudo dscl . -create /Groups/_postgres NFSHomeDirectory /var/empty

sudo dscl . -create /Users/_postgres   
sudo dscl . -create /Users/_postgres Password '*'
sudo dscl . -create /Users/_postgres RealName 'PostgreSQL Server'
sudo dscl . -create /Users/_postgres PrimaryGroupID 183
sudo dscl . -create /Users/_postgres UniqueID 183      
sudo dscl . -create /Users/_postgres UserShell /usr/bin/false
sudo dscl . -create /Users/_postgres NFSHomeDirectory /Users/Shared/PostgreSQL&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;If no errors occurred you should be able to test that newly created user by typing &lt;kbd&gt;id _postgres&lt;/kbd&gt;. The response should look like this:&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;uid=183(_postgres) gid=183(_postgres) groups=183(_postgres)&lt;/samp&gt;&lt;/pre&gt;

&lt;p&gt;Since I installed everything into &lt;samp&gt;/Library/PostgreSQL&lt;/samp&gt; there&#8217;s some extra work needed to have all command line tools conveniently available. Either add &lt;samp&gt;/Library/PostgreSQL/bin&lt;/samp&gt; to the shell&#8217;s &lt;code&gt;$PATH&lt;/code&gt; or symlink all those tools to a directory that is already in the &lt;code&gt;$PATH&lt;/code&gt;. I opted for the latter. Since Leopard comes with a pristine &lt;samp&gt;/usr/local&lt;/samp&gt; directory it might be neccessary to create some directories first. Something like &lt;kbd&gt;sudo mkdir -p /usr/local/{bin,man/man1,man/man7}&lt;/kbd&gt; should do the trick. To create all those symlinks you can use this &lt;a href=&quot;http://acts-as-blog.net/assets/2007/11/3/symlink_pgsql.sh&quot;&gt;little script&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh

POSTGRES_DIR=/Library/PostgreSQL
DEST_DIR=/usr/local
SYMLINK_DIRS=&quot;bin man/man1 man/man7&quot;

for CUR_DIR in $SYMLINK_DIRS; do
  for CUR_FILE in $POSTGRES_DIR/$CUR_DIR/*; do
    sudo ln -nfs $CUR_FILE $DEST_DIR/$CUR_DIR${CUR_FILE#$POSTGRES_DIR/$CUR_DIR}
  done
done&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A quick check with &amp;lt;q&gt;&lt;kbd&gt;which psql&lt;/kbd&gt;&amp;lt;/q&gt; should reveal if everything went smoothly. &lt;a href=&quot;http://www.zsh.org/&quot;&gt;Zsh&lt;/a&gt; users might need to &lt;kbd&gt;rehash&lt;/kbd&gt;.&lt;/p&gt;

&lt;p&gt;I decided to store the database in &lt;samp&gt;/Users/Shared/PostgreSQL&lt;/samp&gt;. As this directory usually does not exist it must be created first.&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo mkdir -p /Users/Shared/PostgreSQL
sudo chown _postgres:_postgres /Users/Shared/PostgreSQL&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;Now the database can be initialized. During the initialization process you will be asked to enter a password for the database superuser. Pick any password just don&#8217;t forget it. To initialize the database use this command.&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo -u _postgres initdb -U postgres -A md5 -W -E UTF8 \
-D /Users/Shared/PostgreSQL/data&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;A successful initialization looks similar to this:&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;The files belonging to this database system will be owned by user &quot;_postgres&quot;.
This user must also own the server process.

The database cluster will be initialized with locale de_DE.UTF-8.
The default text search configuration will be set to &quot;german&quot;.

creating directory /Users/Shared/PostgreSQL/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 20
selecting default shared_buffers/max_fsm_pages ... 2400kB/20000
creating configuration files ... ok
creating template1 database in /Users/Shared/PostgreSQL/data/base/1 ... ok
initializing pg_authid ... ok
Enter new superuser password: 
Enter it again: 
setting password ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

Success. You can now start the database server using:

    postgres -D /Users/Shared/PostgreSQL/data
or
    pg_ctl -D /Users/Shared/PostgreSQL/data -l logfile start
&lt;/samp&gt;&lt;/pre&gt;

&lt;p&gt;I intend to use PostgreSQL on my machine for development with &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt; so I prefer logging all commands sent to the database. In a production environment that might impact performance negatively so be careful how much logging you really need.&lt;/p&gt;

&lt;p&gt;Create in &lt;samp&gt;/var/log&lt;/samp&gt; a directory for the log files.&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo mkdir /var/log/postgres&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;I want PostgreSQL to send all log messages to the syslog daemon which in turn will write them to disk. Add to &lt;samp&gt;/etc/syslog.conf&lt;/samp&gt; this line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;local3.*                                /var/log/postgres/postgres.log&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To prevent the log file from growing until it fills up your whole disk add this to &lt;samp&gt;/etc/newsyslog.conf&lt;/samp&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/var/log/postgres/postgres.log          644  5     *    @T00  J&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now create an empty log file and restart the syslog daemon.&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo touch /var/log/postgres/postgres.log
sudo kill -HUP $(cat /var/run/syslog.pid)&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;Of course PostgreSQL must be told to use syslog. These two lines in &lt;samp&gt;/Users/Shared/PostgreSQL/data/postgresql.conf&lt;/samp&gt; will take care of that:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;log_destination = 'syslog'
syslog_facility = 'LOCAL3'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;While you are editing this file you should tell PostgreSQL &lt;em&gt;what&lt;/em&gt; to log. As I mentioned before, I want it all. (see &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/runtime-config-logging.html&quot;&gt;PostgreSQL documentation: Error Reporting and Logging&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;log_line_prefix = '%u@%h:/%d '
log_statement = 'all'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;PostgreSQL is now ready to be launched. But it would be tedious to always start it by hand. I created a &lt;a href=&quot;http://acts-as-blog.net/assets/2007/11/4/org.postgresql.postmaster.plist.gz&quot;&gt;launchd script&lt;/a&gt; to have PostgreSQL start automatically at boot time.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple Computer//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;
&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;org.postgresql.postmaster&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;UserName&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;_postgres&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;OnDemand&amp;lt;/key&amp;gt;
    &amp;lt;false/&amp;gt;
    &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
    &amp;lt;array&amp;gt;
        &amp;lt;string&amp;gt;/Library/PostgreSQL/bin/postmaster&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;-D&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;/Users/Shared/PostgreSQL/data&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;-c&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;log_connections=YES&amp;lt;/string&amp;gt;
    &amp;lt;/array&amp;gt;
    &amp;lt;key&amp;gt;ServiceDescription&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;PostgreSQL Server&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Save this script as &lt;samp&gt;org.postgresql.postmaster.plist&lt;/samp&gt; in &lt;samp&gt;/Library/LaunchDaemons&lt;/samp&gt; and have it read by launchd using &lt;code&gt;sudo launchctl load /Library/LaunchDaemons/org.postgresql.postmaster.plist&lt;/code&gt;. This is the moment of truth. Now you finally get to know if you screwed up somewhere along the way. This is what you should get. (Or at least something resembling that)&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;Venus:~ fastjack$ &lt;/samp&gt;&lt;kbd&gt;ps ax | grep postmaster&lt;/kbd&gt;
&lt;samp&gt; 5315   ??  Ss     0:00.31 /Library/PostgreSQL/bin/postmaster -D /Users/Shared/PostgreSQL/data -c log_connections=YES&lt;/samp&gt;&lt;/pre&gt;

&lt;p&gt;The database should accept connections:&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;Venus:~ fastjack$ &lt;/samp&gt;&lt;kbd&gt;psql -U postgres template1&lt;/kbd&gt;
&lt;samp&gt;Password for user postgres: 
Welcome to psql 8.3, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

template1=# &lt;/samp&gt;&lt;/pre&gt;

&lt;p&gt;As you might have guessed from the name, this is a blog about Ruby on Rails. This article would not be complete without describing how to install the Postgres gem so you can actually use the database to do something useful. Since I installed PostgreSQL in an unconventional location the Postgres gem will not be able to find it automatically. This command should take care of that:&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo gem install postgres -- --with-pgsql-lib-dir=/Library/PostgreSQL/lib \
--with-pgsql-include-dir=/Library/PostgreSQL/include&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;If you have an Intel mac you will probably have to change that line to:&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo env ARCHFLAGS='-arch i386' gem install postgres -- \
--with-pgsql-lib-dir=/Library/PostgreSQL/lib \
--with-pgsql-include-dir=/Library/PostgreSQL/include&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;That&#8217;s it. Now you&#8217;re ready to start hacking with Ruby on Rails&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2008-02-28:277</id>
    <published>2008-02-28T12:47:00Z</published>
    <updated>2008-02-28T12:49:20Z</updated>
    <category term=":rails"/>
    <category term="activerecord"/>
    <category term="default"/>
    <category term="plugin"/>
    <link href="http://acts-as-blog.net/2008/2/28/plugin-der-woche-active-record-defaults" rel="alternate" type="text/html"/>
    <title>Plugin der Woche: active_record_defaults</title>
<content type="html">
            &lt;p&gt;Ein Plugin, was mir heute ein wenig Arbeit erspart hat ist &lt;em&gt;active_record_defaults&lt;/em&gt;. Damit kann man in ActiveRecord-Modellen Defaultwerte für einzelne Attribute festlegen, ohne sie im Schema zu verankern. Das Plugin findet sich unter &lt;a href=&quot;http://svn.viney.net.nz/things/rails/plugins/active_record_defaults/&quot;&gt;http://svn.viney.net.nz/things/rails/plugins/active_record_defaults/&lt;/a&gt;. Die Benutzung ist denkbar einfach:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Person &amp;lt; ActiveRecord::Base
  defaults :age =&amp;gt; 16
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Schon ist jede Person 16 Jahre alt, sofern nichts anderes angegeben wurde.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-12-07:51</id>
    <published>2007-12-07T15:51:00Z</published>
    <updated>2007-12-07T16:17:06Z</updated>
    <category term=":rails"/>
    <category term="rails"/>
    <link href="http://acts-as-blog.net/2007/12/7/rails-2-0" rel="alternate" type="text/html"/>
    <title>Rails 2.0</title>
<content type="html">
            &lt;p&gt;Holt es euch, solange es heiß ist!&lt;/p&gt;

&lt;p&gt;Eine recht ausführliche Liste aller Neuerungen gibt es &lt;a href=&quot;http://weblog.rubyonrails.com/2007/12/7/rails-2-0-it-s-done&quot;&gt;hier&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ich werde mal gleich eine kleine Testanwendung versuchen. Mal schauen, wie es sich &lt;em&gt;anfühlt&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Update: 2.0.1 ist bereits raus. Ist wohl beim Release etwas schiefgelaufen.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-11-04:23</id>
    <published>2007-11-04T00:04:00Z</published>
    <updated>2008-02-11T04:56:10Z</updated>
    <category term=":datenbank"/>
    <category term=":mac"/>
    <category term=":rails"/>
    <category term="leopard"/>
    <category term="macosx"/>
    <category term="postgresql"/>
    <link href="http://acts-as-blog.net/2007/11/4/postgresql-auf-mac-os-x-10-5" rel="alternate" type="text/html"/>
    <title>PostgreSQL auf Mac OS X 10.5</title>
<summary type="html">&lt;p&gt;Vor einer Weile habe ich in meinem &lt;a href=&quot;http://fastjack.at&quot; title=&quot;FastJacks Paralleluniversum&quot;&gt;Blog&lt;/a&gt; geschrieben, wie man &lt;a href=&quot;http://fastjack.at/index.php/paralleluniversm/comments/postgresql_auf_mac_os_x_selbstgebaut/&quot;&gt;PostgreSQL auf Mac OS X 10.4&lt;/a&gt; (aka Tiger) installiert. Seitdem ist eine Weile ins Land gegangen. &lt;a href=&quot;http://www.postgresql.org&quot;&gt;PostgreSQL&lt;/a&gt; ist inzwischen bei 8.2.5 angekommen und es existiert eine 8.3 beta 2. Nicht ganz unerwähnt bleiben sollte auch die Tatsache, daß vor kurzem Mac OS X 10.5 (aka Leopard) erschien. Änderungen in Mac OS X 10.5 machen haben dazu geführt, daß meine alte Anleitung als überholt angesehen werden kann. Deshalb folgt hier die aktualisierte Version.&lt;/p&gt;</summary><content type="html">
            &lt;p&gt;Vor einer Weile habe ich in meinem &lt;a href=&quot;http://fastjack.at&quot; title=&quot;FastJacks Paralleluniversum&quot;&gt;Blog&lt;/a&gt; geschrieben, wie man &lt;a href=&quot;http://fastjack.at/index.php/paralleluniversm/comments/postgresql_auf_mac_os_x_selbstgebaut/&quot;&gt;PostgreSQL auf Mac OS X 10.4&lt;/a&gt; (aka Tiger) installiert. Seitdem ist eine Weile ins Land gegangen. &lt;a href=&quot;http://www.postgresql.org&quot;&gt;PostgreSQL&lt;/a&gt; ist inzwischen bei 8.2.5 angekommen und es existiert eine 8.3 beta 2. Nicht ganz unerwähnt bleiben sollte auch die Tatsache, daß vor kurzem Mac OS X 10.5 (aka Leopard) erschien. Änderungen in Mac OS X 10.5 machen haben dazu geführt, daß meine alte Anleitung als überholt angesehen werden kann. Deshalb folgt hier die aktualisierte Version.&lt;/p&gt;
&lt;p&gt;Für die Installation brauchst du Xcode 3.0. Es befindet sich auf der Installations-DVD von Leopard bzw. du kannst von von &lt;a href=&quot;http://developer.apple.com/&quot;&gt;Apples Developer Connection&lt;/a&gt; herunterladen. Ist Xcode installiert, kannst du mit der eigentlichen Installation von PostgreSQL loslegen. Ich werde im Laufe dieser Anleitung PostgreSQL 8.3 beta 2 bei mir installieren, doch die einzelnen Installationsschritte sollten auch mit 8.2 und 8.1 ohne Änderungen funktionieren.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Warnung&lt;/em&gt;: Einige der folgenden Schritte (wie z.B. das Anlegen der Gruppe/User) führen Änderungen an wichtigen Systemeinstellungen durch. Unbedachte Änderungen und Fehler können hier schnell dazu führen, daß das System unbenutzbar wird. Sagt nicht, ich hätte euch nicht gewarnt! Ich habe anhand dieser Schritte PostgreSQL auf 2 Rechnern bereits erfolgreich eingerichtet. Statistisch gesehen, macht das eine Erfolgsquote von 100% (*auf die Schulter klopf*), doch ich kann nicht garantieren, daß es überall ohne Probleme abläuft. Solltest du Probleme haben oder gar Fehler in der Anleitung entdeckt haben, so kannst du mich gerne per Email kontaktieren (s. Impressum) oder einen Kommentar unter diesem Artikel hinterlassen.&lt;/p&gt;

&lt;p&gt;Lade dir zuerst den Quelltext von PostgreSQL herunter. Unter &lt;samp&gt;http://www.postgresql.org/ftp/latest/&lt;/samp&gt; findest du stehts die aktuelle &lt;em&gt;stabile&lt;/em&gt; Release. Die richtige Datei heißt in der Regel &lt;samp&gt;postgresql-8.x.x.tar.gz&lt;/samp&gt; bzw. &lt;samp&gt;postgresql-8.x.x.tar.bz2&lt;/samp&gt;. Extrahiere das Archiv an einer geeigneten Stelle und begib dich mit dem Terminal in dieses Verzeichnis. Von da aus, kannst du PostgreSQL mit folgender Zeile kompilieren und installieren:&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;./configure --prefix=/Library/PostgreSQL --enable-thread-safety \
--with-krb5 --with-bonjour --with-openssl --with-gssapi \
&amp;&amp; make &amp;&amp; sudo make install&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;An dieser Stelle möchte ich anmerken, daß Mac OS X 10.5 &lt;a href=&quot;http://en.wikipedia.org/wiki/DTrace&quot;&gt;DTrace&lt;/a&gt; mit an Bord hat und PostgreSQL 8.3 auch mit DTrace-Support kompiliert werden kann. Leider kennen die Makefiles von PostgreSQL 8.3 in der aktuellen Beta nur die Solaris-Version von DTrace und brechen auf Mac OS X mit einer Fehlermeldung beim kompilieren ab. Ich hoffe, daß dieses Problem bis zur Release von PostgreSQL 8.3 behoben wird. Sollten spätere Versionen von PostgreSQL in dieser Hinsicht korrigiert werden, so reicht es aus, die obige Configure-Zeile um &lt;code&gt;--enable-dtrace&lt;/code&gt; zu erweitern.&lt;/p&gt;

&lt;p&gt;Damit PostgreSQL auch laufen kann, benötigt es einen Systemuser. In meiner früheren Anleitung für Tiger hatte ich mich für die User-ID 73 entschieden, da diese frei war. Unter Leopard sind fast alle freien User-IDs unter 100 belegt. Ich habe mich also für die User-ID 183 entschieden.&lt;/p&gt;

&lt;p&gt;Eine weitere Änderung gegenüber Tiger, ist der Wegfall des Netinfo Managers sowie der NetInfo-Kommandozeilentools wie &lt;samp&gt;niutil&lt;/samp&gt;. Ab Leopard gibt es nur noch das &lt;a href=&quot;http://developer.apple.com/documentation/Porting/Conceptual/PortingUnix/additionalfeatures/chapter_10_section_9.html&quot;&gt;Open Directory und das Kommandozeilentool &lt;samp&gt;dscl&lt;/samp&gt;&lt;/a&gt;. Die benötigte Gruppe und den User legst du mit folgenden Befehlen an:&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo dscl . -create /Groups/_postgres 
sudo dscl . -create /Groups/_postgres RealName 'PostgreSQL Server'
sudo dscl . -create /Groups/_postgres PrimaryGroupID 183          
sudo dscl . -create /Groups/_postgres UserShell /usr/bin/false
sudo dscl . -create /Groups/_postgres Password '*'
sudo dscl . -create /Groups/_postgres NFSHomeDirectory /var/empty

sudo dscl . -create /Users/_postgres   
sudo dscl . -create /Users/_postgres Password '*'
sudo dscl . -create /Users/_postgres RealName 'PostgreSQL Server'
sudo dscl . -create /Users/_postgres PrimaryGroupID 183
sudo dscl . -create /Users/_postgres UniqueID 183      
sudo dscl . -create /Users/_postgres UserShell /usr/bin/false
sudo dscl . -create /Users/_postgres NFSHomeDirectory /Users/Shared/PostgreSQL&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;Den Erfolg dieser Zeilen kannst du überprüfen, indem du &lt;kbd&gt;id _postgres&lt;/kbd&gt; eingibst. Dies sollte folgende Zeile zurückliefern:&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;uid=183(_postgres) gid=183(_postgres) groups=183(_postgres)&lt;/samp&gt;&lt;/pre&gt;

&lt;p&gt;Durch die Installation in &lt;samp&gt;/Library/PostgreSQL&lt;/samp&gt; befinden sich die Kommandozeilentools von PostgreSQL an einem etwas mühsam erreichbaren Ort. Um dir das Leben zu erleichtern kannst du entweder &lt;samp&gt;/Library/PostgreSQL/bin&lt;/samp&gt; zu deinem &lt;code&gt;$PATH&lt;/code&gt; hinzufügen, oder Symlinks zu den Tools in einem Verzeichnis erstellen, welches sich im &lt;code&gt;$PATH&lt;/code&gt; befindet. Ich habe mich für letzteres entschieden und einen Haufen Symlinks in &lt;samp&gt;/usr/local&lt;/samp&gt; angelegt. Da Leopard ein geradezu jungfräuliches &lt;samp&gt;/usr/local&lt;/samp&gt;-Verzeichnis mitliefert, war es bei mir nötig, die leeren Verzeichnisse für die Tools und ihre Man-Pages zuerst mit &lt;kbd&gt;sudo mkdir -p /usr/local/{bin,man/man1,man/man7}&lt;/kbd&gt; anzulegen. Das symlinken erledigt dieses &lt;a href=&quot;http://acts-as-blog.net/assets/2007/11/3/symlink_pgsql.sh&quot;&gt;kleine Skript&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh

POSTGRES_DIR=/Library/PostgreSQL
DEST_DIR=/usr/local
SYMLINK_DIRS=&quot;bin man/man1 man/man7&quot;

for CUR_DIR in $SYMLINK_DIRS; do
  for CUR_FILE in $POSTGRES_DIR/$CUR_DIR/*; do
    sudo ln -nfs $CUR_FILE $DEST_DIR/$CUR_DIR${CUR_FILE#$POSTGRES_DIR/$CUR_DIR}
  done
done&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Teste nun mit &amp;lt;q&gt;&lt;kbd&gt;which psql&lt;/kbd&gt;&amp;lt;/q&gt;, ob die PostgreSQL-Kommandozeilentools auch wirklich erreichbar sind. (In der &lt;a href=&quot;http://www.zsh.org/&quot;&gt;Zsh&lt;/a&gt; könnte es nötig werden, vorher noch &lt;kbd&gt;rehash&lt;/kbd&gt; auszuführen, damit neue Programme im &lt;code&gt;$PATH&lt;/code&gt; erkannt werden)&lt;/p&gt;

&lt;p&gt;Ich habe mich entschieden, die Datenbank unter &lt;samp&gt;/Users/Shared/PostgreSQL&lt;/samp&gt; abzulegen (siehe auch NFSHomeDirectory des Users &lt;samp&gt;_postgres&lt;/samp&gt;). Da dieses Verzeichnis normalerweise nicht existiert, mußt du es zuerst anlegen:&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo mkdir -p /Users/Shared/PostgreSQL
sudo chown _postgres:_postgres /Users/Shared/PostgreSQL&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;Als nächstes muß die Datenbank initialisiert werden. Während der Initialisierung wirst du nach dem Passwort für den Datenbank-Superuser (in meinem Fall &lt;samp&gt;postgres&lt;/samp&gt; genannt) gefragt. Da du diesen Datenbank-Superuser brauchst, um weitere User und Datenbanken anzulegen, wäre es äußerst ungeschickt, seine Logindaten zu verlieren. Die Datenbank initialisierst du mit diesem Befehl:&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo -u _postgres initdb -U postgres -A md5 -W -E UTF8 \
-D /Users/Shared/PostgreSQL/data&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;Sollte die Initialisierung mit folgenden Ausgaben fehlschlagen, so begib dich zuerst mit &amp;lt;q&gt;&lt;kbd&gt;cd ~&lt;/kbd&gt;&amp;lt;/q&gt; in dein Heimatverzeichnis und führe dann die Initialisierung erneut aus.&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;could not identify current directory: Permission denied
could not identify current directory: Permission denied
could not identify current directory: Permission denied
The program &quot;postgres&quot; is needed by initdb but was not found in the
same directory as &quot;initdb&quot;.
Check your installation.&lt;/samp&gt;&lt;/pre&gt;

&lt;p&gt;Eine erfolgreiche Initialisierung dagegen sollte ungefähr so aussehen:&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;The files belonging to this database system will be owned by user &quot;_postgres&quot;.
This user must also own the server process.

The database cluster will be initialized with locale de_DE.UTF-8.
The default text search configuration will be set to &quot;german&quot;.

creating directory /Users/Shared/PostgreSQL/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 20
selecting default shared_buffers/max_fsm_pages ... 2400kB/20000
creating configuration files ... ok
creating template1 database in /Users/Shared/PostgreSQL/data/base/1 ... ok
initializing pg_authid ... ok
Enter new superuser password: 
Enter it again: 
setting password ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

Success. You can now start the database server using:

    postgres -D /Users/Shared/PostgreSQL/data
or
    pg_ctl -D /Users/Shared/PostgreSQL/data -l logfile start
&lt;/samp&gt;&lt;/pre&gt;

&lt;p&gt;Da ich PostgreSQL für die Entwicklung mit &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Rails&lt;/a&gt; benutze, möchte ich gerne wissen, welche Befehle an die Datebank gesendet werden. Solltest du die Datenbank in einer Produktivumgebung einsetzen wollen, so würde ich Logging auf die wirklich wichtigen Meldungen beschränken, da es sonst die Datenbank unnötig ausbremsen könnte.&lt;/p&gt;

&lt;p&gt;Lege in &lt;samp&gt;/var/log&lt;/samp&gt; ein Verzeichnis für die PostgreSQL-Logfiles an.&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo mkdir /var/log/postgres&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;In der früheren Anleitung habe ich PostgreSQL die Logfiles direkt schreiben lassen. Leider hat PostgreSQL die unangenehme Eigenheit, an den Namen eines jeden Logfiles eine Zufallszahl anzuhängen, was es etwas mühsam machte, das aktuelle Logfile zu finden. Deshalb werde ich diesmal über den Syslog loggen lassen. Füge dazu in der &lt;samp&gt;/etc/syslog.conf&lt;/samp&gt; folgende Zeile hinzu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;local3.*                                /var/log/postgres/postgres.log&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dieses Logfile soll auch jeden Tag um Mitternacht gegen ein neues ausgetauscht werden, damit es nicht zu sehr anwächst. Dies erledigt folgende Zeile in der &lt;samp&gt;/etc/newsyslog.conf&lt;/samp&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/var/log/postgres/postgres.log          644  5     *    @T00  J&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lege nun ein leeres Logfile an und starte den Syslog-Daemon mit diesen Befehlen:&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo touch /var/log/postgres/postgres.log
sudo kill -HUP $(cat /var/run/syslog.pid)&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;Jetzt muß noch PostgreSQL wissen, daß es auch den Syslog benutzen soll. Dies geschieht mit folgenden Zeilen in der &lt;samp&gt;/Users/Shared/PostgreSQL/data/postgresql.conf&lt;/samp&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;log_destination = 'syslog'
syslog_facility = 'LOCAL3'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wo wir noch in der Konfigurationsdatei von PostgreSQL drin sind, sollten wir auch noch festlegen, &lt;em&gt;was&lt;/em&gt; PostgreSQL loggen soll. Ich empfehle für den Anfang folgendes: (s. &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/runtime-config-logging.html&quot;&gt;PostgreSQL Doku: Error Reporting and Logging&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;log_line_prefix = '%u@%h:/%d '
log_statement = 'all'&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Damit ist PostgreSQL nun endlich bereit zum Start. Es wäre jedoch auf die Dauer etwas mühselig, PostgreSQL immer von Hand zu starten. Ich habe deshalb ein Launchd-Skript erstellt, was PostgreSQL automatisch beim Booten startet. Das &lt;a href=&quot;http://acts-as-blog.net/assets/2007/11/4/org.postgresql.postmaster.plist.gz&quot;&gt;Skript&lt;/a&gt; sieht folgendermaßen aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple Computer//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;
&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;org.postgresql.postmaster&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;UserName&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;_postgres&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;OnDemand&amp;lt;/key&amp;gt;
    &amp;lt;false/&amp;gt;
    &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
    &amp;lt;array&amp;gt;
        &amp;lt;string&amp;gt;/Library/PostgreSQL/bin/postmaster&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;-D&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;/Users/Shared/PostgreSQL/data&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;-c&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;log_connections=YES&amp;lt;/string&amp;gt;
    &amp;lt;/array&amp;gt;
    &amp;lt;key&amp;gt;ServiceDescription&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;PostgreSQL Server&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Speichere dieses Skript unter dem Namen &lt;samp&gt;org.postgresql.postmaster.plist&lt;/samp&gt; im Verzeichnis &lt;samp&gt;/Library/LaunchDaemons&lt;/samp&gt; und lade es in den Launchd mit &lt;code&gt;sudo launchctl load /Library/LaunchDaemons/org.postgresql.postmaster.plist&lt;/code&gt;. Wenn alles gutgegangen ist, solle PostgreSQL nun laufen. Bei mir sieht dies so aus:&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;Venus:~ fastjack$ &lt;/samp&gt;&lt;kbd&gt;ps ax | grep postmaster&lt;/kbd&gt;
&lt;samp&gt; 5315   ??  Ss     0:00.31 /Library/PostgreSQL/bin/postmaster -D /Users/Shared/PostgreSQL/data -c log_connections=YES&lt;/samp&gt;&lt;/pre&gt;

&lt;p&gt;Und die Datenbank akzeptiert auch Verbindungen zu ihr:&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;Venus:~ fastjack$ &lt;/samp&gt;&lt;kbd&gt;psql -U postgres template1&lt;/kbd&gt;
&lt;samp&gt;Password for user postgres: 
Welcome to psql 8.3beta2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

template1=# &lt;/samp&gt;&lt;/pre&gt;

&lt;p&gt;Da dies ein Blog über Ruby on Rails ist, wäre diese Anleitung nicht vollständig, ohne zu erwähnen, wie das passende Postgres-Gem installiert wird. Da sich PostgreSQL an einer für andere Unix-Systeme ungewöhnliches Stelle befindet, fällt die normale Installation erstmal auf die Nase, weil es PostgreSQL nicht findet. Du mußt also dem Gem mitteilen, wo es die PostgreSQL-Libraries und -Includes findet. Der vollständige Befehl sieht so aus:&lt;/p&gt;

&lt;pre&gt;&lt;kbd&gt;sudo gem install postgres -- --with-pgsql-lib-dir=/Library/PostgreSQL/lib \
--with-pgsql-include-dir=/Library/PostgreSQL/include&lt;/kbd&gt;&lt;/pre&gt;

&lt;p&gt;Das war&#8217;s. Es ist geschafft. PostgreSQL läuft und mit dem Postgres-Gem kannst du auf die Datenbank aus deinen Rails-Anwendungen zugreifen.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-10-19:18</id>
    <published>2007-10-19T20:42:00Z</published>
    <updated>2007-10-19T21:03:16Z</updated>
    <category term=":rails"/>
    <category term="form_for"/>
    <category term="forms"/>
    <category term="rails"/>
    <category term="rest"/>
    <link href="http://acts-as-blog.net/2007/10/19/simply_helpful-in-rails-edge" rel="alternate" type="text/html"/>
    <title>simply_helpful in Rails Edge</title>
<content type="html">
            &lt;p&gt;Und noch eine Arbeitserleichterung in Rails Edge (und damit auch im kommenden Rails 2.0). &lt;a href=&quot;http://dev.rubyonrails.org/svn/rails/plugins/legacy/simply_helpful/&quot;&gt;Simply Helpful&lt;/a&gt; war bislang als Plugin für Rails 1.2.x verfügbar. In Verbindung mit REST sind Formulare jetzt noch einfacher zu schreiben. In Rails 1.2.x muß man noch folgendes schreiben, um ein Edit-Formular zu bekommen:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;form_for :foo, @foo, :url =&amp;gt; foo_path(@foo), :html =&amp;gt; {:method =&amp;gt; :put} do |f|
  ...
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das geht nun deutlich kürzer:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;form_for @foo do |f|
  ...
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jepp, das ist alles. Simply Helpful erkennt automatisch, ob es sich bei &lt;code&gt;@foo&lt;/code&gt; um ein neues &lt;code&gt;ActiveRecord&lt;/code&gt;-Objekt handelt und baut automagisch einen Link zur &lt;code&gt;create&lt;/code&gt;- bzw. &lt;code&gt;update&lt;/code&gt;-Action.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-10-18:17</id>
    <published>2007-10-18T07:28:00Z</published>
    <updated>2007-10-18T07:30:24Z</updated>
    <category term=":rails"/>
    <category term="edge"/>
    <category term="partial"/>
    <category term="rails"/>
    <category term="render"/>
    <link href="http://acts-as-blog.net/2007/10/18/partials-jetzt-noch-einfacher" rel="alternate" type="text/html"/>
    <title>Partials jetzt noch einfacher</title>
<content type="html">
            &lt;p&gt;Und wo ich gerade bei Änderungen in Rails Edge bin. Eine weitere fingerschonene Änderung hat es in Rails geschafft. Mußte man bislang noch folgendes schreiben:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;render :partial =&amp;gt; &amp;quot;projects&amp;quot;, :collection =&amp;gt; @projects&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;genügt demnächst schon:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;render :partial =&amp;gt; @projects&lt;/code&gt;&lt;/pre&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-10-18:16</id>
    <published>2007-10-18T07:07:00Z</published>
    <updated>2007-10-18T07:35:46Z</updated>
    <category term=":rails"/>
    <category term="edge"/>
    <category term="helper"/>
    <category term="label"/>
    <category term="rails"/>
    <link href="http://acts-as-blog.net/2007/10/18/formhelper-label-in-rails-edge" rel="alternate" type="text/html"/>
    <title>FormHelper#label in Rails Edge</title>
<content type="html">
            &lt;p&gt;Seit &lt;a href=&quot;http://dev.rubyonrails.org/changeset/7541&quot;&gt;Changeset 7541&lt;/a&gt; hat Rails Edge (und damit höchstwahrscheinlich auch das kommende Rails 2.0) einen neuen Helper, um Labels für Formularfelder zu erzeugen. Hier ist ein kleines Beispiel, um zu sehen, wie der Helper benutzt werden kann.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;% form_for(:foo, @foo, :url =&amp;gt; foo_path(@foo)) do |f| -%&amp;gt;
  &amp;lt;%= f.label :bar, 'Bar' %&amp;gt;
  &amp;lt;%= f.text_field :bar %&amp;gt;
&amp;lt;% end -%&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Läßt man den zweiten Parameter hinter &lt;code&gt;label&lt;/code&gt; weg, so wird die Beschriftung aus dem Attributnamen mit &lt;code&gt;humanize&lt;/code&gt; abgeleitet.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-10-16:15</id>
    <published>2007-10-16T10:12:00Z</published>
    <updated>2007-10-16T18:53:51Z</updated>
    <category term=":rails"/>
    <category term="piston"/>
    <category term="plugin"/>
    <category term="rails"/>
    <link href="http://acts-as-blog.net/2007/10/16/rails-plugins-mit-piston" rel="alternate" type="text/html"/>
    <title>Rails-Plugins mit Piston</title>
<content type="html">
            &lt;p&gt;Ein Rails-Projekt ohne Plugins ist nahezu undenkbar. Plugins wie &lt;a href=&quot;http://svn.techno-weenie.net/projects/plugins/attachment_fu/&quot;&gt;attachment_fu&lt;/a&gt;, &lt;a href=&quot;http://svn.techno-weenie.net/projects/plugins/restful_authentication/&quot;&gt;restful_authentication&lt;/a&gt; und &lt;a&gt;will_paginate&lt;/a&gt; sind fast immer Pflicht. Mit &lt;code&gt;script/plugin&lt;/code&gt;, was bei jedem Rails-Projekt beiliegt, können diese Plugins installiert werden.&lt;/p&gt;

&lt;p&gt;Das &lt;code&gt;script/plugin&lt;/code&gt;-Skript funktioniert recht gut, hat jedoch ein paar Schönheitsfehler. Standardmäßig kopiert es einfach alle Dateien in ein Verzeichnis in &lt;code&gt;vendor/plugins/mein_plugin&lt;/code&gt;. Ein update des Plugins ist so jedoch unmöglich. Es kann nur erneut installiert werden. Dabei werden etwaige eigene Änderungen am Plugin gnadenlos überschrieben.&lt;/p&gt;

&lt;p&gt;Um diesem Problem entgegenzuwirken, kann &lt;code&gt;script/plugin&lt;/code&gt; mit der Option &lt;code&gt;-x&lt;/code&gt; aufgerufen werden. Das Plugin wird dann mit Subversion als &amp;lt;q&gt;External&amp;lt;/q&gt; ausgecheckt. Dies löst das Problem mit den Updates. Sollte jedoch das externe Repository nicht erreichbar sein, so wird Subversion Fehlermeldungen beim &lt;em&gt;update&lt;/em&gt; und &lt;em&gt;commit&lt;/em&gt; ausspucken. Grafische Frontends für Subversion kommen mit diesen Fehlermeldungen selten klar. Auch wer von der Kommandozeile arbeitet, wird auf die Dauer von diesen Fehlermeldungen genervt sein.&lt;/p&gt;

&lt;p&gt;An dieser Stelle kommt &lt;a href=&quot;http://piston.rubyforge.org/&quot;&gt;Piston&lt;/a&gt; ins Spiel. Es checkt die Plugins aus ohne externals, vermerkt jedoch für sich, woher das Plugin stammt. Damit ist ein Update jederzeit möglich. Und da sich Subversion nicht um externals kümmern muß, ist es auch kein Problem, wenn das externe Repository nicht erreichbar ist.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://piston.rubyforge.org/&quot;&gt;Piston&lt;/a&gt; wird wie jedes andere Gem einfach mit &lt;code&gt;gem install piston -y&lt;/code&gt; installiert. Damit ist es nun einsatzbereit. Benötige ich nun &lt;a&gt;will_paginate&lt;/a&gt; in meinem Projekt, so installiere ich es einfach mit folgendem Befehl:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;piston import svn://errtheblog.com/svn/plugins/will_paginate \
   vendor/plugins/will_paginate&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Um dieses Plugin auf den neuesten Stand zu bringen benutze ich dann diesen Befehl:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;piston update vendor/plugins/will_paginate&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Weitere Optionen finden sich auf der &lt;a href=&quot;http://piston.rubyforge.org/&quot;&gt;Piston-Website&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-09-28:14</id>
    <published>2007-09-28T06:37:00Z</published>
    <updated>2007-09-28T06:38:34Z</updated>
    <category term=":rails"/>
    <category term="anleitung"/>
    <category term="capistrano"/>
    <category term="deployment"/>
    <category term="rails"/>
    <link href="http://acts-as-blog.net/2007/9/28/deployment-mit-capistrano" rel="alternate" type="text/html"/>
    <title>Deployment mit Capistrano</title>
<content type="html">
            &lt;p&gt;Ein Rails-Projekt mit Capistrano zu deployen ist eigentlich gar nicht so schwer. Es kann jedoch leicht passieren, daß man einen Schritt vergißt und dann erstmal dumm aus der Wäsche schaut. Deshalb habe ich mal kurze Anleitung hier geschrieben, wie der grundsätzliche Ablauf aussieht. Ich setze Capistrano 2.0 ein. Wer noch die Vorgängerversion (1.4.x) einsetzt sollte sein Gem updaten, um dieser Anleitung zu folgen.&lt;/p&gt;

&lt;h3&gt;Projekt capistranisieren&lt;/h3&gt;

&lt;p&gt;Um ein Rails-Projekt mit Capistrano zu deployen, brauchst du zu allererst das Capistrano-Gem. Dies kannst du mit &amp;lt;q&gt;&lt;code&gt;gem install capistrano -y&lt;/code&gt;&amp;lt;/q&gt; installieren. Auf dem Zielserver (auf den das Projekt deployed werden soll) benötigst du außerdem noch Subversion. Ich muß hoffentlich nicht extra erwähnen, daß ein Zugriff per ssh auf den Zielserver Pflicht ist? Damit sollte alles installiert sein, was du benötigte. Capistranisiere dein Projekt mit &lt;code&gt;capify&lt;/code&gt;. In meinem Beispiel sieht dies so aus:&lt;/p&gt;

&lt;pre&gt;&lt;samp&gt;[~]&lt;/samp&gt; &lt;kbd&gt;capify /Users/fastjack/Sites/DrawBridge&lt;/kbd&gt;
&lt;samp&gt;[add] writing `./Capfile&#8217;
[add] writing `./config/deploy.rb&#8217;
[done] capified!&lt;/samp&gt;&lt;/pre&gt;

&lt;h3&gt;Auf die Plätze&lt;/h3&gt;

&lt;p&gt;In der &lt;code&gt;config/deploy.rb&lt;/code&gt; mußt du Capistrano mitteilen, wohin es dein Projekt beim Deployment befördern soll. Die Konfiguration sieht bei mir in etwa so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;set :application, &amp;quot;DrawBridge&amp;quot;
set :repository,  &amp;quot;http://svn.meinserver.irgendwo/DrawBridge/trunk&amp;quot;

role :app, &amp;quot;192.168.1.182&amp;quot;
role :web, &amp;quot;192.168.1.182&amp;quot;
role :db,  &amp;quot;192.168.1.182&amp;quot;, :primary =&amp;gt; true

set :deploy_to, &amp;quot;/usr/local/www/frigg/#{application}&amp;quot;
set :use_sudo, false

namespace :deploy do
  desc &amp;quot;upload database configuration&amp;quot;
  task :add_database_configuration, :roles =&amp;gt; :web do
    run &amp;quot;mkdir -p #{shared_path}/config&amp;quot;
    config = File.read(File.join(File.dirname(__FILE__), &amp;quot;database.yml&amp;quot;))
    put config, &amp;quot;#{shared_path}/config/database.yml&amp;quot;
    run &amp;quot;ln -s #{shared_path}/config/database.yml \
          #{latest_release}/config/database.yml&amp;quot;
  end

  after &amp;quot;deploy:finalize_update&amp;quot;, &amp;quot;deploy:add_database_configuration&amp;quot;
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mit dieser Konfiguration wird Capistrano mein Projekt auf den Server mit der IP-Adresse 192.168.1.182 unter &lt;code&gt;/usr/local/www/frigg/DrawBridge&lt;/code&gt; befördern. Capistrano wird hierzu einen Checkout mit Subversion durchführen. Der Subversion-Server sollte also vom Zielserver erreichbar sein. Zu guter Letzt wird noch die Datenbankkonfiguration von meinem Rechner auf den Zielserver kopiert (weil ich die Datenbankkonfiguration nicht in das Repository einchecke). Damit sollte auch klar sein, daß die &lt;code&gt;config/database.yml&lt;/code&gt; einen Abschnitt für die &lt;code&gt;production&lt;/code&gt;-Umgebung besitzen muß, der auf dem Zielserver funktioniert.&lt;/p&gt;

&lt;p&gt;Damit Capistrano nach dem Deployment auch den Mongrel starten kann, brauchst du noch ein &lt;code&gt;spin&lt;/code&gt;-Skript im &lt;code&gt;scripts&lt;/code&gt;-Verzeichnis. Dieses sollte ausführbar sein und auch als ausführbar in Subversion (&lt;code&gt;svn propset svn:executable on script/spin&lt;/code&gt;) markiert sein. Mein &lt;code&gt;script/spin&lt;/code&gt; sieht so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/sh
script/process/spawner -a 127.0.0.1 -p 15000 -i 3&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Damit werden 3 Mongrel-Server auf den Ports 15000-15002 gestartet, die nur auf Anfragen vom Localhost reagieren. Die Mongrels werden bei mir hinter einem Apache, der als Proxy fungiert, laufen, deshalb sind sie auch nur an den Localhost gebunden.&lt;/p&gt;

&lt;h3&gt;Fertig&lt;/h3&gt;

&lt;p&gt;Damit ist hoffentlich alles bereit, um das Projekt zu deployen. Mit &lt;code&gt;cap deploy:check&lt;/code&gt; kannst du noch schnell prüfen, ob es irgendwelche schwerwiegenden Probleme gibt, die das Deployment behindern könnten. Warnmeldungen über ein Fehlendes &lt;code&gt;releases&lt;/code&gt;-Verzeichnis kannst du dabei ignorieren, dies wird im nächsten Schritt angelegt. Nun ist es an der Zeit, das Deployment vorzubereiten. Mit &lt;code&gt;cap deploy:setup&lt;/code&gt; läßt du Capistrano die noch fehlenden &lt;code&gt;releases&lt;/code&gt;- sowie &lt;code&gt;shared&lt;/code&gt;-Verzeichnisse anlegen. Überprüfe noch schnell, ob du  auch wirklich alle lokalen Änderungen wieder ins Repository eingecheckt habst, sonst werden sie nicht auf den Zielserver gelangen.&lt;/p&gt;

&lt;h3&gt;Los!&lt;/h3&gt;

&lt;p&gt;Jetzt kann es losgehen. Mit &lt;code&gt;cap deploy:cold&lt;/code&gt; startest du nun den Deploymentprozess. Dies dauert ein paar Minuten und endet hoffentlich damit, daß am Ende folgende Zeilen stehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[192.168.1.182] executing command
** [out :: 192.168.1.182] appending output to nohup.out
   command finished&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nun laufen 3 Instanzen des Mongrels und warten auf Anfragen vom Apache.&lt;/p&gt;

&lt;p&gt;Herzlichen Glückwunsch. Dein Projekt wurde erfolgreich deployed. Lehn dich zurück und genieße ein erfrischendes (alkoholisches) Getränk.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-09-24:13</id>
    <published>2007-09-24T08:21:00Z</published>
    <updated>2007-10-16T18:37:53Z</updated>
    <category term=":rails"/>
    <category term="rails"/>
    <category term="resource"/>
    <category term="rest"/>
    <category term="routing"/>
    <link href="http://acts-as-blog.net/2007/9/24/resourcen-im-singular" rel="alternate" type="text/html"/>
    <title>Resourcen im Singular</title>
<content type="html">
            &lt;p&gt;Wer sich in Rails über die etwas unverständliche Fehlermeldung wie diese wundert  &amp;lt;q&gt;&lt;code&gt;session_url failed to generate from {:controller=&gt;&quot;session&quot;, :action=&gt;&quot;show&quot;} - you may have ambiguous routes, or you may need to supply additional parameters for this route.  content_url has the following required parameters: [&quot;session&quot;, :id] - are they all satisfied?&lt;/code&gt;&amp;lt;/q&gt;, der hat mit Sicherheit in seiner &lt;code&gt;routes.rb&lt;/code&gt; folgendes stehen:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;map.resources :session&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das Problem dabei ist, daß die Resource &amp;lt;q&gt;session&amp;lt;/q&gt; im Singular ist, während die &lt;code&gt;map.resources&lt;/code&gt;-Anweisung eine Resource im Plural erwartet. Schreibt man stattdessen:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;map.resource :session&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;so klappt es auch wieder mit dem Routing. (Ja, es ist nur das Plural-s verschwunden).&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-09-18:12</id>
    <published>2007-09-18T18:44:00Z</published>
    <updated>2007-10-16T18:40:15Z</updated>
    <category term=":mac"/>
    <category term=":rails"/>
    <category term="autotest"/>
    <category term="growl"/>
    <category term="mac"/>
    <category term="rspec"/>
    <category term="zentest"/>
    <link href="http://acts-as-blog.net/2007/9/18/autotest-growl-und-rspec" rel="alternate" type="text/html"/>
    <title>Autotest, Growl und RSpec</title>
<content type="html">
            &lt;p&gt;Ich hatte einen ähnlichen Artikel bereits in meinem &lt;a href=&quot;http://fastjack.at&quot;&gt;anderen Blog&lt;/a&gt; darüber geschrieben. Doch hier ist es nochmal, damit alles an einem Ort zu finden ist, und weil ich in der Zwischenzeit auch einiges daran geändert habe.&lt;/p&gt;

&lt;p&gt;Angenfangen hat es, als ich ein paar Wochen über &lt;a href=&quot;http://railstips.org/2007/7/23/autotest-growl-pass-fail-notifications&quot;&gt;diesen Artikel&lt;/a&gt; von &lt;a href=&quot;http://addictedtonew.com/&quot;&gt;John Nunemaker&lt;/a&gt; in meinem Feed-Reader gestolpert bin. Das war gleich doppelt interessant. Ich fand die Idee mit &lt;a href=&quot;http://growl.info&quot;&gt;Growl&lt;/a&gt; supergeil. Und von autotest hatte ich bis dahin auch noch nie gehört. Autotest ist Teil des &lt;a href=&quot;http://www.zenspider.com/ZSS/Products/ZenTest/&quot;&gt;ZenTest&lt;/a&gt;-Gems und kann ganz einfach mit &lt;code&gt;gem install ZenTest -y&lt;/code&gt; installiert werden. (Die meisten werden noch ein &lt;code&gt;sudo&lt;/code&gt; davor schreiben müssen)&lt;/p&gt;

&lt;p&gt;Nachdem ich meine erste &lt;code&gt;~/.autotest&lt;/code&gt;-Datei erstellt habe, ging das eigentliche Experimentieren erst richtig los. Ich war nicht der einzige, der über diesen Artikel gestolpert war, denn kurze Zeit später präsentierte &lt;a href=&quot;http://www.thelucid.com/&quot;&gt;Jamie Hill&lt;/a&gt; etwas &lt;a href=&quot;http://www.thelucid.com/articles/2007/07/30/autotest-growl-fail-pass-smilies&quot;&gt;ansehnlichere Icons&lt;/a&gt;. Das sah schon richtig gut aus. Zu guter Letzt machte mein Wechsel auf &lt;a href=&quot;http://rspec.rubyforge.org/&quot;&gt;RSpec&lt;/a&gt; einige Änderungen notwendig. Meine derzeitige &lt;code&gt;~/.autotest&lt;/code&gt;-Datei sieht also so aus. (&lt;a href=&quot;http://acts-as-blog.net/assets/2007/9/20/autotest&quot;&gt;download&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;require 'autotest/timestamp'

module Autotest::Growl

  IMAGE_ROOT = &amp;quot;~/Library/Autotest/Images&amp;quot; 

  def self.growl title, msg, img, pri=0, sticky=&amp;quot;&amp;quot; 
    system &amp;quot;growlnotify -n autotest --image #{img} -p #{pri} -m '#{msg}' '#{title}' #{sticky}&amp;quot; 
  end

  def self.find_test_summary(test_results)
    test_summary = test_results.find {|result| result.include? &amp;quot;example&amp;quot;}.chomp
  end

  def self.display_test_summary(summary)
    examples, failures, pending = summary.split(', ')
    if failures.to_i &amp;gt; 0
      growl &amp;quot;Tests fehlgeschlagen&amp;quot;, summary, &amp;quot;#{IMAGE_ROOT}/fail.png&amp;quot;, 2
    elsif pending.to_i &amp;gt; 0
      growl &amp;quot;Tests stehen aus&amp;quot;, summary, &amp;quot;#{IMAGE_ROOT}/pending.png&amp;quot;, 1
    else
      growl &amp;quot;Tests bestanden&amp;quot;, summary, &amp;quot;#{IMAGE_ROOT}/pass.png&amp;quot;, 0
    end
  end

  Autotest.add_hook :ran_command do |at|
    unless at.results.empty?
      summary = find_test_summary(at.results)
      display_test_summary(summary)
    else # Irgendwas ging ganz furchtbar schief
      growl &amp;quot;Panik!&amp;quot;, &amp;quot;Die Tests lieferten keine Ergebnisse!&amp;quot;, &amp;quot;#{IMAGE_ROOT}/panic.png&amp;quot;, 3
    end
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ich habe &lt;a href=&quot;http://acts-as-blog.net/assets/2007/9/18/autotest_images.zip&quot;&gt;die Smileys&lt;/a&gt; um einen vierten Panic-Smiley ergänzt, falls etwas ganz fürchterlich schief gehen sollte. Da ich autotest immer in &lt;a href=&quot;http://www.netbeans.org&quot;&gt;Netbeans&lt;/a&gt; starte und die Netbeans-Konsole keine Farbcodes beherrscht, entferne ich in meinen Projekten in &lt;code&gt;$PROJEKT/spec/spec.opts&lt;/code&gt; immer die Zeile mit &lt;code&gt;--colour&lt;/code&gt;. Folglich habe ich es auch nicht für nötig befunden, diese Farbcodes in meiner &lt;code&gt;~/.autotest&lt;/code&gt;-Datei herauszufiltern. Wem die Growl-Nachrichten nicht bunt genug sind, und auch farbige Meldungen in der Konsole haben möchte, muß sich einen entsprechenden Filter selbst in seine &lt;code&gt;~/.autotest&lt;/code&gt;-Datei einbauen.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-09-11:11</id>
    <published>2007-09-11T08:55:00Z</published>
    <updated>2007-10-16T18:41:01Z</updated>
    <category term=":rails"/>
    <category term="attribut"/>
    <category term="validate"/>
    <category term="validations"/>
    <link href="http://acts-as-blog.net/2007/9/11/validations-und-virtuelle-attribute" rel="alternate" type="text/html"/>
    <title>Validations und virtuelle Attribute</title>
<content type="html">
            &lt;p&gt;Manchmal möchte ich (virtuelle) Attribute im Model haben, die sich nicht 1:1 auf Spalten in einer Tabelle abbilden lassen. Ein gutes Beispiel dafür ist mein &lt;code&gt;Machine&lt;/code&gt;-Model. In dem Model möchte ich unter anderem das Baujahr der Maschine festhalten. Dies könnte ich zwar auch einfach als ein Integer in der Datenbank speichern, doch für diverse Datumsberechnungen habe ich mich dazu entschlossen, das Baujahr als Datum (jeweils als den 1. Januar des Jahres) zu speichern. Das Baujahr habe ich zu einem virtuellen Attribut es Models gemacht. Das ganze sieht dann so aus.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Machine &amp;lt; ActiveRecord::Base
  def build_year
    read_attribute(:built_on).year if read_attribute(:built_on)
  end

  def build_year=(year)
    write_attribute(:built_on, Date.new(year.to_i, 1, 1)) unless year.empty?
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Damit läßt sich nun &lt;code&gt;build_year&lt;/code&gt; wie jedes andere Attribut des Models in Views verwenden. Wie wäre es noch mit Validations? Hierzu habe ich folgende &lt;code&gt;validate&lt;/code&gt;-Methode gebaut.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def validate
  errors.add(:build_year, &amp;quot;can't be blank&amp;quot;) unless build_year.is_a?(Fixnum) 
  errors.add(:build_year, &amp;quot;must be after 1944&amp;quot;) if build_year &amp;amp;&amp;amp; build_year&amp;lt;1945
  errors.add(:build_year, &amp;quot;can't be in the future&amp;quot;) if build_year &amp;amp;&amp;amp; build_year&amp;gt;Date.today.year
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Damit wird mein virtuelles Attribut nun auch entsprechend im View hervorgehoben, wenn die Validation fehlschlägt.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-09-01:10</id>
    <published>2007-09-01T21:19:00Z</published>
    <updated>2007-10-16T18:42:18Z</updated>
    <category term=":rails"/>
    <category term="content_for"/>
    <category term="rails"/>
    <category term="ruby"/>
    <category term="rubyonrails"/>
    <category term="yield"/>
    <link href="http://acts-as-blog.net/2007/9/1/content_for-und-defaultwerte" rel="alternate" type="text/html"/>
    <title>content_for und Defaultwerte</title>
<content type="html">
            &lt;p&gt;Mit &lt;code&gt;content_for&lt;/code&gt; lassen sich mehrere Bereiche im Layout mit Inhalten füllen. Typischerweise sieht das im View so aus.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;% content_for :page_title do -%&amp;gt;
  Niemand erwartet die Spanische Inquisition
&amp;lt;% end -%&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Im Layout kann ich nun das ganze mit &lt;code&gt;yield :page_title&lt;/code&gt; wieder ausgeben. Was ist aber wenn ich gar keinen Inhalt für den &lt;code&gt;:page_title&lt;/code&gt; angebe? Dann kommt die Seite mit einem leeren Titel daher. Daher ist es sinnvoll, hier einen Defaultwert anzugeben. Das könnte im Layout etwa so aussehen.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;%= (yield :page_title) || &amp;quot;Du hast den Titel vergessen, du Dummy!&amp;quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alternativ könnte ich auch einen Partial hier einbinden, aber das hängt ganz von den Anforderungen ab.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://acts-as-blog.net/">
    <author>
      <name>Martin Maciaszek</name>
    </author>
    <id>tag:acts-as-blog.net,2007-09-01:8</id>
    <published>2007-09-01T08:23:00Z</published>
    <updated>2007-09-01T08:25:45Z</updated>
    <category term=":rails"/>
    <category term="booleans"/>
    <category term="rails"/>
    <category term="ruby"/>
    <link href="http://acts-as-blog.net/2007/9/1/doppelt-h-auml-lt-besser" rel="alternate" type="text/html"/>
    <title>Doppelt h&#228;lt besser</title>
<content type="html">
            &lt;p&gt;Ich benutze oft einen recht n&amp;uuml;tzlichen Rubyismus, den ich &amp;lt;q&gt;bang-bang&amp;lt;/q&gt; nenne. In meinem fiktiven &lt;code&gt;User&lt;/code&gt;-Modell habe ich folgende Methode.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;def married?
  !! spouse
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Die Methode &lt;code&gt;spouse&lt;/code&gt; w&amp;uuml;rde hier einfach nur eine Instanz des &lt;code&gt;User&lt;/code&gt;-Models mit dem Ehepartner zur&amp;uuml;ckgeben. Aber was sollen die beiden Ausrufezeichen (in Unix-Kreisen als &amp;lt;q&gt;bang&amp;lt;/q&gt; bezeichnet) da? Ein Ausrufezeichen in Ruby ist normalerweise eine logische Negation. Zwei Ausrufezeichen sind also eine doppelte Negation.&lt;/p&gt;

&lt;p&gt;Wer in der Schule aufgepasst hat, wird nun einwerfen, da&amp;szlig; eine doppelte Negation sich selbst wieder aufhebt. Das ist auch korrekt, doch in Ruby gelten etwas andere Regeln. Alles was nicht &lt;code&gt;false&lt;/code&gt; oder &lt;code&gt;nil&lt;/code&gt; ist, gilt als wahr. Liefert also die Methode &lt;code&gt;spouse&lt;/code&gt; einen Ehepartner zur&amp;uuml;ck, so gibt die Methode &lt;code&gt;married?&lt;/code&gt; das Ergebnis &lt;code&gt;true&lt;/code&gt; zur&amp;uuml;ck.&lt;/p&gt;
          </content>  </entry>
</feed>
