<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dominik Goltermann</title>
	<atom:link href="http://goltermann.cc/feed/" rel="self" type="application/rss+xml" />
	<link>http://goltermann.cc</link>
	<description>Web Development</description>
	<lastBuildDate>Sat, 19 Nov 2011 14:02:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Android: Accessing Wifi even in Standby using WakeLock, WifiLock, Alarmmanager and Services</title>
		<link>http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/</link>
		<comments>http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 11:24:52 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mobile Device Software]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=805</guid>
		<description><![CDATA[I wrote a little App to switch my phone in silent mode automatically as soon as a specific Wifi Network comes in range. I had some problems with using the wireless after the phone was gone into standby. Here is what I did and how to solve the problems I had with the standby mode.
My [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">I wrote a little App to switch my phone in silent mode automatically as soon as a specific Wifi Network comes in range. I had some problems with using the wireless after the phone was gone into standby. Here is what I did and how to solve the problems I had with the standby mode.</p>
<p style="text-align: left;">My first attempt to do this was to register a BroadcastReceiver that listens on WifiManager.SCAN_RESULTS_AVAILABLE_ACTION Events. This event is fired as soon as the Android OS completes a Wlan scan, which is done approximately every ten to twenty seconds. The program than checks whether a certain SSID is in the results and silences the phone if it is the case. Here is the short version of the code:</p>
<pre class="brush: java;">
public class WifiStateReciever extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// Proceed only if received action is a wlan scan result
		if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {

			// get List of networks in reach
			WifiManager connManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
			List&lt;ScanResult&gt; scanResults = connManager.getScanResults();

			// get list of silenced networks from preferences
			for(int i=0;i&lt;scanResults.size();i++) {
				// if network is in in preferences and is checked then silence the phone
				if( ... certain network is this network ...) {
					mAudio.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
					return;
				}
			}
		}
	}
}
</pre>
<p style="text-align: left;">Here is the corresponding manifest entry:</p>
<pre class="brush: xml;">
&lt;receiver android:name=&quot;WifiStateReciever&quot;&gt;
	&lt;intent-filter&gt;
		&lt;action android:name=&quot;android.net.wifi.SCAN_RESULTS&quot;&gt;&lt;/action&gt;
	&lt;/intent-filter&gt;
&lt;/receiver&gt;
</pre>
<h2>Problem:</h2>
<p style="text-align: left;">The problem with this is that it stops working as soon as the phone goes into standby. My phone goes into standby 15 minutes after turning off the screen. CPU and Wifi is stopped during standby, only GSM is operating for incoming calls and a few other things. So my phone will not notice any new wireless network and hence not go into silent mode. So this way my app is missing the point.</p>
<h2 style="text-align: left;">Solution 1:</h2>
<p style="text-align: left;">Fortunately there are ways to make this work. The simplest one is to prevent the phone from going into standby. <strong>(DO NOT DO THIS! Read on to see why and see the correct version below)</strong> This can be achieved using WakeLock and WifiLock. A WakeLock prevents the CPU, A WifiLock the Wlan from going into standby until they are released. Both are needed to get scan results from the phone all the time, even when it would be in standby. To hold these locks all the time you can use a service that is created as soon as the phone boots, acquire the locks in the onCreate() method and only release them in the onDestroy() method (the latter should only occur if the phone shuts down)</p>
<pre class="brush: java;">
public class StartupReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Intent serviceIntent = new Intent();
		serviceIntent.setAction(&quot;de.goltergaul.wlanSilence.WlanLockService&quot;);
		context.startService(serviceIntent);
	}

}

public class WlanLockService extends Service {

	private WifiLock wifiLock;
	private WakeLock wakeLock;

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();

		WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
		wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL , &quot;MyWifiLock&quot;);
		wifiLock.acquire();

		PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
		wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, &quot;My Lock&quot;);
		wakeLock.acquire();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();

		wifiLock.release();
		wakeLock.release();
	}
}
</pre>
<p style="text-align: left;">Here is the corresponding manifest entry:</p>
<pre class="brush: xml;">
&lt;receiver android:name=&quot;StartupReceiver&quot;&gt;
	&lt;intent-filter&gt;
		&lt;action android:name=&quot;android.intent.action.BOOT_COMPLETED&quot; /&gt;
		&lt;category android:name=&quot;android.intent.category.HOME&quot; /&gt;
	&lt;/intent-filter&gt;
&lt;/receiver&gt;
&lt;service android:name=&quot;WlanLockService&quot;&gt;
	&lt;intent-filter&gt;
		&lt;action android:name=&quot;de.goltergaul.wlanSilence.WlanLockService&quot; /&gt;
	&lt;/intent-filter&gt;
&lt;/service&gt;
</pre>
<p style="text-align: left;">The downside of this approach is that it consumes a huge amount of extra energy because you eliminate the standby mode completely.<a href="http://blog.goltergaul.de/wp-content/uploads/2011/11/screenshot-1320755332329.png"><img class="size-full wp-image-812  alignright" title="screenshot-1320755332329" src="http://blog.goltergaul.de/wp-content/uploads/2011/11/screenshot-1320755332329.png" alt="screenshot-1320755332329" width="192" height="288" /></a> The figure on the right is showing the energy consumption of all processes. WlanSilncer is the application preventing the standby mode. <strong>Therefore this is not the way to do it!</strong></p>
<h2 style="text-align: left;">Solution 2:</h2>
<p>The second option is to use the Android AlarmManager. That is a service that can wake up the phone after a certain period of time, execute an PendingIntent (A block of code) and then go to sleep again. This way the the phone can go into standby and just wakes up to scan for new wireless networks and goes to sleep again right after that. This way is much more energy efficient. To implement this I wrote another BroadcastReceiver which receives events from the AlarmManager:</p>
<pre class="brush: java;">
public class WlanScanner extends BroadcastReceiver {

	private AlarmManager alarmMgr;
	private PendingIntent pendingIntent;

	private static WifiLock wifiLock;
	private static WakeLock wakeLock;

	public static void lock() {
		try {
			wakeLock.acquire();
			wifiLock.acquire();
		} catch(Exception e) {
			Log.e(&quot;WlanSilencer&quot;, &quot;Error getting Lock: &quot;+e.getMessage());
		}
	}

	public static void unlock() {
		if(wakeLock.isHeld())
			wakeLock.release();
		if(wifiLock.isHeld())
			wifiLock.release();
	}

	public WlanScanner() {} // called by the AlarmManager

	// this constructor is invoked by WlanLockService (see next code snippet)
	public WlanScanner(Context context, int timeoutInSeconds){

		// initialise the locks
		wifiLock = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE))
						.createWifiLock(WifiManager.WIFI_MODE_SCAN_ONLY , &quot;WlanSilencerScanLock&quot;);
		wakeLock = ((PowerManager) context.getSystemService(Context.POWER_SERVICE))
						.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, &quot;WlanSilencerWakeLock&quot;);

        	alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

		// use this class as the receiver
        	Intent intent = new Intent(context, WlanScanner.class);
        	// create a PendingIntent that can be passed to the AlarmManager
        	pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        	// create a repeating alarm, that goes of every x seconds
        	// AlarmManager.ELAPSED_REALTIME_WAKEUP = wakes up the cpu only
       		alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), timeoutInSeconds*1000, pendingIntent);
	}

	// stop the repeating alarm
	public void stop() {
		alarmMgr.cancel(pendingIntent);
	}

	@Override
	public void onReceive(Context context, Intent arg1) {
		Log.v(&quot;WlanSilencer&quot;, &quot;Alarm received&quot;);
		WifiManager connManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
		if(connManager.isWifiEnabled()) {
			lock(); // lock wakeLock and wifiLock, then scan.
			// unlock() is then called at the end of the onReceive function of WifiStateReciever
			connManager.startScan();
		}
	}

}
</pre>
<pre class="brush: java;">
public class WlanLockService extends Service {

	private WlanScanner scanner;

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		scanner = new WlanScanner(this, 60);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();

		scanner.stop();
		scanner = null;
	}
}
</pre>
<h2>Summary:</h2>
<p>The code has to do this in the right order:</p>
<ol>
<li>After the device booted the WlanLockService has to be started</li>
<li>The WlanLockService has to initialize WlanScanner which sets a repeated Alarm using the AlarmManager</li>
<li>Once the alarm is received a WakeLock and a WifiLock should be acquired</li>
<li>A wlan scan can now be requested</li>
<li>The wlan scan result event is received and processed</li>
<li>Release the WakeLock and WifiLock</li>
</ol>
<div style="display: none; position: fixed; max-height: 4127px; width: 450px; padding: 3px; border-radius: 0px 0px 0px 5px; background-color: #ffffff; overflow: auto; min-height: 200px; z-index: 2147479999; text-align: center; color: #000000; right: 0px; top: 0px;"><textarea style="height: 80px; width: 444px; border: 1px solid grey; padding: 2px;"></textarea></p>
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option selected="selected" value="auto">Detect language</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<p><span style="font-weight: bold; cursor: pointer; color: lightgrey;">⇄</span></p>
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option selected="selected" value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<div style="text-align: left; background-color: #ebeff9;">Detect language » German</div>
</div>
<div style="display: none; position: fixed; max-height: 4127px; width: 450px; padding: 3px; border-radius: 0px 0px 0px 5px; background-color: #ffffff; overflow: auto; min-height: 200px; z-index: 2147479999; text-align: center; color: #000000; right: 0px; top: 0px; border: 0px 0px 2px 2px dashed grey;"><textarea style="height: 80px; width: 444px; border: 1px solid grey; padding: 2px;"></textarea><br />
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option selected="selected" value="auto">Detect language</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<p><span style="font-weight: bold; cursor: pointer; color: lightgrey;">⇄</span><br />
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option selected="selected" value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<div style="text-align: left; background-color: #ebeff9;">Detect language » German</div>
<div style="width: 444px; max-width: 444px; padding: 2px; min-height: 80px; background-color: #ffffff; text-align: justify; border: 1px solid grey;"></div>
</div>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/&amp;title=Android%3A+Accessing+Wifi+even+in+Standby+using+WakeLock%2C+WifiLock%2C+Alarmmanager+and+Services" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/&amp;t=Android%3A+Accessing+Wifi+even+in+Standby+using+WakeLock%2C+WifiLock%2C+Alarmmanager+and+Services" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/&amp;t=Android%3A+Accessing+Wifi+even+in+Standby+using+WakeLock%2C+WifiLock%2C+Alarmmanager+and+Services" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=Android%3A+Accessing+Wifi+even+in+Standby+using+WakeLock%2C+WifiLock%2C+Alarmmanager+a%5B..%5D+-+http://bit.ly/tkn1Yu+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=Android%3A+Accessing+Wifi+even+in+Standby+using+WakeLock%2C+WifiLock%2C+Alarmmanager+and+Services&amp;link=http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/&amp;title=Android%3A+Accessing+Wifi+even+in+Standby+using+WakeLock%2C+WifiLock%2C+Alarmmanager+and+Services" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=Android%3A+Accessing+Wifi+even+in+Standby+using+WakeLock%2C+WifiLock%2C+Alarmmanager+and+Services&amp;url=http%3A%2F%2Fgoltermann.cc%2F2011%2F11%2Fandroid-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services%2F&amp;desc=I%20wrote%20a%20little%20App%20to%20switch%20my%20phone%20in%20silent%20mode%20automatically%20as%20soon%20as%20a%20specific%20Wifi%20Network%20comes%20in%20range.%20I%20had%20some%20problems%20with%20using%20the%20wireless%20after%20the%20phone%20was%20gone%20into%20standby.%20Here%20is%20what%20I%20did%20and%20how%20to%20solve%20the%20problems%20I%20had%20with%20the%20standby%20mode.%0D%0AMy%20first%20attempt%20t&amp;pcat=Technology&amp;tags=" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/&amp;title=Android%3A+Accessing+Wifi+even+in+Standby+using+WakeLock%2C+WifiLock%2C+Alarmmanager+and+Services" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/&amp;submitHeadline=Android%3A+Accessing+Wifi+even+in+Standby+using+WakeLock%2C+WifiLock%2C+Alarmmanager+and+Services&amp;submitSummary=I%20wrote%20a%20little%20App%20to%20switch%20my%20phone%20in%20silent%20mode%20automatically%20as%20soon%20as%20a%20specific%20Wifi%20Network%20comes%20in%20range.%20I%20had%20some%20problems%20with%20using%20the%20wireless%20after%20the%20phone%20was%20gone%20into%20standby.%20Here%20is%20what%20I%20did%20and%20how%20to%20solve%20the%20problems%20I%20had%20with%20the%20standby%20mode.%0D%0AMy%20first%20attempt%20t&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2011/11/android-accessing-wifi-even-in-standby-using-wakelock-wifilock-alarmmanager-and-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android app that silences your phone if a certain network is available</title>
		<link>http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/</link>
		<comments>http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 17:41:37 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=797</guid>
		<description><![CDATA[Because I always forget to turn my smartphone silent I decided to write an app to help me out   It intercepts system events via a BroadcastReceiver, in this case the android.net.wifi.SCAN_RESULTS events. If a network with a SSID specified in the applications settings screen appears in range, the app sets the ring tone [...]]]></description>
			<content:encoded><![CDATA[<p>Because I always forget to turn my smartphone silent I decided to write an app to help me out <img src='http://goltermann.cc/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  It intercepts system events via a <a href="http://developer.android.com/reference/android/content/BroadcastReceiver.html">BroadcastReceiver</a>, in this case the android.net.wifi.SCAN_RESULTS events. If a network with a SSID specified in the applications settings screen appears in range, the app sets the ring tone to vibrate.</p>
<p>You can download the app <a href="/downloads/WlanSilencer.apk">here</a> if you like. It&#8217;s not available through the app store.</p>
<p style="text-align: center;"><a href="http://blog.goltergaul.de/wp-content/uploads/2011/10/screenshot-1319477032882.png"><img class="aligncenter size-full wp-image-800" title="screenshot-1319477032882" src="http://blog.goltergaul.de/wp-content/uploads/2011/10/screenshot-1319477032882.png" alt="screenshot-1319477032882" width="192" height="288" /></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/10/screenshot-1319477092600.png"><img class="aligncenter size-full wp-image-802" title="screenshot-1319477092600" src="http://blog.goltergaul.de/wp-content/uploads/2011/10/screenshot-1319477092600.png" alt="screenshot-1319477092600" width="192" height="288" /></a></p>
<div style="position: fixed; display: none; z-index: 2147480000; background-color: #ffff99; padding: 4px; color: #000000; border-radius: 7px 7px 7px 7px; font-size: 12px; max-width: 400px; font-family: 'Trebuchet MS',Helvetica,sans-serif; line-height: 100%; text-align: left; opacity: 1; top: 27.8px; left: 154.8px; border: 1px none #000000;">hier<br />
<strong>Adverb</strong> <em>hier,da,hierher,her,hierhin,dahin</em></div>
<div style="display: none; position: fixed; max-height: 35px; width: 450px; padding: 3px; border-radius: 0px 0px 0px 5px; background-color: #ffffff; overflow: auto; min-height: 200px; z-index: 2147479999; text-align: center; color: #000000; right: 0px; top: 0px;"><textarea style="height: 80px; width: 444px; border: 1px solid grey; padding: 2px;"></textarea></p>
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option selected="selected" value="auto">Detect language</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<p><span style="font-weight: bold; cursor: pointer; color: lightgrey;">⇄</span></p>
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option selected="selected" value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<div style="text-align: left; background-color: #ebeff9;">Detect language » German</div>
</div>
<div style="display: none; position: fixed; max-height: 412px; width: 450px; padding: 3px; border-radius: 0px 0px 0px 5px; background-color: #ffffff; overflow: auto; min-height: 200px; z-index: 2147479999; text-align: center; color: #000000; right: 0px; top: 0px;"><textarea style="height: 80px; width: 444px; border: 1px solid grey; padding: 2px;"></textarea></p>
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option selected="selected" value="auto">Detect language</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<p><span style="font-weight: bold; cursor: pointer; color: lightgrey;">⇄</span></p>
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option selected="selected" value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<div style="text-align: left; background-color: #ebeff9;">Detect language » German</div>
</div>
<div style="display: none; position: fixed; max-height: 412px; width: 450px; padding: 3px; border-radius: 0px 0px 0px 5px; background-color: #ffffff; overflow: auto; min-height: 200px; z-index: 2147479999; text-align: center; color: #000000; right: 0px; top: 0px; border: 0px 0px 2px 2px dashed grey;"><textarea style="height: 80px; width: 444px; border: 1px solid grey; padding: 2px;"></textarea><br />
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option selected="selected" value="auto">Detect language</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<p><span style="font-weight: bold; cursor: pointer; color: lightgrey;">⇄</span><br />
<select><option value="af">Afrikaans</option><option value="sq">Albanian</option><option value="ar">Arabic</option><option value="hy">Armenian</option><option value="az">Azerbaijani</option><option value="eu">Basque</option><option value="be">Belarusian</option><option value="bg">Bulgarian</option><option value="ca">Catalan</option><option value="zh-CN">Chinese (Simplified)</option><option value="zh-TW">Chinese (Traditional)</option><option value="hr">Croatian</option><option value="cs">Czech</option><option value="da">Danish</option><option value="nl">Dutch</option><option value="en">English</option><option value="et">Estonian</option><option value="tl">Filipino</option><option value="fi">Finnish</option><option value="fr">French</option><option value="gl">Galician</option><option value="ka">Georgian</option><option selected="selected" value="de">German</option><option value="el">Greek</option><option value="ht">Haitian Creole</option><option value="iw">Hebrew</option><option value="hi">Hindi</option><option value="hu">Hungarian</option><option value="is">Icelandic</option><option value="id">Indonesian</option><option value="ga">Irish</option><option value="it">Italian</option><option value="ja">Japanese</option><option value="ko">Korean</option><option value="la">Latin</option><option value="lv">Latvian</option><option value="lt">Lithuanian</option><option value="mk">Macedonian</option><option value="ms">Malay</option><option value="mt">Maltese</option><option value="no">Norwegian</option><option value="fa">Persian</option><option value="pl">Polish</option><option value="pt">Portuguese</option><option value="ro">Romanian</option><option value="ru">Russian</option><option value="sr">Serbian</option><option value="sk">Slovak</option><option value="sl">Slovenian</option><option value="es">Spanish</option><option value="sw">Swahili</option><option value="sv">Swedish</option><option value="th">Thai</option><option value="tr">Turkish</option><option value="uk">Ukrainian</option><option value="ur">Urdu</option><option value="vi">Vietnamese</option><option value="cy">Welsh</option><option value="yi">Yiddish</option></select>
<div style="text-align: left; background-color: #ebeff9;">Detect language » German</div>
<div style="width: 444px; max-width: 444px; padding: 2px; min-height: 80px; background-color: #ffffff; text-align: justify; border: 1px solid grey;"></div>
</div>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/&amp;title=Android+app+that+silences+your+phone+if+a+certain+network+is+available" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/&amp;t=Android+app+that+silences+your+phone+if+a+certain+network+is+available" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/&amp;t=Android+app+that+silences+your+phone+if+a+certain+network+is+available" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=Android+app+that+silences+your+phone+if+a+certain+network+is+available+-+http://bit.ly/vjD02i+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=Android+app+that+silences+your+phone+if+a+certain+network+is+available&amp;link=http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/&amp;title=Android+app+that+silences+your+phone+if+a+certain+network+is+available" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=Android+app+that+silences+your+phone+if+a+certain+network+is+available&amp;url=http%3A%2F%2Fgoltermann.cc%2F2011%2F10%2Fandroid-app-that-silences-your-phone-if-a-certain-network-is-available%2F&amp;desc=Because%20I%20always%20forget%20to%20turn%20my%20smartphone%20silent%20I%20decided%20to%20write%20an%20app%20to%20help%20me%20out%20%3A%29%20It%20intercepts%20system%20events%20via%20a%20BroadcastReceiver%2C%20in%20this%20case%20the%20android.net.wifi.SCAN_RESULTS%20events.%20If%20a%20network%20with%20a%20SSID%20specified%20in%20the%20applications%20settings%20screen%20appears%20in%20range%2C%20the%20ap&amp;pcat=Technology&amp;tags=dominik goltermann" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/&amp;title=Android+app+that+silences+your+phone+if+a+certain+network+is+available" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/&amp;submitHeadline=Android+app+that+silences+your+phone+if+a+certain+network+is+available&amp;submitSummary=Because%20I%20always%20forget%20to%20turn%20my%20smartphone%20silent%20I%20decided%20to%20write%20an%20app%20to%20help%20me%20out%20%3A%29%20It%20intercepts%20system%20events%20via%20a%20BroadcastReceiver%2C%20in%20this%20case%20the%20android.net.wifi.SCAN_RESULTS%20events.%20If%20a%20network%20with%20a%20SSID%20specified%20in%20the%20applications%20settings%20screen%20appears%20in%20range%2C%20the%20ap&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2011/10/android-app-that-silences-your-phone-if-a-certain-network-is-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building widgets for multi-page applications with JavaScriptMVC</title>
		<link>http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/</link>
		<comments>http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 00:50:54 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Useful things]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Dominik Goltermann]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=768</guid>
		<description><![CDATA[In my bachelor project, an online portfolio for our university, we used the JavaScriptMVC framework to facilitate the implementation of various JavaScript widgets, e.g. image cropping, file upload, file sorting, project filtering, ui enhancements etc. You can read more about this project in this article.
Usually JavaScript MVC Frameworks are used to build desktop like single [...]]]></description>
			<content:encoded><![CDATA[<p>In my bachelor project, an online <a href="http://portfolio.mediacube.at">portfolio</a> for our university, we used the <a href="http://javascriptmvc.com">JavaScriptMVC </a>framework to facilitate the implementation of various JavaScript widgets, e.g. image cropping, file upload, file sorting, project filtering, ui enhancements etc. You can read more about this project in this <a href="http://blog.goltergaul.de/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/">article</a>.</p>
<p>Usually JavaScript MVC Frameworks are used to build desktop like single page applications. Single page applications are referred to as websites where all the content is available without reloading the page &#8211; every content is pulled in by AJAX and modifications to data are sent back to the server the same way. This is where models come in handy. But in our case we have a normal website with many different pages. We only use JavaScript to sort some lists or to have a interactive filter menu. In this article i will explain how we used the JavaScriptMVC Framework to realize this.</p>
<p><span id="more-768"></span>First of all, JavaScriptMVC is based on jQuery. This means it only works with jQuery. The advantage is, it is integrated in it&#8217;s functionalities. You&#8217;ll see why this is handy. It also ships with a integrated testsuite where one can write unittests etc. and an dependency solver called Steal. Steal can be used to require other JavaScript files which helps to easily organize your JavaScript code into as many files as you like. These files can later be compiled into one production file using the google closure compiler.</p>
<p>Because we have a multi page application, we only need parts of the framework, which is not a problem, because we can select only the parts of the framework that we really use. Only these parts are compiled into the production code, which is great <img src='http://goltermann.cc/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  We decided to use the controllers for our widgets. Such a controller can be mounted on a DOM element and then control everything that happens inside that element and its children. The following code shows a simple example of such a controller. (The JavaScriptMVC documentation can be found <a href="http://javascriptmvc.com/docs.html">here</a>)</p>
<pre class="brush: jscript;">
$.Controller(&quot;Portfolio.Project&quot;, {
  init : function(el, options) {
    // do some stuff on initialisation
  },

  // this gets called when the child element with the id &quot;read_more_link&quot; is clicked
  &quot;#read_more_link click&quot;: function(el, ev) {
    ev.preventDefault();
    // this.element is the element this controller is mounted on
    this.element.find(&quot;.long_description&quot;).show();
    this.element.find(&quot;.short_description&quot;).hide();
  }
});
</pre>
<p>The controller can then be mounted on a HTML element and it&#8217;s init() function gets called:</p>
<pre class="brush: jscript;">
$(&quot;#project&quot;).portfolio_project();
</pre>
<p>This way widgets can be programmed easily <img src='http://goltermann.cc/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  To require this controller on application load, we require it in our main JavaScript file (portfolio.js) using Steal:</p>
<pre class="brush: jscript;">
steal('../jquery/jquery')
  .plugins('jquery/dom/cookie','jquery/controller','portfolio/project', 'portfolio/other_widtgets...'');
</pre>
<p>Using the steal() function, you can require any JavaScript file you like. plugins() loads our widgets and parts of the framework like cookie support and the controller base class. In order for our widget to be found by Steal, it has to be in the right folders and follow the naming conventions for plugins. We used the following folder structure:</p>
<pre>- public
  |-javascripts
     |-jquery &lt;&lt; framework code
     |-steal &lt;&lt; steal code
     |-portfolio
       |-profile
       | |- profile.js &lt;&lt; profile widget
       |- portfolio.js &lt;&lt; main File</pre>
<p>This way the file profile.js in the profile folder is found by steal. To load the main file, the following code has to be included in the application layout:</p>
<pre class="brush: xml;">

Production mode:

&lt;script type='text/javascript' src='/javascripts/steal/steal.production.js?portfolio'&gt;&lt;/script&gt;

Development mode:

&lt;script type='text/javascript' src='/javascripts/steal/steal.js?portfolio,development'&gt;&lt;/script&gt;
</pre>
<p>In development mode all required files are synchronously loaded by Ajax, in production mode only one compressed JavaScript file is loaded.</p>
<p>Additional Steal requires can be put in any file you want. For example in a controller that needs JavaScript Views:</p>
<pre class="brush: jscript;">
steal.plugins('jquery/view/ejs', 'jquery/view').then(function() {
    $.Controller(&quot;Portfolio.Person&quot;, {
        init : function(el, options) {
            ...
        },

        addPersonRow: function(json) {
            this.element.find(&quot;.persons&quot;).append(&quot;person_template&quot;, json);
        }
    });
});
</pre>
<p>First &#8216;jquery/view/ejs&#8217; and &#8216;jquery/view&#8217; are required by Steal and then, when these dependencies are loaded, the controller code inside the then() function is executed.<br />
The addPersonRow() function in this example uses a view to generate HTML and appends it to the DOM. As you can see views are directly built into the jQuery append function (and others) which is very handy. A View is a piece of HTML code, that is included in the HTML that is generated by the server side application. This way styling and the HTML stucture are seperated from JavaScript, which is really good. The append() function now gets passed two parameters: The template id and a object containing the values that are used in the view. &lt;%=something%&gt; prints a value whereas any javascript code can be included in views when placed between &lt;% (javascript here) %&gt;:</p>
<pre class="brush: xml;">
&lt;script id=&quot;person_template&quot; type=&quot;text/ejs&quot;&gt;
  &lt;tr class=&quot;person&quot; id=&quot;sort_&lt;%=person.id%&gt;&quot;&gt;
    &lt;td&gt;
      ...
    &lt;/td&gt;
    &lt;td&gt;
      Hello &lt;%=person.name%&gt;
    &lt;/td&gt;
  &lt;/tr&gt;
&lt;/script&gt;
</pre>
<p>So $(&#8221;#some_element&#8221;).append(&#8221;person_template&#8221;, { person: { id: 1, name: &#8216;Jack&#8217; } }); will generate the following HTML and append it to #some_element:</p>
<pre class="brush: xml;">
  &lt;tr class=&quot;person&quot; id=&quot;sort_1&quot;&gt;
    &lt;td&gt;
      ...
    &lt;/td&gt;
    &lt;td&gt;
      Hello Jack
    &lt;/td&gt;
  &lt;/tr&gt;
</pre>
<p>I hope this gave you a quick overview on how JavaScriptMVC can be used on a multi page apllication <img src='http://goltermann.cc/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/&amp;title=Building+widgets+for+multi-page+applications+with+JavaScriptMVC" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/&amp;t=Building+widgets+for+multi-page+applications+with+JavaScriptMVC" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/&amp;t=Building+widgets+for+multi-page+applications+with+JavaScriptMVC" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=Building+widgets+for+multi-page+applications+with+JavaScriptMVC+-+http://bit.ly/sPRThw+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=Building+widgets+for+multi-page+applications+with+JavaScriptMVC&amp;link=http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/&amp;title=Building+widgets+for+multi-page+applications+with+JavaScriptMVC" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=Building+widgets+for+multi-page+applications+with+JavaScriptMVC&amp;url=http%3A%2F%2Fgoltermann.cc%2F2011%2F06%2Fbuilding-widgets-for-multi-page-applications-with-javascriptmvc%2F&amp;desc=In%20my%20bachelor%20project%2C%20an%20online%20portfolio%20for%20our%20university%2C%20we%20used%20the%20JavaScriptMVC%20framework%20to%20facilitate%20the%20implementation%20of%20various%20JavaScript%20widgets%2C%20e.g.%20image%20cropping%2C%20file%20upload%2C%20file%20sorting%2C%20project%20filtering%2C%20ui%20enhancements%20etc.%20You%20can%20read%20more%20about%20this%20project%20in%20this%20art&amp;pcat=Technology&amp;tags=" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/&amp;title=Building+widgets+for+multi-page+applications+with+JavaScriptMVC" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/&amp;submitHeadline=Building+widgets+for+multi-page+applications+with+JavaScriptMVC&amp;submitSummary=In%20my%20bachelor%20project%2C%20an%20online%20portfolio%20for%20our%20university%2C%20we%20used%20the%20JavaScriptMVC%20framework%20to%20facilitate%20the%20implementation%20of%20various%20JavaScript%20widgets%2C%20e.g.%20image%20cropping%2C%20file%20upload%2C%20file%20sorting%2C%20project%20filtering%2C%20ui%20enhancements%20etc.%20You%20can%20read%20more%20about%20this%20project%20in%20this%20art&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2011/06/building-widgets-for-multi-page-applications-with-javascriptmvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quer &#8211; Portfolio for MultiMediaArt and MultiMediaTechnology &#8211; Bachelorproject online!</title>
		<link>http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/</link>
		<comments>http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 19:02:50 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[My Projects]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Dominik Goltermann]]></category>
		<category><![CDATA[Fh Salzburg]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[qpt]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=736</guid>
		<description><![CDATA[QUER*HOCH, our Bachelor qualification project, is a interdisciplinary project realized by MultiMediaArt and MultiMediaTechnology Students. It is now the official online Portfolio of the studycourses MultiMediaArt and MultiMediaTechnology where students present their projects to the public.
Check it out at portfolio.mediacube.at
This project also includes a print magazine, for more informations on this click here.
Tech specs:
The portfolio [...]]]></description>
			<content:encoded><![CDATA[<p>QUER*HOCH, our Bachelor qualification project, is a interdisciplinary project realized by MultiMediaArt and MultiMediaTechnology Students. It is now the official online Portfolio of the studycourses <a href="http://multimediaart.at">MultiMediaArt</a> and <a href="http://multimediatechnology.at">MultiMediaTechnology</a> where students present their projects to the public.</p>
<p><span id="more-736"></span>Check it out at <a href="http://portfolio.mediacube.at">portfolio.mediacube.at</a></p>
<p>This project also includes a print magazine, for more informations on this <a href="http://portfolio.mediacube.at/projects/2011-querhoch-portfolio-fuer-multimediaart-und-multimediatechnology">click here</a>.</p>
<h3>Tech specs:</h3>
<p>The portfolio was programmed in Ruby on Rails 3, the database backend is MySQL 5. To implement the JavaScript functionalities, we used <a href="http://javascriptmvc.com">JavaScriptMVC</a>.</p>
<p style="text-align: center;"><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/Quer-Portfolio-für-MultiMediaArt-und-MultiMediaTechnology_1306954202355.png"><img class="size-medium wp-image-741 aligncenter" title="Quer - Portfolio für MultiMediaArt und MultiMediaTechnology_1306954202355" src="http://blog.goltergaul.de/wp-content/uploads/2011/06/Quer-Portfolio-für-MultiMediaArt-und-MultiMediaTechnology_1306954202355-300x260.png" alt="Quer - Portfolio für MultiMediaArt und MultiMediaTechnology_1306954202355" width="300" height="260" /></a>Front page showing the best projects</p>
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/Quer-Portfolio-für-MultiMediaArt-und-MultiMediaTechnology_1306954588826.png"></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/Quer-Portfolio-für-MultiMediaArt-und-MultiMediaTechnology_1306954202355.png"></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/Quer-Portfolio-für-MultiMediaArt-und-MultiMediaTechnology_1306954588826.png"><img class="size-medium wp-image-742 aligncenter" title="Quer - Portfolio für MultiMediaArt und MultiMediaTechnology_1306954588826" src="http://blog.goltergaul.de/wp-content/uploads/2011/06/Quer-Portfolio-für-MultiMediaArt-und-MultiMediaTechnology_1306954588826-300x202.png" alt="Quer - Portfolio für MultiMediaArt und MultiMediaTechnology_1306954588826" width="300" height="202" /></a></p>
<p style="text-align: center;">Uploading pictures, movie clips and downloads for a project</p>
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/Quer-Portfolio-für-MultiMediaArt-und-MultiMediaTechnology_1306954588826.png"></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-0-53-11.png"><img class="aligncenter size-medium wp-image-750" title="portfolio.mediacube.at screen capture 2011-6-19-0-53-11" src="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-0-53-11-300x189.png" alt="portfolio.mediacube.at screen capture 2011-6-19-0-53-11" width="300" height="189" /></a></p>
<p style="text-align: center;">The project coverimage can be cropped online</p>
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/Quer-Portfolio-für-MultiMediaArt-und-MultiMediaTechnology_1306954588826.png"></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-0-53-11.png"></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-1-1-0.png"><img class="aligncenter size-medium wp-image-754" title="portfolio.mediacube.at-screen-capture-2011-6-19-1-1-0" src="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-1-1-0-296x300.png" alt="portfolio.mediacube.at-screen-capture-2011-6-19-1-1-0" width="296" height="300" /></a></p>
<p style="text-align: center;">Project page showing details and a video</p>
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/Quer-Portfolio-für-MultiMediaArt-und-MultiMediaTechnology_1306954588826.png"></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-1-1-0.png"></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-0-55-18.png"><img class="aligncenter size-medium wp-image-753" title="portfolio.mediacube.at-screen-capture-2011-6-19-0-55-18" src="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-0-55-18-300x279.png" alt="portfolio.mediacube.at-screen-capture-2011-6-19-0-55-18" width="300" height="279" /></a></p>
<p style="text-align: center;">One can browse all projects by studycourse and major</p>
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-0-55-18.png"></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-1-3-46.png"><img class="aligncenter size-medium wp-image-752" title="portfolio.mediacube.at screen capture 2011-6-19-1-3-46" src="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-1-3-46-261x300.png" alt="portfolio.mediacube.at screen capture 2011-6-19-1-3-46" width="261" height="300" /></a></p>
<p style="text-align: center;">Search for persons and projects</p>
<p style="text-align: center;">
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-1-3-46.png"></a><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-0-53-35.png"><img class="aligncenter size-medium wp-image-751" title="portfolio.mediacube.at screen capture 2011-6-19-0-53-35" src="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-0-53-35-300x236.png" alt="portfolio.mediacube.at screen capture 2011-6-19-0-53-35" width="300" height="236" /></a></p>
<p style="text-align: center;">Adding teammembers with their roles</p>
<p style="text-align: center;"><a href="http://blog.goltergaul.de/wp-content/uploads/2011/06/portfolio.mediacube.at-screen-capture-2011-6-19-0-53-11.png"><br />
</a></p>
<div id="gmBFtt" style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; left: 859px ! important; top: 195px ! important; visibility: visible ! important; display: inline ! important; border: 1px solid black ! important; width: auto; height: auto ! important; position: absolute ! important; border-radius: 5px 5px 5px 5px ! important; text-align: left ! important; z-index: 1410065406 ! important; padding: 2px ! important; margin: 0px ! important;">
<div style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; border-bottom: 1px dotted black ! important; padding-bottom: 2px ! important; padding-top: 2px ! important;"><span id="bfconfigButton" style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; cursor: pointer ! important; margin: 1px ! important; border: 1px dotted gray ! important; padding: 0px 2px ! important;" title="Quell- und Ziel- Sprache wählen">Sprachen</span><span id="bfdetectButton" style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; cursor: pointer; margin: 1px ! important; border: 1px dotted gray ! important; padding: 0px 2px ! important; display: none ! important;" title="Erkenne Sprache und übersetze!"> </span><span id="bflangsSpan" style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; margin: 1px ! important; border: 1px dotted gray ! important; padding: 0px 2px ! important; cursor: pointer ! important;" title="Von Englisch nach Deutsch (Klicken für Rückwärts-Übersetzung)">en&gt;de </span><span id="bfsvcSpan" style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; margin: 1px ! important; border: 1px dotted gray ! important; padding: 0px 2px ! important; cursor: pointer ! important;" title="Übersetzungs-Dienst: Yahoo (Dienst wechseln)">Yahoo</span><span id="bfclipboardSpan" style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; margin: 1px ! important; border: 1px dotted gray ! important; padding: 0px 2px ! important; cursor: copy ! important;" title="Kopiere Übersetzung zur Zwischenablage">K</span><span id="bfeditButton" style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; cursor: pointer; margin: 1px ! important; border: 1px dotted gray ! important; padding: 0px 2px ! important;" title="Auswahl ändern">E</span><span id="bferrorSpan" style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; margin: 1px ! important; border: 1px dotted gray ! important; padding: 0px 2px ! important; cursor: pointer ! important; display: none ! important; visibility: hidden ! important;"> </span><img id="bffishImg" style="border: medium none ! important; float: none ! important; vertical-align: top ! important; margin: 0px ! important; cursor: pointer ! important; display: inline ! important;" title="Erkenne Sprache und übersetze!" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAOCAYAAAA8E3wEAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QUUDyoqJjAqRwAAAN1JREFUOMu1lMkVwyAMBYe0JGpCNUFNVk3k4AUwxPGS+ILxkzX8jyTH/Sfu9nrmJ3cXlnMASyWRPwd2d5XlHCBZn1BthcbRAdxTZQDI8k3mQzg11rhF+QZ9jdNOcQib6GFQYJYgCFucSRf6GsLU6wEY5yubTFqF2yq1vRwr3INXdQUWG+je1pELX4ED1wDyRAR0WfuAA9gloITyvsFMIMgYInYRqF6rO9Sqz9qkO5ilyo0o3YBwJ+6vrdQonxWUQllhXeHcb/wabMPkP2n81ocAIoLZrMqn/4y2RwP8DcQ+d6rT9ATiAAAAAElFTkSuQmCC" alt="" /></div>
<div style="display: none ! important; border-bottom: 1px dotted black ! important;">
<input id="bfeditField" style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; border: 0pt none ! important; margin: 1px ! important;" /></div>
<div style="background: none repeat scroll 0% 0% #a8ecff ! important; font-family: Arial ! important; font-size: 12px ! important; color: #000000 ! important; line-height: normal ! important; font-weight: normal ! important; vertical-align: middle ! important; width: auto;">JavaScriptMVC</div>
</div>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/&amp;title=Quer+-+Portfolio+for+MultiMediaArt+and+MultiMediaTechnology+-+Bachelorproject+online%21" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/&amp;t=Quer+-+Portfolio+for+MultiMediaArt+and+MultiMediaTechnology+-+Bachelorproject+online%21" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/&amp;t=Quer+-+Portfolio+for+MultiMediaArt+and+MultiMediaTechnology+-+Bachelorproject+online%21" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=Quer+-+Portfolio+for+MultiMediaArt+and+MultiMediaTechnology+-+Bachelorproject+on%5B..%5D+-+http://bit.ly/uzFUPQ+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=Quer+-+Portfolio+for+MultiMediaArt+and+MultiMediaTechnology+-+Bachelorproject+online%21&amp;link=http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/&amp;title=Quer+-+Portfolio+for+MultiMediaArt+and+MultiMediaTechnology+-+Bachelorproject+online%21" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=Quer+-+Portfolio+for+MultiMediaArt+and+MultiMediaTechnology+-+Bachelorproject+online%21&amp;url=http%3A%2F%2Fgoltermann.cc%2F2011%2F06%2Fquer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online%2F&amp;desc=QUER%2AHOCH%2C%20our%20Bachelor%20qualification%20project%2C%20is%20a%20interdisciplinary%20project%20realized%20by%20MultiMediaArt%20and%20MultiMediaTechnology%20Students.%20It%20is%20now%20the%20official%20online%20Portfolio%20of%20the%20studycourses%20MultiMediaArt%20and%20MultiMediaTechnology%20where%20students%20present%20their%20projects%20to%20the%20public.%0D%0A%0D%0ACheck%20&amp;pcat=Technology&amp;tags=" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/&amp;title=Quer+-+Portfolio+for+MultiMediaArt+and+MultiMediaTechnology+-+Bachelorproject+online%21" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/&amp;submitHeadline=Quer+-+Portfolio+for+MultiMediaArt+and+MultiMediaTechnology+-+Bachelorproject+online%21&amp;submitSummary=QUER%2AHOCH%2C%20our%20Bachelor%20qualification%20project%2C%20is%20a%20interdisciplinary%20project%20realized%20by%20MultiMediaArt%20and%20MultiMediaTechnology%20Students.%20It%20is%20now%20the%20official%20online%20Portfolio%20of%20the%20studycourses%20MultiMediaArt%20and%20MultiMediaTechnology%20where%20students%20present%20their%20projects%20to%20the%20public.%0D%0A%0D%0ACheck%20&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2011/06/quer-portfolio-for-multimediaart-and-multimediatechnology-bachelorproject-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiplayer Flash Snake Game on the Facade of our University</title>
		<link>http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/</link>
		<comments>http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 21:02:43 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[Flash & Flex]]></category>
		<category><![CDATA[My Projects]]></category>
		<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Dominik Goltermann]]></category>
		<category><![CDATA[Fh Salzburg]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=723</guid>
		<description><![CDATA[This summer a few students and me did a little multiplayer Snake game that was projected onto the facade of our university the day of the annual summer party. Up to four students at a time could play our game on the left part of the university as you can see on the photomontage on [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.goltergaul.de/wp-content/uploads/2010/10/snake.jpg"><img class="alignleft size-medium wp-image-724" title="snake" src="http://blog.goltergaul.de/wp-content/uploads/2010/10/snake-300x200.jpg" alt="snake" width="300" height="200" /></a>This summer a few students and me did a little multiplayer Snake game that was projected onto the facade of our university the day of the annual summer party. Up to four students at a time could play our game on the left part of the university as you can see on the photomontage on the left. Unfortunately i lost the pictures i took on that day. The idea was to have snakes eating the facade. That&#8217;s why the snakes have a black trail.</p>
<p>The game was a great success: Many students had fun playing the game for over an hour <img src='http://goltermann.cc/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>We used Adobe Flash to do the game and exported it as Adobe Air application because it has less restrictions for using the Keyboard in fullscreen mode than normal Flash.</p>
<p>You can download the game here: <a href="http://blog.goltergaul.de/wp-content/uploads/2010/10/multisnake.air">Snakes Air Application</a> (You&#8217;ll need Adobe Air) I apologize for the awful sound effects <img src='http://goltermann.cc/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>The sourcecode is hosted at <a href="http://github.com/lpsBetty/MultiSnake">Github</a>. Please note that this is quick and dirty code.</p>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/&amp;title=Multiplayer+Flash+Snake+Game+on+the+Facade+of+our+University" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/&amp;t=Multiplayer+Flash+Snake+Game+on+the+Facade+of+our+University" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/&amp;t=Multiplayer+Flash+Snake+Game+on+the+Facade+of+our+University" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=Multiplayer+Flash+Snake+Game+on+the+Facade+of+our+University+-+http://bit.ly/rRgWKw+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=Multiplayer+Flash+Snake+Game+on+the+Facade+of+our+University&amp;link=http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/&amp;title=Multiplayer+Flash+Snake+Game+on+the+Facade+of+our+University" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=Multiplayer+Flash+Snake+Game+on+the+Facade+of+our+University&amp;url=http%3A%2F%2Fgoltermann.cc%2F2010%2F10%2Fmultiplayer-flash-snake-game-on-the-facade-of-our-university%2F&amp;desc=This%20summer%20a%20few%20students%20and%20me%20did%20a%20little%20multiplayer%20Snake%20game%20that%20was%20projected%20onto%20the%20facade%20of%20our%20university%20the%20day%20of%20the%20annual%20summer%20party.%20Up%20to%20four%20students%20at%20a%20time%20could%20play%20our%20game%20on%20the%20left%20part%20of%20the%20university%20as%20you%20can%20see%20on%20the%20photomontage%20on%20the%20left.%20Unfortun&amp;pcat=Technology&amp;tags=" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/&amp;title=Multiplayer+Flash+Snake+Game+on+the+Facade+of+our+University" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/&amp;submitHeadline=Multiplayer+Flash+Snake+Game+on+the+Facade+of+our+University&amp;submitSummary=This%20summer%20a%20few%20students%20and%20me%20did%20a%20little%20multiplayer%20Snake%20game%20that%20was%20projected%20onto%20the%20facade%20of%20our%20university%20the%20day%20of%20the%20annual%20summer%20party.%20Up%20to%20four%20students%20at%20a%20time%20could%20play%20our%20game%20on%20the%20left%20part%20of%20the%20university%20as%20you%20can%20see%20on%20the%20photomontage%20on%20the%20left.%20Unfortun&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2010/10/multiplayer-flash-snake-game-on-the-facade-of-our-university/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebGL Experiment</title>
		<link>http://goltermann.cc/2010/06/webgl-experiment/</link>
		<comments>http://goltermann.cc/2010/06/webgl-experiment/#comments</comments>
		<pubDate>Mon, 31 May 2010 22:19:57 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[Dominik Goltermann]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=703</guid>
		<description><![CDATA[I did some experiments with WebGL during the development of my current semester project, a litte browsergame. As Engine I used the Copperlicht Engine which comes with a Editor. Using this editor one can easily build a scene and export it in a format that can be loaded by the WebGL engine. At this occasion [...]]]></description>
			<content:encoded><![CDATA[<p>I did some experiments with WebGL during the development of my current semester project, a litte browsergame. As Engine I used the <a href="http://www.ambiera.com/copperlicht/index.html">Copperlicht Engine</a> which comes with a Editor. Using this editor one can easily build a scene and export it in a format that can be loaded by the WebGL engine. At this occasion I also wrote my first Javascript class!</p>
<p>What i wrote is a configurator. This means the user sees a 3D model of the unit he selected and then he can equip it with different weapons and armors. In this experiments i used no cool models, only primitives and some things i found on my hard disk. Here is a Video of the result. Sometimes I had to use configurator.something instead of  this.something. I think this is wrong and I will soon check out some  tutorials on Javascript Classes <img src='http://goltermann.cc/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<a href="http://goltermann.cc/2010/06/webgl-experiment/"><em>Click here to view the embedded video.</em></a>
<pre class="brush: jscript;">

var configurator = {
	engine: null,
	armor: null,
	active_unit_name: null,
	active_unit_index: null,
	is_initialized: false,
	units: {},
	unit_count: 0,
	onLoad_conf: {},
	scene: null,

	// changes the weapon. (sets the selected one visible)
	weapon: function(i) {
		var unit = this.activeUnit();

		if(unit.active_weapon)
			unit.active_weapon.Visible = false;

		if(typeof(i) == &quot;undefined&quot;)
			return;

		unit.active_weapon = this.scene.getSceneNodeFromName(unit.weapons[i]);
		unit.active_weapon.Visible = true;
	},

	// changes armor
	armor: function(i) {
		var unit = this.activeUnit();

		if(unit.active_armor)
			unit.active_armor.Visible = false;

		if(typeof(i) == &quot;undefined&quot;)
			return;

		unit.active_armor = this.scene.getSceneNodeFromName(unit.armors[i]);
		unit.active_armor.Visible = true;
	},

	// switch to next unit in left direction
	left: function() {
		this.active_unit_index--;

		if(this.active_unit_index &lt; 0)
			this.active_unit_index = this.unit_count-1;

		this.reload();
	},

	// switch in right direction
	right: function() {
		this.active_unit_index++;

		if(this.active_unit_index &gt; this.unit_count-1)
			this.active_unit_index = 0;

		this.reload();
	},

	// displayes unit with index active_unit_index
	reload: function() {
		var counter=0;
		for(var key in this.units) {
			if(counter == this.active_unit_index) {
				this.showUnit(key);
				break;
			}
			counter++;
		}
	},

	// shows unit by name
	showUnit: function(unitname) {

		if (!this.is_initialized) {
			this.initialize(unitname);
			return;
		}

		this.scene.getSceneNodeFromName(this.active_unit_name).Visible = false;
		this.weapon();
		this.armor();
		this.active_unit_name = unitname;

		this.scene.getSceneNodeFromName(this.active_unit_name).Visible = true;
		this.weapon(this.activeUnit().weapon_index);
		this.armor(this.activeUnit().armor_index);
	},

	// returns the unit that is currently displayed
	activeUnit: function() {
		return this.units[this.active_unit_name];
	},

	// initialize scene
	onLoaded: function()
	{
		configurator.scene = configurator.engine.getScene();
		if (configurator.scene)
		{
			// initialize active_unit
			var unit = configurator.scene.getSceneNodeFromName(configurator.active_unit_name);
			unit.Visible = true;

			// also, force the 3d engine to update the scene every frame
			configurator.scene.setRedrawMode(Scene.REDRAW_WHEN_SCENE_CHANGED);

			// rotate scene
			configurator.scene.getSceneNodeFromName('root').addAnimator(new AnimatorRotation(new Vect3d(0, 0.2, 0)));

			// load first weapon
			configurator.weapon(configurator.activeUnit().weapon_index);
			configurator.armor(configurator.activeUnit().armor_index);
		}
	},

	// preinitialize. create canvas to draw in and load scene
	initialize: function(default_unit) {
		this.is_initialized = true;
		jQuery(&quot;#canvasContainer&quot;).prepend('&lt;canvas id=&quot;3darea&quot; width=&quot;730&quot; height=&quot;450&quot; style=&quot;background-color:#ffffff&quot;&gt;&lt;/canvas&gt;');
		jQuery(&quot;#configurator&quot;).fadeIn();

		this.active_unit_name = default_unit;
		var index=0;
		for(var key in this.units) {
			if(key == default_unit) break;
			index++;
		}
		this.active_unit_index = index;
		this.engine = startCopperLichtFromFile('3darea', 'copperlichtdata/configurator.ccbjs');
		this.engine.OnLoadingComplete = this.onLoaded;
	},

	// add a unit and its preconfiguartion to the configurator.
	// the last two arguments specify which items should be displayed initially
	// nodenames are the names to reference the corresponding nodes in the scene. (same as in coppercube editor)
	addUnit: function(nodeName, weaponNodeNames, armorNodeNames, weapon_index, armor_index) {
		this.units[nodeName] = {
			weapons: weaponNodeNames,
			armors: armorNodeNames,
			weapon_index: weapon_index,
			armor_index: armor_index
		};
		this.unit_count++;
	},

	destroy: function() {
		jQuery(&quot;#configurator&quot;).fadeOut();
		jQuery(&quot;#3darea&quot;).remove();
		this.is_initialized = false;
	}

};

jQuery(document).ready(function(){
	// add units to configurator
	configurator.addUnit(&quot;bird&quot;,[&quot;weapon&quot;,&quot;weapon2&quot;],[&quot;armor1&quot;,&quot;armor2&quot;],1,0);
	configurator.addUnit(&quot;ghoul&quot;,[&quot;ghoul_weapon1&quot;,&quot;ghoul_weapon2&quot;],[&quot;ghoul_armor1&quot;,&quot;ghoul_armor2&quot;],0,0);
});
</pre>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">var configurator = {<br />
engine: null,<br />
armor: null,<br />
active_unit_name: null,<br />
active_unit_index: null,<br />
is_initialized: false,<br />
units: {},<br />
unit_count: 0,<br />
onLoad_conf: {},<br />
scene: null,</p>
<p>weapon: function(i) {<br />
var unit = this.activeUnit();</p>
<p>if(unit.active_weapon)<br />
unit.active_weapon.Visible = false;</p>
<p>if(typeof(i) == &#8220;undefined&#8221;)<br />
return;</p>
<p>unit.active_weapon = this.scene.getSceneNodeFromName(unit.weapons[i]);<br />
unit.active_weapon.Visible = true;<br />
},</p>
<p>armor: function(i) {<br />
var unit = this.activeUnit();</p>
<p>if(unit.active_armor)<br />
unit.active_armor.Visible = false;</p>
<p>if(typeof(i) == &#8220;undefined&#8221;)<br />
return;</p>
<p>unit.active_armor = this.scene.getSceneNodeFromName(unit.armors[i]);<br />
unit.active_armor.Visible = true;<br />
},</p>
<p>left: function() {<br />
this.active_unit_index&#8211;;</p>
<p>if(this.active_unit_index &lt; 0)<br />
this.active_unit_index = this.unit_count-1;</p>
<p>this.reload();<br />
},</p>
<p>right: function() {<br />
this.active_unit_index++;</p>
<p>if(this.active_unit_index &gt; this.unit_count-1)<br />
this.active_unit_index = 0;</p>
<p>this.reload();<br />
},</p>
<p>reload: function() {<br />
var counter=0;<br />
for(var key in this.units) {<br />
if(counter == this.active_unit_index) {<br />
this.showUnit(key);<br />
break;<br />
}<br />
counter++;<br />
}<br />
},</p>
<p>showUnit: function(unitname) {</p>
<p>if (!this.is_initialized) {<br />
this.initialize(unitname);<br />
return;<br />
}</p>
<p>this.scene.getSceneNodeFromName(this.active_unit_name).Visible = false;<br />
this.weapon();<br />
this.armor();<br />
this.active_unit_name = unitname;</p>
<p>this.scene.getSceneNodeFromName(this.active_unit_name).Visible = true;<br />
this.weapon(this.activeUnit().weapon_index);<br />
this.armor(this.activeUnit().armor_index);<br />
},</p>
<p>activeUnit: function() {<br />
return this.units[this.active_unit_name];<br />
},</p>
<p>onLoaded: function()<br />
{<br />
configurator.scene = configurator.engine.getScene();<br />
if (configurator.scene)<br />
{<br />
// initialize active_unit<br />
var unit = configurator.scene.getSceneNodeFromName(configurator.active_unit_name);<br />
unit.Visible = true;</p>
<p>// also, force the 3d engine to update the scene every frame<br />
configurator.scene.setRedrawMode(Scene.REDRAW_WHEN_SCENE_CHANGED);</p>
<p>// rotate scene<br />
configurator.scene.getSceneNodeFromName(&#8217;root&#8217;).addAnimator(new AnimatorRotation(new Vect3d(0, 0.2, 0)));</p>
<p>// load first weapon<br />
configurator.weapon(configurator.activeUnit().weapon_index);<br />
configurator.armor(configurator.activeUnit().armor_index);<br />
}<br />
},</p>
<p>initialize: function(default_unit) {<br />
this.is_initialized = true;<br />
jQuery(&#8221;#canvasContainer&#8221;).prepend(&#8217;&lt;canvas id=&#8221;3darea&#8221; width=&#8221;730&#8243; height=&#8221;450&#8243; style=&#8221;background-color:#ffffff&#8221;&gt;&lt;/canvas&gt;&#8217;);<br />
jQuery(&#8221;#configurator&#8221;).fadeIn();</p>
<p>this.active_unit_name = default_unit;<br />
var index=0;<br />
for(var key in this.units) {<br />
if(key == default_unit) break;<br />
index++;<br />
}<br />
this.active_unit_index = index;<br />
this.engine = startCopperLichtFromFile(&#8217;3darea&#8217;, &#8216;copperlichtdata/configurator.ccbjs&#8217;);<br />
this.engine.OnLoadingComplete = this.onLoaded;<br />
},</p>
<p>addUnit: function(nodeName, weaponNodeNames, armorNodeNames, weapon_index, armor_index) {<br />
this.units[nodeName] = {<br />
weapons: weaponNodeNames,<br />
armors: armorNodeNames,<br />
weapon_index: weapon_index,<br />
armor_index: armor_index<br />
};<br />
this.unit_count++;<br />
},</p>
<p>destroy: function() {<br />
jQuery(&#8221;#configurator&#8221;).fadeOut();<br />
jQuery(&#8221;#3darea&#8221;).remove();<br />
this.is_initialized = false;<br />
}</p>
<p>};</p>
<p>jQuery(document).ready(function(){<br />
// add units to configurator<br />
configurator.addUnit(&#8221;bird&#8221;,["weapon","weapon2"],["armor1","armor2"],1,0);<br />
configurator.addUnit(&#8221;ghoul&#8221;,["ghoul_weapon1","ghoul_weapon2"],["ghoul_armor1","ghoul_armor2"],0,0);<br />
});</p>
</div>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2010/06/webgl-experiment/&amp;title=WebGL+Experiment" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2010/06/webgl-experiment/&amp;t=WebGL+Experiment" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2010/06/webgl-experiment/&amp;t=WebGL+Experiment" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=WebGL+Experiment+-+http://bit.ly/rZFrZt+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=WebGL+Experiment&amp;link=http://goltermann.cc/2010/06/webgl-experiment/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2010/06/webgl-experiment/&amp;title=WebGL+Experiment" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=WebGL+Experiment&amp;url=http%3A%2F%2Fgoltermann.cc%2F2010%2F06%2Fwebgl-experiment%2F&amp;desc=I%20did%20some%20experiments%20with%20WebGL%20during%20the%20development%20of%20my%20current%20semester%20project%2C%20a%20litte%20browsergame.%20As%20Engine%20I%20used%20the%20Copperlicht%20Engine%20which%20comes%20with%20a%20Editor.%20Using%20this%20editor%20one%20can%20easily%20build%20a%20scene%20and%20export%20it%20in%20a%20format%20that%20can%20be%20loaded%20by%20the%20WebGL%20engine.%20At%20this%20oc&amp;pcat=Technology&amp;tags=" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2010/06/webgl-experiment/&amp;title=WebGL+Experiment" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2010/06/webgl-experiment/&amp;submitHeadline=WebGL+Experiment&amp;submitSummary=I%20did%20some%20experiments%20with%20WebGL%20during%20the%20development%20of%20my%20current%20semester%20project%2C%20a%20litte%20browsergame.%20As%20Engine%20I%20used%20the%20Copperlicht%20Engine%20which%20comes%20with%20a%20Editor.%20Using%20this%20editor%20one%20can%20easily%20build%20a%20scene%20and%20export%20it%20in%20a%20format%20that%20can%20be%20loaded%20by%20the%20WebGL%20engine.%20At%20this%20oc&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2010/06/webgl-experiment/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Does encrypting all I-Frames of a video make it unwatchable?</title>
		<link>http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/</link>
		<comments>http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/#comments</comments>
		<pubDate>Thu, 06 May 2010 11:33:53 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[bytestream]]></category>
		<category><![CDATA[Dominik Goltermann]]></category>
		<category><![CDATA[Matthias Schmidt]]></category>
		<category><![CDATA[video processing]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=690</guid>
		<description><![CDATA[For our multimedia security lesson Matthias Schmidt and I wrote a program that reads an MPEG-4 Simple Profile Byte stream and overwrites all I-Frames. The purpose of this program is to evaluate whether an encryption of I-Frames would be sufficient in order to make a video unwatchable. This technique could be used for example for [...]]]></description>
			<content:encoded><![CDATA[<p>For our multimedia security lesson Matthias Schmidt and I wrote a program that reads an MPEG-4 Simple Profile Byte stream and overwrites all I-Frames. The purpose of this program is to evaluate whether an encryption of I-Frames would be sufficient in order to make a video unwatchable. This technique could be used for example for Pay-TV.</p>
<h3>Results</h3>
<p>The first video shows an original and an encrypted video in comparison.</p>
<a href="http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/"><em>Click here to view the embedded video.</em></a>
<p>The second video compares the same video using different GOP sizes (10 and 50)</p>
<a href="http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/"><em>Click here to view the embedded video.</em></a>
<h3>Error Concealment</h3>
<p>We found out that some codecs (e.g. DirectShow) do a very good error concealment.<a href="http://blog.goltergaul.de/wp-content/uploads/2010/05/error_concealment.jpg"><img class="alignleft size-medium wp-image-701" title="error_concealment" src="http://blog.goltergaul.de/wp-content/uploads/2010/05/error_concealment-277x300.jpg" alt="error_concealment" width="277" height="300" /></a> The picture on the left shows two different videos played in two different players. As one can see, the second player reconstructs a slightly good image.</p>
<h3>How does it work?</h3>
<p>We are parsing the byte stream for VideoObjectPlanes which have the start code 0&#215;000001b6. If this code is followed by two bytes that are equal to 00 the we found an I-Frame. From here on we start overwriting thy byte stream until we reach the next start code 0&#215;000001.</p>
<h3>Code</h3>
<pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

int main() {
	ifstream ifs(&quot;in.mp4&quot;, ios::in | ios::binary);
	ofstream ofs(&quot;output.mp4&quot;, ios::out | ios::binary);
	//initialize buffer to 0xffffffff
	unsigned char buffer[4] = {0xff, 0xff, 0xff, 0xff};
	bool write = false;
	int counter=0;
	unsigned long overallcount=0;
	unsigned long writecount=0;
	while(!ifs.eof())
	{
		//Shift to make space for new read.
		buffer[0] = buffer[1];
		buffer[1] = buffer[2];
		buffer[2] = buffer[3];

		//read next byte from file
		buffer[3] = ifs.get();

		//see if the current buffer contains the start code.
		if(buffer[0]==0x00 &amp;&amp; buffer[1]==0x00 &amp;&amp; buffer[2]==0x01) // 0x00 00 01 b6
		{
			write = false;
			if(buffer[3]==0xb6) {
				//cout &lt;&lt; &quot;VOP begin&quot; &lt;&lt;endl;
				//vop start code found
				//Test for I-frame
				unsigned char ch = ifs.get();
				ofs &lt;&lt; buffer[3];
				buffer[0] = buffer[1];
				buffer[1] = buffer[2];
				buffer[2] = buffer[3];

				//read next byte from file
				buffer[3] = ch;
				int vop_coding_type = (ch &amp; 0xc0) &gt;&gt; 6;   //masks out the first 2 bits and shifts them to the least significant bits of the uchar
				if(vop_coding_type == 0)
				{
					//It is an I-frame (hell yeah (: )
					write = true;
					cout &lt;&lt; ++counter &lt;&lt; &quot;. Iframe =)&quot; &lt;&lt; endl;
				}
			}
		}
		if(write) {
			ofs &lt;&lt; (char)0x0d;
			writecount++;
		}
		else {
			ofs &lt;&lt; buffer[3];
			overallcount++;
		}
	}

	cout &lt;&lt; &quot;Read : &quot; &lt;&lt; overallcount &lt;&lt; endl;
	cout &lt;&lt; &quot;Write: &quot; &lt;&lt; writecount &lt;&lt; endl;
	cout &lt;&lt; &quot;Percent overwritten: &quot; &lt;&lt; (float)writecount/(float)overallcount*100.0f &lt;&lt; endl;

	return 0;
}</pre>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/&amp;title=Does+encrypting+all+I-Frames+of+a+video+make+it+unwatchable%3F" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/&amp;t=Does+encrypting+all+I-Frames+of+a+video+make+it+unwatchable%3F" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/&amp;t=Does+encrypting+all+I-Frames+of+a+video+make+it+unwatchable%3F" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=Does+encrypting+all+I-Frames+of+a+video+make+it+unwatchable%3F+-+http://bit.ly/ryoYvO+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=Does+encrypting+all+I-Frames+of+a+video+make+it+unwatchable%3F&amp;link=http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/&amp;title=Does+encrypting+all+I-Frames+of+a+video+make+it+unwatchable%3F" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=Does+encrypting+all+I-Frames+of+a+video+make+it+unwatchable%3F&amp;url=http%3A%2F%2Fgoltermann.cc%2F2010%2F05%2Fdoes-encrypting-all-i-frames-of-a-video-make-it-unwatchable%2F&amp;desc=For%20our%20multimedia%20security%20lesson%20Matthias%20Schmidt%20and%20I%20wrote%20a%20program%20that%20reads%20an%20MPEG-4%20Simple%20Profile%20Byte%20stream%20and%20overwrites%20all%20I-Frames.%20The%20purpose%20of%20this%20program%20is%20to%20evaluate%20whether%20an%20encryption%20of%20I-Frames%20would%20be%20sufficient%20in%20order%20to%20make%20a%20video%20unwatchable.%20This%20technique&amp;pcat=Technology&amp;tags=" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/&amp;title=Does+encrypting+all+I-Frames+of+a+video+make+it+unwatchable%3F" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/&amp;submitHeadline=Does+encrypting+all+I-Frames+of+a+video+make+it+unwatchable%3F&amp;submitSummary=For%20our%20multimedia%20security%20lesson%20Matthias%20Schmidt%20and%20I%20wrote%20a%20program%20that%20reads%20an%20MPEG-4%20Simple%20Profile%20Byte%20stream%20and%20overwrites%20all%20I-Frames.%20The%20purpose%20of%20this%20program%20is%20to%20evaluate%20whether%20an%20encryption%20of%20I-Frames%20would%20be%20sufficient%20in%20order%20to%20make%20a%20video%20unwatchable.%20This%20technique&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2010/05/does-encrypting-all-i-frames-of-a-video-make-it-unwatchable/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Musicbook won Netd@ys Award</title>
		<link>http://goltermann.cc/2010/04/musicbook-won-netdys-award/</link>
		<comments>http://goltermann.cc/2010/04/musicbook-won-netdys-award/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 07:03:53 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[Flash & Flex]]></category>
		<category><![CDATA[My Projects]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Dominik Goltermann]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Fh Salzburg]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[qpt]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=685</guid>
		<description><![CDATA[Musicbook won the first place at the Netd@ys Young Creativity Award!
Share this on del.icio.usShare this on FacebookPost this to MySpaceTweet This!Share this on FriendFeedAdd this to Google BookmarksSubmit this to TwittleyDigg this!Buzz up!]]></description>
			<content:encoded><![CDATA[<p><a href="http://facebook.com/musictuner">Musicbook </a>won the first place at the <a href="http://netdays.at">Netd@ys Young Creativity Award</a>!</p>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2010/04/musicbook-won-netdys-award/&amp;title=Musicbook+won+Netd%40ys+Award" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2010/04/musicbook-won-netdys-award/&amp;t=Musicbook+won+Netd%40ys+Award" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2010/04/musicbook-won-netdys-award/&amp;t=Musicbook+won+Netd%40ys+Award" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=Musicbook+won+Netd%40ys+Award+-+http://bit.ly/uvUxvx+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=Musicbook+won+Netd%40ys+Award&amp;link=http://goltermann.cc/2010/04/musicbook-won-netdys-award/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2010/04/musicbook-won-netdys-award/&amp;title=Musicbook+won+Netd%40ys+Award" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=Musicbook+won+Netd%40ys+Award&amp;url=http%3A%2F%2Fgoltermann.cc%2F2010%2F04%2Fmusicbook-won-netdys-award%2F&amp;desc=Musicbook%20won%20the%20first%20place%20at%20the%20Netd%40ys%20Young%20Creativity%20Award%21&amp;pcat=Technology&amp;tags=" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2010/04/musicbook-won-netdys-award/&amp;title=Musicbook+won+Netd%40ys+Award" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2010/04/musicbook-won-netdys-award/&amp;submitHeadline=Musicbook+won+Netd%40ys+Award&amp;submitSummary=Musicbook%20won%20the%20first%20place%20at%20the%20Netd%40ys%20Young%20Creativity%20Award%21&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2010/04/musicbook-won-netdys-award/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android Game Project &#8211; Basics of Threads and Canvas</title>
		<link>http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/</link>
		<comments>http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 17:39:57 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[My Projects]]></category>
		<category><![CDATA[Dominik Goltermann]]></category>
		<category><![CDATA[Fh Salzburg]]></category>
		<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=673</guid>
		<description><![CDATA[This semester Robert Sommeregger, Thomas Czernik and I will create an Android game   The goal of the game will be to get out of the way of obstacles using the Androids phone acceleration sensors. The setting will be under water.
In order to get into Android programming we wanted to test how fluid a [...]]]></description>
			<content:encoded><![CDATA[<p>This semester Robert Sommeregger, Thomas Czernik and I will create an Android game <img src='http://goltermann.cc/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  The goal of the game will be to get out of the way of obstacles using the Androids phone acceleration sensors. The setting will be under water.</p>
<p>In order to get into Android programming we wanted to test how fluid a 4 megapixel image could be moved around the screen. To be able to move such an image we needed a thread to update the position and to redraw our Canvas view.</p>
<p>The first idea was to have a thread which updates the coordinates where the picture should be drawn on the screen and then call a redraw() function. We soon realized that a Canvas could only be forced to redraw itself by invalidating it. But there is a security feature of android that only allows Activities to invalidate Views if it is a children of the Activity. We had a Class UpdateThread which implements the Runnable interface: (Game extends Canvas and draws our Picture)<span id="more-673"></span></p>
<pre class="brush: java;">
public class main extends Activity {

private Game game;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        game = new Game(this);
        setContentView(game);

        Thread myThread = new Thread(new UpdateThread());
        myThread.start();

    }

public class UpdateThread implements Runnable {

    	@Override
    	public void run() {
    		//... code to manipulate position
            }
    	}

    }

}
</pre>
<p>If you now try to call game.invalidate() from this run() function Android will throw an exception because game is not a child of UpdateThread. The solution is to implement a handler which can communicate with our thread &#8211; it is building a interface between our thread and the main class. We insert the following in the main class:</p>
<pre class="brush: java;">
    public Handler updateHandler = new Handler(){
    	/** Gets called on every message that is received */
        // @Override
        public void handleMessage(Message msg) {
        	game.update();
            game.invalidate();
            super.handleMessage(msg);
        }
    };
</pre>
<p>We fill our run() method with this code:</p>
<pre class="brush: java;">
while(true){
    main.this.updateHandler.sendEmptyMessage(0);
}
</pre>
<p>Now each thime main.this.updateHandler.sendEmptyMessage(0) is called the handler reacts. The point is that our handler now can call game.invalidate() because game is a child of main.</p>
<p>Here is the full code:</p>
<p>main.java</p>
<pre class="brush: java;">
package muhkuh.app;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

public class main extends Activity {

	private Game game;

    public Handler updateHandler = new Handler(){
    	/** Gets called on every message that is received */
        // @Override
        public void handleMessage(Message msg) {
        	game.update();
            game.invalidate();
            super.handleMessage(msg);
        }
    };

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        game = new Game(this);
        setContentView(game);

        Thread myThread = new Thread(new UpdateThread());
        myThread.start();

    }

    public class UpdateThread implements Runnable {

    	@Override
    	public void run() {
    		 while(true){
                 main.this.updateHandler.sendEmptyMessage(0);
            }
    	}

    }

}
</pre>
<p>game.java</p>
<pre class="brush: java;">
package muhkuh.app;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;

public class Game extends View {

	private Bitmap image;
	private Paint paint;
	private int x=0;

	public Game(Context context) {
		super(context);
		image = Bitmap.createBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.test));
		paint = new Paint();
	}

	// called every Frame
	protected void onDraw(Canvas canvas) {
		canvas.drawBitmap(image, x, 0, paint);
	}

	// called by thread
	public void update() {
		if(x &lt; 200)
    		x++;
    	else
    		x=0;
	}

}
</pre>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/&amp;title=Android+Game+Project+-+Basics+of+Threads+and+Canvas" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/&amp;t=Android+Game+Project+-+Basics+of+Threads+and+Canvas" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/&amp;t=Android+Game+Project+-+Basics+of+Threads+and+Canvas" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=Android+Game+Project+-+Basics+of+Threads+and+Canvas+-+http://bit.ly/tVPdf5+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=Android+Game+Project+-+Basics+of+Threads+and+Canvas&amp;link=http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/&amp;title=Android+Game+Project+-+Basics+of+Threads+and+Canvas" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=Android+Game+Project+-+Basics+of+Threads+and+Canvas&amp;url=http%3A%2F%2Fgoltermann.cc%2F2010%2F03%2Fandroid-game-project-basics-of-threads-and-canvas%2F&amp;desc=This%20semester%20Robert%20Sommeregger%2C%20Thomas%20Czernik%20and%20I%20will%20create%20an%20Android%20game%20%3A%29%20The%20goal%20of%20the%20game%20will%20be%20to%20get%20out%20of%20the%20way%20of%20obstacles%20using%20the%20Androids%20phone%20acceleration%20sensors.%20The%20setting%20will%20be%20under%20water.%0D%0A%0D%0AIn%20order%20to%20get%20into%20Android%20programming%20we%20wanted%20to%20test%20how%20flui&amp;pcat=Technology&amp;tags=" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/&amp;title=Android+Game+Project+-+Basics+of+Threads+and+Canvas" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/&amp;submitHeadline=Android+Game+Project+-+Basics+of+Threads+and+Canvas&amp;submitSummary=This%20semester%20Robert%20Sommeregger%2C%20Thomas%20Czernik%20and%20I%20will%20create%20an%20Android%20game%20%3A%29%20The%20goal%20of%20the%20game%20will%20be%20to%20get%20out%20of%20the%20way%20of%20obstacles%20using%20the%20Androids%20phone%20acceleration%20sensors.%20The%20setting%20will%20be%20under%20water.%0D%0A%0D%0AIn%20order%20to%20get%20into%20Android%20programming%20we%20wanted%20to%20test%20how%20flui&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2010/03/android-game-project-basics-of-threads-and-canvas/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>MusicBook in our local newspaper!</title>
		<link>http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/</link>
		<comments>http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 15:18:18 +0000</pubDate>
		<dc:creator>Dominik Goltermann</dc:creator>
				<category><![CDATA[Flash & Flex]]></category>
		<category><![CDATA[My Projects]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Dominik Goltermann]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Fh Salzburg]]></category>
		<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">http://blog.goltergaul.de/?p=666</guid>
		<description><![CDATA[The Facebook application Thomas Czernik and I developed showed up in two of our local newspapers! You can read the article here.
Share this on del.icio.usShare this on FacebookPost this to MySpaceTweet This!Share this on FriendFeedAdd this to Google BookmarksSubmit this to TwittleyDigg this!Buzz up!]]></description>
			<content:encoded><![CDATA[<p>The Facebook application Thomas Czernik and I developed showed up in two of our local newspapers! You can read the article <a href="http://blog.goltergaul.de/wp-content/uploads/2010/02/MusicBook-Zeitungsartikel.jpg">here.</a></p>
<div class="sexy-bookmarks sexy-bookmarks-expand sexy-bookmarks-bg-sexy"><ul class="socials"><li class="sexy-delicious"><a href="http://del.icio.us/post?url=http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/&amp;title=MusicBook+in+our+local+newspaper%21" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a></li><li class="sexy-facebook"><a href="http://www.facebook.com/share.php?u=http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/&amp;t=MusicBook+in+our+local+newspaper%21" rel="nofollow" class="external" title="Share this on Facebook">Share this on Facebook</a></li><li class="sexy-myspace"><a href="http://www.myspace.com/Modules/PostTo/Pages/?u=http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/&amp;t=MusicBook+in+our+local+newspaper%21" rel="nofollow" class="external" title="Post this to MySpace">Post this to MySpace</a></li><li class="sexy-twitter"><a href="http://twitter.com/home?status=MusicBook+in+our+local+newspaper%21+-+http://bit.ly/rNiGoL+" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a></li><li class="sexy-friendfeed"><a href="http://www.friendfeed.com/share?title=MusicBook+in+our+local+newspaper%21&amp;link=http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/" rel="nofollow" class="external" title="Share this on FriendFeed">Share this on FriendFeed</a></li><li class="sexy-google"><a href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk=http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/&amp;title=MusicBook+in+our+local+newspaper%21" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a></li><li class="sexy-twittley"><a href="http://twittley.com/submit/?title=MusicBook+in+our+local+newspaper%21&amp;url=http%3A%2F%2Fgoltermann.cc%2F2010%2F02%2Fmusicbook-in-our-local-newspaper%2F&amp;desc=The%20Facebook%20application%20Thomas%20Czernik%20and%20I%20developed%20showed%20up%20in%20two%20of%20our%20local%20newspapers%21%20You%20can%20read%20the%20article%20here.&amp;pcat=Technology&amp;tags=" rel="nofollow" class="external" title="Submit this to Twittley">Submit this to Twittley</a></li><li class="sexy-digg"><a href="http://digg.com/submit?phase=2&amp;url=http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/&amp;title=MusicBook+in+our+local+newspaper%21" rel="nofollow" class="external" title="Digg this!">Digg this!</a></li><li class="sexy-yahoobuzz"><a href="http://buzz.yahoo.com/submit/?submitUrl=http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/&amp;submitHeadline=MusicBook+in+our+local+newspaper%21&amp;submitSummary=The%20Facebook%20application%20Thomas%20Czernik%20and%20I%20developed%20showed%20up%20in%20two%20of%20our%20local%20newspapers%21%20You%20can%20read%20the%20article%20here.&amp;submitCategory=science&amp;submitAssetType=text" rel="nofollow" class="external" title="Buzz up!">Buzz up!</a></li></ul><div style="clear:both;"></div></div>]]></content:encoded>
			<wfw:commentRss>http://goltermann.cc/2010/02/musicbook-in-our-local-newspaper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

