Bildverarbeitung mit ImageMagick in Picasa

27.07.2011
tags: , ,
Olexandr Savchuk

Unser Büro verwendet Google Picasa für diverse Bildbearbeitunsaufgaben. Wir nutzen die Software schon seit Jahren und sind sehr zufrieden damit. Allerdings fehlen manche uns benötigte Funktionen, und manche sind nur über mehrere komplexe Schritte erreichbar; das ist bei der Arbeitsmenge bei uns nicht akzeptabel. Meine Lösung des Problems besteht aus zwei Elementen: dem Kommandozeilentool ImageMagick für automatisierte Bildverarbeitung, sowie der Picasa Button API.

Die Beispielanwendung, die ich weiter erkläre, ist ein Werkzeug zum Zusammenfügen mehrerer Bilder in eins in einem Klick direkt aus der Picasa Ordneranzeige. Es sollte nicht schwer fallen, den Code für andere Bildverarbeitungszwecke zu modifizieren.

Zum Rest des Beitrags »

Android: ListView mit Lautstärketasten scrollen

24.02.2011
Olexandr Savchuk

Eine Listenansicht in einem Android App mit Lautstärketasten scrollen ist eigentlich recht simpel. Ohne das zu wissen, habe ich gestern etwas Zeit in der vergeblichen Suche nach einem Tutorial verbraucht; nachdem ich den Code geschrieben und mit der Version 1.0 von Quoter released habe, dachte ich, es wäre keine schlechte Idee selbst ein Tutorial zu schreiben.

Was man erst machen muss, ist die dispatchKeyEvent() Methode in der Activity überschreiben, und somit die Tastendruckevents der Lautstärketasten abfangen. Hier ist meine Lösung:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
	if (event.getAction() == KeyEvent.ACTION_DOWN) {
		switch (event.getKeyCode()) {
		case KeyEvent.KEYCODE_VOLUME_UP:
			scrollToPrevious();
			return true;
		case KeyEvent.KEYCODE_VOLUME_DOWN:
			scrollToNext();
			return true;
		}
	}
	if (event.getAction() == KeyEvent.ACTION_UP
		&& (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP
			|| event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN)) {
		return true;
	}
	return super.dispatchKeyEvent(event);
}

Es muss beachtet werden, dass bei dem ACTION_DOWN Event unser Code ausgeführt wird. Der ACTION_UP Event wird zusätzlich abgefangen, um den Systemsound beim Loslassen des Buttons zu unterdrücken. Dann wird event.getKeyCode() überprüft, und wenn es eine der Lautstärketasten ist, werden die entsprechenden Scrollfunktionen aufgerufen und true zurückgegeben. In allen anderen Fällen (andere Events oder Tasten) wird das Event an den Standarthändler weitergereicht.

Weiter kommen die Funktionen zum eigentlichen Scrollen des ListView. Das Problem hier ist, man kann zu beliebigen x/y Koordinaten mit der scrollTo() Methode scrollen. Aber was ich brauchte, ist zu einem Eintrag der Liste zu scrollen, da Quoter ein Leseapp ist und man zum nächsten Zitat zum Lesen scrollen möchte. Also machte ich folgendes:

private void scrollToNext() {
	int currentPosition = getListView().getFirstVisiblePosition();
	if (currentPosition == getListView().getCount() - 1)
		return;
	getListView().setSelection(currentPosition + 1);
	getListView().clearFocus();
}

private void scrollToPrevious() {
	int currentPosition = getListView().getFirstVisiblePosition();
	if (currentPosition == 0)
		return;
	getListView().setSelection(currentPosition - 1);
	getListView().clearFocus();
}

Erst wird die Listenposition des ersten sichtbaren Elements auf dem Bildschirm bestimmt. Wenn es schon die letzte Position in der Scrollrichtung ist, wird nichts gemacht. Sonst wird die Auswahl in der Liste auf das nächste Element gesetzt; das scrollt die Liste automatisch zu dem Element (dasselbe passiert beim Navigieren in der Liste mit dem D-Pad). Das einzige Problem bleibt, dass das Element nun ausgewählt und somit hinterleuchtet ist, was beim Lesen stört. Indem wir den Fokus von der ganzen Liste wegnehmen, wird die Auswahl aufgehoben. Fertig.

OpenTTD WebConfig

10.10.2010
Olexandr Savchuk

Ein Tool zum OpenTTD Server per Web-Interface konfigurieren.

Getestet mit OpenTTD 1.0.4, Apache2 and PHP 5.2.4 auf Windows und Ubuntu. Kein Grund, warum es auf sonstigen Plattformen (gegeben PHP) nicht funktionieren sollte.

Projekt gehostet bei OpenTTDCoop DevZone:
http://dev.openttdcoop.org/projects/ottd-webconfig

OpenTTD – Kreuzungen und Stationen

7.10.2010
Olexandr Savchuk

OpenTTD ist eine freie Neuimplementierung (Clone) der Engine des 1994 erschienenen Simulationsspieles Transport Tycoon Deluxe von Chris Sawyer.

Wikipedia

Habe mal wieder angefangen, das Spiel OpenTTD zu spielen – ist Jahre her, dass ich damit viel gemacht habe. OpenTTD ist, wie oben beschrieben, ein Open Source Remake des Strategiespiels Transport Tycoon Deluxe aus den Zeiten von MS-DOS. Das Ziel ist es, auf der Karte ein Transportnetzwerk für mehrere Arten von Güter und Passagiere aus Zügen, Straßenfahrzeugen, Schiffen und Flugzeugen aufzubauen und damit mehr Geld zu machen, als die Konkurrenz. Hier ein Paar Screenshots:

Effiziente Bahnnetze in dem Spiel können durchaus sehr komplex sein und von Hunderten von Zügen befahren werden. Solche Netzwerke kommen nicht ohne große Kreuzungen aus, und der Verkehrsfluss wird stark dadurch bedingt, wie effizient die Kreuzungen und die Stationen gebaut sind. In diesem Post sammele ich Screenshots von meinen Kreuzungs- sowie Stationsentwürfen, die vielleicht auch einem oder anderen OpenTTD-Spieler hilfreich sein könnten.

Ein Tag im Leben eines Programmierers

16.03.2010
Olexandr Savchuk

Backlight mit Kaltlichtkathoden

12.03.2010
tags: ,
Olexandr Savchuk

Ich arbeite an meinem PC oft im Dunkeln, und mir ist bekannt, dass es für die Augen nicht besonders gesund ist, in einen hellen Bildschirm mit dunklem Hintergrund zu sehen. Ich habe mehrere Varianten angesehen, das Problem zu lösen, unter Anderen ein blaues Ikea LED Backlight bei einem Bekannten, aber kam nie dazu, so etwas selbst zu machen. Eine Zeit lang hatte ich sogar einfach meine Schreibtischlampe umgebogen, sodass sie hinter dem Monitor war – das awr aber eindeutig keine Dauerlösung.

Die Lösung kam unerwartet – auf Alternate ZackZack sah ich ein Paar Kaltlichtkathoden für €4,99. Nach einer Hornbach-Fahrt und ausgebenenen 7€ sitze ich hier nun im Dunkeln und schreibe diesen Post, ohne dass sich meine Augen auch im kleinsten anstrengen :)

Zum Rest des Beitrags »

Android App – Quoter

10.03.2010
Olexandr Savchuk

Android Market: Quoter Quoter QR Code

Lustige Internetzitate lesen. Perfektes Zeitvertreib für Warteschlangen, Busfahrten und mehr.

Mit der App kann man:
- Die letzten lustigen Zitate genießen
- Die Lieblingsquellen für Zitate wählen
- Zitate für später Lesen speichern
- Zitate via SMS, Email, Facebook u.Ä. teilen

Wenn Ihnen meine App gefällt, kaufen Sie die Spendeversion und werden Sie die Werbung los!

Alle Kommentare und Vorschläge sind hier im Market oder per Email immer willkommen.

Zitatquellen in Deutsch:
- german-bash.org: latest, random
- ibash.de
- swissbash.ch
- abash.at
- SMSvonGesternNacht
- school-bash.org

Zitatquellen in Englisch:
- bash.org: latest, random, random >0, top100
- qdb.us
- quotebucket.org
- fmylife.com

Zitatquellen in Russisch und Ukrainisch:
- bash.org.ru: latest, random, abyss, abyssbest, all with pagination support!
- ibash.org.ru
- ithappens.ru
- zadolba.li
- bash.bynets.org (bash.org.by)
- ukrbash.org
- killmepls.ru
- nefart.ru

§ 162. Kreativitätskrise

21.02.2010
Olexandr Savchuk

Stellen wir ein einfaches Experiment. Zählen wir alle uns bekannten Wörter nacheinander auf (oder bitten wir einen Freund). Die ersten zehn Wörter werden schnell gefunden sein. Danach suchen und nennen wir Objekte im Raum um uns herum – weitere zehn oder so. Dann erinnern wir uns an ein Paar interessanter Wörter aus der fernen Ecke unseres Vokabulars. Und dann halten wir, weil uns die Wörter ausgehen.

Wenn jemand versucht, etwas Bekanntes mit seinen Wörtern zu umschreiben, entsteht kein Defizit an Wörtern. Jemand wird eine gute Beschreibung machen, ein Anderer eine nicht so gute – das bestimmt den Skill. Aber keiner hält auf der Suche nach dem nächsten nötigen Wort bei einer einfachen Beschreibung an.

Eine Ideenkrise kann nur dann entstehen, wenn das Ausdenken von etwas neuem und ungewöhnlichen zum Ziel des Designers wird.

Etwas neues und ungewöhnliches kann nicht ausgedacht werden – es kann nur während der Arbeit an einem bestimmten Ziel selbst entstehen. Genau so unterscheidet sich eine Wörteraufzählung von einer Geschichte.

Eine Kreativitätskrise ist die Sackgasse eines sinnlosen Wegs.

© art.lebedev, meine Übersetzung aus dem Russischen

SVN für Webseiten – aufpassen

17.02.2010
Olexandr Savchuk

Viele Webmaster verwenden SVN nicht nur als ein Versionskontrollsystem für die Entwicklung ihrer Projekte, sondern auch als ein Tool zum Uploaden der fertigen Webseite auf den Server. Eine Sicherheitslücke wurde in dem System entdeckt, wovon viele nicht wissen, und sie stellt eine ernste Bedrohung für viele Webseiten dar – denn unter Umständen können Quellcodes und Konfigurationsdateien von Dritten eingesehen werden. Um die Art dieser Lücke zu verstehen, muss man sich ein wenig in die Technik hinter SVN vertiefen.

In jedem Ordner, der von SVN verwaltet wird, wird ein verstecktes Unterordner .svn angelegt. In diesem werden eine Liste aller Dateien und Unterordner sowie die aktuellen Versionen aller Dateien selbst gelagert. Die Datei .svn/entries enthält die Namen aller Dateien und Ordner und einige für SVN relevante technische Informationen, und das Unterverzeichnis .svn/text-base beinhaltet alle Dateien des Ordners, mit .svn-base als Zusatzerweiterung.

project
  |- index.php
  |- config.php
  |- dir
  |    |- .svn
  |    |    |- entries
  |    |    '- text-base
  |    |         '- file.ext.svn-base
  |    '- file.ext
  |- .svn
  |    |- entries
  |    |- text-base
  |    |    |- index.php.svn-base
  |    |    '- config.php.svn-base
  |    '- ...
  '- ...

Normalerweise ist das Verzeichnis .svn versteckt, und darauf wird nicht viel geachtet. Allerdings werden die meisten Webserver mit Standardeinstellungen diesen Ordner nicht anders als alle Anderen betrachten – das heißt, wenn die Dateien daraus direkt angefordert werden, werden diese dem Benutzer angezeigt. So kann man sich aus der entries Datei die Liste aller Dateinamen besorgen, und da die Erweiterungen dieser Dateien im text-base Ordner geändert sind, werden Skript-Dateien nicht wie gewöhnlich von Server ausgeführt (z.B. PHP), sondern der Quellcode wird wie es vorliegt direkt ausgegeben.

Diese Sicherheitslücke wurde vor einiger Zeit von einer Gruppe russischer Programmierer entdeckt. Diese haben einen Scan vieler Webseiten in den .com, .de und .ru Zonen durchgeführt, und die Ergebnisse waren erstaunlich. Hunderte von Webseitenbesitzern wurden über Lücken in ihren Projekten informiert. Nachdem die Lücke auf den meisten großen Seiten geschlossen wurde, wurden die Informationen auf einem großen russischen IT-Blog Habrahabr veröffentlicht.

Es gibt mehrere Arten, sich von dieser Lücke zu schützen. Die einfachsten sind:

  • Zugriff auf .svn mittels .htaccess (auf Apache) oder anderen Konfigurationsmitteln sperren.
  • Beim Benutzen von svn export anstatt des gewöhnlichen svn checkout wird das Verzeichnis .svn erst gar nicht erstellt.

Wobei diese Methoden recht offensichtlich erscheinen (und das sind sie), war ich sehr überrascht, als ich mal einen kleinen Test mit einigen Webseiten aus meinen Favoriten durchgeführt habe. Von da aus, wenn Sie Webmaster sind und hiervon nicht gewusst haben – Vorsicht.

How Fanboys See Operating Systems

19.12.2009
tags:
Olexandr Savchuk