Doufu Mapo…
... ist super lecker. Haben wir gerade grob nach einem Rezept auf Chefkoch gemacht.
MJAM.
Ach ja, wir haben die Pilze weggelassen, dafür doppelt so viel Fleisch.
| Mo | Tu | We | Th | Fr | Sa | Su |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
... ist super lecker. Haben wir gerade grob nach einem Rezept auf Chefkoch gemacht.
MJAM.
Ach ja, wir haben die Pilze weggelassen, dafür doppelt so viel Fleisch.
Ich fang ja nur langsam an zu verstehen wie sich die verschiedenen Konstrukte unterscheiden.
Da wäre zum Beispiel das immer wieder auftretende Problem das man an Sourcen arbeitet, auf die man nicht comiten kann oder will.
Also zum Beispiel an Bugfixes für ein Projekt, von dem man zwar die Sourcen hat, das aber dooferweise einer Firma gehört die keine comits zulässt. Ah well.
In Git löst man das, indem man das einfach brancht und bei einem neuen Release mit rebase seine Changes auf die neue Plattform hebt. Mercurial und Bazaar lösen das anders, dort gibt es spezielle Plugins Mercurial Patch-Queues und Bazaar Looms die ein Quilt ähnliches Interface bieten um das Problem zu lösen.
Tja, was macht den Unterschied aus?
Eine Sache die mir allmählich aufgeht ist das Teilen dieser Änderungen. Macht man einen Branch und rebased dann immer wieder auf die originalen Sourcen. Das ist super, weil es kein neues Konzept braucht und somit relativ simpel. Aber man kann diesen Branch so gut wie nicht mit anderen leuten Teilen - schließlich verändert man ständig die History. Also doof für die Zusammenarbeit an so einem branch. (...)
Updated on 08/02/08 18:53:22
..und hat da gesprochen.
Ganz hervorragend dazu der Kommentar von Jon Stewart
I think, the america flags are broken… they're not on fire […] You know, […] there's something about a charismatic leader, rallying huge crowds of Germans in a large public square…
*rofl*
Der erste Teil hat ihn zu einer Internet-Legende gemacht.
Der Zweite teil ist noch besser.
Unbedingt anschauen. :)
kann so einfach sein.
Man muss einfach nur ein Captcha einbauen, dass "zuverlässig" zwischen Mensch und Maschine unterscheidet.
Well, zuverlässig.
Ich jedenfalls fühle mich jetzt offiziell zur Maschine geadelt, denn bei diesem Captcha bin ich einfach nicht weitergekommen. (Man muss noch sein Alter bestätigen, damit man das Captcha sieht.)
Doh.
Hab ich mal für Python gegoogelt.
Und bin erstaunlicherweise auf eine extrem coole idee gestoßen:
Einfach indem man dem Lernenden Rätsel aufgibt, die ihn stück für stück an neue Konzepte aus der Python Standardbibliothek heran bringen.
Definitiv die beste Idee für Übungsaufgaben die ich bisher gesehen habe - und wunderschön über eine Webseite machbar.
By the way: Auf dieses Coole Programm zum Python lernen bin auch auch gestoßen Einfach ein Webbrowser mit einem Manual links, und rechts ein Terminal um das alles auszuprobieren.
Nice!
Endlich mal ein guter ausgeglichener Vergleich zwischen den drei großen verteilten Versionskontrollsystemen.
Updated on 07/28/08 10:54:35
NodeBox ein tool mit dem man in Python die Mac OS X Graphik-Bibliotheken ansprechen kann.
Die Galerie ist besonders faszinierend.
Dokumentation.
Den vergleich zwischen Dokumentation und dem Austausch von Körperflüssigkeiten spare ich mir jetzt. Wahr ist er aber trotzdem.
Vergleicht man die Python und die Cocoa Dokumentation dann fällt bei Cocoa recht schnell auf das es keine klare Trennung gibt in High level Dokumentation und Klassenspezifische Dokumentation während das bei Python gemischt ist.
Dazu kommt das bei Python oft die high level Beispiele fehlen und es von der Referenz-Dokumentation keinen Link auf die komplette Listung der Methoden eines Objekts gibt.
Zwar kann man dann in Python oft auf den interpreter zurückgreifen und sich von dort aus noch mehr informationen über ein Objekt holen - das ist aber ganz schön aufwendig.
High Level Dokumentation: Cocoa++, Python--
Wenn es um die Klassenbasierte Doku geht hat Cocoa auch eindeutig die Nase vorne. Alle Methoden sind immer nach Topics geordnet. NSArray zum Beispiel startet mit einer Liste der Fakten über die Klasse (in welchem file definiert, ab welcher Version des Frameworks verfügbar, welche High-Level Guides gehören dazu) und fährt dann erst einmal mit einem Überblick über den Zweck der Klasse fort der auch gleichzeitig die wichtigsten Methoden der Klasse erklärt. (...)
Und wieder mal heißt es: Python/Trac oder Cocoa? Wer wird gewinnen?
Erkundbarkeit der Frameworks ist mein nächstes Thema: Die Klassen die bestimmte Aufgaben haben sollen leicht zu finden sein.
Das funktioniert bei Trac in der Regel sehr gut, da man in Python sehr schön über Packages hierarchische Namensräume definieren kann - ähnlich wie bei Java eben auch.
Nur dass es dort etwas Taktvoller eingesetzt wurde.
Das heißt es gibt trac.wiki trac.tickets trac.timeline etc. Wenn man den Code zu einem Feature sucht, kann man ihn auch schnell finden.
Ganz im Gegensatz zur Standard Library von Python - da ist alles Kraut und Rüben - wenn man mal eben versucht alle Klassen die was mit String-Verarbeitung oder mit ein und Ausgabe zu tun haben, dann kann man ganz schön suchen - es gibt nicht einen Namensraum der überschaubar wäre und alles enthält.
Cocoa ist da auch nicht vorbildlich - da gibt es gar keine Namensräume. Nur eine grobe unterteilung in Foundation für alles was keine GUI braucht und AppKit für alles was mit einer GUI zusammenhängt. (...)
Neulich beim Diskutieren mit Felix kam wieder die Frage auf, die schon viele Flamewars ausgelöst hat.
Was macht APIs schon?
Das lässt sich natürlich nicht beantworten - aber an Beispiele kann man dass sehr konkret besprechen:
Das fängt ganz vorne an: Namensgebung der Klassen. In Python ist es guter Stil, das man alle Namen so kurz wie irgend möglich macht.
Das hat zur Folge, dass leider aus den Funktionsnamen so gut wie nichts über die Anzahl und die Typen der Argumente abzuleiten ist.
Und das heißt, das man entweder in der API-Doku nachsieht, oder es halt wissen muss.
Gar nicht schön.
Cocoa dagegen funktioniert so, dass vor jedem Argument ein Stück Methodennamen kommt. Und es ist Usus, dass man dieses Stück Methodennamen verwendet die Argumente zu erklären, Beschreiben oder zumindest deren Typ anzugeben. (...)
Ok, sie ist komplett auf GIT zugeschnitten, aber trotzdem sehr ordentlich. Vor allem erklärt er auch anschaulich wofür man die advanced features wie rebasing sinnvollerweise verwenden kann.
Also alles in allem eine Empfehlung. :)
Tja, nach anfänglichem Erfolg mit meinem NAS muss ich leider doch geschlagen geben.
Auch wenn alles zum Funktionieren zu bringen war, bricht jeder Backup auf den NAS so nach etwa 1-6 Gigabyte ab und ist nach dem zweiten Restart gar nicht mehr zum starten zu überreden (angeblich weil die Backup-Festplatte Schreibgeschützt ist.
:-(
Ich probier es jetzt mal mit einem anderen Hersteller.
Dachte ich mir zum letzten mal.
Denn das kann XCode ja schließlich auch automatisieren, wenn man ein wenig in die Makros von Xcode reingreift.
Schritt eins, /Developer/Applications/Xcode.app/Contents/PlugIns/TextMacros.xctxtmacro/Contents/Resources/ObjectiveC.xctxtmacro im Texteditor der Wahl öffnen und das Macro finden das Apple als Hilfe für solche Fälle vorgesehen hat. (Bei mir ist das auf Zeile 68)
{
Identifier = objc.bracket;
BasedOn = objc;
IsMenuItem = YES;
Name = "Bracket Expression";
TextString = "[<#!expression!#> ]";
},
Das habe ich mir dann durch zwei Macro-Definitionen ersetzt die für mich wesentlich nützlicher sind:
{
Identifier = objc.bracket;
BasedOn = objc;
IsMenuItem = YES;
Name = "Bracket Expression";
TextString = "[<#!expression!#>]";
},
{
Identifier = objc.bracket.withSemicolon;
Updated on 07/15/08 15:22:28
Backups übers WLAN auf ein NAS zu machen ist schick - aber TimeMachine arbeitet ausschließlich mit Apple TimeCapsule
Jetzt kriegt man aber auch schicke NAS mit anderthalb Terrabyte - nur das Ding zur Zusammenarbeit mit TimeMachine zu überreden ist schon etwas schwieriger - aber möglich.
Zuerst habe ich TimeMachine so konfiguriert, dass es überhaupt alle Festplatten anzeigt:
defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1
Danach das Disc-Image. TimeMachine kriegt es nicht gebacken - aber während es sein Glück versucht, kann man sehen wie der name sein sollte (mit ls -al)
TimeMachine bricht dann zwar ab, aber man kann das Disk-Image problemlos selber mit hdiutil herstellen und dann rüberkopieren. Wichtig: -volname muss passen (das .tmp image rechtzeitig mounten). Der Trick liegt in dem Namen des sparsebundles, der besteht aus a) dem Namen des Rechners ($NAME), dann einem Underscore ("_") und der MAC-Adresse des Rechners ($MAC_ADRESS). (...)