Mittwoch, 17. August 2011

Überflüssige E-Mail-Verschlüsselung

Dass E-Mail-Adressen auf Webseiten kodiert werden müssen, um sich gegen E-Mail-Harvester zu wehren, hat sich ja in den letzten Jahren herumgesprochen. Allerdings sollte man dann auch 2 Meter weiterdenken und überlegen, wo man die E-Mail-Adresse denn noch hingeschrieben hat.

Beispiel: http://www.willy-schoer.de/kontakt.html

Dort wurde die E-Mail-Adresse zwar schön mit Javascript versteckt, direkt daneben gibts diese aber hübsch zum Download aufbereitet im vCard-Format. Das ist schon ziemlich dämlich und leider nicht das einzige Beispiel dieser Art.

Viele weitere Beispiele gibts per Google-Suche mit dem Suchbegriff
filetype:vcf e mail

Samstag, 29. Januar 2011

cd Reloaded

Was mich an der Shell unter Linux nervt, ist das langsame Bewegen durch Verzeichnisse mit "cd". Deshalb hab ich mir ein Script geschrieben, welches "cd" bei mir inzwischen abgelöst hat (im folgenden heißt das Programm "c" für change).

Was es kann

Im Grunde ist es eine Tiefenverzeichniswechsel mit regulärem Ausdruck. Hier ein paar Beispiele:

/etc$ c site enab
/etc/apache2/sites-enabled$ c site ava
/etc/apache2/sites-available$ c php5
/etc/php5/$

Wie ihr an Zeile 2+3 seht, ist aber auch ein Wechsel in höhere Ebenen möglich, wenn nichts in der Tiefe gefunden wurde. Wobei der Wechsel aufwärts auf angegebene Verzeichnisse beschränkt ist, damit das Script nicht irgendwann in / landet.
Diese "Roots" (die Verzeichnisse, in denen auch aufwärts gesucht wird) sind über Parameter änderbar.
Daüberhinaus sollten alle Features von cd zur Verfügung stehen, auch die Autovervollständigung.

Ausprobieren

Zuerst muss php5-cli installiert werden.
sudo apt-get install php5-cli 

Kopiert dann das folgende Script "cds" in ~/bin.

#!/usr/bin/php

define('DEBUG', false);

/*
--------------------- Installation
Execute the following command on the bash:
c() { cd "`~/bin/cds $@`"; }; complete -o filenames -o nospace -F _cd c

caution: if you have a symlink in one of your root folders you can jump into the symlink folder but not return

--------------------- Changelog
0.9
"/var/www/project/folder1$ c www" changes now to "/var/www" instead of staying in the same dir
"/var/www/yoho/nextyoho$ c yoho changes now to "/var/www/yoho" instead of staying in the same dir

--------------------- Known Bugs
*/

// define __DIR__ before PHP 5.3
if(!defined('__DIR__')) { define("__DIR__", dirname(__FILE__)); } 

// init file error handler 
set_error_handler('errorhandler');

// get arguments
$args = array_slice($argv, 1);

// get current working dir
$cwd = exec('pwd');
$home = $_SERVER['HOME'];
dump($cwd, 'CWD: ');

// ---------------------------- imitate cd
// because it is also a replacement for cd imitate its behaviour
// first try cd 
if (count($args) === 0) $args = array($home);
exec('cd ' . implode(' ', $args) . ' 2>/dev/null', $output, $return_var);
if ($return_var == 0) { if (isset($args[0])) stdout($args[0]); die(); }

// ---------------------------- handle options
/*
-a : add current directory as root
-r : remove current directory as root
-l : list all roots
*/
$options = getopt('alr:');

// get roots
$conf = __DIR__ . '/cds.conf';
if (!is_file($conf)) touch($conf);
$roots = array_map('trim', file($conf));

// add new root
if (isset($options['a']))
{
// we do not want duplicates
$roots[] = $cwd;
$roots = array_unique($roots);
file_put_contents($conf, implode("\n", $roots));
stderr('Added new root: ' . $cwd);
die($cwd);
}
// list all roots
elseif (isset($options['l']))
{
foreach ($roots as $i=>$root)
{
stderr('['.($i+1).'] '.$root);
}
die($cwd);
}
// remove root
elseif (isset($options['r']))
{
$index = $options['r']-1;
if (!isset($roots[$index]))
{
stderr('There is no entry '.$options['r'].'.');
die($cwd);
}
$old = $roots[$index];
unset($roots[$index]);
file_put_contents($conf, implode("\n", $roots));
stderr('Removed root: ' . $old);
die($cwd);
}

// ---------------------------- find current root dir
$crd = $cwd;
foreach ($roots as $root)
{
if (strpos($cwd, $root) === 0) $crd = $root;
}

dump($crd, 'ROOT: ');
// create regex
$args = array_map('preg_quote', $args);
$regex = '|' . implode('.*', $args) . '|i';

// the last part of the regex has to be the last dir
$regex = '|' . implode('.*', $args) . '[^/]*$|i';

// now search
$temp = $cwd;
$i = 0;
dump('Searching ...');
while (strpos($temp, $crd) === 0 or $crd === false)
{
dump('   '.$temp);
$result = matchDir($temp, $regex, $cwd);
if ($result) die($result);

// if crd is unknown do not do a reverse search
if ($crd === false) break;
// create current search dir (strip last dir)
$temp = substr($temp, 0, strrpos($temp, '/'));
}

// no match so return current dir
stderr('No match found.');
die($cwd);

// this function does not search recursive
function matchDir($dir, $regex, $cwd)
{
$depth = 0;
$stack = array();
$new_stack = @scandir($dir);
foreach ($new_stack as $k => $v)
{
if ($dir == '/') $dir = '';
$actual = $dir . '/' . $v;
if (!is_dir($actual) || $v{0} == '.') continue;
$stack[] = $actual;
}

while (count($stack) > 0)
{
// check first for match
foreach ($stack as $full)
{
if (preg_match($regex, $full) && $full != $cwd) return $full;
}
$depth++;
if ($depth > 5) return false;
// if we got here we had no match
// so put all subfolders to the stack
foreach ($stack as $fullkey => $full)
{
if (!is_readable($full))
{
unset($stack[$fullkey]);
continue;
}
$new_stack = @scandir($full);
foreach ($new_stack as $subdir)
{
$actual = $full . '/' . $subdir;
if (!is_dir($actual) || $subdir{0} == '.') continue;
$stack[] = $actual;
}
unset($stack[$fullkey]);
}
}
return false;
}

function stderr($var) { fwrite(STDERR, print_r($var, true) . "\n"); }
function stdout($var) { fwrite(STDOUT, print_r($var, true) . "\n"); }
function dump($args, $title = null) { if (DEBUG) stderr($title . print_r($args, true)); }
function errorhandler($errno, $errstr, $errfile, $errline) { file_put_contents(__DIR__ . '/cds_error.log', "$errstr\n$errfile ($errline)\n---\n", FILE_APPEND); }


Macht cds ausführbar:
chmod +x ~/bin/cds

Führt dann folgende Zeile auf der Shell aus oder packt sie in eure ~/.bashrc:
c() { cd "`~/bin/cds $@`"; }; complete -o filenames -o nospace -F _cd c 

Parameter

-a
Fügt den aktuellen Pfad als root-Pfad hinzu, in welchem auch aufwärts gesucht werden kann.

-l
Zeigt alle root-Pfade an.

-r
Löscht den root-Pfad mit den angegeben Nummer (die aus "c -l")

Viel Spaß und danke fürs Feedback!

Samstag, 15. Januar 2011

XBMC auf Zotac HD-N01 mit Xubuntu 10.10

So, endlich geschafft. Mein eigener kleiner HTPC steht in Form eines kleines Mag Mini in meinem Wohnzimmer. Für jeden, der auch möglichst schnell zu einem eigenen Media-Center kommen möchte, hier ein kleiner Walkthrough zum eigenen Glück. :)

Ihr braucht:

- Linux-Grundwissen und evtl. Ubuntu-Grundwissen
- Zotac HD-ND01
- USB-Stick (mind. 1 GB)
- Eine USB-Tastatur und USB-Maus (der Zotac kommt ohne)

Schritt 1: Xubuntu installieren

Da der Zotac kein eingebautes Laufwerk besitzt, bleibt entweder der Weg über ein externes Laufwerk oder über einen USB-Stick. Da ja eigentlich jeder einen Stick da hat, sollte das auch der einfachste Weg sein.

Als erstes muss auf dem USB-Stick eine FAT32-Partition erstellt werden, die den boot-Flag trägt. Habe ich mit gParted gemacht. Dann kann mit UNetbootin (gibts in den Ubuntu-Repositories, aber auch für Windows) Xubuntu auf dem Stick installiert werden. Ob ihr jetzt selbst das ISO herunterladet oder das von UNetbootin alles automatisch machen lasst, ist euch selbst überlassen (bei UNetbootin "Xubuntu - 10.10_Live" wählen).

Sobald euer USB-Stick fertig ist, könnt ihr ihn in einen beliebigen USB-Slot des Zotacs stecken. Zotac einschalten und wundern... der kleine Rechner bootet nicht von allein von USB :) Wenn ihr also eine Fehlermeldung seht, drückt einfach irgendeine Taste und schon bootet er vom Stick. Ach ja, für später nützlich: Ins BIOS kommt ihr bei der Anzeige des Zotac-Logos per "Entf".

Jetzt nur noch Installieren gedrückt und schon könnt ihr euch durch die Installation führen lassen. Wichtig: Jetzt schon den Haken setzen, wenn ihr gefragt werdet, ob ihr euch automatisch einloggen wollt. Somit bootet der Rechner beim Start automatisch bis zum Desktop durch.

Nach dem ersten Start wird Ubuntu erstmal nach Updates schreien. Das solltet ihr auch zuerst machen. Also bestätigen und erstmal eine Weile zurücklehnen, bis Xubuntu auf dem neuesten Stand ist.

Euch wird aufgefallen sein, dass der Gnome Schlüsselbund jedesmal beim Start nach einem Passwort fragt. Um das in Zukunft zu verhindern, löschen wir die alten Einstellungen:

rm -r ~/.gnome2/keyrings
sudo reboot

Wenn ihr jetzt wieder nach einem Passwort für den Gnome Schlüsselbund gefragt werdet, lasst einfach das Passwort-Feld leer und bestätigt anschließend, dass ihr Passwörter unverschlüsselt speichern wollt.

Schritt 2: XBMC installieren

Jetzt folgendes im Terminal eingeben:

sudo apt-get install python-software-properties pkg-config
sudo add-apt-repository ppa:team-xbmc
sudo apt-get update
sudo apt-get install xbmc xbmc-standalone
sudo apt-get update

Jetzt ist XBMC theoretisch installiert und kann auch schon gestartet werden.

Schritt 3: Hardware optimieren

HD-Videos dürften noch nicht flüssig laufen, weil wir noch nicht den Treiber für den Nvidia-ION-Prozessor installiert haben. Das holen wir gleich nach mit:

sudo apt-get install libvdpau1 nvidia-185-libvdpau
sudo reboot

Bei mir wurde nach dem Reboot nur eine Auflösung von 800x600 verwendet, weil die xorg.conf noch nicht auf dem neuen Stand war. Dieses lässt sich einfach beheben:

sudo nvidia-xconfig
sudo reboot

Die Audio-Hardware ist ein wenig störischer. Ich habe den Sound über HDMI nur zum Laufen bekommen, indem ich pulseaudio deinstalliert habe:

sudo apt-get remove pulseaudio

Jetzt muss man noch in der "Lautstärkeregelung" die "Schalter" "IEC958" und "IEC958 1" aktivieren und in XBMC bei den Einstellungen der Audio-Hardware alles auf hdmi stellen.
Schließlich muss die Datei /etc/asound.conf mit folgendem Inhalt angelegt werden:

pcm.!default {
      type plug
      slave.pcm {
              type hw
              card 0
              device 3
      }
}

Jetzt noch einmal den Rechner neu starten und ihr habt es geschafft.


4. Weitere Optimierungen

Damit XBMC beim Booten automatisch gestartet wird, müsst ihr in "Anwendungen > Einstellungen > Einstellungsverwaltung für Xfce 4 > Sitzung und Startverhalten > Automatisch gestartete Anwendungen > XBMC" markieren.


Donnerstag, 13. August 2009

Cron Sandbox (Cronjob verifizieren)

Hatte gerade das Problem, dass ich gerade die Zeiten eines "crontab"-Aufrufs verifizieren musste. Aufgrund der ganzen Parameter-Möglichkeiten gar nicht so einfach. Hab aber gerade eine Seite gefunden, auf der man einfach die Parameter eingeben kann und dann zurückbekommt, wann der Cronjob in der Zukunft aufgerufen wird.

Sehr nett:
http://www.hxpi.com/cron_sandbox.php

Donnerstag, 16. Juli 2009

Update der Serpent Template Engine auf 1.2.3

Und wieder mal gabs ein Update auf eine neue Version. Verbessert habe ich unter anderem den Creole-Parser, der jetzt endlich sauber mit Nested Lists umgehen kann.
Außerdem ist es jetzt möglich, die Standard-PHP-Tags ("<?php", "<?", "<?=") als Delimiter zu verwenden. OK, was es vorher auch schon, aber jetzt sind auch die Punkt-Syntax und Mappings kein Problem mehr. Und die Short Tags werden automatisch zu langen Tags umgebaut, was nützlich ist, falls die short tags in der php.ini ausgeschaltet wurden.


Serpent - PHP Template Engine
http://code.google.com/p/serpent-php-template-engine/

Sonntag, 10. Mai 2009

Neue Serpent-Version: 1.2.1

Eben gerade hab ich die neue Version (Version 1.2.1) der Serpent Template Engine als Download bei Google Code zur Verfügung gestellt.

Dieses ist ein Bugfix, der den Creole-Parser etwas verbessert, welcher mit der Version 1.2 eingeführt wurde. Creole ist eine Wiki-Syntax, die eingeführt wurde, um den Wildwuchs an Syntaxen etwas zu bereinigen. Creole wird mittlerweile von einer Vielzahl von Wikis verwendet und sollte beim Bau einer eigenen Wiki-Engine zumindest unterstützt werden. Der User wirds euch danken.


Serpent - PHP Template Engine
http://code.google.com/p/serpent-php-template-engine/

Donnerstag, 9. April 2009

X11-Programme unter Windows mit PuTTY und XMing

Ja, die Headline dieses Artikels ist vielleicht etwas gewöhnungsbedürftig. Aber es geht um ein tolles Thema... fangen wir von vorn an:

Seit längerer Zeit suche ich einen guten Konsolen-Editor, mit dem meine PuTTY-Sessions nicht so nervig wie bisher sind. Mit Vi(m), Nano, Joe usw. konnte ich mich einfach nicht anfreunden, weil sie alle ihre eigenen Tastenkürzel haben und halt nicht die, die ich aus GUI-Oberflächen (egal ob Windows oder Linux) gewohnt bin. Jetzt bin ich aber gerade über die optimale Lösung gestolpert: XMing zusammen mit PuTTY.

XMing ist ein X-Server, mit dem man auf die X11-Programme eines Servers zugreifen kann. Ich kann also über PuTTY ganz normal eine Konsolen-Session führen, mit dem Unterschied, dass ich jetzt auch Dateien mit z.B. GEdit bearbeiten kann. Ich sehe dann unter Windows ein Fenster mit GEdit drin. Genial. Selbst Gimp und OpenOffice liefen problemlos.

Hier die Anleitung:
  1. XMing und XMing-portablePuTTY von der XMing Hauptseite herunterladen und installieren.
  2. Wie gewohnt eine PuTTY-Session starten mit einem kleinen Unterschied: Bei den Einstellungen unter "Connection > SSH > X11" muss "X11 forwarding" aktiviert sein.
  3. Auf dem Server muss X11 forwarding in "/etc/ssh/sshd.config" aktiviert sein. Bei mir (Ubuntu-Server) war es das standardmäßig, musste also nichts ändern. Falls man etwas ändern muss: SSH-Daemon oder Rechner neu starten.


Schon klappt es. Auf der XMing-Seite sieht man auch ein paar Screenshots, die Lust auf mehr machen.

Ach ja: Damit eure Konsole nicht blockiert ist, hängt ein & an den Befehl heran, z.B.
gedit dummy.txt &

Und Nautilus solltet ihr so starten:
nautilus --no-desktop &