tag:blogger.com,1999:blog-58584142024-03-07T10:59:46.226+01:00Blog.Xam.deMax Völkel on Personal Knowledge Management, Wikis, Semantic Web, Java, AppEngine, and personal ideas.Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.comBlogger119125tag:blogger.com,1999:blog-5858414.post-29946026458319705212024-03-07T10:59:00.000+01:002024-03-07T10:59:14.328+01:00LLMs predict next edit operation instead of next token?<p><span style="background-color: white; color: #0f1419; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; font-size: 20px; white-space-collapse: preserve;">On Copilot in IntelliJ. </span></p><p><span style="background-color: white; color: #0f1419; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; font-size: 20px; white-space-collapse: preserve;">What if LLMs could be trained on predicting the next edit operation instead of the next token? By edit operation, I mean insert word, delete word or change order of words. This way, an LLM could create a text with its own "TODO" or "reference needed" markers, which then later get refined by itself.</span></p><p><span style="background-color: white; color: #0f1419; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; font-size: 20px; white-space-collapse: preserve;">Text and source code is best written top-down and extended and refined over and over again. No book or article on anything is written from start to finish and done. And yet, this is the behavior an LLM currently implies. LLMs don't see the intermediate human struggle and changes until the text is as it is.</span></p><p><span style="background-color: white; color: #0f1419; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; font-size: 20px; white-space-collapse: preserve;">Pair programming teaches you skills, which cannot be found in any book. Clearly, there are currently more books and web pages than recorded pair programming sessions. But maybe there are already enough of them or some could be donated from IntelliJ collaborative users working on open-source software?</span></p><p><span style="background-color: white; color: #0f1419; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; font-size: 20px; white-space-collapse: preserve;">I want a pair-programming-trained LLM, which suggests edit-operations.</span></p>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-62554476997042359212017-12-06T22:40:00.001+01:002017-12-06T22:40:28.881+01:00JahrespreisErster Entwurf, 2017-12-06<br /><br />
Früher war alles besser. Produkte hielten lange, Markenprodukte ewig.<br />
<blockquote class="tr_bq">
"Wer billig kauft, kauft zweimal",</blockquote>
heißt es. Heute scheint mir:<br />
<blockquote class="tr_bq">
"Wer teuer kauft, kauft dumm."</blockquote>
<br />
Ich beziehe mich auf Elektronik-Produkte. Mein Beispiel ist eine Funk-Wanduhr. Die Uhr ist so alt, dass ich keine Belege mehr finden konnte. Nicht auf Amazon, dessen Bestellhistorie bis ins Jahr 1999 zurückreicht, und auch nicht in meinen Emails (durchsucht ab 2009). Nehmen wir mal an, die Uhr ist ca. 2010 gekauft worden.<br />
<br />
<br />
<b>Zustand: </b>Sie hat sich vor kurzem auf 4 Uhr gestellt, den Sekundenzeiger akurat auf die 8 sortiert, so, dass alle Zeiger im 120° Winkel hübsch aufgeräumt sind. Dann blieb sie stehen und auch mit neuer Batterie passierte tagelang nichts mehr. Kaputt.<br />
<br />
<b>Reparatur?</b> Kann man die Uhr reparieren? Das Netz meint, die Uhr hat vermutlich schlechten Empfang. Aber an genau der gleichen Stelle empfing sie etwas 10 Zeitumstellungen lang ihr Signal. Das Uhrwerk ist ein W762, "German Quality", die Uhr von der Marke "eurochron". Die Marke gibt es noch, eine Homepage hat sie aber nicht. Wikipedia kennt sie nicht. Das Patent- und Markenamt hilft weiter: Die Marke wurde 2010 von Conrad Elektronik eingetragen. Es steht also kein gutmütiger Spezial-Hersteller mit Herz und Seele aus Berlin oder dem Schwarzwald dahinter. Kulanzversuch sinnlos.<br />
<br />
<b>Neukauf? </b>Eine neue, runde Funkwanduhr kostet laut <a href="http://idealo.de/">idealo</a> (eine der besten Produktsuchmaschinen) zwischen 8,90€ (Ok, in pink), 50€ (Marke eurochron), bis zu 100€ (Bahnhofsuhrdesign).<br />
Die <a href="https://www.amazon.de/TFA-Dostmann-98-1091-Funk-Wanduhr-Aluminium/dp/B001B3LGIA">günstigste Uhr, die in Frage kommt</a>, kostet ca. 15€ (Marke: TFA). Die Bewertungen auf Amazon sind <a href="https://www.amazon.de/product-reviews/B001B3LGIA/ref=cm_cr_dp_hist_one?ie=UTF8&filterByStar=one_star&reviewerType=all_reviews&showViewpoints=0">vernichtend</a>:<br />
<blockquote class="tr_bq">
"Wir haben von diesen Uhren 50 Stück für unsere Schule angeschafft. Knapp 10 davon gingen gar nicht erst an, 10 haben sich nicht richtig eingestellt und 10 weitere können nach dem Wechsel auf Sommerzeit nicht mehr umgestellt werden. Sprich, über die Hälfte der Uhren können wir jetzt wegschmeißen. Ich rate deutlich davon ab, diese Uhr zu kaufen!"</blockquote>
Ok, soll es also lieber eine teurere, langlebigere Uhr sein? Eine Markenuhr, die lange hält und nicht ständig neue Resourcen bei Herstellung und Transport verbraucht? Wo finde ich dieses Wunschprodukt? Was passiert, wenn die Markenuhr im Monat 25 stehen bleibt?<br />
<br />
<b>Rechtslage: </b>Ich schreibe aus Deutschland, hier greifen europäische Verbraucherschutzregelungen, die in deutsches Recht umgesetzt wurden. Geht ein in Deutschland gekauftes Produkt in den ersten 6 Monaten kaputt, muss der Händler/Hersteller es reparieren oder austauschen. In Monat 7-24 auch, nur muss ich dann beweisen, dass es ein Herstellungsfehler war und kein Bedienfehler meinerseits. Mit so gut wie allen Firmen ist das in der Praxis kein Problem. Anders nach der Gewährleistungszeit: Ab Monat 25 zucken die Hersteller per höflicher Antwort-Email mit den Achseln. Da ist eine stehende Funkuhr für 15€ genauso nutzlos wie eine für 100€.<br />
<br />
<b>Versicherung?</b> Kann ich eine Versicherung kaufen, die im Falle eines Defektes nach 24 Monaten das Produkt ersetzt und so die Garantie verlängert? Ja, das gibt es tatsächlich. <a href="https://www.friendsurance.de/elektronikversicherung">Friendsurance </a>bietet das für nur 35,88€/Jahr an. Da kann ich für das gleiche Geld selbst 2 Funkuhren pro Jahr kaufen.<br />
<br />
<b>Garantie: </b>Es ist mir nicht gelungen, eine Funkuhr mit einer längeren Garantie zu finden, als der gesetzlich minimal vorgesehenen 24 Monate.<br />
<br />
<b>Schlussfolgerung</b>: Als Verbraucher sollte ich also stets das allergünstigste Produkt wählen, welches gerade noch den Job erfüllt und die Design-Mindeststandards gerade noch einhält (bei mir also z.B. kein pinkes Ziffernblatt). Ich kaufe kein Produkt, sondern das Recht 2 Jahre lang eine Funkuhr betreiben zu dürfen. Die TFA-Uhr kostet also ca. 7,50€/Nutzungsjahr. Ich habe sie bestellt.<br />
<br />
<h3>
Was kann man dagegen tun?</h3>
Alle Produkte werden immer billiger. Das ist toll. Sie werden aber auch immer schlechter. Das ist schlecht. Es verbraucht Resourcen in der Herstellung, im Transport. Es verbraucht sogar Zeit, sich ständig mit dem Suchen von Produkten zu beschäftigen, weil das alte wieder kaputt ist und nicht mehr hergestellt wird. Der Kapitalismus als System befördert diese Trends. Wie kann man innerhalb dieses Systems nachhaltigere Produkte schaffen? Über Garantien der Hersteller. Und über die Vermarktung der Garantien. Ich stelle mir das so vor: Auf idealo wird für ein ausgewähltes Produkt pro Anbieter der Preis angezeigt. Auf Wunsch ist das Ranking inklusive Versandkosten und berücksichtigt die Verfügbarkeit oder kostenfreie Rücksendung (falls der Artikel doch nicht gefällt oder ... defekt sein sollte). Vorschlag: Wie wäre es, die Herstellergarantiedauer zu berücksichtigen und einen "Garantierten Nutzungshöchstpreis pro Jahr" anzugeben. Eine Funkwanduhr für 50€ mit 10 Jahren Garantie wäre dann auf Platz eins, mit 5€ Jahrespreis vor 7,50€ Jahrespreis von der TFA-Uhr. Der deutsche Pfennigfuchser würde mit der Nase drauf gestoßen - und der Onlineshop sowie sein Vermittler (hier idealo) sogar (zunächst) mehr Umsatz machen.<br />
<br />
<img alt="" height="190" src="data:image/png;base64,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ssY+eb+cFuD999/njYX79u2zU0utVi9ZssS24oQJE+xvD3v27FmCIGwrzp8/nznN1dahQ4dGjBhhW/Gdd96pq6tz8gEtefLatWsVFf/f3p1HNXXmfQAPtdXqzHSZroLaKou10zrzOq2+bec406oztZ2+9YzL2E5tO9UCathccavi0qphB0UBAdEIWlBRAUUWi9qCgCBGQdHiLvfebASSAFnu+0dIcpPcLIQlot/PuecU7vLklxw85cvvuc+V2v5kHljcmr0uTzvYenXj1ux1+sfjgepPGhKfo+vxGAMpa+eyc0CrsRUAwEHdjwTK9B8lA54XDhhBuXlQHHfSbRjlNrTJbUTLuKdpLkf7pRv9L07H2qcUGSOUSUOVqcMUye6KFI+21OHqtBfa6zP6sn7vRIHXjouvJQrc42rG76rNqhOe/FVyvEF08DJ1+BJ54oqwuEGUVXP/94tzZ++qKKojiq6QJy7eP3b+zk91TWfqiTN198/WN529dK/8StP3/HLOW5u28n+pqL936vyNY2eu1Fy9/wk35Zm3l3WzeMsOIREQQy3e1nKolApNlKafaE4/IUk4LNqSId19nPCLMJ6pu51yQRThF2G405IZEcnAWNI/sjN/skVKMiDWcr8wZJviociT75dusfw94/3SLdavsEg8zMmulscdy5N8gckkTgZDnLI5XfQBzpOsMc/qxRbzXU1n39rLkw9IfLQwbdo0y5D2xhtvBAcH27iqtLR08uTJrG3G7du327gwISGBNRZOnTq1qKjIxoWBgYFjx461vHD27Nm256wy36AhT1ZXV1vrvj74yDbZotpMl2cebL20LarNJNucX0fd1fdPskfKnsqTulORJwGgu7ofCZqn/1fm9hI1YDjV2Zl0JznuTZwR7R8N1PpyNHM42tkc9cInFHuHK3a5K3e5K3VdytTh2vShimPT+7J+rx0XvBIuvJZ4cdAP5SlV95XtqojixiOXKJqm21XqnT/fiim6puxQczNri65Q5ddF6w/UlFy6r9ZoI45c5O2v3LS3/Ps9ZStTz/L45TJ5+/FzjTKlan3syZ0HK2ma3nHgl6ffXuHZU/1JZswLjCW40bIDJeTync1p+YpzddSSBGniUenOI8Q8XmcnMzCWDIojFkSKeZktB0tFG9M7c6NuXZ/gOJIbTYbES3bkCFcnk9wYirHej7EXung7FRxPBsWatCiD4x+OPGnttw3rV7DEFpNE6dx8V4KmrSVK/SvwBdZPcTDEChxbj8fxcRz9hBw4ZHmC2WMsDe/dWjE2Pj+Xkkgkhqw1evTod955h5kMm5ubWa9SqVQZGRmGM998803mFFY/Pz+FQsF6oVKpXLJkieHMcePGMSPizp07Le+B1JHJZMxpqxMmTBgzZozh28bGRq2VO9vN3mB9fX1VVZUuUl66dKkfrekK4CBX50kGRlh0dr4r+72RyJMA0F3djwSSP0+RuLlTjw2n3NwJjgfFGUpwPIjHh6n+/QT9DUf7JUf7H47mm8eVu93lKe6K5KGKFPe21GHK1GGqtKHKw//oy/q94s/7bKt+JaZyWFSFRKn65mAdxz/3tyuKr4kU9WTL4JA8zueZwVkXtTRNtihHLT7GmZQwZ9vpxqZmzofb/zfowKdLsj5ZdGDdnrInx2/6NPQgTdN/808fMjSwrPb2wUIBZ3TIK1M2eE4J62bxlv1JkhtDLU2Q7S8WhqVJE3LaG+4QfuGyfYXizftI/wgyqDP7EfMjRVszVJSk/dpdZWU9GRhLcmMI33DCN5zkRhMLoxVll1RCqXBtKuEX0bk/IEbXtCTm8YSrdylrGoQrEon5keb3Tz4UebK7812N+0zW2jFZ0YZlPR7G14zxjJNnzSKT2cI7Jg08mznQJOoyl66xUqTNcbqxHo8DhyxPsKzRTjFWPhxXy8nJ0WWt8ePH5+Xltba2pqam/vGPf/Tx8XnrrbdKSkpYr6IoKiwszMfHZ8yYMdOnTy8rK2tsbFy9erXu/saZM2fW1tayXlhXVzdnzhxd/3PJkiUNDQ1VVVVffPGFLhyGhoZa+xd6+vRp3e2aY8eO3b59u0QiKSgomDhx4ujRo318fDIzM60FUbM3qNFoxGLxxYsXKysra2trrd2uCdB/PQD3T3a5P8l2hY3BkCcBoNu6HwnE734kcRtKPTac4hjzZNOAYaoZT2jncrRfcrSfczTzHlemeyhS3JXJQ5Up7spd7i7Jk54xla/Hn39yw88Ljl2TyDuGrC1Nqml6O/KXlbkNd5vbvDaV/iXyzItL89rU2syqO88sODhmVd6C1PImsXzQZ6kZZ3+tu9csuEHRNH207PrTU6Le809/+r3vf750p0Jw+6nxa4ZP3uj14fevTvqum8WbJMmgWHJBlHBDemvBuba6m+LI/VRooiTxKOEbLjtYSi1O0AVCXY+xad5WWUaRRtEm+n4PuTSBWBApXJEk/6lGcVZAhe6kQhPVrQrprlySGyNcm6o4K5AXn6eWJlDLdrQcPSs7UCIOz9SoNfKS82RAjC6j6kd+SPJkleSGWZh8t2RTjfSW9SvYI5HJwqgmt0Qyu2xs90qajMdIRBb3DZq+lOl+qzmQORDjeSHWinRiHEc/IXuH2E5gfAa8YoIZsq0Vw/bhuBqXyx0zZoyfn5/hmRkajebq1auzZ88eO3bsxo3szfDLly/PmDFjwoQJmzdvNsw1bWtry83NnTp16sSJEzMy2O8LyMnJmTRp0pQpU3788UfDsz1aW1tjYmLefffdadOmWfs9NiIiYty4cTNnzqypqTEsoiORSIKDg9944w0/Pz9rydDyDdI03d7e/uuvv1ZXV5stqwTwEHB1f9IkBTp8/6SV54WwD4Y8CQDd1v1IIPNf0sJ5kRwwnHLzMMx3vc8ZoZw8WDufo5nD0c7iqEMGy/nDlclDFbvclSnDlCkeytQRdPpLiqL5fVm/V3SFT3TFkHWlVyl55E83nl1VIiBav+JfGP1DqVTe7rGyIL381sshufyyW3PiTs9PPTcn4cys6FOERP7sV+kvzEn73cykxyZF5pX/StP0/IgTnOcDN6adoWn69U8ifjthzWvTwl/5IGzk5HXdLN7sfkhiHk+akte8t0AcnikvrZHtK5QdKGk5WCovvUD4GZuTVFAsGRBDLd+hrGnQarWt+eVkSHxb/c22S41ttdfbr9wSrUtTtypVQql48772xvvKqqvtDXeU568K1+yiabr9+h3x1gyVqLn92h3hml3EwmgqKI4KfKj6kzRNV0tvMp8XcqH5tqsreuCZzUR1rQeqGDYffvhhXl6e5f7W1tY9e/b4+vqyXlVRUeHn51dWVmZ5qLGxcfPmzTExMawXJicnh4WFNTQ0WB6qqqricrnWOqIhISFJSUkSicTyUEFBwSeffGJtaq61N6jRaCQSye3b+AcFDxtX50kAgP6g+5FAdeGS6BkPyYBh1IARnevxcIYSbiPEo56jg9y0Xz1Gz3BrD39OwR+uSB6qTB2mTHZXpo7o2D1MtXu4irrYl/W/FlH2+w2lk5POq2l6/PbKgcsLRqw48ULoiedWFe47f8995Ykz10RhhwTPcA8/45d1Syj/PL70X9GnCKli4OyUggt3bota6+9JaZreffziU+/98OmyA7+ZsKGw8sbl68Tz76xxfz/M+8ONr37Qo/3JBVGi9btb88sVFfVkUGxrYaU4JptavkMckdmSX96cUURy9f3JwFgyKI5cGE0siBJtydBotc1p+armVjIknvANV8vk0oQctbRFsu2QaNNetVzZNHercPUuFSkWx2apZXLR+t3UikS1pEUUlkb4hpNBsWRADKnLtA9RngT7TOaO2nlcyKNVjD1isZjZtTOjS1yWi6B2dHSIxWIbS+C0tbVJJBK5XG62X6lUisViQ1vSklwuF4vFljNXZTKZWCy28WwPiUQiFostb6G0/QZpmtZoNGq12sYJAP0O8iQAgH098ryQljUbNZxnqCdepQaMIDkelNswym1Yk9urbdN/Q3/NUc8fIs8coUz2UKZ4KHe5K1OHK3e/Smf8vr18vZVFH3qr/td4Z9yWFqRX3Ttcc58zJ2tvxZ2a+y3lNyTjNpU8xz3K+SYrq+rOZaKFMzX5rdBjKo32zcDsv6/LvSNq5bwf/Yev0ib6pr/3Tapv5EnOm2u//SGXpumPAvYOeGFBSVnD8TP1j40J8fjbd6Mmrelm8SYru86PFG/ZJ8suFa5Lay2oUJRdasn9pZl/UszLIObxWo+XC5fvILjRuvmuhF+4dNvh9vpb8lPVaplc9P3etrqbbbXXlVVX2q/fFW1M1yjbhCuTyKA4VZNIUXapve6m8sI14Ybd6lYltTqZmB/VcYdsu3KLWpXUdvG6ZNshwjecCn6o+pPgCJNlWl2d3x6oYgDgUePKPMm6ImsfcK5aAHiU9UAk0Gq1Wlo2b2HHgOclnBdJt5cIt6Gk28tCzkutT7zY7udOZ7+sSntZkewuT/FQ7nJXp75M73u+o2S+RqPRaru7HmCX6ndff2r0D6VtKk1O7f24ous0TW86JLjc1HL+ljQs5/LW41euka00TScWXq26TtE0vf/0tfzKWzRNxx+5EJV9PupARfSPlevSfk4/dkGmaOOfqFV2qOPSSvccq6ZpOjO/5tk/h776/upuFs+c70oGxxG+4bKsn1qOnBVHZ8lPVUtis5QXrklT88jA2JacM9TSBIKrf/4kN4YKTWwtrGxvuC3deYTwixCuTVVW1CurG4RrU6nF2+XF54Urk0j/CNGmvcqaa4ryy8IVidTyHa2FVVRoIukfKQpLk5+s1GVXcXgm6R+JPAkAAI8s5EkAAPt6JBJotVq1RivfltT8p7/IBrnLHvdoGeDe6vknxeqtbbevt9f+0LHnD/QeD226u3a3u+rgex2CnSp1z6ws36X6nw4tmJ5c+dNVquiqsPyGJKr4GmfOgX/E/lxyhTx1lfzpKnniUtOR6rtFl5tO1N7NqbxZePFeQc3tw2WNhdW3imvvFNfeKaq+WVh1o/D8zaDoAs7rqzaklJ48d/3Iqct7jlYWlzV8vCDp2beXdLN408VdY0n/COH63W31N1sOnxZHHpCmHReH72/6YqNofbos6xRzvqsuUhK+4cQ8Hjk/qvPbb3nEtzySG00GxpJ+EZ0PolwYTXzLI74N111O+uv3c6MJ33DdIGTnLZSxD83zJwEAALoE810BAOzr4UigbKcvX6NLz9HnBbREpqH181k7pDR5jr6VSwsv0KrOG37a29u7f7NNl+r3CSt6Zc3Jpxbn/W5x/m+Djz27KPf1jcUvL8sbMv/Qk/MPPumXPeTbA0Pm7n/yq32D5+wZ8p/dT85OHTwzefD0nYP+L2HQx/EDp8YMnBw5aFL4oL9u+c0HWz1nxA9+b8PAcSsH/s/yQWOXDHo92GPi6pEf9NB812DjwyfJgJiWQ6XS5GNNX28mF0YT/hFkQExL7i/i8EzCP4L5pEqTB04yv9U/+cP8NNb9zD3BcVRwvBx5EgAAHj3IkwAA9vVIJDh37lxaWlrpqVN3794tLCy8ceOGQCDYsmXLLz//XF72S13d5dOnT5eXlzc0NJSWlt64caOkuCg/P3/NmjUdHR19Wb/Xdye9vivw+q7Ae+1J79UnvNec8FyZ77Uy32tFntfyXO+lR70X53gvOuwdnO0dlOXN3e+9IMPbb5/XvL0+8/Z4/Xe355wUzy+SvD/b4fnvBO8Z8Z7TYrynRXn+k+f50Q9e/9jg+fewV/62auRfV3azeGFQHGl89qNuIms0FbpTdrC05fAZaVq+LKOwtaBCkpBDLIgy5sDe24LjFUuTkCcBAOBRgzwJAGBf9yOBWq1etGjRxx9//Omnn86aNSuAy509a9a/Z80KDAjQPc3M39//888+Cw1dvmrliq+//iogIGD58uVffvllQECAtadm91L9XquPe67M91yV77nq+KhVx0etyPMMzfVcdsxr6THPxUc8Fx32CjnkFZTtFZjlxd3vNT/Dy2+f57y9nt+ke36dNmpOysjPE0d9tmPUrO2jpsePmhY76tOokR/zXp26eeTfN46asn7kpO9Gvr965F9XdLN44apkacg2s64juTCaDIwVfb9Xmpov2X5YuDKJ8I+kguLIwN5MkkFxVFCcMGSbevmulqNnu/nh9z92n6Do6DgCgbOD6FejcbiMnqoZAACQJwEAHEFRlEwmc3UVTpLJZCRJ9t/6+3XxMplMJBK5uore1CPZrFuDCPhY0xQAwHWQJwEA7NNoNBRF3e2fKIpSqVT9un6xWOzqKpwkEoksn1D3UHF5nkSzEQDApZAnAQDsQ3/ShR7+Fl+/xoxzAj7j+YeMZyIyu4cmj0pcxheY7NEPxDxJf7HuhQSmo5qdSBTzlvGLO/fpLrQ+FCIoAEBPQJ4EALDvbj+/BQ71Q28xZDOimGea2EyCpTHcMYKc4YjJfouBdEd0wdAkcfIFZmPqzjHGVxtDIU8CAPQM5EkAAPv6e55B/dBbGG1DY0Qzu6XR8C1RzGO91dG8yck8R/+9STY0y7GWKdPuUMiTAAA9A3kSAMC+/p5nUD/0FtZprQK+SV5j5DfdlFi2SbCdJ5jOh2XMg2XpbbLmSeM5jg4Ffcrsh6Nzl9mMZ4evZZktbXO/2XGzv24I+HZrwA8PgAXkSQAA+/p7nkH90Fv0LUEBn/GLuPU8qWdIEOZzVq3+uu5cnnRkKOhDlonN/I8J1tfqtbiWYLbFGT+B1vYzdOZJ0wOmc6oBwEHIkwAA9vX3PIP6obcY0wDj93azX+GtPtGDbQIq+6//zuRJR4eCPmL4IwLzwzf94bD5o2J+rSM/EpanGXcu4/P5ZvGUz7fsngKAHciTAAD2seQZMnvu3GyyyyNV8xy/yvZLGI+S2XN9fHx8eNVWB7eRx7Ln+phdRFru6lJhvQB58sFl3l1iLJ5juR6PWVowzaIma/kwW522Q4KNPOngUNA3BHz9Grw2wp6VQOnItU7kSYGAESiJYh6vuJiZJ20uDsy64LDdqizP17/rzrQsYN5j7PBCxwAuhTwJAGBfj+XJLl3l4MmG06yfbyuPVfNM0yOZPdeHV90ThfUc5MkHl+XSrJY3QpqviWNyM6PJbstnjVjLig7lSceGgr7E0kNmWzPJkWu7Pd+VLyCKeYycxismjFO17S0O7MiCw46cb1Ig85E7XVzoGMB1kCcBAOxzME92Ngp9fPSBzLhjbjZp/HZuNml+iO16MnvuXB5vLmNA4x5edWcB1bzOS8Ki9IM7VL+1d6L/zlCLsQlq/tLG6GnvjbPuoY2128mvyJMADwsH8qTVrM/2hwBra/nYWeNHn8OMgVLXqjTkSbuLAzuy4LD5frbzTV/IeFZXFzoGcB3kSQAA+xzKk8Y91TxdQtL/1/iV4RzLQ4xGYWdOM048ZVzODGhmbUnn+pOmHcnOIoy79FVZvrRhdq0jb9zGR8E8aAXyJMBDoif7kwK+eU/b2PFj22821DK+QD+T1vBffZ60vzhwV2fbWtnP1nM1xEabBbB/JgAugDwJAGCfo/NdrfQjjWmJmf2sHWJ5CUZD0HBOz+VJ00xrFv/0X5q9tFlX0ZE3brbH0Jw0a1o6Uz8A9BPO3T/JerK123Gt3qZrNpQ+SHb2JfWx0vY9tn2ZJx1ZnRh5Eh4AyJMAAPY5lCereT4WncbOMw1JyuwqG4fovsyTnaHRpCtpO0/Oza5mdiXtvnHLPXabkl2pHwD6B9sB0mac7J08SQv4vOJivrG1abFcMXsNPZQnzas1fNvVhY4BXAd5EgDAPkfzpCFVmU0aZc4jNb3z0HiIGcZ0X/ZhntTfHsm829Fivqv5SzMKt/fGrUypNfZqMd8V4JFgkX/M19GxsbiMrfmu5s+rYdtvNhRz3RvGpWyL+rAsDmw11zFfkDG2Q+dbrMfj+ELHAK6DPAkAYB97nmTO1+zsuOm+5jEbdqYTOqt5+q8tDrGux9OVPKkf3KH6Wd8PS3ORscKO5Ut3RkNH3jjb+8V6PACPGttr6theZ4ZlH2O9YIuU6sh6PObDCqw9L8RicWAbuc5kbWMrM2hNvmU8L6SY2a7sykLHAK6DPAkAYF9/zzOoHwCgHzAJtAD9A/IkAIB9/T3PoH4AgAeRyXxcPE4S+iXkSQAA+/p7nkH9AAAPJpNHgyBMQj+EPAkAYF9/zzOoHwAAAHoD8iQAgH0URclkMldX4SSZTEaSZL+uXyQSuboKAAAAYIE8CQBgn1arFYlEd/snkUik0Wj6df1ardbVPwIAAADAAnkSAAAAAAAAnIE8CQAAAAAAAM5AngQAAAAAAABnIE8CAAAAAACAM5AnAQAAAAAAwBnIkwAAAAAAAOAM5EkAAAAAAABwBvIkAAAAAAAAOAN5EgAAAAAAAJyBPAkAAAAAAADOQJ4EAAAAAAAAZyBPAgAAAAAAgDOQJwEAAAAAAMAZyJMAAAAAAADgDORJAAAAAAAAcAbyJAAAAAAAADgDeRIAAAAAAACcgTwJAAAAAAAAzuiBPFlXV09SImzYsLlqk0plLq8BGzZs2LBhc8mG/wliw+barbHxZnfzJPqTAAAAAAAAjyDMdwUAAAAAAABnIE8CAAAAAACAM5AnAQAAAAAAwBnIkwAAAAAAAOAM5EkAAAAAAABwBvIkAAAAAAAAOMORMPj//br/LxeX9RkAAAAASUVORK5CYIIA" width="640" /><br />
<div style="text-align: center;">
Beispiel für Suchergebnisse auf idealo.de </div>
<br />
<h4>
Was braucht man dafür</h4>
<ul>
<li><b>Eine Produktsuchmaschine, welche die Garantiedauer der Produkte berücksichtigt</b></li>
<ul>
<li>Ich möchte automatisiert wissen, was es kostet ein Produkt 10 Jahre lang zu nutzen und alle Defekte durch Herstellungsfehler oder normalen Gebrauch fraglos repariert oder ersetzt zu bekommen.</li>
</ul>
<li>Hersteller, die den Wert ihrer Garantien begreifen und offensiv mit dem Jahrespreis werben.</li>
<ul>
<li>Es kann das Produkt auch gerne in verschiedenen Preisen geben: z.B. 15€ für 2 Jahre Garantie oder 40€ für 10 Jahre? Bei Laptops </li>
</ul>
<li>Möglicherweise muss der Hersteller sein <b>Produkt auch mit Garantie und Finanzierungsprodukt verkaufen</b>. Warum nicht ein Produkt gleich zu einem Jahrespreis jährlich bezahlen. Klar liegt dieser Jahrespreis dann etwas höher. Aber ob mittellose Verbraucher das Geld ihrer Hausbank als Dispozinsen zahlen, der Kreditkartenfirma abstottern oder in einem leicht erhöhten Kaufpreis unterbringen, ändert an den Kosten letztlich nichts. Im besten Fall verwendet der Verbraucher lediglich ein wertigeres Produkt mit niedrigerem Resourcenverbrauch zu gleichen Kosten.</li>
<li>Scoring von Marken. Analog zur Bonität von Konsumenten gibt es einen Score für die Verlässlichkeit von Marken. Oder eine Versicherung.</li>
</ul>
Perspektivisch würde sich Qualität für den Hersteller wieder lohnen und die "Geiz ist geil"-Abwärtsspirale der Qualität durchbrochen. Da hätten doch alle was von. Dies bisherigen Suchmaschinen für nachhaltige Produkte konzentrieren sich z.B. auf den Energieverbrauch in der Nutzung.<br />
<br />
<a href="https://www.miele.de/haushalt/garantieverlaengerung-479.htm">Miele bietet tolle Garantien an</a>, wirbt
aber noch nicht mit dem daraus resultierenden "Garantierten maximalen
jährlichen Nutzungspreis". Ok, dafür brauchen wir einen knackigeren Namen. Wie wäre es mit "Jahrespreis"?<br />
<br />
<h3>
Referenzen</h3>
<ol>
<li>Europäisches Verbraucherzentrum Deutschland [<a href="https://www.evz.de/">https://www.evz.de</a>] </li>
</ol>
Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com4tag:blogger.com,1999:blog-5858414.post-5574583576968622032017-07-10T11:45:00.000+02:002017-12-06T21:00:40.226+01:00Password Rules Deutsche_Bank$0<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Heute: </span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Wie die Deutsche Bank bei paydirect alles dafür tut, dass kein Nutzer sich das Passwort merken kann.</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><br /></span>
<br />
<blockquote class="tr_bq">
<span class="annotationHead" style="background-color: white; display: block; margin: 0px; padding: 0px 0px 0.875em;"><span class="inner" style="margin: 0px; padding: 0px;"><b><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Passwort</span></b></span></span><span class="annotationBody" style="background-color: white; display: block; margin: 0px; padding: 0px;"><span class="inner" style="display: block; line-height: 18.2px; margin: 0px; padding: 0px;"><span class="annotationP" style="display: block; line-height: 18.2px; margin: 0px; padding: 0px;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Mindestens 8, maximal 20 Zeichen. Es müssen Zeichen aus allen folgenden Gruppen enthalten sein:</span></span></span></span><span class="annotationBody" style="background-color: white; display: block; margin: 0px; padding: 0px;"><span class="inner" style="display: block; line-height: 18.2px; margin: 0px; padding: 0px;"><span class="annotationUL" style="display: block; line-height: 18.2px; margin: 0px; padding: 0.5em 0px 0px;"><span class="annotationLI" style="display: block; line-height: 18.2px; margin: 0px; padding: 0px 0px 0px 1.5em;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Großbuchstaben A-Z – ohne Umlaute,</span></span></span></span></span><span class="annotationBody" style="background-color: white; display: block; margin: 0px; padding: 0px;"><span class="inner" style="display: block; line-height: 18.2px; margin: 0px; padding: 0px;"><span class="annotationUL" style="display: block; line-height: 18.2px; margin: 0px; padding: 0.5em 0px 0px;"><span class="annotationLI" style="display: block; line-height: 18.2px; margin: 0px; padding: 0.5em 0px 0px 1.5em;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Kleinbuchstaben a-z – ohne Umlaute oder „ß“,</span></span></span></span></span><span class="annotationBody" style="background-color: white; display: block; margin: 0px; padding: 0px;"><span class="inner" style="display: block; line-height: 18.2px; margin: 0px; padding: 0px;"><span class="annotationUL" style="display: block; line-height: 18.2px; margin: 0px; padding: 0.5em 0px 0px;"><span class="annotationLI" style="display: block; line-height: 18.2px; margin: 0px; padding: 0.5em 0px 0px 1.5em;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Ziffern 0-9,</span></span></span></span></span><span class="annotationBody" style="background-color: white; display: block; margin: 0px; padding: 0px;"><span class="inner" style="display: block; line-height: 18.2px; margin: 0px; padding: 0px;"><span class="annotationUL" style="display: block; line-height: 18.2px; margin: 0px; padding: 0.5em 0px 0px;"><span class="annotationLI" style="display: block; line-height: 18.2px; margin: 0px; padding: 0.5em 0px 0px 1.5em;"><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Sonderzeichen: @ # $ % & - . _ ! ?</span></span></span></span></span></blockquote>
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Kritik</span><br />
<br />
<ul>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Warum ist die Länge auf 20 Zeichen begrenzt?</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Warum sind deutsche Umlaute verboten?</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Warum ist ein Punkt ein Sonderzeichen, ein Komma oder Semikolon aber nicht? -- Javascript sagt, Komma ist streng verboten, Semikolon und Doppelpunkt auch. Sooo exotische Sonderzeichen kann die IT auf keinen Fall handhaben. Das wäre unsicher.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Und vor allem: Unicode und der deutsche Duden haben das große ß (<span style="background-color: white;">ẞ</span><b style="background-color: white;">) </b>eingeführt - ist das ein legaler Großbuchstabe? - Das Javascript auf der Seite sagt, nein. </span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Legale Zeichen: [A-Za-z0-9@#$%&-._!?] (72 legale Zeichen)</span></li>
</ul>
<div>
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Analysieren wir einmal die Psychologie dahinter. Welche Zeichen sind verboten und welche Ängste stecken dahinter?</span></div>
<div>
<ul>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">§ Paragraphenzeichen. Solche Zeichen wollen Rechtsanwälte verwenden, kurz bevor sie die Deutsche Bank verklagen. Aber, haha, das geht gar nicht. Dieses Teufelszeichen ist verboten.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">+ Noch so ein Teufelszeichen. Minus ist natürlich erlaubt, dann macht die Bank ja Gewinne, aber Plus? Das sollte keiner auf dem Konto haben. Aus dem Passwort, aus dem Kopf. Aus dem Konto. </span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">()[]{}<> Klammern? Auf keinen Fall. Nur Computerspezialisten benutzen solche schwierigen Symbole. Was, wenn in einem Passwort eine Klammer aufgeht, aber keine zu? Geht dann alles kaputt? Verbieten ist die Lösung.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">% Kein Problem, das kennt der Wirtschaftswissenschaftler. Viele % Zinsen. Sehr gute Sache. Erlauben!</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">$ Gern gesehen, kennen wir als Bank von unseren Geschäften mit Trump.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">€ Verboten. Wir wollen zurück zur D-Mark. Da gab es wirklich für alles Gebühren. Jetzt nimmt uns die EU ständig was weg. Sogar bis in die Spitze von Italien kann man jetzt Geld ohne Gebühren überweisen. Pah! Verboten!</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">"' Was'n das? Diese winzigen Zeichen kann ich auf meinem iPhone kaum sehen. Verboten!</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">* Ein Sternchen! Hübsch. Und gefährlich. Oder? Sieht so pieksig aus.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">~ So ungefähr? Oder nicht? Wir sind genau bei der Bank. Sowas geht hier nicht. Verboten.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">\ / | Wo kommen denn diese Striche her? Von einer Tastatur? Habe ich noch nie gesehen. Das sind ja keine Buchstaben, das ist verboten in einem guten deutschen Bankpasswort.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">äöü Mein DOS-Computer kann das nicht richtig anzeigen. Dann lassen wir das bei der Bank lieber.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">= So mit Mathe und so? Können sie etwas Zinseszins ausrechnen? Das wollen wir gar nicht sehen! Weg damit.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">^ Unsere Experten sagen, damit kann man wirklich Zinsezins rechnen, wie furchtbar. Raus damit.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">° Kreis? Stern? Das kenne ich nur aus der Wetter-App. Wir kümmern uns hier um Geld, nicht ums Wetter. Da können wir sowas nicht gebrauchen. Das lenkt uns nur von der wirklich wichtigen IT-Sicherheit ab.</span></li>
<li><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">, Nee, nee. Wir verwechseln hier immer , und . ständig. Das ist bei großen Zahlen richtig teuer. Aber die Lösung ist einfach: Komma ist in der ganzen Bank überall verboten und das Problem ist gelöst.</span></li>
</ul>
</div>
Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-26949998818442059382016-11-02T13:41:00.002+01:002016-11-02T13:41:22.419+01:00Chromecast causing wifi interference problem issues – resolved and fixed<h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The enemy in our home</span></h2>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">My notebook sometimes would not connect to Wifi. So I used <a href="https://play.google.com/store/apps/details?id=com.farproc.wifi.analyzer">Wifi Analyzer</a> on my phone to find out what's going on. There was another signal on our wifi channel. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">First, I guessed the neighbors had a too strong wifi signal. So we switched channels. But after a while, I realized, the other signal would follow our channel switches and interfere again. Within less than 30 seconds. Could it be, that this evil signal was something going wrong in our router? Nope. It turned out the Chromecast Video and Chromecast Audio (we have both) are broadcasting their own signal, although sometimes without SSID. After an update it seems to be "Chromecast Audio.a" and "Chromecast Video.b". And it turns out, this is the <i>Guest Mode</i> of Chromecast. So we <b>disabled Chromecast guest mode</b> by using the now renamed "Home" app (was called "Chromecast" before). And voila, wifi is back to normal.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">(This blog post is a SEO experiment. The number one ranked post for the "query chromecast interfering with wifi" was from <i>Edward Grigson</i> and all credit for this fix goes to him. :)</span>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-77188575310260133272016-10-15T14:33:00.001+02:002016-10-15T14:33:22.553+02:00Spreadsheets are Awesome<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><i>(moved this post from computerassistedthinking.com -- closing down that domain, I have way too many domain names)</i></span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Humans are not good add doing calculations. They become much better (faster) by using tools. Even simple tools such as counting stones or pen & paper move the limit of what we can compute much further. The next level was the advent of spreadsheet software, such as OpenOffice, Microsoft Excel, Apple Numbers, or Google Spreadsheets. Spreadsheets take a known metaphor, a grid, and extend it with automatically re-calculated formulas. Spreadsheets are very easy to start with, but on the other hand, they can also go pretty far in complexity. They don't dictate any structure on you - except the grid. Spreadsheets are awesome for numbers.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">What is the equivalent of spreadsheet software, not for numbers, but for concepts, ideas, arguments?</span>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-249141112065409512016-07-19T10:05:00.003+02:002016-07-19T10:08:27.063+02:00Standard format for time-stamps in file names based on ISO 8601<b>Requirements:</b><br />
We would like a standard that<br />
<ul>
<li>never confuses time zones - a time stamp of which the real time is not known is often worthless</li>
<li>lexicographic (aka default) sorting should sort by time</li>
<li>close to existing standards</li>
<li>legal characters in filenames on Linux, Windows and macOS</li>
<li>Bonus: Requires no URL encoding</li>
</ul>
<div>
The closest standard for these requirements is ISO 8601, which requires to use colons, which are not allowed in file names. Therefore there herein proposed standard for time-stamps in file names is ...<br />
<br />
<b>Proposed Standard:</b></div>
<div>
<ul>
<li><b>1. "Use ISO 8601 and replace colons with underscores"</b></li>
<li>2. "Prefer UTC, if possible"</li>
<li>3. Adding seconds and/or milliseconds is optional. In fact, everything is simply exactly as described in UTC 8601, except every colon in output strings is replaced with underscores.</li>
</ul>
<div>
<b>Examples:</b></div>
<div>
This yields timestamps in the format "2016-07-19T07_44Z" or "2016-07-19T07_44+01_00".</div>
<div>
<br /></div>
<div>
<b>How To:</b></div>
<div>
Generated in UTC via Linux date command as</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><b>date -u "+%Y-%m-%dT%H_%MZ"</b></span></div>
</div>
<div>
<br /></div>
<div>
Using Java and Yoda time and a format which uses only hours and minutes:</div>
<div>
<div class="p1">
<span style="font-family: "courier new" , "courier" , monospace;"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>DateTimeFormatter <span class="s1">df</span> = DateTimeFormat.forPattern(<span class="s2">"yyyy-MM-dd'T'HH:mmZ"</span>);</b></span></div>
<div class="p1">
<span style="font-family: "courier new" , "courier" , monospace;"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>DateTime <span class="s1">dt</span> = <span class="s3">new</span> DateTime();</b></span></div>
<div class="p1">
<span style="font-family: "courier new" , "courier" , monospace;"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>String <span class="s1">text</span> = <span class="s1">dt</span>.toString(<span class="s1">df</span>);</b></span></div>
<div class="p1">
<span style="font-family: "courier new" , "courier" , monospace;"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="s1">text</span> = <span class="s1">text</span>.replaceAll(<span class="s2">"_"</span>, <span class="s2">":"</span>);</b></span></div>
</div>
<br />
<div>
<br /></div>
<div>
<b>References:</b></div>
<div>
<ul>
<li><a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601 on Wikipedia</a></li>
<li><a href="http://stackoverflow.com/questions/1248747/what-is-your-favorite-date-and-time-format-in-a-file-name">http://stackoverflow.com/questions/1248747/what-is-your-favorite-date-and-time-format-in-a-file-name</a></li>
<li><a href="http://stackoverflow.com/questions/27725408/alternative-to-colon-in-a-time-format">http://stackoverflow.com/questions/27725408/alternative-to-colon-in-a-time-format</a></li>
<li><a href="http://programmers.stackexchange.com/questions/61683/standard-format-for-using-a-timestamp-as-part-of-a-filename">http://programmers.stackexchange.com/questions/61683/standard-format-for-using-a-timestamp-as-part-of-a-filename</a></li>
</ul>
</div>
<div>
That's all.</div>
<div>
<br /></div>
<div>
<br /></div>
Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-80173929755330864602015-10-23T14:59:00.000+02:002015-10-23T14:59:12.146+02:00About this Blog<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">I am <a href="http://blog.xam.de/">blogging</a> since 25.09.2003. That's today over 12 years. Blogger says, I got <b>a quarter of a million</b> page impressions. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Google Analytics stated to record data in 2008, with two gaps of ca. 24 months total. It recorded 36k users for 114k page views. This implies the blog had 78k unique readers. Thats <b>20 readers per day</b>. Every single day. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">I'm <a href="http://www.slideshare.net/xamde">on SlideShare</a> since June 2008. Until today, my uploads got 54k views, of which 24k views are due to my summary of a very nice book for entrepreneurs: "<a href="http://www.slideshare.net/xamde/summary-of-the-mom-test">The Mom Test</a>". Amazingly, t</span><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">hat is also </span><b style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">20 readers per day</b><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">. Every single day. </span><br />
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">I found no obvious ways to obtain similar stats for Facebook or Twitter.</span><br />
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Thanks for reading. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">PS: Next narcissistic post scheduled for 2027 :-)</span><br />
<br />Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com2tag:blogger.com,1999:blog-5858414.post-3231069759313918152015-08-01T15:19:00.000+02:002015-08-01T15:19:01.884+02:00Semantic Web, RDF, RDFS, OWL, Topic Maps -- a High-Level Overview<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Semantic Web</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The semantic web is a great <b>vision</b> of making the content of the world wide web (www) machine-readable. So that computers can help us more in using the confusing amount of content and devices. The inventor of the WWW detailed his vision in a nice book <a href="http://www.w3.org/People/Berners-Lee/Weaving/Overview.html">Weaving the Web</a>. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">What happened next was that logicians entered the field and helped to consolidate half a century of artificial intelligence and knowledge exchange formats into standards like RDF, RDFS and OWL.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The central idea was all these years to build <b>smart programs in which the knowledge they have can easily be exchanged, improved and shared</b>. This is in contrast to normal programs where all "smart" behavior has been written by hand, and is thus hard to change and also hard to get bug-free.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Back to RDF, RDFS, and OWL. All these knowledge exchange formats ultimately describe <b>a model of the world</b>. This model is then used to derive many new true facts from a small set of known true facts. Now it gets interesting: </span><br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><b>What is a model</b>?</span></h3>
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">It turns out, no matter how you start, in the end, a model can always be described (or represented) as:</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">A set of things</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">A set of relationship types</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Relations between things</span></li>
</ul>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">In order to use the model in the real world you also need some kind of mapping from stuff in the real world to things in your model. Example. Let's say you are an insurance company and want to model people and their ownership of cars. One of your clients is <i>Peter</i> and he owns a nice silver <i>Mercedes Benz. </i> To make it easy for us, let's give the things in your model numbers. We use "thing_1" to mean <i>Peter</i> and "thing_2" as the silver <i>Mercedes</i>. We do the same for relations and use "relation_1" to mean <i>to own something</i>. So our model is</span><br />
<br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Set of things: thing_1, thing_2</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Set of relationship types: relation_1</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Relations between things: thing_1 --(relation_1)--> thing_2</span></li>
</ul>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The thing which is hard to explain is, all models ultimately describe things, relationship types and relations between things. And one very obvious way to write such things down is as triples. Each triple is (thing which is linked to something, relationship type how things are linked, thing to which the link goes). </span><br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">RDF and OWL</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Back to RDF, RDFS, and OWL. RDF is pretty close to "just use triples". However, the RDF standard from W3C couldn't resist to include more stuff. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">RDF contains one more <i>genius</i> idea: They use <b>globally unique identifiers (namely URIs)</b> for things and relationship types. This allows to import a number of RDF files, and if they talk about the same things, just put them together and have combined knowledge. E.g. one RDF file records which persons own which cars. Another file could contain triples about colors of cars. Combining the two, we can find out, what colors people seem to like. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The set of defined things and relationship types is often called a <b>vocabulary.</b> The </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><a href="http://www.w3.org/TR/2014/NOTE-rdf11-primer-20140225/">RDF standard</a> describes how to store and express such a vocabulary. The <a href="http://www.w3.org/TR/2014/REC-rdf-schema-20140225/">RDFS standard</a> then defines a vocabulary to describe types, lists, sets, type hierarchies and much more.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Ontology</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">A way to store a model in a computer file together with a way to store a description of the vocabulary is an <b>ontology</b>. In reality, the terms model, vocabulary, and ontology are often mixed up and especially for ontology no crystal-clear definition can be given. The main point is, computers can understand it and humans should understand it, too. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><a href="http://www.w3.org/TR/owl2-overview/">OWL</a> in this sense is just a bigger, more complex vocabulary. In fact, it can be seen as the most expressive, most complicated vocabulary and set of rules that a computer could use without having to run calculations forever. This relates to complexity and computation theory. It is surprisingly easy to say simple things that require <i>enormous</i> amounts of computation. OWL carefully avoided that. Yet, many OWL features are not used in real-world ontology use cases.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Topic Maps</span></h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><a href="https://en.wikipedia.org/wiki/Topic_Maps">Topic Maps</a> are an older, simpler concept. More similar to RDF than OWL. Topics Maps came from libraries and they concern with representing which topics occur in which books and how topics and books belong together. What really <i>is </i>a topic is described in Topic Maps in more depth than in RDF or OWL.</span><br />
<h3>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Play with semantic web ideas now</span></h3>
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">To conclude this short wild ride in the world of semantic web, let me introduce </span><b style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">DenkWerkZeug</b><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">, a tool per creating semantic models. It is a mix of personal wiki, personal semantic web (contains a reasoning engine) and a little bit of mind mapping. There is a free version and you can download it today at </span><a href="http://www.denkwerkzeug.com/" style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">DenkWerkZeug.com</a><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">. You can use it to play around with semantic web concepts.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Feedback is always welcome.</span>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-58317955368875476272015-03-26T11:02:00.003+01:002015-03-26T11:02:39.157+01:00Why the React Hype?<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">If the DOM is a data base, then <b>transactions are the missing feature</b>. <a href="http://facebook.github.io/react/">React</a> adds this. One react cycle is like one transaction. If the browsers would support a kind of <i>native DOM transaction</i>, there would be less hype around React. </span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">The existing "batch operation" in DOM is setInnerHtml. It's funny that this is sometimes faster to set the html string on some top element than changing 100 of little child DOM nodes. Apparently the browser is really good in parsing HTML snippets (no wonder). Imagine how fast things could be, if we could tell the internal browser API more directly which little nodes changes. DOM transactions will come.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">There is already a <a href="https://dvcs.w3.org/hg/undomanager/raw-file/tip/undomanager.html">proposal from 2012 about DOM transactions</a>, here as a special use case for undoing changes when implementing editors.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">There also is a reasonably well-starred library for DOM batch operations on GitHub, called <a href="https://github.com/wilsonpage/fastdom">fastdom</a>. But all it seems to do is group DOM manipulations to occur en groupe. I could not understand how this is much faster, because event processing still happens after every step in the update. Real DOM transactions will group all event processing together, too. Also, like in React, changes that cancel each other out will just not result in any events.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">According to <a href="http://andrew.hedges.name/experiments/innerhtml/">this test</a>, manipulating DOM nodes is really not much faster per se. But changing 100 of different nodes, which have event handlers attached, does make the difference. Thats at least the whole reason for Reacts virtual DOM.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Outlook:</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">I'm not sure, if clever use of Shadow DOM or other web component technologies can be used as DOM transactions.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-17449017231235230422014-06-30T20:23:00.001+02:002014-07-03T14:15:51.562+02:00Business Innovation Graph - This is BIG<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Working hard on representing business models - with the sole goal of finding bugs in them - I'm always looking for new approaches. After having used the <b>Business Model Canvas</b> (BMC, developed by Alex Osterwalder) and having taught it to hundreds of students, it's time for something new. First, let's recap what we have with the BMC:</span><br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Creates common understanding in your team</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Something you will use every week</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Easy to change</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Get overview</span></li>
</ul>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">This is all excellent. And it can be as handy as a single sheet of A4 or A3 paper. However, in the context of lean startup, I need more than the inside view of the business model. What about competition? How to represent double-sided markets well? How different customer segments? A common advice in the community is to create several BMCs for these cases. Suddenly the super-simple BMC becomes a little less simple. Another more subtle benefit of using BMC is: everybody knows it, so it's what the Unified Modeling Language (UML) is for programmers: A common vocabulary. Having said all this, here comes the </span><br />
<b style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Business Innovation Graph (BIG)</b><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">In BIG: </span><br />
<br />
<ol>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">you draw a circle around every relevant part of your business. Those should at least be the stakeholders involved, including your startup. </span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Next connect the circles with lines, and trace where money is moving, and whats moving in exchange. </span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Now simplify: remove all circles until only those contributing significantly to the business are left.</span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Attach monetary values or even simple equations to the arrows.</span></li>
<li><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">As a last step, translate the BIG into a spreadsheet to do a back-of-the-envelope calculation.</span></li>
</ol>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">When doing lean startup, every arrow and every circle is now a hypothesis. What if that circle is not there? How easy do we get a replacement? What about the arrows and the monetary values? What data do we have, they are true? But this is another story, for now, this is the day BIG became public.</span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><b>UPDATE 2014-07-03</b>: Some example pictures</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-LxVOZX3oNHn-yl3aPbXFOkqjK_Q7mnEqXFaDaVh-gt29bypjMMJnrXoDRxb91XcqGDrL79uDjn_Vhfm_LrzRpJi8W9GKkconawDic9ACLmNdFKfJCQVPTPnK8m1Y58Dgsz85/s1600/Slide4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-LxVOZX3oNHn-yl3aPbXFOkqjK_Q7mnEqXFaDaVh-gt29bypjMMJnrXoDRxb91XcqGDrL79uDjn_Vhfm_LrzRpJi8W9GKkconawDic9ACLmNdFKfJCQVPTPnK8m1Y58Dgsz85/s1600/Slide4.png" height="217" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Zzeta9HDA07xRam4gjRCfzMz8aROflKNaQTfKUwFRxycuNQGD65owbz20LLGkWyeJpyICCAcWApevLWRGt_6NWDGzIKczlY4BeE9bbPJjed5v0QspPF-EaNbny8rNx1nCaL7/s1600/Slide3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Zzeta9HDA07xRam4gjRCfzMz8aROflKNaQTfKUwFRxycuNQGD65owbz20LLGkWyeJpyICCAcWApevLWRGt_6NWDGzIKczlY4BeE9bbPJjed5v0QspPF-EaNbny8rNx1nCaL7/s1600/Slide3.png" height="211" width="400" /></a></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT7JWcPMhkz-hPSlJqvfIyJQSa0tJ10RZGNOlTmqyZIYobNH0x2YSH04E8BgH19YkMCXmrN64PlcMv0VbtFPBlQTlSph08w8yaH-xAnRHt3Y1Q8yAMJC8E6lZZ5B9hINUZyX7F/s1600/Slide2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT7JWcPMhkz-hPSlJqvfIyJQSa0tJ10RZGNOlTmqyZIYobNH0x2YSH04E8BgH19YkMCXmrN64PlcMv0VbtFPBlQTlSph08w8yaH-xAnRHt3Y1Q8yAMJC8E6lZZ5B9hINUZyX7F/s1600/Slide2.png" height="216" width="400" /></a></div>
<br />
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">This is a really simple example. And here is the corresponding back-of-the-envelope calculation:</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><ul>
<li><b>variable costs: </b></li>
<ul>
<li>product (-3328€/mo)</li>
<ul>
<li>25 bread rolls (1,60€) = -0,064 €/roll</li>
<li>1 kg flour (-0,55 €)</li>
<li>40g yeast (-0,40 €)</li>
<li>malt (-0,65 €)</li>
<li>salt (ignored)</li>
</ul>
</ul>
<li><b>fix costs</b>: -12200 €/mo</li>
<ul>
<li>salaries (-3660€/mo)</li>
<ul>
<li>master baker salary 1700€ + 20% overhead / month = 2040 €</li>
<li>3 untrained sales people 450€ + 20% overhead = 3 x 540 € </li>
</ul>
<li>oven (-450€)</li>
<ul>
<li>lasts 2 years under heavy use? = 20€/mo</li>
</ul>
<li>shop rent (-8500€)</li>
<ul>
<li>Karlsruhe Marktplatz, 200m^2, direct access to trams</li>
</ul>
</ul>
<li><b>assumptions:</b></li>
<ul>
<li>baking 2000 bread rolls/day</li>
<li>selling them the same day for 1,- € each = 2000€*26 = +52000,- €/mo</li>
<li>open 16 hours per day, 6 days/week = 26 days/month</li>
</ul>
<li><b>profit:</b> 52000 – 15500 = 36500 €</li>
</ul>
</span><span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">The obviously most relevant hypothesis are:</span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">1) selling a bread roll for 1€</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">2) selling 2000 of them at this price and location</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Minor, but still highly relevant assumptions:</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">3) It's legal to employ untrained sales people</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">4) A single oven is enough to bake 2000 bread rolls a day</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">5) many others...</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Maybe a competitor would also be a highly relevant stakeholder :-)</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><i>License: CC-BY-SA, Dr. Max Völkel 2014</i></span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><i><br /></i></span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><i>And thanks to Anne Siebold for the discussions that became BIG.</i></span></div>
<br />
<!--StartFragment-->
<!--EndFragment-->Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com1tag:blogger.com,1999:blog-5858414.post-47503443274077602282014-06-24T18:17:00.001+02:002014-06-24T18:17:16.822+02:00Which Books should an Entrepreneur Read?<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">If I could go back in time to 2010 and give myself a single advice what to do, to be a more successful entrepreneur, what would it be?</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">My answer: <br /><i>Max</i>, read (in this order) these books:</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><b>1) The Lean Startup</b></span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><a href="https://www.amazon.de/dp/0307887898?tag=xamde01-21&camp=2906&creative=19474&linkCode=as4&creativeASIN=0307887898&adid=14DBK9RXG36998AHHWE1&">The Lean Startup: How Today's Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses</a>, Eric Ries</span><br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">This book explains that Lean Startup is a good idea (get feedback early, test your assumptions). </span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">However, even if you are really convinced, it's hard to apply. You need...</span></li>
</ul>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><b>2) Running Lean</b></span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><a href="https://www.amazon.de/dp/B006UKFFE0?tag=xamde01-21&camp=2906&creative=19474&linkCode=as4&creativeASIN=B006UKFFE0&adid=1KDVBV22PF9KR4FSKQ4Q&">Running Lean: Iterate from Plan A to a Plan That Works</a>, Ash Maurya</span><br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">This is a "cook-book", especially for web startups. It makes the theory and stories from Lean Startup applicable. But this book does not explain the <i>why</i>. That's why you need to read Running Lean second, when you actually start.</span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">If you follow this book by the letter... you still fail horribly. Maybe even harder. It's because you also need to read <i>...</i></span></li>
</ul>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><b>3) The Mom Test</b><br /><a href="https://www.amazon.de/dp/1492180742?tag=xamde01-21&camp=2906&creative=19474&linkCode=as4&creativeASIN=1492180742&adid=0ME07YAT0A6SBWHTV3ZG&">The Mom Test: How to talk to customers & learn if your business is a good idea when everyone is lying to you</a>, Rob Fitzpatrick</span><br />
<ul>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">This book explains how to talk to people and get real data instead of nice, but dangerously misleading compliments. </span></li>
<li><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">I think I summed up a lot of the content of the book in a <a href="https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0CCgQFjAB&url=http%3A%2F%2Fwww.slideshare.net%2Fxamde%2Fsummary-of-the-mom-test&ei=ZqOpU57hF5CV7Aa-2oHADQ&usg=AFQjCNF_OLxL1wDvxmYXS606XAJjGD_OTA&sig2=KpkeT8s-3m2dUMMovnP3Cg&bvm=bv.69620078,d.ZWU">slide deck on slideshare</a>. Takes ca. 45 Minutes to consume.</span></li>
</ul>
<br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">That's it. What is you single best advice?</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif;">Disclaimer: Book links are using an Amazon affiliate code.</span><br />
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Ad: <a href="http://www.calpano.com/services/consulting/lean/">Calpano offers consulting for you next innovation project</a>.</span>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-52630175432342098172014-05-13T15:40:00.001+02:002014-05-13T15:40:54.853+02:00Datensatz nicht plausibel.Dieser Blog-Post existiert nur um anderen Leuten zu helfen, die über Google die Fehlermeldung eintippen.<br />
<br />
Steuererklärung mit der Akademischen Arbeitsgemeinschaft / Haufe Verlag? Genauer bei der gesonderten Feststellung. Beim Absenden der finalen Erklärung folgenden Fehler?<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5SFrgvhC3uHp77ptLNfMucqbyBU4fPOdYg4va30s2NUecjziyjFHyDmVd8taZrbQNyKhUKYktISkqEp-lNhiG0DkrL0IDjUnRJpFjj7wV90xuIpLOQGeaohfgzGl9_dGhSnZ7/s1600/fail.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5SFrgvhC3uHp77ptLNfMucqbyBU4fPOdYg4va30s2NUecjziyjFHyDmVd8taZrbQNyKhUKYktISkqEp-lNhiG0DkrL0IDjUnRJpFjj7wV90xuIpLOQGeaohfgzGl9_dGhSnZ7/s1600/fail.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
Für Google, da steht: </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
Das Feld $9846025/1.1@2$ darf nur Ziffern enthalten. Feld: 9846025</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Hmm. Wie findet man den Fehler? Falsches Passwort beim Software-Zertifikat? Einloggen auf Elster.de ... klappt. Wo in der Steuererklärung ist überhaupt Text sinnvoll - sind doch überall nur Zahlen? ... In der Anschrift. Wo in der Anschrift sind nur Zahlen erlaubt? Postleitzahl, Telefonnummer und ... Hausnummer? Wer in der Musterstraße 8a wohnt, darf auf gar keinen Fall die 8 und das 'a' in das gleiche Feld tun. Straße ist "Musterstraße", Hausnummer ist "8" und das "a"? Nummernzusatz! "<i>Geben Sie den Hausnummerzusatz zum Zeitpunkt der Abgabe der Steuererklärung an."</i> </div>
<div class="separator" style="clear: both; text-align: left;">
Das war's. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
(Soeben kam ein Update rein, vielleicht ist es schon repariert.)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com1tag:blogger.com,1999:blog-5858414.post-4677813462401864662014-03-24T18:54:00.000+01:002014-03-24T18:57:41.163+01:00Notes on DevCamp Karlsruhe 2014 #dcka14 2014-03<h2>
<b>What I Learned at </b><a href="http://www.nerd-zone.com/Devcamp/"><span class="s1"><b>DevCamp Karlsruhe</b></span></a><b> 2014 #dcka14</b></h2>
<div class="p2">
<span class="s2">See also: <a href="file:///Users/xamde/Desktop/j.mp/dcka14-tt"><span class="s3">Sessionplan</span></a></span></div>
<div class="p3">
<br /></div>
<div class="p4" style="text-align: center;">
Day 1, SATURDAY 22RD MARCH 2014</div>
<div class="p5">
<b><br /></b></div>
<div class="p5">
<b>Session 1: Docker</b></div>
<div class="p4">
Docker allows to create quite light-weight virtual Linux machines. It does this by exploiting a feature called <a href="https://en.wikipedia.org/wiki/LXC"><span class="s1">LCX</span></a>, something that became possible on since Linux 2.6.something. Docker records system snapshots after each relevant change step.</div>
<div class="p4">
My thoughts: Somehow I thought about the general problem of using components, modules, docker images, whatever you call pre-made code pieces you want to run. The main tasks are always the same and have to be solved by package manager (apt-get, homebrew, macports, …), dependency managers (maven, grunt, …), or component marketplaces. Any kind of component must be</div>
<ul class="ul1">
<li class="li6">searched and found or discovered - you must try to find a component and get a system-dependent ID for it</li>
<li class="li6">get - transfer the component to your target machine. And make sure to get the right version. That is a science on it’s own (maven reactor build…)</li>
<li class="li6">install and configure - Prepare for running the component; should be easy; most often isn’t.</li>
<li class="li6">start - execute the component code</li>
<li class="li6">use - get this feeling of success from actually using some functionality of the component</li>
<li class="li6">stop - free system resources, keep being in control and stop the component</li>
<li class="li6">automate starting and stopping - maybe even automate configuration</li>
<li class="li6">manage deployment for production - maybe this includes some kind of automation for updates. Or maintenance: Disk full due to logs? Add monitoring to find out when to upgrade server or change config.</li>
</ul>
<div class="p4">
All these steps are really to much work for simple things. That’s why developers prefer often to</div>
<ul class="ul1">
<li class="li6">Just write it yourself - ignoring for a moment that most problems will still apply :-)</li>
<li class="li6">Call a service - ignoring that you just opened a can of worms of new problems: network outages, quality of service, price, …</li>
</ul>
<div class="p4">
Conclusion: Probably one can create a startup around dependency management similar to GitHub (versioning) or Docker (virtual machines).</div>
<div class="p5">
<b><br /></b></div>
<div class="p5">
<b>S</b><b>ession 2: Search-driven Applications</b></div>
<div class="p4">
If you have entities in different database tables or several data bases and need to show a unified view in the UI, you can use a search server to harmonize the data in a way. The search server indexes the data redundantly. It provides fields with values, hence its a database on its own. It is completely de-normalised and allows searching, ranking, sorting. Combined with clever fields such as using terms like “/products/home/sofa”,“/products/home”, “/products” you can even get hierarchical navigation and facetted search. Much easier then in SQL.</div>
<div class="p4">
My thoughts: Integration data from different sources is not really a search problem. Funny, how the search server community ended as the solution to this problem. Maybe traditional data bases should offer better search capabilities? Adding another index is certainly not the hardest thing to do :-)</div>
<div class="p4">
<br /></div>
<div class="p4">
– <b><i>Lunch</i></b> –</div>
<div class="p4">
<br /></div>
<div class="p5">
<b>Session 3 & 4: Scala Introduction & Workshop</b></div>
<div class="p4">
Scala is a possible future of Java. Previous language design from Scalas creator – Martin Odersky – became Java versions, e.g. the Generics feature of Java 1.5. So other features of Scala might be Javas future as well. In Java 8, lambda expressions arrived. What is the main thing in Scala? The type system. A turing complete, mighty type system. The one end of statically typed languages. Testing? Possible, but not really needed, our presenter <a href="https://github.com/soc"><span class="s1">Simon Ochsenreither</span></a> told us. Oh, and Scala has a sophisticated collections API … maybe similar to the Streams-API that just arrived in Java 8? I’ll have to check.</div>
<div class="p4">
My thoughts: The talk made me curious. What about the other JVM languages? <a href="http://clojure.org/"><span class="s1">Clojure</span></a>? Google: “clojure vs. scala”. Ah, clojure is centered around data; is based on Lisp (“code as data”); is simpler. Groovy? “groovy vs. scala”? Just read this excellent answer on SO: <span class="s1"><a href="http://stackoverflow.com/questions/1314732/scala-vs-groovy-vs-clojure">Scala vs. Groovy vs. Clojure (closed)</a></span></div>
<div class="p4">
<br /></div>
<div class="p7">
<b>How to Install Scala with Eclipse</b></div>
<div class="p4">
Installation turned out to be tricky. A good install path is this one:</div>
<ul class="ul1">
<li class="li6">You have already Eclipse installed</li>
<li class="li6">You “Install new software…” from this update site:</li>
<ul class="ul2">
<li class="li6">Eclipse update sites URLs listed here: <a href="http://scala-ide.org/download/current.html"><span class="s1">http://scala-ide.org/download/current.html</span></a> - Now you have Scala, an Eclipse Scala IDE feature and even support for running Scala tests, yeah!</li>
</ul>
</ul>
<div class="p5">
<b>Session 5: Hot Shit</b></div>
<div class="p4">
We were a group of ca. 20 people, each listing hot shit in a shared doc and explaining what’s cool about a given tool/service/framework.</div>
<div class="p4">
My picks: Install desktop apps on OS X quicker with <a href="https://github.com/phinze/homebrew-cask"><span class="s1">Cask</span></a>, a homebrew extension.</div>
<div class="p4">
My thoughts: Wow, so many people use VIM (we did a show of hands). So many people administrate servers. What are all these Java developers doing? In the morning it turned out ca. 70–80% of all people worked with Java.</div>
<div class="p3">
<br /></div>
<div class="p4" style="text-align: center;">
Day 2, SUNDAY 23RD MARCH 2014</div>
<div class="p5">
<b><br /></b></div>
<div class="p5">
<b>Session 1: Working from Home</b></div>
<div class="p4">
Several people introduced their way of working from home. Not sometimes, but every day. Some met for planning every two weeks in person, some never. Almost all used a kind of daily stand-up (eh, call-in) meeting.</div>
<div class="p4">
My thoughts: Working together physically is nice, but probably falls under the pattern “Tyranny of the dominant decomposition” [1]. One office can only a group of people be grouped by one aspect. Working remotely, people can be grouped in many ways, forming communication links as needed. This has the <i>potential</i> to be more productive.</div>
<div class="p5">
<b><br /></b></div>
<div class="p5">
<b>Session 2: Firefox OS</b></div>
<div class="p4">
Firefox is building an operating system (OS) for cheap smart phones, targeting emerging markets. Our presenter urged us to check out <a href="https://wiki.mozilla.org/WebAPI"><span class="s1">https://wiki.mozilla.org/WebAPI</span></a> to find many new web APIs which will find their way into desktop browsers, too. They allow to do many fun things, such as reading sensors of all kind, triggering notifications, vibration or even making a phone call.</div>
<div class="p4">
Politically, it’s clear why Firefox and Google both push hard to move more stuff to the web - or extend the web to more areas. Apple, however, has a different business model. Selling apps with at 30% fee is attractive. So I wonder how Apple will react.</div>
<div class="p4">
My thoughts: Before this session I thought implementing a browser in a browser is just crazy and idiotic. Now I think this is called Firefox OS and makes sense. HTML5 is such an advanced and mature UI technology, it makes just sense to use it <i>everywhere</i>. Which includes the basic operating system. Which of course, includes a browser.</div>
<div class="p4">
<br />
Link: <a href="https://github.com/appsbu-de/talk-ffos_bcrm13/tree/dcka14">https://github.com/appsbu-de/talk-ffos_bcrm13/tree/dcka14</a><br />
<br /></div>
<div class="p4">
– <b><i>Lunch</i></b> –</div>
<div class="p5">
<b><br /></b></div>
<div class="p5">
<b>Session 3: MEAN Frontend</b></div>
<div class="p4">
MEAN is</div>
<ul class="ul1">
<li class="li6">MongoDB - NoSQL database</li>
<li class="li6">Express - web framework for NodeJS</li>
<li class="li6">Angular JS - MVC framework for JS</li>
<li class="li6">Node JS - server runtime for JS code</li>
</ul>
<div class="p4">
It was quite amazing to see how quick our presenter managed to build an app, live during the talk.</div>
<div class="p4">
My thoughts: The main productivity boost on the front-end was Angular JS plus its extensions. No wonder, the other 3 parts of MEAN are back-end technologies :-) Angular JS hard-coded the most common things one does with HTML interfaces over and over again. It’s really top-notch right now. I’m very curious how it will work together with <i>Web Components</i>, the web UI’s future.</div>
<div class="p5">
<b><br /></b></div>
<div class="p5">
<b>Session 4: “Space Conquest”</b></div>
<div class="p4">
The fun session. A game server runs Lua VMs. Each player starts with a base station on a planet, building ships, flying around, fighting, mining ore, colonizing new planets, becoming another base station, building ships… Each station and each ship is another Lua VM. No, what is the perfect code to conquer the galaxy?</div>
<div class="p4">
My thoughts: Something like this could become the next Minecraft. Lua looks interesting. Maybe the ultimate VM of the internet will NOT be JavaScript but Lua? That would be fun. But most likely it will be JavaScript.<br />
<br />
Link: <a href="https://wpn.nerd2nerd.org/doku.php">https://wpn.nerd2nerd.org/doku.php</a></div>
<div class="p1">
<b><br /></b></div>
<div class="p1">
<b>Summary</b></div>
<div class="p4">
Thanks to all sponsors, speakers and participants.</div>
<div class="p4">
<br /></div>
<br />
<div class="p4">
[1] Tarr, P., Ossher, H., Harrison, W., Sutton, S.M. “N Degrees of Separation: Multi-Dimensional Separation of Concerns” in Proc. ICSE’99</div>
Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com1Karlsruhe, Germany49.009148 8.379944448.842523500000006 8.057220899999999 49.1757725 8.7026679tag:blogger.com,1999:blog-5858414.post-58075974332663784662014-02-27T22:46:00.001+01:002015-06-13T12:44:31.041+02:00GWT is coming back ... in 2015<span style="font-family: Verdana, sans-serif;">Note: This post was published back in 2014-02-27. I can see a year into the future :-)</span><br />
<h1 id="gwtiscomingback">
<span style="font-family: Verdana, sans-serif;">GWT is coming back!</span></h1>
<span style="font-family: Verdana, sans-serif;"><a href="http://www.gwtproject.org/overview.html">Google Web Toolkit</a> (GWT) will have a huge come-back in 2015. Here is why. </span><br />
<span style="font-family: Verdana, sans-serif;">First, let’s look when and why GWT was created and what it <em>is</em>. If you know the Web and GWT, you can skip straight to <em>My Predictions</em> at the end.</span><br />
<h1 id="gwthistorypresentandfuture">
<span style="font-family: Verdana, sans-serif;">GWT History, Present and Future</span></h1>
<h3 id="1994-2006beforegwt">
<span style="font-family: Verdana, sans-serif;">1994–2006 Before GWT</span></h3>
<ul>
<li><span style="font-family: Verdana, sans-serif;">1994: Internet Explorer 1.0 was launched as an add-on to Windows 95.</span></li>
<li><span style="font-family: Verdana, sans-serif;">1996: The <code><IFRAME></code> tag was invented and allowed web sites to become slightly more interactive.</span></li>
<li><span style="font-family: Verdana, sans-serif;">2001: Internet Explorer 6.0 was launched.</span></li>
<li><span style="font-family: Verdana, sans-serif;">2002: XmlHttpRequest invented by Internet Explorer, adopted by Mozilla.</span></li>
<li><span style="font-family: Verdana, sans-serif;">2004: GMail from Google launched publicly. Besides showing the world what was possible in a browser (“a real application!”), it also used the predecessor of the Closure compiler. AJAX was heavily used. <strong>Web 2.0 is there.</strong></span></li>
<li><span style="font-family: Verdana, sans-serif;">2005: Internet Explorer had 87% market share and kept growing.</span></li>
</ul>
<h3 id="2006:gwtlaunched">
<span style="font-family: Verdana, sans-serif;">2006: GWT Launched</span></h3>
<span style="font-family: Verdana, sans-serif;">Sometime here the initial GWT team must have started to work. GWT was created when Internet Explorer 6.0 was the most relevant browser. Each browser had different bugs and APIs, but IE 6 was considered the worst.
GWT launched with a unified API of widgets and events, which worked the same on all major browsers.</span><br />
<ul>
<li><span style="font-family: Verdana, sans-serif;">2006, Q2: Release of GWT 1.0.0</span></li>
</ul>
<h3 id="2006-2014:fromwebtoapps">
<span style="font-family: Verdana, sans-serif;">2006 - 2014: From Web to Apps</span></h3>
<ul>
<li><span style="font-family: Verdana, sans-serif;">2006, Q3: Release of jQuery 1.0.0 (<a href="https://jquery.org/history/">source</a>).
jQuery also unified the different browser quirks.</span></li>
<li><span style="font-family: Verdana, sans-serif;">2007, Q2: iPhone was launched. It could only launch web apps. There was no app store yet. Q4: Android 1.x beta launched on phones.</span></li>
<li><span style="font-family: Verdana, sans-serif;">2008, Q2: Apples AppStore was launched. Soon thereafter (in 2010), “<a href="http://www.wired.com/magazine/2010/08/ff_webrip/">the web is dead</a>” and people somehow <em>needed</em> apps. <strong>Apps, Apps, Apps</strong></span></li>
<li><span style="font-family: Verdana, sans-serif;">2009, Q4: GWT 2.0.0 released. <a href="http://phonegap.com/">PhoneGap</a> launched. It allows JavaScript to access sensors, camera, local address book, and other local services on the phone.</span></li>
<li><span style="font-family: Verdana, sans-serif;">2010, Q2: Apple iPad launched. <strong>Tablets! Everybody needs one!</strong></span></li>
<li><span style="font-family: Verdana, sans-serif;">This was also the launch of the Chrome Web Store. Now web apps truly existed.</span></li>
<li><span style="font-family: Verdana, sans-serif;">2011, Q1: Android 3.x on tablets. Q4: mgwt 1.0.0 and gwt-phonegap launched. (<a href="http://blog.daniel-kurka.de/2011/11/mgwt-10-released.html">source</a>). MGWT mimics the UI widgets of iOS and Android; is packaged as a normal app via PhoneGap; runs find on phones and tablets.</span></li>
<li><span style="font-family: Verdana, sans-serif;">2011, Q4: Android 4.x unified phone and tablets OS. PhoneGap was open-sourced as <a href="https://cordova.apache.org/">Apache Cordova</a>.</span></li>
<li><span style="font-family: Verdana, sans-serif;">In the meantime: JavaScript
</span><ul>
<li><span style="font-family: Verdana, sans-serif;">became <em>a lot</em> faster - thanks to optimizations, <a href="http://www.2ality.com/2013/02/asm-js.html">asm.js</a> (a fast JS subset);</span></li>
<li><span style="font-family: Verdana, sans-serif;">easier to debug - step-by-step debugger in the browser</span></li>
<li><span style="font-family: Verdana, sans-serif;">easier to debug from compiled languages - thanks to <em>Source Maps</em> <a href="https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?hl=en_US&pli=1&pli=1">Rev 3 Proposal from Mozilla</a></span></li>
</ul>
</li>
</ul>
<h1 id="2014:thecurrentstateofaffairs">
<span style="font-family: Verdana, sans-serif;">2014: The Current State of Affairs</span></h1>
<span style="font-family: Verdana, sans-serif;">50% of web traffic comes from mobile. Vendors have to support at least 3 major form factors (desktop, tablet, smartphone) multiplied by 3–4 platforms (Web, Windows, iOS, Android).
To reduce costs, people started to code the back-ends of their apps in JavaScript and sometimes the user interface, too. Hybrid apps were born.</span><br />
<h2 id="whatisgwt">
<span style="font-family: Verdana, sans-serif;">What <em>is</em> GWT?</span></h2>
<span style="font-family: Verdana, sans-serif;">GWT today, version 2.6.0, contains several parts, all available under
the <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache 2.0 License</a>:</span><br />
<ul>
<li><span style="font-family: Verdana, sans-serif;">Java to JavaScript compiler - translates all of Java 7 syntax to valid JavaScript code.</span></li>
<li><span style="font-family: Verdana, sans-serif;">Java Runtime Emulation (JRE) - provides implementations in JavaScript for basic Java APIs. <a href="http://www.gwtproject.org/doc/latest/RefJreEmulation.html">Here is the list of supported APIs</a>.</span></li>
<li><span style="font-family: Verdana, sans-serif;">UIBinder - create complex layouts with XML config files</span></li>
</ul>
<span style="font-family: Verdana, sans-serif;">To give you a feeling for the land in which GWT lives, here are the dependencies used by GWT 2.6.0: HtmlUnit 2.13, Jetty 8.1,Servlet 3.0, Guava 15.0, Protobuf 2.5.0, ASM 4.1, JDT 3.8.3, <a href="https://developers.google.com/closure/compiler/">Closure compiler</a> 20131014 (optimizes JavaScript).</span><br />
<span style="font-family: Verdana, sans-serif;">The main focus of GWT is on <strong>performance</strong>. To achieve this, GWT tries to</span><br />
<ul>
<li><span style="font-family: Verdana, sans-serif;">minimize code size (compact javascript)</span></li>
<li><span style="font-family: Verdana, sans-serif;">minimize number of network requests (inlined styles, images, i18n resources)</span></li>
<li><span style="font-family: Verdana, sans-serif;">optimize for caching (huge cacheable chunks, tiny dynamic loader script)</span></li>
</ul>
<span style="font-family: Verdana, sans-serif;">GWT comes with a very nice debugging mode, called DevMode. In DevMode a native browser plug-in re-routes most calls to a running IDE such as Eclipse, which runs remote debug mode. This allows to debug step-by-step, live running Java code mapped to JavaScript code.</span><br />
<h2 id="isgwtrelevant">
<span style="font-family: Verdana, sans-serif;">Is GWT relevant?</span></h2>
<ul>
<li><span style="font-family: Verdana, sans-serif;">At Google: yes, 1k internal users; Many products built with GWT: Google Shopping Express, Adwords Manager, Google Sheets v2</span></li>
<li><span style="font-family: Verdana, sans-serif;">Externally: 100k users of SDK</span></li>
</ul>
<span style="font-family: Verdana, sans-serif;">Sources: <a href="http://www.slideshare.net/cromwellian1/gwtcreate-keynote-san-francisco">GWT.create keynote</a>, <a href="https://vaadin.com/gwt/report-2013">GWT Report 2013</a></span><br />
<h1 id="2014:thefutureoftheweb-components">
<span style="font-family: Verdana, sans-serif;">2014: The Future of the Web - Components</span></h1>
<span style="font-family: Verdana, sans-serif;">The web (standards and browsers) morph into a real app platform.</span><br />
<ul>
<li><span style="font-family: Verdana, sans-serif;">2013, Q2: <a href="http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html">HTML Templates</a> released as W3C Editor’s Draft.</span></li>
<li><span style="font-family: Verdana, sans-serif;">2014, Q1. Four new W3C Editor’s Drafts released:</span><br />
<ul>
<li><span style="font-family: Verdana, sans-serif;"><a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html">Custom HTML Elements</a> - each custom element has a name, properties, functions, events, child content. Elements can be nested. <strong>The web has a native component system!</strong></span></li>
<li><span style="font-family: Verdana, sans-serif;"><a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html">Shadow DOM</a> - multiple DOM trees in a single web page; can interact with each other</span></li>
<li><span style="font-family: Verdana, sans-serif;"><a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html">HTML Imports</a> - import HTML pages into other HTML pages, including scripts</span></li>
<li><span style="font-family: Verdana, sans-serif;"><a href="http://www.w3.org/TR/css-grid-1/">CSS Grid Layout</a> - native-like GUI layout (basically, tables done right)</span></li>
</ul>
</li>
</ul>
<span style="font-family: Verdana, sans-serif;">Taken together, these 5 standards are called “Web Components”. There is a <a href="http://ebidel.github.io/webcomponents/">nice overview page here</a>.
To make it nicer to work with these APIs and to polyfill support in older browsers, both Google and Firefox provide JS libraries. To quote the <a href="http://www.x-tags.org/blog">official X-Tag blog</a>:</span><br />
<blockquote>
<span style="font-family: Verdana, sans-serif;">“X-Tag and Polymer are both high-level sugar libraries that build upon the W3 Web Components specs - each introduces a different approach to making development of web components an even more amazing experience. To help make this more relatable, consider the following: jQuery : DOM :: X-Tag/Polymer : Web Components.”</span></blockquote>
<ul>
<li><span style="font-family: Verdana, sans-serif;">2014, Q4 (planned): ECMAScript 6 (ES6) will be standardized. New stuff: Classes, modules, promises, generators.</span></li>
</ul>
<h2 id="whatwillgwtbe">
<span style="font-family: Verdana, sans-serif;">What <em>will</em> GWT <em>be</em>?</span></h2>
<span style="font-family: Verdana, sans-serif;">The GWT Roadmap and the talks at the GWT.create conference promise a number of things for GWT 3.0 and beyond:</span><br />
<ul>
<li><span style="font-family: Verdana, sans-serif;">(+) Interoperability with JavaScript: Instead of the current JSNI calls with lots of redundant Java code, GWT 3.x can auto-create annotated Java interfaces which magically just work to call the JavaScript API underneath.</span></li>
<li><span style="font-family: Verdana, sans-serif;">(+) Incremental compile! This will give GWT developers a work-flow similar to other JS hackers. Hack, reload, see.</span></li>
<li><span style="font-family: Verdana, sans-serif;">(+) Java 8 support - writing callback handler will use <em>less</em> syntax than JavaScript</span></li>
<li><span style="font-family: Verdana, sans-serif;">(+) CSS3 support - mostly boring technical work which is simply required :-)</span></li>
<li><span style="font-family: Verdana, sans-serif;">Most importantly:
A new widget system, which is based on <em>web components</em>. <a href="https://docs.google.com/document/d/1tir74SB-ZWrs-gQ8w-lOEV3oMY6u6lF2MmNivDEihZ4/edit">Working draft of GWT team</a></span></li>
<li><span style="font-family: Verdana, sans-serif;">(-) The DevMode will die. It never worked on mobile, and it will stop working in 2014 (based on out-dated/internal browser APIs). The new debug mode, Super Dev Mode, will run in the browser, not in the IDE. I see a serious problem here, and we have to see, how this turns out. At least SourceMaps will allow to de-obfuscate stack traces. More infos: <a href="https://docs.google.com/presentation/d/1DTWZ_06dQsTPhinIwzHSdoPMndRr92wpZoZWicK97YQ/edit#slide=id.p">“Beyond Dev Mode”</a>.</span></li>
</ul>
<span style="font-family: Verdana, sans-serif;">Sources: <a href="http://www.slideshare.net/cromwellian1/gwtcreate-keynote-san-francisco">GWT.create keynote</a>, <a href="https://docs.google.com/presentation/d/1PfXXegni0gcZQYpX09t0gs2Z9dqST5MmiHc_NoPSluo/edit">GWT Roadmap presented at Google I/O 2013</a></span><br />
<h1 id="mypredictions">
<span style="font-family: Verdana, sans-serif;">My Predictions</span></h1>
<span style="font-family: Verdana, sans-serif;"><strong>The Web</strong>: As the number of devices and operating systems grows, a unified development process becomes more interesting. With web components the web becomes a composable platform for application development. There will be markets for tags, in the same way as there are markets for Wordpress plugins today. </span><br />
<span style="font-family: Verdana, sans-serif;"><strong>GWT:</strong>
Let’s assume the GWT community of developers manages to do the following:</span><br />
<ul>
<li><span style="font-family: Verdana, sans-serif;">Deliver the features planned in the road map (JS interop, Java 8, incremental compile)</span></li>
<li><span style="font-family: Verdana, sans-serif;">Provide a solid initial widget set, maybe inspired by Polymer and Bootstrap</span></li>
<li><span style="font-family: Verdana, sans-serif;">Find a usable way to debug code</span></li>
</ul>
<span style="font-family: Verdana, sans-serif;">As soon as that happened (planned in 2014, likely to happened in 2015 :-), GWT will get a huge comeback. Why? Although the stated goal of GWT is <strong>performance</strong>, which always wins hearts of developers, the true magic is that GWT allows to tame <strong>complexity</strong>. I know, for GWT newcomers this is really quite the opposite, but for bigger apps it’s true. As requirements of users and the world only rise, the complexity rises with it. Combined with JS interop and Web Components, GWT will be the glue (and structure) that holds it all together.</span><br />
<span style="font-family: Verdana, sans-serif;">The biggest apps (most complex in client-side business logic) will be written in GWT. Just like Google Sheets.</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>
<span style="font-family: Verdana, sans-serif; font-size: x-large;"><b>UPDATE 2015, June</b></span><br />
<span style="font-family: Verdana, sans-serif;"><b>Good: Technology, Usage</b></span><br />
<span style="font-family: Verdana, sans-serif;">On Google IO 2015 there was not a single mention of GWT. However, GWT has its own conference by now, and it was even earlier than Google IO.</span><br />
<span style="font-family: Verdana, sans-serif;">In Januar 2015, there was the <a href="http://gwtcreate.com/">GWT.create</a> conference. Many Google employees spoke there. Of particular interest was the talk on Google Inbox. It turns out, the new mail client from Google, with the goal to replace GMail one day, was written 60-70% in GWT. The new Google Sheets was also written in GWT. </span><br />
<span style="font-family: Verdana, sans-serif;"><b>Bad: Documentation</b></span><br />
<span style="font-family: Verdana, sans-serif;">On the downside, Google seems to have used many GWT features that might or might not be released in a stable way yet -- the documentation is certainly behind. E.g. try to find something on "js interop" in the developer documentation: you find it only in release notes and some examples.</span><br />
<span style="font-family: Verdana, sans-serif;">So the future in which GWT comes back is here, but its just not evenly distributed yet. Sadly, my prediction is, it will remain this way, as there are neither enough volunteers nor companies, which would have enough incentive to document GWTs new stuff.</span><br />
<span style="font-family: Verdana, sans-serif;"><br /></span>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com32tag:blogger.com,1999:blog-5858414.post-51763540761926061572013-10-22T11:12:00.001+02:002013-10-22T11:15:24.944+02:00Free Open-Source Embeddable Java NoSQL Databases<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span id="docs-internal-guid-33a3b5cb-df3f-2477-bfe5-b19bc4ec65fc"></span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 6pt; margin-top: 24pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-size: large;"><a href="https://docs.google.com/document/d/10W6-i_Nsl-SZeUq1DDa6hPAh2C0URwWlXtim7Rue3KQ/pub">Free Open-Source Embeddable Java NoSQL Databases</a></span></span></div>
<b id="docs-internal-guid-33a3b5cb-df34-71cb-a024-d0f4efa483e0" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">For a desktop product in our company we are looking for a project that is</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Free</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: Zero license fees, even when uses commercially. So acceptable licenses are: Apache License, BSD, Eclipse License etc. Non-acceptable are GPL (our desktop software cannot be free, we need money :-), and LGPL (license situation in Java-land unclear, might be too close to GPL. Although the motivation behind LGPL is just right).</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Open-Source</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: We open source many of our work, too, and like to tinker with stuff. Also, code (plus JavaDocs) is a good documentation.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Embeddable</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: For a desktop product an embeddable database seems just perfect. When the user shuts down the program, it's stopped. Also, no local socket communication is required, hence we might improve performance. In the future, we might have to port our app to Android or even iOS.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Java</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: Our app is currently in Java and we know the environment and ecosystem well.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">NoSQL</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: We just don't need SQL. We have already a backend written on top of the Google Appengine Datastore. Precisely, we need a database that supports at least</span></div>
</li>
<ol style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Key-Value store with Strings up to ca. 500 chars as keys, and </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Range-queries on keys</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Arbitrary byte[] values</span></div>
</li>
</ol>
<li><span style="font-family: Arial; font-size: 15px; font-weight: bold; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">Databases</span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">: We want to store data on disk in an ACID way. I.e. we don't want to manage writing to disk, reading from disk, recovering from errors, optimizing file layout, etc.</span></li>
</ul>
<div dir="ltr" style="font-family: Arial; font-size: 15px; line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
<span style="vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="font-family: Arial; font-size: 15px; line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
The resulting research turned out to take much more time than expected (ca. 20 hours). The result is in this epic Google doc: <span style="background-color: #f0f0f0; font-family: arial, sans, sans-serif; font-size: small;"><a href="https://docs.google.com/document/d/10W6-i_Nsl-SZeUq1DDa6hPAh2C0URwWlXtim7Rue3KQ/pub">Java free & open source embeddable NoSQL databases</a>.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-85939871661953299962013-09-30T18:32:00.000+02:002013-09-30T21:00:52.048+02:00Value Proposition Map (for class-room use)<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">Since I started to officially teach entrepreneurship at KIT in Spring 2013, I started to use the great tools form Alexander Osterwalder. I like to introduce the topic with the <a href="http://www.businessmodelgeneration.com/downloads/value_proposition_canvas.pdf"><i>Value Proposition Canvas</i></a> (PDF) and then move on to the more complex <i>Business Model Canvas</i>. After a while, however, I started to notice students would spend a lot of time in exercises to discuss if something was a "pain" or a "gain. Also, it took long to discuss "pain reliever" vs. "gain creator". As this is in my opinion a minor point (although selling on pain usually is much easier than selling gains) I simplified the diagram. Also I tried to made the help texts much much shorter. The resulting <i>Value Proposition Map</i> worked well as a 10-15 minute exercise in classroom.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOTnLCJn3G4FJOc7fCmUVqRpDAYE7btrq2hWUDDVxoHZAYhIGKiPNzjHWgDnCb9K5EOUJrrTpDP7Q3Ez_Y-KYt4aaqwjurBZ1jTnOHV6J1ctgjrMxsBAVpwEsnMFpgM7FDPDaq/s1600/Screen+Shot+2013-09-30+at+18.18.52.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOTnLCJn3G4FJOc7fCmUVqRpDAYE7btrq2hWUDDVxoHZAYhIGKiPNzjHWgDnCb9K5EOUJrrTpDP7Q3Ez_Y-KYt4aaqwjurBZ1jTnOHV6J1ctgjrMxsBAVpwEsnMFpgM7FDPDaq/s640/Screen+Shot+2013-09-30+at+18.18.52.png" width="640" /></span></a></div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">PDF at <a href="http://xam.de/2013/2013-09-ValuePropositionMap-MaxVoelkel-v2.pdf">http:/xam.de/2013/2013-09-ValuePropositionMap-MaxVoelkel-v2.pdf</a></span><br />
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span></div>
<div>
<span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">This is version 2, any feedback is welcome. Feel free to use, licensed under <a href="http://creativecommons.org/licenses/by-sa/3.0/">http://creativecommons.org/licenses/by-sa/3.0/</a>.</span><br />
<div>
<br /></div>
</div>
Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-84536503056360461052013-09-23T09:55:00.000+02:002013-09-23T09:55:15.749+02:00Bundestagswahl 2013 WählerwanderungFinally I know what happend last night:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHZTMLIx2w1PGvh4DBcEw3Bdwd7xiw8UPM3tzLv77lp2igeTOSTrFk_IMQM-NtQvd9zlDdZqN_oWaA6G3XMHOW41kOT53JRurgY9krTiEz5tBNpaK3nnF5tWGExsBY5zhsimz8/s1600/Screen+Shot+2013-09-23+at+09.54.28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="636" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHZTMLIx2w1PGvh4DBcEw3Bdwd7xiw8UPM3tzLv77lp2igeTOSTrFk_IMQM-NtQvd9zlDdZqN_oWaA6G3XMHOW41kOT53JRurgY9krTiEz5tBNpaK3nnF5tWGExsBY5zhsimz8/s640/Screen+Shot+2013-09-23+at+09.54.28.png" width="640" /></a></div>
<br />Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-77563987723379805552013-09-13T16:34:00.003+02:002013-09-13T16:39:29.019+02:00Category:Consciousness - PageRanking Wikipedia on your Laptop (Java)<h1 dir="ltr" style="line-height: 1; margin-bottom: 6pt; margin-top: 24pt;">
<span style="background-color: transparent; color: black; font-family: Cambria; font-size: 32px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Category:Consciousness - PageRanking Wikipedia on your Laptop (Java)</span></h1>
<b id="docs-internal-guid-6cc431f2-0205-8af6-8553-3cdcd23887aa" style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<h2 dir="ltr" style="line-height: 1; margin-bottom: 4pt; margin-top: 18pt;">
<span style="background-color: transparent; color: black; font-family: Cambria; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">In Theory</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></h2>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">What are the most relevant pages in Wikipedia? This questions leads to a nice exercise in Java memory management and practical experiences with Big Data right on your own laptop. Can Wikipedias link graph fit in memory (ignoring almost all text)? This would allow us to compute PageRank on Wikipedia. How much memory do we need for this? Let’s start by taking a look how PageRank works.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">PageRank</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">There is PageRank, an algorithm created by Larry Page and Sergej Brin [1]. PageRank is in essence a simple idea: You simulate random web surfers and look where most of them are most of the time. The algorithm goes like this:</span></div>
<ol style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Initialize all pages with a PageRank value of 1.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Select a random web page</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">With a probability of </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">d</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> you are bored and randomly jump to </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">any</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> webpage.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">If not bored, you choose one of the links on the page and follow it. Before following it, you take some of your own PageRank value (e.g. 15% of it) and spread it among all edges (i.e. outgoing links).<br class="kix-line-break" />If there are no links (the page is a dead-end), you jump to </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">any</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> random page. Before, you spread 15% of your PageRank value spread to </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">all </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">pages.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Repeat at step 3.</span></div>
</li>
</ol>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">We use a value of 0,15 for </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">d</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. If you do the math, this means the average length of pages a surfer will see before jumping away is 6,57.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">To perform PageRank, we must fit in memory a double (or float) value for each vertex. Additionally, we must fit the graph in memory. </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Let’s now take a look at the data we have.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Source Data</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Wikipedia provides dumps of their database in regular intervals. We use the dump from June 2012. But instead of processing it ourselves, we rely on DBpedia and their version of the dump [4]. DBpedia processes the Wikipedia dumps and extracts structured data. DBpedia provides NTriples files which have a simple format: Each line represents one link. The different files represent different kinds of links but we just use them all together and ignore semantics of links. Taken together, these files represent a graph of which the vertices are Wikipedia pages, including categories, normal articles, disambiguations pages and redirects. In particular, we use the following files:</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">article_categories_en.nt (2,3 GB); Lines: 15,115,486 [5]; contains links from articles to categories;</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">disambiguations_en.nt (0,2 GB) ; Lines: 1,157,484 [6]; contains links from disambiguation pages to other pages;</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">page_links_en.nt (24,1 GB) ; Lines: 158,373,972 [7]; contains links from articles to other articles;</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">redirects_en.nt (0,8 GB) ; Lines: 5,521,403 [8]; contains links from redirect pages to the redirect target;</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">skos_categories_en.nt (0,6 GB) ; Lines: 3,458,049 [9]; contains links from categories to super-categories;</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Sum:</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> 28 GB; Lines: 183,626,394</span></div>
</li>
</ul>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">First we counted the lines of these files to estimate, how hard it will be to put everything in memory. We find 183 million lines = </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">183 million links</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> with a yet unknown number of distinct vertices. The number of vertices is pretty important for the memory requirements. </span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Java Memory Footprints</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The next step is inspecting the number of distinct vertices. A simple approach is a HashSet that simply stores all vertex labels (i.e. page titles) in memory. Let’s use this to take a closer look at Java memory costs.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A String is a Java object that has a reference to a char array. The memory costs for Java data types on the Oracle 64bit JVM are as follows:</span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">byte: 1 byte</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">char: 2 bytes</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">int: 4 bytes</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">double: 8 bytes</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">object reference: 8 bytes (4 bytes on 32 bit JVMs)</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">overhead for an object: 16 bytes</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">overhead for an array: 16 bytes</span></div>
</li>
</ul>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Let’s guess the average Wikipedia title has a length of 20 characters. As a String this costs: 16 (object overhead) + 8 (reference to char array) + 16 (overhead of char array) + 20 * 2 (the chars themselves) = 80 bytes. A HashSet uses references, those will cost another 8 bytes per String. So to store </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">n</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Strings in a HashSet, we need 88</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">n </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">bytes. For PageRank, we need at runtime another 8</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">n </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">bytes (one double per vertex). Now, how many distinct labels do we have?</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Looking at the Labels (Step 1)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">While naively reading in the Wikipedia files, we get an out of memory error and die. That was for a run with 1 GB heap memory. Instead of just using more memory, let’s see how we can work with 1 GB of RAM.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">So how can we safe memory? We use a nice trick I found on StackOverflow: We get the </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">bytes</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> from the String in UTF8 encoding, instead of using </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">chars</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. UTF8 maps all ASCII characters to a single byte, and since Wikipedia titles are URL-encoded anyway in our dataset, they are all in the ASCII range. The resulting byte array takes half the space per character. Since we also shift from String objects to byte arrays, we get rid of some overhead. For a label of length 20 we are now down to 16 (overhead of byte array) + 20 (the chars themselves as bytes) = 36 bytes (instead of 88). However, upon trying to index Wikipedia, we still die with an out of memory error. So how can we safe even more space? </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">We try another approach: We stream in the Wikipedia files and after each unique 1,000,000 labels which we’ve put in a HashSet, we let Java sort them and write them to a file. We end up having 8 files with ca. 100 MB each. Now we use MergeSort [2] recursively to create a single, duplicate free, alphabetically sorted file. Since there is no out-of-the box merge sort in Java for files, we write it ourselves. Result: A 400 MB file in ISO-8859-1 encoding with all labels. Note how this takes less space then the computed in-memory representation in Java, which was ca. 1.4 GB. A file on disk simply has fewer overhead costs.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Next we count the lines in the resulting file and get </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">17,331,857. That is our vertex count V. </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Of course, we could also have used a database to store and sort all labels, but that would have been less fun. As a result, we now also have </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a unique number for each vertex label</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, which is its line number in the sorted file.</span></div>
<br />
<b style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Graph Representation</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A graph can be represented as a set of vertices where each vertex has a list of vertices to which it links. This is called an adjacency list representation. This suffices for directed graphs with unweighted edges – just like our Wikipedia link graph. And it’s great for sparse graphs, as it saves spaces compared to a full matrix representation.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">How much space do we need to represent our graph and have a double for each vertex? The naive way in Java would be to have a class Vertex with a double and a List<vertex>. Costs? 16 (overhead per Vertex instance) + 8 (the double) + 8 (reference to list) + 16 (overhead for list object) + e * 8 (for each edge, we need a reference to another Vertex). Internally, the List instance has another reference (8) to an array (16) if we use an ArrayList. Total cost: 72 bytes + 8</vertex></span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">e</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. What is e? On average, e must be number of all edges (184 mio)/all vertices (17 mio) = 10,6. Let’s say 11. So each Vertex would cost on average 160 bytes. The whole graph would take ca. 2,5 GB. </span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">What is the lower bound, i.e. the minimally required space? Lets call V the vertex count of the graph and E the edge count. A double takes 8 byte in a JVM, so we need at least 8*V bytes to represent the current values of the PageRank algorithm – or any algorithm that assigns values to graph vertices. That is ca. 0,13 GB. As our algorithm operates on a graph, we also need to represent the graph so that we can look up its structure, i.e. retrieve the list of connected vertices. To represent an adjacency list, we can exploit our vertex numbering obtained in the last section. Numbers in the range 0 to 17 Million need 24,04 bits, so we can fit each in a Java integer, which has 32 bits. So here we are wasting almost 8 bits per vertex ID, but it will run fast.* </span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Costs? For the double numbers assigned to each vertex we can use one gigantic double array with length V. That costs us 16 (overhead) + V*8. The graph boils down to a gigantic int[][] array, that is 16 (overhead) + V * (16 + e * 4). For our vales of e and V this is ca. 0,99 GB. So together we need in theory just ca. 1,12 GB to represent the bare data. And a jump from one vertex to another one can still be done in O(1).</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">*We could squeeze out another space reduction of 24,85%, but at the cost of having to pack/unpack bit arrays all the time – probably ruining our attempt to run PageRank fast. </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Graph Building</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Now we have a nice set of ingredients: We have a defined vertex ID number for each label that occurs, which we can compute by looking up the line number of the label in our sorted vertex label file. And we know how to store all data in memory. The vertex ID label file was estimated to be 1.4 GB in memory, so we load it. We also create an in-memory HashMap from label strings to integer IDs.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Next we stream the N-Triples files from DBpedia and replace each triple by the two vertex IDs for the subject and object label, write out the resulting file. Note that if we encounter s1-p1-o1 and s1-p2-o1 we simply boil this down to s1-o1 and s1-o1, i.e. we keep the redundancy. Doing this we don’t need to maintain a weight for each graph vertex, which would cost more memory then the few redundant links. However, the resulting algorithm behaves the same as if we carried the edge weights around.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Then we use our file-based MergeSort again and sort the integer-represented tuples. Ca. two hours later, we stream the two-integers-per-line file again, and compact it: Every line that starts with the same integer as the last one is combined in to a single line. So from</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0 3</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0 8</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0 4 </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0 4 </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0 11</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2 5</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2 8</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2 4</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3 7</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">5 11</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">6 11 </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">we transform to</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0 3 8 4 4 11</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2 5 8 4</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3 7</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">5 11</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">6 11 </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Note how we keep the first integer, to make debugging easier - and handle very sparse graphs even better. Note also how we simply keep duplicate links as duplicate entries (here: from 0 to 4).</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The resulting file can easily be streamed in as the graph representation. Each line becomes an int[] array in the int[][] graph. E.g. the first line turns into graph[0] = new int[] { 3, 8, 4, 4, 11 }. Now we can start to implement and debug PageRank quickly, as we have a pretty small, streamable file to load our graph from. Additionally, streaming in this file results in zero memory fragmentation, as we can always directly allocate the exact amount of memory we need - no resizing of arrays, yay!</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Verdana; font-size: 15px; font-weight: bold; line-height: 1; white-space: pre-wrap;">Concurrent PageRank</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">PageRank assigns a number to each page (i.e. vertex in the graph), which is known as “juice” in the SEO community. </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">In practice, we can implement PageRank as a Java thread, moving happily from vertex to vertex. However, according to the PageRank paper, when we hit a dead-end we have to spread our juice to </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">all</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> other vertices. This would require to update the whole double[] array of all vertices, which takes a lot of time and hampers concurrency. In practice, it seems to suffice to spread to 10,000 other vertices, for our dataset of 17 Million vertices. This tweak allows to run multiple threads in parallel. But wait. What about the usual concurrency problems? We use AtomicDoubles and first addAndGet(-x) the source vertex, then addAndGet(+x) to the target vertex (or vertices, if we are processing a dead-end). This makes sure that the total amount of juice remains equal to the number of vertices, as we initialize each vertex with juice = 1. No further thread synchronization is required. An additional control thread is used to start/stop/control the workers to let them sleep while we write out our PageRank values.</span></div>
<h2 dir="ltr" style="line-height: 1; margin-bottom: 4pt; margin-top: 18pt;">
<span style="background-color: transparent; color: black; font-family: Cambria; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">In Practice</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></h2>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Test Environment</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">All tests have been performed on a MacBook Pro with a 2m4 GHz Intel Core i7 (4 dual-cores) and with RAM of 8 GB 1333 MHz DDR3. All files have been handled on the Apple SSD drive. The source data files have been read directly from their bz2 archives, as it preserves precious SSD disk space and it is maybe even faster to decompress on the fly than having to read ca. 20 times more bytes from disk. Java 7 Update 25 has been used. Inspections have been done with Visual VM 1.3.6 [3].</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Step 1: Extract page (vertex) labels</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Input: 5 .nt.bz files (total 1.4 GB on disk, decompressed over 20 GB)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Output: 7 .label_fragment files (total 0.8 GB on disk)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Time: 39 min.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Stats: Parsed (non-unique) labels: 32,435,145; Average label length: 23; Total chars read=759,568,242 chars.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Memory required:<span class="Apple-tab-span" style="white-space: pre;"> </span>The more, the better. Using a large HashSet can directly eliminate some initial redundancy. We wrote sorted files to disk whenever we had ca. 100 M characters in it. Memory consumption peaked at ca. 2.5 GB. Most CPU time was spent on bz2 decoding.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Step 2: De-dupe and sort vertex labels </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Input: 7 .label_fragment files (total 0.8 GB on disk)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Output: Temporary .mrg fragments and 1 resulting .labels file (0.4 GB)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Time: 65 sec.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Stats: 17,466,171 distinct lables = lines in the file</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The resulting label file is available for download from </span><a href="https://www.dropbox.com/s/f0bmyaz1o4p79e5/dbpedia_en.labels.bz2" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">https://www.dropbox.com/s/f0bmyaz1o4p79e5/dbpedia_en.labels.bz2</span></a><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">The top lines look like this:</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!!</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!!!</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!=</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!?</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Amerika!</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Deladap</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Donnerwetter!</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Garib_Transfrontier_Park</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Huff</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Ich_kann</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!K7</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Kai!_Garib</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Kheis</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Kung</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!SING_–_DAY_OF_SONG</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Xoo</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!Xóõ</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!_!</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!uinida</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!wir</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">!wir_für_Deutsch-Wagram</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">"</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">""</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">".join(re.compile(param['postproc'][1],_re.S</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">"25_maisons_écologique</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">"8zehn48"</span></div>
<div>
<span style="font-family: 'Courier New'; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Step 3: Create integer ID graph files</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Input: 1 .label file (0.4 GB) + 5 .nt.bz files (total 1.4 GB on disk)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Output: 1 .igraph file with 2 integers per line to represent an edge (3 GB)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Time: 71 min.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Memory required: O( V * average label length); This can be further reduced a little bit.*</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Stats: 181,900,732 edges processed.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">*The brief idea is to exploit the fact that we stream a list of </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">sorted</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> labels and are later asked only, given a label, to return the correct unique vertex </span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">ID number</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Hence we can prune all characters at the end and build a sorted prefix-like list, keeping just enough characters to distinguish a string from the one before and after it. Later we use binary search on this list and use the position in the list as the vertex ID. This saves something between ca. 20% to 80% memory, depending on the label distribution. Details are left out here for a later post…</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Step 4: Optimizing integer graph file</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Input: 1 .igraph file with 2 integers per line (3 GB)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Output: 1 .igraph-optimized file with n integers per line (1.7 GB)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Time: 3 min</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Memory required: O(1), i.e. one line of text + the last vertex ID used. Everything else can be streamed on the fly.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The resulting file is available for download from </span><a href="https://www.dropbox.com/s/p95783ie64hy5yt/dbpedia_en.igraph-optimized.bz2" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">https://www.dropbox.com/s/p95783ie64hy5yt/dbpedia_en.igraph-optimized.bz2</span></a><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Step 5: Restart JVM, Load .igraph, PageRank initialization</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Input: 1 .igraph-optimized file with n integers per line (1.7 GB)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Output: None.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Time: 70 sec.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Step 6: Concurrent PageRank</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Input: None, all data in memory (yey!)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Output: .pagerank file (0.47 GB) containing 1 double per line</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Time: Initial results have written to disk after arbitrary 44 min on manual request.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Memory required: O( V * double + V * e * ID) where e is the average number of outgoing edges. The ID length depends on the number of vertices.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Stats: Running with 8 threads, but getting only 650-700% of the theoretical 800% maximally available – flash-based ads in a chrome tab take their share. </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The experiments have been performed with “-Xmx3G”. Used heap memory during PageRank updates was just 1,36 GB.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">As there is minimal coordination among threads, there are no centralized stats. Each thread self-reports each 1 million vertices processed to the console. Using the last available sample of each thread (manually sorted) we get this lower bound for the amount of processed data:</span><br />
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Thread(0) processed 2 Mio nodes </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Thread(1) processed 3 Mio nodes </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Thread(2) processed 2 Mio nodes </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Thread(3) processed 3 Mio nodes </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Thread(4) processed 2 Mio nodes </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Thread(5) processed 3 Mio nodes </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Thread(6) processed 3 Mio nodes </span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Thread(7) processed 3 Mio nodes </span><br />
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Sum: 21 million vertices. That is ca. 477 K edges per minute = 7,9 K edges per second. Roughly, it takes 37 minutes to visit each vertex once. To have some convergence we should probably visit each vertex 20 or 100 times. So we have to run PageRank for 61 hours to have each vertex visited once, statistically. Update: In 14 hours each vertex was visited on average 68 times, so things seem to run faster over night.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ok, now we have the final results, don’t we? They look like this:</span><br />
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0 0.7883971489161026</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1 1.2450609137778839</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2 2.9971633411076817</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3 1.0771804778485874</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">4 0.9292089671519788</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">5 0.9181427990126756</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">6 0.8232967447449192</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">7 0.9169842030519191</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">8 1.131098799705966</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">9 0.7919052069638721</span><br />
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Gnarf, we need to sort and label the result in order to really know what the most important Wikipedia page in the English Wikipedia really is.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Step 7: Sort .pagerank file</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Input: 1 .pagerank file (0.47 GB)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Output: 1 .pagerank-sorted file (same size)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Time: 9 min.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Memory required: O(1), i.e. just two lines of text.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Result (sample):</span><br />
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2975527 88015.30035905691</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2871935 64327.277553365326</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3071981 55474.79234409293</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3088792 45951.642045781715</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3128721 44029.60646771444</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3331989 35440.596115563996</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3531429 31417.359109596753</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3393882 20089.214609567432</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2941101 16711.39554202121</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3187846 13390.22251453764</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Step 8: Add labels to .pagerank file</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Input: .label file (0.4 GB) + .pagerank-sorted file (0.47 GB)</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Output: 1 .pagerank-labeled file</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Time: 14 min. for all 1,7 million labels.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Memory required: k labels as strings, where k is the number of top-ranked vertices to be labeled. Here again memory can be saved with a little trick. First we read the first k integers from the resulting sorted pagerank file and put these requested integers in a HashMap. Second, we stream the .labels file and put all requested ones in memory. Third, we stream the first k lines of the pagerank file again, this time we can replace the vertex numbers with the vertex labels. In extreme cases, one could use a sliding window technique to reduce memory consumption even further, i.e. first extract the first x percent of the k-top-ranked; then repeat for the next window.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Result (from running 1,5h):</span><br />
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2975527 88015.30035905691 Category:Contents</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2871935 64327.277553365326 Category:Articles</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3071981 55474.79234409293 Category:Fundamental_categories</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3088792 45951.642045781715 Category:Glossaries</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3128721 44029.60646771444 Category:Indexes_of_topics</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3331989 35440.596115563996 Category:Portals</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3531429 31417.359109596753 Category:Wikipedia_categories</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3393882 20089.214609567432 Category:Scientific_disciplines</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2941101 16711.39554202121 Category:Categories_by_parameter</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3187846 13390.222514537643 Category:Main_topic_classifications</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3410610 12598.013619535843 Category:Society</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3530926 12098.623945616266 Category:Wikipedia_adminship</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3157301 11845.949560711737 Category:Knowledge</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3530914 10949.627242225948 Category:Wikipedia_administrators</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3410348 10488.44546322527 Category:Social_systems</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3495278 10487.592480528032 Category:Universe</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2835844 10482.739027547617 Category:Academic_disciplines</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3420399 10398.35772395089 Category:Space</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3238348 10262.655312316994 Category:Natural_sciences</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3315875 10240.11541557626 Category:Places</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3320530 9897.208412376885 Category:Political_geography</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3360579 9827.093816212142 Category:Recreation</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3171194 9792.17229627507 Category:Life</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Courier New'; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3269187 9791.021230436309 Category:Outlines</span></div>
<b style="font-weight: normal;"><span style="font-family: Verdana, sans-serif;"><br /><span style="background-color: transparent; color: black; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></span></b>
<br />
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<div style="line-height: 1;">
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Result (top 100 vertices, after running 62 h):</span></div>
<div style="line-height: 1;">
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">NodeID PageRank Label</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2780207 2108723.6242608824 Category:Articles</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2883799 1307863.6947257747 Category:Contents</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3036993 1081081.7188695967 Category:Indexes_of_topics</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2997064 934209.7160333664 Category:Glossaries</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2980253 712770.8801865928 Category:Fundamental_categories</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3177459 419846.90270063916 Category:Outlines</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3240261 412163.87238747487 Category:Portals</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3096118 175693.82863426438 Category:Main_topic_classifications</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3403550 174172.61872773524 Category:Universe</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3110597 168023.8962877334 Category:Mental_content</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3096318 155330.5160364421 Category:Maintenance_categories</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3439186 147136.6643203586 Category:Wikipedia_administrators</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3439198 131078.93354266914 Category:Wikipedia_adminship</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3222175 126926.17194982321 Category:Philosophy_of_mind</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3079466 124910.81448503835 Category:Life</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2744116 111849.98393772673 Category:Academic_disciplines</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3437065 111623.11715770181 Category:WikiProject_Philosophy</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3146727 108137.71011140377 Category:Nature</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3042125 107687.78167120714 Category:Intention</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3302154 104531.64815135897 Category:Scientific_disciplines</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3441805 93590.36093727 Category:Wikipedia_philosophy_maintenance</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3439701 89978.86464022714 Category:Wikipedia_categories</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3103729 89383.42334018843 Category:Matter</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2818558 83404.77045781519 Category:Branches_of_philosophy</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2880844 80889.37543366145 Category:Concepts</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3358392 72350.52522479826 Category:Systems</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3119915 70872.1040243315 Category:Mind</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2849373 70674.27663519335 Category:Categories_by_parameter</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2882746 68041.90831119369 Category:Consciousness</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3438697 66265.19140006597 Category:Wikipedia</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2880852 65549.74946779195 Category:Concepts_in_metaphysics</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3171915 64966.64967255687 Category:Ontology</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3222185 61227.97770005321 Category:Philosophy_of_psychology</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3373442 57716.25467949584 Category:Thought</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3029656 50671.17051489544 Category:Humanities_WikiProjects</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3350140 49300.59773344442 Category:Subfields_by_academic_discipline</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2869978 44958.53199893712 Category:Cognition</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3439179 44484.85083396721 Category:Wikipedia_administration</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3110621 43859.02045045872 Category:Mental_processes</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2980255 43565.96282541698 Category:Fundamental_physics_concepts</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3222146 43335.721761853674 Category:Philosophy_by_field</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3222121 42326.13778250622 Category:Philosophy</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3065573 41827.839353669944 Category:Knowledge</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2784337 40220.338375211504 Category:Astronomical_dynamical_systems</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3318953 37331.80314073502 Category:Sociological_theories</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3146620 34690.9623576251 Category:Natural_sciences</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2907770 33300.40379630048 Category:Dimension</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2745493 33177.90620493102 Category:Action</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3267072 33156.63971786569 Category:Reality</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3441605 33068.965815206735 Category:Wikipedia_help</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3347308 32943.34859192643 Category:Structure</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2869992 32001.40684975351 Category:Cognitive_science</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3318620 31009.72544626944 Category:Social_systems</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3301557 30126.710741762057 Category:Science</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3328671 29424.58965449175 Category:Space</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3012823 29197.537021256754 Category:Help</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2880849 28774.454279538248 Category:Concepts_in_epistemology</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3222754 27416.655264457786 Category:Physical_sciences</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3111445 27371.09666000233 Category:Metaphysics</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2936802 26832.47364175895 Category:Epistemology</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2992165 26544.0247451408 Category:Geometric_measurement</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3222094 26347.66302652885 Category:Philosophical_concepts</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2849403 25249.013139105606 Category:Categories_by_topic</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2972594 24980.308520029124 Category:Form</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3060015 24015.872989594434 Category:Justification</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3175994 23969.624611874016 Category:Origins</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3021941 23695.602474492614 Category:History_of_Wikipedia</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3318882 23220.695758861857 Category:Society</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3438689 23167.79102155423 Category:Wikimedia_projects</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2880846 22356.276966528687 Category:Concepts_by_field</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3044287 22292.798004987188 Category:Introductory_physics</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3328904 21977.881941643973 Category:Spacetime</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3440171 21972.295142919567 Category:Wikipedia_categorization</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3221256 21671.39925891586 Category:Phenomena</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3041065 21626.50979617279 Category:Information</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2885285 21054.214256034218 Category:Corporate_groups</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3302124 20420.063985522265 Category:Science_studies</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2976993 20198.30650916638 Category:Free_will</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2976784 19978.7972533183 Category:Free_encyclopedias</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2773231 19938.66237846059 Category:Applied_disciplines</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3440174 19509.32987565837 Category:Wikipedia_category_cleanup</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2804970 19021.496310405073 Category:Behavior</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3127940 18741.74935797963 Category:Motion</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3222156 18629.309499195057 Category:Philosophy_maintenance_categories</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3042235 18138.194650387893 Category:Interdisciplinary_fields</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2779035 17872.755071764765 Category:Art_WikiProjects</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3441821 17412.74471237936 Category:Wikipedia_project_help</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2885305 16420.166860901958 Category:Corporatism</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3446345 16416.92937260458 Category:Wikipedians_by_Wikipedia_status</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2784667 16304.681701776566 Category:Astronomical_sub-disciplines</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3318950 15960.418504374156 Category:Sociological_paradigms</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3438645 15662.069680599265 Category:WikiProjects</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3029668 15646.135571567413 Category:Humans</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3440169 15445.868254746832 Category:Wikipedia_categories_that_should_not_contain_articles</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2923073 15201.925331620165 Category:Education</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2898870 14984.738439080706 Category:Data</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3065588 14945.782299766714 Category:Knowledge_sharing</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2806443 14940.130723693777 Category:Belief</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">3441613 14612.720339250349 Category:Wikipedia_history</span></span><br />
<span style="line-height: 16px;"><span style="font-family: Courier New, Courier, monospace;">2804983 14578.308647302452 Category:Behavioural_sciences</span></span><br />
<div style="line-height: 1;">
<br /></div>
<div style="line-height: 1;">
<br /></div>
<div class="separator" style="clear: both; line-height: 1; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ-Ipzzc1vI3Q7Db75Xsm0XG0AAB3xg_2of9DYFNlqEMU4qSom-alvIQdeyCCeCzLVy8wTCaKduUoQvouLbqwAQWrkUpz0Gc7CRLCXFfqFQ6ycY4daMoDdvi5FXdx-RByrz9h6/s1600/Screen+Shot+2013-09-13+at+15.18.19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="267" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ-Ipzzc1vI3Q7Db75Xsm0XG0AAB3xg_2of9DYFNlqEMU4qSom-alvIQdeyCCeCzLVy8wTCaKduUoQvouLbqwAQWrkUpz0Gc7CRLCXFfqFQ6ycY4daMoDdvi5FXdx-RByrz9h6/s400/Screen+Shot+2013-09-13+at+15.18.19.png" width="400" /></a></div>
<div class="separator" style="clear: both; line-height: 1; text-align: center;">
<span style="font-family: Verdana; font-size: 15px; line-height: 15px; white-space: pre-wrap;">Figure 1: </span><span style="font-family: Verdana; font-size: 15px; line-height: 15px; white-space: pre-wrap;">Top 100 pages (all categories) as a tag cloud
scaled according to PageRank value</span><span style="font-family: Verdana; font-size: 15px; line-height: 15px; white-space: pre-wrap;"> </span></div>
<div style="line-height: 1;">
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="line-height: 1; margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWmbuS2In8zG3lf-lO4eqM2i3m3sPoCq7rpMJ5O7VgbbTfpfKNFU47J4ULuh18VAq7lstJFCAag9zcNsjCUd5H45v-Md9fgYDKap1HpbiuE5Zz5l6HTuxOOHkjuy52ead4WRns/s1600/Screen+Shot+2013-09-13+at+15.17.57.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="384" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWmbuS2In8zG3lf-lO4eqM2i3m3sPoCq7rpMJ5O7VgbbTfpfKNFU47J4ULuh18VAq7lstJFCAag9zcNsjCUd5H45v-Md9fgYDKap1HpbiuE5Zz5l6HTuxOOHkjuy52ead4WRns/s640/Screen+Shot+2013-09-13+at+15.17.57.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><div style="font-size: medium; line-height: 16px;">
<span style="font-family: Verdana; font-size: 15px; line-height: 1; white-space: pre-wrap;">Figure 2: Top 100 pages (all categories) as a tag cloud </span></div>
<span style="font-family: Verdana; font-size: 15px; line-height: 1; white-space: pre-wrap;">scaled according to sqrt(PageRank value),
the term "Category:" has been stripped from all labels</span>
<br />
<div style="text-align: left;">
<span style="font-family: Verdana; font-size: 15px; line-height: 15px; white-space: pre-wrap;"><br /></span></div>
</td></tr>
</tbody></table>
</div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="color: black; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">The complete top-100.000 pages are available for download from [10].</span><br />
<span style="color: black; font-family: Verdana; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br /></span>
<span style="color: black; font-family: Verdana; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">More Statistics</span><br />
<span style="color: black; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">During the 62 hours we ran the PageRank with 8 threads we processed 1195 mio. atomic steps of which 441 mio. were handling a dead-end. Each dead-eand handling requires to update 10k doubles, which takes a little time. Overall we can crunch ca. 19 mio. vertices per hour on the MPB. Each vertex has been visited on average 68 times, which is not that much. To further increase performance ways to speed up dead-end handling should be researched. Maybe generating random numbers is too slow? The VisualVM CPU profiler was of no big help here. </span><br />
<br /></div>
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Memory Scalability Analysis</span><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></div>
<div dir="ltr">
<table style="border-collapse: collapse; border: none; width: 554px;"><colgroup><col width="*"></col><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Step</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Required Memory</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">O(1), > 0.5 GB</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">O(1)</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">O(V), depends on labels “shape”</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">4</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">O(1)</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">5</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">O(1)</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">6</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">O(V + E)</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">7</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">O(1)</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">8</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">O(k), k <= V</span></div>
</td></tr>
</tbody></table>
</div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The critical steps are those dealing with labels and the PageRank computation itself. Assuming the labels are not the problem, how much PageRank should fit on a MacBookPro with 8 GB? Let’s say we can run a JVM with 6GB. Here are some examples of graphs and their memory requirements. The cost formula is V*8 (page rank values as doubles) + V*8 (an array for outgoing edges) + E*b (the outgoing edges themselves, b = log_2(V), rounded up). Here are some interesting values for V and E to get a feeling what fits in 6 GB of RAM:</span><br />
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr">
<table style="border-collapse: collapse; border: none;"><colgroup><col width="100"></col><col width="95"></col><col width="71"></col><col width="126"></col><col width="69"></col><col width="76"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Vertices</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Bits theoretically required per vertex ID</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Bytes used per vertex ID</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Edges in total</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Edges per vertex</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Memory required (GB)</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">17,466,171</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">24.04</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">4</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">183,626,394</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">10.51</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0.94</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">10,000,000</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">23.25</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2,094,150,315</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">209.41</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">6.00</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">100,000,000</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">26.57</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">4</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1,210,612,736</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">12.10</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">6.00</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">200,000,000</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">27.57</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">4</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">810,612,736</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">4.05</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">6.00</span></div>
</td></tr>
<tr style="height: 0px;"><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">400,000,000</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">28.57</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">4</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">10,612,736</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0.02</span></div>
</td><td style="border: 1px solid #000000; padding: 7px 7px 7px 7px; vertical-align: top;"><div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt; text-align: center;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">6.00</span></div>
</td></tr>
</tbody></table>
</div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span>
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">So a Wikipedia-like dataset with 5 times more vertices would still fit on my MacBook.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Conclusion</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The goal of this article was to explore how much “big data” can be crunched on a single machine. Actually doing it was a lot of fun last christmas*. Now I finally found the time to write it properly up. I hope you enjoyed it.</span><br />
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span>
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: x-small; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">*especially at the moment when a test run top-ranked Category:Consciousness :-)</span></div>
<h2 dir="ltr" style="line-height: 1; margin-bottom: 4pt; margin-top: 18pt;">
<span style="background-color: transparent; color: black; font-family: Cambria; font-size: 24px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">References</span></h2>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">[1] </span><a href="http://infolab.stanford.edu/~backrub/google.html" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://infolab.stanford.edu/~backrub/google.html</span></a></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">[2] </span><a href="http://en.wikipedia.org/wiki/Merge_sort" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://en.wikipedia.org/wiki/Merge_sort</span></a></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">[3] </span><a href="http://visualvm.java.net/download.html" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://visualvm.java.net/download.html</span></a></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">[4] </span><a href="http://wiki.dbpedia.org/Downloads38" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://wiki.dbpedia.org/Downloads38</span></a><span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> - Datasets were extracted from Wikipedia dumps generated in late May / early June 2012.</span></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">[5] </span><a href="http://downloads.dbpedia.org/3.8/en/article_categories_en.nt.bz2" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://downloads.dbpedia.org/3.8/en/article_categories_en.nt.bz2</span></a></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">[6] </span><a href="http://downloads.dbpedia.org/3.8/en/disambiguations_en.nt.bz2" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://downloads.dbpedia.org/3.8/en/disambiguations_en.nt.bz2</span></a></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">[7] </span><a href="http://downloads.dbpedia.org/3.8/en/page_links_en.nt.bz2" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://downloads.dbpedia.org/3.8/en/page_links_en.nt.bz2</span></a></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">[8] </span><a href="http://downloads.dbpedia.org/3.8/en/redirects_en.nt.bz2" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://downloads.dbpedia.org/3.8/en/redirects_en.nt.bz2</span></a></div>
<div dir="ltr" style="line-height: 1; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">[9] </span><a href="http://downloads.dbpedia.org/3.8/en/skos_categories_en.nt.bz2" style="text-decoration: none;"><span style="background-color: transparent; color: blue; font-family: Verdana; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">http://downloads.dbpedia.org/3.8/en/skos_categories_en.nt.bz2</span></a></div>
<span style="font-family: Verdana; font-size: 15px; line-height: 15px; white-space: pre-wrap;">[10] </span><span style="font-family: Verdana;"><span style="font-size: 15px; line-height: 15px; white-space: pre-wrap;"><a href="https://dl.dropboxusercontent.com/u/3460852/pagerank/dbpedia_en.pagerank-labeled.bz2">https://dl.dropboxusercontent.com/u/3460852/pagerank/dbpedia_en.pagerank-labeled.bz2</a></span></span><br />
<span style="font-family: Verdana;"><span style="font-size: 15px; line-height: 15px; white-space: pre-wrap;"><br /></span></span>
<br />
<a href="http://downloads.dbpedia.org/3.8/en/skos_categories_en.nt.bz2" style="text-decoration: none;"><span style="color: blue; font-family: Verdana; font-size: 15px; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"></span></a>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com1tag:blogger.com,1999:blog-5858414.post-80243481331705356332013-07-11T17:06:00.002+02:002013-07-11T17:06:10.042+02:00Validation for Software Products IS hardOne might question whether <a href="http://thedannorris.com/is-startup-validation-bullshit/?inf_contact_key=863b92d918fc0bb368f5699be526b32ffaadf49959badaf82efbe73f2e2a3c5b#">startup validation as a whole is BS</a> (a great blog article!). I would say, it's certainly hard. For two reasons:<br />
<br />
<b>Reason 1: Measuring the right thing is hard. </b><br />
People saying they like an idea is not a validation that people will use a product with that idea. In general, people saying X means not much. However, there are all these statistical sophisticated studies on hot topics such as "How often does the average German buys a new toothbrush per year". Where do these numbers come from? Certainly not from asking 1000 people "How often do you buy a toothbrush per year?". It would sound to them more like "Right here in public, what is a good-sounding number that will make you look like a responsible person?". No instead, what an interviewer asks is "What do you think, how often does the average German buy a new toothbrush?" As the poor asked person has no other knowledge, it can only infer from itself and will in fact tell a relevant number.<br />
<br />
Another example. A famous local brewery in Karlsruhe wanted to introduce alcohol-free beer. So they sent out marketing teams to interview people: "Would you buy alcohol-free beer?" Almost nobody would. Somehow, still, the brewery went ahead and introduced the beer. It sold fantastically. How could that be? Again, they asked the wrong question. They should have let people taste the beer, no just imagine it.<br />
<br />
<b>Reason 2: Cost vs. Benefit</b><br />
How expensive is the experiment vs. the cost of simply doing the product? With some software products, it's not easy to build very cheap MVPs.<br />
<br />
So what remains is trying to sell a product, before it exists. Or just do the product and take all the risk. But always try hard to avoid the mistake outline as reason 1 and 2.<br />
<br />Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-30045212045749541132013-06-22T16:52:00.002+02:002013-06-22T16:52:35.001+02:00How to Create Good Hypotheses for Lean StartupOk, this one is short.<br />
<br />
How to create a good hypothesis when working with Lean Startup?<br />
<br />
<br />
<ol>
<li><b>Write it down</b></li>
<li>Start with "<b>I believe...</b>" or think <b>fill out a business model canvas and inspect each statement (= post-it) what would happen if it was not true</b>.</li>
<li>Is there a test after which the <b>hypothesis could turn out to be wrong?</b> If not, it's not a <i>falsifiable hypothesis</i> or in other words: It's not really a hypothesis.</li>
</ol>
<br />
Should be continued.<br />
<br />
Sources: <a href="http://www.instigatorblog.com/good-hypotheses/2011/05/05/">http://www.instigatorblog.com/good-hypotheses/2011/05/05/</a> and <a href="https://www.leanlaunchlab.com/">https://www.leanlaunchlab.com</a> (within the app, cannot deep-link to the help entry)<br />
<br />Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-13634500714168131962013-05-27T18:01:00.000+02:002013-05-30T21:04:22.192+02:00Die vier Stufen eines (noch nicht-) Gründers<h2>
Die vier Stufen eines (noch nicht-) Gründers</h2>
Nach meiner persönlichen Beobachtung gibt es vier Stufen eines Menschen im Umgang mit ihrer oder seiner Geschäftsidee.<br />
<h4>
Stufe 0: Ich bin kein Gründer. Ich will kein Gründer sein. Das ist alles mit viel zu viel Risiko.</h4>
Die meisten Menschen bleiben vermutlich hier. Das ist Schade.<br />
<h4>
Stufe 1: Ich würde ja etwas gründen, aber mir fehlt eine gute Idee.</h4>
Wie naiv. Man braucht ja keine gute Idee, sondern erstmal vor allem ein gutes, also relevantes Problem. Relevant ist es, wenn<br />
<br />
<ol>
<li>viele Leute </li>
<li>es oft haben </li>
<li>und bereit sind, viel Geld für eine Lösung zu zahlen.</li>
</ol>
<div>
Oder wenigstens 1+3 oder 2+3 oder nur 3 und es geht um echt viel Geld.</div>
<br />
<h4>
Stufe 2: Ich habe eine Idee! Aber die ist geheim!</h4>
Wow. Geheim. Das ist nur sehr selten berechtigt. Tipp: Google doch mal, wie viele Teams gerade an genau der selben Idee arbeiten. Man findet fast immer was. Hoffentlich. Denn bei Ideen, wo noch gar niemand drauf gekommen ist, ist die Idee entweder gänzlich sinnlos oder genial. Und genial ist leider seltener. Jedenfalls dauert diese Phase meist ca. 6 Monate. Danach merkt der Gründer, das niemand ein NDA unterschreiben will und die Idee kein Stück voran kommt. Noch schlimmer ist es nur bei Ingenieuren, die können bis zu 2 Jahre im Keller vor sich hin entwickeln.<br />
<h4>
Stufe 3: Ich bin am gründen/recherchieren, hier ist meine aktuelle Idee...</h4>
<div>
Willkommen im Club. Na endlich. Also, da gibt's jede Menge Tipps, Kontakte, verwandte Produkte, etc. die deine Idee bereichern können. Jetzt nur nicht passiv werden und alles zerreden.</div>
<h4>
Stufe 4: Ich setzte gerade X um.</h4>
<div>
Schließt sich manchmal nahtlos an Stufe 3 an. Jetzt bekommt die Idee Gegenwind, Realitätskontakt und hoffentlich auch Kunden. Viel Erfolg.</div>
<h2>
Abstimmen:</h2>
<a href="https://docs.google.com/forms/d/16LoGk5aQ6rW1mP1dKj7t4HvXsH0G6QFRgsG-MijUhCQ/viewform">Auf welcher Stufe stehst Du?</a><br />
<br />
<a href="https://docs.google.com/forms/d/16LoGk5aQ6rW1mP1dKj7t4HvXsH0G6QFRgsG-MijUhCQ/viewanalytics">Bisherige Antworten</a><br />
<br />
<b>[UPDATE]</b><br />
Aufgrund der bisherigen Kommentare habe ich den Titel geändert von "Die vier Stufen eines Gründers". Alles ab Stufe 4 ist dann normales Gründen, was man weiter in Stufen unterteilen könnte. Da gibt es auch durchaus einige Modelle, das meiner Meinung nach beste ist empirisch aus dem <a href="http://visual.ly/why-startups-fail">Startup Genome Project</a> und unterteilt in: Discovery, Validation, Efficiency, Scale - angelehnt an <i>Customer Discovery</i> von <i>Steve Blank</i>. Auch ein Gründer in Stufe 4 (nach meiner Darstellung) ist u.U. erst in der Discovery-Phase.<br />
<br />
Weitere tolle Meilensteine in Stufe 4 aus den Kommentaren:<br />
<br />
<ul>
<li>Prototyp ist fertig</li>
<li>Erste Einnahmen</li>
<li>Erster Mitarbeiter </li>
<li>Break-even</li>
<li>Das eigene Produkt/das Unternehmen lebt länger als man selbst</li>
</ul>
Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com1tag:blogger.com,1999:blog-5858414.post-40041964314463025342013-05-21T09:17:00.006+02:002013-05-21T09:17:19.901+02:00Lean Startup in PracticeNice post about<b> Lean Startup</b> without ever mentioning this term. Found by Tim Ferris here: <a href="http://www.fourhourworkweek.com/blog/2011/09/24/how-to-create-a-million-dollar-business-this-weekend-examples-appsumo-mint-chihuahuas/">http://www.fourhourworkweek.com/blog/2011/09/24/how-to-create-a-million-dollar-business-this-weekend-examples-appsumo-mint-chihuahuas/</a>Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-2452095451501058382013-05-17T15:17:00.002+02:002013-05-17T15:17:29.568+02:00EMail 2.0 is finally comingThis is going to be huge:<br />
<br />
On 2013-05-15 in the <a href="http://googleappsdeveloper.blogspot.co.uk/?m=1">Google Apps Developer Blog</a> the latest post is: <a href="http://googleappsdeveloper.blogspot.co.uk/2013/05/introducing-actions-in-inbox-powered-by.html">Introducing Actions in the Inbox, powered by schemas</a><br />
<div>
<br /></div>
<div>
What that means is, email changes what it is, at least for GMail users. And that is 400 million people.<br />[Wikipedia: As of June 2012, it is the most widely used web-based email provider with over 425 million active users worldwide.]<br />
<br />
This could finally bring up a wave of innovation that changes the game. I don't have much more to say than that for now :-)<br /><br />
<br />
<br /></div>
Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-14164971635451295952012-06-21T10:44:00.002+02:002013-09-30T18:37:59.228+02:00Submit your Mobile App to All App Stores for just 100$According to the <a href="http://wipconnector.com/appstores">Wireless Industry Partnership</a> website, there are well over 120 app stores. I remember the times when there were multiple relevant search engines. You had tools like: "Search Engine Blaster is the quick & easy way to get submitted and stay submitted on over 600,000 sites across the internet." Now, where is that for app stores?<br />
<br />
And I just found a very nice presentation: <a href="http://www.slideshare.net/emabolo/how-to-build-distribute-and-monetize-html5-mobile-web-apps">http://www.slideshare.net/emabolo/how-to-build-distribute-and-monetize-html5-mobile-web-apps</a><br />
<br />
UPDATE 2013-09-30:<br />
This link-bait post got 7400 views in the 15 months from 2012-06 to 2013-09. The top 10 search results still contain 0 offerings to actually submit an app to app stores. To improve the test, I changed the title from "Submit your Mobile App to All App Stores with One Click" to "Submit your Mobile App to All App Stores for just 100$". Let's see how the ranking and view numbers change.Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0tag:blogger.com,1999:blog-5858414.post-27682722126002925942011-12-07T14:59:00.000+01:002014-10-04T15:05:56.979+02:00Aspect-oriented Maven POMs - it's like mixins already in Maven 3.0.3 <div style="font-family: arial, sans-serif; font-size: 12.7272720336914px; line-height: 1.25em; max-width: 64em;">
Since December 2011 I am using what I call "Aspect-Oriented Maven POMs".</div>
<div style="font-family: arial, sans-serif; font-size: 12.7272720336914px; line-height: 1.25em; max-width: 64em;">
<br /></div>
<div style="font-family: arial, sans-serif; font-size: 12.7272720336914px; line-height: 1.25em; max-width: 64em;">
The main idea is to have sections in your pom (via profiles) which you turn on or off via the existence of a marker file. If you put, e.g. common config for using Google Web Toolkit (GWT) or Google App Engine or any other orthogonal set of dependencies, plugins and build settings, then you can use AO-POMs.</div>
<div style="font-family: arial, sans-serif; font-size: 12.7272720336914px; line-height: 1.25em; max-width: 64em;">
<br /></div>
<div style="font-family: arial, sans-serif; font-size: 12.7272720336914px; line-height: 1.25em; max-width: 64em;">
Our parent pom consists now of this structure:</div>
<pre class="prettyprint" style="background-color: #eeeeee; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 11.8181819915771px; max-width: 70em; overflow: auto; padding: 0.5em;"><span class="pun" style="color: #666600;">...</span><span class="pln"> main shared part</span><span class="pun" style="color: #666600;">...</span><span class="pln">
</span><span class="str" style="color: #008800;"><profiles></profiles></span><span class="pln">
</span><span class="str" style="color: #008800;"><profile></profile></span><span class="pln">
</span><span class="str" style="color: #008800;"><id></id></span><span class="pln">gwt</span><span class="pun" style="color: #666600;"><</span><span class="str" style="color: #008800;">/id>
<activation>
<file>
<exists></exists></file></activation></span><span class="pln" style="font-size: 11.8181819915771px;">uses</span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;">-</span><span class="pln" style="font-size: 11.8181819915771px;">gwt</span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;">.</span><span class="pln" style="font-size: 11.8181819915771px;">marker</span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;"><</span><span class="str" style="font-size: 11.8181819915771px;"><span style="color: #008800;">/exists>
</span></span><span class="pln" style="font-size: 11.8181819915771px;"> </span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;"><</span><span class="str" style="color: #008800; font-size: 11.8181819915771px;">/file>
</span><span class="str" style="color: #008800; font-size: 11.8181819915771px;"> </</span><span class="pln" style="font-size: 11.8181819915771px;">activation</span><span class="pun" style="font-size: 11.8181819915771px;"><span style="color: #666600;">>
</span></span><span class="pln" style="font-size: 11.8181819915771px;"> </span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;">...</span><span class="pln" style="font-size: 11.8181819915771px;"> parts specific to GWT </span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;">(</span><span class="typ" style="color: #660066; font-size: 11.8181819915771px;">Google</span><span class="pln" style="font-size: 11.8181819915771px;"> </span><span class="typ" style="color: #660066; font-size: 11.8181819915771px;">Web</span><span class="pln" style="font-size: 11.8181819915771px;"> </span><span class="typ" style="color: #660066; font-size: 11.8181819915771px;">Toolkit</span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;">)</span><span class="pln" style="font-size: 11.8181819915771px;"> stuff </span><span class="pun" style="font-size: 11.8181819915771px;"><span style="color: #666600;">...
</span></span><span class="pln" style="font-size: 11.8181819915771px;"> </span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;"><</span><span class="str" style="color: #008800; font-size: 11.8181819915771px;">/profile>
</span><span style="color: #008800; font-size: 11.8181819915771px;"> <profile>
</profile></span><span class="str" style="color: #008800; font-size: 11.8181819915771px;"> <id>gwt</</id></span><span class="pln" style="font-size: 11.8181819915771px;">id</span><span class="pun" style="font-size: 11.8181819915771px;"><span style="color: #666600;">>
</span></span><span class="pln" style="font-size: 11.8181819915771px;"> </span><span class="str" style="font-size: 11.8181819915771px;"><span style="color: #008800;"><activation>
</activation></span></span><span class="pln" style="font-size: 11.8181819915771px;"> </span><span class="str" style="font-size: 11.8181819915771px;"><span style="color: #008800;"><file>
</file></span></span><span class="pln" style="font-size: 11.8181819915771px;"> </span><span class="str" style="color: #008800; font-size: 11.8181819915771px;"><exists></exists></span><span class="pln" style="font-size: 11.8181819915771px;">uses</span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;">-</span><span class="pln" style="font-size: 11.8181819915771px;">gae</span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;">.</span><span class="pln" style="font-size: 11.8181819915771px;">marker</span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;"><</span><span class="str" style="color: #008800; font-size: 11.8181819915771px;">/exists>
</span><span class="str" style="color: #008800; font-size: 11.8181819915771px;"> </</span><span class="pln" style="font-size: 11.8181819915771px;">file</span><span class="pun" style="font-size: 11.8181819915771px;"><span style="color: #666600;">>
</span></span><span class="pln" style="font-size: 11.8181819915771px;"> </span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;"><</span><span class="str" style="color: #008800; font-size: 11.8181819915771px;">/activation>
</span><span style="color: #008800; font-size: 11.8181819915771px;"> ... parts specific to GAE (Google AppEngine) stuff ...
</span><span class="str" style="color: #008800; font-size: 11.8181819915771px;"> </</span><span class="pln" style="font-size: 11.8181819915771px;">profile</span><span class="pun" style="color: #666600; font-size: 11.8181819915771px;">></span></pre>
<div style="font-family: arial, sans-serif; font-size: 12.7272720336914px; line-height: 1.25em; max-width: 64em;">
<br /></div>
<div style="font-family: arial, sans-serif; font-size: 12.7272720336914px; line-height: 1.25em; max-width: 64em;">
Now we have our pom.xml and next to it each project can contain a 'uses-gwt.marker' file or a 'uses-gae.marker' file, or both. These marker files turn a section of the pom on (the profile).</div>
<div style="font-family: arial, sans-serif; font-size: 12.7272720336914px; line-height: 1.25em; max-width: 64em;">
<br /></div>
<div style="font-family: arial, sans-serif; font-size: 12.7272720336914px; line-height: 1.25em; max-width: 64em;">
A simple idea, but I still enjoy it in September 2014. Yes, this post was back-dated to when this was first posted in the wiki of an other project.</div>
Xam.dehttp://www.blogger.com/profile/04168131948263827812noreply@blogger.com0