<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Itchy programmiert</title><link>/</link><description></description><atom:link href="/rss.xml" rel="self"></atom:link><lastBuildDate>Tue, 27 Sep 2016 13:41:00 +0200</lastBuildDate><item><title>Ein Zeichen aus einem String entfernen</title><link>/charString.html</link><description>&lt;p&gt;Strings werden intern als array von chars repräsentiert *(jedenfalls war das bis JDK7 so). Das heißt, es müsste doch relativ einfach möglich sein, ein Zeichen aus einem String entfernen zu können.
Genau das werde ich euch heute vorstellen.&lt;/p&gt;
&lt;p&gt;Es gibt verschiedene Umsetzungsmöglichkeiten und wir werden diese im Hinblick auf Performanz beurteilen.
Als erstes nutzen wir die Methode &lt;code&gt;public String replace(char oldChar, char newChar)&lt;/code&gt;, die uns mit der String-Klasse zur Verfügung gestellt wird.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;String str = &amp;quot;hallo Welt&amp;quot;;
str.replace(&amp;quot;l&amp;quot;,&amp;quot;&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wie lange dauert das Entfernen des Zeichens? Und ist es tatsächlich die optimale Lösung oder gibt es noch eine andere Möglichkeit?
Schauen wir uns die Zeiten mal an. Um ein einigermaßes sinnvolles Ergebnis zu erhalten, machen wir ein Warmup, damit der Hotspot-Compiler drüber schauen und gegebenenfalls Optimierungen vornehmen kann.
Dafür führen wir die jeweilige Methode etwa 10000 Mal aus, bevor wir die Zeit messen.&lt;/p&gt;
&lt;p&gt;Das Ergebnis: &lt;em&gt;6966ns&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ist das jetzt wirklich das beste Ergebnis? Schauen wir uns mal die Alternativen an. Wir könnten die Zeichen ja auch mit einer Methode ersetzen. Hierfür wandeln wir den String in ein Array von &lt;code&gt;char&lt;/code&gt; um und hängen die Buchstaben zeichenweise an, solange wir nicht das zu entfernende Zeichen gefunden haben.&lt;/p&gt;
&lt;p&gt;Das würde dann wie folgt aussehen:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;public String entferneZeichen(String str, char c) {
        char[] array = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        for(char ch : array) {
            if(ch != c) {
                sb.append(ch);
            }
        }
        return sb.toString();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ist das wohl schneller? Laut ermittelter Zeit bei gleichem Warmup ist es fast doppelt so langsam; nämlich: &lt;em&gt;13868ns&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Wir könnten jetzt die Methode auch rekursiv aufbauen und schauen, ob das nicht vielleicht die optimale Lösung ist.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;public static String entferneZeichenRec(String str, char c) {
        int index = str.indexOf(c);
        if(index == -1) {
            return str;
        }
        return entferneZeichenRec(str.substring(0, index) + str.substring(index +1, str.length()), c);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Die Messung sagt, dass der rekursive Aufruf &lt;em&gt;4838ns&lt;/em&gt; dauert. Also nur minimal schneller als die replace-Methode, die uns zur Verfügung gestellt wird. Sollte man sich da wirklich die Mühe machen, eine eigene Methode zu schreiben? Man könnte doch genausogut die gewonnene Zeit durch Einsatz von replace mit Sonnen und Katzenleckerlies verbringen. Nun, schauen wir uns das Ganze doch mal näher an.&lt;/p&gt;
&lt;p&gt;Wir haben beim Warmup 10000 Durchläufe vorgenommen. Was passiert wohl, wenn wir das Ganze auf 20000 hochsetzen? Schauen wir uns da doch mal die Messungen an.&lt;/p&gt;
&lt;p&gt;Wuhuuuuuu, replace dauert plötzlich &lt;strong&gt;78296ns&lt;/strong&gt;, gefolgt von der Methode &lt;code&gt;ersetzeZeichen(String str, char c)&lt;/code&gt; mit &lt;strong&gt;19318ns&lt;/strong&gt;. Aber die Nummer 1 ist plötzlich die rekursive Methode. Die braucht nach wie vor nur sehr kurz: &lt;strong&gt;5809ns&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Wie konnte das passieren??? Vorhin war doch replace noch schneller und die rekursive Methode nur unwesentlich schneller als die replace-Methode.&lt;/p&gt;
&lt;p&gt;Tja, des Rätsels Lösung liegt in der Behandlung von Strings. Strings sind unveränderlich und damit wird immer ein String-Objekt erzeugt. Je mehr Durchläufe, desto mehr String-Objekte und desto langsamer die Methode. Wir sagen ja auch &lt;code&gt;str = str.replace("l","");&lt;/code&gt;. Würden wir nur &lt;code&gt;str.replace("l","");&lt;/code&gt; ausführen, wäre in str immernoch &lt;em&gt;hallo Welt&lt;/em&gt; gespeichert.&lt;/p&gt;
&lt;p&gt;Ihr seht also, dass man gerade bei der Nutzung von Strings sehr vorsichtig sein muss. Im schlimmsten Fall kann es passieren, dass wir eine &lt;code&gt;OutOfMemoryException&lt;/code&gt; erhalten, obwohl unser Heap eigentlich noch fast leer ist. Grund dafür sind vermutlich die String-Objekte, die rumschwirren.&lt;/p&gt;
&lt;p&gt;Apropos schwirren.. Ich habe vorhin hier eine Fliege entdeckt. Ich geh mal spielen. Viel Spaß noch.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Itchy</dc:creator><pubDate>Tue, 27 Sep 2016 13:41:00 +0200</pubDate><guid>tag:,2016-09-27:charString.html</guid><category>java</category><category>algorithmus</category><category>char</category><category>string</category></item><item><title>Fehlende Zahl in einer linearen Zahlenreihe finden</title><link>/fehlendeZahl.html</link><description>&lt;pre&gt;&lt;code class="language-java"&gt;// 13 fehlt
int[] zahlenreihe = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Es gilt die fehlende Zahl herauszukriegen. Um das zu tun, gehen wir wie folgt vor. Wir nutzen die Gauss'sche Summenformel. Man sagt, dass Gauss in der Schule die Zahlen 1 bis 100 addieren sollte. Als er viel früher fertig wurde, war der Lehrer so erstaunt, dass er fragte, wie er das in so einer kurzen Zeit lösen konnte. Gauss' Antwort war einfach. Er bildete die Summe von der ersten und der letzten Zahl und multiplizierte sie dann mit 50.
Also:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-markdown"&gt;1 + 100 = 101
2 +  99 = 101
3 +  98 = 101
Folglich: 101 * 50 = 5050
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Die allgemeine Formel von der Errungenschaft Gauss lautet:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-markdown"&gt;n * (n + 1) / 2
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Genau diese Erkenntnis nutzen wir bei der Suche nach der fehlenden Zahl. Denn wir können damit sicherstellen, dass die Differenz der mittels der Formel berechneten Summe und der berechneten Summe aus dem Array der gesuchten Zahl entspricht.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-markdown"&gt;    1) n * (n + 1) / 2
    2) Die Summe aller Zahlen in der Reihe.
    3) fehlende Zahl = 1) - 2)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das heißt, das ist unsere Referenzsumme. Wenn eine Addition nicht dieser Zahl entspricht, fehlt da etwas.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;int[] zahlenreihe = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16};

int mittel = ((zahlenreihe.length + 1) * ((zahlenreihe.length + 1) + 1)) / 2;
int summeAllerZahlen = Arrays.stream(zahlenreihe).sum();

System.out.println(zahlenreihe.length);
System.out.println(&amp;quot;Die fehlende Zahl ist &amp;quot; + (mittel - summeAllerZahlen));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das ist die Lösung in Java 8. In Java 7 müsste man mit einer foreach-Schleife durch das Array iterieren.&lt;/p&gt;
&lt;p&gt;Puuh, das ganze Schreiben hat mich doch sehr angestrengt. Guckt nicht so erstaunt: Ihr habt 10 Finger, ich dagegen 2 Pfoten. Ich gehe mal an mein Napf, um zu schauen, welche Köstlichkeiten serviert wurden.&lt;/p&gt;
&lt;p&gt;Mahlzeit!&lt;/p&gt;
&lt;p&gt;Itchy&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Itchy</dc:creator><pubDate>Sat, 20 Aug 2016 13:41:00 +0200</pubDate><guid>tag:,2016-08-20:fehlendeZahl.html</guid><category>java</category><category>reihe</category><category>array</category><category>algorithmus</category><category>suche</category></item><item><title>Nutzung von prismjs in Pelican</title><link>/Syntax%20highlighting%20in%20Pelican%20mit%20prismjs.html</link><description>&lt;p&gt;Da ich als Informatiker-Katze öfters Code bereitstellen möchte, wollte ich etwas haben, womit ich unkompliziert Syntax Highlighting in markdown aktivieren kann. Dabei bin ich zufällig auf prismjs gestoßen.
&lt;a href="http://prismjs.com/index.html"&gt;Hier&lt;/a&gt; könnt ihr weitere Informationen zu prism finden.&lt;/p&gt;
&lt;p&gt;Wenn die Dateien nun vorliegen, muss noch die Datei &lt;em&gt;base.html&lt;/em&gt; angepasst werden:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;link href=&amp;quot;{{ SITEURL }}/theme/css/prism.css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; /&amp;gt;
&amp;lt;script src=&amp;quot;{{ SITEURL }}/theme/css/prism.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Jetzt steht jeder Menge Input nichts mehr im Wege. Na ja, vielleicht doch! Diese WG-Mitglieder können doch echt manchmal stören. Immer verlangen sie Aufmerksamkeit und Liebe. Nun, ich komme mal meinen Pflichten nach und werfe mich gleich auf sie. Mit Milchtritten im Gesicht kann ich damit rechnen, dass sie mich den Tag über in Ruhe lassen.&lt;/p&gt;
&lt;p&gt;Itchy&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Itchy</dc:creator><pubDate>Sat, 02 Apr 2016 00:42:00 +0200</pubDate><guid>tag:,2016-04-02:Syntax highlighting in Pelican mit prismjs.html</guid><category>site generator</category><category>pelican</category><category>python</category><category>syntax highlighting</category><category>prismjs</category></item><item><title>Wie man Bilder in Pelican verkleinert</title><link>/Bilder%20verkleinern%20in%20Pelican%20mit%20markdown.html</link><description>&lt;p&gt;Das Bild, das ihr hier seht, entspricht nicht der Originalgröße. Ich habe mir hierzu überlegt, standardmäßig die Option für mich bereitzustellen, Bilder einheitlich in einer angemessenen Größe darzustellen.
Als Beispiel zeig ich euch mal ein Bild. &lt;/p&gt;
&lt;p&gt;&lt;img alt="pic" src="/img/itchyliest.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Dieses Bild ist in Originalgröße wesentlich größer. Das könnt ihr gerne überprüfen, indem ihr ein Rechtsklick auf das Bild ausführt, und es euch so anzeigen lasst.
Übrigens bin ich an dem Tag beim Lesen von einem der Dosenöffner erwischt worden, aber ein Glück sind Dosenöffner doch so naiv, dass sie nicht davon ausgegangen ist, dass ich weitergelesen habe. &lt;/p&gt;
&lt;p&gt;Hierzu habe ich die &lt;strong&gt;main.css&lt;/strong&gt; angepasst:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-css"&gt;    /***** Picture ****/
    img[alt=&amp;quot;pic&amp;quot;] { 
    max-width: 200px; 
    display: block;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Um jetzt ein Bild kleiner einzufügen, muss man lediglich in der md-Dateiauf das Bild verweisen:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-markdown"&gt;    ![pic]({attach}img/itchy.png)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Itchy&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Itchy</dc:creator><pubDate>Thu, 31 Mar 2016 00:42:00 +0200</pubDate><guid>tag:,2016-03-31:Bilder verkleinern in Pelican mit markdown.html</guid><category>site generator</category><category>pelican</category><category>python</category><category>bilder</category><category>pic</category><category>verkleinern</category></item><item><title>Hallo Welt</title><link>/hallo-welt.html</link><description>&lt;p&gt;Ich bin Itchy. Eine Katze, die schon früh mit Computern in Berührung kam, weil einer meiner Dosenöffner sich damit beschäftigt. Da standen überall diese Kästen rum, und wenn man mit der Pfote reingehackt hat, gab es auch ein Ergebnis (nicht immer das Erhoffte). Herrlich! &lt;/p&gt;
&lt;p&gt;Ich fing also an, mir das Spielen mit dem Gerät anzueignen. Da ich im Laufe meiner Beobachtungen jede Menge Erfahrungen sammeln konnte, habe ich beschlossen, mein Wissen mit Euch zu teilen. Natürlich alles ohne das Wissen meiner Mitbewohner, glauben sie doch tatsächlich, dass Katzen nur am Essen und Schlafen wirklich interessiert sind. Stimmt aber nicht! Wir tun nur so.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Eins noch an all die Menschen, die mit geringem Aufwand viel Geld verdienen wollen:&lt;/em&gt; ja genau, damit meine ich die Menschen, die gerne Seiten &lt;strong&gt;abmahnen&lt;/strong&gt;, weil kein &lt;em&gt;Impressum&lt;/em&gt; vorhanden ist. Dies ist absolut &lt;strong&gt;privater Bereich&lt;/strong&gt;. Der ganze Inhalt steht Jedem vollumfänglich zur Verfügung und kann nach Belieben ausgedruckt und weitergegeben werden.&lt;/p&gt;
&lt;p&gt;Ich wünsche euch auf jeden Fall viel Spaß auf meiner Seite und hoffe, an der einen oder anderen Stelle behilflich gewesen zu sein.&lt;/p&gt;
&lt;p&gt;Paws in the air!&lt;/p&gt;
&lt;p&gt;Hier noch ein Kunstwerk von Krümel (einer der beiden Dosenöffner).&lt;/p&gt;
&lt;p&gt;&lt;img alt="pic" src="/img/itchy.png" /&gt;
Itchy&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Itchy</dc:creator><pubDate>Mon, 28 Mar 2016 00:42:00 +0200</pubDate><guid>tag:,2016-03-28:hallo-welt.html</guid><category>katze</category><category>katzen</category><category>itchy</category><category>nerd</category><category>willkommen</category><category>helloWorld</category></item><item><title>Impressum</title><link>/Impressum.html</link><description>&lt;p&gt;Vorab: DIES IST EINE REIN PRIVATE SEITE. Daher ist eigentlich ein Impressum unnötig. Nichtsdestotrotz werden hier einige Angaben gemacht, weil es ja immernoch viele Rechtsanwälte gibt, die damit ihr täglich Brot verdienen. Hier also die unnötigen Informationen:&lt;/p&gt;
&lt;p&gt;Ihr wollt mich per Mail erreichen. Das könnt ihr gerne tun, indem ihr mir unter folgender Adresse schreibt:
blog [cmd + l (für mac) oder altgr + q (für windows/Linux)] itchyprogrammiert [.] de.&lt;/p&gt;
&lt;p&gt;Wenn ihr den Betreiber kennenlernen wollt:&lt;/p&gt;
&lt;h2&gt;Betreiber&lt;/h2&gt;
&lt;p&gt;Hicran Gerikoglu&lt;/p&gt;
&lt;p&gt;Seerobenstraße 20&lt;/p&gt;
&lt;p&gt;65195 Wiesbaden&lt;/p&gt;
&lt;h2&gt;Haftungsausschluss (Disclaimer)&lt;/h2&gt;
&lt;h3&gt;Haftung für Inhalte&lt;/h3&gt;
&lt;p&gt;Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.&lt;/p&gt;
&lt;h3&gt;Haftung für Links&lt;/h3&gt;
&lt;p&gt;Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Itchy</dc:creator><pubDate>Tue, 01 Mar 2016 00:42:00 +0100</pubDate><guid>tag:,2016-03-01:Impressum.html</guid></item></channel></rss>