Marcel Eichner // Ephigenia

  • Home
  • Illustration
  • Code
  • Kontakt

Aktuelle Projekte

Horrorblog.org
jQuery.slideShow
Franklin
code.marceleichner.de

This Blog-Website is built with Harrison!

Blogs & Freunde

Gimmixx
Martin Fleck
Torsten Bergler
Jens Franke
Robokid
Peter Kröner
Polycoder
Coding Horror
Lotterliebe
CodeBalancer
Pseudocoder
Migrador
Dachdeckermeister Peter Arold in Werda, Plauen, Hof und Umgebung La Petite Provence - Pension und Festsaal in Leisnig Piv-Berlin, Immobilienverwaltung Verwaltung Berlin blogoscoop

#507

04.07.2011 19:51
0 Kommentare
Share
  • php
  • apache
  • gd-lib
  • image
  • server
  • nginx
  • static
  • content
  • delivery
  • .htaccess
One problem when relaunching large projects with a ton of images is to re-create all the thumbnails that users have uploaded in the years. If you don’t use paperclip (ruby) or anything like it in PHP (is there any like it!?) where you can run run one command to re-create all the thumbnails in all specified sizes your can try to keep it flexible and create every image on demand.

Theory

The Webserver should serve the image if it exists. If the file does not exist, the request should be redirected to a PHP script that searches and creates the requested image file (in requested size) at exactly the location it was originally requested. The second request on the file will not be redirected to the PHP script and will server the image that now exists.

Practice

So the first thing to archive is to send the request of a not existing image to a PHP file. That’s easy if you’re familiar with all the nginx directives:

This rule can be combined with the anti-hotlinking rules for images with nginx I showed you last week.

After that we need to create a format that includes width and height of any requested image so that the
thumbnailer.php
knows which size the created image should have. A valid request for a resized file should always have all parameters (width, height) in it:
../img/public/9c4be029/438xauto/filename.jpg

This makes it easy to split up width, height with a regexp in
thumbnailer.php
. The following code is just an example. You’re surelly integrate the logic into your frameworks:

That’s it! After that you can request any image in any size on your webserver by only creating it once it’s requested.

There are some things you can add, like other parameters in the
$formatRegexp
string to add different resizing methods or even filters, or limitations on the
width
and
height
parameter.

Appendix: Apache

It’s almost the same thing with apache. Just add a few lines to your
.htaccess.
and all your image requests are redirected to the thumbnailer (or anything):

#505

30.03.2011 19:25
0 Kommentare
Share
  • google
  • filter
  • mail
  • notification
  • boolean
  • operator
Nach dem ich am Montag Die Kunst der Mailminimierung - Hermetisches Schreiben von Sascha Lobo auf Webciety gelesen hatte, hab’ ich mich gestern Abend ran gemacht und meine Google Mail Filter überarbeitet. Der Vorteil daran, seine Mails direkt in Google Mail zu filtern, und nicht erst im Mail Client (Mail, Thunderbird) liegt darin, dass die E-Mails schon von Google gefiltert werden und so auf jedem Endgerät, auf dem man seine E-Mails lesen will, schon sauber sortiert ankommen.

Bestimmt hat jeder von euch irgendeinen kleinen Filter, der zum Beispiel Newsletter oder die Mails von der Familie in einen entsprechenden Ordner legt.
So lange man dabei mit der Benutzung der ersten drei Felder From, To und Subject, die später alle zu einer UND Verknüpfung werden, klar kommt, ist alles super. Nun ist es aber so, dass man, wenn man mehrere Kriterien die auf To und Subject mit ODER verknüpft werden sollen nur zwei Möglichkeiten hat:
Entweder man erstellt zwei Filter mit einmal dem gefüllten To Einstellungen und einmal mit gefüllten Subject Einstellungen oder man macht es auf die elegante Weise und benutzt das Has the Words Feld.

Dieses Has the Words sucht eigentlich in der gesamten E-Mail (auch in den Headern) nach dem Vorkommen der gewünschten Zeichenkette. Wenn man den Suchbegriff jedoch mit geschweiften Klammern {} einklammert kann man hier jede Menge coole Sachen machen:

Suche in E-Mails die an horrorblog.org gingen, dabei soll es egal sein ob sie direkt oder via cc an horrorblog.org gingen:
Abgekürzt geht’s auch so:

Der Clou dabei ist, wie oben schon erwähnt, das Google Mail jetzt in den Feldern mit ODER statt mit UND sucht. Hätte man einfach in die From, To Felder horrorblog.org eingetragen, hätte der Filter nur funktioniert, wenn die Mail von und an horrorblog.org geschickt worden wäre.

Die ganze Macht der Filter kommt auch in dem folgenden Beispiel zu tragen, mit dem man alle E-Mails die von so automatischen Services kommen gesammelt in einen Ordner Notifications packen lassen kann:

Die generelle Syntax für die UND oder ODER Verknüpfungen in den Filtern wird auch in Build advanced Gmail filters and persistent searches bei Lifehaker beschrieben wo es heisst, dass normale Klammern () immer UND bedeuten und geschweifte Klammern {} ein ODER. Diese Filter kann man übrigens am besten bearbeiten, wenn man sie vorher in einem Text-Editor (mit Syntax Highlighting) bearbeitet und dann in das Feld pastet. Die Filter funktionieren auch in der normalen Suche von Google Mail.

#503

14.07.2010 11:40
0 Kommentare
Share
  • firefox
  • tool
  • open
  • source
  • console
  • Nerd
  • extension
Screenshot vom Vimperator in Aktion
Auf dem LinuxTag 2010 hat Caspar die Vimperator Erweiterung für den Firefox Browser vorgestellt die ich mir zu Hause gleich zu Gemüte geführt habe.

Die Erweiterung ist total für Nerds gedacht. Man kann den kompletten Browser, alle Links und Befehle von der durch den Vimperator hinzugefügten Kommandozeile aufrufen. So bekommt man noch mal mindestens 100 Pixel in der Höhe Platz für die Websites und gerade auf Netbooks ist das eine Menge Platz!

Nach einer leichten Einführungsphase um die wichtigsten Befehle wie
o www.spon.de[ENTER]
für Seite aufrufen oder
t www.horrorblog.org[ENTER]
für Tab öffnen zu lernen hab ich mir mitlerweile die komplette Bedienung zugelegt und auch schon mein erstes "Plugin" geschrieben das mit die aktuelle URL mit Bitly als ShortURL in die Zwischenablage legt. Hier meine eigene
.vimperatorrc
Datei die noch ein paar mehr Sachen macht:
" only use with buftabs plugin
set showtabline=0
"
custom colorsheme
colorscheme darkness
" set textmate as editr

set editor="mate -w"
" show hover links in status bar

set showstatuslinks=2
js document.getElementById("status-bar").setAttribute("moz-collapsed", false);
" no error sound, just flash display

set errorbells visualbell
" alternative tab navigation

map b gt
map v gT
" tab navigation via arrow keys

map <Left> <C-p>
map <Right> <C-n>
map h <C-p>
map l <C-n>
" bit.ly shortener.

javascript <<EOF
shortenURLIsGd = function (url) {
  var req = new XMLHttpRequest();
  " get your username and api key from bit.ly!!!

  req.open("GET", "http://api.bit.ly/v3/shorten?login=[Username]&apiKey=[API_KEY]&format=txt&longUrl=" + escape(url), true)
  req.onreadystatechange = function (ev) {
    if (req.readyState == 4) {
      if (req.status == 200) {
        util.copyToClipboard(req.responseText, true);
      } else {
        liberator.echo(req.responseText);
      }
    }
  }
  req.send(null);
}
EOF
map <silent> short :javascript shortenURLIsGd(buffer.URL);<CR>
map <silent> bitly :javascript shortenURLIsGd(buffer.URL);<CR>

Des weiteren sei noch erwähnt, dass man noch weitere ColorShemes oder Vimperator Plugins im Internet findet. Ein super Plugin ist auch das Buftabs Plugin, dass sogar die Tableiste überflüssig macht.

[UPDATE #1] Dank der Aktualisierung von Geshi, das das Code-Highlighting hier im Blog erledigt sieht das Vim-Script jetzt auch schön bunt aus.

#498

04.06.2010 12:39
3 Kommentare
Share
  • code
  • script
  • bash
  • shell
  • apache
  • benchmark
  • ab
In einem aktuellen Projekt steht bald ein signifikanter Server-Wechsel an. Um später genau sagen zu können, was das gebracht hat, wollte ich mehrere Teile der Website (verschiedene URIs) mit dem Apache Tool ab zu verschiedenen Tageszeiten, einmal vor Wechsel des Servers und nach Wechsel des Servers, testen. Da ich nicht viel Zeit verschwenden wollte, hab’ ich ein Shell-Script geschrieben das mir wenigstens die Arbeit abnimmt die verschiedenen URIs abzuchecken:
#!/bin/bash
##############################################################################
# Run ab on a list of URIs
#
# Usage:
#   ab_batch.sh
#
# Author: Marcel Eichner // Ephigenia <love@ephigenia.de>
# Date: 2010-06-03
##############################################################################
URL="http://www.horrorblog.org"
SLEEP=30
URIS=(
  "/"
  "/blog/reca-drei-clips-und-red-band-trailer/"
  "/blog/the-crazies-remake-horrorblog-kritik/"
  "/blog/the-crazies-interview-clips/"
  "/blog/the-devils-playground-erste-bilder/"
  "/blog/a-nightmare-on-elm-street-remake-horrorblog-kritik/"
)
date
echo -e "Batch Apache-Benchmarking on n${URL}"
for URI in ${URIS[@]};
do
  echo "uri: ${URI}"
  ab -c 10 -t 60 "${URL}${URI}" | grep -P "(request|second):"
  sleep ${SLEEP}
done

Das liefert dann zum Beispiel folgendes Ergebnis. Die Werte kann man dann in eine Tabelle übertragen und ein Diagram draus machen. Nach dem Server wechseln dann das ganze noch einmal durchführen und schon hat man einen schönen Beweis was der Umzug denn gebracht hat.
Fr  4 Jun 2010 12:15:54 CEST
Batch Apache-Benchmarking on
http://www.horrorblog.org
uri: /
Finished 349 requests
Requests per second:    5.57 [#/sec] (mean)
Time per request:       1794.754 [ms] (mean)
Time per request:       179.475 [ms] (mean, across all concurrent requests)
uri: /blog/reca-drei-clips-und-red-band-trailer/
Finished 588 requests
Requests per second:    9.79 [#/sec] (mean)
Time per request:       1021.170 [ms] (mean)
Time per request:       102.117 [ms] (mean, across all concurrent requests)
uri: /blog/the-crazies-remake-horrorblog-kritik/
Finished 407 requests
Requests per second:    6.78 [#/sec] (mean)
Time per request:       1474.255 [ms] (mean)
Time per request:       147.425 [ms] (mean, across all concurrent requests)
uri: /blog/the-crazies-interview-clips/
Finished 397 requests
Requests per second:    6.60 [#/sec] (mean)
Time per request:       1514.682 [ms] (mean)
Time per request:       151.468 [ms] (mean, across all concurrent requests)
uri: /blog/the-devils-playground-erste-bilder/
Finished 331 requests
Requests per second:    5.50 [#/sec] (mean)
Time per request:       1816.657 [ms] (mean)
Time per request:       181.666 [ms] (mean, across all concurrent requests)
uri: /blog/a-nightmare-on-elm-street-remake-horrorblog-kritik/
Finished 506 requests
Requests per second:    8.43 [#/sec] (mean)
Time per request:       1185.792 [ms] (mean)
Time per request:       118.579 [ms] (mean, across all concurrent requests)

Für Verbesserungsvorschläge bin ich wie immer offen! Kommentiert einfach!

#497

30.05.2010 21:31
0 Kommentare
Share
  • buch
  • javascript
  • js
  • O’Reilly
  • Verlag
  • Meinung
Da mir schon vor einiger Zeit der Computer-Lesestoff ausging, hab’ ich mir letzte Woche jQuery Cookbook bei Amazon bestellt.
Das Buch ist angefüllt mit praktischen Beispielen und Lösungen, auf die man, wenn man viel mit jQuery arbeitet, schon gestoßen ist. Wenn ihr Glück habt findet ich viele, oder so wie ich, weniger neue Sachen in dem Buch. Auf jeden Fall sollte man mal reinschauen! Die deutsche Ausgabe kommt im Juni raus, jQuery Kochbuch kann man schon vorbestellen.

#494

02.05.2010 21:25
3 Kommentare
Share
  • code
  • tutorial
  • tool
  • script
  • bash
  • shell
  • Gewinner
  • Email
  • Verlosung
  • Beispiel
  • Datei
Wie manche von euch wissen betreibe ich seit einiger Zeit ja ein kleines aber mittlerweile echt ganz gut erfolgreiches Blog über Horror- und Fantasyfilme. Bei dem dritten Gewinnspiel haben über 150 Leute mitgemacht und mir eine Email geschickt. Leider etwas viele um per Losverfahren Gewinner auszuwählen. Das folgende Beispiel wird für erfahrene Programmierer nichts neues sein oder total langweilig. Eventuell hilft’s aber dem einen oder anderen weiter ;-)

Einfach mit OSX Mail die Mails extrahieren, die das richtige Lösungswort enthalten, oder die man untersuchen möchte. Dabei erstellt Mail einfach eine Datei mit allen Email-Quelltexten untereinander in einer Textdatei. Diese kann man super mit der Bash maltretieren und die Absenderadresse extrahieren:
grep -Z -P '^From:s(.+)' mail_export.txt | uniq
Wenn man dann noch zwei Gewinner auswählen möchte, braucht man nur doch die Anzahl der Zeilen in der Datei und wählt dann einfach zwei aus. Das ganze Shell-Script sieht dann so aus:
#!/bin/bash
##########################################################
# Extract n radom emails from a file
#
# Usage:
#   winner.sh [filename] [count]
#
# Author: Marcel Eichner // Ephigenia <love@ephigenia.de>
# Date: 2009-03-30
##########################################################
TMPFILE=`mktemp -t emails` || exit 1
grep -Z -P '^From:s(.+)' "$1" | uniq > $TMPFILE
# select random line from file
LCOUNT=`wc -l "${TMPFILE}" | awk ' { print $1; }'`
echo "Choosing ${2:-1} winners from ${LCOUNT} emails"
for (( i = 0 ; i < ${2:-1}; i++ ))
do
  LINENUMBER=$((($RANDOM % $LCOUNT) + 1))
  sed -n ${LINENUMBER}p ${TMPFILE}
done

Das Script kann wenn es ganz doof kommt auch zwei mal die gleichen Absender auswählen. Wenn das passiert kann man das Bash-Script ja gleich noch mal laufen lassen. Danke an Caspar der noch weitere hilfreiche Anregungen gegeben hat!

#482

13.08.2009 22:16
11 Kommentare
Share
  • gmail
  • skype
  • addon
  • firefox
  • slow
  • facebook
  • javascript
Der Firefox meiner Freundin hatte enorme Probleme sich mit Facebook anzufreunden und da hab’ ich mich in die Untiefen von Windows Vista begeben müssen. Doofe Sache das. Dann hat sich rausgestellt, dass man einfach nur das Skype Addon (was macht das eigentlich!?) deinstallieren muss. (Das soll btw. auch bei GMail helfen!)
Wem’s hilft kann sich ja in den Kommentaren bedanken!

#480

06.08.2009 18:13
0 Kommentare
Share
  • lustig
  • internet
  • video
  • youtube
Gerade hat mir Jann diese wunderbare Sendung mit der Maus Episode auf Youtube geschickt. Echt ein totaler Klassiker! Geht ein wenig lange aber lohnt sich auf jeden Fall da mal rein zu schauen.

#470

15.07.2009 16:37
0 Kommentare
Share
  • code
  • javascript
  • script
  • klassen
  • lib
Oh mann, was für ein Pain-in-the-ass ... wenn man echte Klassen in Javascript haben möchte kann man sich so ziemlich tot googeln und man wird jedes mal nur 50% von dem finden was man eigentlich sucht wenn man echte Klassen mit Vererbung in JavaScript haben möchte.
Glücklicherweise gibt es Leute denen das auch schon so gegangen ist und die eine wirklich einfach zu nutzende und kleine Bibliothek für echte Ruby-like Klassen in JavaScript geschrieben haben: JS.Class Ein weiter Vorteil ist, dass man JS.Class anstandslos mit jQuery benutzen kann, was von kleineren Code-Snippets die Klassenverhalten simulieren soll nicht gerade sagen kann.
Wer erst abgeschreckt ist von den vielen Dateien sei beruhigt. Für einfache Klassen reicht schon das core.js was minified nur 7434 Bytes gross ist. Eine echte Zeitersparnis!

#466

02.07.2009 16:19
2 Kommentare
Share
  • code
  • script
  • bash
  • shell
  • file
  • changed
  • bell
  • log
Aus aktuellem Anlass wollte ich ein Shell-Script schreiben das mir anzeigt, wenn sich eine Datei ändert (ein Log-File) und diese dann kurz ausgibt. Jedes mal wenn sich also die Datei ändert, klingelt es im Terminal (printf 'a') und ich bekomme die letzten Einträge angezeigt:
interval=${2:-1}
filename=$1
filename=${filename:?"missing."}
while true
do
  if test `find "$filename" -mmin ${interval}`
  then
    clear;
    printf "`date`n$filenameann";
    tail "$filename"
  fi
  echo "sleeping for next check in $((interval * 60)) seconds ..."
  sleep $((interval * 60))
done

Man kann das auch auf die Spitze treiben, aber so macht’s erstmal das was ich wollte. Benutzt wird es dann wie folgt:
./fileChanged.sh folder/testlog.log
Checkt dann jede Minute ob die Datei sich geändert hat. Wer rausbekommt wie man das mit Sekunden machen kann sagt mir Bescheid :)
  • 1
  • 2
  • 3
  • weiter »
marceleichner HTML5 Harrison Theme (Validate Source), © 2010 by Ephigenia M. Eichner, Impressum