iPhone 3G downgrade von iOS 4 auf iOS 3.1.3
Das Iphone 3G ist einfach grauenhaft langsam, wenn man das iOS 4 darauf installiert hat. Selbst die neuen Features wie Multitasking sind gar nicht erst aktiviert und selbst das aktivieren durch einen Jailbreak verursacht eine nur noch größeren Geschwindigkeitsverlust. Daher habe ich mich, wie scheinbar viel andere auch, dazu entschlossen ein Downgrade auf die Firmware 3.1.3 vorzunehmen.
Neue “alte” Firmware runterladen und installieren
Als erstes brauchen wir die passende Firmware. Eine gut gepflegte Liste mit Download-Links direkt von Apple habe ich bei iSzene gefunden.
Ich habe bei meinen Nachforschungen zum Downgrade öfters gelesen, dass es wohl einige Probleme gibt, die alte Firmware auf das iPhone zu spielen. Eine mögliche Lösung und weitere Links gibt es beim Apfelwerk.
Mein Weg war etwas härter, hat aber auch ohne zusätzliche Tools funktioniert. Ich habe das iPhone in den DFU-Modus mit hilfe des Pwnage Tools gebracht und dann via iTunes die alte Firmware installiert. Dies hat nicht direkt geklappt, da iTunes einen Fehler gemeldet hat. Davon aber nicht irritieren lassen, sondern iTunes schließen, neustarten und einfach nochmal versuchen. Eventuell das iPhone nochmals in den DFU Modus versetzen.
Wenn man mit gedrückter ALT-Taste auf Wiederherstellen in iTunes klickt, kann man eine Firmwaredatei auswählen. Ansonsten wird die aktuellste von iTunes automatisch ausgewählt.
Wiederherstellen des iPhones aus einem Backup
Wer nach der erfolgreichen Installation von iOS 3.1.3 versucht, sein iPhone aus einem Backup wiederherzustellen, dass er mit dem iOS 4 gemacht hat wird leider von iTunes enttäuscht mit der Fehlermeldung
Das Backup kann nicht wiederhergestellt werden, da es mit einer neueren Version ….
Doof! Aber man kann sich hier mit einem Trick behelfen.
Unter /Users/<username>/Library/Application Support/MobileSync/Backup findet man die Backups, die iTunes vom iPhone gemacht hat und geht wie folgt vor:
- iTunes schließen!!
- Suchen des neusten Backupsordners
- Dort die info.plist öffnen und nach folgendem suchen
<key>Product Version</key>
und den string darunter auf 3.1.3 abändern. Fertig sieht das dann so aus
<key>Product Version</key> <string>3.1.3</string>
- Jetzt iTunes neustarten und den Sync geschehen lassen
Das sollte alles sein um das iPhone down zu graden vom langsamen iOS 4.
KyoceraMita OSX Treiber reparieren
Ich bin seit langem stolzer Besitzer eines KyoceraMita FS-3830N Druckers und sehr sehr zufrieden mit diesem. Das einzige was leider nicht so gut ist sind die Treiber die Kyocera zur Verfügung stellt.
Zum einen gibt es keine aktuellen Packete für Mac OSX > 10.4 und zum Anderen sind sie in einem Format gepackt, dass nicht per default geöffnet werden kann (SITX).
Da ich vor kurzem mein MacBook Pro neuinstalliert habe mussten auch die Druckertreiber wieder installiert werden. Nur am Bildschirm lesen macht halt einfach keinen Spaß. Als Problem stellt sich aber heraus, dass ich selbst nach der Installation der Druckertreiber nicht in der Lage bin zu drucken.
Die Druckersoftware wurde nicht korrekt installiert. Installieren Sie die Druckersoftware erneut oder wenden Sie sich an den Hersteller.
Problembehebung
- Wie bei jedem Unix System erstmal in die Logfiles schauen. Am besten mit der Console.app, dort auf /private/var/log dann cups und schließlich das error_log auswählen.
- Fehlermeldung lesen: E [07/Jul/2010:16:15:32 +0200] Filter “/usr/libexec/cups/filter/kyofilter” for printer “FS3830N” not owned by root. Was soviel bedeutet, dass die Berechtigungen für die Datei nicht stimmen
- Fehler analysieren: Terminal.app öffnen und per ls -l /usr/libexec/cups/filter/kyofilter die Datei anzeigen lassen
-r-xr-xr-x 1 benjamin wheel 55280 26 Jun 2006 kyofilter
Die Datei sollte dem Nutzer root gehören, nicht mir (benjamin)!
- Fehler beheben: As easy as sudo chown root /usr/libexec/cups/filter/kyofilter
- Testseite drucken und siehe da kein Buchstabensalat mehr, sondern das gewünschte Ergebnis
Einrichten einer Squid Proxy Chain
Heute steht bei auf dem Plan eine Proxy-Chain einzurichten. Unter einer Proxy-Cahin kann man sich eine Hintereinanderschaltung von mehreren Proxyserver vorstellen. Ein Grund für ein solches SetUp ist zum Beispiel, wenn ein Internetanschluß nur zentral zur Verfügung steht und Außenstellen nur über eine kleine Anbindung an diesen angeschlossen sind.
Ziel ist es möglichst wenig Traffic über die kleine Leitung zu schicken, damit andere Services mehr Bandbreite abgreifen können. Zudem wird durch den Proxyserver im Intranet noch die Seitenladezeit verbessert, was aber nur ein “Abfallprodukt” des SetUps ist aber durchaus ein angenehmes.
Installation der Proxyserver
In dem von mir gewählten SetUp ist der Rechner, welcher mit dem Internet verbunden ist mit IPCop versehen, dass von Haus aus einen Proxyserver installiert hat. Diesen gilt es nachfolgend nur noch zu konfigurieren und zu starten.
Auf den Systemen der Außenstellen habe ich mich entschlossen einen Ubuntu Server einzusetzen. Als Proxysoftware wird hier Squid benutzt, welcher sich am einfachsten über apt-get install squid3 installieren lässt.
Konfiguration der Proxyserver
Bis hierhin war alles noch kein großartiger Aufwand. Im ersten Setup werde ich auch darauf verzichten eine Authentifizierung der Benutzer vorzunehmen. Später soll es jedoch möglich sein, dass sich die Benutzer durch das Anmelden an der Domäne automatisch auch beim Proxy Identifizieren.
Bei IPCop ist es wichtig, dass man unter /var/ipcop/proxy/acls/include.acl die Optionen für den ICP Datenaustausch hinzufügt, da es sonst funktioniert die chain nicht.
icp_port 3130 acl proxy_child src <ipaddress> acl proxy_child src <ipaddress> icp_access allow proxy_child icp_access deny all
Auf dem Kind-Proxy ist es am einfachsten die squid.conf durch zu arbeiten, da diese extrem gut kommentiert ist. Um die Kommunikation mit dem Eltern-Proxy (IPCop) zu aktivieren muss man folgendes in der squid.conf des Kindes hinzufügen.
cache_peer <URL PARENT> parent 3128 3130 default
Die in der Konfigurationsdatei oft erwähnte Option only-proxy habe ich weggelassen, da mein Ziel es ja war ein Caching auf dem Kind-Proxy zu erreichen. Als gute Hilfe für das grundlegende Einrichten hat mir http://wiki.ubuntuusers.de/squid und http://www.proesdorf.de/linux/squid_conf.php gedient.
So viel Spaß beim cachen.
Beschleunigen von Apache mit mod_mem_cache
Um noch mehr Potenzial aus meinem Apache zu kitzel habe ich mich etwas mit mod_mem_cache beschäftigt und muss sagen das Ergebnis gefällt mir.
Besonders auffällig waren die Ergebnisse bei meiner Website von SysCP-ng wo sich die Requests pro Sekunde verdoppelten von 20 auf 40. Selbst bei der von mir gehosteten Seite von Propel konnte ich einen Performanzzuwachs verzeichnen, obwohl dieser eher gering ausfiel mit einer Steigerung von 28 auf 31 Requests pro Sekunde. Den niedrigen Zuwachs kann man aber durch die größere Datenbank des Propel Tracs erklären.
Getestet wurde mit Apache Benchmark (ab) mit folgendem Kommando lokal auf dem Webserver.
ab -n 300 -c 5 http://URL/
Die Konfiguration der vHosts wurde wie folgt erweitert
<IfModule mod_mem_cache.c> CacheEnable mem / MCacheSize 32768 MCacheMaxObjectCount 100 MCacheMinObjectSize 1 MCacheMaxObjectSize 4096 </IfModule>
Zwar ist die Cachegröße mit 32MB nicht sehr hoch angesetzt, aber im vergleich zu 4MB respektive 8MB war hier noch ein kleiner Preformanzzuwachs zu verzeichnen. Ob es Sinnvoll ist die Cachegröße zu erhöhen werden weitere Tests zeigen müssen. Als Literatur kann ich getrost die Seite von mod_cache empfehlen.
Mausbewegungen aufzeichnen
Gerade bei einem meiner Streifzüge durch das Internet bin ich auch ein lustiges Gimik gestoßen das sich IOGraphica nennet.
Was tut dieses Tool? – Es zeichnet einfach die Mausbewegeungen auf und verwandelt diese in moderne Kunst
Wo gibt es das Tool? – http://iographica.com/
Wiederherstellen von Mail.app nach Neuinstallation
Im Prinzip ist es jedoch sehr einfach da es einfach. Es müssen nur ein Verzeichnis und eine Datei kopiert werden. Danach einfach wie gewohnt Mail.app starten und den Einrichtungsassistenten die E-Mails importieren lassen.
Zu kopieren vom Backup sind:
<Homedir>/Library/Mail <Homedir>/Library/Preferences/com.apple.mail.plist
Danach müssen nur noch die Passwörter für die Accounts wieder eingegeben werden und alles sollte funktionieren.
Flashvideos auf dem Mac ohne hohe CPU Auslastung
Jeder Mac Besitzer kennt das Problem, dass Mac OS X ganz heftig etwas Adobes Flashplayer hat. Denn egal ob Safari, Firefox oder Opera die CPU Auslastung steigt und steigt, genau wie die Temperatur meines MacBook Pros.
Jedoch kann man den Flashplayer auch einfach um gehen und einen anderen Player wie Quicktime oder VLC benutzen. Diese können viel besser mit den Videoformaten hinter dem Flashplayer umgehen.
Unser Rezept besteht also aus dem Safari Webbrowser und einem Player, der die entsprechende Datei abspielen kann.
- Webseite auf der das Video ist mit Safari öffenen und das Viedo laden lassem
- Als nächstes über Fenster -> Aktivität das Aktivitätsfenster von Safari öffnen
- Dort suchen wie die größte Datei, respektive die die noch läd, selektieren sie mit der Maus und CMD + C kopiert den link
- Danach den kopierten Link im Player öffnen (QT: CMD + U; VLC: CMD + N)
Bei kleinen 20 Sekunden Filmen macht der Aufwand keinen Sinn, aber wenn ein Video doch ein paar Minuten länger dauert schon.
Apache ITK mit mod_php und eingener php.iniApache2 ITK with mod_php and own php.ini
Die ganze Zeit habe ich PHP als FastCGI über mod_fcgid laufen gehabt und war eigentlich auch ganz zufrieden. Auf dem jetzigem Server war ich über die Performance aber doch sehr enttäuscht. So wurden durchschnittlich nur 0,49 Requests/Sek. verarbeitet, laut ab -n1000, was meiner Ansicht nach doch etwas sehr wenig ist. Darum habe ich mich entschlossen kurzer Hand wieder mod_php einzusetzen und siehe da, die Requests pro Sekunde sprangen auf 1,89 Requests/Sek.
Apache ITK
Da mir aber auch an Sicherheit gelegen ist soll PHP aber nicht als www_data respektive apache laufen. Außerdem fand ich es bei PHP als FastCGI doch sehr angenehm, dass man sich seine eigene php.ini anlegen konnte. Mit dem ITK Patch für Apache ist es möglich einem vHost einen Benutzer und eine Gruppe zu zuweisen unter welchem Sie laufen sollen, also wird nicht erst der PHP Prozess sondern direkt der vHost, respektive der Apache Prozess, unter diesem Benutzer ausgeführt. Einen schönen einführenden Artikel zu Apache ITK hat Stuart Herbert in seinem Blog geschrieben.
AssignUserID user group
Dies ist die einzige Ergänzung die im vHost gemacht werden muss um ihn einem speziellen Benutzer zu zuordnen.
PHP mit eigener php.ini
Wenn Apache ITK läuft brauch man nur noch mod_php zu aktivieren und PHP läuft nun auch unter dem angegebenem Benutzer, dennoch hat mod_php die Eigenschaft eine gemeinsame php.ini zu verwenden. Aber auch hierfür gibt es Abhilfe! Bei askapache.com gibt es einen netten Artikel über Custom php.ini tips and tricks über den ich eine Lösung für das Problem der php.ini gefunden habe. Im vHost Container muss einfach folgende Direktive gesetzt werden:
<span style="text-decoration: line-through;">PHPIniDir /path/to/php_ini/</span>Nun wird die php.ini welche sich in diesem Verzeichnis befindet geladen.
Leider muss ich das oben geschriebene revidieren, da das Setting PHPIniDir nicht pro vHost sondern global gilt. Es scheint bis jetzt so, als wäre es nicht möglich mit mod_php für jeden vHost eine eigene php.ini festzulegen.
Fazit
Durch Apache ITK und einigen Einstellungen ist es möglich ein wesentlich performanteres PHP zu bekommen, dass zudem Vergleich zur FastCGI Variante auch noch mehr Features besitzt und nicht unter dem generellen Benutzers des Apache Webservers läuft.
MKV in Quicktime X abspielenPlay MKV-Files using Quicktime X
Nachdem nun offiziell Snow Leopard erschienen ist war ich doch sehr gespannt wie genau sich die verschiedenen Neuerungen im alltäglichen Betrieb auswirken würden. Eines was mir auffiel war, dass Quicktime keine MKV Dateien mehr abspielt, selbst wenn man Perian installiert hat.
In der Perian User Group habe ich einen netten Tipp gefunden der es ermöglicht Quicktime X das abspielen von MKV Dateien zu ermöglichen. Dazu läd man sich den NicePlayer herunter, mountet das Image und führ diesen einmal aus. Nun ist auch Quicktime X in der Lage MKV Dateien anzuspielen.
Meine Vermutung wieso es nach dem einmaligem starten des NicePlayers auch Quicktime X möglich ist MKV Dateien abzuspielen ist, dass der NicePlayer die Datei ~/Library/Preferences/com.apple.quicktime.plugin.preferences.plist verändert und dort den MKV Kontainer als Videodatei einträgt. Bestätigen kann ich dies allerdings nicht, da ich die Datei nicht mehr im orginal Format habe.
Wie dem auch sei, viel spaß beim Film schauen.After Snow Leopard is now officially released I was eager to see how the various changes work out in day to day use. One thing I noticed right after installing Snow Leopard was, that Quicktime X is not able to play MKV files, even if you got Perian installed.
On the Perian User Group I have found a very nice Tip how to enable Quicktime X to play MKV files again. To do so you need to download NicePlayer, mount the Image and open it once. Now you can close and delete NicePlayer and open MKV files with Quicktime X again.
My assumption why it is possible to play MKV files again with Quicktime X after launching NicePlayer once is, that NicePlayer adds the MKV Container as videofile to ~/Library/Preferences/com.apple.quicktime.plugin.preferences.plist. But since I don’t have the original file anymore I can not verify this thesis.
Anyway have fun playing MKV files with Quicktime again.
Der Agavi Filter VersuchPlaying with Agavi Filters
Generelles zu Filtern
In der kleinen AsciiArt unten kann man erkennen wie Filter funktionieren. Von links kommt das Request an die Applikation, dieses wird vom Dispatcher bearbeitet, der das Request und seine Daten durch die Globalen Filter schickt, diese leiten es dann an die entsprechende Action weiter, welche wiederum das ganz durch ihre eigenen Filter schickt. Jetzt wird erst das Output generiert und die Filter werden danach in umgekehrter Reihenfolge wieder durchlaufen.

Agavi's Filter sind wie eine Zwiebel
Bei allen Filtern ist es so, dass die Auflistung die Reihenfolge der Ausführung bestimmt. Weiter unten ein kleines Beispiel dazu.
Globale Filter
Was sind globale Filter? – Globale Filter gelten für das Request an die Applikation. Als Beispiel kann hier der FormPopulationFiler dienen. Dieser Filter ist in der Lage eine HTML mit Werten zu füllen, was aber erst gemacht werden kann, nachdem das ganze Request durchgelaufen ist und das Output generiert worden ist. Somit ist es möglich in dem Request weitere ActionContainer zu kreieren und weiter Actions auszuführen.
Die Konfiguration der Globalen Filter findet in der global_filter.xml im Konfigurationsverzeichnis der Applikation statt. Hierbei bestimmt die Reihenfolge in welcher sie in der Datei aufgelistet werden in welcher Reihenfolge sie ausgeführt werden.
<filter name="FirstFilter"/> <filter name="SecondFilter"/>
Hier würde der Filter mit dem Namen FirstFilter zuerst, danach dann der SecondFilter ausgeführt. Die Globalen Filter werden vom Controller geladen und auf gerufen. Hierbei gilt, dass der Controller explizit den Filter AgaviDispatchFilter registriert und ihn dann gleich danach aufruft. In diesem wird das Response gesetzt, aus dem was noch kommt.
Action Filter
Action Filter sind, wie der Name auch schon sagt, für die Action gedacht. Die Grafik oben verdeutlicht dieses sehr gut. Eine Action generiert uns ja in der passenden View das Output, welches vor der Ausgabe dann noch mit dem FormPopulationFilter bearbeitet wird.
Bei den Action Filtern gibt es eine Besonderheit. Zum einen gibt es die Action Filter, die für jede Action aufgerufen werden und Spezial Action Filter die nur für eine bestimmt Action aufgerufen werden. Die Spezialfilter werden im app/Modulverzeichnis/config/action_filters.xml spezifiziert. Die Filter die für alle Actions gelten sollen werden in app/config/action_filters.xml spezifiziert.
Zur der Reihenfolge der Ausführung ist zu sagen, dass erst die generellen und dann die speziellen.
Noch etwas sehr wichtiges, dass man bei dem entwerfen eines Action Filters nicht vergessen darf, ist das jeder Slot, jede ForwardAction ihre eigene FilterChain hat, welche die Filter nochmal durchläuft. Deswegen gibt es zwei Verschiedene Methoden in der Klasse. Die eine, executeOnce, wird immer für die “main” Action auf gerufen, die andere execute wird dann in den restlichen FilterChains auf gerufen. Sollte man aber wollen, dass der Filter beim ersten bis zum letzten Aufruf immer gleich aufgerufen wird, bedient sich die Klasse AgaviFilter dem Trick, dass executeOnce einfach execute aufruft. ExecuteOnce muss als explizier überschrieben werden.
Aufbau eines Filters
Filter sollten immer die Klasse AgaviFilter erweitern. Dort sind schon einmal die grundlegenden Funktionen definiert wie die oben beschriebene executeOnce Methode.
In dem nachfolgenden Beispiel implementieren wir die Klasse FooBarFilter. Diese kann entweder wie im Beispiel ein Klasse sein die sowohl Global als aus Action Filter ist oder nur eines von beiden. (Hier ist es zu Demonstrationszwecken so gewählt)
<?PHP class FooBarFilter extends AgaviFilter implements AgaviIActionFilter, AgaviIGlobalFilter { public function executeOnce(AgaviFilterChain $filterChain, AgaviExecutionContainer $container) { /* Stuff to be done before the Rest of filters and Output generation is executed */ /* Now we continue with the other filters. THIS MUST BE DONE!!! */ $filterChain->execute($container); /* now to the Stuff which needs to be done afterwards. ie. Output transformation etc. */ } } ?>
Das Beispiel oben hat zu dem nur die Methode executeOnce, was also heißt das der Filter pro Kontext nur einmal ausgeführt würde.
Weiter Infos zu und um Agavi gibt es auf http://www.agavi.org. Auch zu empfehlen ist der Agavi FAQ in dem einige interessante Themen rund um Agavi behandelt werde.
ENGLISH TRANSLATION WILL FOLLOW!
Generelles zu Filtern
In der kleinen AsciiArt unten kann man erkennen wie Filter funktionieren. Von links kommt das Request an die Applikation, dieses wird vom Dispatcher bearbeitet, der das Request und seine Daten durch die Globalen Filter schickt, diese leiten es dann an die entsprechende Action weiter, welche wiederum das ganz durch ihre eigenen Filter schickt. Jetzt wird erst das Output generiert und die Filter werden danach in umgekehrter Reihenfolge wieder durchlaufen.

- Agavi’s Filter sind wie eine Zwiebel
Bei allen Filtern ist es so, dass die Auflistung die Reihenfolge der Ausführung bestimmt. Weiter unten ein kleines Beispiel dazu.
Globale Filter
Was sind globale Filter? – Globale Filter gelten für das Request an die Applikation. Als Beispiel kann hier der FormPopulationFiler dienen. Dieser Filter ist in der Lage eine HTML mit Werten zu füllen, was aber erst gemacht werden kann, nachdem das ganze Request durchgelaufen ist und das Output generiert worden ist. Somit ist es möglich in dem Request weitere ActionContainer zu kreieren und weiter Actions auszuführen.
Die Konfiguration der Globalen Filter findet in der global_filter.xml im Konfigurationsverzeichnis der Applikation statt. Hierbei bestimmt die Reihenfolge in welcher sie in der Datei aufgelistet werden in welcher Reihenfolge sie ausgeführt werden.
<filter name="FirstFilter"/> <filter name="SecondFilter"/>
Hier würde der Filter mit dem Namen FirstFilter zuerst, danach dann der SecondFilter ausgeführt. Die Globalen Filter werden vom Controller geladen und auf gerufen. Hierbei gilt, dass der Controller explizit den Filter AgaviDispatchFilterregistriert und ihn dann gleich danach aufruft. In diesem wird das Response gesetzt, aus dem was noch kommt.
Action Filter
Action Filter sind, wie der Name auch schon sagt, für die Action gedacht. Die Grafik oben verdeutlicht dieses sehr gut. EineAction generiert uns ja in der passenden View das Output, welches vor der Ausgabe dann noch mit demFormPopulationFilter bearbeitet wird.
Bei den Action Filtern gibt es eine Besonderheit. Zum einen gibt es die Action Filter, die für jede Action aufgerufen werden und Spezial Action Filter die nur für eine bestimmt Action aufgerufen werden. Die Spezialfilter werden im app/Modulverzeichnis/config/action_filters.xml spezifiziert. Die Filter die für alle Actions gelten sollen werden inapp/config/action_filters.xml spezifiziert.
Zur der Reihenfolge der Ausführung ist zu sagen, dass erst die generellen und dann die speziellen.
Noch etwas sehr wichtiges, dass man bei dem entwerfen eines Action Filters nicht vergessen darf, ist das jeder Slot, jede ForwardAction ihre eigene FilterChain hat, welche die Filter nochmal durchläuft. Deswegen gibt es zwei Verschiedene Methoden in der Klasse. Die eine, executeOnce, wird immer für die “main” Action auf gerufen, die andere execute wird dann in den restlichen FilterChains auf gerufen. Sollte man aber wollen, dass der Filter beim ersten bis zum letzten Aufruf immer gleich aufgerufen wird, bedient sich die Klasse AgaviFilter dem Trick, dass executeOnce einfach execute aufruft. ExecuteOnce muss als explizier überschrieben werden.
Aufbau eines Filters
Filter sollten immer die Klasse AgaviFilter erweitern. Dort sind schon einmal die grundlegenden Funktionen definiert wie die oben beschriebene executeOnce Methode.
In dem nachfolgenden Beispiel implementieren wir die Klasse FooBarFilter. Diese kann entweder wie im Beispiel ein Klasse sein die sowohl Global als aus Action Filter ist oder nur eines von beiden. (Hier ist es zu Demonstrationszwecken so gewählt)
<?PHP class FooBarFilter extends AgaviFilter implements AgaviIActionFilter, AgaviIGlobalFilter { public function executeOnce(AgaviFilterChain $filterChain, AgaviExecutionContainer $container) { /* Stuff to be done before the Rest of filters and Output generation is executed */ /* Now we continue with the other filters. THIS MUST BE DONE!!! */ $filterChain->execute($container); /* now to the Stuff which needs to be done afterwards. ie. Output transformation etc. */ } } ?>
Das Beispiel oben hat zu dem nur die Methode executeOnce, was also heißt das der Filter pro Kontext nur einmal ausgeführt würde.
Weiter Infos zu und um Agavi gibt es auf http://www.agavi.org. Auch zu empfehlen ist der Agavi FAQ in dem einige interessante Themen rund um Agavi behandelt werde.