2009-12-22

Last Minute Weihnachtsgeschenk

Ein Last-Minute Weihnachtsgeschenk in zwei Größenvarianten. Die angegebenen Größen der Grundplatten können als Orientierung dienen. Ansonsten kommt es auf die genauen Maße nicht an.
Zeitaufwand ca. 1-2h, je nach Ausstattung des Hobbykellers - also durchaus noch morgen Nachmittag oder gar am 24. Vormittag zu schaffen. ;-)

Variante 1 (Grundplatte 36cmx36cm)





Variante 2 (Grundplatte 16cmx16cm)



2009-12-10

CouchDB API: Inspect parameter

While playing with couchdb/couchapp often I want to inspect api function parameter. Javascript does not provide a buildin function to do some inspection but this one does a good job. After removing the logging stuff it can be used e.g. to inspect show function parameter.

Inspection show function can be found here.

Permission denied (publickey).

After successful configure github access using Win/msysgit I have to fight on the Linux front. Just copy the private key file generated with puttygen didnt work:

[thomo@sun .ssh]$ ssh git@github.com
Enter passphrase for key '/home/thomo/.ssh/thomo__github_private.ppk':
Permission denied (publickey).

I neither enter a passphrase nor was able to change the empty phrase using ssh-keygen -P. :-|

To solve the problem I export the private key in OpenSSH format:

2009-11-03

CouchDB auf WinXP


  • Installationspaket gibts hier

  • Nach dem Installieren müssen noch in >installdir</bin/erl.ini zwei Pfade angepasst werden

  • [Update]in couchdb.bat musste ich noch in der Zeile nach "setlocal"
    %~d0
    einfügen


Und dann ...

D:\Programme\CouchDB\bin>couchdb.bat
CouchDB 0.11.0b819947 - prepare to relax...
Eshell V5.7.2 (abort with ^G)
1> Apache CouchDB 0.11.0b819947 (LogLevel=info) is starting.
1> Apache CouchDB has started. Time to relax.
1> [info] [<0.35.0>] Apache CouchDB has started on http://127.0.0.1:5984/

bzw.

2009-10-16

Ersatzakku für i-Blue 747 GPS Data logger


Heute kam der Ersatzakku für mein i-Blue GPS Data logger. Da mir die Angebotenen Akkus mit der Typbezeichnung HX-N3650A zu preisintensiv waren, habe ich mich stattdessen für die Nokia Variante entschieden - BL-5C. Und siehe da er passt.

2009-07-18

Rake Task to show installed and pending migrations

While developing with Rails I often want to know which migrations are already installed and which are pending. Migrations have names and version numbers. In some rake migration tasks you must specify a migration - but this must be the number :-|

To rest my brain I wrote two rake tasks to show the installed and pending migrations. Feel free to use it for your own - just copy it to a .rake file in your /lib/task directory.


namespace :db do
namespace :migrate do
desc 'Shows installed migrations'
task :installed => :environment do
mt = ActiveRecord::Migrator.new(:up, "db/migrate/")
list = mt.migrations.select{ |mi| mt.migrated.include?(mi.version.to_i) }
print_migration_list(list)
end

desc 'Shows pending migrations'
task :pending => :environment do
mt = ActiveRecord::Migrator.new(:up, "db/migrate/")
print_migration_list(mt.pending_migrations)
end
end
end

def print_migration_list(migrations)
return if migrations.empty?

max_length = migrations.inject(0) {|max, m| [max, m.name.length].max }
puts "Version Name"
puts "---------------" + "-" * max_length
migrations.each do |m|
puts "#{m.version} #{m.name}"
end
end


See also pastie.org

2009-07-14

Generic Cucumber Steps

Zwei generische Steps, die das Ergebnis erster Gehversuche mit Cucumber sind. (Factory = factory_girl)


# Match steps like:
# * And I have projects named A, B, C
Given /^I have .+ named (.+)$/ do |names|
names.split(', ').each do |name|
Factory.create(name)
end
end

# Match steps like:
# * And I should have 1 project
# * And I should have 5 users
Then /^I should have ([0-9]+) (.+)$/ do |count, classes|
Kernel.const_get(classes.singularize.capitalize).count.should == count.to_i
end

2009-06-17

SAT Receiver repariert

Nachdem ich erst letzte Woche auf dem Mainboard von meinem PC einen Elko ausgetauscht hatte, hat sich dann ein paar Tage später der SAT-Receiver gemeldet bzw. eben nicht mehr gemeldet. Zu erst ließ sich das Gerät nicht mehr aus dem Standby aufwecken, und dann ging es auch nach einem Power-Off/Power-On Zyklus nicht mehr an. Ein Blick auf die Netzteilplatine offenbarte dann die Schuldigen: 4 Elkos hatten sich verabschiedet (erkennbar an den gebogenen Deckeln).


Ersatz-Elkos waren schnell bestellt (Low-ESR Typen hab ich nicht auf Halde liegen, Infos zu ESR Elkos gibt es hier), heute kam die Lieferung, eingebaut und ... läuft wieder ;-)

2009-04-20

LED Matrix - Erste Versuche

Vor kurzen bin ich an ein LED-Matrix Modul gekommen. Typ: TLMM501B



Das Modul besitzt keinen Controller im eigentlichen Sinn, sondern lediglich zwei 256 Bit Schieberegister. Die Ansteuerung gestaltet sich damit etwas aufwendiger als zunächst angenommen.

Habe daher einen Microchip PIC als Ansteuer-IC verwendet, der in letzter Ausbaustufe ein serielles Interface zur Ansteuerung des Moduls zur Verfügung stellen soll.

Die ersten Ergebnisse sieht man hier:

video video

2009-04-03

Initd Script für cruisecontrolrb

Based on the $CCRB_HOME/daemon/cruise.sample version.


#!/usr/bin/ruby
# chkconfig: 235 99 10
# description: Start or stop the SnipSnap server
#
### BEGIN INIT INFO
# Provides: cruisecontrolrb
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Start or stop the cruisecontrolrb daemon
### END INIT INFO

ENV['PATH']="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11"

require "fileutils"
include FileUtils

require "rubygems"

begin
gem 'mongrel'
rescue => e
puts "Error: daemon mode of CC.rb requires mongrel installed"
exit 1
end

def cruise_path
"/home/cruise/cruisecontrolrb"
end

def cruise_user
"cruise"
end

def cruise_log
"/var/log/cruisecontrolrb.log"
end

def start
system "su - #{cruise_user} -c 'cd #{cruise_path} && ./cruise start -d >> #{cruise_log}'"
end

def stop
system "mongrel_rails stop -P #{cruise_path}/tmp/pids/mongrel.pid >> #{cruise_log}" if File.exists?("#{cruise_path}/tmp/pids/mongrel.pid")
Dir["#{cruise_path}/tmp/pids/builders/*.pid"].each do |pid_file|
pid = File.open(pid_file){|f| f.read }
system "kill -9 #{pid}"
rm pid_file
end
end

command = ARGV.shift

system "touch #{cruise_log}"
system "chown #{cruise_user} #{cruise_log}"


case command
when 'start'
start
exit 0
when 'stop'
stop
exit 0
when 'restart'
stop
start
exit 0
else
puts "Usage: /etc/init.d/cruise start|stop|restart"
exit 1
end

2009-03-27

Blockhaus selbst gebaut

Im Rahmen des Kunstunterrichts gab es die Aufgabe ein Blockhaus zu bauen:

Am Anfang steht die Arbeit



  • anzeichnen

  • sägen

  • schleifen

  • bohren

  • und nochmal schleifen



Das Ergebnis






Und schließlich


... einziehen ;-)

2009-02-27

Maven2

Verzeichnisstruktur


An introduction to Maven 2
Building Web Applications with Maven 2

Projekt anlegen


C:\maven2example>mvn archetype:create
-DgroupId=com.attainware.maven2example
-DartifactId=maven2example_logic

2009-02-24

Anmerkungen zum Setup Fedora 10 - Probleme mit dhcpd, named, ntpd

  • dhcpd, named und ntpd laufen nach dem Booten nicht korrekt, da Netzwerkinterface beim Starten noch nicht konfiguriert
  • bei der Installation wird für die Konfiguration des Network-Interface der NetworkMonitor verwendet

Feb 24 11:33:20 sun NetworkManager: starting...
Feb 24 11:33:20 sun NetworkManager: Found new Ethernet device 'eth0'.
...
Feb 24 11:33:21 sun named[1931]: listening on IPv4 interface lo, 127.0.0.1#53
...
Feb 24 11:33:23 sun dhcpd: Not configured to listen on any interfaces!
...
Feb 24 11:33:25 sun NetworkManager: Activation (eth0) Stage 5 of 5 (IP Configure Commit) complete.

Lösung



NetworkMonitor deaktivieren und stattdessen network verwenden

chkconfig NetworkMonitor off
chkconfig network on

2009-02-22

Anpassungen für SELinux

Anleitung zur Anpassung von Applikationen an SELinux: http://www.os-t.de/PDFs_SELinux/2363_Kap_16.pdf

Kurze Anleitung:
  1. SELinux in Permissive-Mode setzen (setenforce 0)
  2. SE Policies neu laden (semodule -R)
  3. Applikation ausführen (diverse Log-Einträge werden generiert)
  4. Log-Einträge auswerten und Applikationsmodul erstellen (audit2allow -a -l -M )
  5. Modul installieren (semodule -i phpsysinfo.pp)
  6. SELinux in Enforce-Mode setzen (setenforce 1)

2009-01-28

Java <=> Ruby

continue <=> next
throw <=> raise
catch <=> rescue
this <=> self
switch <=> case
case <=> when
default <=> else

2009-01-12