Freitag, 16. Juli 2010

bash Autovervollständigung

Für ein bestimmtes Konto exportiere ich die Umsatzdaten aus dem Web-Frontend meiner Bank. Diese (merkwürdige) csv-Datei wandle ich dann in qif um, da GnuCash kein csv importiert (den verwendeten Konverter findet man im Archiv der GnuCash-De liste).
Da ich die cvs-Dateien und die qif-Dateien nebeneinander archiviere habe ich manchmal beim konvertieren das Problem, das ich nicht mehr so genau weiß, was es nun zu konvertieren gilt (bzw. welche csv-Dateien noch nicht konvertiert sind)....

Abhilfe habe ich mir von der programmierbaren Eingabe-Vervollständigung der Bash versprochen. Meine Idee: Für die Eingabe-Vervollständigung sollten nur csv-Dateien in Betracht kommen und hier auch nur diese, für die noch keine Datei mit Endung qif besteht. Gedacht, getippt:

_csv2qif_possible_csvFiles()
{
 local csvs optfiles
 optfiles=""
 csvs=$(find . -maxdepth 1 -iname "*.csv" | sed "s/\.\///g")
 for file in ${csvs}; do
  if [ ! -f ${file/\.csv/.qif} ]; then
   optfiles="${optfiles} ${file}"
  fi
 done
 echo $optfiles
}

_csv2qif()
{
 local cur opts
 cur="${COMP_WORDS[COMP_CWORD]}"
 opts=$(_csv2qif_possible_csvFiles)

 COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
 return 0
}

complete -F _csv2qif csv2qif.py

Diese Datei beim Starten der Bash mit einlesen oder bei gentoo einfach in /etc/.bash_completion.d/ oder ${HOME}/.bash_completion.d/ kopieren und schon klappt's auch mit der Eingabe-Vervollständigung.
Geholfen hat mir übrigens die Debian-Einführung zu bash completion.

Screenshots finde ich bei Kommandozeilen-Tools immer nicht so toll, hier ist Trotzdem einer:

Als mögliche Verbesserung bleibt noch die Suche der csv-Dateien nicht nur auf das aktuelle Verzeichnis zu beschränken, sondern einen eingegebenen pfad (z.B.: ../csv/2010/Q3/) mit zu beachten, aber das hebe ich mir wohl mal für einen „Urlaub“ auf...

Edit: Eine verbesserte Version findet sich in: bash Autovervollstandigung die Zweite.

Dienstag, 6. Juli 2010

Webspace-Backup...

Mir ist heute aufgefallen, dass die Sicherung meines webspace nicht so war wie ich es mir gewünscht hätte...

Das Problem war das löschen der nicht mehr benötigten Dateien. (Dinge, die nicht mehr auf dem Server sind brauche ich auch nicht in der Sicherung...)
Bisher hatte ich "wget --mirror ..." auf einem cron-job, nur leider schaufelt wget immer nur Daten dazu, löscht aber keine alten Daten.
 
Nach etwas Suchen habe ich das Backup nun auf lftp umgestellt. Dazu habe ich auch gleich eine Mail-Benachrichtigung im Fehlerfall realisiert.

Folgendes Skript läuft nun täglich:

#!/bin/bash
pushd $(dirname $0) > /dev/null

lftp -c "set ftp:list-options -a;
open -u user,pass ftp://server.dom.de;
lcd backup-dir;
mirror \
       --use-cache \
       --delete \
       --allow-chown \
       --allow-suid \
       --no-umask \
       --parallel=2 \
       --exclude .listing \
       --exclude .configs \
       --exclude atd \
       --log=../mirror.log" \
 2> error.log \
 > /dev/null

if [ "$?" -ne 0 ]; then
   cat > last.mail.eml <<EOF
Subject: BACKUP nils-andresen.de FEHLGESCHLAGEN !!!
X-Priority: 1
Importance: High

 ---- ERROR-LOG: ----
EOF
   cat error.log >> last.mail.eml
   cat >> last.mail.eml <<EOF

 ---- MIROR-LOG: ----
EOF
   cat mirror.log >> last.mail.eml
   /usr/sbin/sendmail -i nils < last.mail.eml
fi

popd > /dev/null

Die Mail wird nur „intern“ (an den Benutzer nils) versendet, für mich ist das aber ausreichend...

Donnerstag, 24. Juni 2010

Auflistung aller Tabellen ohne PrimaryKey

Für MS-Sql-Server:
select table_name 
from INFORMATION_SCHEMA.TABLES 
where 
 TABLE_NAME not in 
  (
   select distinct table_name 
   from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
   where CONSTRAINT_TYPE = 'PRIMARY KEY '
  )
 and TABLE_TYPE = 'BASE TABLE'

Freitag, 30. April 2010

Kommentare eines Word-Dokumentes als Liste erstellen

Mein aktuelles Problem: In einem recht großen Word-Dokument möchte ich alle Kommentarte überarbeiten.
Die aufkommende Fragestellung: Kann ich alle Kommentare eines Word-Dokumentes als Liste erstellen?

Eine kurze suche brachte mich zu http://word.tips.net/Pages/T001046_Printing_Comments.html. Das Ergebnis ist schon ganz brauchbar:
Sub KommentarlisteInNeuemDokument()
'
' KommentarlisteInNeuemDokument Makro
' Erstellt eine Liste aller Kommentare des aktuellen Dokumentes in ein neues Dokument.
'
    Dim oThisDoc As Document
    Dim oThatDoc As Document
    Dim c As Comment
    Dim sTemp As String
    Dim iPage As Integer

    Set oThisDoc = ActiveDocument
    Set oThatDoc = Documents.Add

    Application.ScreenUpdating = False
    For Each c In oThisDoc.Comments
        'Find page number of comment
        oThisDoc.Select
        c.Reference.Select
        iPage = Selection.Information(wdActiveEndAdjustedPageNumber)

        'Put info in new document
        oThatDoc.Select
        Selection.EndKey Unit:=wdStory
        sTemp = "Seite: " &amp; iPage
        Selection.TypeText Text:=sTemp
        Selection.TypeParagraph
        sTemp = "[" &amp; c.Initial &amp; c.Index &amp; "] " &amp; c.Range
        Selection.TypeText Text:=sTemp
        Selection.TypeParagraph
    Next
    Application.ScreenUpdating = True
End Sub

Vielleicht finde ich demnächst die Zeit das ganze etwas schöner zu gestalten.

Mittwoch, 31. März 2010

Nachträglich OnDelete: Cascade im EF-Modell ?

Ich hatte gerade auf einer bestehenden DB-Relation die "on update: Cascade" gesetzt, und daraufhin mein EF-Modell ge-updated.
Ein Blick in das edmx zeigte auch den erwarteten Eintrag im SSDL:

<Association Name="FK_Foo_Bar">
  <End Role="Bar" Type="FooBarModel.Store.Bar" Multiplicity="1">
 <OnDelete Action="Cascade" />
  </End>
  <End Role="Foo" Type="FooBarModel.Store.Foo" Multiplicity="*" />
  <ReferentialConstraint>
 <Principal Role="Bar">
   <PropertyRef Name="ID" />
 </Principal>
 <Dependent Role="Foo">
   <PropertyRef Name="BarId" />
 </Dependent>
  </ReferentialConstraint>
</Association>

Leider stellte sich die Gewünschte Funktionalität nicht ein: "A relationship is being added or deleted from an AssociationSet 'FK_foo_bar'. With cardinality constraints, a corresponding 'bar' must also be added or deleted."
Nach reichlich Ärger und ein wenig googeln war der Fehler schnell gefunden: das CSDL wird nicht automatisch mit angepasst.

Nachdem also im CSDL-Teil der edmx folgendes manuell ergänzt wurde:

<Association Name="FK_Foo_Bar">
  <End Role="Bar" Type="FooBarModel.Bar" Multiplicity="1">
 <OnDelete Action="Cascade" />
  </End>
  <End Role="Foo" Type="FooBarModel.Foo" Multiplicity="*" />
</Association>

Funktioniert auch das Löschen mit onDelete:cscade
Bleibt nur zu hoffen, dass sich die update-Funktionen des Designers im EF4 deutlich verbessert...

Montag, 22. März 2010

Geekfaktor…

Bei Julie Lerman habe ich gerade gelesen, dass man seinen Geekfaktor messen lassen kann – das musste ich natürlich ausprobieren:

Donnerstag, 11. März 2010

Neo-Layout und Geschwindigkeit zum Zweiten.

Über das neo-Layout hatte ich ja bereits berichtet.
Ich bin mit meiner Geschwindigkeit immer noch nicht viel weiter...
26 Wörter
Aber dafür mit meiner Tastatur:

Problematisch ist an dem Ganzen, dass ich beim Arbeiten nicht "einfach" auf neo umstellen kann. (Man stelle sich einen Mitarbeiter vor, der nichts ahnend an meinen Rechner geht und etwas tippen will...)
Somit arbeite ich die meiste Zeit des Tages mit QWERTZ, bei längeren Texten schalte ich "heimlich" auf neo um (NeoVars sei Dank)...