Futile words for your pleasure.

Der Brot :-)

10. April 2017

Brot hat mich bisher nie so richtig interessiert. Weder hat es für mich sonderlich gut geschmeckt, noch war es etwas Besonderes für mich. Warum auch? Es war ja nur dafür da, damit man sich die Hände bein Wurst oder Käse essen nicht schmutzig macht.
Und dann bin ich auf CRE 213 aufmerksam geworden. Thema in dieser Ausgabe: Brot.
Wie immer präsentiert Tim Pritlove gemeinsam mit seinem damaligen Gast Lutz Geißler ein eigentlich ganz einfaches Gebiet sehr ausführlich und spannend.
Grundsätzlich interessieren mich ja solche einfachen Dinge aus unserem Alltag über die kaum noch jemand nachdenkt, weil sie einem als selbstverständlich erscheinen.
So kam ich also zum Brot backen.
Vor ca. zwei Jahren hatte ich das schon mal versucht und dieser Versuch ging mächtig in die Hose. Das Brot war zu krümelig, viel sofort auseinander und schmeckte kaum. Ermutigt durch Tim und Lutz bin ich dann auf das Brotrezept mit Schrot gestoßen. Und was soll ich sagen, mein Verhältnis zu Brot hat sich total geändert: Brot kann ja doch schmecken!
Inzwischen backe ich seit Januar 2017 mein eigenes Brot. Zum einen macht es Spaß etwas selbst herzustellen. Zum Anderen schmeckt selbst Gemachtes einfach besser. Ich kenne alle Zutaten und kann auf gesunde und biologisch erzeugte Produkte (Mehl & Schrot) aus der Region achten.
Ich bin nun ein Roggenbrot-Junkie geworden. Für mich muss es ein reines Roggenbrot sein. Ohne Weizen, ohne Hefe. Nur Roggenmehl, Roggenschrot, Roggensauerteig, Salz und Wasser. Es ist schon verwunderlich, dass man ein solches Brot bei keinem Bäcker findet. Bei den zwei Bäckern, bei denen ich nachgefragt habe war entweder Weizen oder Hefe drin. Außerdem scheinen den Bäckern diese Brote beim Backen immer breit zu laufen, jedes war in Kastenform. Es scheint wohl schwer zu sein ein Roggenbrot frei zu schieben, wie man in der Bäckersprache zum Backen ohne Form sagt. Bei mir klappts ;-)

Ich kann nur jedem empfehlen, einmal seinen Sauerteig und sein Brot selbst zu machen. Es lohnt sich, macht Spaß und ist nebenbei noch gesund für Geist und Körper ;-)

Sauerteigstarter/Anstellgut Roggenschrot eigeweicht / Brühstück Roggenschrot eigeweicht / Brühstück Sauerteig Sauerteig Zubereitung Erste Teigruhe Teig im Gärkorb zur zweiten Teigruhe Teig im Gärkorb zur zweiten Teigruhe Backen Backen Fertiges Roggenbrot Fertiges Roggenbrot Fertiges Roggenbrot Fertiges Roggenbrot Fertiges Roggenbrot

Solarhybrid to go

3. April 2017

In Zeiten von Tesla Model S, BMW i3 oder VW eGolf wundert es mich eigentlich warum es noch keine Umrüstsätze gibt mit denen man normale Fahrzeuge in Hybridautos umbauen kann.
Die Solarpanele könnten entweder an die Dachreling montiert oder gar direkt auf das Dach geklebt werden. Zusatzbatterien in der Ersatzradmulde oder gar direkt unter der Dachreling würden dann die Energie speichern und bei Bedarf an alle elektrischen Verbraucher wie Navigation, Licht, Radio, Zigarettenanzünder oder sogar Steuergeräte liefern.
BMW und einige andere Hersteller haben ja schon die Bremsenergierückgewinnung und laden damit die normale Fahrzeugbatterie.
Viel genialer wäre, wenn die KFZ-Hersteller bereits komplett mit Solar ausgestattete Fahrzeuge anbieten würden und damit alle Stromfresser im Auto versorgen.
Auch wundert mich, daß der Tesla (egal welches Modell) kein Solardach besitzt um alle 12V Verbraucher separat zu versorgen. Damit würde die Sitzheizung, die Klimaanlage, das Radio, die Navigation unabhängig von der “großen” Batterie funktionieren und bestimmt auch ein paar Kilometer mehr Reichweite bringen.
Oder man könnte vielleicht die Hauptbatterie direkt laden.

Warum gibt’s das alles noch nicht?

Make OSM great again

23. März 2017
// ==UserScript==
// @name        OSM Maximyzer
// @namespace   osmmaximyzer
// @description Make OSM great again
// @include     https://www.openstreetmap.de/karte.html*
// @version     1
// @run-at      document-idle
// @grant       none
// ==/UserScript==
var $ = unsafeWindow.jQuery;
var s = '
div.olControlLayerSwitcher {
    display: none;
}
div.olControlPanZoomBar {
    margin-top: 20px;
}
#slider {
    width: 320px;
    position: fixed;
    top: 40px;
    height: 90% !important
}
#search {
    position: fixed;
    top: 6px;
    z-index: 1;
    left: 6px;
}
#wrapper {
    bottom: 0;
    left: 0;
    position: fixed;
    right: 0;
    top: 0;
}
';
$("head link[rel='stylesheet']").last().after('<style type="text/css">'+s+'</style>');

makeOSMgreatAgain.js

scanbatch.sh

10. September 2016

For scanning multiple sheets of paper, doing the OCR using tesseract and finally adding them together in one PDF.

#!/bin/bash

SCNDIR=$(mktemp -q -d --tmpdir)
DSTFILENAME=$1

cd "$SCNDIR"
echo "==[ Scanning ]============================================="
scanimage -b --batch-start=1 --batch-count=999 --batch-increment=1 --format=pnm \
--source="ADF Duplex" --mode=Color --resolution=200 --rollerdeskew=yes

echo "==[ OCR read ]============================================="

which parallel >/dev/null 2>&1
if [[ $? -eq 0 ]]; then
	echo "Using faster execution by using GNU prallel..."
	ls *.pnm | parallel --will-cite 'tesseract "{}" "`basename {} .pnm`" -l deu pdf'
else
	echo "Using slower sequential execution..."
	echo" (Install GNU parallel to speed this up on multicore CPU)"
	for f in *.pnm; do
		tesseract "$f" "`basename $f .pnm`" -l deu pdf
	done
fi

echo "==[ PDF create ]==========================================="
TMPFILE=$(mktemp -q -u --tmpdir)
pdfunite `ls -v *.pdf` "$TMPFILE"
cd -
mv "$TMPFILE" "$DSTFILENAME"

echo "==[ Cleanup ]=============================================="
cd -
rm -rf "$SCNDIR"

http://www.sane-project.org
https://www.gnu.org/software/parallel
https://github.com/tesseract-ocr/tesseract/wiki

“Als Spontacts Plus Nutzer siehst du, wer dein Profil besucht hat.” - Shure ;-)

17. Februar 2016
// ==UserScript==
// @name        Spontacts
// @namespace   Spontacts
// @include     https://spontacts.com/*
// @include     http://spontacts.com/*
// @require	    https://ajax.googleapis.com/ajax/libs/prototype/1.7.3.0/prototype.js
// @version     1
// @run-at	    document-idle
// @grant       GM_getValue
// @grant       GM_setValue
// ==/UserScript==

var tout;
var observer = new MutationObserver(function(mutations) {
	mutations.forEach(function(mutation) {
		if (mutation.addedNodes.length) {
			clearTimeout(tout);
			tout = setTimeout(run, 2000);
			observer.disconnect();
		}
	});
});

function run() {
	var clsidRegEx = /\/([a-f0-9-]{36})([^.]+)/;
	$$('img[class="avatar-img"]').each(function(e,i) {
		var match = clsidRegEx.exec(e.src);
		if (match == null) return;
		var clsid = match[1];
		var tail = match[2];

		if ($(e).up('#user-basic-info') != undefined && $(e).up('a',0) == undefined) {
			$(e).up('div',0).wrap('a',{href: e.src.sub(tail,'')})
			$(e).up('#user-basic-info').down('span.edit').setStyle({position: 'static'});
		}

		var a = $(e).up('a');
		if (a == undefined) return;

		if (a.id == "click-on-premiumpage-image") {
			var json = GM_getValue(clsid,"{}");
			var info = JSON.parse(json);
			if (info.name != undefined) {
				a.href = info.url;
				a.title = info.name;
				if ($(a).up('div[class="user-list-item"]',0) != undefined) {
					$(a).up('div[class="user-list-item"]',0).down('span[class="name"]',0)
						.update(info.name);
				}
				$(e).setStyle({border: "#00FF00 1px solid"});
			} else {
				$(e).setStyle({border: "#FF0000 1px solid"});
			}
		} else if(a.title.length > 0) {
			var info = JSON.parse(GM_getValue(clsid,"{}"));
			if (info.name == undefined || (info.name != undefined
				&& info.name.length < a.title.length)) {
				GM_setValue(clsid, JSON.stringify({name: a.title, url: a.href}));
				$(e).setStyle({border: "#00FF00 1px solid"});
			} else {
				$(e).setStyle({border: "#FFFF00 1px solid"});
			}
		} else {
			$(e).setStyle({border: "none"});
		}
	});

	observer.observe(unsafeWindow.document, {
		subtree: true,
		childList: true
	});
}

run();

So long and thanks for all the fish.

13. Februar 2016

Sieben Jahre. Kaum zu fassen. 7!
So lang war ich bei Facebook angemeldet.
Und jetzt? Jetzt! Setzen die mich vor die Tür.
Endlich! Aus deren Sicht bin ich zu unrentabel. Laut eingegebener Daten bin ich zu alt (>100J), wohne am Arsch der Welt (Nepal), Interessiere mich für nichts und meinen korrekten Namen habe ich auch nicht angegeben.
Nachvollziehbar. Also der Rausschmiss.
Aus meiner Sicht schießen sie aber den Vogel hiermit ab: Klarnamenzwang mit Ausweiskontrolle
Damit habe ich entschieden kein Mitglied der Sekte Facebook mehr zu sein.
Rückblickend betrachtet war Facebook eine Entertainment-Seite. Die selten nützlichen Inhalte dienten dem Einen zur Selbstdarstellung und dem Anderen zum stalken von Erstem.
Zugegeben, manche Information war hilfreich: welches Restaurant in meiner Nähe ist zu empfehlen? wer kann meinen Projektor reparieren? wann ist das nächste OpenAir Festival?
Nun entsage ich der Reizüberflutung und freue mich auf eine Zeit ohne Urlaubsposts, Katzenvideos oder dumme Kommentare.
Bis Ostern ist ja auch Fastenzeit.

#fexit

Soft-UART with ATtiny13A

12. Mai 2015
/*
 * uart_echo.c
 *
 *  Created on: 10.05.2015
 *
 * This small program was created for testing soft-UART with ATtiny13A.
 * Connection is 9600 baud 8 bits 1 stop bit an no parity.
 * The timings in RXDELAY and TXDELAY are tested for default speed of
 * 9.6 MHz clock with default divider by 8.
 * Pin 2 (PORTB3) is used for TX and Pin 3 (PORTB4) is used for RX.
 * Be aware that this is for TTL communication, so 0V means logical 0
 * and 5V means logical 1. Mostly UART is inverted as in RS232.
 *
 *         ATtiny13A
 *          +-----+
 * PORTB5 --|°1 8 |-- VCC
 * PORTB3 --| 2 7 |-- PORTB2
 * PORTB4 --| 3 6 |-- PORTB1
 *    GND --| 4 5 |-- PORTB0
 *          +-----+
 */

#include <avr/io.h>
#include <util/delay.h>

// Delay for sending one bit to UART.
#define TXDELAY 75
// Port which is used as TX port.
#define TXPORTB PB3
// Delay for reading one bit fromUART.
#define RXDELAY 96
// Port which is used as RX port.
#define RXPORTB PB4

/**
 * Set pin to high.
 * Mostly 5V.
 */
void pin_hi(unsigned short pin) {
	PORTB |= (1<<pin); // Pin x High
}

/**
 * Set pin to low.
 * Mostsly 0V.
 */
void pin_lo(unsigned short pin) {
	PORTB &= ~(1<<pin);  // Pin x Low
}

/**
 * Check if pin is high or low.
 * Returns 1 if pin is high, 0 otherwise.
 */
unsigned char pin_rd(unsigned short pin) {
	return (PINB & (1<<pin)) >> pin;
}

/**
 * Write a 8 bit unsigned char to UART port.
 * We are using _delay_us() here because we
 * don't want to deal with CPU cycle counts.
 */
void WrCOM(unsigned char c) {
	unsigned char i;

	// Send start bit.
	pin_lo(TXPORTB);
	_delay_us(TXDELAY);

	// Transmit the char
	for (i = 0; i < 8; i++) {
		if ((c & 1) == 0) {
			// 0 = 0V
			pin_lo(TXPORTB);
		} else {
			// 1 = 5V
			pin_hi(TXPORTB);
		}
		_delay_us(TXDELAY);
		// Shift to right because we transmit
		// the LSB fist (little-endian).
		c = c >> 1;
	}
	// We don't use parity.
	// Send stop bit
	pin_hi(TXPORTB);
	_delay_us(TXDELAY);
}

/**
 * Read a 8 bit unsigned char from UART port.
 * We are using _delay_us() here because we
 * don't want to deal with CPU cycle counts.
 */
unsigned char RdCOM() {
	unsigned char i;
	unsigned char c = 0;

	// Loop until start bit (0V) is received.
	while (pin_rd(RXPORTB) == 1);

	// Intercept the first bit by waiting
	// for 1.5 x RXDELAY microseconds.
	_delay_us(RXDELAY/2);
	_delay_us(RXDELAY);

	/*     Srt  0   1   0  Stp
	 * ----+        +----+    +----
	 *     |        |    |    |
	 *     +----+----+   +----+
	 *          ^
	 * Intercept here after 1.5 x RXDELAY
	 */

	for (i = 0; i < 8; i++) {
		c = c >> 1;
		if (pin_rd(RXPORTB) == 1) {
			c = c | 128;
		}
		_delay_us(RXDELAY);
	}
	_delay_us(RXDELAY);
	return c;
}

/**
 * Main loop.
 */
int main() {

	DDRB  = 0b00001000;  // PB3 is output only
	PORTB = 0b00111111;  // let PB3 be high and enable pullups on any other pins

	while (1) {
		// read and write every char
		WrCOM(RdCOM());
	}

	return 0;
}

PuTTY echoing the chars :-D
Soft-UART PuTTY

Breadboard:
Breadboard Soft UART

Datenkraken die Tentakel stutzen mit NoScript und ABE

19. April 2015

Was mich auf Websites schon immer nervt, sind diese ftg-Buttons, also diese Facebook, Twitter, Google Grafiken mit denen ich der Welt mitteilen kann, das ich gerade auf $domain.com surfe.
Genauso sinnlos sind diese “$Grosse_Zahl gefällt diese Seite auch”-Banner.
Viel gemeiner ist dabei, daß FB & Co. mit diesen Grafiken sehr genau nachvollziehen können auf welchen Seiten ich surfe. Aufgrund der Tatsache, daß mein Browser immer die Cookies auch für den Aufruf der Grafiken mitsendet kann von mir ein sehr detailliertes Profil erstellt werden.

Doch damit ist jetzt Schluss!
Das Firefox-Plugin “NoScript” nutze ich ja schon seit langer Zeit. Heute ist mir erstmals die Funktion “ABE - Application Boundaries Enforcer” ins Auge gefallen. ABE kann mittels Regeln den Zugriff von einer Seite auf eine andere Seite steuern. So kann der Zugriff auf die Seite facebook.com so eingestellt werden, daß nur sie selbst und ihre Unterseiten auf facebook.com zugreifen dürfen, sonst aber keine andere Seite.
Bedeutet: Wenn beispiel.com eine Grafik von facebook.com einbettet, so wird bereits der Aufruf der Grafik blockiert. Wenn ich aber direkt auf facebook.com surfe (also facebook.com direkt in der Adresszeile meines Browsers eingebe) lädt alles wunderbar, denn facebook.com darf alle eigenen Seiten laden.

Konkret sieht das in den Einstellungen von NoScript so aus:

# Allow access to facebook only from itself
Site .facebook.com
Accept ALL from SELF+
Deny
Site fbcdn*.akamaihd.net
Accept ALL from SELF+
Accept ALL from .facebook.com
Deny
Site .fbcdn.net
Accept ALL from SELF+
Accept ALL from .facebook.com
Deny

# Prevent any site from loading google contents
Site .google*.com
Accept ALL from SELF+
Deny

# Prevent any site from loading twitter contents
Site .twitter.com
Accept ALL from SELF+
Deny

ABE_Einstellungen
Weitere nützliche Infos zu ABE direkt auf https://noscript.net/abe/.

GConf Editor Key Bindings

8. November 2014

If you ever wondered about which names you can use for keybindings in gconf-editor (ie. keypad numbers, arrow keys, etc.) here’s the list:
https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h
Just omit the GDK_KEY_ from the beginning of the keyword.

“In God we trust. Everyone else bring data!”—Michael Bloomberg

6. November 2014

“In God we trust. Everyone else bring data!”—Michael Bloomberg


Aktion UBERWACH!