prosody 0.8.2. still waiting

Posted on 10. Juli 2012 Comments

I tried to start prosody with user-privileges (with user/group prosody) but I kept getting this message from prosodyctl start:

Still waiting...
Proody is still not running. Please give it some time or check your log files for errors.

But there were no errors in the log-file. If I deleted the log-file nothing was created again. I tried giving all the prosody folders 777 rights and chown‚d them to the prosody-user, still…same error. I then went to the Prosody MUC. Once again, Zash helped me to isolate the error: the pid-file could not be written by the user. So I just changed the line

pidfile="/var/run/prosody.pid"

to:

pidfile="/home/prosody/prosody.pid"

changers.com solarpanel unboxing und review

Posted on 9. Juli 2012 Comments

Ich habe mir neulich das Starter Kit von changers.com geholt: 1 Solarpanel und dazugehöriges Akkupack, welches mit ein bisschen exchangers.com 4th july specialtra-Hardware die Energiemenge misst, die man erzeugt. Die kann man dann per USB auf den Rechner übertragen und bei facebook und twitter hochladen. Da es ein Independence-Day Special gab, hab ich mal zugegriffen.

 

Unboxing-Videos gibts einige auf youtube, deswegen mach ich’s kurz:

  • 1 Solarpanel
  • 1 Akkupack
  • ein Haufen Adapter Kabel
  • 1 Micro USB Kabel zum Daten hochladen
  • 2 Saugnäpfe

Alles wie bestellt in 2 Pappkartons. Der Akku war etwas geladen, mein Handy lädt auch wunderbar da dran.

 

changers.com kit

 

 

 

 

 

 

Allerdings war es, wie so oft in letzter Zeit, etwas bewölkt und so funktionierte das Laden überhaupt nicht. Davon mal abgesehen, ist mein Schlafzimmer nachmittags auf der sonnenabgewandten Seite. Ich werde es morgen noch einmal probieren.

Hamburg

 

update: knappe 2 Jahre später kann ich sagen, dass mir das Ding auf einer Fahrradtour nach Schweden definitiv das Leben erleichtert hat, weil ich mein Smartphone doch mehr zur Navigation brauchte, als ursprünglich angenommen. Es nervt, dass man die Batterie im Zweifelsfall nicht über die Steckdose aufladen kann, gerade in Städten, in denen die Sonne weniger häufig scheint oder im Winter(update2: gibt es jetzt auch ein Netzteil für). Am besten kann ich es also auf Tour gebrauchen, vor allem die Größe gefällt mir. Wenn man nachts drinnen schläft, kann ich sonst für einen Bruchteil des Geldes den Lippenstift großen Akku von Anker empfehlen. Allerdings braucht er auch die ganze Nacht zum Aufladen.

changers.com software mobile-battery auf Ubuntu 11.10 64-Bit

Posted on 9. Juli 2012 Comments

Ich habe mir neulich schonmal die Software von changers.com angeguckt, einem kleinem berliner Start-Up, das Solarpanel und dazu passende Akkuspacks verkauft. Der Clou: ein bisschen Hardware in dem Akku misst, wieviel Energie erzeugt wurde und so kann man die Daten per USB übertragen und bei facebook/twitter hochladen.

Anyway, das .deb-Paket ließ sich erst nicht installieren, weil ein paar Abhängigkeiten fehlten. Ist ja auch kein Problem, das löst unter Ubuntu normalerweise ein

sudo apt-get install -f

Die Abhängigkeiten wurden installiert nur gab das auch diese Fehlermeldung:

E: Das Paket mobile-battery muss neu installiert werden, es kann jedoch kein Archiv dafür gefunden werden.

Dasselbe passierte wenn ich mit folgendem Befehl versucht habe, das Paket zu entfernen:

sudo apt-get remove mobile-battery

Wäre jetzt alles nicht so schlimm gewesen aber ich konnte weder über upgrade meine Programme auf dem aktuellen Stand halten noch über install neue installieren!

Eine Neuinstallation brachte mich dann auf den richtigen Weg:

repat@laptop:~/Downloads$ sudo dpkg -i changers_software_v274-1_amd64.deb
    (Lese Datenbank ... 473163 Dateien und Verzeichnisse sind derzeit installiert.)
    Vorbereitung zum Ersetzen von mobile-battery 1.0-274-1 (durch changers_software_v274-1_amd64.deb) ...
    Ersatz für mobile-battery wird entpackt ...
    /var/lib/dpkg/info/mobile-battery.postrm: Zeile 11: return: can only `return' from a function or sourced script
    dpkg: Warnung: Unterprozess altes post-removal-Skript gab den Fehlerwert 1 zurück
    dpkg - stattdessen wird Skript aus dem neuen Paket probiert ...
    /var/lib/dpkg/tmp.ci/postrm: Zeile 11: return: can only `return' from a function or sourced script
    dpkg: Fehler beim Bearbeiten von changers_software_v274-1_amd64.deb (--install):
     Unterprozess neues post-removal-Skript gab den Fehlerwert 1 zurück
    /var/lib/dpkg/tmp.ci/postrm: Zeile 11: return: can only `return' from a function or sourced script
    dpkg: Fehler beim Aufräumen:
    Unterprozess neues post-removal-Skript gab den Fehlerwert 1 zurück
    Trigger für bamfdaemon werden verarbeitet ...
    Rebuilding /usr/share/applications/bamf.index...
    Trigger für desktop-file-utils werden verarbeitet ...
    Trigger für gnome-menus werden verarbeitet ...
    Fehler traten auf beim Bearbeiten von:
    changers_software_v274-1_amd64.deb

Vor allem diese Zeile machte mich stutzig:

 /var/lib/dpkg/tmp.ci/postrm: Zeile 11: return: can only `return' from a function or sourced script

.deb-Pakete sind ja eigentlich auch eine Art Archive wie .zip oder .tar.gz. In diesen findet man 2 Ordner: DEBIAN und usr.Die beiden post-removal Skripts in .deb-Paketen heissen postrm und postinst. Man findet sie im DEBIAN-Ordner, wenn man das .deb-Paket man mit einem Archiv-Programm aufruft(z.B. File-Roller). postinst enthält in Zeile 18 und postrm in Zeile 11 (s.o.) tatsächlich ein return, was da anscheinend nicht ‚reingehört. Nun war das Problem, dass bei jeder neuen Installation, er die Skripte aus dem temporären Verzeichniss tmp.ci startet. Nach ein bisschen googeln stieß ich auf diesen Beitrag von bed von zockertown.de. Also habe ich in /var/lib/dpkg/info in den beiden Dateien die return-Zeile gelöst und dann ein

sudo apt-get install -f

ausgeführt. Das hat die Software dann runtergeschmießen. Ich habe den Support mal angeschrieben(ich hatte sie vorher auch schon über Twitter um Hilfe gebeten aber keine Antwort erhalten…), vielleicht fixen sie das ja mal. Bis dahin muss ich meine Daten wohl per Windows hochladen. Mein Solarpanel ist heute angekommen, unboxing folgt;-)

Sie haben allerdings beim Schreiben dieses Blog-Eintrags auf meine E-Mails geantwortet, mal sehen was das wird:-)

Das mit dem Strom fuer Holgi

Posted on 21. Juni 2012 Comments

Das ist zwar keine Erklärung, aber vielleicht hilft es ja um nachzuschlagen, ob Geräte kompatibel sind. Das ist natürlich alles stark vereinfacht.

Spannung U (in Volt(V) gemessen)

  • Die Spannung zum Betreiben eines Gerätes muss ca. übereinstimmen, weniger ist schlecht.
  • Zum Laden eines Gerätes muss die Spannung des Ladgeräts etwas höher sein (meistens gibt es noch Ladeelektronik, die sowas regelt)
  • Bei zu großer Spannung kann ordentlich was schief gehen
  • Bei zu wenig Spannung kann afaik tatsächlich vom Akku Strom zurück ins Solarpanel fließen(und dieses schädigen), die meistens kommerziellen Produkte enthalten aber eine kleine Schaltung, die das mit einer speziellen Diode verhindern(sowas wie eine Einbahnstraße unter den elektrischen Bauteilen)

 

Strom I ( in Ampere(A) gemessen)

  • Es wird immer ein Maximum angegeben was die Spannungsquelle/Ladegerät liefern kann.
  • Wenn dein zu betreibendes/ladendes Gerät mehr brauch, geht es langsamer oder garnicht.
  • Wenn es weniger brauch als dein Ladegerät liefern kann, ist es ok, weil es sich nur „den Strom nimmt“, den es brauch.

 

Leistung P (in Watt(W) gemessen)
Falls mal die Leistung nicht auf der Packung stehen sollte, kann man sie folgendermaßen errechnen:

  • Leistung = Spannung * Strom
  • –> P = U * I

 

Und damit nicht nochmal jemand behauptet P = R:

Widerstand R (gemessen in Ω(sprich: Ohm))

  • U = R * I (Ohmsches Gesetz)
  • hat natürlich irgendwie miteinander zu tun, aber nur weil es passt, kann man es nicht gleichsetzen;-)

 

Angaben ohne Gewähr.
In respone to WR073 Holger ruft an: Bei Eric (wg. Solarstrom)

Dining Philosophers with monitor using pthread mutex and condition variables in C

Posted on 24. Mai 2012 Comments

I had to do this for uni a while ago so I thought I might as well publish it. The task was to implement the Dining philosophers problem in C. We had to use the monitor concept which is implemented with mutual exclusion (mutex) from the pthread-library because C lacks a built-in monitor function in contrary to e.g. Java, Python or Delphi. Bascially this just means, the critical things have to go between pthread_mutex_lock(&mutex) and pthread_mutex_unlock(&mutex) The communication from one philosopher to another was realized with condition variables(cond-vars). The realisation of thinking and eating should be done by to empty loops that go to a huge number(so it takes a while even on todays computers). A debug printout should be implemented as well to control everything is working as expected. Nearer details can be found in the doxygen documentation or directly in the sourcecode.

Download

Pruefen ob ein Computer online ist mit ping und perl

Posted on 18. Mai 2012 Comments

Ich habe bei der Arbeit ein kleines Perl-Skript geschrieben, welches prüfen sollte, ob bestimmte Computer in bestimmten Räumen(also IP-Ranges) noch online sind oder schon automatisch ausgestellt wurden. Dieses Skript sendet ein Paket über ping und guckt dann, ob es ein packetloss gibt. Im Grunde wäre das in der Bash besser gewesen, aber so kann man das, wenn man es ein bisschen anpasst, auch unter anderen OS verwenden.

Code

# The string containsPacketLoss is searching for
$packetloss = "100% packet loss";
# Init
$returnval = "";

print "\nCheck if Computers are online...\n";

# Scan IP-Range
for (my $i = 1; $i <=255; $i++) {
	# c = one package, w = deadline, q = quiet
        $ipcmd = "ping -c1 -q -w1 169.254.1." . $i;
        # execute and retreive output
        $returnval = `$ipcmd`;
        if (containsPacketLoss() == 0) {
            # output
            print "Computer  with IP 169.254.1." . $i . "is still online.\n";
            # write log file
	    system("echo Computer with IP 169.254.1.". $i . localtime(time) . " ONLINE >> /home/user/log");
        }
}

sub containsPacketLoss(){
	# check by RegEx if the string specified above is in the returnvalue
	# of the ping command
	if ($returnval =~ m/$packetloss/ ){
                return 1;
        }
        return 0;
}

Download

Arduino Ethernet Shield und LM35DZ Temperatursensor

Posted on 18. Mai 2012 Comments

Das ist ein Projekt was bei mir bestimmt schon 2 Jahre rumliegt. Vielleicht wird es auch noch erweitert.

Hardware
Einen Arduino bekommt man für knapp 25€ bei diversen Shops im Internet, im Laden hab ich sie bis jetzt nur überteuert als Paket bei Conrad gesehen. Das Ethernet Shield bekommt man auch für ~$10 bei ebay. Den LM35DZ Temperatursensor hab ich für ca. 4€ bei Conrad gekauft. Der Rest (Lötsachen, Kabel, Schrumpfschläuche) ist Zubehör, das hier so rumlag.
Gemäss dem Datenblatt habe ich den Temperatursensor über ein paar angelötete Kabel an das Breadboard aufgesteckt. Die Beinchen habe ich mit Schrumpfschläuchen versehen, damit sie nicht aus versehen gegeneinander kommen können. Ich überlege gerade noch es mit Heisskleber abzudichten, so dass der Sensor nach draussen kann.

Software
Ich setze ein bisschen Grundwissen der Programmierung voraus. Vor allem, wer C kann, sollte hier keine Schwierigkeiten haben. Ist auch nicht schwer. Es gibt 2 Funktionen, setup() und loop(), die entsprechend ihrem Namen genau das tun. Für fast alles hat schonmal jemand eine library geschrieben, man muss quasi nur noch den Bastelkasten nehmen und zusammenstecken. Für das Ethernet Shield gibt es natürlich eine library, die das im Grunde recht simpel macht. Man bindet einfach die libraries dafür ein:

#include <Ethernet.h>
#include <SPI.h>

und kann dann global mit

byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {
192,168,1,5 };
byte gateway[] = {
192, 168, 1, 1};
byte dns[] = {
192, 168, 1, 1};
byte subnet[] = {
255, 255, 255, 0 };

die entsprechenden Optionen setzen. Am besten die IP-Adresse so wählen, dass man nicht mit dem DHCP Server korreliert. Dann kommt noch eine kurze Initialisierung:

Server server(80);

Nebenbei habe ich den input pin für die Temperatur gesetzt und eine globale Variabale dafür angelegt:

const int apin = A3;
float temperature;

In setup() wird dann mit folgenden Befehlen der Webserver gestartet:

Ethernet.begin(mac, ip, dns, gateway);
server.begin();

Hier setze ich die serielle Verbindung auf 9600 Baud und definiere den oben spezifierten Pin als INPUT:

Serial.begin(9600);
pinMode(apin,INPUT);

Als nächstes kommt loop(). Hier definier ich eine Variable in die der rohe Input gespeichert wird. Die rechnet man dann gemäß einer Formel um, die ich im Internet gefunden hab. Zum Test habe ich eine Ausgabe auf der seriellen Console eingestellt. Die findest man in der Arduino IDE unter Tools. Jenachdem ob man ihn an 3.3V oder an 5.0V anschliesst, ist die Formel natürlich anders.

int input = analogRead(apin);

temperature = (5.0 * input * 100.0)/1024.0;

Serial.print( "Temperature: ");
Serial.print(temperature);
Serial.print("\n");
delay(1000);

Damit der Code da jetzt ein bisschen übersichtlich bleibt habe ich eine Funktion namens listenForClients() geschrieben. Ich denke aus den Kommentare sollte klar werden, was hier passiert:

void listenForClients() {

  // Initialize client
  Client client = server.available();

  if (client) {
    // Message for debugging
    // Serial.println("Got a client");

    boolean currentLineIsBlank = true;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (c == '\n' && currentLineIsBlank) {

          // Tell the client the receiving data is HTML
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

          // This is the actual temperature value
	  // $deg; is the little round degree sign
          client.print("Temperature: ");
          client.print(temperature);
          client.print(" °C");

          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }

    // Give the web browser time to receive the data
    delay(1);

    // Close the connection:
    client.stop();
  }

Der Code ist überwiegend Copy-Pasta aus File/Examples/Ethernet/Webserver.

Hier gibts nochmal den Quelltext zum downloaden.

 

Fotos

(click to enlarge)

Foto Arduino Webserver LM35 Temperatursensor
Screenshot Arduino Webserver LM35 Temperatursensor

 

Links

Sprachausgabe im Menu beim Kindle ausstellen

Posted on 9. März 2012 Comments

Settings hat noch eine zweite Seite, die man mit den Pfeiltasten an der Seite erreicht und auf der man Text to Speech ausstellen kann, also nicht nur TTS für ein Buch sondern auch, dass er das Menü vorliest.

MySQL Server absichern

Posted on 7. März 2012 Comments

Was bei einem Webhoster der Admin automatisch übernimmt, muss man bei einer Installation z.B. auf dem eigenen Homeserver selbst machen. Ich gehe hier von einem über Paketquellen installierten MySQL Server der Version 5.0.57 auf einem Apache der Version 2.2.10 unter SuSE Linux Enterprise Server(SLES) aus. Wer einigermaßen englisch spricht dem ist auch Kapitel 2.18.2. Securing the Initial MySQL Accounts der offiziellen MySQL Dokumentation empfohlen. Bevor man startet natürlich den MySQL Server starten.

Als allererstes sollte man Passwörter setzen, dazu loggt man sich ein:

mysql -u root

Dann bekommt man so eine shell:

 mysql>

Der Befehl um sich die Benutzer anzugucken ist:

SELECT User,Host,Password FROM mysql.user

Der beliebte SELECT * Befehl ist hier nicht zu empfehlen, da mysql.user wie man schön an

describe mysql.user;

merkt, 37 Spalten hat und somit auf den meisten Bildschirm die Konsole sprengt;-)
Hier sollte jetzt eigentlich nur der root-Benutzer(der alles kann) auftauchen und evtl. einige anonyme Accounts. Die bekommt man mit folgendem Befehl gelöscht:

DELETE FROM mysql.user WHERE User='' AND Password=''

Sollte man einen User hinzugefügt haben kann(Empfohlen! Nie den root User für Anwendungen nehmen), man mit folgendem Befehl die Rechte feststellen.

SHOW GRANTS FOR 'user'@'localhost'

Alternativ gehen die folgenden Befehle:

SELECT User,Select_priv,Insert_priv,Update_priv,Delete_priv FROM mysql.user;

Die entsprechenden Rechte aus DDL, DCL und DML kann man dem oben genannten describe Befehl entnehmen. Der User hatte bei mir standardmässig Rechte um von jedem Host aus zu verbinden. Dies wird durch den Wildcard % vermerkt, der sich bei in der Host Spalte vom User befindet. Möchte man die üblichen Web-Applikationen auf dem Server laufen lassen, z.B. CMS wie WordPress für Blogs oder Drupal für Websites, braucht man keine Verbindung von außerhalb sondern nur von localhost(dort liegen die PHP-Dateien von denen die Abfragen kommen, der User kann auf dem ganzen Internet zugreifen, bzw. das ist Sache des Apaches)

DELETE FROM mysql.user WHERE Host='%';

Jetzt kann es sein, dass der User oder auch root nur für einige Hosts ein Passwort hat. Deswegen sollte man für alle Hosts den folgenden Befehl ausführen:

 SET PASSWORD FOR 'root'@'HOST' = PASSWORD('newpwd');

Wenn man Initialisierungsanleitungen gefolgt ist hat man eventuell eine Datebank namens test. Dies lässt sich ganz einfach feststellen:

SHOW DATABASES;

Mit diesem drop-Befehl löscht man diese unnötige Datenbank:

DROP DATABASE test;

Daneben gibts es noch die eben benutze mysql und die information_schema Datenbank, die man nicht löschen sollte.

Ein weiterer Tweak ist, den Benutzernamen von root zu ändern, um automatisierten brute-force Attacken auf das root Passwort aus dem Weg zu gehen:

UPDATE mysql.user SET User='myNameForRoot' WHERE User='root';

Zum Reload der ganzen Berechtigungen, z.B. nach Anlegen eines neuen Users muss man mit folgendem Befehl die Rechte neu einlesen

FLUSH PRIVILEGES;

Ausserdem gibt es noch die Möglichkeit mysqld in einer chroot Umgebung laufen zu lassen, dazu vielleicht später mehr.
Quellen

  • www.pantz.org/software/mysql/mysqlcommands.html
  • http://dev.mysql.com/doc/refman/5.1/de/delete.html
  • http://dev.mysql.com/doc/refman/4.1/en/adding-users.html
  • http://dev.mysql.com/doc/refman/5.0/en/default-privileges.html