Git: Änderungen an existierenden Dateien ignorieren

Montag, April 8, 2013 22:25
Veröffentlicht in der Kategorie Softwareentwicklung von Markus

Hat man bei Git eine Datei angelegt und im Index, kann man Änderungen an dieser Datei nachträglich über .gitignore nicht mehr vor einem Commit schützen. Sobald die Datei existiert, können alle Änderungen daran weiterhin commited werden. Die .gitignore hilft nur dabei, nicht existierende Dateien nicht in den Index zu bekommen. Abhilfe schafft foldender Befehl:

git update-index --assume-unchanged <file>

Um Änderungen weiterhin zu ermöglichen, hilft folgender Befehl:

git update-index --no-assume-unchanged <file>

Download von uploaded.net mit wget

Freitag, Dezember 28, 2012 22:55
Veröffentlicht in der Kategorie Hacking, Linux, Shell-Scripts von Markus

Um ein paar Dateien von Uploaded.net mit wget zu laden, kann man folgendes kleines Shell-Script nutzen:

#!/bin/sh

username="123456"
password="abcdefgh"

wget --save-cookies=cookies.txt -S -O /dev/null --post-data="id=$username&pw=$password&_=" "http://uploaded.net/io/login" 2>&1
wget --load-cookies=cookies.txt -i links.txt
rm cookies.txt

Das Script loggt einen bei uploaded.net ein, speichert die Cookies und startet anschließend den Download mithilfe des gerade getätigten Logins. Alle Links, die gedownloaded werden sollen, müssen in der links.txt Datei mit einem Link pro Zeile stehen.

Viel Spaß :)

Automatisch Self-Signed-SSL-Zertifkat erzeugen

Sonntag, November 4, 2012 15:20
Veröffentlicht in der Kategorie Server, Shell-Scripts von Markus

Ein kleines Script, das automatisch ein SSL-Zertifikat erstellt und signiert. Wichtig ist, dass man beim Common-Name den Domain-Namen eingibt, für den das Zertifkat genutzt werden soll. Sonst funktioniert es nicht richtig.

#!/bin/bash

ssl_dir="./ssl"

mkdir -p $ssl_dir
pass=`pwgen -n 100 -1`

openssl genrsa -des3 -out $ssl_dir/server.key -passout pass:$pass 2048
openssl req -new -key $ssl_dir/server.key -out $ssl_dir/server.csr -passin pass:$pass
cp $ssl_dir/server.key $ssl_dir/server.key.org
openssl rsa -in $ssl_dir/server.key.org -out $ssl_dir/server.key -passin pass:$pass
openssl x509 -req -days 3650 -in $ssl_dir/server.csr -signkey $ssl_dir/server.key -out $ssl_dir/server.crt
rm $ssl_dir/server.csr $ssl_dir/server.key.org

Das erzeugte SSL Zertifikat kann man dann einfach wie folgt in seinen Apache-Vhost einbinden (Pfad und Dateinamen evtl. anpassen..)

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key

HTTP-Requests mit PHP loggen

Dienstag, April 3, 2012 13:17
Veröffentlicht in der Kategorie Netzwerke, PHP von Markus

Ich musste grade zu Logging-Zwecken alle eingehenden HTTP Requests loggen. Dabei brauchte ich vor allem die Header des Requests inkl. des Body, wenn es ein POST Request ist.

Also kurz folgenden Schnipsel verfasst und das Logging konnte beginnen :-)

<?php

$headers = apache_request_headers();

$header = $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . " HTTP/1.1\n";
foreach($headers as $name => $value)
        $header .= "{$name}: {$value}\n";

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
        $header .= "\n" . http_build_query($_POST);
}

$log = $_SERVER['REMOTE_ADDR'] . ' - - ' . date('[d/M/y:H:i:s O]') . "\n-\n" . $header . "\n==========================================================\n";

$handle = fopen(__DIR__ . '/access_log', 'a');
fwrite($handle, $log);
fclose($handle);

Dieser Schnipsel funktioniert aktuell nur, wenn man den Apache verwendet.

Sortieralgorithmen in PHP

Montag, Mai 2, 2011 21:35
Veröffentlicht in der Kategorie Algorithmen, PHP, Softwareentwicklung von Markus

Sortieralgorithmen werden in der Programmierung häufig benötigt, von daher kann ein wenig Kentniss über die gängisten Sortieralgorithmen nicht schaden. Man benötigt zwar häufig gar keine Sortieralgorithmen selber programmieren, weil die verwendete Programmiersprache oder Datenbank einem die Arbeit abnimmt, kann sie aber hin und wieder doch benötigen.

PHP und MySQL verwenden von Haus aus den Quick-Sort Algorithmus, da er eine sehr kurze Laufzeit hat und auch einer der effektivsten Algorithmen ist.

In PHP kann man z.B. durch ein einfaches sort($array) seinen Array sortieren lassen. PHP übernimmt dann im Hintergrund die Sortierarbeit mit dem Quick-Sort-Algorithmus. In MySQL kann man seine Daten über ORDER BY sortieren lassen, die dann ebenfalls automatisch von MySQL sortiert werden.
Wenn man aber nun selber komplexere Dinge sortieren möchte, z.B. Objekte nach bestimmten Kriterien, muss man selber einen Sortier-Algorithmus entwickeln, der die Arbeit übernimmt.

Um einen Überblick über die gängigsten Sortieralgorithmen zu erhalten, habe ich diese vier Algorithmen einmal in PHP übersetzt: Selection Sort, Insert Sort, Bubble Sort, Quick Sort

Über die Laufzeit und alles weitere kann man sich dann bei Wikipedia informieren, das möchte ich gerade nicht zusammenfassen :-)
Ich möchte nur kurz sagen, dass Selection, Insert und Bubble Sort bei einer größeren Anzahl Elemente schnell eine lange Rechenzeit benötigen und man daher überlegen sollte, ob der Quick Sort nicht sinnvoller ist.

<?php

function selectionSort(array $zahlen)
{
	for($i = 0; $i < count($zahlen); $i++)
	{
		$min = $i;
		for($j = $i; $j < count($zahlen); $j++)
		{
			if($zahlen[$j] < $zahlen[$min])
			{
				$min = $j;
			}
		}
		
		$tmp = $zahlen[$min];
		$zahlen[$min] = $zahlen[$i];
		$zahlen[$i] = $tmp;
	}
	
	return $zahlen;
}

function insertSort(array $zahlen)
{
	for($i = 1; $i < count($zahlen); $i++)
	{
		$tmp = $zahlen[$i];
		$j = $i;
		while($j > 0 AND $zahlen[$j-1] > $tmp)
		{
			$zahlen[$j] = $zahlen[$j - 1];
			$j--;
		}
		$zahlen[$j] = $tmp;
	}
	
	return $zahlen;
}

function bubbleSort(array $zahlen)
{
	for($i = 0; $i < count($zahlen); $i++)
	{
		for($j = 1; $j < count($zahlen) - $i; $j++)
		{
			if($zahlen[$j] < $zahlen[$j-1])
			{
				$tmp = $zahlen[$j-1];
				$zahlen[$j-1] = $zahlen[$j];
				$zahlen[$j] = $tmp;
			}
		}
	}
	
	return $zahlen;
}

function quickSort(array $zahlen, $l = null, $r = null)
{
	if(is_null($l) AND is_null($r))
	{
		return quickSort($zahlen, 0, count($zahlen) - 1);
	}
	
	$mitte = $zahlen[(int) (($l + $r) / 2)];
	$i = $l;
	$j = $r;
	
	while($i <= $j)
	{
		while($zahlen[$i] < $mitte) $i++;
		while($zahlen[$j] > $mitte) $j--;
		
		if($i <= $j)
		{
			$tmp = $zahlen[$i];
			$zahlen[$i] = $zahlen[$j];
			$zahlen[$j] = $tmp;
			$i++;
			$j--;
		}
	}
	
	if($l < $j)
		$zahlen = quickSort($zahlen, $l, $j);
	if($i < $r)
		$zahlen = quickSort($zahlen, $i, $r);
	
	return $zahlen;
}

$unsortierteZahlen = range(0, 10);
shuffle($unsortierteZahlen);

var_dump(implode(', ', $unsortierteZahlen));
var_dump(implode(', ', selectionSort($unsortierteZahlen)));
var_dump(implode(', ', insertSort($unsortierteZahlen)));
var_dump(implode(', ', bubbleSort($unsortierteZahlen)));
var_dump(implode(', ', quickSort($unsortierteZahlen)));

?>

Cli-Anwendungen mit dem Zend Framework

Donnerstag, Januar 20, 2011 23:23
Veröffentlicht in der Kategorie PHP von Markus

Oft kann es nützlich sein, wenn man bestimmte Teile seiner Anwendung über das Command-Line-Interface (kurz Cli) aufrufen kann. Dies kann man z.B. dazu nutzen, um einen bestimmten Task anzustoßen oder um eine Aufgabe als Cronjob bzw. Daemon laufen zu lassen.

Ich werde im folgenden Erklären, wie man das Zend Framework über Cli nutzbar macht. Ich gehe dabei nur auf die grundlegenden Schritte ein, um einen umfassenden Überblick über die Möglichkeiten zu geben. Ich habe diese Variante seit längerer Zeit im Einsatz und komme damit sehr gut zurecht, da es kaum einen Unterschied zu Http-Requests gibt. Trotzdem bin ich mir über die einzelnen Schritte meiner Implementierung nicht mehr 100%ig bewusst, versuche aber alles zu bedenken. Sollte ich dennoch etwas vergessen und etwas fehlen bzw. nicht funktionieren, sagt mir doch bitte Bescheid.

Wie man das Zend Framework dazu bringen kann, auf Requests über Cli zu reagieren, muss man dem Zend Framework diese Art des Requests zu erst einmal beibringen. Grundsätzlich erwartet das ZF Requests per HTTP und versucht somit auch Informationen wie z.B. HTTP_HOST oder Parameter aus der URL anzufordern. Da es diese Informationen bei einem Cli-Request allerdings nicht gibt, müssen wir unsere eigene Request-Klasse programmieren, die den Request annimmt und bearbeitet, wenn die Anfrage über Cli kommt. Weiterlesen »

svn: Dateien standardmäßig ignorieren

Dienstag, Januar 11, 2011 14:46
Veröffentlicht in der Kategorie Linux, Software, Softwareentwicklung von Markus

Oftmals werden während der Entwicklung temporäre Dateien angelegt (Eclipse legt z.B. .project, .buildpath und .settings an), die man nicht in das SVN-Repository hinzufügen möchte. Damit diese Dateien nicht immer in der Status-Liste (svn st) stehen, kann man diese Dateien über die Subversion Konfigurationsdatei ignorieren lassen.

Dazu muss man einfach die Datei ~/.subversion/config (im Home-Verzeichnis) bearbeiten. Dort findet sich folgende Zeile:

# global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo

Diese Zeile muss man einfach auskommentieren und, je nach Bedarf, mit eigenen Dateinamen (bzw. Wildcards) ergänzen oder vorhandene entfernen.

Für die Eclipse-Projekt-Dateien kann man z.B. folgende Zeile verwenden:

global-ignores = .project .settings .buildpath

Diese Einstellung in der Config-Datei ist aber nur lokal und für den aktuellen Nutzer. Möchte man bestimmte Dateien vollständig für das Repository verbieten, kann man dazu folgenden Befehl nutzen:

svn propedit svn:ignore /path/to/repo

Dort trägt man dann die zu ignorierenden Dateinamen relativ zum angegebenen Verzeichnis ein. Fertig.

Tags: ,

IPv4-Adressen neigen sich dem Ende

Sonntag, Januar 2, 2011 17:49
Veröffentlicht in der Kategorie Netzwerke von Markus

Es war schon lange absehbar, dass irgendwann alle IPv4-Adressen aufgebraucht sein werden. Dieser Zeitpunkt liegt aber mittlerweile nicht mehr in weiter ferne. Es ist schon in wenigen Wochen so weit. Folgende Grafik verdeutlicht das sehr gut:
Weiterlesen »

Apache: alle aktivierten vHosts anzeigen

Sonntag, Januar 2, 2011 2:30
Veröffentlicht in der Kategorie Server von Markus

Ich hatte gerade das Problem, dass ich wissen musste, welche vHosts momentan auf meinem Server aktiviert sind.

Dies kann man nun herausfinden, indem man in den /etc/apache2/sites-enabled Ordner guckt. Hat man seine Dateien sinnvoll benannt, kann man so evtl. schon auf den ersten Blick sehen, was alles aktiviert ist. Ansonsten muss man sich jede Datei einzeln ansehen.

Es geht aber auch wesentlich elleganter. Der Apache gibt über folgenden Befehl alle aktivierten vHosts aus:

apache2 -S

und man erhält eine Ausgabe ähnlich der folgenden:

wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server example.de (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost example.de (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost asdf.org (/etc/apache2/sites-enabled/000-default:20)
         port 80 namevhost foobar.org (/etc/apache2/sites-enabled/foobar:1)
         port 80 namevhost www.foobar.org (/etc/apache2/sites-enabled/foobar:8)
Syntax OK
Tags: ,

Anonymität im Internet, Proxys and Proxy Anbieter

Donnerstag, Dezember 30, 2010 3:50
Veröffentlicht in der Kategorie Software von Neytiri

Das hier ist mein erster Post in diesem noch recht frischen Blog. Mein Name ist Lilly und meinen ersten Beitrag widme ich der Anonymität durch Proxys, deren Technik und den Anbietern von Proxylösungen.

Warum einen Proxy verwenden?

Wer sich etwas für Politik interessiert und dabei nicht nur auf die Meinung von Zeitungen und TV vertraut, dürfte möglicherweise schon einen Eindruck haben, wohin uns die Zukunft führt: Eine unentbehrlich Vorratsdatenspeicherung muss her, um die Aktivität der vielen Terroristen aus Deutschland zu überwachen, eine Internetzensur ist ebenso unabdingbar, um Kinderpornografie aus dem deutschen Internet zu verbannen und man brauche ebenfalls einen Jugendschutz, der alle nicht-jugendfreien Inhalte sperrt und uns 16+ Material nur Nachts zugänglich macht, um die Entwicklung von Kindern und Jugendlichen nicht zu beeinflussen.
Es ist unschwer zu erkennen wohin dieser Trend geht: Überwachung, Kontrolle und Zensur und es bleibt sicher nicht nur bei den bereits angekündigten Einschränkungen.

Nicht jeder möchte, dass die eigenen Spuren im Internet bis aufs kleinste Detail gespeichert und analysiert werden, und um dies zu Umgehen eignet sich eine Proxysoftware. Unterschiedliche Proxy-Softwarelösungen und die technischen Hintergründe habe ich in diesem Artikel kurz und knapp zusammengefasst. Weiterlesen »