Sidebarplugin

Angelegt von Andreas Steinel Sun, 17 Dec 2006 16:29:00 GMT

Gerade habe ich mir auch dem AIM-Precence-Statusplugin und einem Jabber-Status-Plugin und etwas googeln ein Plugin geschrieben, mit dem man alle drei Statussymbole anzeigen kann. Ich habe extra auf Abwesenheitsnachtichten verzichtet.

Das Plugin kann hier heruntergeladen werden.

Posted in , ,  | 1 comment

NL-Mean Filterung

Angelegt von Andreas Steinel Thu, 16 Nov 2006 00:16:00 GMT

Gerade eben ist mir aufgefallen, was an meiner Implementation des NL-Mean-Filters nicht richtig war. Es lag viel mehr an den Paramtern als an der Implementation.

Das Ausgangsbild, welches ich Anfang des Jahres in Brüssel geschossen habe, diente als Ausgangsbild. In dieses Bild wurde Gauss-Rauschen mit Standardabweichung 20 hinzugefügt:

Nach der Entrauschung mit einem Testfenster der Größe 7 und eines Vergleichfensters von 3 führte der Algorithmus zu folgendem Ergebnis:

Das kann sich doch sehr sehen lassen :-p

Posted in ,  | keine Kommentare

Überweisungsformulargenerator endlich online

Angelegt von Andreas Steinel Fri, 20 Oct 2006 00:19:00 GMT

So, nun schreib ich es auch hier nieder: Mein Überweisungsformulargenerator ist schon seit einiger Zeit online. Ähnlich wie hier beschrieben ist er nun auch online zu finden bei Sourceforge.

Momentan gab es schon 65 Downloads :-p

Posted in ,  | Tags  | keine Kommentare

Neues Webprojekt online

Angelegt von Andreas Steinel Fri, 13 Oct 2006 10:58:00 GMT

Nach einigen Monaten der Entwicklung ist nun endlich die neue Version des Expertlocators fertig, deren Betreung ich im Auftrag von Herrn Wahlster übernehmen sollte.

Die Weboberfläche, die für jedermann zugänglich ist, sieht wie folgt aus:

Die Administrationsoberfläche, welche für die Eintragung eines Experten zuständig ist, sieht so aus:

Posted in ,  | Tags  | keine Kommentare

Wiederherstellung von verlorenen Bildern

Angelegt von Andreas Steinel Fri, 29 Sep 2006 16:50:00 GMT

Da macht man schön Bilder … ganze CF-Karten voll und dann sowas. Eingelegt … nix. Er kann es nicht mounten und die CF-Karte war voller Bilder! Dateisystem zerstört, Hilfe!

FreeBSD kann es nicht mounten und Windows kann erst garnix damit anfangen. Klasse, dachte ich mir … was nun?

Als erstes hab ich mir die CF-Karte als Image mittels cp auf den Rechner gezogen. Danach habe ich die Wiederstellungsprozedur gestartet:

Als erstes habe ich mir angeschaut, wie ein Bild eigentlich binär aussieht und konnte die ersten 8 Bytes, die bis auch eine Stelle immer identisch sind, feststellen. Mit diesem Wissen kann man nun grepen. Dabei hatte ich zuerst im Sinn, ein C-Programm zu schreiben, welches die Daten binär identifizieren kann. Schlussendlich habe ich aber nur hexdump und grep zum Finden der Offsets verwendet.

Dabei habe ichzuerst eine Liste der Offsets für jedes Bild erstellen lassen:

hexdump -C ~/CF-Sicherung-mit-Bildern.iso| grep Exif >| grep-result

Eine solche Zeile mit dem Offset sieht wie folgt aus:

00049000 ff d8 ff e1 31 fe 45 78 69 66 00 00 49 49 2a 00 |....1.Exif..II*.|

Die erste Zahl ist das Offset (hexadezimal), danach kommen 16 Bytes an Daten in Bytes und nach der Pipe kommt der Teil als Ascii-Zeichen.

Mit diesen Informationen ist es nun möglich die Bilder zu exrtahieren. Einziger Nachteil bei dieser Rekonstruktion stellt die Dateisystemfragmentation dar. Sobald ein Bild auf dem Dateisystem fragmentiert wurde ist es unmöglich dieses mit dieser Methode wiederherzustellen. Aber es ist zumindest ein Ansatz.

Nun habe ich mir noch ein Ruby-Skript geschrieben, mit dem man die Daten anhand des Offsets wiederherstellen kann. Dabei werden einfach eine gewisse Menge von Bytes (hier 4.6 MB) nach dem gefundenen Offset kopiert. Dies entspricht dem Herauskopieren des vermeindlichen Bildes. Am einfachsten geht dies mit dd und der skip-Option. Aus Performancegründen ist es ratsam, immer 16-Byte-Blöcke zu benutzen, aber nicht notwendig. folgendes Skript wird verwendet, um die Daten zu extrahieren:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env ruby

raw = File.open("grep-result").readlines
raw.each_index do |i|
    size = raw[i].split(" ")[0].to_s.to_i(16) / 16
    puts size
    Kernel.system "dd if=/home/andreas/CF-Sicherung-mit-Bildern.iso" +
        " of=#{i.to_s.rjust(3,"0")}.jpg count=250000 bs=16 skip=#{size}"
end

Viele Bilder wurden komplett wiederhergestellt, leider nicht alle. Dort gab es fragmentierungsprobleme und die Bilder sind teilweise zerstört. Dies ist schade, aber ich muss damit leben. Wenigstens konnte ich mehr als 70% der Bilder retten.

Zu guter letzt habe ich alle Bilder durch convert gejagt, um den Datenmüll, der sich am Ende jedes Bildes befindet, loszuwerden. Dieser Datenmüll ist durch das Kopieren entstanden.

Resultat:

Es wurden 102 Bilder extrahiert, eines ist komplett kaputt, 9 teilweise kaputt und 92 Bilder sind restauriert. Das sind knapp über 90%! Juhuu

Posted in , ,  | 1 comment

Erzeugung eines RSS-Feeds der zu aktualisierenden Ports

Angelegt von Andreas Steinel Tue, 26 Sep 2006 00:47:00 GMT

Folgender Quellcode ermöglicht die Erzeugung eines RSS-Feeds (Atom-2) für die Ausgabe von pkg_version.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env ruby

xmlfile      = "out.xml"
server       = "SERVER"
server_fqdn  = "lnxbil.dyndns.org"


class FeedCreator
    def initialize(file) #{{{
        @xmlfile = file
        @title      = ""
        @itemtitle  = ""
        @itemdesc   = ""
    end #}}}

    def save(title,itemtitle,itemdesc) #{{{
        @title = title
        @itemtitle = itemtitle
        @itemdesc = itemdesc
        create_xml
    end #}}}

    private
    def create_xml #{{{
        a = File.open(@xmlfile,"w+")
        a.puts <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>#{@title}</title>
    <language>en-us</language>
    <description>Status Reporter</description>
    <item>
      <title>#{@itemtitle}</title>
      <description>#{@itemdesc}</description>
    </item>
  </channel>
</rss>
EOF

        a.flush
        a.close
    end #}}}
end

a = FeedCreator.new(xmlfile)
#db = IO.popen("pkg_version -l \\< -v").readlines
db = File.open("/usr/ports/2update").readlines
dbe = ["<table>"]
db.each do |i| 
    b = i.split("<")
    dbe << "<tr>"
    dbe << "<td>" + b[0].to_s + "</td>"
    dbe << "<td>" + b[1].to_s + "</td>"
    dbe << "</tr>"
end
dbe << "</table>"

a.save("FreeBSD Package Status (SERVER)", 
    db.size.to_s + " packages must be upgraded",
    dbe.join("\n").gsub("<","&lt;").gsub(">","&gt;"));

Posted in , ,  | keine Kommentare

Debian-Spiegel unter FreeBSD

Angelegt von Andreas Steinel Wed, 13 Sep 2006 12:43:00 GMT

Um einen Debian-Mirror unter FreeBSD aufzusetzen benötigt man zuerst das debmirror-Perl-Skript, welches man hier finden kann.

Den Tar-Ball entpacken und die ausführbare Datei debmirror in den Ordner verschieben, in dem nachher der Spiegel liegen soll. Am besten benennt man es noch um in debmirror.pl.

Des Weiteren werden noch folgende Perl-Bibliotheken benötigt:
  • p5-LockFile-Simple
  • p5-Compress-Zlib
  • p5-Digest-SHA1
  • p5-libwww

Um nun Debian vom FTP-Spiegel des MPI’s in Saarbrücken zu spiegeln genügt folgender Aufruf:

./debmirror.pl debian/debian --nosource \
    --passive --method=ftp --ignore-release-gpg \
    --root=/pub/mirrors/linux/distributions/debian/debian \
    --dist=sarge --arch=i386 --getcontents \
    --host=ftp.mpi-sb.mpg.de
Ein Spiegel von mplayer würde so aussehen:
 ./debmirror.pl debian/mplayer --nosource \
    --passive --method=ftp --ignore-release-gpg \
    --root=/pub/mirrors/linux/mirror/www.debian-multimedia.org/ \
    --dist=sarge --arch=i386 \
    --host=ftp.mpi-sb.mpg.de
Ein Security-Spiegel evt. so:
./debmirror.pl debian/security --nosource \
    --passive --method=ftp --ignore-release-gpg \
    --root=/pub/mirrors/linux/mirror/security.debian.org/debian-security/ \
    --dist=sarge/updates --arch=i386  \
    --host=ftp.mpi-sb.mpg.de

Posted in , ,  | keine Kommentare

Thumbnails erzeugen aus PDF's

Angelegt von Andreas Steinel Fri, 08 Sep 2006 14:30:00 GMT

Mittels dieses Codes ist es möglich aus einer PDF-Datei die Titelseite als PNG zu exportieren. Besonderheit ist hierbei das Laden der ersten Seite, ohne alle Seiten zu laden. Somit kann man schnell, effizient und speicherschonend arbeiten.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env ruby
# This code extracts the first page
# of a PDF file and write two png-files,
# a small and a big thumbnail.

require 'RMagick'
include Magick

def pngize(str,a=nil)
    return str.split(".")[0..-2].join(".") +
         a.to_s + ".png"
end


def create_thumbnail(image)

   # Workaround for self.number_scenes=1
    img = Image.read(image+"[0]")
    puts img.size

    geom = "200x300"
    img.change_geometry!(geom) { |cols, rows|
            img.thumbnail! cols, rows }
    img.write(pngize(image))

    geom = "50x75"
    img.change_geometry!(geom) { |cols, rows|
            img.thumbnail! cols, rows }
    img.write(pngize(image,"_mini"))

end

create_thumbnail(ARGV[0])

Posted in , ,  | keine Kommentare

FreeBSD und QT-Programme

Angelegt von Andreas Steinel Fri, 01 Sep 2006 10:17:00 GMT

Um unter FreeBSD QT-Programme zu kompilieren, sind folgende Eintragungen in die .profile oder sonstige Datei, die bei jedem Shell-Aufruf includiert wird.

export QMAKESPEC=/usr/local/share/qt/mkspecs/freebsd-g++/

export QTDIR=/usr/X11R6

Posted in , ,  | keine Kommentare

Datenbankbackup via phpMyAdmin

Angelegt von Andreas Steinel Mon, 28 Aug 2006 02:32:00 GMT

Da ich leider mit der rückständigen MySQL-Datenbank auf einigen Rechnern leben muß und ich dort keine Shell habe, wollte ich ergründen, ob ein Datenbank-Dump per Skript über SSL-gesichertes phpMyAdmin möglich ist.

Ja, ich habe mittels http-access2 ein kleines Skript geschrieben, mit dessen Hilfe ich die Datenbank mittels Ruby dumpen kann.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env ruby
# Script for dumping MySQL-Database with phpmyadmin.
# Automatic-Dumps are now possible.

require 'http-access2'

# CONFIG
# - - - - - - - - - - - - - - - - - - - - - - - -
username  = "username"
password  = "password"
database  = "datenbank"
target    = "https://myhost/path/to/phpmysql/"
# - - - - - - - - - - - - - - - - - - - - - - - -
# Don't edit below this line
# - - - - - - - - - - - - - - - - - - - - - - - -

login = { #{{{
    "pma_username"=>username,
    "pma_password"=>password
} #}}}

dump_data = { #{{{
    "export_type"=>"database",
    "db"=>database,
    "what"=>"sql",
    "add_character"=>"\\n",
    "showcolumns"=>"yes",
    "use_backquotes"=>"1",
    "max_query_size"=>"50000",
    "sql_type"=>"insert",
    "drop"=>"1",
    "sql_structure"=>"structure",
    "asfile"=>"sendit",
    "escaped"=>"\\",
    "hexforbinary"=>"yes",
    "extended_ins"=>"yes",
    "sql_data"=>"data",
    "sql_auto_increment"=>"1",
#    "compression"=>"bzip",
    "if_not_exists"=>"1"
} #}}}

clnt = HTTPAccess2::Client.new()
clnt.set_cookie_store("cookie.dat")
clnt.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE

# first login and cookie-setup
a = clnt.post(target, login)

# save token for export. Without this token, nothing works!
a.header['location'].to_s =~ /token=([0-9a-f]+)/
dump_data["token"] = $1.to_s

# Dumping Data
a =  clnt.get(target + "export.php", dump_data)

puts a.content

Posted in ,  | Tags , , ,  | keine Kommentare