bitstream time
AC_CONFIG_FILES([])
-AC_CONFIG_FILES([software/bsi-grundschutz.org:software/bsi-grundschutz.org])
+AC_CONFIG_FILES([software/bsi-grundschutz.org:software/bsi-grundschutz.org
+ software/bsi-grundschutz-thumb.png:software/bsi-grundschutz-thumb.png])
:FEEDSTATUS:
-(("https://rollenspiel.social/@ArneBab/114510888078131952" t
- "a015e136b9227ad9eae167dcbfb90c3bb1f8886e")
- ("https://rollenspiel.social/@ArneBab/114513960911270308" t
- "04f50102d24762515bfed1847f2c2370d8eacfd6")
- ("https://rollenspiel.social/@ArneBab/114515952663275691" t
- "4532a1fa4af0850e287b55dc5a2bb4c6aaa290b2")
- ("https://rollenspiel.social/@ArneBab/114517249269342319" t
- "40c5c0beef7ba0d56c8d40fe099dd84b11d2a2f9")
- ("https://rollenspiel.social/@ArneBab/114517351401151946" t
- "38635e4a47e962bdf7eddc2753ba4aac1d53200b")
- ("https://rollenspiel.social/@ArneBab/114517512241566537" t
- "37bbc359f05659bbe8af7bf6b031b2ee7976db20")
- ("https://rollenspiel.social/@ArneBab/114517716492883564" t
- "a162d52b60dca029e0e86d84b1d6be42d6070ec1")
- ("https://rollenspiel.social/@ArneBab/114518870806149249" t
- "197499496ea02a2208086529395cd2beb0c3809f")
- ("https://rollenspiel.social/@ArneBab/114537003141685392" t
- "f4d68e0dd925d8b22da025637fb03ca243511034")
- ("https://rollenspiel.social/@ArneBab/114538719419903658" t
- "872a6addb3256349aa7a3ccdf5abb2e51f2e2627")
- ("https://rollenspiel.social/@ArneBab/114539036654081594" t
- "5abb695f730b8a8a2c3065ba3210a46a5ac256a8")
- ("https://rollenspiel.social/@ArneBab/114539311345808896" t
+(("https://rollenspiel.social/@ArneBab/114539311345808896" t
"b3cd65066116b861e38827d3c16a931c261cdbd8")
("https://rollenspiel.social/@ArneBab/114542124586179343" t
"71a5e3f9ec872e5eb7c73ec0c297ddc391dff190")
("https://rollenspiel.social/@ArneBab/114555571446102468" t
"4fc73bddb8b9615fcdef9bcbf4fe6ab9dd9c3048")
("https://rollenspiel.social/@ArneBab/114555972996531535" t
- "4eee861dd1f899aab1fbfdb104998989f0373961"))
+ "4eee861dd1f899aab1fbfdb104998989f0373961")
+ ("https://rollenspiel.social/@ArneBab/114561695111743214" t
+ "1d446ee8e5b3d6371eb18110403b68bc7f2ac47e")
+ ("https://rollenspiel.social/@ArneBab/114565134810837199" t
+ "302042daf58cf307222293b017d109eefec2c7c4")
+ ("https://rollenspiel.social/@ArneBab/114567243711501791" t
+ "d5cfc182163e2858f76b4d9f34949e345a311450")
+ ("https://rollenspiel.social/@ArneBab/114574292682998181" t
+ "63662aac78b4ec650b74a48a9d3c00b5decf2b74")
+ ("https://rollenspiel.social/@ArneBab/114586950733326290" t
+ "d940c7e3007a90ac9f529a1f0c499b0f6b1d6a31")
+ ("https://rollenspiel.social/@ArneBab/114589966932382468" t
+ "ea996347aceb7004751b2b6056eb00b9699684dc")
+ ("https://rollenspiel.social/@ArneBab/114590066047181741" t
+ "60758eaa1ec6af09d3de882cdc8a2f93ab862c01")
+ ("https://rollenspiel.social/@ArneBab/114590089968394608" t
+ "d21877e85a29ccadde692938dfb1abc4ae5f6be0")
+ ("https://rollenspiel.social/@ArneBab/114593528266076228" t
+ "f8bcac54db055c3d6bd3eb8da693662d5b5fbc7a")
+ ("https://rollenspiel.social/@ArneBab/114607412525537840" t
+ "08712820029b278b0e3a721befdecefc49e7b7d4")
+ ("https://rollenspiel.social/@ArneBab/114608531703863487" t
+ "b4af0683397c1cb219abca1172944c88978eba80"))
:END:
+** [2025-06-01 So 14:16]
+ "einfach bei der Wahrheit bleiben" -- Danke! Ich wünschte, das wäre
+Standard.
+
+Es gibt schon genug, bei dem die Wahrheit schwer herauszufinden ist,
+da müssen nicht noch bewusst irreführende Aussagen verbreitet werden.
+
+
+https://www.youtube.com/watch?v=___jShI1aSs
+
+ [[https://rollenspiel.social/@ArneBab/114608531703863487]]
+
+
+** [2025-06-01 So 09:32]
+ »Umgekehrt kann Wissen über Reichtum auch nützlich sein, um gängige
+Erzählungen zu entkräften. Etwa jene, „dass alles den Bach
+runtergeht“, sagt Bornefeld. „Das geben die Zahlen der großen
+Familienunternehmen überhaupt nicht her.“ Zwar gebe es einige
+Branchen, vor allem energieintensive wie die Automobil- und die
+Chemiebranche, die krankten. „Aber dem Rest geht es sehr, sehr gut.“
+Die Gewinne der meisten Firmen seien noch immer sehr viel höher als in
+der Vor-Corona-Zeit.«
+
+https://www.deutschlandfunk.de/ungleichheit-vermoegenssteuer-vermoegensverteilung-superreiche-daten-100.html
+
+ [[https://rollenspiel.social/@ArneBab/114607412525537840]]
+
+
+** [2025-05-29 Do 22:41]
+ DerDara feiert Ricarda Lang:
+https://www.youtube.com/watch?v=Rl2Yc8KL-Wo
+
+
+#politik
+
+ [[https://rollenspiel.social/@ArneBab/114593528266076228]]
+
+
+** [2025-05-29 Do 08:06]
+ (setq dired-vc-rename-file t)
+
+
+https://xenodium.com/emacs-git-rename-courtesy-of-dired
+
+ [[https://rollenspiel.social/@ArneBab/114590089968394608]]
+
+
+** [2025-05-29 Do 08:00]
+ https://invent.kde.org/teams/eco/opt-green/-/blob/master/materials/leaflets/DE/kde-eco-umweltfestival-flyer-DE_final.jpg
+
+ [[https://rollenspiel.social/@ArneBab/114590066047181741]]
+
+
+** [2025-05-29 Do 07:35]
+ https://endof10.org/
+
+ [[https://rollenspiel.social/@ArneBab/114589966932382468]]
+
+
+** [2025-05-28 Mi 18:48]
+ Claude 4: KI zeigt GEFÄHRLICHES und "SPIRITUELLES" Verhalten
+
+
+https://www.youtube.com/watch?v=0tSwDjhhWs8
+
+
+🌠
+
+ [[https://rollenspiel.social/@ArneBab/114586950733326290]]
+
+
+** [2025-05-26 Mo 13:09]
+ " I make all my videos using #Linux. Here's how."
+
+https://www.youtube.com/watch?v=PEFqdqRr18E
+
+ [[https://rollenspiel.social/@ArneBab/114574292682998181]]
+
+
+** [2025-05-25 So 07:16]
+ Freefall is awesome again:
+
+http://freefall.purrsia.com/ff4300/fc04221.htm
+
+ [[https://rollenspiel.social/@ArneBab/114567243711501791]]
+
+
+** [2025-05-24 Sa 22:20]
+ When I started publishing my #bestthingtoday sketches,¹ the lead
+singer of Saltatio Mortis had just played in a fantasy RPG videogame
+songs about that game.
+
+
+Today a dozen artists are publishing songs about tabletop #roleplaying
+and Video Games from #bg3 to #Warhammer 40k.
+
+
+As horrible as the current time is, there are flares of hope from
+people who light up reality by creating beautiful art about the things
+they love - regardless of how freakish they may seem.
+
+
+¹ https://www.draketo.de/kreatives/best-thing-today#2022-08
+
+ [[https://rollenspiel.social/@ArneBab/114565134810837199]]
+
+
+** [2025-05-24 Sa 07:45]
+ simple commandline flag parsing template (getopts without values):
+
+https://www.draketo.de/software/shell-tricks#commandline-options-flag-template
+
+
+#bash programming shell gnu freesoftware
+
+ [[https://rollenspiel.social/@ArneBab/114561695111743214]]
+
+
** [2025-05-23 Fr 07:30]
"Compatibility with CMake < 3.5 has been removed from CMake."
[[https://rollenspiel.social/@ArneBab/114539311345808896]]
-** [2025-05-20 Di 07:43]
- De-Orchestrating #Hyphanet with the QUEEN program:
-
-https://www.draketo.de/politik/de-orchestrating
-
-
-Sadly still relevant today, in many contexts.
-
- [[https://rollenspiel.social/@ArneBab/114539036654081594]]
-
-
-** [2025-05-20 Di 06:22]
- I uploaded "My best thing today" in #sketchnotes for april to may
-2025:
-
-
-https://www.draketo.de/kreatives/best-thing-today#2025-05
-
-
-In one I finally cracked the necromancy of Thay ☺
-
-Do you spot the new color I added to my brush pens?
-
-
-Please boost! I’m publishing these with some hope that others may
-start #bestthingtoday sketchnotes: it’s a great way to build and
-strengthen positive memories.
-
-
-(for a description, see the ALT text)
-
-
-#ink art BaldursGate3
-
- [[https://rollenspiel.social/@ArneBab/114538719419903658]]
-
-
-** [2025-05-19 Mo 23:06]
- KI-Training auf KI-Ausgaben kan generationenübergreifenden
-Langzeitspeicher liefern.
-
-
-https://www.draketo.de/politik/kommentare#ki-langzeitspeicher-training
-
-
-Die KI-Version von Ken Thompsons "Trusting Trust" Trojan Attack ☺
-
- [[https://rollenspiel.social/@ArneBab/114537003141685392]]
-
-
-** [2025-05-16 Fr 18:14]
- Reviewing AI-generated tests is damn tiring. The AI doesn’t tire from
-repetition, but my brain does. Fast.
-
-
-And different from repetition from using a template, I have to worry
-about subtle errors that can appear anywhere.
-
- [[https://rollenspiel.social/@ArneBab/114518870806149249]]
-
-
-** [2025-05-16 Fr 13:21]
- Irdorath - Sunrise (Live in Berlin 2025)
-
-https://www.youtube.com/watch?v=3zcy4TypCtg
-
-
-#music Irdorath FreeIrdorath
-
- [[https://rollenspiel.social/@ArneBab/114517716492883564]]
-
-
-** [2025-05-16 Fr 12:29]
- Wie Sicherheit nicht funktioniert:
-
-
-"reason: nssBadCert"
-
-
-⇒ sts certificate error.
-
-
-Und ja, es läuft in Chrome, mit dem ich vorher nie auf der Seite war.
-
-
-Hat aber ein neues Zertifikat.
-
-
-https://portal.dnb.de/
-
- [[https://rollenspiel.social/@ArneBab/114517512241566537]]
-
-
-** [2025-05-16 Fr 11:48]
- @BlumeEvolution hast du Lesetipps für politisch durchdachten
-Solarpunk?
-
- [[https://rollenspiel.social/@ArneBab/114517351401151946]]
-
-
-** [2025-05-16 Fr 11:22]
- Sehr schöne Rede von Jun:
-
-"Du willst opfern, was Deutschland erfolgreich macht, nur damit es
-paar Migranten schlechter geht?"
-
-https://www.youtube.com/watch?v=xuTQSLIuoho
-
-
-#politik AfDVerbotJetzt
-
- [[https://rollenspiel.social/@ArneBab/114517249269342319]]
-
-
-** [2025-05-16 Fr 05:52]
- Exposing The Flaw In Our Phone System
-
-https://www.youtube.com/watch?v=wVyu7NB7W6Y
-
-
-#privacy
-
- [[https://rollenspiel.social/@ArneBab/114515952663275691]]
-
-
-** [2025-05-15 Do 21:26]
- > "While some consider that only human created works should be able to
-clear the threshold of originality, there are nevertheless other
-voices asking for copyright or similar legal protections over their
-investments in AI and AI generated products. Until such debates are
-definitively resolved in the law, copyright uncertainty will persist
-over AI generated works."
-
-https://fsfe.org/news/2025/news-20250515-01.en.html
-
-
-⇒ avoid AI contributions. You could be found in violation of
-copyright when the interpretation changes.
-
- [[https://rollenspiel.social/@ArneBab/114513960911270308]]
-
-
-** [2025-05-15 Do 08:24]
- https://www.un.org/en/about-us/un-charter/preamble
-
- [[https://rollenspiel.social/@ArneBab/114510888078131952]]
-
-
* Gute Neuigkeiten
* Leserbrief: NGI Taler 1.0 macht es richtig
:PROPERTIES:
- :CUSTOM_ID:
+ :CUSTOM_ID: ngi-taler-richtig
:ID: 20f64c9d-0a04-4650-adf5-05ae9658674d
:PUBDATE: 2025-05-23 Fr 10:49
:END:
#+END_SRC
+* Tipps und Tricks
+
+
+#+BEGIN_SRC sh :eval yes :exports results :results output raw
+ for i in $(ls software | grep \\.org$ | grep "shell-tricks\\|^guix-work.org\\|^mercurial-branching-strategy\\|^org-mode-tipps\\|^emacs-tipps\\|^python-snippets" | sort -h); do echo '- [[file:software/'$i']['$(basename $i .org)']]' - $(grep '#+title:' "software/$i" | sed 's/#+title: *//'); done
+#+END_SRC
+
+
* Guile, Guix und Wisp
#+BEGIN_SRC sh :eval yes :exports results :results output raw
- for i in $(ls software | grep \\.org$ | grep "^guix-work.org\\|^guix-config.org\\|^wisp.org\\|^guile-10x.org\\|^guile-snippets.org\\|^guile-capture-stdout-stderr.org\\|^guile-fast.org\\|^zen-for-scheme.org\\|^wisp-code-katas.org\\|^wisp-snippets.org\\|^advent-of-wisp-code-2021.org\\|^programming-with-wisp.org\\|^programming-scheme.org\\|^install-on-guix.org\\|^package-guix.org\\|^programming-basics-wisp.org" | sort -h); do echo '- [[file:software/'$i']['$(basename $i .org)']]' - $(grep '#+title:' "software/$i" | sed 's/#+title: *//'); done
+ for i in $(ls software | grep \\.org$ | grep "^guix-config.org\\|^wisp.org\\|^guile-10x.org\\|^guile-snippets.org\\|^guile-capture-stdout-stderr.org\\|^guile-fast.org\\|^zen-for-scheme.org\\|^wisp-code-katas.org\\|^wisp-snippets.org\\|^advent-of-wisp-code-2021.org\\|^programming-with-wisp.org\\|^programming-scheme.org\\|^install-on-guix.org\\|^package-guix.org\\|^programming-basics-wisp.org" | sort -h); do echo '- [[file:software/'$i']['$(basename $i .org)']]' - $(grep '#+title:' "software/$i" | sed 's/#+title: *//'); done
#+END_SRC
-* Tipps und Tricks
-
-
-#+BEGIN_SRC sh :eval yes :exports results :results output raw
- for i in $(ls software | grep \\.org$ | grep "shell-tricks\\|^mercurial-branching-strategy\\|^org-mode-tipps\\|^emacs-tipps\\|^python-snippets" | sort -h); do echo '- [[file:software/'$i']['$(basename $i .org)']]' - $(grep '#+title:' "software/$i" | sed 's/#+title: *//'); done
-#+END_SRC
-
-
* Emacs und Org mode
#+BEGIN_SRC sh :eval yes :exports results :results output raw
- for i in $(ls software | grep \\.org$ | grep "^comment-your-code.org\\|^gpl-or-later.org\\|^langsame-simple-werkzeuge.org\\|^slow-simple-tools.org\\|^optimize-for-firefox.org\\|^programs-you-can-still-hack-when-dumb.org\\|^tinkering-stability.org\\|^volatile-infrastructure.org\\|^typescript-risks.org" | sort -h); do echo '- [[file:software/'$i']['$(basename $i .org)']]' - $(grep '#+title:' "software/$i" | sed 's/#+title: *//'); done
+ for i in $(ls software | grep \\.org$ | grep "^comment-your-code.org\\|^language-empiric.org\\|^gpl-or-later.org\\|^langsame-simple-werkzeuge.org\\|^slow-simple-tools.org\\|^optimize-for-firefox.org\\|^programs-you-can-still-hack-when-dumb.org\\|^tinkering-stability.org\\|^volatile-infrastructure.org\\|^typescript-risks.org" | sort -h); do echo '- [[file:software/'$i']['$(basename $i .org)']]' - $(grep '#+title:' "software/$i" | sed 's/#+title: *//'); done
#+END_SRC
#+BEGIN_SRC sh :eval yes :exports results :results output raw
- for i in $(ls software | grep \\.org$ | grep -v "^vorlesung-verteilte-systeme.org\\|^vorlesung-netztechnik.org\\|^p2p-talk.org\\|^decentralized-moderation.org\\|^kontaktinfos-mit-gnupg.org\\|^freenet-hidden-channel.org\\|^guix-work.org\\|guix-config.org\\|letterblock-diceware.org\\|^wisp.org\\|^guile-10x.org\\|^guile-snippets.org\\|^guile-capture-stdout-stderr.org\\|^guile-fast.org\\|^zen-for-scheme.org\\|^shell-tricks\\|^python-snippets\\|^mercurial-branching-strategy\\|^emacs-javascript.org\\|^wisp-code-katas.org\\|^wisp-snippets.org\\|^advent-of-wisp-code-2021.org\\|^org-mode-tipps\\|^emacs-tipps\\|^package-guix.org\\|^programming-with-wisp.org\\|^programming-scheme.org\\|^programming-basics-wisp.org\\|^putins-kriegsrede.org\\|^install-on-guix.org\\|^package-guix.org\\|^org-mode.org\\|^emacs-daytime.org\\|^emacs-javascript.org\\|^intellij-emacs.org\\|^mercurial-ediff3-emacs.org\\|^orgmode-markdown.org\\|^ferienplan.org\\|^latex-awesome.org\\|^latex-list-of-links.org\\|^stundenplan-wochenplan-latex.org\\|^privacy-embed.org\\|^stream-over-freenet\\|^video-channel-hyphanet.org\\|^m3u-player.org\\|^find-dorktower.org\\|^ffmpeg-compression-vp9-av1.org\\|^comment-your-code.org\\|^gpl-or-later.org\\|^langsame-simple-werkzeuge.org\\|^slow-simple-tools.org\\|^optimize-for-firefox.org\\|^programs-you-can-still-hack-when-dumb.org\\|^tinkering-stability.org\\|^volatile-infrastructure.org\\|^typescript-risks.org\\|^hurd-authorization-translator.org\\|^keyboard-layout-evolution.org" | sort -h); do echo '- [[file:software/'$i']['$(basename $i .org)']]' - $(grep '#+title:' "software/$i" | sed 's/#+title: *//'); done
+ for i in $(ls software | grep \\.org$ | grep -v "^vorlesung-verteilte-systeme.org\\|^language-empiric.org\\|^vorlesung-netztechnik.org\\|^p2p-talk.org\\|^decentralized-moderation.org\\|^kontaktinfos-mit-gnupg.org\\|^freenet-hidden-channel.org\\|^guix-work.org\\|guix-config.org\\|letterblock-diceware.org\\|^wisp.org\\|^guile-10x.org\\|^guile-snippets.org\\|^guile-capture-stdout-stderr.org\\|^guile-fast.org\\|^zen-for-scheme.org\\|^shell-tricks\\|^python-snippets\\|^mercurial-branching-strategy\\|^emacs-javascript.org\\|^wisp-code-katas.org\\|^wisp-snippets.org\\|^advent-of-wisp-code-2021.org\\|^org-mode-tipps\\|^emacs-tipps\\|^package-guix.org\\|^programming-with-wisp.org\\|^programming-scheme.org\\|^programming-basics-wisp.org\\|^putins-kriegsrede.org\\|^install-on-guix.org\\|^package-guix.org\\|^org-mode.org\\|^emacs-daytime.org\\|^emacs-javascript.org\\|^intellij-emacs.org\\|^mercurial-ediff3-emacs.org\\|^orgmode-markdown.org\\|^ferienplan.org\\|^latex-awesome.org\\|^latex-list-of-links.org\\|^stundenplan-wochenplan-latex.org\\|^privacy-embed.org\\|^stream-over-freenet\\|^video-channel-hyphanet.org\\|^m3u-player.org\\|^find-dorktower.org\\|^ffmpeg-compression-vp9-av1.org\\|^comment-your-code.org\\|^gpl-or-later.org\\|^langsame-simple-werkzeuge.org\\|^slow-simple-tools.org\\|^optimize-for-firefox.org\\|^programs-you-can-still-hack-when-dumb.org\\|^tinkering-stability.org\\|^volatile-infrastructure.org\\|^typescript-risks.org\\|^hurd-authorization-translator.org\\|^keyboard-layout-evolution.org" | sort -h); do echo '- [[file:software/'$i']['$(basename $i .org)']]' - $(grep '#+title:' "software/$i" | sed 's/#+title: *//'); done
#+END_SRC
:ID: 4ae553de-b491-4904-bbf2-19907f875638
:PUBDATE: 2024-10-03 Do 19:13
:END:
+:LOGBOOK:
+CLOCK: [2025-05-26 Mo 17:09]--[2025-05-27 Di 09:39] => 16:30
+:END:
After diving into the deep end, we get back to fundamentals: parsing
bitstreams represented in hexadecimal.
+Example packets:
+
#+begin_src scheme :tangle "advent-of-wisp-code-2021-d16p1-example-input.dat"
D2FE28
EE00D40C823060
A0016C880162017C3686B18A3D4780
#+end_src
-First we need to parse Hexadecimal into binary.
-
-We’ll start with a test:
+Let’s do that test-driven. Start with the test-setup:
#+begin_src wisp :noweb no-export :results output
import : srfi :1 lists
srfi :26 cut
srfi :60 integers-as-bits
+ srfi :64 tests
+ only (srfi :11) let-values
+ only (ice-9 match) match-let ;; pattern matching
+
+;; implementations that will be tested
{{{d16-parse-hexadecimal}}}
-{{{d16-parse-packets}}}
-
-equal? #*110100101111111000101000
- hexadecimal->bits "D2FE28"
-equal? '(6 . 4)
- identify-packet #*110100101111111000101000
-equal? 2021
- literal-value-packet-data #*110100101111111000101000
+{{{d16-parse-literal-packets}}}
+{{{d16-parse-operator-packets}}}
+
+test-begin "elf-messages"
+
+{{{d16-parse-hexadecimal--tests}}}
+{{{d16-parse-literal-packets--tests}}}
+{{{d16-parse-operator-packets--tests}}}
+
+{{{d16-input-data-test}}}
+
+test-end
+
#+end_src
#+RESULTS:
under certain conditions; type `,show c' for details.
Enter `,help' for help.
-$1 = #t
-$2 = #t
-$3 = #t
+%%%% Starting test elf-messages (Writing full log to "elf-messages.log")
+$1 = ("elf-messages")
+# of expected passes 14
+$2 = #<test-runner pass-count: 14 fail-count: 0 xpass-count: 0 xfail-count: 0 skip-count: 0 skip-list: () fail-list: () run-list: #t skip-save: () fail-save: () group-stack: () on-test-begin: #<procedure test-on-test-begin-simple (runner)> on-test-end: #<procedure test-on-test-end-simple (runner)> on-group-begin: #<procedure test-on-group-begin-simple (runner suite-name count)> on-group-end: #<procedure test-on-group-end-simple (runner)> on-final: #<procedure 7832c5f739a0 at srfi/srfi-64/testing.scm:285:12 (r)> on-bad-count: #<procedure test-on-bad-count-simple (runner count expected-count)> on-bad-end-name: #<procedure test-on-bad-end-name-simple (runner begin-name end-name)> total-count: 14 count-list: () result-alist: ((source-form test-end)) aux-value: #<output: elf-messages.log 13>>
#+end_example
-Implementation:
+See test results:
+
+#+begin_src bash :results output quote
+cat "elf-messages.log"
+#+end_src
+
+First we need to parse Hexadecimal into binary:
+
+#+begin_src wisp :noweb-ref d16-parse-hexadecimal--tests
+;; snippet: {{{d16-parse-hexadecimal--tests}}}
+test-equal #*110100101111111000101000
+ hexadecimal->bits "D2FE28"
+test-equal
+ . #*0000000100100011010001010110011110001001101010111100110111101111
+ hexadecimal->bits "0123456789abcdef"
+#+end_src
#+begin_src wisp :noweb-ref d16-parse-hexadecimal
;; snippet: {{{d16-parse-hexadecimal}}}
string->list hex ;; split into characters
#+end_src
-
-#+begin_src wisp :noweb-ref d16-parse-packets
-;; snippet: {{{d16-parse-packets}}}
-
+Then we parse literal packets (direct data):
+
+#+begin_src wisp :noweb-ref d16-parse-literal-packets--tests
+;; snippet: {{{d16-parse-literal-packets--tests}}}
+test-equal '(6 . 4)
+ identify-packet #*110100101111111000101000
+test-equal 2021
+ literal-value-packet-data #*110100101111111000101000
+#+end_src
+
+#+begin_src wisp :noweb-ref d16-parse-literal-packets
+;; snippet: {{{d16-parse-literal-packets}}}
define : bitvector->integer vec
list->integer
bitvector->list vec
define type : bitvector->integer : bitvector-copy packet 3 6
cons version type
-define : literal-value-packet-data packet
- let loop : (nibbles '()) (index 6)
+define : bitvectors->integer . packets
+ . "Flatten subvectors and re-interpret the bits as integer"
+ list->integer : apply append : map bitvector->list packets
+
+define* : literal-value-packet-data packet #:key (start 6)
+ . "Return values: data as integer and index after the last bit."
+ let loop : (nibbles '()) (index start)
define nibble : bitvector-copy packet {index + 1} {index + 5}
define value : cons nibble nibbles
if : not : bitvector-bit-set? packet index
- list->integer : apply append : reverse! : map bitvector->list value
+ values : apply bitvectors->integer : reverse! value
+ + index 5
loop value {index + 5}
#+end_src
+Now we parse operator packets (packets containing packets) and extract versions:
+
+#+begin_src wisp :noweb-ref d16-parse-operator-packets--tests
+;; snippet: {{{d16-parse-operator-packets--tests}}}
+;; packet types other than 4 are detected
+test-equal '(1 . 6) ;; 6 means operator type
+ identify-packet
+ hexadecimal->bits "38006F45291200"
+;; operator length type bitcount and packet number are detected
+test-equal 15
+ operator-length-bitlength
+ hexadecimal->bits "38006F45291200"
+test-equal 11
+ operator-length-bitlength
+ hexadecimal->bits "EE00D40C823060"
+;; parses packet versions
+test-equal '(1 6 2)
+ extract-packet-versions
+ hexadecimal->bits "38006F45291200"
+test-equal '(7 2 4 1)
+ extract-packet-versions
+ hexadecimal->bits "EE00D40C823060"
+;; gives correct version sums
+test-equal 16
+ apply + ;; apply + calculates the sum of the values in a list
+ extract-packet-versions
+ hexadecimal->bits "8A004A801A8002F478"
+test-equal 12
+ apply +
+ extract-packet-versions
+ hexadecimal->bits "620080001611562C8802118E34"
+test-equal 23
+ apply +
+ extract-packet-versions
+ hexadecimal->bits "C0015000016115A2E0802F182340"
+test-equal 31
+ apply +
+ extract-packet-versions
+ hexadecimal->bits "A0016C880162017C3686B18A3D4780"
+#+end_src
+
+#+begin_src wisp :noweb-ref d16-parse-operator-packets
+;; snippet: {{{d16-parse-operator-packets}}}
+define : operator-length-bitlength packet
+ if : bitvector-bit-set? packet 6
+ . 11 15
+
+define* : extract-packet-versions packet #:optional max-packets
+ define : done start-index
+ . "check whether enough bits remain for the minimum packet"
+ define min-bits {6 + 5} ;; header plus one literal data nibble
+ > {start-index + min-bits} : bitvector-length packet
+ match-let : : (version . type) : identify-packet packet
+ ;; no more packets or not enough bits for a packet
+ if : or (and=> max-packets zero?) : done 0
+ . '() ;; rest of the packet is only padding
+ cons version
+ cond
+ : equal? 4 type ;; literal value
+ let-values
+ : (data after-end) : literal-value-packet-data packet
+ if (done after-end) '()
+ extract-packet-versions
+ bitvector-copy packet after-end
+ else
+ let*
+ : len-bits : operator-length-bitlength packet
+ data-start : + 6 1 len-bits
+ subvec : bitvector-copy packet 7 data-start
+ len : list->integer : bitvector->list subvec
+ if : = 15 len-bits
+ ;; fixed length, arbitrary number of packets
+ append
+ ;; extract packets from packet-body
+ extract-packet-versions
+ bitvector-copy packet data-start
+ + data-start len
+ ;; extract further packets
+ if
+ or : equal? max-packets 1
+ done : + data-start len
+ . '()
+ extract-packet-versions
+ bitvector-copy packet : + data-start len
+ and=> max-packets 1-
+ ;; unknown length, fixed num of packets: keep parsing
+ extract-packet-versions
+ bitvector-copy packet data-start
+ . len
+#+end_src
+
+#+RESULTS:
+
+Finally we check whether the actual input is parsed correctly:
+
+#+begin_src wisp :noweb-ref d16-input-data-test
+;; snippet: {{{d16-input-data-test}}}
+;; my input gives the correct version sum
+test-equal 993
+ apply +
+ extract-packet-versions
+ hexadecimal->bits
+ string-append "420D5A802122FD25C8CD7CC010B00564D0E4B76C7D5A"
+ . "59C8C014E007325F116C958F2C7D31EB4EDF90A9803B2EB5340924"
+ . "CA002761803317E2B4793006E28C2286440087C5682312D0024B9E"
+ . "F464DF37EFA0CD031802FA00B4B7ED2D6BD2109485E3F3791FDEB3"
+ . "AF0D8802A899E49370012A926A9F8193801531C84F5F573004F803"
+ . "571006A2C46B8280008645C8B91924AD3753002E512400CC170038"
+ . "400A002BCD80A445002440082021DD807C0201C510066670035C00"
+ . "940125D803E170030400B7003C0018660034E6F180120104257588"
+ . "0A5004D9372A520E735C876FD2C3008274D24CDE614A68626D9480"
+ . "4D4929693F003531006A1A47C85000084C4586B10D802F5977E88D"
+ . "2DD2898D6F17A614CC0109E9CE97D02D006EC00086C64859174001"
+ . "0C8AF14E0E180253673400AA48D15E468A2000ADCCED1A174218D6"
+ . "C017DCFAA4EB2C8C5FA7F21D3F9152012F6C01797FF3B4AE38C32F"
+ . "FE7695C719A6AB5E25080250EE7BB7FEF72E13980553CE932EB26C"
+ . "72A2D26372D69759CC014F005E7E9F4E9FA7D3653FCC879803E200"
+ . "CC678470EC0010E82B11E34080330D211C663004F0010191179117"
+ . "9296E7F869F9C017998EF11A1BCA52989F5EA778866008D8023255"
+ . "DFBB7BD2A552B65A98ECFEC51D540209DFF2FF2B9C1B9FE5D6A469"
+ . "F81590079160094CD73D85FD2699C5C9DCF21F0700094A1AC9EDA6"
+ . "4AE3D37D34200B7B401596D678A73AFB2D0B1B88057230A42B2BD8"
+ . "8E7F9F0C94F1ECB7B0DD393489182F9802D3F875C00DC40010F891"
+ . "1C61F8002111BA1FC2E400BEA5AA0334F9359EA741892D81100B83"
+ . "337BD2DDB4E43B401A800021F19A09C1F1006229C3F8726009E002"
+ . "A12D71B96B8E49BB180273AA722468002CC7B818C01B04F77B39EF"
+ . "DF53973D95ADB5CD921802980199CF4ADAA7B67B3D9ACFBEC4F82D"
+ . "19A4F75DE78002007CD6D1A24455200A0E5C47801559BF58665D80"
+
+#+end_src
+
+#+RESULTS:
+
#+latex_header: \usepackage{tocloft}
#+latex_header: \newcommand{\listlinksname}{List of Links}
Binary file software/bsi-grundschutz-thumb.png has changed
#+begin_export html
<div class="sourcebox" markdown="1" >
-<a href="bsi-grundschutz.pdf"><img width="168" height="235" title="PDF" src="../assets/pdf-thumbnail.png" /></a><br />
+<a href="bsi-grundschutz.pdf"><img width="170" height="188" title="PDF" src="bsi-grundschutz-thumb.png" /></a><br />
<a href="bsi-grundschutz.pdf">PDF</a> (drucken)
</div>
#+end_export
+#+HTML_HEAD_EXTRA: <meta property="og:image" content="bsi-grundschutz-thumb.png" />
+#+HTML_HEAD_EXTRA: <link rel="apple-touch-icon" href="bsi-grundschutz-thumb.png" />
+
There are [[https://www.bsi.bund.de/EN/Themen/Unternehmen-und-Organisationen/Standards-und-Zertifizierung/IT-Grundschutz/it-grundschutz_node.html][older official documents in English]], but they don't map
exactly to the newest German ones. Closest is the [[https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Grundschutz/International/bsi_it_gs_comp_2022.pdf?__blob=publicationFile&v=2][Compendium_2022.pdf]].[fn:1]
# Booking — see variable org-link-elisp-skip-confirm-regexp in customize: ^(org-clock-in-last)$\|^(org-clock-out)$\|^(save-excursion (goto-char (org-find-exact-headline-in-buffer "Single-click time tracking with links in org-mode"))(org-clock-in))$\|^(save-excursion (org-id-goto "buchen-orga")(org-clock-in))$\|^(save-excursion (org-id-goto "buchen-apps-meetings")(org-clock-in))$\|^(save-excursion (org-id-goto "buchen-scrum-a")(org-clock-in))$\|^(save-excursion (org-id-goto "buchen-scrum-b")(org-clock-in))$
#+begin_src org
-| Orga | [[elisp:(save-excursion (org-id-goto "buchen-orga")(org-clock-in))][Mein Orga]] | [[elisp:(save-excursion (goto-char (org-find-exact-headline-in-buffer "Single-click time tracking with links in org-mode"))(org-clock-in))][Personal]] | [[elisp:(save-excursion (org-id-goto "kanban")(org-clock-in))][Kanban (other)]] |
-| Proj | [[elisp:(save-excursion (org-id-goto "buchen-apps-meetings")(org-clock-in))][Apps]] | [[elisp:(save-excursion (org-id-goto "buchen-scrum-a")(org-clock-in))][Scrum A]] | [[elisp:(save-excursion (org-id-goto "buchen-scrum-b")(org-clock-in))][Scrum B]] |
-| | [[elisp:(save-excursion (org-id-goto "buchen-reviews")(org-clock-in))][Reviews]] | [[elisp:(org-clock-in-last)][clock in LAST]] | [[elisp:(org-clock-out)][clock OUT]] |
+| Orga | 🧘 [[elisp:(save-excursion (org-id-goto "buchen-orga")(org-clock-in))][Mein Orga]] | 📅 [[elisp:(save-excursion (goto-char (org-find-exact-headline-in-buffer "Single-click time tracking with links in org-mode"))(org-clock-in))][Personal]] | 📅 [[elisp:(save-excursion (org-id-goto "kanban")(org-clock-in))][Kanban (other)]] |
+| Proj | 🧰 [[elisp:(save-excursion (org-id-goto "buchen-apps-meetings")(org-clock-in))][Apps]] | 📅 [[elisp:(save-excursion (org-id-goto "buchen-scrum-a")(org-clock-in))][Scrum A]] | 📅 [[elisp:(save-excursion (org-id-goto "buchen-scrum-b")(org-clock-in))][Scrum B]] |
+| | 📚 [[elisp:(save-excursion (org-id-goto "buchen-reviews")(org-clock-in))][Reviews]] | ⏲ [[elisp:(org-clock-in-last)][clock in LAST]] | ⏲ [[elisp:(org-clock-out)][clock OUT]] |
#+end_src
I can click each of the links to activate booking on the respective
#+attr_html: :style white-space:pre-wrap
#+begin_example
-| Orga | [[elisp:(save-excursion (org-id-goto "buchen-orga")(org-clock-in))][Mein Orga]] | [[elisp:(save-excursion (goto-char (org-find-exact-headline-in-buffer "Single-click time tracking with links in org-mode"))(org-clock-in))][Personal]] | [[elisp:(save-excursion (org-id-goto "kanban")(org-clock-in))][Kanban (other)]] |
-| Proj | [[elisp:(save-excursion (org-id-goto "buchen-apps-meetings")(org-clock-in))][Apps]] | [[elisp:(save-excursion (org-id-goto "buchen-scrum-a")(org-clock-in))][Scrum A]] | [[elisp:(save-excursion (org-id-goto "buchen-scrum-b")(org-clock-in))][Scrum B]] |
-| | [[elisp:(save-excursion (org-id-goto "buchen-reviews")(org-clock-in))][Reviews]] | [[elisp:(org-clock-in-last)][clock in LAST]] | [[elisp:(org-clock-out)][clock OUT]] |
+| Orga | 🧘 [[elisp:(save-excursion (org-id-goto "buchen-orga")(org-clock-in))][Mein Orga]] | 📅 [[elisp:(save-excursion (goto-char (org-find-exact-headline-in-buffer "Single-click time tracking with links in org-mode"))(org-clock-in))][Personal]] | 📅 [[elisp:(save-excursion (org-id-goto "kanban")(org-clock-in))][Kanban (other)]] |
+| Proj | 🧰 [[elisp:(save-excursion (org-id-goto "buchen-apps-meetings")(org-clock-in))][Apps]] | 📅 [[elisp:(save-excursion (org-id-goto "buchen-scrum-a")(org-clock-in))][Scrum A]] | 📅 [[elisp:(save-excursion (org-id-goto "buchen-scrum-b")(org-clock-in))][Scrum B]] |
+| | 📚 [[elisp:(save-excursion (org-id-goto "buchen-reviews")(org-clock-in))][Reviews]] | ⏲ [[elisp:(org-clock-in-last)][clock in LAST]] | ⏲ [[elisp:(org-clock-out)][clock OUT]] |
#+end_example
:END:
Once you need two or more options, go for [[https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#index-getopts][getopts]]. How to check for
-=--version=, =--debug=, and =--verbose=:
+=-V= or =--version=, =-d= or =--debug=, and =-v= or =--verbose=:
#+begin_src bash :tangle bash-flag-template.sh
while getopts -- dvV-: OPT; do
#+end_kasten
#+begin_export html
+<style>
+.kasten ul li code, pre.src, pre.example {
+ line-break: anywhere;
+ white-space: pre-wrap;
+}
+</style>
<div class="sourcebox" markdown="1" >
<a href="stream-over-freenet.pdf"><img width="168" height="235" title="PDF" src="../assets/pdf-thumbnail.png" /></a><br />
<a href="stream-over-freenet.pdf">PDF</a> (drucken)
: Creating minimal streaming site:
: http://127.0.0.1:8888/freenet:USK@fLh9vDtv4yliMDD6tJSb~GMLdC2EQuf~Wpc1PxyFMXo,30P5T9rvQ4UGDJs2hZ7cdzhKYixBgds296gKbfK2XjI,AQACAAE/theradiocc/0/
-To embed such a stream on your Freesite, you can use an audio-tag with
-the =/SSK@.../stream.m3u= in =src=. You can simply copy a working tag
-from the minimal site.
+To embed such a stream on another Freesite, you can use an audio-tag
+with the =/SSK@.../stream.m3u= in =src=. For simplicity, just copy the
+tag from the minimal site.
#+toc: headlines 2
Depending on your player, playback might not be completely gapless. You can lessen this problem by splitting the video file by silence. While this will likely fail catastrophically for music, it should work pretty well for recorded talks.
-Here’s a one-line example [[https://stackoverflow.com/questions/36074224/how-to-split-video-or-audio-by-silent-parts/36077309#comment63050906_36077309][from Vi]] at Stackoverflow, adapted to prouce scaled down ogg theora for Freenet, splitting at places with at least 0.3 seconds of -40dB signal:
+Here’s a one-line example [[https://stackoverflow.com/questions/36074224/how-to-split-video-or-audio-by-silent-parts/36077309#comment63050906_36077309][from Vi]] at Stackoverflow, adapted to produce scaled down ogg theora for Freenet, splitting at places with at least 0.3 seconds of -40dB signal:
#+begin_src bash
ffmpeg -i infile.mkv -filter_complex "[0:a]silencedetect=n=-40dB:d=0.3[outa]" -map [outa] -f s16le -y /dev/null |& F='-q:v 0 -q:a 0 -vf scale=320:240' perl -ne 'INIT { $ss=0; $se=0; } if (/silence_start: (\S+)/) { $ss=$1; $ctr+=1; printf "ffmpeg -nostdin -i infile.mkv -ss %f -t %f $ENV{F} -y ssf-%03d.ogv\n", $se, ($ss-$se), $ctr; } if (/silence_end: (\S+)/) { $se=$1; } END { printf "ffmpeg -nostdin -i infile.mkv -ss %f $ENV{F} -y ssf-%03d.ogv\n", $se, $ctr+1; }' | bash -x