IOException.de

Icon

Ausgewählter Nerdkram von Informatikstudenten der Uni Ulm

Interview: Boris ‘krt’ Kraut

I got to know Boris a while ago through a common friend. He is quite active at the “Chaos macht Schule” program and I found him to be quite an interesting person, meaning that he deviates from the mindset and opinions of average people. He regularly writes texts, which are online accesible here. After I talked to him at the GPN ’12 I asked him if he would like to participate in this series and he agreed. So here you go!

Who are you and what do you do?
My name is Boris ‘krt’ Kraut, but it could as well be anything else: You don’t choose your name, it is given to you by others. Even if you pick your name by yourself, e.g. a nickname, you can’t enforce its usage. In fact, sometimes you have to earn your name. Imagine a world where we all are numbers and you have to behave to earn the right to have a name. Sounds fucked up? It sure is! But have a closer look at reality: We just are labeled numbers, because what really matters is your ‘score’. Despite everything you have been told, nobody cares about you, your strengths, your weaknesses, yourself anymore. It’s all about receiving scoring ‘higher’ on somewhat standardized tests to get a ‘better’ chance to earn ‘more’ money to have ‘more’ free-time. This makes me sad.

So, what do I do? I follow a philosophy to improve everywhere: If there is a problem you can fix without negative consequences, it doesn’t matter if it’s your job or not. Just fix it. Sure, you can’t fix everything — either because you just are not able to or because you have something better/more important to do. It’s just that you can improve so much with little to no costs. We shouldn’t miss those opportunities. In the past years I have been focusing on ‘computer/media literacy’, especially the educational system in a digital millennium.

I study at the University of Education, Karlsruhe, and participate in the ‘Chaos macht Schule‘ movement. I like swimming and support the local lifeguards (DLRG), but I resigned from active duty due to my lack of time.

Which software or programs do you use most frequently?
Tough questions. We are all using software all the day, we know what our work setup is like, which programs we use on a daily base, but we often miss the underlying complexity of the operating systems. Even if we don’t use our laptop or smartphone, we are using software, we are depending on software each day: Taking the bus? Guess what, you are using software. Doing the laundry? Software. Reading a book? Hell, yeah, somewhere in the process of writing, printing, delivering and reading it, there is likely software involved…

..but to answer your question in a more convenient way I’d pick ‘openssh’,’dtach‘, ‘vim’, ‘mutt’ and ‘firefox’.

Why did you decide to use your particular operating system(s) of choice?
Postponing my answers for a while turns out to be right: I can proudly say I am no longer with Ubuntu anymore. Don’t get me wrong, it’s not that bad, it even might just be the OS which fits you, but the reason I had to use it was a fracked up graphics card with a picky driver (Intel GMA500, featuring the famous ImgTec PowerVR). Nowadays I use Debian on my notebook, but it will most likely be replaced sometime soon. I went with Debian for obvious reasons: I wanted to drop Ubuntu but hadn’t the time to evaluate what I really want. I really hope to get in touch with BSDs again as I have been a long time FreeBSD user.

I really like fanless systems. I’m frequently checking out ARM based computers, tablets and smartphones, and so I am using Android a lot. I don’t know if I like it or not, I will have a deeper look at it.. someday.

Oh, I do like TinyCoreLinux :)

In what manner do you communicate online?
E-mail is the preferred way to communicate with me. In fact, I even use it for news feeds, task management and my blogging system. I tried a couple of MUAs, ‘nmh‘, ‘mmh‘ and ‘mutt‘, just to name a few. Right now, I am using ‘mutt’, but I am looking for an ‘nmh’/’mmh’ like alternative that handles Maildirs and IMAP. I don’t like programs that take you hostage: Give me my shell back!

I also was very active on IRC, but I dumped it because it — or at least the channels I used to hang out on — didn’t had to offer anything relevant for my life. I don’t like the design of having multiple not interconnected networks, but this feature might just save us one day. Anyways, I reconsider going back to IRC from time to time. My preferred client was ‘irssi‘, but I really liked the way ‘ii‘ works.

At last, there’s XMPP. I used it, I dropped it, I got back to it. I don’t like XML, I don’t like the way how it handle’s some things, but after all it’s the open instant messaging standard, you better support it. Currently, I prepare to drop text messaging (SMS) from my “supported” contact options and replace it with XMPP. My long-term target is to move voice calls as well to XMPP — and later upgrade them to possible video calls. On Android I use the ‘beem‘ and ‘yaxim‘ clients, however I have yet to find one to support all feature from my wishlist; Jingle Audio/Video support can be chippy, just like persistent connections… On the shell, there’s currently only one choice: ‘mcabber‘. However, just like ‘mutt’ It captures your term. There are at least two ‘ii’ inspired clients, one of them is ‘jj‘ — obviously. I even tried to write two XMPP clients on my own: One fed the messages into my mail setup — there are even two kinds of messages types defined by XMPP, mail-like normal and chat — and another one to resemble the ‘talk’ messaging system with a ‘jfinger’ to receive a users xCard. Speaking of xCards: I think letting each user keep it’s own contact information up-to-date is the sane way doing it. Keeping files on persons is just not right, it’s creepy and reminds me of Germany’s history. Besides, you never gonna keep the information up-to-date on your own.

By the way, I don’t do web-based communication, neither Twitter nor Facebook. I think they are bloody awful and are doing harm to humanity. They kill cute kitties and ponies, too. However, I try to evaluate such services every now and then. Buddycloud looks interesting…

Which folders can be found in your home directory?
Having used the same home directory for ages, it has become cluttered and now shows elements from different naming schemes. I really want to clean it up, but I can’t come up with a sane solution. I am currently using some sort of task based naming, but maybe project based would be better? I don’t know.. Oh, and… XDG default names are awful. They brake existing naming traditions. Their scheme is not bad, it’s well thought, but it doesn’t feel right for me.

bin: user binaries and scripts
src: source code
man: manuals, rfcs, technical documents and tutorials
gfx: graphics.. haven’t used it in ages…
mfx: chiptunes :)
mail: mail, tasks, contacts, blog, …
ppt: presentations and talks I have given.. no I won’t rename it to pres…
tmp: temporary files; can be purged after logoff
Desktop: nothing
Downloads: here be dragons… currently flooded with talks/recordings I want to watch..
misc: everything else; sorted

Which paper or literature has had the most impact on you?
I have yet to find the one true thing, the book or paper that catches the essence of how and why. I have been influenced by a lot of papers and persons. I could name a few, but that would be unkind to all those handles I would not include. I actually don’t even care much for names nor bibliographic links, I care for thoughts and ideas.

What has had the greatest positive influence on your efficiency?
I am not efficient at all, but I try to follow inbox zero. I like KISS stuff. I avoid complexity or at least try to brake it up to manageable chunks. Humans and social interaction are a complexity nightmare. They might be efficient for themselves, but me interacting with them or vice verse slows things down. I don’t understand them. That’s where a lot of my efficiency problems come from.

How do you approach the development of a new project?
Tossing around ideas in my head. Scribbling them on a sheet of paper or on a whiteboard. Sort them. Structure them. Look at what is already there. What’s the goal. Talk with people. Listen to people… actually I really don’t know what to say.

Which programming language do you like working with most?
I left the path of a “programmers” many years ago. I spend most of my programming time writing glue code in plain sh. The last few projects I worked on have been done in ruby, as will be my next/last project for university. It wasn’t my decision to use ruby, but it’s an interesting language. I kinda like it and it worked out okay most times. Fair enough, but I don’t know if I really stick with it.

In your opinion, which piece of software should be rewritten from scratch?
Hardware sucks, software sucks, implementations are bad and most standards are even worse. I complain a lot because something might not fit my view/guidelines. But it doesn’t matter. Don’t fix software, fix humanity. Seriously, why can’t we all be a little nicer to others?

What would your ideal setup look like?
Actually, I don’t know. Small, no bloat, sane. I could write a lot about CLI, X and what’s wrong or right. But a more fundamental question I still have to answer is whether I want a client/server setup — a dump client and a freedom box in every house, meshed wireless networking, controlled by the people and not the government or corporations.. — or a complete road-warrior setup, where everything is right on my notebook. Do I want a notebook at all? Or could I use a smartphone/tablet/$futuredevice with an external keyboard? I don’t know..

Click here for the full picture.

Writing a Pecha Kucha Presentation-Timer in Java

The first question many people will have is: What is this “Pecha Kucha” thing after all? And as I mentioned in my profile, one of my interests is presentations. In short; pecha kucha is a presentation technique where every slides lasts exactly 20 seconds with 20 slides in total.

The motivation for this comes from the lecture Mobile Human Computer Interaction by Enrico Rukzio where the exercises demand such kind of presentation. But I will not go into much detail about this, the more important questions is: Does the current presentation-programs feature this technique? And the answer is: Yes, but often presentations are held with PDFs which do not feature it.

So I decided to write a little java-application that extends every presentation-program with this feature. I used java because it is platform independent and I wanted to be compatible with most programs and most OS. Also java has a very (very) cool class called

 java.awt.Robot

which allows you to send keystrokes system-wide! Yes, pretty cool; and it works for Windows, Linux and Mac.

This also explains the way I implemented it. Just sending Page-Down keystrokes to the system, when the presentation is running. This will click the next slide in a given amount of time automatically. Page-Down because most hardwarepresenters also use this keystroke to fulfill their purpose.
This post is about how I program little applications and should give everyone a little look how I write code. One important thing I learned at the University is the importance of requirements and software engineering. In short: Think about what you do, the program must exist in your head (or at least on papers and diagrams) before a single line of code is written. Even is such small programs like this one.

Let’s do some requirements engineering:
The first thing we need to know is, what should your program do, and more important, what should it not do!

So, we need a program that should automatically switch slides on a presentation in a given amount of time. The program should work with most OS and most presentation-programs. Controlling the program should be possible via a Trayicon and Formdialog. Every controlling-element should indicate if the timer is started or stopped. Before the program should switch slides, the user must have some time to prepare for his presentation. Therefore a delay should be implemented that starts the input-automation after a fix amount of time. The program should always give responses to the internal state, like: How much time is left before the presentation starts and how long will the current slide last until a switch. Also it should be possible to pause the program while in presentation. If the presentation has ended, you should be able to start over. It should be possible to set parameters for: Delay-before-presentation, Time-for-each-slide, Amnout-of-slides-in-total.

The requirements could be more precise, but that should be enough.
The next thing is to think about how to implement it. Usually you draw nice diagrams like Class-diagrams and state charts.

As we can see in the diagrams above, the Presenter is our Model (the M in MVC), Tray and InfoDisplay are Views but also Controllers. If we switch the state of our Model via the Controller, the Views (which implement the PresenterStateListener) are updated automatically. As timer I used a Ticker-Class which just calls a callback in the presenter ( tick() ) every second. The ticker can be in play or in paused state. PresenterController implements the Play/Pause state machine and the Listeners, Presenter implements the delay/next-slide state machine.

But enough about intention, requirements and design, let’s go see some code!

public class Main {

	public static void main(String[] args) {

	int delayFirst = 10;
	int slideCount = 15;
	int slideSeconds = 20;
	if (args.length == 3){
		delayFirst = Integer.parseInt(args[0]);
		slideCount = Integer.parseInt(args[1]);
		slideSeconds = Integer.parseInt(args[2]);
	}

	Presenter p = new Presenter(delayFirst,slideCount,slideSeconds); InfoDisplay d = new InfoDisplay(p);
	d.setVisible(true);
	Tray t = new Tray(p,d);

	p.addPresenterStateListener(t);
	p.addPresenterStateListener(d);
 }
}

This part should be obvious. We control alternative parameters via command-line args, then delegate everything to the Presenter. After that, we create the Views and connect the Listeners.

Let’s have a look into the Tray-Class, which I developed first, because it’s often easier to begin with a controlling element like a GUI. This allows you to implement the use-cases defined in the requirements-part and also allows you to find errors and misunderstandings between Customer and Contractor in a very early state of development. If all interactions are implemented, you can run usability-tests with real users. But personally I think beginning with controlling elements allows you develop an early logic which can be very good integrated into the final program.

Back to the Tray-Class:

/**
 *
 * Spawns a trayicon to control the presentation (play/pause)
 *
 */
public class Tray implements PresenterStateListener, ActionListener {
//this is a nice way to access ressources in the jar-file. But this also works in the normal filesystem.
	private final Image playImage = Toolkit.getDefaultToolkit().getImage(
			Tray.class.getResource("/resources/play.png"));
	private final Image pauseImage = Toolkit.getDefaultToolkit().getImage(
			Tray.class.getResource("/resources/pause.png"));
	private final String TOOLTIP_PLAYING = "pechakucha - playing";
	private final String TOOLTIP_STOPPED = "pechakucha - stopped";
	private TrayIcon trayIcon;

	private final PopupMenu menu = new PopupMenu();
	private final MenuItem exit_menu_item = new MenuItem("exit");
	private final MenuItem toggle_gui = new MenuItem("toggle gui");

	private final Presenter p;

	private final JFrame gui;

	private boolean disableTrayNotifications = true;

	public boolean isDisableTrayNotifications() {
		return disableTrayNotifications;
	}

	public void setDisableTrayNotifications(boolean disableTrayNotifications) {
		this.disableTrayNotifications = disableTrayNotifications;
	}

	public Tray(Presenter p, JFrame f) {
		gui = f;
		trayIcon = new TrayIcon(playImage, TOOLTIP_STOPPED);
		this.p = p;

		trayIcon.setImageAutoSize(true);

		trayIcon.setPopupMenu(menu);

		menu.add(exit_menu_item);

		exit_menu_item.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);

			}
		});

		toggle_gui.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				if (gui.isVisible()) {
					gui.setVisible(false);
				} else {
					gui.setVisible(true);
				}

			}
		});
		menu.add(toggle_gui);

		if (SystemTray.isSupported()) {
			SystemTray tray = SystemTray.getSystemTray();
			try {
				tray.add(trayIcon);
			} catch (AWTException e) {
				e.printStackTrace();
			}
		}

		trayIcon.addActionListener(this);
	}

	public void setMessage(String msg) {
		if (disableTrayNotifications)
			return;
		trayIcon.displayMessage("pechacucha", msg.replaceAll("<br>", "\n"),
				MessageType.INFO);
	}

	@Override
	public void presenterPlay() {
		trayIcon.setImage(pauseImage);
		trayIcon.setToolTip(TOOLTIP_PLAYING);

	}

	@Override
	public void presenterPause() {
		trayIcon.setImage(playImage);
		trayIcon.setToolTip(TOOLTIP_STOPPED);

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		this.p.switchState();
	}

	@Override
	public void presenterInfoUpdate(String msg) {
		setMessage(msg);

	}

}

The Trayicon should be very straight forward, there should be no problems to understand the code here.
The InfoDisplay class is also a very straight forward Swing JFrame:

/**
 *
 * Displays a play/pause button for the presentation,
 * a timer that shows when the presentation starts, when the next slide will be shown
 * and how many slides are left.
 *
 */
public class InfoDisplay extends JFrame implements PresenterStateListener,
		ActionListener {

	private static final long serialVersionUID = 1L;
	private JLabel body;
	private final JButton playpause;
	private final Presenter p;

	public InfoDisplay(Presenter p) {
		setSize(800, 300);
		playpause = new JButton("play");
		getContentPane().add(playpause, BorderLayout.SOUTH);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		playpause.addActionListener(this);

		this.p = p;
		body = new JLabel();
		body.setHorizontalAlignment(SwingConstants.CENTER);
		setMessage("press play to start");
		getContentPane().add(body, BorderLayout.CENTER);
		setTitle("pechacucha");
		setLocationRelativeTo(null);
		setAlwaysOnTop(true);
	}

	public void setMessage(String msg) {
//interesting things could be the String.format() method, which works like c's printf. Also nice is the usage of html and css to style the Label.
		this.body
				.setText(String
						.format("<span style="font-size: 40pt; font-weight: bold; text-align: center;">%s</span>",
								msg));
	}

	@Override
	public void presenterInfoUpdate(String msg) {
		setMessage(msg);

	}

	@Override
	public void presenterPlay() {
		this.playpause.setText("pause");
	}

	@Override
	public void presenterPause() {
		this.playpause.setText("play");

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == playpause) {
			this.p.switchState();
		}

	}

}
 

Now we have seen the View and Controllers combined as Trayicon/JFrame and PresenterStateListener
Lets look at some logic:

To make things easier, we will only look at the interesting parts of the logic and omit some boring getters, setters, variable declarations,…

As mentioned earlier the PresenterController implements the play/pause state machine:

protected enum State {
	PLAYING, STOPPED;
}

protected State state;

protected abstract void stateChangedStopped();

protected abstract void stateChangedStarted();

 /**
 * switches the state to play/pause; depends on the previous state
 */
 public void switchState() {
		if (state == State.PLAYING) {
			state = State.STOPPED;

			for (PresenterStateListener l : listeners) {
				l.presenterPause();
			}
			stateChangedStopped();
		} else {
			state = State.PLAYING;

			for (PresenterStateListener l : listeners) {

				l.presenterPlay();
			}
			stateChangedStarted();

		}

	}

On top of that, I created the Presenter class which uses a Ticker to time events. Every second the ticker calls the tick-method of the presenter. The presenter then decides what to do: Delay the presentation, count down the slide-timer or use the robot to send a “next-slide”-keystroke to the operating system.

/**
 *
 * The main control class for presentation.
 * Uses the Ticker to periodically perform an action (tick())
 *
 * Implements the next-slide, presentation starts, ends state machine.
 *
 */
public class Presenter extends PresenterController {

	private final int delayFirstSeconds;
	private int delayFirstSecondsPassed;

	private final int numSlides;
	private int slideCount = 0;

	private boolean firstPlay = true;

	private final int secondsForSlide;
	private int secondsForSlidePassed;

	private Robot robot;

	private final Ticker ticker;

	public Presenter(int delayFirstSeconds, int numSlides, int secondsForSlide) {
		super();
		resetState();
		this.delayFirstSeconds = delayFirstSeconds;
		this.numSlides = numSlides;
		this.secondsForSlide = secondsForSlide;
		ticker = new Ticker(this);
		try {
			robot = new Robot();
		} catch (AWTException e) {
			e.printStackTrace();
		}

	}

	/**
	 * resets the state of the presenter
	 */
	private void resetState() {
		delayFirstSecondsPassed = 0;
		secondsForSlidePassed = 0;
		slideCount = 0;
		firstPlay = true;
	}

	/**
	 * performs a systemwide "next-slide" keystroke (pgdown)
	 */
	public void nextSlide() {
		robot.keyPress(KeyEvent.VK_PAGE_DOWN);
		robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
	}

	@Override
	protected void stateChangedStopped() {
		ticker.pause();

	}

	@Override
	protected void stateChangedStarted() {
		ticker.play();
		if (firstPlay) {
			firstPlay = false;
		}

	}

	/**
	 * callback for the ticker
	 */
	public void tick() {

		delayFirstSecondsPassed++;

		if (delayFirstSecondsPassed >= delayFirstSeconds) {
			secondsForSlidePassed++;
			// delay over, start
			if (firstPlay) {
				firstPlay = false;

			}

			if (secondsForSlidePassed >= secondsForSlide) {
				// next slide
				slideCount++;
				secondsForSlidePassed = 0;

				if (numSlides - slideCount 					// presentation over
					switchState();
					msgPresenterStateListeners("presentation finished");
					resetState();
					return;
				}
				nextSlide();
			}
			msgPresenterStateListeners("Seconds until next slide: "
					+ (secondsForSlide - secondsForSlidePassed)
					+ "
Slides left: " + (numSlides - slideCount - 1));

		} else {
			// delay phase
			msgPresenterStateListeners("Seconds until start: "
					+ (delayFirstSeconds - delayFirstSecondsPassed));
		}

	}

}

Then there is the Ticker class. The idea of the ticker is, that he has three states: PLAY, PAUSE, STOP. However STOP is never active because it would prevent the ticker from starting over. Once the run-method has ended, a Thread will never be alive again..

/**
 *
 * Performs an action (callbacks the Presenter's tick method)
 * every second.
 *
 *  The ticker can be in three states: PLAY, PAUSE, STOP
 *  On Play, every seconds the callback will be called,
 *  on Pause, the ticker-thread will be on wait.
 *  On Stop, the Ticker can never be in play or paused state again.
 *
 */
public class Ticker implements Runnable {
//The volatile keyword is not as easy explained as you might think,
//in short, use it to indicate that multiple threads will access it.
//Also note that the definition of volatile tightened up in java5.
	private volatile boolean stopped = false;

	private Thread ownThread;

	private long lastSecond = 0;

	private int every; //every.. second -> every=1

	private enum TickerState {
		PLAY, PAUSE, STOP;
	}

	private volatile TickerState state;

	private Presenter p;

	public Ticker(Presenter p) {
		this(p, 1);
	}

	public Ticker(Presenter p, int every) {
		this.p = p;
		this.every = every;
		state = TickerState.PAUSE;
		ownThread = new Thread(this);
		ownThread.setDaemon(true); //a daemon-thread will not cause the program to stay alive if no other thread is running.
		ownThread.start();

	}

	/**
	 * starts or continues the ticker (this method is idempotent)
	 */
	public void play() {

		state = TickerState.PLAY;
//notifyAll can only be called if it has the monitor
		synchronized (ownThread) {

			ownThread.notifyAll();
		}

	}

	/**
	 * pauses the ticker (this method is idempotent)
	 */
	public void pause() {

		state = TickerState.PAUSE;
	}

	/**
	 * stops the ticker (this method is idempotent)
	 */
	public synchronized void stop() {
		stopped = true;
	}

	@Override
	public void run() {
//again, we need to synchronize this on ownThread because ownThread.wait(); demands this.
		synchronized (ownThread) {

			while (!stopped) {

				while (state == TickerState.PAUSE) {

					try {
						ownThread.wait();

					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
				}

				if (System.currentTimeMillis() - lastSecond > 1000 * every) {
					// tick - a second
					p.tick();
					lastSecond = System.currentTimeMillis();
				}
			}
		}

	}
}

The idea is to loop infinitely if the ticker is in PLAY, and to pause the whole thread if it is on PAUSE. On STOP, we end the infinity-loop in the run-method.
You also see that I use timestamps to trigger events not Thread.sleep(TIME) to do that. The reason is that Thread.sleep is only as accurate as the precision and accuracy of systemtimers and schedulers. By checking everytime if the delta-value of the system-time is greater or equal than one second, we should be very precise.

So what happens if we pause the timer?
The Thread checks in a loop every time if we are in paused state. If that is true, he puts himself to sleep.

				while (state == TickerState.PAUSE) {

					try {
						ownThread.wait();

					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
				}

The call ownThread.notifyAll(); in play() wakes him up.

	public void play() {
		state = TickerState.PLAY;
//notifyAll can only be called if it has the monitor
		synchronized (ownThread) {
			ownThread.notifyAll();
		}
	}

You can download the project from github:
https://github.com/philipphock/PechaKucha.git

Fünf Tage unterwegs: Rückblick zu MongoDBMunich und NodeDublin

It’s conference time! – Oder “was” vielmehr. Denn beide oben genannten Konferenzen liegen bereits mehrere Wochen zurück, mein defektes Notebook machte aber leider einen schnelleren Bericht unmöglich. Die Erinnerungen an die beiden Konferenzen sind aber nicht erblasst, sodass ich sie noch gerne teilen möchte.

Mitte Oktober. Für viele meiner Kommilitonen bedeutete dies vor allem eines: Beginn des neuen Wintersemesters. Und während die meisten dem wohl mit Blick auf die nun zu Ende gegangenen Semesterferien vorlesungsfreie Zeit etwas wehleidig entgegensahen, bedeutete es für mich nur eines: Eine ziemlich ereignisreiche Woche liegt vor mir. Bereits mehrere Monate zuvor hatte ich meine Teilnahme an der MongoDB Konferenz in München festgemacht. Recht kurzentschlossen entwickelte sich dann noch der Plan, von München direkt weiter nach Dublin zur Node.js-Konferenz NodeDublin zu fliegen, was dank des netten Angebots von Organisator Cian Ó Maidín, den Ticketpreis etwas studentenfreundlicher zu gestalten, und günstiger Flugpreise sogar realistisch schien. So begann für mich also das Semester ein wenig anders: Am Dienstag, den 16. Oktober ging es mit dem Zug nach München zur MongoDB Konferenz, von dort am nächsten Tag mit Aer Lingus in die irische Hauptstadt, wo Donnerstag und Freitag NodeDublin anstand. Samstag in aller Früh ging dann auch schon der Rückflug nach Frankfurt, da ich tagsüber noch eine (nein, diesmal nicht Technik-) Tagung der Deutschen Schachjugend in Heidelberg hatte. Klingt doch nach einem tollen Plan, oder?

16. Oktober: MongoDB Munich

Leider nicht mehr online verfügbar: Der Sessionplan von MongoDB Munich

Leider ist der Sessionplan von MongoDB Munich nicht mehr online, ich habe ihn aber mal eingescannt. Die Konferenz fand im Hilton Hotel in der Nähe vom Tucherpark statt. Von außen eine sehr gute Location, von innen war ich aber etwas enttäuscht. Keiner der sogenannten Ballsäle hatte auch nur ein einziges Fenster, sodass einem im Laufe des Tages irgendwann die Decke auf den Kopf fiel – auch wenn die Sessions von Coffee Breaks und Mittagsbuffets im lichtdurchfluteten Hotelfoyer unterbrochen waren.
Die Teilnehmer kamen aus allen Bereichen: Entwickler und Systemadministratoren, MongoDB-Anfänger und -Kenner. Als etwas erfahrenerer MongoDB-Nutzer war ich anfangs etwas von den Low-Level-Vorträgen enttäuscht. Zugegeben: Die Session “Building Your First App with MongoDB” hielt genau was sie versprach und war eben nur eine oberflächliche Einführung. Auch von Marc Schwerings “Schema Design” hatte ich mir mehr neue Erkenntnisse erhofft. Die gab es dafür am Abend im persönlichen Gespräch mit ihm, wo er ein bisschen aus dem Leben eines jungen Solution Architect bei 10gen, dem Unternehmen hinter MongoDB, plauderte.

Mit zunehmender Dauer wurde es dann aber doch inhaltlich spannender. Bislang benötigte ich die Replication-Features von MongoDB noch nie, dafür sind die Daten, mit denen ich arbeite (noch!) zu gering. Und selbst wenn ich mir unsicher bin, ob Replication damit für mich in absehbarer Zeit überhaupt ein Thema wird, waren schon allein die theoretischen Probleme, die es im Falle eines Mehr-Rechner-Systems zu lösen gibt, sehr interessant. Und ein Punkt, wo ich wieder merkte, dass das Studium doch etwas bringt, hörte ich in dieser Session doch viele Begriffe aus den uulm Vorlesungen Algorithmen und Datenstrukturen, Rechnernetze, uvm.
Während ich bis dahin im BallSaal B war, der meist theoretische Sessions beheimatete, wechselte ich vor dem Mittag zu “Pizza Quattro Shardoni with comSysto” in den BallSall A, wo die praktische Anwendung des NoSQL-Vertreters im Vordergrund stand. Für die Motivation, warum man das ganze eigentlich macht, war das sicher nicht verkehrt :)

Vor Abflug in München zum letzten Mal Sonne tanken

Nach dem Mittagessen und dem zufälligen Treffen der Ulmer Kollegen von Transporeon ging es mit “Indexing und Query Optimization” weiter, gefolgt von “Map/Confused”. Ich hatte im Sommersemester meine Seminararbeit unter dem Titel “Google’s MapReduce Programming Paradigm as Basis for NoSQL Database Views” verfasst und war gespannt, wie MongoDB diesen Ansatz umsetzt, wo Abfragemöglichkeiten wie das Aggregation Framework in der Community ja viel verbreiteter sind. Der Vortrag war allerdings recht enttäuschend: Kaum Fachwissen und als Beispiel, warum MapReduce schlecht sei, wurde eine Abfrage gemessen, die man schlichtweg nie mit M/R (und auch manch anderem alternativen Vorschlag) lösen würde.
Den Abschluss bildeten für mich das wirklich spannende und unterhaltsame “Scaling Tips & Tricks” und anschließende “Build your own Foursquare with MongoDB’s Spatial Features & the Cloud”. Nach über acht Stunden im Hilton war die Konferenz dann gegen 17.15 Uhr in den gemütlicheren Teil über und ich konnte mich bei kostenfreiem Bier mit einigen netten 10gen Mitarbeitern unterhalten.

18.-19. Oktober: NodeDublin

Der nächste Tag begann hektisch: Ich hatte bei einer Freundin in München übernachtet und reichlich Zeit eingeplant, um vom Arabellapark mit U- und S-Bahn zum Flughafen der bayerischen Landeshauptstadt zu kommen. Doch an diesem Mittwoch kam irgendwie alles zusammen: Die erste S-Bahn zum Airport fiel aus und die nächste hatte 20 Minuten Verspätung – und fuhr “aus betrieblichen Gründen” nicht mal bis zum Flughafen, was man den Fahrgästen dann in irgendeinem Nest vorher (man konnte schon die Flieger ganz tief landen sehen!) sagte und sie rauswarf. So kam ich 75 Minuten später als geplant am Flughafen an, musste mich an der Schlange an Checkin und Sicherheitskontrolle vorbeimogeln und kam gerade rechtzeitig zum Boarding. Dafür sollte es dann aber auch für die nächsten Tage erstmal mit dem Stress vorbei sein.

In Dublin angekommen die erste positive Überraschung. Der Linienbus kostete nur ein bisschen über zwei Euro, hatte aber freies WLAN on board. Davon kann sich München mal eine Scheibe abschneiden, das mir für die Tortur wenige Stunden zuvor mal eben einen Zehner abgeknöpft hatte. Dank des Tipps von Timo war ich sehr günstig und zentral in Dublin untergebracht: Bei 18€ pro Nacht bei einem Fünfbettzimmer für einen alleine in einem ordentlichen Hostel kann man nicht meckern! Dank der Stunde Zeitverschiebung hatte ich noch den ganzen Tag Zeit, Dublin zu Fuß zu erkunden und bei für Irland gute Wetterverhältnisse einen ausgedehnten Spaziergang zum Konferenzort von NodeDublin zu nutzen: Stattfinden sollte das Event, zu dem sich zahlreiche node.js-Größen aus der ganzen Welt angekündigt hatten, die nächsten zwei Tage in einer riesigen Guinness-Brauerei im Herzen der Stadt.

O’Connell Street in Dublins Zentrum – in der Parallelstraße war mein Hostel

Für irische Verhältnisse gutes Wetter

Auch architektonisch macht Dublin so einiges her

Ort des Geschehens: das Guinness Store House in Dublin

Leckeres Frühstücksbuffet (NK)

Guinness Store House (NK)

Die Konferenz begann am Donnerstagmorgen dann – natürlich – mit der Registrierung und anschließendem, ausgesprochen leckerem Frühstücksbuffet. Das Guinness Store House, in dem die Konferenz eine Etage für sich einnahm und das sonst durchgehend von Besuchern durchströmt war, bot ein exzellentes Ambiente: Moderne Konstruktion, lichtdurchflutet, im Konferenzsaal große runde Tische für jeweils zehn Personen. An jedem einzelnen waren, als es pünktlich um 9.00 Uhr mit den Keynotes von Mikeal Rogers und Isaac Schlueter losging, jeweils zwei Plätze für Speaker vorgesehen, was das Motto der nächsten Tage unterstreichen sollte: Eine Konferenz von Node-Usern für Node-User, keinen extra Bereich für die Speaker. Und so waren keine zwei Stunden vergangen, als plötzlich Isaacs (der Mann hinter npm und heute quasi “Chefentwickler” von Node) sich neben mich setzte und wir uns locker unterhalten konnten. Und auch die nächsten Tage boten sich immer wieder zahlreiche Gelegenheiten, mit bekannten node.js-Größen ebenso zu reden wie mit enthusiastischen Entwicklern aus aller Welt.

Wo ich gerade bei Enthusiasmus bin: Der war enorm, sowohl wie er bei den einzelnen Sessions vorgetragen wurden, aber auch in den Gesprächen der Teilnehmer vorgelebt wurde. Hätte man eine Umfrage gemacht, so wären wahrscheinlich alle Kernbereiche der Informatik abgedeckt gewesen (“Machine Learning using Node.js”, wie geil ist das denn bitte?!). Auf der anderen Seite neigt so eine Konferenz wahrscheinlich per Definition zur Selbstbeweihräucherung. Kein Talk, in dem nicht – manchmal ja doch etwas unreflektiert – herausgestellt werden musste, wie awesome Node doch sei ist. Bei all den “Wir können die Zukunft gestalten!”-Talks fehlte mir dann irgendwann schon die Ernsthaftigkeit und wirklich neue Erkenntnisse, ich hätte mir in der Summe mehr technische Beiträge gewünscht. Felix Geisendörfers “Writing fast streaming binary parsers in node.js” war fantastisch, vom anderen deutschen Speaker Jan Lehnardt (“Community and Open Source, and the Node Community”) hätte ich lieber etwas zu CouchDB gehört als einen weiteren Talk im Keynote-Stile.

Ein Blick ins Plenum (NK)

Keynote von Isaac Schlueter (NK)

Alles in allem war für mich bei der Vielzahl an Talks und guten, bekannten Speakern aus der Szene am Ende zu wenig dabei, was ich an praktischen Tipps für meine Arbeit mit Node nun mitnehmen konnte. Das machten aber die vielen, vielen Gespräche mit anderen Entwicklern wieder wett. Die Zahl deutscher Teilnehmer war überschaubar, sehr sympathisch fand ich die vielen Iren, die die Konferenz organisierten oder einfach teilnahmen. Die Studentenquote hätte vermutlich auch höher sein können, die uulm-Kollegen und Mitblogger Benjamin und Michi konnten leider auch nicht mitkommen.

Am Freitag Abend stand dann die After Party in einem typischen Irish Pub mit leider wenig typisch irischer, sondern vielmehr gewöhnungsbedürftiger Technomusik an. Nochmal eine gute Gelegenheit, neue Bekanntschaften zu vertiefen, mal Jan Lehnardt nach Studentenpreisen für die JSConf EU zu fragen (wird es auch in Zukunft nicht geben) und ein paar Bilder mit Daniel Shaw mit Pferdekopf zu schießen. Da mein Flug bereits am Samstagmorgen um 6.30 Uhr gehen sollte, hatte ich geplant, die letzte Nacht in Dublin durch zu machen und gar kein Zimmer mehr. So bin ich also nach der Party um 3 Uhr in den AirCoach gestiegen, zum Flughafen gefahren, hab mich über McDonald’s aufgeregt und noch ein kleines Nickerchen machen können, ehe ich ins sonnige Frankfurt zurückflog.

Alles in allem war es eine äußerst interessante Woche. Nachdem wenige Tage später mein Notebook kaputtging, begann ich nochmal darüber nachzudenken, ob es das Geld, was ich für die beiden Konferenztickets, Flug und Hostel in dieser Woche ausgegeben hatte, tatsächlich wert war… – und ja, absolut! Der ganze Tripp war an sich schon unglaublich aufregend, es hat Spaß gemacht, diese vielen enthusiastischen Leute kennen zu lernen; manche, die man bislang nur von Twitter kannte. Und dass eine solche Unternehmung als Student durchaus erschwinglich ist, werde ich auch mal in einem kommenden Beitrag hier exemplarisch vorrechnen. Liebe Kommilitonen: Nutzt die Chance, jetzt habt Ihr wahrscheinlich noch eher die Zeit dafür, als später im Berufsleben.

Die mit (NK) gezeichneten Bilder sind von Nico Kaiser (CC BY 2.0), den ich in Dublin kennengelernt habe. Weitere Impressionen von NodeDublin findet Ihr in seinem Flickr-Album.

Wie wird man guter Programmierer? – Metaphorisch formuliert.

Eben noch von @maxogden rumgesponnen, wenige Minuten später online: realtimecats.com

ChanCE Conflict: How to access broken Intel SSDs

After almost three years of very heavy use my old Intel X25-M G2 (SSDSA2M160G2GC) got broken four weeks ago. Since my laptop’s fan was very messy too, the SSD’s dead was merely a matter of time. Despite of this fact I did not make any backup for years (yeah, I know…), so the failure of the one and only harddrive in my laptop was not only bad as I couldn’t use the notebook any longer, but also by losing all my personal data of the last two years. While waiting for the surrogate computer I used the time to try to get the SSD running again, just to save everything that can be rescued.

When I tried to boot from my good old X25-M the harddrive was indeed recognized in the BIOS but in 95 percent of the attempts it was rejected as a not bootable device. Plugged in to another computer via a SATA-USB-connector the partition table was not recognized at all and the harddrive was listed with an overall capacity of 8 MB instead of its 160 GB. Under Ubuntu it was annotated with a “ChanCE Conflict”. The same error message was displayed in the notebook’s BIOS in the SSD’s Serial Number field. Unfortunately Google does not know much about this strange “ChanCE Conflict”: There is an unanswered thread in the Intel support forum and a great many people in other forums having exactly the same problem: their Intel SSDs are recognized with either only 8 MB capacity or 480 TB, but not accessable at all.

My first try was to update the SSD’s firmware. You can download a newer version from the Intel website. Simply burn the 5 MB ISO on a CD and boot from it. It recognizes your Intel SSD and will update its firmware even if you could not access it before. But be warned: I could boot my Ubuntu from the flashed SSD exactly one time (and not successfully at all as some critical files are broken)! After another reboot the ChanCE Conflict will appear again and the firmware update can not be run again as it’s up-to-date now.

But there’s another trick: Just set a HDD password in the BIOS. After a reboot you will be asked for the SSD password. Enter it and shutdown the PC immediately. In my case I was able to access now 90 percent of my files on another PC by using a SATA-USB-connector. It seems that one of the separate flash chips got broken so only some very frequent changed files could not be restored. Make sure to use some tool like ddrescue which saves the rescue process in a logfile as one has to repeat the mentioned steps of setting a HDD password multiple times.

datalove @ Open Data Barcamp Friedrichshafen

Am gestrigen Freitag machte sich ein kleiner Teil der datalove-Hochschulgruppe auf den Weg nach Friedrichshafen, um am 2. Open Data Barcamp der Bodenseeregion teilzunehmen. Leider gab es noch kurzfristig einige Absagen, sodass für Stefan, Timo und mich letztlich ein Drei-Mann-BaWü-Ticket reichte. Leider musste Veranstalter Prof. Dr. Jörn von Lucke auch aus anderen Regionen kurzfristige Absagen vermelden, sodass die Gruppe nur 15 Teilnehmer umfasste – die dafür aber umso intensiver das Thema Open Data anging.

Bodensee und Alpenblick

Am Friedrichshafener Stadtbahnhof zehn Minuten zum Umsteigen - also schnell raus zum Bodensee!

Wo "Container" drauf steht, ist auch Container drin. Direkt dahinter die nächste Überraschung: Ein kleiner Hangar.


Wir wurden für die Anreise am Mittag bereits in der Friedrichshafener Innenstadt mit einem tollen Alpenblick belohnt. Der Nebel hat sich auch noch mit der Zeit gelichtet. Leider haben wir erst erfahren, dass die ContainerUni, in der das Barcamp stattfand, auch eine Dachterrasse hat, als es schon dunkel war. Apropos ContainerUni: Wir waren alle begeistert, was man aus einem Provisorium machen kann. Anfangs noch etwas verwirrt (Baucontainer und ein “Hangar”?!), war das dann doch alles sehr einladend und erfrischend. Das Konzept überzeugt – und die Räume wirken sehr viel freundlicher als so ziemlich jeder fensterlose Hörsaal der Uni Ulm.

Ganz im Barcampstile wurden nach Begrüßungsworten und einer Vorstellungsrunde Themen gesammelt. Trotz der überschaubaren Runde fanden sich insgesamt acht Sessions, von denen die vier meistgewünschten dann ausgewählt wurden:

Den Anfang machte Jörn von Lucke mit anregenden Beispielen für Open Data und Partizipation aus der Bodenseeregion und ganz Baden-Württemberg. Besonders interessant war dabei sicher auch, dass die Open Data Initiative aus Friedrichshafen auch bis zu den österreichischen Nachbarn übergegriffen hat – und dort zum Teil schneller umgesetzt wird als im deutschen Vorbild. In dieser, wie aber auch den folgenden Sessions, wurde jedoch auch deutlich, dass die Offenlegung behördlicher und anderer Daten zwar im Interesse der Bürger, jedoch nicht immer in dem der Politiker ist.

Der zweite Block zu OpenSpending brachte dann noch eine weitere Erkenntnis:


Die reine Bereitstellung der Daten reicht nicht aus. Selbst wenn etwa Haushaltsdaten maschinenlesbar sind, muss dies noch nicht bedeuteten, dass sie auch leicht zu verarbeiten wären. Dieses Problem haben wir etwa auch in Ulm: Zwar liegen uns die Haushaltsdaten der Stadt vor, jedoch fehlen den Programmierern die betriebswirtschaftlichen Kenntnisse, um diese zu visualisieren, und den Verwaltungsspezialisten die Programmierkenntnisse. Spontan wurde die anschließende Pause genutzt, um die Daten mal gemeinsam, aus beiden Perspektiven, zu betrachten. Ziel wird es sein, den Austausch auch in Zukunft auszubauen und fachliche Spezialisten, die wissen, wie die Daten zu interpretieren sind, mit den Programmierern an einen Tisch zu bringen.

Dass es noch besser wäre, wenn die Daten nicht nur maschinenlesbar und unter offener Lizenz veröffentlicht, sondern gleich ansprechend visuell aufbereitet würden, unterstrich Julia Stoffregen am Beispiel von Kenia: In Sachen Open Government hat dieses Land den meisten eruopäischen Ländern einiges voraus und Open Data als wichtigen Teil der politischen Partizipation, aber auch als Wirtschaftsmotor entdeckt.


Wenn A und B sich in 15 Minuten treffen wollen - wo könnten sie das dank ÖPNV in Ulm tun?

Zum Abschluss stellte Stefan unsere Aktivitäten in Ulm vor und widmete sich dabei insbesondere seinem Lieblingsthema: dem Ulmer Nahverkehr. Ulm hat Friedrichshafen dabei einiges voraus: was die Offenheit der Stadtwerke in Sachen Fahrplandaten angeht, aber auch, wie gut die Stadt generell per ÖPNV erschlossen ist. Money quote: “Nachtbus in Friedrichshafen heißt, dass ausnahmsweise auch von 20 bis 22 Uhr etwas fährt.” (Oder so.)

Gegen 19 Uhr machten wir Ulmer uns dann wieder auf den Weg Richtung Bahnhof. Neben Einblicken in andere Regionen und Länder und etwas Buchhaltung haben wir auch noch mitgenommen, dass wir uns so langsam an die Planung einer Neuauflage des OpenCityCamps in unserer Donaustadt machen sollten. Wäre doch schön, wenn die Barcamps in Friedrichshafen und Ulm im Halbesjahresabstand zu festen größen im Open Data Terminkalender würden!

Using Prolog as an incremental CHR constraint store

The work with Constraint Handling Rules (CHR) has many advantages. One of them is the so called online property: It’s possible to execute your CHR program by giving some constraints in a first query, wait for the result (or not!) and add further constraints later at any time. So a CHR program normally does not terminate but rather halts if it can’t execute any rule with the constraints currently in the constraint store. And so it simply waits for new constraints. That’s why it is called incremental constraint store.

Working with Prolog as the host language, you will detect that it doesn’t work in this way: Once you entered your query of maybe multiple constraints, Prolog plays the constraint handler and applies your rules until it’s no longer possible. And stop. While the resulting constraint store is printed, you neither can add any new constraint nor manipulate this constraint store in any way. So the big advantage of the online property, which is recited mechanically in every CHR lesson, gets lost.

I’ve written Jon Sneyers, one of the developers of the K.U.Leuven CHR System used by SWI-Prolog, if he knows a way to use Prolog as an incremental CHR constraint store. And the solution is as simple as short: Because Prolog uses backtracking, it will turn to the point before the query was executed once all rules have been applied. That’s why it can not be used as an incremental constraint store without a simple trick: By writing an own prompt which takes the queries, we can prevent Prolog to backtrack. So the main idea is the following:

main :- prompt.

prompt :- write('[CHRstore] ?- '),
                read(Query),
                call(Query),
                prompt.

This will result in a loop which produces a self-defined prompt to get new queries without forgetting the old ones. But this very basic example has some disadvantages: First you can’t stop the loop. And second there is no way to show the current constraint store once you have added a new query. So we will modify the Prolog rules a little bit:

main :- prompt.

prompt :- write('[CHRstore] ?- '),
                read(Query),
                callq(Query).

callq(show_constraints) :- writeln('[CHRstore] Stored constraints:'),
                get_current_module(Mod),
                chr_show_store(Mod),
                prompt.
callq(stop_store) :- writeln('[CHRstore] Stopped.').
callq(Query) :- call(Query),
                prompt.

By adding a callq predicate we can provide two special queries: show_constraints and stop_store. While the latter one will break our prompt loop, the show_constraints calls the built-in chr_show_store/1 predicate to print the constraint store of the module Mod. To get the current module you can either add a fact at the top, use some built-in predicates or something else.

I’ve wrapped up these snippets in a little Prolog module, which can additionally handle multiple modules too.

XML-Dokumente per XSD 1.1 mit Apache Xerces-J validieren

Seit April diesen Jahres ist XML Schema in der Version 1.1 offizieller Standard des W3C. Nachdem die Version 1.0 noch aus dem Jahre 2004 datiert, wurde die letzten Jahre eifrig diskutiert, ehe der neue Standard nun endlich in Stein gemeißelt wurde.

Dumm nur: Wenngleich seit 2004 über die Änderungen von XSD 1.1 diskutiert wurde, gibt es auch jetzt, nach Veröffentlichung der W3C Recommendation, nur sehr wenige Tools, die die neuen Schema-Elemente wie <assert> und <alternative> unterstützen, die XML Schema sehr viel mächtiger werden lassen. Da ich für ein Projekt gerade an einem ziemlich umfangreichen Schema arbeite, wollte ich die Vorteile der neuen Version, insbesondere die beiden eben erwähnten Möglichkeiten der Assertions und Typalternativen, natürlich gleich nutzen. Und benötigte dementsprechend einen XML-Validator, der XSD 1.1 beherrscht.

Nach meiner Recherche gibt es aktuell nur zwei Programme, für die das zutrifft: SAXON (Enterprise Edition) und Apache Xerces. Die aktuellste Version vom <oXygen/> XML Developer kann laut Foren wohl auch mit XSD 1.1 umgehen, ist aber auch nicht ganz billig.
So entschied ich mich für Apache Xerces2 Java, eine Open-Source Implementierung in Java. Zwar setzt sie nur den XSD 1.1 Working Draft von 2009 um, bisher konnte ich aber keinen Verhaltensunterschied zum nun offiziellen Standard feststellen.

Die Installation ist zwar auf deren Seite beschrieben, ich fand sie allerdings nicht sehr intuitiv, daher hier ein paar Bemerkungen: Unter xerces.apache.org kann im unteren Abschnitt “Binary Distributions” die aktuelle Version von Xerces2 Java (XML Schema 1.1) (Beta) heruntergeladen werden. Darin findet sich mit /samples/jaxp/SourceValidator.java schon ein Kommandozeilenprogramm, über das das fröhliche Validieren beginnen könnte:

java jaxp.SourceValidator -xsd11 -a schema.xsd -i file.xml

Könnte – denn am Anfang wird vermutlich eine Fehlermeldung wie Parse error occurred - No SchemaFactory that implements the schema language specified by: http://www.w3.org/XML/XMLSchema/v1.1 could be loaded den erfolglosen Versuch quittieren. Klar, irgendwie müssen die Xerces-Daten ja noch ihre Verwendung finden. Die Xerces-FAQ schreiben nur wenig hilfreich:

Use the Endorsed Standards Override Mechanism. Place the xalan.jar, serializer.jar, xercesImpl.jar and xml-apis.jar in the\lib\endorsed directory, whereis where the runtime software is installed.

Okay, was ist also zu tun? – Zu allererst benötigen wir den Java-Pfad. Unter Ubuntu ist das bei mir /usr/lib/jvm/{java-version}/jre, bei mehreren Java-Installationen findet man mittels java -version die richtige. Im Unterordner lib können wir nun den Ordner endorsed anlegen, wenn er noch nicht existiert. Dort packen wir die Dateien xml-apis.jar, xercesImpl.jar, icu4j.jar, cupv10k-runtime.jar, org.eclipse.wst.xml.xpath2.processor_1.1.0.jar aus dem Xerces Download hinein. Jetzt fällt auf, wer am Anfang fälschlicherweise doch die “Source Distribution” heruntergeladen hat, da sind die nämlich nicht dabei.

Sind die Dateien im endorsed Ordner hinterlegt, greift Java direkt darauf zurück. Der obige Aufruf des SourceValidators.java sollte nun also keinen Fehler mehr werfen und die XML-Datei wie gewünscht nach dem neuen XSD 1.1 Standard validieren.

Übrigens: Die im endorsed Ordner hinterlegten Jars können natürlich wieder zu Problemen mit anderen Programmen führen. Ich habe mir daher einfach in der ~/.bash_aliases zwei Aliases angelegt:

alias endorsed-off="sudo mv /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/endorsed/ /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/old_endorsed"
alias endorsed-on="sudo mv /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/old_endorsed/ /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/endorsed"

OpenWrt im Heimnetzwerk

 

Vergangene Nacht dachte ich mir, ich könnte mich vor dem Schlafengehen noch schnell ein bisschen über OpenWrt informieren. Mir ist bereits seit längerer Zeit die Existenz des freien Router-Betriebssystems bekannt; bisher traute ich mich aber noch nicht so wirklich, die Firmware meines Heim-Routers zu verändern. Diese Angst stellte sich jedoch als vollkommen unbegründet heraus, denn innerhalb von weniger als zwei Stunden hatte ich ein lauffähiges Netzwerk mit zwei Routern, Anschluss an meinen Internetprovider, NAT, WLAN und einigen einfachen statischen Routen konfiguriert. Und das, obwohl ich mich zuvor noch überhaupt nicht mit OpenWrt beschäftigt hatte.

Seit einigen Wochen gibt es in meiner WG mehrere TP-Link TL-WR1043ND Router, wovon bisher einer für das gesamte Netzwerk der Wohnung zuständig war und dafür die mitgelieferte proprietäre Firmware verwendete. Ich hatte auch schon früher versucht mit diesem Setup IPv6 im Heimnetzwerk zu konfigurieren. Das ist allerdings mit der Firmware von TP-Link nicht möglich. Auch weitere Features, wie z.B. ein eingebauter DNS-Server, fehlten mir im bisherigen Netzwerk.

Die Installation von OpenWrt war kinderleicht. Ich hatte allerdings auch das Glück, dass dieser Router ausgezeichnet von OpenWrt unterstützt wird. Ich musste mir lediglich die entsprechende Binary herunterladen, wie es auf der Wiki-Seite zum Router beschrieben ist und konnte diese ganz einfach über das Webinterface der bisherigen Firmware installieren. Anschließend konnte ich mich über telnet am Router anmelden und ein root-Passwort setzen. Ab dann ging die Anmeldung nur noch über eine SSH Verbindung.

Man muss den Router aber nicht unbedingt über die Kommandozeile konfigurieren; In meinem Fall war bereits eine Weboberfläche zur Administration installiert. Die Standard Einstellungen sind meiner Meinung nach recht gut gewählt. Man sollte allerdings unbedingt abschalten, dass man sich über das WAN-Interface (also das Interface, welches ins Internet geht) am Router anmelden kann. Außer natürlich, man braucht diese Funktionalität.

The Importance of Open Source

Some time ago, Phil – who was recently interviewed by Michael – and I were asked to write a short statement about Open Source Software for the Charité NeuroScience Newsletter. The newsletter of June 2012 focuses on the topic of Open Access, which is strongly related to the idea of Open Source.

Open source is not about giving away software for free, but about freedom and progress. The freedom to use software for any purpose increases productivity immensely, while severe restrictions strongly curtail any such ambitions. Limiting the use of software also limits its potential, whereas lifting the restrictions allows people to experiment and encourages creativity.

With access to the source, it is possible to study, learn from, reuse and improve upon code without spending valuable time reinventing the wheel. As a side effect, open source often leads to higher quality software through the contribution of more people with a varied skill set.

Open source is about sharing knowledge; a concept our civilization would not have reached its current level of technology without. The freedom to publish a project incorporating parts of other open source projects encourages the formation of a cycle of give and take, which constitutes a crucial contribution to progress.

As an example, the World Wide Web as we know it, consists almost entirely of servers running open source software, enabling people to communicate and share information easily, quickly, and securely over the entire globe.

Open source software plays a significant role in many fields, improves the lives of many people and is a driving force behind technological and scientific advancement.

mplayer configuration for OpenBSD

I had some issues with getting smooth video playback on my X220. I always ran into flickering, slow output or audio/video synchronization issues. Since I couldn’t find any fitting configurations and since VLC didn’t play things smoothly either, it makes sense to publish a working config with which I came up after investing some time. So this is my ~/.mplayer/config:

framedrop=1
vo=x11
cache=32768
cache-min=99
cache-seek-min=99

For a detailed explanation look through the man-page. Basically mplayer fills a 32M cache before starting playback, uses X11 as the video ouput driver, and skips frames in favor of a/v synchronization.

On another Thinkpad, a T510, mplayer -cache 32768 -cache-min 99 -cache-seek-min 99 -vo gl:swapinterval=0 -lavdopts skiploopfilter=all -vfm ffmpeg worked best.

In my case, I additionally run $ apm -H before starting the video. On my system videos play a lot smoother when apm runs in high performance mode.

ioexception.de

Benjamin Erb [] studiert seit 2006 Medieninformatik und interessiert sich insbesondere für Java, Web-Technologien, Ubiquitous Computing, Cloud Computing, verteilte Systeme und Informationsdesign.


Raimar Wagner studiert seit 2005 Informatik mit Anwendungsfach Medizin und interessiert sich für C++ stl, boost & Qt Programmierung, Scientific Visualization, Computer Vision und parallele Rechenkonzepte.


David Langer studiert seit 2006 Medieninformatik und interessiert sich für Web-Entwicklung, jQuery, Business Process Management und Java.


Sebastian Schimmel studiert seit 2006 Informatik mit Anwendungsfach Medizin und interessiert sich für hardwarenahe Aspekte, Robotik, webOs, C/C++ und UNIX/Linux.


Timo Müller studiert seit 2006 Medieninformatik. Er interessiert sich allen voran für Mobile and Ubiquitous Computing, systemnahe Enwticklung und verteilte Systeme, sowie Computer Vision.


Achim Strauß studiert seit 2006 Medieninformatik. Seine Interessen liegen in Themen der Mensch-Computer Interaktion sowie Webentwicklung und UNIX/Linux.


Tobias Schlecht studiert seit 2006 Medieninformatik und interessiert sich vor allem für Software Engineering, Model Driven Architecture, Requirements Engineering, Usability Engineering, Web-Technologien, UML2 und Java.


Fabian Groh studiert seit 2006 Medieninformatik. Seine Interessengebiete sind Computer Graphics, Computer Vision, Computational Photography sowie Ubiquitos Computing.


Matthias Matousek studiert seit 2007 Medieninformatik und interessiert sich besonders für Skriptsprachen, Echtzeitsysteme und Kommunikation.


Michael Müller [] studiert seit 2009 Medieninformatik. Er interessiert sich vor allem für Web-Technologien, Ubiquitous Computing, User-Interfaces, UNIX und Creative Coding.


Falco Nogatz [] studiert seit 2010 Informatik mit Anwendungsfach Mathematik. Er interessiert sich für Web-Technologien, Programmierparadigmen und theoretische Grundlagen.

Archiv

Februar 2015
M D M D F S S
« Mrz    
 1
2345678
9101112131415
16171819202122
232425262728