Hinweis: Dieser Beitrag enthält viele technische Ausführungen, die vermutlich für manche Leser nicht allzu interessant seien könnten. Ich habe mir Mühe gegeben, den Beitrag dennoch recht ansprechend zu schreiben. Lasst mich via Kommentar wissen, wie gut oder schlecht mir das gelungen ist. Danke! ;)
Beruflich habe ich bereits von Elasticsearch und Kibana gehört und war nach dem ersten Eindruck hell auf begeistert, was man alles mit diesen Tools bewerkstelligen kann. Nun will ich euch mit dieser Begeisterung anstecken. Dazu habe ich ein Beispiel vorbereiten, dass zeigt, was an der Spitze des Eisbergs auf uns wartet. Viel Spaß! ;)
1. Motivation
In @chriddi's Beitrag "Stalking-Tools" - Ich bin platt... #4 hat sie sich bereits über die Stalking-Möglichkeiten ausgelassen, die durch Steemit offen stehen. Sie schreibt darin:
Obwohl eine Lobeshymne auf das geniale Tool SteemWorld von @steemchiller angebracht wäre, bevor ich auf den provokanten Titel dieses Artikels eingehe, werde ich es ob der Arbeitsweise unseres Denkorgans doch lieber zum Abschluss noch einmal freundlich erwähnen.
An der Stelle war mein Interesse schon geweckt. Beinah zeitgleich verfolgte ich die Beitragsreihe JS Tutorial: Wie man einen Zufallsgenerator programmiert von @snackaholic. Darin erklärt er Schritt für Schritt, wie man einen Zufallsgenerator programmiert. Ein Hinweis an ihn meinerseits: "Nutze die Steemit API." Nun will ich aber auch meinen Beitrag zur Nutzung der Steemit API leisten.
Das war mein erster Gedanke, als ich die Datenmasse gesehen habe, die man mit der Steemit API aus der Blockchain ziehen kann. Statistiken fand ich schon immer super interessant. An der Stelle schoß mir Elasticsearch und Kibana in den Kopf. Aber was steckt eigentlich hinter diesen beiden Begriffen?
2. Allgemeines
2.1 Was ist Elasticsearch?
Auf der Webseite elastic.co wird Elasticsearch damit beschrieben, dass es eine verteilte Such- und Analytik-Engine ist, die für eine wachsende Zahl von Anwendungsfällen verwendet werden kann. Es ist das Herzstück das Elastic Stacks, das deine Daten speichert und unfassbare Analyse-Möglichkeiten bietet.
Oder ganz plump gesagt: Eine Eier-legende-Wohl-Milch-Sau im Bereich der Suche und Analyse von Daten.
Aber das dauert doch ultra lange, bis die Daten gefunden und/oder eruiert wurden
Tatsächlich nicht. Elasticsearch ist super schnell. Hier das Kauderwelsch (für die Nerds unter euch) mit dem Elastic selber beschreibt, wie das funktionieren kann:
Wir haben invertierte Indizes mit finiten Transduktoren implementiert, um Volltext-Queries, BKD-Bäume zur Speicherung numerischer und geographischer Daten sowie eine spaltenorientierte Datenstruktur für die Analytik zu ermöglichen.
Da ich aber an dieser Stelle noch nicht eure Aufmerksamkeit verlieren will, reicht das als kurze Einführung. Mehr findet ihr hier.
2.2 Was ist Kibana?
Kibana ist ebenfalls von Elastic (wer hätte es gedacht) und ist ein Tool, mit dem die Daten aus Elasticsearch in großer Vielfalt visualisiert werden können. Analysen wie
"Warum werde ich um zwei Uhr morgens benachrichtigt?"
oder
"Warum hat der Regen Auswirkungen auf die Quartalszahlen?"
sind für Kibana eine leichte Aufgabe. Die Lernkurve des Tools ist sehr angenehm. Das hängt auch mit der intuitiven Oberfläche zusammen. Nach anfänglichen Schwierigkeiten, konnte ich recht fix die ersten Daten in Kibana auswerten.
Somit lässt sich sagen, dass Kibana "dein Fenster in den Elastic Stack" ist, wie es von den Entwickler absolut passend beschrieben wird. Die Interessierten unter euch finden hier mehr Informationen zu dem Thema.
3. Die Steemit API
Anfangs von der Nutzung doch recht abgeschreckt, durfte ich schnell feststellen, dass die Verwendung der API von Steemit super einfach ist. Schnell erzielt man Ergebnisse und kann mit diesen weiter arbeiten. Ich habe mich für den Aufruf per JavaScript entschieden. Vor allem, weil @snackaholic in der Richtung bereits den Weg geebnet hat ;)
3.1 Account auslesen
Fix eine HTML-Datei erstellt und die API-JS-Datei eingebunden und schon konnte es losgehen. Wie sieht denn mein Account aus?
3.1.1 Script
<html>
<head>
<script src="https://cdn.steemjs.com/lib/latest/steem.min.js"></script>
<script language="JavaScript">
var namen = ["cuby"];
steem.api.getAccounts(namen, function(err, result) {
if(result != null && result.length == 1){
document.getElementById("result").textContent += JSON.stringify(result);
}
});
</script>
</head>
<body>
<div id="result"></div>
</body>
</html>
3.1.2 Ausgabe
{"id":582214,"name":"cuby","owner":{"weight_threshold":1,"account_auths":[],"key_auths":[["STM5qdFRyTfJAaFtcXsXhJwcujxkn7h8xYGzDQCyPsjhybq25Cwt6",1]]},"active":{"weight_threshold":1,"account_auths":[],"key_auths":[["STM5dCBqfxw1MxCRhMEUgprjjzcE2asxGbXVvAuL6MDHe6tLGZtmi",1]]},"posting":{"weight_threshold":1,"account_auths":[["dtube.app",1],["steem-plus-app",1]],"key_auths":[["STM8dWSXZDPQufjVtUxsRiscQKVN95HGHKm4nCUVM2UPituvjw9EU",1]]},"memo_key":"STM6swgbwRhKyYMZuhHN27rdounifr8Eij8gWAUbPvFJxhwQdTryA","json_metadata":"{\"profile\":{\"profile_image\":\"http://cteipen.de/images/steem-profil.png\",\"name\":\"CuBy\",\"location\":\"Germany\",\"website\":\"http://cteipen.de\",\"cover_image\":\"http://cteipen.de/images/steem-banner.jpg\",\"about\":\"Don't mute my world, cause music is my life!\"}}","proxy":"","last_owner_update":"1970-01-01T00:00:00","last_account_update":"2018-01-12T23:59:36"
[...]
"average_bandwidth":"43083706393","lifetime_bandwidth":"265849000000","last_bandwidth_update":"2018-02-09T10:32:00","average_market_bandwidth":"17363637148","lifetime_market_bandwidth":"76070000000","last_market_bandwidth_update":"2018-02-04T08:04:06","last_post":"2018-02-09T10:30:54","last_root_post":"2018-02-03T10:53:39","vesting_balance":"0.000 STEEM","reputation":"131843759610","transfer_history":[],"market_history":[],"post_history":[],"vote_history":[],"other_history":[],"witness_votes":["felixxx","good-karma","stoodkev"],"tags_usage":[],"guest_bloggers":[]}
Wow! Das sind ganz schön viele Daten. Wie sieht es denn mit dem Auslesen der Votes eines Users aus?
3.2 Votes
3.2.1 Script
<html>
<head>
<script src="https://cdn.steemjs.com/lib/latest/steem.min.js"></script>
<script language="JavaScript">
var name = "cuby";
steem.api.getAccountVotes(name, function(err, result) {
if(result != null && result.length > 0){
for (var i = 0; i < result.length; i++) {
document.getElementById("result").textContent += JSON.stringify(result[i]) + "\n";
}
}
});
</script>
</head>
<body>
<div style="white-space: pre;" id="result"></div>
</body>
</html>
3.2.2 Ausgabe
{"authorperm":"scrooger/how-to-post-with-html-markdown-super-simple-with-copy-paste-cheat-sheet-make-your-posts-looks-so-much-better","weight":0,"rshares":0,"percent":10000,"time":"2018-01-09T22:22:36"}
{"authorperm":"scrooger/steemit-notifications-where-or-how-or-why","weight":0,"rshares":0,"percent":10000,"time":"2018-01-09T22:24:00"}
{"authorperm":"epico/convert-sbd-to-steem-and-steem-power-guide-2017625t103821622z","weight":0,"rshares":0,"percent":10000,"time":"2018-01-16T23:28:30"}
{"authorperm":"sempervideo/otl4dzhh","weight":282,"rshares":589920000,"percent":10000,"time":"2018-01-09T21:31:39"}
[...]
Das läuft ja gut! Dann wollen wir mal die Daten für Elasticsearch aufbereiten, dazu habe ich das Script um folgende Zeile in der for-Schleife ergänzt:
document.getElementById("result").textContent += "{\"index\":{\"_id\":\"" + i + "\"}}\n";
Das war nötig um das Format zu erreichen, das Elasticsearch für die Eingabe der Daten benötigt. Dann wollen wir doch mal schauen, wie das ganze in Kibana aussieht.
3.3 Votes Statistik
Für die Auswertung habe ich mir die Votes von @felixxx, @theaustrianguy, @chriddi und die meinen genommen. Der Zeitraum ist seit Beginn, bis zum Ausführen des Scripts (ca. 06.02.2018 um 14 Uhr herum). Wie groß der Zeitraum ist, steht in der Überschrift und im Bild rechts oben.
@felixxx (ca. 19 Monate)
@theaustrianguy (ca. 7 Monate)
@chriddi (ca. 2 Monate)
@cuby (ca. 1 Monat)
3.3.1 Ergebnis
Erschreckend! Wie in dem bereits erwähnten Beitrag von @chriddi kann man buchstäblichen jeden "stalken", der sich auf der Blockchain auslässt. Onlinezeit, Aktivität, Nutzerverhalten. Quasi: alles! Für Statistik-Fanatiker: Perfekt! Für alle anderen User: "Was soll's" bis "Holy sh*t".
Klar, jeder sollte sich darüber im klaren sein, dass sein/ihr Handeln festgehalten wird und damit nachgehalten werden kann.
"With great power goes great responsible." - Richard Nixon, 1972
Wie wahr, wie wahr.
3.4 Die Grenzen der API
Ich habe ebenfalls versucht das Script für @good-karma laufen zu lassen. Da ging die API in die Knie. Die Antwortzeit war viel zu hoch. Könnte damit zusammenhängen, dass man nicht die Masse an Votes, die er getätigt hat, mit einem Aufruf ermitteln kann. Schade :-D
4. Was könnte man damit noch anstellen? - Rekursive Witnesses!
Als ich die Daten für meinen Account ermittelt habe, wurden auch meine Witnesses aufgelistet. Da dachte ich mir:
Hey, warum schmeiße ich die Accounts nicht erneut in das Script!
Gedacht, getan. Schnell eine rekursive Funktion drumherum gebaut und ausgeführt. Zum Glück habe ich die maximale Anzahl der zu ermittelnden User auf 100 begrenzt und alle ausgegebenen Benutzer in einer Liste vermerkt. Soll ja keiner doppelt vorkommen.
4.1 Script
<html>
<head>
<script src="https://cdn.steemjs.com/lib/latest/steem.min.js"></script>
<script language="JavaScript">
var glb_counter = 0;
var glb_userlist = [];
var MAX = 100;
function rek_acc(namen){
steem.api.getAccounts(namen, function(err, result) {
if(result != null && result.length > 0){
for (var i = 0; i < result.length; i++) {
if(!glb_userlist.includes(result[i]["name"]) && glb_counter < MAX){
glb_userlist.push(result[i]["name"]);
document.getElementById("result").textContent += "{\"index\":{\"_id\":\"" + result[i]["id"] + "\"}}\n";
document.getElementById("result").textContent += JSON.stringify(result[i]) + "\n";
glb_counter++;
test(result[i]["witness_votes"]);
}
}
}
});
}
var names = ["cuby"];
rek_acc(names);
</script>
</head>
<body>
<div style="white-space: pre;" id="result"></div>
</body>
</html>
4.2 Ausgabe
Ähnlich wie bei den Votes wollte ich die Daten in Elasticsearch eingeben, doch trotz der korrekten Formatierung, konnten die (public) Authentifizierungsschlüssel nicht erfasst werden. Da werde ich nochmal ans Klemmbrett müssen.
5. Fazit
Alles in allem war es super interessant mit der API rumzuspielen. Kurze Einarbeitung und vielversprechende Ergebnisse. Wer im Informatik- oder Statistik-Bereich unterwegs ist, der sollte sich das unbedingt mal anschauen. Wie zu Anfang schon erklärt, war das nur die Spitze des Eisberges. Prinzipiell kann man sich mit der API auch eine eigene Webseite oder App bauen, die jede Funktionalität von Steemit.com beinhaltet und noch mehr! Es wird für mich und damit auch für euch sicherlich nicht das letzte Mal gewesen sein, dass ich die API von Steemit verwendet habe.
Danke fürs Lesen
CuBy
PS: Fehler bei der Rechtschreibung und Grammatik sind stilistische Mittel und vom Autor bewusst platziert worden. :-D
Do-It-Yourself
Du willst das Script auch mal ausführen? So geht es:
- Eines der Scripts kopieren
- In einen Texteditor deiner Wahl einfügen
- Statt "cuby" den Namen eines anderen Steemit-Users angeben
- Die Datei mit der Endung ".html" an einem beliebigen Ort auf dem Computer speichern
- Zu dem Speicherort navigieren
- Die Datei z.B. durch Doppelklick in einem Browser deiner Wahl öffnen.
Schon hast du das Script für jenen angegebenen User ausgeführt. :)
Really nice post.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Thank you! Feel free to share it with your followers 😉
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Oha, mein lieber Christopfer, erlange ich jetzt sogar schon "Berühmtheit" bei den Informatikern?! Das ist schlecht, ich werde mich mit niemanden unterhalten können!
Auch nicht über deinen Artikel - ich verstehe kein Wort! Macht nix, ich bin von der Sonderschule 😉
Dann mal zu etwas, was ich "kann": Ich gebe dir mal ehrliche Anerkennung für diesen ganz prima aufgebauten Artikel. Er ist super gegliedert und durch Bilder und Graphiken aufgelockert, macht Lust auf´s Weiterlesen!
Zugegebenerweise habe ich nur weitergelesen, weil ich ja der Sache auf den Grund gehen musste, was ich wohl bei #steemstem zu suchen habe - Geisteswissenschaften sind da ja eher ausgeschlossen 😉
Tja, Pech gehabt, jetzt bist du in der Pflicht! Was genau sagt denn nun diese gestalkte Statistik über mich aus?! Meine Online-Zeit auf Steemit?! Kann nicht sein. Ich bin zwar täglich mal mehr oder weniger aktiv on, aber definitiv nie einen halben, gar ganzen Tag. Sollte ich mich ausloggen statt das iPad einfach auszuknipsen, wenn ich z.B. arbeite, mit den Hunden spaziere, mich mit Freunden treffe oder Zeit mit meinem Mann verbringe?
Bitte, bitte, kläre mich auf!
Ich gehe jetzt mal davon aus, dass mir die Antwort gefallen wird. Sollte diese Statistik nichts Positives aussagen, hättest du mich ja nie nicht als Beispiel erwähnt. Nein, nein, du willst dich nicht mit mir anlegen.
Insofern denke ich mal, ich sollte bei dir ein Bäumchen pflanzen. Notfalls kann ich ja zurückkommen und das Bein heben... 😉
LG, Chriddi
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Sehr sehr nice @cuby, ich habe mit derselbigen funktion gestern gespielt :D
LG, Niko
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Hallo Christopher, danke dir für diesen Post! Ich habe deinen Post heute mittag gelesen und deinen damaligen Rat aus Teil 3 endlich in die Tat umsetzen können, das aktuelle Ergebnis dazu findest du hier. Freut mich wie das alles zusammengekommen ist, muss mir direkt mal Kibana geben, schaut ja richtig einfach aus! LG
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Ich schaue mir den Artikel direkt mal an 😉
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Ich nenne mich "Statistik-Fanatiker" und dachte mir einfach nur "... geil".
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Freut mich 😁 Besteht die Überlegung das auch selber zu verfolgen? 🤔
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Hab's mir in die Favoritenliste gespeichert - das behalte ich definitiv im Blick! ;)
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Ist es grundsätzlich möglich, die Daten Stückweise historisch so zu holen, dass man am ende alles zusammen hat? Also z.b. ich lade 500 Mitglieder und dann 501-1000 usw. SG
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Hallo, hat mich auch Interessiert! Hab mal recherchiert und im Netz hier was dazu gefunden.
https://github.com/steemit/steem-js/issues/6
Mit dem Custom Query ist das möglich
LG
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Da konnte ich auch noch was dazu lernen 👍 gute Frage @halloworld und vorbildliche Antwort @snackaholic
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Danke für den Beitrag, ich habe ihn mit großer Interesse durchgelesen.
#onlygoodvibes
Ich freue mich auf weitere Beiträge von dir @cuby
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Danke für dein Feedback @oliver19xx. Hoffentlich wird das bei den zukünftigen Beiträgen auch so sein. ;)
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Resteemed to over 11900 followers and 100% upvoted. Thank you for using my service!
Send 0.200 Steem or 0.200 Steem Dollar and the URL in the memo to use the bot.
Read here how the bot from Berlin works.
We are happy to be part of the APPICS bounty program. APPICS is a new social community based on Steem. The presale was sold in 26 minutes. The ICO will start soon. You can get a account over our invite link: https://ico.appics.com/login?referral=1fRdrJIW
@resteem.bot
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Hi,
Nice to read about you and you posts and views. I am into steemit from august 2017, I am interested in photography and I am also into crypto trading and investing,I have followed you so you can also follow me. Let us all join hand and work with one common objective to make steemit reach to great height.
Best Of luck
Teenovision
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Sehr interessanter Beitrag @cuby :)
Werde bei Zeit auch mal etwas damit rumspielen :P
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Danke! Sehr gut :) Lass mich wissen, wie dein Eindruck dazu ist ;)
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Sehr schöner Artikel :) angenehm zu lesen und toll rübergebracht.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Danke für dein Feedback :)
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
You just planted 1.50 tree(s)!
Thanks to @chriddi
We have planted already 2537.741 trees
out of 1,000,000
Let's save and restore Abongphen Highland Forest
in Cameroonian village Kedjom-Keku!
Plant trees with @treeplanter and get paid for it!
My Steem Power = 18392.67
Thanks a lot!
@martin.mikes coordinator of @kedjom-keku
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Hey @cuby, toll geschrieben und quasi genau das was ich brauche, suche und erstellen möchte.
Kann man damit einen BeerSaturday Post wie diesen hier
https://steemit.com/beersaturday/@detlev/whoot-steemit-beersaturday-challenge-week-34-win-from-15-sdb
in Bezug auf die Steemians, die einen Link in den Kommentaren gepostet haben und nach ein paar weiteren Kriterien elegant auswerten?
Ich möchte Infos wie in diesem Payout Post errecchnenund schön visuell darstellen
https://steemit.com/beersaturday/@detlev/wau-steemit-beersaturday-had-48-entries-in-week-34-here-are-the-winners
Freue mich auf eine Idee zu meiner Aufgabe.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Hallo @detlev,
prinzipiell kann man auf die Kommentare eines Posts zugreifen. Auch die Filterung, ob in dem Kommentar ein Link enthalten ist, ist realisierbar. Die Liste der ermittelten Links lassen dann auch die Option zu, dass man auf die verlinkten Posts zugreifen kann.
Durch diese Referenzen kommt man auch an die Anzahl der Upvotes je Post (wenn ich den BeerSaturday Post richtig verstanden habe, ist das relevant).
Es gibt JavaScript Bibliotheken, mit denen man Daten visuell aufbereiten kann. Eine davon ist Chart.js mit der ich in der Vergangenheit bereits gute Erfahrungen gemacht habe. 👍🏻
Solltest du Hilfe beim Programmieren brauchen, sag bescheid 😉
LG
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
BESCHEID!
ich kann Konzepten, verstehe die Programmierung und kann darin "rumpfuschen"
aber machen sollte das jemand der das kann.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Alles klar 😁
Was soll die Anwendung genau können?
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Müsste ich mal in Ruhe erklären. Steht aber auch in den beiden Posts.
Im ersten sind die Regeln erklärt und im zweiten Post siehst Du wie die Gewinner ermittelt werden.
Kann ich Dich im Discord erreichen, dann geht das per Sprache sicher schneller.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Ja kannst du 👍
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Connected. Mehr später heute Abend.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Na toll, jetzt habe ich Lust aufs Programmieren bekommen, aber gerade kaum Zeit dafür. 😅
Cool gemacht, weiter so! 👍
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Das Script zu kopieren und mal eine Stunde damit rumzuspielen sitzt doch bestimmt drin 😁 Wobei, lieber nicht! Ich weiß nur zu gut, wie schnell aus einer Stunde 2 oder 3 oder 5 werden 😂 Behalte es im Hinterkopf und melde dich bitte, wenn du was gebastelt hast 😊
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Ich sehe, wir verstehen uns. 😂
Klar, mach ich denn. 👍
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
This post was resteemed by @steemvote and received a 26.01% Upvote
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit