summaryrefslogtreecommitdiff
path: root/00_blog
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2019-03-17 18:14:32 +0100
committerMiguel <m.i@gmx.at>2019-03-17 18:14:32 +0100
commit0e4810dcfb132bf276a282e25b8523a4009ae08b (patch)
treedac6dce820f0a35d9ed7ea7676982a0f86fd0edb /00_blog
parentad6411e9ec256b03f20b9195e25cb128fe02c628 (diff)
rename blog dir
Diffstat (limited to '00_blog')
-rw-r--r--00_blog/00015_Admin/00005_Notes-on-Hosting/index.md53
-rw-r--r--00_blog/00015_Admin/00008_Docker/index.md14
-rw-r--r--00_blog/00015_Admin/00010_Various-Cheat-Sheets/00105_GNU-Screen-Multiplexer-Keyboard-Shortcuts/index.md43
-rw-r--r--00_blog/00015_Admin/00010_Various-Cheat-Sheets/00110_Midnight-Commander-Cheatsheet/index.md61
-rw-r--r--00_blog/00015_Admin/00010_Various-Cheat-Sheets/00120_GDB/index.md29
-rw-r--r--00_blog/00015_Admin/00010_Various-Cheat-Sheets/index.md3
-rw-r--r--00_blog/00015_Admin/00020_Benchmarking-and-Stress-testing/index.md68
-rw-r--r--00_blog/00015_Admin/00030_Fixing-HDD/index.md48
-rw-r--r--00_blog/00015_Admin/00040_Oneliners/index.md41
-rw-r--r--00_blog/00015_Admin/00050_Wine-in-LXC/index.md197
-rw-r--r--00_blog/00015_Admin/00070_Password-Management-on-the-Command-Line/index.md89
-rw-r--r--00_blog/00015_Admin/00090_Miguels-KVM-Adventures/index.md220
-rw-r--r--00_blog/00015_Admin/00090_Miguels-KVM-Adventures/ipv4.pngbin0 -> 123475 bytes
-rw-r--r--00_blog/00015_Admin/index.md2
-rw-r--r--00_blog/00018_Building/00030_The-Hell-of-Autotools/index.md74
-rw-r--r--00_blog/00018_Building/00040_Various-notes-on-Building/index.md93
-rw-r--r--00_blog/00018_Building/index.md3
-rw-r--r--00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/1.pngbin0 -> 90433 bytes
-rw-r--r--00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/2.pngbin0 -> 741047 bytes
-rw-r--r--00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/3.pngbin0 -> 743011 bytes
-rw-r--r--00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/4.pngbin0 -> 728056 bytes
-rw-r--r--00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/index.md25
-rw-r--r--00_blog/00020_Visual-Art/index.md3
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/aquarelle.jpgbin0 -> 26481 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/atenefunds.pngbin0 -> 231690 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/atenefunds2.jpgbin0 -> 28192 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/atenefunds3.jpgbin0 -> 32643 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/atenefunds4.jpgbin0 -> 14992 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/atenekom.jpgbin0 -> 6732 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/aufbau.jpgbin0 -> 279483 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/austria-org-pl-old.pngbin0 -> 581535 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/austria-org-pl.pngbin0 -> 431793 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/austrian-wine.pngbin0 -> 500283 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/balbuza.pngbin0 -> 479725 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/bildershopping.jpgbin0 -> 41078 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/bildershopping.pngbin0 -> 570595 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/bildershopping2.pngbin0 -> 708693 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/breitbandausschreibungen1.pngbin0 -> 329626 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/breitbandausschreibungen2.pngbin0 -> 408084 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/brlr1.pngbin0 -> 176063 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/bunzlauer.pngbin0 -> 1810734 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/bunzlauershop.pngbin0 -> 452369 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/captainsdinner.pngbin0 -> 190249 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/casamila.pngbin0 -> 3172147 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/condition-red.pngbin0 -> 464616 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/copterwerk.pngbin0 -> 841318 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/cornea.jpgbin0 -> 30996 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/cornea.pngbin0 -> 120721 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/cqs.jpgbin0 -> 299525 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/cuadro.pngbin0 -> 674510 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/flipper.jpgbin0 -> 27938 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/flipper2.jpgbin0 -> 53303 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/foto-pschill.pngbin0 -> 200807 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/ikm.jpgbin0 -> 40688 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/immoconnect.pngbin0 -> 531589 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/index.md542
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/kulturmanag.jpgbin0 -> 49488 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/kunst-stuecke.pngbin0 -> 175802 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/lev.jpgbin0 -> 39240 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/link-all.pngbin0 -> 371759 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/maiden.jpgbin0 -> 25425 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/maiden2.pngbin0 -> 290072 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/mazury.pngbin0 -> 1056601 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/meersalzgrotte.pngbin0 -> 918115 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/mmtour.pngbin0 -> 1280083 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/nadler.pngbin0 -> 311992 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/nadler2.pngbin0 -> 595521 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/norti.pngbin0 -> 2158182 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/panner-admin.pngbin0 -> 56668 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/panner.jpgbin0 -> 27992 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/platin.pngbin0 -> 1680027 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/preschl.jpgbin0 -> 24415 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/ringy.pngbin0 -> 774379 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/sensor.pngbin0 -> 2363605 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/telenetprofi.pngbin0 -> 1095670 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/textlabor.jpgbin0 -> 30542 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/todoapp.pngbin0 -> 905957 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/wekkaprojekt.pngbin0 -> 1123569 bytes
-rw-r--r--00_blog/00020_WWW-Projects-and-Apps/werbereich.pngbin0 -> 432046 bytes
-rw-r--r--00_blog/00030_Computer-Games/00010_The-Old-Times/attack.pngbin0 -> 25834 bytes
-rw-r--r--00_blog/00030_Computer-Games/00010_The-Old-Times/attack.zipbin0 -> 26160 bytes
-rw-r--r--00_blog/00030_Computer-Games/00010_The-Old-Times/high1.pngbin0 -> 169188 bytes
-rw-r--r--00_blog/00030_Computer-Games/00010_The-Old-Times/high2.pngbin0 -> 89748 bytes
-rw-r--r--00_blog/00030_Computer-Games/00010_The-Old-Times/highway.zipbin0 -> 2960639 bytes
-rw-r--r--00_blog/00030_Computer-Games/00010_The-Old-Times/index.md54
-rw-r--r--00_blog/00030_Computer-Games/00010_The-Old-Times/naval.zipbin0 -> 31425 bytes
-rw-r--r--00_blog/00030_Computer-Games/00010_The-Old-Times/naval1.pngbin0 -> 24910 bytes
-rw-r--r--00_blog/00030_Computer-Games/00010_The-Old-Times/naval2.pngbin0 -> 43527 bytes
-rw-r--r--00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-ASCII-Bars.pngbin0 -> 26480 bytes
-rw-r--r--00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-Animated-Display-Setup.pngbin0 -> 15425 bytes
-rw-r--r--00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-LCD-Panels.pngbin0 -> 28543 bytes
-rw-r--r--00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-Pixel-Display.pngbin0 -> 24105 bytes
-rw-r--r--00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/index.md325
-rw-r--r--00_blog/00030_Computer-Games/index.md4
-rw-r--r--00_blog/00035_Programming/00010_IPC/.index.md.swpbin0 -> 12288 bytes
-rw-r--r--00_blog/00035_Programming/00010_IPC/index.md24
-rw-r--r--00_blog/00035_Programming/00015_Competitive-Coding/index.md17
-rw-r--r--00_blog/00035_Programming/00020_Computer-Science-Literature/index.md48
-rw-r--r--00_blog/00035_Programming/index.md3
-rw-r--r--00_blog/00040_Haskell/00010_Links-and-Literature/index.md17
-rw-r--r--00_blog/00040_Haskell/00020_GHC-Notes/index.md39
-rw-r--r--00_blog/00040_Haskell/00030_Xmonad-contribution/index.md20
-rw-r--r--00_blog/00040_Haskell/00040_Graham-Scan/index.md128
-rw-r--r--00_blog/00040_Haskell/00065_Base64-Encoder/base64.cast146
-rw-r--r--00_blog/00040_Haskell/00065_Base64-Encoder/index.md21
-rw-r--r--00_blog/00040_Haskell/00120_Lambda-Calculus/index.md39
-rw-r--r--00_blog/00040_Haskell/00130_Calculator-on-Parsec-and-GTK/calc.pngbin0 -> 30318 bytes
-rw-r--r--00_blog/00040_Haskell/00130_Calculator-on-Parsec-and-GTK/index.md21
-rw-r--r--00_blog/00040_Haskell/00140_Minimalistic-SVG-Generator/index.md27
-rw-r--r--00_blog/00040_Haskell/00140_Minimalistic-SVG-Generator/svg.pngbin0 -> 13130 bytes
-rw-r--r--00_blog/00040_Haskell/00150_Applicative-vs-Monadic-Parsing/index.md175
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index.md20
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_breezedark.html117
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_espresso.html113
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_haddock.html109
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_kate.html117
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_monochrome.html96
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_pygments.html114
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_tango.html113
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_zenburn.html113
-rw-r--r--00_blog/00040_Haskell/00200_Estatico-Page-Maker/index.md63
-rw-r--r--00_blog/00040_Haskell/00_00150_Applicative-vs-Monadic-Parsing/index.md1
-rw-r--r--00_blog/00040_Haskell/index.md8
-rw-r--r--00_blog/00040_Hex-Converter/hexman.html170
-rw-r--r--00_blog/00040_Hex-Converter/index.md5
-rw-r--r--00_blog/00100_Webkit-Keyboardless-Navigation/index.md29
-rw-r--r--00_blog/00100_Webkit-Keyboardless-Navigation/v1.ogvbin0 -> 1005278 bytes
-rw-r--r--00_blog/00110_Fool-Operating-System/compositing.ogvbin0 -> 2274335 bytes
-rw-r--r--00_blog/00110_Fool-Operating-System/foolos0.pngbin0 -> 21483 bytes
-rw-r--r--00_blog/00110_Fool-Operating-System/foolos1.pngbin0 -> 234667 bytes
-rw-r--r--00_blog/00110_Fool-Operating-System/foolos2.pngbin0 -> 983676 bytes
-rw-r--r--00_blog/00110_Fool-Operating-System/index.md105
-rw-r--r--00_blog/00110_Fool-Operating-System/pipes.ogvbin0 -> 3525223 bytes
-rw-r--r--00_blog/index.md5
134 files changed, 4014 insertions, 0 deletions
diff --git a/00_blog/00015_Admin/00005_Notes-on-Hosting/index.md b/00_blog/00015_Admin/00005_Notes-on-Hosting/index.md
new file mode 100644
index 0000000..1345bf4
--- /dev/null
+++ b/00_blog/00015_Admin/00005_Notes-on-Hosting/index.md
@@ -0,0 +1,53 @@
+# Miscellanous Notes on Server Hosting specifics
+
+## LUKS container over sshfs
+
+* enable user\_allow\_other in /etc/fuse.conf
+* sshfs -o allow\_root user@server:/BACKUPS/ ~/mnt/
+* dd if=/dev/urandom of=~/mnt/megaloman bs=1M count=512
+* sudo cryptsetup -y luksFormat ~/mnt/megaloman
+* sudo cryptsetup luksOpen ~/mnt/megaloman vol1
+* sudo mkfs.ext4 /dev/mapper/vol1
+* sudo mount /dev/mapper/vol1 /mnt
+* df -h | grep vol1
+* sudo umount /mnt
+* sudo cryptsetup luksClose vol1
+* fusermount -u ~/mnt
+
+NOTE: backup your data example use : rsync -a –info=progress2 source dist
+
+## Ownlcoud
+
+### Mounting Ownclouds DavFS
+
+ $ apt-get install davfs2
+
+ * since owncloud seems to have problems with locks, edit /etc/davfs2/davfs2.conf and set use_locks to 0 in order to allow creating files (as well as probably writing)
+
+ $ mount -t davfs https://secure.sf.com/owncloud/remote.php/webdav /mnt/
+
+### rescan/rebuild ownlocud files database
+
+ inside ownlcoud directory run:
+ sudo -u www-owncloud php console.php files:scan –all
+
+## Postfix
+
+We want to handle different domains on a single postfix server and have virtual users along real unix users.
+For the virtual users we use uid/gid 5000.
+
+Relevant config files are:
+
+ /etc/postfix/master.cf
+ /etc/postfix/main.cf
+ /etc/postfix/smtpd_sender_login_maps (tells which emails belong to which login)
+ /etc/postfix/vmailbox (sepcifies our VIRTUAL mailboxes and the names of the spoolfiles)
+ /etc/postfix/virtual (aliases for our local unix users)
+ /etc/dovecot/users (specifies the logins, passwords, home directories,..)
+ /etc/dovecot/conf.d/10-mail (set inbox and mailbox dirs)
+
+Be careful about the permissions of the different folders, so uid/gid 5000, postfix and dovecot can access as relevant.
+
+A very nice tutorial on setting up postfixadmin can be found here:
+
+ https://lelutin.ca/posts/installing_postfix_-_clamav_-_spamassassin_-_dovecot_-_postfixadmin_on_debian_squeeze/
diff --git a/00_blog/00015_Admin/00008_Docker/index.md b/00_blog/00015_Admin/00008_Docker/index.md
new file mode 100644
index 0000000..b7bc5c0
--- /dev/null
+++ b/00_blog/00015_Admin/00008_Docker/index.md
@@ -0,0 +1,14 @@
+# Docker Volume Backup
+
+Identify volume:
+
+ $ docker inspect my_container_name | grep -C 1 -i Source
+
+Backup the directory to a tar file:
+
+ $ docker run –rm –volumes-from my_container_name -v $(pwd):/backup ubuntu tar cvf /backup/backup_db.tar /var/lib/mysql
+
+Restore the volume:
+
+ $ docker run –rm –volumes-from my_container_name -v $(pwd):/backup ubuntu bash -c "cd /var/lib/mysql && tar xvf /backup/backup_db.tar –strip 1"
+
diff --git a/00_blog/00015_Admin/00010_Various-Cheat-Sheets/00105_GNU-Screen-Multiplexer-Keyboard-Shortcuts/index.md b/00_blog/00015_Admin/00010_Various-Cheat-Sheets/00105_GNU-Screen-Multiplexer-Keyboard-Shortcuts/index.md
new file mode 100644
index 0000000..80b24b1
--- /dev/null
+++ b/00_blog/00015_Admin/00010_Various-Cheat-Sheets/00105_GNU-Screen-Multiplexer-Keyboard-Shortcuts/index.md
@@ -0,0 +1,43 @@
+GNU Screen - Keyboard Shortcuts
+=============================================
+
+Invocation
+----------
+ $ screen [-S session_name] # simply start new session
+ $ screen -ls # lists sessions
+ $ screen -r session_name # resume detached session
+ $ screen -d -R session_name # resume session (also detach or create)
+ $ screen -d -RR #resume first session
+
+Shortcuts
+---------
+ ctrl-a c NEW WINDOW
+ ctrl-a n / ctrl-a p NEXT/PREVIOUS
+ ctrl-a d DETACH
+ ctrl-a D D DETACH and LOGOUT
+
+ ctrl-a S SPLIT HORIZ.
+ ctrl-a | SPLIT VERTICAL
+ ctrl-a tab NEXT REGION
+ ctrl-x REMOVE REGION
+ ctrl-a q REMOVE ALL OTHER REGIONS
+ ctrl-a F FIT WINDOW
+
+ ctrl-a c CLEAR SCREEN
+ ctrl-a k KILL WINDOW
+ ctrl-a \ QUIT
+
+ ctrl-a esc COPY/SCROLLBACK MODE
+
+Layout Commands
+---------------
+ ctrl-a : #enter command mode
+ :layout new [title]
+ :layout remove [n|title]
+ :layout next
+ :layout prev
+ :layout show #list layouts
+
+Reference
+---------
+ [1] $ man screen
diff --git a/00_blog/00015_Admin/00010_Various-Cheat-Sheets/00110_Midnight-Commander-Cheatsheet/index.md b/00_blog/00015_Admin/00010_Various-Cheat-Sheets/00110_Midnight-Commander-Cheatsheet/index.md
new file mode 100644
index 0000000..eedc66a
--- /dev/null
+++ b/00_blog/00015_Admin/00010_Various-Cheat-Sheets/00110_Midnight-Commander-Cheatsheet/index.md
@@ -0,0 +1,61 @@
+###>>>KWD midnight commander cheatsheet, mc cheatsheet, mc shortcuts, midnight commander shortcuts
+###>>>DSC Cheatsheet for Midnight Commander summarizing the most useful shortcuts.
+Midnight Commander Cheatsheet
+=============================
+
+A short cheat-sheet summarizing midnight commander's most useful shortcut keys.
+
+Basic Navigation
+----------------
+ tab switch active panel
+ up/down select previous/next rown
+ return open selected directory
+ alt-o open selected directory on other panel
+
+View
+----
+ alt-. toggle hidden files
+ ctrl-o toggle console
+ alt-t toggle listing mode
+ alt-i sync with other panel
+ ctrl-u swap panels
+
+Miscellaneous
+-------------
+ shift-f6 rename, filling in the current filename
+ insert/ctrl-t/+/\/* selections
+ esc-tab auto complete
+ ctrl-enter / alt-enter copy currently selected filename to console
+ Ctrl + Shift + Enter copy full path
+
+ alt-shift-h show dir history
+ alt-y/alt-u navigate history
+
+ alt+?/alt-s/ctrl-s searches
+
+ ctrl-space calculte size
+ ctrl - x c chmod
+ ctrl - x o chown
+
+Troubleshooting / Extras
+------------------------
+Adding this to your _.bashrc_ will let _mc_ stay in the current directory after exiting:
+
+ alias mc='. /usr/libexec/mc/mc-wrapper.sh'
+
+I run _midgnight commander_ inside _tmux_ and the shifted function keys did not work as
+expected. Use midnight commanders _Learn Keys_ dialog to fix this.
+
+Set default viewer for pdf:
+
+ xdg-mime default evince.desktop application/pdf
+
+Set default editor:
+
+ alias mc='EDITOR=vim'
+
+Reference
+---------
+
+* http://klimer.eu/2015/05/01/use-midnight-commander-like-a-pro/
+* man mc
diff --git a/00_blog/00015_Admin/00010_Various-Cheat-Sheets/00120_GDB/index.md b/00_blog/00015_Admin/00010_Various-Cheat-Sheets/00120_GDB/index.md
new file mode 100644
index 0000000..5aebdf3
--- /dev/null
+++ b/00_blog/00015_Admin/00010_Various-Cheat-Sheets/00120_GDB/index.md
@@ -0,0 +1,29 @@
+# GDB
+
+ http://www.cprogramming.com/debuggers.html
+
+ use gcc or clang with : -ggdb -O0
+
+ h - help
+
+ r - run
+ c - continue
+ n - next
+ s - step
+
+ b - break <line>
+ p - print <var>
+
+ wa - watch <var>
+
+ bt
+ frame <number>
+ list
+ info locals
+
+ set <var> = <value>
+ set substitute-path FROM TO
+
+ call <func>
+
+
diff --git a/00_blog/00015_Admin/00010_Various-Cheat-Sheets/index.md b/00_blog/00015_Admin/00010_Various-Cheat-Sheets/index.md
new file mode 100644
index 0000000..ee779fa
--- /dev/null
+++ b/00_blog/00015_Admin/00010_Various-Cheat-Sheets/index.md
@@ -0,0 +1,3 @@
+Cheat Sheets
+============
+A growing collection of some of my cheat sheets.
diff --git a/00_blog/00015_Admin/00020_Benchmarking-and-Stress-testing/index.md b/00_blog/00015_Admin/00020_Benchmarking-and-Stress-testing/index.md
new file mode 100644
index 0000000..facfc17
--- /dev/null
+++ b/00_blog/00015_Admin/00020_Benchmarking-and-Stress-testing/index.md
@@ -0,0 +1,68 @@
+# Benchmarking
+
+ May 12, 2017
+
+## Tools for Stress Testing your RIG
+
+ Some nice tools to stress-test your computer:
+
+ CPU: Prime95
+ GPU: FurMark
+ RAM: MemTest86+
+ HDD/SSD: S.M.A.R.T
+
+ Ref: http://www.pcworld.com/article/2028882/keep-it-stable-stupid-how-to-stress-test-your-pc-hardware.html
+
+## Networking
+
+ 1. Connected my [laptop] and [desktop] via 5meter cat5e cable -> 1000mbit full duplex link
+ 2. created ~1.5G ramdisks with tmpfs on each.
+ 3. created a 1 giga file with data from /dev/urandom on [desktop]
+ 4. copied file with scp from [desktop] to [laptop]
+ 5. copied file with scp from [laptop] to [desktop]
+ 6. repeated 4 & 5 10 times : average speed ~70+MB/s from desk & 80+MB/s to desk, link stays up all the time. ping around 0.2-0.3ms
+ 7. repeated 1-6 with my other 3meter ethernet cable.
+ 8. tried both direction simultanously which gave a total data throughput even over 100MB/s
+
+## Hard Disk
+
+To get some information about the disk run:
+
+Request identification info directly from the drive, which is displayed in a new expanded format with considerably more detail than with the older -i option.
+
+ $ hdparm -I /dev/sda
+
+Timings
+
+ $ hdparm -tT /dev/sda
+
+Clear Cache
+
+ $ echo 3 > /proc/sys/vm/drop_caches
+
+I am using this block-size and count which results in ~2GB:
+
+ $ dd [...] bs=1048576 count=2048
+
+READ:
+
+ $ dd if=test of=/dev/null
+ $ dd if=/dev/sdX of=/dev/null
+
+WRTIE:
+
+ $ dd if=/dev/zero of=test
+ $ dd if=/dev/zero of=/dev/sdX
+
+smartmontools:
+
+ seatage:
+ Raw_Read_Error_Rate
+ Seek_Error_Rate
+
+ example:
+ % python
+ >>> 200009354607 & 0xFFFFFFFF
+ 2440858991 <---- total number
+ >>> (200009354607 & 0xFFFF00000000) >> 32
+ 46 <--- number of errors
diff --git a/00_blog/00015_Admin/00030_Fixing-HDD/index.md b/00_blog/00015_Admin/00030_Fixing-HDD/index.md
new file mode 100644
index 0000000..0bae730
--- /dev/null
+++ b/00_blog/00015_Admin/00030_Fixing-HDD/index.md
@@ -0,0 +1,48 @@
+# Fixing HDD after Free Falling
+
+So you also dropped your hard-disk and some of your secotrs got damaged,
+probably by the head hitting the platter?
+
+Backup all your data.
+
+## smartctl
+
+Try from fastest to slowest to find faulty sector: replace LBAi\_START,LBA\_END with meaningful values.
+
+ smartctl -t [long|conveyence|short|select,LBA_START-LBA_END] -C /dev/sda
+
+## hdparm
+
+Bi-search via –read-sector if complete ranges are affected (as in my case) and then fix them in one step:
+
+ for i in {36312851..36312886}; do hdparm --write-sector $i /dev/sda; done
+
+## Example
+
+Exemplary session fixing one sector:
+
+**WARNING: this will destroy your data !**
+
+ 1) # smartctl -a /dev/sda | egrep 'Pend|Real|Offline_Unc'
+
+ 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 4
+ 197 Current_Pending_Sector 0x0012 098 098 000 Old_age Always - 47
+ 198 Offline_Uncorrectable 0x0010 098 098 000 Old_age Offline - 47
+
+ 2) # smartctl -t short /dev/sda
+
+ 3) # smartctl -l selftest /dev/sda
+
+ [...] 1 Short offline Completed: read failure 90% 10632 152076520
+
+ 4) # hdparm --read-sector 152076520 /dev/sda # verification
+
+ [...] reading sector 152076520: FAILED: Input/output error
+
+ 5) # hdparm --write-sector 152076520 /dev/sda
+
+ 6) # smartctl -a /dev/sda | egrep 'Pend|Real|Offline_Unc'
+
+ 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 4
+ 197 Current_Pending_Sector 0x0012 098 098 000 Old_age Always - 46
+ 198 Offline_Uncorrectable 0x0010 098 098 000 Old_age Offline - 46
diff --git a/00_blog/00015_Admin/00040_Oneliners/index.md b/00_blog/00015_Admin/00040_Oneliners/index.md
new file mode 100644
index 0000000..c16a515
--- /dev/null
+++ b/00_blog/00015_Admin/00040_Oneliners/index.md
@@ -0,0 +1,41 @@
+# Oneliners
+
+A Growing Collection of Linux Command Line One-Liners
+
+Please believe me... this collection was really supposed to grow over time...
+
+inside a direcotry show disk usage of all hidden files and directories and sort by size:
+
+ $ du $(ls .* -d | tail -n +3) -hs |sort -h
+
+inside a direcotry show disk usage of all files and directories (also hidden) and sort by size.
+Exclude 'garbage' file.
+
+ $ du . -a -d 1 -h --exclude=garbage | sort -h
+
+Tar all files in current directory, excluding ./DATA and ./.cache
+
+ $ tar --exclude=.cache -cvf home_miguel_20180216.tar .
+
+Find files in ./ARCHIVE NOT belonging to a specific user: miguel
+
+ $ find ARCHIVE/ \! -user miguel
+
+set folder/ permissions to Read/Browse only for owner recursively
+
+ $ sudo chmod -R u=r,g=,o= folder/
+ $ chmod -R u=rX,g=,o= folder/
+
+find all mails from Boban when in the maildir full of mailboxes and print only short headers without bodies:
+
+ $ grepmail -H -B -Y ‘(^TO:|^From:)’ Boban *
+
+not really a one-lier but will print 256 colors in a bash:
+
+ for i in {0..255} ; do
+ printf "\x1b[48;5;%sm%3d\e[0m " "$i" "$i"
+ if (( i == 15 )) || (( i > 15 )) && (( (i-15) % 6 == 0 )); then
+ printf "\n";
+ fi
+ done
+
diff --git a/00_blog/00015_Admin/00050_Wine-in-LXC/index.md b/00_blog/00015_Admin/00050_Wine-in-LXC/index.md
new file mode 100644
index 0000000..24344e0
--- /dev/null
+++ b/00_blog/00015_Admin/00050_Wine-in-LXC/index.md
@@ -0,0 +1,197 @@
+Wine inside LXC
+===============
+
+Abstract
+--------
+
+Running Wine inside an unpriviliged LXC Container as a secondary user,
+utilizing the host systems OpenGL 3D acceleration and PulseAudio.
+
+Host System
+-----------
+
+* Debian 9 / Stretch
+* Xorg running as primary user "miguel"
+* NVIDIA proprietary drivers (debian's contrib/non-free)
+* PulseAudio up & running as primary user (I run pavucontrol as miguel)
+* A Secondary user "retard2" with uid/gid=1002
+
+Preparations
+------------
+
+Allow access to the display server and audio. Note that you should
+restrict this in a real world setup (e.g. auth-ip-acl):
+
+ migue@host$ xhost + # allow remote X access
+
+add this lines to /etc/pulse/default.pa and restart pulsaudio:
+
+ load-module module-native-protocol-tcp auth-anonymous=1
+ load-module module-zeroconf-publish
+
+Create Container
+----------------
+
+ 1. In order to allow the creation of virutal network bridges as our
+ secondary user, add the following two lines to /etc/lxc/lxc-usernet:
+
+ retard2 veth virbr0 2
+ retard2 veth lxcbr0 10
+
+ 2. Login as retard2 ("su" does not work well with cgroups)
+
+ miguel@host$ sudo machinectl login # than login as retard2
+ retard2@host$ cat /proc/self/cgroup # just check cgroups if you want
+
+ 3. Add subuid subgid mappings to /home/retard2/.config/lxc/default.conf
+ You can check the ranges in /etc/subuid and /etc/subgid:
+
+ lxc.id_map = u 0 1541792 65536
+ lxc.id_map = g 0 1541792 65536
+
+ 4. We are ready to create the lxc container as retard2:
+
+ retard2@host$ lxc-create -n winebox -t download
+
+ Select exactly the same distro / version / arch as you run on the
+ host. i.e. debian / stretch / amd64
+
+ retard2@host$ lxc-ls # assure that "winebox" LXC was created
+
+ 5. Adapt the new config in: ~/.local/share/lxc/winebox/config adding:
+
+ # NET
+ lxc.network.type = veth
+ lxc.network.link = lxcbr0
+ lxc.network.flags = up
+ lxc.network.hwaddr = 00:16:3e:be:3c:5a
+
+ # X
+ lxc.mount.entry = /dev/dri dev/dri none bind,create=dir
+ lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,create=dir
+
+ # NVIDIA
+ lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,create=file
+ lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,create=file
+
+ 6. Finally start the container and enter its realm:
+
+ retard2@host$ lxc-start -n winebox
+ retard2@host$ lxc-ls --running # check it is up & running
+ retard2@host$ lxc-attach -n winebox -- su # enter container (as root)
+
+Inside the Container
+--------------------
+
+ 1. Adapt /etc/apt/sources.list to make use of "contrib" and "non-free"
+ and run:
+
+ root@winebox$ apt update
+
+ 2. Get OpenGL running
+
+ root@winebox$ apt upgrade
+ root@winebox$ apt install mesa-utils
+ root@winebox$ apt install xserver-xorg-video-nvidia
+ root@winebox$ DISPLAY=:0 glxgears # check
+ root@winebox$ DISPLAY=:0 glxinfo | grep "direct render" # check
+
+ 3. Get PulseAudio running.
+ Please adapt the IP to the host's lxcbr0 ip address.
+
+ root@winebox$ apt install pavucontrol
+ root@winebox$ DISPLAY=:0 PULSE_SERVER=10.0.5.1 pavucontrol
+
+ At this point we should have accelerated video and audio running from
+ inside our LXC. Well Done!
+
+Wine
+----
+
+A few trivial requirements:
+
+ root@winebox$ apt install wget
+ root@winebox$ apt install gnupg
+ root@winebox$ apt install apt-transport-https
+
+Now let's get some wine accoring to: https://wiki.winehq.org/Debian:
+
+ root@winebox$ sudo dpkg --add-architecture i386
+ root@winebox$ wget -nc https://dl.winehq.org/wine-builds/Release.key
+ root@winebox$ sudo apt-key add Release.key
+
+Add the debian stretch wine repo to your /etc/apt/sources.list:
+
+ deb https://dl.winehq.org/wine-builds/debian/ stretch main
+
+ root@winebox$ apt update
+ root@winebox$ apt-get install --install-recommends winehq-stable
+
+Unfortunatelly wine still depends on the 32-bit versions of some libs so
+we have to replace our 64-bit verions by running:
+
+ root@winebox$ apt install libgl1-nvidia-glx:i386
+
+Restrict Networking
+-------------------
+
+Now You can optionally restrict any communication with the outside world:
+
+ miguel@host$ sudo iptables -F FORWARD #block traffic
+ miguel@host$ sudo iptables -P FORWARD DROP #block traffic
+
+If your host is forwarding traffic you will need to set up some rules.
+
+Finalizing Contianer
+--------------------
+
+ 1. Create a non-root user:
+ root@winebox$ adduser lxc-retard
+
+ 2. Now we can exit the container with :
+ root@winebox$ exit
+
+ 3. Stop the container on the host. This might take some while.
+ retard2@host$ lxc-stop -n winebox
+
+ 4. THIS WOULD BE A VERY GOOD MOMENT TO SNAPSHOT THE CONTIANER
+ FOR LATER REUSE!
+
+Summary
+-------
+
+Congratulations! Now you are running "wine" as an unprivileged user
+inside of an unprivileged container of a secondary user, utlizing your
+hosts hardware acceleration and PulseAudio capabilities.
+
+Optionally traffic forwarding has been blocked, for increased security.
+
+Using the Container
+-------------------
+
+To use your new container you will need to go through the following
+steps each time:
+
+ miguel@host$ xhost +
+ miguel@host$ sudo iptables -F FORWARD #block traffic
+ miguel@host$ sudo iptables -P FORWARD DROP #block traffic
+ miguel$host$ sudo machinectl login # and login as retard2
+
+ retard2@host$ lxc-start -n winebox
+
+Now you can attach to the container as lxc-retard user:
+
+ retard2@host$ lxc-attach -n winebox -- su lxc-retard
+
+Alternatively we can attach as root:
+
+ retard2@host$ lxc-attach -n winebox -- su
+
+Do not forget to stop container once you are finished:
+
+ retard2@host$ lxc-stop -n winebox
+
+Remember that stopping might take a while. Be patient!
+
+Make sure to automate/adapt the process, according to your personal
+preferences and requirements.
diff --git a/00_blog/00015_Admin/00070_Password-Management-on-the-Command-Line/index.md b/00_blog/00015_Admin/00070_Password-Management-on-the-Command-Line/index.md
new file mode 100644
index 0000000..1b45b02
--- /dev/null
+++ b/00_blog/00015_Admin/00070_Password-Management-on-the-Command-Line/index.md
@@ -0,0 +1,89 @@
+# Passoword Managemet from the Command Line
+
+ February 8, 2018
+
+Today we will look at some simple, portable yet effective ways to manage
+your passwords from the command line. You will need nothing more than
+**apg** and one of **gnugpg** or **openssl** along with your favorite
+text editor.
+
+~~~~~~~~~~ {.bash}
+apt install apg gnupg openssl
+~~~~~~~~~~
+
+## Generate your Password
+
+Before you can manage your passwords, you will obviously first have to
+generate them. Since your brain might be a very poor random number
+generator you can use `/dev/random` here.
+
+A few examples for generating random passwords with **apg** follow:
+
+~~~~~~~~~~ {.bash}
+# generate a few random passwords with default settings using /dev/random
+apg -c /dev/random
+
+# set password length to 20-30 characters and generate 10 passwords
+apg -m20 -x30 -n10 -c /dev/random
+
+Example output:
+ gootCoHuecJarItOojBouFrag
+ OignisholWulfisOdPearshed
+ fekfedsornUgbacyoimyab
+ ...
+
+# Other useful flags:
+#- a0 pronouncable
+# -a1 random
+
+# If you use -a1 you can specify the symbolset with -M
+# You can combine multiple -M options as in: -MCnS
+
+# -MC / -Mc must/can use small leters set
+# -MC / -Mc must/can use capital symbol set
+# -MN / -Mn must/can use numeral symbol set
+# -MS / -Ms must/can use special symbol set
+
+
+# Finally we can exclude specific characters from the symbol set with -E
+apg -a1 -m10 -MN -E 02345678 -c /dev/random
+
+Example output:
+ 9119191199
+ 9919119919
+ 1199999911
+ ...
+~~~~~~~~~~
+
+## Managing your Password Safe
+
+Just put the passwords in a plaintext file (named mypasswords in the examples below),
+along with related data and encrypt them symmetrically via **gnupg**.
+Decrypt them as needed. You will be prompted for a passphrase in each case.
+
+Note that **gnupg** might cache your password for a few minutes,
+so don’t worry if you can decrypt them without beeing prompted.
+
+~~~~~~~~~~ {.bash}
+#encrypyt. Don't forget to delete the source file
+gpg -c mypasswords
+
+#decrypt and write to STDOUT
+gpg -d mypasswords.gpg
+~~~~~~~~~~
+
+You might prefer openssl, which some claim to be even more portable
+
+~~~~~~~~~~ {.bash}
+#encrypyt. Don't forget to delete the source file
+openssl aes-256-cbc -salt -in mypasswords > mypasswords.aes
+
+#decrypt and write to STDOUT
+openssl aes-256-cbc -d -in mypasswords.aes
+~~~~~~~~~~
+
+Adding, Editing or Deleting a password constitutes simply of the three steps:
+
+* decrypt your password file and save it in a safe place
+* edit the passwordfile as needed with your favorite text editor
+* encrypt the password flie back again
diff --git a/00_blog/00015_Admin/00090_Miguels-KVM-Adventures/index.md b/00_blog/00015_Admin/00090_Miguels-KVM-Adventures/index.md
new file mode 100644
index 0000000..722d20f
--- /dev/null
+++ b/00_blog/00015_Admin/00090_Miguels-KVM-Adventures/index.md
@@ -0,0 +1,220 @@
+Miguel’s KVM Adventures
+=======================
+
+February 7, 2018
+
+Some notes about my explorations of the World of KVM virtualization.
+
+## Abstract
+In my never ending pursuit of abstraction and encapsulation I recently started integrating all of my services into docker containers and deploying them inside virtual kvm guests. This article presents my continues effort to summarize the findings of this ongoing journey, which implies that the following material might be subject to change anytime without notice. This collection of notes and sentimental thoughts comes without any warranty or implication of fitness for any purpose. You have been warned! Now feel free to make use of it.
+
+## Libvirt
+This are the most common virsh commands I use to manage the kvm guests, where _domain_ is simply the name of the targeted guest and _FILE_ the name of a XML file. Remember that libvirt supports other virtualization infrastructure as well (Xen, VMware, QEMU). Most of the options are self-explanatory. With ‘virsh create’ starting a transient domain, that will disappear after shutdown, and the define/start combo resulting in a persistent domain that will even survive host restarts
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.bash}
+ virsh create _FILE_ # create domain from xml file
+ virsh destroy _domain_ # forcefully remove domain
+
+ virsh define _FILE_ # define domain from xml file
+ virsh undefine _domain_ # undefine domain
+
+ virsh suspend _domain_ # stop all scheduling
+ virsh resume _domain_ # start scheduling
+
+ virsh start _domain_ # power on domain
+ virsh shutdown _domain_ # send corresponding ACPI signal to guest
+
+ virsh edit _domain_ # edit xml config in place
+
+ virsh autostart _domain_ # set autostart flag
+ virsh autostart _domain_ --disable # unset autostart flag
+ virsh list [--all] [--autostart] # list defined/active/autostart domains
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## Disk Image
+Most of the guest systems will require some sort of storage. Creating a fresh qcow2 image, to back our virtual disk, is as simple as running:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.bash}
+ qemu-img create -f qcow2 milky.img 200G
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Do not worry, the image will only take a fraction of the declared space, and will not grow larger than necessary, due to trimming, which will be explained later.
+
+
+## Domain Definition
+Domains, this is how libvirt calls our ‘guests’, can be defined in XML formatted files. This is my minimalistic defintion of the domain ‘milkman’ carrying 8GB RAM and 4 CPUs:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.xml .numberLines}
+ <domain type='kvm'>
+
+ <name>milkman</name>
+ <uuid>504d80ee-1427-11e8-9861-0708f4830f96</uuid>
+
+ <memory unit='KiB'>8388608</memory>
+ <currentMemory unit='KiB'>8388608</currentMemory>
+ <vcpu>4</vcpu>
+
+ <os>
+ <type>hvm</type>
+ <boot dev='hd'/>
+ </os>
+
+ <features>
+ <acpi/>
+ </features>
+
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+
+ <devices>
+
+ <emulator>/usr/bin/kvm</emulator>
+
+ <disk type='file' device='disk'>
+ <driver name='qemu' type='qcow2' discard='unmap' />
+ <source file='/home/miguel/KVM/images/milky.img'/>
+ <target dev='sda' bus='scsi'/>
+ </disk>
+
+ <interface type='bridge'>
+ <source bridge='virbr1'/>
+ <model type='virtio'/>
+ </interface>
+
+ <controller type='scsi' index='0' model='virtio-scsi' />
+
+ <graphics type='vnc' port='55555' autoport='no' listen='::1' />
+
+ </devices>
+
+ </domain>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Beside the obvious RAM size and CPU count w specify the underlying qcow2 image, to be used for our emulated hard disk. We also want to specify discard=’unmap’ and make use of a virtio-scsi controller, both to allow trimming. Trimming will be covered in more detail later.
+
+Our virtual machine relies on a virtual bridge virbr1. It is very important to use type=’virtio’ here. The defaults resulted in extremely poor network performance, at least in some of my particular use cases. The setup of the bridge with accompanying parameters is described in the next section about networking.
+
+At the very last we tell the vnc-server to listen on ::1 at port 5555. This values can be also adjusted during run-time as explained later on.
+
+In order to install an operating system we can add a virtual cd-rom along with an iso-image by augmenting the devices section in our XML defintion with the following lines:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.xml .numberLines}
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <source file='/home/miguel/KVM/isos/debian-9.3.0-amd64-netinst.iso'/>
+ <target dev='hdc' bus='ide'/>
+ <readonly/>
+ </disk>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Make sure to adapt the boot order in the os section by adding an appropriate line, so you end up with this:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.xml .numberLines}
+ <os>
+ <type>hvm</type>
+ <boot dev='cdrom'/>
+ <boot dev='hd'/>
+ </os>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## Networking
+Since my primary interface to the virtual machines is SSH, reliable network connectivity is one of the primary foci. IPv4 addresses became scarse so we will not waste any for the host systems virbr1 or eth0. The following diagram illustrates my IPv4 setup of a simple arp proxy utilizing ipv4 forwarding. The guests use their public ipv4 addreses and the ips of the hosts gateway.
+
+![](ipv4.png){.img-fluid}
+
+There is no need to save address space in case of IPv6 since we have a complete /64 IPv6 subnet at our disposal. While only a few guests are accessible by their IPv4 public addresses directly, we have virtually an infinite number of IPv6 addresses. Sidenote: One single /64 IPv6 subnet consists of 2^64 different addresses, which is over four billion times more than there are IPv4 addresses in the whole world! I use just the lower /65 half of our /64 subnet for the guests while the IPv6 address of the hosts NIC lies in the upper half.
+
+My IPv6 setup in /etc/network/interface goes along this lines:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.numberLines}
+ #/etc/network/interfaces
+
+ iface eth0 inet6 static
+ address2a01:6a8:122:5622:8000::88/128
+ gateway fe80::1
+
+ iface virbr1 inet6 static
+ pre-up brctl addbr virbr1
+ address 2a01:6a8:122:5622::3/65
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+All we need to do is activate IPv6 forwarding on the host to let our guests communicate with the world outside.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.bash}
+ sysctl -w net.ipv6.conf.all.forwarding=1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+And this is how the IPv6 config of a particular guest looks like:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.numberLines}
+ iface ens3 inet6 static
+ address 2a01:6a8:122:5622::13/65
+ gateway 2a01:6a8:122:5622::3
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Things could be improved further by running a DHCP server, like dnsmasq, to assign the guest addresses, but for now I want to keep it simple.
+
+## VNC
+
+While ssh is perfectly sufficient for most of the time, you sometimes might need to have a look at the frame-buffer console. You can start/stop listening on a specific port or interface with:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.bash}
+ sudo virsh qemu-monitor-command <guest_name> --hmp change vnc <listen_ip>:<port>
+ sudo virsh qemu-monitor-command <guest_name> --hmp change vnc none
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Interestingly the port is offset by 5900 meaning that e.g. :87 will let the vnc-server listen on port 5987!
+Check it with netstat -tulpn to be sure.
+
+## Backup Running KVM
+
+One of the beautiful things about using virtual machines is the level of control we have over them. We can for instance backup our running machines with almost no downtime using the following approach:
+
+dump config to xml file
+save kvm state (RAM etc.) and stop the guest.
+create an overlay on the underlying qcow2 disk image.
+restore the kvm on the overlay.
+backup the original disk image.
+commit deltas from overlay to the image.
+switch to the image with merged changes and delete deltas.
+
+A downtime will be experienced only between the save and restore steps, while the most time consuming part of the process, backing up the disk, can be delayed. The XML, RAM state and HDD snapshot contain all the data required to re-spawn an identical consistent copy of our virtual machine, as at the time of the backup. NOTE: the clock might cause problems if not adjusted, if some applications rely on it. Ntp can take care of that. A fast and dirty implementation of this technique, for my particular setup, can be found on our gitweb [2]. A more complete but complex solution is Daniel Berteaud’s perl script [3], which I frankly did _not_ test myself.
+
+## Docker Containers
+A common use case is to run docker inside the virtual guests, which makes it an integral part of my ‘KVM Adventures’. I prefer to remap docker’s root user to a non-privileged user of my host, as well as utilize syslog instead of the default json-file driver. This is reflected by the following config:
+
+/etc/docker/daemon.json:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.json .numberLines}
+ {
+ "userns-remap": "miguel",
+ "log-driver": "syslog"
+ }
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Optionally you can tell rsyslog to log deamon.\* entries into a separate file and adjust logrotation as outlined here [5].
+
+## Miscellaneous
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.bash}
+ virt-host-validate # validate host virtualization setup
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Use this RedHat virtio drivers when you install win10 [6].
+
+* https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/
+
+Forward ipv4 to an ipv6 only:
+
+socat TCP4-LISTEN:51247,fork,su=nobody TCP6:[2a01:4f8:192:5112::6]:51247
+
+## References
+
+ [1] https://libvirt.org/formatdomain.html
+ [2] https://gitweb.softwarefools.com/?p=miguel/kvm_tools.git
+ [3] http://repo.firewall-services.com/misc/virt/virt-backup.pl
+ [4] https://www.linux-kvm.org/page/Tuning_KVM
+ [5] https://www.wolfe.id.au/2015/05/03/syslog-logging-driver-for-docker/
+ [6] https://www.funtoo.org/Windows_10_Virtualization_with_KVM
diff --git a/00_blog/00015_Admin/00090_Miguels-KVM-Adventures/ipv4.png b/00_blog/00015_Admin/00090_Miguels-KVM-Adventures/ipv4.png
new file mode 100644
index 0000000..3dac4ed
--- /dev/null
+++ b/00_blog/00015_Admin/00090_Miguels-KVM-Adventures/ipv4.png
Binary files differ
diff --git a/00_blog/00015_Admin/index.md b/00_blog/00015_Admin/index.md
new file mode 100644
index 0000000..fe5bd15
--- /dev/null
+++ b/00_blog/00015_Admin/index.md
@@ -0,0 +1,2 @@
+Admin Stuff
+===========
diff --git a/00_blog/00018_Building/00030_The-Hell-of-Autotools/index.md b/00_blog/00018_Building/00030_The-Hell-of-Autotools/index.md
new file mode 100644
index 0000000..746bd82
--- /dev/null
+++ b/00_blog/00018_Building/00030_The-Hell-of-Autotools/index.md
@@ -0,0 +1,74 @@
+The Hell of Autotools
+=====================
+ March 19, 2018
+In this trivial example we compile a custom **webkit2gtk+ extension** with
+**autotools**. For a start we need to provide two files, `Makefile.am`
+and `configure.ac`, beside our actual `ext.c` source file, which contains
+the extension code itself.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.c .numberLines}
+// File: ext.c //
+
+#include <webkit2/webkit-web-extension.h>
+
+G_MODULE_EXPORT void
+webkit_web_extension_initialize_with_user_data (WebKitWebExtension *extension,
+ GVariant *user_data)
+{
+ g_print("Hello Extension!\n");
+}
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.makefile .numberLines}
+# File: Makefile.am #
+
+webextension_LTLIBRARIES = libmyappwebextension.la
+webextensiondir = /home/miguel/temp
+
+WEB_EXTENSION_CFLAGS = `pkg-config --cflags webkit2gtk-web-extension-4.0`
+WEB_EXTENSION_LIBS2 = `pkg-config --libs webkit2gtk-web-extension-4.0`
+
+libmyappwebextension_la_SOURCES = ext.c
+libmyappwebextension_la_CFLAGS = $(WEB_EXTENSION_CFLAGS)
+libmyappwebextension_la_LIBADD = $(WEB_EXTENSION_LIBS)
+libmyappwebextension_la_LDFLAGS = -module -avoid-version -no-undefined $(WEB_EXTENSION_LIBS2)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.makefile .numberLines}
+# File: configure.ac #
+
+AC_PREREQ([2.69])
+AC_INIT(ext,0.1,test@example.com)
+AM_INIT_AUTOMAKE
+AC_CONFIG_SRCDIR([ext.c])
+AC_PROG_CC
+LT_INIT
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Put the above files in a new fresh directory and you are ready to see the
+powers of autotools in action.
+
+Run the following commands on your pash prompt:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.bash}
+touch NEWS README AUTHORS ChangeLog
+aclocal
+autoconf
+automake --add-missing
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+After this steps, we end up with 18 files in our directory. Finally we
+can _configure_, _build_ and _install_ our extension. The following
+commands will probably look familiar. Note that the _configure_ step
+generates 6 additional files, totaling in **24 files** before the actual
+_make_ command is run.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.bash}
+./configure
+make
+make install
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+... just to compile one **single C file**.
diff --git a/00_blog/00018_Building/00040_Various-notes-on-Building/index.md b/00_blog/00018_Building/00040_Various-notes-on-Building/index.md
new file mode 100644
index 0000000..0639063
--- /dev/null
+++ b/00_blog/00018_Building/00040_Various-notes-on-Building/index.md
@@ -0,0 +1,93 @@
+# Various Notes on Building
+
+## Webkit
+
+Let’s compile a release with debug info and install to /usr/local
+
+~~~~~~ {.bash}
+wget https://webkitgtk.org/releases/webkitgtk-2.20.0.tar.xz
+tar -xvf webkitgtk-2.20.0.tar.xz
+cd webkitgtk-2.20.0
+# install all the libs that will be reported missing in the next step.
+# I could not find the woff2 stuff in debian so skipped it...
+cmake -DPORT=GTK -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_WOFF2=NO -GNinja
+# this takes about 30minutes on my i7-4790K .. zzzzz..zzz
+ninja
+sudo ninja install
+~~~~~~~~~~~
+
+ pkg-config
+
+ pkg-config uses our new build now:
+
+ [1] https://trac.webkit.org/wiki/BuildingGtk
+ [2] https://webkitgtk.org/
+
+## GCC
+
+This is how I build gcc (5.2.0) and binutils (2.25.1). Check [5] first.
+
+* unpack binutils-x.y.z
+* create a new directory binutils-x.y.z-build and inside it run the following commands:
+
+~~~~~~ {.bash}
+ $ ../binutils-x.y.z/configure --disable-nls --with-sysroot --enable-targets=all
+ $ make -j4
+ $ make install
+~~~~~~~~~~~~
+
+* unpack gcc-x.y.z and run the contrib/download_prerequisites script inside.
+* create a new directory: gcc-x.y.z-build and inside it run:
+
+~~~~~~ {.bash}
+ $ ../gcc-x.y.z/configure --disable-nls --enable-languages=c,c++ --enable-threads
+ $ make -j4
+ $ make install
+~~~~~~~~~~~~
+
+ REF:
+
+ [1] binutils and gcc README files.
+ [2] https://gcc.gnu.org/install/
+ [3] http://wiki.osdev.org/Building_GCC
+ [4] http://stackoverflow.com/questions/1726042/recipe-for-compiling-binutils-gcc-together
+ [5] https://gcc.gnu.org/install/prerequisites.html
+
+## Linux
+
+ cd linux-source-[xxx]
+ make mrproper
+ cp someconfig .config -i
+ make oldconfig
+ make menuconfig
+ make localmodconfig
+ make localyesconfig
+ make
+ (OPT) make modules
+ su
+ make install
+ (OPT) make modules_install
+ (OPT) update-intiramfs -c -k [kernel-postfix]
+
+ (REMOVE UNWANTED FILES FROM BOOT!)
+ update-grub
+ grub-install /dev/sda
+ reboot
+
+
+## Clang
+
+ http://llvm.org/releases/3.7.0/docs/CMake.html
+ http://clang.llvm.org/get_started.html
+ put MAKEFLAGS="-j8" or similar in front of your CMake invocations.
+
+ extracted llvm to ~/temp/clang/llvm-3.7.0.src/
+ extracted clang to ~/temp/clang/llvm-3.7.0.src/tools/clang/
+ extracted compiler-rt to ~/temp/clang/llvm-3.7.0.src/projects/compiler-rt
+ extracted libcxx to ~/temp/clang/llvm-3.7.0.src/projects/libcxx
+
+ $ cd ~/temp/clang/llvm-3.7.0-build
+ $ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/home/miguel/opt/llvm-3.7.0 ../llvm-3.7.0.src
+ $ cmake --build .
+ $ cmake --build . --target install
+
diff --git a/00_blog/00018_Building/index.md b/00_blog/00018_Building/index.md
new file mode 100644
index 0000000..1ee18e7
--- /dev/null
+++ b/00_blog/00018_Building/index.md
@@ -0,0 +1,3 @@
+# Building
+
+Some Random Notes about Building Software.
diff --git a/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/1.png b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/1.png
new file mode 100644
index 0000000..4a28a5b
--- /dev/null
+++ b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/1.png
Binary files differ
diff --git a/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/2.png b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/2.png
new file mode 100644
index 0000000..980bef5
--- /dev/null
+++ b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/2.png
Binary files differ
diff --git a/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/3.png b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/3.png
new file mode 100644
index 0000000..6deb011
--- /dev/null
+++ b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/3.png
Binary files differ
diff --git a/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/4.png b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/4.png
new file mode 100644
index 0000000..90c2d8a
--- /dev/null
+++ b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/4.png
Binary files differ
diff --git a/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/index.md b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/index.md
new file mode 100644
index 0000000..fab8cab
--- /dev/null
+++ b/00_blog/00020_Visual-Art/00035_A-quick-Trumpet-in-Blender/index.md
@@ -0,0 +1,25 @@
+Hear the Trumpets hear the Pipers
+=================================
+ November 9, 2017
+Today morning I was playing with blender’s cycles “material nodes”, the “sub-surf modifier” and the “depth of field” camera setting.
+
+I modeled a simple trumpet by extruding some cylinders and used the Diffuse and Glossy shaders for the trumpet, as well as a Wave texture for the marble surface.
+
+**Extruded** and scaled some basic **cylinders** to get a simple (yet unfinished) trumpet:
+
+![](1.png){.img-fluid}
+
+Added **materials**:
+
+![](2.png){.img-fluid}
+
+Added the **subsurf** modifier:
+
+![](3.png){.img-fluid}
+
+Configured **depth of field**:
+
+![](4.png){.img-fluid}
+
+Voila, ... it's alpha and omega's kingdom come.
+
diff --git a/00_blog/00020_Visual-Art/index.md b/00_blog/00020_Visual-Art/index.md
new file mode 100644
index 0000000..b840fc7
--- /dev/null
+++ b/00_blog/00020_Visual-Art/index.md
@@ -0,0 +1,3 @@
+3D Art
+======
+Some of my three dimensional creations, mostly in Blender.
diff --git a/00_blog/00020_WWW-Projects-and-Apps/aquarelle.jpg b/00_blog/00020_WWW-Projects-and-Apps/aquarelle.jpg
new file mode 100644
index 0000000..be593be
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/aquarelle.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/atenefunds.png b/00_blog/00020_WWW-Projects-and-Apps/atenefunds.png
new file mode 100644
index 0000000..c3086b2
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/atenefunds.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/atenefunds2.jpg b/00_blog/00020_WWW-Projects-and-Apps/atenefunds2.jpg
new file mode 100644
index 0000000..802410b
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/atenefunds2.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/atenefunds3.jpg b/00_blog/00020_WWW-Projects-and-Apps/atenefunds3.jpg
new file mode 100644
index 0000000..de42e2c
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/atenefunds3.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/atenefunds4.jpg b/00_blog/00020_WWW-Projects-and-Apps/atenefunds4.jpg
new file mode 100644
index 0000000..c4cb241
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/atenefunds4.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/atenekom.jpg b/00_blog/00020_WWW-Projects-and-Apps/atenekom.jpg
new file mode 100644
index 0000000..1ad56c7
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/atenekom.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/aufbau.jpg b/00_blog/00020_WWW-Projects-and-Apps/aufbau.jpg
new file mode 100644
index 0000000..28dc716
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/aufbau.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/austria-org-pl-old.png b/00_blog/00020_WWW-Projects-and-Apps/austria-org-pl-old.png
new file mode 100644
index 0000000..22437e5
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/austria-org-pl-old.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/austria-org-pl.png b/00_blog/00020_WWW-Projects-and-Apps/austria-org-pl.png
new file mode 100644
index 0000000..1aae36a
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/austria-org-pl.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/austrian-wine.png b/00_blog/00020_WWW-Projects-and-Apps/austrian-wine.png
new file mode 100644
index 0000000..4f71c98
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/austrian-wine.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/balbuza.png b/00_blog/00020_WWW-Projects-and-Apps/balbuza.png
new file mode 100644
index 0000000..7716c40
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/balbuza.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/bildershopping.jpg b/00_blog/00020_WWW-Projects-and-Apps/bildershopping.jpg
new file mode 100644
index 0000000..4967066
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/bildershopping.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/bildershopping.png b/00_blog/00020_WWW-Projects-and-Apps/bildershopping.png
new file mode 100644
index 0000000..b020599
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/bildershopping.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/bildershopping2.png b/00_blog/00020_WWW-Projects-and-Apps/bildershopping2.png
new file mode 100644
index 0000000..6492d85
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/bildershopping2.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/breitbandausschreibungen1.png b/00_blog/00020_WWW-Projects-and-Apps/breitbandausschreibungen1.png
new file mode 100644
index 0000000..6dff0b7
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/breitbandausschreibungen1.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/breitbandausschreibungen2.png b/00_blog/00020_WWW-Projects-and-Apps/breitbandausschreibungen2.png
new file mode 100644
index 0000000..eae90d5
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/breitbandausschreibungen2.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/brlr1.png b/00_blog/00020_WWW-Projects-and-Apps/brlr1.png
new file mode 100644
index 0000000..f1396ad
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/brlr1.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/bunzlauer.png b/00_blog/00020_WWW-Projects-and-Apps/bunzlauer.png
new file mode 100644
index 0000000..e3b1d70
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/bunzlauer.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/bunzlauershop.png b/00_blog/00020_WWW-Projects-and-Apps/bunzlauershop.png
new file mode 100644
index 0000000..7bac117
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/bunzlauershop.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/captainsdinner.png b/00_blog/00020_WWW-Projects-and-Apps/captainsdinner.png
new file mode 100644
index 0000000..b7e9143
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/captainsdinner.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/casamila.png b/00_blog/00020_WWW-Projects-and-Apps/casamila.png
new file mode 100644
index 0000000..969a0d8
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/casamila.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/condition-red.png b/00_blog/00020_WWW-Projects-and-Apps/condition-red.png
new file mode 100644
index 0000000..8e0b5df
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/condition-red.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/copterwerk.png b/00_blog/00020_WWW-Projects-and-Apps/copterwerk.png
new file mode 100644
index 0000000..ca71d3a
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/copterwerk.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/cornea.jpg b/00_blog/00020_WWW-Projects-and-Apps/cornea.jpg
new file mode 100644
index 0000000..47fe6b1
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/cornea.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/cornea.png b/00_blog/00020_WWW-Projects-and-Apps/cornea.png
new file mode 100644
index 0000000..77c1c1d
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/cornea.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/cqs.jpg b/00_blog/00020_WWW-Projects-and-Apps/cqs.jpg
new file mode 100644
index 0000000..9d87742
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/cqs.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/cuadro.png b/00_blog/00020_WWW-Projects-and-Apps/cuadro.png
new file mode 100644
index 0000000..ceac93d
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/cuadro.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/flipper.jpg b/00_blog/00020_WWW-Projects-and-Apps/flipper.jpg
new file mode 100644
index 0000000..b1caa57
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/flipper.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/flipper2.jpg b/00_blog/00020_WWW-Projects-and-Apps/flipper2.jpg
new file mode 100644
index 0000000..34e908d
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/flipper2.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/foto-pschill.png b/00_blog/00020_WWW-Projects-and-Apps/foto-pschill.png
new file mode 100644
index 0000000..e624ac1
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/foto-pschill.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/ikm.jpg b/00_blog/00020_WWW-Projects-and-Apps/ikm.jpg
new file mode 100644
index 0000000..06539ca
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/ikm.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/immoconnect.png b/00_blog/00020_WWW-Projects-and-Apps/immoconnect.png
new file mode 100644
index 0000000..ad49532
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/immoconnect.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/index.md b/00_blog/00020_WWW-Projects-and-Apps/index.md
new file mode 100644
index 0000000..75069b5
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/index.md
@@ -0,0 +1,542 @@
+WWW and Apps
+============
+
+A random selection of Web-sites, Web-shops, Web-portals and Mobile Apps.
+Most of this constitute contracted work.
+
+
+<!--
+
+TODOS/IDEAS:
+
+backlinks from our pages/contact
+team: julka + matjas + niki (+koko projects?)
+vienna-warsaw-berlin
+form/tel/contact
+
+copterwerk
+kradwerk
+architekturawnetrz
+krzysztofidziorek
+
+todo-app screenshot
+
+...
+
+-->
+
+<div class="row">
+
+{BEGIN:CARD}
+scale_casamila.png
+Casamila - Architects
+casamila.pl
+2018
+-badge-success online
+-badge-primary new
+-badge-info wordpress
+
+Complete redesign of the Casamila Architects Website.
+Extensive Template customization according to client requirements.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_bunzlauershop.png
+Web Shop - Bunzlauer
+bunzlauer.shop
+2018
+-badge-success online
+-badge-primary new
+-badge-info OpenCart
+
+Customized and Optimized OpenCart Webshop specializing in international
+shipping of beautiful handcrafted polish pottery.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_aquarelle.jpg
+G. Mueller Watercolors
+gerhard-mueller-aquarelle.de
+2018
+-badge-success online
+-badge-primary new
+-badge-info wordpress
+
+Website of Gerhard Müller hosting his watarcolour paintings. Relaunched 2018. Former TYPO3.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_mmtour.png
+Mille Miglia - Blog
+mmtour.krzysztofidziorek.pl
+2017
+-badge-success online
+-badge-primary new
+-badge-info wordpress
+
+Krzysztof's Blog about his adventures, traveling the Italian
+roads of the historic Mille Miglia race in Fall 2017.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_atenefunds.png
+AteneKOM Funds
+GooglePlay / AppStore
+2018
+-badge-success online
+-badge-primary new
+-badge-info iOS
+-badge-info Android
+-badge-info Symfony
+
+Overview of the funding possibilities on EU-, national and regional levels.
+Entries are continually updated and expanded and can be filtered by topics.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_mazury.png
+Ratuj Mazury
+ratuj-mazury.pl
+2016
+-badge-success online
+-badge-info wordpress
+
+This Website was launched 2016 and promotes ecological acitivites in the
+Masurian area. Template was designed from scratch.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_wekkaprojekt.png
+Wekka Projekt - Architects
+wekka-projekt.pl
+2016
+-badge-success online
+-badge-info wordpress
+
+Launched 2016 for an Architectural Office operating in Warsaw, Poland.
+Template was designed from scratch.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_norti.png
+Norton Motorcycles Fan Club
+nortonmotorcycles.co.uk
+2018
+-badge-success online
+-badge-primary new
+-badge-info wordpress
+
+Relaunched 2018 on Wordpress. Fomer TYPO3.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_bunzlauer.png
+Bunzlauer Keramik
+bunzlauerkeramik.at
+2018
+-badge-success online
+-badge-primary new
+-badge-info wordpress
+
+Austrian Website about Polish Pottery.
+Relaunched 2018 on Wordpress. Fomer TYPO3.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_cornea.png
+Cornea Franz
+GooglePlay / AppStore
+2013
+-badge-secondary offline
+-badge-info iOS
+-badge-info Android
+-badge-info PHP
+
+Mobile App with a simple Backend porviding legal News.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_link-all.png
+Link-All Software
+link-all.eu
+2013
+-badge-success online
+-badge-info OsCommerce
+
+Webshop offering custom Alfresco hosting in vairous tiers.
+Customized OsCommerce.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_bildershopping.png
+Bilder Shop - Art Prints
+bildershopping.at
+2010
+-badge-secondary offline
+-badge-info OsCommerce
+
+Custom OsCommerce Webshop selling various Art Prints
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_nadler.png
+Nadler - Wine Shop
+nadler-hanny.at
+2007
+-badge-success online
+-badge-info PHP
+
+In 2007 coded the super-light custom PHP Shop for the Website of this Austrian Winemaker.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_panner.jpg
+Panner - Stamp Shop
+panner.net
+2006
+-badge-secondary offline
+-badge-info PHP
+
+Custom PHP shop specializing in Postal Stamps. Featuring a very extensive
+backend for user management and analysis.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_panner-admin.png
+Stamp Shop Backend
+panner.net/admin
+2006
+-badge-secondary offline
+-badge-info PHP
+
+Custom extensiv backend for the panner.net stamps webshop with complex user management and analytic possibilites.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_maiden.jpg
+Maiden Entertainment
+maidenentertainment.com
+2005
+-badge-secondary offline
+-badge-info PHP
+
+Website of an independent Music and Video Producer.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_flipper2.jpg
+Flipper Grafik
+flipper-grafik.at
+2004
+-badge-secondary offline
+-badge-info PHP
+
+Advertising Agency in Vienna, Austria.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_cqs.jpg
+Complex Quantum Systems
+coqus.at
+2006
+-badge-secondary offline
+-badge-info PHP
+
+Website of the Doctoral Program on Complex Quantum Systems of the University Vienna.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_ikm.jpg
+Institut fuer Kulturmanagement
+mdw.ac.at/ikm/
+2003
+-badge-secondary offline
+-badge-info Perl
+
+Website of the IKM Insistute of the University of Music and Performing Arts, Vienna.
+Advanced book-browsing tools for the Insitutes library.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_preschl.jpg
+Claudia Preschl
+personal.mdw.ac.at/preschl/
+2004
+-badge-success online
+
+Website of Prof. Claudia Preschl of the University of Music and Performing Arts, Vienna.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_textlabor.jpg
+Textlabor
+textlabor.at
+2006
+-badge-success online
+-badge-info PHP
+
+Website of Jolande Peck-Himmel, PR Consultant specializing in Print and Online Media.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_lev.jpg
+LEV Wien
+levwien.at
+2006
+-badge-secondary offline
+-badge-info PHP
+
+Website of the Parents Council of Music Shools of Vienna.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_meersalzgrotte.png
+Saliseum
+meersalzgrotte.at
+2008
+-badge-secondary offline
+-badge-info PHP
+
+Very light custom PHP Website of the Sea-Salt-Cave Saliseum in Vienna.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_telenetprofi.png
+Telenet Profi
+telenetprofi.at
+2011
+-badge-success online
+
+Website of a Cell Phone Store in Vienna.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_breitbandausschreibungen1.png
+Broadband Tenders Germany
+breitbandausschreibungen.de
+2014
+-badge-success online
+-badge-info Symfony
+
+Platform for Coorindation of German Broadband Tender Programmes.
+(_involved until 2014_)
+
+{END:CARD}
+
+{BEGIN:CARD}
+scale_maiden2.png
+Maiden Reloaded
+maidenenterteinmanet.com
+2010
+-badge-secondary offline
+-badge-info TYPO3
+
+Reloaded version of the Website of the indy Video and Music producer Maiden Enterteinmant
+{END:CARD}
+
+{BEGIN:CARD}
+scale_brlr1.png
+BRLR Monitoring
+breitbandbuero.de/monitoring/
+2011
+-badge-success online
+-badge-info PHP
+
+Monitoring of Broadband projects according to the "Bundesrahmenregeleung Leerrorhre"
+
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_atenekom.jpg
+AteneKOM Website
+atenekom.eu
+2012
+-badge-secondary offline
+-badge-info TYPO3
+
+Former Website of the atene KOM Agency.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_todoapp.png
+Online Task Management
+Intranet
+2013
+-badge-info Symfony
+
+Browser-based tool for Assignment and Monitoring of Tasks within the Company.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_sensor.png
+Sensor for GIS
+Intranet
+2013
+-badge-info GeoServer
+-badge-info PostGIS
+-badge-info OpenLayers
+
+Tool for spatial Analysis of Broadband related Customer Data.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_ringy.png
+ZT Ringsmuth
+zt-ringsmuth.at
+2015
+-badge-secondary offline
+-badge-info Joomla
+
+Website of Civil Engineer Ernst Ringsmuth.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_platin.png
+Platin - Billard & Darts
+platin-billard.at
+2009
+-badge-secondary offline
+-badge-info PHP
+
+Platin Bar. Works included taking Photographs for this Website as well.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_balbuza.png
+Broetchenstube
+broetchenstube-baden.at
+2007
+-badge-secondary offline
+-badge-info Joomla
+
+Website of a Catering Company located in Baden, Austria.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_aufbau.jpg
+Cultural Administration Studies
+mdw.ac.at/ikm/kulturmanagement/
+2007
+-badge-secondary offline
+-badge-info PHP
+
+Lightweight Website of postgradual studies at the University of Music and Performing Arts, Vienna.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_kunst-stuecke.png
+Kunst-Stuecke Art Gallery
+kunst-stuecke.at
+2007
+-badge-secondary offline
+-badge-info Redaxo
+
+Light CMS driven Website for an art gallery in Vienna.
+{END:CARD}
+
+
+{BEGIN:CARD}
+scale_cuadro.png
+Cuadro Architects
+cuadro.com.pl
+2006
+-badge-secondary offline
+-badge-info PHP
+
+Architecture Website for Cuadro
+{END:CARD}
+
+{BEGIN:CARD}
+scale_foto-pschill.png
+Gallery for Fotografie Pschill
+fotografie-pschill.at
+2006
+-badge-secondary offline
+-badge-info PHP
+
+Create a PHP Gallery for this Photographers website.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_werbereich.png
+Werbereich Creative Agency
+werbereich.at
+2006
+-badge-secondary offline
+-badge-info PHP
+
+Technical implementation of the Website of this Creative Agency
+{END:CARD}
+
+{BEGIN:CARD}
+scale_immoconnect.png
+Immoconnect Real Estate
+immoconnect.net
+2006
+-badge-secondary offline
+
+Light single-page Website for an Austrian Real Estate Agency.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_austria-org-pl.png
+Austrian Cultural Forum
+austria.org.pl
+2007
+-badge-secondary offline
+-badge-info PHP
+
+Impleneted the news archive for the Austrian Cultural Forum located in Warsaw.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_condition-red.png
+Condition Red - Band
+condition-red.com
+2005
+-badge-secondary offline
+-badge-info Flash
+
+Flash driven Website of the Rock and Metal Band: Condition RED.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_austrian-wine.png
+Austrian Wine
+austrian-wine.at
+2005
+-badge-secondary offline
+
+Website for an exporter of Austrian Wines.
+{END:CARD}
+
+{BEGIN:CARD}
+scale_copterwerk.png
+Copterwerk - Drone Services
+copterwerk.com
+2011
+-badge-secondary offline
+
+Web presence of a company offering Aerial photography and photogrammetry services.
+{END:CARD}
+
+</div>
+
diff --git a/00_blog/00020_WWW-Projects-and-Apps/kulturmanag.jpg b/00_blog/00020_WWW-Projects-and-Apps/kulturmanag.jpg
new file mode 100644
index 0000000..72dd403
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/kulturmanag.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/kunst-stuecke.png b/00_blog/00020_WWW-Projects-and-Apps/kunst-stuecke.png
new file mode 100644
index 0000000..9c18cbc
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/kunst-stuecke.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/lev.jpg b/00_blog/00020_WWW-Projects-and-Apps/lev.jpg
new file mode 100644
index 0000000..f593824
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/lev.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/link-all.png b/00_blog/00020_WWW-Projects-and-Apps/link-all.png
new file mode 100644
index 0000000..9c91285
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/link-all.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/maiden.jpg b/00_blog/00020_WWW-Projects-and-Apps/maiden.jpg
new file mode 100644
index 0000000..0763489
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/maiden.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/maiden2.png b/00_blog/00020_WWW-Projects-and-Apps/maiden2.png
new file mode 100644
index 0000000..fa8d565
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/maiden2.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/mazury.png b/00_blog/00020_WWW-Projects-and-Apps/mazury.png
new file mode 100644
index 0000000..1698950
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/mazury.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/meersalzgrotte.png b/00_blog/00020_WWW-Projects-and-Apps/meersalzgrotte.png
new file mode 100644
index 0000000..4fca764
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/meersalzgrotte.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/mmtour.png b/00_blog/00020_WWW-Projects-and-Apps/mmtour.png
new file mode 100644
index 0000000..3d8d953
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/mmtour.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/nadler.png b/00_blog/00020_WWW-Projects-and-Apps/nadler.png
new file mode 100644
index 0000000..884e3e9
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/nadler.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/nadler2.png b/00_blog/00020_WWW-Projects-and-Apps/nadler2.png
new file mode 100644
index 0000000..d362a5d
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/nadler2.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/norti.png b/00_blog/00020_WWW-Projects-and-Apps/norti.png
new file mode 100644
index 0000000..23e2b3d
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/norti.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/panner-admin.png b/00_blog/00020_WWW-Projects-and-Apps/panner-admin.png
new file mode 100644
index 0000000..168dc5c
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/panner-admin.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/panner.jpg b/00_blog/00020_WWW-Projects-and-Apps/panner.jpg
new file mode 100644
index 0000000..164308b
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/panner.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/platin.png b/00_blog/00020_WWW-Projects-and-Apps/platin.png
new file mode 100644
index 0000000..e245f8c
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/platin.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/preschl.jpg b/00_blog/00020_WWW-Projects-and-Apps/preschl.jpg
new file mode 100644
index 0000000..34585ed
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/preschl.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/ringy.png b/00_blog/00020_WWW-Projects-and-Apps/ringy.png
new file mode 100644
index 0000000..684d41e
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/ringy.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/sensor.png b/00_blog/00020_WWW-Projects-and-Apps/sensor.png
new file mode 100644
index 0000000..1846c46
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/sensor.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/telenetprofi.png b/00_blog/00020_WWW-Projects-and-Apps/telenetprofi.png
new file mode 100644
index 0000000..776a503
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/telenetprofi.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/textlabor.jpg b/00_blog/00020_WWW-Projects-and-Apps/textlabor.jpg
new file mode 100644
index 0000000..ad47518
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/textlabor.jpg
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/todoapp.png b/00_blog/00020_WWW-Projects-and-Apps/todoapp.png
new file mode 100644
index 0000000..8753f35
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/todoapp.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/wekkaprojekt.png b/00_blog/00020_WWW-Projects-and-Apps/wekkaprojekt.png
new file mode 100644
index 0000000..faa19c7
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/wekkaprojekt.png
Binary files differ
diff --git a/00_blog/00020_WWW-Projects-and-Apps/werbereich.png b/00_blog/00020_WWW-Projects-and-Apps/werbereich.png
new file mode 100644
index 0000000..47e5838
--- /dev/null
+++ b/00_blog/00020_WWW-Projects-and-Apps/werbereich.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00010_The-Old-Times/attack.png b/00_blog/00030_Computer-Games/00010_The-Old-Times/attack.png
new file mode 100644
index 0000000..7c83d63
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00010_The-Old-Times/attack.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00010_The-Old-Times/attack.zip b/00_blog/00030_Computer-Games/00010_The-Old-Times/attack.zip
new file mode 100644
index 0000000..2d09784
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00010_The-Old-Times/attack.zip
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00010_The-Old-Times/high1.png b/00_blog/00030_Computer-Games/00010_The-Old-Times/high1.png
new file mode 100644
index 0000000..93ebf07
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00010_The-Old-Times/high1.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00010_The-Old-Times/high2.png b/00_blog/00030_Computer-Games/00010_The-Old-Times/high2.png
new file mode 100644
index 0000000..c94a5ef
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00010_The-Old-Times/high2.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00010_The-Old-Times/highway.zip b/00_blog/00030_Computer-Games/00010_The-Old-Times/highway.zip
new file mode 100644
index 0000000..ffc7d7b
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00010_The-Old-Times/highway.zip
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00010_The-Old-Times/index.md b/00_blog/00030_Computer-Games/00010_The-Old-Times/index.md
new file mode 100644
index 0000000..192a1c7
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00010_The-Old-Times/index.md
@@ -0,0 +1,54 @@
+Games from the past
+===================
+
+ 1990ies
+
+## About this games
+
+I recently found this simple and stupid games from times long gone.
+I coded them in the 90ies as a teenager. Their source code was fortunatelly lost.
+
+This DOS MZ exacutables will run fine in a DOSBox.
+
+## Highway
+
+ Coded: 1999
+ Tech: C, DJGPP compiler, Allegro library
+
+A unique combination of Frogger and the original GTA, which it was probably
+inspired by. Control your vehicle with the arrow keys without crashing,
+as long as possible.
+
+Download: [highway.zip](highway.zip)
+
+![](high1.png){.img-fluid style="width:300px;"}
+![](high2.png){.img-fluid style="width:300px;"}
+
+## Under Attack
+
+ Coded: Early 90ies
+ Tech: QBasic
+
+Originally I coded this game for the TI-83 caluclator, later reimplementing
+it for my PC **in colors**. As the commander of a the mighty battleship _HMS Miguel_ you need
+to use the arrow keys to evade enemy missiles fired from the deepness of the ocean,
+by enemy submarines.
+
+Download: [attack.zip](attack.zip)
+
+![](attack.png){.img-fluid style="width:300px;"}
+
+## Operation Naval Storm
+
+ Coded: 1996
+ Tech: QBasic
+
+Another naval warfare classic, based on the well known *Sea Battle* game, played on
+paper grids. In this advanced version every player places only one single
+ship, measuring 1x1 in size. Try to outperform the brilliant AI.
+
+![](naval1.png){.img-fluid style="width:300px;"}
+![](naval2.png){.img-fluid style="width:300px;"}
+
+Download: [naval.zip](naval.zip)
+
diff --git a/00_blog/00030_Computer-Games/00010_The-Old-Times/naval.zip b/00_blog/00030_Computer-Games/00010_The-Old-Times/naval.zip
new file mode 100644
index 0000000..6155a1e
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00010_The-Old-Times/naval.zip
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00010_The-Old-Times/naval1.png b/00_blog/00030_Computer-Games/00010_The-Old-Times/naval1.png
new file mode 100644
index 0000000..d351629
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00010_The-Old-Times/naval1.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00010_The-Old-Times/naval2.png b/00_blog/00030_Computer-Games/00010_The-Old-Times/naval2.png
new file mode 100644
index 0000000..fb45276
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00010_The-Old-Times/naval2.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-ASCII-Bars.png b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-ASCII-Bars.png
new file mode 100644
index 0000000..812e22e
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-ASCII-Bars.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-Animated-Display-Setup.png b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-Animated-Display-Setup.png
new file mode 100644
index 0000000..e923382
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-Animated-Display-Setup.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-LCD-Panels.png b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-LCD-Panels.png
new file mode 100644
index 0000000..26ef16b
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-LCD-Panels.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-Pixel-Display.png b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-Pixel-Display.png
new file mode 100644
index 0000000..fc50dd0
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/Space-Engineers-Pixel-Display.png
Binary files differ
diff --git a/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/index.md b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/index.md
new file mode 100644
index 0000000..7786555
--- /dev/null
+++ b/00_blog/00030_Computer-Games/00100_Monospaced-Font-and-Pixel-Display-for-Space-Engineers/index.md
@@ -0,0 +1,325 @@
+###>>>KWD Space Engineers Pixel Display, Space Engineers Font, Monospaced
+###>>>DSC A Pixel precise Display for Space Engineers including a custom monospaced Font.
+# Monospaced Font and Pixel Display for Space Engineers
+<p class="text-secondary">September 23, 2016</p>
+<figure class="text-center">
+![](Space-Engineers-Pixel-Display.png){.img-fluid .rounded alt="Closeup of standard Space Engineers LCD Panel, showing pink letters. Single Pixels can be determined." title="Pink is the color of passion"}
+<figcaption class="text-secondary">
+Standard LCD Panel displaying monospaced text.
+</figcaption>
+</figure>
+
+## Pixel Precise Font
+
+For everyone suffering from the lack of monospaced fonts and pixel-based
+displays in Space Engineers here I share my simple, yet effective solution:
+A simple helper class in C#, which I wrote yesterday night to solve this
+particular problem. As a bonus this also enabled using the LCD Screens
+for arbitrary pixel-precise output, even with animations, as you will
+see later.
+
+Have fun and feel free to improve it!
+
+The class can be easily embedded in your programmable blocks and allows simulating pixel-precise displays on the LCD and Text Panels. The class also ships with a beautiful set of retro-style compile time mono-spaced fonts.
+
+First admire a few screenshot to get a first impression:
+
+<figure class="text-center">
+![](Space-Engineers-ASCII-Bars.png){.img-fluid .rounded alt="A Space Engineers Console showcasing our Font. It displays some ASCII styled bars." title="The Monospaced Font in Action."}
+<figcaption class="text-secondary">
+Status bars showing normal and inverted font.
+</figcaption>
+</figure>
+
+<figure class="text-center">
+![](Space-Engineers-LCD-Panels.png){.img-fluid .rounded alt="Two adjacent Space Engineers Consoles. One shows a sinus wave, demonstrating pixel precise output."}
+<figcaption class="text-secondary">
+The Display to the right demonstrates animated pixel precise output.
+</figcaption>
+</figure>
+
+The class exposes the following public methods:
+
+* Screen constructor
+* pixelOn
+* draw_rect
+* put_letter
+* put_letter_inv // inverted single letter
+* put_text
+* put_text_inv // inverted text
+* update // updates lcd or text panel
+
+## Pixel Display supports Animations
+
+<figure class="text-center">
+![](Space-Engineers-Animated-Display-Setup.png){.img-fluid .rounded alt="Complete setup with 3 Panels a timer block and a programmable block"}
+<figcaption class="text-secondary">
+A complete Setup featuring 3 LCD Panels and supporting blocks.
+</figcaption>
+</figure>
+
+With a timer block this approach can be used for beautiful animations too!
+
+The solution is based on emulating pixels using very small fonts ~0.2 on regular LCD Panels. I use ‘[‘ and ‘.’ here, since they both have the same widths and work quite well to emulate on/off pixels.
+
+
+Usage of the class is easy and straigth forward from your Main function:
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.csharp .numberLines}
+// construct a new Screen class instace providing
+// the label of your panel and dimensions.
+Screen s = new Screen("Your_LCD_1",215,59,this);
+
+// put text on specified pixel coordinates
+s.put_text(10,10," Welcome to the Machine ");
+
+// refresh the LCD Panel
+s.update();
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## C Sharp Class for the Space Engineers Font
+
+And this is the C# class behind it. You will have to copy it into your programmable blocks. (Let me know if there is a more elegant way?)
+
+Sidenote: If you wonder how I generated this numbers inside the letters array, you can read it in this seperate post about bitmap fonts generation.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.csharp .numberLines}
+class Screen
+{
+
+ public int width;
+ public int height;
+
+ IMyTextPanel panel;
+
+ char mark_pixel='[';
+ char mark_empty='.';
+
+ static MyGridProgram programm;
+ string output;
+
+ public Screen(string panel_name, int _width, int _height, MyGridProgram programRef)
+ {
+ width=_width;
+ height=_height;
+ programm=programRef;
+ panel=programm.GridTerminalSystem.GetBlockWithName(panel_name) as IMyTextPanel;
+
+ output=new string(' ',0);
+ for(int y=0;y<height;y++)
+ {
+ output+=new string(mark_empty,width);
+ output+='\n';
+ }
+ }
+
+ public void pixelOn(int x,int y)
+ {
+ StringBuilder sb = new StringBuilder(output);
+ sb[y*(width+1)+x]=mark_pixel;
+ output = sb.ToString();
+ }
+
+ public void draw_rect(int x, int y, int width, int height)
+ {
+ for(int i=x;i<x+width;i++)
+ {
+ pixelOn(i,y);
+ pixelOn(i,y+height-1);
+ }
+
+ for(int i=y;i<y+height;i++)
+ {
+ pixelOn(x,i);
+ pixelOn(width+x-1,i);
+ }
+
+
+ }
+
+ public void put_text(int x, int y, string str)
+ {
+ int linefeed=0;
+ for(int i=0;i<str.Length;i++)
+ {
+ if(str[i]=='\n')
+ {
+ y+=7;
+ linefeed=0;
+ continue;
+ }
+
+ linefeed+=7;
+ put_letter(x+linefeed,y,str[i]);
+ }
+ }
+
+ public void put_text_inv(int x, int y, string str)
+ {
+ int linefeed=0;
+ for(int i=0;i<str.Length;i++)
+ {
+ if(str[i]=='\n')
+ {
+ y+=7;
+ linefeed=0;
+ continue;
+ }
+
+ linefeed+=7;
+ put_letter_inv(x+linefeed,y,str[i]);
+ }
+ }
+
+ public void put_letter(int x, int y, int ascii_code)
+ {
+ int letter=letters[ascii_code-0x20];
+
+ for(int i=0;i<5;i++)
+ for(int j=0;j<5;j++)
+
+ if(0<(letter & (int)Math.Pow(2,24-(i+j*5)) ))
+ pixelOn(x+i,y+j);
+ }
+
+ public void put_letter_inv(int x, int y, int ascii_code)
+ {
+ int letter=letters[ascii_code-0x20];
+ draw_rect(x-1,y-1,7,7); // outline
+ for(int i=0;i<5;i++)
+ for(int j=0;j<5;j++) if(0>=(letter & (int)Math.Pow(2,24-(i+j*5)) ))
+ pixelOn(x+i,y+j);
+ }
+
+ public void update()
+ {
+ panel.WritePublicText(output, false);
+ }
+
+ // monospace fonts starting from 0x20 (space)
+ static readonly int[] letters =
+ {
+ 0,4329476,10813440,11512810,16398526,17895697,6632015,4325376,2232450,8523912,
+ 22483413,4357252,68,31744,4,1118480,15390382,4608142,15239320,31504446,
+ 1841462,33060926,33062463,32540808,33095231,33094719,131200,131208,2236546,
+ 1016800,8521864,32051204,15392270,33095217,32045630,33047071,32032318,
+ 33061407,33062416,33050175,18415153,14815374,14748236,20673235,17318431,18732593,18667121,
+ 15255086,32045584,15259213,32045779,33299071,32641156,18400814,18393412,18405233,18157905,18157700,
+ 32575775,14950670,17043521,14747726,4539392,31,6389760,33095217,32045630,
+ 33047071,32032318,33061407,33062416,33050175,18415153,14815374,14748236,
+ 20673235,17318431,18732593,18667121,15255086,32045584,15259213,32045779,33299071,
+ 32641156,18400814,18393412,18405233,18157905,18157700,32575775,2240642,4329604
+ 8525960,14016,
+ };
+
+};
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## Source Code used for Example Screenshots above
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.csharp .numberLines}
+static int cnt=0; // programm counter
+
+public void Main(string argument)
+{
+ // increase programm counter
+ cnt+=1;
+ if (cnt>100) cnt= 0;
+
+ // init our screen class: new 438x59 screen
+ Screen s = new Screen("Miguel_LCD_1",(int)(438*1.5),(int)(59*1.5),this);
+
+ // draw some rectangles
+ s.draw_rect(0,0,s.width,s.height);
+ s.draw_rect(2,2,s.width-4,s.height-4);
+
+ //draw more rectangles (stress testing only)
+ // for(int i=4; i<35; i+=2)
+ // {
+ // s.draw_rect(i,i,s.width-2*i,s.height-2*i);
+ // }
+
+ // write counter value
+ s.put_text(8,5,"counter: "+cnt);
+
+ // inverted text
+ s.put_text_inv(8,12,"SOME INVERTED TEXT --- ");
+
+
+ // paint a sinus wave
+ for(int i=0;i<s.width;i++) { if(i>200)s.pixelOn(i,(int)(s.height/2+s.height/3*Math.Sin((i+cnt)/25.0)));
+ }
+
+ // paint individual letters along a sinus
+ string txt=new string(' ',0);
+ txt="! software fools rules the waves!";
+
+ for(int i=0;i<txt.Length;i++) { s.put_letter(30+i*7,(int)(s.height/2+s.height/5*Math.Sin((30+i*6+cnt)/25.0)),txt[i]); } s.update(); // other screens Screen s2 = new Screen("Miguel_LCD_2",329,89,this); Screen s3 = new Screen("Miguel_LCD_3",215,59,this); s3.put_text_inv(10,10," Welcome to the Machine "); s3.put_text(10,17,"-= Miguel's 5x5 Fonts =-\n The quick brown fox \n jumps over the lazy dog\n0123456789><=;'~^\n"+
+ " %#@!~?{}[]-+*&`.,:'");
+
+ s3.draw_rect(0,0,s3.width,s3.height);
+ s3.draw_rect(2,2,s3.width-4,s3.height-4);
+
+ s2.put_text(10,1,
+"Something......[|||||||||| ] 10%\n"+
+"Foo............[||| ] 33%\n"+
+"Bar............[||| ] 99%\n"+
+"Something else.[||||||||||I ] 05%\n"
+);
+
+s2.put_text_inv(10,35,
+"Something......[|||||||||| ] 10%\n"+
+"Foo............[||| ] 33%\n"+
+"Bar............[||| ] 99%\n"+
+"Something else.[||||||||||I ] 05%\n"
+);
+
+s2.put_text(10,65,
+"copyright by softwarefools.com"
+);
+
+ s2.update();
+ s3.update();
+}
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+## Helpful Comment on improving Performance
+
+ JR Raynal
+ December 13, 2017 at 9:29 am
+
+Hi, I was playing with your script, and found it super slow… which is odd given the performances of other scripts out there. Turns out by switching the output from a string to a StringBuilder, you don’t need to copy them around as much. I assume this is the fix because I experienced a serious speed increase with that!
+
+Here is the rewritten snippet:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.csharp .numberLines}
+
+ StringBuilder output;
+
+ public Screen(string panel_name, int _width, int _height, MyGridProgram programRef)
+ {
+ width = _width;
+ height = _height;
+ programm = programRef;
+ panel = programm.GridTerminalSystem.GetBlockWithName(panel_name) as IMyTextPanel;
+
+ output = new StringBuilder();
+ for (int y = 0; y < height; y++)
+ {
+ output.Append(mark_empty, width);
+ output.Append('\n');
+ }
+ }
+
+ public void pixelOn(int x, int y)
+ {
+ output[y * (width + 1) + x] = mark_pixel;
+ }
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## TODOS
+
+cleanup and optimize code!!, move sources to git repo, use some kind of syntax highlihter on this post. allow other font-sets with other sizes and let the user adjust spacing, publish python font converter in another post.
diff --git a/00_blog/00030_Computer-Games/index.md b/00_blog/00030_Computer-Games/index.md
new file mode 100644
index 0000000..914d7d3
--- /dev/null
+++ b/00_blog/00030_Computer-Games/index.md
@@ -0,0 +1,4 @@
+Computer Games
+==============
+This section holds various content related to computer games.
+Be it simple games, mods or notes ...
diff --git a/00_blog/00035_Programming/00010_IPC/.index.md.swp b/00_blog/00035_Programming/00010_IPC/.index.md.swp
new file mode 100644
index 0000000..87e0eaa
--- /dev/null
+++ b/00_blog/00035_Programming/00010_IPC/.index.md.swp
Binary files differ
diff --git a/00_blog/00035_Programming/00010_IPC/index.md b/00_blog/00035_Programming/00010_IPC/index.md
new file mode 100644
index 0000000..e42e38f
--- /dev/null
+++ b/00_blog/00035_Programming/00010_IPC/index.md
@@ -0,0 +1,24 @@
+# Inter Process Communication
+ March 14, 2018
+
+We can attach nicely to same memory segment from 2 different processes:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.c .numberLines}
+// ipc via shared mem
+// attach to shared memory;
+key_t my_ftok = ftok("~/surf-webext-dom-shared-mem",'a');
+
+int mem_seg=shmget(my_ftok,1024*1024,IPC_CREAT|0660);
+if(mem_seg==-1)
+{
+g_print("shmget failed: %s\n",strerror(errno));
+}
+
+shared_buf=shmat(mem_seg,NULL,0);
+if(shared_buf==(void*)-1)
+{
+g_print("shmat failed: %s\n",strerror(errno));
+}
+g_print("attached to shared memory.\n");
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
diff --git a/00_blog/00035_Programming/00015_Competitive-Coding/index.md b/00_blog/00035_Programming/00015_Competitive-Coding/index.md
new file mode 100644
index 0000000..df847e7
--- /dev/null
+++ b/00_blog/00035_Programming/00015_Competitive-Coding/index.md
@@ -0,0 +1,17 @@
+# Competitive Coding
+
+A small selection of websites, which I visit from time to time, addressing competitive coding.
+
+* topcoder.com
+* codeforces.com
+* codility.com
+* codersclan.ne
+* projecteuler.net
+* www.codingame.com (need to check this)
+* www.codechef.com (need to check this)
+* http://psyho.gg/overview-of-programming-contests/ (and read here)
+* https://www.hackerrank.com/
+* http://code.google.com/codejam
+* https://www.kaggle.com/ – predicitve modelling
+* odesk.com / elance
+
diff --git a/00_blog/00035_Programming/00020_Computer-Science-Literature/index.md b/00_blog/00035_Programming/00020_Computer-Science-Literature/index.md
new file mode 100644
index 0000000..114294e
--- /dev/null
+++ b/00_blog/00035_Programming/00020_Computer-Science-Literature/index.md
@@ -0,0 +1,48 @@
+
+# Comp Science Literature
+This is a list of some books, focusing on topics around computer science, which I recently read or am currently reading or want to read :P
+
+* Anthony Williams, C++ Concurrency in Action: Practical Multihreading
+* The Boost C++ Libraries, Boris Schäling (Online book)
+* Meyers, Effective C++ (Addison-Wesley) C++98 only?
+* Meyers, More Effective C++ (Addison-Wesley) C++98 only?
+* Meyers, Effective STL. C++98 only?
+* Sutter, Exceptional C++
+* Sutter, More Exceptional C++
+* Karlson, Beyond the C++ Standard Library: An Introduction to Boost 1st Edition
+* Maybe Something on Multiprocessing (?)
+* Donald Knuth. The Art Of Computer Programming
+* Algorithms 3rd Edition (by Cormen, Leiserson, Rivest, Stein)
+* Jonathan Bartlett. Programming from the Ground Up
+* C++ in a Nutshell (O’REILLEY, by Lischner)
+* C++ Primer (5th Edition) by Lippman, Lajoie, Moo
+* The C++ Programming Language 4th Edition
+* Dive into Python (2 and 3) by Mark Pilgrim
+* Version Control with Git (O’REILLEY, by Loeliger & McCullough) (next: 9(10) ?)
+* The Linux Command Line, by William Shotts (http://linuxcommand.org/tlcl.php)
+* Debian, The Administrators Handbook (by Hertzog and Mas)
+* Absolute FreeBSD by Michael W. Lucas
+* Modern Operating Systems, Third Edition (by Andrew S. Tannebaum)
+* Linux Device Drivers (O’REILLEY, by Corbert, Rubini, Kroah-Hartman)
+* Linux Kernel in a Nutshell (O’REILLEY, Greg Kroah-Hartman)
+* Concrete Math (2nd)
+* STOC '83 Proceedings of the fifteenth annual ACM symposium on Theory of computing / Primitives for the manipulation of general subdivisions and the computation of Voronoi diagrams
+* sedgewick & waynes algorithms
+* books from appendix, from programming from ground up?
+
+## What every programmer should know about
+
+* Undefined behaviour: http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
+* Memory: http://lwn.net/Articles/250967/
+* Floating point arithmetic: https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
+
+## some areas of interest
+
+Some General Topics I am reasearching right now (or plan to do it). Or used to reasearch...
+
+* Neuronal Networks
+* Deep Learning
+* Random Forrests (and other techniques based on Decision Trees)
+* Simmulated Annealing
+* (Linear) Integer Programming
+
diff --git a/00_blog/00035_Programming/index.md b/00_blog/00035_Programming/index.md
new file mode 100644
index 0000000..3424ab3
--- /dev/null
+++ b/00_blog/00035_Programming/index.md
@@ -0,0 +1,3 @@
+# Programming
+Some programming related stuff.
+
diff --git a/00_blog/00040_Haskell/00010_Links-and-Literature/index.md b/00_blog/00040_Haskell/00010_Links-and-Literature/index.md
new file mode 100644
index 0000000..999c574
--- /dev/null
+++ b/00_blog/00040_Haskell/00010_Links-and-Literature/index.md
@@ -0,0 +1,17 @@
+# Haskell - Books, Links and Papers
+
+A growing collection of external links and books concerning Haskell.
+
+* **Learn You a Haskell** for Great Good by Marian Lipovaca
+* **Real World Haskell** by Bryan O'Sullivan, Don Stewart, and John Goerzen
+* **Parallel and Concurrent Programming in Haskell** by Simon Marlow
+* **Haskell Wiki** <https://wiki.haskell.org>
+* **UPENN CIS 194** <https://www.seas.upenn.edu/~cis194/spring13/>
+* **What I Wish I Knew When Learning Haskell** by Stephen Diehl <http://dev.stephendiehl.com/hask/>
+* **Data61 Course** <https://github.com/data61/fp-course>
+* **Monads for functional programming (paper)** by Philip Wadler
+* **Functional Pearl (paper)**
+* **Why Functional Programming Matters (paper)**
+* **Mailing Lists** <https://www.haskell.org/mailing-lists/>
+* **IRC** #haskell at chat.freenode.at
+* **Monadic Warsaw**
diff --git a/00_blog/00040_Haskell/00020_GHC-Notes/index.md b/00_blog/00040_Haskell/00020_GHC-Notes/index.md
new file mode 100644
index 0000000..c945319
--- /dev/null
+++ b/00_blog/00040_Haskell/00020_GHC-Notes/index.md
@@ -0,0 +1,39 @@
+# The Glasgow Haskell Compiler
+
+## Some GHC Flags
+
+ -v verbose mode
+ -O2 level 2 optimizations
+ -rtsopts allow +RTS flags
+ -prof enable basic time and allocation profiling
+ -auto-all cost centers on all top level functions
+ (you can also add them via the SCC pragma)
+ -caf-all generate data for CAFs (constant applicative forms)
+ -fforce-recomp force recompilation
+ -threaded Use threaed runtime
+ -eventlog enables +RTS -l flag
+
+ -Wall
+ -Werror
+
+ Notes: you will obtain the profiling versions of dependancies via:
+ stack install --profile [libraryname]
+
+ -fprof-auto replaced -auto-all
+ -fprof-cafs replaced -caf-all
+
+## Some +RTS flags
+
+ -K set stack limit
+ -s statistic reporting
+ -p profiling
+ -hc extract heap profile
+ -hy allocation by type
+ -hd allocation by constructor
+ -ix x is sampling frequency in seconds. e.g. 0.01)
+ -Nx x is number of cores to utilize
+ -l emit log file (can be used threadscope)
+ -ddump-simpl generate core
+
+ Note: render the heap profile as graph with: hp2ps -e8in -c file.hp
+ show eventlog with: threadscope file.eventlog
diff --git a/00_blog/00040_Haskell/00030_Xmonad-contribution/index.md b/00_blog/00040_Haskell/00030_Xmonad-contribution/index.md
new file mode 100644
index 0000000..1a5bf0f
--- /dev/null
+++ b/00_blog/00040_Haskell/00030_Xmonad-contribution/index.md
@@ -0,0 +1,20 @@
+ April 2018
+# Pretty printer for empty visible workspaces
+
+My little contribution to **xmonad-contrib**, adding functionality to the
+marvelous xmonad tiling window manager, I love and use since a couple of
+years.
+
+## Description
+
+Simple extensions of the pretty printer to differentiate between empty and non-empty visible workspaces. Analogical to the existing functionality for hidden workspaces. Particularly useful if some displays managed by xmonad are turned off temporarily.
+
+The new 'ppVisibleNoWindows' function was wrapped in a Maybe data type. Its value dafaults to 'Nothing' and 'ppVisible' is used as fallback.
+
+## Motivation
+
+My TV is often turned off. Still I want to know if its workspace contains any windows, without having to switch workspaces.
+
+## Github Link
+| _Xmonad-Contrib: Added pretty printer for empty visible workspaces (wrapped in Maybe)_
+| <https://github.com/xmonad/xmonad-contrib/pull/241>
diff --git a/00_blog/00040_Haskell/00040_Graham-Scan/index.md b/00_blog/00040_Haskell/00040_Graham-Scan/index.md
new file mode 100644
index 0000000..195dbe1
--- /dev/null
+++ b/00_blog/00040_Haskell/00040_Graham-Scan/index.md
@@ -0,0 +1,128 @@
+Haskell – Convex Hull – Graham Scan
+===================================
+
+December 16, 2017
+
+Playing with Convex Hulls (via Graham Scan) and SVG Export in Haskell:
+
+This is an embedded SVG generated by the Haskell programm below:
+
+<svg style="background-color:black;border:3px solid green;margin:2px;" width="330" height="330"><circle cx="250.04284841107818" cy="201.75346959836142" r="5" fill="rgb(30,150,112)"></circle> <circle cx="168.06592772450588" cy="111.843758303498" r="5" fill="rgb(30,150,47)"></circle> <circle cx="189.1691117845287" cy="250.13932743386943" r="5" fill="rgb(30,150,107)"></circle> <circle cx="130.9047490592456" cy="253.98605115515113" r="5" fill="rgb(30,150,108)"></circle> <circle cx="133.43531697969132" cy="255.82160214659208" r="5" fill="rgb(30,150,109)"></circle> <circle cx="182.304020607504" cy="105.5457583516454" r="5" fill="rgb(30,150,60)"></circle> <circle cx="251.5850563588106" cy="65.40572671380644" r="5" fill="rgb(30,150,139)"></circle> <circle cx="171.80987991027797" cy="186.35194010383304" r="5" fill="rgb(30,150,37)"></circle> <circle cx="207.80255687618114" cy="132.29096928312123" r="5" fill="rgb(30,150,61)"></circle> <circle cx="195.49409554478555" cy="83.18625335312012" r="5" fill="rgb(30,150,87)"></circle> <circle cx="92.72787404887227" cy="119.1126315578156" r="5" fill="rgb(30,150,76)"></circle> <circle cx="132.01826662198954" cy="259.3032349925243" r="5" fill="rgb(30,150,113)"></circle> <circle cx="254.30961953454" cy="228.57029782885428" r="5" fill="rgb(30,150,131)"></circle> <circle cx="119.4923496517701" cy="224.99714968272923" r="5" fill="rgb(30,150,83)"></circle> <circle cx="104.9029796235115" cy="248.66327951701538" r="5" fill="rgb(30,150,112)"></circle> <circle cx="177.91310266020778" cy="126.62370162491455" r="5" fill="rgb(30,150,38)"></circle> <circle cx="266.34722960770284" cy="187.10030895652505" r="5" fill="rgb(30,150,123)"></circle> <circle cx="198.64979304554535" cy="188.53978156044514" r="5" fill="rgb(30,150,58)"></circle> <circle cx="153.9541873486683" cy="57.38878027501561" r="5" fill="rgb(30,150,103)"></circle> <circle cx="170.63539358861877" cy="176.00651132793615" r="5" fill="rgb(30,150,27)"></circle> <circle cx="28.36356558991553" cy="95.4663889254756" r="5" fill="rgb(30,150,148)"></circle> <circle cx="144.84264545840333" cy="98.7746298856041" r="5" fill="rgb(30,150,60)"></circle> <circle cx="190.22210041855752" cy="135.09803947887505" r="5" fill="rgb(30,150,42)"></circle> <circle cx="182.77513675509647" cy="226.9525049033775" r="5" fill="rgb(30,150,81)"></circle> <circle cx="91.5545715639725" cy="181.77301165017755" r="5" fill="rgb(30,150,73)"></circle> <circle cx="260.52976404909987" cy="126.7650903973776" r="5" fill="rgb(30,150,116)"></circle> <circle cx="199.24706728106065" cy="85.8145677264196" r="5" fill="rgb(30,150,87)"></circle> <circle cx="140.1028394863066" cy="228.94903207761297" r="5" fill="rgb(30,150,80)"></circle> <circle cx="86.45512221013155" cy="142.21354112994936" r="5" fill="rgb(30,150,74)"></circle> <circle cx="104.7684570753781" cy="95.55777241192189" r="5" fill="rgb(30,150,82)"></circle> <circle cx="109.8116912935771" cy="201.82250066393837" r="5" fill="rgb(30,150,69)"></circle> <circle cx="226.2427629753817" cy="260.4928511647599" r="5" fill="rgb(30,150,135)"></circle> <circle cx="207.52854584882476" cy="98.23832427848856" r="5" fill="rgb(30,150,82)"></circle> <circle cx="137.34727138289463" cy="248.54598831387364" r="5" fill="rgb(30,150,101)"></circle> <circle cx="67.6437518548912" cy="235.9987917257608" r="5" fill="rgb(30,150,126)"></circle> <circle cx="146.63935287123562" cy="199.14394352970618" r="5" fill="rgb(30,150,47)"></circle> <circle cx="166.09256427911302" cy="242.83302095042907" r="5" fill="rgb(30,150,94)"></circle> <circle cx="184.35531117256224" cy="161.9097796435418" r="5" fill="rgb(30,150,32)"></circle> <circle cx="135.0509917491549" cy="104.7711158701602" r="5" fill="rgb(30,150,57)"></circle> <circle cx="219.20921008912157" cy="115.18635102633722" r="5" fill="rgb(30,150,80)"></circle> <circle cx="163.3590840337916" cy="68.94091343798308" r="5" fill="rgb(30,150,91)"></circle> <circle cx="106.80531573718335" cy="199.21285711361014" r="5" fill="rgb(30,150,69)"></circle> <circle cx="91.69394054319545" cy="249.00283065566003" r="5" fill="rgb(30,150,120)"></circle> <circle cx="42.69884845673566" cy="208.11969850342197" r="5" fill="rgb(30,150,131)"></circle> <circle cx="150.6236743485051" cy="188.8620474963915" r="5" fill="rgb(30,150,36)"></circle> <circle cx="158.90382633613356" cy="274.07594874616575" r="5" fill="rgb(30,150,126)"></circle> <circle cx="203.43810936607744" cy="240.5130006472947" r="5" fill="rgb(30,150,104)"></circle> <circle cx="90.52909317079552" cy="217.88023089739372" r="5" fill="rgb(30,150,95)"></circle> <circle cx="142.0940864941062" cy="129.52923503909" r="5" fill="rgb(30,150,30)"></circle> <circle cx="183.3037554100898" cy="163.4224683254946" r="5" fill="rgb(30,150,31)"></circle> <circle cx="254.59761377280722" cy="194.8355635900217" r="5" fill="rgb(30,150,113)"></circle> <circle cx="70.01341642229187" cy="145.07162677904222" r="5" fill="rgb(30,150,90)"></circle> <circle cx="245.95274031933198" cy="105.6150023686217" r="5" fill="rgb(30,150,109)"></circle> <circle cx="179.3874489883276" cy="161.3271491454406" r="5" fill="rgb(30,150,26)"></circle> <circle cx="174.8322909478738" cy="98.24413130742855" r="5" fill="rgb(30,150,63)"></circle> <circle cx="76.57661314940059" cy="232.5620695235213" r="5" fill="rgb(30,150,117)"></circle> <circle cx="110.20050744456465" cy="131.53437983901722" r="5" fill="rgb(30,150,53)"></circle> <circle cx="101.02068320616426" cy="147.86628733061426" r="5" fill="rgb(30,150,57)"></circle> <circle cx="165.8572064460344" cy="278.14694842092365" r="5" fill="rgb(30,150,131)"></circle> <circle cx="100.51994290684408" cy="135.00585528086626" r="5" fill="rgb(30,150,61)"></circle> <circle cx="93.82764097353034" cy="129.06320594160917" r="5" fill="rgb(30,150,70)"></circle> <circle cx="253.87187416210415" cy="154.5167254215345" r="5" fill="rgb(30,150,105)"></circle> <circle cx="139.60104049751217" cy="105.10237893042421" r="5" fill="rgb(30,150,55)"></circle> <circle cx="217.63333767494922" cy="82.01911898999408" r="5" fill="rgb(30,150,102)"></circle> <circle cx="155.07651713848244" cy="202.01229698806958" r="5" fill="rgb(30,150,49)"></circle> <circle cx="38.84571396023169" cy="211.71370049299298" r="5" fill="rgb(30,150,137)"></circle> <circle cx="131.35457460373755" cy="229.43649756282707" r="5" fill="rgb(30,150,82)"></circle> <circle cx="101.8811149603446" cy="60.806865650812135" r="5" fill="rgb(30,150,114)"></circle> <circle cx="108.91357375361146" cy="183.38328826229434" r="5" fill="rgb(30,150,57)"></circle> <circle cx="98.29711330271346" cy="109.47482179229984" r="5" fill="rgb(30,150,77)"></circle> <circle cx="172.28688779196867" cy="181.46233752550535" r="5" fill="rgb(30,150,33)"></circle> <circle cx="93.77188129034651" cy="152.09728921642983" r="5" fill="rgb(30,150,65)"></circle> <circle cx="39.16221208499168" cy="220.08715706943792" r="5" fill="rgb(30,150,141)"></circle> <circle cx="82.90283027529738" cy="187.23987823799342" r="5" fill="rgb(30,150,83)"></circle> <circle cx="36.83140136457256" cy="237.10836498299798" r="5" fill="rgb(30,150,152)"></circle> <circle cx="159.04913429058357" cy="193.6137496983329" r="5" fill="rgb(30,150,41)"></circle> <circle cx="149.8458394746179" cy="243.69722670699878" r="5" fill="rgb(30,150,94)"></circle> <circle cx="139.0710264338086" cy="147.9219518871481" r="5" fill="rgb(30,150,18)"></circle> <circle cx="156.87676351678834" cy="196.31621769543472" r="5" fill="rgb(30,150,43)"></circle> <circle cx="76.22813867551673" cy="58.065254250002404" r="5" fill="rgb(30,150,132)"></circle> <circle cx="114.74404579519961" cy="250.4087840946835" r="5" fill="rgb(30,150,110)"></circle> <circle cx="87.15900106326063" cy="148.70527298969148" r="5" fill="rgb(30,150,72)"></circle> <circle cx="26.847893428897535" cy="218.50461482065617" r="5" fill="rgb(30,150,151)"></circle> <circle cx="167.86224317149043" cy="217.21693364547622" r="5" fill="rgb(30,150,67)"></circle> <circle cx="282.75471021838604" cy="222.40422121056434" r="5" fill="rgb(30,150,153)"></circle> <circle cx="113.65929983185622" cy="172.1380647926459" r="5" fill="rgb(30,150,47)"></circle> <circle cx="145.09413645816042" cy="155.25057732001034" r="5" fill="rgb(30,150,10)"></circle> <circle cx="237.53341559112823" cy="129.6627629148239" r="5" fill="rgb(30,150,91)"></circle> <circle cx="204.79599735549814" cy="127.38370156552024" r="5" fill="rgb(30,150,60)"></circle> <circle cx="67.74775493976351" cy="139.97850753416574" r="5" fill="rgb(30,150,94)"></circle> <circle cx="210.31226434244496" cy="247.09502723685614" r="5" fill="rgb(30,150,114)"></circle> <circle cx="138.5101000851674" cy="278.7105427190394" r="5" fill="rgb(30,150,132)"></circle> <circle cx="169.19801602950238" cy="114.05245580753565" r="5" fill="rgb(30,150,46)"></circle> <circle cx="248.30023598811576" cy="139.82948336104496" r="5" fill="rgb(30,150,100)"></circle> <circle cx="84.30932668117279" cy="219.93833030785126" r="5" fill="rgb(30,150,101)"></circle> <circle cx="132.24331417077946" cy="291.2609993001805" r="5" fill="rgb(30,150,146)"></circle> <circle cx="160.94658587409114" cy="77.98657154244181" r="5" fill="rgb(30,150,82)"></circle> <circle cx="189.89599533144758" cy="214.5141658021252" r="5" fill="rgb(30,150,73)"></circle> <circle cx="274.07238032907736" cy="114.61040292334776" r="5" fill="rgb(30,150,133)"></circle> <circle cx="173.4334175877005" cy="142.41875279561097" r="5" fill="rgb(30,150,23)"></circle> <circle cx="81.59666952240286" cy="157.09683628233245" r="5" fill="rgb(30,150,78)"></circle> <circle cx="113.74263460749069" cy="245.6984634962466" r="5" fill="rgb(30,150,105)"></circle> <circle cx="128.62844736870682" cy="89.1045872570648" r="5" fill="rgb(30,150,75)"></circle> <circle cx="117.09080103183433" cy="256.3606817576775" r="5" fill="rgb(30,150,114)"></circle> <circle cx="107.0510464556047" cy="63.6364881544602" r="5" fill="rgb(30,150,109)"></circle> <circle cx="146.06063748335822" cy="155.5476601817892" r="5" fill="rgb(30,150,9)"></circle> <circle cx="19.797156728201166" cy="208.00327375672293" r="5" fill="rgb(30,150,154)"></circle> <circle cx="224.6871261564196" cy="59.32941538253692" r="5" fill="rgb(30,150,125)"></circle> <circle cx="18.330634507062157" cy="169.68512490920642" r="5" fill="rgb(30,150,146)"></circle> <circle cx="117.71877593737015" cy="157.71566996945785" r="5" fill="rgb(30,150,39)"></circle> <circle cx="150.90744004872494" cy="125.69996651911103" r="5" fill="rgb(30,150,31)"></circle> <circle cx="172.0555296451493" cy="147.95967101995438" r="5" fill="rgb(30,150,19)"></circle> <circle cx="211.71510600782037" cy="168.6836805807738" r="5" fill="rgb(30,150,61)"></circle> <circle cx="60.24756518573737" cy="246.71025625213787" r="5" fill="rgb(30,150,140)"></circle> <circle cx="103.23366497661333" cy="219.01237316076927" r="5" fill="rgb(30,150,87)"></circle> <circle cx="273.7017283881007" cy="172.2120764305319" r="5" fill="rgb(30,150,127)"></circle> <circle cx="97.80303649638779" cy="204.85716575700624" r="5" fill="rgb(30,150,80)"></circle> <circle cx="221.46148887605563" cy="164.77249284618293" r="5" fill="rgb(30,150,71)"></circle> <circle cx="50.524491137739275" cy="89.6937642622213" r="5" fill="rgb(30,150,130)"></circle> <circle cx="204.0380699117014" cy="37.35498291700646" r="5" fill="rgb(30,150,135)"></circle> <circle cx="143.40838746301495" cy="259.3899906185589" r="5" fill="rgb(30,150,111)"></circle> <circle cx="266.77265013944714" cy="123.56187324575204" r="5" fill="rgb(30,150,123)"></circle> <circle cx="121.09007007148857" cy="87.19247610877495" r="5" fill="rgb(30,150,80)"></circle> <circle cx="80.22930186274945" cy="70.1701303865456" r="5" fill="rgb(30,150,120)"></circle> <circle cx="180.45553719901778" cy="175.95293706048568" r="5" fill="rgb(30,150,35)"></circle> <circle cx="222.7506070445607" cy="80.61735797855984" r="5" fill="rgb(30,150,106)"></circle> <circle cx="158.2801305209321" cy="168.2844490594726" r="5" fill="rgb(30,150,14)"></circle> <circle cx="209.07427850176043" cy="146.00598552038022" r="5" fill="rgb(30,150,58)"></circle> <circle cx="181.8649175345449" cy="96.87537796898624" r="5" fill="rgb(30,150,68)"></circle> <circle cx="57.818033309206335" cy="94.70613646665379" r="5" fill="rgb(30,150,121)"></circle> <circle cx="120.75849455577627" cy="136.86343872502906" r="5" fill="rgb(30,150,41)"></circle> <circle cx="238.4042177525126" cy="214.12837089906836" r="5" fill="rgb(30,150,108)"></circle> <circle cx="134.82175169469224" cy="282.8625044224542" r="5" fill="rgb(30,150,137)"></circle> <circle cx="124.37897828966902" cy="141.19895073915285" r="5" fill="rgb(30,150,35)"></circle> <circle cx="71.30829640124736" cy="228.6244751809119" r="5" fill="rgb(30,150,118)"></circle> <circle cx="202.8966932024821" cy="175.5553271682116" r="5" fill="rgb(30,150,55)"></circle> <circle cx="112.28137080688083" cy="198.61669563281163" r="5" fill="rgb(30,150,64)"></circle> <circle cx="230.79728693422757" cy="72.90445718027976" r="5" fill="rgb(30,150,118)"></circle> <circle cx="158.79949910260785" cy="182.82233984968175" r="5" fill="rgb(30,150,29)"></circle> <circle cx="58.56877652829822" cy="147.81482668362486" r="5" fill="rgb(30,150,102)"></circle> <circle cx="188.43313680897649" cy="169.0946893542551" r="5" fill="rgb(30,150,38)"></circle> <circle cx="183.18362562517675" cy="146.11507672367435" r="5" fill="rgb(30,150,31)"></circle> <circle cx="256.71894488922624" cy="172.26799561066733" r="5" fill="rgb(30,150,109)"></circle> <circle cx="245.03698870042268" cy="103.65831068003733" r="5" fill="rgb(30,150,110)"></circle> <circle cx="50.70099080152846" cy="87.39565736040664" r="5" fill="rgb(30,150,132)"></circle> <circle cx="130.64433518067872" cy="28.1630727673696" r="5" fill="rgb(30,150,137)"></circle> <circle cx="94.56724747823085" cy="150.4574267806313" r="5" fill="rgb(30,150,64)"></circle> <circle cx="67.04524904809107" cy="53.02953597638252" r="5" fill="rgb(30,150,143)"></circle> <circle cx="78.62648151898244" cy="81.82623533931174" r="5" fill="rgb(30,150,112)"></circle> <circle cx="161.15153490662175" cy="96.99587052613042" r="5" fill="rgb(30,150,61)"></circle> <circle cx="245.67175110458567" cy="217.1949486286303" r="5" fill="rgb(30,150,116)"></circle> <circle cx="157.1543105644771" cy="197.82600606935443" r="5" fill="rgb(30,150,45)"></circle> <circle cx="277.47686405127035" cy="159.7874794173272" r="5" fill="rgb(30,150,130)"></circle> <circle cx="233.345787687867" cy="166.3550830285023" r="5" fill="rgb(30,150,84)"></circle> <circle cx="117.83415920099087" cy="164.15103726228338" r="5" fill="rgb(30,150,40)"></circle> <circle cx="120.13909214312396" cy="172.46043638719644" r="5" fill="rgb(30,150,41)"></circle> <circle cx="205.5110421762653" cy="72.98191491764617" r="5" fill="rgb(30,150,102)"></circle> <circle cx="96.80163765991092" cy="62.92764545891779" r="5" fill="rgb(30,150,115)"></circle> <circle cx="124.88959943706861" cy="225.15044973370053" r="5" fill="rgb(30,150,81)"></circle> <circle cx="164.15746228129717" cy="208.86982033897232" r="5" fill="rgb(30,150,58)"></circle> <circle cx="61.99262838338286" cy="146.89828049656404" r="5" fill="rgb(30,150,99)"></circle> <circle cx="172.85767813829926" cy="78.87359339217413" r="5" fill="rgb(30,150,83)"></circle> <circle cx="253.24460591758893" cy="78.41050145160236" r="5" fill="rgb(30,150,132)"></circle> <circle cx="118.82587572803565" cy="135.954087178179" r="5" fill="rgb(30,150,43)"></circle> <circle cx="98.37373962332532" cy="154.76680314997353" r="5" fill="rgb(30,150,60)"></circle> <circle cx="122.31937398668295" cy="165.877836976854" r="5" fill="rgb(30,150,36)"></circle> <circle cx="149.9286260021866" cy="46.27747926759328" r="5" fill="rgb(30,150,115)"></circle> <circle cx="150.6188359447945" cy="196.58148153111807" r="5" fill="rgb(30,150,44)"></circle> <circle cx="96.17812624734673" cy="29.840537240648665" r="5" fill="rgb(30,150,146)"></circle> <circle cx="128.59108692837646" cy="194.72588208165476" r="5" fill="rgb(30,150,50)"></circle> <circle cx="38.82122769921369" cy="75.5662312500352" r="5" fill="rgb(30,150,149)"></circle> <circle cx="79.94903569579193" cy="186.85152375858772" r="5" fill="rgb(30,150,86)"></circle> <circle cx="204.77448960563186" cy="203.64418479165812" r="5" fill="rgb(30,150,73)"></circle> <circle cx="102.88584275265274" cy="197.78063641998918" r="5" fill="rgb(30,150,71)"></circle> <circle cx="159.65478381235536" cy="151.46210092241446" r="5" fill="rgb(30,150,6)"></circle> <circle cx="134.10239921221842" cy="161.49132008992956" r="5" fill="rgb(30,150,23)"></circle> <circle cx="139.09958643074796" cy="219.08371036054947" r="5" fill="rgb(30,150,70)"></circle> <circle cx="146.567509740401" cy="147.39910865707066" r="5" fill="rgb(30,150,12)"></circle> <circle cx="131.83426320463218" cy="162.48898240420658" r="5" fill="rgb(30,150,25)"></circle> <circle cx="173.79168328304365" cy="42.17798379123914" r="5" fill="rgb(30,150,121)"></circle> <circle cx="109.95961714856101" cy="176.03754103367197" r="5" fill="rgb(30,150,52)"></circle> <circle cx="193.05669580827944" cy="188.37810635692216" r="5" fill="rgb(30,150,53)"></circle> <circle cx="104.13084921683644" cy="251.78865585330408" r="5" fill="rgb(30,150,116)"></circle> <circle cx="151.87833723048243" cy="141.41758941633188" r="5" fill="rgb(30,150,14)"></circle> <circle cx="170.37984822769394" cy="82.74727274516178" r="5" fill="rgb(30,150,78)"></circle> <circle cx="269.0943849070194" cy="126.07704256534687" r="5" fill="rgb(30,150,125)"></circle> <circle cx="125.65122538235366" cy="91.64498546299714" r="5" fill="rgb(30,150,74)"></circle> <circle cx="197.53172426918525" cy="128.69408459081865" r="5" fill="rgb(30,150,53)"></circle> <circle cx="174.6642667835747" cy="158.9818125733492" r="5" fill="rgb(30,150,21)"></circle> <circle cx="24.442195159380894" cy="149.95618131450235" r="5" fill="rgb(30,150,138)"></circle> <circle cx="230.57251917564554" cy="160.3740796367529" r="5" fill="rgb(30,150,80)"></circle> <circle cx="116.98152224764455" cy="119.15376321927269" r="5" fill="rgb(30,150,55)"></circle> <circle cx="76.56308571870836" cy="116.27351644357717" r="5" fill="rgb(30,150,92)"></circle> <circle cx="114.18131147378502" cy="228.83119145309104" r="5" fill="rgb(30,150,89)"></circle> <circle cx="61.43526198061147" cy="189.2999144311051" r="5" fill="rgb(30,150,105)"></circle> <circle cx="47.159274262692136" cy="232.7974361297379" r="5" fill="rgb(30,150,141)"></circle> <circle cx="182.3516235175878" cy="147.2513501676052" r="5" fill="rgb(30,150,30)"></circle> <circle cx="212.65566528240188" cy="106.8365872143227" r="5" fill="rgb(30,150,79)"></circle> <circle cx="103.57241974005441" cy="244.94215489038754" r="5" fill="rgb(30,150,110)"></circle> <circle cx="118.74222089776532" cy="72.89123743199185" r="5" fill="rgb(30,150,95)"></circle> <circle cx="249.90029463264338" cy="210.31306906279752" r="5" fill="rgb(30,150,116)"></circle> <circle cx="138.08211482254237" cy="201.93298825621986" r="5" fill="rgb(30,150,53)"></circle> <circle cx="99.45732504409123" cy="125.68120399343496" r="5" fill="rgb(30,150,66)"></circle> <circle cx="95.25417908245312" cy="199.8722971385956" r="5" fill="rgb(30,150,79)"></circle> <circle cx="173.5225523778074" cy="183.25325411366197" r="5" fill="rgb(30,150,35)"></circle> <circle cx="161.10556608174647" cy="287.6615940190875" r="5" fill="rgb(30,150,141)"></circle> <circle cx="99.12828988863924" cy="192.5533080036565" r="5" fill="rgb(30,150,71)"></circle> <circle cx="138.3352868758438" cy="198.47497165114282" r="5" fill="rgb(30,150,49)"></circle> <circle cx="193.78642259086737" cy="131.00758347474238" r="5" fill="rgb(30,150,48)"></circle> <circle cx="232.588767217581" cy="166.3351798078713" r="5" fill="rgb(30,150,83)"></circle> <circle cx="39.31251655429242" cy="177.08833200695184" r="5" fill="rgb(30,150,125)"></circle> <circle cx="185.95704286695798" cy="177.33472005753862" r="5" fill="rgb(30,150,40)"></circle> <circle cx="147.90048340005285" cy="71.10204540244274" r="5" fill="rgb(30,150,89)"></circle> <circle cx="166.8845546562491" cy="172.74666158680589" r="5" fill="rgb(30,150,22)"></circle> <circle cx="277.6246746037615" cy="90.30367358125177" r="5" fill="rgb(30,150,147)"></circle> <circle cx="163.7772455221003" cy="119.59515393163443" r="5" fill="rgb(30,150,38)"></circle> <circle cx="100.8084390756384" cy="179.4519113235002" r="5" fill="rgb(30,150,63)"></circle> <circle cx="232.797670719027" cy="208.95839448193917" r="5" fill="rgb(30,150,100)"></circle> <circle cx="116.20169369192108" cy="215.30258202242675" r="5" fill="rgb(30,150,76)"></circle> <circle cx="129.14679183749018" cy="162.7114418319233" r="5" fill="rgb(30,150,28)"></circle> <circle cx="172.21836963279975" cy="53.36276325209766" r="5" fill="rgb(30,150,109)"></circle> <circle cx="122.18074560789485" cy="31.35034324083615" r="5" fill="rgb(30,150,135)"></circle> <circle cx="234.92525075624567" cy="197.12521379760366" r="5" fill="rgb(30,150,95)"></circle> <circle cx="287.55861698920245" cy="191.54124064684203" r="5" fill="rgb(30,150,146)"></circle> <circle cx="208.95996913096113" cy="86.31885888350531" r="5" fill="rgb(30,150,92)"></circle> <circle cx="117.94515643676408" cy="125.74735207871876" r="5" fill="rgb(30,150,50)"></circle> <circle cx="97.65527429491222" cy="84.40941345270775" r="5" fill="rgb(30,150,96)"></circle> <circle cx="148.98989317857215" cy="107.68365082202222" r="5" fill="rgb(30,150,50)"></circle> <circle cx="83.80736835288073" cy="136.33946071934116" r="5" fill="rgb(30,150,78)"></circle> <circle cx="199.93779378476336" cy="138.9591143291108" r="5" fill="rgb(30,150,50)"></circle> <circle cx="158.33576748574276" cy="205.38810908810458" r="5" fill="rgb(30,150,53)"></circle> <circle cx="157.50068512278443" cy="189.02964217352948" r="5" fill="rgb(30,150,36)"></circle> <circle cx="153.9943950342934" cy="149.63839051508984" r="5" fill="rgb(30,150,5)"></circle> <circle cx="227.12941615549062" cy="152.9883523085731" r="5" fill="rgb(30,150,76)"></circle> <circle cx="206.6719685811751" cy="116.71508779989065" r="5" fill="rgb(30,150,68)"></circle> <circle cx="148.85052880252837" cy="109.67806598750374" r="5" fill="rgb(30,150,48)"></circle> <circle cx="226.66377000731163" cy="61.32427435125567" r="5" fill="rgb(30,150,125)"></circle> <circle cx="66.10772769569768" cy="110.10357863882781" r="5" fill="rgb(30,150,105)"></circle> <circle cx="152.27636978490196" cy="114.5539300162203" r="5" fill="rgb(30,150,43)"></circle> <circle cx="135.56796817958528" cy="127.40915255930368" r="5" fill="rgb(30,150,35)"></circle> <circle cx="195.72769880316034" cy="203.4027436123629" r="5" fill="rgb(30,150,67)"></circle> <circle cx="130.7530263067129" cy="244.7852266812409" r="5" fill="rgb(30,150,98)"></circle> <circle cx="36.438341384815075" cy="210.6090541896294" r="5" fill="rgb(30,150,139)"></circle> <circle cx="176.71218763469287" cy="137.54323300750582" r="5" fill="rgb(30,150,29)"></circle> <circle cx="174.45032008232968" cy="209.2316111886315" r="5" fill="rgb(30,150,61)"></circle> <circle cx="68.73068617514102" cy="52.28176780869747" r="5" fill="rgb(30,150,142)"></circle> <circle cx="162.4456402979608" cy="73.76239706732053" r="5" fill="rgb(30,150,86)"></circle> <circle cx="108.00141921697366" cy="109.55469140282139" r="5" fill="rgb(30,150,69)"></circle> <circle cx="162.96141476843476" cy="141.23102327916624" r="5" fill="rgb(30,150,16)"></circle> <circle cx="125.9345304765698" cy="238.19247603714848" r="5" fill="rgb(30,150,93)"></circle><line x1="130.64433518067872" y1="28.1630727673696" x2="96.17812624734673" y2="29.840537240648665" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="96.17812624734673" y1="29.840537240648665" x2="67.04524904809107" y2="53.02953597638252" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="67.04524904809107" y1="53.02953597638252" x2="38.82122769921369" y2="75.5662312500352" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="38.82122769921369" y1="75.5662312500352" x2="28.36356558991553" y2="95.4663889254756" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="28.36356558991553" y1="95.4663889254756" x2="18.330634507062157" y2="169.68512490920642" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="18.330634507062157" y1="169.68512490920642" x2="19.797156728201166" y2="208.00327375672293" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="19.797156728201166" y1="208.00327375672293" x2="36.83140136457256" y2="237.10836498299798" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="36.83140136457256" y1="237.10836498299798" x2="132.24331417077946" y2="291.2609993001805" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="132.24331417077946" y1="291.2609993001805" x2="161.10556608174647" y2="287.6615940190875" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="161.10556608174647" y1="287.6615940190875" x2="226.2427629753817" y2="260.4928511647599" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="226.2427629753817" y1="260.4928511647599" x2="282.75471021838604" y2="222.40422121056434" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="282.75471021838604" y1="222.40422121056434" x2="287.55861698920245" y2="191.54124064684203" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="287.55861698920245" y1="191.54124064684203" x2="277.6246746037615" y2="90.30367358125177" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="277.6246746037615" y1="90.30367358125177" x2="251.5850563588106" y2="65.40572671380644" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="251.5850563588106" y1="65.40572671380644" x2="204.0380699117014" y2="37.35498291700646" style="stroke:rgb(255,0,0);stroke-width:2"></line> <line x1="204.0380699117014" y1="37.35498291700646" x2="130.64433518067872" y2="28.1630727673696" style="stroke:rgb(255,0,0);stroke-width:2"></line></svg>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines}
+---------------------------------------------------------------------------------------------
+--
+-- GRAHAM SCAN IMPLEMENTATION
+--
+-- This little haskell programm calulates the Convex Hull for a set of 2D points.
+-- It ships wit a main function that feeds the Graham Scan algorithm with some
+-- random points and generates a simple SVG of the input points and resulting envelope.
+-- A simple SVG encoder is included.
+--
+-- Alogrithm used: https://en.wikipedia.org/wiki/Graham_scan
+--
+-- CREDITS --
+--
+-- Michal Idziorek <m.i@gmx.at>
+-- 16 December 2017
+--
+---------------------------------------------------------------------------------------------
+
+import Data.List
+import System.Random
+
+---------------------------------------------------------------------------------------------
+
+-- GRAHAM SCAN --
+
+-- Three points are clockwise if ccw < 0.
+ccw (p1x,p1y) (p2x,p2y) (p3x,p3y) = (p2x - p1x)*(p3y - p1y) - (p2y - p1y)*(p3x - p1x)
+
+-- Calculate the slope defined by 2 points. (return Infinity, if points are identical).
+slope (ax,ay) (bx,by) | (ax,ay ) == (bx,by) = 1/0 -- Infinity
+ | otherwise = (bx-ax)/(by-ay)
+
+-- Comparison function to sort points counterclockwise (given a reference point).
+slope_cmp a b c = compare (slope a c) (slope a b)
+
+-- Comparison function using the y and x coordinates for ordering.
+graham_cmp (ax,ay) (bx,by) | ay /= by = compare ay by
+ | otherwise = compare ax bx
+
+-- Graham scan on prepared data. this will calculate the convex hull.
+graham_calc [] hs = hs
+graham_calc (x1:xs) hh | length(hh) < 2 = graham_calc xs (x1:hh)
+graham_calc xx@(x1:xs) hh@(h1:h2:hs) | ccw x1 h1 h2 < 0 = graham_calc xs (x1:hh)
+ | otherwise = graham_calc xx (h2:hs)
+
+-- Find the starting point, sort all points counterclockwise and perform the graham scan.
+graham xs = graham_calc sortedPoints []
+ where minPoint = minimumBy graham_cmp xs
+ sortedPoints = sortBy (slope_cmp minPoint) xs
+
+---------------------------------------------------------------------------------------------
+
+-- XML ENCODING--
+
+xml_attr (x:xs) = x++"=\""++(head xs)++"\" "
+xml_enc tag attrs body = "<"++tag++" "++xml_attrs++">"++body++"</"++tag++">"
+ where xml_attrs = unlines $ map xml_attr attrs
+
+-- SVG ENCODING --
+
+-- hardcoded scaling and panning function
+svg_transf x = x*30+5
+
+line_to_svg ((x1,y1),(x2,y2)) = xml_enc "line" [["x1",show lx1],["y1",show ly1],
+ ["x2",show lx2],["y2",show ly2],
+ ["style", "stroke:rgb(255,0,0);stroke-width:2"]] ""
+ where lx1=svg_transf x1
+ lx2=svg_transf x2
+ ly1=svg_transf y1
+ ly2=svg_transf y2
+
+point_to_svg (x,y) = xml_enc "circle" [["cx",show cx],["cy",show cy],["r","5"],
+ ["fill","rgb(30,150,"++(show (floor dist))++")"]] ""
+ where cx=svg_transf x
+ cy=svg_transf y
+ dist= (sqrt ((x-5)*(x-5) + (y-5)*(y-5)))*255/8
+
+
+
+-- draws SVG points and lines (in hardcoded sizes and colors)
+svg_draw p l = xml_enc "svg" [style,["width","330"],["height","330"]] body
+ where style = ["style",
+ "background-color:black;border:3px solid green;margin:2px;"]
+ body = (unlines (map point_to_svg p )) ++
+ (unlines (map line_to_svg l ))
+
+-- calculate convex hull and generate svg
+svg_graham xs = svg_draw xs (zip hull hull_open)
+ where hull_open = graham xs
+ hull = (last hull_open) : hull_open
+
+-- RANDOMIZING --
+
+randomPoints g cnt = take cnt (zip r10a r10b)
+ where r5 = randomRs (0,5) g :: [Double]
+ r10a =zipWith (+) r5 (drop cnt r5)
+ r10b =zipWith (+) (drop (2*cnt) r5) (drop (3*cnt) r5)
+
+---------------------------------------------------------------------------------------------
+
+-- MAIN --
+
+-- Note that this is the only place of impurity in this source-file.
+-- Is is subject to side effects due to I/O (we are writng to stdout)
+-- and the random number generator.
+main = do
+ g <- newStdGen
+ putStr (svg_graham (randomPoints g 25))
+ putStr (svg_graham (randomPoints g 50))
+ putStr (svg_graham (randomPoints g 100))
+ putStr (svg_graham (randomPoints g 250))
+ putStr (svg_graham (randomPoints g 500))
+ putStr (svg_graham (randomPoints g 1500))
+
+---------------------------------------------------------------------------------------------
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/00_blog/00040_Haskell/00065_Base64-Encoder/base64.cast b/00_blog/00040_Haskell/00065_Base64-Encoder/base64.cast
new file mode 100644
index 0000000..b32cd78
--- /dev/null
+++ b/00_blog/00040_Haskell/00065_Base64-Encoder/base64.cast
@@ -0,0 +1,146 @@
+{
+ "env": {
+ "TERM": "screen-256color",
+ "SHELL": "/bin/bash"
+ },
+ "version": 1,
+ "command": null,
+ "title": null,
+ "width": 90,
+ "height": 7,
+ "duration": 26.498611,
+ "stdout": [
+ [
+ 0.018948,
+ "miguel@megaloman:~/git/haskell/base64$ "
+ ],
+ [
+ 0.831467,
+ "cat /tmp/random.bin | pv | ./base64 > /dev/null "
+ ],
+ [
+ 0.269283,
+ "\r\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[C\u001b[17Pecho \"Hello Base64!\" | ./base64"
+ ],
+ [
+ 1.242802,
+ "\r\n"
+ ],
+ [
+ 0.002817,
+ "SGVsbG8gQmFzZTY0IQo=\r\n"
+ ],
+ [
+ 0.000531,
+ "miguel@megaloman:~/git/haskell/base64$ "
+ ],
+ [
+ 0.827791,
+ "echo \"Hello Base64!\" | ./base64"
+ ],
+ [
+ 0.207417,
+ "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bcat /tmp/random.bin | pv | ./base64 > /dev/null "
+ ],
+ [
+ 0.963475,
+ "\r\n"
+ ],
+ [
+ 1.002914,
+ " 434MiB 0:00:01 [ 434MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.99997,
+ " 876MiB 0:00:02 [ 441MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.000022,
+ "1.28GiB 0:00:03 [ 439MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.000032,
+ "1.73GiB 0:00:04 [ 455MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.999929,
+ "2.18GiB 0:00:05 [ 464MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.999976,
+ "2.64GiB 0:00:06 [ 464MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.000019,
+ "3.09GiB 0:00:07 [ 466MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.00003,
+ "3.55GiB 0:00:08 [ 467MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.0,
+ "3.99GiB 0:00:09 [ 452MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.999962,
+ "4.43GiB 0:00:10 [ 451MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.000027,
+ "4.88GiB 0:00:11 [ 459MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.000061,
+ "5.32GiB 0:00:12 [ 451MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.999986,
+ "5.76GiB 0:00:13 [ 449MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.999944,
+ "6.19GiB 0:00:14 [ 441MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.999991,
+ "6.64GiB 0:00:15 [ 453MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.000027,
+ "7.07GiB 0:00:16 [ 442MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.00001,
+ " 7.5GiB 0:00:17 [ 442MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.000009,
+ "7.93GiB 0:00:18 [ 440MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.999988,
+ "8.37GiB 0:00:19 [ 449MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.000024,
+ "8.81GiB 0:00:20 [ 445MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.99992,
+ "9.26GiB 0:00:21 [ 461MiB/s] [ <=> ]\r"
+ ],
+ [
+ 1.000016,
+ "9.71GiB 0:00:22 [ 461MiB/s] [ <=> ]\r"
+ ],
+ [
+ 0.129892,
+ "9.77GiB 0:00:22 [ 451MiB/s] [ <=> ]\r\r\n"
+ ],
+ [
+ 0.000604,
+ "miguel@megaloman:~/git/haskell/base64$ "
+ ]
+ ]
+} \ No newline at end of file
diff --git a/00_blog/00040_Haskell/00065_Base64-Encoder/index.md b/00_blog/00040_Haskell/00065_Base64-Encoder/index.md
new file mode 100644
index 0000000..bdbae41
--- /dev/null
+++ b/00_blog/00040_Haskell/00065_Base64-Encoder/index.md
@@ -0,0 +1,21 @@
+ February 2018
+Miguel's Base64 Encoder
+=======================
+
+Initially coded on a cold winter afternoon to fully understand **base64 encoding** and play with
+**Haskell**, which is always an indisputable pleasure. Hacked together in _big anger_, due to my
+friend Nick's fairy tales about saving his encrypted binary data in plain _ASCII_
+configuration files,... featuring strange letters and non-printable characters. :smile:
+
+After optimizing quite a bit, the encoder performs around **460MB/s** on a single core of my _i7-4790K_.
+
+<asciinema-player loop="1" preload="true" theme="solarized-dark" autoplay="true" src="base64.cast"></asciinema-player>
+
+The source code below was auto-fetched from:
+<https://gitweb.softwarefools.com/?p=miguel/haskell.git;a=blob;f=base64/base64.hs>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines}
+{BEGIN:EMBED}
+https://gitweb.softwarefools.com/?p=miguel/haskell.git;a=blob_plain;f=base64/base64.hs
+{END:EMBED}
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/00_blog/00040_Haskell/00120_Lambda-Calculus/index.md b/00_blog/00040_Haskell/00120_Lambda-Calculus/index.md
new file mode 100644
index 0000000..b86950f
--- /dev/null
+++ b/00_blog/00040_Haskell/00120_Lambda-Calculus/index.md
@@ -0,0 +1,39 @@
+ May 2018
+Lambda Calculus
+===============
+
+Playing with Type Quantifiers and Haskell's Rank 2 Type Polymorphsim,
+implementing Boolean logic from scratch. We use the conventional
+definitions for `True` an `False` also known as Church booleans, after Alonzo Church, who
+intruced them along Lambda Calculus in the 1930s [[1]](#ref).
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines}
+{-# LANGUAGE Rank2Types #-}
+
+fTrue :: forall a. a->a->a
+fTrue x y = x
+
+fFalse :: forall a. a->a->a
+fFalse x y = y
+
+fAnd :: (forall a. a->a->a)->(forall a. a->a->a)->(forall a. a->a->a)
+fAnd p q = p q p
+
+fOr :: (forall a. a->a->a)->(forall a. a->a->a)->(forall a. a->a->a)
+fOr p q = p p q
+
+fNot :: (forall a. a->a->a)->(forall a. a->a->a)
+fNot p = p fFalse fTrue
+
+ifThenElse :: (forall a. a->a->a)->(forall a. a->a->a)
+ ->(forall a. a->a->a)->(forall a. a->a->a)
+ifThenElse p a b = p a b
+
+-- Example --
+
+main = print $ (ifThenElse fFalse fFalse $ fAnd fTrue $ fNot fFalse) "T" "F"
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## Ref
+
+* [1] <https://en.wikipedia.org/wiki/Lambda_calculus>
diff --git a/00_blog/00040_Haskell/00130_Calculator-on-Parsec-and-GTK/calc.png b/00_blog/00040_Haskell/00130_Calculator-on-Parsec-and-GTK/calc.png
new file mode 100644
index 0000000..19b47f0
--- /dev/null
+++ b/00_blog/00040_Haskell/00130_Calculator-on-Parsec-and-GTK/calc.png
Binary files differ
diff --git a/00_blog/00040_Haskell/00130_Calculator-on-Parsec-and-GTK/index.md b/00_blog/00040_Haskell/00130_Calculator-on-Parsec-and-GTK/index.md
new file mode 100644
index 0000000..cc0aa28
--- /dev/null
+++ b/00_blog/00040_Haskell/00130_Calculator-on-Parsec-and-GTK/index.md
@@ -0,0 +1,21 @@
+ May 2018
+Simple Calculator on Parsec and GTK
+===================================
+
+![](scale_calc.png){ width=220px }
+
+Today I implemented this simple stupid calulator as a side effect of playing
+around with parsec [1] and haskells gtk3 [2] bindings, as well as glade [3] -
+an interactive user interface designer.
+
+Source Files
+------------
+
+* <https://gitweb.softwarefools.com/?p=miguel/haskell.git;a=tree;f=calcGTK>
+
+Ref
+---
+
+* [1] <https://hackage.haskell.org/package/parsec>
+* [2] <https://hackage.haskell.org/package/gtk3>
+* [3] <https://glade.gnome.org/>
diff --git a/00_blog/00040_Haskell/00140_Minimalistic-SVG-Generator/index.md b/00_blog/00040_Haskell/00140_Minimalistic-SVG-Generator/index.md
new file mode 100644
index 0000000..2c21d91
--- /dev/null
+++ b/00_blog/00040_Haskell/00140_Minimalistic-SVG-Generator/index.md
@@ -0,0 +1,27 @@
+ May 2018
+A Minimalistic SVG Generator
+============================
+
+
+
+A minimalistic SVG generator for my humble requirements.
+They might grow someday however...
+
+The SVG in the following screenshot was generated from the following code
+to demonstrate a simple use case.
+
+The source code below was auto-fetched from:
+<https://gitweb.softwarefools.com/?p=miguel/haskell.git;a=blob;f=simpleSVG/TestSvg.hs>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines}
+{BEGIN:EMBED}
+https://gitweb.softwarefools.com/?p=miguel/haskell.git;a=blob_plain;f=simpleSVG/TestSvg.hs
+{END:EMBED}
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+![](svg.png){.img-fluid .border}
+
+Source Files
+------------
+
+* <https://gitweb.softwarefools.com/?p=miguel/haskell.git;a=tree;f=simpleSVG>
diff --git a/00_blog/00040_Haskell/00140_Minimalistic-SVG-Generator/svg.png b/00_blog/00040_Haskell/00140_Minimalistic-SVG-Generator/svg.png
new file mode 100644
index 0000000..d679fad
--- /dev/null
+++ b/00_blog/00040_Haskell/00140_Minimalistic-SVG-Generator/svg.png
Binary files differ
diff --git a/00_blog/00040_Haskell/00150_Applicative-vs-Monadic-Parsing/index.md b/00_blog/00040_Haskell/00150_Applicative-vs-Monadic-Parsing/index.md
new file mode 100644
index 0000000..6e4418b
--- /dev/null
+++ b/00_blog/00040_Haskell/00150_Applicative-vs-Monadic-Parsing/index.md
@@ -0,0 +1,175 @@
+ March 2019
+# Applicative vs. Monadic Parsing
+
+Some _real world parsers_ as _Parsec_, let us choose between applicative and
+monadic parsing. The applicative style should be sufficient to parse
+_context-free_ languages and is easier to reason about, but it is not capable
+of parsing _context-sensitive_ grammars.
+
+## Functor, Applicative, Alternative, Monad
+
+Before we discuss Applicative and Monadic Parsing, it is important to
+understand what Functors, Applicative Functors, Alternatives and Monads
+have to offer. When in doubt simply look up the type-class definition.
+
+Two well-known data types which are instances of all of the above are
+**Maybe** and **List**. Try it yourself in _GHCi_.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines}
+-- Maybe as Functor
+fmap (+20) (Just 10)
+fmap (+20) (Nothing)
+
+-- List as Functor
+fmap (+20) [1..10]
+
+-- Maybe as Applicative Functor
+Nothing <*> Just (22)
+Just (+1) <*> Nothing
+Just (+15) <*> Just (22)
+
+-- List as Applicative Functor
+[]<*>[1..5]
+[(+1),(+15)]<*>[]
+[(+1),(+15)]<*>[1..5]
+
+-- Maybe as Alternative
+Nothing <|> Just 5
+Just 5 <|> Nothing
+Just 22 <|> Just 10
+
+-- List as Alternative
+[1..5] <|> [5..10]
+
+-- Maybe as Monad
+Just 5 >>= Just . (+10)
+Just 5 >>= return . (+10)
+Just 10 >>= return . (+5) >>=return . (+10)
+Nothing >>= return . (+5) >>=return . (+10)
+Just 10 >>= \x-> return (x*2) >>=return . (+x`div`2)
+
+-- List as Monad
+[1..10] >>= (:[]) . (*5)
+[1..5] >>= return . (^2)
+[[1..5],[5..10],[],[12]]>>=id
+[[1..5],[5..10],[],[12]]>>= map (*4)
+[1..5] >>= \a -> [100..100+a] >>= \b -> return (a+b)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## Simple Parser
+
+Our simple toy Parser simply encapsulates a parsing function that returns
+_Nothing_ if parsing fails. Otherwise a _pair_ consisting of the parsed and
+unparsed input inside its respective elements.
+
+Notice that we made our Parser instance of all the type-classes already.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines}
+data Parser a b = Parser (a->Maybe (b,a))
+
+instance Functor (Parser a) where
+ fmap f p = Parser g
+ where g inp = case parse p inp of Just (x,y) -> Just (f x,y)
+ _ -> Nothing
+
+instance Applicative (Parser a) where
+ pure v = Parser (\inp -> Just (v,inp))
+ pg <*> px = Parser g
+ where g inp = case parse pg inp of Just (f,b) -> parse (fmap f px) b
+ _ -> Nothing
+
+instance Alternative (Parser a) where
+ empty = Parser (\_ -> Nothing)
+ p1 <|> p2 = Parser g
+ where g inp = case parse p1 inp of Nothing -> parse p2 inp
+ x -> x
+
+instance Monad (Parser a) where
+ return = pure
+ p >>= f = Parser g
+ where g inp = case parse p inp of Just (a,b) -> parse (f a) b
+ _ -> Nothing
+
+parse :: Parser a b -> a -> Maybe (b,a)
+parse (Parser f) inp = f inp
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## Primitives
+
+We also need at least a minimal set of primitives to parse something.
+Note that the primitives can give you the effects of Applicative or
+Alternative even if there's no instance (as dmwit pointed out on #haskell).
+E.g. the _word_ primitive below, could not be composed, by combining the
+_char_ parsers in an applicative style only.
+
+The _num_ parser makes use of the _some_ combinator which requires our
+Parser to be an instance of _Alternative_ as well. _Applicative_
+alone is of limited use in practice since without it, we also lack
+the <|> combinator.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines}
+word :: String -> Parser String String
+word w = Parser g where l = length w
+ g inp = if take l inp == w then Just (w,drop l inp)
+ else Nothing
+
+satisfy :: (Char -> Bool) -> Parser String Char
+satisfy f = Parser g where g (x:xs) | f x = Just (x,xs)
+ g _ = Nothing
+
+space :: Parser String Char
+space = satisfy (==' ')
+
+char :: Char -> Parser String Char
+char c = satisfy (==c)
+
+notChar :: Char -> Parser String Char
+notChar c = satisfy (/=c)
+
+num :: Parser String Int
+num = read <$> some (satisfy isDigit)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## Applicative / Alternative parsing
+
+Let's parse something!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines}
+-- well-formed parentheses are the canonical example of a context-free grammar
+parsePar = concat <$> some parseP where parseP = word "()" <|> (char '(' *> parsePar <* char ')')
+parse parsePar "((()())()())"
+
+-- a simple context-free language with matching pairs of a's and b's, which is not regular
+parseAB = (\a x b -> a:x++"b") <$> char 'a' <*> parseAB <*> char 'b' <|> word "ab"
+parse parseAB "aaaaabbbbb"
+
+-- parse basic mathematical operations and calulate the results.
+parseOp op sig = (pure (op) <* many space <*> num <* many space <* char sig <* many space <*> num )
+parse (parseOp (+) '+' <|> parseOp (-) '-' <|> parseOp (*) '*' <|> parseOp (div) '/') " 111 * 747 "
+parse (parseOp (+) '+' <|> parseOp (-) '-' <|> parseOp (*) '*' <|> parseOp (div) '/') "111+747"
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## Monadic parsing of context-sensitive grammars
+
+The canonical non-context-free language can not be caputred by applicative parsing anymore: $$\{a^n b^n c^n : n \geqslant 1\}$$
+
+The following monadic parser will work here:
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.haskell .numberLines}
+parseABC = length <$> (many $ char 'a') >>= \la ->
+ length <$> (many $ char 'b') >>= \lb ->
+ length <$> (many $ char 'c') >>= \lc ->
+ if la==lb&&lb==lc then pure ("ABCok") else empty
+
+parse parseABC "aaaaabbbbbccccc"
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+## Summary
+
+As usual, use the simplest tool that will suffice :smile:
+
+## Ref / Further Reading
+
+* <http://dev.stephendiehl.com/fun/002_parsers.html>
+* <https://eli.thegreenplace.net/2017/deciphering-haskells-applicative-and-monadic-parsers/>
+* <https://byorgey.wordpress.com/2012/01/05/parsing-context-sensitive-languages-with-applicative/>
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index.md b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index.md
new file mode 100644
index 0000000..5060081
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index.md
@@ -0,0 +1,20 @@
+# Pandoc Color Themes
+
+Color-themes for syntax-highlighting obtained from Pandoc.
+E.g. To get the pygments theme you need to have some source-code embedded
+in your markdown and run:
+
+ stack exec pandoc -- -s file.md --highlight-style pygments
+
+Then you can extract the css from the resulting standalone html file.
+Here you can find my extracted html files for reference:
+
+* [breezedark](index_breezedark.html)
+* [espresso](index_espresso.html)
+* [haddock](index_haddock.html)
+* [kate](index_kate.html)
+* [monochrome](index_monochrome.html)
+* [pygments](index_pygments.html)
+* [tango](index_tango.html)
+* [zenburn](index_zenburn.html)
+
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_breezedark.html b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_breezedark.html
new file mode 100644
index 0000000..6b89b97
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_breezedark.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+ <meta charset="utf-8" />
+ <meta name="generator" content="pandoc" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+ <title>index</title>
+ <style type="text/css">
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ </style>
+ <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+ { position: relative; left: -4em; }
+pre.numberSource a.sourceLine::before
+ { content: attr(title);
+ position: relative; left: -1em; text-align: right; vertical-align: baseline;
+ border: none; pointer-events: all; display: inline-block;
+ -webkit-touch-callout: none; -webkit-user-select: none;
+ -khtml-user-select: none; -moz-user-select: none;
+ -ms-user-select: none; user-select: none;
+ padding: 0 4px; width: 4em;
+ background-color: #232629;
+ color: #7a7c7d;
+ }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #7a7c7d; padding-left: 4px; }
+div.sourceCode
+ { color: #cfcfc2; background-color: #232629; }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span. { color: #cfcfc2; } /* Normal */
+code span.al { color: #95da4c; } /* Alert */
+code span.an { color: #3f8058; } /* Annotation */
+code span.at { color: #2980b9; } /* Attribute */
+code span.bn { color: #f67400; } /* BaseN */
+code span.bu { color: #7f8c8d; } /* BuiltIn */
+code span.cf { color: #fdbc4b; } /* ControlFlow */
+code span.ch { color: #3daee9; } /* Char */
+code span.cn { color: #27aeae; } /* Constant */
+code span.co { color: #7a7c7d; } /* Comment */
+code span.cv { color: #7f8c8d; } /* CommentVar */
+code span.do { color: #a43340; } /* Documentation */
+code span.dt { color: #2980b9; } /* DataType */
+code span.dv { color: #f67400; } /* DecVal */
+code span.er { color: #da4453; } /* Error */
+code span.ex { color: #0099ff; } /* Extension */
+code span.fl { color: #f67400; } /* Float */
+code span.fu { color: #8e44ad; } /* Function */
+code span.im { color: #27ae60; } /* Import */
+code span.in { color: #c45b00; } /* Information */
+code span.kw { color: #cfcfc2; } /* Keyword */
+code span.op { color: #cfcfc2; } /* Operator */
+code span.ot { color: #27ae60; } /* Other */
+code span.pp { color: #27ae60; } /* Preprocessor */
+code span.re { color: #2980b9; } /* RegionMarker */
+code span.sc { color: #3daee9; } /* SpecialChar */
+code span.ss { color: #da4453; } /* SpecialString */
+code span.st { color: #f44f4f; } /* String */
+code span.va { color: #27aeae; } /* Variable */
+code span.vs { color: #da4453; } /* VerbatimString */
+code span.wa { color: #da4453; } /* Warning */
+ </style>
+ <!--[if lt IE 9]>
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+ <![endif]-->
+</head>
+<body>
+<div class="sourceCode" id="cb1"><pre class="sourceCode numberSource haskell numberLines"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">import</span> <span class="dt">Data.Array.Base</span>(unsafeAt)</a>
+<a class="sourceLine" id="cb1-2" title="2"><span class="kw">import</span> <span class="dt">Data.Bits</span>(shiftL,shiftR,(.&amp;.))</a>
+<a class="sourceLine" id="cb1-3" title="3"><span class="kw">import</span> <span class="dt">Foreign.Ptr</span> (plusPtr)</a>
+<a class="sourceLine" id="cb1-4" title="4"><span class="kw">import</span> <span class="dt">Foreign.Storable</span> (peek, poke)</a>
+<a class="sourceLine" id="cb1-5" title="5"><span class="kw">import</span> <span class="dt">Foreign.ForeignPtr</span> (withForeignPtr)</a>
+<a class="sourceLine" id="cb1-6" title="6"><span class="kw">import</span> <span class="dt">System.IO.Unsafe</span> (unsafePerformIO)</a>
+<a class="sourceLine" id="cb1-7" title="7"></a>
+<a class="sourceLine" id="cb1-8" title="8"><span class="co">-- |Perform base64 encoding of data from standard input</span></a>
+<a class="sourceLine" id="cb1-9" title="9"><span class="ot">main ::</span> <span class="dt">IO</span>()</a>
+<a class="sourceLine" id="cb1-10" title="10">main <span class="fu">=</span> BL.getContents<span class="fu">&gt;&gt;=</span>BL.putStr<span class="fu">.</span>BL.fromChunks<span class="fu">.map</span> encode64<span class="fu">.</span>reChunk<span class="fu">.</span>BL.toChunks</a>
+<a class="sourceLine" id="cb1-11" title="11"></a>
+<a class="sourceLine" id="cb1-12" title="12"><span class="co">-- |Base64 index table </span></a>
+<a class="sourceLine" id="cb1-13" title="13"><span class="ot">tab64 ::</span> <span class="dt">UArray</span> <span class="dt">Word32</span> <span class="dt">Word8</span></a>
+<a class="sourceLine" id="cb1-14" title="14">tab64 <span class="fu">=</span> array (<span class="dv">0</span>,<span class="dv">63</span>) <span class="fu">$</span> <span class="fu">zip</span> [<span class="dv">0</span><span class="fu">..</span>] <span class="fu">$</span> <span class="fu">map</span> (BI.c2w) <span class="fu">$</span> </a>
+<a class="sourceLine" id="cb1-15" title="15"> [<span class="ch">&#39;A&#39;</span><span class="fu">..</span><span class="ch">&#39;Z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;a&#39;</span><span class="fu">..</span><span class="ch">&#39;z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;0&#39;</span><span class="fu">..</span><span class="ch">&#39;9&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;+&#39;</span>,<span class="ch">&#39;/&#39;</span>]</a>
+<a class="sourceLine" id="cb1-16" title="16"></a>
+<a class="sourceLine" id="cb1-17" title="17"><span class="co">-- |Encodes 3 octets into 4 sextets</span></a>
+<a class="sourceLine" id="cb1-18" title="18"><span class="ot">enc64 ::</span> (<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)<span class="ot">-&gt;</span>(<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)</a>
+<a class="sourceLine" id="cb1-19" title="19">enc64 (b1,b2,b3) <span class="fu">=</span> (t <span class="dv">3</span>,t <span class="dv">2</span>,t <span class="dv">1</span>,t <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb1-20" title="20"> <span class="kw">where</span> t x <span class="fu">=</span> tab64 <span class="ot">`unsafeAt`</span> (n <span class="ot">`shiftR`</span> (x<span class="fu">*</span><span class="dv">6</span>) <span class="fu">.&amp;.</span> <span class="dv">63</span>)</a>
+<a class="sourceLine" id="cb1-21" title="21"> f b n <span class="fu">=</span> <span class="fu">fromIntegral</span> b <span class="ot">`shiftL`</span> n</a>
+<a class="sourceLine" id="cb1-22" title="22"> n <span class="fu">=</span> f b1 <span class="dv">16</span> <span class="fu">+</span> f b2 <span class="dv">8</span> <span class="fu">+</span> f b3 <span class="dv">0</span></a>
+<a class="sourceLine" id="cb1-23" title="23"></a>
+<a class="sourceLine" id="cb1-24" title="24"><span class="co">-- |Transforms list of ByteStrings to a new list of ByteStrings with </span></a>
+<a class="sourceLine" id="cb1-25" title="25"><span class="co">-- lengths guaranteed to be multiples of 3 (excepting the last one)</span></a>
+<a class="sourceLine" id="cb1-26" title="26"><span class="co">-- Assumes that all input ByteStrings (excepting the last one) have </span></a>
+<a class="sourceLine" id="cb1-27" title="27"><span class="co">-- at least a length of 3.</span></a>
+<a class="sourceLine" id="cb1-28" title="28"><span class="ot">reChunk ::</span> [<span class="dt">BS.ByteString</span>] <span class="ot">-&gt;</span> [<span class="dt">BS.ByteString</span>]</a>
+<a class="sourceLine" id="cb1-29" title="29">reChunk (y<span class="fu">:</span>[]) <span class="fu">=</span> [y]</a>
+<a class="sourceLine" id="cb1-30" title="30">reChunk (y<span class="fu">:</span>z<span class="fu">:</span>zs) <span class="fu">=</span> <span class="kw">let</span> c <span class="fu">=</span> BS.length y <span class="ot">`mod`</span> <span class="dv">3</span> </a>
+<a class="sourceLine" id="cb1-31" title="31"> <span class="kw">in</span> BS.append y (BS.take <span class="dv">3</span> z)<span class="fu">:</span>(reChunk <span class="fu">$</span> (BS.drop <span class="dv">3</span> z)<span class="fu">:</span>zs)</a></code></pre></div>
+</body>
+</html>
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_espresso.html b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_espresso.html
new file mode 100644
index 0000000..6b0d627
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_espresso.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+ <meta charset="utf-8" />
+ <meta name="generator" content="pandoc" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+ <title>index</title>
+ <style type="text/css">
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ </style>
+ <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+ { position: relative; left: -4em; }
+pre.numberSource a.sourceLine::before
+ { content: attr(title);
+ position: relative; left: -1em; text-align: right; vertical-align: baseline;
+ border: none; pointer-events: all; display: inline-block;
+ -webkit-touch-callout: none; -webkit-user-select: none;
+ -khtml-user-select: none; -moz-user-select: none;
+ -ms-user-select: none; user-select: none;
+ padding: 0 4px; width: 4em;
+ background-color: #2a211c;
+ color: #bdae9d;
+ }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #bdae9d; padding-left: 4px; }
+div.sourceCode
+ { color: #bdae9d; background-color: #2a211c; }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ffff00; } /* Alert */
+code span.an { color: #0066ff; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { } /* Attribute */
+code span.bn { color: #44aa43; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #43a8ed; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #049b0a; } /* Char */
+code span.cn { } /* Constant */
+code span.co { color: #0066ff; font-weight: bold; font-style: italic; } /* Comment */
+code span.do { color: #0066ff; font-style: italic; } /* Documentation */
+code span.dt { text-decoration: underline; } /* DataType */
+code span.dv { color: #44aa43; } /* DecVal */
+code span.er { color: #ffff00; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #44aa43; } /* Float */
+code span.fu { color: #ff9358; font-weight: bold; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #0066ff; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #43a8ed; font-weight: bold; } /* Keyword */
+code span.op { } /* Operator */
+code span.pp { font-weight: bold; } /* Preprocessor */
+code span.sc { color: #049b0a; } /* SpecialChar */
+code span.ss { color: #049b0a; } /* SpecialString */
+code span.st { color: #049b0a; } /* String */
+code span.va { } /* Variable */
+code span.vs { color: #049b0a; } /* VerbatimString */
+code span.wa { color: #ffff00; font-weight: bold; } /* Warning */
+ </style>
+ <!--[if lt IE 9]>
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+ <![endif]-->
+</head>
+<body>
+<div class="sourceCode" id="cb1"><pre class="sourceCode numberSource haskell numberLines"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">import</span> <span class="dt">Data.Array.Base</span>(unsafeAt)</a>
+<a class="sourceLine" id="cb1-2" title="2"><span class="kw">import</span> <span class="dt">Data.Bits</span>(shiftL,shiftR,(.&amp;.))</a>
+<a class="sourceLine" id="cb1-3" title="3"><span class="kw">import</span> <span class="dt">Foreign.Ptr</span> (plusPtr)</a>
+<a class="sourceLine" id="cb1-4" title="4"><span class="kw">import</span> <span class="dt">Foreign.Storable</span> (peek, poke)</a>
+<a class="sourceLine" id="cb1-5" title="5"><span class="kw">import</span> <span class="dt">Foreign.ForeignPtr</span> (withForeignPtr)</a>
+<a class="sourceLine" id="cb1-6" title="6"><span class="kw">import</span> <span class="dt">System.IO.Unsafe</span> (unsafePerformIO)</a>
+<a class="sourceLine" id="cb1-7" title="7"></a>
+<a class="sourceLine" id="cb1-8" title="8"><span class="co">-- |Perform base64 encoding of data from standard input</span></a>
+<a class="sourceLine" id="cb1-9" title="9"><span class="ot">main ::</span> <span class="dt">IO</span>()</a>
+<a class="sourceLine" id="cb1-10" title="10">main <span class="fu">=</span> BL.getContents<span class="fu">&gt;&gt;=</span>BL.putStr<span class="fu">.</span>BL.fromChunks<span class="fu">.map</span> encode64<span class="fu">.</span>reChunk<span class="fu">.</span>BL.toChunks</a>
+<a class="sourceLine" id="cb1-11" title="11"></a>
+<a class="sourceLine" id="cb1-12" title="12"><span class="co">-- |Base64 index table </span></a>
+<a class="sourceLine" id="cb1-13" title="13"><span class="ot">tab64 ::</span> <span class="dt">UArray</span> <span class="dt">Word32</span> <span class="dt">Word8</span></a>
+<a class="sourceLine" id="cb1-14" title="14">tab64 <span class="fu">=</span> array (<span class="dv">0</span>,<span class="dv">63</span>) <span class="fu">$</span> <span class="fu">zip</span> [<span class="dv">0</span><span class="fu">..</span>] <span class="fu">$</span> <span class="fu">map</span> (BI.c2w) <span class="fu">$</span> </a>
+<a class="sourceLine" id="cb1-15" title="15"> [<span class="ch">&#39;A&#39;</span><span class="fu">..</span><span class="ch">&#39;Z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;a&#39;</span><span class="fu">..</span><span class="ch">&#39;z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;0&#39;</span><span class="fu">..</span><span class="ch">&#39;9&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;+&#39;</span>,<span class="ch">&#39;/&#39;</span>]</a>
+<a class="sourceLine" id="cb1-16" title="16"></a>
+<a class="sourceLine" id="cb1-17" title="17"><span class="co">-- |Encodes 3 octets into 4 sextets</span></a>
+<a class="sourceLine" id="cb1-18" title="18"><span class="ot">enc64 ::</span> (<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)<span class="ot">-&gt;</span>(<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)</a>
+<a class="sourceLine" id="cb1-19" title="19">enc64 (b1,b2,b3) <span class="fu">=</span> (t <span class="dv">3</span>,t <span class="dv">2</span>,t <span class="dv">1</span>,t <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb1-20" title="20"> <span class="kw">where</span> t x <span class="fu">=</span> tab64 <span class="ot">`unsafeAt`</span> (n <span class="ot">`shiftR`</span> (x<span class="fu">*</span><span class="dv">6</span>) <span class="fu">.&amp;.</span> <span class="dv">63</span>)</a>
+<a class="sourceLine" id="cb1-21" title="21"> f b n <span class="fu">=</span> <span class="fu">fromIntegral</span> b <span class="ot">`shiftL`</span> n</a>
+<a class="sourceLine" id="cb1-22" title="22"> n <span class="fu">=</span> f b1 <span class="dv">16</span> <span class="fu">+</span> f b2 <span class="dv">8</span> <span class="fu">+</span> f b3 <span class="dv">0</span></a>
+<a class="sourceLine" id="cb1-23" title="23"></a>
+<a class="sourceLine" id="cb1-24" title="24"><span class="co">-- |Transforms list of ByteStrings to a new list of ByteStrings with </span></a>
+<a class="sourceLine" id="cb1-25" title="25"><span class="co">-- lengths guaranteed to be multiples of 3 (excepting the last one)</span></a>
+<a class="sourceLine" id="cb1-26" title="26"><span class="co">-- Assumes that all input ByteStrings (excepting the last one) have </span></a>
+<a class="sourceLine" id="cb1-27" title="27"><span class="co">-- at least a length of 3.</span></a>
+<a class="sourceLine" id="cb1-28" title="28"><span class="ot">reChunk ::</span> [<span class="dt">BS.ByteString</span>] <span class="ot">-&gt;</span> [<span class="dt">BS.ByteString</span>]</a>
+<a class="sourceLine" id="cb1-29" title="29">reChunk (y<span class="fu">:</span>[]) <span class="fu">=</span> [y]</a>
+<a class="sourceLine" id="cb1-30" title="30">reChunk (y<span class="fu">:</span>z<span class="fu">:</span>zs) <span class="fu">=</span> <span class="kw">let</span> c <span class="fu">=</span> BS.length y <span class="ot">`mod`</span> <span class="dv">3</span> </a>
+<a class="sourceLine" id="cb1-31" title="31"> <span class="kw">in</span> BS.append y (BS.take <span class="dv">3</span> z)<span class="fu">:</span>(reChunk <span class="fu">$</span> (BS.drop <span class="dv">3</span> z)<span class="fu">:</span>zs)</a></code></pre></div>
+</body>
+</html>
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_haddock.html b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_haddock.html
new file mode 100644
index 0000000..5c5af29
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_haddock.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+ <meta charset="utf-8" />
+ <meta name="generator" content="pandoc" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+ <title>index</title>
+ <style type="text/css">
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ </style>
+ <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+ { position: relative; left: -4em; }
+pre.numberSource a.sourceLine::before
+ { content: attr(title);
+ position: relative; left: -1em; text-align: right; vertical-align: baseline;
+ border: none; pointer-events: all; display: inline-block;
+ -webkit-touch-callout: none; -webkit-user-select: none;
+ -khtml-user-select: none; -moz-user-select: none;
+ -ms-user-select: none; user-select: none;
+ padding: 0 4px; width: 4em;
+ color: #aaaaaa;
+ }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
+div.sourceCode
+ { }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; } /* Alert */
+code span.an { color: #008000; } /* Annotation */
+code span.at { } /* Attribute */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #0000ff; } /* ControlFlow */
+code span.ch { color: #008080; } /* Char */
+code span.cn { } /* Constant */
+code span.co { color: #008000; } /* Comment */
+code span.cv { color: #008000; } /* CommentVar */
+code span.do { color: #008000; } /* Documentation */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.im { } /* Import */
+code span.in { color: #008000; } /* Information */
+code span.kw { color: #0000ff; } /* Keyword */
+code span.op { } /* Operator */
+code span.ot { color: #ff4000; } /* Other */
+code span.pp { color: #ff4000; } /* Preprocessor */
+code span.sc { color: #008080; } /* SpecialChar */
+code span.ss { color: #008080; } /* SpecialString */
+code span.st { color: #008080; } /* String */
+code span.va { } /* Variable */
+code span.vs { color: #008080; } /* VerbatimString */
+code span.wa { color: #008000; font-weight: bold; } /* Warning */
+ </style>
+ <!--[if lt IE 9]>
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+ <![endif]-->
+</head>
+<body>
+<div class="sourceCode" id="cb1"><pre class="sourceCode numberSource haskell numberLines"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">import</span> <span class="dt">Data.Array.Base</span>(unsafeAt)</a>
+<a class="sourceLine" id="cb1-2" title="2"><span class="kw">import</span> <span class="dt">Data.Bits</span>(shiftL,shiftR,(.&amp;.))</a>
+<a class="sourceLine" id="cb1-3" title="3"><span class="kw">import</span> <span class="dt">Foreign.Ptr</span> (plusPtr)</a>
+<a class="sourceLine" id="cb1-4" title="4"><span class="kw">import</span> <span class="dt">Foreign.Storable</span> (peek, poke)</a>
+<a class="sourceLine" id="cb1-5" title="5"><span class="kw">import</span> <span class="dt">Foreign.ForeignPtr</span> (withForeignPtr)</a>
+<a class="sourceLine" id="cb1-6" title="6"><span class="kw">import</span> <span class="dt">System.IO.Unsafe</span> (unsafePerformIO)</a>
+<a class="sourceLine" id="cb1-7" title="7"></a>
+<a class="sourceLine" id="cb1-8" title="8"><span class="co">-- |Perform base64 encoding of data from standard input</span></a>
+<a class="sourceLine" id="cb1-9" title="9"><span class="ot">main ::</span> <span class="dt">IO</span>()</a>
+<a class="sourceLine" id="cb1-10" title="10">main <span class="fu">=</span> BL.getContents<span class="fu">&gt;&gt;=</span>BL.putStr<span class="fu">.</span>BL.fromChunks<span class="fu">.map</span> encode64<span class="fu">.</span>reChunk<span class="fu">.</span>BL.toChunks</a>
+<a class="sourceLine" id="cb1-11" title="11"></a>
+<a class="sourceLine" id="cb1-12" title="12"><span class="co">-- |Base64 index table </span></a>
+<a class="sourceLine" id="cb1-13" title="13"><span class="ot">tab64 ::</span> <span class="dt">UArray</span> <span class="dt">Word32</span> <span class="dt">Word8</span></a>
+<a class="sourceLine" id="cb1-14" title="14">tab64 <span class="fu">=</span> array (<span class="dv">0</span>,<span class="dv">63</span>) <span class="fu">$</span> <span class="fu">zip</span> [<span class="dv">0</span><span class="fu">..</span>] <span class="fu">$</span> <span class="fu">map</span> (BI.c2w) <span class="fu">$</span> </a>
+<a class="sourceLine" id="cb1-15" title="15"> [<span class="ch">&#39;A&#39;</span><span class="fu">..</span><span class="ch">&#39;Z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;a&#39;</span><span class="fu">..</span><span class="ch">&#39;z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;0&#39;</span><span class="fu">..</span><span class="ch">&#39;9&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;+&#39;</span>,<span class="ch">&#39;/&#39;</span>]</a>
+<a class="sourceLine" id="cb1-16" title="16"></a>
+<a class="sourceLine" id="cb1-17" title="17"><span class="co">-- |Encodes 3 octets into 4 sextets</span></a>
+<a class="sourceLine" id="cb1-18" title="18"><span class="ot">enc64 ::</span> (<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)<span class="ot">-&gt;</span>(<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)</a>
+<a class="sourceLine" id="cb1-19" title="19">enc64 (b1,b2,b3) <span class="fu">=</span> (t <span class="dv">3</span>,t <span class="dv">2</span>,t <span class="dv">1</span>,t <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb1-20" title="20"> <span class="kw">where</span> t x <span class="fu">=</span> tab64 <span class="ot">`unsafeAt`</span> (n <span class="ot">`shiftR`</span> (x<span class="fu">*</span><span class="dv">6</span>) <span class="fu">.&amp;.</span> <span class="dv">63</span>)</a>
+<a class="sourceLine" id="cb1-21" title="21"> f b n <span class="fu">=</span> <span class="fu">fromIntegral</span> b <span class="ot">`shiftL`</span> n</a>
+<a class="sourceLine" id="cb1-22" title="22"> n <span class="fu">=</span> f b1 <span class="dv">16</span> <span class="fu">+</span> f b2 <span class="dv">8</span> <span class="fu">+</span> f b3 <span class="dv">0</span></a>
+<a class="sourceLine" id="cb1-23" title="23"></a>
+<a class="sourceLine" id="cb1-24" title="24"><span class="co">-- |Transforms list of ByteStrings to a new list of ByteStrings with </span></a>
+<a class="sourceLine" id="cb1-25" title="25"><span class="co">-- lengths guaranteed to be multiples of 3 (excepting the last one)</span></a>
+<a class="sourceLine" id="cb1-26" title="26"><span class="co">-- Assumes that all input ByteStrings (excepting the last one) have </span></a>
+<a class="sourceLine" id="cb1-27" title="27"><span class="co">-- at least a length of 3.</span></a>
+<a class="sourceLine" id="cb1-28" title="28"><span class="ot">reChunk ::</span> [<span class="dt">BS.ByteString</span>] <span class="ot">-&gt;</span> [<span class="dt">BS.ByteString</span>]</a>
+<a class="sourceLine" id="cb1-29" title="29">reChunk (y<span class="fu">:</span>[]) <span class="fu">=</span> [y]</a>
+<a class="sourceLine" id="cb1-30" title="30">reChunk (y<span class="fu">:</span>z<span class="fu">:</span>zs) <span class="fu">=</span> <span class="kw">let</span> c <span class="fu">=</span> BS.length y <span class="ot">`mod`</span> <span class="dv">3</span> </a>
+<a class="sourceLine" id="cb1-31" title="31"> <span class="kw">in</span> BS.append y (BS.take <span class="dv">3</span> z)<span class="fu">:</span>(reChunk <span class="fu">$</span> (BS.drop <span class="dv">3</span> z)<span class="fu">:</span>zs)</a></code></pre></div>
+</body>
+</html>
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_kate.html b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_kate.html
new file mode 100644
index 0000000..03aa0c6
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_kate.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+ <meta charset="utf-8" />
+ <meta name="generator" content="pandoc" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+ <title>index</title>
+ <style type="text/css">
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ </style>
+ <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+ { position: relative; left: -4em; }
+pre.numberSource a.sourceLine::before
+ { content: attr(title);
+ position: relative; left: -1em; text-align: right; vertical-align: baseline;
+ border: none; pointer-events: all; display: inline-block;
+ -webkit-touch-callout: none; -webkit-user-select: none;
+ -khtml-user-select: none; -moz-user-select: none;
+ -ms-user-select: none; user-select: none;
+ padding: 0 4px; width: 4em;
+ background-color: #ffffff;
+ color: #a0a0a0;
+ }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #a0a0a0; padding-left: 4px; }
+div.sourceCode
+ { color: #1f1c1b; background-color: #ffffff; }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span. { color: #1f1c1b; } /* Normal */
+code span.al { color: #bf0303; background-color: #f7e6e6; font-weight: bold; } /* Alert */
+code span.an { color: #ca60ca; } /* Annotation */
+code span.at { color: #0057ae; } /* Attribute */
+code span.bn { color: #b08000; } /* BaseN */
+code span.bu { color: #644a9b; font-weight: bold; } /* BuiltIn */
+code span.cf { color: #1f1c1b; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #924c9d; } /* Char */
+code span.cn { color: #aa5500; } /* Constant */
+code span.co { color: #898887; } /* Comment */
+code span.cv { color: #0095ff; } /* CommentVar */
+code span.do { color: #607880; } /* Documentation */
+code span.dt { color: #0057ae; } /* DataType */
+code span.dv { color: #b08000; } /* DecVal */
+code span.er { color: #bf0303; text-decoration: underline; } /* Error */
+code span.ex { color: #0095ff; font-weight: bold; } /* Extension */
+code span.fl { color: #b08000; } /* Float */
+code span.fu { color: #644a9b; } /* Function */
+code span.im { color: #ff5500; } /* Import */
+code span.in { color: #b08000; } /* Information */
+code span.kw { color: #1f1c1b; font-weight: bold; } /* Keyword */
+code span.op { color: #1f1c1b; } /* Operator */
+code span.ot { color: #006e28; } /* Other */
+code span.pp { color: #006e28; } /* Preprocessor */
+code span.re { color: #0057ae; background-color: #e0e9f8; } /* RegionMarker */
+code span.sc { color: #3daee9; } /* SpecialChar */
+code span.ss { color: #ff5500; } /* SpecialString */
+code span.st { color: #bf0303; } /* String */
+code span.va { color: #0057ae; } /* Variable */
+code span.vs { color: #bf0303; } /* VerbatimString */
+code span.wa { color: #bf0303; } /* Warning */
+ </style>
+ <!--[if lt IE 9]>
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+ <![endif]-->
+</head>
+<body>
+<div class="sourceCode" id="cb1"><pre class="sourceCode numberSource haskell numberLines"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">import</span> <span class="dt">Data.Array.Base</span>(unsafeAt)</a>
+<a class="sourceLine" id="cb1-2" title="2"><span class="kw">import</span> <span class="dt">Data.Bits</span>(shiftL,shiftR,(.&amp;.))</a>
+<a class="sourceLine" id="cb1-3" title="3"><span class="kw">import</span> <span class="dt">Foreign.Ptr</span> (plusPtr)</a>
+<a class="sourceLine" id="cb1-4" title="4"><span class="kw">import</span> <span class="dt">Foreign.Storable</span> (peek, poke)</a>
+<a class="sourceLine" id="cb1-5" title="5"><span class="kw">import</span> <span class="dt">Foreign.ForeignPtr</span> (withForeignPtr)</a>
+<a class="sourceLine" id="cb1-6" title="6"><span class="kw">import</span> <span class="dt">System.IO.Unsafe</span> (unsafePerformIO)</a>
+<a class="sourceLine" id="cb1-7" title="7"></a>
+<a class="sourceLine" id="cb1-8" title="8"><span class="co">-- |Perform base64 encoding of data from standard input</span></a>
+<a class="sourceLine" id="cb1-9" title="9"><span class="ot">main ::</span> <span class="dt">IO</span>()</a>
+<a class="sourceLine" id="cb1-10" title="10">main <span class="fu">=</span> BL.getContents<span class="fu">&gt;&gt;=</span>BL.putStr<span class="fu">.</span>BL.fromChunks<span class="fu">.map</span> encode64<span class="fu">.</span>reChunk<span class="fu">.</span>BL.toChunks</a>
+<a class="sourceLine" id="cb1-11" title="11"></a>
+<a class="sourceLine" id="cb1-12" title="12"><span class="co">-- |Base64 index table </span></a>
+<a class="sourceLine" id="cb1-13" title="13"><span class="ot">tab64 ::</span> <span class="dt">UArray</span> <span class="dt">Word32</span> <span class="dt">Word8</span></a>
+<a class="sourceLine" id="cb1-14" title="14">tab64 <span class="fu">=</span> array (<span class="dv">0</span>,<span class="dv">63</span>) <span class="fu">$</span> <span class="fu">zip</span> [<span class="dv">0</span><span class="fu">..</span>] <span class="fu">$</span> <span class="fu">map</span> (BI.c2w) <span class="fu">$</span> </a>
+<a class="sourceLine" id="cb1-15" title="15"> [<span class="ch">&#39;A&#39;</span><span class="fu">..</span><span class="ch">&#39;Z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;a&#39;</span><span class="fu">..</span><span class="ch">&#39;z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;0&#39;</span><span class="fu">..</span><span class="ch">&#39;9&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;+&#39;</span>,<span class="ch">&#39;/&#39;</span>]</a>
+<a class="sourceLine" id="cb1-16" title="16"></a>
+<a class="sourceLine" id="cb1-17" title="17"><span class="co">-- |Encodes 3 octets into 4 sextets</span></a>
+<a class="sourceLine" id="cb1-18" title="18"><span class="ot">enc64 ::</span> (<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)<span class="ot">-&gt;</span>(<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)</a>
+<a class="sourceLine" id="cb1-19" title="19">enc64 (b1,b2,b3) <span class="fu">=</span> (t <span class="dv">3</span>,t <span class="dv">2</span>,t <span class="dv">1</span>,t <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb1-20" title="20"> <span class="kw">where</span> t x <span class="fu">=</span> tab64 <span class="ot">`unsafeAt`</span> (n <span class="ot">`shiftR`</span> (x<span class="fu">*</span><span class="dv">6</span>) <span class="fu">.&amp;.</span> <span class="dv">63</span>)</a>
+<a class="sourceLine" id="cb1-21" title="21"> f b n <span class="fu">=</span> <span class="fu">fromIntegral</span> b <span class="ot">`shiftL`</span> n</a>
+<a class="sourceLine" id="cb1-22" title="22"> n <span class="fu">=</span> f b1 <span class="dv">16</span> <span class="fu">+</span> f b2 <span class="dv">8</span> <span class="fu">+</span> f b3 <span class="dv">0</span></a>
+<a class="sourceLine" id="cb1-23" title="23"></a>
+<a class="sourceLine" id="cb1-24" title="24"><span class="co">-- |Transforms list of ByteStrings to a new list of ByteStrings with </span></a>
+<a class="sourceLine" id="cb1-25" title="25"><span class="co">-- lengths guaranteed to be multiples of 3 (excepting the last one)</span></a>
+<a class="sourceLine" id="cb1-26" title="26"><span class="co">-- Assumes that all input ByteStrings (excepting the last one) have </span></a>
+<a class="sourceLine" id="cb1-27" title="27"><span class="co">-- at least a length of 3.</span></a>
+<a class="sourceLine" id="cb1-28" title="28"><span class="ot">reChunk ::</span> [<span class="dt">BS.ByteString</span>] <span class="ot">-&gt;</span> [<span class="dt">BS.ByteString</span>]</a>
+<a class="sourceLine" id="cb1-29" title="29">reChunk (y<span class="fu">:</span>[]) <span class="fu">=</span> [y]</a>
+<a class="sourceLine" id="cb1-30" title="30">reChunk (y<span class="fu">:</span>z<span class="fu">:</span>zs) <span class="fu">=</span> <span class="kw">let</span> c <span class="fu">=</span> BS.length y <span class="ot">`mod`</span> <span class="dv">3</span> </a>
+<a class="sourceLine" id="cb1-31" title="31"> <span class="kw">in</span> BS.append y (BS.take <span class="dv">3</span> z)<span class="fu">:</span>(reChunk <span class="fu">$</span> (BS.drop <span class="dv">3</span> z)<span class="fu">:</span>zs)</a></code></pre></div>
+</body>
+</html>
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_monochrome.html b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_monochrome.html
new file mode 100644
index 0000000..60c229d
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_monochrome.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+ <meta charset="utf-8" />
+ <meta name="generator" content="pandoc" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+ <title>index</title>
+ <style type="text/css">
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ </style>
+ <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+ { position: relative; left: -4em; }
+pre.numberSource a.sourceLine::before
+ { content: attr(title);
+ position: relative; left: -1em; text-align: right; vertical-align: baseline;
+ border: none; pointer-events: all; display: inline-block;
+ -webkit-touch-callout: none; -webkit-user-select: none;
+ -khtml-user-select: none; -moz-user-select: none;
+ -ms-user-select: none; user-select: none;
+ padding: 0 4px; width: 4em;
+ }
+pre.numberSource { margin-left: 3em; padding-left: 4px; }
+div.sourceCode
+ { }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { font-weight: bold; } /* Alert */
+code span.an { font-style: italic; } /* Annotation */
+code span.cf { font-weight: bold; } /* ControlFlow */
+code span.co { font-style: italic; } /* Comment */
+code span.cv { font-style: italic; } /* CommentVar */
+code span.do { font-style: italic; } /* Documentation */
+code span.dt { text-decoration: underline; } /* DataType */
+code span.er { font-weight: bold; } /* Error */
+code span.in { font-style: italic; } /* Information */
+code span.kw { font-weight: bold; } /* Keyword */
+code span.pp { font-weight: bold; } /* Preprocessor */
+code span.wa { font-style: italic; } /* Warning */
+ </style>
+ <!--[if lt IE 9]>
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+ <![endif]-->
+</head>
+<body>
+<div class="sourceCode" id="cb1"><pre class="sourceCode numberSource haskell numberLines"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">import</span> <span class="dt">Data.Array.Base</span>(unsafeAt)</a>
+<a class="sourceLine" id="cb1-2" title="2"><span class="kw">import</span> <span class="dt">Data.Bits</span>(shiftL,shiftR,(.&amp;.))</a>
+<a class="sourceLine" id="cb1-3" title="3"><span class="kw">import</span> <span class="dt">Foreign.Ptr</span> (plusPtr)</a>
+<a class="sourceLine" id="cb1-4" title="4"><span class="kw">import</span> <span class="dt">Foreign.Storable</span> (peek, poke)</a>
+<a class="sourceLine" id="cb1-5" title="5"><span class="kw">import</span> <span class="dt">Foreign.ForeignPtr</span> (withForeignPtr)</a>
+<a class="sourceLine" id="cb1-6" title="6"><span class="kw">import</span> <span class="dt">System.IO.Unsafe</span> (unsafePerformIO)</a>
+<a class="sourceLine" id="cb1-7" title="7"></a>
+<a class="sourceLine" id="cb1-8" title="8"><span class="co">-- |Perform base64 encoding of data from standard input</span></a>
+<a class="sourceLine" id="cb1-9" title="9"><span class="ot">main ::</span> <span class="dt">IO</span>()</a>
+<a class="sourceLine" id="cb1-10" title="10">main <span class="fu">=</span> BL.getContents<span class="fu">&gt;&gt;=</span>BL.putStr<span class="fu">.</span>BL.fromChunks<span class="fu">.map</span> encode64<span class="fu">.</span>reChunk<span class="fu">.</span>BL.toChunks</a>
+<a class="sourceLine" id="cb1-11" title="11"></a>
+<a class="sourceLine" id="cb1-12" title="12"><span class="co">-- |Base64 index table </span></a>
+<a class="sourceLine" id="cb1-13" title="13"><span class="ot">tab64 ::</span> <span class="dt">UArray</span> <span class="dt">Word32</span> <span class="dt">Word8</span></a>
+<a class="sourceLine" id="cb1-14" title="14">tab64 <span class="fu">=</span> array (<span class="dv">0</span>,<span class="dv">63</span>) <span class="fu">$</span> <span class="fu">zip</span> [<span class="dv">0</span><span class="fu">..</span>] <span class="fu">$</span> <span class="fu">map</span> (BI.c2w) <span class="fu">$</span> </a>
+<a class="sourceLine" id="cb1-15" title="15"> [<span class="ch">&#39;A&#39;</span><span class="fu">..</span><span class="ch">&#39;Z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;a&#39;</span><span class="fu">..</span><span class="ch">&#39;z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;0&#39;</span><span class="fu">..</span><span class="ch">&#39;9&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;+&#39;</span>,<span class="ch">&#39;/&#39;</span>]</a>
+<a class="sourceLine" id="cb1-16" title="16"></a>
+<a class="sourceLine" id="cb1-17" title="17"><span class="co">-- |Encodes 3 octets into 4 sextets</span></a>
+<a class="sourceLine" id="cb1-18" title="18"><span class="ot">enc64 ::</span> (<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)<span class="ot">-&gt;</span>(<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)</a>
+<a class="sourceLine" id="cb1-19" title="19">enc64 (b1,b2,b3) <span class="fu">=</span> (t <span class="dv">3</span>,t <span class="dv">2</span>,t <span class="dv">1</span>,t <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb1-20" title="20"> <span class="kw">where</span> t x <span class="fu">=</span> tab64 <span class="ot">`unsafeAt`</span> (n <span class="ot">`shiftR`</span> (x<span class="fu">*</span><span class="dv">6</span>) <span class="fu">.&amp;.</span> <span class="dv">63</span>)</a>
+<a class="sourceLine" id="cb1-21" title="21"> f b n <span class="fu">=</span> <span class="fu">fromIntegral</span> b <span class="ot">`shiftL`</span> n</a>
+<a class="sourceLine" id="cb1-22" title="22"> n <span class="fu">=</span> f b1 <span class="dv">16</span> <span class="fu">+</span> f b2 <span class="dv">8</span> <span class="fu">+</span> f b3 <span class="dv">0</span></a>
+<a class="sourceLine" id="cb1-23" title="23"></a>
+<a class="sourceLine" id="cb1-24" title="24"><span class="co">-- |Transforms list of ByteStrings to a new list of ByteStrings with </span></a>
+<a class="sourceLine" id="cb1-25" title="25"><span class="co">-- lengths guaranteed to be multiples of 3 (excepting the last one)</span></a>
+<a class="sourceLine" id="cb1-26" title="26"><span class="co">-- Assumes that all input ByteStrings (excepting the last one) have </span></a>
+<a class="sourceLine" id="cb1-27" title="27"><span class="co">-- at least a length of 3.</span></a>
+<a class="sourceLine" id="cb1-28" title="28"><span class="ot">reChunk ::</span> [<span class="dt">BS.ByteString</span>] <span class="ot">-&gt;</span> [<span class="dt">BS.ByteString</span>]</a>
+<a class="sourceLine" id="cb1-29" title="29">reChunk (y<span class="fu">:</span>[]) <span class="fu">=</span> [y]</a>
+<a class="sourceLine" id="cb1-30" title="30">reChunk (y<span class="fu">:</span>z<span class="fu">:</span>zs) <span class="fu">=</span> <span class="kw">let</span> c <span class="fu">=</span> BS.length y <span class="ot">`mod`</span> <span class="dv">3</span> </a>
+<a class="sourceLine" id="cb1-31" title="31"> <span class="kw">in</span> BS.append y (BS.take <span class="dv">3</span> z)<span class="fu">:</span>(reChunk <span class="fu">$</span> (BS.drop <span class="dv">3</span> z)<span class="fu">:</span>zs)</a></code></pre></div>
+</body>
+</html>
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_pygments.html b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_pygments.html
new file mode 100644
index 0000000..e637f29
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_pygments.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+ <meta charset="utf-8" />
+ <meta name="generator" content="pandoc" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+ <title>index</title>
+ <style type="text/css">
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ </style>
+ <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+ { position: relative; left: -4em; }
+pre.numberSource a.sourceLine::before
+ { content: attr(title);
+ position: relative; left: -1em; text-align: right; vertical-align: baseline;
+ border: none; pointer-events: all; display: inline-block;
+ -webkit-touch-callout: none; -webkit-user-select: none;
+ -khtml-user-select: none; -moz-user-select: none;
+ -ms-user-select: none; user-select: none;
+ padding: 0 4px; width: 4em;
+ color: #aaaaaa;
+ }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
+div.sourceCode
+ { }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+ </style>
+ <!--[if lt IE 9]>
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+ <![endif]-->
+</head>
+<body>
+<div class="sourceCode" id="cb1"><pre class="sourceCode numberSource haskell numberLines"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">import</span> <span class="dt">Data.Array.Base</span>(unsafeAt)</a>
+<a class="sourceLine" id="cb1-2" title="2"><span class="kw">import</span> <span class="dt">Data.Bits</span>(shiftL,shiftR,(.&amp;.))</a>
+<a class="sourceLine" id="cb1-3" title="3"><span class="kw">import</span> <span class="dt">Foreign.Ptr</span> (plusPtr)</a>
+<a class="sourceLine" id="cb1-4" title="4"><span class="kw">import</span> <span class="dt">Foreign.Storable</span> (peek, poke)</a>
+<a class="sourceLine" id="cb1-5" title="5"><span class="kw">import</span> <span class="dt">Foreign.ForeignPtr</span> (withForeignPtr)</a>
+<a class="sourceLine" id="cb1-6" title="6"><span class="kw">import</span> <span class="dt">System.IO.Unsafe</span> (unsafePerformIO)</a>
+<a class="sourceLine" id="cb1-7" title="7"></a>
+<a class="sourceLine" id="cb1-8" title="8"><span class="co">-- |Perform base64 encoding of data from standard input</span></a>
+<a class="sourceLine" id="cb1-9" title="9"><span class="ot">main ::</span> <span class="dt">IO</span>()</a>
+<a class="sourceLine" id="cb1-10" title="10">main <span class="fu">=</span> BL.getContents<span class="fu">&gt;&gt;=</span>BL.putStr<span class="fu">.</span>BL.fromChunks<span class="fu">.map</span> encode64<span class="fu">.</span>reChunk<span class="fu">.</span>BL.toChunks</a>
+<a class="sourceLine" id="cb1-11" title="11"></a>
+<a class="sourceLine" id="cb1-12" title="12"><span class="co">-- |Base64 index table </span></a>
+<a class="sourceLine" id="cb1-13" title="13"><span class="ot">tab64 ::</span> <span class="dt">UArray</span> <span class="dt">Word32</span> <span class="dt">Word8</span></a>
+<a class="sourceLine" id="cb1-14" title="14">tab64 <span class="fu">=</span> array (<span class="dv">0</span>,<span class="dv">63</span>) <span class="fu">$</span> <span class="fu">zip</span> [<span class="dv">0</span><span class="fu">..</span>] <span class="fu">$</span> <span class="fu">map</span> (BI.c2w) <span class="fu">$</span> </a>
+<a class="sourceLine" id="cb1-15" title="15"> [<span class="ch">&#39;A&#39;</span><span class="fu">..</span><span class="ch">&#39;Z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;a&#39;</span><span class="fu">..</span><span class="ch">&#39;z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;0&#39;</span><span class="fu">..</span><span class="ch">&#39;9&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;+&#39;</span>,<span class="ch">&#39;/&#39;</span>]</a>
+<a class="sourceLine" id="cb1-16" title="16"></a>
+<a class="sourceLine" id="cb1-17" title="17"><span class="co">-- |Encodes 3 octets into 4 sextets</span></a>
+<a class="sourceLine" id="cb1-18" title="18"><span class="ot">enc64 ::</span> (<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)<span class="ot">-&gt;</span>(<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)</a>
+<a class="sourceLine" id="cb1-19" title="19">enc64 (b1,b2,b3) <span class="fu">=</span> (t <span class="dv">3</span>,t <span class="dv">2</span>,t <span class="dv">1</span>,t <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb1-20" title="20"> <span class="kw">where</span> t x <span class="fu">=</span> tab64 <span class="ot">`unsafeAt`</span> (n <span class="ot">`shiftR`</span> (x<span class="fu">*</span><span class="dv">6</span>) <span class="fu">.&amp;.</span> <span class="dv">63</span>)</a>
+<a class="sourceLine" id="cb1-21" title="21"> f b n <span class="fu">=</span> <span class="fu">fromIntegral</span> b <span class="ot">`shiftL`</span> n</a>
+<a class="sourceLine" id="cb1-22" title="22"> n <span class="fu">=</span> f b1 <span class="dv">16</span> <span class="fu">+</span> f b2 <span class="dv">8</span> <span class="fu">+</span> f b3 <span class="dv">0</span></a>
+<a class="sourceLine" id="cb1-23" title="23"></a>
+<a class="sourceLine" id="cb1-24" title="24"><span class="co">-- |Transforms list of ByteStrings to a new list of ByteStrings with </span></a>
+<a class="sourceLine" id="cb1-25" title="25"><span class="co">-- lengths guaranteed to be multiples of 3 (excepting the last one)</span></a>
+<a class="sourceLine" id="cb1-26" title="26"><span class="co">-- Assumes that all input ByteStrings (excepting the last one) have </span></a>
+<a class="sourceLine" id="cb1-27" title="27"><span class="co">-- at least a length of 3.</span></a>
+<a class="sourceLine" id="cb1-28" title="28"><span class="ot">reChunk ::</span> [<span class="dt">BS.ByteString</span>] <span class="ot">-&gt;</span> [<span class="dt">BS.ByteString</span>]</a>
+<a class="sourceLine" id="cb1-29" title="29">reChunk (y<span class="fu">:</span>[]) <span class="fu">=</span> [y]</a>
+<a class="sourceLine" id="cb1-30" title="30">reChunk (y<span class="fu">:</span>z<span class="fu">:</span>zs) <span class="fu">=</span> <span class="kw">let</span> c <span class="fu">=</span> BS.length y <span class="ot">`mod`</span> <span class="dv">3</span> </a>
+<a class="sourceLine" id="cb1-31" title="31"> <span class="kw">in</span> BS.append y (BS.take <span class="dv">3</span> z)<span class="fu">:</span>(reChunk <span class="fu">$</span> (BS.drop <span class="dv">3</span> z)<span class="fu">:</span>zs)</a></code></pre></div>
+</body>
+</html>
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_tango.html b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_tango.html
new file mode 100644
index 0000000..f76564b
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_tango.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+ <meta charset="utf-8" />
+ <meta name="generator" content="pandoc" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+ <title>index</title>
+ <style type="text/css">
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ </style>
+ <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+ { position: relative; left: -4em; }
+pre.numberSource a.sourceLine::before
+ { content: attr(title);
+ position: relative; left: -1em; text-align: right; vertical-align: baseline;
+ border: none; pointer-events: all; display: inline-block;
+ -webkit-touch-callout: none; -webkit-user-select: none;
+ -khtml-user-select: none; -moz-user-select: none;
+ -ms-user-select: none; user-select: none;
+ padding: 0 4px; width: 4em;
+ color: #aaaaaa;
+ }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
+div.sourceCode
+ { background-color: #f8f8f8; }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ef2929; } /* Alert */
+code span.an { color: #8f5902; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #c4a000; } /* Attribute */
+code span.bn { color: #0000cf; } /* BaseN */
+code span.cf { color: #204a87; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4e9a06; } /* Char */
+code span.cn { color: #000000; } /* Constant */
+code span.co { color: #8f5902; font-style: italic; } /* Comment */
+code span.cv { color: #8f5902; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #8f5902; font-weight: bold; font-style: italic; } /* Documentation */
+code span.dt { color: #204a87; } /* DataType */
+code span.dv { color: #0000cf; } /* DecVal */
+code span.er { color: #a40000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #0000cf; } /* Float */
+code span.fu { color: #000000; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #8f5902; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #204a87; font-weight: bold; } /* Keyword */
+code span.op { color: #ce5c00; font-weight: bold; } /* Operator */
+code span.ot { color: #8f5902; } /* Other */
+code span.pp { color: #8f5902; font-style: italic; } /* Preprocessor */
+code span.sc { color: #000000; } /* SpecialChar */
+code span.ss { color: #4e9a06; } /* SpecialString */
+code span.st { color: #4e9a06; } /* String */
+code span.va { color: #000000; } /* Variable */
+code span.vs { color: #4e9a06; } /* VerbatimString */
+code span.wa { color: #8f5902; font-weight: bold; font-style: italic; } /* Warning */
+ </style>
+ <!--[if lt IE 9]>
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+ <![endif]-->
+</head>
+<body>
+<div class="sourceCode" id="cb1"><pre class="sourceCode numberSource haskell numberLines"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">import</span> <span class="dt">Data.Array.Base</span>(unsafeAt)</a>
+<a class="sourceLine" id="cb1-2" title="2"><span class="kw">import</span> <span class="dt">Data.Bits</span>(shiftL,shiftR,(.&amp;.))</a>
+<a class="sourceLine" id="cb1-3" title="3"><span class="kw">import</span> <span class="dt">Foreign.Ptr</span> (plusPtr)</a>
+<a class="sourceLine" id="cb1-4" title="4"><span class="kw">import</span> <span class="dt">Foreign.Storable</span> (peek, poke)</a>
+<a class="sourceLine" id="cb1-5" title="5"><span class="kw">import</span> <span class="dt">Foreign.ForeignPtr</span> (withForeignPtr)</a>
+<a class="sourceLine" id="cb1-6" title="6"><span class="kw">import</span> <span class="dt">System.IO.Unsafe</span> (unsafePerformIO)</a>
+<a class="sourceLine" id="cb1-7" title="7"></a>
+<a class="sourceLine" id="cb1-8" title="8"><span class="co">-- |Perform base64 encoding of data from standard input</span></a>
+<a class="sourceLine" id="cb1-9" title="9"><span class="ot">main ::</span> <span class="dt">IO</span>()</a>
+<a class="sourceLine" id="cb1-10" title="10">main <span class="fu">=</span> BL.getContents<span class="fu">&gt;&gt;=</span>BL.putStr<span class="fu">.</span>BL.fromChunks<span class="fu">.map</span> encode64<span class="fu">.</span>reChunk<span class="fu">.</span>BL.toChunks</a>
+<a class="sourceLine" id="cb1-11" title="11"></a>
+<a class="sourceLine" id="cb1-12" title="12"><span class="co">-- |Base64 index table </span></a>
+<a class="sourceLine" id="cb1-13" title="13"><span class="ot">tab64 ::</span> <span class="dt">UArray</span> <span class="dt">Word32</span> <span class="dt">Word8</span></a>
+<a class="sourceLine" id="cb1-14" title="14">tab64 <span class="fu">=</span> array (<span class="dv">0</span>,<span class="dv">63</span>) <span class="fu">$</span> <span class="fu">zip</span> [<span class="dv">0</span><span class="fu">..</span>] <span class="fu">$</span> <span class="fu">map</span> (BI.c2w) <span class="fu">$</span> </a>
+<a class="sourceLine" id="cb1-15" title="15"> [<span class="ch">&#39;A&#39;</span><span class="fu">..</span><span class="ch">&#39;Z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;a&#39;</span><span class="fu">..</span><span class="ch">&#39;z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;0&#39;</span><span class="fu">..</span><span class="ch">&#39;9&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;+&#39;</span>,<span class="ch">&#39;/&#39;</span>]</a>
+<a class="sourceLine" id="cb1-16" title="16"></a>
+<a class="sourceLine" id="cb1-17" title="17"><span class="co">-- |Encodes 3 octets into 4 sextets</span></a>
+<a class="sourceLine" id="cb1-18" title="18"><span class="ot">enc64 ::</span> (<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)<span class="ot">-&gt;</span>(<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)</a>
+<a class="sourceLine" id="cb1-19" title="19">enc64 (b1,b2,b3) <span class="fu">=</span> (t <span class="dv">3</span>,t <span class="dv">2</span>,t <span class="dv">1</span>,t <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb1-20" title="20"> <span class="kw">where</span> t x <span class="fu">=</span> tab64 <span class="ot">`unsafeAt`</span> (n <span class="ot">`shiftR`</span> (x<span class="fu">*</span><span class="dv">6</span>) <span class="fu">.&amp;.</span> <span class="dv">63</span>)</a>
+<a class="sourceLine" id="cb1-21" title="21"> f b n <span class="fu">=</span> <span class="fu">fromIntegral</span> b <span class="ot">`shiftL`</span> n</a>
+<a class="sourceLine" id="cb1-22" title="22"> n <span class="fu">=</span> f b1 <span class="dv">16</span> <span class="fu">+</span> f b2 <span class="dv">8</span> <span class="fu">+</span> f b3 <span class="dv">0</span></a>
+<a class="sourceLine" id="cb1-23" title="23"></a>
+<a class="sourceLine" id="cb1-24" title="24"><span class="co">-- |Transforms list of ByteStrings to a new list of ByteStrings with </span></a>
+<a class="sourceLine" id="cb1-25" title="25"><span class="co">-- lengths guaranteed to be multiples of 3 (excepting the last one)</span></a>
+<a class="sourceLine" id="cb1-26" title="26"><span class="co">-- Assumes that all input ByteStrings (excepting the last one) have </span></a>
+<a class="sourceLine" id="cb1-27" title="27"><span class="co">-- at least a length of 3.</span></a>
+<a class="sourceLine" id="cb1-28" title="28"><span class="ot">reChunk ::</span> [<span class="dt">BS.ByteString</span>] <span class="ot">-&gt;</span> [<span class="dt">BS.ByteString</span>]</a>
+<a class="sourceLine" id="cb1-29" title="29">reChunk (y<span class="fu">:</span>[]) <span class="fu">=</span> [y]</a>
+<a class="sourceLine" id="cb1-30" title="30">reChunk (y<span class="fu">:</span>z<span class="fu">:</span>zs) <span class="fu">=</span> <span class="kw">let</span> c <span class="fu">=</span> BS.length y <span class="ot">`mod`</span> <span class="dv">3</span> </a>
+<a class="sourceLine" id="cb1-31" title="31"> <span class="kw">in</span> BS.append y (BS.take <span class="dv">3</span> z)<span class="fu">:</span>(reChunk <span class="fu">$</span> (BS.drop <span class="dv">3</span> z)<span class="fu">:</span>zs)</a></code></pre></div>
+</body>
+</html>
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_zenburn.html b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_zenburn.html
new file mode 100644
index 0000000..f186f69
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/00_pandoc_colors/index_zenburn.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+<head>
+ <meta charset="utf-8" />
+ <meta name="generator" content="pandoc" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+ <title>index</title>
+ <style type="text/css">
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ </style>
+ <style type="text/css">
+a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+ { position: relative; left: -4em; }
+pre.numberSource a.sourceLine::before
+ { content: attr(title);
+ position: relative; left: -1em; text-align: right; vertical-align: baseline;
+ border: none; pointer-events: all; display: inline-block;
+ -webkit-touch-callout: none; -webkit-user-select: none;
+ -khtml-user-select: none; -moz-user-select: none;
+ -ms-user-select: none; user-select: none;
+ padding: 0 4px; width: 4em;
+ }
+pre.numberSource { margin-left: 3em; padding-left: 4px; }
+div.sourceCode
+ { color: #cccccc; background-color: #303030; }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ffcfaf; } /* Alert */
+code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
+code span.at { } /* Attribute */
+code span.bn { color: #dca3a3; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #f0dfaf; } /* ControlFlow */
+code span.ch { color: #dca3a3; } /* Char */
+code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
+code span.co { color: #7f9f7f; } /* Comment */
+code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
+code span.do { color: #7f9f7f; } /* Documentation */
+code span.dt { color: #dfdfbf; } /* DataType */
+code span.dv { color: #dcdccc; } /* DecVal */
+code span.er { color: #c3bf9f; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #c0bed1; } /* Float */
+code span.fu { color: #efef8f; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
+code span.kw { color: #f0dfaf; } /* Keyword */
+code span.op { color: #f0efd0; } /* Operator */
+code span.ot { color: #efef8f; } /* Other */
+code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
+code span.sc { color: #dca3a3; } /* SpecialChar */
+code span.ss { color: #cc9393; } /* SpecialString */
+code span.st { color: #cc9393; } /* String */
+code span.va { } /* Variable */
+code span.vs { color: #cc9393; } /* VerbatimString */
+code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
+ </style>
+ <!--[if lt IE 9]>
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
+ <![endif]-->
+</head>
+<body>
+<div class="sourceCode" id="cb1"><pre class="sourceCode numberSource haskell numberLines"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" title="1"><span class="kw">import</span> <span class="dt">Data.Array.Base</span>(unsafeAt)</a>
+<a class="sourceLine" id="cb1-2" title="2"><span class="kw">import</span> <span class="dt">Data.Bits</span>(shiftL,shiftR,(.&amp;.))</a>
+<a class="sourceLine" id="cb1-3" title="3"><span class="kw">import</span> <span class="dt">Foreign.Ptr</span> (plusPtr)</a>
+<a class="sourceLine" id="cb1-4" title="4"><span class="kw">import</span> <span class="dt">Foreign.Storable</span> (peek, poke)</a>
+<a class="sourceLine" id="cb1-5" title="5"><span class="kw">import</span> <span class="dt">Foreign.ForeignPtr</span> (withForeignPtr)</a>
+<a class="sourceLine" id="cb1-6" title="6"><span class="kw">import</span> <span class="dt">System.IO.Unsafe</span> (unsafePerformIO)</a>
+<a class="sourceLine" id="cb1-7" title="7"></a>
+<a class="sourceLine" id="cb1-8" title="8"><span class="co">-- |Perform base64 encoding of data from standard input</span></a>
+<a class="sourceLine" id="cb1-9" title="9"><span class="ot">main ::</span> <span class="dt">IO</span>()</a>
+<a class="sourceLine" id="cb1-10" title="10">main <span class="fu">=</span> BL.getContents<span class="fu">&gt;&gt;=</span>BL.putStr<span class="fu">.</span>BL.fromChunks<span class="fu">.map</span> encode64<span class="fu">.</span>reChunk<span class="fu">.</span>BL.toChunks</a>
+<a class="sourceLine" id="cb1-11" title="11"></a>
+<a class="sourceLine" id="cb1-12" title="12"><span class="co">-- |Base64 index table </span></a>
+<a class="sourceLine" id="cb1-13" title="13"><span class="ot">tab64 ::</span> <span class="dt">UArray</span> <span class="dt">Word32</span> <span class="dt">Word8</span></a>
+<a class="sourceLine" id="cb1-14" title="14">tab64 <span class="fu">=</span> array (<span class="dv">0</span>,<span class="dv">63</span>) <span class="fu">$</span> <span class="fu">zip</span> [<span class="dv">0</span><span class="fu">..</span>] <span class="fu">$</span> <span class="fu">map</span> (BI.c2w) <span class="fu">$</span> </a>
+<a class="sourceLine" id="cb1-15" title="15"> [<span class="ch">&#39;A&#39;</span><span class="fu">..</span><span class="ch">&#39;Z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;a&#39;</span><span class="fu">..</span><span class="ch">&#39;z&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;0&#39;</span><span class="fu">..</span><span class="ch">&#39;9&#39;</span>]<span class="fu">++</span>[<span class="ch">&#39;+&#39;</span>,<span class="ch">&#39;/&#39;</span>]</a>
+<a class="sourceLine" id="cb1-16" title="16"></a>
+<a class="sourceLine" id="cb1-17" title="17"><span class="co">-- |Encodes 3 octets into 4 sextets</span></a>
+<a class="sourceLine" id="cb1-18" title="18"><span class="ot">enc64 ::</span> (<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)<span class="ot">-&gt;</span>(<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>,<span class="dt">Word8</span>)</a>
+<a class="sourceLine" id="cb1-19" title="19">enc64 (b1,b2,b3) <span class="fu">=</span> (t <span class="dv">3</span>,t <span class="dv">2</span>,t <span class="dv">1</span>,t <span class="dv">0</span>)</a>
+<a class="sourceLine" id="cb1-20" title="20"> <span class="kw">where</span> t x <span class="fu">=</span> tab64 <span class="ot">`unsafeAt`</span> (n <span class="ot">`shiftR`</span> (x<span class="fu">*</span><span class="dv">6</span>) <span class="fu">.&amp;.</span> <span class="dv">63</span>)</a>
+<a class="sourceLine" id="cb1-21" title="21"> f b n <span class="fu">=</span> <span class="fu">fromIntegral</span> b <span class="ot">`shiftL`</span> n</a>
+<a class="sourceLine" id="cb1-22" title="22"> n <span class="fu">=</span> f b1 <span class="dv">16</span> <span class="fu">+</span> f b2 <span class="dv">8</span> <span class="fu">+</span> f b3 <span class="dv">0</span></a>
+<a class="sourceLine" id="cb1-23" title="23"></a>
+<a class="sourceLine" id="cb1-24" title="24"><span class="co">-- |Transforms list of ByteStrings to a new list of ByteStrings with </span></a>
+<a class="sourceLine" id="cb1-25" title="25"><span class="co">-- lengths guaranteed to be multiples of 3 (excepting the last one)</span></a>
+<a class="sourceLine" id="cb1-26" title="26"><span class="co">-- Assumes that all input ByteStrings (excepting the last one) have </span></a>
+<a class="sourceLine" id="cb1-27" title="27"><span class="co">-- at least a length of 3.</span></a>
+<a class="sourceLine" id="cb1-28" title="28"><span class="ot">reChunk ::</span> [<span class="dt">BS.ByteString</span>] <span class="ot">-&gt;</span> [<span class="dt">BS.ByteString</span>]</a>
+<a class="sourceLine" id="cb1-29" title="29">reChunk (y<span class="fu">:</span>[]) <span class="fu">=</span> [y]</a>
+<a class="sourceLine" id="cb1-30" title="30">reChunk (y<span class="fu">:</span>z<span class="fu">:</span>zs) <span class="fu">=</span> <span class="kw">let</span> c <span class="fu">=</span> BS.length y <span class="ot">`mod`</span> <span class="dv">3</span> </a>
+<a class="sourceLine" id="cb1-31" title="31"> <span class="kw">in</span> BS.append y (BS.take <span class="dv">3</span> z)<span class="fu">:</span>(reChunk <span class="fu">$</span> (BS.drop <span class="dv">3</span> z)<span class="fu">:</span>zs)</a></code></pre></div>
+</body>
+</html>
diff --git a/00_blog/00040_Haskell/00200_Estatico-Page-Maker/index.md b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/index.md
new file mode 100644
index 0000000..a66c99c
--- /dev/null
+++ b/00_blog/00040_Haskell/00200_Estatico-Page-Maker/index.md
@@ -0,0 +1,63 @@
+ April 2018
+# estático - static website generator
+
+A few weeks ago I decided to switch my website from a well known PHP
+driven CMS solution, to a light and static set of HTML pages.
+
+And so I wrote ... a simple static website generator in **Haskell**.
+Of course I know that there are plenty of these out there, still I wanted
+my very own masturbatory solution.
+
+I use **pandoc** et al. for most of the work anyway.
+
+## Features
+
+* **No** Database
+* Generate HTML from **Markdown** with **pandoc**
+* **Highlight** source-code with **pandoc**
+* Embed data **fetched** from the web with **http-conduit**
+* Embed **screen-casts** with **asciinema**
+* Embed Latex formulas with **MathJx**
+* Scale Images with **ImageMagick**
+* Generate MP4 from OGG **Videos** with **ffmpeg**
+
+## Try It
+You can find the most recent version following the links below.
+Build it with _stack_ or use the docker images.
+
+* <https://gitweb.softwarefools.com/?p=miguel/estatico.git>
+* <https://github.com/miguelclean/estatico>
+* <https://hub.docker.com/r/migueldirty/estatico/builds>
+
+## Pandoc Themes
+
+Here I put together the themes available for syntax-highlighting, extracted
+from **pandoc**: [./pandoc\_colors](./pandoc_colors)
+
+## Example Website
+
+This very website <https://www.idziorek.net> is a real-world example making
+use of estático. You can find it's sources here:
+
+* <https://gitweb.softwarefools.com/?p=miguel/idziorek_net.git>
+
+## Example Usage (Docker)
+
+__NOTE: make sure DIR\_OUT exists and is a free directory__
+
+You can use the example websites inside the examples/ directory for a start.
+
+Inside the input directory (e.g. ./examples/example01/) run something along this lines:
+
+ DIR_IN=`pwd`
+ DIR_OUT=/mnt/yourwebsiteroot
+ HTML_ROOT=https://www.example.com
+ SUDO=sudo
+ IMAGE=migueldirty/estatico
+ ${SUDO} docker run --rm -v${DIR_IN}:/in:ro -v${DIR_OUT}:/out:rw ${IMAGE} /in /out ${HTML_ROOT}
+
+Or if you want to test it locally use some local DIR\_OUT and HTML\_ROOT instead:
+
+ DIR_OUT=/home/miguel/testpage
+ HTML_ROOT=/home/miguel/testpage
+
diff --git a/00_blog/00040_Haskell/00_00150_Applicative-vs-Monadic-Parsing/index.md b/00_blog/00040_Haskell/00_00150_Applicative-vs-Monadic-Parsing/index.md
new file mode 100644
index 0000000..f9b3a4e
--- /dev/null
+++ b/00_blog/00040_Haskell/00_00150_Applicative-vs-Monadic-Parsing/index.md
@@ -0,0 +1 @@
+Coming sooner... or later.
diff --git a/00_blog/00040_Haskell/index.md b/00_blog/00040_Haskell/index.md
new file mode 100644
index 0000000..2c02a65
--- /dev/null
+++ b/00_blog/00040_Haskell/index.md
@@ -0,0 +1,8 @@
+Haskell
+=======
+
+Originally coming from structured and object-oriented programming, I fell
+in love with Haskell a couple of years ago. I appreciate it's purity
+and laziness and the powerful, static type system.
+
+You can find here my notes and tiny toy projects related to Haskell.
diff --git a/00_blog/00040_Hex-Converter/hexman.html b/00_blog/00040_Hex-Converter/hexman.html
new file mode 100644
index 0000000..86af3ef
--- /dev/null
+++ b/00_blog/00040_Hex-Converter/hexman.html
@@ -0,0 +1,170 @@
+<body>
+ <head>
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous">
+ <script>
+ var radix_str="26";
+
+ var str_map = {};
+ str_map[777] = "Jackpot! You are Lucky Today!";
+ str_map[13] = "Bad Bad Bad";
+ str_map[666] = "The Number of the Beast.";
+
+ function toggle_bin() {
+ var x = document.getElementById("details_bin");
+ if (x.style.display === "none") {
+ x.style.display = "flex";
+ } else {
+ x.style.display = "none";
+ }
+}
+
+ function convert(val,rad)
+ {
+ if(val=="")return;
+
+ /* guard radix */
+ var oldradix=radix_str;
+
+ radix_str=document.getElementById("custom_radix").value;
+ var radix=parseInt(radix_str,10);
+
+ if(!radix || radix <2 || radix > 36)radix_str=oldradix
+ document.getElementById("custom_radix").value=radix_str;
+ var radix=parseInt(radix_str,10);
+ //
+
+ var i=parseInt(val,rad);
+ if(i)
+ {
+ document.getElementById("custom").value = i.toString(radix);
+ document.getElementById("dec").value = i.toString(10);
+ document.getElementById("oct").value = i.toString(8);
+ document.getElementById("bin").value = i.toString(2);
+ document.getElementById("hex").value = i.toString(16);
+
+
+ var bytes="<p>";
+
+ for(var j=0;j<32;j++)
+ {
+ bytes+="byte "+j.toString(10)+" : "+(((i&(2**j))>0)?"1":"_")+"<br />";
+ }
+ bytes+="</p>";
+ document.getElementById("bytes").innerHTML=bytes;
+ }
+
+ var info=str_map[i];
+
+ if(info)
+ {
+ document.getElementById("info").innerHTML = i.toString(10) + " - " + info; //"Page location is " + window.location.href;
+ }
+ else
+ {
+ document.getElementById("info").innerHTML = "";
+ }
+
+ }
+ </script>
+ <style>
+ </style>
+ </head>
+ <html>
+
+ <div class="container">
+
+ <div class="row">
+ <div class="col-4"></div>
+ <div class="col-4">
+ <h1 class="text-primary">Miguel's Converter</h1>
+ <p>Convert numbers between different bases. Supports decimal, octal, binary and hex. You can use a custom base as well.</p>
+ </div>
+ <div class="col-4"></div>
+ </div>
+
+ <div class="row">
+ <div class="col-4"></div>
+ <div class="col-4">
+ <input id='dec' class="w-100 mb-3" type=text placeholder="decimal" name="dec" onkeyup="convert(this.value,10)" />
+ </div>
+ <div class="col-1">
+ 10
+ </div>
+ <div class="col-3"></div>
+ </div>
+
+ <div class="row">
+ <div class="col-4"></div>
+ <div class="col-4">
+ <input id='oct' class="w-100 mb-3" type=text placeholder="octal" name="oct" onkeyup="convert(this.value,8)" />
+ </div>
+ <div class="col-1">
+ 8
+ </div>
+ <div class="col-3"></div>
+ </div>
+
+ <div class="row">
+ <div class="col-4"></div>
+ <div class="col-4">
+ <input id='bin' class="w-100 mb-3" type=text placeholder="binary" name="binary" onkeyup="convert(this.value,2)" />
+ </div>
+ <div class="col-1">
+ 2
+ </div>
+ <div class="col-1">
+ <button onclick="toggle_bin()">
+ toggle
+ </button>
+ </div>
+ <div class="col-2"></div>
+ </div>
+
+ <div id="details_bin" class="row" style="display:none">
+ <div class="col-4"></div>
+ <div class="col-4" id='bytes'>
+ Need value first.
+ </div>
+ <div class="col-4"></div>
+ </div>
+
+ <div class="row">
+ <div class="col-4"></div>
+ <div class="col-4">
+ <input id='hex' class="w-100 mb-3" type=text placeholder="hex" name="hex" onkeyup="convert(this.value,16)" />
+ </div>
+ <div class="col-1">
+ 16
+ </div>
+ <div class="col-3"></div>
+ </div>
+
+ <div class="row">
+ <div class="col-4"></div>
+ <div class="col-4">
+ <input id='custom' class="w-100 mb-3" type=text placeholder="custom" onkeyup="convert(this.value,document.getElementById('custom_radix').value)" />
+ </div>
+ <div class="col-1">
+ <input id='custom_radix' class="w-100 mb-3" type=text placeholder="radix" onkeyup="convert(document.getElementById('custom').value,this.value)" value="26" />
+ </div>
+ <div class="col-3"></div>
+ </div>
+ <div class="row">
+ <div class="col-4"></div>
+ <div class="col-4" id="info">
+ </div>
+ <div class="col-4"></div>
+ </div>
+ <div class="row">
+ <div class="col-4"></div>
+ <div class="col-4">
+ <p>Hacked together by <a href=https://www.idziorek.net>miguel</a></p>
+ <p>powered by JavaScript and Bootstrap.</p>
+ </div>
+ <div class="col-4"></div>
+ </div>
+
+
+
+ </html>
+</body>
diff --git a/00_blog/00040_Hex-Converter/index.md b/00_blog/00040_Hex-Converter/index.md
new file mode 100644
index 0000000..1f837db
--- /dev/null
+++ b/00_blog/00040_Hex-Converter/index.md
@@ -0,0 +1,5 @@
+# Hex Converter
+
+My little online converter between different bases:
+[link](hexman.html)
+
diff --git a/00_blog/00100_Webkit-Keyboardless-Navigation/index.md b/00_blog/00100_Webkit-Keyboardless-Navigation/index.md
new file mode 100644
index 0000000..224c9bb
--- /dev/null
+++ b/00_blog/00100_Webkit-Keyboardless-Navigation/index.md
@@ -0,0 +1,29 @@
+ April 2018
+Miguel's Surfing Quick Links
+============================
+
+Since I do not want to depend on JavaScript all of the time, I tried to
+integrate simple keyboard-only navigation directly into the webkit2gtk+,
+as a web extension.
+
+I use simple unix pipes for communication between the
+main thread and my webextension.
+
+__Please note that this is a work in progress!__
+
+You can take a look at both branches at my git repo: [https://gitweb.softwarefools.com/?p=miguel/surf-webext-dom.git](https://gitweb.softwarefools.com/?p=miguel/surf-webext-dom.git).
+
+The DOM is manipulated on the fly by the browser without any JavaScript involved.
+
+A little video demonstrating what was achieved so far (inside the glorious, webkit2gtk+ based, suckless surf browser):
+
+<video controls>
+ <source src="v1.mp4" type="video/mp4">
+ <source src="v1.ogv" type="video/ogg">
+Your browser does not support the video tag.
+
+</video>
+
+The browser itself can be found here: [https://surf.suckless.org/](https://surf.suckless.org/).
+
+
diff --git a/00_blog/00100_Webkit-Keyboardless-Navigation/v1.ogv b/00_blog/00100_Webkit-Keyboardless-Navigation/v1.ogv
new file mode 100644
index 0000000..a086103
--- /dev/null
+++ b/00_blog/00100_Webkit-Keyboardless-Navigation/v1.ogv
Binary files differ
diff --git a/00_blog/00110_Fool-Operating-System/compositing.ogv b/00_blog/00110_Fool-Operating-System/compositing.ogv
new file mode 100644
index 0000000..3243f15
--- /dev/null
+++ b/00_blog/00110_Fool-Operating-System/compositing.ogv
Binary files differ
diff --git a/00_blog/00110_Fool-Operating-System/foolos0.png b/00_blog/00110_Fool-Operating-System/foolos0.png
new file mode 100644
index 0000000..9a897eb
--- /dev/null
+++ b/00_blog/00110_Fool-Operating-System/foolos0.png
Binary files differ
diff --git a/00_blog/00110_Fool-Operating-System/foolos1.png b/00_blog/00110_Fool-Operating-System/foolos1.png
new file mode 100644
index 0000000..9ab199c
--- /dev/null
+++ b/00_blog/00110_Fool-Operating-System/foolos1.png
Binary files differ
diff --git a/00_blog/00110_Fool-Operating-System/foolos2.png b/00_blog/00110_Fool-Operating-System/foolos2.png
new file mode 100644
index 0000000..73d95e0
--- /dev/null
+++ b/00_blog/00110_Fool-Operating-System/foolos2.png
Binary files differ
diff --git a/00_blog/00110_Fool-Operating-System/index.md b/00_blog/00110_Fool-Operating-System/index.md
new file mode 100644
index 0000000..2e25144
--- /dev/null
+++ b/00_blog/00110_Fool-Operating-System/index.md
@@ -0,0 +1,105 @@
+Fool OS
+=======
+
+Welcome to my little buggy **x86 toy operating** system.
+This is a never ending work in progress, motivated solely by my
+bottomless curiosity.
+
+Be warned that most features are unstable and in development.
+
+## Features v0.2
+
+* Booting with Multiboot (Spec. 0.6.96) (e.g. GRUB 2)
+* Rudimentary POSIX compilance
+* 32-bit protected mode
+* Logging to COM1
+* Parsing ACPI (incomplete) and Multiboot Data
+* Symmetrical Multiprocessing with LAPIC and IOAPIC
+* CMOS Clock/ PIT Timer / APIC Timer
+* Seperate GDT and IVT for each CPU
+* Paging / Virtual Memory
+* Ext2 RAM Disk
+* Pipes
+* Standard streams (stdin/stdout/stderr)
+* PS2 Mouse/Keyboard support
+* Multi-threading & Multitasking
+* Kernel and Userspace Tasks
+* CPU Private Memory
+* Support for ELF binaries.
+* IRQ Handling Framework
+* Finegrained Spinlocks
+* Superfast Task Scheduler
+* PCI Bus scanning
+* Ethernet E1000 PCI Driver
+* VESA Framebuffer with fallback to a text-only terminal
+* C-library for Userspace (Newlib)
+* Simple Network Stack (ARP, IPv4, ICMP, UDP)
+* Compositing Window Manager
+
+## Userspace Ports and Programs
+
+* Simple Fool-Shell
+* Snake Game
+* Newlib C library
+* ncurses
+* ncurses-examples
+* vim
+* zlib
+* libpng
+* many more to come...
+
+## Screenshots
+
+![](scale_foolos0.png){}\
+**Booting** the Kernel in frame-buffer mode
+
+![](scale_foolos1.png){}\
+**Shell** in text mode.
+
+![](scale_foolos2.png){}\
+[click here for full-resolution version of pic above.](foolos2.png)\
+My **Compositing** Window Manager in action. As you see **Fool-OS** ships
+with **vim** and some little **ncurses-examples** as well as a
+**Brainfuck** interpreter.
+
+## Videos
+
+<video controls>
+ <source src="pipes.mp4" type="video/mp4">
+ <source src="pipes.ogv" type="video/ogg">
+Your browser does not support the video tag.
+
+</video>
+Demonstrating the Kernel's **piping** functionality, inside the shell.
+
+<video controls>
+ <source src="compositing.mp4" type="video/mp4">
+ <source src="compositing.ogv" type="video/ogg">
+Your browser does not support the video tag.
+
+</video>
+Some random **ncurses** programs (from ncurses-examples) running inside **Terminal Emulators**.
+
+## Git Repository
+
+* [Fool OS - Git Repository](https://gitweb.softwarefools.com/?p=miguel/fool-os.git)
+
+## Disclaimer
+
+ THIS IS A NEVER ENDING WORK IN PROGRESS.
+
+ This is a simple and useless "operating system", with a very basic
+ set of features. It is the fruit of my fundamental explorations of
+ the x86 architecture and operating system design.
+
+ Copyright 2014,2015,2018 M.Idziorek <m.i@gmx.at>, unless stated
+ otherwise or forgotten.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
diff --git a/00_blog/00110_Fool-Operating-System/pipes.ogv b/00_blog/00110_Fool-Operating-System/pipes.ogv
new file mode 100644
index 0000000..5120049
--- /dev/null
+++ b/00_blog/00110_Fool-Operating-System/pipes.ogv
Binary files differ
diff --git a/00_blog/index.md b/00_blog/index.md
new file mode 100644
index 0000000..fad3ef7
--- /dev/null
+++ b/00_blog/index.md
@@ -0,0 +1,5 @@
+# Miguel's Blog
+
+While this is not strictly a chronological blog, you can find here a loose
+collection of some random articles, thoughts and projects of mine...
+