RSS
 

Author Archive

Alles hat seinen Preis. Oder doch nicht?!

09 Feb

“Alles hat seinen Preis” – ein beliebter und bekannter Spruch, der auch meine Denk- und Argumentationsweise bestimmte.

Wenn ich am Strand liege, dann muss ich damit bezahlen, dass ich nicht gleichzeitig arbeiten kann, nicht zur selben Zeit beim Skifahren sein oder kann nicht zur selben Zeit Erfahrungen beim Gleitschirmfliegen sammeln kann. Ich kann auch nicht zur gleichen Zeit mit einer Sache Geld verdienen (Betrag X) und gleichzeitig mit einer anderen Sache auch Geld verdienen (Betrag gößer X).

So die logische Begründung des Spruchs. Aber das ist nur eine Sichtweise der Zusammenhänge. Diese Sichtweise impliziert, dass ich, nachdem ich etwas getan habe, weniger habe als vorher, denn ich habe ja mit etwas dafür bezahlt, nämlich mit den Dingen, die ich, während ich Sache A gemacht habe, nicht tun konnte.

Ist das wirklich so?

Zurück zum obigen Beispiel. Wenn ich am Strand liege, erhole ich mich höchstwahrscheinlich und lese ein gutes Buch. Ich bin also anschließend erholter als vorher und weiß mehr also vor dem Strandaufenthalt (durch das gute Buch). Ich habe also etwas dazu gewonnen. Wenn jetzt noch die Bewertung des “mehr” unterm Strich höher ausfällt als der “Preis”, dann habe ich nicht dafür bezahlt, sondern habe etwas (umsonst?) bekommen!

Diese Sichtweise funktioniert nicht nur abstrakt, sondern sie funktioniert auch monetär. Dazu muss man zwischen “Assets” und “Liabilities” unterscheiden (vgl. definition Robert Kiyosaki): Assets = Dinge die Geld in meinen Geldbeutel tun, Liabilities = Dinge, die Geld aus meinem Geldbeutel absaugen. Wenn ich nun die “richtigen” Dinge kaufe, kosten Sie mich nichts, sondern machen mich wohlhabender (z.B. eine Immobilie, die mehr Miete abwirft, als sie Zinsen kostet).

Fazit: Nur manche Dinge “haben ihren Preis”, die anderen machen mich “reicher” und sind völlig umsonst. Deshalb ist der Spruch “Die schönsten Dinge im Leben sind umsonst” nicht nur wahr, sondern er müsste eigentlich lauten “Die schönsten Dinge im Leben sind nicht nur umsonst, sondern sie bereichern Dich”.

 
 

Nicht beantwortete Freundschaftsanfragen auf Facebook finden und abbrechen

08 Nov

Ist Euch schon mal aufgefallen, dass es auf Facebook keine Möglichkeit gibt, heraus zu finden, welchen Leuten man eine Freundschaftsanfrage geschickt hat?

Die einzige Möglichkeit besteht darin, sich daran zu erinnern, wem man die Anfrage geschickt hat, die Seite erneut auf zu rufen und dann auf dieser Seite die Anfrage ab zu brechen. Es gibt jedoch keine Möglichkeit eine Übersicht über alle verschickten Freundschaftsanfragen auf der FB-Seite zu sehen.

Mit einem Trick kann man sie jedoch dennoch wieder finden:

  • Kontoeinstellungen
  • Lade eine Kopie deiner Facebook-Daten herunter.
  • erweitertes Archiv
  • Archiv herunterladen

Nach einer Weile bekommt ihr dann eine Mail mit dem Link zu dem Archiv. Darin befindet sich eine .zip-Datei. Dort drinnen ist eine .html-Datei enthalten, die ihr mit dem Browser öffnen könnt. Etwa auf der Mitte des Menüs befindet sich der Punkt “Offenstehende Freundschaftsanfragen”. Dort könnt ihr alle Namen sehen, bei denen noch offen stehende Freundschaftsanfragen vorhanden sind. Diese müsst ihr dann einzeln über die Suche ansurfen und die Anfrage dort löschen.

 
 

FTP Backup von Verzeichnisen über die Komandozeile

22 Apr

Wer schon mal versucht hat per FTP auf der Kommandozeile etwas zu machen, wird sehr schnell festgestellt haben, dass es 1.) recht mühsam und unkomfortabel ist, sich mit den vorhandenen Befehlen durch einen Verzeichnisbaum zu hangeln und dass (viel Wichtiger) 2.) manche Sachen einfach nicht gehen. So ist es zum Beispiel nicht möglich, einen Verzeichnisbaum mit einem Befehl herunter zu laden!! Man kann immer nur eine Datei gleichzeitig laden.

Mir ist das noch nie aufgefallen, da ich immer mit FTP-Programmen gearbeitet habe, die machen das quasi “im Hintergrund” für einen. Wenn man das aber auf der untersten Ebene versucht – sprich auf der Kommandozeile – dann fällt das eben auf.

Konkret ging es darum, einen Backup-Server, auf dem nur FTP-Zugriff möglich war (ja, leider, ich hätte auch lieber per ssh drauf zugegriffen!), ein Backup im Hintergrund auf ein NAS zu machen, ohne dabei über ein FTP den Hauptrechner zu belasten, bzw. das ganze zu automatisieren.

Machbar ist es nun nicht über ftp, sondern per wget:

wget -r -l0 -np ftp://user:password@host.com/verzeichnis

-r steht für rekursiv (also alle Dateien durchsuchen)
-l0 steht für die Verzeichnistiefe (0 = unbeschränkte Tiefe, 1 = Eine Verzeichnisebene, 2 = Zwei Verzeichnisebenen, etc.)
-np steht für “no parent”, also nicht in die darüber liegenden Verzeichnisse wechseln
/verzeichnis/ ist optional

Das ganze kann man dann noch wunderbar mit dem screen Befehl oder einem cronjob verknüpfen.

Link: http://www.essential-freebies.de/board/viewtopic.php?t=4075

 
 

Typo3 Backend: stdWrap in eigner Funktion nutzen

11 Apr

Um in einen Aufruf einer php-Funktion in einer eigenen Extension das “Schweizer Messer” ‘’stdWrap” nutzen zu können bedarf es einiger – nicht wirklich gut dokumentierter – Kniffe. Beispielsweise ist es sinnvoll, einen Wrap um ein eigenes Feld setzen zu können, ohne dass dies im PHP-Code hardkodiert werden muss, oder ein Template genutzt und geparst werden muss.

Und so funktioniert es.
Wir verwenden im Beispiel ein Typoscript, dass eine eine userFunc aufruft und ”apptitle” als Parameter wrappen soll.

  10 = USER_INT
  10 {
    	userFunc = tx_lpiphone_pi2->getXMLValue
    	apptitle.stdWrap.dataWrap = <apptitle updated="{field:tstamp}">|</apptitle>
  }

Zuerst sucht man sich das entsprechende Element aus dem Konfigurationsarray.

 function FUNCTIONNAME ($content, $conf)    {
		$this->conf=$conf;
		...
 }

nun muss es durch das cObj-Objekt “geschleust” werden und dort dann die stdWrap-Methode aufgerufen werden. Die stdWrap-Mehtode cObj-Objekt nimmt zwei Parameter entgegen: Der erste Parameter ist der Parameter/die Variable auf der der stdWrap angewendet werden soll. Der zweite Parameter ist ein array der die stdWrap Anweisungen enthält (was wir uns gleich aus dem $conf-igurations-Array bauen werden).

Den zweiten Parameter (also die Anweisungen) holen wir uns jetzt aus dem $conf array:

$arrayValueFromConfig = 'apptitle'; //das ist der Parametername aus dem Typoscript
$arrayValueFromConfigPlusPoint = $arrayValueFromConfig."."; //hier fügen wir einen Punkt (".") hinzu damit wir einen Array kriegen!.

$valueToWrap = "Beispielvariable"; // Wer aus dem Phpskript, der per stdWrap verarbeitet werden soll (hier ge-dataWrappt).

Diese so zusammen gebastelten Werte übergeben wir jetzt an die funktion stdWrap vom cObj-Objekt und fügen sie der Variable $content hinzu, damit sie im Frontend angezeigt wird.

 $content .= $this->cObj->stdWrap($valueToWrap, $conf[arrayValueFromConfigPlusPoint]);

Hier noch ein einfacheres Beispiel, was die Verwendung noch etwas veranschaulicht:

$valueToWrap = "hallo";
$wrapAnweisungsArray = array ('case' => 'upper', 'wrap' => '<font size="10"> | </font>');
$content .= $this->cObj->stdWrap($valueToWrap,$wrapAnweisungsArray);

// gibt folgendes aus: <font size="10">HALLO</font>

http://www.pi-phi.de/functions.html
http://www.typo3.net/tsref/functions/stdwrap/
http://wiki.typo3.org/De:TSref/stdWrap

 
 

Typo3: Backend-Felder an die richtige Stelle positionieren

06 Apr

Um im Typo3 Backend selbst erstellte Felder an die richtige Stelle zu positionieren, gibt es nachfolgende Möglichkeit.

Beispiel:

  • Aus welcher Tabelle: ”tt_content”
  • Das (Datenbank-)Feld das eingebunden werden soll ‘tx_lpiphonedisplay_color’
  • In welchen CType soll das neue Feld eingefügt werden: ”lp_iphone_pi1” (hier könnte auch so was stehen, wie ”textpic” oder ”text”).
  • Vor oder nach welchem Feld es eingefügt werden soll: ”before:tx_lpiphone_lp_aditional_items” (fügt das neue Feld vor dem Feld ”tx_lpiphone_lp_aditional_items” ein). Entsprechend ”after:” für nach dem Feld.

In der Datei ”ext_tables.php” werden folgende Zeilen hinzugefügt:


// in $tempColumns wird das Feld erzeugt (sieht bei Euch bestimmt ganz anders aus
// hier werden drei Radobuttons für die Werte 1,2,3 erzeugt
$tempColumns = Array (
	"tx_lpiphonedisplay_color" => Array (
		"exclude" => 1,
		"label" => "LLL:EXT:lp_iphone_display/locallang_db.xml:tt_content.tx_lpiphonedisplay_color",
		"config" => Array (
			"type" => "radio",
			"items" => Array (
				Array("LLL:EXT:lp_iphone_display/locallang_db.xml:tt_content.tx_lpiphonedisplay_color.I.1", "1"),
				Array("LLL:EXT:lp_iphone_display/locallang_db.xml:tt_content.tx_lpiphonedisplay_color.I.2", "2"),
				Array("LLL:EXT:lp_iphone_display/locallang_db.xml:tt_content.tx_lpiphonedisplay_color.I.3", "3"),
			),
		)
	),
);

t3lib_div::loadTCA("tt_content");
t3lib_extMgm::addTCAcolumns("tt_content",$tempColumns,1);

// ### diese Zeile fügt nun Euer neues Feld an die richtige Stelle ein: ###
t3lib_extMgm::addToAllTCAtypes('tt_content','tx_lpiphonedisplay_color','lp_iphone_pi1','before:tx_lpiphone_lp_aditional_items');
 
 

XML mit typo3 ausgeben

28 Mrz

“Lass’ uns doch eine App machen” – so fing das ganze einmal an. Gesagt getan. Es wurde drauf los programmiert. Wir wussten, wie die App aussehen sollte und auch was sie können sollte: Sie sollte in etwa so aussehen, wie die vom größten Konkurrenten – nur besser. Die Daten sollten aus einem vorhandene Datenpool kommen, der in einer MySQL Datenbank vor lag.

Die App war nach einer “gewissen” Entwicklungszeit dann auch so gut wie fertig, es fehlten nur noch die Daten. Diese waren noch nicht eingefügt worden, da der Entwickler – wie das ja oft der Fall ist, entweder mitten in einem Projekt war, oder einfach keine freie Kapazität hatte, sich um eine Schnittstelle zu kümmern.

Es musste also eine andere Lösung her. Als ich mein Problem einem Freund erzählte bekam ich nur ein kurzes “typo3″ kann doch auch XML ausspucken – ich hab das mal bei einem Flash Projekt gemacht” zu hören. Gesagt, getan – und so fing das ganze Projekt an, das sich in den letzten zwei Jahren zu einem beachtlichen Framework entwickelt hat.

Das schöne daran ist, dass keine einzige Zeile Code in php geschrieben werden muss, sondern dass die ganze Ausgabe über typoscript gesteuert werden kann. XML eignet sich hervorragend dazu, weil es in Prinzip aus lauter Wraps besteht.

Das Grundgerüst sieht in etwa so aus:

page = PAGE
   page {
   typeNum = 111
   config.disableAllHeaderCode = 1
   config.additionalHeaders = Content-type:text/xml
   config.xhtml_cleaning = 0

   10 = TEXT
   10.value = <?xml version="1.0" encoding="utf-8" standalone="yes"?>
   20 = COA
   20 {
      stdWrap.dataWrap = <root>|</root>
      10 < temp.your_wrapped_items
   }

Damit kann man dann wunderbaren XML-Code ausgeben um diesen wiederum in iPhone Anwendungen lesen zu können.

Worauf ihr unbedingt achten müsst: UTF-8 ist zwingend erforderlich, sonst machen die Parser auf dem iPhone nur Zicken.

 
No Comments

Posted in iphone, typo3

 

xCode per WGET downloaden

30 Nov

Im Leben eines (iPhone-) Entwicklers wird man von Apple alle paar Monate dazu genötigt, die komplette Entwicklungsumgebung (xCode) herunter zu laden. Selbst mit einer 16.000er Leitung kann das über eine Stunde benötigen, da die Datei mehrere GB groß ist. Ärgerlich ist das ganze, da eigentlich nur das SDK benötigt wird und nicht die ganze Entwicklungsumgebung (das ist etwa so, als ob man für ein neues Word-Datei-Format jedes mal das komplette Office-Paket herunter laden muss). Sei’s drum…
Am schönsten wäre es wenn die Datei gleich auf das NAS gespeichert würde. Das geht prinzipiell erst mal nicht, weil man sich bei Apple einloggen muss (ein Cookie gesetzt bekommt) und dann erst den Download starten kann.
Hier nun der workaround:

  • Cookie exporter im Firefox installieren (https://addons.mozilla.org/en-US/firefox/addon/66579/)
  • Firefox neu starten
  • Bei Apple im Devcenter einloggen (http://developer.apple.com/iphone)
  • Cookies mittels Coockie exporter in eine Datei exportieren (z.B. export_coockies.txt)
  • Diese Datei in das Verzeichnis des NAS/Linux-Systems legen in dem der Download passieren soll
  • mit folgendem Befehl den xCode-Download starten (gilt hier exemplarisch für xCode 4.2):

wget –server-response –continue –no-check-certificate –load-cookies=export_coockies.txt https://developer.apple.com/ios/download.action?path=/ios/ios_sdk_4.2__final/xcode_3.2.5_and_ios_sdk_4.2_final.dmg

  • Das Ganze lässt man am besten per “sreen”-Befehl in einem virtuellen Terminal laufen, damit man es dann mit CTRL-A D im Hintergrund laufen lassen kann.

Update 1:
Irgendwie gibt es seit einer Weile mit dieser Methode Fehlermeldungen (ich bin dem Grund nicht wirklich auf die Spur gekommen) und deshalb hier noch eine kleine aber effektive Verbesserung:
Der Teil des Links wird nicht per “Link kopieren” von der Webseite kopiert, sondern ihr müsst ihn zuerst anklicken, bis der Download startet und dann in der Downloadliste im Kontextmenü (rechtsklick) “Download Link kopieren” anklicken. Damit bekommt ihr einen Link der direkt auf die Datei zeigt – etwa so:

http://adcdownload.apple.com/Developer_Tools/xcode_4.0.2_and_ios_sdk_4.3/xcode_4.0.2_and_ios_sdk_4.3.dmg

 
 

iPhone prepaid in den USA vewenden

21 Apr

Wer kennt da nicht: man fährt in den Urlaub und möchte dort auf seinen Datentarif nicht verzichten. Dann erkundigt man sich mal pro forma nach den Roamingtarifen im Ausland. Bei t-mobile beispielsweise erfährt Mann dann recht freundlich: 0,47 Cent pro KB. Das klingt auf den ersten Blick nicht nach viel bis man nachrechnet. Bei normaler Benutzung seines iPhones kommt man dann beim Überschlagen schnell auf über 1000 Euro in ein paar Tagen. Inakzeptabel. Die wollen mein Geld einfach nicht. Es gibt auch kein Datenpaket dass man fürs Ausland buchen könnte.

Also ist die einzige Lösung, das iPhone zu entsperren und eine lokale Datenkarte zu besorgen.

In den USA bietet AT&T als einziges einen brauchbaren Datentarif an. Für 19.95$ bekommt man 100MB. In einem AT&T Shop gibt es die Karte, die man am besten gleich mit dem Datentarif aufladen lässt. Alternativ kann man ein GoPhone in so gut wie jedem Elektronikladen kaufen und das Handy dann einfach weg werfen – denn es ist natürlich geSIMlockt. Die Karte ist auch auf das Handy gelockt, was aber durch einen Anruf bei der Servicehotline aufgehoben werden kann (ja, man muss es einfach nur wissen und machen).

Für das iPhone kommt jetzt der spannende Teil (mal davon ausgegangen, dass man es einsperrt hat): Eintrag des APN. Dazu braucht man ein WiFi und folgende Webadresse: http://www.unlockit.co.nz
Diese ruft man mit dem Browser des iPhones auf! Dort kann man den APN eintragen. Dieser lautet

APN: wap.cingular
User: WAP@CINGULARGPRS.COM (groß/klein beachten)
Passwort: CINGULAR1 (groß/klein beachten)
 

Auf keinen Fall den von AT&T nehmen! Sonst funktioniert kein 3G!

Viel Spass beim Surfen!

 
 

Promocodes um einen US-iTunes Account zu erstellen

20 Mrz

Ich habe gerade eben für jemandem einen Promo-Code für unsere neue App gesendet. Er wollte diese im (deutschen) Appstore einlösen und stieß auf folgende Fehlermeldung:

Dieser Code ist nur für Kunden des Stores für Vereinigte Staaten gültig

Erst hat mich das gerärgert, da ich die App gerne auf deutsch im deutschen Store gezeigt hätte. Nach einer weile Suchen im Netz bin ich jedoch auf diesen Artikel gestoßen, der beschreibt, wie man mit einem Promo-Code einen US-Account erstellt. Eigentlich gar nicht so blöd! Da könnte man ja zwei Fliegen mit einer Klappe schlagen! Als ich vor einiger Zeit das, auf TechCrunch “gehypte” Spiel MyTown ausprobieren wollte, was es nur in dem US-Store gibt, besorgte ich mir extra einen US-Gutschein um einen neuen Account an zu legen, was mich fast 10 Euro kostete (nur um eine kostenlose App herunter zu laden). Das hätte ich mir mit einem Promo-Code sparen können…

Also, wenn jemand einen US-Account braucht könnt ihr bei uns gerne einen Promo-Code für unsere App kriegen. Würde uns natürlich freuen, wenn ihr diese dann mit einem kurzen Kommentar auf englisch eine gute Bewertung geben würdet.

 
No Comments

Posted in iphone

 

Zweite iPhone App im Store: XML-Viewer

20 Mrz

Als wir an unsrer ersten App bzw. unserem App-Framework gebastelt haben, habe ich natürlich die App immer wieder auf dem iPhone getestet. Wie das so bei der Softwareentwicklung ist, ist man viel damit beschäftigt, Fehlern auf den Grund zu gehen um sie ausmerzen zu können. Unser Framework baut sehr intensiv auf XML-Dateien auf, die von dem korrespondierenden Server geladen werden. Das passiert bei der initialen Befüllung der App mit Daten, bei den verschiedensten Updatevorgängen und demnächst bei dem neuen Feature der Kommentarfunktion.

Wenn viel mit XML gearbeitet wird und die XML-Struktur auch selber “zusammen geschustert” wird, ist es unabdingbar, diese als valides XML zu testen, bzw. zu sehen, sonst braucht man gar nicht weiter nach Fehlern zu suchen, bzw. weiter zu entwickeln.

Irgendwann wollte ich die XML-Struktur auch mal auf dem iPhone ansehen und musste fest stellen, dass es dafür überhaupt keine Möglichkeit gibt! Der hauseigene Browser zeigt nur den Text innerhalb der Tags an, was natürlich völlig unbrauchbar ist.

Als musste eine eigene App für diesen Zweck her.

Und hier ist sie nun: http://itunes.apple.com/de/app/xml-viewer/id360965979?mt=8

XML-Viewer (Word-Wrapped)

Syntax-Highlighting

Bookmarks anlegen

Word-Wrap ausschalten