RaspiModelB-1024x902

Pulling strings on Raspberry Pi

I got my Raspberry PI Starter Kit this week. The Kit is very nice, as it comes packaged with everything you need in order to get your PI up and running ASAP. Just plugin the SD-Card, connect Ethernet cable and USB Power supply and your ready to go!

Booting Up

After the PI has booted from the provided Image on the SD-Card, it is accessible through SSH:

1
ssh pi@10.0.1.2
ssh pi@10.0.1.2

It’s a good idea to copy the SSH public key to the machine, so that you do not have to type in the passphrase everytime:

1
2
ssh pi@10.0.1.2 "mkdir -p .ssh"
scp ~/.ssh/id_dsa.pub pi@10.0.1.2:.ssh/authorized_keys
ssh pi@10.0.1.2 "mkdir -p .ssh"
scp ~/.ssh/id_dsa.pub pi@10.0.1.2:.ssh/authorized_keys

When the provided Raspberry PI distro is outdated, you can update it with the builtin admin tool:

1
2
3
sudo raspi-config 
=> select update, exit
sudo reboot
sudo raspi-config 
=> select update, exit
sudo reboot

Bootstrap for Puppet

As an experiment, I wanted to provision my PI with Puppet. Since the PI comes packaged with Python as a programming language, you need to install Ruby in order to run Puppet.
There are several Ruby Versions available as Debian packages, but I wanted to try out RBenv just for fun. This is only an option if you have plenty of time, cause building a Ruby from source takes round about 2 hours…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# update aptitude
sudo apt-get update -y
# install some basics like git and support for ruby to compile and puppet to work
sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline-dev git-core curl libyaml-dev -y
 
# clone the rbenv repo and setup the env
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
echo 'eval "$(rbenv init -)"' >> ~/.profile
exec $SHELL -l
 
# add the ruby-build plugin and install a ruby 1.9.3
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 1.9.3-p327
# set the ruby as the global ruby version
rbenv global 1.9.3-p327
rbenv rehash
# check if it's working fine
ruby -v
 
# add the rbenv sudo plugin
git clone git://github.com/dcarley/rbenv-sudo.git ~/.rbenv/plugins/rbenv-sudo
# update aptitude
sudo apt-get update -y
# install some basics like git and support for ruby to compile and puppet to work
sudo apt-get install build-essential zlib1g-dev libssl-dev libreadline-dev git-core curl libyaml-dev -y

# clone the rbenv repo and setup the env
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
echo 'eval "$(rbenv init -)"' >> ~/.profile
exec $SHELL -l

# add the ruby-build plugin and install a ruby 1.9.3
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 1.9.3-p327
# set the ruby as the global ruby version
rbenv global 1.9.3-p327
rbenv rehash
# check if it's working fine
ruby -v

# add the rbenv sudo plugin
git clone git://github.com/dcarley/rbenv-sudo.git ~/.rbenv/plugins/rbenv-sudo

Having a running Ruby, installing Puppet is just a matter of minutes, as it is distributed as a Ruby Gem. It’s a good idea though to disable RDoc and RI documentation generation to speed up the installation:

1
2
3
4
5
6
7
8
9
10
# puppet needs it's own user and group
sudo useradd --comment "Puppet" --no-create-home --system --shell /bin/false puppet
# disable documentation generation for gems
echo "gem: --no-ri --no-rdoc" > ~/.gemrc
# install the gem
gem install puppet
# make puppet executables available through rbenv
rbenv rehash
# check if facter is installed properly
facter
# puppet needs it's own user and group
sudo useradd --comment "Puppet" --no-create-home --system --shell /bin/false puppet
# disable documentation generation for gems
echo "gem: --no-ri --no-rdoc" > ~/.gemrc
# install the gem
gem install puppet
# make puppet executables available through rbenv
rbenv rehash
# check if facter is installed properly
facter

If facter complains about a problem with the fact fqdn, just add a real hostname to /etc/hosts:

1
sudo vi /etc/hosts
sudo vi /etc/hosts
127.0.1.1       raspberrypi.nofail.de raspberrypi

First Puppet run

After that puppet should run without warnings and you can start writing the first manifest:

1
2
3
mkdir /home/pi/puppet
cd /home/pi/puppet
vi base.pp
mkdir /home/pi/puppet
cd /home/pi/puppet
vi base.pp

Add this to base.pp to install VIM to the Raspberry PI:

package { "vim":
  ensure => installed,
}

This manifest can be applied with rbenv sudo:

1
rbenv sudo puppet apply base.pp
rbenv sudo puppet apply base.pp

Et voila, VIM is installed on your PI.

Samba

Working with the tools on my Mac is cool, so sharing a directory on the PI is a nice way of editing locally and running stuff on the server. Deriving from a basic installation of Samba that’s what needs to be done on the PI:

1
2
3
4
# install samba
sudo apt-get install samba samba-common-bin
# update config
sudo vi /etc/samba/smb.conf
# install samba
sudo apt-get install samba samba-common-bin
# update config
sudo vi /etc/samba/smb.conf

In /etc/samba/smb.conf uncomment line security = user and add the following section:

[Puppet]
  comment = Puppet share 
  path = /home/pi/puppet
  writeable = yes
  guest ok = no

Once you did this, add a Samba user and restart the service:

1
2
3
4
5
6
# make shared dir writable
chmod 777 /home/pi/puppet
# add the user for access over smb
sudo smbpasswd -a pi
# restart smb
sudo /etc/init.d/samba restart
# make shared dir writable
chmod 777 /home/pi/puppet
# add the user for access over smb
sudo smbpasswd -a pi
# restart smb
sudo /etc/init.d/samba restart

Using ⌘+k on the Mac connects to a remote server. Enter smb://pi@10.0.1.2 and connect to the Puppet share. You can now access your files via open /Volumes/Puppet/.

DynDNS

In order to access the PI over the internet, subscribing to a free Dynamic DNS service like NO-IP is a nice way to get a static hostname for name resolution.
NO-IP has some Tools available for download that help you keeping the switching IP up to date. Since the provided binaries did not work on the PI, the NO-IP client needs to be compiled from source.

On my Airport Extreme I enabled port-forwarding so that i can route services to the PI.

WiFi

If you want the PI to connect to your wireless network, just buy yourself a mini wifi USB adapter. It’s pretty easy to get the PI up and running with this on your local wifi, just enable the network device in /etc/network/interfaces, mine looks like this:

# /etc/network/interfaces
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa.config

auto eth0
iface eth0 inet dhcp

and add the wifi connection settings to /etc/wpa.config:

# /etc/wpa.config
network={
  ssid="YOUR_SSID"
  proto=RSN
  key_mgmt=WPA-PSK
  pairwise=CCMP TKIP
  group=CCMP TKIP
  psk="YOUR_PASSWORD"
}

Raspberry PI with cream and sugar!

Bildschirmfoto 2012-09-26 um 19.23.17

Bringing Usergroups on Ruby

I am one of the organizers of the local Ruby Usergroup in Hamburg for over two years now. We meet on a regular basis, every second wednesday each month. Some times we meet in a bar to grab some beers, some times we have full fledged community events with sponsors and high quality talks.

All this is currently managed using the On Ruby plattform that was created to bring the events close to the Ruby devs. It also eases the process of creating events, submitting talks, finding locations and publishing all that to Twitter, Google+ and Mailinglists.

Some month ago, the project was forked by Cologne.rb and they built their custom version for the Ruby Usergroup in Cologne. After that some more Usergroups wanted to use the tool and that was the reason we merged the Cologne.rb codebase and created a whitelabel version of the application, which is customizable in many regards. It also comes with a Mobile version for iPhone and Android.

If you are interested in joining Hamburg, Cologne, Bremen, Saarland and Karlsruhe just follow the guide for creating your own OnRuby Usergroup!

7163957372_c1d1e0c834

Senor Developer Competition at Scottish Ruby Conference

Our Señor Developer Shirts ™© are a great success! So far we have delivered around 300 Shirts all over the world, including most European Countries, Russia, US, Uruguay, and New Zealand. We have been to Railsberry and EuRuKo to promote them (while recovering from our hangovers). Even Aaron Petterson and Yehuda Katz wanted one, even though I have not seen them on any Friday-Hug photo…

The next stop of the Señor Developer World Europe Tour will be Edinburgh and the Scottish Ruby Conference!

We want to do a little Señor Developer Competition there. The base idea is to give away free shirts to visitors of the conference with Awesome Moustaches (should be a trademark of Sven Fuchs):

We don’t want everybody to grow a moustache, instead you could also moustachify yourself in different ways: mask yourself with a fake-moustache, create digital moustaches, wear moustache swag, tinker something moustachilitious!

Just surprise us and have fun!

Oldschool Señor Developer Shop
Deluxe Señor Developer Shop
Señor Developer mini Shop for US
Fotos obviously stolen from Railsberry

senordeveloper

Senior Developer – My Ass!

We were drinking beers recently, when we decided that we needed to do something against this whole Senior Developer bullshit. Every Programmer that has done more than three keystrokes considers himself a Senior these days…

That was when @rubiii and me came up with calling ourselves Señor Developer and putting a mustache on our XING profiles. Some days later @defsprite toped off our idea by creating a logo and a website for our crazy idea.

Since then we did a batch of handprinted Señor Developer T-Shirts that we sent out all over the world (i.e. New Zealand, Uruguay). Because handprinting and delivering all the stuff is way too time consuming we are now using a spreadshirt shop for this task.

If you like the idea, feel free to follow @senordeveloper on twitter!

250px-Nabaztagtag_large

Karotz + Ruby = Love

I made myself a little present this christmas by putting a Karotz under my christmas tree. This little digital bunny robot is the 3rd generation of a gadget that was once known as Nabaztag.

Karotz can connect to the internet and you can deploy applications on it. It’s a tiny multitalent, speaks, blinks, turns his ears, takes photos and plays musik. The really cool stuff about all this, is that you can also access it via a REST-api.

I was a little disturbed by the bad documentation of the api, but since Karotz has had a pretty shaken history, I was willing to see over it. Nevertheless I had a really hard time figuring out how to use the API, especially the interactiveMode sessions, which are crucial for interacting with Karotz. That’s why I wanted to give you a short HOW-TO wrapup on it.

Basic Setup

First of all you need to have a Karotz up and running, like it’s described in the handbook. Register yourself at karotz.com and click on the lab button at the bottom of the page. Once you registered yourself for all the developer stuff, you need to register a new application for yourself in order to get access to the credentials needed to talk to Karotz.

In order to get your own application, you need to create a descriptor.xml and package it as a zip-file and then load it up to the appstore and then deploy it to your bunny. Here is an example, which exposes the install-id of your application, which you need to accesss your Karotz:

1
2
3
4
5
6
7
8
9
10
11
12
13
<descriptor>
  <version>0.0.1</version>
  <accesses>
    <access>tts</access>
    <access>ears</access>
    <access>led</access>
    <access>multimedia</access>
  </accesses>
  <deployment>external</deployment>
  <parameters>
    <parameter key="showInstallUuid" value="true"/>
  </parameters>
</descriptor>
<descriptor>
  <version>0.0.1</version>
  <accesses>
    <access>tts</access>
    <access>ears</access>
    <access>led</access>
    <access>multimedia</access>
  </accesses>
  <deployment>external</deployment>
  <parameters>
    <parameter key="showInstallUuid" value="true"/>
  </parameters>
</descriptor>

Have a look at this Christops Blog if you don’t get it working for yourself.

Using the Gem

There are already some code-examples on the developer-pages on how to get an interactive_id for your Karotz and some code has been released for Ruby as ruby-karotz here and here none of them exposing a nice API or describing the process of how to get all the peaces of the puzzle together. That’s why I am currently writing this…

So here is an example of how to interact with the karotz gem:

1
2
3
4
5
6
7
8
9
10
11
12
Karotz::Configuration.configure do |config|
  config.install_id = ENV['KAROTZ_INSTALL_ID']
  config.api_key    = ENV['KAROTZ_API_KEY']
  config.secret     = ENV['KAROTZ_SECRET']
end
 
Karotz::Client.session do |karotz|
  karotz.ears
  karotz.led
  karotz.say
  karotz.play
end
Karotz::Configuration.configure do |config|
  config.install_id = ENV['KAROTZ_INSTALL_ID']
  config.api_key    = ENV['KAROTZ_API_KEY']
  config.secret     = ENV['KAROTZ_SECRET']
end

Karotz::Client.session do |karotz|
  karotz.ears
  karotz.led
  karotz.say
  karotz.play
end

This will rotate Karotz ears, blink the LED, say ‘test’ and let it play the A-TEAM theme!

FTW!