Mundharmonika Tabs

Hier eine wunderbare Sammlung an Mundharmonika Tabs:

Mundharmonika Tabs

Viele Tabs sind stark vereinfacht, es lohnt sich, nach dem man eine Idee des Liedes hat, nach einer alternativen Version zu suchen. Gleichwohl liefert die Sammlung einen guten Überblick, Einstiege und Anregungen.

Veröffentlicht unter Allgemein | Verschlagwortet mit | Hinterlasse einen Kommentar

Display Git Revision in your .NET/C# Software

the git commit id is a unique way to identify a certain instance of your software. Its especially helpful when lots of builds and versions are around (keeping your customer up-to-date with your development cycle).

I assume you use msysgit and added the bin directory to your PATH environment in such a way git and sed become available via the regular windows Commandline.

Straightforward thinking we want to process this kind of meta information by the “assembly” keyword, as we do for the application title, version and copyright.

First we have to layout a new class (global namespace)

[AttributeUsage(AttributeTargets.Assembly)]
public class AssemblyGitBuild : Attribute
{
public string gitBuild { get; private set; }
public AssemblyGitBuild(string txt) { gitBuild = txt; }
}

Add this to your Projects Prebuilding Events:

git rev-parse --short HEAD | sed -e 's/\(.*\)/[assembly: AssemblyGitBuild(\"\1\")]/' > $(ProjectDir)git_version.cs

Build it. Now you see a new file “git_version.cs” in your projects directory.
Add it to your project.

You can use the git id like that

String gitBuild = "unknown";

try
{
gitBuild = typeof(AssemblyGitBuild).Assembly.GetCustomAttributes(typeof(AssemblyGitBuild), false).Cast<AssemblyGitBuild>().First().gitBuild;
}
catch (Exception e)
{
Logger.Exception(e);
}
tstbVersion.Text = "Version " + Application.ProductVersion +" Build "+ gitBuild;

Veröffentlicht unter Allgemein | Verschlagwortet mit , , , , , | Hinterlasse einen Kommentar

Sega Megadrive/Genesis HTPC

In diesem und folgenden Posts beschreibe ich meinen Weg zum HTPC auf Basis eines Intel Atom N330 MiniITX Boards mit Nvidia ION Grafikchip von Zotac (Zotac ION ITX A-E). Das Board verfügt über spezielle stream processors innerhalb der GPU, in denen Mithilfe der VDPAU Bibliothek (unter Linux) ein Großteil des Decodings verschiedener Videocodecs ausgelagert werden kann.

Der Rechner soll hauptsächlich als MediaPC dienen, aber auch als Server verschiedener Dienste wie HTTP, MySQL, CouchDB, OpenVPN, Redmine … Daher war mir wichtig, dass der Rechner möglichst geräuschlos ist und habe mich für eine 32 GB SSD entschieden. Mediendaten stehen ohnehin auf einem sich im Netzwerk befindlichen, 6 TB Raid5 Server, zur Verfügung. Zuletzt benötigt man noch DDR2 Arbeitsspeicher. Für mich soll es ein 2GB Riegel sein. Alles in allem kommt man mit 250€ aus.

Sega Megadrive/Genesis

Um dem ganzen etwas Glamour zu verleihen, habe ich mich entschieden, den Rechner von Außen nicht identifizierbar in ein altes Sega Megadrive (oder auch Sega Genesis) Gehäuse einzubauen. Außerdem sollte die ursprüngliche Konsolenfunktion so weit wie möglich nachgeahmt oder erhalten werden.

Für eine funktionierende Konsole (seht es mir nach ..), zwei Pads und drei Spielen (Starflight, Sonic I und Kings Bounty) habe ich bei eBay knapp 15€ bezahlt.

Auspacken und Ausschlachten

Auf der Unterseite alle Schrauben lösen. Den Deckel abnehmen. Um das Mainboard von der Unterseite lösen zu können müssen auch die Schrauben am Cartridgeslot gelöst werden. Danach können alle Teile entfernt werden. Jetzt habe ich mit Dremel und Trennscheibe alle im Weg stehenden Teile so gut wie möglich eingeebnet. Das MiniITX Board habe ich in der Rechten hinteren Ecke platziert und entsprechende Aussparungen für alle Anschlüsse vorgesehen.

Zuerst hatte ich vor, das prinzipiell passiv betreibbare System mit dem beiliegendem 4-Pin Lüfter zu kühlen, was sich aufgrund der Lautstärke als unpraktikabel erwies. Ich warte derzeit auf einen Noiseblocker BlackSilentFan XM2 Lüfter, den ich seitlich auf Höhe des ursprünglichen Erweiterungsslots des Megadrives auf den Radiator anbringen werde. Leider habe ich es noch nicht geschafft per ACPI die Drehzahl der Lüfter zu regeln. Im passiven Betrieb liegen beide Cores bei ~40-50°C im geschlossenen Gehäuse, was absolut akzeptabel ist. Leider steigt die Temperatur stark während man einen Film guckst, daher gehts nichts ohne Kühlung.

Im Moment arbeite ich an einer Platine um die Original-Controller als Tastaturen im System zu integrieren. Verwendung findet dafür ein AT90USB1287 aus der Bastelkiste.

Pinbelegung Sega Megadrive Controller

Pin Farbe im Pad Funktion
1 Braun Up
2 Rot Down
3 Orange Y1
4 Gelb Y2
5 Grün VCC
6 Blau Y3
7 Grau Select
8 Schwarz GND
9 Weiß Y4

Alle Funktionstasten liegen über Pull-Ups an VCC. Bis auf Up/Down liegen alle Funktionstasten an einem 74157 (4x Zweifach Multiplexer).

Schaltplan so far

megadrive_pcb

Noch ein paar Bilder vom Umbau:

Veröffentlicht unter Allgemein | Verschlagwortet mit , , , , , | 2 Kommentare

Weisheiten des Projektalltags

Identität

In C, you merely shoot yourself in the foot.

In C++, you accidentally create a dozen instances of yourself and shoot them all in the foot. Providing emergency medical care is impossible, because you can’t tell which are bitwise copies and which are just pointing at others and saying, “That’s me, over there.”

Führung

I wish i had said this, but it was said by asd@asd.com in comp.software-eng.

Leaders:

  • lead by example
  • don’t ask anything of anyone they wouldn’t do themselves
  • are called on to make difficult and unpopular decisions
  • keep the team focused
  • reward/support their team in whatever they do
  • keep/clear unnecessary crap out of the way of the team

Consensus is great. If it lasts for the project lifecycle, consider yourself blessed. I’ve been on a couple projects where two engineers just blantantly disagreed! They were always:

Programmer #1 says ” x = 1″
Programmer #2 says ” x != 1″

That’s when a Project Leader is required. Unless you want to flip a coin.

Oh yah – one more thing. Project leaders: TAKE the blame when things go wrong and SHARE the credit when things go right.

Ain’t easy – but it’s the way I try to run my life

Akzeptieren von Ideen

  • It’s impossible.
  • Maybe it’s possible, but it’s weak and uninteresting.
  • It is true and I told you so.
  • I thought of it first.
  • How could it be otherwise.
    If you come to objects with a negative preconception please keep an open mind. You may still conclude objects are bunk, but there’s a road you must follow to accept something different. Allow yourself to travel it for a while.

Phasen eines Projektes

  • Enthusiasm
  • Disillusionment
  • Panic
  • A Search for the Guilty
  • The Punishment of the Innocent
  • Praise and Honor for the Non-Participants

Quellen:

Veröffentlicht unter Allgemein | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Automatische Netzwerkkonfiguration mit ifplugd und guessnet

guessnet ist ein Programm, mit dem man eine Netzwerkumgebung auf bestimmte Eigenschaften untersuchen kann. Aufgrund dieser Eigenschaften können Variablen gesetzt werden, welche wiederum in einem IfPlugd-Skript ausgewertet werden können.
Auf diese Weise lassen sich zum Beispiel statische Adresse konfigurieren, NFS mounten, Benutzerrechte und Firewalls konfigurieren.

Die Installation guessnet auf Ubuntu-Systeme ist trivial und hier erklärt. Eine modifizierte /etc/network/interfaces könnte so aussehen:

auto lo
iface lo inet loopback

mapping eth0
script /usr/sbin/guessnet-ifupdown
map timeout: 4
map default: unbekannt

iface aachen-wohnung inet static
scheme aachen-wohnung
address 192.168.XXX.99
netmask 255.255.255.0
gateway 192.168.XXX.1
dns-nameservers 192.168.XXX.1 192.168.XXX.1
test1 peer address 192.168.XXX.1 mac 00:16:32:8E:XX:XX source 192.168.XXX.99

iface eltern inet static
scheme eltern
address 192.168.XXX.99
netmask 255.255.255.0
gateway 192.168.XXX.1
dns-nameservers 192.168.XXX.1 192.168.XXX.1
test1 peer address 192.168.XXX.1 mac 00:0F:3D:35:XX:XX source 192.168.XXX.99

iface mechapro inet dhcp
scheme mechapro
test1 peer address 192.168.XXX.1 mac 00:1C:28:1B:XX:XX source 192.168.XXX.XXX

iface keinnetz inet manual
scheme keinnetz
test1 missing-cable

iface unbekannt inet dhcp
scheme unbekannt

Ein Dump der exportieren Variablen mit typeset -x zeigt:

declare -x ADDRFAM="inet"
declare -x DISPLAY=":0"
declare -x IFACE="eth0"
declare -x IF_ADDRESS="192.168.XXX.99"
declare -x IF_DNS_NAMESERVERS="192.168.220.1 192.168.XXX.1"
declare -x IF_GATEWAY="192.168.XXX.1"
declare -x IF_METRIC="100"
declare -x IF_NETMASK="255.255.255.0"
declare -x IF_SCHEME="aachen-wohnung
declare -x IF_TEST1="peer address 192.168.XXX.1 mac 00:16:32:8E:XX:XX source 192.168.XXX.99"
declare -x LOGICAL="aachen-wohnung"
declare -x METHOD="static"
declare -x MODE="start"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare -x PHASE="post-up"
declare -x PWD="/"
declare -x SHLVL="1"
declare -x VERBOSITY="0"

An PHASE können wir also den Aufrufmodus erkennen.

Unter /etc/network/mount (x-Flag nicht vergessen) werte ich den aktuellen Zustand aus:

#!/bin/bash

export DISPLAY=:0

logger "Network Mounts for $IF_SCHEME in phase $PHASE"

if [ -z $IF_SCHEME ]; then
exit 0
fi

if [ "$IF_SCHEME" = "aachen-wohnung" ]; then
PRETTY_TEXT="Aachen Wohnung"
OPTIONS="username=xxx,password=xxx,uid=xxx,gid=xxx,codepage=cp852,iocharset=utf8,rw"
targets=(apps movies music stuff)
for target in $targets
do
if [ "$PHASE" = "post-up" ]; then
if [ ! -d /mnt/aaa/$target ]; then
mkdir -p /mnt/xxx/$target
fi
mount -t smbfs //192.168.xxx.xxx/$target /mnt/aaa/$target -o ${OPTIONS}
else
umount -fl /mnt/aaa/$target
fi
done
fi

if [ "$IF_SCHEME" = "mechapro" ]; then
PRETTY_TEXT="Mechapro"
OPTIONS="username=xxx,password=xxx,uid=xxx,gid=xxx,codepage=cp852,iocharset=utf8,rw"
if [ "$PHASE" = "post-up" ]; then
mount -t smbfs //192.168.xxx.xxx/bbb /mnt/xxx/bbb -o ${OPTIONS}
mount -t smbfs //192.168.xxx.xxx/ccc /mnt/xxx/ccc -o ${OPTIONS}
ttt_start /home/xxx/Arbeitszeit/Mechapro.ttt
else
umount -fl /mnt/xxx/bbb
umount -fl /mnt/xxx/ccc
fi
fi

if [ "$IF_SCHEME" = "eltern" ]; then
if [ ! -d /mnt/megadrive ]
then
mkdir -p /mnt/megadrive
fi
PRETTY_TEXT="Eltern"
OPTIONS="uid=xxx,gid=xxx,codepage=cp852,iocharset=utf8,rw"
sshfs -pxxxxx xxx@xxx.xxx-ass.org:~/ /mnt/megadrive/ -o $OPTIONS
fi

if [ -n "$PRETTY_TEXT" ]
then
notify-send -c network -i network-ethernet-connected $PRETTY_TEXT
fi

exit 0

Veröffentlicht unter Allgemein | Verschlagwortet mit , , , , , | Hinterlasse einen Kommentar

Blog kompromenttiert

Die Überschrift sagt alles denke ich. Hmpf.

Veröffentlicht unter Allgemein | Hinterlasse einen Kommentar

Der Phoenix und so

Liebes Online-Web-2.0-Diaryalike-Blog,

lange warst du verwaist. Aber jetzt möchte ich dich mal wieder ein bisschen mit Leben füllen.

In den nächsten Tagen wird zunächst ein bisschen an deinen Innereien rumgeschraubt, Funktion und Optik auf einen vernünftigen Stand gebracht.

Danach wird es hier hoffentlich ein paar neue Projekte, Ideen und Visionen geben.

Veröffentlicht unter Allgemein | Hinterlasse einen Kommentar

Rock am Ring 2008

Hier mein verwaister Festivalbericht aus dem Jahre 2008. Musste jetzt irgenntwie mal raus.
Weiterlesen

Veröffentlicht unter Allgemein | Verschlagwortet mit | Hinterlasse einen Kommentar

XML RPC mit Qt 4.6 und OpenSSL

In einem Projekt möchte ich mit Qt auf die XML Rpc Schnittstelle von Sipgate Team zugreifen.

Nach meiner Internetrecherche hat sich folgendes herrausgestellt:

  • Qt bringt keine eigene XML Rpc Librarys mit. SOAP ist mit Qt übrings kein Problem.
  • Mit geringem Aufwand lässt sich aus den Qt Modulen QtNetwork und QtXML eine eigene XML RPC Lib zusammenschustern.
  • Sebastian Wiedenroth und Karl Gratz haben uns mit LibMaia schon einen Großteil der Arbeit abgenommen.
  • Für meine Zwecke musste ich nurnoch einige Anpassungen vornehmen (SSL und Auth)

Vorraussetzungen

Ich entwickele unter Windows 7 mit VS2005. Eine Anleitung zu Qt und VS2005 findet man bei Ferhat Akgün.

Qt mit OpenSSL Support kompilieren

Nachdem OpenSSL installiert ist müssen wir Qt mit OpenSSL Support backen. Dazu rufen wir configure zusätzliche mit folgenden Flags auf:

-openssl -I pfad_zu_openssl_includes -L pfad_zu_openssl_libs

Bei mir sieht das so aus:
configure -platform win32-msvc2005 -no-qt3support -qt-sql-odbc -qt-sql-sqlite -qt-zlib -qt-libpng -openssl -I C:\OpenSSL\include -L C:\OpenSSL\lib -qt-sql-mysql -opensource -I C:\mysql-5.1.44-win32\include -L C:\mysql-5.1.44-win32\lib\opt -l libmysql

LibMaia

Nachdem wir uns ein Checkout von LibMaia besorgt haben (svn co https://svn.frubar.net/svn/libmaia/trunk/) kompilieren wir das ganze mit

qmake && nmake

Ich empfehle, einen Unterordner wie 3rdparty im Qt Verzeichnis (in der Ebene ,in der auch die Ordner mit eueren Qt Versionen liegen) zu erstellen und dort 3rd-Party Libs wie LibMaia abzulegen.

Macht euerem Projekt jetzt den Include Path mit den Headern sowieso euerem Linker den Include Path mit den Libs und im speziellen maia.lib bekannt. (Wenn ihr wollt könnt ihr natürlich auch die *.h und *.cpps von LibMaia direkt euerem Projekt hinzufügen und euch den vorherigen Schritt sparen)

Frisch ans Werk

Weist zunächst Qt an, die Module QtNetwork und QtXml mitzuladen.

Erstellt jetzt eine Klasse die folgende Slots enthält:

public slots:;
void myFaultResponse(int, const QString &);
void myResponse(QVariant&);

Diese werden benötigt, um auf die asynchronen Antworten der XML RPC API zu reagieren.

In euerer .cpp inkludiert ihr “maiaXmlRpcClient.h”. Ich werde jetzt meinen ersten Testcode benutzen, um euch das weitere vorgehen zu erklären:


#include "xmlrpc.h"
// Client Includes
#include "maiaXmlRpcClient.h"
xmlrpc::xmlrpc(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags)
{
ui.setupUi(this);
// API Url. Kann auch pro Call übergeben oder mit rpcClient->setUrl gesetzt werden.
QUrl targetUrl = QUrl("https://api.sipgate.net/RPC2");
targetUrl.setUserName("euere@sipgate.kontaktdaten");
targetUrl.setPassword("euerpasswort");
// Erstellt den Client. Der zweite Parameter ist ein QObjekt als Parent für die automatische
// Objektzerstörung, wie bei Qt üblich
MaiaXmlRpcClient* rpcClient = new MaiaXmlRpcClient(targetUrl, this);
// Ein erstellen, wie von der Sipgate Api für ClientIdentify verlangt
QVariantMap clientArgs;
clientArgs["ClientName"] = QString("AWinKD Sipgate Plugin");
clientArgs["ClientVersion"] = QString("0.1");
clientArgs["ClientVendor"] = QString("Steffen Görtz");
// In ein packen
QVariantList args;
args << clientArgs;
// Methode samurai.ClientIdentify ausführen und Antwort sowieso Errormethode connecten
rpcClient->call("samurai.ClientIdentify", args,
this, SLOT(myResponse(QVariant&)), this, SLOT(myFaultResponse(int, const QString &)));
}
void xmlrpc::myFaultResponse(int errorCode, const QString &errorMsg) {
qDebug() << "Fehler (" << errorCode << ") :" << errorMsg;
}
void xmlrpc::myResponse(QVariant &response) {
;
}

Veröffentlicht unter Allgemein | Verschlagwortet mit , , , , , | 1 Kommentar

Ben Howard

Donnerstag bei One Shot Not nach Tracks gesehen.

Veröffentlicht unter Allgemein | Verschlagwortet mit | Hinterlasse einen Kommentar