Entries tagged as software
Related tags
android code computer google gui jabber java linux&unix misc mobile opensource presentation programming screenshot sdk shortys video web webdesign xml bad world blog blogging browser captcha changes dns firefox fun hardware html life lighttpd media murphy networking politics privacy s9y security server spam stuff tail -f /var/log/life tv webwide zeitgeist contentmanagement css free tool wordpress rss ruby cheatsheet feedreader markup scala swing windows xslt comic encryption howto im javascript mail newsbeuter picture podcast psi regular expression subnetting test truecrypt forum unb perl conference dslr nikon photography coffee science 1 2Änderungen
Nach Feedback auf den letzten Blogeintrag habe ich mich nochmal an das Feedchecker Script gemacht und ein paar Änderungen eingepflegt:
- Ruby 1.8 Kompatibilität (da ich selbst auf Ruby 1.9 entwickle)
- Vereinfachtes Suchen der Urls durch XPath-Expression
- Konfigurierbare Anzahl der parallel abzuholenden Feeds
./feedchecker.rb -h
This is a simple, script which takes an opml file and checks all contained feeds for
errors.
Usage:
feedchecker.rb [options] -i <filename>
where [options] are:
--input, -i <s>: Input opml file
--timeout, -t <i>: Timeout interval in seconds (default: 60)
--age, -a <i>: Specify the minimum age in days (default: 365)
--fetchparallel, -f <i>: Specify the amount of feeds to fetch parallel (default: 5)
--version, -v: Print version and exit
--help, -h: Show this message
Mehr Details gibts in der Commit-History auf github.
Geschwindigkeit
In meinen Tests verwende ich meine Liste mit ca. 160 Feeds. Einmal mit den Standardeinstellungen und einmal mit der Option, dass 10 Feeds parallel abgeholt werden.
Zuerst ein paar Vorbereitungen:
wget http://github.com/pfleidi/feedchecker/raw/master/feedchecker.rb
chmod +x feedchecker.rb
Mit Standardeinstellungen:
time ./feedchecker.rb -i feeds.opml
...
real 1m33.162s
user 0m18.909s
sys 0m1.296s
Mit 10 Threads:
time ./feedchecker.rb -i feeds.opml -f 10
...
real 1m20.754s
user 0m19.493s
sys 0m1.340s
Mit 10 Threads und aggressiveren Timeouts von 20 statt 60 Sekunden:
time ./feedchecker.rb -i feeds.opml -f 10 -t 20
...
real 0m39.808s
user 0m19.205s
sys 0m1.472s
Viel Spaß damit und ein frohes Fest euch allen!
Was tun mit riesigen Feedlisten?
Es geht wahrscheinlich vielen so: Man sammelt im laufe der Jahre hunderte Feeds in seiner Liste ohne nun wirklich zu wissen welche noch aktuell sind und welche nicht. In der letzten Zeit hatte ich genau aus diesem Grund mal wieder das Bedürfnis meine RSS-Feeds auszumisten. Da ich ein fauler Mensch bin und eigentlich keine Lust habe hunderte von Feeds "von Hand" zu prüfen, habe ich ein kleines Tool geschrieben, das mir dabei hilft kaputte, nicht erreichbare oder verwaiste Feeds zu entdecken.
Das Tool
Das Tool wurde in ruby geschrieben, ist frei unter der GPLv2 verfügbar und hoert auf den nicht besonders kreativen Namen feedchecker. Um es zu benutzen ist das Trollop-Gem sowie das Peach-Gem notwendig. Dieses lassen sich einfach mittels "gem install trollop" sowie "gem install peach" installieren.
Update: Unter Debian scheint das SSL-Plugin nicht mit der normalen Ruby-Installation mit installiert zu werden. Darum sollte es noch mittels "aptitude install libopenssl-ruby" nachinstalliert werden.
Verwedung
Da das Tool nicht viel kann, haellt sich die Komplexitaet der Optionen in Grenzen:
./feedchecker.rb --help
This is a simple, script which takes an opml file and checks all contained feeds for
errors.
Usage:
feedchecker.rb [options] -i <filename>
where [options] are:
--input, -i <s>: Input opml file
--timeout, -t <i>: Timeout interval in seconds (default: 60)
--age, -a <i>: Specify the minimum age in days (default: 365)
--fetchparallel, -f <i>: Specify the amount of feeds to fetch parallel (default: 5)
--version, -v: Print version and exit
--help, -h: Show this message
Mit einem Aufruf des Scripts lässt sich zumindest die Liste der zu prüfenden Feeds stark eingrenzen.
feedchecker.rb -i /tmp/rss.opml
http://atsutane.freethoughts.de/feed/atom feed isn't well formed and could't be parsed
http://blog.b-o-f-h.net/index.php?/feeds/index.rss2 is out of date. Age: 388 days without an update
http://blog.choas.net/RSS age could not be checked
http://blog.fefe.de/rss.xml?html age could not be checked
http://blog.roothell.org/feeds/index.rss2 Connection timed out
http://codebu.de/blog/?feed=rss2 Redirect ... new URI: http://codebu.de/blog/feed/
...
Eventuell hat ja ausser mir noch jemand eine Verwendung dafür. Falls ja ist dies mein Weihnachtsgeschenk an euch.
Vor kurzem hatte ich das Bedürfnis Bilder automatisiert, mit Hilfe eines Ruby-Scripts, zu verkleinern. Dieses Script sollte zudem ohne Änderungen sowohl auf Linux als auch auf Windows lauffähig sein.
Fuer diese Aufgabe ist Imagemagick natürlich ein super Werkzeug, da man es auch als Bibliothek von Ruby aus nutzen kann und auch für Windows verfuegbar ist. Unter Windows ist hierfür eine Installation von Ruby, sowie die Installation von Imagemagick und dem passenden RMagick Ruby-Gem notwendig. Unter Linux reicht es Imagamagick und Ruby mit dem Paketmanager seiner Wahl zu installieren und mittels "gem install rmagick" das Gem zu installieren.
Der eigentliche Code gestaltet sich relativ simpel. Prinzipiell lässt sich ein Bild mit wenigen Anweisungen verkleinern:
#!/usr/bin/env ruby
require 'rubygems'
require 'RMagick'
@debug = true
def resize_image(file)
puts "let's resize #{file} ..." if @debug
img = Magick::Image::read(file).first
img.resize_to_fit(1024, 1024)
img.write(file)
puts "resizing of #{file} successful" if @debug
end
Die Methode resize_to_fit() sorgt hier für das Verkleinern auf bestimmte Maximalwerte in Länge und Breite. Weiteres erfährt man aus der Doku
.Medianight
Morgen, am Donnerstag den 02.07.2009 wird an meiner Hochschule wieder die Medianight stattfinden. Hier werden die Studenten ihre Projekte des letzten Semesters praesentieren. Ich werde dort unter anderem mit meinem eigenen Projekt am Start sein.
YAXIM
Wie schon zuvor gesagt, werde ich zusammen mit Chris unser Semesterprojekt, das den Namen YAXIM traegt, vorstellen. YAXIM steht fuer "Yet Another XMPP Instant Messenger" und ist ein Jabberclient fuer die Android-Plattform. Als kleinen Vorgeschmack folgen hier noch unsere Folien und das Video der heutigen Praesentation:
Ein Kommilitone von mir hat heute die Ergebnisse seines letzten Semesterprojekts oeffentlich gemacht. Darum moechte ich hier mal etwas Werbung fuer das coole Projekt machen:
camstick is a symbiosis of camera and joystick to symbolize you that you can not only use your webcam for simple video chats but for interacting with your computer using your webcam. Camstick is started as a project work of mine at the Stuttgart Media University. Now i want to share my result with you!
Da ich gerade an einem Projekt arbeite, dass XMPP auf Java verwendet, hab ich mir zu Testzwecken eine Klasse gebaut, die Smack verwendet und ein paar Moeglichkeiten der API nutzt. Es ist unter anderem moeglich sich zu verbinden, das Roster auszulesen und empfangene Nachrichten anzuzeigen. Da mir bei der offiziellen Dokumentation Beispiele gefehlt haben, die man auf einen Rutsch kopieren und bearbeiten kann, moechte ich hier ein wirklich lauffaehiges Beispiel veroeffentlichen. Ich hoffe, damit kann jemand was anfangen:
import java.util.Collection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
public class SmackTester {
private XMPPConnection conn;
private String username;
private String password;
private String server;
public SmackTester() {
// debug option
XMPPConnection.DEBUG_ENABLED = false;
username = "einuser";
password = "einpasswort!";
server = "jabber.foo.bar";
makeConn();
doConnect();
makeRoster();
chatAction();
// wait ... (I know that's pretty ugly)
while (conn.isConnected()) {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// nothing interesting here
public static void main(String[] args) {
new SmackTester();
}
private void doConnect() {
// let's connect
try {
conn.connect();
conn.login(username, password, "someRessource");
} catch (XMPPException e) {
System.err.println("Login failed!");
e.printStackTrace();
System.exit(1);
}
System.out.println("Login succesful!");
}
private void makeConn() {
ConnectionConfiguration config = new ConnectionConfiguration(server,
5222);
// pass some connection options
config.setSASLAuthenticationEnabled(true);
SASLAuthentication.supportSASLMechanism("PLAIN", 0);
conn = new XMPPConnection(config);
}
private Roster makeRoster() {
Roster roster = conn.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
// print out all entries in roster
System.out.println("---------- entries in roster -----------");
for (RosterEntry entry : entries) {
System.out.println(entry);
}
System.out.println("---------- entries in roster -----------");
// react to changes in roster
roster.addRosterListener(new RosterListener() {
// called methods ...
public void entriesDeleted(Collection<String> addresses) {
// do stuff
}
public void entriesUpdated(Collection<String> addresses) {
// do stuff
}
public void presenceChanged(Presence presence) {
System.out.println("Presence changed: " + presence.getFrom()
+ " " + presence);
}
public void entriesAdded(Collection<String> arg0) {
// do stuff
}
});
return roster;
}
private void chatAction() {
PacketTypeFilter filter = new PacketTypeFilter(Message.class);
PacketListener myListener = new PacketListener() {
public void processPacket(Packet arg0) {
if (arg0 instanceof Message) {
Message msg = (Message) arg0;
System.out.println("Message: " + msg.getFrom() + " "
+ msg.getBody());
}
}
};
// Register the listener.
conn.addPacketListener(myListener, filter);
}
private void doDisconnect() {
conn.disconnect();
System.out.println("Disconnected");
}
}
Nachdem ich es schon lange vor hatte, habe ich mich nun mal an LaTeX heran getraut und damit die ersten Texte formatiert. Als die Ergebnisse nach den ersten Gehversuchen schon sehr vielversprechend aussahen, habe ich zudem beschlossen meine naechsten Praesentationen ebenfalls in LaTeX zu schreiben. Auf der Suche nach einer Vorlage bin ich auf diesen Beitrag in einem Forum gestossen, der mir sehr geholfen hat:
\documentclass[ngerman]{beamer}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usetheme[secheader]{Madrid}
\useinnertheme{circles}
\setbeamercovered{transparent}
\beamertemplatenavigationsymbolsempty
\author[Tester]{Tester}
\title[Minimalbeispiel]{Minimalbeispiel ist immer BESSER}
\begin{document}
\begin{frame}[plain]
\maketitle
\end{frame}
\begin{frame}
\tableofcontents
\end{frame}
\setbeamertemplate{headline}
{
\leavevmode%
\hbox{%
\begin{beamercolorbox}[wd=.5\paperwidth,ht=2.25ex,dp=1ex,center]{section in head/foot}%
\usebeamerfont{author in head/foot}\raggedleft\thesection.~\insertsection\hspace{2em}\null
\end{beamercolorbox}%
\begin{beamercolorbox}[wd=.5\paperwidth,ht=2.25ex,dp=1ex,center]{subsection in head/foot}%
\usebeamerfont{author in head/foot}\hspace{2em}\raggedright\insertsubsection
\end{beamercolorbox}}%
\vskip0pt%
}
\section{Test}
\subsection{Test unter}
\begin{frame}
\frametitle{Testfolie}
\begin{itemize}
\item Eintrag
\item Ende
\end{itemize}
\end{frame}
\section{noch ein Test}
\subsection{noch ein Test unter}
\begin{frame}
\frametitle{Testfolie}
\begin{itemize}
\item Eintrag
\item Ende
\end{itemize}
\end{frame}
\end{document}
Wirft man diesen Code nun pdflatex vor die Fuesse, generiert dieses eine schoene Praesentation, die man sich hier ansehen kann.
Ich sitze hier gerade in einer Hacksession bei Chris und versuche einer Preference-Activity beizubringen, dass Passwoerter in einer EditTextPreference maskiert werden. Nach etwas rumsuchen, bin ich auf die Loesung gestossen. Hier ein kleiner Prototyp:
<EditTextPreference
android:key="password"
android:title="Ich bin ein Passwortfeld"
android:summary="Hier kannst du dein Passwort eingeben"
android:dialogTitle="Bitte Passwort eingeben!"
android:singleLine="true"
android:password="true"
/>
Ich frage mich allerdings, warum man in der Dokumentation davon nichts findet ...
Sollte jemand auf die Idee kommen eine alte Version von Android (z.B. den -RC7 Build in Europa) mal "schnell" auf den neusten Stand bringen zu wollen hier ein paar Schritte mit denen man auf neue Upgrades und den Status des Downloads pruefen kann:
- Man besorgt sich das Programm AnyCut aus dem Market. Dazu sollte die Suchfunktion genutzt werden.
- Danach legt man mit Anycut eine Verknuepfung auf "Activites/Device Info" an
- Ist das erledigt, startet man die Verknuepfung auf dem Homescreen, scrollt bis ganz nach unten und drueckt "Check for upgrade"
- Dort kann man den Downloadstatus beobachten und bekommt die Meldung, dass ein Upgrade verfuegbar ist, sobald es herunter geladen wurde. Ich persoenlich haette ja zuerst gefragt und dann herunter geladen aber ...

Anmerkung: Ja ich hatte fast zwei Wochen lang ein G1 und bin momentan dabei mich in das SDK dafuer einzuarbeiten. Ja ich werde noch detaillierter darueber bloggen und nein ich besitze es nicht mehr, da es sich heute wieder auf den Weg zum Verkaeufer gemacht hat.
Ich werde diesen Server heute Nacht von Debian Etch auf Lenny upgraden. Sollte es hierbei zu einem Ausfall kommen, seit ihr nun vorgewarnt.
Sollte jemand noch nach einem guten Howto fuer das Upgrade suchen, sollte er/sie sich dieses hier zu Gemuete fuehren.
Weitere Links:
... steht uns ein einmaliges Ereignis bevor: Der UNIX-Timestamp wird den Wert 1234567890 erreichen.
date -d@1234567890
Sat Feb 14 00:31:30 CET 2009
Den Countdown kann man sich uebrigens hier ankucken. Viel Spass dabei. ![]()
Ich habe mir gerade das Android-SDK installiert und damit rumgespielt. Hier mal ein Screenshot der mobilen Darstellung auf Android:
Nach Jahren der Qual und viel Leid mit dem ATI-Catalyst-Treiber fuer Linux hat die Situation auf meinem bleeding edge System mit dem Upgrade auf X.org 7.4 und Catalyst 8.11 nun einen traurigen Hoehepunkt erreicht. Hier mal ein paar der schwersten Fehler:
- Der Xserver hat sich geweigert im Akkubetrieb zu starten. Zu sehen bekam man nur einen schwarzen Bildschirm und dann ging nichts mehr. Also Neustart und ohne X booten. Zum Glueck bin ich in der Lage auch ohne graphische Oberflaeche zu arbeiten.
- Beim Zuklappen des Notebooks kam es in zufaelligen Abstaenden zum Einfrieren des XServers was ebenfalls nur durch einen Neustart gefixt werden konnte.
- Beim Abspielen einiger Videos kam man irgendwann in die absurde Situation, in der das Bild dem Ton um hinterher rennt. Teilweise um Sekunden versetzt.
Nach all diesem Leiden habe ich mich mal nach dem aktuellen Befinden des RadeonHD-Treibers erkundigt, der mit Hilfe der offen gelegten Spezifikationen entstanden ist. Also installiert, xorg.conf editiert. Geht. Die oben beschriebenen Probleme sind Vergangenheit. Einziger Nachteil: Der Treiber bietet keine hardwarebeschleunigte 3D-Ausgabe. Ist auf dem Notebook zum Arbeiten allerdings auch nicht zwingend notwendig. Immerhin muss ich mich nun nicht mehr auslachen lassen wenn mein Notebook in einer Vorlesung nicht vernuenftig hochfahren will. Weitere Infos zur Installation bekommt man im ArchWiki.
Ich bin gerade auf ein sehr interessantes Projekt namens ZML gestossen:
Basically, ZML is a markup language with a C-style syntax and lots of syntactic sugar. Furthermore the ZML toolchain provides a ZML to XML compiler, which means that ZML is a convinient way of writing XML. So you could regard it as an alternativ to a feature rich XML editor.
But ZML is more. It is also a technique of code generation, thus an alternativ to Model Driven Architecture. These two aspects fit together when you know that ZML code generation is done with XSLT. Using the ZML syntax instead of the XML syntax for XSLT stylesheets makes it very easy to write a code generation tool whenever approriate. No BNF, flex and bison, no theoretical knowledge about gramar and parser classes. Just some XML, XSLT and XPATH, denoted in a convinent way.
Das hoert sich nach einem interessanten Weg an um XML zu schreiben ohne sich mit den "> <" Zeichen herum plagen zu muessen.
Quicksearch
Kategorien
Links
Tags
del.icio.us
- Appcelerator Developer Center - Documentation
- Coderspiel — Rewiring Android for type-safe layout resources
- pkrumins's stackvm at master - GitHub
- Netty - the Java NIO Client Server Socket Framework - JBoss Community
- Learn Your Motherf#@kin' Science: A Textbook for Juggalos | Cracked.com
- The C Book - Table of Contents
- andrewvc's node-streamlogger at master - GitHub
- Setting up a JavaScript Build Process – JavaScriptr
- js-build-tools - Project Hosting on Google Code
- YUI Compressor
- JsUnit
- InfoQ: Ralph Johnson, Joe Armstrong on the State of OOP
- ztellman's aleph at master - GitHub
- Clojure - home
- Mac OS X keyboard shortcuts

