Artikel getaggt mit ruby

hübsche Dropbox Links

Weil große Email Anhänge stinken, bietet sich z.B. die Dropbox als Dateiaustauschplatform an.

Einfach die Datei in den (lokalen) Dropbox/Public Ordner verfrachten, syncen lassen und per “Rechte Maustaste -> Copy Public Link” in die Mail kopieren.

Redirect

Nun sind solche Links nicht besonders hübsch (Branding!, Branding!, CI! ruft die Marketingabteilung) und  spätestens wenn man’s abtippen muß oder per Telephon weitersagt wird’s gruslig.

Hat man aber eine eigene Website, lassen sich die Dropbox Links aufhübschen und eine Weiterleitung einrichten, dann wird aus

http://dl.dropbox.com/u/1234567/BigDocument.pdf

z.B.

http://dropbox.mydomain.com/BigDocument.pdf

und schon sind die Brandingfreunde happy.

index.html

Geht es nicht um eine einzelne Datei sondern um mehrere, will man evtl. eine Übersicht in einer index.html haben. So eine Übersicht legt z.B. mein ruby Script htmlizedb an. Das Script will im Terminal in dem Verzeichnis gestartet werden, für das die Übersicht her soll.

Redirect + index.html

Bei Webservern ist allgemein üblich, daß man den Dateinamen index.html im Link weglassen kann. Der Webserver nimmt dann an man meint selbige. Die Dropbox verhält sich aber in dieser Hinsicht nicht wie ein normaler Webserver, sondern will immer den kompletten Dateinamen.

Hat man aber bereits den Redirect Trick in Benutzung, läßt sich die Redirect Steuerdatei (.htaccess) aufbohren, daß der Redirect die index.html Angabe ergänzt:

RewriteEngine on
# dropbox abbreviation:
# http://www.cimitan.com/blog/2008/09/17/htaccess-to-redirect-on-dropboxs-public-folder/#
# last path component has no dot -> redirect to index.html
RewriteRule ^(.+/)?([^./]+)/?$	http://dl.dropbox.com/u/1234567/$1$2/index.html	[last,qsappend]
# everything else: redirect as is
RewriteRule ^(.+)$	http://dl.dropbox.com/u/1234567/$1	[last,qsappend]

violá, nun wird von

http://dropbox.mydomain.com/FolderWithBigFiles

automatisch auf den Dropbox Link

http://dl.dropbox.com/u/1234567/FolderWithBigFiles/index.html

weitergeleitet.

Toll, nicht?

Tags: , , , , , , ,

T-Mobile Rechnungen auspacken und umbenennen

über T-Mobile RechnungOnline kann man sich die Rechnung als gpg-verschlüsselten Anhang per Mail schicken lassen – incl. Einzelverbindungsnachweis. Und obwohl’s nur 1x im Monat kommt, ist das Auspacken und Umbenennen in sinnvolle Dateinamen eine lästige Routinearbeit.

Also – automatisieren. Das folgende Ruby-Script erledigt das, nachdem der Rechnungsanhang in einen der Ordner “Downloads” oder “Desktop” gelegt wurde:

#!/usr/bin/ruby
 
dst="#{ENV['HOME']}/Documents/tmobile"
 
# 1. pull together all pgp crypted find Rechnung_15.10.2009.zip.pgp in Desktop, Downloads, local dir
["#{ENV['HOME']}/Downloads", "#{ENV['HOME']}/Desktop", dst].each do |dir|
  Dir.foreach(dir) do |file|
    m = /Rechnung_(\d{2})\.(\d{2})\.(\d{4})\.zip(\.pgp|\.gpg)?/.match file
    if m
      s = system "mv #{dir}/#{file} #{dst}/#{m[3]}-#{m[2]}-#{m[1]}-bill.zip#{m[4]}"
      s = system "gpg #{dst}/#{m[3]}-#{m[2]}-#{m[1]}-bill.zip#{m[4]}" if m[4]
      system "rm #{dst}/#{m[3]}-#{m[2]}-#{m[1]}-bill.zip#{m[4]}" if s && m[4]
      s = system "unzip #{dst}/#{m[3]}-#{m[2]}-#{m[1]}-bill.zip"
      system "rm #{dst}/#{m[3]}-#{m[2]}-#{m[1]}-bill.zip" if s
      puts "de-crypted & unpacked #{dst}/#{m[3]}-#{m[2]}-#{m[1]}-bill.zip"
    end
  end
end
 
# 2. rename unpacked files accordingly
Dir.foreach(dst) do |file|
  m = /^Rechnung_(\d{4})_(\d{2})_(.+)$/.match file
  system "mv #{dst}/#{file} #{dst}/#{m[1]}-#{m[2]}-bill-#{m[3]}" if m
  m = /^Einzelverbindungsnachweis_(\d{4})_(\d{2})_(.+)$/.match file
  system "mv #{dst}/#{file} #{dst}/#{m[1]}-#{m[2]}-evn--#{m[3]}" if m
  m = /^Rechnung_(\d{5,20})_(\d{2})_(\d{4})(.+)$/.match file
  system "mv #{dst}/#{file} #{dst}/#{m[3]}-#{m[2]}-bill-#{m[1]}#{m[4]}" if m
  m = /^Einzelverbindungsnachweis_(\d{5,20})_(\d{2})_(\d{4})(.+)$/.match file
  system "mv #{dst}/#{file} #{dst}/#{m[3]}-#{m[2]}-evn--#{m[1]}#{m[4]}" if m
end

Tags: , , ,

ruby: parse Apache Serverlogs

Yields a hashmap for every line:

require 'date'
 
class Apache
  def self.each_request(src=$stdin)
    ip_pat=/(?:[0-9]+\.){3}[0-9]+/
    date_pat=/\[[^\]]+\]/
    req_pat=/"([A-Z]+)\s([^\s]+)\s([^\s]+)"/
    ref_pat=/"([^"]+)"/
    date_fmt = '[%d/%b/%Y:%H:%M:%S %Z]'
    apache_pat = Regexp.new( "(#{ip_pat})\s([^\s]+)\s([^\s]+)\s" < <
      "(#{date_pat})\s#{req_pat}\s([0-9]+)\s(-|[0-9]+)\s#{ref_pat}\s#{ref_pat}")
    src.each_line do |l|
      m = apache_pat.match l
      if m
        r = { :ip => m[1],
          :uid => m[2],
          :auth => m[3],
          :date => DateTime.strptime(m[4],date_fmt),
          :method => m[5],
          :url => m[6],
          :http => m[7],
          :status => m[8],
          :bytes => m[9],
          :referrer => m[10],
          :agent => m[11] }
        yield r
       else
        $stderr.puts "Unparseable line: '#{l}'"
      end
    end
  end
end

maybe there are faster ways, but it’s quite convenient this way.

Tags: , , , ,

Transfer Phone Numbers from gammu to the Mac Adressbook

ok, make yourself comfortable, fasten your seatbelt and stop smoking. This will be quite a journey:

Den Rest des Eintrags lesen. »

Tags: , , , , , ,

Remember Ragel

Es ist schon etwas her aber dennoch einen kurzen Eintrag hier sicher wert.

Ragel habe ich für ein Experiment (ist SVG als 2D Szenengraph Format für piccolo2d machbar?) benutzt um einige Parser zu bauen.

Den Rest des Eintrags lesen. »

Tags: , , ,