Step by Step Tutorials and Samples that get you where you want.
Postgresql as a backend server for HMG
Enjoy!
Mon
06
Jan
2014
Ich verwende auf dem Server Davical und verbinde meinen Apple Computer damit. Leider geht diese Verbindung hin und wieder auf ganz heintückische Weise kaputt. Erkennbar ist das Problem nur an einem kleinen Warndreieck. Wenn man darauf klickt, sieht man foldende Fehlermeldung:
Ab diesem Zeitpunkt wird nichts mehr synchronisiert. Abhilfe schafft folgender Trick, der vielleicht etwas brutal klingt: Alle Adressen von diesem Computer löschen, damit sie neu geladen werden können.
Das Adressbuch "Kontakte" beenden.
Im Terminal:
open ~/Library/Application\ Support/AddressBook/Sources/
Ein Finder Fenster wird geöffnet
Darin befinden sich ein oder mehrere Ordner mit einem Hash wert.
Einer davon ist der richtige.
Wenn man ihn öffnet, ist die Configuration.plist
die relevante Datei. Ein Blick hinein dürfte Aufschluss über den verwendeten Server geben.
Wenn man den richtigen Ordner gefunden hat, muss man alle Dateien bis auf die Configuration.plist
löschen, den Papierkorb entleeren und Kontakte wieder starten.
Die Adressen des Servers werden geladen und das Warndreieck ist verschwunden.
Weil das Löschen im Finder manchmal erst nach einem Neustart geht, kann man auch von der Konsole aus löschen:
find . -type f -not -name 'Configuration.plist' -delete
Wed
26
Dec
2012
When programming web apps, you have to recognize the same user whe he loads a new page or revisists after weeks. PHP can take care of that with sessions. On the client side, you can store a cookie with a session id or transparently embed the id in the get-request. On the server side, you need a to save the id in a file, the memcache or in a database table.
The pear package HTTP_Session2 is supposed to take care of that. Like many pear packages, it is in beta for years und poorly documented. After fiddling with it for hours, I would like to share this with the world:
My main goal was to have a really long session. Visitors of my shop should find the shopping cart still full after weeks. Many examples focus rather on making a session that times out after minutes or hours, so that logged in users log out automatically.
The examples to the package tell you how to set the session's expiration and idle timouts and to set the timeout of the cookie. But that is not enough, if you want a long session.
After a while, php startet a new sessionfor no apperent reason. HTTP_Session2::isNew() was true, but isExpired() or isIdle() were false() and the cookie was still valid.
Your php.ini has a setting like this.
called session.gc_maxlifetime = 1440
It means that the garbage collector will kill your session after 1440 seconds. No matter, what timeout or idle or cookie timeout-times you set.
Fortunately, you can overrule that setting, even if you do not have access to your php.ini
ini_set('session.gc_maxlifetime', 6000);
So this is my working example:
require_once 'PEAR.php'; require_once('HTTP/Session2.php'); // Öffnet die Session, in der Produkte und Warenkorb zugeordnet sind function startSession() { global $mdb2; $SessionLifetime = 8*7*24*60*60; // 8 Wochen session_set_cookie_params( $SessionLifetime, // Verfällt in 8 Wochen '/', // path '', // domain false, // "secure only" true); // only over http ini_set('session.gc_maxlifetime', $SessionLifetime); HTTP_Session2::setContainer('MDB2', array('dsn' = --> &$mdb2, 'table' => 'sessiondata')); HTTP_Session2::useTransSID(false); HTTP_Session2::useCookies(true); HTTP_Session2::start(); HTTP_Session2::setExpire( time() + $SessionLifetime); HTTP_Session2::setIdle( $SessionLifetime ); if (HTTP_Session2::isExpired()) { echo "Session ist abgelaufen."; HTTP_Session2::destroy(); } if (HTTP_Session2::isIdle()) { // idle echo "You've been idle for too long!"; HTTP_Session2::destroy(); } else { HTTP_Session2::updateIdle(); } if (HTTP_Session2::isNew()) { HTTP_Session2::regenerateId(); } //debug_Session(); } function debug_Session() { if (HTTP_Session2::isNew()) { echo 'new session was created with the current request'; } else { HTTP_Session2::set('visits', HTTP_Session2::get('visits',0)+1 ); } echo("Session name: '" . HTTP_Session2::name() . "'
\n"); echo("Session id: '" . HTTP_Session2::id() . "'
\n"); echo("Is new session: '" . (HTTP_Session2::isNew() ? "yes" : "no") . "'
\n"); echo("Is expired: '" . (HTTP_Session2::isExpired() ? "yes" : "no") . "'
\n"); echo("Is idle: '" . (HTTP_Session2::isIdle() ? "yes" : "no") . "'
\n"); echo ("cartid: '" . HTTP_Session2::get('cartid') . "'
\n"); date_default_timezone_set('UTC'); echo("Session valid thru: '" . date('Y-m-d H:i:s', ( HTTP_Session2::sessionValidThru() )) . "'
\n"); }
Wed
13
Jun
2012
Seit vielen Jahren setzen wir Tobit Software für unsere E-Mails und Faxe ein. Fast genauso lange sind wir damit nicht mehr so zufrieden. Darum haben wir auch schon länger keine Updates gekauft und sind jetzt auf der Version 8 sitzen geblieben, die unter Windows 7 nicht mehr gut läuft. Faxe senden oder Mails ausdrucken funktioniert nicht mehr richtig. Tobit empfiehlt den Betroffenen, ein Upgrade zu erwerben. Weil Faxversand und -empfang im Zeitalter von E-Mails immer unwichtiger wird, brauchen wir eigentlich "nur" einen Mailserver.
Der Tobit Server stellt grundsätzlich IMAP-Funktionen zur Verfügung. Das nennt sich im Tobit-Sprech "Mail Access Server". Im DvISE Administrator kann man dieses System einrichten.
Faxe werden bei der oben dargestellten Einstellung automatisch als GIF-Datei im Anhang einer E-Mail zur Verfügung gestellt. Ordner werden als IMAP-Postfächer übertragen.
Benutzer, die Zugriff per IMAP bekommen sollen, müssen zuerst in einer Alias-Liste eingetragen werden. Der Alias darf nicht dem Benutzernamen entsprechen.
Dann können die Benutzer im "Tobit David InfoCenter" über den Menüpunkt Optionen > Einstellungen einen Zugang enrichten. Wichtig: auf den Button "Übernehmen" klicken, damit alle Unterordner freigegeben werden.
Nun kann man mit einem Standard-Mail-Client, wie dem Thunderbird den IMAP-Zugang einrichten. Thunderbird will behilflich sein und errät den Mail-Host. In unserem Fall Strato. Das muss man natürlich überstimmen und den Tobit Server eingeben. Der Benutzername ist der soeben vergebene Alias und das am Client eingestellte Passwort. Wenn man alles richtig gemacht hat, lädt Thunderbird die Mails und Ordner.
Leider verhält sich der Mail Access Server nur fast wie ein richtiger IMAP-Server. Mails werden manchmal unterschlagen, nicht gelöscht, etc. Manchmal stürzt der Mail Access Server auch komplett ab. Laut Tobit darf der das. Wem das nicht gefällt, der soll sich ein Update auf die aktuelle Version kaufen.
Weil wir hier sowieso einen Ubuntu Server haben, ist ein stabiler und freier IMAP-Server relativ schnell installiert. Hier gehe ich nicht ins Detail, Installationsanleitungen gibt es zu Hauf.
Um die Nachrichten von Tobit auf Dovecot zu übertragen, kann man beide Konten im Thunderbird anlegen und per Drag-And-Drop komplette Ordner von einem Konto ins andere ziehen.
Tobit tendiert dabei aber gern zu kleinen Abstürzen. Schöner wäre ein Skript, mit dem man das machen kann.
Ich habe verschiedene Programme ausprobiert, die komplette IMAP-Konten übertragen sollen. Aber erst mit dem von Armin Diehl geschriebenen, freien Tool IMAPCopy ist es mir gelungen, Postfächer effizient zu übertragen.
Nach der Installation schreibt man die wichtigsten Informationen in die ImapCopy.cfg.
Out of the Box hat es leider nicht funktioniert, weil das von Tobit gesendete Datum nicht so formatiert war, wie dovecot es gern hätte. Um genau mitlesen zu können, kann man in der cfg-Datei die Hash-Zeichen vor den Zeilen
DebugSrc
DebugDst
entfernen, um verbose die Kommunication mitlesen zu können. Dabei fällt folgender Fehler auf:
R:A0006 BAD Invalid internal date.\r\n
Das liegt daran, dass Tobit das Datum in folgendem Format abschickt.
R:* 1 FETCH (INTERNALDATE "30-Dec-05 15:49:39 UT")\r\n
Zuerst hatte ich geglaubt, dass das "UT" der Stein des Anstoßes ist. Eigentlicht heißt es ja "UTC". Weil der Entwickler das schon festgestellt hat, bietet die cfg-Datei sogar die Möglichkeit, den String umschreiben zu lassen, indem man eingibt:
converttimezone "UT" "+0100"
Das bringt leider auch noch nicht die Lösung. Der String wird zwar geändert, aber nicht wirklich repariert.
APPEND tobitimport.INBOX.old (\Seen) "30-Dec-05 15:49:39 U +0100" {1228}\r\n
Also habe ich mir den Quellcode geladen und mal reingeguckt. Da steht in Zeile 1364 der imaptools.pas:
OrgMsgDateTime := copy(OrgMsgDateTime,1,20)+' '+st;
Das Programm geht also davon aus, dass das "U" an Stelle 21 steht. Tatsächlich steht es zwei stellen weiter links, weil das Jahr nur zweistellig übertagen wird. Leider hat der Entwickler auf meine Mail nicht geantwortet. Zum letzten mal hatte ich mit Pascal in Klasse 9 oder 10 zu tun und das ist jetzt gute 20 Jahre her, aber für diese Zeile wird es noch reichen.
Um das Programm zu kompilieren benötige ich FreePascal. Das ist das Pakt fpc
, das man leicht mit aptitude
installieren kann. Das Compilieren scheitert aber wie folgt:
~/imapcopy$ ./Mkdistsrc
./Mkdistsrc: 7: ./Mkdistsrc: zip: not found
Compiling for Linux
Free Pascal Compiler version 2.4.4-3.1 [2012/01/04] for x86_64
Copyright (c) 1993-2010 by Florian Klaempfl
Target OS: Linux for x86-64
Compiling imapcopy.pp
Compiling imapcopymain.pas
Compiling imaptools.pas
Compiling inet.pp
Compiling logfile.pas
imaptools.pas(238,8) Warning: Symbol "family" is deprecated
imaptools.pas(239,8) Warning: Symbol "port" is deprecated
imaptools.pas(241,8) Warning: Symbol "addr" is deprecated
imaptools.pas(242,20) Error: Identifier not found "Socket"
imaptools.pas(243,10) Error: Wrong number of parameters specified for call to "Connect"
imaptools.pas(421,24) Error: Identifier not found "Recv"
imaptools.pas(524,48) Error: Identifier not found "send"
imaptools.pas(1671) Fatal: There were 4 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode (normal if you did not specify a source file to be compiled)
git clone git://anonscm.debian.org/collab-maint/imapcopy.git
Wenn man die Zeile 1364 in imaptools.pas wie folgt ändert:
OrgMsgDateTime := copy(OrgMsgDateTime,1,7)+'20'+copy(OrgMsgDateTime,8,18)+' +0100';
und anschließend mit ./Mkdistsrc kompiliert, erhält man eine binary, die das Datum mit vierstelligem Jahr umschreibt, so dass dovecot es annimmt. Ich habe keine Mails aus dem vorherigen
Jahrhundert im Tobit, also reicht es mir, die 20 einzufügen. (in der ImapCopy.cf muss übrigens ein Eintrag converttimezone "UT" "+0100"
stehen bleiben.)
Dieser Hack ist viel zu häßlich für ein git-push. Vielleicht hat aber jemand anders Interesse daran, diese Zeile zu verbessern.
Tobit stellt auch Ordner wie "Kalender", "System", oder "Adressen" als IMAP zur Verfügung. Man kann in der ImapCopy.cfg zwar die zu kopierenden mit copyfolder festlegen. Aber das geht nicht rekursiv. Und wenn man jeden Unterordner einzeln auflisten muss, bringt das ganze Tool nichts.
Es gibt aber die nicht dokumentierte Einstellung "skipmatch". Der Eintrag
skipmatch System
Sorgt dafür, dass Ordner oder Pfade, in denen mit der Name "System" enthalten ist, nicht kopiert werden.
Jetzt kann man das Skript in aller Ruhe laufen lassen. Wer vorher das Standard-Pakt imapcopy installiert hat, muss aufpassen, dass er seine selbst kompilierte binary-datei startet. Also schön mit
explizitem Pfad ./imapcopy
aufrufen. Ansonsten wird die Version /usr/bin/imapcopy
ausgeführt.
Wer diesen Artikel bis hierhin gelsen hat, wird meinen Schmerz mit Tobit teilen. Ich würde mich sehr freuen, Leidensgenossen zu finden, die ihre Erfahrung mit Umstieg mit mit teilen und freue mich auf Kommentare.
Fri
01
Jun
2012
Als Apple seine komfortable Datensicherungssoftware am Mac namens Time Machine präsentiert hat, wurde die Einfachheit bestaunt und gepriesen. Man stöpselt eine Festplatte ein, auf die fortan Sicherungskopien der Dateien gesichert werden. Stündliche Backups für die letzten 24 Stunden, Tägliche Backups für den letzten Monat und wöchentliche Backups für die vorherigen Monate. Man muss nichts administrieren, und wenn man mal eine alte Version einer versehentlich gelöschten oder überschriebenen Datei suchen will, gibt es ein buntes Interface mit dem man vor einem Sternenhimmel auf Zeitreise geht.
Apple ist es mal wieder gelungen, eine Technologie benutzbar zu machen, die vorher für den normalen Anwender viel zu kompliziert war. Enttäuscht musste Apple allerdings feststellen, dass ein beachtlicher Anteil ihrer Anwender Time Machine ignoriert, weil sie zu faul sind eine Festplatte anzuschließen, aber das sei hier nur am Rande erwähnt.
Die Technologie, die hinter Time Machine steckt, ist aber gar nicht neu. In der Unix-Welt gibt es schon seit langem sogenannte Hardlinks. Das bedeutet, dass eine Datei an mehreren Stellen im Verzeichnisbaum existiert, obwohl sie tatsächlich nur einmal vorhanden ist.
Seit fast 10 Jahren nutze ich ein kleines Tool namens Meep, dass auf einer externen Festplatte viele Versionen meiner Backups in Form von Hardlinks kopiert und anschließend sämliche Änderungen mit dem Befehl rsync auf die neue Version anwendet. So werden Dateien geändert, gelöscht oder hinzugefügt, ohne die alten Verzeichnisse zu tangieren. Weil praktisch nur die Änderungen hinzukommen, kommt man mit relativ wenig Festplattenplatz aus. Meine externe Platte ist ca. doppelt so groß wie meine Serverplatte und enthält schon mehrere hundert vollständige Schnappschüsse. Die Zeitreise hat zwar keine schicke Science-Fiction Klickibunti-Oberfläche wie auf dem Mac, aber es sind normale Dateien. Und die kann man mit Linux-Befehlen wie ls und cp handhaben, oder grafische Dateimanager wie nautilus einsetzen.
Meep wird aber schon seit Jahren nicht mehr weiterentwickelt. Darum habe ich vor einigen Wochen auf das ausgereiftere und vollständigere rsnapshot in Betrieb genommen.
Rsnapshot bewahrt stündliche, tägliche, wöchentliche und monatliche backups auf. Man kann beliebige Intervalle festlegen und die Anleitung erklärt es ziemlich detailliert.
In /etc/rsnapshot.conf definiert man Backupintervalle mit Namen und legt fest, wie viele Versionen vorgehalten werden sollen. In der Standardconfiguration ist das kleinste Interval hourly und es sollen 24 Stück vorgehalten werden.
Der Befehl "rsnapshot hourly" soll stündlich (am einfachsten per crontab) ausgeführt werden. "hourly.0" ist immer das jüngste Backup. Anschließend wird es in hourly.1, umbenannt während hourly.1 zu hourly.2 wird und so weiter. Das 25. wird dann gelöscht. Achtung: Es wird nicht automatisch zu einem daily-Backup gemacht. Das macht der Befehlt "rsnapshot daily". Er macht auch "hourly.24" dann "daily.0" Dafür sollte man auch einen crontab Eintrag machen.
Beim einfachen Lesen der Anleitung ist mir nicht klar geworden, dass "rsnapshot daily", "weekly" und "monthly" gar keine Backups macht, sondern nur die vorhandenen Backups rotiert. Weil ich
nämlich anfangs nur tägliche Sicherungen anlegen wollte, klappte das gar nicht. Als ich den Befehl rsnapshot daily
gegeben habe, konnte ich im logfile
/var/log/rsnapshot.log
lesen:
/mnt/backuphd/hourly.24 not present (yet), nothing to copy
Erst nachdem ich die Zeile
retain hourly 24
in /etc/rsnapshot.conf
gelöscht habe und damit daily zum kleinsten Interval wurde, funktionierte der Befehl "rsnapshot daily" wie gewünscht.
Es macht keinen Sinn, "daily 100" einzustellen, um 100 tägliche Backups aufzubewahren, wenn man als nächsten Intervall "weekly" gewählt hat. Würde man "rsnapshot weekly" nach einer Woche aufrufen, würde es versuchen, den 100. daily-snapshot zu einem weekly-snapshot zu machen. Weil es nach einer Woche aber erst 7 tägliche gibt, scheitert das kommando ebenfalls mit der Fehlermeldung "... not present (yet), nothing to copy". In der /etc/rsnapshot.conf müssen also Intervalle stehen, die sich mit mit den crontab-Einträgen decken.
Meine aktuelle Konfiguration sieht vor, dass Montags bis Samstags während der normalen Geschäftszeiten im Abstand von zwei Stunden ein "hourly" Backup gemacht wird. Tägliche Backups wernde 10 Minuten vor Mitternacht auf Basis des letzten stündlichen Backups angelegt. Samstags werden die wöchentlichen und jeweils am ersten des Monats wird das monatliche Backup angelegt. (Weil das Rotieren recht schnell geht, reicht mir ein Abstand von 5 Minuten, so dass selbst wenn der erste des Monats man auf einen Samstag fällt, alle drei Backups sauber durchlaufen.) Das sieht in der crontab so aus:
10 8-20/2 * * 1-6 root /usr/bin/rsnapshot hourly
50 23 * * 1-6 root /usr/bin/rsnapshot daily
45 23 * * 6 root /usr/bin/rsnapshot weekly
40 23 1 * * root /usr/bin/rsnapshot monthly
Entsprechend muss die rsnapshot.conf folgendermaßen aussehen:
retain hourly 7
retain daily 7
retain weekly 4
retain monthly 12
Das letzte monthly dürfte natürlich auch größer sein, weil wir ja keine "yearly" Backups aufrufen. Das werde ich zu gegebener Zeit noch einrichten.
die rsnapshot.conf Datei ist leider total pingelig, was Whitespace angeht. Man muss spalten mit Tabulatoren trennen. Wer also zwischen interval und hourly nur Leerzeichen, aber keinen Tab gesetzt hat, bekommt eine Fehlermeldung.
Auch wenn die Konfiguration etwas zeitintensiver als Time Machine ist, kann ich den Einsatz von rsnapshot sehr empfehlen. Das Anlegen der Sicherungen erfolgt mit bewährten Befehlen wie cp, rm, mv
und rsync und ist darum sehr stabil. Das Ergebnis ist eine USB-Festplatte, die an beliebigen Linux-Rechnern gemountet werden kann und deren Inhalt ohne Einsatz von Spezialsoftware ausgelesen
werden kann. Mit einem regelmäßigen Blick in /var/log/rsnapshot.log
kann überprüft werden, ob das Skript seine Dienste verrichtet.
Wed
20
Apr
2011
E-Mails mit PDF-Anhängen lösen das gute alte Fax ab. Viele Programme erzeugen PDF-Dateien, aber viele Word- und Excel-Vorlagen sind zum Ausdrucken auf Briefpapier gedacht.
Bisher haben wir tatsächlich den Brief auf Papier ausgedruckt, eingescannt und dann per E-Mail verschickt. Das ist nicht nur umständlich, sondern erzeugt auch große, qualitativ minderwertige PDF-Dateien, die keinen echten Text enthalten und darum nicht gescheit durchsuchbar sind.
Dabei ist die Lösung doch so einfach, wenn man einen Linux- oder BSD-Server hat. Der Fileserver samba stellt hervorragende Druckdienste zur Verfügung.
Unter anderem kann man einen virtuellen PostScript-Drucker zur Verfügung stellen, auf den die Windows-Computer drucken können. So erhält man auf dem Server eine gültige PostScript-Datei, die mit dem Tool ps2pdf einfach in ein PDF umgewandelt werden kann.
Das Tool pdftk kann diese PDF-Datei mit einer Briefbogen-PDF-Datei hinterlegen, so dass mit einem Druck-Befehl eine perfekte Geschäfts-E-Mail erhält, die der Server im einfachsten Fall auf dem Server speichert, wo der Benutzer sie abholen kann.
Voraussetzung:
Ein laufender Samba-Server sowie die Pakete ghostscript (enthält ps2pdf), pdftk und CUPS.
Inspiriert durch die kleine HowTo habe ich das folgende Skript mit dem Namen /usr/sbin/pdfprint.sh geschrieben:
#!/bin/bash # /usr/sbin/pdfprint.sh # #Konvertiert die gedruckte PostScript-Datei in pdf #und unterlegt einen Briefbogen # #$1 = spool file #$2 = uid (Username) #$3 = Firma OUTPUTFILE=pdf-$2-`date +%Y%m%d%H%M%S`.pdf OUTPUTPATH=/srv/files/ # Hier liegen die Briefbogendateien LOGFILE=pdfcreate.log BRIEFBOGENPATH=/srv/files/briefboegen # Der Dateiname heißt 'Firma'_briefbogen.pdf BRIEFBOGENSUFFIX=_briefbogen.pdf # Folglich sieht so der Dateiname des leeren Briefbogens aus BRIEFBOGENFILE=$BRIEFBOGENPATH/$3$BRIEFBOGENSUFFIX # Gibt es den Briefbogen? if [ -e $BRIEFBOGENFILE ]; then echo Konvertierte $1 mit $BRIEFBOGENFILE in $OUTPUTPATH/$OUTPUTFILE >> $OUTPUTPATH/$LOGFILE /usr/bin/ps2pdf $1 - | /usr/bin/pdftk - background $BRIEFBOGENFILE output $OUTPUTPATH/$OUTPUTFILE >> $OUTPUTPATH/$LOGFILE else echo Briefbogendatei $BRIEFBOGENFILE nicht gefunden >> $OUTPUTPATH/$LOGFILE echo Konvertierte $1 in $OUTPUTPATH/$OUTPUTFILE >> $OUTPUTPATH/$LOGFILE /usr/bin/ps2pdf $1 $OUTPUTPATH/$OUTPUTFILE fi echo PDF erstellt. Spool-Datei löschen $1 >> $OUTPUTPATH/$LOGFILE rm $1 >> $OUTPUTPATH/$LOGFILE echo Fertig. >> $OUTPUTPATH/$LOGFILE echo >> $OUTPUTPATH/$LOGFILE
Die Variablen BRIEFBOGENPATH, OUTPUTPATH sollte man natürlich an seine Festplattenstruktur anpassen.
Das Skript wird aufgerufen mit dem Namen der Spool-Datei (PostScript), dem Benutzernamen (der Bestandteil) des PDF-Dateinamens wird und dem Firmennamen, der zur Auswahl des korrekten Briefpapiers benötigt wird.
Wenn kein gültiger Firmenname übergeben wird (wenn keine Briefbogendatei gefunden wird), wird eine PDF-Datei ohne Briefpapier erzeugt.
Die wichtigste Zeile ist:
ps2pdf $1 - | pdftk - background $BRIEFBOGENFILE output $OUTPUTFILE
Man könnte sie auch direkt in die smb.conf schreiben, aber dieses Skript finde ich etwas ordentlicher. Tipp: Wenn man statt background den Befehl stamp verwendet, wird die Briefbogen-Datei auf den Text gelegt. Das macht natürlich nur dann sinn, wenn diese auch transparente Bereiche hat.
Wichtig ist, dass das Skript mit
chmod u+x pdfprint.sh
ausführbar gemacht wird. Sonst läuft es nicht.
Jetzt muss noch die smb.conf um die Drucker erweitert werden:
[global] ... printing = sysv load printers = yes ... [printers] comment = All Printers path = /var/spool/samba public = yes guest ok = yes writeable = yes printable = yes browseable = yes [pdf-acme] comment = PDF mit Acme-Briefbogen auf K: erzeugen path = /var/tmp printable = Yes print command = /usr/sbin/pdfprint.sh %s %U acme lpq command = /bin/true create mask = 0600 use client driver = yes
Damit das ganze läuft, muss man den Briefbogen der Firma acme dort hinterlegen, wo pdfprint ihn erwartet:
/srv/files/briefboegen/acme_briefbogen.pdf
Wichtig ist, dass der Server die Leserechte hat.
Das Skript ist modular aufgebaut. Man kann also in der smb.conf noch weitere PDF-Drucker anlegen, wenn man mehrere Firmen im Netzwerk hat.
Nachdem der Server mit dem Befehl
killall -HUP smbd
gezwungen wurde, die smb.conf neu einzulesen, sieht man auf den Windows-Clients schon den pdf-acme-Drucker.
Wenn man ihn doppelklickt, wird man von Windows nach dem Druckertreiber gefragt. Entscheident ist, dass man jetzt einen PostScript Drucker auswählt. Ich habe gute Erfahrungen mit "HP LaserJet 5P/5MP" gemacht. Unter Windows 7 mit 64 Bit verwende ich den "HP Color LaserJet 2800 Series PS"
Fertig! Wenn man jetzt auf diesen neuen Drucker druckt, entsteht fast augenblicklich die PDF-Datei im dafür vorgesehenen Ordner.
Für die Benutzer ist das also kinderleicht. Sie können mit jedem Windows-Programm auf diesen Drucker drucken. Man sollte ihnen natürlich verraten, wo sich die fertige PDF-Datei befindet.
Fri
12
Nov
2010
Adventskalender are a popular German countdown to christmas. Every morning, you open a little door with a gift or chocolate behind it.
Our local Lions Club, sells such a calendar with prizes behind the little doors. Each one has a unique number. The numbers get chosen randomly every day. They are published in the local newspaper and on our website.
It is basically a lottery. Lots of people look up the numbers.
This year, I wanted to also publish them on twitter, so calendar-owners simply follow @lionswerne and get the numbers every morning. Manually tweeting every morning would not be fun.
Here is how I wrote a little script, so my Linux-Computer takes care of this automatically. If you are doing something similar, you can follow my instructions. Let me know, if it was of any help.
First, we need a commandline tool to push twitter updates without all that gui-stuff. Unfortunately, the internet is full of instructions, that do not work any more. Twitter has recently changed its API.
But twidge ist a great tool, that works in its most recent version (1.0.6). Ubuntu still provides 1.0.2 which does not work, any more.
Get it here:
After installing it (I moved it to /usr/bin/twidge and made it executable with chmod u+x twidge), you simply run
twidge setup
It will give you an url and ask for a numer. Open the url in your browser. If your browser is already logged into twitter, it will give you a number. If not, it will first ask you for username and password. Type the number into your terminal and you are all set.
Test it by calling
twidge lsrecent
You should see your most recent tweets.
To learn more, type twidge lscommands
The winning numbers are already in a mysql-database on our webserver, where a php-page takes care of publishing them on our website.
I am a PostgreSQL-user, but my webserver only supports mysql.
I got the dump from the the webserver, installed mysql-server on my local Ubuntu-machine and used the sql-dump to easily create and poulate the table. The column names are not really important. There is a date, a numer and two colums about the prize (what is it? and who sponsored it)
The colums could be different. But we need a column with the date on which to publish the record.
Now we need a command that first gets the numbers and the prize of the current day from the MySQL-Table, construct a text-message and call twidge to push it into Twitter.
I spare you more than half an hour of tinkering and present you with the working one-liner.
echo "SELECT concat('twidge update \"TEST. Kein echter Gewinn:', losnummer, ' ', gewinn, ' von ', spender, '\"') FROM weihnachtskalender WHERE datum = DATE(NOW());" | mysql -u root --password=iamnottellingyou --skip-column-names mysql | iconv -f utf8 -t latin9 -c -- | bash
Yes, this is all one line. The SQL-SELECT-statement will result in a twidge command with the correct text. It is piped into the the mysql command-line client which pipes the command into bash.
In my example, I had to insert an iconv command, because my Ubuntu-machine uses UTF8 natively. Twitter seems to expect latin9 as its encoding. The -c means that any character that can not be converted into latin9 will simply be removed. It prevents the command from throwing an error. If your Umlauts show up correctly, or you have a language that can do without such fancy letters, you do not need the iconv-command.
As alwasy, I have a feeling that there is a more elegant way to do it. Let me know in the comments, if you have a suggestion. But right now, this works and that is what counts, isn't it?
Now, all we have to do is call the above command daily.
The unix-tool cron can do that for us.
sudo joe /etc/crontab (or use an editor of your choice. I just like joe. It is so much like good old wordstar...)
and add the line
10 5 * 12 * jan echo "SELECT concat('twidge update \"Nr ', losnummer, ': ', gewinn, ' von ', spender, '\"') FROM weihnachtskalender WHERE datum = DATE(NOW());" | mysql -u root --password=iamstillnottellingyou --skip-column-names mysql | iconv -f utf8 -t latin9 -c -- | bash
It will call the script every morning at 10 Minutes after 5 in December.
Replace jan with your username and be sure to use your mysql-password.
Now I am waiting for December to come. Then I will see if it really works.
So this Howto might get updated, if something does not work as advertised.