Sunday, June 22. 2008
Learned basic C++ from an inadequate tutorial.
#include <iostream.h> using namespace std; // thanks, joe void main(int argc, char** argv) { cout << "Hello, world!" << endl; }
Learned basic C++ from a slightly better tutorial.
#include <iostream> using namespace std; int main(int argc, char* argv[]) { cout << "Hello, world!" << endl; return 0; }
Learned about namespace pollution.
#include <iostream> int main(int argc, char* argv[]) { std::cout << "Hello, world!" << std::endl; return 0; }
Learned about classes.
#include <iostream> #include <string.h> class Hello { private: char* msg; public: Hello() { this->msg = strdup("Hello, world!"); } ~Hello() { delete this->msg; } char* hello() { return this->msg; } }; int main(int argc, char* argv[]) { Hello* hello = new Hello(); std::cout << hello->hello() << std::endl; delete hello; return 0; }
Learned about the C++ string container.
#include <iostream> #include <string> class Hello { private: std::string msg; public: Hello() { this->msg = "Hello, world!"; } std::string hello() { return this->msg; } }; int main(int argc, char* argv[]) { Hello hello; std::cout << hello.hello() << std::endl; return 0; }
Found out about the STL.
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../include/c++/4.3.1/bits/ios_base.h: In copy constructor ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’: /usr/lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../include/c++/4.3.1/bits/ios_base.h:783: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private /usr/lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../include/c++/4.3.1/iosfwd:52: error: within this context /usr/lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../include/c++/4.3.1/iosfwd: In copy constructor ‘std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)’: /usr/lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../include/c++/4.3.1/iosfwd:61: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’ first required here test.cpp: In function ‘int main(int, char**)’: test.cpp:7: note: synthesized method ‘std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)’ first required here test.cpp:7: error: initializing argument 3 of ‘_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Funct = std::basic_ostream<char, std::char_traits<char> >]’ /usr/lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../include/c++/4.3.1/bits/stl_algo.h: In function ‘_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Funct = std::basic_ostream<char, std::char_traits<char> >]’: test.cpp:7: instantiated from here /usr/lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../include/c++/4.3.1/bits/stl_algo.h:3791: error: no match for call to ‘(std::basic_ostream<char, std::char_traits<char> >) (char&)’
Mastered the basic containers of the STL.
#include <iostream> #include <string> #include <vector> int main(int argc, char* argv[]) { std::string hello = "Hello, world!"; std::vector<char> v; for (unsigned int j = 0; j < hello.length(); ++j) { v.push_back(hello[j]); } std::vector<char>::iterator i; for (i = v.begin(); i != v.end(); ++i) { std::cout << <strong>i; } std::cout << std::endl; return 0; }
Mastered the STL.
#include <iostream> #include <string> #include <algorithm> class printc { public: void operator() (char c) { std::cout << c; } }; int main(int argc, char</strong> argv[]) { std::string hello = "Hello, world!"; std::for_each(hello.begin(), hello.end(), printc()); std::cout << std::endl; return 0; }
Read the C++ FAQ Lite and realized C++ mastery is impossible.
#include <iostream> int main(int argc, char* argv[]) { std::cout << "Hello, world!" << std::endl; return 0; }
Read the C++ FQA Lite.
#include <stdio.h> int main(int argc, char* argv[]) { printf("Hello, world!\n"); return 0; }
Heard of 4chan and wound up in /b/.
HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE
Found a replacement for /b/ after finding it overrun by ``cancer'' and ``newfags.''
One word, the forced indentation of code. Thread over. Also, read SICP!
Read SICP after months of telling people to read SICP.
(display "Hello, world!") (newline)
Achieved Satori after re-reading SICP every day for many years.
void main() { puts("Hello, world!"); }
(gefunden irgendwo auf 4chan, Dank an nion)
Thursday, January 31. 2008
Der neueste Hype ist Arc, ein Lisp-Dialekt. Und naja, was soll man dazu sagen? I went to a talk last summer by Guido van Rossum about Python, and he seemed to have spent most of the preceding year switching from one representation of characters to another. I never want to blow a year dealing with characters. Why did Guido have to? Because he had to think about compatibility. But though it seems benevolent to worry about breaking existing code, ultimately there's a cost: it means you spend a year dealing with character sets instead of making the language more powerful.
Which is why, incidentally, Arc only supports Ascii. Die allergrößte Mehrzahl aller natürlichen Sprachen lassen sich nicht mit dem Zeichensatz, den ASCII bietet, notieren. Damit schließt Paul Graham, der Autor von Arc, schon einmal von vornherein jegliche Lokalisierungs- und Internationalisierungsbemühungen aus. Wer Lisp verwenden will, der greife lieber zu CLisp, die denken nämlich an I18N/L10N. Lokalisierte Software für wachsende Zukunftsmärkte wie Indien oder China lässt sich mit Arc nämlich nicht entwickeln (naja, schon, aber wer will schon manuellen Lisp-Code für diverse Character Encodings schreiben?).
Enjoy your FAIL, Paul.
Thursday, January 24. 2008
Ich wurde heute abend in der Linzer Straßenbahn von einer Kontrolleurin mit deutlich sächselndem Dialekt kontrolliert ("Tach, die Fahrscheine bitte!"). Willkommen, Gastarbeiter aus Deutschland! Wie arm muss es euch gehen, wenn ihr so einen Unterschichtenberuf (und wer die Linzer Kontrolleure kennt, weiß, was ich meine) im Ausland annehmt?
Wednesday, January 23. 2008
...als Beispiel für schlechten Code (das hier ist aus local-fetch.c): static const char *path; /* ... */ char filename[PATH_MAX]; strcpy(filename, path); strcat(filename, "/objects/pack/pack-"); strcat(filename, sha1_to_hex(sha1)); strcat(filename, ".idx"); /* ... */ int main(int argc, const char **argv) { /* ... */ path = argv[arg];
Warum muss ich bloß ca. 5 Sekunden grep(1)en, um ein ideales Codebeispiel zu finden, wie man mit Strings, Pfaden und User Input nicht umgeht in C?
Update: weil gefragt wurde, wie's richtig geht, hier noch die Auflösung: char filename[PATH_MAX]; snprintf(filename, sizeof(filename), "%s/objects/pack/pack-%s.idx", path, sha1_to_hex(sha1));
Das ist nicht nur sicherer, sondern auch kompakter und lesbarer. Nein, ich werde keinen Patch submitten.
Sunday, November 18. 2007
Ich hab mir grad den Spaß gemacht, mit Google Translate das zu übersetzen, was Borland Japan über den SilkPerformer 2007 schreibt. Google Translate hat anscheinend die Eigenschaft, Wörter, die es nicht kennt, in ihrer Transkription in lateinischen Großbuchstaben auszugeben. Im Inhalt der verlinkten Seite war das besonders interessant, da offenbar einige englische Begriffe bzw. Eigennamen in japanischen Schriftzeichen niedergeschrieben wurde. Eine Auswahl der Wörter, die ich so gefunden habe, und meine, die Bedeutung erkannt zu haben: - Borland SHIRUKUPAFOMA 2007 (ボーランド・シルクパフォーマー 2007) - Borland SilkPerformer 2007
- TESUTOSORYUSHON (テストソリューション) - test solution
- YUZARAISENSUPAKKU (ユーザーライセンスパック) - user license pack
- KODOKABAREJJITSURU (コードカバレッジツール) - code coverage tool (das hab ich allerdings auf der Produktseite zu "Silk & Gauntlet" gefunden)
- ROKARIZESHONTESUTO (ローカリゼーションテスト) - localization test (von der SilkTest Produktseite)
- TESUTOKABAREJJI (テストカバレッジ) - test coverage (von der SilkCentral Test Manager Produktseite)
- SUKURIPUTOREKODA (スクリプトレコーダ) - script recorder
- WAKUFUROUIZADO (ワークフローウィザード) - workflow wizard
Sehr witzig.
Tuesday, October 23. 2007
Auf die wirklich ekligen Sachen kommt man erst drauf, wenn man versucht, Unix-Legacy-Code auf einem aktuellen Linux oder OSX zum Laufen zu bringen. Da bin ich z.B. draufgekommen, dass es in C unter Linux ein Symbol "end" gibt (wer es zur Verfügung stellt, konnte ich ad hoc nicht rausfinden), auf jeden Fall muss man es nur deklarieren, und schon ist es verwendbar: #include <stdio.h> extern char end[1]; int main(void) { return 0; }
Draufgekommen bin ich darauf nur, weil ich sort(1) von Ultrix-11 auf Linux portiert habe, und diesen Code wiederum unter OSX zum Laufen bringen wollte. Und dabei ist mir folgender Code untergekommen: #define MEM (16*2048) /* ... */ char *ep; /* ... */ ep = end + MEM; /* ... */ while((int)brk(ep) == -1) ep -= 512; #ifndef vax brk(ep -= 512); /* for recursion */ #endif
Dieser Code legt nahe, dass "end" das aktuelle Ende des Datensegments enthält, und obiger Code holt sich das Ende, zählt einen großen Betrag (für damalige Zeiten...) dazu, und verringert ihn solange um 512 (welche Einheit?), bis brk(2) OK gegangen ist, und das Datensegment vergrößert ist. Sowas ist in Zeiten von 4GB+ RAM und Memory Overcommitment natürlich höchst obsolet. Trotzdem ist es bemerkenswert, wie damals(tm) noch programmiertechnisch gearbeitet wurde.
Monday, October 22. 2007
Update: nachdem das nicht 100%ig klar rauskommt, ich bin der Absender.
Friday, August 3. 2007
Ein Internet meme, das man in letzter Zeit öfters antrifft, und an dem ich großen Gefallen gefunden habe, sind Lolcats. Katzencontent fand ich ja bisher eigentlich ziemlich lahm, mit den Lolcats ist das ganze doch ziemlich amüsant geworden. Die klassischen Quellen sind lolcats.com, lolcats2.com (leider down derzeit) und icanhascheezburger.com.
Monday, June 18. 2007
Nach den Herren fh und Dennis Sevriens (via law blog) hat das BKA auch bei mir vorbeigeschaut - zumindest sieht es so in den Apache-Access-Logs aus. Konkret hat sich da jemand für diesen Artikel interessiert. Das ist übrigens auch der einzige Artikel, in dem ich das BKA namentlich erwaehne. Ob's ein Fake ist? Wer weiß... ob das terroristisch relevant ist, wird sich dann spaetestens zeigen, wenn ich das naechste mal nach Deutschland einreise.
Wednesday, June 6. 2007
Ich hab mir gestern den Spaß erlaubt, und ein paar ncurses-Applikationen gefuzzt. Fuzz testing ist eine Testmethode, bei der man ein Programm mit zufälligen Eingaben "beschießt", und schaut, wie das Programm reagiert, insbesondere, ob es abstürzt. Besonders im Security-Bereich ist in letzter Zeit Fuzz testing relativ beliebt geworden, vor allem weil es ziemlich "billig" ist, einen derartigen Test aufzusetzen, und die Chance, Bugs und insbesondere Buffer Overflows zu finden, relativ hoch ist (man erinnere sich nur an diesen Fall).
Auf jeden Fall hab ich snownews und raggle, meine zwei (featuremäßig unterlegenen) "Konkurrenten" in Sachen RSS-Feedreader für die Textkonsole, mal mit einem simplen "cat /dev/urandom | snownews" bzw. "cat /dev/urandom | raggle" gefuzzt, und beide sind so richtig schön gestürzt, snownews mit einer NULL-Pointer-Dereferenzierung, und raggle mit einem Methodenaufruf auf ein nil-Objekt (raggle ist ja in Ruby geschrieben; auf jeden Fall ist der Fehler konzeptionell ähnlich zu einer NULL-Pointer-Dereferenzierung). Na, was hab ich gelacht.
Zugegeben, wenn man das gleiche mit newsbeuter macht, schmiert der auch schön ab, aber daran bin nicht ich schuld, sondern ncurses.
Ein paar andere Applikationen hab ich auch so nebenbei getestet, so etwa slrn (der ist ganz cool, ignoriert stdin, und macht sich stattdessen /dev/tty auf), mutt (der interpretiert Daten auf stdin, wenn stdin kein TTY ist, als Input für ein Mail), centericq (der interpretiert den Datenmüll als normale Eingabe, stürzt aber nicht ab) und vim (der warnt, dass stdin kein TTY ist, läuft aber auch durch).
Thursday, May 3. 2007
Heute beim "Abpfiff" gewesen... der Abpfiff bei der Freistädter Brauerei ist ein "all you can drink"-Event, wo man EUR 6,- zahlt, was zu essen und ein Pfiff-Glas kriegt, und sich soviel Bier hinter die Binde kippen kann, wie man will, zumindest zwei Stunden lang. In den zwei Stunden hab ich immerhin 13 getrunken, und 14 gezapft. Dementsprechend geht's mir auch.
Monday, April 30. 2007
Wieder mal ein wirklich lustiges Wochenende... mit den Ska Bucks nach Neusserling gefahren, und dort eine nette Zeit auf dem Noppen Air verbracht, jede Menge Fotos geschossen, und auch wieder das eine oder Video gemacht, und alle Annehmlichkeiten, die so ein Backstage-Ausweis mit sich bringt, ordentlich ausgekostet. Das Noppen Air ist einfach noch ein sympathisches kleines Festival, wo genug aber nicht zuviel los ist, wo alle Leute ziemlich gemuetlich drauf sind und wo man mit Backstage-Ausweis wie ein Koenig behandelt wird. Nach mehr als 9 Stunden Festival, geschaetzen 7 Bieren und 4 Caipirinhas haben wir dann wieder die Heimreise angetreten. Und naechstes Wochenende geht's schon wieder wo hin, dann auf's " Halabaluza" nach Markersdorf/St. Pölten.
|