Author Archives: Joshua Wöhle

A developer / entrepreneurial Windows setup

As I’ve now been under Windows 7 for a couple of months, I’ve had to struggle really getting adapted from my previous Linux setup and thought I’d share my resulting setup, in the hopes it might help someone else out. I will write this in two posts, as it would become a little too long if I didn’t Smile.

VirtualBox

Many years back, when I started developing under WIndows, I was using EasyPHP and so that was my first reaction as soon as I was back. However, now that I am so used to my flexible environment in Linux, EasyPHP simply didn’t do the job any more. Luckily there is VirtualBox and with some tweaking, I managed to set up a really neat development environment.

  • Ubuntu Server 12.04
  • VirtualBox network configured to pass requests for localhost on to the virtual machine
  • Windows host file used to provide actual development names for my websites
  • Map /var/www/ to /sf_media/www, which is a share folder in virtualbox, linking to a folder under my Windows (host) machine

This enables me to go to mydevelopmentdomain.dev in windows and it will serve-up the website in /var/www/mydevelopmentdomain on my virtual development server. I get to fully develop under my Windows environment and still have the full power of a linux server to tweak / debug.

Zend Studio / Eclipse

Without these tools, my life would be a lot harder. Luckily, they are as much available under Windows as they are under Linux, so no real change here. I user Zend for my Web development and Eclipse for any other development.

Github

I had a hard time getting on to it, but I have finally taken the plunge and haven’t regretted it. Github is now my go-to place for source control and luckily they have a very good Windows app available, providing me full git command-line functionality even under Windows ! (or UI if you prefer that).

Next week

This weeks post was focused mostly on the Development setup. Next week I’ll be diving deeper into all the rest (Twitter, Outlook, etc.).

4 hour sync with Tasker (Android)… and gaining in productivity

Over the past couple of months, I had started to feel as if my phone was keeping me busy all the time. Being a technology entrepreneur / geek / developer, I had everything configured on my phone to be “wired in” 24/7″, this included :

  • 3 e-mail accounts with push
  • 2 e-mail accounts syncing every 15 minutes
  • Facebook
  • Twitter
  • Google+
  • Meetup
  • SMS / Calls

I realised that I was “drawn” to my phone every 2-3 minutes, as some sort of push notification popped up (mostly e-mail, with other services mixed in between). At first, I tried to cope with this and simply work around it. However, after a little while, I started to have the impression that I was actually becoming less productive because of it, so I started researching a little bit. I found a couple of articles telling me that turning off sync would really help my productivity, but I couldn’t really do that. Not having my phone sync at all didn’t seem like an option : I need my e-mails / feeds to be updated on a regular basis. It did, however, get me thinking.

Tasker – Switch auto-sync on for 5 minutes, every 4 hours

I had already heard about Tasker on Android before, but this was the first time I thought of it becoming really useful. My reasoning was as follows :

  • During my day at work, when I am available to answer e-mails, I will be behind my computer – meaning I don’t really need to get e-mails on my phone
  • After work, I want my e-mails available on my phone, to read, but will probably only answer them once I’m behind my computer again

It suddenly struck me that an idea situation for me would be to have auto-sync on my device enabled, but only once every 4-5 hours. This would mean that all my services got synced, but I wouldn’t be bothered by notifications every single time. This is where Tasker came in handy. I configured a task, to run every 4 hours, that switches auto-sync on for 5 minutes and then turns is off again. Now I get notifications only once every 4 hours and, if something is really urgent, people tend to call / send an sms anyways.

I have definitely noticed an increase in productivity, being able to more closely focus on a certain task and not get distracted by e-mails in the middle.

Working from home, taking time to think and Star Wars hover bikes

I spent half of this month in Spain and even though I had full internet available, the rhythm over there simply isn’t the same. However, that still leaves the other part of the month, so here is what I deemed interesting :

Working from home

Freakonomics had a very interesting podcast about the benefits of working from home. Not only does it reduce costs to business (no need for office space, etc.), but it also seems the average productivity goes up ! You can listen to it at : http://feedproxy.google.com/~r/freakonomicsradio/~5/plvU4eoPPKc/freakonomics_mppodcast082212.mp3

Is there such a thing as too fast ?

A very interesting podcast on how, in a world where information is available faster and faster, it might be worth it taking your time to make the right decision. They have a very nice example of an automatic trading system that did better by increasing it’s latency. For more information, you can download it here : http://traffic.libsyn.com/hbsp/314__In_a_Fast_World_Think_Slowly.mp3

I guess we’re here

Anyone who knows me, knows I am a pretty public person and that I am a fervent defender of most of today’s tracking technologies (as long as you get some benefit out of it). However, this article showed me just how far we’ve gotten and really rang the bell saying “yup, we really know everything you do, whenever you do it”. A scary, but interesting read : http://www.guardian.co.uk/commentisfree/2012/aug/15/new-totalitarianism-surveillance-technology

Star Wars hover bikes !

If I ever get my hands on this, it will be the end of my productivity : http://www.guardian.co.uk/technology/video/2012/aug/23/star-wars-hover-bike-float-video?CMP=twt_fd :)

Facebook IPO roller coaster and investment

I thought it was time to actually write something down about this, as it is taking proportions that I really would not have predicted : Investing your money in shares is very risky ! If you didn’t know that before you invested, then you were simply reckless and if you did know it, then you do not have a right to complain.

Short term fluctuations in share prices are driven by speculation and not real company results. Facebook didn’t dramatically decrease their revenue over the past few days, nor did it release an amazingly bad feature that scared all of it’s users away. The only reason the share price is going down is because analysts are revising their optimism over the future of the business and their revenue potential.

In the long run, however, the share price will reflect actual results and the performance of the business compared to what people expected of it. If in the long run, Facebook under-delivers, you have a right to complain : they sold you a vision that was either wrong or badly executed. However, for this you have to give them some time : they have no control over the current fluctuations.

I bought a few shares in Facebook myself, simply for the sake of being “in the game”. However, I didn’t invest my life savings or anything I couldn’t lose because I didn’t want to risk it. If you don’t want to risk losing your money, then don’t invest but do not turn around and blame the company for a share price they only partly control.

Robot Control Software through Player / Stage

This semester, we had to write some Robot Control Software for a Vacuum cleaning robot based on the Player / Stage environment.

The robot is :

  • Dynamically mapping the environment
  • Cleaning the area while it moves along
  • Avoiding obstacles when it finds them on it’s path

Everything is written in Java and pretty well documented. (Code to be added soon)

Here is a quick video of the final software running :

Android voice control

I have been playing with Android development for quite a while, but two weeks ago I finally finished my first Application. I thought that Text-to-Speech and Speech-to-Text were pretty amazingly easy to integrate and thought I could make everyone benefit from a few snippits, so here is my code (it was almost all done in a single class) :


package com.findarato.cyanide;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class CyanideRobotActivity extends Activity implements OnClickListener, OnInitListener, OnUtteranceCompletedListener {

private static final int VOICE_RECOGNITION_REQUEST_CODE = 12345;

EditText server = null;
EditText port = null;

TextToSpeech tts = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);

final Button buttonStart = (Button) findViewById(R.id.button_start);
final Button buttonStop = (Button) findViewById(R.id.button_stop);
final Button buttonSpeech = (Button) findViewById(R.id.button_speech);
tts = new TextToSpeech(this, this);
tts.setOnUtteranceCompletedListener(this);
server = (EditText) findViewById(R.id.text_ip);
port = (EditText) findViewById(R.id.text_port);

port.setText("9002");

buttonStart.setOnClickListener(this);
buttonStop.setOnClickListener(this);
buttonSpeech.setOnClickListener(this);

}

private void startVoiceRecognitionActivity() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Please tell the robot what to do.");
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 20);
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String serverString = server.getText().toString();
int portInt = Integer.parseInt(port.getText().toString());

if(requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
for(String match : matches) {
if(match.equalsIgnoreCase("start robot") || match.equalsIgnoreCase("start") || match.equalsIgnoreCase("start cleaning")) {
tts.speak("Starting cleaning now", TextToSpeech.QUEUE_FLUSH, null);
new networkRequest(serverString, portInt, "START").execute();
}
else if(match.equalsIgnoreCase("stop robot") || match.equalsIgnoreCase("stop") || match.equalsIgnoreCase("stop cleaning")) {
tts.speak("Stopping cleaning now, returning to my charging dock.", TextToSpeech.QUEUE_FLUSH, null);
new networkRequest(serverString, portInt, "STOP", true).execute();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}

@Override
public void onClick(View v) {

String serverString = server.getText().toString();
int portInt = Integer.parseInt(port.getText().toString());

switch(v.getId()) {
case R.id.button_start :
new networkRequest(serverString, portInt, "START").execute();
break;
case R.id.button_stop :
new networkRequest(serverString, portInt, "STOP").execute();
break;
case R.id.button_speech :
HashMap<String, String> extra = new HashMap<String, String>();
extra.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "start voice recognition");
tts.speak("Hello master, what would you like me to do ?", TextToSpeech.QUEUE_ADD, extra);
break;
default:
break;
}

}

@Override
public void onInit(int status) {
// TODO Auto-generated method stub

}

@Override
public void onUtteranceCompleted(String utteranceId) {
if(utteranceId.equals("start voice recognition"))
startVoiceRecognitionActivity();
}
}

The interesting parts are the methods startVoiceRecognitionActivity() and onClick(View v) -> switch statement R.id.button_speech

EDIT : I have created a gihub repo for this, if anyone is interested : https://github.com/JoshuaWohle/Android-Voice-Control

Clean up your files (Linux)

Today I wanted to clean up my computer a bit and decided to finally tackle my files.

Over time, I have accumulated duplicated files and empty folders and it was starting to irritate me to “think” I had saved something (because I saw the folder), only to realise the folder was empty (bad backup over the years, didn’t restore the files within it for example). So I decided to get rid of all duplicate files and empty folders. Here is how I did it :

Delete empty folders

find ~/ -type d -empty -delete

Find duplicate files

fdupes ~/ -r >> duplicate_files.txt or fdupes ~/ -r -d (to get prompted to delete the found files)

Hope this is useful to someone.

London Java Community and user groups in general

A couple of weeks back, I made my way to my first user group ever. As I had attended some more business-oriented user-groups in the past, I was hoping it wasn’t going to be the same kind of boring network-only type of event. I went there because I had some spare time and I had heard a lot about these user groups and wanted to check it out for myself, but didn’t expect much of it : I was wrong.

I was in a period where I was considering the best routes I could take to further my career development (the famous education vs experience debate) and really needed some external views to help me decide. From the organizers of the events to the actual users, everyone was completely available. I found that the value of the events depend on your own actions, daring to approach person XYZ to simply have a chat with them.

After having attended 3 events, I can surely say that I have already benefited a lot from everyone present, their advice and simply their company. I will definitely turn up to many of them in the coming years and invite all skeptics to try it out at least once rather sooner then later ! :)

Start-up weekend Geneva 2011

I am currently at the airport, after a pretty intense weekend in Geneva : start-up weekend.

The idea is that for 54 hours, you do nothing but work on new ideas with a group. You develop them to get to a stage where you think they might be viable and you come up with ways to make them work. At the end of the weekend, you present your project to a jury through a small presentation and see what others think of it.

I ended up with a project that looks into last-minute hotel deals. I developed a prototype Android app (I was surprised I got this running within 2 days, but for some magical reason, it worked during our presentation), while others were working on the business model, the marketing plan and the development strategy.

The whole experience has been wonderful to me. You meet many entrepreneurs and like-minded people that want to make a difference and create their own jobs out there. I would definitely recommend it to anyone who thinks of him / herself as an entrepreneur ! :)

Installing Player / Stage and development tools on Fedora 15 through Virtualbox

After quite some struggles, I finally managed to get the Player / Stage stack installed exactly the way I wanted it. It gave me quite a headache, so I thought it would be a good thing to share (so other people don’t have to go through the same thing).

First of all, my perfect setting was to set my environement up through VirtualBox. This is because Player / Stage is still quite rough and requires packets and tinkering I did not want to occur on my stable work machine. However, I wanted to develop through my normal Eclipse (in my host operating system) as that was already all set-up and I didn’t want to get into performance issues through the Virtual Machine. Knowing all of that, I made the following choices :

  • Virtualbox
    Easy to install, widespread and I knew it already
  • Fedora 15
    This was an easy choice, as it was recommended on the player / stage download page – Fedora already has the player / stage packets in it’s official repositories, making things a lot easier.
  • OpenJDK
    I wasn’t 100% sure it would all work on OpenJDK, but I wanted to try and… it all worked out for the best :) (so no need to install the Oracle Java dependencies)
  • Shared folder of my Eclipse workspace that could be accessed directly through the virtual machine

That was my perfect setting and it turned out not too hard to set up.

Further along this article, I explain what problems I had. This can be helpful if you have specific questions, but here is the full set of instructions to get everything working :

  1. Download the Fedora 15 CD image from their website and install a clean virtual machine
    Be sure to allocate enough space to the root partition for installation of different packages (I allocated 3.5 GB)
  2. Prepare fedora to install VirtualBox Guest Additions
    yum install kernel-headers kernel-devel
  3. Reboot
  4. Install gcc : yum install gcc
  5. Install VirtualBox Guest Additions
  6. Install player / stage
    yum install player player-devel player-doc player-examples player-python player-ruby
    yum install stage stage-devel stage-playerplugin
    For more information on this step, see here : http://playerstage.sourceforge.net/wiki/Download
  7. Install OpenJDK and all Java utils you will need (through “Add software GUI)
  8. Shut down machine
  9. Go to “settings” in your Fedora VirtualBox and add your workspace as a shared folder. Select “auto-mount”
  10. Start your Fedora VirtualBox
    (You can now find your folder under /media)
  11. Run “system-config-users” and add your local user to the “vboxsf” group
  12. Done !

The problems I encountered

  1. Player wouldn’t show my robot
    It was really weird when everything seemed to work, but for some reason Player wouldn’t show my robot (a little red thing driving around). This was very easily fixed by installing the VirtualBox Guest Additions
  2. Guest Additions wouldn’t install properly
    I needed to install kernel-headers and kernel-devel first, for Guest Additions to install correctly (‘yum install kernel-headers kernel-devel’ -> reboot)
  3. I couldn’t access my shared folder
    I needed to add my personal user (under the fedora virtualbox) to the vboxsf user group