Rails 3.2.8 auf Mountain Lion und Xcode 4.4.1

Ich hatte beim Kompilieren von nativen Gems den folgenden Fehler:

Building native extensions. This could take a while...
ERROR: Error installing json:
ERROR: Failed to build gem native extension.

/Users/xxx/.rvm/rubies/ruby-1.9.3-p0/bin/ruby extconf.rb
creating Makefile

make
compiling generator.c
make: /usr/bin/gcc-4.2: No such file or directory
make: *** [generator.o] Error 1

Abhilfe:

1. Sicherstellen, dass die Xcode Command Line Tools installiert sind (Xcode/Preferences/Downloads/Components).

2. Symbolischen Link auf den Compiler erstellen:

# sudo -s
# cd /usr/bin
# ln -s gcc-4.2 llvm-gcc-4.2
# ln -s g++ g++-4.2
# exit

Dann sollte der bundle install problemlos durchlaufen.

Spass mit Hex

Folgenden Code habe ich gestern in einer Library entdeckt:

Da hat sich ein Entwickler einen kleinen Spass erlaubt. Ich wusste gar nicht, dass das geht. Es erinnerte mich an die Novell NetWare Netzwerke, die wir in den 90ern eingerichtet haben. Jedes Netzwerk brauchte eine ID in Hex. Bei den meisten Kunden hiess dann das Netzwerk irgendwie so:

C0FFEEBABE
DEADFACE

Die falsche Roulette-Strategie

Am Wochenende bin ich auf eine Online-Anzeige gestossen, welche eine neue, revolutionäre Methode für das Absahnen bei Online-Casinos anpries.

Nach genauerem Lesen hat sich heraus gestellt, dass diese Methode altbekannt ist. Genauso bekannt ist allerdings, dass sie nicht funktioniert: Man solle immer auf die selbe Farbe setzen und bei Verlust den Einsatz verdoppeln, bis wieder ein Gewinn heraus springt. Eine Analyse:

“Die falsche Roulette-Strategie” weiterlesen

Bessere Zufallszahlen mit Ruby

Die meisten Pseudo-Zufallszahl-Generatoren arbeiten mit einem Seed, der auf der Systemzeit basiert. Oft reicht dies auch aus, wer aber sehr viele Zufallszahlen innert Millisekunden generieren muss (z.B. über Unit Tests), dem wird die Standard-Methode nicht ausreichen. “Bessere Zufallszahlen mit Ruby” weiterlesen

E-Mail-Adresse mit CSS schützen

Ich wurde öfters angesprochen, wie ich E-Mail Adressen auf Websites schütze. Ich finde die folgende Methode sehr effizient:

Ich verwende ich hierfür eine eigene CSS Klasse, die den Text rückwärts ausgibt. Im Source Code wird die E-Mail Adresse von rechts nach links eingegeben, hier der HTML-Code:

<span class="email">hc.esnesten@ofni</span>

Im Stylesheet ist die Klasse wie folgt definiert:

.email {
  unicode-bidi:bidi-override;
  direction:rtl;
}

Crawler erkennen hier kein Pattern, die E-Mail Adresse wird für den User aber korrekt dargestellt.

Ruby on Rails Cookies und Sicherheit

Die Standard-Cookie-Einstellungen von Rails sind aus der Security-Perspektive nicht ideal und sollten bei sensitiven Systemen etwas angepasst werden. Dies geschieht in der config/initializers/session_store.rb

MyApp::Application.config.session_store :active_record_store,
        :secure => Rails.env == 'production',
        :http_only => true,
        :expire_after => 60.minutes

Zeile 1: Session infos in der DB speichern (nicht im cookie). Hierbei nicht vergessen, die notwendige Tabelle zu erstellen:

 # rake db:sessions:create

Zeile 2: Secure flag setzen wenn die Produktion mit https läuft
Zeile 3: JavaScript Access auf Cookies verbieten
Zeile 4: Expiration Time setzen

Rails: Hardening Authlogic

Authlogic verwendet ein eigenes Cookie zur Identifizierung der User Session. Da wir diese Info aber sowieso schon in der Session haben, ist es unnötig. Ausserdem wollen wir, dass der Token neu generiert wird, ansonsten funktioniert nämlich der CSRF Schutz nicht mehr.

Folgende Änderung im UserSession Model schafft Abhilfe:

class UserSession < Authlogic::Session::Base

  # kein eigenes cookie anlegen
  skip_callback :after_save, :save_cookie

  # persistence token nach logout neu generieren
  before_destroy do
    record.reset_persistence_token
  end

end

Code: Fullscreen unter OS X Lion

Eins der herausragendsten Features von Lion ist natürlich der native Full Screen Support.

Wo man früher mit Subclassing von NSWindow und hässlichen Initialisierungsblöcken arbeiten musste, reichen nun zwei Zeilen, um seine Applikation in den Full Screen zu bekommen.

Hier ein Beispiel, in der Application Delegate:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // enable full screen mode
    [window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
    [window toggleFullScreen:nil];
}

setCollectionBehaviour aktiviert den Full Screen Modus und platziert auch gleich das zugehörige Icon in der Toolbar.
Um tatsächlich in den Full Screen zu kommen, müssen wir noch toggleFullScreen aufrufen.