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

Ü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

FreeCiv Technologiebaum

Angelegt von Andreas Steinel Thu, 12 Oct 2006 14:00:04 GMT

Ich hab vor einiger Zeit ein Skript in Ruby geschrieben, welches eine Graphviz- Datei generiert, die den kompletten Technologiebaum als Abhänigkeitsgraph in PNG erzeugt. Das Skript kann hier runtergeladen werden.

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

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

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

Überweisungsformulargenerator

Angelegt von Andreas Steinel Wed, 16 Aug 2006 08:23:00 GMT

Heute musste ich bei Ebay für jemanden einen Artikel bestellen und habe dabei die Kontodaten einfach per Text entgegengenommen und auch so weitergegeben. Ich habe mir die Frage gestellt, ob es nicht möglich wäre Überweisungsformulare einfach unter Linux/Unix zu erstellen. Nach mehr als 90 Minuten habe ich endlich das gefunden was ich wollte. Unglücklicherweise war es auch das Einzige was ich gefunden habe was etwas professionell aussah.

Zuerst habe ich Windows-Software gefunden, die das macht, davon gibt es ja einige. Nur leider war nicht wirklich ein passendes Programm dabei, daß auch noch kostenlos war. Die Programme kosten nicht viel, aber eben zu viel für hin und wieder eine Überweisung. Die nächsten Treffer waren dann die vielen Anbieter von Vordrucken, die bedruckbar waren. Dies war natürlich auch nicht das, was ich eigentlich gesucht habe.

Schlussendlich habe ich eine Vorlage auf dieser Seite gefunden:

Eine sehr schwere Geburt :-/

Aber es ging dann natürlich noch weiter: Nachdem ich nun endlich ein “Formular” hatte, was sich aber nur als “Layout” herausstellte, mußte ja irgendwie noch der Text eingefügt werden. Dazu schaute ich mir das Latex-Paket overpic an und erstellt mit Hilfe dieses Paketes und meiner Lieblingsskriptsprache Ruby ein Tool, mit dessen Hilfe ich die Überweisung maschinell ausfüllen konnte und die vorgesehenen Kästchen dabei noch gewart bleiben.

Dabei würde z.B. folgende Überweisung würde als PDF-Datei erzeugt werden:

Ich habe mich entschlossen, meine Arbeit an diesem Problem zu veröffentlichen und erstellte mir ein sourceforge-Project, welches momentan noch genemigt werden muß.

Vorübergehend kann man den Download unter folgender Seite erreichen:

Posted in , , ,  | Tags  | keine Kommentare

heutige Arbeiten am Blog

Angelegt von Andreas Steinel Wed, 02 Aug 2006 00:01:00 GMT

Heute habe ich fast-cgi bei dem lokalen Apache-Server installiert und etwas damit rumgespielt. So wie es im moment aussieht, kann ich die Konfiguration unseres Webservers auf der Arbeit nicht dazu benutzen, meinen Typo-Blog auf dem Server zum laufen zu bringen. Ich habe keine Rechte auf der Server, die mir dies erlauben würden.
Desweiteren soll es ja nur mittels .htaccess funktionieren. Wenn einige kleine Probleme mit fast-cgi gelöst sind wird das ganze mal auf den Server hochgeladen und probiert, ob es nun tut oder nicht.

Posted in ,  | Tags ,  | keine Kommentare

Blogupdate

Angelegt von Andreas Steinel Tue, 01 Aug 2006 01:22:00 GMT

Lustigerweise ist mir heute aufgefallen, daß die Version von Typo, die ich verwendet habe, die Version 2.6 ist. Mir war nicht bewusst, daß die aktuelle Version die Versionsnummer 4.0 trägt :-(
Ich habe gleich die Version geupdatet und die Datenbankeinträge angepasst. Schön, daß dies so einfach mittels
rake migrate
möglich ist. Es lebe Ruby on Rails :-p

Des Weiteren ist auch ein Upload-Plugin dabei, mit dessen Hilfe man z.B. Bilder hochladen kann. Dieses Feature wollte ich mir bei Version 2.6 sogar schon selbst schreiben. :-)

Nun muß nur noch ein Blog-Backup-Skript her.

Posted in , ,  | Tags ,  | keine Kommentare