qTranslate mit vielen Sprachen
qTranslate, ein Wordpress-Plugin mit dem mensch seine Seite in mehreren Sprachen anbieten kann, ist ein ganz hervorragende Lösung. Das muss man wirklich mal sagen. Ich bastle im Moment an einer anderen Seite herum und habe dort 8 Sprachen zu verwalten. Einziges Manko:
Bei so vielen Sprachen wird der Platz für die Tabs in der Artikel- und Seitenerstellung insbesondere auf kleinen Bildschirmen (das kleinste was ich hier hab ist 15″ 4:3) etwas knapp. Dadurch Überlappen sich Einträge, Menüpunkte verschwinden im Textfluss, etc. pp.
Abhilfe schafft hier die Firefox-Erweiterung Stylish. Für das eigene Wordpress Blog (auf die zweite Zeile achten!) legt man einfach folgende Einträge fest:
@namespace url(http://www.w3.org/1999/xhtml);
@-moz-document domain(“eigenedomain.topleveldomain“) {
div.postarea div.qtrans_title_wrap {
margin-right: 300px !important;
}
.has-right-sidebar #post-body-content {
margin-right: 0px !important;
}
#media-buttons {
float: right !important;
padding: 6px 10px 0 0 !important;
}
}
Wer weniger als 8 Sprachen verwendet, wird jetzt sehen, dass das Eingabefeld für den Beitrag bzw. die Seite mit in der Sidebar hängt. Das ist natürlich ungünstig. Abhilfe schafft folgender Code hinter #media-buttons { … }:
div#postdivrich.postarea {
margin-top: 50px !important;
}
Diese Angabe ist ausreichend bei 7 Sprachen. Für jede weitere fehlende Sprache einfach 90 zu den 50px addieren. Irgendwann macht das natürlich keinen Sinn mehr, weil man eh nie genug Sprachtabs hätte, um den Editor zu sprengen ;).
Viel Spaß damit….wer’s braucht ;).
Es wird unübersichtlich
/me fängt gerade an C zu lernen, eine Sprache, die ich wahrscheinlich vor allen anderen (Java, VB6, VB.net, C#, PHP, Pascal) hätte lernen sollen.
Aber: Besser später als nie. Zur Seite steht mir dabei das Standardwerk in ANSI-C Programmierung von Kernighan und Ritchie, leider in der deutschen Übersetzung (leider deshalb, weil man sich hier entschlossen hat auch „eingebürgerte“ Namen zu übersetzen, wie z.B. Array mit Vektor oder Backslash mit Gegenschrägstrich – das mag sogar perfekt übersetzt sein, aber ist eben doch etwas „eigen“).
Das Buch macht mir auch einen guten Eindruck. Trotzdem muss ich sagen, dass ich einige Dinge etwas zweifelhaft finde. Noch während der Besprechung von Arrays weißt man z.B. ständig auf Pointer (im Buch „Zeiger“) hin. Die werden aber erst 45 Seiten später besprochen. Das Vorgreifen erschwert hier wirklich die Übersicht, wie ich finde. Als störend empfinde ich aber tatsächlich etwas anderes.
Der grobe Inhalt (zumindest bis zur Seite 70 – da bin ich gerade) beschäftigt sich mit dem Nachbau von grundlegenden Funktionen zur Verarbeitung von Strings, die so auch schon im ANSI-C Standard vorhanden sind, nur werden sie hier eben genutzt, um die Sprache zu vermitteln. Da diese Funktionen zur Grundfunktionalität einer jeden Programmiersprache gehören (behaupte ich einfach mal ganz dreist ;D), ist es _natürlich_ sinnvoll, dass diese möglichst kompakt und effizient sind. Ich kann mir zumindest im Bereich der Programmiersprachen nichts schlimmeres vorstellen als lahmarschige Basisfunktionen. Genau aus diesem Grund eignen sie sich aber nur bedingt zur Vermittlung einer Sprache insbesondere in der Form, wie sie in „Programmieren in C“ aufgestellt werden. Ein Beispiel:
int strindex(char s[], char t[])
{
int i, j, k;
for (i = 0; s[i] != ‚\0′; i++) {
for(j = i, k = 0; t[k] != ‚\0′ && s[j] == t[k]; j++, k++)
;
if(k > 0 && t[k] == ‚\0′)
return i;
}
return -1;
}
Diese Funktion soll das erste Vorkommen des Char-Arrays (String gibt’s in C nicht) t in s liefern. Tut sie ganz bestimmt auch. Aber wir fassen mal fix die verwendeten Variablen zusammen: s, t, i, j, k.
Ganz ehrlich: Da sieht doch kein Schwein durch. Es liegt nicht daran, dass ich nicht verstehe, was da steht, denn das tue ich. Aber mal ganz ehrlich: Jedes andere Buch hat mir erstmal vermittelt ordentliche Namen für Variablen zu vergeben. Einige haben sogar noch verlangt eine Typabkürzung voranzustellen. s, t, i, j, k sind da jetzt wirklich nicht die Erleuchtung und ich finde den Stil hier tatsächlich schlecht. i, j, k kann ich sogar noch verschmerzen, weil es Zählvariablen sind und ein ordentlicher Name hier vielleicht sogar etwas schwierig zu finden ist. Warum s und t aber s und t heißen müssen ist mir ein Rätsel.
Lustig finde ich auch, und das wird im Beispiel von oben gar nicht mehr deutlich, weil ich die „Fehler“ schon selbst behoben habe beim Schreiben, dass die Herren sich nicht an Ihre eigenen Ratschläge halten. Denn eine Regel die sinngemäß „Der Übersicht halber platzieren wir vor und nach Vergleichs- und Zuweisungsoperatoren ein Leerzeichen.“ lautet wird hier mal angewendet und mal wieder nicht. Gleiches gilt für die Forderung eines einheitlichen „Klammersetzungsstils“. All diese Feinheiten, machen die Beispiele zum Teil unleserlich bis unlesbar und verleiten einen dazu, dass Buch auch mal halbwegs gefrustet zu schließen.
Fazit bis Seite 70: Von den „Erfindern“ der Sprache C hätte ich etwas mehr erwartet.
Update der Binäruhr
Meine Binäruhr für Windows Mobile (B1n4ry) hat eine kleines Update spendiert bekommen. Es sind keine neuen Features hinzugekommen, aber ich habe ein, zwei Fehler behoben und Änderungen vorgenommen:
Bugfix: Anwendung lässt sich jetzt im Landscape Modus starten
Bugfix: Close-Button wird jetzt nach Wechsel des Orientierungsmodus ordentlich dargestellt
Änderung: Digitale Uhr wird nicht mehr angezeigt
Änderung: Close-Button Grafik wurde ausgewechselt. Die neue ist nicht mehr so „aufregend“.
Der Download wurde aktualisiert und findet sich hier:
PS: Die Größe der cab-Datei ist um etwa 3 KB gesunken.
Binary Clock für Windows Mobile
Ich habe als Auftragsarbeit für jemanden von nebenan eine Binäruhr geschrieben, die jetzt fertig ist.
Das Programm hat noch 2 Bugs, die ich gestern in meiner Nacht & Nebel Aktion nicht mehr ausmerzen wollte. Beide sind aber nicht wirklich ein Problem. Der erste tritt beim Beenden der Anwendung auf. Das Startmenü bleibt dann z.T. mit den Grafiken der Anwendung überlagert, obwohl diese bereits geschlossen wurde. Das Problem lässt sich beheben indem man einmal vom Landscape in den Portrait (bzw. andersrum) wechselt und wieder zurück (oder ganz böse: einfach Windows Mobile neu starten – aber das ist nur nötig, wenn man aus welchen Gründen auch immer nicht den Orientierungsmodus wechseln will/kann)
Das zweite Problem tritt auf, wenn man während die App läuft den Orientierungsmodus ändert. Dort hilft einmal auf den Ausknopf drücken und nochmal, um das Bild wiederherzustellen.
Installer gibt’s nicht. Wer ne Binäruhr versteht, wird schlau genug sein, ne CAB zu installieren *gg*.
Büdde.
PS: Benötigt wird das .Net Compact Framework 2.0.
Netbeans Visual API Patch. Wer hätte das gedacht?
Ich jedenfalls nicht. Tatsächlich ist das Problem aus meinem letzen Beitrag mit nur 3 kleinen Eingriffen behoben. Die Aufrufe des Algorithmus auskommerntiert und fix ein
return ROUTER_DIRECT;
hinterher. Funktioniert wunderbar, auch wenns natürlich nicht so ein Augenschmaus ist. Aber ich denke es wird allen Betroffenen Gold wert sein, in Zukunft 99% weniger Prozessorauslastung beim Bearbeiten der entsprechenden Programme zu haben.
Frohes schaffen ;)
Download
Der Build setzt auf einen Snapshot von gestern auf. Getestet mit Netbeans 6.1 Beta.
PS: Wo die Datei hinmuss eröffnet eine Suche nach dem Dateinamen im Netbeans Ordner :).
The only IDE I ähh
Gängige IDEs werben immer mit großen Worten. Produktivität und Flexibilität: das sind Worte bei denen das Herz eines Entwicklers doch wirklich höher schlägt, nicht wahr nicht wahr? Netbeans setzt sogar noch einen drauf und behauptet es sei die einzige IDE, die ich bräuchte. Tatzbarsache? Derzeit geht mir Netbeans primär verdammt auf den Keks mit einigen designtechnischen Schnörkeln, die so gar nichts mit Produktivität zu tun haben. Aber erstmal von Anfang an:
Für mein Projekt LophanMobile, ein kleines Mathematikprogramm für Mobiltelefone und PDAs mit Java Unterstützung, nutze ich Netbeans 6, weil es einen verdammt coolen GUI Editor mitbringt und von Haus aus z.b. Lokalisierungsunterstützung mitbringt. Das nimmt mir einiges an Arbeit ab (ich gebs ja zu).
Betrachtet man Netbeans von dieser Seite, ist es faktisch makellos. Probleme gibt’s erst, wenn so ein Projekt etwas größer wird. Wie gesagt gibt’s einen GUI Editor. Dieser Editor bringt auch einen sogenannten Flow-Designer mit, der alle Elemente über eine kleine Verbindungslinie zusammenbringt die etwas miteinander zu tun haben. Wenn ich also ein Hauptmenü habe und über einen Eintrag ins nächste Menü will, zieh ich einfach ne Linie vom Menüeintrag rüber zum anderen Menü. Fertig. Klingt einfach: Ist es auch. Diese Linien haben aber einen „Haken“. Weils schön aussehen soll sind diese Linien nämlich nicht einfach streng durchgezogen, sondern haben jeweils 2 rechte Winkel. Die Netbeans Freaks von nebenan nennen den „orthogonal router“. Sollte mich eigentlich nicht interessieren. Tut es aber. Denn bei größeren Anwendungen schickt der entsprechende Algorithmus, der die Ecken sucht, Netbeans in den Winterschlaf. Warum? Weil er scheiße ist. Anders kann ichs nich nennen, wenn ein Stückchen Programmcode, der an ein paar Linien ein paar Ecken sucht, einen Dual Core Rechner in die Knie zwingt und Netbeans selbst für bis zu 20 Sekunden einfriert. „slow“ ist dafür gar kein Ausdruck mehr und unter „Performance“ würde ich wahrscheinlich sowas auch nicht mehr kategorisieren. Die überwältigende Erklärung der Entwickler:
Unfortunately we do not have a good incremental orthogonal router
algorithm.
Was echt? Hätte ich jetzt *so* gar nicht mitbekommen.
Lösungvorschläge?
1) During animation of graph-layout, temporarily disable routing of connections.
2) Introduce a new/faster orthogonal routing algorithm.
Ja! Besonders 2) haut mich völlig aus den Socken! Danke für den Input! ……narf
So wie ich das sehe wird dieser Bug auch in Netbeans 6.1 nicht korrigiert sein, obwohl er schon seit Oktober 2007 bekannt ist.
Derzeit bastel ich selbst an einem Patch für Netbeans, der die Anfrage nach „orthogonal routers“ faktisch ignoriert und nur „direct router“ zurückgibt. Wer Interesse hat kann hier bei Zeiten nochmal vorbeischaun.
muhahaha
(01:12:09) Matschfleck: zähl mal bitte die F in dem text hier
FINISHED FILES ARE THE RE-
SULT OF YEARS OF SCIENTIF-
IC STUDY COMBINED WITH THE
EXPERIENCE OF YEARS
Private Sub Command1_Click()Dim x As Integer, i As IntegerFor i = 1 To Len(Text1.Text)If Right(Left(Text1.Text, i), 1) = "F" Thenx = x + 1End IfNext iMsgBox xEnd Sub
Mod? Was das?
Es gibt ja so manchem Befehl den man ab und zu vergisst (vielleicht auch berechtigterweise), die Modulardivision aka Restwertdivision sollte in den Programmiersprachen aber definitiv nicht dazu gehören. Ansonsten bricht man sich mal schnell n Bein mit sowas:
Format((Time - (((Time \ 3600) * 3600) + (((Time - ((Time \ 3600) * 3600)) \ 60) * 60))), "00")
Nur so zur Erklärung: Diese Zeile sollte aus einer Zahl (Zeit in Sekunden) die Sekunde rausrechnen und das unter Abzug von Stunden und Minuten. Bei Einer Zahl von 8652 wäre als 12 rausgekommen (8652 – 2 * 3600 – 24 * 60). Das „\“ steht übrigens für keine normale Division sondern für eine Ganzzahldivision, bei der alles nach dem Komma abgeschnitten wird (ohne auf- oder abrunden). Deswegen ergibt Time \ 3600 * 3600 auch einen Sinn, im Gegenteil zu Time / 3600 * 3600.
Tja. Dumm gelaufen :). Aber jetzt hab ich’s ja zum Glück ^^.
Die Konfiguration ist noch nicht simpel, aber sie ist machbar mit ein wenig Denke. Wer will kann gerne eine entsprechende Oberfläche bauen, ich habe dafür keine Zeit ;).Trotzdem eine kurze Erläuterung: