Wie man Lekhonee gangbar macht

Wir schreiben das Jahr 2017. Ein kleiner Teil des Internets ist verschlüsselt und muß sich jetzt gegen die Attacken der SSL Verweigerer, SSL Losen und Profikriminellen wehren. Angriffe auf die Verschlüsselung kommen aus allen Teilen des Netzes. Sogar die eigene Programme greifen die Neulinge an, weil Sie sich HTTPS verweigern. Aber tun Sie das wirklich ?
Ok, lassen wir den dramatischen Quatsch mal weg und weden uns alltäglichen Problemen zu:
Wie ich meinen Kommentaren im Blog entnehmen konnte, wurde ein Teil der Leserschaft durch einen Blogbeitrag auf Lekhonee aufmerksam gemacht. Wer das so wie sich dann mal konfiguriert hat und zwischenzeitlich auf HTTPS umgestellt hat, dem verweigert Lekhonee nun die Gefolgschaft. Es startet zwar, aber bricht beim Laden der Kategorien ab.
Fehlermeldung(wenn man soweit nachforscht, daß man die sieht): „Error beim Parsing. Unerwartetes < at …“ blah blah.
Weil ? Na weil es nicht mit dem 301 Redirect auf HTTPS zurecht kommt, den meine Seite allen SSL Verweigerern aufzwingt 😉
Ursache:
in der Datei /home/<username>/.config/lekhonee-gnome/accounts.xml steht noch HTTP:// drin.
Lösung:
Mit HTTPS ersetzen. Neustarten. Geht.

Folllow-Up: XMind – Ein Romanplanungstool

Wer meinen letzten Artikel dazu gelesen hat, weiß, daß es sich bei XMind eigentlich um ein Mind-Mappingtool handelt, mit dem man Gedankengänge ordnen kann/sollte.

Ich nutze es ausschliesslich als Romanplanungstool, da sich die Optionen des Tools perfekt dafür eignen. Ein kleines Statusupdate für Autoren, die schon immer einen Krimi schreiben wollten .. Read More

Probleme beim Update von Elsterformular ?

Wer Probleme hat Elsterformular aus Elster zu aktualisieren, der sollte sich mal den PATCH.ERR genau ansehen und wenn da steht:

Applying MODIFY File Patch for 'lizenzvertrag.pdf' 
error ept0015: Old File does not exist 
Script stderr: 
 Program ended with an error exit code

Dann ist jeder weitere Versuch völlig vergebens 🙂

Einfach von Elster.de die neue Komplettversion herunterladen und installieren. Elster löscht dann die alte Installation und ist nach Sekunden komplett installiert. Warum der Anwender mit unsinnigen Fehlermeldung gequält wird, ist mir ein Rätsel.

Statt dem Anwender zu sagen, daß da eine Datei fehlt ( ja, die PDF wird gepatcht 😀 ), gibt es eine Fehlermeldung, daß etwas mit der Installationsberechtigung für das Konto nicht stimmt und das unter WINE, wo es eh keinen Adminaccount gibt.

 

XMind – a mind mapping tool

Meine Cousine meinte neulich, daß die neueste Netflixproduktion „Dirk Gently’s holoistische Detektei“ der „absolute Brainfuck“ gewesen wäre, nur weil ein bisschen Zeitreise im Spiel und jede Menge Blut auf den Böden und Wänden verteilt war (sowie diverse Körperteile, aber lassen wir das jetzt mal).

Ich glaube, daß der Ausflug in Mind-Map-Szene zu ähnlichen Ergebnissen kommen wird.  Für Linux gibt es bunte Auswahl an meistens in Java geschriebenen MindMap Tools. FreeMind kann man direkt aus dem Fedorarepository installieren, allerdings habe ich davon Abstand genommen. Zum Einen, weil es mit schon 12 MB Größe,  40 MB Schrott nachinstallieren wollte und zum Anderen, weil es als veraltet gilt. Die Forks die aus dem Projekt hervorgegangen sind, bieten laut diversen Blogs und Wikis mehr Funktionalitäten mit mehr Bedienkomfort.

Ein anderes Tool ist das XMind Mindmappingtool der XMind Ltd, welches eigentlich nur für Ubuntu gedacht ist, funktioniert aber auch sofort unter Fedora, was wohl aber keine Absicht war 😉

Wenn man sich das ZIP auf der Platte ausgepackt hat, findet sich im Archiv ein Ordner für 32 oder 64 Bitsysteme. Startet einfach das passende XMind in der Konsole, ignoriert die Warnmeldungen und legt los. Java installiert zu haben, ist angesichts der vielen  Javaplugins wohl eine grundsätzliche Sache. Mit knapp 200 MB auf der Platte ist die Installation schon ganz schön happig, und deutlich größer als FreeMind.

Das echt umfangreiche Programm kommt mit einer aufgeräumten Oberfläche im Flatdesign daher. Bevor wir uns aber damit Auseinandersetzen, sollte man erstmal erklären, was eine MindMap überhaupt ist. Wikipedia beschreibt das in etwa so: Eine Mind-Map ist eine kognitive Assoziationstechnik, die helfen soll, „Gedanken frei zu entfalten“.

Etwas konkreter ausgedrückt, mit Hilfe der Technik kann man ein Brainstorming, also das wilde Aufschreiben von Begriffen, von denen man glaubt, daß Sie mit dem Thema etwas zu tun hätten, gleich in geordnete Bahnen lenken. (Kleine Anekdote: Schon in den 50ern des letzten Jahrhundert wurde Brainstorming als der Quatsch enttarnt, der er ist: eine Abbildung des Gruppensozialenprofils, bei der die Betas den Alphas den Vorzug lassen, egal wie dämlich die Ideen wirklich sind. Alles was eine Gruppengröße von 2 überschreitet ist quasi per se unproduktiv. Nachzulesen u.a. im Soziologischen Teil von Wissenschaft.de. Wobei mir grade klar wird, daß jetzt eine Karte genau dieser Seite eine große Hilfe wäre, den passenden Link als Beweis zu setzen. Es reicht halt nicht 25 Jahresausgaben auf Lager zu haben, wenn man nichts wiederfindet. )

Da ich grade als Gruppengröße „1“ festgelegt habe, also mit mir selbst ein Brainstorming vornehme, nehme ich an, daß ich mir selbst nicht in die Parade fahren würde, aber auf der anderen Seite auch keinen Grund habe, an meinen Argumenten und Ideen zu zweifeln. Allenfalls Kant und Freud könnten sich noch in die Quere kommen.

„Am Anfang ist der Knoten“

Wenn man seine neue Map erstellt, hat man zunächst den Anfangsknoten. Tippt man jetzt direkt etwas in die Tastatur, wird es als Knotentext übernommen. Will man den Text „ändern“ drückt man am besten F2.  Einen Unterknoten öffnet man mit der „Eingabetaste“.  Wenn man so weitermacht, wird das Ganze am Ende ein Baumdiagramm. Die Äste kann und soll man auch beschriften, muß man aber nicht. Spaßig wird es erst, wenn man zufällig Beziehungen einzelner Knoten untereinander einfügt:

Damit man bei vielen Details eines Knotens nicht den Überblick verliert, kann man mit F6 den aktuellen Knoten als Basis auswählen, also quasi vergrößern und alles andere ausblenden lassen. Sehr praktisch , wenn man fokussiert an einem Punkt arbeiten muß. An den Ästen und Knoten des Baumes kann man übrigens mit den Cursorsteuertasten entlangnavigieren.

Features

Knoten können nicht nur Texte enthalten, sondern auch Bilder. Außerdem stehen noch diverse Themes zur Verfügung, der Stil eines Knotens kann auch jederzeit geändert werden, womit sich die Map optisch attraktiver gestalten läßt, bzw. eine zusätzliche Ordnung einführen läßt. Das sind natürlich nur Bruchteile der Funktion, von den Darstellungsmodi einzelner Knoten als Logik/Fischgräten oder Zeitleistendiagrammen kann ich hier nur beiläufig berichten.

Fazit

XMind bietet wohl alles was an für seine Maps so braucht, aber es hilft nicht, wenn man nicht vorher schon eine klare Struktur oder sagen wir mal „grob weiß, was man vor hat“ . Ich mache jetzt die Probe aufs Exempel und werde den Handlungsplot meines dritten Romans damit entwerfen, was zwar nicht genau den Sinn von Mindmapping Technologien entsprechen wird, aber zufällig exakt genau so ein Tool benötigen wird.

 

Projekt: Laß das Telefon vorlesen

Android Apps wie „Talk – Free“ lesen dem Benutzer einen getippten Text vor und haben meistens das Problem, daß Sie mit großen Dateien nicht zurechtkommen. Mit Dateien in meiner Größenordnung sterben die Apps weg wie Fliegen, wenn sie die Dateien nebst Inhalt überhaupt öffnen können 🙂

Deswegen hatte ich gestern die fixe Idee, ich müßte eine TTS App (Text-To-Speech) für mein Handy bauen. Ok, satte 4 Stunden hat es dann gedauert, dem bescheuerten Eclipse bei zu bringen, überhaupt wieder Apps, AVD’s SDK’s und anderes anzuzeigen, upzudaten, zubenutzen und zu bauen. Von den vielen, vielen Rückschlägen, Flüchen, Verwünschungen und :Facepalm:s  mal abgesehen, kam am Ende etwas brauchbares raus.

Ich dachte immer Eclipse wäre das Tool zum Bauen von Android, oder irgendwelchen Anwendungen, aber so beschissen wie gestern hat es sich noch nie angestellt. Das SDK Update entfernte dann gleich mal die SDK TOOLS inkl. dem SDK Manager selbst von der Platte, nachdem es min. 400 MB unnütze Files auf die Platte gesaugt hatte. Dann löschte es den einzigen API Stand, der mich als Zielplattform wirklich interessiert hatte: Android 3.2+ … AAAAAAARGG…nein, ruhig, nicht schon wieder… tief luftholen… Android 3.2 ist API Level 13 und wird, wieso auch immer, nicht mehr im SDK Manager aufgeführt. Außer dem Tools Ordner wurden auch noch die Systemimages entfernt, so daß die bislang angelegten Virtual Devices aka Debugger-Umgebungen auch weg waren und auch nicht mehr angelegt werden konnten. Nachdem ich dann einen neuen SDK benutzt hatte, konnte ich zwar einen AVD anlegen , aber nicht benutzen, weil der sich nicht in LAN geklinkt hat und ohne LAN Verbindung war mein kleines Programm komplett nutzlos.

Was nun folgte war zum Glück etwas einfacher, aber nicht weniger aufwändig. Statt der netten Tante auf meinem Tablet, mußte mein neues Handy als Zielplattform herhalten. Leider hat Google das USB Debugging, ohne das man am PC nicht sehen kann, wo es denn genau bei der Liveanwendung knallt, versteckt und zwar dämlich versteckt. Es ist ok um Dumbos davon abzuhalten, das USB Debugging und die ganzen anderen coolen Entwicklerfunktionen zu aktivieren, aber es bleibt dämlich. Am Ende wollte das Handy dann auch per ADB angesprochen werden und es konnte endlich losgehen.

Das Projekt

Oben habe ich bereits verraten, daß es um TTS und große Files geht. Ich rede von Textfiles mit einer Größe von 500kb+ . Sich die vorlesen zu lassen, bietet keine „kostenlose“ App an. Damit man sich das vorstellen kann, 500kb sind ca. 500 Seiten DIN A4 Papier, also eine Menge Buchseiten. Will man sich die vorlesen lassen, dauert das Stunden und genau das habe ich vor.

Aber wieso will man sich das überhaupt  vorlesen lassen ? Naja zum einen kann man dann die Handyausgabe als Hörbuch verkaufen 😀 zum Anderen, und da komme ich derzeit ins Spiel, ist es richtig toll zum Korrekturlesen meines Romans. Die Rechtschreibkontrolle vom Officeprogramm kann zwar Fehler entdecken, aber falsche Worte, die richtig geschrieben wurden nicht. Außerdem findet diese auch keine sprachlichen Unschönheiten z.b. zu komplizierte Texte, falsch nieder geschriebene Gedankengänge usw. . Und da setzt jetzt die App ein, denn wenn es sich vorgelesen schräg anhört, ist es schräg, auch wenn es beim Lesen ok war. Nichts ist blöder für einen Romanschreiber, als wenn man den Roman nacher nicht vorlesen kann, ohne selbst zu stocken.(Auch dieser Absatz wurde Ihnen gespondert von Hardcore – der TTS App)

Das Problem

Die freien Apps lesen vor, was andere Apps an sie teilen oder per Copy&Paste vom User eingegeben wird.

Wer Handies kennt, kann sich vorstellen, daß alleine das Markieren des Textes den man hören will, Stunden braucht, wenn man es überhaupt fehlerfrei schafft. Vom Tippen auf dem Handy ganz zu schweigen 😉

Die Idee

Verlagern wir doch das Markieren und Ausschneiden des Textblockes auf den Desktop-PC, sprich meinen Linuxrechner. Den Text sendet man einfach per Netzwerk an die Sprachausgabe.

Die Stolperfallen

Natürlich liegen die alle im Android begraben und sind mehr oder weniger :faceplam:  . Wann kommt endlich der Tag, wo jemand ein Fedora ROM für Samsungsphones veröffentlicht, es wäre das Ende von Android wie wir es kennen und hassen.

Falle 1 : Die App muß einen öffentlichen Serverport öffnen, damit man etwas hinschicken kann.
Falle 2 :  Man muß die Handy  IP Adresse kennen, sonst kann man Falle 1 nicht umschiffen.
Falle 3 : Netzwerkfunktionen in der MainActivity sind Tabu, man braucht einen Netzwerktask.
Falle 4 : GUI Elemente dürfen nur von dem Task benutzt werden, der den View geöffnet hat.

Falle 5: Wie bekommt man den Textblock eigentlich zum Handy ?

Fangen wir mal mit #5 an :

[marius@eve ~]$ nc 192.168.0.117 3000
Wie die Webseite TheHackernews.com heute berichtet, ist es Forschern der Standford University bereits in 2015 gelungen, einen Super-Super-Cookie zu nutzen, in dem sie über die Browser API der mobilen Versionen von Chrome, Opera und Firefox den Batteriestatus abgefragt haben. Durch die Kombination von angezeigter "verbleibender Zeit in Sekunden" und dem Prozentwert der Ladung, ergeben sich bis zu 14 Millionen Kombinationen, die man Geräten zu ordnen kann.

Genau, das Schweizer Armeemesser „nc“ (NetCat) muß zumindest in Phase 1 der Enwicklung reichen und genau das tut es. Man öffnet also einfach eine TCP Verbindung zur App und schreibt den zu sprechenden Text rein. Wenn alles klappt, kommt Sprache raus.

Das war einfach, kommen wir zu Falle #2 :

        
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
@SuppressWarnings("deprecation")
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
log("MY IP is "+ip);

Das funktioniert übrigens nur für LAN IPs. Wenn man WAN, also in dem Mobilen Internet unterwegs ist, bekommt man i.d.R. eine IPv6 Adresse und damit kommt die Routine oben nicht zurecht. Da ich WAN nicht brauche, reicht das hier.

Die TTS Engine ist leicht zu öffnen:

tts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
   @Override
   public void onInit(int status) {
      if(status == TextToSpeech.SUCCESS ) {
         tts.setLanguage(Locale.GERMAN);
      }
   }
});

Nun zum Starten des Netzwerkthreads, den dem muß ich die IP mitgeben:

Thread serverThread = null;
...
this.serverThread = new Thread(new ServerThread(ip));
this.serverThread.start();

Der Serverthread an sich ist simpel. Ich nehme hier Port 3000, 10 Connections gleichzeitig auf meinem Socket und lege fest, daß die externe IP im LAN zum Binden des Interfaces genutzt werden soll, weil dumbo Android das sonst auf 127.0.0.1 aufmacht, da natürlich keiner was von 🙂  Der Code basiert auf einem Beispiel zu Serversockets, das aber wie dort beschrieben gar nicht funktioneiren kann 😉 Nehmt die Version hier:

public void run() {
			Socket socket = null;
			try {
				serverSocket = new ServerSocket(3000,10,InetAddress.getByName(ip));
				this.log("ServerSocket gestartet:"+ serverSocket);
			} catch (IOException e) {
				e.printStackTrace();
				this.log(e.toString());	
				return;
			} catch (Exception e) {
				e.printStackTrace();
				this.log(e.toString());
				return;
			}
			while (!Thread.currentThread().isInterrupted()) {
				this.log("ServerSocket waiting for accept:");
				try {
					if (serverSocket.isClosed()) serverSocket = new ServerSocket(3000,10,InetAddress.getByName(ip));
					
					socket = serverSocket.accept();
					System.err.println("Socket connection: "+ socket);
					this.log("Connection accepted");

					CommunicationThread commThread = new CommunicationThread(socket);
					new Thread(commThread).start();

				} catch (IOException e) {
					e.printStackTrace();
					this.log(e.toString());
				} catch (Exception e) {
					e.printStackTrace();
					this.log(e.toString());
				}
			}
		}
	}

Die doppelten Catch-Anweisungen sind natürlich nur zu Demozwecken drin. Ist die App mal gebaut, kann man unterscheiden zwischen einem echten IO Fehler und anderen Fehlern, z.b. OOM ( Out Of Memory ) und verschiedene Meldungen erzeugen.

Der CommunicationThread öffnet das Socket, daß beim Accept()  rausgekommen ist, extrahiert den InputStream(), macht einen BufferedReader daraus und ließt den Text zeilenweise ein, bis das Socket geschlossen wird:

       this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

try {
	String read = input.readLine();
	if ( read == null ) return; // wichtig, weil läuft sonst in einer Endlosschleife

	updateUIThread ui = new updateUIThread(read);
	updateConversationHandler.post(ui);

} catch (IOException e) {
	e.printStackTrace();
	this.log(e.toString());
	return;
} catch (Exception e) {
	e.printStackTrace();
	this.log(e.toString());
	return;
}

Der UIUpdateThread macht dann nichts weiter als die Textnachricht in Zeilen umzuwandeln und dann die TTS Engine zu füttern. Dabei wartet die Anwendung solange bis nicht mehr gesprochen wird, wofür der Thread 100ms schläft. Das schont die Batterie.

public void run() {
	String[] lines = msg.split("\\.");
	for(int i=0;i<lines.length;i++) { if ( lines[i].trim().length() > 0 ) {
			Toast.makeText(getApplicationContext(), lines[i],Toast.LENGTH_SHORT).show();
			tts.speak(lines[i], TextToSpeech.QUEUE_ADD, null);
			while( tts.isSpeaking() ) {
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
					Toast.makeText(getApplicationContext(), e.toString() ,Toast.LENGTH_LONG).show();
				}
			}
		}
       }
}

Fertig ist unser Remote-TTS-Reader 🙂

Nun leiten wir das Audio Signal des Telefons noch an den Mikrofonanschluß vom PC und starten FFMPEG:

ffmpeg -f pulse -i default -c:a:0 libmp3lame -b:a:0 128k test.mp3

Fertig ist das Hörbuch für unterwegs 🙂

Ihr könnt die fehlenden Teile aus dem Tutorial extrahieren, es ist der gleiche Aufbau. Nur habe ich noch einiges erweitert, z.b. logging, weil seine Routinen halt nicht funktioniert haben. Die relevanten Änderungen sind oben drin, so daß Eurer Projekt funktionieren sollte.

Anmerkung: Man kann von 10 Rechnern aus die APP auf dem Handy gleichzeitig ansprechen, aber die Sprachengine wird das nur nacheinander wiedergeben.