
[{"content":"","date":"15. Mai 2026","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","date":"15. Mai 2026","externalUrl":null,"permalink":"/blog/","section":"Blogs","summary":"","title":"Blogs","type":"blog"},{"content":"","date":"15. Mai 2026","externalUrl":null,"permalink":"/authors/daniel/","section":"Authors","summary":"","title":"Daniel","type":"authors"},{"content":"","date":"15. Mai 2026","externalUrl":null,"permalink":"/","section":"Daniel Hufschläger","summary":"","title":"Daniel Hufschläger","type":"page"},{"content":"","date":"15. Mai 2026","externalUrl":null,"permalink":"/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"","date":"15. Mai 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"Wer in seinem Hugo-Blog Videos vom Chaos Computer Club (media.ccc.de) einbinden möchte, kann dafür einen eigenen Shortcode erstellen. Dieser erspart es, jedes Mal den vollständigen iframe-Code manuell einzufügen, und hält die Markdown-Dateien übersichtlich.\nShortcode erstellen # Im Ordner layouts/shortcodes erstellt man einfach eine Datei namens ccc-video.html mit dem folgendne Inhalt:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 {{- $id := .Get \u0026#34;id\u0026#34; -}} {{- $width := .Get \u0026#34;width\u0026#34; | default \u0026#34;100%\u0026#34; -}} {{- $height := .Get \u0026#34;height\u0026#34; | default \u0026#34;576\u0026#34; -}} {{ if $id }} \u0026lt;div class=\u0026#34;ccc-video-wrapper\u0026#34;\u0026gt; \u0026lt;iframe width=\u0026#34;{{ $width }}\u0026#34; height=\u0026#34;{{ $height }}\u0026#34; src=\u0026#34;https://media.ccc.de/v/{{ $id }}/oembed\u0026#34; frameborder=\u0026#34;0\u0026#34; allowfullscreen\u0026gt; \u0026lt;/iframe\u0026gt; \u0026lt;/div\u0026gt; {{ else }} {{ errorf \u0026#34;ccc-video shortcode: Parameter \u0026#39;id\u0026#39; fehlt!\u0026#34; }} {{ end }} Verwendung # Mit der Video-ID aus der URL von media.ccc.de lässt sich ein Video nun ganz einfach einbinden. Hier als Beispiel den Vortrag von Jörg Kastning auf den Chemnitzer Linux Tagen 2026:\n1 {{\u0026lt; ccc-video id=\u0026#34;clt26-116-der-kunde-lugt-immer-und-im-support-kann-niemand-lesen\u0026#34; \u0026gt;}} Optional kann auch die Größe des Players angepasst werden:\n1 {{\u0026lt; ccc-video id=\u0026#34;clt26-116-der-kunde-lugt-immer-und-im-support-kann-niemand-lesen\u0026#34; width=\u0026#34;800\u0026#34; height=\u0026#34;450\u0026#34; \u0026gt;}} Wird der Parameter id weggelassen, gibt Hugo beim Bauen der Seite eine Fehlermeldung aus, damit der Fehler nicht unbemerkt bleibt.\n","date":"15. Mai 2026","externalUrl":null,"permalink":"/blog/short-code-media-ccc-de/","section":"Blogs","summary":"Wer in seinem Hugo-Blog Videos vom Chaos Computer Club (media.ccc.de) einbinden möchte, kann dafür einen eigenen Shortcode erstellen. Dieser erspart es, jedes Mal den vollständigen iframe-Code manuell einzufügen, und hält die Markdown-Dateien übersichtlich.\n","title":"Videos vom CCC mit einem Hugo-shortcode einbetten","type":"blog"},{"content":"","date":"5. Oktober 2025","externalUrl":null,"permalink":"/tags/citrix/","section":"Tags","summary":"","title":"Citrix","type":"tags"},{"content":"","date":"5. Oktober 2025","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","date":"5. Oktober 2025","externalUrl":null,"permalink":"/tags/macos/","section":"Tags","summary":"","title":"MacOS","type":"tags"},{"content":" Warum überhaupt!? # Beruflich muss ich Citrix benutzen um an die interne Infrastruktur zu kommen und meinen Dienst zu verrichten. Soweit ist das auch ok, nur wenn das macBook den Bildschirm ausschaltet, wird auch automatisch die Verbindung getrennt und ich muss mich wieder anmelden. Nicht nur das ist nervig, sondern auch der Umstand, dass der erneute Login manchmal nicht funktioniert, da meine VM die ich dann nutze (oder genutzt habe) eingefroren ist und somit nicht mehr ansprechbar war. Ein deaktivieren der Energieeinstellung hilft zwar, also dass das macBook nicht mehr schlafen geht. Aber da es auch mein privat genutztes Gerät ist, nervt es, wenn bspw. das angeschlossene Display etc. nicht mehr ausgeschaltet wird.\nWie kann man dem begegnen\u0026hellip; # Mein derzeitiger Ansatz ist daher die automatisierte Nutzung von caffinate. Dabei wird das folgende Skript im Hintergrund ausgeführt und prüft, ob aktuell eine Citrix-Verbindung besteht. Wenn ja, wird der Schlafmodus deaktiviert indem caffinate gestartet wird. Besteht keine Citrix-Verbindung oder wurde diese in der Zwischenzeit beendet, wird der Schlafmodus wieder deaktiviert indem der caffinate-Prozess beendet wird.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 #!/usr/bin/env bash # Log-Datei für Debugging LOG_FILE=\u0026#34;/tmp/citrix_energy.log\u0026#34; exec \u0026gt;\u0026gt; \u0026#34;$LOG_FILE\u0026#34; 2\u0026gt;\u0026amp;1 # Funktion: Schlafmodus deaktivieren disable_sleep() { echo \u0026#34;$(date) | Deaktiviere Schlafmodus (Citrix läuft)\u0026#34; \u0026gt;\u0026gt; \u0026#34;$LOG_FILE\u0026#34; caffeinate -dims \u0026amp; CAFFEINATE_PID=$! echo \u0026#34;Caffeinate PID: $CAFFEINATE_PID\u0026#34; \u0026gt;\u0026gt; \u0026#34;$LOG_FILE\u0026#34; } # Funktion: Schlafmodus wieder aktivieren enable_sleep() { echo \u0026#34;$(date) | Aktiviere Schlafmodus (Citrix beendet)\u0026#34; \u0026gt;\u0026gt; \u0026#34;$LOG_FILE\u0026#34; if kill \u0026#34;$CAFFEINATE_PID\u0026#34; 2\u0026gt;/dev/null; then echo \u0026#34;Caffeinate ($CAFFEINATE_PID) beendet\u0026#34; \u0026gt;\u0026gt; \u0026#34;$LOG_FILE\u0026#34; else echo \u0026#34;Fehler: Caffeinate-Prozess nicht gefunden\u0026#34; \u0026gt;\u0026gt; \u0026#34;$LOG_FILE\u0026#34; fi } # Hauptschleife LAST_STATE=false while true; do # Prüfe, ob Citrix Viewer läuft if pgrep -xq \u0026#39;Citrix Viewer\u0026#39;; then CURRENT_STATE=true if [ \u0026#34;$LAST_STATE\u0026#34; = false ]; then disable_sleep fi else CURRENT_STATE=false if [ \u0026#34;$LAST_STATE\u0026#34; = true ]; then enable_sleep fi fi LAST_STATE=$CURRENT_STATE sleep 10 # Prüfe alle 10 Sekunden done Zusätzlich, wenn man das Ganze automatisch im Hintergrund starten möchte, müssten wir noch ein Iten für den LaunchAgent unter ~/Library/LaunchAgents/com.user.citrixenergy.plist einrichten.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 \u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.user.citrixenergy\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/Users/user/bin/citrix_energymanager.sh\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;!-- Startet beim Login --\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;!-- Startet neu, falls das Skript crasht --\u0026gt; \u0026lt;key\u0026gt;StandardOutPath\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;/tmp/citrix_energy.log\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;StandardErrorPath\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;/tmp/citrix_energy_error.log\u0026lt;/string\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; ","date":"5. Oktober 2025","externalUrl":null,"permalink":"/blog/citrix-macos-prevent-sleep/","section":"Blogs","summary":"Warum überhaupt!? # Beruflich muss ich Citrix benutzen um an die interne Infrastruktur zu kommen und meinen Dienst zu verrichten. Soweit ist das auch ok, nur wenn das macBook den Bildschirm ausschaltet, wird auch automatisch die Verbindung getrennt und ich muss mich wieder anmelden. Nicht nur das ist nervig, sondern auch der Umstand, dass der erneute Login manchmal nicht funktioniert, da meine VM die ich dann nutze (oder genutzt habe) eingefroren ist und somit nicht mehr ansprechbar war. Ein deaktivieren der Energieeinstellung hilft zwar, also dass das macBook nicht mehr schlafen geht. Aber da es auch mein privat genutztes Gerät ist, nervt es, wenn bspw. das angeschlossene Display etc. nicht mehr ausgeschaltet wird.\n","title":"macOS vom Schlafen abhalten","type":"blog"},{"content":"","date":"8. September 2025","externalUrl":null,"permalink":"/tags/devops/","section":"Tags","summary":"","title":"Devops","type":"tags"},{"content":"Als ich nach dem dreiwöchigem Urlaub auf eins meiner Systeme wollte, war die Welt nicht mehr so wie vor dem Urlaub \u0026#x1f600;. Abgesehen, davon das der Urlaub vorbei war, verhielt sich die SSH-Session seltsam. Die History und der Output der Programme funktionierte nicht mehr, keine Farben etc..\nIrgendwann sah ich dann so etwas:\n1 unknown terminal \u0026#34;xterm-ghostty\u0026#34; Und siehe da, Ghostty setzt die Variable $TERM nun anders (!? ist mir eventuell vorher nicht aufgefallen !?). Steht auch zusammen mit einigen Workarounds in der Doku \u0026#x1f600;.\nAlternativ kann man auch das Folgende machen:\n1 2 3 if [[ \u0026#34;$TERM\u0026#34; =~ \u0026#34;ghostty\u0026#34; ]]; then export TERM=xterm-256color fi In den drei Zeilen wird geschaut, ob die Variable $TERM \u0026ldquo;ghostty\u0026rdquo; enthält und falls ja, wird diese durch xterm-256color überschrieben. Das Ganze kann man sich in seine .bashrc oder .zshrc packen.\n","date":"8. September 2025","externalUrl":null,"permalink":"/blog/ghosttty_term/","section":"Blogs","summary":"Als ich nach dem dreiwöchigem Urlaub auf eins meiner Systeme wollte, war die Welt nicht mehr so wie vor dem Urlaub 😀. Abgesehen, davon das der Urlaub vorbei war, verhielt sich die SSH-Session seltsam. Die History und der Output der Programme funktionierte nicht mehr, keine Farben etc..\n","title":"Ghostty - terminfo","type":"blog"},{"content":"","date":"8. September 2025","externalUrl":null,"permalink":"/tags/terminals/","section":"Tags","summary":"","title":"Terminals","type":"tags"},{"content":"","date":"7. Juli 2024","externalUrl":null,"permalink":"/tags/k8s/","section":"Tags","summary":"","title":"K8s","type":"tags"},{"content":"","date":"7. Juli 2024","externalUrl":null,"permalink":"/tags/kubernetes/","section":"Tags","summary":"","title":"Kubernetes","type":"tags"},{"content":"","date":"7. Juli 2024","externalUrl":null,"permalink":"/series/link-dump/","section":"Series","summary":"","title":"Link-Dump","type":"series"},{"content":"","date":"7. Juli 2024","externalUrl":null,"permalink":"/tags/linkdump/","section":"Tags","summary":"","title":"Linkdump","type":"tags"},{"content":" Gitlab # Send testmails # 1 2 3 gitlab-rails console # on rails console: Notify.test_email(\u0026#39;you@example.com\u0026#39;, \u0026#39;Message Subject\u0026#39;, \u0026#39;Message Body\u0026#39;).deliver_now Reset you initial root password # 1 gitlab-rake \u0026#34;gitlab:password:reset[root]\u0026#34; Solve Error 500 when (changing application settings) # 1 2 3 gitlab-psql -d gitlabhq_production # on PSQL-Shell DELETE FROM application_settings; Linux # Linux Terminal key combinations\nKubernetes # Working with container registries # Get all available container images\n1 2 3 4 5 6 7 8 9 10 11 12 13 curl --insecure -s -X GET -u user:pass https://container-registry:5000/v2/_catalog | jq { \u0026#34;repositories\u0026#34;: [ \u0026#34;alpine-base\u0026#34;, \u0026#34;alpine_base\u0026#34;, \u0026#34;alpine_base_apache\u0026#34;, \u0026#34;alpine_base_tomcat\u0026#34;, \u0026#34;alpine_base_wildfly\u0026#34;, \u0026#34;alpine_dimag_ingestlist\u0026#34;, \u0026#34;alpine_dimag_ipm\u0026#34;, \u0026#34;alpine_dimag_km\u0026#34; ] } Get al available tag of a container image\n1 2 3 4 5 6 7 8 curl -s --insecure -X GET -u user:pass https://container-registry:5000/v2/alpine_base_apache/tags/list | jq { \u0026#34;name\u0026#34;: \u0026#34;alpine_base_apache\u0026#34;, \u0026#34;tags\u0026#34;: [ \u0026#34;latest\u0026#34;, \u0026#34;php82\u0026#34; ] } ","date":"7. Juli 2024","externalUrl":null,"permalink":"/blog/linkdump-kw27/","section":"Blogs","summary":"Gitlab # Send testmails # 1 2 3 gitlab-rails console # on rails console: Notify.test_email('you@example.com', 'Message Subject', 'Message Body').deliver_now Reset you initial root password # 1 gitlab-rake \"gitlab:password:reset[root]\" Solve Error 500 when (changing application settings) # 1 2 3 gitlab-psql -d gitlabhq_production # on PSQL-Shell DELETE FROM application_settings; Linux # Linux Terminal key combinations\n","title":"Linkdump 27/2024","type":"blog"},{"content":"","date":"7. Juli 2024","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"Einfaches Python-Skript zur Berechnung der QR-Codes für das Acitmel Pokemon Gewinnspiel:\n1 2 3 4 5 6 7 8 9 from hashlib import sha256 names = [\u0026#39;dragonite\u0026#39;, \u0026#39;fidough\u0026#39;, \u0026#39;fuecoco\u0026#39;, \u0026#39;gyarados\u0026#39;, \u0026#39;munchlax\u0026#39;, \u0026#39;bellibolt\u0026#39;, \u0026#39;greavard\u0026#39;, \u0026#39;charmeleon\u0026#39;, \u0026#39;charmander\u0026#39;, \u0026#39;bulbasaur\u0026#39;, \u0026#39;charizard\u0026#39;, \u0026#39;blastoise\u0026#39;, \u0026#39;ivysaur\u0026#39;, \u0026#39;pawmi\u0026#39;, \u0026#39;pichu\u0026#39;, \u0026#39;pikachu\u0026#39;, \u0026#39;quaxly\u0026#39;, \u0026#39;smoliv\u0026#39;, \u0026#39;raichu\u0026#39;, \u0026#39;sprigatito\u0026#39;, \u0026#39;squirtle\u0026#39;, \u0026#39;venusaur\u0026#39;, \u0026#39;wartortle\u0026#39;] for name in names: hsh = sha256(name.encode(\u0026#39;utf-8\u0026#39;)).hexdigest() print(f\u0026#39;{name: \u0026lt;{10}} | https://pokemon.actimel.de/welcome?scan={hsh}\u0026#39;) This results in the following:\nPokémon URL dragonite https://pokemon.actimel.de/welcome?scan=042ce75d492cb394999ff4fc039d13fa22678485056ab32812fdbd1b88480089 fidough https://pokemon.actimel.de/welcome?scan=2f67aac66c98287d52a3d4efc51b83c242c161889c7f42674eeda150ebdc771d fuecoco https://pokemon.actimel.de/welcome?scan=5a4647c1f3fa84997a6ddea1f4ad39461e218b0d8fc803df8fafe53600b46b9f gyarados https://pokemon.actimel.de/welcome?scan=7cb2e6f544eb21f608aa5d8e60de3fb58636c34a03d1ed1226dfb0abad88598e munchlax https://pokemon.actimel.de/welcome?scan=310a6e1a21da2d2d320237ccc713c93df80955f7933dd8a6a184ed23237ddfea bellibolt https://pokemon.actimel.de/welcome?scan=de776cea1f7b724768844115f77ff826ee20a0f8f0b7792130c4b35dbe297a08 greavard https://pokemon.actimel.de/welcome?scan=e240ed5c2cdbbefc3c48ea9a184665137cf8a553a5024fef78205338f4617a90 charmeleon https://pokemon.actimel.de/welcome?scan=dcc51a1369ed1884e6f26512b8811092181e07b3e386cebfed452fa51c70244e charmander https://pokemon.actimel.de/welcome?scan=8cbfa8573683626c1609d1373f23b63bbfa5692fccad285e0306a500fa4b28f9 bulbasaur https://pokemon.actimel.de/welcome?scan=b5b5652a5dd3d781e2f6f412223e843cacbf2872091f485ed5fd61aa967a3719 charizard https://pokemon.actimel.de/welcome?scan=73e512eccd9639bf632f1675f6a34a116f0abe5404dcebe98bf023be0e329d10 blastoise https://pokemon.actimel.de/welcome?scan=9041324a9605633b12b6b65b4357af286cfad675ed5f5b1f1a564b27df821511 ivysaur https://pokemon.actimel.de/welcome?scan=1f29ed0b79a8582771992cb656ea38e9c6fb16215d85f99b72af43a0722e163b pawmi https://pokemon.actimel.de/welcome?scan=fa48a2842a0b0f8f5372bf347533edca563ba867851374bd3d0d632df066e3e1 pichu https://pokemon.actimel.de/welcome?scan=fc23f358d8c9f72c56e093af3877723bb7d0b1f9d786d815acddd37a35a1012b pikachu https://pokemon.actimel.de/welcome?scan=43999461d22f67840fcd9b8824293eaa4f18146e57b2c651bcd925e3b3e4e429 quaxly https://pokemon.actimel.de/welcome?scan=6339e380b97b2ee89170ff4dcc51e19d2b5881a58ac7475cf7bf5f5369dd6ecb smoliv https://pokemon.actimel.de/welcome?scan=d2b8de5e99f0dc7d8a207861a0dcded1de5a8a1ccd45c94828fb11565b2f1305 raichu https://pokemon.actimel.de/welcome?scan=a9462f7c66b5833710cbb41d4ef19e4bd704b05c69b94f1bafb2e9b15bae1217 sprigatito https://pokemon.actimel.de/welcome?scan=5a68b137ceecaa8397262b9701c5ba0ed0b9d63927e4e14c17f56cd871134f0c squirtle https://pokemon.actimel.de/welcome?scan=43c9d997f68ee54a55f7a22062c895312250751d3505ef2da40d2a7cf32b39fe venusaur https://pokemon.actimel.de/welcome?scan=74ac4c00f18fe573707f30310dc80ab513408e593b64b00c0cdfdfc3c174b370 wartortle https://pokemon.actimel.de/welcome?scan=eb2af329c8d993e4f8ada53717e945cf652428690b0ba68ef6030ca857a28eec Have fun \u0026#x1f609;.\n","date":"14. Juni 2024","externalUrl":null,"permalink":"/blog/poke-lottery/","section":"Blogs","summary":"Einfaches Python-Skript zur Berechnung der QR-Codes für das Acitmel Pokemon Gewinnspiel:\n1 2 3 4 5 6 7 8 9 from hashlib import sha256 names = ['dragonite', 'fidough', 'fuecoco', 'gyarados', 'munchlax', 'bellibolt', 'greavard', 'charmeleon', 'charmander', 'bulbasaur', 'charizard', 'blastoise', 'ivysaur', 'pawmi', 'pichu', 'pikachu', 'quaxly', 'smoliv', 'raichu', 'sprigatito', 'squirtle', 'venusaur', 'wartortle'] for name in names: hsh = sha256(name.encode('utf-8')).hexdigest() print(f'{name: \u003c{10}} | https://pokemon.actimel.de/welcome?scan={hsh}') This results in the following:\n","title":"Caclulating QR-Code URLs for the Actimel/Pokémon lottery","type":"blog"},{"content":"","date":"14. Juni 2024","externalUrl":null,"permalink":"/tags/inbetween/","section":"Tags","summary":"","title":"Inbetween","type":"tags"},{"content":"","date":"14. Juni 2024","externalUrl":null,"permalink":"/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":"","date":"10. Mai 2024","externalUrl":null,"permalink":"/tags/docker/","section":"Tags","summary":"","title":"Docker","type":"tags"},{"content":"Sehr schönes online Tool zum Frickeln an SED-Ausdrücken: GNU sed REPL\nKontrolle über S6 Services in Containern. S6-SVC Doku\nWass ist Chat-GPT eigentlich und warum funktioniert es überhaupt? Stephen Wolfram\n","date":"10. Mai 2024","externalUrl":null,"permalink":"/blog/linkdump-kw26/","section":"Blogs","summary":"Sehr schönes online Tool zum Frickeln an SED-Ausdrücken: GNU sed REPL\nKontrolle über S6 Services in Containern. S6-SVC Doku\nWass ist Chat-GPT eigentlich und warum funktioniert es überhaupt? Stephen Wolfram\n","title":"Linkdump 26/2024","type":"blog"},{"content":"","date":"10. Mai 2024","externalUrl":null,"permalink":"/tags/regex/","section":"Tags","summary":"","title":"Regex","type":"tags"},{"content":"","date":"9. Oktober 2020","externalUrl":null,"permalink":"/tags/cpp/","section":"Tags","summary":"","title":"Cpp","type":"tags"},{"content":"","date":"9. Oktober 2020","externalUrl":null,"permalink":"/tags/scientific-computing/","section":"Tags","summary":"","title":"Scientific Computing","type":"tags"},{"content":"Suchen der Primzahlen kleiner 100 in C++.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 // basic io #include \u0026lt;iostream\u0026gt; using namespace std; int main ( int argc, const char* argv[] ) { int iCount = 0; int iDivisor = 1; // loop over all natural numbers for ( iCount = 1; iCount \u0026lt;= 100; ++iCount ){ // state if current number is a prime number int iPrime = 1; // loop over each divisor candidate for ( iDivisor = 2; iDivisor \u0026lt; iCount; ++iDivisor ) { // if divisor matches the current number -\u0026gt; change state if ( iCount % iDivisor == 0 ){ iPrime = 0; } } // if prime print to stdout if (iPrime == 1 ) { std::cout \u0026lt;\u0026lt; iCount \u0026lt;\u0026lt; std::endl; } } return 0; } ","date":"9. Oktober 2020","externalUrl":null,"permalink":"/blog/cpp-prime-numbers/","section":"Blogs","summary":"Suchen der Primzahlen kleiner 100 in C++.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 // basic io #include \u003ciostream\u003e using namespace std; int main ( int argc, const char* argv[] ) { int iCount = 0; int iDivisor = 1; // loop over all natural numbers for ( iCount = 1; iCount \u003c= 100; ++iCount ){ // state if current number is a prime number int iPrime = 1; // loop over each divisor candidate for ( iDivisor = 2; iDivisor \u003c iCount; ++iDivisor ) { // if divisor matches the current number -\u003e change state if ( iCount % iDivisor == 0 ){ iPrime = 0; } } // if prime print to stdout if (iPrime == 1 ) { std::cout \u003c\u003c iCount \u003c\u003c std::endl; } } return 0; } ","title":"Suche nach den ersten hundert Primzahlen in C++","type":"blog"},{"content":"Hi, mein Name ist Daniel, ich bin Baujahr 1982 und komme aus dem schönen Brandenburg. Seit frühester Kindheit bastel ich an so ziemlich allem, was mit Technik zu tun hat. Spätestens mit dem C64 an Rechnern.\nMomentan arbeite ich als Fullstack JAVA-Entwickler im DIMAG-Verbund.\nTechnologien # In den letzten Zeit habe ich mich mit folgenden Technilogien auseinandergesetzt:\nKubernetes (K3s und OpenShift) Containerisierung mit Podman und Docker Virtualisierung mit Proxmox und Hyper-V Automatisierung mit Ansible Programmiersprachen # JAVA Python Go(lang) ","date":"2. August 2019","externalUrl":null,"permalink":"/about/","section":"Daniel Hufschläger","summary":"Hi, mein Name ist Daniel, ich bin Baujahr 1982 und komme aus dem schönen Brandenburg. Seit frühester Kindheit bastel ich an so ziemlich allem, was mit Technik zu tun hat. Spätestens mit dem C64 an Rechnern.\n","title":"Über mich","type":"page"},{"content":"","date":"20. Mai 2018","externalUrl":null,"permalink":"/tags/atmel/","section":"Tags","summary":"","title":"Atmel","type":"tags"},{"content":"For tinkering with an ATmega32U4 board, (again) I need to get the ATMEL ICE under macOS. Since High Sierra kernel extensions have to be signed and the presented workarounds of earlier posts wouldn\u0026rsquo;t work anymore. However, there is a signed kext available at the AVRFreaks forums. In my case, I downloaded the file, extracted and moved it. Additionally, I adjusted the owner and access rights. Since these files are system relevant files, you will need to do these operations as super-user.\n1 2 3 4 sudo mv AtmelICE.kext /Library/Extensions/ sudo chown -R root:wheel /Library/Extensions/AtmelICE.kext sudo chmod -R 755 /Library/Extensions/AtmelICE.kext sudo kextload /Library/Extensions/AtmelICE.kext Disconnect and reconnect your device, and it should be ready to use. For simple testing the device communication I used avrdude to talk to the device. Choose the correct programmer interface is essential for this part. If your board is using the ISP-interface, you would have to use atmelice_isp. For using JTAG, you have to use atmelice. Please check the avrdude docs for further information. You could install avrdude using homebrew.\n1 avrdude -c atmelice_isp -p m32u4 -P usb ","date":"20. Mai 2018","externalUrl":null,"permalink":"/blog/atmelice-and-os-x-4/","section":"Blogs","summary":"For tinkering with an ATmega32U4 board, (again) I need to get the ATMEL ICE under macOS. Since High Sierra kernel extensions have to be signed and the presented workarounds of earlier posts wouldn’t work anymore. However, there is a signed kext available at the AVRFreaks forums. In my case, I downloaded the file, extracted and moved it. Additionally, I adjusted the owner and access rights. Since these files are system relevant files, you will need to do these operations as super-user.\n","title":"Atmel ICE and macOS - High Sierra kext","type":"blog"},{"content":"","date":"20. Mai 2018","externalUrl":null,"permalink":"/series/atmel-ice-programmer-unter-macos/","section":"Series","summary":"","title":"Atmel ICE Programmer Unter MacOS","type":"series"},{"content":"","date":"20. Mai 2018","externalUrl":null,"permalink":"/tags/avr/","section":"Tags","summary":"","title":"AVR","type":"tags"},{"content":"Recently I switched the theme of my blog (based on hugo). My new theme is supporting some new features like authors. This feature requires some additional parameters in the front matter of the post. I found a very convenient way using the Python package front matter. The code below changes these parameters automatically. The original script was posted in a StackOverflow answer but doesn\u0026rsquo;t work for me. So I modified it slightly.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/usr/bin/env python # # https://stackoverflow.com/questions/25697664/how-would-i-parse-front-matter-with-python # import frontmatter import io from os.path import basename, splitext import glob auths = [\u0026#39;daniel\u0026#39;] path = \u0026#34;content/docs/*.md\u0026#34; for fname in glob.glob(path): with io.open(fname, \u0026#39;r\u0026#39;) as f: post = frontmatter.load(f) if post.get(\u0026#39;author\u0026#39;) == None: post[\u0026#39;authors\u0026#39;] = auths newfile = io.open( fname, \u0026#39;w\u0026#39;, encoding=\u0026#39;utf8\u0026#39;) #frontmatter.dump(post, newfile) newfile.write ( frontmatter.dumps(post) ) newfile.close() The script above checks the existence of authors in all markdown files inside the predefined path. Contains the post an existing parameter it does nothing, is it missing it will be added automatically. Very convenient!\n","date":"16. Januar 2018","externalUrl":null,"permalink":"/blog/setting-frontmatter-using-python/","section":"Blogs","summary":"Recently I switched the theme of my blog (based on hugo). My new theme is supporting some new features like authors. This feature requires some additional parameters in the front matter of the post. I found a very convenient way using the Python package front matter. The code below changes these parameters automatically. The original script was posted in a StackOverflow answer but doesn’t work for me. So I modified it slightly.\n","title":"Setting Hugo frontmatter using Python","type":"blog"},{"content":"The conda package for Sublime Text 3 in default configuration is prefering Anaconda. Neverless by adjusting some paths, you\u0026rsquo;ll be able to use miniconda aswell. The source block below was taken for a installation of miniconda (with Python 3.6) x64 on a Windows workstation. The paths might be different on a macOS or Linux machine.\n1 2 3 4 5 6 7 8 9 10 11 12 13 // Default settings for sublime-text-conda: { // executable is the path to anaconda\u0026#39;s python // this python executable is used in order to find conda \u0026#34;executable\u0026#34;: \u0026#34;~\\\\AppData\\\\Local\\\\Continuum\\\\miniconda3\\\\python\u0026#34;, // Directory in which the conda envs are stored // Default location is the user\u0026#39;s home directory \u0026#34;environment_directory\u0026#34;: \u0026#34;~\\\\AppData\\\\Local\\\\Continuum\\\\miniconda3\\\\envs\\\\\u0026#34;, // configuration is the path to conda\u0026#39;s configuration file \u0026#34;configuration\u0026#34;: \u0026#34;~/.condarc\u0026#34; } ","date":"10. Oktober 2017","externalUrl":null,"permalink":"/blog/sublime-text-and-miniconda/","section":"Blogs","summary":"The conda package for Sublime Text 3 in default configuration is prefering Anaconda. Neverless by adjusting some paths, you’ll be able to use miniconda aswell. The source block below was taken for a installation of miniconda (with Python 3.6) x64 on a Windows workstation. The paths might be different on a macOS or Linux machine.\n","title":"Sublime Text 3 using miniconda","type":"blog"},{"content":"As the title promises, I have spent some time for recapitulating the amplitude modulation and several reconstruction techniques. Today amplitude modulation isn\u0026rsquo;t very common, but was used for varoius applications like audio or signal transmissions in general.\nMath # The amplitude modulation uses a high frequency signal $U_{C}$ which carriers the low frequency signal $U_{NF}$ into a higher frequency band.\n$$ \\begin{aligned} U_{NF} \u0026= \\hat{U}\\_{T} + \\hat{U}\\_{NF} \\cdot cos\\left( \\omega t \\right)\\\\\\\\ U_{C} \u0026= \\hat{U}\\_{C} \\cdot cos \\left( \\Omega t \\right) \\end{aligned}$$For mathematical description, we choose \\(\\hat{U}_{C}\\) to be \\(1\\) and we will end up.\n$$ \\begin{aligned} U_{AM} \u0026= U_{NF} \\cdot U\\_{C} \\\\\\\\ \u0026= \\left( \\hat{U}\\_{T} + \\hat{U}_{NF} cos\\left( \\omega t \\right) \\right) \\cdot cos \\left( \\Omega t \\right) \\\\\\\\ \u0026= \\hat{U}\\_{T} \\cdot cos \\left( \\Omega t \\right) + \\frac{\\hat{U}\\_{NF}}{2}\\left( cos \\left( \\left( \\Omega - \\omega \\right) \\right) + cos \\left( \\left( \\Omega + \\omega \\right) \\right) \\right) \\end{aligned}$$The last equation shows clearly the circumstance of three existing signals. The first one describes the DC1 component of the used low frequency signal, but with carrier frequency. The remaining two parts describing the produced sideband signals. They have the half amplitude of the low frequency signal and are positioned around the carrier frequency. For this script I demodulate the transmitted signal by using the convolution theory. Insted of use an envelope detector, it is also possible to multiply the time series of the carrier function again. Multiplication in the time domain will occur an convolution of booth signals in the frequency domain and as the low frequency part is shifted to higher frequencies, there will be existe multiple copies of the same alogn the frequency axis.\nPython implementation # Import packages and libs # At first we will iport the needed packages. As you can see, I used matplotlib, numpy and scipy for this script. RaisedCos and Noisgen are selfwritten classes for signal generation.\n1 2 3 4 5 6 import matplotlib.pyplot as plt import numpy as np import scipy as sp import scipy.signal from raised_cos import RaisedCos, Noisegen Define constants # The constant values for this script are described below. I used a carrier frequency of 33 kHz and a signal frequency of 5.5 kHz for the lower signal part. The whole script uses a sample frequency of 1 MHz, so we get a sample period of 100 ns. ffc describes the cutoff frequency of the used reconstruction/low-pass filter and N is the number of used filter coefficients.\n1 2 3 4 5 6 fc = 33e3 # 33 kHz carrier fs = 5.5e3 # 5.5 kHz signal fa = 1e7 # sample frequency dt = 1/fa # time resolution ffc= 1.5*fs/fa # cutoff frequency fir N = 150 # filter order Generate Signals and filter coefficients # For source signal generation I implemented the raised cosine function in Python. These function provides the possibility of a controllable bandwidth. The bandwidth may be modified by increasing the order \\(N\\). $$ \\begin{aligned} U_{RC, N}\\left( t\\right) \u0026= \\frac{\\left( -1 \\right)^N}{2} \\left(1 - cos\\left( \\frac{\\omega t}{N} - \\phi \\right) \\right) \\cdot cos \\left( \\frac{\\omega}{2} t - \\phi\\right) \\end{aligned}$$ The Figure above shows the generated signal in time and frequency domain without noisefloor for different orders. As you can see the bandwidth is decreasing while the order was increased. For this example I used the sixth order, but neverless to say any other order would be also suitable.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Points = int(round(20e-4/dt)) # filter coefficients h = sp.signal.firwin(numtaps=N, cutoff=fc, nyq=fa/2) # time vector x = np.arange(0,20e-4,dt) ulf = np.zeros(Points) # noise floor noise = Noisegen( Points, 40) #Points = int(round(4e-4/dt + 1)) # ultrasonic impulse r = RaisedCos(6, Points, dt, 0, fs ) ulf = r.signal #ulf = np.sin(2*np.pi*fs*x) ulf += noise.signal # thermal signal carrier ucr = np.sin(2*np.pi*2*fc*x) # carrier multiplied with low frequency signal uam = ucr*ulf # demodulate signal by mupltiplying the amplitude modulated signal again ud = uam * ucr # applyng the lowpass filter r = sp.signal.lfilter(h, 1.0, ud ) # Scaling the amplitude y = 2*r Plotting the signals # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # plotting f, axarr = plt.subplots(1, 3) f.set_size_inches(16, 8) axarr[0].plot(x*1e3, ulf) axarr[0].set_title(\u0026#39;Input signal\u0026#39;) axarr[0].set_ylabel(\u0026#39;Amplitude [V]\u0026#39;) axarr[0].set_xlim([0, 2]) axarr[0].set_ylim([-1, 1]) axarr[0].grid() axarr[1].plot(x*1e3, uam) axarr[1].set_title(\u0026#39;Modulated channel\u0026#39;) axarr[1].set_xlim([0, 2]) axarr[1].set_ylim([-1, 1]) axarr[1].grid() axarr[2].plot(x*1e3, y) axarr[2].set_title(\u0026#39;Rescaled reconstruction\u0026#39;) axarr[2].set_xlabel(\u0026#39;Time [ms]\u0026#39;) axarr[2].set_xlim([0, 2]) axarr[2].set_ylim([-1, 1]) axarr[2].grid() plt.savefig(\u0026#39;signals.png\u0026#39;,dpi=150) Direct current\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"27. April 2017","externalUrl":null,"permalink":"/blog/amplitude-modulation-and-demodulation/","section":"Blogs","summary":"As the title promises, I have spent some time for recapitulating the amplitude modulation and several reconstruction techniques. Today amplitude modulation isn’t very common, but was used for varoius applications like audio or signal transmissions in general.\n","title":"Amplitude modulation and demodulation using Python","type":"blog"},{"content":"","date":"26. Februar 2017","externalUrl":null,"permalink":"/tags/elektronik/","section":"Tags","summary":"","title":"Elektronik","type":"tags"},{"content":"A couple of days ago, I\u0026rsquo;ve read about Scott Harden\u0026rsquo;s interesting approach of interfacing a twi temperature sensor by using Python and Hack-a-day\u0026rsquo;s bus pirate. Quite accidentally, I had an similar problem. For some experiments I need a good knowledge about my environmental sizes (e.g. ambient pressure, temperature and humidity). I decided to use a MS8607 sensor produced by \u0026ldquo;Measurement Specialities / TE Connectivity\u0026rdquo; and is distributed for example by AMSYS. I\u0026rsquo;ve got some modules and started reading the datasheet. Due a permanent lack of time I was searching for a good and simple way for testing the sensor interface without the whole prototype circus (e.g. design and build some interface cards, testing the code by using debug interfaces and so on). Scott\u0026rsquo;s solution was simple and I had all tools already available, so I started to adapt his code for my needs.\nCalculations # Difference between actual and reference temperature : $$\\Delta T = D_2 - C_5 \\cdot 2^8 $$ Offset for temperature compensated pressure : $$OFF = C_2 \\cdot 2^{17} + \\frac{C_4 \\cdot \\Delta T} {2^6}$$ Sensivity for actual temperature : $$SENS = C_1 \\cdot 2^{16} + \\frac{C_3 \\cdot \\Delta T}{2^7}$$Temperature (in 0.01 °C resolution) : $$T = 2000 + \\Delta T \\cdot \\frac{C_6}{2^{23}}$$ Pressure (in 0.01 mbar resolution): $$P = \\frac{\\dfrac{D\\_1 \\cdot SENS}{2^{21}} - OFF}{2^{15}}$$ Relative humidity (in %) : $$RH = -6 + 125 \\cdot \\frac{S\\_{RH}}{2^{16}}$$ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 import serial import math import matplotlib.pyplot as plt import numpy as np import time BUSPIRATE_PORT = \u0026#39;com5\u0026#39; #customize this! Find it in device manager. def sendPirate(ser,cmd,silent=True): \u0026#34;\u0026#34;\u0026#34; send the command and listen to the response. returns a list of the returned lines. The first item is always the command sent. \u0026#34;\u0026#34;\u0026#34; ser.write(str(cmd+\u0026#39;\\n\u0026#39;).encode(\u0026#39;ascii\u0026#39;)) # send our command lines=[] for line in ser.readlines(): # while there\u0026#39;s a response lines.append(line.decode(\u0026#39;utf-8\u0026#39;).strip()) if not silent: print(\u0026#34;\\n\u0026#34;.join(lines)) print(\u0026#39;-\u0026#39;*60) return lines def sendSensor( ser, register, addrwrite=0xEC, addrread=0xED, silent=True): \u0026#34;\u0026#34;\u0026#34; Sending data to sensor by using the bus priate device \u0026#34;\u0026#34;\u0026#34; sendPirate (ser,\u0026#39;[%s %s]\u0026#39; % (addrwrite, register), silent=silent) # read two bytes def readSensor (ser, noBytes, register=0x00, addrwrite=0xEC, addrread=0xED, readonly=False, silent=True): \u0026#34;\u0026#34;\u0026#34; Reading data from sensor by using the bus priate device. \u0026#34;\u0026#34;\u0026#34; if not readonly: lines=sendPirate(ser,\u0026#39;[%s %s [ %s r:%d]\u0026#39; % (addrwrite, register, addrread, noBytes ) ,silent=silent) # read three bytes from adc else: lines=sendPirate(ser,\u0026#39;[%s r:%d]\u0026#39; % ( addrread, noBytes ) ,silent=silent) # read three bytes from adc for line in lines: if line.startswith(\u0026#34;READ:\u0026#34;): line=line.split(\u0026#34; \u0026#34;,1)[1].replace(\u0026#34;ACK\u0026#34;,\u0026#39;\u0026#39;) while \u0026#34; \u0026#34; in line: line=\u0026#34; \u0026#34;+line.strip().replace(\u0026#34; \u0026#34;,\u0026#34; \u0026#34;) word = 0 validx = 1 line=\u0026#34; \u0026#34;+line.strip().replace(\u0026#34;0x\u0026#34;,\u0026#34; \u0026#34;) vals = line.split(\u0026#34; \u0026#34;) vals=\u0026#39; \u0026#39;.join(vals).split() nVals = len(vals) for iVal in vals: cVal = int(iVal, 16) word += cVal * math.pow ( 2 , 8 * (nVals - validx ) ) validx +=1 return int(word) def getPressure( ser, addrwrite=0xEC, register=0x4A, addrread=0xED, silent=False): \u0026#34;\u0026#34;\u0026#34; get ambient pressure \u0026#34;\u0026#34;\u0026#34; sendSensor ( ser, register, silent=silent ) time.sleep ( 0.5 ) word = readSensor ( ser, 3, 0x00, addrwrite, addrread, readonly=False, silent=silent ) return int(word) def getTemperature( ser, addrwrite=0xEC, register=0x5A, addrread=0xED, silent=False): sendSensor ( ser, register, silent=silent) time.sleep (0.5) word = readSensor ( ser, 3, 0x00, addrwrite, addrread, readonly=False, silent=silent ) return int(word) def getHumidity( ser, addrwrite=0x80, register=0xA0, addrread=0x81, silent=False): # start humidity conversion # 0xF5 no hold master # 0xE5 hold master sendSensor ( ser, 0xF5, addrwrite=addrwrite, addrread=addrread, silent=silent ) time.sleep(0.5) word = readSensor ( ser, 2, register, addrwrite, addrread, readonly=True, silent=silent ) return int(word) def getCalibrationWord( ser, register, addrwrite=0xEC, addrread=0xED, silent=False): word = readSensor ( ser, 2, register, addrwrite, addrread, readonly=False, silent=silent ) return int(word) def initpirate(ser, silent=False): # have a clean starting point sendPirate(ser,\u0026#39;#\u0026#39;,silent=silent) # reset bus pirate (slow, maybe not needed) #sendPirate(ser,\u0026#39;v\u0026#39;) # show current voltages # set mode to I2C sendPirate(ser,\u0026#39;m\u0026#39;,silent=silent) # change mode (goal is to get away from HiZ) sendPirate(ser,\u0026#39;4\u0026#39;,silent=silent) # mode 4 is I2C sendPirate(ser,\u0026#39;3\u0026#39;,silent=silent) # 100KHz sendPirate(ser,\u0026#39;W\u0026#39;,silent=silent) # turn power supply to ON. Lowercase w for OFF. sendPirate(ser,\u0026#39;P\u0026#39;,silent=silent) # enable pull-up resistors sendPirate(ser,\u0026#39;(1)\u0026#39;,silent=silent) # scan I2C devices. Returns \u0026#34;0x90(0x48 W) 0x91(0x48 R)\u0026#34; def initSensor ( ser, silent=False): sendSensor ( ser, 0x1E,silent=silent ) time.sleep ( 0.5 ) # reset humidity sensor sendSensor ( ser, 0xFE , addrwrite=0x80, addrread=0x81, silent=silent ) time.sleep (0.3) PTCal = getPTCalibrationData ( ser, silent=silent ) return PTCal def getPTCalibrationData(ser, silent=False ): PTCalibration=[] for i in range(0,6): PTCalibration.append (getCalibrationWord( ser, register=(0xA2 + 2*i),silent=silent) ) if not silent: print ( \u0026#34;register 0x%X =\u0026gt; 0x%X\u0026#34; % ( int(0xA2 + 2*i) , PTCalibration[i] )) return PTCalibration ser=serial.Serial(BUSPIRATE_PORT, 115200, timeout=.1) # init buspirate initpirate(ser,silent=True) # reset PT sensor PTCal= initSensor(ser, silent=True ) # start pressure conversion D1 = getPressure ( ser, silent=True ) # start temperature conversion D2 = getTemperature ( ser , silent=True) dT = D2 - PTCal[4] * 256 Temp = 2000 + dT * PTCal[5] / 8388608 OFF = PTCal[1] * 131072 + (PTCal[3] * dT) / 64 SENS = PTCal[0] * 65536 + (PTCal[2] * dT ) / 128 if Temp \u0026gt;= 2000 : Ti = 5 * (dT * dT) / 274877906944 OFFi = 0 SENSi= 0 elif Temp \u0026lt; 2000 : Ti = 3 * (dT * dT) / 8589934592 OFFi = 61 * ((Temp - 2000) * (Temp - 2000)) / 16 SENSi= 29 * ((Temp - 2000) * (Temp - 2000)) / 16 if Temp \u0026lt; -1500: OFFi = OFFi + 17 * ((Temp + 1500) * (Temp + 1500)) SENSi= SENSi + 9 * ((Temp + 1500) * (Temp +1500)) OFF2 = OFF - OFFi SENS2 = SENS - SENSi cTemp = (Temp - Ti) / 100.0 fTemp = cTemp * 1.8 + 32 pressure= ((((D1 * SENS2) / 2097152) - OFF2) / 32768.0) / 100.0 D3 = getHumidity ( ser, silent=True ) humidity= (-6.0 + (125.0 * (D3 / 65536.0))) print ( \u0026#34;Temperature %2.2f °C / Pressure %3.2f mbar / Humidity %3.1f %%\u0026#34; % ( cTemp , pressure, humidity )) ","date":"26. Februar 2017","externalUrl":null,"permalink":"/blog/buspirate-ms8607/","section":"Blogs","summary":"A couple of days ago, I’ve read about Scott Harden’s interesting approach of interfacing a twi temperature sensor by using Python and Hack-a-day’s bus pirate. Quite accidentally, I had an similar problem. For some experiments I need a good knowledge about my environmental sizes (e.g. ambient pressure, temperature and humidity). I decided to use a MS8607 sensor produced by “Measurement Specialities / TE Connectivity” and is distributed for example by AMSYS. I’ve got some modules and started reading the datasheet. Due a permanent lack of time I was searching for a good and simple way for testing the sensor interface without the whole prototype circus (e.g. design and build some interface cards, testing the code by using debug interfaces and so on). Scott’s solution was simple and I had all tools already available, so I started to adapt his code for my needs.\n","title":"Interfacing a MS8607 sensor with Python using the bus pirate","type":"blog"},{"content":" Introduction # For some simulation topics of my Ph.D., I had to learn/recapitulate some basics about simulations techniques and fluid simulations. The original procedure and code could be found at Archer (UK National Supercomputing Service). This is a simple example for applying the finite difference approach to determine the flow pattern (CFD1) in a cavity. For simplicity, we\u0026rsquo;re assuming a perfect liquid without viscosity, which also implies that there\u0026rsquo;re no vortices. The \\(z\\)-dimension of this setup was defined to be endless. We are interested in the directional velocity of the fluid.\nSimulation setup A bit of math # Finite Difference Method # First order PDE # For solving a first or higher order PDE2 several methods exist. The easiest one is the finite difference method. For that method we\u0026rsquo;re needing a suitable approximation for the first derivative, for example the left aligned or forward difference:\n$$ \\frac{\\partial}{\\partial x} F \\approx \\frac{F(x + \\Delta x) - F(x)}{\\Delta x} + \\mathcal{O(\\Delta x)} $$Also possible, the right aligned or backward difference:\n$$ \\frac{\\partial}{\\partial x} F \\approx \\frac{F(x) - F(x - \\Delta x)}{\\Delta x} + \\mathcal{O(\\Delta x)} $$For a better approximation, we could also use the combination of forward and backward difference. This method is called the centered difference and is able to describe the derivative on position \\(x\\) only with knowledge about the neighbors left and right.\n$$ \\frac{\\partial}{\\partial x} F \\approx \\frac{F(x + \\Delta x) - F(x - \\Delta x)}{2\\Delta x} + \\mathcal{O(\\Delta x)} $$ Second and higher order PDE # $$ \\begin{align} \\frac{\\partial^2 F}{\\partial x^2} \u0026 = \\frac{\\partial } {\\partial x} \\left( \\frac{\\partial F}{\\partial x}\\right) \\\\\\\\ \u0026 \\approx \\frac{1}{\\Delta x}\\left(\\frac{\\partial F(x + \\Delta x)}{\\partial x} - \\frac{\\partial F(x - \\Delta x)}{\\partial x} \\right) \\\\\\\\ \u0026 \\approx \\frac{1}{ \\Delta x} \\left( \\frac{F(x+\\Delta x) - F(x)}{ \\Delta x} - \\frac{F(x) - F(x - \\Delta x)}{ \\Delta x} \\right)+ \\mathcal{O}(\\Delta x)^2 \\\\\\\\ \u0026 \\approx \\frac{1}{(\\Delta x)^2} \\Bigg( F(x + \\Delta x) - 2F(x) + F(x - \\Delta x) \\Bigg) + \\mathcal{O}(\\Delta x)^2 \\end{align} $$ Cavity problem solving # For the given problem the following second-order PDE exist for the fluid flow \\(\\Psi\\) which neglecting the existence of viscosity and toroids.\n$$\\frac{\\partial^2 \\Psi}{\\partial x^2} + \\frac{\\partial^2 \\Psi}{\\partial y^2} = 0$$Using the finite difference approach for second order PDEs we could rewrite the equation, which fully satisfies our problem.\n$$ \\begin{align} \\frac{\\partial^2 \\Psi}{\\partial x^2} + \\frac{\\partial^2 \\Psi}{\\partial y^2} \u0026 \\approx \\frac{1}{(\\Delta x)^2} \\Bigg( \\Psi(x + \\Delta x, y ) - 2 \\Psi (x, y) + \\Psi (x - \\Delta x, y) \\Bigg)\\\\\\\\ \u0026 + \\frac{1}{(\\Delta y)^2} \\Bigg( \\Psi(x, y + \\Delta y) - 2 \\Psi(x,y) + \\Psi(x, y - \\Delta y) \\Bigg) \\end{align} $$For discretization we replace the continous terms \\(x\\) and \\(y\\) by their discrete replacements \\(i\\) and \\(j\\) and set the spatial resolution in \\(x\\)- and \\(y\\)-direction to \\(1\\) (\\(\\Delta x=\\Delta y=1\\) ).\n$$ \\frac{\\partial^2 \\Psi}{\\partial x^2} + \\frac{\\partial^2 \\Psi}{\\partial y^2} \\approx \\Psi_{i+1,j} + \\Psi_{i-1, j} + \\Psi_{i,j-1} + \\Psi_{i, j+1} - 4\\cdot\\Psi_{i,j} = 0 $$With this approximation and the usage of the Dirchlet boundary condition (borders without sources are set to \\(0\\)) we could solve our problem. For velocity field \\( \\vec{u} \\) computation, we calculate the partial differentiations.\n$$ u\\_x (x,y) = \\frac{\\partial\\Psi}{\\partial y} = \\frac{1}{2} \\left( \\Psi\\_{i,j+1} - \\Psi\\_{i,j-1} \\right)$$$$ u\\_y (x,y) = \\frac{\\partial\\Psi}{\\partial x} = \\frac{1}{2} \\left( \\Psi\\_{i+1,j} - \\Psi\\_{i-1,j} \\right) $$ Implementation # Boundary conditions # 1 2 3 4 5 6 7 8 9 10 11 12 psi = [[0 for col in range(m+2)] for row in range(n+2)] # Set the bondary conditions on bottom edge for i in range(b+1, b+w): psi[0][i] = float(i-b) for i in range(b+w, m+1): psi[0][i] = float(w) # Set the bondary conditions on right edge for j in range(1, h+1): psi[j][m+1] = float(w) for j in range(h+1, h+w): psi[j][m+1] = float(w-j+h) Solver implementation # The implementation supports booth convergence criteria: maximum number of iteration steps and minimum achievable tolerance \\(\\sigma\\). For determining the current tolerance we consider the current and iteration step before. Therefore we calculate the Euclidean distance (magnitude normal) to get the achieved gain between these steps. Was the change less than the given tolerance, we skip further iterations.\n$$ | \\Psi\\_k - \\Psi\\_{k-1}| \\le \\sigma $$ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 def solver ( tol, nMaxIterations, psi, dx, dy ): M = len(psi) - 2 N = len(psi[0]) - 2 tmp = [[0 for col in range(M+2)] for row in range(N+2)] cStep = 0; xs = pow(dx,2) ys = pow(dy,2) while ( cStep \u0026lt; nMaxIterations ): # store old residue res_old = np.linalg.norm(np.array ( psi ) - np.array ( tmp ) ) # differeniation in booth directions for i in range(1, M+1): for j in range(1, N+1): tmp[i][j] = 0.25 * (psi[i+1][j]+psi[i-1][j]+psi[i][j+1]+psi[i][j-1]) cStep += 1 # update residue res_new = np.linalg.norm(np.array ( psi ) - np.array ( tmp ) ) # updating flow for next iteration for i in range(1, M+1): for j in range(1, N+1): psi[i][j] = tmp[i][j] if ( np.linalg.norm( res_new - res_old ) \u0026lt;= tol ): break return cStep Results # Computational fluid dynamics\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nPartial difference equation\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"18. Dezember 2016","externalUrl":null,"permalink":"/blog/cfd-simulation-using-python/","section":"Blogs","summary":"Introduction # For some simulation topics of my Ph.D., I had to learn/recapitulate some basics about simulations techniques and fluid simulations. The original procedure and code could be found at Archer (UK National Supercomputing Service). This is a simple example for applying the finite difference approach to determine the flow pattern (CFD1) in a cavity. For simplicity, we’re assuming a perfect liquid without viscosity, which also implies that there’re no vortices. The \\(z\\)-dimension of this setup was defined to be endless. We are interested in the directional velocity of the fluid.\n","title":"CFD simulations using Scientific Python","type":"blog"},{"content":"To be honest, my last contact with Python was some years ago. It\u0026rsquo;s a pretty cool language, nice packaging system (pip and so on) like CPAN1 or CTAN2. But to be more focused on C/C++, Python and myself are going different ways. Last year I purchased a textbook \u0026ldquo;Python Machine Learning\u0026rdquo; Sebastian Raschka in a fortunate coincidence and as I had read it, I was fascinated by a bundle of new Python libraries like Numpy, SciPy, Mathplotlib and so on.\nFirst contact and results # For data machining, there\u0026rsquo;re lots of tools inside these packages and they are able to compete with such huge software packages like Mathworks MATLAB3. Of course, MATLAB is in most cases the first choice for quick results and spontaneously written scripts. But there are lots of advantages like the platform independence, there existing Open Source licensed packages and it is highly automatable.\nSo in preparation for a presentation, I was tinkering with these Python packages and was able to generate these nice bivariate distributions. They are running on my office system (Windows 7), on my private MacBook and of course on my CI4 server. A win-win-win situation I guess.\nResults # Conclusion # As I mentioned \u0026ldquo;Scientific Python\u0026rdquo; is a great way for data processing and visualization.\nComprehensive Perl Archive Network\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nComprehensive TeX Archive Network\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nMatrix laboratory.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nContinuous Integration\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"5. Dezember 2016","externalUrl":null,"permalink":"/blog/scipy-first-contact/","section":"Blogs","summary":"To be honest, my last contact with Python was some years ago. It’s a pretty cool language, nice packaging system (pip and so on) like CPAN1 or CTAN2. But to be more focused on C/C++, Python and myself are going different ways. Last year I purchased a textbook “Python Machine Learning” Sebastian Raschka in a fortunate coincidence and as I had read it, I was fascinated by a bundle of new Python libraries like Numpy, SciPy, Mathplotlib and so on.\n","title":"Scientific Python - first contact","type":"blog"},{"content":"","date":"22. April 2016","externalUrl":null,"permalink":"/tags/bash/","section":"Tags","summary":"","title":"BASH","type":"tags"},{"content":"Since two weeks my server is reporting some S.M.A.R.T-errors on one of my hard drives. For a quick overview about all drives (serial numbers, mode) and finding the one which has to been replaced, I\u0026rsquo;ve written a small script. The script produces a fancy list of all available drives on your Linux host. It uses hdparm in combination with sed for retrieving the drive information, so both are the only dependencies. With a few changes it could be used directly for generating content as Markdown.\nCode # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/usr/bin/env bash printf \u0026#34;%.0s-\u0026#34; {1..58} printf \u0026#34;\\n\u0026#34; printf \u0026#34;| DEVICE%2s | SERIALNO%12s | MODEL%15s |\\n\u0026#34; printf \u0026#34;%.0s-\u0026#34; {1..58} printf \u0026#34;\\n\u0026#34; for i in $( ls /dev/sd* ); do if [[ $i =~ ^[A-Za-z_//]+$ ]]; then SERNO=$(hdparm -i $i |grep -i SerialNo |cut -d \u0026#39;,\u0026#39; -f 3 | sed \u0026#39;s/^[ ]*[[:alnum:]]*=//\u0026#39;) MODEL=$(hdparm -i $i |grep -i Model |cut -d \u0026#39;,\u0026#39; -f 1 | sed \u0026#39;s/^[ ]*[[:alnum:]]*=//\u0026#39;) printf \u0026#34;| %8s | %20s | %20s |\\n\u0026#34; \u0026#34;$i\u0026#34; \u0026#34;$SERNO\u0026#34; \u0026#34;$MODEL\u0026#34; fi done printf \u0026#34;%.0s-\u0026#34; {1..58} printf \u0026#34;\\n\u0026#34; Output # DEVICE SERIALNO MODEL /dev/sda WD-WMAZA5927357 WDC WD20EURS-63S48Y0 /dev/sdb WD-WCAYY0133809 WDC WD20EARS-00J2GB0 /dev/sdc WD-WCAYY0136723 WDC WD20EARS-00J2GB0 /dev/sdd 000000001221090B8B09 M4-CT128M4SSD2 /dev/sde WD-WCAYY0136514 WDC WD20EARS-00J2GB0 /dev/sdf WD-WCAYY0136732 WDC WD20EARS-00J2GB0 /dev/sdg WD-WCAZAA410704 WDC WD20EARS-00MVWB0 Could by handy for later. \u0026#x1f603;\n","date":"22. April 2016","externalUrl":null,"permalink":"/blog/get-your-drive-info/","section":"Blogs","summary":"Since two weeks my server is reporting some S.M.A.R.T-errors on one of my hard drives. For a quick overview about all drives (serial numbers, mode) and finding the one which has to been replaced, I’ve written a small script. The script produces a fancy list of all available drives on your Linux host. It uses hdparm in combination with sed for retrieving the drive information, so both are the only dependencies. With a few changes it could be used directly for generating content as Markdown.\n","title":"Get your drive info","type":"blog"},{"content":"","date":"22. April 2016","externalUrl":null,"permalink":"/tags/git/","section":"Tags","summary":"","title":"Git","type":"tags"},{"content":"","date":"22. April 2016","externalUrl":null,"permalink":"/tags/gitweb/","section":"Tags","summary":"","title":"Gitweb","type":"tags"},{"content":"","date":"22. April 2016","externalUrl":null,"permalink":"/tags/scripting/","section":"Tags","summary":"","title":"Scripting","type":"tags"},{"content":"Github offers an automatic processing of markdown files (e.g. README.md) for simple and easy repository description and/or documentation. Recently I replaced gitlist with gitweb. A great pity was that gitweb hasn\u0026rsquo;t the ability to process Markdown-Code by it\u0026rsquo;s self.\nAnyway, nice chance to play around with git\u0026rsquo;s hooks and let them do the hard work for us.\nA hook is a trivial BASH-Script which would be executed by git under special circumstances like a new push to a special branch or special content inside the committed source (or what ever you wnat to keep managed).\nSo what must be done to create and activate a git-hook? The answer is very simple and including only three steps:\nIf it isn\u0026rsquo;t available, we\u0026rsquo;ve to install markdown first. On a machine which is based on Debian you could use your packaging-system for this task.\n1 apt-get install markdown Inside the \u0026ldquo;hooks\u0026rdquo;-directory of our bare repository, we only have to create a file named \u0026lsquo;post-receive\u0026rsquo; and make it executable. As content we paste the following two line into the fresh file. The filename is mandatory in this case, because git will proof the existence of specific files and will execute them if possible.\n1 2 #!/bin/sh git cat-file blob HEAD:README.md | markdown \u0026gt; $GIT_DIR/README.html So making it executable should be the easiest part of the job.\n1 chmod +x post-recevie And that\u0026rsquo;s it. You could find a very nice overview of all available hooks here.\n","date":"22. April 2016","externalUrl":null,"permalink":"/blog/githooks-deployment/","section":"Blogs","summary":"Github offers an automatic processing of markdown files (e.g. README.md) for simple and easy repository description and/or documentation. Recently I replaced gitlist with gitweb. A great pity was that gitweb hasn’t the ability to process Markdown-Code by it’s self.\n","title":"Using githooks for generating documentation on gitweb","type":"blog"},{"content":"All available fixes and patches are already included in AVRDude 6.3 (fragmentation support, eeprom crash and so on). Unfortunately homebrew isn\u0026rsquo;t up-to-date and only version 6.2 is available online.\nThe updated one should be something like this:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 class Avrdude \u0026lt; Formula desc \u0026#34;Atmel AVR MCU programmer\u0026#34; homepage \u0026#34;https://savannah.nongnu.org/projects/avrdude/\u0026#34; url \u0026#34;http://download.savannah.gnu.org/releases/avrdude/avrdude-6.3.tar.gz\u0026#34; mirror \u0026#34;http://download-mirror.savannah.gnu.org/releases/avrdude/avrdude-6.3.tar.gz\u0026#34; sha256 \u0026#34;0f9f731b6394ca7795b88359689a7fa1fba818c6e1d962513eb28da670e0a196\u0026#34; bottle do sha256 \u0026#34;b2ac65f070879456e2047ba543a7fafb1d45c98b745b7915b4059ea90c10dfcd\u0026#34; =\u0026gt; :el_capitan sha256 \u0026#34;4c092d851e6ed8ed58ac5a1997606db420ee153289d4289917fad50f8432d5ad\u0026#34; =\u0026gt; :yosemite sha256 \u0026#34;a3b312dde0f3a268d6ccc9085e4a14d8d7703ff1ae09a9257b373976e7cf49ec\u0026#34; =\u0026gt; :mavericks end head do url \u0026#34;svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude/\u0026#34; depends_on \u0026#34;autoconf\u0026#34; =\u0026gt; :build depends_on \u0026#34;automake\u0026#34; =\u0026gt; :build depends_on \u0026#34;libtool\u0026#34; =\u0026gt; :build end depends_on :macos =\u0026gt; :snow_leopard # needs GCD/libdispatch depends_on \u0026#34;libusb-compat\u0026#34; depends_on \u0026#34;libftdi0\u0026#34; depends_on \u0026#34;libelf\u0026#34; depends_on \u0026#34;libhid\u0026#34; =\u0026gt; :optional def install if build.head? inreplace \u0026#34;bootstrap\u0026#34;, /libtoolize/, \u0026#34;glibtoolize\u0026#34; system \u0026#34;./bootstrap\u0026#34; end system \u0026#34;./configure\u0026#34;, \u0026#34;--disable-dependency-tracking\u0026#34;, \u0026#34;--prefix=#{prefix}\u0026#34; system \u0026#34;make\u0026#34; system \u0026#34;make\u0026#34;, \u0026#34;install\u0026#34; end test do assert_equal \u0026#34;avrdude done. Thank you.\u0026#34;, shell_output(\u0026#34;#{bin}/avrdude -c jtag2 -p x16a4 2\u0026gt;\u0026amp;1\u0026#34;, 1).strip end end Until now, everything works fine for me.\n","date":"16. März 2016","externalUrl":null,"permalink":"/blog/atmelice-and-os-x-3/","section":"Blogs","summary":"All available fixes and patches are already included in AVRDude 6.3 (fragmentation support, eeprom crash and so on). Unfortunately homebrew isn’t up-to-date and only version 6.2 is available online.\nThe updated one should be something like this:\n","title":"Atmel ICE and macOS - AVRDude mit homebrew (2)","type":"blog"},{"content":"","date":"23. Oktober 2015","externalUrl":null,"permalink":"/tags/owncloud/","section":"Tags","summary":"","title":"Owncloud","type":"tags"},{"content":"Scheinbar gibt es wieder einige Probleme beim Upgraden von Owncloud. Leider kann ich nicht explizit sagen wie lange diese schon bestehen, oder ob die Lösung dazu schon ausreichend dokumentiert wurde. Anyway. Scheinbar vergisst der Updater von Owncloud das von curl benötigte Zertifikat zu kopieren und eine misslungener Verbindungsaufbau ist die Folge. Als Abhilfe begibt man sich in das config-Verzeichnis von Owncloud und versorgt sich händisch damit.\n1 2 cd ...../config wget https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt Danach sollte dieses Problem aus der Welt sein.\n","date":"23. Oktober 2015","externalUrl":null,"permalink":"/blog/owncloud-keine-internetverbindung/","section":"Blogs","summary":"Scheinbar gibt es wieder einige Probleme beim Upgraden von Owncloud. Leider kann ich nicht explizit sagen wie lange diese schon bestehen, oder ob die Lösung dazu schon ausreichend dokumentiert wurde. Anyway. Scheinbar vergisst der Updater von Owncloud das von curl benötigte Zertifikat zu kopieren und eine misslungener Verbindungsaufbau ist die Folge. Als Abhilfe begibt man sich in das config-Verzeichnis von Owncloud und versorgt sich händisch damit.\n","title":"Owncloud - Keine Internetverbindung","type":"blog"},{"content":"Eigentlich passt der Titel nicht ganz, denn es betrifft eigentlich alle Plattformen also auch Linux und Windows (sollte man avrdude anstelle von Atmet Studio verwenden). Wie ich ja hier beschrieben habe, war die erste Nutzung des neuen Atmel ICE anfänglich mehr als einfach. Weiterhin ist avrdude in der Release-Version noch nicht soweit, dass alle Programmierschnittstellen funktionieren. Dazu müssen zwei Patches eingepflegt werden.Dazu habe ich die Homebrew Formula angepasst:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 class Avrdude \u0026lt; Formula desc \u0026#34;Atmel AVR MCU programmer\u0026#34; homepage \u0026#34;https://savannah.nongnu.org/projects/avrdude/\u0026#34; url \u0026#34;http://download.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz\u0026#34; mirror \u0026#34;http://download-mirror.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz\u0026#34; sha256 \u0026#34;9e98baca8e57cad402aaa1c7b61c8de750ed4f6fed577f7e4935db0430783d3b\u0026#34; bottle do sha1 \u0026#34;2d759fea880b097754defe8016e026390dbcfb31\u0026#34; =\u0026gt; :mavericks sha1 \u0026#34;83017c7fb34b0a2da5919b6b1dde9c05bf237f2a\u0026#34; =\u0026gt; :mountain_lion sha1 \u0026#34;438562a4b84b4e868cdf01b81e7543053a89a7ff\u0026#34; =\u0026gt; :lion end head do url \u0026#34;svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude/\u0026#34; depends_on \u0026#34;autoconf\u0026#34; =\u0026gt; :build depends_on \u0026#34;automake\u0026#34; =\u0026gt; :build depends_on \u0026#34;libtool\u0026#34; =\u0026gt; :build end patch :p2 do url \u0026#34;http://savannah.nongnu.org/file/stdint-fix.patch?file_id=31187\u0026#34; sha256 \u0026#34;709b82cacdf2bcb6b638dd855e57a176705a3c816d6d7b866bae9370b4511843\u0026#34; end patch :p3 do url \u0026#34;http://www.avrfreaks.net/sites/default/files/forum_attachments/avrice_fragment_fix2.patch\u0026#34; sha256 \u0026#34;e4cd8db7802c76b61fb953c055bdde066bd7e9f34ac0f7808fd29e909f57ee8a\u0026#34; end depends_on :macos =\u0026gt; :snow_leopard # needs GCD/libdispatch depends_on \u0026#34;libusb-compat\u0026#34; depends_on \u0026#34;libftdi0\u0026#34; depends_on \u0026#34;libelf\u0026#34; depends_on \u0026#34;libhid\u0026#34; =\u0026gt; :optional def install if build.head? inreplace \u0026#34;bootstrap\u0026#34;, /libtoolize/, \u0026#34;glibtoolize\u0026#34; system \u0026#34;./bootstrap\u0026#34; end system \u0026#34;./configure\u0026#34;, \u0026#34;--disable-dependency-tracking\u0026#34;, \u0026#34;--prefix=#{prefix}\u0026#34; system \u0026#34;make\u0026#34; system \u0026#34;make\u0026#34;, \u0026#34;install\u0026#34; end end Damit funktionierte (bisher) avrdude unter El Capitan ohne weitere Einschränkungen. Ich werde das Ganze natürlich weiter beobachten.\n","date":"16. Oktober 2015","externalUrl":null,"permalink":"/blog/atmelice-and-os-x-2/","section":"Blogs","summary":"Eigentlich passt der Titel nicht ganz, denn es betrifft eigentlich alle Plattformen also auch Linux und Windows (sollte man avrdude anstelle von Atmet Studio verwenden). Wie ich ja hier beschrieben habe, war die erste Nutzung des neuen Atmel ICE anfänglich mehr als einfach. Weiterhin ist avrdude in der Release-Version noch nicht soweit, dass alle Programmierschnittstellen funktionieren. Dazu müssen zwei Patches eingepflegt werden.Dazu habe ich die Homebrew Formula angepasst:\n","title":"Atmel ICE unter macOS - AVRDude mit homebrew","type":"blog"},{"content":"\nSo der erste OS X relevante Post auf der Seite. Kurze Vorgeschichte zu dem Thema: Ich habe mich von einigen Tools bzgl. meiner Bastelsachen getrennt und – natürlich – auch wieder neues Spielzeug besorgt. Darunter einen neuen Programmieradapter, den ATMEL ICE. Grund war eigentlich nur der Support für die SAMs und natürlich das er im Vergleich zum Dragon alles bis auf HVPP bietet und (wahlweise) in einem Gehäuse geliefert wird.\nATMEL ICE programmer Kommen wir nun zum eigentlichen Anlass des Beitrags. Er wollte unter OS X nicht funktionieren. AVRDude bekam einfach keinen Zugriff auf das USB-Device, da es von OS X gesperrt wurde. Ähnliches kann man hier nachlesen. Es notwendig eine Kernel Extension (kext-File) zu laden um dem Problem Herr zu werden.\nBesagtes kext-File gibt es im Forum bei avrfreaks.net inklusive der Anleitung was zu tun ist.\n1 2 3 4 5 6 7 tar -xf AtmelICE.kext.tar.bz2 sudo cp -R AtmelICE.kext /System/Library/Extensions # change permissions and ownership: sudo chown -R root:wheel /System/Library/Extensions/AtmelICE.kext sudo chmod -R 755 /System/Library/Extensions/AtmelICE.kext # reload the kext cache: sudo kextcache -system-caches Gerät abziehen und neu anschließen und es funktionierte auf Anhieb.\n1 2 3 4 5 [~/Downloads]$ avrdude -c atmelice -p x128a1 -P usb avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.01s avrdude: Device signature = 0x1e974c avrdude done. Thank you. ","date":"21. August 2015","externalUrl":null,"permalink":"/blog/atmelice-and-os-x-1/","section":"Blogs","summary":"\nSo der erste OS X relevante Post auf der Seite. Kurze Vorgeschichte zu dem Thema: Ich habe mich von einigen Tools bzgl. meiner Bastelsachen getrennt und – natürlich – auch wieder neues Spielzeug besorgt. Darunter einen neuen Programmieradapter, den ATMEL ICE. Grund war eigentlich nur der Support für die SAMs und natürlich das er im Vergleich zum Dragon alles bis auf HVPP bietet und (wahlweise) in einem Gehäuse geliefert wird.\n","title":"Atmel ICE unter macOS - kext","type":"blog"},{"content":"","date":"23. Juni 2015","externalUrl":null,"permalink":"/tags/openssl/","section":"Tags","summary":"","title":"OpenSSL","type":"tags"},{"content":"Manchmal setzt man eine Passphrase für SSL-Zrtifikate und muss dann feststellen, dass man sich entweder gar nicht oder nur sehr schwer an das vergebene Passwort erinnern kann. Gleichzeitig ist es natürlich ungemein sinnvoll, einen essentiellen und automatisch startenden Dienst durch eine Passworteingabe am Starten zu hindern.\nNaja lange Rede, kurze Hilfestellung. Mit folgendem Befehl lässt sich das Zertifikat von der Passphrase befreien und gut ists.\n1 openssl rsa -in fqdn.key.back -out fqdn.key ","date":"23. Juni 2015","externalUrl":null,"permalink":"/blog/openssl-passphrase-aus-private-key-entfernen/","section":"Blogs","summary":"Manchmal setzt man eine Passphrase für SSL-Zrtifikate und muss dann feststellen, dass man sich entweder gar nicht oder nur sehr schwer an das vergebene Passwort erinnern kann. Gleichzeitig ist es natürlich ungemein sinnvoll, einen essentiellen und automatisch startenden Dienst durch eine Passworteingabe am Starten zu hindern.\n","title":"OpenSSL Passphrase aus Private key entfernen","type":"blog"},{"content":"","date":"22. Juni 2015","externalUrl":null,"permalink":"/tags/windows/","section":"Tags","summary":"","title":"Windows","type":"tags"},{"content":"Im Folgenden möchte ich einige Probleme bzw. Herausforderungen beschreiben, die bei der Nutzung von Windows 7 ohne administrative Rechte auftreten und wie man sie beheben könnte. Im Wesentlichen dient der Artikel eigentlich nur als Notizblock, damit ich mir das Ganze nicht merken muss und hier auch mal wieder ein Beitrag verfasst wird.\nUmgebungsvariablen setzen # Ich brauche des Öfteren einige Umgebungsvariablen (Qt, OpenCV etc.) um nicht jedesmal den Pfad für die entsprechenden Bibliotheken angeben zu müssen. Die erweiterten Systemeinstellungen benötigen jedoch ein entsprechendes Administratorkonto. Um die spezifischen, den Benutzer betreffenden Variablen zu setzen, reicht es jedoch folgenden Befehl auszuführen.\n1 rundll32 sysdm.cpl,EditEnvironmentVariables Interessanterweise darf man dann seine eigenen Umgebungsvariablen selbst erstellen, verwalten etc.. Also genau das was man über den „Maus/Klick“-Weg nicht durfte.\n","date":"22. Juni 2015","externalUrl":null,"permalink":"/blog/windows-7-ohne-adminrechte-umgebungsvariablen/","section":"Blogs","summary":"Im Folgenden möchte ich einige Probleme bzw. Herausforderungen beschreiben, die bei der Nutzung von Windows 7 ohne administrative Rechte auftreten und wie man sie beheben könnte. Im Wesentlichen dient der Artikel eigentlich nur als Notizblock, damit ich mir das Ganze nicht merken muss und hier auch mal wieder ein Beitrag verfasst wird.\n","title":"Windows 7 ohne Adminrechte - Umgebungsvariablen","type":"blog"},{"content":"","date":"21. Juni 2015","externalUrl":null,"permalink":"/tags/3d-printer/","section":"Tags","summary":"","title":"3D Printer","type":"tags"},{"content":"Nachdem die Blumenkästen auf dem Balkon neu gefüllt waren, fiel uns auf das zwei Kunststoffkappen für die Blumenkästen abtrünnig sind. Eigentlich ideal um sich mal etwas mit FreeCad zu beschäftigen und sich die Teile aus dem 3D-Drucker zu holen. Idealerweise sind beide Kappen, bis auf eine Bohrung für die Füllstandsanzeige, identisch. So muss dort nicht allzuviel Aufwand getrieben werden. Netterweise kann man bei WordPress auch 3D-Modelle einbinden um diese anzeigen zu können. (Schon recht lustig, was man mit zwei Klicks so schaffen kann.)\n3D Modell der Verschlusskappe Ansonsten war der Dreh recht schnell raus und nachdem die Grundform in FreeCAD erstellt wurde, hatte man mehr oder weniger die Bedienung verstanden. Das Einzigste was mir bisher noch fehlt ist die Erstellung simpler Bilder. Aber gut, das Manko macht die angesprochene 3D-Ansicht wett. Anbei die beiden Modelle (ohne Bohrung und mit Bohrung ) als Download. Die Dateien wurden bisher noch nicht gedruckt, daher gibt es auch keine Gewähr ob die Teile wirklich passen. Ich hoffe ich kann die Teile – zum Testen vom 3D-Drucker natürlich – morgen drucken und dann Feedback geben ob sie nun wirklich passen oder nicht. Btw. ist mir aufgefallen, dass es mit neuen Blogbeiträgen wie mit dem Vorhaben „Kellerausmisten“ ist. Man will es zwar machen, aber sich wirklich die Zeit dafür zu nehmen ist schon eine andere Hausnummer.\n","date":"21. Juni 2015","externalUrl":null,"permalink":"/blog/ersatzteile-durch-den-3d-drucker/","section":"Blogs","summary":"Nachdem die Blumenkästen auf dem Balkon neu gefüllt waren, fiel uns auf das zwei Kunststoffkappen für die Blumenkästen abtrünnig sind. Eigentlich ideal um sich mal etwas mit FreeCad zu beschäftigen und sich die Teile aus dem 3D-Drucker zu holen. Idealerweise sind beide Kappen, bis auf eine Bohrung für die Füllstandsanzeige, identisch. So muss dort nicht allzuviel Aufwand getrieben werden. Netterweise kann man bei WordPress auch 3D-Modelle einbinden um diese anzeigen zu können. (Schon recht lustig, was man mit zwei Klicks so schaffen kann.)\n","title":"Ersatzteile durch den 3D-Drucker","type":"blog"},{"content":"","date":"21. Juni 2015","externalUrl":null,"permalink":"/tags/freecad/","section":"Tags","summary":"","title":"FreeCAD","type":"tags"},{"content":"","date":"29. Dezember 2014","externalUrl":null,"permalink":"/tags/arch-linux/","section":"Tags","summary":"","title":"Arch Linux","type":"tags"},{"content":"Nach dem Upgrade von pacman könnte die folgende Fehlermeldung erscheinen:\n1 2 Fehler: Konnte alpm-Bibliothek nicht initialisieren (Konnte Verzeichniss \\ nicht finden oder lesen) Schnelle Abhilfe schafft ein kurzes:\n1 pacman-db-upgrade Einen guten Rutsch.\n","date":"29. Dezember 2014","externalUrl":null,"permalink":"/blog/arch-linux-pacman-und-libapm/","section":"Blogs","summary":"Nach dem Upgrade von pacman könnte die folgende Fehlermeldung erscheinen:\n1 2 Fehler: Konnte alpm-Bibliothek nicht initialisieren (Konnte Verzeichniss \\ nicht finden oder lesen) Schnelle Abhilfe schafft ein kurzes:\n1 pacman-db-upgrade Einen guten Rutsch.\n","title":"Arch Linux - pacman und libapm","type":"blog"},{"content":"","date":"29. Dezember 2014","externalUrl":null,"permalink":"/tags/pacman/","section":"Tags","summary":"","title":"Pacman","type":"tags"},{"content":"Wie sicherlich jeder mitbekommen haben wird, ist mittlerweile schon die dritte Version des Raspberry Pis erschienen und man hat mittlerweile auch dort die Möglichkeit sich eine Distribution seiner Wahl zu installieren. Zwar ist die Wahl noch nicht so groß wie man es (verwöhnterweise) vom Desktop gewohnt ist. Jedoch die (für mich) wichtigsten Distributionen sind vertreten.\nArch Linux auf einem Raspberry Pi Dazu gehören das teils ausgelieferte Rasbian basierend auf Debian und einer, zur ARM Plattform kompatiblen, Version von Arch Linux. Vorteil ist hier natürlich, dass man durch die Wahl gleicher Systeme sich Zeit bzgl. Umgewöhnung und einarbeitung spart, da man in der Regel sein Desktop-System am Besten kennt. Die Installation von ALARM (Arch Linux ARM) geht dabei eigentlich recht zügig und ist wie so Vieles andere auch ausführlich beschrieben.\nPartitionierung # Zunächst wird, wie am Desktop auch, die SD-Karte entsprechend partitioniert und formatiert. Dazu wird das Blockdevice der Speicherkarte mittels fdisk geöffnet, dabei sollte jedoch das richtige Gerät ausgewählt werden. Nicht das man sich die Partitionierung der eigenen Festplatte zerlegt.\n1 fdisk /dev/mmcblk0 Da der Bootloader (UBoot) Raspberry Pi einen Bootbereich auf der SD-Karte erwartet, müssen wir zwei Partitionen anlegen. Eine, mit 100 MB, etwas kleineren Bootbereich den UBoot lesen kann und eine entsprechende Linux Root-Partition.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 # Löschen der vorhandenen Partitionen o # Anlegen einer neuen Partition n # primär p # 1 für die erste Partition 1 # Enter für den ersten Sektor als Startsektor # Für den letzten Sektor einen Offset von 100 MB angeben +100M # Partitionstyp auf FAT32 mit LBA setzen t c # Anlegen einer neuen zweiten Partition n # primär p # 2 für die zweite Partition 2 # zweimal Enter drücken um den restlichen Speicher auszuwählen # Änderungen speichern und auf das Blockdevice schreiben w Formatierung # Formatiert wird wie unter Linux gewohnt mit den mkfs-Kommandos.\n1 2 mkfs.vfat /dev/mmcblk0p1 mkfs.ext4 /dev/mmcblk0p2 Einbinden und Installation von ALARM # Um die SD-Karte einzubinden, brauchen wir natürlich entsprechende mountpoints. Diese erstelle ich meinst unter /mnt und hänge die Partitionen mit mount auf die erstellten mountpoints.\n1 2 3 4 5 mkdir -p /mnt/boot mkdir -p /mnt/root mount /dev/mmcblk0p1 /mnt/boot mount /dev/mmcblk0p2 /mnt/root cd /mnt Anschließend holen wir uns das aktuelle ALARM-Image von der Projektseite und entpacken es direkt.\n1 2 3 4 wget http//archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz tar xpf ArchLinuxARM-rpi-latest.tar.gz -C root sync mv root/boot/* boot Nun noch die Paritionen aushängen und wir sind fertig.\n1 umount /mnt/root /mnt/boot Speicherkarte aus dem Kartenleser entnehmen und ins Raspberry Pi stecken und booten lassen. Nach ein paar Sekunden sollte man sich via SSH als root mit dem Passwort root einloggen können. Der Standard-Host ist dabei dann alarmpi. Damit sollte die Installation von ALARM abgeschlossen sein und funktionieren.\n","date":"21. September 2014","externalUrl":null,"permalink":"/blog/arch-linux-auf-dem-raspberry-pi/","section":"Blogs","summary":"Wie sicherlich jeder mitbekommen haben wird, ist mittlerweile schon die dritte Version des Raspberry Pis erschienen und man hat mittlerweile auch dort die Möglichkeit sich eine Distribution seiner Wahl zu installieren. Zwar ist die Wahl noch nicht so groß wie man es (verwöhnterweise) vom Desktop gewohnt ist. Jedoch die (für mich) wichtigsten Distributionen sind vertreten.\n","title":"Arch Linux - Auf dem Raspberry Pi","type":"blog"},{"content":"","date":"21. September 2014","externalUrl":null,"permalink":"/series/archlinux/","section":"Series","summary":"","title":"Archlinux","type":"series"},{"content":"","date":"21. September 2014","externalUrl":null,"permalink":"/tags/raspberry-pi/","section":"Tags","summary":"","title":"Raspberry Pi","type":"tags"},{"content":"Nach dem wir nun wissen wie wir Pakete erzeugen und ausliefern können, kommt unweigerlich der nächste Schritt, die Signierung der Pakete und des Repositoriums. Dabei wurde die Signierung mit Version 4 von pacman eingeführt und die offiziellen Paketquellen, sowie die Pakete, sind alle signiert.\nZunächst, was brauchen wir?\nPakete Pfad wo das Repository eingebunden ist GPG-Schlüssel Die ersten beiden Punkte sind dabei ja schon vorab geklärt worden. Die Erzeugung eines GPG-Schlüsselpaars kann nach dieser Anleitung durchgeführt werden.\nNotwendige Änderungen bzgl. GPG # Zunächst muss das Build-System für die Signierung konfiguriert werden. Dazu sind einige kleinere Änderungen in der Datei /etc/makepkg.conf notwendig. Dazu wird die Signierung durch das Entfernen des Ausrufzeichens vor dem Wort sign in Zeile 56 aktiviert.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 # # /etc/makepkg.conf # ######################################################################### # SOURCE ACQUISITION ######################################################################### # #-- The download utilities that makepkg should use to acquire sources # Format: \u0026#39;protocol::agent\u0026#39; DLAGENTS=(\u0026#39;ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u\u0026#39; \u0026#39;http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u\u0026#39; \u0026#39;https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u\u0026#39; \u0026#39;rsync::/usr/bin/rsync --no-motd -z %u %o\u0026#39; \u0026#39;scp::/usr/bin/scp -C %u %o\u0026#39;) # Other common tools: # /usr/bin/snarf # /usr/bin/lftpget -c # /usr/bin/wget ######################################################################### # ARCHITECTURE, COMPILE FLAGS ######################################################################### # CARCH=\u0026#34;x86_64\u0026#34; CHOST=\u0026#34;x86_64-unknown-linux-gnu\u0026#34; #-- Compiler and Linker Flags # -march (or -mcpu) builds exclusively for an architecture # -mtune optimizes for an architecture, but builds for whole processor family CPPFLAGS=\u0026#34;-D_FORTIFY_SOURCE=2\u0026#34; CFLAGS=\u0026#34;-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4\u0026#34; CXXFLAGS=\u0026#34;-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4\u0026#34; LDFLAGS=\u0026#34;-Wl,-O1,--sort-common,--as-needed,-z,relro\u0026#34; #-- Make Flags: change this for DistCC/SMP systems #MAKEFLAGS=\u0026#34;-j2\u0026#34; #-- Debugging flags DEBUG_CFLAGS=\u0026#34;-g -fvar-tracking-assignments\u0026#34; DEBUG_CXXFLAGS=\u0026#34;-g -fvar-tracking-assignments\u0026#34; ######################################################################### # BUILD ENVIRONMENT ######################################################################### # # Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign) # A negated environment option will do the opposite of the comments below. # #-- fakeroot: Allow building packages as a non-root user #-- distcc: Use the Distributed C/C++/ObjC compiler #-- color: Colorize output messages #-- ccache: Use ccache to cache compilation #-- check: Run the check() function if present in the PKGBUILD #-- sign: Generate PGP signature file # BUILDENV=(fakeroot !distcc color !ccache check sign) # #-- If using DistCC, your MAKEFLAGS will also need modification. In addition, #-- specify a space-delimited list of hosts running in the DistCC cluster. #DISTCC_HOSTS=\u0026#34;\u0026#34; # #-- Specify a directory for package building. #BUILDDIR=/tmp/makepkg ######################################################################### # GLOBAL PACKAGE OPTIONS # These are default values for the options=() settings ######################################################################### # # Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug) # A negated option will do the opposite of the comments below. # #-- strip: Strip symbols from binaries/libraries #-- docs: Save doc directories specified by DOC_DIRS #-- libtool: Leave libtool (.la) files in packages #-- staticlibs: Leave static library (.a) files in packages #-- emptydirs: Leave empty directories in packages #-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip #-- purge: Remove files specified by PURGE_TARGETS #-- upx: Compress binary executable files using UPX #-- debug: Add debugging flags as specified in DEBUG_* variables # OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug) #-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512 INTEGRITY_CHECK=(md5) #-- Options to be used when stripping binaries. See `man strip\u0026#39; for details. STRIP_BINARIES=\u0026#34;--strip-all\u0026#34; #-- Options to be used when stripping shared libraries. See `man strip\u0026#39; for details. STRIP_SHARED=\u0026#34;--strip-unneeded\u0026#34; #-- Options to be used when stripping static libraries. See `man strip\u0026#39; for details. STRIP_STATIC=\u0026#34;--strip-debug\u0026#34; #-- Manual (man and info) directories to compress (if zipman is specified) MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info}) #-- Doc directories to remove (if !docs is specified) DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) #-- Files to be removed from all packages (if purge is specified) PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod) ######################################################################### # PACKAGE OUTPUT ######################################################################### # # Default: put built package and cached source in build directory # #-- Destination: specify a fixed directory where all packages will be placed #PKGDEST=/home/packages #-- Source cache: specify a fixed directory where source files will be cached #SRCDEST=/home/sources #-- Source packages: specify a fixed directory where all src packages will be placed #SRCPKGDEST=/home/srcpackages #-- Packager: name/email of the person or organization building packages PACKAGER=\u0026#34;Daniel Kotschate \u0026amp;lt;daniel@epyx-online.de\u0026amp;gt;\u0026#34; #-- Specify a key to use for package signing GPGKEY=\u0026#34;866FE6E2\u0026#34; ######################################################################### # COMPRESSION DEFAULTS ######################################################################### # COMPRESSGZ=(gzip -c -f -n) COMPRESSBZ2=(bzip2 -c -f) COMPRESSXZ=(xz -c -z -) COMPRESSLRZ=(lrzip -q) COMPRESSLZO=(lzop -q) COMPRESSZ=(compress -c -f) ######################################################################### # EXTENSION DEFAULTS ######################################################################### # # WARNING: Do NOT modify these variables unless you know what you are # doing. # PKGEXT=\u0026#39;.pkg.tar.xz\u0026#39; SRCEXT=\u0026#39;.src.tar.gz\u0026#39; # vim: set ft=sh ts=2 sw=2 et:\u0026lt;/pre\u0026gt; Weiterhin sollten wir die dafür vorgesehenen Daten für den Paket-Maintainer (Betreuer) abändern und die ID unseres GPG-Schlüssels eintragen. Dies erfolg in den Zeilen 112 bis 116 und ist denke ich selbst erklärend. \u0026lt;pre class=\u0026#34;lang:default mark:113,115 range:112-116 decode:true \u0026#34;\u0026gt;# # /etc/makepkg.conf # ######################################################################### # SOURCE ACQUISITION ######################################################################### # #-- The download utilities that makepkg should use to acquire sources # Format: \u0026#39;protocol::agent\u0026#39; DLAGENTS=(\u0026#39;ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u\u0026#39; \u0026#39;http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u\u0026#39; \u0026#39;https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u\u0026#39; \u0026#39;rsync::/usr/bin/rsync --no-motd -z %u %o\u0026#39; \u0026#39;scp::/usr/bin/scp -C %u %o\u0026#39;) # Other common tools: # /usr/bin/snarf # /usr/bin/lftpget -c # /usr/bin/wget ######################################################################### # ARCHITECTURE, COMPILE FLAGS ######################################################################### # CARCH=\u0026#34;x86_64\u0026#34; CHOST=\u0026#34;x86_64-unknown-linux-gnu\u0026#34; #-- Compiler and Linker Flags # -march (or -mcpu) builds exclusively for an architecture # -mtune optimizes for an architecture, but builds for whole processor family CPPFLAGS=\u0026#34;-D_FORTIFY_SOURCE=2\u0026#34; CFLAGS=\u0026#34;-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4\u0026#34; CXXFLAGS=\u0026#34;-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4\u0026#34; LDFLAGS=\u0026#34;-Wl,-O1,--sort-common,--as-needed,-z,relro\u0026#34; #-- Make Flags: change this for DistCC/SMP systems #MAKEFLAGS=\u0026#34;-j2\u0026#34; #-- Debugging flags DEBUG_CFLAGS=\u0026#34;-g -fvar-tracking-assignments\u0026#34; DEBUG_CXXFLAGS=\u0026#34;-g -fvar-tracking-assignments\u0026#34; ######################################################################### # BUILD ENVIRONMENT ######################################################################### # # Defaults: BUILDENV=(fakeroot !distcc color !ccache check !sign) # A negated environment option will do the opposite of the comments below. # #-- fakeroot: Allow building packages as a non-root user #-- distcc: Use the Distributed C/C++/ObjC compiler #-- color: Colorize output messages #-- ccache: Use ccache to cache compilation #-- check: Run the check() function if present in the PKGBUILD #-- sign: Generate PGP signature file # BUILDENV=(fakeroot !distcc color !ccache check sign) # #-- If using DistCC, your MAKEFLAGS will also need modification. In addition, #-- specify a space-delimited list of hosts running in the DistCC cluster. #DISTCC_HOSTS=\u0026#34;\u0026#34; # #-- Specify a directory for package building. #BUILDDIR=/tmp/makepkg ######################################################################### # GLOBAL PACKAGE OPTIONS # These are default values for the options=() settings ######################################################################### # # Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug) # A negated option will do the opposite of the comments below. # #-- strip: Strip symbols from binaries/libraries #-- docs: Save doc directories specified by DOC_DIRS #-- libtool: Leave libtool (.la) files in packages #-- staticlibs: Leave static library (.a) files in packages #-- emptydirs: Leave empty directories in packages #-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip #-- purge: Remove files specified by PURGE_TARGETS #-- upx: Compress binary executable files using UPX #-- debug: Add debugging flags as specified in DEBUG_* variables # OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !upx !debug) #-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512 INTEGRITY_CHECK=(md5) #-- Options to be used when stripping binaries. See `man strip\u0026#39; for details. STRIP_BINARIES=\u0026#34;--strip-all\u0026#34; #-- Options to be used when stripping shared libraries. See `man strip\u0026#39; for details. STRIP_SHARED=\u0026#34;--strip-unneeded\u0026#34; #-- Options to be used when stripping static libraries. See `man strip\u0026#39; for details. STRIP_STATIC=\u0026#34;--strip-debug\u0026#34; #-- Manual (man and info) directories to compress (if zipman is specified) MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info}) #-- Doc directories to remove (if !docs is specified) DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) #-- Files to be removed from all packages (if purge is specified) PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod) ######################################################################### # PACKAGE OUTPUT ######################################################################### # # Default: put built package and cached source in build directory # #-- Destination: specify a fixed directory where all packages will be placed #PKGDEST=/home/packages #-- Source cache: specify a fixed directory where source files will be cached #SRCDEST=/home/sources #-- Source packages: specify a fixed directory where all src packages will be placed #SRCPKGDEST=/home/srcpackages #-- Packager: name/email of the person or organization building packages PACKAGER=\u0026#34;Daniel Kotschate \u0026amp;lt;daniel@epyx-online.de\u0026amp;gt;\u0026#34; #-- Specify a key to use for package signing GPGKEY=\u0026#34;866FE6E2\u0026#34; ######################################################################### # COMPRESSION DEFAULTS ######################################################################### # COMPRESSGZ=(gzip -c -f -n) COMPRESSBZ2=(bzip2 -c -f) COMPRESSXZ=(xz -c -z -) COMPRESSLRZ=(lrzip -q) COMPRESSLZO=(lzop -q) COMPRESSZ=(compress -c -f) ######################################################################### # EXTENSION DEFAULTS ######################################################################### # # WARNING: Do NOT modify these variables unless you know what you are # doing. # PKGEXT=\u0026#39;.pkg.tar.xz\u0026#39; SRCEXT=\u0026#39;.src.tar.gz\u0026#39; # vim: set ft=sh ts=2 sw=2 et: Die beschriebenen Änderungen führen dazu, dass ihr eure Passphrase (für den GPG-Key) eingeben müsst, sobald ein neues Paket währende der Erstellung signiert wird. Wenn man möchte, kann man seinen öffentlichen Schlüssel auch sofort manuell der eigenen Paketverwaltung hinzufügen. Jedoch wird bei der Aktualisierung der Paketlisten auch der Schlüssel in die Keyring eingetragen.\nSignierung vom Repository # Die Pakete sind nun signiert, fehlt nur noch die Paketdatenbank. Dazu muss die bekannte Vorgehensweise nur minimal geändert werden und zu dem Aufruf von repo-add nur der Schalter -s hinzugefügt werden. Auch hier gilt, wie für die Paketerstellung, dass die Signierung eure Passphrase erfordert.\n","date":"19. September 2014","externalUrl":null,"permalink":"/blog/arch-linux-signierung-von-paketen/","section":"Blogs","summary":"Nach dem wir nun wissen wie wir Pakete erzeugen und ausliefern können, kommt unweigerlich der nächste Schritt, die Signierung der Pakete und des Repositoriums. Dabei wurde die Signierung mit Version 4 von pacman eingeführt und die offiziellen Paketquellen, sowie die Pakete, sind alle signiert.\n","title":"Arch Linux - Signierung von Paketen","type":"blog"},{"content":"Der klassische (und wohl auch gängiste) Weg sich über Ereignisse wie gescheiterte Backups, mögliche Virenfunde oder Sonstiges informieren zu lassen ist sicherlich die gute E-Mail. Allerdings setzt dies natürlich auch einen funktionierenden und vor allem richtig konfigurierten Mail-Server voraus. Gerade der letzte Punkt ist meiner Meinung nach sehr kritisch, da ein falsch eingerichteter SMTP-Server schnell zur Spam-Schleuder mutiert oder aber man will erst gar keinen auf seiner Workstation installieren.\nDaher habe ich mich mal etwas umgeschaut und dachte mir, dass es im Zeitalter der Smartphones und Instant Messenger (Whats-App, Threema und Co sind ja auch nichts Anderes) eine andere Möglichkeit geben müsste.\nBild von Kamil Porembiński - SMS Monitoring Jabber als Alternative? # Als mögliche Alternative sah ich Jabber. Mittlerweile wird Jabber/XMPP mit Cisco in Verbindung gebracht, was auch ok ist, da sie es ja für ihre kommerziellen Produkte als Know-How eingekauft haben. Allerdings wird das Protokoll durch die XMPP Standards Foundation betreut. Wichtigster Punkt ist natürlich, dass es frei ist und es ein recht großes Portfolio an Bibliotheken (in verschiedenen Programmier-/Skriptsprachen) geben sollte. Das ist bei XMPP gegeben. So gibt es Bibliotheken für Hochsprachen wie C/C++ aber auch Module für Python und Perl.\nAnwendungsfälle für Jabber # Wie oben genannt, lassen sich die Anwendungsszenarios beliebig wählen. Ich persönlich nutze es für meine privaten Backups mit rsnapshot. Sofern der Backupbefehl eine Ausgabe auf stderr zurückgibt, werde ich per Jabber benachrichtigt und kann dem Fehler auf die Spur gehen. Dabei nutze ich das folgende Python-Skript, welches ich einfach in meine Anacron-Tasks eingepflegt habe.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #!/usr/bin/python2 import sys import xmpp import ConfigParser if ( len (sys.argv) \u0026lt; 3 ): print (\u0026#34;usage: sendxmpp.py resource text\\n\u0026#34;) print (\u0026#34; resource: jabber resource\u0026#34;) print (\u0026#34; text: message to send\\n\u0026#34;) else: snd = sys.argv[1] msg = sys.argv[2] config = ConfigParser.ConfigParser() # read ini file to ConfigParser data = config.read ( \u0026#39;statxmpp.ini\u0026#39; ) if ( len(data) == 0): print (\u0026#34;could not read \u0026gt;\u0026gt;statxmpp.ini\u0026lt;\u0026lt;\u0026#34; ) else: # get values login = config.get( \u0026#39;Connection\u0026#39;, \u0026#39;user\u0026#39; ) pwd = config.get( \u0026#39;Connection\u0026#39;, \u0026#39;password\u0026#39; ) srv = config.get( \u0026#39;Connection\u0026#39;, \u0026#39;server\u0026#39; ) recv = config.get( \u0026#39;Connection\u0026#39;, \u0026#39;destination\u0026#39; ) cnx = xmpp.Client( srv, debug=[] ) cnx.connect( server=( srv ,5222) ) cnx.auth(login, pwd, snd ) cnx.send( xmpp.Message( recv , msg ) ) Das Skript erwartet eine Konfigurationsdatei mit den entsprechenden Einträgen für den erfolgreichen Verbindungsaufbau. Dazu zählen Benutzername, Passwort, der genutzte Server und natürlich die Empfängeradresse. Das Muster sieht wie folgt aus.\n1 2 3 4 5 6 7 8 9 [Connection] # username user= # password password= # receiver destination= # jabberserver to connect server= Abhängigkeiten des Skriptes sind die Pythonmodule pyxmpp (community) und ConfigParser (AUR), welche recht schnell installiert sind. Der rsnapshot wurde von mir dann noch wie folgt abgeändert\n1 2 3 4 5 6 7 #!/bin/sh ## save stderr to var ERR=$(/usr/bin/rsnapshot daily 3\u0026amp;gt;\u0026amp;1 1\u0026amp;gt;\u0026amp;2 2\u0026amp;gt;\u0026amp;3) ### if command fails report via xmpp if [ $? -ne 0 ]; then sendxmpp.py backup_status \u0026#34;${ERR}\u0026#34; fi und benachrichtigt mich über Probleme beim Backup. Empfangen kann man das Ganze dann mit einem Jabber-Client seiner Wahl (bspw. Pidgin, Empathy usw.) oder lässt es sich gleich auf Telefon schicken mit IM+ oder so, je nach Plattform oder App. Einziges Manko ist natürlich, dass die Nachricht auf dem Client quittiert wird, von dem sie abgerufen wird.\n","date":"19. September 2014","externalUrl":null,"permalink":"/blog/jabber-xmpp-einfaches-status-monitoring/","section":"Blogs","summary":"Der klassische (und wohl auch gängiste) Weg sich über Ereignisse wie gescheiterte Backups, mögliche Virenfunde oder Sonstiges informieren zu lassen ist sicherlich die gute E-Mail. Allerdings setzt dies natürlich auch einen funktionierenden und vor allem richtig konfigurierten Mail-Server voraus. Gerade der letzte Punkt ist meiner Meinung nach sehr kritisch, da ein falsch eingerichteter SMTP-Server schnell zur Spam-Schleuder mutiert oder aber man will erst gar keinen auf seiner Workstation installieren.\n","title":"Jabber / XMPP - einfaches Status-Monitoring","type":"blog"},{"content":"","date":"19. September 2014","externalUrl":null,"permalink":"/tags/xmpp/","section":"Tags","summary":"","title":"XMPP","type":"tags"},{"content":"Völlig nervig. Nach der Installation von Chromium unter der GNOME-Version von Manjaro, öffnet dieser nicht den Downloadordner. Stattdessen versucht er diesen mit Anjuta zu importieren/öffnen. Recht schnell war klar irgendetwas stimmt mit den MIME-Zuordnungen nicht und diese sollten zu recht gebogen werden. Also erst einmal auslesen was als Standard-Applikation definiert ist.\n1 xdg-mime query default inode/directory Was in meinem Fall `anjuta.desktop lieferte. Ok Treffer. Zum Setzen der zugehörigen Anwendung nutzen wir erneut xdg-mime und setzen unsere Anwendung wie folgt.\n1 xdg-mime default nautilus.desktop inode/directory Auf der gleichen Art und Weise funktioniert das natürlich auch mit anderen MIME-Typen und Anwendungen.\n","date":"19. September 2014","externalUrl":null,"permalink":"/blog/chromium-downloadordner-oeffnet-anjuta/","section":"Blogs","summary":"Völlig nervig. Nach der Installation von Chromium unter der GNOME-Version von Manjaro, öffnet dieser nicht den Downloadordner. Stattdessen versucht er diesen mit Anjuta zu importieren/öffnen. Recht schnell war klar irgendetwas stimmt mit den MIME-Zuordnungen nicht und diese sollten zu recht gebogen werden. Also erst einmal auslesen was als Standard-Applikation definiert ist.\n","title":"Chromium - Downloadordner öffnet Anjuta?","type":"blog"},{"content":"Nachdem zunächst geklärt wurde, wie man sich seine eigenen Pakete erstellt, folgt nun die Beschreibung wie man ein eigenes Repository einrichtet. Im Prinzip das Vorgehen unter Arch Linux recht einfach gehalten, daher möchte ich das Ganze nicht wirklich als Tutorial/Anleitung bezeichnen.\nWas braucht man? # einen Webserver (bzw. wenn das Repository lokal ist nicht einmal den) + Zugriff auf das Dateisystem Dabei ist es von Vorteil, wenn man (zu mindestens für das Repository) das Indexing erlaubt (bspw. für nginx). seine Pakete Anlegen und Füllen des Repository (unter Arch Linux) # Ich bin mir nicht ganz sicher ob die Skripte zur Erzeugung der Datenbank nicht auch auf anderen Distributionen laufen würden, daher die Einschränkung. Die Auslieferung funktioniert unabhängig von der Distribution, da nur ein Webserver benötigt wird.\nZu allererst verschafft man sich Zugang zu seinem Webserver. Dabei bietet es sich an, den Ort wo die Pakete liegen sollen in das lokale Dateisystem zu mounten. Wie man es macht ist eigentlich egal, ich benutzte zur Zeit sshfs jedoch würde es sicherlich auch mit einer nfs-Freigabe funktionieren. Kopieren der fertigen Pakete in das Verzeichnis Erzeugen der Paketdatenbank (im Verzeichnis) 1 2 3 4 ## hinzufügen aller Pakete repo-add mypkgs.db.tar.gz *.pkg.tar.xz ## hinzufügen eines Pakets repo-add {reponame}.db.tar.gz {paketname}.pkg.tar.xz Repository in die Paketverwaltung eintragen # 1 2 3 [{reponame}] SigLevel = Optional TrustAll Server = http://host/pfad/zur/datenbank Dabei sollten die Werte für {reponame} in Schritt 3 und 4 übereinstimmen. Wichtig ist dabei, dass man das Siglevel entsprechend anpasst. Optional TrustAll setzt keine Signierung der Pakete durch den Ersteller voraus und bietet sich daher zum Testen an.\nAktualisieren der Paketlisten (auf jedem Rechner) # 1 pacman -Syuu Fertig ist das eigene Arch Linux Repository. So muss ich nicht alle Pakete auf jedem Rechner mit Arch Linux bauen, sondern kann sie via vServer allen Rechnern an denen ich arbeite bequem aktuell halten. Der nächste Schritt wäre die Signierung und ein bis zwei Spiegelserver. Wobei diese dann auch im LAN stehen könnten.\n","date":"18. September 2014","externalUrl":null,"permalink":"/blog/arch-linux-eigenes-repository-einrichten/","section":"Blogs","summary":"Nachdem zunächst geklärt wurde, wie man sich seine eigenen Pakete erstellt, folgt nun die Beschreibung wie man ein eigenes Repository einrichtet. Im Prinzip das Vorgehen unter Arch Linux recht einfach gehalten, daher möchte ich das Ganze nicht wirklich als Tutorial/Anleitung bezeichnen.\n","title":"Arch Linux - Eigenes Repository einrichten","type":"blog"},{"content":" Warum selbst Pakete erstellen? # Ein großer Vorteil von Arch Linux ist ohne Zweifel das Arch User Repository (AUR), welches der Community ermöglicht Pakete in Form von PKGBUILDs bereit zu stellen.\nHierbei handelt es sich um „Vorschriften“ zur Erzeugung der Pakete und beinhalten das Herunterladen und Bearbeiten der Quellen sowie die Installation in einer Fakeroot-Umgebung sowie die Erstellung des Pakets. Natürlich könnte man danach aufhören und mit pacman -U das erzeugte Paket einfach installieren, jedoch kann die Übersetzungszeit bei großen Bibliotheken auf schwächeren Systemen schon mal eine halbe Ewigkeit dauern. Weiterhin können die Pakete aus dem AUR durchaus instabil arbeiten und/oder neue Funktionen enthalten, die das Arbeiten im bisherigen Sinne verkomplizieren oder unmöglich machen. Um mir zu mindestens nur einmal die Zeit für die Erstellung der Pakete nehmen zu müssen, war der Entschluss für ein eigenes privates Repository (plus folgendem Spiegelserver im LAN) schnell gefasst.\nPakete erstellen unter Arch Linux # Wie oben beschrieben, gibt es im AUR schon vorgefertigte Kochrezepte für die Erstellung Pakete.\nAlso sollte man dort zunächst mit der Suche starten. Als Beispiel habe ich mit die Bibliothek „MAT File I/O Library“ ausgesucht, da ich sie auch des Öfteren für eigene Programme benötige. Das dazugehörige PKGBUILD sieht dabei wie folgt aus:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 # Maintainer: Stefan Husmann \u0026lt;stefan-husmann@t-online.de\u0026gt; # Contributor: Alexander Rødseth \u0026lt;rodseth@gmail.com\u0026gt; # Contributor: William Rea \u0026lt;sillywilly@gmail.com\u0026gt; pkgname=libmatio pkgver=1.5.2 pkgrel=3 pkgdesc=\u0026#39;C library with a fortran 90/95 module interface for reading/writing MATLAB MAT-files\u0026#39; arch=(\u0026#39;x86_64\u0026#39; \u0026#39;i686\u0026#39;) license=(\u0026#39;custom:BSD\u0026#39;) url=\u0026#39;http://sourceforge.net/projects/matio\u0026#39; depends=(\u0026#39;zlib\u0026#39; \u0026#39;hdf5\u0026#39;) options=(\u0026#39;!libtool\u0026#39; \u0026#39;!emptydirs\u0026#39;) source=(\u0026#34;http://downloads.sourceforge.net/matio/matio-$pkgver.tar.gz\u0026#34;) sha1sums=(\u0026#39;d5a83a51eb2550d75811d2dde967ef3e167d4f52\u0026#39;) build() { cd matio-$pkgver ./configure --prefix=/usr --enable-shared --with-hdf5 make } package() { cd matio-$pkgver make DESTDIR=\u0026#34;$pkgdir\u0026#34; install install -Dm644 COPYING \u0026#34;$pkgdir\u0026#34;/usr/share/licenses/$pkgname/COPYING } Die einzige Bedingung für das Gelingen sind also nur ein Internetanschluss und das Paket „base-devel“ (eventuell auch abs) installiert ist und die Abhängigkeiten (siehe depends Zeile) geklärt sind. Lädt man sich diese hier herunter, speichert man es sinnvollerweise in einem Verzeichnis eurer Wahl. wichtig ist dabei, dass es die einzige Datei im Verzeichnis ist. Dies ist notwendig da das Skript, welches von Arch Linux ausgeliefert wird, den notwendigen Verzeichnisbaum für die Paketierung selbstständig erzeugt und es somit zwangsläufig Probleme bei mehr als einem Paket geben wird. Anschließend wechselt man mit dem Terminal in das Verzeichnis und startet das Skript: 1 makepkg -s Das Skript erledigt die im PKGBUILD definierten Aufgaben und komprimiert anschließend das Paket, so das es für pacman verdaubar wird. Ist der Vorgang abgeschlossen, sollte eine Datei mit der Endung „*.xz“ im Verzeichnis vorliegen, welche ihr wie oben beschrieben installieren könnt.\n1 2 3 4 5 6 7 8 9 10 11 12 13 ==\u0026gt; Säubere Installation... -\u0026gt; Bereinige ungewollte Dateien... -\u0026gt; Entferne libtool Dateien... -\u0026gt; Entferne static library Dateien... -\u0026gt; Entferne leere Verzeichnisse... -\u0026gt; Komprimiere Man-Pages und Info-Seiten... -\u0026gt; Entferne unnötige Symbole aus Binär-Dateien und Bibliotheken... ==\u0026gt; Erstelle Paket \u0026#34;libmatio\u0026#34;... -\u0026gt; Erstelle .PKGINFO Datei... -\u0026gt; Erstelle .MTREE-Datei -\u0026gt; Komprimiere Paket ... ==\u0026gt; Verlasse fakeroot Umgebung. ==\u0026gt; Beendete make: libmatio 1.5.2-2 (Do 18. Sep 10:27:01 CEST 2014) Weiter mit dem eigenen Repository geht es dann im nächsten Beitrag zu dem Thema. Bei Fragen nutzt bitte die Kommentarfunktion.\n","date":"18. September 2014","externalUrl":null,"permalink":"/blog/arch-linux-pakete-erstellen/","section":"Blogs","summary":"Warum selbst Pakete erstellen? # Ein großer Vorteil von Arch Linux ist ohne Zweifel das Arch User Repository (AUR), welches der Community ermöglicht Pakete in Form von PKGBUILDs bereit zu stellen.\n","title":"Arch Linux - Pakete selbst erstellen","type":"blog"},{"content":" Atmel Stuff # Programmiergeräte / Starterkits # Originale Geräte haben zwar meist eine höhere Qualität und lassen sich im Betrieb meist problemlos nutzen, haben meiner Meinung nach aber einen großen Nachteil was die ISP-Schnittstelle angeht. Denn Leider ist bei den meisten ATMEL Boards der VCC Pin spannungslos und wird vom Programmierer stets genutzt um die Versorgungsspannung des Targets einzulesen. Das heißt also, das eine externe Spannungsquelle von Nöten ist. Beim STK600 ist es allerdings möglich die Spannung via AVRStudio zu regeln. Unter Linux hat man bekanntlich kein AVRStudio/ ATMEL Studio, aber die Onlinehilfe gibt Infos bzgl der Connection-Sheets usw..\nAVR-Dragon # Sehr preisgünstiger Original-Programmiergerät, welches JTAG, PDI (bei einigen Modellen), ISP und HVPP unterstützt. Leider kommt das Gerät völlig nackt ohne Kabel, Sockel oder Gehäuse daher. Darüber hinaus ist das AVR-Dragon sehr anfällig was statische Aufladungen angeht. Abhilfe was die ESD-Schwäche betrifft kann und soll das Dragon Lair schaffen.\nAVR Dragon Auf der gleichen Seite findet man auch eine Anleitung wie man eventuell beschädigte Spannungswandler austauscht, da bei einigen Versionen zu kleine Exemplare verbaut wurden. Auskunft bzgl. Pinbelegungen der Programmierschnittstellen, Prototyping-Area etc gibt es in der AVRStudio-Onlinehilfe. Aus eigener Erfahrung kann ich sagen, dass das Gerät trotz der Schwächen zu empfehlen ist.\nAVR-MKII # Der wohl beliebteste und weit verbreitetste Programmierer den es zu kaufen gibt. Relativ günstig in der Anschaffung, verfügt er jedoch nur über ISP und PDI als Programmierschnittstellen. Ich besitze privat keinen mkII, aber programmiere damit auf der Arbeit meine Targets.\nAtmel ISP mkII Starterkit (STK) 600 # Der STK500-Nachfolger, scheinbar nicht so angesagt und verbreitet wie das Vorbild. Angesichts des Preises aber auch nicht weiter verwunderlich. Bekommt man das STK500 für knapp 80 € muss man beim STK600 (ohne Daughterboards) mit 300 € schon etwas tiefer in die Tasche fassen. Vorteil gegenüber dem STK500 ist, dass das Starterkit über eine USB-Schnittstelle (STK500 serielle Schnittstelle mit Problemen bei USB-RS232-Wandler, soweit mit bekannt ist) verfügt und sogar bis 300 mA ohne Netzteil betrieben werden kann. Im Lieferumfang sind enthalten :\nSTK600 Netzstrippe ohne Wandwarze ( kann man für 300 € nicht verlangen} Flachbandkabel ( zum programmieren ) USB-B-Kabel Daughter-Board mit ATMega2560 zweipolige Verbindungskabel ( für UART, CAN, TWI denke ich ) Atmel STK600 Komisch finde ich, dass das Board über eine JTAG-Programmierschnittstelle verfügt, aber das Debugging über jene nicht im Funktionsumfang ist. Nicht umsonst liest man von verdutzten Käufern, dass sie Hilfe beim JTAG-Debugging brauchen und man ihnen meist nur sagen kann : „Es geht nicht!“. Weiterhin ist das sog. DIP-Package sehr interessant, wohinter sich eine Sammlung von Adapter-Boards und ein Daughter-Board mit Testsockel verbirgt um Controller im Dual-Inline-Package flashen zu können.\nusbPROG # Die eierlegende Wollmilchsau von Benedikt Sauter Projektseite, die mittels Firmwarepool alles geben kann was man in einen ATMega32 bekommt. Mit der Firmware für den mkII-Klon verwandelt sich das USB-Gerät in einen vollwertigen AVR-Programmer und lässt sich wie das Original via AVRStudio oder avrdude nutzen. Vor kurzem wurde die Firmware aktualisiert, so das man den mkII-Klon auch mit AVRStudio 5 nutzen kann.\nmySmartUSB MK2 # Das war es auch schon mit dem kurzem Überblick. Sollte jemand noch andere spannende Bibliotheken (außer Arduino-Kram), dann kann er diese ja in einem kurzem Kommentar vorstellen.\nAtmel Softwarebibliotheken # Ein wirklich schöner und auf das Wesentliche beschränkter Programmer ist der mySmartUSB MK2 von myAVR. Er bietet neben einem AVR911-Programmer auch noch über die Möglichkeiten einen USB-RS232-Wandler (CP2102) zu nutzen und lässt sich im Betrieb umschalten. Ich besitze ihn zwar immer noch, aber er kommt nicht mehr zum Einsatz.\nSo nun zum zweiten Teil der (hoffentlich mehrteiligen) Serie. In diesem Beitrag solle es jedoch mehr um die Software-Ebene bzw. genauer um Bibliotheken handeln. Es ist natürlich auch klar, dass ich nicht alle Bibliotheken auflisten kann. Daher beschränke ich mich im Wesentlichen auf die, die ich schon benutzt habe bzw. mit denen ich schon etwas herumgespielt habe. Klassiker wie die TWI-Master- oder die UART-Bibliothek von Peter Fleury lasse ich mal außen vor, möchte sie jedoch wenigstens erwähnt haben. Grund dafür ist, dass man dafür genügend Artikel bei mikrocontroller.net oder ähnlichen Seiten findet.\nSoftware USB 1.1 mit VUSB für Atmel Controller # V-USB Level conversion Unter VUSB (Projekt-Homepage) verbirgt sich eine Softwareimplementierung des USB 1.1 Standards für Atmel Mikrocontroller und stellt eine kostengünstige Alternative zu den USB/RS232-Wandlern der Firma FTDI da. In der gängigsten Variante sind nur 3 Widerstände und zwei Zener-Dioden notwendig um die Hardwareseite zu erfüllen. Ein stark abgespeckter Softcore ist sogar auf einem Atmel ATTiny45 mit internem Oszillator und PLL lauffähig. Vorteil dieser Variante ist, dass der Mikrocontroller weiterhin mit +5V betrieben werden kann.\nKleines Beispiel für eine HID-Schnittstelle:\nHardware USB für Atmel Controller mit USB-Interface # Eine wahre Fundgrube an Beispielen und verschiedenen Implementierungen der USB-Schnittstelle für neuere Controller mit Hardware-Schnittstelle ist die LUFA-Biliothek. Dabei stehen dem geneigten Entwickler eigentlich alle Türen und Tore offen. Ob es nun HI-Devices (Mäuse, Tastaturen oder ähnliches Gerät) oder eine Kommunikationsgerät (bspw. CDC) ist, es ist realisierbar. Nicht umsonst haben die Entwickler der Arduino-Plattform im letzen Hardware-Rework den FT232 von ihren Boards geputzt und ihn gegen einen USB-fähigen Controller ersetzt. Unter den Beispielen der LUFA-Bibliothek sind daher nicht umsonst ein Arduino Programmer (Duce) und ein AVRISP-MK2 Clone vertreten. 😉 Letzterer bildet dabei die Protokolle ISP, PDI und TPI ab und wird vom ATMEL Studio als Original erkannt.\nUSI TWI-Slave für die kleinen ATTiny-µCs # Martin Junghans stellt auf seiner Projektseite eine Bibliothek samt Beispielimplementierung zur Ansteuerung der USI (Universal Serial Interface)-Schnittstelle als TWI-Interface bereit. Das US-Interface findet besonders bei den kleinen Controllern von Atmel Verwendung. Bisher noch nicht getestet, aber einige Ideen zur Verwendung gäbe es da schon. Die Bibliothek konnte ich erfolgreich einsetzen um bei einem Roboter die Motorsteuerung durch einen ATTiny2313 zu realisieren.\n","date":"14. Juli 2014","externalUrl":null,"permalink":"/blog/atmel-mikrocontroller-boards/","section":"Blogs","summary":"Atmel Stuff # Programmiergeräte / Starterkits # Originale Geräte haben zwar meist eine höhere Qualität und lassen sich im Betrieb meist problemlos nutzen, haben meiner Meinung nach aber einen großen Nachteil was die ISP-Schnittstelle angeht. Denn Leider ist bei den meisten ATMEL Boards der VCC Pin spannungslos und wird vom Programmierer stets genutzt um die Versorgungsspannung des Targets einzulesen. Das heißt also, das eine externe Spannungsquelle von Nöten ist. Beim STK600 ist es allerdings möglich die Spannung via AVRStudio zu regeln. Unter Linux hat man bekanntlich kein AVRStudio/ ATMEL Studio, aber die Onlinehilfe gibt Infos bzgl der Connection-Sheets usw..\n","title":"Atmel Mikrocontroller - Boards und Bibliotheken","type":"blog"},{"content":"","date":"23. Juni 2014","externalUrl":null,"permalink":"/tags/hardware/","section":"Tags","summary":"","title":"Hardware","type":"tags"},{"content":"","date":"23. Juni 2014","externalUrl":null,"permalink":"/tags/xrandr/","section":"Tags","summary":"","title":"XRandr","type":"tags"},{"content":"Ich benutze bevorzugt leichtgewichtige Window-Manager wie i3 oder awesome. Leider bedeutet dies unter Umständen auch, dass man etwas mehr Zeit bzw. Fleiß in die ein oder andere Komfortfunktion investieren muss, um diese nutzen zu können.\nxrandr Multi-Monitor Desktop http://en.wikipedia.org/wiki/Xinerama Bspw. bei der Nutzung eines Notebooks möchte man nach Möglichkeit zwischen mehreren Anzeigegeräten automatisch umschalten. Andernfalls müsste man das Gerät immer herunterfahren und nach einem Neustart entsprechend mit xrandr konfigurieren – von Hand natürlich! Nachdem mir das Ganze heute mehr als auf die Nerven ging, habe ich mir auf die „Schnelle“ ein kleines Skript geschrieben und führe dieses nun mittels Udev-Regel aus um automatisch umschalten zu können.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #!/bin/bash DP2STATUS=\u0026#34;$(cat /sys/class/drm/card0-DP-2/status)\u0026#34; DP3STATUS=\u0026#34;$(cat /sys/class/drm/card0-DP-3/status)\u0026#34; export DISPLAY=:0.0 XAUTHORITY=/home/daniel/.Xauthority #XAUTHORITY=/var/run/slim.auth authtoken=$( xauth -f \u0026#34;${XAUTHORITY}\u0026#34; nlist | cut -d\u0026#34; \u0026#34; -f 9 ); xauth add $DISPLAY MIT-MAGIC-COOKIE-1 $authtoken ## get current display number from process list # export DISPLAY=`ps aux | grep X | awk \u0026#39;$12 ~ /:[0-9]/ {print $12}\u0026#39;` echo \u0026#34;changing\u0026#34; \u0026gt;\u0026gt; /tmp/dock if [ \u0026#34;${DP2STATUS}\u0026#34; = disconnected ] then xrandr --output LVDS1 --auto --primary --output DP2 --off elif [ \u0026#34;${DP2STATUS}\u0026#34; = connected ] then if [ \u0026#34;${DP3STATUS}\u0026#34; == disconnected ] then xrandr --output LVDS1 --off --output DP2 --primary --auto else xrandr --output DP2 --primary --auto xrandr --output LVDS1 --off xrandr --output DP3 --right-of DP2 --auto fi fi /usr/bin/which nitrogen 1 \u0026amp;\u0026gt; /dev/null 2 \u0026amp;\u0026gt; /dev/null if [ $? -eq 0 ]; then nitrogen --restore fi Die dazugehörige Udev-Regel sieht folgendermaßen aus:\n1 KERNEL==\u0026#34;card0\u0026#34;, ACTION==\u0026#34;change\u0026#34;, RUN+=\u0026#34;/home/daniel/bin/monitor.sh\u0026#34; Wichtig ist dabei, dass der Xauthority-Token und das Display exportiert werden, sonst geht es in die Hose. Natürlich sollten die Pfade, die Schnittstelle des Displays und eventuell die Grafikkarte entsprechend angepasst werden.\n","date":"23. Juni 2014","externalUrl":null,"permalink":"/blog/xrandr-automatisch-zwischen-display-und-monitor-umschalten/","section":"Blogs","summary":"Ich benutze bevorzugt leichtgewichtige Window-Manager wie i3 oder awesome. Leider bedeutet dies unter Umständen auch, dass man etwas mehr Zeit bzw. Fleiß in die ein oder andere Komfortfunktion investieren muss, um diese nutzen zu können.\n","title":"XRandr - Automatisch zwischen Display und Monitor umschalten","type":"blog"},{"content":"Wie bereits für meine Bachelorarbeit\nhabe ich die Commits meiner Masterarbeit auch durch gource als Video darstellen lassen. Nicht das man das machen müsste, aber man ist ja irgendwie erleichtert und froh das man das Kapitel ruhen lassen kann.\nNoch ein Vortrag und es ist komplett. Wer das selbst mal machen will, der findet das Skript (Einzeiler) hier:\n1 2 3 #!/bin/bash gource -s 0.4 -i 0 -1280x800 --highlight-users --highlight-dirs --file-extensions --hide mouse,filenames --key --stop-at-end \\ --output-ppm-stream - | ffmpeg -y -r 60 -f image2pipe -vcodec ppm -i - -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -crf 1 -threads 2 -bf 0 gource.mp4 ","date":"23. Juni 2014","externalUrl":null,"permalink":"/blog/git-und-gource/","section":"Blogs","summary":"Wie bereits für meine Bachelorarbeit\nhabe ich die Commits meiner Masterarbeit auch durch gource als Video darstellen lassen. Nicht das man das machen müsste, aber man ist ja irgendwie erleichtert und froh das man das Kapitel ruhen lassen kann.\n","title":"git und gource","type":"blog"},{"content":"","date":"23. Juni 2014","externalUrl":null,"permalink":"/tags/gource/","section":"Tags","summary":"","title":"Gource","type":"tags"},{"content":"","date":"22. Juni 2014","externalUrl":null,"permalink":"/tags/gitlist/","section":"Tags","summary":"","title":"GitList","type":"tags"},{"content":"Wie bereits im Artikel über gitolite angekündigt, folgt nun der versprochene Post bzgl. Installation und Konfiguration von gitlist. Gitlist stellt dabei ein Web-Interface für die Repositories eurer Projekte dar und orientiert sich optisch stark an gitHub. Es ist möglich mehrere Projekte/Repositories, separate Branches und einzelne Commits anzuzeigen.\nVorbereitung # Zunächst müssen wir uns gitlist von der offiziellen Projektseite herunterladen. Das geht relativ fix mittels wget und sollte keine großen Probleme machen.\n1 2 3 4 5 6 # Verzeichnis erstellen mkdir -p /var/www/gitlist/ # Verzeichnis wechseln cd /var/www/gitlist # downloaden von gitlist wget –no-check-certificate https://s3.amazonaws.com/gitlist/gitlist-0.4.0.tar.gz Installation von gitlist # Zur Installation sollten wir das Archiv noch entpacken und mit den entsprechenden Rechten versehen.\n1 2 3 4 5 6 7 8 # Archiv entpacken tar -xzvf gitlist-0.4.tar.gz # Rechte anpassen chown -R www-data:www-data /var/www/gitlist find /var/www/gitlist/ -type d -exec chmod 775 {} \\; find /var/www/gitlist/ -type f -exec chmod 664 {} \\; # Cache Verzeichnis benötigt gesondert Rechte chmod 777 /var/www/gitlist/cache Schon ist gitlist installiert. Natürlich muss euer Web-Server ( bspw. apache, nginx oder lighttpd) entsprechend konfiguriert werden, damit er den Inhalt auch entsprechend anzeigen kann.\nKonfiguration von gitlist # Im erstellten Verzeichnis gitlist sollte sich neben einigen PHP-Skripten auch eine Datei mit dem Namen „config.ini-example“ befinden. Diese wird zunächst kopiert bzw. umbenannt.\n1 cp config.ini-example config.ini Die Datei sollte im Groben so aussehen:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [git] client = \u0026#39;/usr/bin/git\u0026#39; ; Your git executable path default_branch = \u0026#39;master\u0026#39; ; Default branch when HEAD is detached repositories[] = \u0026#39;/home/git/repositories/\u0026#39; ; Path to your repositories ; If you wish to add more repositories, just add a new line ; WINDOWS USERS ;client = \u0026#39;\u0026#34;C:\\Program Files (x86)\\Git\\bin\\git.exe\u0026#34;\u0026#39; ; Your git executable path ;repositories[] = \u0026#39;C:\\Path\\to\\Repos\\\u0026#39; ; Path to your repositories ; You can hide repositories from GitList, just copy this for each repository you want to hide ; hidden[] = \u0026#39;/home/git/repositories/BetaTest\u0026#39; [app] debug = false cache = true ; If you need to specify custom filetypes for certain extensions, do this here [filetypes] ; extension = type ; dist = xml ; If you need to set file types as binary or not, do this here [binary_filetypes] ; extension = true ; svh = false ; map = true ; set the timezone [Date] ; timezone = UTC Unter der Annahme, dass der Befehl git sich unter /usr/bin finden lässt ist Zeile 4 sehr entscheidend. Sie setzt den Pfad, unter dem sich eure Repositories finden lassen. Sollen einige Repositories ausgeblendet werden, so kann man diese nach dem Muster in Zeile 12 einfügen. Es bietet sich an, hier das Repository für die Verwaltung (gitolite-admin) einzutragen.\nAnpassung von gitolite # Leider muss die Standard umask von gitolite angepasst werden, da sonst die Rechte zu restriktiv vergeben werden und die Inhalte der einzelnen References aus den Repositories nicht gelesen werden können.\nDazu verändert man die Datei gitolite.rc unter /home/git/.gitolite.rc in Zeile 21 entsprechend ab.\n1 2 3 4 # Orginal - UMASK =\u0026gt; 0700 # Änderung + UMASK =\u0026gt; 0002 Führt man diese Änderung nicht aus, so wird gitlist sich jedesmal beschweren, dass es keine Informationen des Repositories lesen konnte und euch mit einer Fehlermeldung begrüßen/abspeisen.\n","date":"22. Juni 2014","externalUrl":null,"permalink":"/blog/gitlist-installation-und-konfiguration/","section":"Blogs","summary":"Wie bereits im Artikel über gitolite angekündigt, folgt nun der versprochene Post bzgl. Installation und Konfiguration von gitlist. Gitlist stellt dabei ein Web-Interface für die Repositories eurer Projekte dar und orientiert sich optisch stark an gitHub. Es ist möglich mehrere Projekte/Repositories, separate Branches und einzelne Commits anzuzeigen.\n","title":"GitList Installation und Konfiguration","type":"blog"},{"content":"","date":"20. Juni 2014","externalUrl":null,"permalink":"/tags/gitolite/","section":"Tags","summary":"","title":"Gitolite","type":"tags"},{"content":"Ob für die eigenen Konfigurationsdateien, Softwareprojekte oder für Webseiten bzw. Blogs bieten sich Versionsverwaltungen an. Eine, von Linus Torvalds entwickelte, Möglichkeit zu Versionsverwaltung – Git – hat sich mittlerweile fest etabliert.Möchte man nicht auf Plattformen wie GitHub oder BitBucket setzen und hat einen vServer oder Ähnliches zur Verfügung, bietet es sich geradezu an seine Projekte etc. selbst zu Hosten. gitlist webinterface Dabei wird die Einrichtung in zwei Schritte gegliedert:\nEinrichten der Server-Schnittstelle „gitolite“ (machen wir hier) Einrichten des Webfrontends „gitlist“ (gibt es noch einen Post zu) Gitolite # Gitolite ist ein Fork bzw. eine Weiterentwicklung des Projektes gitosis und ist in der Lage mehrere Repositories zu verwalten und verfügt obendrein noch über eine Rechte- und Benutzerverwaltung in Form einer Konfigurationsdatei. Die Authentifizierung erfolgt dabei über SSH und Private- bzw. Public-Keys.\nVorbereitung # Da die Installation von gitolite git benötigt, sollte das entsprechende Paket auch installiert sein.\n1 2 3 4 5 6 # Paketlisten updaten apt-get update # Updates installieren sofern nötig apt-get upgrade # das PAket git installieren apt-get install git Weiterhin wird zur sauberen Trennung, ein separater Nutzer eingerichtet.\n1 adduser git Daraufhin wechselt man den Benutzer, nimmt die Umgebung mit und wechselt in das Benutzerverzeichnis des soeben erstellten Benutzers.\n1 2 su - git cd ~ Da für die Authentifizierung ein SSH-Publickey (s.o.) benötigt wird, muss dieser zunächst erzeugt werden. Sicherlich kann auch ein bestehender Key verwendet werden, jedoch sollte man hinsichtlich sauberer Trennung einen separaten Key erstellen.\n1 2 # RSA-Schlüsselpaar erzeugen ssh-keygen -t rsa Installation # Zur Installation bleibt eigentlich nicht viel zu sagen. Der aktuelle Stand wird ausgecheckt und über die mitgelieferten Skripte installiert.\n1 2 3 4 5 6 7 8 # aktuellen Stand klonen git clone git://github.com/sitaramc/gitolite # Verzeichnis für die Binaries im Benutzerverzeichnis erstellen mkdir -p $HOME/bin # gitolite installieren gitolite/install -to $HOME/bin # public-key integrieren gitolite setup -pk git.pub Je nach Konfiguration, kann es sein das der letzte Befehl scheitert. Warum? Ganz einfach er kann den entsprechenden Befehl nicht finden, da nicht jede Distribution per Default das bin-Verzeichnis im Home an den PATH anhängt. Schnelle Abhilfe schafft ein entsprechender export oder ein Aufruf mit vollem Pfad.\n1 $HOME/bin/gitolite setup -pk git.pub Soweit so gut, ist man soweit gekommen, ist eigentlich alles Nötige erledigt und gitolite funktioniert.\nAbschluss # In einer lokalen Shell kann nun das Repository für die Konfiguration ausgecheckt werden und Benutzer sowie Repositories hinzugefügt werden.\n1 git clone git@example.com:/gitolite-admin Daraufhin erhält man einen neuen lokalen Ordner „gitolite-admin“. Darin befinden sich die Ordner keydir und conf. Möchte man einen neuen Public-Key hinzufügen, so kopiert man diesen als Datei in den Ordner keydir und für innerhalb der Konfiguration im Ordner conf die entsprechenden Einträge hinzu. Dabei sieht die Konfiguration schematisch so aus:\n1 2 3 4 5 6 7 @entwickler = daniel felix simon @admins = git repo meinprojektrepo RW+ = daniel RW = felix R = @entwickler Dabei entsprechen @entwickler und @admins Gruppen, welche das hinzufügen von Benutzern recht komfortabel gestalten. Möchte man alle Nutzer hinzufügen bietet gitolite die Gruppe @all an. Die Zeile „repo meinprojektrepo“ stellt dabei ein Repository dar und definiert die Zugriffsrechte der Benutzer auf das Repository. Möchte man weitere Repositories erstellen, fügt man einfach weitere Abschnitte hinzu und gitolite wird die entfernten Repositories mit dem nächsten push erstellen und entsprechend einrichten.\n1 2 3 4 5 6 # neuen Public-Key hinzufügen git add keydir/neuer_key # Änderungen commiten/einpflegen git commit -am \u0026#34;Neuer Key von Max Mustermann\u0026#34; # Änderungen an Remote-Server übertragen git push So das war es eigentlich. Da der Post relativ lang geworden ist, werde ich den Part über gitlist später in einem weiteren Post erläutern. Sollten Fehler oder Fragen existieren, bitte einfach melden.\n","date":"20. Juni 2014","externalUrl":null,"permalink":"/blog/gitolite-und-gitlist-unter-debian/","section":"Blogs","summary":"Ob für die eigenen Konfigurationsdateien, Softwareprojekte oder für Webseiten bzw. Blogs bieten sich Versionsverwaltungen an. Eine, von Linus Torvalds entwickelte, Möglichkeit zu Versionsverwaltung – Git – hat sich mittlerweile fest etabliert.Möchte man nicht auf Plattformen wie GitHub oder BitBucket setzen und hat einen vServer oder Ähnliches zur Verfügung, bietet es sich geradezu an seine Projekte etc. selbst zu Hosten. gitlist webinterface ","title":"Gitolite und GitList unter Debian","type":"blog"},{"content":"","date":"17. Juni 2014","externalUrl":null,"permalink":"/tags/vim/","section":"Tags","summary":"","title":"VIM","type":"tags"},{"content":"Ich dachte mir, dass ich eventuell mal einige hilfreiche VIM Einzeiler sammle, könnte ja nicht nur mir hilfreich sein. Mit der Zeit werde ich diese noch erweitern, wer ein paar gute Sachen parat hat, kann mir auch gern welche zukommen lassen.\ngVIM Instanz Zeilenumbrüche (^M) entfernen: # 1 :%s/^V^M//g Wobei ^V und ^M durch gedrückt halten der Steuerungstaste (STRG/CTRL) und des jeweiligen Buchstabens gebildet werden.\nN Zeilen auskommentieren: # Unter der Angabe des Bereichs mit absolutem Start- und Endwert\n1 \u0026lt;Startzeile\u0026gt;,\u0026lt;Endzeile\u0026gt;s/^/#/ Oder unter Angabe der Startzeile und der Anzahl der Zeilen\n1 :\u0026lt;Startzeile\u0026gt;,\u0026lt;+-Zeilenanzahl\u0026gt;s/^/#/ Dabei ist die Raute (#) das jeweilige Zeichen um einen Kommentar einzuleiten. Für Octave-Code würde man das Prozentzeichen wählen (%) oder bei C/C++-Code eben // wobei diese jedoch jeweils mit einem vorangestelltem \\ versehen werden müssen. Natürlich kann man damit auch alles Andere auf die Zeilen anwenden. Entfernen kann man die Kommentare natürlich auch wieder.\n1 :\u0026lt;Startzeile\u0026gt;,\u0026lt;Endzeile\u0026gt;s/^#// Für die Kombination aus Start- und Endzeile, sowie für die Angabe von Startzeilen und der Anzahl der folgenden Zeilen:\n1 :\u0026lt;Startzeile\u0026gt;,\u0026lt;+-Zeilenanzahl\u0026gt;s/^#// ","date":"17. Juni 2014","externalUrl":null,"permalink":"/blog/vim-einzeiler/","section":"Blogs","summary":"Ich dachte mir, dass ich eventuell mal einige hilfreiche VIM Einzeiler sammle, könnte ja nicht nur mir hilfreich sein. Mit der Zeit werde ich diese noch erweitern, wer ein paar gute Sachen parat hat, kann mir auch gern welche zukommen lassen.\n","title":"VIM Einzeiler","type":"blog"},{"content":"","date":"2. Juni 2014","externalUrl":null,"permalink":"/tags/foss/","section":"Tags","summary":"","title":"FOSS","type":"tags"},{"content":"","date":"2. Juni 2014","externalUrl":null,"permalink":"/tags/kicad/","section":"Tags","summary":"","title":"KiCAD","type":"tags"},{"content":"KiCAD ist ein relativ gutes und vor allem freies Tool zur Erstellung von Schaltplänen und Layouts. Daher wird es auch zur Gruppe der sog. EDA-Tools und soll den Entwickler technologisch bei der Entwicklung von elektronischen Systemen unterstützen (ähnlich wie CAD-Programme). Da die Weiterentwicklung von KiCAD, nicht zuletzt durch den großen Merge des CERNs, stetig voranschreitet wird es nicht nur immer benutzbarer, sondern steigt auch die Verbreitung. Darüber hinaus fließen durchaus interessante Features wie der Push and Shove-Router in den Hauptzweig ein. Mamashield, made with KiCAD KiCAD beziehen # Für die üblichen Plattformen wie Windows, Linux usw. gibt es Pakete bzw. Installationsroutinen auf der Homepage. In der Regel sind diese jedoch etwas „gesetzt“. Möchte man eine aktuelle Version des Entwicklungszweigs nutzen, bleibt daher nur das eigenhändige Kompilieren. Unter MacOSX existieren ein oder zwei verschiedene Build-Scripts, wobei der Build-Vorgang wohl mehr oder weniger erfolgreich ist. Für Ubuntu wie üblich ein PPA. Unter Arch Linux nutzt man für den aktuellsten Stand das PKGBUILD aus dem AUR. Natürlich ist bei sämtlichen Build-Skripten zu bedenken, dass das Resultat mehr oder weniger stabil ausfallen kann. Sogar für Windows-Nutzer hat sich jemand erbarmt und versucht den Build-Vorgang in ein Skript zu packen und somit die Unbekannten Gefilde vor ihm zu vestecken.\nKiCAD-Videos # Klar gibt es auch Videos und einige Video-Tutorials. Playlist\nKiCAD-Quellen # Da ein EDA-Programm nur so gut ist wie seine Bauteilquellen, folgen nun einige gute Quellen für ebensolche. Dabei ist jedoch auf die Lizenzen des jeweiligen Autors zu achten. Sollte jemand noch weitere Bibliotheken kennen, dann würde ich mich über eine kurze Meldung freuen.\nkicadcloud (hauptsächlich Bauteile, Footprints) smisioto (Bauteile, Footprints und 3D-Modelle) Renie S. Marquet (Bauteile, Footprints und 3D-Modelle) Konvertierte EAGLE Bibliotheken (Bauteile und Footprints) saturnal.eu (Bauteile, Footprints und 3D-Modelle)\n","date":"2. Juni 2014","externalUrl":null,"permalink":"/blog/kicad-eda-software-suite/","section":"Blogs","summary":"KiCAD ist ein relativ gutes und vor allem freies Tool zur Erstellung von Schaltplänen und Layouts. Daher wird es auch zur Gruppe der sog. EDA-Tools und soll den Entwickler technologisch bei der Entwicklung von elektronischen Systemen unterstützen (ähnlich wie CAD-Programme). Da die Weiterentwicklung von KiCAD, nicht zuletzt durch den großen Merge des CERNs, stetig voranschreitet wird es nicht nur immer benutzbarer, sondern steigt auch die Verbreitung. Darüber hinaus fließen durchaus interessante Features wie der Push and Shove-Router in den Hauptzweig ein. Mamashield, made with KiCAD ","title":"KiCAD EDA Software Suite","type":"blog"},{"content":"","date":"20. Mai 2014","externalUrl":null,"permalink":"/tags/octave/","section":"Tags","summary":"","title":"Octave","type":"tags"},{"content":" Batchverarbeitung # Programme wie MATLAB oder Octave sind schon recht hilfreiche Programme, wenn es darum geht Daten mathematisch auszuwerten oder zu visualisieren. Dabei ist es oftmals extrem nervig, wenn mehrere Dateien des gleichen Typs verarbeitet werden – also mittels Stapel- oder Batchverarbeitung – sollen um bspw. Trainingsdaten für einen Klassifikator zu verarbeiten etc.. Für MATLAB ist mir dazu mal eine 32-Bit-DLL untergekommen, aber leider funktioniert diese nicht unter Octave.\nOct-Files - Funktionsumfang # Daher habe ich mir ein oct-File geschrieben, welches genau diese Aufgabe übernimmt. Oct-Files sind dabei das Pendant zu den mex-Files von Matlab und stellen eine C++-API bereit um den Funktionsumfang von Octave zu erhöhen.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 DEFUN_DLD ( scandir , args, , \u0026#34;-*- texinfo -*-\\n\\ @deftypefn {Scan Dir} {} scandir (@var{n}, @var{m})\\n\\ A function that scans the passed directory for files with the given files extension.\\n\\ This could be helpfull for writing applications where serveral files schould be proccessed in batchmode.\\n\\ @end deftypefn\u0026#34; ) { /* return values */ octave_value_list retval; /* number of input arguments */ int nargin = args.length (); /* do something fancy */ /* return results */ return retval; } Dabei habe ich mir ein entsprechendes octfile geschrieben, um einen angegebenen Pfad nach Dateien einer bestimmten Endung durchsucht und eine Liste dieser Dateien als CharMatrix zurück liefert. Dabei kann die so kreierte Funktion „scandir“ – sofern im Suchpfad von Octave – wie jede andere Funktion aufgerufen werden:\n1 2 3 4 5 6 7 [~/Dokumente/Projekte/Messdaten/Volumen]$ ls Tauchtechnik_Schallfeld_ZEUS WS1232-10KK200-03.3d [~/Dokumente/Projekte/Messdaten/Volumen]$ octave -q octave:1\u0026gt; dir = pwd dir = /home/daniel/Dokumente/Projekte/Messdaten/Volumen octave:2\u0026gt; name = scandir (dir, \u0026#39;3d\u0026#39; ) name = /home/daniel/Dokumente/Projekte/Messdaten/Volumen/WS1232-10KK200-03.3d Somit ist es möglich mehrere Dateien (plus Pfad) automatisch in einer Liste zu verwalten und ggf. an seine Octave-Skripte übergeben und somit recht viel Zeit gespart werden. Damit ist nun die Batchverarbeitung recht einfach möglich. Ich hoffe das Ganze ist für den ein oder anderen nützlich.\nOctave Oct-file Scandir\n","date":"20. Mai 2014","externalUrl":null,"permalink":"/blog/octave-batchverarbeitung-von-dateien/","section":"Blogs","summary":"Batchverarbeitung # Programme wie MATLAB oder Octave sind schon recht hilfreiche Programme, wenn es darum geht Daten mathematisch auszuwerten oder zu visualisieren. Dabei ist es oftmals extrem nervig, wenn mehrere Dateien des gleichen Typs verarbeitet werden – also mittels Stapel- oder Batchverarbeitung – sollen um bspw. Trainingsdaten für einen Klassifikator zu verarbeiten etc.. Für MATLAB ist mir dazu mal eine 32-Bit-DLL untergekommen, aber leider funktioniert diese nicht unter Octave.\n","title":"Octave Stapel- oder Batchverarbeitung von Dateien","type":"blog"},{"content":"Mal etwas Kurzes, was ich mir anscheinend aber nicht merken kann.\nPatch erstellen # 1 git diff --no-prefix \u0026gt; patchfile Patch einspielen mit patch # 1 patch -p0 \u0026lt; patchfile Sollte –no-prefix weggelassen werden, dann enthält der Patch die Prefixe a/ b/ für die Quelldateien. Mit folgender Änderung werden diese ignoriert.\n1 patch -p1 \u0026lt; patchfile Patch einspielen mit git apply # 1 git apply --index patchfile ","date":"11. August 2013","externalUrl":null,"permalink":"/blog/patchen-mit-git/","section":"Blogs","summary":"Mal etwas Kurzes, was ich mir anscheinend aber nicht merken kann.\nPatch erstellen # 1 git diff --no-prefix \u003e patchfile Patch einspielen mit patch # 1 patch -p0 \u003c patchfile Sollte –no-prefix weggelassen werden, dann enthält der Patch die Prefixe a/ b/ für die Quelldateien. Mit folgender Änderung werden diese ignoriert.\n","title":"Patchen mit git","type":"blog"},{"content":"","date":"11. August 2013","externalUrl":null,"permalink":"/tags/patching/","section":"Tags","summary":"","title":"Patching","type":"tags"},{"content":" Vorgeplänkel # Beschleunigungssensoren (ADXL345) sind ja nahezu alltags-tauglich und begleiten mittlerweile fast jedermann im Smartphone oder Tablet. Interessant sind sie daher auch für eigene Spielerreien. Da ich noch ein eBay-Modul rumliegen hatte und sowohl für den Beschleunigungssensor als auch für das Raspberry Pi einen halbwegs sinnvollen Zweck finden wollte, dachte ich mir ich verheirate die beiden miteinander.\nÜberrascht war ich als ich sah, dass Analog Devices wohl recht aktiv in der Dokumentation und Entwicklung von Gerätetreibern unter Linux (device drivers) ist und es ein nahezu fertiges Kochrezept für das Raspberry Pi gibt.\nEinrichten der Entwicklungsumgebung # 1 2 3 4 5 6 7 # Arbeitsverzeichnis erzeugen mkdir RaspberryPi cd RaspberryPi # Entwicklungstools klonen git clone https://github.com/raspberrypi/tools.git # Kernelquellen klonen git clone https://github.com/raspberrypi/linux.git Anwenden des/der Patchfiles # Leider funktionieren die Patch-Files aus dem Analog Devices-Wiki nicht mehr mit der aktuellen Version. Daher habe ich die Änderungen manuell übernommen. Zunächst benötigen wir die Änderungen, welche ich als Patch (Ausgabe von diff) zum Download bereitgestellt habe. Somit ist es nicht notwendig die Änderungen bzgl. des aktuellen Stands vom Kernel-Repository per Hand einzupflegen. Das geht natürlich auch, aber warum mehr Arbeit als nötig aufhalsen. Hat man das Repo ausgecheckt und das Patch-File im aktuellen Ordner (linux), so folgt das normale „Applying“ via Git.\n1 git apply path/file.patch Kompilieren des Kernels und der Module # 1 2 3 4 5 6 7 8 # Exportieren der relevanten Informationen zum Übersetzen export PATH=PFAD_ZU_TOOLS_ORDNER/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/:$PATH export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- # Konfigurieren make bcmrpi_defconfig # Starten des Kompilierens make Übernehmen des Kernels und der Module # 1 2 cp arch/arm/boot/zImage /PFAD_ZUR_FAT_PARTITION_SDKARTE/kernel.img sudo ARCH=arm make modules_install INSTALL_MOD_PATH=/media/10b4c001-2137-4418-b29e-57b7d15a6cbc\u0026lt;/pre\u0026gt; ","date":"1. April 2013","externalUrl":null,"permalink":"/blog/adxl345-als-input-device/","section":"Blogs","summary":"Vorgeplänkel # Beschleunigungssensoren (ADXL345) sind ja nahezu alltags-tauglich und begleiten mittlerweile fast jedermann im Smartphone oder Tablet. Interessant sind sie daher auch für eigene Spielerreien. Da ich noch ein eBay-Modul rumliegen hatte und sowohl für den Beschleunigungssensor als auch für das Raspberry Pi einen halbwegs sinnvollen Zweck finden wollte, dachte ich mir ich verheirate die beiden miteinander.\n","title":"ADXL345 als Input-Device","type":"blog"},{"content":"Mal etwas Hardware zum Abend. Das Board schlummert auch schon etwas länger in der Schublade und war meine erste selbstständig geätzte Platine. Man möge die schlecht Anordnung von Pufferkondensator hinter dem Linearregler verzeihen, aber es musste wie immer schnell gehen. ATTiny2313 schematic Ansonsten ist nicht viel drauf außer Regler, Mikrocontroller (ATTiny2313), eine ICSP-Wanne und natürlich vielen Steckverbindern. ATTiny2313 layout ","date":"7. November 2012","externalUrl":null,"permalink":"/blog/kleines-attiny2313-board/","section":"Blogs","summary":"Mal etwas Hardware zum Abend. Das Board schlummert auch schon etwas länger in der Schublade und war meine erste selbstständig geätzte Platine. Man möge die schlecht Anordnung von Pufferkondensator hinter dem Linearregler verzeihen, aber es musste wie immer schnell gehen. ATTiny2313 schematic Ansonsten ist nicht viel drauf außer Regler, Mikrocontroller (ATTiny2313), eine ICSP-Wanne und natürlich vielen Steckverbindern. ATTiny2313 layout ","title":"Kleines ATTiny2313 Board","type":"blog"},{"content":"","date":"7. November 2012","externalUrl":null,"permalink":"/tags/qt/","section":"Tags","summary":"","title":"Qt","type":"tags"},{"content":"Seit zwei Jahren habe ich das günstige Einsteiger-DSO (Rigol DS1052E) und bin damit recht zufrieden. Die mitgelieferte Software ist allerdings recht bescheiden, aber scheint zu funktionieren. Zumindest für Einzelbilder. Vor einer ganzen Weile habe ich mich mal mit dem USB-Protokoll beschäftigt und eine kleine Demo-Applikation auf Basis von Qt, Qwt und den Agilent IO Libraries umgesetzt. Im Video sieht man die Visualisierung des Datenstroms. Das Signal ist – recht unspektakulär – der Referenzkanal des DSOs zum Abstimmen der Tastköpfe.\nDas Wichtigste zum Anfang ist es natürlich alle angeschlossenen Geräte – in diesem Fall USB-Geräte – ausfindig zu machen. Wie der unten stehende Code zeigt, ist dies recht schnell erledigt. Wichtig ist dabei eigentlich nur ?*INSTR, welches an jedes angeschlossene Gerät geschickt wird. Anschließend erhält man als Antwort die Identifikationsnummer. Alles Andere ist nun abhängig von den implementierten Befehlen des Geräts selber, wozu man die Dokumentation des Herstellers konsultieren sollte. PS: Die maximale Wiederholrate ist limitiert auf 50 Hz. Diese wird durch das Gerät und nicht durch die Applikation oder Qwt oder Sonstiges herabgesetzt.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include \u0026lt;QtCore/QCoreApplication\u0026gt; #include \u0026lt;visa.h\u0026gt; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); ViUInt32 retCnt=0; char buf [256] = {0}; char instrDesc[100]={0}; ViSession defaultRM,vi; ViStatus status; ViFindList find_list; viOpenDefaultRM (\u0026amp;defaultRM); status = viFindRsrc(defaultRM, \u0026#34;USB0::?*INSTR\u0026#34;, \u0026amp;find_list, \u0026amp;retCnt, instrDesc); status = viOpen(defaultRM,instrDesc, VI_NULL,VI_NULL, \u0026amp;vi); if (status != VI_SUCCESS) { printf(\u0026#34;Can not find USBTMC device!\\n\u0026#34;); viClose(vi); viClose (defaultRM); } else { printf(\u0026#34;USBTMC device : %s\\n\u0026#34;,instrDesc); viPrintf(vi,\u0026#34;*idn?\\n\u0026#34;); viScanf (vi, \u0026#34;%t\u0026#34;, \u0026amp;buf); printf(\u0026#34;%s\\n\u0026#34;,buf); viClose (vi); viClose (defaultRM); } return a.exec(); } Ich muss mal schauen wo ich das Programm geparkt habe. Eventuell kann man ja doch noch etwas Sinnvolles daraus machen.\n","date":"7. November 2012","externalUrl":null,"permalink":"/blog/rigol-ds1052e-usb-kommunikation/","section":"Blogs","summary":"Seit zwei Jahren habe ich das günstige Einsteiger-DSO (Rigol DS1052E) und bin damit recht zufrieden. Die mitgelieferte Software ist allerdings recht bescheiden, aber scheint zu funktionieren. Zumindest für Einzelbilder. Vor einer ganzen Weile habe ich mich mal mit dem USB-Protokoll beschäftigt und eine kleine Demo-Applikation auf Basis von Qt, Qwt und den Agilent IO Libraries umgesetzt. Im Video sieht man die Visualisierung des Datenstroms. Das Signal ist – recht unspektakulär – der Referenzkanal des DSOs zum Abstimmen der Tastköpfe.\n","title":"Rigol DS1052E USB-Kommunikation","type":"blog"},{"content":"Da ich günstig in den Genuss des ATMEL-Boards RN-Control gekommen bin, wollte ich es auch für meinen Roboter benutzen. Bevor es jedoch los gehen konnte, waren einige wenige Modifikationen notwendig. Zunächst wurde der zusätzliche Motortreiber entfernt, da TWI-Slave zur Motorsteuerung mit ATTiny2313 schon fertig war und dort nur die TWI-Wanne nach RN-Definitionen hinzugefügt werden musste.\nBTM-Mini-Modul Anschließend wurde der Pegelwandler für die RS232-Schnittstelle entfernt und gegen einen Adapter in Form eines Lochrasteraufbaus ersetzt. Dieser ermöglicht die Nutzung des BTM-Mini-S-Moduls, also eines Raysons BTM-222 Bluetooth-SPP (Serial over Bluetooth) Adapters. Die Schnittstelle soll später noch einmal gegen eine USB-Serial-zu-Wlan-Bridge ausgetauscht werden (wenn die Chinapost noch ankommen sollte). Soweit so gut. Der mitgelieferte ATmega32 wurde durch einen ATmega1284P getauscht. Zwar würde der Mega32 sicher fürs Erste reichen, aber der Tatendrang will befriedigt werden.\nAbschließend muss man eigentlich nur noch bemerken, dass sich Hausschuhe auf Laminat hervorragend statisch aufladen können. Die LED zu Anzeige der Akkuspannung hat es beim Anschalten nicht überlebt. Eventuell ist so ein Armbändchen doch nicht ganz verkehrt!\nBTM-Mini-Max232 ","date":"7. November 2012","externalUrl":null,"permalink":"/blog/rn-control-1-4-modifikationen/","section":"Blogs","summary":"Da ich günstig in den Genuss des ATMEL-Boards RN-Control gekommen bin, wollte ich es auch für meinen Roboter benutzen. Bevor es jedoch los gehen konnte, waren einige wenige Modifikationen notwendig. Zunächst wurde der zusätzliche Motortreiber entfernt, da TWI-Slave zur Motorsteuerung mit ATTiny2313 schon fertig war und dort nur die TWI-Wanne nach RN-Definitionen hinzugefügt werden musste.\n","title":"RN-Control 1.4 Modifikationen","type":"blog"},{"content":"Irgendwann sollte mein CCRP5/RP6-Chassis auch mal fahren! So der Wunsch. Natürlich fällt es einem schwer zwischen Prüfungen, Arbeit und dem restlichen Kram genügend Zeit aufzubringen so etwas wie einen Roboter selbst fertig zu stellen. Selbst wenn er erst einmal nur fahren soll, kann das unter Umständen schon recht lange dauern. Da ich jedoch nichts Fertiges oder einfach ein Arduino-Shield kaufen wollte, musste - ob nun Wohl oder Übel - eine modulare Lösung her.\nMotorsteuerung via I²C durch einen ATtiny2313 Die Wahl viel dabei auf eine Vernetzung von mehreren Teilkomponenten mittels TWI oder I²C. Gesagt getan, das erste Modul lief auf dem Steckbrett und funktioniert nun auch als Lochrasteraufbau,nur zur Platine hat es bisher noch nicht reichen wollen.\nRP6 TWI-Slave Motorsteuerung Für die Kommunikation mit der USI-Schnittstelle des Tinys hat sich Martin Junghans schon Gedanken gemacht. Daher war die Anpassung/Erweiterung nicht sonderlich schwierig und konnte nach kurzer Zeit mittels BusPirate getestet werden. Hinzu sind noch die Rad-Encoder für das Chassis (RP6v2-Encoder) gekommen, welche man seit einiger Zeit separat bei Conrad erstehen kann. Mittlerweile kann man nahezu alles per TWI konfigurieren und sogar im EEPROM des AVRs speichern.\nDa wären :\nTastgrad für alle PWM-Ausgänge separat variiert werden Vorteiler für PWM-Frequenz können paarweise gesetzt werden PWM-Ausgänge können komplett deaktiviert werden Encoderwerte können ausgelesen uns zurückgesetzt werden Laufrichtung für zwei (vier gingen mit Anpassungen auch) Motoren kann gesetzt und invertiert werden Speichern der aktuellen Einstellungen im EEPROM Natürlich kann jeder Parameter auch gesetzt werden. Interessanter Weise ist trotz der Programmierung in C noch etwas Platz übrig.\n1 2 3 Program Memory Usage : 1354 bytes 66.1 % Full Data Memory Usage : 19 bytes 14.8 % Full EEPROM Memory Usage : 8 bytes 6.3 % Full Was die Überlegung weckt die Regelung für den Geradeauslauf (wenn mal Zeit ist) noch zu integrieren.\nDer Code und etwas Dokumentation ist ab sofort auf Github zu finden.\n","date":"7. November 2012","externalUrl":null,"permalink":"/blog/twi-slave-zur-motorsteuerung-mit-attiny2313/","section":"Blogs","summary":"Irgendwann sollte mein CCRP5/RP6-Chassis auch mal fahren! So der Wunsch. Natürlich fällt es einem schwer zwischen Prüfungen, Arbeit und dem restlichen Kram genügend Zeit aufzubringen so etwas wie einen Roboter selbst fertig zu stellen. Selbst wenn er erst einmal nur fahren soll, kann das unter Umständen schon recht lange dauern. Da ich jedoch nichts Fertiges oder einfach ein Arduino-Shield kaufen wollte, musste - ob nun Wohl oder Übel - eine modulare Lösung her.\n","title":"TWI-Slave zur Motorsteuerung mit ATTiny2313","type":"blog"},{"content":"Es soll ja hin und wieder Probleme mit Windows geben. Besonders wenn man wegen einer neuen SSD sein Benutzerprofil etc auf eine andere Platte schubsen will und das Ganze irgendwie nicht funktioniert hat. Der pragmatische Mensch würde sich jetzt denken : „Na und – schieb ich wieder zurück!“. Ist leider nicht so einfach, denn Windows merkt sich seit Vista, dass da was krumm lief und weigert sich immer noch das Profil zu laden. Ist mir selbst mehr als einmal passiert und daher will ich mir selbst und anderen eine Neuinstallation ersparen.\nBenutzerprofil konnte nicht geladen werden Ab in den abgesicherten Modus und als User mit Adminrechten einloggen (auch wenn es der ist, der nicht mehr funktioniert!) regedit öffnen und nach : HKEY\\_LOCAL\\_MACHINE\\SOFTWARE\\MICROSOFT\\WindowsNT\\CurrentVersion\\ProfileList gehen Profil suchen, welches hinten ein .bak aufweist (das sollte zweimal vorkommen!) das ohne .bak in Name.old umbennen und anschließend bei dem anderen das .bak entfernen Den Wert State auf 0 setzen Neustarten und freuen! ","date":"7. November 2012","externalUrl":null,"permalink":"/blog/windows-7-benutzerprofil-konnte-nicht-geladen-werden/","section":"Blogs","summary":"Es soll ja hin und wieder Probleme mit Windows geben. Besonders wenn man wegen einer neuen SSD sein Benutzerprofil etc auf eine andere Platte schubsen will und das Ganze irgendwie nicht funktioniert hat. Der pragmatische Mensch würde sich jetzt denken : „Na und – schieb ich wieder zurück!“. Ist leider nicht so einfach, denn Windows merkt sich seit Vista, dass da was krumm lief und weigert sich immer noch das Profil zu laden. Ist mir selbst mehr als einmal passiert und daher will ich mir selbst und anderen eine Neuinstallation ersparen.\n","title":"Windows 7 - Benutzerprofil konnte nicht geladen werden","type":"blog"},{"content":"Da denkt man man bleibt verschont und ist eine Ausnahme der Regel. Pustekuchen. Leider hat es mich auch erwischt, mein AVR Dragon ist/war tot. Leider war es auch meine eigene Dummheit, so hatte ich dem VTarget-Pin kurzzeitig etwas mehr als 5V gegönnt. AVRStudio kommunizierte noch mit dem Dragon, allerdings war kein Target ansprechbar. Also musste es die Programmierleitungen getroffen haben.\nNach ein wenig „Durchklingeln“ und Internetrecherche konnte ich die SMD-ICs mit der Aufschrift AHT als Analogschalter identifizieren. Wermutstropfen ist jedoch, dass diese nicht mehr produziert werden. Zum Glück hat aber TI, bis auf den Namen, identische im Programm welche man auch als Muster bekommen konnte.\nAVR Dragon revive analog switch Nach etwas Gefummel – die defekten ICs gingen schneller runter als die neuen drauf waren sie dann auch ausgetauscht. Nach einem erfolglosen Test, bemerkte ich heute eine Lötbrücke an zwei Pins, welche ich schnell entfernte. Firmware-Update mit AVRStudio 5 durchgeführt und alles war wieder in Butter. 50 € gespart und verdammt viel Glück gehabt, dass es nicht der Spannungswandler war.\n","date":"20. April 2012","externalUrl":null,"permalink":"/blog/avr-dragon-wiederbelebung/","section":"Blogs","summary":"Da denkt man man bleibt verschont und ist eine Ausnahme der Regel. Pustekuchen. Leider hat es mich auch erwischt, mein AVR Dragon ist/war tot. Leider war es auch meine eigene Dummheit, so hatte ich dem VTarget-Pin kurzzeitig etwas mehr als 5V gegönnt. AVRStudio kommunizierte noch mit dem Dragon, allerdings war kein Target ansprechbar. Also musste es die Programmierleitungen getroffen haben.\n","title":"AVR Dragon Wiederbelebung","type":"blog"},{"content":"","date":"12. April 2012","externalUrl":null,"permalink":"/tags/debian/","section":"Tags","summary":"","title":"Debian","type":"tags"},{"content":" 1. Schritt Partitionstabelle auf den Stick bringen # Wie unter Unixoiden üblich geschieht die mittels Pipe. Da das Bootimage mit GZip komprimiert wurde, erledigt zcat das Dekomprimieren und Kopieren in einem Rutsch. Wichtig ist hier nur, dass alle Partitionen die sich auf den Stick befanden überschrieben werden.\nEine Angabe der Partitionsnummer ist auch nicht notwendig, da wir diese ja gerade erstellen wollen. Daher genügt die Angabe des entsprechenden Blockdevices, welche für unseren Stick steht.\n1 2 wget ftp://ftp2.de.debian.org/debian/dists/squeeze/main/installer-i386/current/images/hd-media/boot.img.gz zcat boot.img.gz \u0026gt; /dev/sdb Der Vorgang kann, je nach USB-Stick und dessen Schreib-/Lesegeschwindigkeit etwas Zeit in Anspruch nehmen.\n2. Schritt Dateien auf den Stick bringen und fertig # So der erste Schritt ist getan. Der Debian-Installer ist auf dem Stick, welcher auch bootfähig ist. Fehlt nur noch das ISO-Image der Netzwerkinstallation. Diese kann man mit folgenden 4 Zeilen schnell und bequem auf den Stick werfen und ist fertig.\n1 2 3 4 5 mount /dev/sdb1 /mnt cd /mnt wget http://cdimage.debian.org/debian-cd/6.0.1a/i386/iso-cd/debian-6.0.1a-i386-netinst.iso cd umount /mnt So nun haben wir einen bootfähigen Stick, welcher alles Notwendige beinhaltet um eine Installation über das Netzwerk vorzunehmen. Danach hat man eine minimale Installation und alle Pakete werden via Internet in der aktuellsten Version installiert. So spart man sich auch gleich die Update-Orgie nach der Installation.\n","date":"12. April 2012","externalUrl":null,"permalink":"/blog/debian-netinstall-von-einem-usb-stick/","section":"Blogs","summary":"1. Schritt Partitionstabelle auf den Stick bringen # Wie unter Unixoiden üblich geschieht die mittels Pipe. Da das Bootimage mit GZip komprimiert wurde, erledigt zcat das Dekomprimieren und Kopieren in einem Rutsch. Wichtig ist hier nur, dass alle Partitionen die sich auf den Stick befanden überschrieben werden.\n","title":"Debian Netinstall von einem USB-Stick","type":"blog"},{"content":"Ich hab irgendwann besteht das Problem, das man Gräte mit unterschiedlichen Versorgungs- und Logikspannungen über einen Bus betreiben will. Bei SPI oder USART ist das relativ Wurscht, da für beide Datenrichtung eine separate Leitung existiert. Da helfen Transistoren, Logikgatter oder Spannungsteiler. Bloß was tun bei TWI/I²C ? Schließlich ist der Bus bidirektional. Es muss also ein Levelshifter her. Eine Lösung ist die Nutzung von integrierten Schaltkreisen wie dem PCA9306. Allerdings sind die recht schwer zu bekommen bzw. recht teuer. Eine funktionierende Lösung mit 4 Widerständen und zwei N-Kanal-Mosfets zeigt die nächste Abbildung. bidirektionaler Levelshifter für TWI Die Funktion ist, bis auf das Abkoppeln vom Bus identisch. Vorteil ist der geringer Kostenfaktor von zirka einem Euro.\nQuellen:\nPhilips/NXP Application Note AN97055 Datenblatt PCA9306 ","date":"12. Februar 2012","externalUrl":null,"permalink":"/blog/bidirektionaler-levelshifter-fuer-i2c-twi/","section":"Blogs","summary":"Ich hab irgendwann besteht das Problem, das man Gräte mit unterschiedlichen Versorgungs- und Logikspannungen über einen Bus betreiben will. Bei SPI oder USART ist das relativ Wurscht, da für beide Datenrichtung eine separate Leitung existiert. Da helfen Transistoren, Logikgatter oder Spannungsteiler. Bloß was tun bei TWI/I²C ? Schließlich ist der Bus bidirektional. Es muss also ein Levelshifter her. Eine Lösung ist die Nutzung von integrierten Schaltkreisen wie dem PCA9306. Allerdings sind die recht schwer zu bekommen bzw. recht teuer. Eine funktionierende Lösung mit 4 Widerständen und zwei N-Kanal-Mosfets zeigt die nächste Abbildung. bidirektionaler Levelshifter für TWI Die Funktion ist, bis auf das Abkoppeln vom Bus identisch. Vorteil ist der geringer Kostenfaktor von zirka einem Euro.\n","title":"Bidirektionaler Levelshifter für I²C/TWI","type":"blog"},{"content":"Zum Abschalten - in den Pausen der Nahrungsaufnahme - während des Lernens für die noch übrig gebliebenen Prüfungen.\nWobei „Punching In A Dream“ auch sehr cool ist. Aber das kann man sich bei folgender YouTube-Playlist per Auto-Replay reinpfeiffen.\n","date":"22. Juli 2011","externalUrl":null,"permalink":"/blog/the-naked-and-famous-young-blood/","section":"Blogs","summary":"Zum Abschalten - in den Pausen der Nahrungsaufnahme - während des Lernens für die noch übrig gebliebenen Prüfungen.\nWobei „Punching In A Dream“ auch sehr cool ist. Aber das kann man sich bei folgender YouTube-Playlist per Auto-Replay reinpfeiffen.\n","title":"The Naked And Famous - Young Blood","type":"blog"},{"content":"","date":"22. Juli 2011","externalUrl":null,"permalink":"/tags/videos/","section":"Tags","summary":"","title":"Videos","type":"tags"},{"content":"","date":"19. Juli 2011","externalUrl":null,"permalink":"/tags/c/","section":"Tags","summary":"","title":"C","type":"tags"},{"content":"Kann man ja eventuell mal gebrauchen.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;stdlib.h\u0026gt; #include \u0026lt;fcntl.h\u0026gt; #include \u0026lt;linux/input.h\u0026gt; #define MOUSEFILE \u0026#34;/dev/input/event5\u0026#34; int main() { int fd; struct input_event ie; if((fd = open(MOUSEFILE, O_RDONLY)) == -1) { perror(\u0026#34;opening device\u0026#34;); exit(EXIT_FAILURE); } while(read(fd, \u0026amp;ie, sizeof(struct input_event))) { printf(\u0026#34;time %ld . %06ldttype %dtcode %dtvalue %dn\u0026#34;, ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value); } return 0; } ","date":"19. Juli 2011","externalUrl":null,"permalink":"/blog/linux-mausbewegungen-auslesen/","section":"Blogs","summary":"Kann man ja eventuell mal gebrauchen.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include \u003cstdio.h\u003e #include \u003cstdlib.h\u003e #include \u003cfcntl.h\u003e #include \u003clinux/input.h\u003e #define MOUSEFILE \"/dev/input/event5\" int main() { int fd; struct input_event ie; if((fd = open(MOUSEFILE, O_RDONLY)) == -1) { perror(\"opening device\"); exit(EXIT_FAILURE); } while(read(fd, \u0026ie, sizeof(struct input_event))) { printf(\"time %ld . %06ldttype %dtcode %dtvalue %dn\", ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value); } return 0; } ","title":"Linux - Mausbewegungen auslesen","type":"blog"},{"content":"Unter Linux benutze ich meist recht minimalistische Window-Manager wie Fluxbox, welche zu meist das Root-Window nutzen um ein Wallpaper zu setzen. Da ich es meist nicht hin bekomme die Wallpaper zu kategorisieren oder wenigstens vernünftige Namen zu geben, mag ich das dadurch resultierende Rate-Spiel nicht, da es einfach nervt. Irgendwann hab ich mal etwas über nitrogen gelesen, einen Wallpaper-Setter der als Übergabe ein Verzeichnis erwartet und die enthaltenden Bilder in einer Miniaturansicht darstellt. Sprich, Bild auswählen, Apply anklicken und fertig.\nGepatchte Version von nitrogen Nun versuchte ich die aktuelle Version, die übrigens auf github zu finden ist, zu übersetzen und scheiterte fürs Erste. Nach kurzem Suchen im Internet, war das Problem gefunden und kurz darauf auch gefixet. Das Problem bestand darin, dass nicht gegen die Xlib-gelinkt wurde usw. usw.. Da mein Window-Manager keine dekorativen Elemente wie Kreuze zum Schließen hat, habe ich auch einen Quit-Button eingefügt, so muss der Prozess nicht jedes mal abgewürgt werden. Im Übrigen hat die Gtk einen schlechteren Ruf, als sie wirklich ist. Als Gtk-Novize war das Anpassen mit Google und der Dokumentation kein wirkliches Problem.\nPatch for nitrogen Quit button and xlib\n","date":"5. April 2011","externalUrl":null,"permalink":"/blog/nitrogen-wallpapersetter-with-patch-inside/","section":"Blogs","summary":"Unter Linux benutze ich meist recht minimalistische Window-Manager wie Fluxbox, welche zu meist das Root-Window nutzen um ein Wallpaper zu setzen. Da ich es meist nicht hin bekomme die Wallpaper zu kategorisieren oder wenigstens vernünftige Namen zu geben, mag ich das dadurch resultierende Rate-Spiel nicht, da es einfach nervt. Irgendwann hab ich mal etwas über nitrogen gelesen, einen Wallpaper-Setter der als Übergabe ein Verzeichnis erwartet und die enthaltenden Bilder in einer Miniaturansicht darstellt. Sprich, Bild auswählen, Apply anklicken und fertig.\n","title":"nitrogen - Wallpapersetter with patch inside","type":"blog"},{"content":"","date":"13. Februar 2011","externalUrl":null,"permalink":"/tags/apple/","section":"Tags","summary":"","title":"Apple","type":"tags"},{"content":"Zu meinen neusten Errungenschaften in Punkto Technik gehört seit Freitag ein Apple Wireless Keyboard und bevor ich mich weiter dem Lernen für meine anstehende Klausur in der Hochfrequenztechnik widme, wollte ich wenigstens noch schnell diesen Artikel zu Ende schreiben. Natürlich kommen gleich wieder die auf der Hand liegenden Vorurteile:\nApple-Produkte nur wegen des Styles her Wenn Apfel, dann ganz Apfel Apple Wireless Keyboard Nun ganz so ist es jedoch nicht. Durch den ganzen Kram von Uni, Arbeit und meinem privatem Elektronik-Bastel-Krams habe ich immer weniger Platz auf dem Schreibtisch. Da kommt kommt die kleine Apfel-Tastatur genau richtig, denn Sie hat einen recht schmalen Formfaktor. Da mir bisher immer noch das nötige Kleingeld fehlt um mir ein Apfel-Komplettpaket hinzustellen, wird das auch sicherlich noch eine ganze Weile auf sich warten lassen müssen. Aber zurück zur Tastatur. Diese wird via Bluetooth in das bestehende System eingebunden, wobei eigentlich keinerlei Gerätetreiber notwendig sind. Nun kommen die bisher einzigen Haken an dem Gerät.\nZum einen ist man, wenn man ins BIOS oder bei GRUB ein anderes OS auswählen möchte komplett aufgeschmissen Die Funktionstasten funktionieren nicht out-of the-box Für knappe 70 Tacken, hält man es bei Apple nicht für nötig einen Bluetooth-Dongle oder Ähnliches beizulegen (hier wird darauf gebaut das die Mac-Hardware Bluetooth intern verbaut hat)\nDie doppelt belegten Tasten lassen sich mit den entsprechenden Bootcamp-Treibern schnell in Gang bringen und die Multimedia-Tasten kann man, wenn man möchte mit dem Tool AppleWirelessKeyboard von Codeplex mit Overlay-Grafik zur Funktion überreden. Vorausgesetzt ist natürlich, dass man einen entsprechenden Dongle in der Schublade liegen hat oder wie bei der Apple-Hardware auf internes Bluetooth setzen kann. Alles in allem funktioniert das Keyboard ausgesprochen gut. Der Tastenanschlag ist sehr angenehm und durch die geringen Maße geht das Tippen deutlich schneller von der Hand als bei meiner alten Cherry-Tastatur. Durch den leichten Neigungswinkel den die Tastatur hat, sind die Tasten sehr gut zu erreichen und es fühlt sich an, als würde ich meine M1330-Tastatur benutzen. Gewöhnungsbedürftig sind die Shotcuts für Delete, die Bildlauf-Tasten und Pos1 bzw. Ende. Allerdings muss man nun einmal damit leben, wenn man eine Winzlingtastatur kauft, dann muss der Platz schließlich irgendwo auch eingespart werden. ","date":"13. Februar 2011","externalUrl":null,"permalink":"/blog/apple-wireless-keyboard-unter-windows-7/","section":"Blogs","summary":"Zu meinen neusten Errungenschaften in Punkto Technik gehört seit Freitag ein Apple Wireless Keyboard und bevor ich mich weiter dem Lernen für meine anstehende Klausur in der Hochfrequenztechnik widme, wollte ich wenigstens noch schnell diesen Artikel zu Ende schreiben. Natürlich kommen gleich wieder die auf der Hand liegenden Vorurteile:\n","title":"Apple Wireless Keyboard unter Windows 7","type":"blog"},{"content":"","date":"8. Februar 2011","externalUrl":null,"permalink":"/tags/entertainment/","section":"Tags","summary":"","title":"Entertainment","type":"tags"},{"content":"Scheinbar schon etwas älter, aber was solls besser spät als nie. Erinnert etwas an Stactic-X. Auf jeden Fall hat es sich mal wieder gelohnt, treu StarFM FromHell zu hören.\nIn dem Sinne viel Spaß beim Anschauen und eine schöne Restwoche. (Morgen ist ja schon Bergfest !!)\n","date":"8. Februar 2011","externalUrl":null,"permalink":"/blog/raised-fist-firends-and-traitors/","section":"Blogs","summary":"Scheinbar schon etwas älter, aber was solls besser spät als nie. Erinnert etwas an Stactic-X. Auf jeden Fall hat es sich mal wieder gelohnt, treu StarFM FromHell zu hören.\nIn dem Sinne viel Spaß beim Anschauen und eine schöne Restwoche. (Morgen ist ja schon Bergfest !!)\n","title":"Raised Fist - Friends and Traitors","type":"blog"},{"content":"","date":"16. Januar 2011","externalUrl":null,"permalink":"/tags/centos/","section":"Tags","summary":"","title":"CentOS","type":"tags"},{"content":"Will man Linux installieren fügen bekanntlich viele Wege nach Rom, man hat die Wahl zwischen Live-CDs, Installations-CDs / DVDs oder der Netzwerkinstallation. Letzte ist in Anbetracht einer schnellen Internetverbindung natürlich unschlagbar, denn man erspart sich den Update-Marathon nach der Installation und kann dennoch das System nach belieben konfigurieren und/oder die Paketwahl beeinflussen, was ja bei Servern eine wichtige Rolle spielt. Um sich nun den Brennvorgang und mit der Zeit die vielen Rohlinge zu sparen und das Zielsystem vom USB-Stick zu booten, ist es möglich das diskimage direkt mit dd auf den Stick zu pressen. Das geht erstens unglaublich schnell und zweitens ist das Download-Volumen für die Erstellung des Sticks wesentlich geringer als das einer Live-CD. Zum Vergleich, eine Live-CD kommt mit einem Volumen von 700 MB, das Diskimage beträgt nur mit 12 MB. Natürlich steigt dann der Traffic bei der Installation.\nDownload der Images # Man sucht sich einen Mirror für das Diskimage seiner Wahldistribution und lädt die 12 MB große Datei herunter:\n1 http://mirrors.kernel.org/centos/5.5/os/i386/images/ Partition erzeugen und Kopieren auf den USB-Stick # Um die Partition zu erzeugen, gibt es wie immer viele Möglichkeiten und es zählt, was funktioniert. Also gparted, Windows oder fdisk, Hauptsache man hat am Ende eine Partition. Anschließend wird diese noch FAT formatiert, wobei die Größe der Partition die Entscheidungshilfe für FAT16 oder FAT32 gibt. Danach kommt der finale Schritt mit dd, wo kein Weg dran vorbei führt. Als Beispiel die Prozedur unter Linux in der Shell mit fdisk :\n1 2 3 fdisk -l /dev/sdb mkfs -t vfat /dev/sdb1 dd if=diskboot.img of=/dev/sdb Booten und Quelle angeben # Nun sollte der Stick seinen Weg in die USB-Buchse des Zielsystems finden und als Bootmedium der Stick gewählt werden. Ist man in der Installation bei der Wahl der Paketquellen angekommen, so gibt man einen Mirror und den Pfad zu den Paketen an.\n","date":"16. Januar 2011","externalUrl":null,"permalink":"/blog/centos-5-5-netinstall-vom-stick/","section":"Blogs","summary":"Will man Linux installieren fügen bekanntlich viele Wege nach Rom, man hat die Wahl zwischen Live-CDs, Installations-CDs / DVDs oder der Netzwerkinstallation. Letzte ist in Anbetracht einer schnellen Internetverbindung natürlich unschlagbar, denn man erspart sich den Update-Marathon nach der Installation und kann dennoch das System nach belieben konfigurieren und/oder die Paketwahl beeinflussen, was ja bei Servern eine wichtige Rolle spielt. Um sich nun den Brennvorgang und mit der Zeit die vielen Rohlinge zu sparen und das Zielsystem vom USB-Stick zu booten, ist es möglich das diskimage direkt mit dd auf den Stick zu pressen. Das geht erstens unglaublich schnell und zweitens ist das Download-Volumen für die Erstellung des Sticks wesentlich geringer als das einer Live-CD. Zum Vergleich, eine Live-CD kommt mit einem Volumen von 700 MB, das Diskimage beträgt nur mit 12 MB. Natürlich steigt dann der Traffic bei der Installation.\n","title":"Centos 5.5 Netinstall vom Stick","type":"blog"},{"content":"Alle Anderen nutzen Subversion, aber man selbst nutzt Git und möchte das lokale Repos etc. nicht missen !? Gut das es für so etwas Git-SVN gibt, und man für die Integration eines bestehenden Subversion-Repos allein drei Befehle benötigt um an Projekten zu partizipieren.\nSVN-Repository mit git-svn auschecken # 1 git svn clone --username user http://host/url Updates vom SVN holen # 1 git svn rebase Lokale Änderungen aus dem Git-Repository ins SVN schieben # 1 git svn dcommit Die Infos kommen natürlich nicht von Irgendwo. Die hatte ich vor einiger Zeit auf siriux.net gefunden.\n","date":"16. Januar 2011","externalUrl":null,"permalink":"/blog/git-svn-cheat-sheet/","section":"Blogs","summary":"Alle Anderen nutzen Subversion, aber man selbst nutzt Git und möchte das lokale Repos etc. nicht missen !? Gut das es für so etwas Git-SVN gibt, und man für die Integration eines bestehenden Subversion-Repos allein drei Befehle benötigt um an Projekten zu partizipieren.\n","title":"Git Svn Cheat Sheet","type":"blog"},{"content":"","date":"16. Januar 2011","externalUrl":null,"permalink":"/tags/subversion/","section":"Tags","summary":"","title":"Subversion","type":"tags"},{"content":"\u0026hellip; gehört sicherlich zu den ungewöhnlichsten Aktivitäten/Ereignissen des gewöhnlichen Windows-Nutzers. Ist auch doof, dass man sich bei DHCP nicht auf seine IP verlassen kann. Und dabei ist es doch nur ein Drei-Zeiler, den man unter Linux braucht. Und das eigentlich richtig Böse daran ist ja, das man auch virtuelle Devices erzeugen kann.\n1 2 3 ifconfig eth0:X down ifconfig eth0:X hw ether 00:11:22:33:44:55 ifconfig eth0:X up Damit kann man auch gleich ganze Ranges kapern. Nur mal nebenbei gesagt, ihr alten Seebären. Da fällt mir gerade ein, noch daran zu erinnern, dass durch diese Zeilen ein MAC-Filter im WLAN-Router auch völlig unsinnig ist. Aber wen es beruhigt…\n","date":"10. August 2010","externalUrl":null,"permalink":"/blog/linux-mac-spoofing/","section":"Blogs","summary":"… gehört sicherlich zu den ungewöhnlichsten Aktivitäten/Ereignissen des gewöhnlichen Windows-Nutzers. Ist auch doof, dass man sich bei DHCP nicht auf seine IP verlassen kann. Und dabei ist es doch nur ein Drei-Zeiler, den man unter Linux braucht. Und das eigentlich richtig Böse daran ist ja, das man auch virtuelle Devices erzeugen kann.\n","title":"MAC-Spoofing...","type":"blog"},{"content":"Vor gut 2 Jahren bekam ich von meinen Eltern einen Voyage 200 von Texas Instruments, für das Studium, geschenkt. Tadelloses Gerät mit reichlich Software und sogar gcc-Port zum Schreiben eigener Programme. Die CAS-Geräte sind zwar in der Uni nicht wirklich gern gesehen, aber was soll es war trotzdem eine gute Hilfe. Leider kam mit Windows Vista die Ära der 64-bit Systeme und ab da an hatte es sich dann auch mit dem TI gegessen. Seitens TI war eine Portierung des Treibers für die x64-Architektur wohl nicht interessant genug und freie Treiber ließen sich bzgl. Treibersignierung nicht installieren/aktivieren. Als ich heute jedoch in den Downloadbereich von TI schaute, musste ich mit Erstaunen feststellen, dass es einen Beta-Patch für TI-Connect gibt, der auch x64-Systeme unterstützt.\nInstalliert und getestet: funktioniert einwandfrei. Nun kann ich den Voyage wieder aus der Versenkung holen und wieder von den Vorzügen eines programmierbaren, graphischen Taschenrechners profitieren.\n","date":"4. März 2010","externalUrl":null,"permalink":"/blog/ti-voyage-200-und-windows-x64/","section":"Blogs","summary":"Vor gut 2 Jahren bekam ich von meinen Eltern einen Voyage 200 von Texas Instruments, für das Studium, geschenkt. Tadelloses Gerät mit reichlich Software und sogar gcc-Port zum Schreiben eigener Programme. Die CAS-Geräte sind zwar in der Uni nicht wirklich gern gesehen, aber was soll es war trotzdem eine gute Hilfe. Leider kam mit Windows Vista die Ära der 64-bit Systeme und ab da an hatte es sich dann auch mit dem TI gegessen. Seitens TI war eine Portierung des Treibers für die x64-Architektur wohl nicht interessant genug und freie Treiber ließen sich bzgl. Treibersignierung nicht installieren/aktivieren. Als ich heute jedoch in den Downloadbereich von TI schaute, musste ich mit Erstaunen feststellen, dass es einen Beta-Patch für TI-Connect gibt, der auch x64-Systeme unterstützt.\n","title":"TI Voyage 200 und Windows x64","type":"blog"},{"content":"","date":"24. August 2009","externalUrl":null,"permalink":"/tags/alsa/","section":"Tags","summary":"","title":"ALSA","type":"tags"},{"content":"Sollte man in den Genuss kommen und mit der ALSA-API auf ein MIDI-Interface zugreifen wollen, dann sollte man sich nicht wundern wenn das der Zugriff auf /dev/snd/seq mit\nALSA lib seq_hw.c:457:(snd_seq_hw_open) open /dev/snd/seq failed: No such file or directory verneint wird. Glücklicherweise hilft ein modprobe snd_seq wahre Wunder und es kann weiter gehen mit dem fröhlichen Trällern, oder halt dem Programmieren mit der ALSA-API.\n","date":"24. August 2009","externalUrl":null,"permalink":"/blog/linux-midi-fedora-alsa-api/","section":"Blogs","summary":"Sollte man in den Genuss kommen und mit der ALSA-API auf ein MIDI-Interface zugreifen wollen, dann sollte man sich nicht wundern wenn das der Zugriff auf /dev/snd/seq mit\nALSA lib seq_hw.c:457:(snd_seq_hw_open) open /dev/snd/seq failed: No such file or directory ","title":"Midi, Fedora, ALSA-API","type":"blog"},{"content":"","date":"27. Juli 2009","externalUrl":null,"permalink":"/tags/snippets/","section":"Tags","summary":"","title":"Snippets","type":"tags"},{"content":"Brauch man ja ab und an um sich ein Bild über die aktuelle Laufzeit des jeweiligen Systems zu machen oder um sich einzugestehen, dass man einfach zu lange vor der Kiste sitzt.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include \u0026lt;stdio.h\u0026gt; #include \u0026lt;sys/sysinfo.h\u0026gt; long getTickCount() // Zeit seit dem Booten in Sekunden { struct sysinfo si; if(sysinfo(\u0026amp;si) == 0) return si.uptime; else return -1L; } int main() { printf(\u0026#34;Uptime : %2.0f min\u0026#34;,(getTickCount()/60.0)); return 0; } ","date":"27. Juli 2009","externalUrl":null,"permalink":"/blog/uptime-mit-c-auslesen/","section":"Blogs","summary":"Brauch man ja ab und an um sich ein Bild über die aktuelle Laufzeit des jeweiligen Systems zu machen oder um sich einzugestehen, dass man einfach zu lange vor der Kiste sitzt.\n","title":"Uptime mit C auslesen","type":"blog"},{"content":"","date":"1. Juni 2009","externalUrl":null,"permalink":"/tags/conky/","section":"Tags","summary":"","title":"Conky","type":"tags"},{"content":"","date":"1. Juni 2009","externalUrl":null,"permalink":"/tags/dropbox/","section":"Tags","summary":"","title":"Dropbox","type":"tags"},{"content":"Des Öfteren sieht man hier ja Screenshots von meinem Laptop samt Fluxbox und Conky. Conky ist dabei ein kleines Programm, womit man so ziemlich alles auf den Desktop bringen kann. Standardmäßig werden CPU, RAM und Systeminfos wie Architektur und Distribution angezeigt. Mit ein wenig Investition von Zeit und einer Menge Testläufen, das Auge isst ja bekanntlich mit, kann man conky dann nach Belieben gestalten und alles Erdenkliche anzeigen lassen.\nConky zur Anzeige von Systeminformationen auf dem Desktop Mit ein wenig Suchen bei Google, findet man für fast alles ein Script oder man lässt sich selber was einfallen.\n1 ${color lightgray}DropBox Status: ${color ddaa00} ${execi 30 dropbox status} Zeit den aktuellen DropBox-Status innerhalb von conky an. Sehr schön ist auch die Integration von Subversion, welches die aktuelle Revision, den letzten Autor und das Datum der Änderung anzeigt. Wobei ein wenig mit Perl und regulären Ausdrücken nachgeholfen wird.\nAktuelle commits aus dem SVN repository Da Subversion mittlerweile lokalisiert wurde, hab ich das Script oder besser die Suchmuster ans Deutsche angepasst. Außerdem gibt es wie immer Probleme mit Backticks und Anführungsstrichen, was recht lange dauert bis man alle korrigiert hat. Daher der Download ganz unten.\n1 2 3 4 ${color lightgrey}Subversion: Uni ${alignr}${texeci 360 /home/epyx/bin/svn-stat.sh svn+ssh://baphie.homelinux.org/svnrepo/Uni} Arbeit ${alignr}${texeci 360 /home/epyx/bin/svn-stat.sh svn+ssh://baphie.homelinux.org/svnrepo/VbZeusDll} Projekt ${alignr}${texeci 360 /home/epyx/bin/svn-stat.sh svn+ssh://baphie.homelinux.org/svnrepo/Privat} Man erkennt ziemlich schnell das Muster \u0026#x1f604;. Viel Spass beim Tüffteln.\n","date":"1. Juni 2009","externalUrl":null,"permalink":"/blog/dropbox-subversion-in-conky-integrieren/","section":"Blogs","summary":"Des Öfteren sieht man hier ja Screenshots von meinem Laptop samt Fluxbox und Conky. Conky ist dabei ein kleines Programm, womit man so ziemlich alles auf den Desktop bringen kann. Standardmäßig werden CPU, RAM und Systeminfos wie Architektur und Distribution angezeigt. Mit ein wenig Investition von Zeit und einer Menge Testläufen, das Auge isst ja bekanntlich mit, kann man conky dann nach Belieben gestalten und alles Erdenkliche anzeigen lassen.\n","title":"Dropbox / Subversion in conky integrieren","type":"blog"},{"content":"Vor einiger Zeit hatte ich ja schon über diverse Vor einiger Zeit hatte ich ja schon über diverse zur Konfiguration, die das Synaptics-Touchpad betreffen, berichtet. Leider bietet das M1330 keine Tastenkombination um das Touchpad zu (de)aktiveren. Klar könnte man das jedes Mal per GSynaptics machen, aber das wäre verdammt unschön und sehr Windows-Like. Einfacher geht es mit einem kleinem Bash-Script, was beim Aufruf den aktuellen Zustand einfach toggelt und diesen setzt.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/bin/bash ### Little Touchpad toggle script ### author : Daniel Kotschate ### modified : 30.05.2009 ### url : http://www.epyx-online.de ### ### current touchpad state STATE=\u0026#34;$(synclient -l | grep TouchpadOff | cut -d= -f2 | cut -d\u0026#39; \u0026#39; -f2)\u0026#34; ### toggle current state STATE=$(($STATE^1)) ### set new state synclient touchpadoff=$STATE ### generate some output if [ $STATE -eq 1 ] ; then echo \u0026#34;Touchpad inactive\u0026#34; elif [ $STATE -eq 0 ] ; then echo \u0026#34;Touchpad active\u0026#34; fi Eigentlich war es das schon, einfach in das bin-Verzeichnis des Users packen, ausführbar machen und sich freuen. Eleganter geht es natürlich noch mit einem Keyboard-Shortcut. Also in die „~/.fluxbox/keys„-Datei einfach:\n1 2 # toggle touchpad Mod4 F9 :Exec ~/bin/touchpad{% endhighlight %} einfügen und mittels Windows/Super-F9 das Touchpad steuern.\nOder unter Gnome:\nConky zur Anzeige von Systeminformationen auf dem DesktopGNOME 2 Touchpad Dabei würde ich die Echo-Anweisung allerdings gegen notify-send austauschen, sieht halt schicker aus.\n","date":"31. Mai 2009","externalUrl":null,"permalink":"/blog/m1330-touchpad-de-aktivieren/","section":"Blogs","summary":"Vor einiger Zeit hatte ich ja schon über diverse Vor einiger Zeit hatte ich ja schon über diverse zur Konfiguration, die das Synaptics-Touchpad betreffen, berichtet. Leider bietet das M1330 keine Tastenkombination um das Touchpad zu (de)aktiveren. Klar könnte man das jedes Mal per GSynaptics machen, aber das wäre verdammt unschön und sehr Windows-Like. Einfacher geht es mit einem kleinem Bash-Script, was beim Aufruf den aktuellen Zustand einfach toggelt und diesen setzt.\n","title":"M1330 - Touchpad (de)aktivieren","type":"blog"},{"content":"Endlich mal wieder etwas Zeit sich um die trivialen Dinge im Leben zu kümmern. Zwar ist das natürlich bei jedem anders, aber bei mir gehört das Fernsehen nicht gerade zu den wichtigen Dingen meines Lebens. Eigentlich läuft es auch nur beim Essen, wenn man keine Zeit hat sich eine DVD anzusehen und man etwas dümmliches braucht um Abzuschalten. Nun gut, genug zu mir und zurück zum eigentlichen Thema. Wie dem Titel zu entnehmen ist, handelt es sich hier um den Dual-Tuner-Stick der Firma Terratec mit dem Namen „Terratec Cinergy DT USB XS Diversity“. Dieser hat neben dem Diversity-Feature, zusammenschalten von beiden Tuner zur Verbesserung der Signalqualität, auch einen integrierten Infrarot-Empfänger. Also recht praktisch, denn wer will schon zum Umschalten auf stehen. cinergydtusbxsdiversity Installation der Treiber / Firmware # Die Installation der Treiber verläuft relativ schnell und problemlos und ist mit wenigen Schritten durch gelaufen.\n1 2 3 4 5 6 7 8 9 10 [root]: yum -y install mercurial [user]: hg clone http://linuxtv.org/hg/v4l-dvb [user]: cd v4l-dvb/ [user]: make [root]: make install [root]: cd /lib/firmware [root]: wget http://www.wi-bw.tfh-wildau.de/~pboettch/home/files/dvb-usb-dib0700-1.20.fw [root]: ln -s dvb-usb-dib0700-1.20.fw dvb-usb-dib0700-1.10.fw ### Reboot (Ohne gab es bei mir eine Kernelpanic) [root]: chmod -R a+rw /dev/dvb So das war es schon, DVB-T läuft! Kommen wir zum nächsten und zum größeren Knackpunkt.\nInfrarot-Empfänger in Betrieb nehmen # Als erstes müssen wir dafür sorgen, dass der Empfänger nicht mehr als Tastatur erkannt wird und HAL verbieten ihn automatisch als solche zu konfigurieren. Zwar würde er dann auch funktionieren, jedoch wären nicht alle Tasten der RC verfügbar und das wollen wir ja nun nicht.\n1 2 [root]: cd /usr/share/hal/fdi/preprobe/20thirdparty [root]: vim lirc.fdi und den folgenden Inhalt hinein kopieren oder die Datei aus dem Anhang herunterladen und an die Position kopieren. Ob es letztendlich funktioniert hat, kann man mit folgenden Befehlen überprüfen :\n1 2 3 4 5 6 7 8 \u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;deviceinfo version=\u0026#34;0.2\u0026#34;\u0026gt; \u0026lt;device\u0026gt; \u0026lt;match key=\u0026#34;info.product\u0026#34; contains_ncase=\u0026#34;IR-receiver inside an USB DVB receiver\u0026#34;\u0026gt; \u0026lt;merge key=\u0026#34;info.ignore\u0026#34; type=\u0026#34;bool\u0026#34;\u0026gt;true\u0026lt;/merge\u0026gt; \u0026lt;/match\u0026gt; \u0026lt;/device\u0026gt; \u0026lt;/deviceinfo\u0026gt; Testen:\n1 2 3 hal-find-by-capability --capability input | xargs -I {} hal-device {} ## oder xinput --list Bei beiden darf der IR-Empfänger nicht in der Ausgabe nicht mehr auftauchen. Das war eigentlich schon die ganze Magie.\nLirc konfigurieren # Für das Grundgerüst von Lirc reicht folgendes Paket, allerdings sind gerade Bindings zu Prgrammen wie rhythmbox (rhythmbox-lirc), totem (totem-lirc) oder xmms (xmms-lirc) interessant, die dann nachinstalliert werden müssen.\n1 [root]: yum -y install lirc Danach benötigen wir noch eine Konfigurationsdatei, die unser RC beschreibt (als Download angehängt) welche wir nach /etc/lircd.conf kopieren. Diese Konfigurationsdatei beschreibt jedoch nur, wie Lirc KeyCodes interpretieren soll, jedoch nicht wie auf diese reagiert wird. also ist eine weitere Konfigurationsdatei pro Benutzer notwendig. Standard ist hier die Datei .lircrc im Home-Dir des Benutzers. Ich habe meine als Beispiel ebenfalls als Download angehangen, gesteuert werden hier totem und kaffeine. Das größte Problem was ich hatte, war das Lirc meine hardware.conf nicht annehmen wollte und folglich auch weder das device geöffnet noch den richtigen Treiber geladen hat. Daher habe ich das init.d-Skript folgendermaßen verändert. Wer das hier eventuell liest und eine bessere Lösung hat, kann sich ja vielleicht melden.\nZeile 66 geändert zu :\n1 daemon $exec -H devinput -d /dev/input/by-path/pci-2-2-event-ir /etc/lircd.conf Wobei\nH : Driver D : Device Config Das event bekommt man durch cat /proc/bus/input/devices heraus,\n1 2 3 4 5 6 7 8 I: Bus=0003 Vendor=0ccd Product=005a Version=0001 N: Name=\u0026#34;IR-receiver inside an USB DVB receiver\u0026#34; P: Phys=usb-0000:00:1d.7-2/ir0 S: Sysfs=/devices/pci0000:00/0000:00:1d.7/usb2/2-2/input/input8 U: Uniq= H: Handlers=kbd event8 B: EV=3 B: KEY=14afc336 284284d00000000 0 480058000 219040000801 9e96c000000000 90020000000ffd und mittels ls -al /dev/input/by-path/ auch das entsprechende device\n1 2 3 4 5 6 7 lrwxrwxrwx 1 root rootÂ Â 9 22. Feb 09:17 pci-0000:00:1d.0-usb-0:1:1.0-event-kbd -\u0026gt; ../event3 lrwxrwxrwx 1 root rootÂ Â 9 22. Feb 09:17 pci-0000:00:1d.0-usb-0:1:1.1-event- -\u0026gt; ../event4 lrwxrwxrwx 1 root rootÂ Â 9 22. Feb 09:17 pci-0000:00:1d.1-usb-0:2:1.0-event-mouse -\u0026gt; ../event5 lrwxrwxrwx 1 root rootÂ Â 9 22. Feb 09:17 pci-0000:00:1d.1-usb-0:2:1.0-mouse -\u0026gt; ../mouse1 lrwxrwxrwx 1 root rootÂ Â 9 22. Feb 09:17 pci-0000:00:1d.1-usb-0:2:1.1-event- -\u0026gt; ../event6 lrwxrwxrwx 1 root rootÂ Â 9 22. Feb 09:17 pci-2-2-event-ir -\u0026gt; ../event8 lrwxrwxrwx 1 root rootÂ Â 9 22. Feb 09:17 platform-pcspkr-event-spkr -\u0026gt; ../event7 Damit lautet das einzutragende Device bei mir „/dev/inpu/by-path/pci-2-2-event-ir„. Jetzt nur noch lirc (/etc/init.d/lirc start) und irexec (irexec -d ) starten fertig.\nProbleme # Da es anscheinend auch verschiebende Versionen von Ferndbedienung und Stick gibt können natürlich auch Probleme auftauchen. Bei mir musste ich per Modul-Option das IR-Protokoll von RC5 (Standardeinstellung) auf NEC ändern, da dort Toogle-Bit und Pulsweitenmodulation anders sind.\n1 options dvb-usb-dib0700 dvb_usb_dib0700_ir_proto=0 Wer zusätzlich nicht gerade in einem gut mit DVB-T abgedeckten Gebiet wohnhaft ist oder unter schlechtem Empfang leidet solte folgendes versuchen :\n1 options dvb_usb_dib0700 force_lna_activation=1 Ich hoffe das hilft denen, die verzweifelt herumprobieren, und nicht weiterkommen. Hab schließlich auch 2 Tage herumwirbelt bis endlich was funktionierte.\nlinuxtv.org ubuntuusers.de (Artikel HAL-Eingabegeräte und Lirc) Terratec ","date":"22. Februar 2009","externalUrl":null,"permalink":"/blog/terratec-cinergy-dt-usb-xs-diversity-unter-fedora-10/","section":"Blogs","summary":"Endlich mal wieder etwas Zeit sich um die trivialen Dinge im Leben zu kümmern. Zwar ist das natürlich bei jedem anders, aber bei mir gehört das Fernsehen nicht gerade zu den wichtigen Dingen meines Lebens. Eigentlich läuft es auch nur beim Essen, wenn man keine Zeit hat sich eine DVD anzusehen und man etwas dümmliches braucht um Abzuschalten. Nun gut, genug zu mir und zurück zum eigentlichen Thema. Wie dem Titel zu entnehmen ist, handelt es sich hier um den Dual-Tuner-Stick der Firma Terratec mit dem Namen „Terratec Cinergy DT USB XS Diversity“. Dieser hat neben dem Diversity-Feature, zusammenschalten von beiden Tuner zur Verbesserung der Signalqualität, auch einen integrierten Infrarot-Empfänger. Also recht praktisch, denn wer will schon zum Umschalten auf stehen. cinergydtusbxsdiversity ","title":"Terratec Cinergy DT USB XS Diversity unter Fedora 10","type":"blog"},{"content":"Um die Hardwaretasten für Batterieanzeige, Helligkeit, Ruhemodus, Monitorwechsel und WLAN sinngemäß nutzen zu können wären entsprechende Einträge in der xorg.conf nötig. Da ja aber gerade Eingabegeräte von HAL automatisch konfiguriert werden sollen, kann man dieses durch entsprechende Regeln definieren. Um alle Funktionstasten nutzen zu können sind folgende Schritte notwendig:\nIm Ordner „/usr/share/hal/fdi/policy/20thirdparty“ die Datei „30-keymap-dell.fdi“ erstellen und mit folgendem Inhalt versehen.\n1 2 3 4 5 6 7 8 9 10 11 \u0026lt;!--30-keymap-dell.fdi--\u0026gt; e005:brightnessdown \u0026lt;!-- Fn+Down arrow Brightness Down --\u0026gt; e006:brightnessup \u0026lt;!-- Fn+Up arrow Brightness Up --\u0026gt; e007:battery \u0026lt;!-- Fn+F3 battery icon --\u0026gt; e00a:suspend \u0026lt;!-- Fn+F1 hibernate --\u0026gt; e00b:displaytoggle \u0026lt;!-- Fn+F8 CRT/LCD --\u0026gt; e008:radio \u0026lt;!-- WLAN off --\u0026gt; input.keymap \u0026lt;!-- prefix XPS --\u0026gt; Fertig. Nach einem Neustart von HAL oder einem Reboot sollten die Tasten nun funktionieren. Bei mir funktionieren unter Fluxbox, ausnahmslos alle.\n","date":"30. Januar 2009","externalUrl":null,"permalink":"/blog/m1330-funktionstasten/","section":"Blogs","summary":"Um die Hardwaretasten für Batterieanzeige, Helligkeit, Ruhemodus, Monitorwechsel und WLAN sinngemäß nutzen zu können wären entsprechende Einträge in der xorg.conf nötig. Da ja aber gerade Eingabegeräte von HAL automatisch konfiguriert werden sollen, kann man dieses durch entsprechende Regeln definieren. Um alle Funktionstasten nutzen zu können sind folgende Schritte notwendig:\n","title":"M1330 - Funktionstasten","type":"blog"},{"content":"","date":"30. Januar 2009","externalUrl":null,"permalink":"/tags/fluxbox/","section":"Tags","summary":"","title":"FluxBox","type":"tags"},{"content":"Nach längerem hin und her, habe ich mich wieder für eine FluxBox auf meinem Laptop entschieden. Mit entsprechenden Einstellungen bzgl. Conky und der FluxBox selbst wird das Gerät dann voll und ganz zum Produktivgerät. Zwar wurden bei Gnome und XFCE in den letzten Versionssprüngen sehr viele Verbesserungen gemacht, dennoch halte ich die FluxBox immer noch als anpassungsfreudiger als den Rest an Window-Managern. Ach ja, KDE wird wohl nie auf meinem Laptop heimisch werden, auch wenn das Ausprobieren der aktuellen 4.2 sehr viel Spaß gemacht hat. Fluxbox M1330 Werde vielleicht mal ein paar Links und Informationen bzgl. der Konfigurationsmöglichkeiten posten.\n","date":"30. Januar 2009","externalUrl":null,"permalink":"/blog/fluxbox-ontour/","section":"Blogs","summary":"Nach längerem hin und her, habe ich mich wieder für eine FluxBox auf meinem Laptop entschieden. Mit entsprechenden Einstellungen bzgl. Conky und der FluxBox selbst wird das Gerät dann voll und ganz zum Produktivgerät. Zwar wurden bei Gnome und XFCE in den letzten Versionssprüngen sehr viele Verbesserungen gemacht, dennoch halte ich die FluxBox immer noch als anpassungsfreudiger als den Rest an Window-Managern. Ach ja, KDE wird wohl nie auf meinem Laptop heimisch werden, auch wenn das Ausprobieren der aktuellen 4.2 sehr viel Spaß gemacht hat. Fluxbox M1330 Werde vielleicht mal ein paar Links und Informationen bzgl. der Konfigurationsmöglichkeiten posten.\n","title":"FluxBox ontour","type":"blog"},{"content":"Nachdem ich ja letzens gemeckert habe, aber leider nicht ohne Mathe-Software im Studium auskomme, habe ich mich wieder dem Problem Scilab und Open-JDK zu gewandt. Leider ohne eine nennenswerte Verbesserung. Also blieb mir nur die Variante VirtualBox oder eben was anderes. Letzteres hat sich dann diese Woche als sehr komfortabel herausgestellt und trägt den Namen Octave. Auswertung einer Leistungsmessung mit Octave In der Grundausstattung kommt octave recht schlicht als Kommandointerpreter und ohne GUI daher.Â Allerdings gibt es dort auch Projekte wie kOctave oder QtOctave, welche sich diesem Problem annehmen. Interessanterweise wird standardmäßig GNUPlot für die Ausgabe der Graphen verwendet, womit ich ja schon recht gute Erfahrungen machen konnte. Ein Problem war allerdings noch zu lösen. Bei der Ausgabe in Bildformate wie PNG oder JPEG meckerte octave bzgl. einiger fehlender Schriftarten. Deshalb sollten folgende Werte innerhalb der Shellumgebung gesetzt bzw. die Standardeinstellungen von octave erweitert werden. In der .bashrc\n1 2 export GDFONTPATH=\u0026#34;/usr/share/fonts/msfonts\u0026#34; ## Achtung Pfad anpassen\u0026lt;/pre\u0026gt; und in der .octaverc :\n1 2 set(0,\u0026#39;defaulttextfontname\u0026#39;,\u0026#39;verdana\u0026#39;); %% Schriftnamen anpassen Danach sollte der Export nach PNG/JPEG problemlos funktionieren.\n","date":"29. Januar 2009","externalUrl":null,"permalink":"/blog/octave-alternative-zu-scilab-ist-gefunden/","section":"Blogs","summary":"Nachdem ich ja letzens gemeckert habe, aber leider nicht ohne Mathe-Software im Studium auskomme, habe ich mich wieder dem Problem Scilab und Open-JDK zu gewandt. Leider ohne eine nennenswerte Verbesserung. Also blieb mir nur die Variante VirtualBox oder eben was anderes. Letzteres hat sich dann diese Woche als sehr komfortabel herausgestellt und trägt den Namen Octave. Auswertung einer Leistungsmessung mit Octave In der Grundausstattung kommt octave recht schlicht als Kommandointerpreter und ohne GUI daher.Â Allerdings gibt es dort auch Projekte wie kOctave oder QtOctave, welche sich diesem Problem annehmen. Interessanterweise wird standardmäßig GNUPlot für die Ausgabe der Graphen verwendet, womit ich ja schon recht gute Erfahrungen machen konnte. Ein Problem war allerdings noch zu lösen. Bei der Ausgabe in Bildformate wie PNG oder JPEG meckerte octave bzgl. einiger fehlender Schriftarten. Deshalb sollten folgende Werte innerhalb der Shellumgebung gesetzt bzw. die Standardeinstellungen von octave erweitert werden. In der .bashrc\n","title":"Octave - Alternative zu Scilab ist gefunden","type":"blog"},{"content":"","date":"29. Januar 2009","externalUrl":null,"permalink":"/tags/scilab/","section":"Tags","summary":"","title":"Scilab","type":"tags"},{"content":"Vor gut 2 Jahren bekam ich, gemäß meines Wunschzettels, zu Weihnachten eine USB-AVR-Experimentierplatine der Firma myAVR mitsamt dem kleinen USB-Prommer mySmarUSB. Beides hat mich bisher tatkräftig im Programieren von ATMELs kleinen Mikrocontrollern unterstützt und bisher auch immer fehlerfrei gearbeitet. Der Prommer wirkt dabei als RS232-zu-USB-Umsetzer und läuft daher auch problemlos unter Windows und Linux. Nachdem Komplettumstieg auf Linux, war eine schnelle Umstellung von WinAVR zu KontrollerLab als Entwicklungsumgebung notwendig, was auch kein größeres Problem darstellte. Da ich natürlich alle Funktionen, Daten-/Programmiermodus und Resetfunktionen, des Prommers nutzen wollte musste ich leider feststellen, dass das Programm myQuickprog leider nicht unter Linux lauffähig war. Sicherlich hätte man mit wine emulieren können, jedoch erscheint mir das eher halbherzig. Im myAVR-Forum fand ich dann ein kleines Python-Skript das einen schnellen Wechsel der Betriesmodi erlaubt.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/usr/bin/python # -*- coding: iso-8859-15 -*- import serial import sys # Kotrollsequenz gemäß technischer Beschreibung von mySmartUSB controlseq = \u0026#39;xe6xb5xbaxb9xb2xb3xa9\u0026#39; if (len(sys.argv) == 1): print \u0026#39;Usage: progswitch.py mode \u0026#39; print \u0026#39;tp : Programming mode\u0026#39; print \u0026#39;td : Data mode\u0026#39; else: ser = serial.Serial(\u0026#39;/dev/ttyUSB0\u0026#39;, 19200, timeout=1) ser.write(controlseq + sys.argv[1]) Kleines Manko am Rande, es funktioniert bei mir nur auf dem Laptop, beim Desktop regt sich nix. Also blieb nur eines, das Skript auf eine Hochsprache zu portieren! Gesagt getan, da ich mich so oder so in die Programmierung der seriellen Schnittstelle unter Linux einarbeiten wollte, habe ich das Skript nach C portiert. Das resultierende Programm „progswitch“ verfügt über Argumentswitches für die jeweiligen Modis und erlaubt das angeben eines Interfaces. In etwa sieht das Ganze dann so aus:\n1 progswitch -d -i/ttyUSB0 Wobei d : Datenmode und :i Interfacedarstellen und i zwangsweise vorhanden sein muss. Sollte jemand auf die Idee kommen zwei Modis anzugeben, so wird immer der letzte ausgewertet und behandelt. Unter Fedora habe ich zusätzlich eine udev-Policy erstellt, die die Schnittstelle automatisch mit den Rechten 666, also lesen und schreiben für alle erstellt und nur die Sillicon Labs RS232-Konverter behandelt. „Für etwaigen Schäden übernehme ich keine Gewähr oder Haftung. Sollte etwas an eurem System oder eurer Hardware beschädigt werden, so geschieht das Nutzen des Programms und der hier dargestellten Informationen auf eigene Gefahr!“\nProgswitch C-Programm\n","date":"22. Januar 2009","externalUrl":null,"permalink":"/blog/progswitch-fuer-mysmartusb-unter-linux/","section":"Blogs","summary":"Vor gut 2 Jahren bekam ich, gemäß meines Wunschzettels, zu Weihnachten eine USB-AVR-Experimentierplatine der Firma myAVR mitsamt dem kleinen USB-Prommer mySmarUSB. Beides hat mich bisher tatkräftig im Programieren von ATMELs kleinen Mikrocontrollern unterstützt und bisher auch immer fehlerfrei gearbeitet. Der Prommer wirkt dabei als RS232-zu-USB-Umsetzer und läuft daher auch problemlos unter Windows und Linux. Nachdem Komplettumstieg auf Linux, war eine schnelle Umstellung von WinAVR zu KontrollerLab als Entwicklungsumgebung notwendig, was auch kein größeres Problem darstellte. Da ich natürlich alle Funktionen, Daten-/Programmiermodus und Resetfunktionen, des Prommers nutzen wollte musste ich leider feststellen, dass das Programm myQuickprog leider nicht unter Linux lauffähig war. Sicherlich hätte man mit wine emulieren können, jedoch erscheint mir das eher halbherzig. Im myAVR-Forum fand ich dann ein kleines Python-Skript das einen schnellen Wechsel der Betriesmodi erlaubt.\n","title":"Progswitch für mySmartUSB unter Linux","type":"blog"},{"content":"Wie hier beschrieben, lässt sich ein Touchpad der Firma Synaptics relativ leicht unter Linux konfigurieren. Dort musste einfach die xorg.conf um den Eintrag erweitert werden. Leider ist das mit der automatischen Konfiguration des XOrg-Servers nicht mehr so einfach. Man hat zwei Möglichkeiten, entweder man erzeugt extra für diese Option eine neue xorg.conf oder aber man aktiviert diese Option in den Richtlinien für die automatische Konfiguration der Eingabegeräte.\n1 Option \u0026#34;SHMConfig\u0026#34; \u0026#34;true\u0026#34; Dies ist durch das Editieren der Datei „10-synaptics.fdi“ welche im Verzeichnis “ /usr/share/hal/fdi/policy/20thirdparty“ zu finden sein sollte. Ändern muss man in diesem Fall nicht sonderlich viel, nur eine einzige Zeile einfügen:\n1 \u0026lt;merge key=\u0026#34;input.x11_options.SHMConfig\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;false\u0026lt;/merge\u0026gt; Damit die Datei dann folgendermaßen ausschaut :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 \u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;ISO-8859-1\u0026#34;?\u0026gt; \u0026lt;deviceinfo version=\u0026#34;0.2\u0026#34;\u0026gt; \u0026lt;device\u0026gt; \u0026lt;match key=\u0026#34;info.capabilities\u0026#34; contains=\u0026#34;input.touchpad\u0026#34;\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_driver\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;synaptics\u0026lt;/merge\u0026gt; \u0026lt;!-- Switch off shared memory to close a security hole --\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.SHMConfig\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;false\u0026lt;/merge\u0026gt; \u0026lt;!-- Enable tap-to-click --\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.TapButton1\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;1\u0026lt;/merge\u0026gt; \u0026lt;!-- Enable double-tap. This seems to be a bug in the synaptics driver. Supplying 0 to MaxDoubleTapTime results in best double-tap experience, rather against the manpage. --\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.MaxDoubleTapTime\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;0\u0026lt;/merge\u0026gt; \u0026lt;!-- Enable vertical / horizental scrolling when dragging along the right / bottom edge --\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.VertEdgeScroll\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;true\u0026lt;/merge\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.HorizEdgeScroll\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;true\u0026lt;/merge\u0026gt; \u0026lt;match key=\u0026#34;/org/freedesktop/Hal/devices/computer:system.hardware.vendor\u0026#34; contains=\u0026#34;Acer\u0026#34;\u0026gt; \u0026lt;match key=\u0026#34;/org/freedesktop/Hal/devices/computer:system.hardware.product\u0026#34; prefix=\u0026#34;AOA110\u0026#34;\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.FingerLow\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;9\u0026lt;/merge\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.FingerHigh\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;12\u0026lt;/merge\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.FingerPress\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;69\u0026lt;/merge\u0026gt; \u0026lt;/match\u0026gt; \u0026lt;/match\u0026gt; \u0026lt;!-- To add custom options for the touchpad, modify the examples below to suit your needs. The available options are listed in the \u0026#34;synaptics\u0026#34; man page. After modifyfing this file, you must restart HAL. Check the output of lshal whether your modifications have been merged successfully. Note: Options must always be type \u0026#34;string\u0026#34;. The following examples enable left, right, middle clicks on single, double, triple finger tapping, respectively. \u0026lt;merge key=\u0026#34;input.x11_options.TapButton1\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;1\u0026lt;/merge\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.TapButton2\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;3\u0026lt;/merge\u0026gt; \u0026lt;merge key=\u0026#34;input.x11_options.TapButton3\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;2\u0026lt;/merge\u0026gt; Enable vertical scrolling when dragging with two fingers anywhere on the touchpad \u0026lt;merge key=\u0026#34;input.x11_options.VertTwoFingerScroll\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;true\u0026lt;/merge\u0026gt; Enable horizontal scrolling when dragging with two fingers anywhere on the touchpad \u0026lt;merge key=\u0026#34;input.x11_options.HorizTwoFingerScroll\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;true\u0026lt;/merge\u0026gt; If on, circular scrolling is used \u0026lt;merge key=\u0026#34;input.x11_options.CircularScrolling\u0026#34; type=\u0026#34;string\u0026#34;\u0026gt;true\u0026lt;/merge\u0026gt; --\u0026gt; \u0026lt;/match\u0026gt; \u0026lt;/device\u0026gt; \u0026lt;/deviceinfo\u0026gt; ","date":"11. Januar 2009","externalUrl":null,"permalink":"/blog/synaptics-unter-fedorra-10/","section":"Blogs","summary":"Wie hier beschrieben, lässt sich ein Touchpad der Firma Synaptics relativ leicht unter Linux konfigurieren. Dort musste einfach die xorg.conf um den Eintrag erweitert werden. Leider ist das mit der automatischen Konfiguration des XOrg-Servers nicht mehr so einfach. Man hat zwei Möglichkeiten, entweder man erzeugt extra für diese Option eine neue xorg.conf oder aber man aktiviert diese Option in den Richtlinien für die automatische Konfiguration der Eingabegeräte.\n","title":"Synaptics unter Fedorra 10","type":"blog"},{"content":"Also eigentlich bin ich ja ein Freund von freier Software und kann mich auch recht schnell damit anfreunden, wenn es Probleme gibt oder es eventuell das ein oder andere Problem gibt, das erst gelöst werden muss bevor man die Software benutzen kann. Aber bei manchen Sachen kapituliere ich dann doch oder starte jetzt einfach mal einen Aufruf zu Hilfe. Die Rede ist von der freien Software Scilab, die erst kürzlich in Version 5.0.3 erschienen ist. Das Programm ist eine echt Matlab-Alternative, besonders wenn man eh nur an der Oberfläche kratzt und mal eben hier und da Gleichungssysteme lösen will oder schnell einen Graph braucht. Für letzteres hat mir zwar bisher GnuPlot in Verbindung mit Python recht gute Dienste geleistet, aber langsam geht es ans Eingemachte.\nAber kommen wir zum Thema :\nDie Binary für Linux bekomme ich einfach nicht zum Plotten. Im Netz wird oft von leeren Graphen gesprochen, allerdings sind meine komplett schwarz und nicht leer. Versuche mir das Ding selbst zu Übersetzen sind bisher immer gescheitert. Selbst die alte ScilabGTK Variante in version 4.2 kann nur unter Suns JRE plotten, wobei dann aber Funktionslegenden nicht funktionieren.\nAlso falls jemand eine Lösung parat hat, dann bitte melden. Momentan benutze ich eine XP Pro (eine Orginal-Lizenz) in einer VM und mache dort meine Plots. Funkioniert zwar, aber ist echt nervig.\n","date":"17. November 2008","externalUrl":null,"permalink":"/blog/probleme-mit-scilab/","section":"Blogs","summary":"Also eigentlich bin ich ja ein Freund von freier Software und kann mich auch recht schnell damit anfreunden, wenn es Probleme gibt oder es eventuell das ein oder andere Problem gibt, das erst gelöst werden muss bevor man die Software benutzen kann. Aber bei manchen Sachen kapituliere ich dann doch oder starte jetzt einfach mal einen Aufruf zu Hilfe. Die Rede ist von der freien Software Scilab, die erst kürzlich in Version 5.0.3 erschienen ist. Das Programm ist eine echt Matlab-Alternative, besonders wenn man eh nur an der Oberfläche kratzt und mal eben hier und da Gleichungssysteme lösen will oder schnell einen Graph braucht. Für letzteres hat mir zwar bisher GnuPlot in Verbindung mit Python recht gute Dienste geleistet, aber langsam geht es ans Eingemachte.\n","title":"Probleme mit Scilab","type":"blog"},{"content":"Des Öfteren kommt es einem während des Studiums unter, dass man Messwerte grafisch darstellen soll/muss. Allerdings nicht nur für Laborprotokolle sondern auch für das allgemeine Verständnis stellen diese Verläufe eine wertvolle Hilfe dar. Wer nicht immer gleich zu den Riesen der mathematischen Programme wie Matlab von Mathworks, Scilab usw. greifen möchte, kann dafür auch genauso gut GNUPlot benutzen. GNUPlot selbst, stellt schon sehr viele Funktionen bereit um allerlei GnuPlot Grundkurs FU Berlin grafisches Zeugs zu erstellen, aber in Verbindung mit einer Skriptsprache wie Python ist es nahezu unschlagbar. Da ich erst neulich für einen Grundlagenversuch eine Alternative zum Zeichnen einer Diodenkennlinie suchte, hab ich das Skript hier geschrieben. Es ist natürlich sehr rudimentär, aber erlaubt das Beschriften der Achsen und die Angabe einer Datei mit Messwerten die wie folgt aufgebaut ist.\nX-Wert Y-Wert Spannung Strom Wobei zwischen den einzelnen Elementen jeweils ein Tabulator als Trennzeichen zu setzen ist. Nach dem Durchlaufen des Skripts, wird der Graph per GnuPlot dargestellt und eine PNG-Datei mit dem Namen der Messwertdatei erstellt.\nGNUPlot Ausgabe Prinzipiell war es das schon. Wenn man das Skript ausführbar macht (chmod u+x) und in das bin-Verzeichnis seines Benutzer legt (sollte natürlich auch im $PATH sein), dann brauch man den Pfad der Messwerte nicht jedesmal angeben, aber das weiß bestimmt jeder.\nPython Skript zum Plotten von Kennlinien\nAllgemein ist der Aufruf mit Shell-Argumenten so aufgebaut:\n1 Kennlinie.py Messwertdatei X-Achsen-Bezeichnung Y-Achsen-Bezeichnung ","date":"12. November 2008","externalUrl":null,"permalink":"/blog/messwerte-schnell-mit-gnuplot-und-python-plotten/","section":"Blogs","summary":"Des Öfteren kommt es einem während des Studiums unter, dass man Messwerte grafisch darstellen soll/muss. Allerdings nicht nur für Laborprotokolle sondern auch für das allgemeine Verständnis stellen diese Verläufe eine wertvolle Hilfe dar. Wer nicht immer gleich zu den Riesen der mathematischen Programme wie Matlab von Mathworks, Scilab usw. greifen möchte, kann dafür auch genauso gut GNUPlot benutzen. GNUPlot selbst, stellt schon sehr viele Funktionen bereit um allerlei GnuPlot Grundkurs FU Berlin grafisches Zeugs zu erstellen, aber in Verbindung mit einer Skriptsprache wie Python ist es nahezu unschlagbar. Da ich erst neulich für einen Grundlagenversuch eine Alternative zum Zeichnen einer Diodenkennlinie suchte, hab ich das Skript hier geschrieben. Es ist natürlich sehr rudimentär, aber erlaubt das Beschriften der Achsen und die Angabe einer Datei mit Messwerten die wie folgt aufgebaut ist.\n","title":"Messwerte schnell mit GnuPlot und Python plotten","type":"blog"},{"content":"Wie alles im Leben ist manches hilfreich, aber anderes ist gut gemeint und scheinbar auch sinnvoll aber nervt dann doch mehr oder weniger. Beim Laptop ist dies unter anderem ein schlecht konfiguriertes Synaptics Touchpad. Dabei stört mich persönlich eigentlich nur, dass ein schnelles Tippen als Mausklick interpretiert wird, was schon das ein oder andere Mal zu einem ungewollten Seitenbesuch geführt hat. Dabei stieß ich beim „googeln“ mehr oder weniger zufällig auf GSynaptics.\nGSynaptics 1 Option \u0026#34;SHMConfig\u0026#34; \u0026#34;true\u0026#34; Das Einzige was zu beachten, ist die Option, die in der xorg.conf gesetzt sein muss. Damit ist GSynaptics in der Lage, über das kleine Tool synclient, mit dem Treiber zu kommunizieren und jeder Benutzer kann seine eigenen Einstellungen hinterlegen.\nUnter Fedora wird das Frontend mit einem:\n1 yum install gsynaptics installiert.\n","date":"15. Oktober 2008","externalUrl":null,"permalink":"/blog/gsynaptics-synaptics-touchpad-konfigurieren/","section":"Blogs","summary":"Wie alles im Leben ist manches hilfreich, aber anderes ist gut gemeint und scheinbar auch sinnvoll aber nervt dann doch mehr oder weniger. Beim Laptop ist dies unter anderem ein schlecht konfiguriertes Synaptics Touchpad. Dabei stört mich persönlich eigentlich nur, dass ein schnelles Tippen als Mausklick interpretiert wird, was schon das ein oder andere Mal zu einem ungewollten Seitenbesuch geführt hat. Dabei stieß ich beim „googeln“ mehr oder weniger zufällig auf GSynaptics.\n","title":"GSynaptics Synaptics Touchpad konfigurieren","type":"blog"},{"content":"","date":"6. Juni 2008","externalUrl":null,"permalink":"/tags/acer/","section":"Tags","summary":"","title":"Acer","type":"tags"},{"content":"ACPI ist ja mehr oder weniger eine Windows-Domaine. Fast alle Notebookhersteller setzen auf den ACPI-Compiler von Microsoft, der sich leider, wie so oft, nicht an den ACPI 3.0 Standard hält und daher immense Probleme unter anden Betriebssystemen verursachen kann.Probleme wie zum Beispiel das nicht korrekte Auslesen des Akkukapazität, Setzen der Prozessorstufen oder die temperaturabhängige Steuerung des CPU-Lüfters sind dabei fast schon Alltag.\nDa mir momentan die hohe CPU-Temperatur meines Intel Centrinos sehr auf die Nerven geht und ich schon auf niedrigster Takstufe mit aktiviertem Undervolting (kleiner als 0,7 V geht nicht und durch den FSB gehts auch nur bis 800 MHz runter) arbeite ist das Ganze mehr als ärgerlich. Als ich den Laptop Ende letzen Jahres bezüglich Touchpad und Tastatur einschickte, wurde seitens des Supports kein Fehler festgestellt und auch das „Rück-Rüsten“ auf eine kleiner Festplatte etc. half nichts, Temperatur unverändert.\nNach dem Wiki-Eintrag auf UbuntuUsers zum Thema Lüftersteuerung probierte ich natürlich LM-Sensors aus und hielt mich an die dort gut beschriebene Anleitung. Leider vergebens. Zwar wurder der Intel ICH6 Controller erkannt, jedoch bringt der leider nicht viel,\ndenn der Lüfter hängt da garnicht dran. Der Lüfter wird nämlich per ACPI gesteuert !\nFunktioniert ja alles ganz gut, unter Windows.\nAlso wurde kurzerhand recherchiert und es fand sich, ebenfalls bei UbuntuUsers eine Anleitung wie man die DSDT des Rechners ausliest und auf Fehler überprüft.\nErgebnis waren dann 3 Standardfehler und 6 Warnings, wobei die Errors schon mit der Anleitung lösbar waren und bei den Warnings handelte es sich einfach nur um die Schusseligkeit des Autors, der hatte nicht alle Zustände innerhalb seiner Abfragen geprüft und daher hatten einige Methoden unter Umständen keine Rückgabewerte.\nDSDT üersetzt und an den Kernel weitergegeben und siehe da, der Lüfter lässt sich zwar nicht regeln, aber verrichtet normal seinen Dienst. Sprich er geht an und aus. Zwar soll man via aceracpi, einem bereits integriertem Kernelmodul, noch LEDs usw steuern und diverse Registerwerte wie Temperatur, W-LAN und Bluetoothzustand auslesen können. Aber irgendwie funzt das noch nicht wie es soll, aber wenigstens ist die DSDT fehlerfrei und eine Störgröße ist somit ausgegrenzt.\n","date":"6. Juni 2008","externalUrl":null,"permalink":"/blog/aspire-3628-acpi-fix/","section":"Blogs","summary":"ACPI ist ja mehr oder weniger eine Windows-Domaine. Fast alle Notebookhersteller setzen auf den ACPI-Compiler von Microsoft, der sich leider, wie so oft, nicht an den ACPI 3.0 Standard hält und daher immense Probleme unter anden Betriebssystemen verursachen kann.Probleme wie zum Beispiel das nicht korrekte Auslesen des Akkukapazität, Setzen der Prozessorstufen oder die temperaturabhängige Steuerung des CPU-Lüfters sind dabei fast schon Alltag.\n","title":"Acer Aspire 3628 ACPI Fix","type":"blog"},{"content":"","externalUrl":null,"permalink":"/tags/acoustics/","section":"Tags","summary":"","title":"Acoustics","type":"tags"},{"content":" Einleitung # Das vorgestellte Projekt implementiert die verallgemeinerte Punktquellensynthese für akustische Quellen. Der numerische Teil ist in Cython umgesetzt, parallelisiert und läuft in 2D oder 3D. Der Code wurde zur Berechnung von Schallfeldern beliebiger akustischer Quellen verwendet.\nAktuell werden folgende Geometrien unterstützt:\nKreisförmig, eben, Rechteckig, ebene, Kugelförmig gekrümmt, kreisförmig, Kugelförmig gekrümmt, rechteckig. Beispiele # Dieser Beispielabschnitt ist in drei Unterabschnitte unterteilt: \u0026ldquo;Einfach\u0026rdquo;, \u0026ldquo;Phased-Array\u0026rdquo; und \u0026ldquo;Fortgeschritten\u0026rdquo;.\nEinfach # Der Abschnitt „einfach“ behandelt Einzelwandler mit verschiedenen Geometrien (rechteckig und kreisförmig) sowie gekrümmte Einzelwandler (kugelförmig gekrümmte kreisförmige und rechteckige Quellen), da diese in der Ultraschallprüfung sehr verbreitet sind.\nKreisförmige Quellen # Kreisförmige Quellen sind bei planaren Wandlern und/oder Lautsprechern sehr verbreitet. Der vollständige Beispielcode für beide Ausbreitungsebenen findet sich im Repository. Da ein Kreis symmetrisch ist, ist auch das resultierende Schallfeld symmetrisch, das heißt die Laufzeit aller Elementarwellen zum aktuellen Punkt der Berechnung ist identisch. Man könnte also aufgrund der Symmetrie auf die Berechnung der zweiten Ebene und auf das dreidimensionalen Schallfelds verzichten da die Ergebnisse für die XZ- und YZ-Ebene identisch sind.\nCode und Erklärung der wichtigsten Schritte: # Zuerst müssen wir einige Parameter definieren, wie die Mittenfrequenz \\(f_m\\) und die Schallgeschwindigkeit \\(c\\) des Ausbreitungsmediums.\n1 2 3 4 5 # Mittenfrequenz der Pulsquelle fm = 250e3 c = 343 # Räumliche Auflösung (sollte mindestens ein Fünftel der Wellenlänge betragen) ds = (c / fm) / 5 Im nächsten Schritt definieren wir den Berechnungsbereich und erstellen unser zweidimensionales Rechengitter.\n1 2 3 4 5 6 7 8 9 10 X = np.arange(-20e-3, 20e-3, ds) Y = np.arange(-20e-3, 20e-3, ds) Z = np.arange(0, 200e-3, ds) # Gitter erstellen Xmesh, Zmesh = np.meshgrid(X, Z) Ymesh = np.zeros(Xmesh.shape) # Resultierendes Druckfeld p = np.zeros(shape=Ymesh.shape, dtype=np.double) Da wir eine kreisförmige Quelle modellieren möchten, können wir die integrierte Funktion BuildCircularSource verwenden, die nur den Radius und die räumliche Auflösung benötigt. Der folgende Code definiert einen Radius von 10 mm und gewichtet jedes Berechnungselement.\n1 2 3 4 5 6 7 8 9 10 11 12 # Akustische Quelle erstellen Xs, Ys, Zs = GPSS.BuildCircularSource(ds, 10e-3) # Amplitudengewichtung I0 = 1 / Xs.size # Berechnung des resultierenden zweidimensionalen komplexen Feldes Is = np.ones(Xs.shape) * I0 # Jedes Berechnungselement hat die gleiche Phasenabhängigkeit, # was einem Feld aus Nullen entspricht. Phs = np.zeros(Xs.shape) Damit sind wir bereit, die Berechnung auszuführen. # Berechnung starten p = GPSS.run_calc_2d(Xs, Ys, Zs, Phs, fm, Xmesh, Ymesh, Zmesh, Is) 2D Schallfeld der XZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle. Rechteckige Quellen # Rechteckige Quellen unterscheiden sich darin, dass die Laufzeit der Elementarpunkte eines Kreises auf der Wandleroberfläche, bezogen auf einen beliebigen Fixpunkt, nicht mehr gleich sind. Oder anders ausgedrückt es einen Unterschied in der Phase existiert. Das führt wiederum zu Interferenzeffekten, die mit der Kantenlänge korreliert. Die unmittelbare Folge daraus ist die Existenz von zwei akustischen Fokus-/Brennpunkten. Das Ganze kann natürlich simuliert werden.\n2D Schallfeld der XZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle. 2D Schallfeld der YZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle. Kreisförmige und sphärisch gekrümmte Quellen # Vergleicht man die Ergebnisse der kreisförmigen und rechteckigen Quellen und bedient sich der Idee der Laufzeitunterschiede, so ist es möglich die Lage des akustischen Fokus-/Brennpunktes zu beeinflussen. Diese Beeinflussung kann passiv, durch Krümmung der Fläche, oder aktiv durch mehrere Wandler und eine unabhängig Ansteuerung dieser erreicht werden. Bei der passiven Methode werden die Flächen sphärisch oder zylindrisch gekrümmt. Ein Beispiel für die sphärische Krümmung:\n2D Schallfeld der XZ-Ebene. Z ist die X-Achse und der Abstand von der Quelle. Phased-Array # „Phased-Array“ führt Wandler ein, die aus mehreren Quellen bestehen. Das Anregungssignal jedes Elements kann phasenverschoben zu seinem Nachbarelement sein. Dadurch sind Strahlschwenkung, aktive Fokussierung oder beides gleichzeitig möglich.\nFortgeschritten # \u0026ldquo;Fortgeschritten\u0026rdquo; umfasst alle weiteren Anwendungen. Da die Implementierung das Schallfeld in drei Dimensionen berechnen kann, sind auch dreidimensionale Simulationen für Probleme ohne Symmetrielösungen möglich. Zudem ist der Code in der Lage, thermo-akustische Quellen zu simulieren.\n","externalUrl":null,"permalink":"/projects/python/gpss-acoustic-sources/","section":"Projekte","summary":"Einleitung # Das vorgestellte Projekt implementiert die verallgemeinerte Punktquellensynthese für akustische Quellen. Der numerische Teil ist in Cython umgesetzt, parallelisiert und läuft in 2D oder 3D. Der Code wurde zur Berechnung von Schallfeldern beliebiger akustischer Quellen verwendet.\n","title":"Akustische Punktquellensynthese","type":"projects"},{"content":"","externalUrl":null,"permalink":"/tags/angular/","section":"Tags","summary":"","title":"Angular","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/ansible/","section":"Tags","summary":"","title":"Ansible","type":"tags"},{"content":" Warum # Beruflich muss ich oft eine SOAP-API bedienen, um beispielsweise Testdaten einzupflegen oder Ähnliches. Das sind natürlich repetitive Aufgaben, die automatisiert gehören. Da ich für viele Systeme Ansible benutze, habe ich mich entschieden, ein Ansible-Modul zu schreiben, das diese Aufgaben für mich in Zukunft erledigt.\nHinweis Dieses Modul kapselt SOAP-Requests so, dass sie sich wie native Ansible-Tasks anfühlen. Ideal für Testdaten-Setup, Stammdatenpflege oder einfache Integrationen.\nFeatures # \u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e hufschlaeger.soap_client soap client module for Ansible collection 294 1.0.1 GPL-2.0-or-later api soap requests client testing 🚿 SOAP-Requests mit minimalem YAML ✅ Response-Validierung (Statuscode und Body) 🧾 Header-Unterstützung (z. B. Content-Type, Auth) 🔁 SOAP 1.1 und 1.2 🧭 Namespace- und Prefix-Support 🌳 Frei wählbares Body-Root-Tag 🧩 Body bequem als Dictionary definierbar 🎯 SOAP-Action-Support ⏱️ Timeout-Handling 🔐 SSL/Cert-Validierung Voraussetzungen # Ansible installiert (\u0026gt;= 2.12) Python 3.10+ Installation # Repository klonen: git clone https://github.com/hufschlaeger/ansible-soap Das Modul soap_request.py in euren library/-Ordner des Playbooks legen oder als Collections-Module einbinden. Minimalbeispiel # 1 2 3 4 5 6 7 8 9 10 11 12 13 - hosts: localhost gather_facts: false tasks: - name: Einfacher SOAP-Call soap_request: endpoint_url: \u0026#34;https://example.org/service\u0026#34; body_root_tag: \u0026#34;Ping\u0026#34; namespace: \u0026#34;https://example.org/ns\u0026#34; body_dict: message: \u0026#34;Hello\u0026#34; register: result - debug: var=result Weitere Beispiele # Den kennen bestimmt alle, die mit SOAP arbeiten und erste Tests machen wollten.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 --- - name: Test CountryInfoService hosts: localhost gather_facts: false tasks: - name: \u0026#34;Get Country Name by ISO Code\u0026#34; soap_request: endpoint_url: \u0026#34;http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso\u0026#34; soap_action: \u0026#34;\u0026#34; body_dict: sCountryISOCode: \u0026#34;DE\u0026#34; body_root_tag: \u0026#34;CountryName\u0026#34; namespace: \u0026#34;http://www.oorsprong.org/websamples.countryinfo\u0026#34; namespace_prefix: \u0026#34;web\u0026#34; soap_version: \u0026#34;1.1\u0026#34; headers: Content-Type: \u0026#34;text/xml; charset=utf-8\u0026#34; validate_certs: yes timeout: 30 register: result - name: Show CountryInfoService Result debug: msg: - \u0026#34;Status: {{ result.status_code }}\u0026#34; - \u0026#34;Response: {{ result.body }}\u0026#34; - \u0026#34;Success: {{ result.success }}\u0026#34; Der Service konvertiert Zahlen in ausgeschriebene Wörter (also aus 200 wird zweihundert).\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 --- - name: Test NumberToDollars hosts: localhost gather_facts: false tasks: - name: \u0026#34;Number to Dollars\u0026#34; soap_request: endpoint_url: \u0026#34;https://www.dataaccess.com/webservicesserver/NumberConversion.wso\u0026#34; soap_action: \u0026#34;\u0026#34; body_dict: dNum: \u0026#34;1234.56\u0026#34; body_root_tag: \u0026#34;NumberToDollars\u0026#34; namespace: \u0026#34;http://www.dataaccess.com/webservicesserver/\u0026#34; namespace_prefix: \u0026#34;ns\u0026#34; soap_version: \u0026#34;1.1\u0026#34; headers: Content-Type: \u0026#34;text/xml; charset=utf-8\u0026#34; validate_certs: yes timeout: 30 register: result - name: Show NumberToDollars Result debug: msg: - \u0026#34;Status: {{ result.status_code }}\u0026#34; - \u0026#34;Response: {{ result.body }}\u0026#34; - \u0026#34;Success: {{ result.success }}\u0026#34; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 --- - name: Test SOAP Module hosts: localhost gather_facts: false tasks: - name: Test NumberToWords Service soap_request: endpoint_url: \u0026#34;https://www.dataaccess.com/webservicesserver/NumberConversion.wso\u0026#34; soap_action: \u0026#34;\u0026#34; body_dict: ubiNum: 500 body_root_tag: \u0026#34;NumberToWords\u0026#34; namespace: \u0026#34;http://www.dataaccess.com/webservicesserver/\u0026#34; namespace_prefix: \u0026#34;ns\u0026#34; soap_version: \u0026#34;1.1\u0026#34; headers: Content-Type: \u0026#34;text/xml; charset=utf-8\u0026#34; validate_certs: yes register: result - name: Show NumberToWords Result debug: msg: - \u0026#34;Status: {{ result.status_code }}\u0026#34; - \u0026#34;Response: {{ result.body }}\u0026#34; - \u0026#34;Success: {{ result.success }}\u0026#34; Tipps \u0026amp; Hinweise # Für viele öffentliche Demoservices ist 1.1 die sichere Wahl. Bei 1.2 ändert sich oft der Content-Type (z. B. application/soap+xml). validate_certs: yes ist Standard. Bei selbstsignierten Zertifikaten kann das scheitern – nur zu Testzwecken no setzen. Lange laufende Services mit timeout absichern, damit Playbooks nicht hängen. ","externalUrl":null,"permalink":"/projects/devops/ansible-soap-module/","section":"Projekte","summary":"Warum # Beruflich muss ich oft eine SOAP-API bedienen, um beispielsweise Testdaten einzupflegen oder Ähnliches. Das sind natürlich repetitive Aufgaben, die automatisiert gehören. Da ich für viele Systeme Ansible benutze, habe ich mich entschieden, ein Ansible-Modul zu schreiben, das diese Aufgaben für mich in Zukunft erledigt.\n","title":"Ansible Module für SOAP Requests","type":"projects"},{"content":"","externalUrl":null,"permalink":"/tags/cli/","section":"Tags","summary":"","title":"Cli","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/fhem/","section":"Tags","summary":"","title":"FHEM","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/gitlab/","section":"Tags","summary":"","title":"Gitlab","type":"tags"},{"content":"Wer mehrere GitLab-Projekte betreut, kennt das Problem: Man möchte auf einen Blick sehen, wie es um Pipeline-Laufzeiten, offene Issues oder Deployment-Häufigkeiten steht – am besten ohne sich jedes Mal durch die GitLab-Oberfläche klicken zu müssen. Exportiert man die Daten manuell, ist das zeitaufwendig und fehleranfällig. Dashboards in GitLab selbst sind nett, aber oft zu wenig flexibel, wenn man Metriken über mehrere Projekte hinweg aggregieren oder eigene KPIs definieren möchte.\nGenau hier setzt der GitLab Metrics Collector an.\ndhufe/gitlab-metrics-collector 📊 A metrics scraper for Gitlab Go 0 0 Die Idee # Die Grundidee ist denkbar einfach: Ein kleiner Go-Service läuft täglich als Kubernetes CronJob, spricht die GitLab-API an, sammelt die relevanten Rohdaten und berechnet daraus KPIs. Diese werden anschließend in einer PostgreSQL-Datenbank abgelegt, die wiederum als Datasource für Grafana dient. So entsteht ein vollständiges Monitoring-Setup, das sich nahtlos in bestehende Kubernetes- Infrastrukturen einfügt und keinerlei manuellen Aufwand erfordert.\nDas Ergebnis: Ein Grafana-Dashboard, das täglich aktuell zeigt, wie es um Pipeline-Performance, Issue-Entwicklung, Deployment-Frequenz und weitere Metriken der eigenen GitLab-Projekte steht.\nGesagt, getan. Das hier vorgestellte Projekt ist genau das und bietet folgende Funktionen ✨:\n📊 Automatisches Sammeln von GitLab-Metriken über die GitLab API 🗄️ Speicherung der Rohdaten und berechneten KPIs in einer PostgreSQL-Datenbank 📈 Nahtlose Integration mit Grafana als Visualisierungsschicht ⏰ Kubernetes-nativer Betrieb via CronJobs für tägliche Datenerfassung 🔔 Benachrichtigungen über Collection-Runs via Apprise 🐳 Multi-Stage Docker-Build für ein schlankes Container-Image ⚙️ Flexible Konfiguration via config.yaml 🧰 Lokale Entwicklungsumgebung mit docker-compose oder podman-compose 🤖 Task-Automatisierung via just Architektur # Das Projekt folgt dem Ports-\u0026amp;-Adapters-Muster (auch bekannt als Hexagonale Architektur) und ist klar in drei Schichten unterteilt:\nDomain # Der Kern des Projekts enthält die Datenmodelle und Interfaces – vollständig unabhängig von externen Bibliotheken oder Frameworks. Hier wird definiert, was eine Metrik ist und welche Operationen darauf möglich sind. Diese Schicht ändert sich nur, wenn sich die fachlichen Anforderungen ändern.\nApplication # Die Applikationsschicht orchestriert die Use Cases: Sie koordiniert das Abrufen der Rohdaten aus GitLab, die Berechnung der KPIs und das Speichern in der Datenbank. Sie kennt nur die Interfaces der Domain – nicht deren konkrete Implementierungen. Das macht sie vollständig testbar, ohne dass eine echte Datenbankverbindung oder ein echter GitLab-Zugang nötig ist.\nInfrastructure # Hier leben die konkreten Implementierungen: der GitLab-API-Client, das PostgreSQL-Repository inklusive Migrations und der Apprise-Notification-Client. Diese Schicht kann ausgetauscht oder erweitert werden, ohne die Kern- oder Applikationslogik zu berühren. Neue Metriken lassen sich so einfach hinzufügen, indem man einen neuen Collector in der Infrastructure-Schicht implementiert.\nKonfiguration # Die Konfiguration erfolgt über eine config.yaml-Datei. Hier werden die GitLab-Instanz-URL, der Personal Access Token sowie die zu überwachenden Projekte definiert. Für jeden CronJob-Run wird außerdem Apprise als Notification-Service angebunden, sodass man bei erfolgreicher oder fehlgeschlagener Datenerfassung direkt benachrichtigt wird – ob per E-Mail, Slack, Matrix oder einem der vielen anderen von Apprise unterstützten Dienste.\nBeispielkonfigurationen für beide Dateien liegen im examples/-Verzeichnis und können als Ausgangspunkt genutzt werden.\nLokale Entwicklung # Für die lokale Entwicklung gibt es einen vollständigen docker-compose-Stack, der PostgreSQL, Apprise und den Collector gemeinsam startet. Wer just installiert hat, kann den gesamten Workflow – von der initialen Konfiguration bis zum Start des Stacks – mit wenigen Befehlen erledigen:\n1 2 3 just bootstrap # Konfigurationsdateien vorbereiten just up # Stack starten just down # Stack stoppen Alternativ funktioniert natürlich auch der klassische Weg über podman-compose oder docker-compose direkt.\nDeployment in Kubernetes # Der Collector ist von Grund auf für den Betrieb in Kubernetes konzipiert. Ein CronJob sorgt dafür, dass die Metriken einmal täglich automatisch gesammelt werden – ohne manuelle Eingriffe. Das Container-Image wird über einen schlanken Multi-Stage-Build erstellt: Kompiliert wird mit golang:alpine, das finale Image basiert auf einem minimalen alpine-Image und enthält nur das fertige Binary.\nVisualisierung mit Grafana # Die gesammelten Daten lassen sich direkt als PostgreSQL-Datasource in Grafana einbinden. So entstehen Dashboards, die auf einen Blick zeigen, wie es um Pipeline-Performance, Issue-Entwicklung oder Deployment-Frequenz steht – vollständig anpassbar und ohne manuellen Exportaufwand. Gerade bei mehreren Projekten oder Teams entsteht so ein wertvolles Werkzeug für regelmäßige Reviews oder einfach für den täglichen Überblick.\nFür mich hat sich das Tool bereits in mehreren Projekten bewährt und gibt mir täglich einen schnellen Überblick über den Zustand meiner GitLab-Projekte. Wer ähnliche Workflows hat, ist herzlich eingeladen, es auszuprobieren und gerne auch beizutragen – Issues und Merge Requests sind willkommen!\n","externalUrl":null,"permalink":"/projects/golang/gitlab-metrics-collector/","section":"Projekte","summary":"Wer mehrere GitLab-Projekte betreut, kennt das Problem: Man möchte auf einen Blick sehen, wie es um Pipeline-Laufzeiten, offene Issues oder Deployment-Häufigkeiten steht – am besten ohne sich jedes Mal durch die GitLab-Oberfläche klicken zu müssen. Exportiert man die Daten manuell, ist das zeitaufwendig und fehleranfällig. Dashboards in GitLab selbst sind nett, aber oft zu wenig flexibel, wenn man Metriken über mehrere Projekte hinweg aggregieren oder eigene KPIs definieren möchte.\n","title":"GitLab Metrics Collector","type":"projects"},{"content":"Da ich in meiner täglichen Arbeit regelmäßig mit GitLab-Releases und deren Artefakten zu tun habe, kenne ich das Problem nur zu gut: Man möchte schnell und reproduzierbar ein bestimmtes Release-Artefakt herunterladen – sei es in einem CI-Job, einem Skript oder einfach auf der Kommandozeile. Der GitLab-Browser ist dafür umständlich, und ein generisches curl-Kommando wird bei projekt-spezifischen URL-Strukturen schnell unhandlich. Ein kleines, dediziertes CLI-Tool wäre also genau das Richtige.\nhufschlaeger/gitlab-downloader SImple gitlab downloader written in go. Go 0 0 Dazu kommt, dass GitLab-Releases je nach Projekt sehr unterschiedlich aufgebaut sein können: Mal sind es CI-Job- Artefakte, mal Upload-Links, mal schlicht die Quellcode-Archive. Ein Tool, das diese verschiedenen Formate kennt und automatisch das Richtige tut, spart auf Dauer eine Menge Zeit. Gesagt, getan. Das hier vorgestellte Projekt ist genau das und bietet folgende Funktionen ✨:\n📦 Download von Release-Artefakten und Quellcode-Archiven direkt über die GitLab API 🔗 Intelligente URL-Erkennung: CI-Job-Artefakte, Upload-Links und Quell-Archive werden automatisch erkannt und korrekt aufgelöst 🎯 Optionale Auswahl des Quellformats per -ext Flag (zip, tar.gz, tar.bz2, tar) ⚙️ Flexible Konfiguration: CLI-Flags oder Umgebungsvariablen (GITLAB_URL, GITLAB_TOKEN, HTTPS_PROXY) 🔒 Proxy-Unterstützung via Flag oder Umgebungsvariable 📊 Fortschrittsanzeige während des Downloads 🐳 Docker-Support – inklusive minimalem scratch-Image 🧪 Vollständige, hermetische Unit-Test-Suite (kein Netzwerk, kein echtes Dateisystem) 🧰 Cross‑platform builds für Linux, macOS und Windows Architektur # Das Projekt folgt dem Ports-\u0026amp;-Adapters-Muster (auch bekannt als Hexagonale Architektur), was die Testbarkeit deutlich vereinfacht. Die Kernlogik in internal/core/services/release_service.go kennt keine konkreten HTTP-Clients oder Dateisystem-Operationen – diese werden stattdessen als Interfaces injiziert und in Tests einfach durch Mocks ersetzt.\n1 2 3 4 5 6 7 8 9 10 cmd/gitlab-downloader/ ← Einstiegspunkt internal/ core/ domain/ ← Domänenobjekte ports/ ← Interfaces (driven \u0026amp; driving) services/ ← Geschäftslogik adapters/ primary/cli/ ← CLI-Flags \u0026amp; Konfiguration secondary/gitlab/ ← GitLab API Adapter secondary/http/ ← HTTP Download \u0026amp; Datei-Adapter Natürlich ich Ports \u0026amp; Adapters ziemliches Overenginneering für so ein kleines Tool, aber so kann man das super üben und auch einmal Vor- und Nachteile veranschaulichen.\nVerwendung # Das Tool lässt sich nach einem einfachen go build direkt nutzen:\n1 2 3 4 5 6 ./gitlab-downloader \\ -gitlab-url https://gitlab.com \\ -token \u0026#34;$GITLAB_TOKEN\u0026#34; \\ -project group/project \\ -release v1.2.3 \\ -out ./artifact.zip Für Releases mit mehreren Quellformaten lässt sich das gewünschte Format per Index auswählen – etwa tar.gz statt des Standard-Zips:\n1 ./gitlab-downloader -t \u0026#34;$GITLAB_TOKEN\u0026#34; -p group/proj -r v1.0.0 -ext 1 -o src.tar.gz Und natürlich funktioniert der Download auch hinter einem Proxy:\n1 2 HTTPS_PROXY=http://proxy.local:8080 \\ ./gitlab-downloader -t \u0026#34;$GITLAB_TOKEN\u0026#34; -p group/proj -r v1.0.0 -o out.zip Nutzung als Buildimag mit Podman # Für den Einsatz in CI-Pipelines oder containerisierten Umgebungen gibt es zwei Dockerfiles: eines auf Alpine-Basis und eines mit einem minimalen scratch-Image, das nur das statisch gelinkte Binary enthält:\n1 podman build -f Dockerfile.scratch -t gitlab-downloader:latest . Genutzt werden kann das image dann:\n1 2 3 4 5 docker run --rm \\ -e GITLAB_TOKEN=YOUR_TOKEN \\ -v \u0026#34;$PWD\u0026#34;:/data \\ gitlab-downloader:latest \\ -project group/project -release v1.2.3 -out /data/artifact.zip Für mich hat sich das Tool bereits in mehreren Projekten bewährt und spart mir täglich ein paar Handgriffe. Wer ähnliche Workflows hat, ist herzlich eingeladen, es auszuprobieren und gerne auch beizutragen – Issues und Merge Requests sind willkommen!\n","externalUrl":null,"permalink":"/projects/golang/gitlab-release-downloader/","section":"Projekte","summary":"Da ich in meiner täglichen Arbeit regelmäßig mit GitLab-Releases und deren Artefakten zu tun habe, kenne ich das Problem nur zu gut: Man möchte schnell und reproduzierbar ein bestimmtes Release-Artefakt herunterladen – sei es in einem CI-Job, einem Skript oder einfach auf der Kommandozeile. Der GitLab-Browser ist dafür umständlich, und ein generisches curl-Kommando wird bei projekt-spezifischen URL-Strukturen schnell unhandlich. Ein kleines, dediziertes CLI-Tool wäre also genau das Richtige.\n","title":"GitLab Release Downloader","type":"projects"},{"content":"Da ich beruflich wie privat viel mit Gitlab arbeite, verwalte ich damit natürlich auch alle Softwareprojekte. Aber meine täglichen Aufgaben verwalte ich in der Regel aber mit Todoist und weder möchte ich private Aufgaben im beruflichen Gitlab haben, noch möchte ich alles von Hand eintragen müssen. Meist habe ich daher in Todoist ein Projekt, wo ich nur spärlich Aufgaben eintrage. Daher wäre ein Todoist-Exporter wirklich klasse.\nhufschlaeger/gitlab-tasks-exporter Export GitLab issues into either a Markdown report or sync it directly into Todoist as tasks Go 0 0 Weiterhin ist es gerade in Meetings, die Milestones betreffen, hilfreich, sich vorab und während des Meetings Notizen zu einzelnen Issues machen zu können. Notizen mache ich in der Regel in einem Markdown-Dokument, insofern wäre auch ein Markdown-Exporter Klasse.\nGesagt, getan. Das hier vorgestellte Projekt ist genau das und bietet folgende Funktionen ✨:\n📄 Export der GitLab issues in eine Markdowndatei fürs Reporting oder den vereinfachten Austausch ✅ Direkter Export der GitLab issues nach Todoist über deren API 🎯 Optionales Filtern nach Milestones ⚙️ Flexible Konfiguration: CLI flags oder Umgebungsvariablen oder einfach eine .env Datei 🐞 Verbose mode fürs Troubleshooting 🧰 Natürlich Cross‑platform builds via Makefile (Linux, macOS, Windows) ","externalUrl":null,"permalink":"/projects/golang/gitlab-todoist-exporter/","section":"Projekte","summary":"Da ich beruflich wie privat viel mit Gitlab arbeite, verwalte ich damit natürlich auch alle Softwareprojekte. Aber meine täglichen Aufgaben verwalte ich in der Regel aber mit Todoist und weder möchte ich private Aufgaben im beruflichen Gitlab haben, noch möchte ich alles von Hand eintragen müssen. Meist habe ich daher in Todoist ein Projekt, wo ich nur spärlich Aufgaben eintrage. Daher wäre ein Todoist-Exporter wirklich klasse.\n","title":"Gitlab-Todoist-Exporter","type":"projects"},{"content":"","externalUrl":null,"permalink":"/tags/golang/","section":"Tags","summary":"","title":"Golang","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/grafana/","section":"Tags","summary":"","title":"Grafana","type":"tags"},{"content":" Angaben bzgl. Kontakt/Impressum gemäß § 5 TMG # Mit folgenden Informationen sollte es möglich sein mich zu erreichen:\nDaniel Hufschläger geb. Kotschate\nEidechsenweg 1b\n14641 Wustermark OT Elstal\n+49 03323 4915123\nE-Mail: info \u0026lt; at \u0026gt;hufschlaeger \u0026lt; dot \u0026gt; \u0026lt; net \u0026gt;\nHaftungsausschluss (Disclaimer) # Quelle: eRecht24\nHaftung für Inhalte # Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.\nHaftung für Links # Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.\nUrheberrecht # Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.\nQuelle: eRecht24\nDatenschutz # Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben.\nWir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.\nDer Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.\nQuelle: eRecht24\n","externalUrl":null,"permalink":"/impressum/","section":"Daniel Hufschläger","summary":"Angaben bzgl. Kontakt/Impressum gemäß § 5 TMG # Mit folgenden Informationen sollte es möglich sein mich zu erreichen:\n","title":"Impressum","type":"page"},{"content":"","externalUrl":null,"permalink":"/tags/physics/","section":"Tags","summary":"","title":"Physics","type":"tags"},{"content":" Einleitung # Bei der Entwicklung einer neuen Version unserer Heizungssteuerung habe ich mich mit mehreren Ideen auseinandergesetzt, wie dem Entwurf einer neuen Mikrocontroller-PCB, der Verwendung eines ESPXY-Geräts oder der luxuriösesten Lösung mit einem Raspberry Pi Board. Alle drei Lösungen bieten unterschiedliche Grade an Leistung, Aufwand und Möglichkeiten für weitere Ideen. In der Vergangenheit habe ich mehrere Monate damit verbracht, mit selbst entworfenen AVR-Mikrocontroller-Boards zu experimentieren. Diese Boards kommunizieren und interagieren über ein selbst konstruiertes ISM1-Netzwerk, und ich kann stolz sagen: „Seit ich sie installiert habe, haben sie die ganze Zeit funktioniert.“\nDie Hardware ist sehr einfach: Eine selbst entworfene Stromversorgung, ein Arduino Duemilanove mit einem einfachen Shield (von Hand gelötet und unter Verwendung herumliegender Teile) und eine Relaiskarte. Für das Frontend verwende ich FHEM2 und eine Reihe modifizierter und selbst geschriebener Module.\nThe reasons why # Die Tage werden kürzer und auch kälter. Die Arduino-basierte Lösung funktioniert sehr gut, solange wir den Deckel nicht auf das Gehäuse setzen. Es gibt kein Problem mit der Steuerung selbst, aber das Gehäuse dämpft das RF-Signal. Daher habe ich in einigen Fällen Signal- und Paketverluste festgestellt. Übrigens ist die elektrische Installation nicht besonders gut, es gäbe also reichlich Aufgaben. Jede Möglichkeit, die bestehende Einrichtung zu ändern, würde denselben Aufwand an Zeit und Geld erfordern wie das Investieren von etwas Zeit in die Erstellung einer neuen, zuverlässigeren Lösung mit Raum für einige zusätzliche, aber derzeit unnötige Verbesserungen.\nIn der letzten Woche habe ich mich mit der Idee beschäftigt, ein UniPi-Board zu kaufen. Leider bin ich stark in Bezug auf Platz eingeschränkt, sodass das UniPi nicht passen würde, und ich habe mich entschieden, etwas Freizeit (gesammelte Überstunden) für den Entwurf der neuen Steuerung zu verwenden.\nDer Neuentwurf basiert auf einem Raspberry Pi 3 und einem B+ HAT3. Das HAT selbst war die Hauptaufgabe, da der hochintegrierte Embedded-PC mit vielen netten Features ausgestattet ist. Zum Beispiel mit onboard Ethernet- und Wireless-LAN4-Controller und muss nur mit etwas Elektronik erweitert werden. In meinem Fall bedeutet das, dass ich eine Art GPIO5-Erweiterung entwerfen muss, wie ein Port-Expanding-Gerät.\nBoard on E-CAD software Die PCB wurde am 1. Dezember bestellt und ist derzeit auf dem Versandweg zu mir. Es ist also Zeit, die benötigten Teile zu sammeln.\nBord preview on OSH Bill of Materials (BOM) # Menge Referenz(en) Beschreibung Value / Spezifikation Deviceset Device Technology / MPN (falls angegeben) 1 IC1 Stift- oder Buchsenleiste - RASPBERRY_PI_B+-HAT -WITH-DF Official HAT-konform 1 IC2 Port Expander (z.B. für I/O) MCP23008P - - - 1 IC3 EEPROM (I²C, für HAT-Detection) 24C32A 24* P C32A (z.B. 24C32A) 1 IC4 High-Side Driver UDN2981A UDN298* A 1 8 IO1 bis IO8 LED (Chip-LED) - LED CHIPLED_0805 - 3 24V, 5V, 3V3 LED (Chip-LED, Status-Anzeige) - LED CHIPLED_0805 - 18 R1 bis R18 Widerstand Versch. (z.B. 220Ω, 1k, 12k) R-EU_ R0805 - 1 RN1 Widerstandsnetzwerk 1k G08R - - 2 C1, C2 Kondensator 100nF C-EU C0805 - 1 Q1 Transistor oder Schalt-Element - - - - 1 OUT Terminal Block (9-polig) - AK500/9 - - 11 GND1 bis GND11 Ground-Symbol (Layout-Element) - GND - - 3 P+1, P+2, P+3 Supply-Symbol (+24V, +5V, +3V3) - +*V - - 4 +3V1 bis +3V4 Supply-Symbol (+3V3) - +3V3 - - 1 WP Jumper (für Write-Protect) - JP1Q - - Raspberry Pi konfigurieren # Da es sich um ein HAT handelt, müssen wir die zweiten I2C-Schnittstelle aktivieren. Dazu wird einfach in der config.txt die folgende Zeile ergänzt oder abgeändert.\n1 dtparam=i2c_arm=on und nach einem Neustart des Systems sollte das zur Verfügung stehen.\nIndustrial, Scientific and Medical\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nFreundliche Hausautomatisierung und Energie-Messung\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nHardware attached on top\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nLocal area network\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nGeneral purpose input and output\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","externalUrl":null,"permalink":"/projects/electronics/portexpander-hat-for-rpi/","section":"Projekte","summary":"Einleitung # Bei der Entwicklung einer neuen Version unserer Heizungssteuerung habe ich mich mit mehreren Ideen auseinandergesetzt, wie dem Entwurf einer neuen Mikrocontroller-PCB, der Verwendung eines ESPXY-Geräts oder der luxuriösesten Lösung mit einem Raspberry Pi Board. Alle drei Lösungen bieten unterschiedliche Grade an Leistung, Aufwand und Möglichkeiten für weitere Ideen. In der Vergangenheit habe ich mehrere Monate damit verbracht, mit selbst entworfenen AVR-Mikrocontroller-Boards zu experimentieren. Diese Boards kommunizieren und interagieren über ein selbst konstruiertes ISM1-Netzwerk, und ich kann stolz sagen: „Seit ich sie installiert habe, haben sie die ganze Zeit funktioniert.“\n","title":"Port expanding HAT for the Raspberry Pi","type":"projects"},{"content":"","externalUrl":null,"permalink":"/tags/postgresql/","section":"Tags","summary":"","title":"Postgresql","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/programming/","section":"Tags","summary":"","title":"Programming","type":"tags"},{"content":"Hier ist eine kurze Auflistung von Projekten, an denen ich mitgewirkt habe oder gerade arbeite. Schau dich ruhig um.\n","externalUrl":null,"permalink":"/projects/","section":"Projekte","summary":"Hier ist eine kurze Auflistung von Projekten, an denen ich mitgewirkt habe oder gerade arbeite. Schau dich ruhig um.\n","title":"Projekte","type":"projects"},{"content":"","externalUrl":null,"permalink":"/tags/rust/","section":"Tags","summary":"","title":"Rust","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/simulation/","section":"Tags","summary":"","title":"Simulation","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/soap/","section":"Tags","summary":"","title":"Soap","type":"tags"},{"content":"Wer Taskwarrior kennt, weiß: Es ist eines der mächtigsten Task-Management-Tools überhaupt – aber eben ein CLI-Tool. Für den schnellen Überblick am Rechner funktioniert das hervorragend, aber spätestens wenn man unterwegs mal eben eine Aufgabe nachschlagen oder hinzufügen möchte, stößt man an die Grenzen des Terminals. Eine moderne Web-Oberfläche, die sich nahtlos in das bestehende Taskwarrior-Ökosystem einfügt, gab es bislang nicht wirklich – also warum nicht selbst eine bauen?\nSo entstand Taskchampion-Web: Ein vollständiges Full-Stack-Projekt, das Taskwarrior und die neuere Taskchampion-Bibliothek mit einer modernen Web-Oberfläche verbindet.\ndhufe/taskchampion-web Rust 0 0 🚀 Eine Live-Demo ist unter tcweb-demo.d3v0.de erreichbar! user: test@example.com password: password123\nDie Idee # Taskchampion ist die moderne Rust-basierte Bibliothek, die als Kern des zukünftigen Taskwarrior dient. Sie übernimmt das lokale Speichern, Synchronisieren und Verwalten von Tasks – inklusive Ende-zu-Ende-Verschlüsselung und einem eigenen Sync-Protokoll. Das Ziel von Taskchampion-Web ist es, auf dieser soliden Basis eine vollständige Web-Applikation bereitzustellen, die sowohl für den Heimserver als auch für den eigenen VPS geeignet ist – vollständig self-hosted, ohne Cloud-Abhängigkeiten.\nDas Ergebnis ist eine Anwendung mit folgenden Funktionen ✨:\n🖥️ Moderne Angular-basierte Web-Oberfläche zur Aufgabenverwaltung ⚙️ Go-Backend für Businesslogik, Benutzerverwaltung und API 🦀 Rust-Middleware für die direkte Taskchampion-Integration mit E2E-Verschlüsselung 🔄 Eingebauter Taskchampion Sync-Server für geräteübergreifende Synchronisation 🗄️ Unterstützung von PostgreSQL und SQLite als Datenbank 🐳 Vollständiges Docker-Compose-Setup für einfaches Deployment 🔐 Ende-zu-Ende-Verschlüsselung der Taskdaten über die Rust-Middleware Architektur # Das Projekt ist bewusst in spezialisierte, voneinander unabhängige Services aufgeteilt – jeder mit einer klar definierten Verantwortung.\nFrontend – Angular # Die Web-Oberfläche ist eine moderne Single-Page-Application auf Basis von Angular. Sie kommuniziert ausschließlich mit dem Go-Backend und bietet eine übersichtliche Oberfläche zum Erstellen, Bearbeiten, Filtern und Abschließen von Aufgaben. Das Interface orientiert sich dabei an den gewohnten Konzepten von Taskwarrior: Projekte, Tags, Prioritäten und Fälligkeiten sind selbstverständlich vorhanden.\nBackend – Go (Gin) # Das Backend ist ein in Go geschriebener API-Server auf Basis des Gin-Frameworks. Es übernimmt die Benutzerverwaltung, Authentifizierung und die gesamte Businesslogik. Außerdem dient es als Schnittstelle zwischen dem Frontend und der Rust-Middleware – und abstrahiert dabei die Komplexität der Taskchampion-Interna vollständig hinter einer sauberen REST-API.\nMiddleware – Rust # Das Herzstück des Projekts ist die Rust-Middleware. Sie interagiert direkt mit der Taskchampion-Bibliothek, verwaltet den lokalen Task-Speicher und stellt einen RESTful-Endpunkt bereit. Die gesamte Ende-zu-Ende-Verschlüsselung der Taskdaten läuft über diese Schicht – die Tasks verlassen die Middleware niemals unverschlüsselt in Richtung Datenbank oder Netzwerk.\nSync Server # Ein eingebetteter Taskchampion Sync-Server ermöglicht es, Tasks über mehrere Clients hinweg zu synchronisieren – etwa zwischen dem Webbrowser, einem Desktop-Client und der klassischen Taskwarrior-CLI. Der Server implementiert das offizielle Taskchampion-Sync-Protokoll und ist vollständig kompatibel mit bestehenden Taskwarrior-Installationen.\nDatenbank # Je nach Einsatzszenario kann zwischen PostgreSQL für den Produktivbetrieb und SQLite für leichtgewichtige Installationen gewählt werden. Die Konfiguration erfolgt einfach über die .env-Datei.\nDeployment # Für alle drei Hauptkomponenten stehen fertige Container-Images auf der GitHub Container Registry (GHCR) bereit – ein lokales Bauen der Images ist also nicht notwendig:\n1 2 3 ghcr.io/dhufe/tcweb-frontend:dev ghcr.io/dhufe/tcweb-backend:dev ghcr.io/dhufe/tcweb-middleware:dev Das gesamte Setup lässt sich damit mit einem einzigen docker-compose up -d starten, ohne vorher irgendetwas kompilieren zu müssen. Alle Services – Frontend, Backend, Middleware, Sync-Server und Datenbank – werden über eine zentrale docker-compose.yml orchestriert. Natürlich kann man auch einen bestehenden Sync-Server nutzen, aber fürs Ausprobieren würde ich es nicht unbedingt empfehlen. Die Konfiguration erfolgt über eine einfache .env-Datei, die auf dem mitgelieferten env-sample basiert:\n1 2 3 cp env-sample .env # .env mit eigenen Werten befüllen podman-compose up -d Nach dem Start ist die Anwendung sofort erreichbar:\nFrontend: http://localhost:4200 Backend API: http://localhost:8090 Middleware API: http://localhost:3001 Wer sich vorher einen Eindruck verschaffen möchte, kann die öffentliche Live-Demo unter tcweb-demo.d3v0.de ausprobieren – kein eigenes Setup erforderlich (Credentials siehe oben).\nTechnologie-Mix # Was dieses Projekt besonders macht, ist der bewusste Einsatz unterschiedlicher Technologien – jede dort, wo sie ihre Stärken hat:\nGo für schnelle, stabile und einfach zu deployende API-Server Rust für performante, sichere Systemintegration mit der Taskchampion-Bibliothek Angular für eine moderne, reaktive Web-Oberfläche PostgreSQL/SQLite für flexible, bewährte Datenpersistenz Das Ergebnis ist ein System, das sich wie ein nativer Teil des Taskwarrior-Ökosystems anfühlt – nur eben mit einer komfortablen Web-Oberfläche obendrauf.\nWer Taskwarrior liebt, aber sich manchmal eine grafische Oberfläche wünscht: Taskchampion-Web könnte genau das Richtige sein. Issues, Feedback und Merge Requests sind herzlich willkommen!\n","externalUrl":null,"permalink":"/projects/golang/taskchampion-web/","section":"Projekte","summary":"Wer Taskwarrior kennt, weiß: Es ist eines der mächtigsten Task-Management-Tools überhaupt – aber eben ein CLI-Tool. Für den schnellen Überblick am Rechner funktioniert das hervorragend, aber spätestens wenn man unterwegs mal eben eine Aufgabe nachschlagen oder hinzufügen möchte, stößt man an die Grenzen des Terminals. Eine moderne Web-Oberfläche, die sich nahtlos in das bestehende Taskwarrior-Ökosystem einfügt, gab es bislang nicht wirklich – also warum nicht selbst eine bauen?\n","title":"Taskchampion-Web","type":"projects"},{"content":"","externalUrl":null,"permalink":"/tags/taskwarrior/","section":"Tags","summary":"","title":"Taskwarrior","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/todoist/","section":"Tags","summary":"","title":"Todoist","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/typescript/","section":"Tags","summary":"","title":"Typescript","type":"tags"}]