<?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>Wolf Paulus</title>
	<atom:link href="http://wolfpaulus.com/feed" rel="self" type="application/rss+xml" />
	<link>http://wolfpaulus.com</link>
	<description>Journal</description>
	<lastBuildDate>Mon, 10 Jun 2013 17:28:58 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Working with files on an external USB Hard-Drive</title>
		<link>http://wolfpaulus.com/jounal/hardware/thunderbolt_usb_harddrive?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=thunderbolt_usb_harddrive</link>
		<comments>http://wolfpaulus.com/jounal/hardware/thunderbolt_usb_harddrive#comments</comments>
		<pubDate>Sat, 01 Jun 2013 22:38:48 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Harddrive]]></category>
		<category><![CDATA[Thunderbolt]]></category>
		<category><![CDATA[usb]]></category>
		<category><![CDATA[webcam]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=3681</guid>
		<description><![CDATA[I am the proud owner of an Apple Thunderbolt Display (2 [...]]]></description>
				<content:encoded><![CDATA[<p>I am the proud owner of an Apple Thunderbolt Display (2560&#215;1440). It has an outstanding image quality, comes with built-in microphone, speakers, and autofocus FaceTime HD camera.<br />
<em>- Btw, the camera does a rather poor job with the white balance and has a red tint, but becomes useable with a tool like <a href="http://ecamm.com/mac/iglasses/" target="_blank">iGlasses 3</a> -</em></p>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/06/apple-11q3-thunderboltdisplay-rear-sm.jpg"><img src="http://wolfpaulus.com/wp-content/uploads/2013/06/apple-11q3-thunderboltdisplay-rear-sm.jpg" alt="apple-11q3-thunderboltdisplay-rear-sm" width="350" height="170" class="alignright size-full wp-image-3693 colorbox-3681" /></a> On the back, it has three USB -, one Firewire -, one Thunderbolt, and one Ethernet port. There is also this single bigger cable to the Laptop, combining Thunderbolt and power and keeping the desk neatly organized.</p>
<p>For a year or so, I have an external USB Harddrive (Western Digital 2 TerraBytes) connected to one of the display&#8217;s USB ports. I&#8217;m mainly using it for Time-Machine backups and storing application disk images etc. Since all cables disappear behind the display and not cluttering my desk, I never thought about connecting the harddrive straight to one of the Laptop&#8217;s USB ports directly. However, as it turns out, my nice and neat setup comes with quite a penalty.<br />
<span id="more-3681"></span><br />
With the setup described above, 15 inch Macbook Pro connected to a Thunderbolt monitor, which is connected to a 2TB WD external USB Harddrive, I picked a roughly 1GB movie file and copied it form the Laptop&#8217;s 500 MB SSD to the external harddrive. After that I reversed the process and copied the file back from the external drive, on to the internal solid state drive.<br />
I used new names, i.e. didn&#8217;t override an existing file, and no other user applications but the Terminal were running. I used the simple <em>time</em> command to measure the performance like so:</p>
<p><code>time cp ./Movie1.mov /Volumes/TERA/</code></p>
<p>I ran every copy three times but recorded only the fasted time. Then I unmounted the drive and connected it straight to one of the Macbook&#8217;s USB ports, i.e., not sending the data through the Thunderbolt display. Again, I used new names, i.e. didn&#8217;t override an existing file, and no other user applications but the Terminal were running.</p>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/06/tb11.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/06/tb11.png" alt="tb1" width="1024" height="768" class="aligncenter size-full wp-image-3686 colorbox-3681" /></a></p>
<p>I know, this is not a very scientific test but you can see that writing files to the external harddrive, when it&#8217;s connected to the Thunderbolt display is quite a bit slower, takes about twice as long. When reading files back from the external drive, the penalty is not as bad.<br />
Just for fun, I also measured the time (and datatransfer speed) it takes to copy the file on the SSD.</p>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/06/tb21.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/06/tb21.png" alt="tb2" width="1024" height="768" class="aligncenter size-full wp-image-3687 colorbox-3681" /></a><br />
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/hardware/thunderbolt_usb_harddrive/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speak now&#8230; Listening&#8230;</title>
		<link>http://wolfpaulus.com/jounal/software/listening?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=listening</link>
		<comments>http://wolfpaulus.com/jounal/software/listening#comments</comments>
		<pubDate>Sun, 26 May 2013 19:07:58 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[speech recognition]]></category>
		<category><![CDATA[speech synthesis]]></category>
		<category><![CDATA[vui]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=3649</guid>
		<description><![CDATA[You may have seen the impressive demo of Google&#8217;s [...]]]></description>
				<content:encoded><![CDATA[<p>You may have seen the impressive demo of Google&#8217;s Web Speech API, during the 3 hour long keynote at this year&#8217;s Google I/O conference. However, experiencing an interactive speech-enabled web search yourself, can be even more enlightening.</p>
<h1>Prerequisites</h1>
<p>Your computer needs to be equipped with a microphone and speakers and needs to have the latest version of Google&#8217;s <a href="https://www.google.com/chrome/" target="_blank">Chrome browser</a> installed, which is currently Version 27.0.1453.93.</p>
<h2>Experiencing Speech-enabled Web Search</h2>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/05/smallmic.png"><img class="alignright size-full wp-image-3654 colorbox-3649" alt="smallmic" src="http://wolfpaulus.com/wp-content/uploads/2013/05/smallmic.png" width="114" height="101" /></a><br />
Now goto <a href="https://www.google.com/" target="_blank">https://www.google.com</a> and click on the small microphone icon, on the right side of the text input field.<br />
The page your were looking at disappears and is replaced with a much larger red microphone and text that changes from &#8220;Speak Now&#8221; to &#8220;Listening&#8230;&#8221;</p>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/05/listening1.png"><img class="aligncenter size-full wp-image-3669 colorbox-3649" alt="listening" src="http://wolfpaulus.com/wp-content/uploads/2013/05/listening1.png" width="600" height="461" /></a></p>
<p><span id="more-3649"></span>Your computer&#8217;s microphone is now &#8220;hot<em>&#8220;</em>. Try it out. Say something like <em>&#8220;What will the weather be like tomorrow?&#8221;</em>. You will <strong>hear</strong> a spoken response like <span style="color: #339966;"><em>&#8220;Tomorrow&#8217;s forecast for Poway is 73 degrees and partly cloudy.&#8221;</em></span> The location for the forecast is determined by your current IP address, but you can also add a location, for instance by asking <em>&#8220;What will the weather be like tomorrow in Frankfurt Germany?&#8221;</em> Or try something like <em>&#8220;Stock Quote for Apple&#8221;</em> or <em>&#8220;Where is the closest microbrewery?&#8221;</em>.<br />
Often (but not always) will you get a spoken response and a search result page that leads with an information card, similar to the cards displayed by the Google Now mobile app.</p>
<p>Here for instance is visual information that is returned while you hear <span style="color: #339966;"><em>&#8220;Apple closed up 0.68 percent at 445 dollars and 15 cents.&#8221;</em></span><br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/05/infocard.png"><img class="aligncenter size-full wp-image-3660 colorbox-3649" alt="infocard" src="http://wolfpaulus.com/wp-content/uploads/2013/05/infocard.png" width="578" height="329" /></a><br />
The voice that is used for the speech synthesis may sound very familiar to users of Google&#8217;s mobile navigation apps. It is a hight quality voice, encoded as MPEG Layer 3, 1 channels, 16KHz.<br />
In case you read this post in Google Chrome or any HTML-5 compliant browser, you =should be able to listen to an example right here:<br />
<br/><br />
<audio width="300" height="32" controls="controls"><source src="http://wolfpaulus.com/wp-content/uploads/2013/05/apple.mp3" type="audio/mpeg" /><br />
Your browser does not support the audio element.</audio><br />
<br/></p>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/software/listening/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://wolfpaulus.com/wp-content/uploads/2013/05/apple.mp3" length="23904" type="audio/mpeg" />
		</item>
		<item>
		<title>Chatbots 3.3 Conference</title>
		<link>http://wolfpaulus.com/jounal/software/chatbots33?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=chatbots33</link>
		<comments>http://wolfpaulus.com/jounal/software/chatbots33#comments</comments>
		<pubDate>Sat, 30 Mar 2013 04:16:05 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AIML]]></category>
		<category><![CDATA[Chatbot]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[Loebner Prize]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[vui]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=3463</guid>
		<description><![CDATA[The Gathering The legends and current elites of AIML an [...]]]></description>
				<content:encoded><![CDATA[<h1>The Gathering</h1>
<p>The legends and current elites of <a href="http://en.wikipedia.org/wiki/AIML">AIML</a> and Turing AI (not necessarily disjoint groups) met for their yearly gathering at Seed Philly, a Philadelphia tech startup incubator, located in the heart of Center City.</p>
<p>The Chatbots 3.3 conference was a fast flowing event with exciting flash-talk style presentations, always followed by Q&amp;A segments. The amazing speaker lineup included several <a href="http://en.wikipedia.org/wiki/Loebner_Prize">Loebner Prize</a> winners, AIML Engine developers, VCs, Psychiatrists, Artificial Intelligence researcher, and best-selling authors.</p>
<div id="attachment_3466" class="wp-caption aligncenter" style="width: 560px"><a href="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0620.jpg"><img class="size-full wp-image-3466 colorbox-3463" title="Dr. Richard Wallace" alt="20130323-IMG_0620" src="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0620.jpg" width="550" height="367" /></a><p class="wp-caption-text">Dr. Richard Wallace</p></div>
<h1>The Highlights</h1>
<p><a href="http://en.wikipedia.org/wiki/Richard_Wallace_(scientist)"><b>Dr. Richard Wallace</b></a><b>, </b>Loebner Prize Winner 2000, 2001, 2004 and father of AIML, talked about the new <a href="https://docs.google.com/document/d/1wNT25hJRyupcG51aO89UcQEiG-HkXRXusukADpFnDs4/pub">AIML 2.0 Specification</a> that focuses much on making AIML more succinct, while maintaining its simplicity. He stated that it currently took about 10,000 AIML categories to create a believable character. <i>ALICE</i> for instance has about 100,000 categories and the <i>PROFESSOR</i>, a bot with one of the largest AIML knowledge bases, has about 580,000 AIML categories. Writing that many categories is not only very time consuming (experienced AIML authors may be able to write one category per minute) but also requires a memory capacity, not  available on many embedded and mobile devices. AIML 2.0 therefore tries to make AIML more efficient, allowing the creation of a believable character with as little as 1/6 of the categories needed before.<br />
<span id="more-3463"></span><br />
<div id="attachment_3467" class="wp-caption aligncenter" style="width: 560px"><a href="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0648.jpg"><img class="size-full wp-image-3467 colorbox-3463" title="Mohan Embar" alt="20130323-IMG_0648" src="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0648.jpg" width="550" height="367" /></a><p class="wp-caption-text">Mohan Embar</p></div></p>
<p><a href="http://www.chipvivant.com/"><b>Mohan Embar</b></a>, 2012 Loebner Prize Winner for his bot entry <a href="http://aidreams.co.uk/forum/index.php?page=Mohan_Embar_Interview_-_2012_Loebner_Prize_Winner_with_Chip_Vivant"><i>Chip Vivant,</i></a> gave an informal talk entitled <i>Moonshot or Low-Hanging Fruit</i>, sharing his motivation for creating his bot (which is not based on AIML) and encouraging other bot authors to question their own motivation and to stay focussed.</p>
<div id="attachment_3468" class="wp-caption alignright" style="width: 343px"><a href="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0677.jpg"><img class="size-full wp-image-3468  colorbox-3463" title="Dave Morton" alt="20130323-IMG_0677" src="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0677.jpg" width="333" height="500" /></a><p class="wp-caption-text">Dave Morton</p></div>
<p>He currently works on creating a more empathetic and engaging bot that is more than simply reacting. He suggested a project that would allow to program a bot with a persons&#8217; personality, core-values, views, achievements, etc. which would be available after the persons&#8217; death, for relatives and friends to still communicate with the deceased.</p>
<p><a href="http://www.cascobaymedical.org/"><b>Jeremy Spiegel</b></a>, MD, Cascon Bay Medical, was making the case for the use of Chatbots in Psychiatry, <a href="http://www.geekcavecreations.com/?personal"><b>Dave Morton</b></a>, Lead developer of the <a href="http://blog.program-o.com/">Program-O</a> AIML-Interpreter, talked about the improvements he is currently making on the PHP/MySQL based engine, and <a href="http://wolfpaulus.com"><b>Wolf Paulus</b></a>, Inuit Inc., talked about <a href="http://wolfpaulus.com/slides">Voice Enabling Chatbots</a>.</p>
<div id="attachment_3469" class="wp-caption alignright" style="width: 343px"><a href="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0695.jpg"><img class="size-full wp-image-3469  colorbox-3463" title="Bill DeSmedt" alt="20130323-IMG_0695" src="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0695.jpg" width="333" height="500" /></a><p class="wp-caption-text">Bill DeSmedt</p></div>
<p><a href="http://en.wikipedia.org/wiki/Bill_DeSmedt"><b>Bill DeSmedt</b></a>, system designer, Artificial Intelligence researcher, and science fiction author (Singularity (2004), Dualism (2010)) talked about his PASCAL based deductive and inductive reasoning system that can solve reasonably sophisticated murder mystery puzzles when fed with all the facts.</p>
<p>Dave Morton</p>
<div id="attachment_3470" class="wp-caption alignright" style="width: 343px"><a href="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0724.jpg"><img class="size-full wp-image-3470  colorbox-3463" title="Chris Shaw" alt="20130323-IMG_0724" src="http://wolfpaulus.com/wp-content/uploads/2013/03/20130323-IMG_0724.jpg" width="333" height="500" /></a><p class="wp-caption-text">Chris Shaw</p></div>
<p>The event ended with an invigorating talk from the entertaining, always challenging, and thought provoking <a href="http://www.haptek.com/"><b>Chris Shaw</b></a>. His focus was more on visual expression rather than artificial intelligence, showing many of the cutting edge visual presentations of avatars, like <a href="http://www.cam.ac.uk/research/news/face-of-the-future-rears-its-head">Zoe</a> . Chris emphasized the importance of tell a compelling story, a bots needs to be able to play a role in an interactive drama and always needs to be able to create that moment of surprise. He concluded with stressing the significance of sound quality of a natural voice over any visual presentation.</p>
<h1>The Conclusion</h1>
<p>Seeing the legends of AIML and Turing AI being all invigorated and out in force, confirmed the intuition that everyone at the conference seemed to have had: all the parts and pieces are finally coming together, to create an believable virtual human.</p>
<p>There was a spirit of optimism that many of the more experienced could only compare with the time shorty before the word-wide-web popularized the Internet.</p>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/software/chatbots33/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing Java 7.x and Tomcat 7.x on Debian Squeeze</title>
		<link>http://wolfpaulus.com/jounal/software/tomcat_squeeze?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tomcat_squeeze</link>
		<comments>http://wolfpaulus.com/jounal/software/tomcat_squeeze#comments</comments>
		<pubDate>Fri, 15 Mar 2013 23:23:11 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[Webmin]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=3426</guid>
		<description><![CDATA[Tomcat 7 is the first Apache Tomcat release to support  [...]]]></description>
				<content:encoded><![CDATA[<p>Tomcat 7 is the first Apache Tomcat release to support the Servlet 3.0, JSP 2.2, and EL 2.2 specifications. Please note that Tomcat 7 requires Java 1.6 or better so we start with installing a recent version of Oracle&#8217;s JRE.</p>
<h2>Install Oracle JRE 7 on Debian Linux</h2>
<p>To install Oracle&#8217;s Java Runtime with <em>apt-get</em>, we first need to entend the list of apt-get&#8217;s sources. Once that is done, an java-installer will actually install the Java SE Runtime Environment. Here are the steps to follow:<br />
<span id="more-3426"></span></p>
<pre class="brush: bash; title: Installing Java 7; notranslate">
$ su root
# echo &quot;deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main&quot; &gt; /etc/apt/sources.list.d/webupd8team-java.list
# echo &quot;deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main&quot; &gt;&gt; /etc/apt/sources.list.d/webupd8team-java.list
# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
# apt-get update
# apt-get install oracle-java7-installer
# java -version
java version &quot;1.7.0_17&quot;
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
# exit
$
</pre>
<p>With Java now installed we move on, installing Tomcat. However, it may be beneficial to have an dedicated user for Tomcat, in case you &#8230;<br />
BTW, Java got installed into this location: <strong>/usr/lib/jvm/java-7-oracle</strong></p>
<pre class="brush: bash; title: Creating a new user, sans password, no direct logins; notranslate">
sudo adduser \
  --system \
  --shell /bin/bash \
  --gecos 'Tomcat Java Servlet and JSP engine' \
  --group \
  --disabled-password \
  --home /home/tomcat \
  tomcat
</pre>
<h2>Installing Tomcat7</h2>
<pre class="brush: bash; title: Downloading and unarchiving the archive; notranslate">
$ cd /tmp
$ wget http://mirror.cogentco.com/pub/apache/tomcat/tomcat-7/v7.0.37/bin/apache-tomcat-7.0.37.tar.gz
$ tar xvzf ./apache-tomcat-7.0.37.tar.gz
</pre>
<pre class="brush: bash; title: Moving the distribution into /usr/share/tomcat7; notranslate">
$ sudo mkdir /usr/share/tomcat7
$ sudo mv /tmp/apache-tomcat-7.0.37 /usr/share/tomcat7
</pre>
<p>To make it easy to replace this release with future releases, we are going to create a symbolic link that we are going to use when referring to Tomcat (after removing the old link, you might have from installing a previous version):</p>
<pre class="brush: bash; title: Linking tomcat to tomcat7.x.x; notranslate">
$ sudo rm -f /usr/share/tomcat
$ sudo ln -s /usr/share/tomcat7/apache-tomcat-7.0.37 /usr/share/tomcat
</pre>
<p>Since we created a <em>tomcat</em> user, he should also own all these files in</p>
<pre class="brush: bash; title: Changing ownership and make scripts executable; notranslate">
$ sudo chown -R tomcat:tomcat /usr/share/tomcat7
$ sudo chmod +x /usr/share/tomcat/bin/*.sh
</pre>
<p>If Tomcat&#8217;s default HTTP port (8080) is already in use, you need to edit the server.xml configuration file, e.g.<br />
edit /usr/share/tomcat/conf/server.xml and replace 8080 with 8000</p>
<h2>Starting Tomcat</h2>
<pre class="brush: bash; title: Tomcat Startup; notranslate">
$ sudo /bin/su - tomcat -c /usr/share/tomcat/bin/startup.sh

Using CATALINA_BASE:   /usr/share/tomcat
Using CATALINA_HOME:   /usr/share/tomcat
Using CATALINA_TMPDIR: /usr/share/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar
</pre>
<p style="text-align: center;"><a href="http://wolfpaulus.com/wp-content/uploads/2013/03/sc2.png"><img class="aligncenter  wp-image-3442 colorbox-3426" alt="sc2" src="http://wolfpaulus.com/wp-content/uploads/2013/03/sc2.png" width="571" height="559" /></a></p>
<h2>Stopping Tomcat</h2>
<pre class="brush: bash; title: Tomcat Shutdown; notranslate">
$sudo /bin/su - tomcat -c /usr/share/tomcat/bin/shutdown.sh

Using CATALINA_BASE:   /usr/share/tomcat
Using CATALINA_HOME:   /usr/share/tomcat
Using CATALINA_TMPDIR: /usr/share/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar
</pre>
<h2>Tomcat with Webmin</h2>
<p style="text-align: center;">If you were to manage your debian server with WebMin, the configuration of the start/stop behavior would look like this<br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/03/sc1.png"><img class="aligncenter  wp-image-3439 colorbox-3426" alt="sc1" src="http://wolfpaulus.com/wp-content/uploads/2013/03/sc1.png" width="501" height="221" /></a><br />
which created a script just like this one:</p>
<pre class="brush: bash; title: Webmin Tomcat Startup/Shutdown; notranslate">
#!/bin/sh
### BEGIN INIT INFO
# Provides: Tomcat
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 5
# Description: Java Servlet and JSP Engine
### END INIT INFO

case &quot;$1&quot; in
'start')
	/bin/su - tomcat -c /usr/share/tomcat/bin/startup.sh
	;;
'stop')
	/bin/su - tomcat -c /usr/share/tomcat/bin/shutdown.sh
	;;
*)
	echo &quot;Usage: $0 { start | stop }&quot;
	;;
esac
exit 0
</pre>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/software/tomcat_squeeze/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Speech Synthesis and the Quality of Voice</title>
		<link>http://wolfpaulus.com/jounal/android-journal/speechsynthesis?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=speechsynthesis</link>
		<comments>http://wolfpaulus.com/jounal/android-journal/speechsynthesis#comments</comments>
		<pubDate>Sat, 02 Mar 2013 00:10:39 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[natural user interface]]></category>
		<category><![CDATA[nui]]></category>
		<category><![CDATA[speech synthesis]]></category>
		<category><![CDATA[tts]]></category>
		<category><![CDATA[voice user interface]]></category>
		<category><![CDATA[vui]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=3372</guid>
		<description><![CDATA[When listing to the radio or a podcast, while driving t [...]]]></description>
				<content:encoded><![CDATA[<p>When listing to the radio or a podcast, while driving to work, I don&#8217;t think I imagine how the person I&#8217;m listing to, looks like. Still, if later, I happen to see them for the first time, in a picture or video, I often find myself surprised.</p>
<p>A verbally responding mobile application has many obvious advantages. For instance, users don&#8217;t have to decipher tiny fonts on small displays, in fact, they don&#8217;t have to look at the display at all. Just like colors and typography contribute considerably to the look and feel of an application, so does the voice quality for a voice enabled mobile application.</p>
<h3>There are at least three different approaches to synthesize text.</h3>
<p>There might be a Text-To-Speech module built into the OS, or a separately installed Text-o-Speech engines can plug-in to the OS&#8217;s Text-To-Speech module.<br />
Secondly, instead of requiring a separate install, a synthesizer and voices can be packaged and shipped with the application.<br />
Lastly, a web-service can be used, to synthesize text. The advantage of this, would be a more predictable and consistent voice quality, comparatively independent from the hardware and operation system used on the mobile client.</p>
<p><span id="more-3372"></span></p>
<div class='et-box et-shadow'>
					<div class='et-box-content'><strong>Quality of Voice</strong>
Voice quality is that component of speech which gives the primary distinction to a given speaker&#8217;s voice when <em>pitch</em> and <em>loudness</em> are excluded. It involves both <em>phonatory</em> and <em>resonatory</em> characteristics. Some of the descriptions of voice quality are <em>harshness</em>, <em>breathiness</em> and <em>nasality</em>.</div></div>
<h2>Voice Synthesis Demo</h2>
<p><object width="230" height="390" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.neospeech.com/NeoSpeech.swf" /><embed width="230" height="390" type="application/x-shockwave-flash" src="http://www.neospeech.com/NeoSpeech.swf" /> </object></p>
<p>Voiceware Co.,Ltd., located in Seoul, Korea, provides one of the highest speech synthesis quality solutions available. This however is highly subjective, see &#8220;Factors to assess voice quality&#8221; below.</p>
<p>Listener&#8217;s choice of what is a <em>good</em> voice is subjective without measurable units. However, a voice can still be described as:</p>
<ul>
<li><strong>Bright</strong>: Higher loudness without effort (not-shouting)</li>
<li><strong>Confident</strong>: Steady Pitch and Loudness level –opposite of wavering</li>
<li><strong>Melodious</strong>: Good correlation between Pitch and loudness</li>
<li><strong>Resonant</strong>: Articulation tuned to Pitch – Ringing</li>
<li><strong>Hoarse</strong>: Presence of noise component – absence of harmonics</li>
<li><strong>Pressed</strong>: Long closed phase in vibration cycle</li>
<li><strong>Breathy</strong>: Steep spectral slope, strong fundamental</li>
<li><strong>Nasal</strong>: Heavily damped resonances</li>
</ul>
<h2>Factors to assess voice quality</h2>
<p>Voice quality depends not only on the functioning of the voice box or the larynx but also on articulation (enunciation or pronunciation), rate of speech (too rapid or too slow), intonation, pauses etc.</p>
<ul>
<li><strong>Rate</strong> of speaking: Number of words per breath, Number of words per minute</li>
<li><strong>Rhythm</strong> of Speech: Accent and Inflections (Pitch range)</li>
<li><strong>Breathing</strong> Pattern: Speech as during fast walking Vs relaxed</li>
<li><strong>Pitch</strong> Level: Habitual F0 or Pitch</li>
<li><strong>Loudness</strong> level: Deafening (too loud) Vs Whispering (too soft)</li>
<li><strong>Mood</strong> State: Sudden changes in pitch level, loudness and rhythm</li>
<li><strong>Clarity</strong> of Speech: Good articulatory habit</li>
</ul>
<h2>When perceiving a persons credibility, accent is more important than looks</h2>
<p><object width="480" height="288" classid="clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b" codebase="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"><param name="src" value="http://www.americanenglish.us/file.php/1/Perceptions.mov" /><param name="controller" value="true" /><param name="autoplay" value="false" /><param name="autostart" value="0" /><param name="pluginspage" value="http://www.apple.com/quicktime/download/" /><embed width="480" height="288" type="video/quicktime" src="http://www.americanenglish.us/file.php/1/Perceptions.mov" controller="true" autoplay="false" autostart="0" pluginspage="http://www.apple.com/quicktime/download/" /><!--[if !IE]> <--> <img src="http://wolfpaulus.com/wp-includes/js/tinymce/themes/advanced/img/trans.gif" class="mceItemMedia mceItemQuickTime colorbox-3372" width="480" height="288" data-mce-json="{'video':{},'params':{'pluginurl':'http://www.apple.com/quicktime/download/','controller':'true','autoplay':'false','autostart':'0','src':'http://www.americanenglish.us/file.php/1/Perceptions.mov'},'name':null,'hspace':null,'vspace':null,'align':null,'bgcolor':null}" alt="" /></object></p>
<h2></h2>
<h3>More TTS &#8211; Web Services</h3>
<ul>
<li>Google http://translate.google.com/translate_tts?tl=en&amp;q=text, e.g.:</li>
<li><a href="http://translate.google.com/translate_tts?tl=en_uk&amp;q=Hello+,+how+are+you+today+?" target="_blank">http://translate.google.com/translate_tts?tl=en_uk&amp;q=Hello+,+how+are+you+today+?</a></li>
<li>Free text-to-speech conversion service: <a href="http://speechutil.com/" target="_blank">http://speechutil.com/</a></li>
<li>Microsoft http://www.microsofttranslator.com/dev/ an example would be http://www.bing.com/translator/</li>
<li>iSpeech Demo: <a href="http://www.ispeech.org/text.to.speech" target="_blank">http://www.ispeech.org/text.to.speech</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/android-journal/speechsynthesis/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.americanenglish.us/file.php/1/Perceptions.mov" length="7403288" type="video/quicktime" />
<enclosure url="http://translate.google.com/translate_tts?tl=en&amp;amp" length="0" type="image/gif" />
<enclosure url="http://translate.google.com/translate_tts?tl=en_uk&amp;amp" length="0" type="image/gif" />
		</item>
		<item>
		<title>Artist on Android w/ Voice Recognition</title>
		<link>http://wolfpaulus.com/jounal/android-journal/artist-voice-recognition?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=artist-voice-recognition</link>
		<comments>http://wolfpaulus.com/jounal/android-journal/artist-voice-recognition#comments</comments>
		<pubDate>Fri, 22 Feb 2013 04:37:28 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gui]]></category>
		<category><![CDATA[print]]></category>
		<category><![CDATA[voice recognition]]></category>
		<category><![CDATA[vui]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=3333</guid>
		<description><![CDATA[Artist on Android The display is the canvas and your fi [...]]]></description>
				<content:encoded><![CDATA[<div id="APTFF_by_TAP-by-shortcode-746" class="AlpinePhotoTiles_inpost_container"><!-- Using AlpinePT for Flickr v1.2.5 with Flickr API V2 --><!-- Success using wp_remote_get() and PHP_Serial --><div id="id746-AlpinePhotoTiles_container" class="AlpinePhotoTiles_container_class"><div id="id746-hidden-parent" class="AlpinePhotoTiles_parent_class" style="width:100%;max-width:100%;padding:0px;margin:0px auto;text-align:center;"><div id="id746-image-list" class="AlpinePhotoTiles_image_list_class" style="display:none;visibility:hidden;"><a href="http://farm8.staticflickr.com/7336/9080181124_406ae50942_z.jpg" class="AlpinePhotoTiles-link AlpinePhotoTiles-lightbox" title='Artist on Android' alt='Artist on Android'><img id="id746-tile-0" class="AlpinePhotoTiles-image AlpinePhotoTiles-img-shadow AlpinePhotoTiles-img-border AlpinePhotoTiles-img-corners AlpinePhotoTiles-img-highlight colorbox-3333" src="http://farm8.staticflickr.com/7336/9080181124_406ae50942_s.jpg" title='Artist on Android' alt='Artist on Android' border="0" hspace="0" vspace="0" style=""  /></a><a href="http://farm4.staticflickr.com/3699/9063723191_98d066f2cb_z.jpg" class="AlpinePhotoTiles-link AlpinePhotoTiles-lightbox" title='Artist on Android' alt='Artist on Android'><img id="id746-tile-1" class="AlpinePhotoTiles-image AlpinePhotoTiles-img-shadow AlpinePhotoTiles-img-border AlpinePhotoTiles-img-corners AlpinePhotoTiles-img-highlight colorbox-3333" src="http://farm4.staticflickr.com/3699/9063723191_98d066f2cb_s.jpg" title='Artist on Android' alt='Artist on Android' border="0" hspace="0" vspace="0" style=""  /></a><a href="http://farm4.staticflickr.com/3667/9054186321_0abb0db61a_c.jpg" class="AlpinePhotoTiles-link AlpinePhotoTiles-lightbox" title='Artist on Android' alt='Artist on Android'><img id="id746-tile-2" class="AlpinePhotoTiles-image AlpinePhotoTiles-img-shadow AlpinePhotoTiles-img-border AlpinePhotoTiles-img-corners AlpinePhotoTiles-img-highlight colorbox-3333" src="http://farm4.staticflickr.com/3667/9054186321_0abb0db61a_s.jpg" title='Artist on Android' alt='Artist on Android' border="0" hspace="0" vspace="0" style=""  /></a><a href="http://farm8.staticflickr.com/7401/9048887548_d3e077b33a_z.jpg" class="AlpinePhotoTiles-link AlpinePhotoTiles-lightbox" title='Artist on Android' alt='Artist on Android'><img id="id746-tile-3" class="AlpinePhotoTiles-image AlpinePhotoTiles-img-shadow AlpinePhotoTiles-img-border AlpinePhotoTiles-img-corners AlpinePhotoTiles-img-highlight colorbox-3333" src="http://farm8.staticflickr.com/7401/9048887548_d3e077b33a_s.jpg" title='Artist on Android' alt='Artist on Android' border="0" hspace="0" vspace="0" style=""  /></a><a href="http://farm4.staticflickr.com/3792/8924801125_d000cfaefd_z.jpg" class="AlpinePhotoTiles-link AlpinePhotoTiles-lightbox" title='Artist on Android' alt='Artist on Android'><img id="id746-tile-4" class="AlpinePhotoTiles-image AlpinePhotoTiles-img-shadow AlpinePhotoTiles-img-border AlpinePhotoTiles-img-corners AlpinePhotoTiles-img-highlight colorbox-3333" src="http://farm4.staticflickr.com/3792/8924801125_d000cfaefd_s.jpg" title='Artist on Android' alt='Artist on Android' border="0" hspace="0" vspace="0" style=""  /></a><a href="http://farm6.staticflickr.com/5443/8865983177_d3c0091d8f_c.jpg" class="AlpinePhotoTiles-link AlpinePhotoTiles-lightbox" title='Artist on Android' alt='Artist on Android'><img id="id746-tile-5" class="AlpinePhotoTiles-image AlpinePhotoTiles-img-shadow AlpinePhotoTiles-img-border AlpinePhotoTiles-img-corners AlpinePhotoTiles-img-highlight colorbox-3333" src="http://farm6.staticflickr.com/5443/8865983177_d3c0091d8f_s.jpg" title='Artist on Android' alt='Artist on Android' border="0" hspace="0" vspace="0" style=""  /></a></div></div></div><script>jQuery(document).ready(function() {
  jQuery('#id746-AlpinePhotoTiles_container').addClass('loading'); 
});
jQuery(window).load(function() {
  jQuery('#id746-AlpinePhotoTiles_container').removeClass('loading');
  if( jQuery().AlpinePhotoTilesPlugin ){
    AlpinePhotoTilesPlugin();
  }else{
    var css = 'http://wolfpaulus.com/wp-content/plugins/alpine-photo-tile-for-flickr/css/AlpinePhotoTiles_style.css';
    var link = jQuery(document.createElement('link')).attr({'rel':'stylesheet','href':css,'type':'text/css','media':'screen'});
    jQuery.getScript('http://wolfpaulus.com/wp-content/plugins/alpine-photo-tile-for-flickr/js/AlpinePhotoTiles_script.js', function(){
      if(document.createStyleSheet){
        document.createStyleSheet(css);
      }else{
        jQuery('head').append(link);
      }
      if( !jQuery().colorbox ){ // Load Lightbox
        jQuery.getScript('http://wolfpaulus.com/wp-content/plugins/alpine-photo-tile-for-flickr/js/colorbox/jquery.colorbox-min.js?ver=1.4.5', function(){
          css = 'http://wolfpaulus.com/wp-content/plugins/alpine-photo-tile-for-flickr/js/colorbox/colorbox.css?ver=1.3.21';
          link = jQuery(document.createElement('link')).attr({'rel':'stylesheet','href':css,'type':'text/css','media':'screen'});
          if(document.createStyleSheet){
            document.createStyleSheet(css);
          }else{
            jQuery('head').append(link);
          }
          AlpinePhotoTilesPlugin();
        });
      }else{
        AlpinePhotoTilesPlugin();
      }
    }); //Close getScript
  }
  function AlpinePhotoTilesPlugin() {
      jQuery('#id746-hidden-parent').AlpinePhotoTilesPlugin({
        id:'id746',
        style:'floor',
        shape:'vertical',
        perRow:3,
        imageBorder:1,
        imageShadow:1,
        imageCurve:1,
        imageHighlight:1,
        lightbox:1,
        galleryHeight:0, // Keep for Compatibility
        galRatioWidth:800,
        galRatioHeight:600,
        highlight:'#64a2d8',
        pinIt:0,
        siteURL:'http://wolfpaulus.com',
        callback: function(){jQuery( '#id746-AlpinePhotoTiles_container a.AlpinePhotoTiles-lightbox' ).attr( 'rel', 'alpine-colorbox[id746]' );if(jQuery().colorbox){jQuery( 'a[rel^=\'alpine-colorbox[id746]\']' ).colorbox( {maxHeight:'85%'} );}}
      });
  }
}); //Close load
</script></div>
<p><span id="more-3333"></span><br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/02/png.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/02/png.png" alt="Artist on Android" width="266" height="462" class="alignright size-full wp-image-3321 colorbox-3333" /></a></p>
<h2>Artist on Android</h2>
<p>The display is the canvas and your finger becomes a paint brush.<br />
Simply use your finger to create beautiful paintings.<br />
Use the Menu to change color or brush styles and also to print or share your artwork via Email etc.<br />
Publish your best work on our <a href="http://www.flickr.com/groups/artistonandroid/pool/" target="_blank">flickr group</a>, straight from the app.<br />
Using Advanced Photo Paper has produced stunning print results, worth framing.<br />
I am totally amazed by what users have drawn with this app.<br />
<br clear="all"/><br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/02/png-1.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/02/png-1.png" alt="png-1" width="266" height="462" class="alignright size-full wp-image-3323 colorbox-3333" /></a></p>
<h2>Voice Recognition</h2>
<p>Mobile applications like <em>Artist on Android</em> are perfectly suited to accept voice input.<br />
Instead of accessing the menu several times, to select a tool (like a pen or a brush), its style (like embossed or blurred), and its color, you now press the microphone button in the Actionbar and say &#8220;Lavender Blur Pen&#8221;.</p>
<p>The application&#8217;s vocabulary include all menu topics like &#8220;Pen, Brush, Roll, Emboss, Blur, Blend, Alpha, Erase, Reset, Save, Print, Share Publish, Explore, and Help&#8221; and also over one hundred color names. To bring up a list of all those color names, simply say &#8220;Colors&#8221;.<br />
Speech recognition, interpretation, and processing is hard and &#8220;Artist on Android&#8221; is far from perfect. So please be gracious and generous if it not always understands. We are just getting started ..</p>
<p/>
<a href="https://play.google.com/store/apps/details?id=com.techcasita.android.artist"><img class="colorbox-3333"  alt="Android app on Google Play" src="https://developer.android.com/images/brand/en_app_rgb_wo_45.png"/></a><br />
<br clear="all"/></p>
<p/>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/android-journal/artist-voice-recognition/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing / Updating Python on OS X</title>
		<link>http://wolfpaulus.com/jounal/mac/installing_python_osx?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installing_python_osx</link>
		<comments>http://wolfpaulus.com/jounal/mac/installing_python_osx#comments</comments>
		<pubDate>Mon, 28 Jan 2013 17:00:28 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=2071</guid>
		<description><![CDATA[While Python comes pre-installed on OS X, Apple doesn&# [...]]]></description>
				<content:encoded><![CDATA[<p>While Python comes pre-installed on OS X, Apple doesn&#8217;t do a good job on keeping the Python runtime environment up to date. Currently, on Mac OS X 10.7.4 &#8220;Lion&#8221;, entering <code>python -V</code> returns <code>Python 2.7.1</code>. Even worse, Mac OS X 10.6 &#8220;Snow Leopard&#8221; is still on a Python 2.6 release.<br />
While the latest Python releases are always available on <a href="http://www.python.org" target="_blank">http://www.python.org</a>, updating a Mac isn&#8217;t a simple, straight forward process.</p>
<p>Follow along and update your Mac to Python 2.7.3, or 3.3.0 or whatever the newest 2.x and 3.x release might be, when you read this. To update your Mac to something like Python 2.7.3, I assume that</p>
<ul>
<li>your Mac-User account is setup as an &#8220;Administrator&#8221; account.</li>
<li>your Mac already has this folder: /System/Library/Frameworks/Python.framework/Versions/</li>
</ul>
<p>To read about how to upgrade to Python 3.3, jump to the very bottom of this post.<br />
<span id="more-2071"></span></p>
<h3>1. Downloading and Installing the latest Python Release</h3>
<p>Go to <em>python.org</em> and pick the most recent Python 2.x release: <a href="http://python.org/download" target="_blank">http://python.org/download</a>.<br />
I picked <em>Python 2.7.3 Mac OS X 64-bit/32-bit x86-64/i386 Installer (for Mac OS X 10.6 and later)</em>, an about 18 MB download.<br />
Opening the DMG and executing the installer <em>(Python.mpkg)</em> will install the Python release into <strong>/Library/Frameworks/Python.framework</strong>, which is <strong>not</strong> next to the other, already installed Python versions and may lead to some nasty incompatibilities. Moreover, <code>/usr/bin/python</code> still executes python 2.7.1., i.e. some work still needs to be done to really update Python on your Mac.</p>
<h3>2. Moving Python into the right place</h3>
<p>If Python 2.7.x is already available on the Mac (e.g. on OS X Lion), open a terminal and enter:</p>
<pre class="brush: bash; title: ; notranslate">
sudo rm -R /System/Library/Frameworks/Python.framework/Versions/2.7
</pre>
<p>This will delete Python 2.7.<br />
In any case, now enter this into the terminal</p>
<pre class="brush: bash; title: ; notranslate">
sudo mv /Library/Frameworks/Python.framework/Versions/2.7 /System/Library/Frameworks/Python.framework/Versions
</pre>
<p>which moves the just installed python 2.7.3 release next to the other Python releases.</p>
<h3>3. Fixing the Group</h3>
<p>Setting group to <em>wheel</em>, just like it&#8217;s done for the already installed Python Versions:</p>
<pre class="brush: bash; title: ; notranslate">
sudo chown -R root:wheel /System/Library/Frameworks/Python.framework/Versions/2.7
</pre>
<h3>4. Updating the Current Link</h3>
<pre class="brush: bash; title: ; notranslate">
sudo rm /System/Library/Frameworks/Python.framework/Versions/Current
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7 /System/Library/Frameworks/Python.framework/Versions/Current
</pre>
<h3>5. Fixing /usr/bin</h3>
<p>Since python, pythonw, etc. are not linked but actually reside in the <code>/usr/bin</code> directory,<br />
<code>/usr/bin/python</code> still executes python 2.7.1..<br />
Therefore, we are going to remove the old python executable files and replacing them with links into /System/Library/Frameworks/Python.framework/Versions/Current:</p>
<h4>5.1. Removing old copies</h4>
<pre class="brush: bash; title: ; notranslate">
sudo rm /usr/bin/pydoc
sudo rm /usr/bin/python
sudo rm /usr/bin/pythonw
sudo rm /usr/bin/python-config
</pre>
<h4>5.2. Creating links into /System/&#8230;/Python.framework/Versions/Current</h4>
<pre class="brush: bash; title: ; notranslate">
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/pydoc /usr/bin/pydoc
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python /usr/bin/python
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw /usr/bin/pythonw
sudo ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python-config /usr/bin/python-config
</pre>
<h3>6. Updating .bash_profile</h3>
<p>Use TextMate, pico, or your favorite text editor to edit the hidden ~/.bash_profile file. If you want to be able to execute python tools like idle easily, without providing the path, edit the PATH for Python like this:</p>
<pre class="brush: bash; title: ; notranslate">
# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH=&quot;/System/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}&quot;
export PATH
</pre>
<p>However, you can also remove those four lines altogether or fall-back to the .bash_profile.pysave file.<br />
Try it by closing the terminal app, re-opening it, and entering <code>python -V</code> as well as <code>/usr/bin/python -V</code>.</p>
<h3>7. Updating your IDE</h3>
<p>The last remaining step it to tell your IDE about the new Python release that you just installed.<br />
I hope you have discovered <a href="http://www.jetbrains.com/pycharm/" target="_blank">PyCharm</a>, JetBrain&#8217;s IDE for Python and Django.<br />
In PyCharm, you would open its properties and under &#8220;Project Interpreters&#8221; change the Python Interpreter, by pointing it to the <code>/System/Library/Frameworks/Python.framework/Versions/2.7</code> directory.</p>
<p><img class="aligncenter size-full wp-image-2092 colorbox-2071" title="pycharm" src="http://wolfpaulus.com/wp-content/uploads/2012/07/pycharm.png" alt="" width="550" height="374" /></p>
<h1>Updating to Python 3.3</h1>
<p>Following the same procedure, you can also update to Python 3.3. E.g, I downloaded the <i>Python 3.3.0 Mac OS X 64-bit/32-bit x86-64/i386 Installer</i> form here: <a href="http://python.org/download/" target="_blank">http://python.org/download/</a></p>
<p>After running the included installer, a script like this (run with sudo) should put everything into the right place and make python 3.3 the default python version.</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash
rm -R /System/Library/Frameworks/Python.framework/Versions/3.3
mv /Library/Frameworks/Python.framework/Versions/3.3 /System/Library/Frameworks/Python.framework/Versions
chown -R root:wheel /System/Library/Frameworks/Python.framework/Versions/3.3

rm /System/Library/Frameworks/Python.framework/Versions/Current
ln -s /System/Library/Frameworks/Python.framework/Versions/3.3 /System/Library/Frameworks/Python.framework/Versions/Current

rm /usr/bin/pydoc
rm /usr/bin/python
rm /usr/bin/pythonw
rm /usr/bin/python-config

rm /System/Library/Frameworks/Python.framework/Versions/3.3/bin/pydoc 
rm /System/Library/Frameworks/Python.framework/Versions/3.3/bin/python 
rm /System/Library/Frameworks/Python.framework/Versions/3.3/bin/pythonw 
rm /System/Library/Frameworks/Python.framework/Versions/3.3/bin/python-config 

ln -s /System/Library/Frameworks/Python.framework/Versions/3.3/bin/pydoc3 /usr/bin/pydoc
ln -s /System/Library/Frameworks/Python.framework/Versions/3.3/bin/python3 /usr/bin/python
ln -s /System/Library/Frameworks/Python.framework/Versions/3.3/bin/pythonw3 /usr/bin/pythonw
ln -s /System/Library/Frameworks/Python.framework/Versions/3.3/bin/python3-config /usr/bin/python-config
</pre>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/mac/installing_python_osx/feed</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>E*Trade Mobile – Voice Commands</title>
		<link>http://wolfpaulus.com/jounal/android-journal/etrade-voice-commands?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=etrade-voice-commands</link>
		<comments>http://wolfpaulus.com/jounal/android-journal/etrade-voice-commands#comments</comments>
		<pubDate>Sun, 27 Jan 2013 22:36:44 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[speech recognition]]></category>
		<category><![CDATA[speech synthesis]]></category>
		<category><![CDATA[voice commands]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=3219</guid>
		<description><![CDATA[ETrade provides a great mobile app experience on iPhone [...]]]></description>
				<content:encoded><![CDATA[<p>ETrade provides a great mobile app experience on iPhone, iPad, Android, Windows Phone, and Blackberry. I think it&#8217;s almost expected that the feature-set provided by the dedicated native mobile applications are not quite the same. The Windows version and especially the one for Blackberry fall far behind what <a href="https://play.google.com/store/apps/details?id=com.etrade.mobilepro.activity" target="_blank">ETrade has to offer on Android</a> and iOS.</p>
<p>For instance, in April 2012, Speech Recognition was first added to their iPhone (not iPad) mobile application and later to the Android app as well; allowing the user to request stock quotes, options chains, company information, or to launch the stock order, just by using voice.</p>
<p><em>&#8220;Investors are becoming more accustomed to interacting with voice-enabled technology, and we&#8217;re proud to be one of the first to offer this innovative feature to our mobile users,&#8221;</em> said Michael Curcio, President, ETRADE Securities. <em>&#8220;By integrating voice technology, ETRADE provides a mobile experience unlike any other – creating a state-of-the-art and convenient approach to navigation.&#8221;</em></p>
<p>ETrade uses speech recognition and speech synthesis software provided by <a href="http://www.nuance.com/for-developers/dragon-mobile-sdk/index.htm" target="_blank">Nuance Communications, Inc</a>. The application is feature-packed, comes as an 11 MB download, and is not, what you would call a thin client. Only a very few of those features however, are accessible through Voice Commands.<br />
<span id="more-3219"></span></p>
<h2>Available Voice Commands</h2>
<h3>Stock Quotes</h3>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/01/png.png"><img class="alignright  wp-image-3224 colorbox-3219" alt="ETrade Mobile App" src="http://wolfpaulus.com/wp-content/uploads/2013/01/png.png" width="345" height="598" /></a></p>
<ul>
<li>&#8220;Price [symbol or name]&#8220;</li>
<li>&#8220;Can I get a quote on [symbol or name]?&#8221;</li>
<li>&#8220;Please give me the stock price on [symbol or name]&#8220;</li>
</ul>
<h3>Company News</h3>
<ul>
<li>&#8220;I would like news on [symbol or name]&#8220;</li>
<li>&#8220;News [symbol or name]&#8220;</li>
<li>&#8220;Can I get some news on [symbol or name]?&#8221;</li>
</ul>
<h3>Company Options Chains</h3>
<ul>
<li>&#8220;Can I get options chains on [symbol or name]&#8220;</li>
<li>&#8220;Give me options on [symbol or name]&#8220;</li>
</ul>
<h3>Screen Navigation</h3>
<ul>
<li>Take me to the dashboard&#8221;</li>
<li>&#8220;Show me my accounts please&#8221;</li>
<li>&#8220;I would like to see my alerts&#8221;</li>
<li>&#8220;Can I see my watchlists&#8221;</li>
<li>&#8220;Show me my portfolios&#8221;</li>
</ul>
<h3>Stock Order Ticket</h3>
<ul>
<li>&#8220;Buy 50 shares of [symbol or name]&#8220;</li>
<li>&#8220;Buy 75 shares of [symbol or name] at limit price 9 dollars and 50 cents&#8221;</li>
<li>&#8220;Sell my holdings on [symbol or name]&#8220;</li>
<li>&#8220;Sell 200 shares of [symbol or name]&#8220;</li>
<li>&#8220;Sell 50 shares of [symbol or name] at limit price of 10 dollars&#8221;</li>
</ul>
<h2>Chat Bot</h2>
<p>When it comes to interpreting voice inputs, the Etrade app is much more forgiving than Google&#8217;s. For instance, while only <em>&#8220;Take me to the dashboard&#8221;</em> is listed as a voice command,<br />
<em>&#8220;Open the dashboard&#8221;</em> or <em>&#8220;Show me the dashboard&#8221;</em>, or <em>&#8220;Can I see the dashboard&#8221;</em>, is understood and does open the application&#8217;s dashboard view. However, the monotone voice and demeanor of the bot suggests some kind of bitterness, more than even Apple&#8217;s Siri does. This of course is hight subjective.</p>
<p>Besides what is listed as an available voice command, the Etrade app doesn&#8217;t seem to be very communicative. Simple questions like <em>&#8220;How did the market close today?&#8221;</em>,<em>&#8220;How are you?&#8221;</em>, or <em>&#8220;What is your name?&#8221;</em> all trigger the same answer <em>&#8220;<strong>One moment please &#8211; I&#8217;m sorry I could not process that.</strong>&#8220;</em></p>
<h2>Dissecting the mobile application</h2>
<p>Once the microphone button is pressed, a voice prompt is played <em>&#8220;How can I help you?&#8221;</em> and the application goes into listening mode. It will keep listing until a drop in amplitude is recognized. I.e., if I didn&#8217;t say anything, it kept listening, probably until the phone runs out of battery.<br />
When an amplitude drop is recognized, the sound recording is sent for speech recognition and acknowledged with another voice prompt: <em>&#8220;One moment please.&#8221; </em><br />
The recognition of an input like <em>&#8220;Please give me the stock price on Apple&#8221;</em> creates a spoken output like <em>&#8220;Price 439.88 Change Percent Minus 2.36 Percent&#8221;</em>. The time between the end of the request and the beginning of the response is a little over <strong>5 seconds</strong>. However, the voice prompt <em>&#8220;One moment please&#8221;</em> and the fact that the app shows a view with the requested quote, even before it starts playing the synthesized response, are clever tricks to obscure the relative long delay.</p>
<p>Since the application doesn&#8217;t seem to include the standard Nuance Voice Kit, I am assuming the sound file is not streamed during the recording (the forever listing behavior would be another indication), but rather encoded and sent via HTTP POST once the recording has stopped.<br />
The response is synthesized by a Web-service, instead of on the mobile device itself. While this has the advantage that no high quality voice synthesizer needs to be deployed with the app, the pre-recorded and included voice prompts sound differently, in quality and also noticeably in loudness.</p>
<h2>Final Thoughts</h2>
<p>ETrade has done a great first step, voice-enabling their mobile application. It&#8217;s better than Google&#8217;s Voice Commands, since it&#8217;s much less rigid. And while voice and demeanor remind us of Siri, it&#8217;s good to see trailblazers like Etrade pioneering Voice User Interfaces on mobile.</p>
<h2>Demo</h2>
<p>Take a look and a listen how I interacted with ETrade&#8217;s mobile Android app via Voice Commands:</p>
<p><iframe src="http://player.vimeo.com/video/58228333" height="360" width="640" allowfullscreen="" frameborder="0"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/android-journal/etrade-voice-commands/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sh!t we dislike &#8211; I&#8217;m Watch</title>
		<link>http://wolfpaulus.com/jounal/hardware/imwatch?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=imwatch</link>
		<comments>http://wolfpaulus.com/jounal/hardware/imwatch#comments</comments>
		<pubDate>Wed, 23 Jan 2013 08:00:28 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[bluetooth]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=3080</guid>
		<description><![CDATA[The broad introduction of Voice User Interfaces, which  [...]]]></description>
				<content:encoded><![CDATA[<p>The broad introduction of <em>Voice User Interfaces</em>, which allow humans to interaction with computers through voice/speech, may be the next revolution, when it comes to User Interface Engineering and represent an even bigger change, when compared to the transition from text-based to graphical user interfaces. A Voice User Interfaces seems to be especially attractive on smaller devices, like small phones or watches that don&#8217;t allow for many buttons or have a touch-screen that is just not big enough, to allow for comfortable interactions.<br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/01/pebbles.jpeg"><img class="aligncenter size-full wp-image-3096 colorbox-3080" alt="pebbles" src="http://wolfpaulus.com/wp-content/uploads/2013/01/pebbles.jpeg" width="560" height="420" /></a><br />
The first generation of watches that connect to smartphone via Bluetooth is now available, most of them are not equipped with a microphone and speaker, i.e. don&#8217;t provide a good platform for a Voice User Interface.</p>
<ul>
<li><a href="http://www.kickstarter.com/projects/597507018/pebble-e-paper-watch-for-iphone-and-android" target="_blank">Pebble</a>, E-Paper Watch for iPhone and Android.</li>
<li><a href="http://www.sonymobile.com/us/products/accessories/smartwatch/" target="_blank">Smartwatch</a>, Sony Android watch.</li>
<li><a href="http://www.motorola.com/us/consumers/8GB-or-16GB-MOTOACTV/79070,en_US,pd.html?cgid=fitness-devices" target="_blank">MOTOACTV</a>, Motorola GPS Fitness Tracker with MP3 Player.</li>
<li><a href="http://blog.tokyoflash.com/2012/10/nexd-the-next-gen-android-watch/" target="_blank">NEXD</a>, The Next-gen Android watch.</li>
<li><a href="http://www.imsmart.com/en" target="_blank">i&#8217;m Watch</a>, i&#8217;m SpA, Smartwatch connects via Bluetooth to a phone.</li>
</ul>
<p><span id="more-3080"></span></p>
<h2>i&#8217;m Watch</h2>
<p>However, there is i&#8217;m SpA, an Italian company, maker of the I&#8217;M WATCH, an Android 1.6 powered watch that works as a Bluetooth extension for iPhone and Android phones and comes with microphone and speaker on board.</p>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/01/imwatches.png"><img class="aligncenter size-full wp-image-3097 colorbox-3080" alt="imwatches" src="http://wolfpaulus.com/wp-content/uploads/2013/01/imwatches.png" width="293" height="219" /></a></p>
<h3>Gestures</h3>
<p>I really wanted to like the i&#8217;m Watch, but a couple of significant shortcomings became immediately obvious, during the setup process.<br />
There is a delay with all touch and swipe gestures, which we are just not used to anymore. A response often comes delayed and you end up pressing buttons twice. Mainly due to the small display size, gestures seem too sensitive, i.e. minuscule gestures create unexpected effects.<br />
The notification panel, which is heavily used, is too small and therefore hard to access, when dragging it downwards to open it.</p>
<h3>Audio Quality</h3>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/01/hotspot.png"><img class="alignright  wp-image-3101 colorbox-3080" alt="hotspot" src="http://wolfpaulus.com/wp-content/uploads/2013/01/hotspot.png" width="287" height="499" /></a><br />
Using the watch as an Bluetooth extension for a phone, e.g. to make phone calls, is virtually impossible. The audio quality for both playback and recording is terribly bad.</p>
<h3>Internet Access</h3>
<p>Most applications running on the Watch need to access the Internet, which means that the smart phone that connects to the watch via Bluetooth, needs to act as hotspot for Bluetooth devices. Enabling this feature on your smartphone requires to upgrade ($$) your dataplan (at least for Verizon and AT&amp;T customers).</p>
<h2>Software development</h2>
<p>Software development, at least for the purpose I wanted to use the watch for, turned into something close to a nightmare. There are two Android 1.6 images available for the Watch, one has adb enabled, i.e. allows to deploy Android apps, the other one allows to mount the watch as a USB drive &#8211; it&#8217;s either or. I went with the adb enabled image for developers, but the Watch still doesn&#8217;t easily show up with &#8220;adb devices&#8221;. Instead, one needs to setup a RNDIS network device and hardcode 10.0.0.168 as its ANDROID HOST IP. adb needs to be manally killed and restarted every time the watch gets (re-)connected. Which needs to happens very often, since a DRRS-plug is the only way to tether the watch for deployment, but while connected, the DRRS-plug also shuts-off microphone and speaker.</p>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/01/20130115-IMG_7626.jpg"><img class="size-full wp-image-3110 aligncenter colorbox-3080" alt="20130115-IMG_7626" src="http://wolfpaulus.com/wp-content/uploads/2013/01/20130115-IMG_7626.jpg" width="500" height="333" /></a></p>
<h3>SpeechSynthesis</h3>
<p>While <em>android.speech.tts.TextToSpeech</em> was introduced with Android 1.6, there was no implementation provided on the i&#8217;m Watch. However, after a little bit of searching around, I came across <em>com.svox.langpack.installer.apk</em> and <em>PicoLangInstaller.apk</em>, which can be installed on the watch (adb install ..). This eventually helped to enable a crummy but still understandable voice output.</p>
<pre class="brush: java; title: ; notranslate">
//
// TextToSpeech.OnInitListener listener
//

   	@Override
   	public void onInit(int i) {
       	tv.setText(&quot;onInit&quot;);
       	tts.setPitch(1.2f);
       	tts.setSpeechRate(1.1f);
       	tv.setText(&quot;Locale:&quot; + tts.getLanguage().toString());
       	tts.speak(&quot;Hello, how are you today?&quot;, TextToSpeech.QUEUE_FLUSH, null);
   	}
</pre>
<p>Since that didn&#8217;t take too long, I was optimistic to get SpreechRecognition working as well. However, huge portions of the Android 1.6 SDK are simply missing. E.g. <em>RecognizerIntent</em> is not implemented and <em>MediaRecorder</em> will always fail when <em>prepare()</em> is called. Meaning, I ended up using <em>AudioRecord</em> for the voice recording. Something like so:</p>
<pre class="brush: java; title: ; notranslate">
private void startRecording() {

        mRecorder = new AudioRecord(
                MediaRecorder.AudioSource.MIC,
                RECORDER_SAMPLERATE,
                RECORDER_CHANNELS,
                RECORDER_AUDIO_ENCODING,
                mBufferSize);

        mRecorder.startRecording();
        isRecording = true;

        mRecordingThread = new Thread(&quot;Recording Thread&quot;) {
            @Override
            public void run() {
                writeAudioDataToFile();
            }
        };
        mRecordingThread.start();
    }

    /**
     * &lt;code&gt;writeAudioDataToFile&lt;/code&gt; writes the raw recording buffer into a temp. file.
     */
    private void writeAudioDataToFile() {
        final byte data[] = new byte[mBufferSize];
        try {
            final OutputStream os = new BufferedOutputStream(new FileOutputStream(getTempFilename()));
            while (isRecording) {
                final int k = mRecorder.read(data, 0, mBufferSize);
                if (k != AudioRecord.ERROR_INVALID_OPERATION) {
                    try {
                        os.write(data, 0, k);
                    } catch (IOException e) {
                        Log.e(LOG_LAG, e.getMessage());
                    }
                }
            }
            try {
                os.flush();
                os.close();
            } catch (IOException e) {
                Log.e(LOG_LAG, e.getMessage());
            }

        } catch (FileNotFoundException e) {
            Log.e(LOG_LAG, e.getMessage());
        }
    }

    private void stopRecording() {
        if (mRecorder != null) {
            isRecording = false;
            mRecorder.stop();
            mRecorder.release();
            mRecorder = null;
            mRecordingThread = null;
        }

        final String wavFile = getFilename();
        copyWaveFile(getTempFilename(), wavFile);
        new File(getTempFilename()).delete();
        // AsyncTask calling SpeechRecognition web service ..
        new NAPI(mHandler).execute(getHttp_Api_Url(), wavFile );
    }
</pre>
<p>Unfortunately, the sound quality was once again very poor and Nuance&#8217;s Web service for Speech Recognition could not render any results. After significantly improving the wav-file using <a href="http://www.ambrosiasw.com/utilities/wiretap/" target="_blank">Wiretap Studio</a> on my Mac, Nuance would finally return a result, which wasn&#8217;t even too far off. However, even if the improvement could be done on the i&#8217;m Watch itself, the total processing time was just way too long that even when considering all optimizations, we would never get into usable range.</p>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/01/20130116-IMG_7630.jpg"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/20130116-IMG_7630.jpg" alt="20130116-IMG_7630" width="500" height="333" class="aligncenter size-full wp-image-3115 colorbox-3080" /></a></p>
<h2>List of things that won&#8217;t work</h2>
<ul>
<li>Sensors APIs require special library, which have not been released yet.</li>
<li>The i&#8217;m Watch has a custom audio system. Android Audio recording/routing APIs are not working (Manufacturer has acknowledged the problem, but no ETA)</li>
<li>Speech recognition APIs don&#8217;t work due to the previous point.</li>
<li>NetworkManager.isConnected() always returns true (Manufacturer has acknowledged the problem, but no ETA)</li>
<li>Option menus are not working (UI/UX decision: screen is too small for this) (Manufacturer promised to publish a fix on their GitHub account soon.)</li>
<li>Vibration APIs are not working (no vibration motor in the i&#8217;m Watch)</li>
<li>Input Method Editors are not supported (UI/UX decision: screen is too small for this) (Manufacturer promised to publish a fix for the NumPad at least on their GitHub account soon.)</li>
<li>Links that open the web browser are not supported. The web browser is present, but will be removed in a future release (UI/UX decision: screen is too small for this)</li>
</ul>
<h2>Final Verdict</h2>
<p>Requested RMA. Returned i&#8217;m Watch ..<br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/01/20130115-IMG_7627.jpg"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/20130115-IMG_7627.jpg" alt="20130115-IMG_7627" width="500" height="333" class="aligncenter size-full wp-image-3116 colorbox-3080" /></a></p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/hardware/imwatch/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Daunting Task &#8211; Tiffany goes to Cupertino</title>
		<link>http://wolfpaulus.com/jounal/java-journal/tiffanyscreensmacappstore?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tiffanyscreensmacappstore</link>
		<comments>http://wolfpaulus.com/jounal/java-journal/tiffanyscreensmacappstore#comments</comments>
		<pubDate>Mon, 21 Jan 2013 04:12:19 +0000</pubDate>
		<dc:creator>Wolf Paulus</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[TiffanyScreens]]></category>

		<guid isPermaLink="false">http://wolfpaulus.com/?p=3148</guid>
		<description><![CDATA[TiffanyScreens in the Mac App Store I never really like [...]]]></description>
				<content:encoded><![CDATA[<h1>TiffanyScreens in the Mac App Store</h1>
<p>I never really liked going to &#8220;PowerPoint Meetings&#8221;, sharing the screen content with others during a meeting, usually requires to connect a projector to the presenter&#8217;s laptop. In a lengthy process, the laptop&#8217;s screen resolution and refresh-rate needed to be manually adjusted to synchronize with the projector. What follows is a lecture style presentation, featuring slides being projected, hugely magnified onto one of the meeting room&#8217;s walls; often, lights need to be dimmed, and listeners either doze off or start checking email.</p>
<p>A couple years back, I wrote <a href="http://www.tiffanyscreens.com/" target="_blank">TiffanyScreens</a>, which allows you to share presentations (or any screen content), without requiring a projector.<br />
Imagine a scenario, where every participant brought a laptop computer to a meeting and watched the presentation on that laptop&#8217;s display – participants sit on a table facing each other, instead of the wall. No adjustments are necessary; images are scaled automatically on arrival, to best match the receiver&#8217;s display-capability. To support lively meetings, everyone participating, can with a single button click, turn his computer into the presenting device.</p>
<p><br/><br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/01/tsp5.jpg"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/tsp5.jpg" alt="tsp5" width="480" height="300" class="aligncenter size-full wp-image-3153 colorbox-3148" /></a><br />
<br/></p>
<p>During the development, I had small engineering groups in mind, but <a href="http://www.tiffanyscreens.com/opinion.html" target="_blank">it became more and more obvious</a> that instructors, educators, and educational institutions would appreciate TiffanyScreens the most. Listening to users&#8217; feedback, TiffanyScreens has been iteratively improved, refined, and optimized.<br />
<span id="more-3148"></span><br />
For instance, to accommodate instructors and teachers, only one peer needs to have a licensed copy of the application installed and since you never know what kind of laptop users bring, TiffanyScreens is of course a multi-platform application, running on Windows, Linux, and the Mac. In fact, most of TiffanyScreens is implemented in Java.</p>
<p>But almost like the boiling frog story, Apple slowly turned up the heat on Java and Java developers. OS X 10.7 Lion introduced the Mac Application Store, in which Java applications were not welcome. OS X 10.8 Mountain Lion makes it extra hard for users to install applications that are not distributed through the Mac App Store.<br />
<br/><br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-6.18.38-PM.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-6.18.38-PM.png" alt="Mac Security Settings" width="515" height="314" class="aligncenter size-full wp-image-3149 colorbox-3148" /></a><br />
<br/><br />
With Apple withdrawing most of its Java support, it&#8217;s now Oracle, providing up to date Java runtime and Java SDK of Mac OS X. However, recent Zero-Day Java security vulnerabilities make it less like that users&#8217; machines have a Java runtime installed.</p>
<p>Considering all these obstacles, I could have let TiffanyScreens run its course, letting it die a slow death, but during a couple of days off work, over the Christmas break, I came up with a decisive rescue plan &#8230; putting TiffanyScreens into the Mac Application Store.</p>
<h1>Putting TiffanyScreens into the Mac Application Store</h1>
<h2> 1. Administrative Tasks </h2>
<p>Trying to put a Java desktop app into Apple&#8217;s Mac App Store is a daunting task, no mean feat, some may even call it a total waste of time. However, TiffanyScreens, the innovative presentation and screen sharing tool, used and loved by many educational institutions worldwide, must not die &#8230; </p>
<h3>1.1. Joining the Mac Developer Program</h3>
<p>It all started with a $99 investment, purchasing a Mac Developer ID and getting into the Mac Developer Program. </p>
<p><a href="https://developer.apple.com/programs/start/standard/" target="_blank">https://developer.apple.com/programs/start/standard/</a></p>
<h3>1.2. Request a OS X Signing Certificate</h3>
<p>The next step was all about preparing my machine to sign and submit a binary to the Mac App Store approval process.<br />
<a href="https://developer.apple.com/certificates/index.action#maccertrequest" target="_blank">https://developer.apple.com/certificates/index.action#maccertrequest</a><br />
<br/><br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-3.31.22-PM.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-3.31.22-PM.png" alt="Screen Shot 2013-01-20 at 3.31.22 PM" width="576" height="533" class="aligncenter size-full wp-image-3157 colorbox-3148" /></a><br />
<br/></p>
<p>Since TiffanyScreens does neither need the iCloud nor Apple Push Notifications, I did forgo the Mac App Development Certificate but requested and installed:</p>
<ul>
<li>Mac App Certificate</li>
<li>Mac Installer Certificate</li>
<li>Developer ID Application Certificate</li>
<li>Developer ID Installer Certificate</li>
</ul>
<p><br/><br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-3.37.49-PM.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-3.37.49-PM.png" alt="Screen Shot 2013-01-20 at 3.37.49 PM" width="570" height="157" class="aligncenter size-full wp-image-3158 colorbox-3148" /></a><br />
<br/></p>
<h3>1.3. Creating an Application Bundle ID</h3>
<p>I created and Application Bundle ID here: <a href="https://developer.apple.com/certificates/index.action#bundle" target="_blank">https://developer.apple.com/certificates/index.action#bundle</a><br />
An App ID is an identifier used by iOS and Mac OS X to recognize your app. This was pretty simple and straight forward. I just needed to enter my applications name and a bundle identifier.</p>
<ul>
<li>TiffanyScreens Pro</li>
<li>com.carlsbadcubes.tiffany.TiffanyScreens.pro</li>
</ul>
<h3>1.4. Creating an Application on the iTunes Store</h3>
<p>I opened <a href="https://itunesconnect.apple.com/" target="_blank">https://itunesconnect.apple.com/</a> and in &#8220;Manage Your Applications&#8221;, selected &#8220;Add New App&#8221; followed by &#8220;Mac OS X App&#8221;<br />
Here, the application got defined in more detail, like it will appear in the iTunes Store. Completing this step also included deciding on a <strong>primary and secondary application category</strong>, as well as uploading a couple of screen shots. I think it&#8217;s important to note that once an application has been approved, those screen shots cannot easily be changed.</p>
<p>This pretty much concluded the administrative tasks and now the much more interesting engineering tasks began.<br />
<br/><br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-3.49.08-PM.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-3.49.08-PM.png" alt="Screen Shot 2013-01-20 at 3.49.08 PM" width="500" height="223" class="aligncenter size-full wp-image-3159 colorbox-3148" /></a><br />
<br/></p>
<h2>2. Engineering Tasks</h2>
<h3>2.1. Java Runtime</h3>
<p>Since I wanted to bundle TiffanyScreens with the latest Java Runtime, I downloaded and deployed JDK 7 on my development and build machine.<br />
<a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html" target="_blank">http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html</a><br />
Installing jdk-7u11-macosx-x64.dmg, the most recent Java release for 64-bit Intel Macs, meant getting something like this when typing <code>java -version</code> into a terminal.<br />
<code><br />
java version "1.7.0_11"<br />
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)<br />
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)<br />
</code><br />
<br/><br />
In ~/.bash_profile I have JAVA_HOME declared like this:<br />
<code>export set JAVA_HOME=`/usr/libexec/java_home`</code><br />
which in fact points here:<br />
<code>/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java_home</code><br />
which is an executable and returns:<br />
<code>/Library/Java/JavaVirtualMachines/jdk1.7.0_11.jdk/Contents/Home</code><br />
and this location contains the Java Runtime (jre) folder, which will eventually be bundled with TiffanyScreens.</p>
<h3>2.2. A Single JAR</h3>
<p>TiffanyScreens was already packaged to be distributed as a Mac friendly DMG. What I mean with that is that TiffanyScreens was always packaged into a single Jar. 3rd party libraries like Swixml for instance get unpacked<br />
<code>&lt;unzip src="${swixml.jar}" dest="${build.dest}"/&gt;</code><br />
during the build process and re-packaged together with TiffanyScreens&#8217; classes and resources into a single jar file.</p>
<p>The <i>package</i> target for instance in my TiffanyScreeens&#8217; Ant build.xml looks something like this:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;target name=&quot;package&quot; depends=&quot;compile,unjarparties&quot; description=&quot;Creates the class package&quot;&gt;

       &lt;!-- Filters defined specifically for updating the manifest --&gt;
       &lt;filter token=&quot;version.spec&quot; value=&quot;${version.spec}&quot;/&gt;
       &lt;filter token=&quot;version.impl&quot; value=&quot;${version.impl}&quot;/&gt;
       &lt;copy
           todir=&quot;${build.dest}/META-INF&quot;
           filtering=&quot;yes&quot;&gt;
           &lt;fileset dir=&quot;${package.dir}/META-INF&quot;/&gt;
       &lt;/copy&gt;
       &lt;copy
           todir=&quot;${build.dest}&quot; filtering=&quot;no&quot;&gt;
           &lt;fileset dir=&quot;${build.src}&quot; includes=&quot;**/*.xml&quot;/&gt;
       &lt;/copy&gt;
       &lt;copy
           todir=&quot;${build.dest}&quot; filtering=&quot;no&quot;&gt;
           &lt;fileset dir=&quot;${build.src}&quot; includes=&quot;img/*&quot;/&gt;
       &lt;/copy&gt;
       &lt;jar jarfile=&quot;${build.dir}/${name}.jar&quot;
            basedir=&quot;${build.dest}&quot;
            excludes=&quot;META-INF/MANIFEST.MF&quot;
            manifest=&quot;${build.dest}/META-INF/MANIFEST.MF&quot;
           /&gt;
&lt;/target&gt;		
</pre>
<h3>2.3. AppBundler Ant Target</h3>
<p>Oracle also has a <a href="http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/packagingAppsForMac.html" target="_blank">document</a> on its site that explains some of the things I wanted to do, Bundling the JRE with Tiffany. Unfortunately, the example they show is somewhat oversimplified to be really helpful. However, it has links to the Java Application Bundler project, which contains a Jar, providing an Ant target, to bundle the JRE with a Java app.</p>
<p>So I download the <a href="http://java.net/projects/appbundler/downloads" target="_blank">appbundler-1.0.jar</a> and read the related <a href="http://java.net/downloads/appbundler/appbundler.html" target="_blank">documentation</a>. </p>
<p>Going back and force between the documentation and my Ant build file, I ended up with an target configured like this:</p>
<pre class="brush: xml; title: ; notranslate">
    &lt;taskdef name=&quot;bundleapp&quot; classpath=&quot;${appbundler.jar}&quot; classname=&quot;com.oracle.appbundler.AppBundlerTask&quot;/&gt;
    &lt;target name=&quot;appbundle&quot; depends=&quot;package&quot; description=&quot;Create Mac OSX Application Bundle&quot;&gt;
        &lt;bundleapp
            outputdirectory=&quot;/Users/wolf/Work/Tiffany/build/dist&quot;
            name=&quot;${Name}&quot;
            displayname=&quot;${Name}&quot;
            identifier=&quot;${mainclass}.${bid}&quot;
            icon=&quot;res/${bid}.icns&quot;
            shortversion=&quot;${version}&quot;
            signature=&quot;CABA&quot;
            copyright=&quot;2006-2013 Techcasita Productions.&quot;
            applicationCategory=&quot;public.app-category.productivity&quot;
            mainclassname=&quot;${mainclass}&quot;
            &gt;
            
            &lt;!-- JDK / JRE --&gt;
            &lt;runtime dir=&quot;/Library/Java/JavaVirtualMachines/jdk1.7.0_11.jdk/Contents/Home&quot;/&gt;

            &lt;!-- The bundleapp task doesn't support classpathref so all
                the run classpath entries must be stated here too.
            --&gt;
            &lt;classpath file=&quot;./build/${name}.jar&quot;/&gt;
            &lt;classpath file=&quot;./libs/libscreen.jnilib&quot;/&gt;

            &lt;option value=&quot;-Xdock:name=${Name}&quot;/&gt;
            &lt;option value=&quot;-Xdock:icon=Contents/Resources/${bid}.icns&quot;/&gt;
            &lt;option value=&quot;-Dapple.laf.useScreenMenuBar=true&quot;/&gt;
            &lt;option value=&quot;-Dcom.apple.macos.use-file-dialog-packages=true&quot;/&gt;
            &lt;option value=&quot;-Dcom.apple.macos.useScreenMenuBar=true&quot;/&gt;
            &lt;option value=&quot;-Dcom.apple.mrj.application.apple.menu.about.name=${Name}&quot;/&gt;
            &lt;option value=&quot;-Dcom.apple.smallTabs=true&quot;/&gt;
            &lt;option value=&quot;-Dcom.apple.textantialiasing=true&quot;/&gt;
            &lt;option value=&quot;-Dcom.apple.antialiasing=true&quot;/&gt;
            &lt;option value=&quot;-Dcom.apple.showGrowBox=false&quot;/&gt;
            &lt;option value=&quot;-Dapple.awt.fullscreencapturealldisplays=false&quot;/&gt;
            &lt;option value=&quot;-Dapple.awt.fullscreenusefade=true&quot;/&gt;
            &lt;option value=&quot;-Djava.library.path=$APP_ROOT/Contents/Java&quot;/&gt;
            &lt;option value=&quot;-Xms32M&quot;/&gt;
            &lt;option value=&quot;-Xmx256M&quot;/&gt;
        &lt;/bundleapp&gt;
        &lt;delete
            file=&quot;/Users/wolf/Work/Tiffany/build/dist/${Name}.app/Contents/PlugIns/jdk1.7.0_11.jdk/Contents/Info.plist&quot;/&gt;
    &lt;/target&gt;
</pre>
<p>Most of <bundleapp/> tag&#8217;s attributes should be obvious, I&#8217;m using this build file for both TiffanyScreens version (Pro and Standard), which is what the bid property is used for. </p>
<pre class="brush: xml; title: ; notranslate">
      &lt;property name=&quot;Name&quot; value=&quot;TiffanyScreens&quot;/&gt;
      &lt;property name=&quot;bid&quot; value=&quot;&quot;/&gt;
      &lt;property name=&quot;name&quot; value=&quot;tiffanyscreens&quot;/&gt;
      &lt;property name=&quot;Short&quot; value=&quot;Tiffany&quot;/&gt;
      &lt;property name=&quot;mainclass&quot; value=&quot;com.carlsbadcubes.tiffany.TiffanyScreens&quot;/&gt;
      &lt;property name=&quot;version&quot; value=&quot;5.0&quot;/&gt;
</pre>
<p>The <i>applicationCategory</i> attribute value should of course match with what was selected as a primary category, when the application entry was created on the iTunes Store. How this value needs to be decoded can be found <a href="https://developer.apple.com/library/mac/#releasenotes/General/SubmittingToMacAppStore/" target="_blank">here</a>. </p>
<p>Since I had selected <em>&#8216;Productivity&#8217;</em> for the primary category, I used this UTI: <i>public.app-category.productivity</i> </p>
<p>The <em>runtime</em> tag points to the Java_Home location, from where it will pick up the jre.<br />
The <em>classpath</em> tags declare additional locations that need to be put into the bundle as well.<br />
Finally, the <em>option</em> tags will create in the Mac applications Contents/info.plist file.<br />
Once the bundling has happen, as a last thing, I deleted the Java runtime&#8217;s <em>info.plist</em>. The submission process seems to be very sensitive about that and only after there was only a single info.plist file left in the bundle was I able to submit the application.</p>
<h3>2.5. Application Icon</h3>
<p>The Ant target shown above contains two references to the application&#8217;s icon, which has to be carefully constructed.<br />
Since the introduction of the <em>&#8220;retina display&#8221;</em>, Mac application that want to pass the rigorous approval process, need to have an icon file containing icons all the way to 1024&#215;1024 pixels.<br />
After I had created the icon artwork in five resolutions, I carefully named them like so:</p>
<ul>
<li>icon_16x16.png</li>
<li>icon_128x128.png</li>
<li>icon_256x256.png</li>
<li>icon_512x512.png</li>
<li>icon512x512@2x.png</li>
</ul>
<p>A tool provided with the latest XCode release allow to combine the icons into a single <em>icns</em> file:<br />
<code>iconutil -c icns /Users/wolf/Work/Tiffany/res/pro.iconset</code>  </p>
<h3>2.6. Signing the application bundle</h3>
<p>Running the <i>appbundle</i> build target <code>./build/dist/TiffanyScreens Pro.app</code>, already created a perfectly executable Mac application.<br />
<code><br />
ant appbundle<br />
..<br />
appbundle:<br />
[bundleapp] Creating app bundle: TiffanyScreens Std<br />
   [delete] Deleting: /Users/wolf/Work/Tiffany/build/dist/TiffanyScreens Std.app/Contents/PlugIns/jdk1.7.0_11.jdk/Contents/Info.plist</p>
<p>BUILD SUCCESSFUL<br />
Total time: 4 seconds<br />
</code></p>
<p>Before uploading the application for approval, the application and all packaged libraries needed to be signed. Since TiffanyScreens has all its classes and resources in a single jar, this meant that I only needed to sign the TiffanyScreens.jar file and the one jnilib that I included, .. plus all the libraries in the Java runtime of course.</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash
echo &quot;Using ant build-target 'appbundle' to create the app file&quot;
ant appbundle

echo &quot;Sign everything inside the app file&quot;
codesign --entitlements ./tiffany.plist -s &quot;3rd Party Mac Developer Application: Wolf Paulus&quot; -v &quot;./build/dist/TiffanyScreens Pro.app&quot;
find &quot;./build/dist/TiffanyScreens Pro.app/Contents&quot; -type f \( -name &quot;*.jar&quot; -or -name &quot;*.dylib&quot; \) -exec codesign --verbose -f -s &quot;3rd Party Mac Developer Application: Wolf Paulus&quot; --entitlements tiffany.plist {} \;
find &quot;./build/dist/TiffanyScreens Pro.app/Contents&quot; -type f \( -name &quot;*.exe&quot; -or -name &quot;*.jnilib&quot; \) -exec codesign --verbose -f -s &quot;3rd Party Mac Developer Application: Wolf Paulus&quot; --entitlements tiffany.plist {} \;

echo &quot;Verify all libraries have been signed...&quot;
find &quot;./build/dist/TiffanyScreens Pro.app/Contents&quot; -type f \( -name &quot;*.jar&quot; -or -name &quot;*.dylib&quot; \) -exec codesign --verbose --verify {} \;
find &quot;./build/dist/TiffanyScreens Pro.app/Contents&quot; -type f \( -name &quot;*.exe&quot; -or -name &quot;*.jnilib&quot; \) -exec codesign --verbose --verify {} \;

echo &quot;Create signed package&quot;
productbuild --component &quot;./build/dist/TiffanyScreens Pro.app&quot; /Applications --sign &quot;3rd Party Mac Developer Installer: Wolf Paulus&quot; --product tiffany.plist TiffanyScreensPro.pkg

echo &quot;Test pkg before uploading it to Apple&quot;
sudo installer -store -pkg ./TiffanyScreensPro.pkg -target /

echo &quot;more tests&quot;
spctl --assess --verbose=4 --type execute TiffanyScreensPro.pkg
spctl --assess --verbose=4 --type install TiffanyScreensPro.pkg
codesign -v ./build/dist/TiffanyScreens\ Pro.app/
</pre>
<p>This bash script runs the Ant script, before doing the code signing (using both certificates: &#8220;3rd Party Mac Developer Application: Wolf Paulus&#8221; and &#8220;3rd Party Mac Developer Installer: Wolf Paulus&#8221;) and running two sanity checks, recommended before trying to submit the app.</p>
<p>The outcome of this is a <strong>*.pkg</strong> file, which is made for submission to the app-store approval process but not for installing on your own Mac.</p>
<h3>2.7. Submitting for Approval</h3>
<p>With the latest version of XCode installed, the Application Loader can be found by, control-clicking XCode and selecting &#8220;Show Package Contents&#8221;. The Application Loader in the Contents/Applications folder. Selecting &#8220;Deliver Your App&#8221; automatically picked up all the information I had provided, when creating the application entry in the iTunes Store. Application Loader runs a lot of tests, before finally accepting and uploading the pkg file.<br />
<a href="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-5.53.40-PM.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-5.53.40-PM.png" alt="Apploader" width="548" height="367" class="aligncenter size-full wp-image-3166 colorbox-3148" /></a></p>
<h3>Waiting</h3>
<p>Now the waiting began. While iTunes Connect (<a href="https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa" target="_blank">https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa</a>) showed the current status of the approval process, the information provided here <a href="http://reviewtimes.shinydevelopment.com/" target="_blank">http://reviewtimes.shinydevelopment.com/</a> gave a pretty good indication of the average App Store review time.</p>
<p>A day after submitting Tiffany Screens Pro, I submitted TiffanyScreens Std, which obviously only took a fraction of the time. The only work that I really had to do, was to create that insanely great 1024&#215;1024 icon.   </p>
<h2>Approved</h2>
<p>Each application got approved after 8 days and is now available in the Mac application store. Take a look here:<br />
<a href="http://itunes.com/mac/wolfpaulus" target="_blank">http://itunes.com/mac/wolfpaulus</a></p>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-6.05.19-PM.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-6.05.19-PM.png" alt="mac store wolfpaulus" width="557" height="295" class="aligncenter size-full wp-image-3164 colorbox-3148" /></a></p>
<p><a href="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-6.05.38-PM.png"><img src="http://wolfpaulus.com/wp-content/uploads/2013/01/Screen-Shot-2013-01-20-at-6.05.38-PM.png" alt="Tiffanyinstore" width="557" height="540" class="aligncenter size-full wp-image-3165 colorbox-3148" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://wolfpaulus.com/jounal/java-journal/tiffanyscreensmacappstore/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
