How to deploy the local changes of a Git repository using FTP on windows command line

I’m working on a small project which makes it necessary to test everything online, so I can not use my local environment for testing. It’s a very annoying task to copy my changes to the online stage file by file. To make this easier I wrote a script which runs on the windows command line (cmd). The concept behind this script is creating a temporary FTP batch file which contains a put command for every file I have changed in my local Git repository. This file will be executed using the built-in FTP command line client of Windows.

 

:: Save the root path of the git repository to a variable
  1. for /f %%i in ('git rev-parse –show-toplevel') do set REPOPATH=%%i
  2.  
  3. :: Get all uncommitted changed files from git
  4. for /f %%i in ('git diff –name-only') do (
  5.  :: Add a ftp put command for the changed file to a temporary file
  6.  echo put %REPOPATH%/%%i %%i >> tmpfiles.ftp
  7. )
  8.  
  9. :: Merge login credentials and the temporary file into another temp file
  10. copy login.ftp+tmpfiles.ftp tmpcopy.ftp
  11.  
  12. :: Add a ftp quit command at the end of the temp file
  13. echo quit >> tmpcopy.ftp
  14.  
  15. :: Execute the ftp temp file
  16. ftp -n -s:tmpcopy.ftp *fill-in-your-ftp-host-here*
  17.  
  18. :: Delete all temp files
  19. del tmpfiles.ftp
  20. del tmpcopy.ftp
  21.  
  22. :: Done :-)
  23. pause

Please note: Before running this script you need to create a file called „login.ftp“ in the same folder which contains the following three lines:

user
  1. *your-ftp-user*
  2. *your-ftp-password*
Share

XAMPP/Apache Problem: AH00072: make_sock: could not bind to address

Nach zäher Suche möchte ich kurz die Lösung für ein Problem dokumentieren, das beim Betrieb einer XAMPP-Installation (Version 1.8.1) auf einem Windows 7 (64 Bit) System aufgetreten ist.

Obwohl der HTTP-Server eigentlich bereits reibungslos lief, meldete das XAMPP-Control Panel beim Start von Apache plötzlich folgendes:

23:04:53 [Apache] Problem festgestellt!
23:04:53 [Apache] Port 80 in Benutzung von "system"!
23:04:53 [Apache] Apache wird NICHT starten, wenn die konfigurierten Ports beleg
t sind!
23:04:53 [Apache] Die blockende Applikation muss deinstalliert/deaktiviert/rekon
figuriert werden
23:04:53 [Apache] oder konfiguriere Apache auf einen anderen Port zu lauschen

Ein weiterer Start-Versuch brachte dann plötzlich eine andere Fehlermeldung zu Tage:

23:05:35 [Apache] Fehler: Apache wurde unerwartet beendet.
23:05:35 [Apache] Ursache könnte ein geblockter Port, fehlende Abhängigkeiten,
23:05:35 [Apache] fehlende Berechtigungen, ein Absturz oder ein Abbruch einer an
deren Methode sein.
23:05:35 [Apache] Überprüfe die Datei "/xampp/apache/logs/error.log"
23:05:35 [Apache] und die Windows Ereignisanzeige für weitere Hinweise

Und ein Start-Versuch mittels „apache_start.bat“ lieferte dann Fehlermeldung Nummer Drei zum gleichen Problem:

Apache 2 is starting ...
(OS 10013)Der Zugriff auf einen Socket war aufgrund der Zugriffsrechte des Socke
ts unzulõssig. : AH00072: make_sock: could not bind to address [::]:80
(OS 10013)Der Zugriff auf einen Socket war aufgrund der Zugriffsrechte des Socke
ts unzulõssig. : AH00072: make_sock: could not bind to address 0.0.0.0:80
AH00451: no listening sockets available, shutting down
AH00015: Unable to open logs

Ok – drei verschiedene Fehlermeldungen, die aber alle auf die selbe Ursache hindeuten: Port 80 ist belegt.

netstat brachte leider keine Hinweise auf den Prozess, der eben jenen Port belegen könnte. Das XAMPP-eigene Script „portcheck.bat“ meldete sogar, dass Port 80 frei sei. Schlussendlich habe ich in den Tiefen dieses Threads die Lösung gefunden: Schuld ist der Dienst „Webbereitstellungs-Agent-Dienst“ von Microsoft. Sobald dieser Dienst in den Windows-Diensten deaktiviert wurde, startete Apache wieder tadellos.

Share

XSS-Protection in Rails 3

Für mein „altes“ Rails 2 Projekt habe ich mir – zum Schutz vor Cross-Site-Scripting (XSS) Attacken – ein kleines Modul geschrieben, das gefährliche HTML-Tags aus jedem Attribut eines Models mittels h() Methode entfernt. In der neuen Version kann ich darauf komplett verzichten.

In Rails 3 werden standardmäßig alle Ausgaben von unerwünschtem Code gesäubert. Ein einfaches aber sehr wirkungsvolles Feature.

Es kann Fälle geben, bei denen man bewusst auf diese Funktion verzichten will. Hierfür steht die raw() Methode zur Verfügung:

  1. < %= raw article.content %>

Die raw() Methode macht nichts anderes, als dass sie das Attribut html_safe des String-Objekts (bzw. ActiveSupport::SafeBuffer) setzt. Dieses wird beim Rendering des Views abgefragt und entscheidet letztendlich darüber, ob der auszugebende HTML-Code gesäubert wird oder nicht.

In meinen Helper-Methoden ziehe ich es vor auf die raw() Methode zu verzichten und html_safe selbst aufzurufen:

  1. def article_head(article)
  2.   "<h1>#{article.title}</h1>
  3.   <span class='date'>#{article.date}</span>".html_safe
  4. end
Share

How to install ruby-debug on Windows and Ruby 1.9

Heute ein Artikel in Englisch, damit auch die internationale Gemeinde etwas davon hat ;-)

The Rails Debugging Guide told me that I have to install ruby-debug19 instead of ruby-debug when I want to debug on the Ruby 1.9 platform. So I tried to install it on a system which has Ruby 1.9.2 and Windows 7 x64 installed and I ran into trouble:

c:\Railsapps\tuneo>gem install ruby-debug19 --platform=mswin32
Temporarily enhancing PATH to include DevKit...
Building native extensions. This could take a while...
ERROR: Error installing ruby-debug19:
ERROR: Failed to build gem native extension.

C:/Ruby/bin/ruby.exe extconf.rb
checking for vm_core.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=C:/Ruby/bin/ruby
--with-ruby-dir
--without-ruby-dir
--with-ruby-include
--without-ruby-include=${ruby-dir}/include
--with-ruby-lib
--without-ruby-lib=${ruby-dir}/lib
C:/Ruby/lib/ruby/1.9.1/mkmf.rb:368:in `try_do': The complier failed to generate
an executable file. (RuntimeError)
You have to install development tools first.
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:452:in `try_cpp'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:834:in `block in have_header'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:693:in `block in checking_for'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:280:in `block (2 levels) in postpone
'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:254:in `open'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:280:in `block in postpone'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:254:in `open'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:276:in `postpone'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:692:in `checking_for'
from C:/Ruby/lib/ruby/1.9.1/mkmf.rb:833:in `have_header'
from extconf.rb:15:in `block in

'
from C:/Ruby/lib/ruby/gems/1.9.1/gems/ruby_core_source-0.1.4/lib/ruby_co
re_source.rb:18:in `call'
from C:/Ruby/lib/ruby/gems/1.9.1/gems/ruby_core_source-0.1.4/lib/ruby_co
re_source.rb:18:in `create_makefile_with_core'
from extconf.rb:20:in `
'

Gem files will remain installed in C:/Ruby/lib/ruby/gems/1.9.1/gems/linecache19-
0.5.11 for inspection.
Results logged to C:/Ruby/lib/ruby/gems/1.9.1/gems/linecache19-0.5.11/ext/trace_
nums/gem_make.out

This is the way I solved it:
1. Start cmd, change to your devkit folder and execute devkitvars.bat
If you have not yet installed the devkit on your system check this Devkit on github.com

2. Execute the gem install command:
gem install ruby-debug19 --platform=mswin32Note: the platform depends on your ruby installtion. To find out which platform you are using, check your ruby version:
c:\Railsapps>ruby -v
ruby 1.9.2p0 (2010-08-18) [i386-mingw32]

After that the ruby debugger is running on the system. Don’t wonder if the execution of the install command takes a while.

Share

Suchmaschinenfreundliche Links mit Ruby on Rails generieren

Standardmäßig sehen in Ruby on Rails generierte Links in etwa so aus:

http://www.example.com/posts/10345

In Hinblick auf die Suchmaschinenfreundlichkeit einer Seite und auch für den Besucher selbst, wäre es aber schöner, wenn die URL z.B. so aussehen würde:

http://www.example.com/posts/10345-Rails-3-ist-fertig

Das Rails-Framework hat dafür einen einfachen wie unkomplizierten Trick auf Lager:

Jedes ActiveRecord Objekt besitzt in Rails eine Methode namens to_param, die standardmäßig den Primär-Schlüssel des Objekts, also die ID, zurück liefert. Um eine suchmaschinenfreundliche URL zu generieren, muss diese Methode überschrieben werden, sodass sie einen entsprechenden String zurück gibt, der den jeweiligen Datensatz eindeutig identifiziert. Für die obige URL müsste das so aussehen:

  1.   def to_param
  2.     "#{id}-#{title.gsub(/[^a-z0-9]+/i, '-')}"
  3.   end

Anschließend kann mit der Methode und dem link_to Helper wie üblich der gewünschte Link erstellt werden:

  1. < %= link_to(@post.title, blog_post(@post.to_param)) %>

Es macht Sinn, sich daran zu gewöhnen, bei der Generierung von Links immer die Methode to_param anstatt der id zu verwenden, auch wenn sie im jeweiligen Model gar nicht überschrieben wurde. Meine Erfahrung hat gezeigt, dass man sich das später manchmal durchaus anders überlegt ;-). Somit erspart man sich ein nachträgliches Anpassen der Views.

Share

RSS-Feed mit Ruby on Rails realisieren

Gerade wurde ich einmal mehr von der Einfachheit und Genialität von Ruby on Rails überrascht. Ich habe soeben meinen ersten RSS-Feed mit Hilfe von RoR erzeugt und das Ergebnis ist so einfach, dass sich eigentlich schon fast jeder Kommentar erübrigt.

Zunächst im Controller die Daten des Models, dass im RSS ausgegeben werden soll, abfragen.

def rss
  1.    @posts = Post.find(:all, :order => 'id DESC', :limit => 20)
  2.    render :layout => false
  3. end

Zu beachten ist, dass (wie oben geschehen) das Rendering des Standard-Layouts im Controller unterbunden werden muss. Anstelle von HTML soll schließlich XML ausgegeben werden. Dazu muss eine Datei namens rss.rxml (man beachte die Dateiendung) erstellt werden, in der ganz einfach mit Hilfe des XML-Objektes die Struktur des RSS-Feeds aufgebaut wird:

xml.instruct! :xml, :version=>“1.0″
  1.  
  2. xml.rss(:version=>"2.0") {
  3.  
  4.   xml.channel {
  5.  
  6.     xml.title("Mein Blog")
  7.     xml.link(root_url)
  8.     xml.description("Infos aus meinem Berufsalltag")
  9.     xml.language("de-de")
  10.  
  11.     @posts.each do |post|
  12.  
  13.       xml.item do
  14.  
  15.         xml.title(post)
  16.         xml.description(post.title)
  17.         xml.pubDate(post.created_at.rfc2822)
  18.         xml.link(post_path(post.to_param))
  19.         xml.guid(post_path(post.to_param))
  20.  
  21.       end
  22.  
  23.     end
  24.  
  25.   }
  26. }

xml.instruct! leitet die XML-Ausgabe ein. Fast alle anderen Methoden, die an das XML Objekt gesendet werden, werden einfach in das gleichnamige XML Markup-Tag „übersetzt“. Methoden mit Blöcken (wie im obigen Beispiel „xml.channel“), werden wie Markup-Tags mit darin eingeschlossenen Tags behandelt.

Die genaue Dokumentation zum XML Builder in Ruby on Rails findet sich hier.

Share

Named Routes in Models und anderen Klassen verwenden

Named Routes in Ruby on Rails sind eine feine Sache. Standardmäßig können sie im Controller und in Views verwendet werden, hier ist ihr Einsatzzweck vorgesehen. In seltenen Fällen kann es jedoch dazu kommen, dass man sie auch in einem Model oder einer anderen Klasse verwenden möchte. Das Erste was man feststellt ist, dass das nicht einfach geht.

Um die Named Routes in der Klasse verfügbar zu machen, muss das entsprechende Modul inkludiert werden:

  1. class App
  2.  
  3.   include ActionController::UrlWriter
  4.  
  5.   def initialize()
  6.     #…
  7.   end
  8. end

Wer lediglich relative Pfade ausgeben möchte, dem wird das genügen. Wer jedoch absolute Pfade mittels *_url Methoden nutzen möchte, der wird auf diese Fehlermeldung stoßen:

Missing host to link to! Please provide :host parameter or set default_url_options[:host]

Das Problem ist, dass der Host, für den die absoluten Pfade erstellt werden sollen, nicht bekannt ist. Dem kann abgeholfen werden, in dem man nach der include Anweisung die entsprechende Variable setzt:

  1. default_url_options[:host] = SITE_HOST

Wie man sieht, verwende ich die Konstante SITE_HOST, die ich in der config-Datei der entsprechenden Environment gepflegt ist. Der Einfachheit wegen, würde ich das auch so weiter empfehlen ;)

Share

Rails Console mit bestimmter Environment laden

Zum Debugging habe ich gerade nach der Möglichkeit gesucht, die Ruby on Rails Console, die standardmäßig in der Development Environment startet, innerhalb der Production Umgebung zu starten.

Die Lösung ist einfach – und war mir trotzdem nicht bekannt ;)

ruby script/console production

Es muss lediglich der Name der Umgebung ohne weitere Parameter angegeben werden.

Share

Gepunktete Linie bei Links in Firefox entfernen

Generell nutze ich zum Surfen Opera, doch wie es sich für einen anständigen Entwickler gehört, teste ich meine Webentwicklungen auch mit anderen Browser ;)

Dabei ist mir gerade aufgefallen, dass Firefox scheinbar standardmäßig bei einem geklickten Link eine gepunktete Linie um den Link zeichnet. Normalerweise fällt das nicht weiter auf, bei bestimmten Stellen im Design kann es aber hässliche Nebeneffekte verursachen.

Nach ein bisschen Suchen kam ich zu dieser Lösung:

  1. body a:focus {
  2.   outline-style: none;
  3. }
Share