tag:www.stefanwienert.net,2008:/posts Stefan Wienert's Blog 2012-01-11T18:42:14Z Enki Stefan Wienert stwienert@gmail.com tag:www.stefanwienert.net,2008:Post/75 2012-01-11T16:42:00Z 2012-01-11T18:42:14Z Effektive Corporate Website mit Drupal und Installationsprofilen <p>Um eine typische Unternehmensseite halbwegs modern und effektiv umzusetzen, eignet sich das relativ neue Drupal 7 ideal.</p> <p>Dazu gibt es einen super-effektiven, fertigen Baukasten (Installationsprofil) bei Github (https://github.com/juampy72/corporative-site), der allerhand coole Module mitbringt und gescheit konfiguriert: File-Upload, <span class="caps">WYSIWYG</span>-Editor, lesbare URLs, sitemap, robots.txt</p> <p>Hier ein Mini-Guide um Drupal 7 mit diesem Profil mit einer deutschen Übersetzung zu installieren an einem Beispiel-Plesk/Debian System:<br /> <pre><code> cd httpdocs git clone git://github.com/juampy72/corporative-site.git . chown www-data sites/default/ -R</p> <p>mkdir -p profiles/corporative_site/translations<br /> cd profiles/corporative_site/translations<br /> wget http://ftp.drupal.org/files/translations/7.x/drupal/drupal-7.10.de.po<br /> </code></pre></p> <p>Danach die Seite im Browser öffnen und den Installationsanweisungen folgen.</p> <p>Ein schönes Theme für Corporate Seite ist, wie ich finde <a href="http://drupal.org/project/corporateclean">Corporate-Clean</a>.</p> tag:www.stefanwienert.net,2008:Post/74 2011-10-21T03:13:00Z 2011-10-21T05:13:11Z Was tun bei Inspirationsverlust? So bekämpfte ich mein Programmier-Down <p>Wer kennt das nicht? Man sitzt vor dem Bildschirm und will eigentlich etwas arbeiten, aber irgendwie kann man sich nicht aufraffen. Sei es nun ein <strong>Flash</strong>-Spielchen (I hate you, dear kongregate!) oder <strong>Facebook/Twitter/G+</strong>, irgendetwas ist immer interessanter. Und es wird immer schlimmer: Je länger man das Arbeiten duch Ablenkungen verzögert, desto eher bekommt man ein schlechtes Gewissen und verliert sich immer mehr in die Ablenkungen&#8230; Auch mir geht es alle Tage wieder so. Mit der Weile habe ich ein paar Tätigkeiten gefunden, mit denen ich diesen Teufelskreis anscheinend stoppen kann.</p> <h2>Aktivitäten</h2> <ul> <li>technische Filmchen schauen: Wenn ich einen Konferenz-Talk oder Screencast schau, der technisch mit der Arbeit relevant ist, dann passiert es nicht selten, dass etwas von dem berüchtigten und benötigten Geek-Spieltrieb zurückkommt. Dies passiert besonders, wenn das Video interessant und kurzweilig gestaltet ist. Lightning-Talks z.B. Eine gute Quelle (für Ruby oder Agile Programmierer) ist <a href="http://confreaks.net">Confreaks</a>, welches Mitschnitte zu nahezu allen Ruby-Konferenzen anbietet, oder natürlich die fantastischen Screencasts von <a href="http://railscasts.com">Railscasts</a>. Für Programmierer aller Gattung kann ich das Anschauen (und selbermachen!) von Code-Katas, also sehr kurzen Programmieraufgaben, empfehlen, z.B. <a href="http://vimeo.com/channels/katacasts">Katacasts</a></li> <li>Ein Buch lesen. Beim Lesen von &#8220;The Passionate Programmer&#8221; oder &#8220;The Pragmatic Programmer&#8221; kamen mir viele neue Ideen, die ich gleich umsetzen musste.</li> <li>Make a little change: Keine Lust, gerade am Legacy-System einen größeren Eingriff vorzunehmen? Dann erstmal einen kleinen Bug fixen. Oder ein Styling verbessern. Oder ein Codestück refaktorisieren. Oder ein kleines <span class="caps">CLI</span>-Tool schreiben, welches ein Stück Arbeit erleichtert, oder oder oder&#8230;</li> <li>Linux booten: Es gehen wenige Spiele, Flash ruckelt&#8230; Nur FB,Twitter und co. sind noch erreichbar. Im Einzelfall noch das Internet abdrehen und die Langeweile verselbstständigt sich in Form von Code.</li> <li>Ehm.. Rausgehen :) Menschen treffen, Sport treiben. Für den Vollblut-Informatiker natürlich nur die Ultima ratio. Soll aber helfen&#8230; habe ich gehört :)</li> </ul> <h2>Neu gewonnene Aktivität in Produktivität pipen</h2> <p>Einmal angefangen mit &#8220;rumgeeken&#8221; ist es ein leichtes den Arbeitsenthusiasmus in die gewünschte Richtung zu lenken, um z.B. die leicht ins Hintertreffen geratene Diplomarbeit mal ein Stück vorran zu bringen, oder dieses sehr sehr lange offene Ticket mal anzugehen (welches dann wesentlich kurzer als gedacht gedauert hat &#8212; *aus-Erfahrung-sprech)</p> tag:www.stefanwienert.net,2008:Post/73 2011-09-04T06:34:00Z 2011-09-04T12:34:29Z Hochqualitatives Code Highlighting in Latex mit Pygments <p>Beim Erstellen meiner Diplomarbeit bin ich grad am Tüffteln, wie die Code-Beispiele schöner gemacht werden könnten. Die bekannten Listings sind relativ beschränkt und sehen auch nicht so umwerfend aus.</p> <p>Abhilfe schafft das Python Tool &#8220;pygments&#8221;, dass ein Syntaxhighlighter darstellt. Unter Ubuntu lässt sich dieser leicht nachinstallieren:</p> <h3>Pygments</h3><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">sudo apt-get install python-pygments <tt> </tt></pre></td> </tr></table> <p>Nun generiert das Kommando:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">pygmentize -O full -f latex -l ruby DATEI.rb<tt> </tt></pre></td> </tr></table> <p>aus der angegebenen Datei ein Codehighlighting für Ruby (pygments kann fast alles).</p> <p>Beispiel: <a href="/files/pygments.pdf" >job_test.rb.pdf</a></p> <h3>Initialisierung der Pygments Makros</h3> <p>Dabei gibt es den ganzen initialen Teil, den wir irgendwo in unserem Latex-Header, einmal einbinden müssen, am besten in einer eigenen Quelltextdatei, z.B. &#8220;syntax.tex&#8221;:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">\usepackage{fancyvrb}<tt> </tt>\usepackage{color}<tt> </tt>\makeatletter<tt> </tt>\def\PY@reset{\let\PY@it=\relax \let\PY@bf=\relax%<tt> </tt> \let\PY@ul=\relax \let\PY@tc=\relax%<tt> </tt> \let\PY@bc=\relax \let\PY@ff=\relax}<tt> </tt>... usw. die ganzen Defs aus dem Pygments Output<tt> </tt></pre></td> </tr></table> <p>Die Datei dann noch im Header unseres Master-Tex Dokuments einbinden:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">\include{syntax}<tt> </tt></pre></td> </tr></table> <p>Der Teil im &#8220;\begin{Verbatim}&#8221; ist der eigentliche Code, den wir an die entsprechende Stelle in unserem Textfluss kopieren können.</p> <h3>Finetuning: Zeilennummern, Rahmen, Caption und Eintrag in LoL (List of Listings)</h3> <p>Allerdings lässt sich dieser noch tunen, da er z.B. noch keine Labels hat, und auch keine Einträge im Listings Verzeichnis hinterlässt.</p> <p>Dies habe ich so gelöst:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">\DefineVerbatimEnvironment{pygments}{Verbatim}{numbers=left,frame=single,stepnumber=1,numbersep=1pt,<tt> </tt>commandchars=\\\{\}}<tt> </tt><tt> </tt>\newenvironment{codeenv}{<tt> </tt>\begin{minipage}{\textwidth}<tt> </tt>\captionsetup{type=lstlisting}<tt> </tt>}{\end{minipage}}<tt> </tt></pre></td> </tr></table> <p>Nun können wir Codeteile mit Captions und Labels machen:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">\begin{codeenv}<tt> </tt> \begin{pygments}[label={lib/src/datei\_test.rb}]<tt> </tt> \PY{n+nb}{require} \PY{l+s+s1}{'test\PYZus{}helper'}<tt> </tt> ( hier dann der ganze Kladderadatsch vom Pygements.... )<tt> </tt> \end{pygments}<tt> </tt>\caption{Listing Test}<tt> </tt>\end{codeenv}<tt> </tt></pre></td> </tr></table> <p>Das Ergebnis sieht dann in der Gegenüberstellung so aus:<br /> <a href="/files/syntax-complete.pdf" >syntax-complete.pdf</a></p> <p>Ich hoffe das erspart dem einen oder anderen ein paar Stunden suchen und probieren :)</p> tag:www.stefanwienert.net,2008:Post/72 2011-06-18T05:50:00Z 2011-06-18T09:50:01Z Free Chinese learning app - Introduction of my Web app <p>Today, I want to introduce my online web-app for learning Chinese vocabulary. I wrote this some weeks ago, and until now I had a lot of fun, which I want to share with all the other Chinese learners.</p> <p>For demonstration, I created a short screencast to show how easy it is to use.</p> <p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/iwSKzGhCDDE?hl=de&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/iwSKzGhCDDE?hl=de&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p> <p>In my opinion, this app helps a lot for a systematical learning of words</p> <p>If you are a learner of the Chinese language, and also waste a lot of papers to train the writing, <a href="http://shufa.stefanwienert.net">give it a try!</a></p> <p>Languages available:</p> <ul> <li>English: Interface and word database</li> <li>German: Interface language only. Unfortunatly, I only found free-to-use dictionaries in English up to now.</li> </ul> <p>Browsers tested:</p> <ul> <li>Firefox 4</li> <li>Chrome 13+</li> </ul> <p>I am heavily motivated, to improve that app, so if you find any glitches or have some ideas, tell me at info@stefanwienert.net. <br /> Coders can also send in bugreports (and bugfixes) at <a href="https://github.com/zealot128/ShuFaZuoPin">GitHub</a></p> tag:www.stefanwienert.net,2008:Post/71 2011-06-17T09:23:00Z 2011-06-17T11:23:03Z Für Programmierer: Syntaxhighlighting für alle textareas als Bookmarklet <p>Den fantastischen Javascript-basierten Editor &#8220;<span class="caps">ACE</span>&#8221;, früher als Mozilla Bespin bekannt, kann man auf allen Webseiten bequem als Bookmarklet einbinden.<br /> So hat man Syntaxhighlighting und einen brauchbaren Editor, um Miniskripte oder <span class="caps">HTML</span> online zu bearbeiten &#8211; schnell für beliebige Textarea-Formularfelder.</p> <p><a href="http://ajaxorg.github.com/ace/build/textarea/editor.html">Ace-Bookmarklet</a></p> <p>Wichtig: Zum Aktivieren 3x auf die gewünschte Textarea klicken.</p> tag:www.stefanwienert.net,2008:Post/70 2011-06-08T04:40:00Z 2011-06-08T06:40:54Z Rails for Zombies - Braaainz <p>Wer schon immer mal Ruby on Rails lernen wollte, aber nie den Einstieg oder die Zeit gefunden hatte, für den gibt es jetzt <strong>Rails for Zombies</strong>.</p> <p>Didaktik mal total anders. Statt drögen nie endenden Tutorials, gibt es eine mit vielen Videos angereichtere &#8220;Lern-Experience&#8221;. Dabei haben die Macher neben den Lektionen direkt jeweils eine Aufgabe, die es in einer Ruby-artigen Live-<br /> Console zu lösen gibt!</p> <p>Achja, umsonst ist das auch noch! Geld verdienen wollen die Macher envylabs mit Folgetutorials in derselben Güte, die in der selben Qualität ausfallen dürften.</p> <p>Free from <span class="caps">PHP</span> now! Let&#8217;s go ;)</p> <p><a href="http://railsforzombies.org/">railsforzombies.org</a></p> tag:www.stefanwienert.net,2008:Post/69 2011-06-06T19:53:00Z 2011-06-07T05:50:47Z Relaunch - Neues Design und neue Technik <p>Hat wahrscheinlich niemand bemerkt: Ich habe über das Wochenende die Seite offline genommen um den drunter liegenden Server mal gehörig aufzuräumen, um nicht zu sagen, neu zu installieren.</p> <p>Wozu das ganze? Ich habe mir mal Zeit genommen und den Mailserver, sowie ein ordentliches Rails-Setup, mit dem man arbeiten kann, eingerichtet. Das ganze dient dazu, ein anstehendes Projekt zu hosten, <strong>shufazuopin</strong>, eine neue Rails31 Anwendung, zum spaßigen Einpauken der chinesischen Zeichen.</p> <p>Dann hab ich noch eine neue Blogengine eingebaut und meine Posts vom alten, sowie dem Blog meiner Chinareise befüllt. Kommentare sind deaktiviert, da ich sonst im Spam ersticke.</p> <p>Ich hoffe das Design gefällt :) Sollte auf halbwegs moderenen Browsern ordentlich laufen, keine Garantie für Microsoft Produkte!</p> tag:www.stefanwienert.net,2008:Post/62 2011-05-03T03:30:00Z 2011-05-03T05:30:33Z How To: Setup Android IDE with SDK, NDK for OpenCV <i>Gastbeitrag von Sebastian Starke</i><p>This tutorial will give a brief overview about the installation and configuration of the opencv Framework for Android.</p> <p>The tutorial is tested for:</p> <ul> <li><span class="caps">SWIG</span>: Version 1.3.40 &#8211; Compiled with g++ [i686-pc-linux-gnu]</li> <li>Android-<span class="caps">SDK</span>: android-sdk_r10-linux_x86.tgz, Checksum: c022dda3a56c8a67698e6a39b0b1a4e0</li> <li>Android-<span class="caps">SDK</span> Platform-tools, revision 3</li> <li><span class="caps">SDK</span> Platform Android 2.2, <span class="caps">API</span> 8, revision 2</li> <li>OpenCV; Rev: 4962; <span class="caps">URL</span>: https://code.ros.org/svn/opencv/trunk/opencv; Autor: vp153</li> </ul> <h3>Reference documentations/tutorials:</h3> <ul> <li>http://android-cmake.googlecode.com/hg/documentation.html</li> <li>http://opencv.willowgarage.com/wiki/AndroidExperimental</li> <li>http://opencv.willowgarage.com/wiki/Android</li> </ul> <h3>Setup Ubuntu 11.04</h3><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">$ sudo apt-get install swig mercurial subversion cmake cmake-gui<tt> </tt></pre></td> </tr></table> <h3>Setup Android-<span class="caps">SDK</span></h3> <p>Download the android-sdk from:</p> <ul> <li>http://developer.android.com/sdk/index.html</li> </ul> <p>Unpack the Downloaded Package:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">$ cd ~/; tar xvzf android-sdk_r10-linux_x86.tgz<tt> </tt></pre></td> </tr></table> <p>Add this to your .bashrc:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">export ANDROID_SDK=~/android-sdk-linux_x86<tt> </tt>export PATH=$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$PATH<tt> </tt></pre></td> </tr></table> <p>Update your environment:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">$ . .bashrc<tt> </tt></pre></td> </tr></table> <p>Setup <span class="caps">SDK</span> and test the environment Variables:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">$ android<tt> </tt></pre></td> </tr></table> <ul> <li>Available Packages &#8594; Install at least the packages „Android-<span class="caps">SDK</span> Platform-tools“ and &#8220;<span class="caps">SDK</span> Platform Android 2.2&#8221;</li> <li>Virtual Devices &#8594; Create a new <span class="caps">AVD</span> (Android Virtial Device) with the Target &#8220;Android 2.2 &#8211; <span class="caps">API</span> Level 8&#8221;</li> </ul> <p>Add this to your .bashrc:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">export ANDROID_SDK=~/android-sdk-linux_x86<tt> </tt>export PATH=$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$PATH<tt> </tt></pre></td> </tr></table> <h4>Test your environment</h4> <p>Try hello-cmake:</p> <ul> <li>http://android-cmake.googlecode.com/hg/docs/hello-cmake.html<br /> Try hello-android-cmake:</li> <li>http://android-cmake.googlecode.com/hg/docs/hello-android-cmake.html</li> </ul> <h3>Setup Android-<span class="caps">NDK</span> 5</h3> <p>Add this to your .bashrc:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">export NDK=~/android-ndk-r5b<tt> </tt>export NDK_ROOT=~/android-ndk-r5b<tt> </tt></pre></td> </tr></table> <h3>Setup Android-Cmake</h3> <p>Add this to your .bashrc:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">alias android-cmake='cmake -DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN '<tt> </tt>export ANDROID_CMAKE=~/android-cmake<tt> </tt></pre></td> </tr></table> <h3>Setup standalone Android-Toolchain</h3> <p>Add this to your .bashrc:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">export ANDTOOLCHAIN=$ANDROID_CMAKE/toolchain/android.toolchain.cmake<tt> </tt>export ANDROID_NDK_TOOLCHAIN_ROOT=$HOME/android-toolchain<tt> </tt></pre></td> </tr></table> <p>Install the toolchain with:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">$NDK/build/tools/make-standalone-toolchain.sh --platform=android-5 --install-<tt> </tt>dir=$HOME/android-toolchain<tt> </tt></pre></td> </tr></table> <h2>Setup OpenCV</h2><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt>8<tt> </tt>9<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">cd ~/<tt> </tt>svn co https://code.ros.org/svn/opencv/trunk/opencv opencv-r4964 -r 4964<tt> </tt>ln -s ~/opencv-r4964 ~/opencv<tt> </tt># Build OpenCV Static Lib<tt> </tt>ln -s ~/android-ndk-r5b ~/android-ndk-r4-crystax<tt> </tt>cd ~/opencv/android<tt> </tt>sh cmake_android.sh<tt> </tt>cd ~/opencv/android/build<tt> </tt>make -j8<tt> </tt></pre></td> </tr></table> <p>If you get a error message like this <code>Compile error: something with gtest</code> fix it with:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">cmake-gui ...<tt> </tt></pre></td> </tr></table> <ul> <li>disable Google Test</li> </ul> <p>If you get a error like this <code>Compile error ~/opencv/modules/ts/src/ts_gtest.cpp:6950: clone not declared in this scope</code> fix it with:</p> <ul> <li>Edit the file <code>~/opencv/modules/ts/src/ts_gtest.cpp</code> and add the declaration of the function at line 6944:</li> </ul><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">int clone (int (*fn) (void *), void *child_stack, int flags, void *arg);<tt> </tt></pre></td> </tr></table> <h3>Build OpenCV Dynamic Lib</h3><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">cd ~/opencv/android/android-opencv<tt> </tt>sh cmake_android.sh<tt> </tt>cd ~/opencv/android/android-opencv/build<tt> </tt>make<tt> </tt>cd ~/opencv/android/android-opencv<tt> </tt>sh project_create.sh<tt> </tt></pre></td> </tr></table> <p>List available targets, so we can define it in the next step</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">android list target<tt> </tt></pre></td> </tr></table> <p>Edit „project_create.sh“ and add the Argument „&#8212;target 1“</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">ant compile<tt> </tt></pre></td> </tr></table> <p>If you get a error like this <code>Compile/Build Error: libraries not found!</code> fix it with:</p> <ul> <li>Edit the file <code>build.xml</code> and add the following lines just before the project closing tag <code>&lt;/project&gt;</code>:</li> </ul><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">&lt;path id=&quot;android.libraries.src&quot;&gt;&lt;path refid=&quot;project.libraries.src&quot; /&gt;&lt;/path&gt;<tt> </tt>&lt;path id=&quot;android.libraries.jars&quot;&gt;&lt;path refid=&quot;project.libraries.jars&quot; /&gt;&lt;/path&gt;<tt> </tt></pre></td> </tr></table> <p>Compile again:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">ant compile<tt> </tt></pre></td> </tr></table> <h3>Build CVCamera App</h3><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">cd ~/opencv/android/apps/CVCamera<tt> </tt>mkdir build<tt> </tt>cd build<tt> </tt>android-cmake ..<tt> </tt>cd ..<tt> </tt>ant compile<tt> </tt>ant install<tt> </tt></pre></td> </tr></table> <p><a href="http://www.stefanwienert.net/files/setup_android_with_opencv_tutorial.tar.gz">You can also download this tutorial in various formats (odt, pdf, html) for further reading.</a></p> <p><strong><span class="caps">YOU</span> <span class="caps">DID</span> IT! IT&#8217;S <span class="caps">DONE</span>, <span class="caps">FINISHED</span>! <span class="caps">LET</span> IT <span class="caps">ROCK</span> ;)</strong></p> tag:www.stefanwienert.net,2008:Post/61 2011-03-23T10:13:00Z 2011-03-23T11:13:56Z Grafikkarte unter Ubuntu gewechselt - Schwarzer Bildschirm <p>Letztens gab es bei uns im Büro neue Grafikkarten mit Multimonitorunterstützung. <br /> Leider waren 2 der Ubuntus davon wenig begeistert und landeten nach dem Booten in einem schwarzen Bildschirm ohne Möglichkeit eine Shell zu öffnen (Freeze?). Die Rettungskonsole im Sicheren Modus brachte auch nichts.</p> <p>Zu unseren Lösungen:</p> <p>Als erstes erstmal eine Shell aufkriegen: Dazu in den Bootloader <span class="caps">GRUB</span>, die aktuelle Startzeile bearbeiten (e) und in der langen Zeile mit dem linux-Kernel</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">linux-generic ..... ro quiet slash<tt> </tt>linux-generic ..... rw init=/bin/bash<tt> </tt></pre></td> </tr></table> <p>ro quiet splash durch rw init=/bin/bash austauschen. Nun sollte nach einem Starten eine Rootkonsole ohne Netzwerkzugriff starten.</p> <p>Man kann auch im minimalen Grafikmodus starten wennn man statt &#8220;ro quiet splash&#8221; &#8594; &#8220;nomodeset&#8221; einträgt.</p> <p>Falls man mittels Xorg.conf seine Bildschirme einstellte, lohnt sich evtl. ein Blick in diese und ein löschen alle Grafikkartenspezifischen Zeilen.<br /> Was bei neueren Ubuntuvarianten nicht mehr klappte, wohl aber bei alten und evtl anderen Linuxdistributionen ist ein Rekonfigurien der Xorgconf:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">dpkg-reconfigure -phigh xserver-xorg<tt> </tt></pre></td> </tr></table> <p>An anderer Stelle half es, alle alten Treiber der vorherigen GraKa zu deinstallieren:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">apt-get remove nvidia*<tt> </tt>apt-get remove radeon*<tt> </tt></pre></td> </tr></table> <p>In unserem Falle hat uns der Wikiartikel unter ubuntuusers-Wiki zu <a href="http://wiki.ubuntuusers.de/Grafikkarten/ati/radeon#Probleme">kms deaktivieren</a> weitergeholfen.</p> tag:www.stefanwienert.net,2008:Post/60 2011-02-20T14:24:00Z 2011-02-20T15:24:04Z "Auf Antrag hin wurde Ihnen eine Aufenthaltserlaubnis erteilt"... <p>Endlich ist es so weit, meine Frau hat eine Aufenthaltserlaubnis erhalten.</p> <p>Am letzten Montag (Valentinstag!) mussten wir beide zur Ausländerbehörde, und uns einer &#8220;Befragung&#8221;, d.h. Beantwortung eines 8-seitigen Fragebogens unterziehen.<br /> Dort wurde vom Gehalt des Ehepartners, über die Farbe des Teppichbodens bis hin zur Seite im Bett, in der man schläft, so allerhand gefragt, um eine &#8220;Scheinehe&#8221; auszuschließen&#8230;</p> <p>Manche Fragen waren richtig kniffelig:</p> <ul> <li>Was ist die Lieblingsfarbe, was ist das Lieblingskleidungsstück (<span class="caps">WTF</span>?? das kann ich nicht mal über mich beantworten) des Ehepartners.</li> <li>Nennen Sie drei Nachnamen Ihrer Nachbarn</li> <li>Was haben Sie sich zu ihren letzten Geburtstagen geschenkt</li> <li>Wieviel qm hat Ihre Wohnung</li> <li>Wer ist Ihr Vermieter</li> </ul> <p>Nun, anscheinend haben unsere Antworten aber gereicht, was uns doch sehr freut :).</p> <p>Ich glaube, ich muss nochmal den gesamten Werdegang einer &#8220;Eheschließung mit Auslandsberührung&#8221; wiedergeben&#8230;</p> <h3>Eheschließung mit Auslandsberührung (Chinas)</h3> <p>Im April letzten Jahres sind wir zum Standesamt gegangen, um eine &#8220;Eheschließung&#8221; zu beantragen. Zurück kamen wir mit einer ToDo-Liste, was alles zu besorgen sei:</p> <ul> <li>von mir: Einkommensnachweis und Perso</li> <li>von meiner Frau: Pass/Visum (ist klar), Ehefähigkeitszeugnis (Nachweis, dass man noch nicht verheiratet ist), Geburtsurkunde. Da sie schon in Deutschland wohnte, brauchte sie keinen Wohnnachweis (houkou).</li> <li>insg. ca. 100-150€ (weiss ich nicht mehr so genau)</li> </ul> <p>Klingt eigentlich machbar, oder? Nur dass es in China keine Geburtsurkunden gibt, und die beiden letzteren Dokumente ausgestellt, von der Botschaft beglaubigt, übersetzt und die Übersetzung beglaubigt werden muss. Und durchaus ein paar Mönatchen in Anspruch nehmen kann. Und jeder dieser Schritte natürlich bezahlt sein will.<br /> Als wir dann im Juni oder Juli alles beisammen hatten, wurde das ganze zum Oberlandesgericht geschickt, um alles zu prüfen. Im Oktober kam dann das OK, und wir konnten einen Termin zum Heiraten vereinbaren, am besten unter der Auflage &#8220;So bald wie möglich&#8221;. Tja, der 12.11.10 sah zahlentechnisch ganz gut aus und war noch frei, also galt es in ca. 2 Wochen eine Hochzeit auf die Beine zu stellen. :)<br /> Im Januar haben wir die Heiratsurkunde der Ausländerbehörde gezeigt, und einen Aufenthaltstitel beantragt, der &#8211; siehe oben &#8211; jetzt <strong>endlich</strong> bewilligt wurde.</p> <p>Insgesamt wird das schon ein paar hunderte Euro gekostet haben, anstatt ca. 50 € wenn 2 Deutsche heiraten würden.<br /> Da wir noch keinen Nachnahmen gewählt haben hätte ich jetzt jederzeit Gelegenheit, meinen zu 蓝 (lán) zu ändern ;)</p> tag:www.stefanwienert.net,2008:Post/59 2011-01-24T14:14:00Z 2011-01-24T15:14:15Z Es heißt nicht mehr, sondern ... <p>Vielleicht hat einer schon mal die neuen, humorigen Abwandlungen des neudeutschen, diplomatisch scheinbar korrektem &#8220;Mensch mit Migrationshintergrund&#8221; gehört, hier mal eine Zusammenstellung meinerseits:</p> <ul> <li>Es heißt nicht mehr Windows, sondern Betriebssystem mit Frustrationshintergrund.</li> <li>Es heißt nicht mehr Arbeitsplatz, es heißt jetzt Geldquelle mit Prokrastinationshintergrund.</li> <li>Es heißt nicht mehr Bundestag, sondern Abstimmungskollektiv mit Korruptionshintergrund.</li> <li>Es heißt nicht mehr Hängebusen, sondern Busen mit Gravitationshintergrund.</li> <li>Es heißt nicht mehr &#8216;Nerd&#8217;, sondern &#8216;Mensch mit Masturbationshintergrund&#8217;</li> <li>Es heisst jetzt nicht mehr Ladenhüter, sondern Artikel mit Lagerungshintergrund.</li> <li>Es heißt jetzt nicht mehr &#8220;Deine Mudda!&#8221; sondern Bildungsferne mit Gebärhintergrund</li> <li>Es heißt nicht mehr Teenage Mutant Ninja Turtles, sondern Schildkröte mit Mutationshintergrund.</li> <li>Es heisst jetzt nicht mehr Wutbürger, sondern Gesellschaftsteilnehmer mit Frustrationshintergrund</li> <li>Es heisst nicht mehr Ei, sondern Legehennenprodukt mit Dioxinhintergrund</li> </ul> <p>Quelle:</p> <ul> <li><a href="http://twitter.com/search/Es%20hei%C3%9Ft%20nicht%20mehr#search?q=Es%20hei%C3%9Ft%20nicht%20mehr">Twitter</a></li> <li>http://webkompetenz.wikidot.com/sideblog:134</li> </ul> tag:www.stefanwienert.net,2008:Post/58 2011-01-08T15:13:00Z 2011-01-08T16:13:03Z Flash-Video/RTMP Dump als Bashskript <p>Wer einen Online-Video-Stream mitschneiden will, kann dies in der Regel mit dem mplayer -dumpfile machen.<br /> Allerdings schafft dieser keine <span class="caps">RTMP</span>-Streams.<br /> Dafür bietet sich rtmpdump an, welches selbst kompiliert werden muss. <a href="http://stream-recorder.com/forum/use-rtmpdump-rtmpsrv-linux-t7661.html">Eine genaue Anleitung gibt es hier.</a></p> <p>Viele Videostreams erwarten aber sehr spezielle Parameter, die nur das entsprechende Flash-Objekt &#8220;weiß&#8221;. Hier kann man nun entweder mit einem Paketsniffer rangehen, der in Deutschland illegal ist, oder man nutzt den beiligenden rtmpserver.</p> <p>Diesen startet man und routet dann per Firewall seinen <span class="caps">RTMP</span> Traffic über diesen, nutzt diesen also als Proxy. Nach einem Start dieses rtmpsrv muss man dann nur noch sein Flashvideo ansurfen und rtmpsrv liest im Hintergrund die entsprechenden Header aus.</p> <p>Das ganze kann man natürlich mit einem kleinen Bashskript schön automatisieren und gleich eine Queue zum nachträglichen Dumpen/Herunterladen anlegen.</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt>8<tt> </tt>9<tt> </tt><strong>10</strong><tt> </tt>11<tt> </tt>12<tt> </tt>13<tt> </tt>14<tt> </tt>15<tt> </tt>16<tt> </tt>17<tt> </tt>18<tt> </tt>19<tt> </tt><strong>20</strong><tt> </tt>21<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">#!/bin/bash<tt> </tt><tt> </tt><tt> </tt>echo &quot;Setting iptable for redirect to rtmpsrv&quot; <tt> </tt>sudo iptables -t nat -A OUTPUT -p tcp --dport 1935 -j REDIRECT <tt> </tt>echo &quot;Starting RTMPSRV, Try to open the videos now in the browser &quot; <tt> </tt>echo &quot;Use Crtl+C when done&quot; <tt> </tt>rtmpsrv 2&gt;&amp;1 | tee rtmplog <tt> </tt><tt> </tt>echo &quot;Shutted down, reset iptables&quot; <tt> </tt>sudo iptables -t nat -D OUTPUT -p tcp --dport 1935 -j REDIRECT <tt> </tt><tt> </tt>cat rtmplog | grep &quot;rtmpdump -r&quot; | tee rtmpdownload.sh <tt> </tt>echo &quot;Grepping done, use sh rtmpdownload.sh now&quot; <tt> </tt><tt> </tt>echo &quot;inserting breaks of 5 seconds&quot; <tt> </tt>sed ' <tt> </tt>/rtmpdump/ a\ <tt> </tt>echo &quot;done, sleeping&quot;; sleep 5 <tt> </tt>' -i rtmpdownload.sh<tt> </tt><tt> </tt></pre></td> </tr></table> <p>Eventuell hilft manchmal eine kleine Pause (hier 5 Sekunden nach jedem Downloadvorgang).</p> tag:www.stefanwienert.net,2008:Post/57 2010-11-04T09:43:00Z 2010-11-04T10:43:40Z Batch umbenennen mit Unix/Linux Standardprogramm rename <p>Was ist erst vor kurzem erfahren habe: Linux bringt ein Programm &#8220;rename&#8221; zum umbenennen von vielen Dateien mittels Musters schon mit.</p> <p>Zielgruppe sind Programmierer, da man das ganze mit einer Perl-Regex beschreiben muss.</p> <p>z.B. alle Leerzeichen zu Unterstrichen bei allen Dateien im aktuellen Verzeichnis:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">rename 's/\s+/_/g' *<tt> </tt></pre></td> </tr></table> <p>klein aber fein!</p> tag:www.stefanwienert.net,2008:Post/56 2010-11-04T09:40:00Z 2010-11-04T10:40:24Z Easy Website-Performance Tests mit ab <p>Mit dem Linux Standardprogramm &#8220;ab&#8221; Apache Bench kann man hervorragend Performance-Tests auf eine Website durchführen und seine DDos Strategie überprüfen.</p> <p>Einfach von der Kommandozeile:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">$ ab -n100 -c5 http://www.stefanwienert.net/<tt> </tt></pre></td> </tr></table> <p>und schon wird mein Server mit jeweils 5 Anfragen gleichzeitig bombardiert (concurrency), mit insgesamt 100 Durchläufen.</p> <p>So sieht dann die Ausgabe aus:</p><table class="CodeRay"><tr> <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt> </tt>2<tt> </tt>3<tt> </tt>4<tt> </tt>5<tt> </tt>6<tt> </tt>7<tt> </tt>8<tt> </tt>9<tt> </tt><strong>10</strong><tt> </tt>11<tt> </tt>12<tt> </tt>13<tt> </tt></pre></td> <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">...<tt> </tt>Concurrency Level: 5<tt> </tt>Time taken for tests: 56.625 seconds<tt> </tt>Complete requests: 100<tt> </tt>Failed requests: 0<tt> </tt>Write errors: 0<tt> </tt>Total transferred: 2274571 bytes<tt> </tt>HTML transferred: 2219866 bytes<tt> </tt>Requests per second: 1.77 [#/sec] (mean) &lt;----- das wichtige<tt> </tt>Time per request: 2831.227 [ms] (mean)<tt> </tt>Time per request: 566.245 [ms] (mean, across all concurrent requests)<tt> </tt>Transfer rate: 39.23 [Kbytes/sec] received<tt> </tt>....<tt> </tt></pre></td> </tr></table> <p>Da das ein Railsblog mit relativ wenig Caching Features ist, habe ich auch nur maximal 2 Requests/sekunde.</p> <p>Sehr brauchbares Tool um schnell mal verschiedene Performance Strategien zu testen.</p> tag:www.stefanwienert.net,2008:Post/68 2010-10-27T13:27:00Z 2011-06-06T21:27:55Z Selbsterkennisse durch Auslandsbesuche - China vs. Deutschland <p>Jeder, der einmal eine längere Zeit im Ausland gelebt hatte, also mehr als nur Hotel und Sightseeing gesehen hat, kann wohl darüber berichten: Das man einiges über sich selbst und die deutsche Kultur lernt. Insbesondere die vielen kleinen Dinge, an die man vorher gar nicht gedacht hatte, oder es für nicht möglich gehalten hätte, das man dies anders, als in Teutonien machen könnte.<br /> <h2>Die Wohnung</h2><br /> Erkenntnis: Deutsche sind sehr genau, fast schon pingelig</p> <p>Das erste was mir direkt auffiel, ist die Ungenauigkeit. Uns Deutschen wird ja immer nachgesagt, dass wir sehr ernst und genau seien. Früher habe ich das nicht geglaubt, aber nun ich überzeugt, dies stimmt.</p> <p>Lichtschalter, Türklinken, Bilderrahmen sind obligatorisch schief angebaut. Eigentlich habe ich, außer in teuren Hotels/Restaurants, nie einen mit Wasserwaage angebauten Lichtschalter gesehen. Erstaunlich ist, dass die Leute damit trotzdem überleben können!!!! ;)</p> <p>Da viele Chinesen ihrer eigenen Marke &#8220;Made in China&#8221; genauso viel Respekt entgegenbringen wie wir, werden ausländische Marken in sehr vielen Belangen bevorzugt. Deutsche und amerikanische Autos. Denn wenn &#8220;Deutsche etwas tun, dann machen sie es richtig&#8221; (Zitat eines Gesprächspartners).</p> <p>Weiterhin stach mir eine gewisse Inkonsistenz, was die Einrichtung betraf, ins Auge: Einerseits ist das Bad ziemlich schlecht und dreckig, der Putz bröckelt ab, und andererseits steht dann in derselben Wohnung ein riesiger Plasmafernseher und die Anschaffung eines iPads wird bedacht. Statussymbole sind sehr wichtig um das &#8220;Gesicht zu wahren&#8221; (eigener Blogeintrag in Vorbereitung).</p> <p>Die Küchen sind auch i.d.R. etwas anders ausgestattet, als in Deutschland: Es gibt immer einen eigenen &#8220;Reiskocher&#8221;, dafür keinen Ofen, sondern nur Kochplatten. Besteck gibt es in der Regel nur Porzellan-Suppenlöffel und Stäbchen. Messer nur von der Kategorie Gemüsemesser bis Küchenmesser, da Brot fast unbekannt ist (siehe Essen I&amp;II).<br /> <h2>Folgen des billigen &#8220;Humankapitals&#8221;</h2><br /> Umzug organsisieren? Maler-party? All das, was in Deutschland zum Thema renovieren, umziehen, malern, umräumen, aufbauen, abbauen meistens durch einen selbst (&#8220;Heimwerken&#8221;) oder mithilfe von Freunden passieren würde, wird hier in China schon ab einer relativ niedrigen Einkommensschicht delegiert (Facharbeiter, Bachelorabsolventen). Ein Handwerker kostet halt nur 1 oder 2€ pro Stunde. Allerdings ist die Arbeitsqualität und Motivation dann meist dementsprechend, weshalb eine strikte Kontrolle notwendig ist. (vielleicht ist deshalb alles schief?)</p> <p>Friseur, Massage, Fußpflege und ähnliches ist dann natürlich auch sehr billig. Die Chinesen die ich traf, machen auch dies dann gern als Freizeitsev<br /> <h2>Umwelt</h2><br /> Erkenntnis: Deutschland ist ein sehr sauberes Land. Pfand ist eine Errungenschaft</p> <p>Leider gibt es sehr sehr viel Müll in China. Als turbokapitalistische Gesellschaft gibt es extrem viel Verpackungen. Dies gepaart mit einem fehlenden Umweltbewußtsein und &#8220;American Way of Life&#8221;-Denke, führt vielerorts zu extrem verdreckten Flüssen, Müll links- und rechtsseitig der Wahrzeichen und 0.5l Plastikflaschen quasi überall. In den Millionenstädten dich ich besuchte, Peking und Fuzhou, war die Luft stellenweise so schlecht und mit Autoabgasen versetzt, das mir übel wurde.</p> <p>Dies ist ein schon sehr großes Problem, und wir bei der anhaltenden Nachfrage nach einem eigenen Auto sich in Zukunft auch noch verstärken. Angesichts des Energiehungers, ausgelöst durch einen sehr hohen Stromverbrauch pro qm in den Großstädten (flächendeckend Klimaanlagen, sehr viele e-Fahrräder, 3x am Tag Kochen) denke ich, wird das ganze System eher früher als später kollabieren. Allein in Peking gibt es schon mehr als 4 Millionen Autos, mehr als 80 Staus pro Tag, Tendenz steigend.</p> <p>Fortsetzung folgt.</p>