<?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>Fusonic Blog</title>
	<atom:link href="http://blog.fusonic.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fusonic.net</link>
	<description></description>
	<lastBuildDate>Fri, 23 Dec 2011 11:29:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Chive 1.0 released!</title>
		<link>http://blog.fusonic.net/2011/12/chive-1-0-released/</link>
		<comments>http://blog.fusonic.net/2011/12/chive-1-0-released/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 14:42:23 +0000</pubDate>
		<dc:creator>David Roth</dc:creator>
				<category><![CDATA[Chive mySQL-Admin]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Web-Development]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=895</guid>
		<description><![CDATA[We are happy to announce the release of chive 1.0 - our free, open source, web-based database management tool, designed to bring joy to web developers - with easy administration, super fast UI and state of the art web technologies. ]]></description>
			<content:encoded><![CDATA[<p><img style="float: left;" title="Chive 1.0" src="http://chive-project.com/style/images/logo-big.png" alt="" width="250" height="82" />I’m pleased to announce the release of chive 1.0!</p>
<p>Chive is a free, open source, web-based database management tool, designed to bring joy to web developers &#8211; with easy administration, super fast UI and state of the art web technologies.<br />
Our mission is to bring joy to web developers &#8211; every part in chive is  optimized to speed so that web-developers can achieve any tasks easily  and super-fast &#8211; without any hassle.</p>
<p>Since the last release of the 0.5 series we fixed 10 Bugs and contributed some nice new productivity features:</p>
<p><span id="more-895"></span></p>
<p>Some key changes are:</p>
<p><strong>- Support of table maintenance commands</strong></p>
<p>Prior to chive 1.0, we did not support table maintenance commands like optimize/analyze table. It was always possible to execute these queries manually by typing the command, but this was obviously not very userfriendly. With 1.0 we added buttons for all of these commands so you can easily execute them via a button click on each table view.</p>
<p><a href="../wp-content/uploads/2011/12/table_maintenance.png"><img title="table_maintenance" src="../wp-content/uploads/2011/12/table_maintenance-300x39.png" alt="" width="300" height="39" /></a></p>
<p><strong>- Remember Url when logging in.</strong></p>
<p>Before this release, you could not copy and paste a chive url to the navigation-bar when you were not logged in. After entering the credentials, chive redirected you to the startpage and you had to re-paste the url.<br />
This has changed and now chive remembers the url pasted in the navigation-bar when not logged in and redirects you to the correct page after login.</p>
<p><a href="http://blog.fusonic.net/wp-content/uploads/2011/12/navigation.png"><img class="alignleft size-medium wp-image-908" title="navigation" src="http://blog.fusonic.net/wp-content/uploads/2011/12/navigation-300x48.png" alt="" width="300" height="48" /></a></p>
<p><strong>- Add search-icon to table name in the tablename list</strong></p>
<p>With this improvement you can quickly jump to a table`s search list by clicking oh the glasses-icon in the list. This saves lots of time when you do repeated searches on different tables.</p>
<p><a href="http://blog.fusonic.net/wp-content/uploads/2011/12/Screenshot-at-2011-12-09-150038.png"><img class="alignleft size-full wp-image-898" title="Table Quick-Search" src="http://blog.fusonic.net/wp-content/uploads/2011/12/Screenshot-at-2011-12-09-150038.png" alt="" width="288" height="141" /></a></p>
<p><strong>- Always show query execution time</strong></p>
<p>As the query execution time is an important information, chive will display it on every executed query from now on.<br />
We re-used chive`s indicator-system so it will look similar to the profiling tooltips you are already used to.</p>
<p><a href="http://blog.fusonic.net/wp-content/uploads/2011/12/screenshot6.png"><img class="alignleft size-medium wp-image-899" title="Show Query execution time" src="http://blog.fusonic.net/wp-content/uploads/2011/12/screenshot6-300x49.png" alt="" width="300" height="49" /></a></p>
<p>There are plenty of other cool features, like syntax highlighting,    benchmarking,  bookmarks and so on. Check out our project  site on <a href="http://chive-project.com/">http://chive-project.com</a> for screen shots and download chive free at <a href="http:///">https://launchpad.net/chive</a>.</p>
<p><strong>Fixed Bugs</strong>:</p>
<p>#822305    Error when calling SQL procedure<br />
#862088    Crash when triggering the edit<br />
#825428    Uncheck null checkbox when editing row<br />
#829995    about page/link doesn&#8217;t update breadcrumb<br />
#832172    Calendar widget on DATETIME fields does not insert seconds<br />
#834560    buttons in insert function mixed up<br />
#834580    Image resource path set through script path<br />
#836525    Table maintenance commands error<br />
#855573    no icon for language &#8220;en&#8221;<br />
#855583    unify search and insert tab look<br />
#853758    Remember URL when logging in<br />
#855597    add search to table name shortcuts in the tablename list<br />
#859492    Show query execution time</p>
<p><strong>We are taking contributions<br />
</strong></p>
<p>We would be happy to see contributions!  If you are a programmer and   want to help us making chive even more awesome, please pick out an open  <a href="https://blueprints.launchpad.net/chive">blueprint</a>, write me an email so that I  can assign you the blueprint, and start hacking.<br />
Thanks to the powerful distributed bazaar vcs, it is very easy for you  to  make your own branch – implement or experiment with new features -   and  make a merge request to contribute the changes back.</p>
<p>Since chive is build on top of the <a href="http://www.yiiframework.com/">Yii Framework</a>,  it has a future  proof object oriented API and a nicely maintainable  code base which  makes contributing new features or providing bug fixes  easy. If you are interested in contributing then have a look at our  <a href="http://www.chive-project.com/Contribute">new contribution page.</a></p>
<ul>
<li><strong>Help us translating chive<br />
</strong></li>
</ul>
<p>Thanks to the community, there are already 25 translations of chive,<strong> with 13 already finished or nearly finished!</strong><br />
If you want help us translating chive please visit chive`s <a href="https://translations.launchpad.net/chive">translation page</a> on launchpad.</p>
<p>For more information including detailed changelog check out this page:<br />
<a href="https://launchpad.net/chive/+milestone/1.0">https://launchpad.net/chive/+milestone/1.0</a></p>
<p>Chive 1.0.0 can be downloaded here: <a href="http://www.chive-project.com/Download/Redirect">http://www.chive-project.com/Download/Redirect</a></p>
<p>If you are using Linux, there is a very simple way to install Chive. Just run the following command to download and extract Chive::<br />
<em> wget -O &#8211; http://www.chive-project.com/Download/Redirect|tar -xzp</em></p>
<p>We hope that you will enjoy using Chive 1.0.0 and we are looking forward to receive your feedback in Launchpad (https://launchpad.net/chive).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/12/chive-1-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tuning Apache for High Traffic</title>
		<link>http://blog.fusonic.net/2011/11/first-steps-to-tune-apache-for-high-load/</link>
		<comments>http://blog.fusonic.net/2011/11/first-steps-to-tune-apache-for-high-load/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 06:38:46 +0000</pubDate>
		<dc:creator>Matthias Burtscher</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=884</guid>
		<description><![CDATA[A few months ago we launched an online community / social network at querdenker.de using our software for such solutions Fusonic Connect. We have always been thinking that we already considered nearly everything which could break our system when beeing accessed by a lot of people concurrently. And we were right. What did break the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.fusonic.net/wp-content/uploads/2011/11/sales_128.png"><img src="http://blog.fusonic.net/wp-content/uploads/2011/11/sales_128.png" alt="" title="sales_128" width="128" height="128" class="alignleft size-full wp-image-885" style="float: left; margin: 0px 20px 20px 0px" /></a>
<p>
A few months ago we launched an online community / social network at <a href="http://www.querdenker.de">querdenker.de</a> using our software for such solutions <a href="http://www.fusonic.net/en/services/fusonic-connect/">Fusonic Connect</a>. We have always been thinking that we already considered nearly everything which could break our system when beeing accessed by a lot of people concurrently. And we were right. What did break the site when more than 200 people accessed the site in the same minute, it has not been our software that collapsed but it has been the whole LAMP setup. So here is what we did to get the site up and running again: <span id="more-884"></span>
</p>
<h3>Step 1: Optimize your software</h3>
<p>
First of all, optimize your software. No LAMP stack setup can repair the damage done by bad database queries, missing caching algorithms, bloated code and bad HTTP headers (client-side caching!). So there is no way to get around this step. When we were confronted with a huge load on the server, the first thing we did was optimizing all queries once again, disabling functions that were not necessary for the user (e.g. statistics).
</p>
<h3>Step 2: Split servers</h3>
<p>
The site I was talking about is hosted in the Amazon Cloud. So we used an EC2 instance for the web server, an RDS instance for our MySQL database and S3 storage for static images that were not submitted by the user (e.g. icons). This is an important step since you can reduce load to a third of what it was before. Especially if you consider <strong>that simple requests to static files are more likely to kill your LAMP setup than dynamic requests are.</strong>
</p>
<h4>Why is this?</h4>
<p>
When you use Apache MPM Prefork module, several Apache processes are started in background which then will handle the incoming requests. If your clients are required to load static files like images through your Apache setup it is likely that all processes are locked for simple static file requests rather than dynamic requests like PHP what they are really there for.
</p>
<h3>Step 3: Setup up MPM Prefork</h3>
<p>
Default Apache setup uses only one thread to handle all requests. Fine on localhost, but not fine on a production system. You should use MPM Prefork module installed. This module launches several Apache processes which then handle all incoming requests.
</p>
<h4>Choose the right number of processes</h4>
<p>
Each Apache process will consume a similar amount of memory on your server, depending on the Apache modules which are loaded (next step) and the tasks you&#8217;ll execute. So you have to choose a number of processes which matches your available memory. If there is 1GB of memory available &#8211; not at all but for Apache, your OS will use memory too ;-) &#8211; and one of your Apache processes uses 20MB of memory, you can launch 50 processes equally. If you choose more, Apache will run in swap which results in huge memory issues.
</p>
<p>
Find out memory usage:</p>
<div class="codesnip-container" >#ps -FA|grep apache2</div>
</p>
<p>
To set the maximum number of processes launched open your Apache config (usually /etc/apache2/apache2.conf) and set MaxClients to the correct number.
</p>
<h3>Step 4: Disable Apache modules</h3>
<p>
Apache modules will use memory for each process that is launched and this is very expensive. The default Apache setup comes with more than 20 enabled modules which we did not need. You should disable everything that is not necessary for your site to run:</p>
<div class="codesnip-container" >#a2dismod ruby<br />
#a2dismod include<br />
#a2dismod dav<br />
#a2dismod dav_fs<br />
&#8230; and so on &#8230;</div>
<p>This will save you memory and allows you to launch more parallel processes.
</p>
<h3>Step 4: Reduce KeepAliveTimeout</h3>
<p>
If a client connects to your web server it will keep the connection open for a specific number of seconds for further requests. During this time, the whole Apache process is locked for other requests. You can specify the number of keep-alive seconds in your Apache config using the directive KeepAliveTimeout. You should enable KeepAlive but reduce KeepAlive to a value of 2-3 seconds. Default is 30. We were also confrontend with a lot of processes running in Keep-Alive state when we monitored our server and this solved the issue and we were able to serve three times more visitors with the same server setup!
</p>
<h3>Step 5: Have a look at server-status!</h3>
<p>
Enable the mod_status module (#a2enmod status) and enable ExtendedStatus directive (&#8220;ExtendedStatus On&#8221;) in /etc/apache2/mods-enabled/status.conf! Then have a look at /server-status which will tell you how many Apache processes are running and in which state (e.g. to find out if Keep-Alive is killing your setup) and which files are requested. Maybe you can find out which files to move to S3 storage using this technique.
</p>
<h3>What else to do?</h3>
<p>
If you are using PHP you should enable eAccelerator or something similar. You could use Memcached for sessions and caching algorithms and so on. There is a lot to do when optimizing your site for high traffic and it costs time. Nothing to do about that ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/11/first-steps-to-tune-apache-for-high-load/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Knockout</title>
		<link>http://blog.fusonic.net/2011/11/knockout-2/</link>
		<comments>http://blog.fusonic.net/2011/11/knockout-2/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 11:40:32 +0000</pubDate>
		<dc:creator>Stefan Hartmann</dc:creator>
				<category><![CDATA[Knockout]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=861</guid>
		<description><![CDATA[Having problems with user-responsive, interactive UI&#8217;s? Sick of confusing and complicated js-code to handle your UI? Knockout is the solution. I first stumbled upon the knockout-library during the implementation of a UI with lots of interactive features, like updating a field if another field changes, displaying areas only if a certain option is set, … [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 0.79in } 		P { margin-bottom: 0.08in } --><a href="http://blog.fusonic.net/wp-content/uploads/2011/11/ko-logo.png"><img class="alignleft size-medium wp-image-859" title="Knockout" src="http://blog.fusonic.net/wp-content/uploads/2011/11/ko-logo-300x87.png" alt="" width="300" height="87" /></a><br />
Having problems with user-responsive, interactive UI&#8217;s? Sick of confusing and complicated js-code to handle your UI? Knockout is the solution.</p>
<p>I first stumbled upon the knockout-library during the implementation of a UI with lots of interactive features, like <span id="more-861"></span>updating a field if another field changes, displaying areas only if a certain option is set, …  Simple actions are very easy to implement with jQuery, but if your UI gets bigger, your js-Code gets more and more confusing handling all the special cases occuring on your UI. Knockout works with data-models defined in your js-code. The code keeps clean and simple to understand and the library let you create bindings between your models and your HTML-Code.</p>
<p><strong>Simple example: Making a div visible if a certain checkbox is checked</strong></p>
<p>With jQuery you have to show the div if the checkbox is checked and hide the div if it&#8217;s unchecked.</p>
<p>With Knockout you can create a model with a param for the checked-option and bind this param to your html-elements with the “data-bind” &#8211; attribute.</p>
<p>Creating the viewModel</p>
<pre class="brush: jscript; title: ; notranslate">

var viewModel = {

showDiv: ko.observable()

};
</pre>
<p>Apply bindings (activate knockout)</p>
<pre class="brush: jscript; title: ; notranslate">

ko.applyBindings(viewModel);
</pre>
<p>Binding the showDiv-attribute to your input</p>
<pre class="brush: xml; title: ; notranslate">

&lt;input type=”checkbox” data-bind=”checked: showDiv” /&gt;
</pre>
<p>Displaying the div only if your checkbox is checked</p>
<pre class="brush: xml; title: ; notranslate">

&lt;div data-bind=”visible: showDiv”&gt;

Some content

&lt;/div&gt;
</pre>
<p>These bindings work like a charm, i&#8217;m fascinated. Long story short, use this library for your UI&#8217;s, invest some time to understand it&#8217;s functionality and it will spend you a lot of time in the future, trust me!</p>
<p>There are a lot of tutorials on the website which are very nice, interactive and also very simple to understand, give it a go!</p>
<p><a href="http://www.knockoutjs.com">knockoutjs.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/11/knockout-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Monotouch – Tips and Tricks (Part 3)</title>
		<link>http://blog.fusonic.net/2011/08/monotouch-%e2%80%93-tips-and-tricks-part-3/</link>
		<comments>http://blog.fusonic.net/2011/08/monotouch-%e2%80%93-tips-and-tricks-part-3/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 11:09:49 +0000</pubDate>
		<dc:creator>David Roth</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[Monotouch]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[monotouch]]></category>
		<category><![CDATA[uitoast]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=649</guid>
		<description><![CDATA[Increase user experience by using UI-Toasts for action-feedback, Making UIWebViews transparent, Buttons with image scaling
]]></description>
			<content:encoded><![CDATA[<div style="float: left; margin: 5px; margin-right: 15px; text-align: center;"><a href="http://blog.fusonic.net/wp-content/uploads/2011/07/eventguide.png"><img class="alignleft size-full wp-image-756" title="eventguide" src="http://blog.fusonic.net/wp-content/uploads/2011/07/eventguide.png" alt="eventguide" width="150" height="150" /></a><br />
+<br />
<a href="http://blog.fusonic.net/wp-content/uploads/2011/07/mono.png"><img class="size-full wp-image-758 aligncenter" title="mono" src="http://blog.fusonic.net/wp-content/uploads/2011/07/mono.png" alt="" width="110" height="55" /></a><br />
<strong>Part 3</strong></div>
<p>This part 3 of my monotouch tips and tricks series blog post covers the following topics:</p>
<ul>
<li>Increase user experience by using UI-Toasts for action-feedback</li>
<li>Making UIWebViews transparent</li>
<li>Buttons with image scaling</li>
</ul>
<p>To view my previous monotouch posts follow these links:</p>
<p>- <a href="http://blog.fusonic.net/2011/07/monotouch-%E2%80%93-tips-and-tricks-part-2/">Monotouch – Tips and Tricks (Part 2)</a><br />
- <a href="http://blog.fusonic.net/2011/07/monotouch-tips-and-tricks-part-1/">Monotouch &#8211; Tips and Tricks (Part 1)</a></p>
<p><span id="more-649"></span></p>
<h3 style="clear: both;">Increase user experience by using UI-Toasts for user action-feedback</h3>
<p>Android has this useful concept of &#8220;UI-Toasts&#8221; which is a special way to display a &#8220;non intrusive&#8221; message to the user. Those message are displayed for a short time on the screen and  they disapear after a configurable time interval</p>
<p>The idea is to be as unobtrusive as possible, while still showing the  user the information you want them to see. In our EventGuide Application we wanted to show toast feedback whenever the user stares an event. (&#8220;<strong>Event added to your schedule</strong>&#8221;&#8221;).  This is how it finally looks:</p>
<p style="text-align: center;"><a href="http://blog.fusonic.net/wp-content/uploads/2011/08/uitoasts.png"><img class="size-medium wp-image-765 aligncenter" style="margin-top: 10px; margin-bottom: 10px; border: 1px solid #c0c0c0;" title="uitoasts" src="http://blog.fusonic.net/wp-content/uploads/2011/08/uitoasts-300x274.png" alt="" width="300" height="274" /></a><strong><br />
</strong></p>
<p style="text-align: left;"><strong>How to create UI-Toasts?<br />
</strong>Luckily there is already an <a href="http://code.google.com/p/toast-notifications-ios/">UI-Toast implementation for IOs</a>, which has been translated to C#. You can download the<strong> C# version</strong> from my gist: <a href="https://gist.github.com/1106927">https://gist.github.com/1106927</a><br />
Just download the class and copy it into your project. The usage is very simple:</p>
<pre class="brush: csharp; title: ; notranslate">
ToastView view = new ToastView(&quot;Event added to your schedule&quot;, 1000);
view.SetGravity(ToastGravity.Bottom, 0, 0);
view.Show();
</pre>
<h3>How to make UI-Webviews fully transparent and display background image/color?</h3>
<p>If you use a UIWebView in your application to display rich user generated data you can easily make it fully transparent by using the following extension method:</p>
<pre class="brush: csharp; title: ; notranslate">
public static void MakeTransparent(this UIView view)
{
   view.Opaque = false;
   view.BackgroundColor = UIColor.Clear;
}
</pre>
<p>If you want a backgroundcolor behind the UIWebView just set the BackgroundColor property of the UIView which contains the UIWebView. Now the UIWebView scrolls above the static background-image on the UIView in the background:</p>
<p style="text-align: center;"><a href="../wp-content/uploads/2011/08/transparent_webview.png"><img class="aligncenter" title="transparent_webview" src="../wp-content/uploads/2011/08/transparent_webview-196x300.png" alt="" width="196" height="300" /></a></p>
<h3>Clickable Adwords-Buttons with image scaling</h3>
<p>If you want to display sponsor logos in your application which the user can click I recommend to use a UIButton using UIButtonType.Custom<em> </em>style<strong> </strong> and to use the following method when switching between images:</p>
<pre class="brush: csharp; title: ; notranslate">
private void ApplyImage(UIImage img)
{
  if(img.Size.Width &gt; addbutton.Frame.Width || img.Size.Height &gt; addbutton.Frame.Height)
  {
     addbutton.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit;
  }
  else
  {
     addbutton.ImageView.ContentMode = UIViewContentMode.Center;
  }

  addbutton.SetImage(img, UIControlState.Normal);
}
</pre>
<p>This method automatically sets the optimal <em>ContentMode</em> property based on the image <em>Width</em> and <em>Height</em> so that the image gets automatically centred and scaled if necessary:</p>
<p style="text-align: center;"><a href="http://blog.fusonic.net/wp-content/uploads/2011/08/sponsorlogo.png"><img class="aligncenter size-medium wp-image-781" style="border: 1px solid #c0c0c0;" title="sponsorlogo" src="http://blog.fusonic.net/wp-content/uploads/2011/08/sponsorlogo-300x177.png" alt="" width="300" height="177" /></a></p>
<p style="text-align: left;">Happy monotouch programming!</p>
<p style="text-align: left;">David.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/08/monotouch-%e2%80%93-tips-and-tricks-part-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mono 2.10.4 parallel environment debian/ubuntu package</title>
		<link>http://blog.fusonic.net/2011/08/mono-2-10-4-parallel-environment-debianubuntu-package/</link>
		<comments>http://blog.fusonic.net/2011/08/mono-2-10-4-parallel-environment-debianubuntu-package/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 12:30:17 +0000</pubDate>
		<dc:creator>David Roth</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[mono parallel environment]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=707</guid>
		<description><![CDATA[Mono 2.10.4 parallel environment package for ubuntu/debian users. Includes all references to build GTK# and Asp.net MVC applications.]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-712 alignleft" style="float: left; margin: 10px; border: 1px solid #c0c0c0;" title="Mono parallel 2.10.4 environment" src="http://blog.fusonic.net/wp-content/uploads/2011/08/mono_parallel1.png" alt="Mono parallel" width="150" height="100" /></p>
<p>The new Mono 2.10.4 is out and comes <a href="http://www.mono-project.com/Release_Notes_Mono_2.10.3">with lots of bugfixes</a>. To make it easier to get the latest and greatest on your ubuntu/debian machines, I have created a deb package which I will share with you.</p>
<p>The parallel environment package includes all important references so that you can build your  <strong><em>GTK# </em></strong><em>and </em><strong>Asp.net MVC</strong><em> </em>applications.<strong><br />
</strong></p>
<p>Once downloaded, the package installs to “/opt/mono-2.10″.<br />
For this 2.10.4 build I once again used Patrick McEvoy`s great mono build script. For those of you who want to make your hands dirty and build mono yourself, you can find the script here: <a rel="nofollow" href="https://github.com/firegrass/mono-installer-script/">https://github.com/firegrass/mono-installer-script/</a></p>
<p><strong><em>You can download the mono 2.10.4 debian/ubuntu package <a href="https://sourceforge.net/projects/mono-parallel/files/mono-2.10.4-parallel-environment-amd64.deb/download">here</a></em></strong>.</p>
<p><span id="more-707"></span>Once installed, you can activate the environment by typing the following command in your terminal:</p>
<p>droth@ubuntu04:/var/dev/mono$ <em><strong>source mono-2.10-environment</strong></em></p>
<p>If you now enter “<em><strong>mono –version</strong></em>” the console should print the following lines:</p>
<pre class="brush: bash; title: ; notranslate">
Mono JIT compiler version 2.10.4 (mono-2-10/c6799b1 Mon Aug 22 13:42:45 CEST 2011)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
 TLS:           __thread
 SIGSEGV:       altstack
 Notifications: epoll
 Architecture:  amd64
 Disabled:      none
 Misc:          softdebug
 LLVM:          supported, not enabled.
 GC:            Included Boehm (with typed GC and Parallel Mark)
</pre>
<p>If you want to use the new <a href="http://www.mono-project.com/Generational_GC" target="_blank">Generational GC</a>, use the following command:</p>
<p>droth@ubuntu04:/var/dev/mono$ <em>mono-sgen  app.exe</em></p>
<p><span style="text-decoration: underline;"><strong><a href="https://sourceforge.net/projects/mono-parallel/files/mono-2.10.4-parallel-environment-amd64.deb/download"><em>Download mono 2.10.4 parallel environment deb package now</em></a>.</strong></span></p>
<p>Have fun using mono!<br />
David</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/08/mono-2-10-4-parallel-environment-debianubuntu-package/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android Tips and Tricks (Part 1)</title>
		<link>http://blog.fusonic.net/2011/07/android-tips-and-tricks-part-1/</link>
		<comments>http://blog.fusonic.net/2011/07/android-tips-and-tricks-part-1/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 09:40:43 +0000</pubDate>
		<dc:creator>Alexander Troy</dc:creator>
				<category><![CDATA[Android Development]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=562</guid>
		<description><![CDATA[+ After a good feedback for our Monotouch / iOS  Tips and Tricks series I decided to start the same thing for Android. This means I try to provide solutions for some common pitfalls during the Android development of our amazing product Fusonic Event Guide. Please be aware that we do not use Monodroid here, [...]]]></description>
			<content:encoded><![CDATA[<div style="float: left; margin: 5px; text-align: center;"><img title="Event Guide" src="http://www.fusonic.net/themes/fusonic/images/content/mobile/eventguide.png" alt="" width="150" height="150" /><br />
+<br />
<a href="http://blog.fusonic.net/wp-content/uploads/2011/07/droid-160.jpg"><img class="alignleft size-full wp-image-602" title="droid-160" src="http://blog.fusonic.net/wp-content/uploads/2011/07/droid-160.jpg" alt="" width="158" height="160" /></a></div>
<p>After a good feedback for our Monotouch / iOS  Tips and Tricks series I decided to start the same thing for Android. This means I try to provide solutions for some common pitfalls during the Android development of our amazing product <a href="http://www.fusonic.net/de/Produkte/Mobile-Applications/Fusonic-Event-Guide">Fusonic Event Guide</a>.</p>
<p>Please be aware that we do not use Monodroid here, we just use the native way to code the APP, this means all sample code is written in java and our IDE is Eclipse.</p>
<p>In the first part we go after:</p>
<ol style="margin-left: 180px;">
<li>&#8220;Could not execute method of the activity&#8221;</li>
<li>My development phone does not get found by adb</li>
<li>Useful Emulator commands</li>
<li>Start Facebook-App via intent + mobile alternative</li>
</ol>
<p>If you have problems with the AlarmManager and BroadcastReceiver you can read about this in our last blog entry <a href="http://blog.fusonic.net/2011/07/why-my-broadcastreceiver-does-not-get-called/">here</a>. There is also some sample code included.<br />
<span id="more-562"></span><br />
<br/>&nbsp;<br/></p>
<h3>What means &#8220;java.lang.IllegalStateException: Could not execute method of the activity&#8221;</h3>
<p>After a hard time of refactoring and renaming I tried to run my app again to test that everything is fine. But something goes wrong&#8230; the app did not start up properly and a nasty exception shows up in the debug window.<br />
Ok, no problem here are the common pitfalls:</p>
<ul>
<li>Activity is not defined in AndroidManifest.xml</li>
<li>Misspelled activity name in the AndroidManifest.xml (case sensitive!)</li>
<li>Use full qualified packagename instead of the shortend name attribute (e.g. android:name=&#8221;.yourActivity&#8221;) in the activity node. Because if you rename an activity eclipse removes the  dot &#8220;.&#8221; and this could cause an error.</li>
</ul>
<p>&nbsp;<br/></p>
<h3>Your development phone does not get found by adb / Eclipse</h3>
<p>Common pitfalls:</p>
<p>1. Stupid question: Is your phone connected to your pc?<br />
A: If not plug it please via USB.</p>
<p>2. Is your phone in &#8220;USB debugging&#8221;-mode?<br />
It has to be! So enable the debugging mode in your phone settings. (Settings -&gt; Applications -&gt; Development -&gt; USB debugging)</p>
<p>3. What if it displays something like this &#8220;???????????&#8221; in the ADB-Manager?<br />
Ok, at first this is a good sign, because you have successfully solved problem 1 and 2.<br />
To solve this kind of problem you have to restart your adb-server running on your pc.</p>
<p>in Eclipse:</p>
<ol>
<li>Goto the Device-View in the DDMS-Perspective</li>
<li>Click on the triangle on the right of the &#8220;Screen Capture&#8221;-Button</li>
<li>Now click &#8220;Reset adb&#8221; in the context menu</li>
<li>Restart your emulator</li>
</ol>
<p>if this does not help do this via console..</p>
<p>on Linux :</p>
<pre class="brush: bash; title: ; notranslate">
sudo /my/path/to/android-sdk-linux_86/platform-tools/adb kill-server
sudo /my/path/to/android-sdk-linux_86/platform-tools/adb start-server
</pre>
<p>&nbsp;<br/></p>
<h3>Useful Emulator commands</h3>
<ul>
<li>Switch screen orientation: Ctrl + F11/F12</li>
<li>Toggle fullscreen mode: Alt + Enter</li>
<li>Toggle trackball mode: F6</li>
<li>Toggle cell network: F8</li>
<li>Toggle menu: F2</li>
<li>Back: Esc</li>
</ul>
<p>Full emulator controlling:<br />
<a href="http://developer.android.com/guide/developing/tools/emulator.html">http://developer.android.com/guide/developing/tools/emulator.html</a><br />
&nbsp;<br/></p>
<h3>How to start Facebook-App via intent</h3>
<p>In our app we wanted to provide a direct way to start the users Facebook-App. But starting alone is not enough, we have to navigate the user to our customers wall.<br />
If you are familiar with the Android System and Activities you know that they can expose functionality to other Activities via Intents.</p>
<p>So you just have to know the &#8220;Facebook-URI-Scheme&#8221; to access the right Activity of the FB-App.</p>
<p><strong>Caution:<br />
The scheme changed in the last update of the Facebook-App. The new scheme is posted below! But you should always keep in mind that this could be changed again!</strong></p>
<pre>Sample code to start the Facebook-App and open the customers Fanpage via pageid:
<pre class="brush: java; title: ; notranslate">
String uri = &quot;fb://page/&quot; + yourFBpageId;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));

// Add try and catch because the scheme could be changed in an update!
// Another reason is that the Facebook-App is not installed
try {

   startActivity(intent);

} catch (ActivityNotFoundException ex) {

   // start web browser and the facebook mobile page as fallback
   String uriMobile = &quot;http://touch.facebook.com/pages/x/&quot; + yourFBpageId;
   Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(uriMobile));
   startActivity(i);
}
</pre>
<p> The new Facebook scheme (not everything tested):
<pre class="brush: plain; title: ; notranslate">
fb://root
fb://feed
fb://feed/{userID}
fb://profile
fb://profile/{userID}
fb://page/{id}
fb://group/{id}
fb://place/fw?pid={id}
fb://profile/{#user_id}/wall
fb://profile/{#user_id}/info
fb://profile/{#user_id}/photos
fb://profile/{#user_id}/mutualfriends
fb://profile/{#user_id}/friends
fb://profile/{#user_id}/fans
fb://search
fb://friends
fb://pages
fb://messaging
fb://messaging/{#user_id}
fb://online
fb://requests
fb://events
fb://places
fb://birthdays
fb://notes
fb://places
fb://groups
fb://notifications
fb://albums
fb://album/{%s}?owner={#%s}
fb://video/?href={href}
</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/07/android-tips-and-tricks-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why we chose PHPStorm over ZendStudio and Eclipse PDT</title>
		<link>http://blog.fusonic.net/2011/07/why-we-chose-phpstorm-over-zendstudio-and-eclipse-pdt/</link>
		<comments>http://blog.fusonic.net/2011/07/why-we-chose-phpstorm-over-zendstudio-and-eclipse-pdt/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 11:33:14 +0000</pubDate>
		<dc:creator>Matthias Burtscher</dc:creator>
				<category><![CDATA[Web-Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XDebug]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=570</guid>
		<description><![CDATA[As a software development company we are primarily focused on web based applications such as our Social Intranet Software Fusonic Connect. For the last five years we have used Eclipse PDT as our favorite IDE. We have always been happy with the features it provided and did not have the time to do an intense [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-576" style="margin-right: 10px; margin-bottom: 10px; float: left;" title="Different PHP IDEs" src="http://blog.fusonic.net/wp-content/uploads/2011/07/ide.png" alt="" width="150" height="115" /> As a software development company we are primarily focused on web based applications such as our <a href="http://www.fusonic.net/en/services/fusonic-connect/">Social Intranet Software Fusonic Connect</a>. For the last five years we have used Eclipse PDT as our favorite IDE. We have always been happy with the features it provided and did not have the time to do an intense investigation on other IDEs. A few months ago, we had some free time and decided to take a look at some other IDEs and compare them in detail. We picked PHPStorm, ZendStudio and Eclipse PDT to be compared in detail. And here are the reasons <strong>we finally chose PHPStorm</strong> over ZendStudio and Eclipse PDT:</p>
<p><span id="more-570"></span></p>
<h3>Debugging</h3>
<p>Sure, we got debugging running with either XDebug or ZendDebugger with both Eclipse PDT and ZendStudio. But <strong>debugging, inspecting variables and navigating through the code</strong> can be very painful with Eclipse and PHP. For sure, you can configure Eclipse to work exactly as you want it to, but you have to know it good and do a lot of configuration work.</p>
<p>PHPStorm comes with the easiest debugging solution for our use case: The <strong>Listen for debug connection</strong> button. Just click it and start a debug session in your browser (This usually happens by appending ?XDEBUG_SESSION_START=anyidentifier to your URL, we implemented a &#8220;debug link&#8221; in our application to do that with a mouse click. Two clicks and debugging works, no matter which project or path on the web server. No configuration must be done in any project.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-583" title="Start Listen PHP Debug Connections" src="http://blog.fusonic.net/wp-content/uploads/2011/07/Screenshot.png" alt="" width="273" height="74" /></p>
<h3>Unit testing</h3>
<p>With Eclipse PDT it is not possible to <strong>run PHPUnit tests from within the IDE</strong> I think. At least I could not find any solution for that. With ZendStudio and PHPStorm we managed to get it up and running, even with our unit testing infrastructure which requires a complex bootstrap routine. Now we can run unit tests from within the IDE and don&#8217;t have to use our custom implemented web GUI for that.</p>
<h3>Price</h3>
<p>OK, let&#8217;s be honest. We all don&#8217;t want to pay more than we have to. That&#8217;s one of the reasons we stuck to Eclipse PDT for such a long time. But as our company grew, we realized that <strong>some bucks spent on a good piece of software can save you thousands of bucks later on</strong>.</p>
<p>Eclipse PDT: free<br />
ZendStudio: 299€ (including minor updates)<br />
PHPStorm: 168€ (including one year of updates)</p>
<p>Since we expect a major update for ZendStudio all 1-2 years the pricing of PHPStorm vs. ZendStudio is nearly the same. If one of them wins the battle it&#8217;s not about the price.</p>
<h3>Performance</h3>
<p>The most important reason we choose PHPStorm over ZendStudio and Eclipse PDT is performance. We use Linux (Ubuntu) on all workstations and Eclipse PDT has always been very slow. When working on the code everything is fine (except the slow code suggestions). But when you want to reload a project, refresh the source or even work with your Bazaar plugin installed Eclipse can really make you go crazy. Lags occur every time you refresh, open new files or even when you just right click with your mouse somewhere in the source or the file tree.</p>
<p>PHPStorm really is like a &#8220;storm&#8221; when it comes to performance. You <strong>never wait for something, UI is very fast and filesystem freshes automatically</strong> after a few seconds.</p>
<h3>Conclusion</h3>
<p>There are three reasons to choose PHPStorm over Eclipse PDT and two of them to choose PHPStorm over ZendStudio:</p>
<ul>
<li><strong>Debugging</strong></li>
<li>Unit Testing</li>
<li><strong>Performance</strong></li>
</ul>
<h3>Links</h3>
<ul>
<li><a href="http://www.jetbrains.com/phpstorm">PHPStorm</a></li>
<li><a href="http://www.zend.com">ZendStudio</a></li>
<li><a href="http://www.eclipse.org/pdt">Eclipse PDT</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/07/why-we-chose-phpstorm-over-zendstudio-and-eclipse-pdt/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Chive 0.5.1 released</title>
		<link>http://blog.fusonic.net/2011/07/chive-0-5-1-released/</link>
		<comments>http://blog.fusonic.net/2011/07/chive-0-5-1-released/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 11:28:05 +0000</pubDate>
		<dc:creator>David Roth</dc:creator>
				<category><![CDATA[Chive mySQL-Admin]]></category>
		<category><![CDATA[Web-Development]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql management]]></category>
		<category><![CDATA[phpmyadmin]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=573</guid>
		<description><![CDATA[I’m pleased to announce the release of chive 0.5.0 and 0.5.1, a next generation mysql-management software which brings joy to web developers.
Since the last release of the 0.4 series we fixed 11 Bugs including some nice improvements.
Some Key changes are:

- Improved import
- Improved search+edit handling
- Submit SQL-Query with CTRL+Enter + visual feedback]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="data:image/png;base64,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" alt="" width="250" height="82" /></p>
<p>I’m pleased to announce the release of chive 0.5.0 / 0.5.1, a next generation  mysql-management software which brings joy to web developers.</p>
<p>Since the last release of the 0.4 series we fixed 11 Bugs including some nice improvements.<br />
Some Key changes are:</p>
<p>- Improved import<br />
- Improved search+edit handling<br />
- Submit SQL-Query with CTRL+Enter + visual feedback</p>
<p><span id="more-573"></span>Fixed Bugs in chive 0.5<br />
________<br />
#793918 The import feature does not run entirely<br />
#792869 Table export: Table name in lower case on Mac OSX<br />
#792973 Procedures with syntax errors are deleted on save<br />
#800106 Search is thrown away after row-editing<br />
#804666 on function update function disappear<br />
#808798 &#8216;Null&#8217; option does not work as expected<br />
#797468 When exporting as csv, file extension should be csv<br />
#800094 Submit Search with Enter does not work in chrome<br />
#801186 date_default_timezone_set problem<br />
#800104 Submit SQL Query with Ctrl+Enter</p>
<p>Fixes in 0.5.1<br />
_________<br />
- Remove PHP 5.3 closure so that chive still works in 5.2.x<br />
#812735: After changing current user password an exception occurs.</p>
<p>Translations<br />
————<br />
With 3 new translations (Ukrainian, Russian, Hungarian) and some updated  ones (french, italian, polish) we are looking forward to reach a  broader user audience.  Thanks to all the people working on the  translations in Launchpad!</p>
<p>Chive 0.5.1 can be downloaded here: <a rel="nofollow" href="http://launchpad.net/chive/0.5/0.5.1/+download/chive_0.5.1.tar.gz">http://launchpad.net/chive/0.5/0.5.1/+download/chive_0.5.1.tar.gz</a><br />
If you are using Linux, there is a very simple way to install chive.  Just run the following command to download and extract chive:</p>
<p>wget -O &#8211; <a rel="nofollow" href="http://launchpad.net/chive/0.5/0.5.1/+download/chive_0.5.1.tar.gz">http://launchpad.net/chive/0.5/0.5.1/+download/chive_0.5.1.tar.gz</a>|tar -xzp</p>
<p>We hope that you will enjoy using Chive 0.5.1 and we are looking forward to receive your feedback in Launchpad (<a rel="nofollow" href="https://launchpad.net/chive">https://launchpad.net/chive</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/07/chive-0-5-1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Monotouch – Tips and Tricks (Part 2)</title>
		<link>http://blog.fusonic.net/2011/07/monotouch-%e2%80%93-tips-and-tricks-part-2/</link>
		<comments>http://blog.fusonic.net/2011/07/monotouch-%e2%80%93-tips-and-tricks-part-2/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 13:59:08 +0000</pubDate>
		<dc:creator>David Roth</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[Monotouch]]></category>
		<category><![CDATA[iOS Development]]></category>
		<category><![CDATA[monotouch]]></category>
		<category><![CDATA[UIAlertHelper]]></category>
		<category><![CDATA[UIAlertView]]></category>
		<category><![CDATA[UILocalNotification]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=446</guid>
		<description><![CDATA[This is the second part of my “Monotouch – Tips and Tricks” series. I will write about the following topics:

    How to create reminders using NSNotifications + use of my UIAlertHelper class.
    How to simulate reminders/alerts using NSNotifications when the application has already been killed. (handling it in the FinishedLaunching method)
]]></description>
			<content:encoded><![CDATA[<div style="float: left; margin: 5px; margin-right: 10px; text-align: center;"><a href="http://blog.fusonic.net/wp-content/uploads/2011/07/eventguide.png"><img class="alignleft size-full wp-image-756" title="eventguide" src="http://blog.fusonic.net/wp-content/uploads/2011/07/eventguide.png" alt="eventguide" width="150" height="150" /></a><br />
+<br />
<a href="http://blog.fusonic.net/wp-content/uploads/2011/07/mono.png"><img class="size-full wp-image-758 aligncenter" title="mono" src="http://blog.fusonic.net/wp-content/uploads/2011/07/mono.png" alt="" width="110" height="55" /></a><br />
<strong>Part 2</strong></div>
<p>This is the second part of my &#8220;Monotouch &#8211; Tips and Tricks&#8221; series. I will write about the following topics:</p>
<ul>
<li>How to create reminders using NSNotifications + use of my UIAlertHelper class.</li>
<li>How to simulate reminders/alerts using NSNotifications when the application has  already been killed. (handling it in the FinishedLaunching method)</li>
</ul>
<p>A cool feature of the <a href="http://www.fusonic.net/de/Produkte/Mobile-Applications/Fusonic-Event-Guide">Fusonic EventGuide</a> application is the ability to star your favourite events/gigs. All starred gigs are not only available on your personal running-order, you will also get a notification shortly before the event starts so that you don&#8217;t miss your favourite bands. So I needed a solution to show notifications some minutes before the gig starts and to allow the user to jump directly to the event info page (alert action buttons).</p>
<p><span id="more-446"></span><strong>Do not try using System.Threading.Timer<br />
</strong></p>
<p>My first idea was to use the System.Threading.Timer class where I&#8217;d register a new timer with a callback. Unfortunately this will not work, because as soon as your application is sent to background (e.x. through an incoming call or just because the user presses the home button), your application-process is send to sleep by the IOS-Kernel and <strong>NONE</strong> of your code will ever execute, including your timers. Obviously this would also not work if the app is not running at all.</p>
<p><strong>The Solution: Schedule your Notifications using the Notification APIs.</strong></p>
<p style="text-align: left;">Fortunately IOS does provide you some APIs which allows you to schedule notifications. Your notifications will be triggered when your application is in foreground, in background and even when it has already been killed.<br />
These APIs are published through the <em>UILocalNotification</em> class and the <em>UIApplication.SharedApplication.ScheduleNotification(&#8230;) </em>method.</p>
<p style="text-align: left;">So first of all we will create a new notification:</p>
<pre class="brush: csharp; title: ; notranslate">
void CreateNotification()
{
   DateTime fireDate = DateTime.UtcNow.Add(TimeSpan.FromSeconds(30));
   UILocalNotification alert = new UILocalNotification();
   alert.TimeZone = NSTimeZone.LocalTimeZone;
   alert.FireDate = fireDate.ToNSDate();
   alert.RepeatInterval = 0;
   alert.AlertBody = string.Format(&quot;This notification is scheduled for {0}&quot;, firedate.toString());
   alert.AlertAction = &quot;Click me&quot;; // This will create a button which will launch your application
}
</pre>
<p>The previous code creates a notification which will trigger in 30 seconds. We can also add an additional userdata dictionary which allows us to attach metadata to the notification which can be retrieved when the notification triggers:</p>
<pre class="brush: csharp; title: ; notranslate">
var keys = new object[] { &quot;yourKey&quot; };
var objects = new object[] { &quot;yourKeyValue&quot; };
var userInfo = NSDictionary.FromObjectsAndKeys(objects, keys);
alert.UserInfo = userInfo;
</pre>
<p>Now we will schedule the notification with this code:</p>
<pre class="brush: csharp; title: ; notranslate">
UIApplication.SharedApplication.ScheduleLocalNotification(alert);
</pre>
<p>Finally we need some notification handling code in the UIApplicationDelegate class. Open your AppDelegate class (usually Main.cs) and implement the following override:</p>
<pre class="brush: csharp; title: ; notranslate">
public override void ReceivedLocalNotification (UIApplication application, UILocalNotification notification)
{
   Console.WriteLine(notification);
}
</pre>
<p>If you run this code and keep your application in foreground, you will see a console output in approximately 30 seconds. If you put your application in background, you will see a popup notification. That`s just because IOs will not show the UI-Alert dialog if your app is already in foreground &#8211; you have to handle this scenario yourself.</p>
<p>In practice there are 3 different scenarios you need to handle:</p>
<p><strong>1) Your application is in foreground</strong></p>
<p>IOs will not show any notification dialog for you but it will call the <em>ReceivedLocalNotification</em><strong> </strong>override though. If you want to show an UIAlert dialog in this scenario, you have to do this yourself by writing this code:</p>
<pre class="brush: csharp; title: ; notranslate">
public override void ReceivedLocalNotification (UIApplication application, UILocalNotification notification)
{
  // Check if the application is in foreground.
  if(application.ApplicationState == UIApplicationState.Active)
  {
    UIAlertHelper.ShowAlert(&quot;The title&quot;
      &quot;the notification body&quot;,
      &quot;label of the close button&quot;, new ButtonAction(&quot;MyAction&quot;, () =&gt; MyActionCallback));
  }
}

private void MyActionCallback()
{
   Console.WriteLine(&quot;the user has clicked the button 'MyAction&quot;);
}
</pre>
<p>This code uses my <a title="UIAlertHelper" href="https://gist.github.com/1075682">UIAlertHelper</a> class which you can find here <a title="https://gist.github.com/1075682 " href="https://gist.github.com/1075682 ">https://gist.github.com/1075682</a>. It&#8217;s just one of these simple helper classes which provides you an easy to use API  for showing alerts with buttons. The class will handle the reference  tracking and alert queue for you, so you don&#8217;t have to worry about keeping a reference to the actual dialog or handling an alert queue. In a nutshell: It&#8217;s making using UIAlerts much easier.</p>
<p><strong>2) Your application is in background</strong></p>
<p>If your application is in background, IOs will show a notification dialog with your text and two buttons: One dismiss/cancel button and one action-button. If the user touches the cancel-button, the dialog will disappear and the <em>ReceivedLocalNotification</em><strong> </strong>method <strong>will not</strong> be called. If the user touches the action-button (&#8220;Click me&#8221;), IOs will invoke the <em>ReceivedLocalNotification method<em> for you.</em></em></p>
<p><em><em> </em></em></p>
<p><em><em> </em></em>This time the <em>application.ApplicationState</em> property value is <em>Background</em>. Because the user has already touched the action button in the dialog, we can directly redirect him to the action method by calling <em>MyActionCallback():</em></p>
<pre class="brush: csharp; title: ; notranslate">
public override void ReceivedLocalNotification (UIApplication application, UILocalNotification notification)
{
  // Check if the application is in foreground.
  if(application.ApplicationState == UIApplicationState.Active)
  {
    UIAlertHelper.ShowAlert(&quot;The title&quot;
      &quot;the notification body&quot;,
      &quot;label of the close button&quot;, new ButtonAction(&quot;MyAction&quot;, () =&gt; MyActionCallback));
  }
  // Your application is in background and the user has pressed the action button
  else
  {
     MyActionCallback();
  }
}

private void MyActionCallback()
{
   Console.WriteLine(&quot;the user has clicked the button 'MyAction&quot;);
}
</pre>
<p><strong>3) Your application is not in memory / has already been killed</strong></p>
<p>If your application is not running at all, IOs will show a notification  dialog with your text and two buttons: One dismiss/cancel button and one  action-button. If the user touches the cancel-button, the dialog will  disappear and your application will not be started.  If the user touches the action-button (&#8220;Click me&#8221;), IOs will start your application with options which you can handle this way:</p>
<pre class="brush: csharp; title: ; notranslate">
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
   UILocalNotification startupNotification = null;
   // Check if the application has been started with options
   if(options != null)
   {
    // Try get the startup notification:
    startupNotification = options.ValueForKey(UIApplication.LaunchOptionsLocalNotificationKey) as UILocalNotification;
   }

   window.AddSubview(navigationController.View);
   window.MakeKeyAndVisible ();

   BeginInvokeOnMainThread(() =&gt; {
       InitApplication(startupNotification);
   });

   return true;

}

private void InitApplication(UILocalNotification startupNotification)
{
	if(startupNotification != null)
	{
		MyActionCallback();
	}
}

private void MyActionCallback()
{
   Console.WriteLine(&quot;the user has clicked the button &quot;MyAction&quot;);
}
</pre>
<p><strong>Testing of scenario 3 =&gt; Your application is not running</strong></p>
<p>Testing scenario 1 and 2 is not a problem, but simulating a proper application shutdown and wakeup with notifications takes some time and you probably want some easy and fast way to test your code.<br />
The most simple approach I know is to create a dummy UILocalNotification object in the <em>FinishedLaunching</em> method and pass this to your InitApplication method. You can enable/disable this by using comments or compiler directives.</p>
<p>Example:</p>
<pre class="brush: csharp; title: ; notranslate">
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
	UILocalNotification startupNotification = null;
	if(options != null)
	{
		startupNotification = options.ValueForKey(UIApplication.LaunchOptionsLocalNotificationKey) as UILocalNotification;
	}
        // Comment/Uncomment the following line to enable/disable the dummy notification
	startupNotification = GetSimulatedNotification();

	window.AddSubview(navigationController.View);
	window.MakeKeyAndVisible ();

	BeginInvokeOnMainThread(() =&gt; {
		InitApplication(startupNotification);
	});

	return true;
}

public static UILocalNotification GetSimulatedNotification()
{
	DateTime fireDate = DateTime.UtcNow.Add(TimeSpan.FromSeconds(30));
	UILocalNotification alert = new UILocalNotification();
	alert.TimeZone = NSTimeZone.LocalTimeZone;
	alert.FireDate = fireDate.ToNSDate();

	var keys = new object[] { &quot;yourKey&quot; };
	var objects = new object[] { &quot;yourKeyValue&quot; };
	var userInfo = NSDictionary.FromObjectsAndKeys(objects, keys);
	alert.UserInfo = userInfo;

	return alert;
}
</pre>
<p>I hope that you enjoyed reading my blog-post and that I could help you with my infos.</p>
<p><a href="http://blog.fusonic.net/2011/08/monotouch-%E2%80%93-tips-and-tricks-part-3/">In part 3 I will write about some of the following topics</a>:</p>
<ul>
<li>Increase user experience by using UI-Toasts for action-feedback.</li>
<li>Making UIWebViews transparent</li>
<li>Buttons with image scaling</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/07/monotouch-%e2%80%93-tips-and-tricks-part-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Monotouch – Tips and Tricks (Part 1)</title>
		<link>http://blog.fusonic.net/2011/07/monotouch-tips-and-tricks-part-1/</link>
		<comments>http://blog.fusonic.net/2011/07/monotouch-tips-and-tricks-part-1/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 08:44:10 +0000</pubDate>
		<dc:creator>David Roth</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[Monotouch]]></category>
		<category><![CDATA[iOS Development]]></category>
		<category><![CDATA[blackscreenbug]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[monotouch]]></category>

		<guid isPermaLink="false">http://blog.fusonic.net/?p=366</guid>
		<description><![CDATA[+Mono

I recently had the joy writing the IPhone-implementation of our fantastic Fusonic EventGuide Product.
Because of my C# .NET/Mono experience and love it was obvious to reuse skills and libraries and so we bought a licence of MonoTouch. This was after the drop of the monotouch team, but luckily mtouch 4.0 is very mature and from my point of view it is definitely worth investing this money even though you will have to buy the Xamarin IOS version sooner or later.

Although programming against the Monotouch APIs using monodevelop was a real joy and really straight forward, you will come over some problems or nasty bugs from time to time. The goal of my blog series is to summarize my experiences in the last two weeks, show you up some common pitfalls and tell you some tips + tricks and useful libraries I used for our product.]]></description>
			<content:encoded><![CDATA[<div style="float: left; margin: 5px; text-align: center;"><a href="http://blog.fusonic.net/wp-content/uploads/2011/07/eventguide.png"><img class="alignleft size-full wp-image-756" title="eventguide" src="http://blog.fusonic.net/wp-content/uploads/2011/07/eventguide.png" alt="eventguide" width="150" height="150" /></a><br />
+<br />
<a href="http://blog.fusonic.net/wp-content/uploads/2011/07/mono.png"><img class="size-full wp-image-758 aligncenter" title="mono" src="http://blog.fusonic.net/wp-content/uploads/2011/07/mono.png" alt="" width="110" height="55" /></a></div>
<p>I recently had the joy of writing the IPhone-implementation of our amazing <a href="http://www.fusonic.net/de/Produkte/Mobile-Applications">Fusonic EventGuide Product</a>.<br />
Because of my C# .NET/Mono experience and love it was obvious to reuse skills and libraries and so we bought a licence of <a href="http://monotouch.net/">MonoTouch</a>. This was after the lay-off of the monotouch team, but luckily mtouch 4.0 is very mature and from my point of view it is definitely worth investing this money even though you will have to buy the Xamarin IOS version sooner or later.</p>
<p>Although programming against the Monotouch APIs using monodevelop was a real joy and really straight forward, you will come over some problems or nasty bugs from time to time. The goal of my blog series is to summarize my experiences in the last two weeks, show you up some common pitfalls and tell you some tips + tricks and useful libraries I used for our product.</p>
<p><span id="more-366"></span></p>
<ol>
<li><strong>Why is my app being killed when the debugger is attached after some seconds?<br />
</strong></li>
<p>It&#8217;s important to know that your Iphone will kill your application if the startup process takes longer than 10 seconds.<strong> </strong>That means that you can not debug your <strong>FinishedLaunching</strong> method in the App-Delegate for longer than 10 seconds.  I do recommend invoking the <strong>BeginInvokeOnMainThread </strong>method in the <em>FinishedLaunching </em>method. This way the method will return in time and your initialization code will be executed in a new dispatcher stack frame where you can happily debug it for as long as you want:</p>
<pre class="brush: csharp; title: ; notranslate">
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
    window.AddSubview(navigationController.View);
    window.MakeKeyAndVisible ();

    BeginInvokeOnMainThread(() =&gt; {
    // Invoke your initialization code here!
    });
}
</pre>
<li><strong>Simulator does not start automatically or iphone shows a black screen (black screen bug)<br />
</strong>This is a very annoying bug and I do not have a solution that will work in every case.  Although here are some steps you can try to get back into game again:<br />
But I have to warn you, the following may sound insane, but unfortunately I do not have a real profound solution:</p>
<ul>
<li> Delete your simulator content (from the simulator menu choose: iPhone   Simulator  =&gt; Reset Content and   Settings)</li>
<li>Create a new empty monotouch project in your solution, set it as a startup project and let it run</li>
<li>If the new project will show up in your simulator you have to copy   over all files from the old project into the new one. Now your app  should hopefully run again.</li>
</ul>
<p>If someone has a more profound solution for solving this annoying problem, I&#8217;d be happy hearing it!</li>
<li><em><strong>Convert System.DateTime to NSDate via extension methods</strong></em></li>
<p><em> </em>You will need to convert NSDate to DateTime and vise versa when using local notifications. This is how you can easily do it using extension methods:</p>
<pre class="brush: csharp; title: ; notranslate">
public static class DateExtensions
{
    public static NSDate ToNSDate(this DateTime dateTime)
    {
           return NSDate.FromTimeIntervalSinceReferenceDate((dateTime-(new DateTime(2001,1,1,0,0,0))).TotalSeconds);
    }

    public static DateTime ToDateTime(this NSDate nsDate)
    {
            return (new DateTime(2001,1,1,0,0,0)).AddSeconds(nsDate.SecondsSinceReferenceDate);
    }
}
</pre>
<li><em><strong>Do NOT name your resource-folders &#8220;Resources&#8221; or &#8220;resources&#8221;</strong><strong><br />
</strong></em>You will likely need some resources in your application like icons, images or other files. In the .net-world it is common to add these files to a folder named &#8220;R/resources&#8221;, but in the iphone world you are not allowed to do so because this folder is already reserved for other purposes. If you try using a folder named &#8220;resources&#8221; (lowercase), it will work when running in the simulator, but as soon as you do a distribution build with code signing, Itunes will quit your installation with the following error: <em><strong>The app &#8220;YourAppName&#8221; was not installed on the IPhone &#8220;Test Iphone&#8221; because the app signature is not valid.</strong></em><strong><em><br />
</em></strong>So in order to fix this =&gt; rename your folder :)</li>
</ol>
<p>I hope you enjoyed reading this first part of my monotouch blog series. <a href="http://blog.fusonic.net/2011/07/monotouch-%E2%80%93-tips-and-tricks-part-2/">In Part-2 of my blog-series</a> I wrote about:</p>
<ul>
<li>How to create and use NSNotifications</li>
<li>How to simulate NSNotifications behavior when the application has already been killed. (handling it in the FinishedLaunching method)</li>
<li>A simple UIAlertView helper.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusonic.net/2011/07/monotouch-tips-and-tricks-part-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

