Blog
Lebenslauf
Freitag, 18. November 2011 Kategorie: AllgemeinDa ich mittlerweile mein Physikstudium abgeschlossen habe, möchte ich hiermit auf meinen Lebenslauf aufmerksam machen.
Teufel
Montag, 16. Mai 2011 Kategorie: Allgemein Ein Lob an den Teufel...Kundenservice. Ich hatte mir die Aureol Groove In-Ear Kopfhörer von Teufel gekauft, welche aber aufgrund der filigranen Kabel schnell kaputt gingen. Schade, denn der Klang war schon ziemlich gut. Ein kurzer Anruf bei der Hotline und die Dame bietet mir sofort einen Ersatz an, was ja in der Garantiezeit nichts besonderes ist. Dass Teufel das Produkt aber auch zurücknimmt und den vollen Kaufpreis erstattet, hat mich dann aber schon positiv überrascht.
Pidgin Logs zu Trillian konvertieren
Sonntag, 9. Januar 2011 Kategorie: ProgrammierenIch bin von Pidgin auf die Version 5 von Trillian umgestiegen. Leider hab ich kein Tool gefunden mit dem die über die Jahre gewachsene Chat-History in Trillian importiert werden kann, also hab ich mir kurzerhand folgendes Perl-Skript zusammengewurschtelt. Vielleicht hilft es ja jemandem.
#!/usr/bin/perl
use warnings;
use strict;
use POSIX qw/strftime mktime/;
use URI::Escape;
use English;
sub traverseTree {
my $dir = shift;
my %files;
opendir my $dh, $dir or die $!;
while ($_ = readdir $dh) {
next if ($_ eq '.' or $_ eq '..');
my $item = $dir . '/' . $_;
if (-d $item) {
my %temp = traverseTree($item);
foreach my $medium (keys %temp) {
foreach my $to (keys %{$temp{$medium}}) {
$files{$medium} = {} if !$files{$medium};
$files{$medium}->{$to} .= $temp{$medium}{$to};
}
}
}
else {
if (my %conversation = parseFile($item)) {
$files{$conversation{'medium'}} = {} if !$files{$conversation{'medium'}};
$files{$conversation{'medium'}}->{$conversation{'to'}} .= $conversation{'xml'};
}
}
}
closedir $dh;
return %files;
}
sub parseFile {
my $file = shift;
print "Parsing $file\n";
open FILE, $file or die $!;
my %conversation;
my ($year, $month, $day);
$INPUT_RECORD_SEPARATOR = "\n";
my $line = <FILE>;
$INPUT_RECORD_SEPARATOR = undef;
my $data = <FILE>;
my @parts;
if ($line =~ m{<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>Conversation with (?P<to>.+) at (?P<timestr>.+) on (?P<from>.+) \((?P<medium>.+)\)</title>}) {
%conversation = %+;
$conversation{'format'} = 'html';
@parts = split m{\n(?=<font color="[^"]+"><font size="\d+">\([^\)]+\)</font> <b>.+?:</b></font>)}s, $data;
} elsif ($line =~ m{Conversation with (?P<to>.+) at (?P<timestr>.+) on (?P<from>.+) \((?P<medium>.+)\)}) {
%conversation = %+;
$conversation{'format'} = 'text';
@parts = split /\n(?=\(\d\d:\d\d:\d\d\) [^:]+: )/s, $data;
} else {
warn "Format error\n";
return ();
}
if (($year, $month, $day) = $file =~ m{/(\d{4})-(\d{2})-(\d{2})\.(\d{2})(\d{2})(\d{2})\+(\d{4})CET\.(?:html|txt)}) {
$conversation{'time'} = mktime($6, $5, $4, $day, $month - 1, $year - 1900);
} else {
warn "Date Format Error in File Name\n";
return ();
}
if ($conversation{'medium'} eq 'skype') {
$conversation{'medium'} = 'SKYPE';
} elsif ($conversation{'medium'} eq 'icq') {
$conversation{'medium'} = 'ICQ';
} elsif ($conversation{'medium'} eq 'jabber') {
$conversation{'medium'} = 'FACEBOOK';
} else {
warn "Unkown Medium\n";
return ();
}
$conversation{'encodedTo'} = uri_escape($conversation{'to'});
$conversation{'encodedFrom'} = uri_escape($conversation{'from'});
#print "$_: $conversation{$_}\n" foreach keys %conversation;
$conversation{'xml'} = qq~<session type="start" time="$conversation{'time'}" ms="0" medium="$conversation{'medium'}" to="$conversation{'encodedTo'}" from="$conversation{'encodedFrom'}"/>\n~;
my %message = ();
foreach my $line (@parts) {
if ($line =~ m{<font color="(?P<color>[^"]+)"><font size="\d+">\((?P<timestr>[^\)]+)\)</font> <b>(?P<fromName>.+?):</b></font> (?P<message>.+)<br/>}s) {
%message = %+;
if ($message{'color'} eq '#16569E') {
$message{'type'} = 'outgoing';
$message{'to'} = $conversation{'to'};
$message{'from'} = $conversation{'from'};
} elsif ($message{'color'} eq '#16569E' or $message{'color'} eq '#A82F2F') {
$message{'type'} = 'incoming';
$message{'to'} = $conversation{'from'};
$message{'from'} = $conversation{'to'};
} else {
warn "Message Type Error: $line\n";
}
$message{'message'} =~ s/<.+?>//g;
$message{'message'} =~ s/<br\/>/\n/g;
} elsif ($line =~ m{\((?P<timestr>[^\)]+)\) (?P<fromName>.+?): (?P<message>.+)}s) {
%message = %+;
if ($message{'fromName'} eq $conversation{'from'}) {
$message{'type'} = 'outgoing';
$message{'to'} = $conversation{'to'};
$message{'from'} = $conversation{'from'};
} else {
$message{'type'} = 'incoming';
$message{'to'} = $conversation{'from'};
$message{'from'} = $conversation{'to'};
}
} elsif ($line eq "</body></html>") {
} else {
warn "Unmatched Line: $line\n";
next;
}
if ($conversation{'medium'} eq 'FACEBOOK') {
if ($message{'type'} eq 'outgoing') {
$message{'from'} = "Facebook-Name";
$message{'fromName'} = "Facebook-Name";
} else {
$message{'to'} = "Facebook-Name";
}
}
#print "$_: $message{$_}\n" foreach keys %message;
my ($day2, $month2, $year2, $hour, $minute, $second) = $message{'timestr'} =~ m{(?:(\d\d)\.(\d\d)\.(\d{4}) )?(\d\d):(\d\d):(\d\d)};
$year = $year2 if $year2;
$month = $month2 if $month2;
$day = $day2 if $day2;
$message{'time'} = mktime($second, $minute, $hour, $day, $month - 1, $year - 1900);
$message{'encodedTo'} = uri_escape($message{'to'});
$message{'encodedFrom'} = uri_escape($message{'from'});
$message{'encodedFromName'} = uri_escape($message{'fromName'});
$message{'encodedMessage'} = uri_escape($message{'message'});
$conversation{'xml'} .= qq~<message type="$message{'type'}_privateMessage" time="$message{'time'}" ms="0" medium="$conversation{'medium'}" to="$message{'encodedTo'}" from="$message{'encodedFrom'}" from_display="$message{'encodedFromName'}" text="$message{'encodedMessage'}"/>\n~;
}
my $endtime = $message{'time'} ? $message{'time'} : $conversation{'time'};
$conversation{'xml'} .= qq~<session type="stop" time="$endtime" ms="0" medium="$conversation{'medium'}" to="$conversation{'to'}" from="$conversation{'from'}"/>\n~;
close FILE;
return %conversation;
}
my %files = traverseTree('C:/Users/cycore/AppData/Roaming/.purple/logs');
foreach my $medium (keys %files) {
foreach my $to (keys %{$files{$medium}}) {
my $file = "C:\\Users\\cycore\\AppData\\Roaming\\Trillian\\users\\vollsponk\\logs\\$medium\\Query\\$to.xml";
print "$file\n";
open FILE, ">>$file" or warn $!;
print FILE $files{$medium}->{$to};
close FILE;
}
}