dimanche 8 décembre 2013

org-mode - markdown backend -- Emacs 24.3.1

A little reminder of something I failed to do before. Org-mode has optional export backends, some are loaded by default:

(message "%S" org-export-backends)
;; "(ascii html icalendar latex)"

(add-to-list 'org-export-backends 'md)

(message "%S" org-export-backends)
;; "(md ascii html icalendar latex)"

Now in an org-mode buffer, `C-c C-e` (org-export-dispatch) will have a markdown entry accessible through `m`.

ps: done on GNU Emacs 24.3.1 (i686-pc-linux-gnu, GTK+ Version 3.8.2) of 2013-08-07 on -mnt-storage-buildroots-staging-i686-eric; archlinux

mercredi 9 octobre 2013

lambda linguistic and logical interface

For a long time I've been amazed how much the `lambda` expression construct gives you. The introduction of name into expressions is seen through `let` which is syntactic sugar for lambda underneath. I believe Scala `for` nested iterations are also syntactic sugar toward flatmap + lambda. It's also a clean expression of data dependency. The sub-expression has meaning only if the lambda abstraction can be reduced by application to values. Otherwise well it's another smaller lambda expression. Wonderful.

reified side effects

Just wondering if there was some research into reifying the effected external entities back into the 'denotation'.

Instead of

f :: a -> b -> IO ()

you'd get

f :: e -> a -> b -> e

now that e is inside our algebra, maybe we can see programs as pairs (local,global)
bound by a protocol, or a fixed model of state transitions.

that's all.

jeudi 3 octobre 2013

Form vs editable trees (DOM). Shifting toward simplification.

html has this split between content (p,li,..) and communication (form,input) that will seems less and less justified. With html5 you can modify any node. Then transposed as json which can be sent to another peer as a structured message. The old way is a nice in-standard microDSL implemented by the browser, which guarantees freedom from javascript. This would be a large move off the 'web' as it's perceived but ...

Pedestal.io is already far away from the current paradigm, I believe they do send subtrees diffs between clients and servers. This is fascinating, clojure guys are jumping boldly on the fringe (edn, datalog, datomic, pedestal).

ps: to be edited.

dimanche 15 septembre 2013

pyalpm : archlinux pacman bindings in python

Wanted to toy with python and pacman. Starting with subprocess calls to `pacman` and ugly string processing. But the google fairy told me I was heading in the wrong direction.

sudo pacman -S pyalpm

5 minutes later, I choke. I can't find a way to instantiate anything. ipython helps navigating modules, 5 more minutes I find a "hack" to get a Handle and then the local package database.

import pyalpm

PATH="/var/lib/pacman"

def init():
    "() -> db"
    h = pyalpm.Handle(PATH,PATH)
    return h.get_localdb()

DB = init()

def installed_pkgs():
    return DB.pkgcache()

In [115]: pkgs = installed_pkgs()

In [116]: pkgs[:10]
Out[116]: 
[<alpm.Package("ghc-7.6.3-1-i686") at 0xb5a1b130>,
 <alpm.Package("qemu-1.5.2-1-i686") at 0xb5a1ce50>,
 <alpm.Package("chromium-29.0.1547.65-1-i686") at 0xb5a18ab0>,
 <alpm.Package("emacs-24.3-4-i686") at 0xb5a18ae0>,
 <alpm.Package("faenza-icon-theme-1.3.1-2-any") at 0xb5a18d40>,
 <alpm.Package("python-3.3.2-2-i686") at 0xb5a1ccb0>,
 <alpm.Package("jre7-openjdk-headless-7.u40_2.4.1-3-i686") at 0xb5a1b8f0>,
 <alpm.Package("gcc-4.8.1-3-i686") at 0xb5a1b080>,
 <alpm.Package("python2-2.7.5-2-i686") at 0xb5a1cd50>,

 <alpm.Package("linux-3.10.10-1-i686") at 0xb5a1c420>]

<yay/>

mardi 3 septembre 2013

archlinux :: mint 15 month long swap

update: 1 pacman -Su and 2GB later, boots ok, runs fine. One little detail, kernel warns about root being mounted rw when it shouldn't .. I couldn't read, boots too fast.

Fed up by, well, my mediocrity, I boot my archlinux machine again. Firefox shows a cached version of Google News July 30th 2013. It's been a month already. I just needed a debian based distro to try docker.io, arch is supported but it needs an aufs kernel module, which requires quite a lot of disk space to compile, my partition setup forbis such an amount. Anyway, Mint 15 was a agreable experience, after a while I forgot about arch, the overall better desktop configuration (better colors schemes, fonts, themes) made it feel stabler. I greatly suffered the windows manager intercepting all my emacs keybindings. also Xmonad screens suits me better than floating windows ala Mate.

The Mint 15 machine is less old, core duo => core 2 duo, with twice the ram and a non sluggish hard drive. A lot of things were faster. But a few days ago, I messed up the user/groups in Mint, I can't sudo anymore, booting singler user is useless since I believe root doesn't have a password, which is required by ubuntu/mint recovery mode. I don't even know what group I belonged to in the first place. Now I boot arch, the disk screams but 10 seconds later I'm under Xmonad. The terminal fires up fast, emacs fires up fast. Everything seems a little more reactive. This core duo can't decode 720p without choking but for most things everything is a little better. It's not even an engineered and polished system, I blended configuration examples, tweaks from wikis until it was good enough (c).

I have to admit, I forget a lot of things. Passwords took a little time to come back. I don't remember what I told Xmonad for launching the browser or the editor, fortunately I left the default dmenu one. Day saved.

Mint is not rolling, I missed the constant contact with arch repos. I'm in for a treat now. Pacman says I have 163 presents to open before midnight. Let's see if arch breaks as easily as I read so often on r/archlinux.

$ sudo pacman -Su
:: Starting full system upgrade...
:: Replace python-distribute with extra/python-setuptools? [Y/n]
resolving dependencies...
looking for inter-conflicts...

Packages (167): ack-2.08-1  alsa-plugins-1.0.27-2  archlinux-keyring-20130818-1
                bash-4.2.045-5  binutils-2.23.2-3  bison-3.0-1
                ca-certificates-java-20130815-1  cairo-1.12.16-1  cantarell-fonts-0.0.14-1
                chromaprint-0.7-6 chromium-29.0.1547.62-1  cloc-1.60-1
                cmus-2.5.0-3  cpupower-3.10-2  cryptsetup-1.6.2-1
                curl-7.32.0-1  device-mapper-2.02.100-1  dhcpcd-6.0.5-1
                dvdauthor-0.7.1-6  emacs-24.3-4  ethtool-1:3.10-1
                fbida-2.09-3 ffmpeg-1:2.0.1-1  file-roller-3.8.4-1
                fluidsynth-1.1.6-2  fontconfig-2.10.95-1  fuse-2.9.3-1
                gcc-4.8.1-3  gcc-libs-4.8.1-3  gdb-7.6.1-1
                gettext-0.18.3.1-1  ghostscript-9.10-1  giflib-5.0.4-2
                git-1.8.4-1  glew-1.10.0-2 glib2-2.36.4-1
                glibc-2.18-3  gnokii-0.6.31-6  gnome-icon-theme-3.8.3-1
                gnome-settings-daemon-3.8.4-2  gnupg-2.0.21-1  gnuplot-4.6.3-1
                gnutls-3.2.4-1  go-2:1.1.2-2  gpgme-1.4.3-1
                graphviz-2.32.0-1  groff-1.22.2-5 grub-2.00.5086-1
                gst-libav-1.0.10-1  gst-plugins-bad-1.0.10-1  gst-plugins-base-1.0.10-1
                gst-plugins-base-libs-1.0.10-1  gst-plugins-good-1.0.10-1  gst-plugins-ugly-1.0.10-1
                gstreamer-1.0.10-1  gtk3-3.8.4-1 guvcview-1.7.1-2
                hwdetect-2013.08-2  iftop-1.0pre2-1  imagemagick-6.8.6.9-1
                imlib2-1.4.5-5  intel-dri-9.2.0-1  inxi-1.9.14-1
                iproute2-3.10.0-1  iputils-20121221-3  ipython-1.0.0-3
                isl-0.12.1-1  iso-codes-3.44-1 jdk7-openjdk-7.u40_2.4.1-3
                jre7-openjdk-7.u40_2.4.1-3  jre7-openjdk-headless-7.u40_2.4.1-3  jshon-20130815-1
                kbd-2.0.0-1  keychain-2.7.1-3  kmod-15-1
                lftp-4.4.9-1  libarchive-3.1.2-2  libbsd-0.6.0-1
                libgexiv2-0.6.1-2 libmariadbclient-5.5.32-2  libmng-2.0.2-2
                librsvg-1:2.37.0-1  libsamplerate-0.1.8-2  libtiff-4.0.3-3
                libtracker-sparql-0.16.2-1  libusbx-1.0.16-2  libvdpau-0.7-1
                libwbclient-4.0.9-1  libwebp-0.3.1-3  linux-3.10.10-1
                linux-api-headers-3.10.6-1  lirc-utils-1:0.9.0-58  llvm-libs-3.3-1
                logrotate-3.8.6-1  lshw-B.02.17-1  lvm2-2.02.100-1
                man-pages-3.53-1  mariadb-5.5.32-2  mariadb-clients-5.5.32-2
                mercurial-2.7-1  mesa-9.2.0-1 mesa-libgl-9.2.0-1
                mkinitcpio-0.15.0-1  mkinitcpio-busybox-1.21.1-2  moreutils-0.49-1
                mpd-0.17.5-1  mplayer-36285-4  mupdf-1.3-4
                nasm-2.10.09-1  netctl-1.3-1  nodejs-0.10.17-1
                nspr-4.10-2  nss-3.15.1-1 ntp-4.2.6.p5-17
                openresolv-3.5.6-1  pacman-mirrorlist-20130830-1  parallel-20130722-1
                perl-5.18.1-1  perl-error-0.17021-1  perl-file-next-1.12-1
                perl-time-duration-1:1.1-3  php-5.5.3-1  php-apache-5.5.3-1
                php-pear-5.5.3-1  pixman-0.30.2-1  powertop-2.4-1
                python-distribute-0.6.45-1 [removal]  python-numpy-1.7.1-2
                python-pip-1.4.1-2  python-pygments-1.6-2  python-setuptools-1.0-1
                python-tornado-3.1.1-1 python-virtualenv-1.10.1-1  python2-mako-0.8.1-2
                python2-markupsafe-0.18-2  python2-paramiko-1.11.0-1  racket-5.3.6-1
                redis-2.6.16-1  redshift-1.7-7  reiserfsprogs-3.6.24-1
                run-parts-4.4-1  sbcl-1.1.10-1  serf-1.3.0-1
                sip-4.15.1-1  smartmontools-6.2-1  smbclient-4.0.9-1
                sqlite-3.8.0.1-1  subversion-1.8.1-2  syslog-ng-3.4.3-1
                tcl-8.6.0-5  testdisk-6.14-1  tk-8.6.0-2
                ttf-dejavu-2.34-1  unrtf-0.21.5-1  util-linux-2.23.2-1
                valgrind-3.8.1-3  vim-7.4.0-2  vim-runtime-7.4.0-2
                wayland-1.2.1-1  x264-20130702-2  xdebug-2.2.3-3
                xf86-video-intel-2.21.15-1  xorg-xprop-1.2.2-1  xorg-xset-1.2.3-1
                xorg-xwd-1.0.6-1  youtube-dl-2013.08.30-1 zsh-5.0.2-3

Total Download Size:    484.72 MiB
Total Installed Size:   2021.43 MiB
Net Upgrade Size:       27.16 MiB

:: Proceed with installation? [Y/n]



lundi 2 septembre 2013

recomings.

The way on is always longer than the way back. It's insufferable. Once the circle done you know, not all, maybe a little, but enough.

The trip from high to low-level is strange, often difficult. Those who dive deep enough to see the atoms, and get back up will see the combinations.

Creating requires this loop, from ideal to real. Providing the loop is what matters. Iterating will distort it as needed.

As intended.

samedi 31 août 2013

--Failed(update not anymore)-- attempt at dumping a rtsp:// stream - Alan Kay 2011 talk #1

The .smil is originally hosted by tele-talk.de

Found through http://permalink.gmane.org/gmane.comp.lang.smalltalk.fonc/2179 that I can just read the .smil through HTTP.

$ wget http://stream.hpi.uni-potsdam.de:8080/Archive/HPIK_SS11/HPIK_2011_07_21_01_hd.smil

Giving :

<?xml version="1.0"?>
<smil xmlns="http://www.w3.org/2001/SMIL20/Language">
<head>
<layout>
<root-layout width="1344" height="768" background-color="#ffffff"/>
<region id="video" top="0" left="0" width="320" height="180" z-index="2" 
fit="fill"/>
<region id="desktop" top="0" left="320" width="1024" height="768" 
z-index="1" fit="fill"/>
<region id="toc" top="180" left="0" width="320" height="478" z-index="2" 
fit="fill"/>
<region id="logo" top="658" left="0" width="320" height="110" 
z-index="2" fit="fill"/>
<!-- region id="cutright"  top="0"   left="1339" width="05"   
height="768" z-index="2" fit="fill"/ -->
<!-- region id="cutbottom" top="758" left="320" width="1024" height="10" 
z-index="2" fit="fill"/ -->
</layout>
</head>
<body>
<par>
<video region="video" 
src="rtsp://stream.hpi.uni-potsdam.de:554/Archive/HPIK_SS11/HPIK_2011_07_21_01_STREAM_video.rm"/>
<video region="desktop" 
src="rtsp://stream.hpi.uni-potsdam.de:554/Archive/HPIK_SS11/HPIK_2011_07_21_01_STREAM_desktop.rm"/>
<img region="logo" fit="fill" 
src="http://www.tele-task.de/images/logo_teletask_110.jpg"/>
<textstream region="toc" 
src="http://stream.hpi.uni-potsdam.de:8080/Archive/HPIK_SS11/HPIK_2011_07_21_01_hd_TOC.rt"/>
<!-- img region="cutright" 
src="http://www.tele-task.de/images/white.gif"/ -->
<!-- img region="cutbottom" 
src="http://www.tele-task.de/images/white.gif"/ -->
</par>
</body>
</smil>
 
As said in the mailing list post, these :

rtsp://stream.hpi.uni-potsdam.de:554/Archive/HPIK_SS11/HPIK_2011_07_21_01_STREAM_video.rm
rtsp://stream.hpi.uni-potsdam.de:554/Archive/HPIK_SS11/HPIK_2011_07_21_01_STREAM_desktop.rm
 
are the two URLs for the talk (one for the slides, one for the speaker).
Unfortunately, I couldn't get the content on disk. ffmpeg, [c]vlc, openRSTP, rtmpdump all failed.
The weirdest part is that I can "play" both streams, so the bytes are there, but I couldn't find
a way to replicate that in the shell to persist them. 
 
Update: I didn't notice it, but vlc does indeed dump the raw video stream in a file as required.
I was fooled by the fact that it doesn't display any signs of activity by default. You can monitor
the file in your FS (watch, inotify) or open vlc statistics dialog to witness the data size increase.

jeudi 29 août 2013

org-mode 201308xx recompile needed

Had a weird issue with emacs 24 and org-mode. The vanilla package refuse to `org-clock-in` with a "can't find library: org" (I was already in org mode, but maybe some lazy loading and wrong namespace was at cause). Installed marmalade 201308.. version. Now it can't find org-with-silent... macro or other functions. Opened the source files and forced byte-compile-file. and now it work ok-ish. I can clock-in but if I delete the time-line of an open clock org-mode will lose its head and stop displaying clocks altogether. Or maybe there's a force-rewrite-clocks function but that's left for the next time to be searched.

mercredi 21 août 2013

I though I'd like Clojure ...

I've been following this language and community from a distance, with wide open loving eyes. It had nice abstraction underneath, far less mutation than vintage~ Lisps, some ~syntactic niceties (words like first, rest instead of acronyms).

But coding in it felt had too much. I guess that's what Rich Hickey said, it's on the pragmatic side of things. All it brings has value on day to day problem solving. And I'm still fresh out college scheme/ml courses. But that's the thing, if I had to iterate on the lisp idea, I'd bring it closer to ML, not closer to ruby/perl (that's how I felt for the last few days). Using sml I felt my mind was constrained just enough to find abstract recursive solutions. In clojure I'm floating in a river of gems in brownian motion.

It's shallow criticism, not even criticism, just firsthand expression. I'm probably not smart enough to dive in it in 3 days and understand its idioms. This dialect different enough from lisp/schemes that my brain needs more time (says more about my brain than clojure vs others) . When finished with other things (SICP, 4clojure) I'll do a medium-- sized project in it (something I've never done on my own actually). Hoping the function based, mutation free idioms will lift me above my current limitations, whereas other languages feels comfortable doing one liners, I can never write systems in them. Maybe clojure shines at helping your mind scale above non-trivial exercises.

(lambda (k) ...)

mardi 20 août 2013

The loop/recur constructs in clojure are really nasty, and not in a good way. Let's say it will force your brain to re-evaluate its knowledge on recursive processes.
 (fn [n]
      (loop [i 0
           a [1 1]]
      (cond (< n 3) a
            (= i (- n 2)) a
            :else (recur (inc i)
                         (conj a (apply + (drop i a))))))


Blame it on Sun's JVM.

ps: this is probably the ugliest guess-fested fibonacci function I've ever seen (and written). So far.

vendredi 16 août 2013

ubuntu docker.io : docker.sock permission denied issue #163

If you experience this :

$ docker images
2013/08/16 19:05:13 dial unix /var/run/docker.sock: permission denied


Then just use this temporary fix (as suggested here https://github.com/progrium/dokku/issues/163):
 
$ sudo chmod 777 /var/run/docker.sock

and enjoy your containers again

$ docker images
REPOSITORY          TAG                 ID                  CREATED             SIZE


(empty list because I started from scratch again)

lundi 22 juillet 2013

Y U NO Y

After finally watching the 1986 SICP HP sessions, and many other videos building languages from nothing but lambdas, I can say I'm almost there for the Y-combinator. This choregraphy of bouncing `objects` (functions or whatever) is a thing of beauty. Wikipedia page on the matter includes some lazy functional example in Haskell :

dummy@x60s_GPT ~ [master *]
± % ghci

GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> let fix f = f (fix f)
Prelude> (fix (\f n -> if n == 0 then 1 else (f (n - 1)) * n)) 5
120
Prelude> -- amazed

mercredi 19 juin 2013

DELL 4500s from the forest - chapter 4 : the giveaway

Having toyed enough with this machine I started to look for potential collectors. There's not a lot of such enterprises nearby but I found one email. It took them 7 days to answer me negatively. So I was wrong, twice, for thinking they were out of business and for thinking this machine had any value at all. Yesterday, my father caught a neighbor saying she had issues installing a computer her grandchild gave her so she can learn to surf the web. On her living room floor lies an ATX mid-tower, a big SONY vaio desktop from 2002~ I guess. Problem .. it's booting quite randomly (1 on 10 on average). After an hour trying to unsuccessfully isolate the problem I tell her about my encounter with the DELL. She agrees to try it. I also proposed to sell her my ThinkPad x61 for $150. But she didn't want to spend money so .. she'll take the old Pentium 4.

Last time she had to use a computer was long ago at work. I didn't understand that it was already twenty years since she retired, she's actually 82~. At that time I'm not even sure she was given a graphical interface. Probably some complex mainframe terminal system. And so I didn't mind blindly throwing her this instrument of torture called a mouse. Suddenly explaining her things looks a lot longer then I thought. Classic first encounter with a mouse. Even the basic web conventions (pages, clickable [blue] text as links, searching,...) is heavier than it seems. She's completely unsaavy regarding contemporary usage, and doesn't look very fond of the digital world but she's kinda witty, I'm sure she'll manage.

samedi 15 juin 2013

jonesforth #0

Trying to learn how to write small Forth interpreter (1), I find a very detailed tutorial (thanks web.archive.org again)(2). It's literal documented assembly you should be able to run through gcc to get native code. Except it doesn't. But someone uploaded it on github (3), so maybe this issue has been documented or fixed. No luck but there's an old blog post with comment mentionning problems close to mine. They're solution actually work (although I don't know gcc options enough to really understand why)(5).

1. http://lambda-the-ultimate.org/node/2452
2. http://web.archive.org/web/20090209003017/http://www.annexia.org/_file/jonesforth.s.txt
3. https://github.com/chengchangwu/jonesforth/
4. http://rwmj.wordpress.com/2010/08/07/jonesforth-git-repository/#comment-6591
5. you will need to recompile without the “-Wl,-Ttext,0″ option to GCC

lundi 3 juin 2013

yet another fat archlinux update (with added dangerous migration juicy bits)




For once I had the reflex to check archlinux.org for additional informations. There was a filesystem structure change that needed some care.

# update of the day

luser@x60s_GPT ~ (master*) $ pacman -Qu
apache 2.2.24-1
bash 4.2.045-1
bluez 4.101-1
bridge-utils 1.5-1
cdrkit 1.1.11-2
coreutils 8.21-1
cryptsetup 1.6.1-1
dash 0.5.7-3
device-mapper 2.02.98-3
dhcpcd 5.6.8-1
e2fsprogs 1.42.7-1
ecryptfs-utils 103-1
ed 1.8-1
filesystem 2013.03-2
fuse 2.9.2-1
gconf 3.2.6-1
glibc 2.17-5
inetutils 1.9.1-5
iproute2 3.9.0-1
iptables 1.4.18-2
iptraf-ng 1.1.3.1-1
kmod 13-1
libatasmart 0.19-1
libsasl 2.1.26-3
lsof 4.87-1
lvm2 2.02.98-3
net-tools 1.60.20120804git-2
openresolv 3.5.4-2
pm-utils 1.4.1-5
ppp 2.4.5-5
rtmpdump 20121203-1
sed 4.2.2-2
shadow 4.1.5.1-5
systemd 204-2
systemd-sysvcompat 204-2
sysvinit-tools 2.88-10
tar 1.26-3
udisks2 2.1.0-2
usbmuxd 1.0.8-1
util-linux 2.23.1-1
v4l-utils 0.9.5-1
wpa_actiond 1.4-1
wpa_supplicant 2.0-3
zsh 5.0.2-1

# had to remove these alien packages because of the filesystem upgrade

luser@x60s_GPT ~ (master*) $ pacman -Qqo /bin /sbin /usr/sbin | pacman -Qm -
brightd 0.4.1-2
consolekit 0.4.6-4
ddcxinfo-arch 0.8-2
hwd 5.5.2-1
localepurge 0.6.2+nmu2-3
pmtools 20101124-2

samedi 1 juin 2013

xmobar idiocy : do not poll for constant values periodically (or at least do it very slowly)

Out of curiosity, I wanted to see if I needed to `sudo htop` to be
 able to strace a process from within. I picked the most mundane one,
 my second instance of xmobar.

 There's an awful lot of things happening (signals, clock, syscalls..), so I decide to run strace externally to keep only easy to follow syscalls like `read`, `open`:

    $ strace -p `pgrep xmobar | tail -n1` -e read 2>&1 | less

 now inside less you type `&/read` and enjoy the input received by
 xmobar to populate the string template you'll see on screen. Cool.

 Still an awful lot happening

 read(7, "dummy\n", 8096)                = 6
 read(7, "dummy\n", 8096)                = 6
 read(7, "dummy\n", 8096)                = 6
 read(7, "dummy\n", 8096)                = 6
 read(7, "dummy\n", 8096)                = 6
 read(7, "dummy\n", 8096)                = 6
 read(7, "dummy\n", 8096)                = 6
 ...
 read(7, "CK:2728 :: LK:3620", 8096)     = 18 (yes, that's a
 narcissistic reddit karma probe)


 And then I realize that my configuration is absurdly periodically
 polling for constants like `uname` or `whoami`.

 Indeed, here's the haskell code :

 , Run Com "uname" ["-s","-r"] "os" 0
 , Run Com "whoami" [] "who" 0
 , Run Com "/home/dummy/bin/reddit.sh" [] "reddit" 600
 , Run Com "/home/dummy/bin/hackernews" [] "hackernews" 600


So I change the frequency to a large value

 , Run Com "uname" ["-s","-r"] "os" 6000
 , Run Com "whoami" [] "who" 6000
 , Run Com "/home/dummy/bin/reddit.sh" [] "reddit" 600
 , Run Com "/home/dummy/bin/hackernews" [] "hackernews" 600


And, now nothing (almost) happens.

 read(7, "dummy\n", 8096)                = 6
 read(7, "CK:2728 :: LK:3620", 8096)     = 18
 read(7, "", 8096)                       = 0
 read(7, "[0|up to date]\n", 8096)       = 15
 read(7, "[0|up to date]\n", 8096)       = 15
 read(7, "Linux 3.9.4-1-ARCH\n", 8096)   = 19
 # 5 minutes pause
 read(7, "dummy\n", 8096)                = 6
 read(7, "CK:2728 :: LK:3620", 8096)     = 18
 read(7, "", 8096)                       = 0
 read(7, "[0|up to date]\n", 8096)       = 15
 read(7, "[0|up to date]\n", 8096)       = 15
 read(7, "Linux 3.9.4-1-ARCH\n", 8096)   = 19


 It might be unrelated, but for the first time since I used
 xmonad/xmobar I now witness CPU usage below 2% stable, even 0% for
 small period of time. (three times along writing this paragraph)

 <idiot/>

update: 04-10-2013

I just did a little RTFM/Googling to find if xmobar supported a run-once option, and indeed jaort added a way to instruct xmobar to do so. Just use Run Com with a frequency of 0 and it won't run the process again. I re-installed archlinux and for a reason I cannot attach strace to xmobar, but htop can and doesn't show the same amount of activity as before. There's two dozen of waitpid, that are probably a polling policy of xmobar to wait for the process output.. but nothing incoherent. That said, my cpu doesn't reach the 0% of activity as much. <idiot><lost/></idiot>


mercredi 29 mai 2013

javascript/jQuery oneliner to remove iframes

jQuery("iframe").each(function(i,e) {var p=e.parentNode; p.removeChild(e);})
oh I think I saw a unnecessary variable declaration !
jQuery("iframe").each(function(i,e) {e.parentNode.removeChild(e);})

That's all Folks !!!

/me bugs out.

dimanche 19 mai 2013

Running HP Colorado T1000 tape drive under Linux - Part 1 : outdated drivers for linux 2.0

I have a HP Colorado T1000 drive with one backup tape from the win95 era (I can probably say there's doom on it). I'd like to leverage my new-found dell 4500s desktop to plug it and extract the 400-800MB of data, but the linux driver, namely `ftape`, is for linux 2.0 I believe. I downloaded the latest release, version 4.04, from 2000:

dummy@x60s_GPT ~/work/ftape-4.04
  % cloc .                                                                                                                                !4591
     132 text files.
     121 unique files.                                        
      30 files ignored.

http://cloc.sourceforge.net v 1.58  T=1.0 s (102.0 files/s, 31527.0 lines/s)
--------------------------------------------------------------------------------
Language                      files          blank        comment           code
--------------------------------------------------------------------------------
C                                36           2210           4634          17256
C/C++ Header                     48            838           2018           3354
Bourne Shell                      8             48            214            396
make                              8             62            228            203
Bourne Again Shell                2              1             47             18
--------------------------------------------------------------------------------
SUM:                            102           3159           7141          21227
--------------------------------------------------------------------------------


That's a lot of lines TT_TT

samedi 18 mai 2013

Crossing streams : How I swamped my ThinkPad X60s keyboard

I splought (when you choke to avoid coughing but end up spiting twice more with a now open mouth) on my keyboard. Some of it got under the keys. Fortunately I have spare parts, especially keyboards (touchtypist/IBM keyboard feel fetish) so I swap to let this one dry. After a little bit of tissue and a few minutes I plug it back, and I witness something for the first time : a keyboard bug. Pairs of adjacent keys are now influencing each others lines, typing 's' echo 'sa'. '1' echo '21'. 'tab' echo 'tab[invisible caps lock]' which means now it's FREE LISP STYLE. Before I toss it to the garbage I try remove the key support tryptic. It's a set of 3 fragile and tiny plastic parts: a bottom frame, and two crossing hooks forming a X supporting a little rectangle pushing over a latex cushion. I don't know what degree you need to do that, it's all so tiny and weak yet when plugged together its stable and sturdy. Plus it's very very easy to unmount/remount. At least when you figured it out. Anyway, it's amazing, and now that they're all off the keyboard plane, I can spill a little bit of isopropylic alcohol in the hope that it will improve things. It's unbelievably dirty here, full of 0.1mm breadcrumbs, and also lots of cat hair stuck in every possible way...
Time to plug it back for good, just after a quick keyless test (the key are just providing pressure for the board layers to connect, so your finger will do just fine) showing everything got back to order. Reassembling the 10~ keys and their X support is quite fun. And here I am typing this.















reassembly step 1 : pre slide

reassembly step 2 - half slide

reassembly step 3 - pre second half

reassembly step 4 - base seated

step 5 - cross up insertion

step 6 - up insertion done, bottom resting

step 7 - push bottom legs in their plug~

step 8 - legs done








locking claws~ to be clipped on top of Cross

jeudi 16 mai 2013

DELL 4500s from the forest - chapter 3 : the install-partying

So that old DELL 4500s runs. I also found an recent (using systemd) archlinux live cd so I can enjoy a more modern driver set and OS utils. But it can't boot usb, so I'll have to find another persistant storage device, namely : a hard drive. No problem, I have a dozen hard drive sleeping under my bed. Except half of them are < 4G or SATA, all but one [ex IBM] Hitachi Deskstar 80GB (you know, the model just after the Hitachi DeathStar 60GB failure generators). One empty slot in the partition table, 7GB+ of capacity, perfect. That doesn't solve the boot issue, I don't have a spare partition for grub. I'll try to bootstrap the boot from the live cd. I'm in the mood for some serious bad idea attempts tonight.

DELL 4500s from the forest - chapter 2 : the booting [yes it does do run]

A while back I found a Dell 4500S (2002) in the woods. Today I decided to procrastinate (job search) by not procrastinating (geekery), so I plugged an old PSU (the original PSU looked busted) and push the dreaded button. For the record, I saw this machine 2 days before I finally picked it up, it was probably there for 2 full nights with rainy sessions. Anyway, #1 it boots, it's stable. But it's 2002 and usb boot is not included in mainstream BIOS, so I dug up an old Knoppix. And yay, hello KDE3.
For fun I hand-copied a weird ANSI C program as a benchmark Pi calculation in Emacs 21. Was fun to do except for the fact that my fingers have internalized 12 inches ThinkPad keyboards and I miss half my strokes. The bench was too old to be of any use, 0.130s to run.

#2 Out of curiosity I tried the original PSU. It's a slim design, very neat, with a low noise fan. Quite cool. It's almost silent compared to my crappy ATX one.

I need to test networking and a more recent distro. In the end I'll probably give it away to charity, it's faster than a raspberry pi so they may want it.

Oh, some last minute things: 'they' took the hdd before throwing it. The BIOS seems DELL specific, and includes a log store; last event is from 2002. Weird.

ps: shit, this thing doesn't even have an ethernet chip, and the only extension slot is a slim thing, I doubt I can fit one of my old pci wifi card. Knoppix is too old for usb wifi it seems. I need to burn an old Linux Mint on a cd, 2000 style.

mardi 14 mai 2013

how bad mouse events are ergonomic papercuts

I tried to use this configuration bit to activate have trackpoint 'wheel' scrolling emulation.

Section "InputDevice"
       Identifier "TPPS/2 IBM TrackPoint"
       Driver     "evdev"
       Option     "Device" "/dev/input/by-path/platform-i8042-serio-1-event-mouse"
       Option     "GrabDevice" "False"
       Option     "EmulateWheel" "true" #Enable wheel emulation for the Trackpoint
       Option     "EmulateWheelButton" "2" #Use the middle button for the emulation
       Option     "XAxisMapping" "6 7" #Map trackpoint X axis to X axis of emulated wheel
       Option     "YAxisMapping" "4 5" #Map trackpoint Y axis to Y axis of emulated wheel
EndSection


I believe it caused some erroneous event duplications. Maybe down and up events being handled as being the same kind. It quickly drives you mad. Files asked to open instead of appended to selection. Boolean buttons doubly toggled in vain. So I backed to this old copy/pasted configuration. 

Section "InputDevice"
        Identifier      "USB Mouse"
        Driver          "mouse"
        Option          "Device"                "/dev/input/mice"
        Option          "SendCoreEvents"        "true"
        Option          "Protocol"              "IMPS/2"
        Option          "ZAxisMapping"          "4 5"
        Option          "Buttons"               "5"
EndSection


No frills but it works, and god does it makes you zen.

dimanche 12 mai 2013

archlinux pacman helper

I don't always follow pacman updates output. I believe this behavior was the reason I was left with an unbootable system. Mainly because of a long time due change for /bin/systemd to be removed, /bin/init being the sole entry point for the bootloader to continue. Anyway, as for LFS (Linux From Scratch), logging things could help, so as for now I'll use :

pacman -Su | tee pacman.dash.Su.`date +%d%b%G_%H%M%S`.log

in order to be able to read useful information later on.

lundi 6 mai 2013

another archlinux massive upgrade push

luser@x60s_GPT ~ (master*) $ pacman -Qu
avahi 0.6.31-6
cairo 1.12.14-3
cairomm 1.10.0-2
chromium 26.0.1410.63-1
dvdauthor 0.7.1-4
emacs 24.3-1
fbida 2.09-1
feh 2.9.1-1
gd 2.0.36RC1-5
gdk-pixbuf2 2.28.1-1
ghostscript 9.07-1
graphviz 2.30.1-2
gst-plugins-good 1.0.7-1
gstreamer0.10-bad 0.10.23-3
gstreamer0.10-bad-plugins 0.10.23-3
gstreamer0.10-good 0.10.31-1
gstreamer0.10-good-plugins 0.10.31-1
gthumb 3.2.1-1
guvcview 1.7.0-1
imagemagick 6.8.4.10-1
imlib2 1.4.5-2
jbig2dec 0.11-5
jdk7-openjdk 7.u21_2.3.9-1
jre7-openjdk 7.u21_2.3.9-1
jre7-openjdk-headless 7.u21_2.3.9-1
libgdiplus 2.10-3
libpng 1.5.15-1
librsvg 2.37.0-1
libtracker-sparql 0.16.0-4
libwebp 0.3.0-1
mjpegtools 2.0.0-2
mplayer 35920-1
php 5.4.14-1
php-apache 5.4.14-1
php-pear 5.4.14-1
poppler 0.22.3-2
qemu 1.4.1-1
qt4 4.8.4-16
rrdtool 1.4.7-5
sdl_image 1.2.12-2
slim 1.3.5-2
tumbler 0.1.27-2
virtualbox 4.2.12-1
webkitgtk2 1.10.2-4
webkitgtk3 2.0.1-1
wxgtk 2.8.12.1-4
xloadimage 4.1-12
xv 3.10a-16
luser@x60s_GPT ~ (master*) $

vimgolf in emacs :: old macdonald lullaby

Bored and unwilling so doing some emacs vintage timewasting using this : http://vimgolf.com/challenges/4d29ae2107e0177c7e000036


; solution
; making a template, then iterate/expand through input once
; repeat until EOF

;; in
cow moo
horse neigh
duck quack
goose honk
hen cluck
chick peep
pig oink
sheep baa

;;out
Old MacDonald had a farm, E I E I O.
And on that farm he had a cow, E I E I O.
With a moo, moo here and a moo, moo there.
Here a moo, there a moo, everywhere a moo, moo.
Old MacDonald had a farm, E I E I O.

Old MacDonald had a farm, E I E I O.
And on that farm he had a horse, E I E I O.
With a neigh, neigh here and a neigh, neigh there.
Here a neigh, there a neigh, everywhere a neigh, neigh.
Old MacDonald had a farm, E I E I O.

Old MacDonald had a farm, E I E I O.
And on that farm he had a duck, E I E I O.
With a quack, quack here and a quack, quack there.
Here a quack, there a quack, everywhere a quack, quack.
Old MacDonald had a farm, E I E I O.

Old MacDonald had a farm, E I E I O.
And on that farm he had a goose, E I E I O.
With a honk, honk here and a honk, honk there.
Here a honk, there a honk, everywhere a honk, honk.
Old MacDonald had a farm, E I E I O.

Old MacDonald had a farm, E I E I O.
And on that farm he had a hen, E I E I O.
With a cluck, cluck here and a cluck, cluck there.
Here a cluck, there a cluck, everywhere a cluck, cluck.
Old MacDonald had a farm, E I E I O.

Old MacDonald had a farm, E I E I O.
And on that farm he had a chick, E I E I O.
With a peep, peep here and a peep, peep there.
Here a peep, there a peep, everywhere a peep, peep.
Old MacDonald had a farm, E I E I O.

Old MacDonald had a farm, E I E I O.
And on that farm he had a pig, E I E I O.
With an oink, oink here and an oink, oink there.
Here an oink, there an oink, everywhere an oink, oink.
Old MacDonald had a farm, E I E I O.

Old MacDonald had a farm, E I E I O.
And on that farm he had a sheep, E I E I O.
With a baa, baa here and a baa, baa there.
Here a baa, there a baa, everywhere a baa, baa.
Old MacDonald had a farm, E I E I O.

;; tmpl
Old MacDonald had a farm, E I E I O.
And on that farm he had a {{wat}}, E I E I O.
With a {{snd}}, {{snd}} here and a {{snd}}, {{snd}} there.
Here a {{snd}}, there a {{snd}}, everywhere a {{snd}}, {{snd}}.
Old MacDonald had a farm, E I E I O.

;; pre
;; clipboard contains input data

C-x b i n C-j ;; (buffer in)
C-y ;; input

;; preprocess input
M-< C-M-% s SPC <return> SPC <return> !
M-< C-M-% g e e s e <return> g o o s e <return> !
M-<
;; prepare template from out
C-x b o u t <enter> M-< M-h M-w C-x b t e m p C-j C-y
M-<
C-M-% c o w <enter> { { w a t } } <enter>
C-M-% m o o <enter> { { s n d } } <enter>
C-x b i n <enter>
;; main macro
<f3>
;; copy and paste template
C-x o C-x o
M-h M-w
C-x o C-y
;; put animal, sound in kill-ring
C-k
;; move 2 'Old' up
C-r O l d C-r
C-a
;; replace wat -> animal
C-s w a t <return>
M-b <delete> <delete> <delete> <delete> <delete> <backspace> <backspace> C-y
M-b M-d <backspace>
;; replace snd -> sound
C-SPC M-} C-M-% { { s n d } } <return> C-y <return> !
;; next
M-}
C-f
C-u 8 <f4>

vendredi 26 avril 2013

eye of glass. non-god instant replay, ubiquitous.

If I could, I'd setup servers and write a client/app for Google Glass to stream the last hour of video so people can instant replay anything anytime anywhere.

- no more basic mugging
- no more bullshiting

change of civilisation.

jeudi 25 avril 2013

storing code versus storing logic

in my mind imperative~ languages are full of 'code' variables.
they store encoded knowledge into state variable.
that will then be interpreted by the program.

e.g:

function sort(data, sorting) { case sorting = "num" : ... ; "..." : ... }

other paradigms store logic directly

function sort(data, sorting) { sorting(data[:half]) (+) sorting(data[half:]) }

and.. that's all.

</rant>

dimanche 21 avril 2013

archlinux package maintainer of the year

luser@x60s_GPT ~ (master*) $ date
Mon 22 Apr 00:41:16 CEST 2013
luser@x60s_GPT ~ (master*) $ pacman -Qu
at-spi2-atk 2.6.2-1
at-spi2-core 2.6.3-1
atk 2.6.0-1
clutter 1.12.2-1
clutter-gtk 1.4.2-1
cogl 1.10.4-1
dconf 0.14.1-1
elinks 0.13-11
file-roller 3.6.3-2
fontconfig 2.10.2-1
gconf-editor 3.0.1-1
gdk-pixbuf2 2.26.5-2
glib-networking 2.34.2-1
glib2 2.34.3-1
glibmm 2.34.1-1
gnome-desktop 1:3.6.2-1
gnome-icon-theme 3.6.2-1
gnome-icon-theme-symbolic 3.6.2-1
gnome-screenshot 3.6.1-1
gnome-settings-daemon 3.6.4-2
gnome-themes-standard 3.6.5-1
gnome-tweak-tool 3.6.1-1
gobject-introspection 1.34.2-1
gsettings-desktop-schemas 3.6.1-1
gthumb 3.1.2-1
gtk3 3.6.4-2
gtkmm3 3.6.0-1
gvfs 1.14.2-4
gvfs-afc 1.14.2-4
js 1.8.5-3
libgnome-keyring 3.6.0-2
libpeas 1.6.1-1
librsvg 2.36.4-1
libsecret 0.14-1
libsigc++ 2.2.11-1
libsoup 2.40.3-1
libtracker-sparql 0.14.5-1
nautilus 3.6.3-1
p11-kit 0.13-1
pango 1.32.5-1
perl 5.16.3-2
polkit 0.110-1
pygobject-devel 3.4.2-1
python2-gobject 3.4.2-1
totem-plparser 3.4.3-2
udisks2 2.0.1-1
vala 0.18.1-1
webkitgtk2 1.10.2-3
webkitgtk3 1.10.2-3
zenity 3.6.0-1
luser@x60s_GPT ~ (master*) $ # that's a lot of updates for a single night.

samedi 20 avril 2013

Reduce syntax.

LISP 'syntax' is <nouns> <spaces> <grouping>, everything else is semantic. The traditional layering way since backus is harmful. It forbids access to the metalanguage. ';' is dealt with by the parser then it disappears, what if I want to refine, extends, wrap it ?

syntax-less~ languages like FORTH and LISP have this trait which is fundamental IMNSHO

ps: other languages provides similar means of combinations, Haskell is known for that, Scala too. What about clean, pure, f# ..

vendredi 5 avril 2013

using custom rsa key filename with github

Out of paranoia I created my keys with '.gh' as {suf,in}fix. Github documentation mention a test command:

ssh -T git@github.com

Append `-i <public-key>` and retry.

e.g:

ssh -T git@github.com -i ~/.ssh/foo.gh.pub

mardi 2 avril 2013

Little elisp proto-snippet of the day : duplicate-line, select-current-line

Because `C-a C-SPC C-e M-w` just doesn't cut it, and I like playing piano, I decided to dig the web for a few helpers. I'm quite fond of the keybindings right now, let's see if they stick.

(defun duplicate-line ()
  "copy the current line underneath"
  (interactive)
  (move-beginning-of-line 1)
  (kill-line)
  (yank)
  (open-line 1)
  (next-line 1)
  (yank)
  (move-beginning-of-line 1)
  (message "TODO: restore caret position?, on original or new line?"))

(defun select-current-line ()
  "Select the current line"
  (interactive)
  ;; (end-of-line) ; move to end of line
  ;; (set-mark (line-beginning-position))

  (beginning-of-line)
  (set-mark (line-end-position))
  (message "TODO: select from begin to end or end to begin ? (caret > [begin..end]/2 => beg to end. end to beg otherwise)"))

(global-set-key (kbd "C-S-d") 'duplicate-line)
(global-set-key (kbd "C-S-l") 'select-current-line)

dimanche 31 mars 2013

python 3.3 pyvenv distribute pip hackish fix

Python3.3 includes an official virtualenv helper called pyvenv. Small detail though, it's not a swap-in replacement, you need to install distribute and pip by hand (at least for now) as said in the documentation. See the Note paragraph here http://docs.python.org/dev/library/venv.html#creating-virtual-environments.

Warning: you need to re-source the venv after `easy_install pip` !
Here's a complete session:

dummy@x60s_GPT ~/dev/python3.pyvenv % pyvenv venv

dummy@x60s_GPT ~/dev/python3.pyvenv % source venv/bin

(venv)
dummy@x60s_GPT ~/dev/python3.pyvenv % curl -O http://python-distribute.org/distribute_setup.py && \python distribute_setup.py && easy_install pip

# At that point, pip won't work, re-source venv/bin/activate

(venv)
dummy@x60s_GPT ~/dev/python3.pyvenv % source venv/bin/activate


# From now on pip will work


dummy@x60s_GPT ~/dev/python3.pyvenv % pip install requests

Downloading/unpacking requests
  Running setup.py egg_info for package requests
   
Installing collected packages: requests
  Running setup.py install for requests
   
Successfully installed requests
Cleaning up...
(venv)
dummy@x60s_GPT ~/dev/python3.pyvenv % echo $?

0

samedi 30 mars 2013

1998 Emacs article serie "Emacsulation" from slim[e] (common lisp) author Eric Marsden.

After Luke Gorrie's talk about SLIME origins and features, I dug for Eric Marsen (author of SLIME proto-prototype). According to http://edward.oconnor.cx/2006/01/emacsulation did an article series about Emacs around 1998. Links are dead redirection so here's the web.archive~proxy list:
  1. on jka-compr (AKA auto-compression-mode
  2. on networking, ange-ftp, w3, and crypt++
  3. an introduction to ediff
  4. on gnuserv
  5. on customizing Emacs, including material on Custom
  6. on abbrev, dabbrev, and completion
ps : Eric's webpage link section is full of things.

John Wiegley induced emacs [past]discovery of the day - edebug

EmacsConf is taking place today. John Wiegley speaks about elisp environment, including elp (profiler), edebug, and many other things. So I went to read the edebug manual a bit more (as usual I read a few pages but stopped too early).
I enjoyed the trace buffer combined with [fast]trace execution mode.

Enable the trace buffer with : `M-:` (setq edebug-trace t)

Now, let's say I have this in *scratch* (.|. being the caret)

(defun fact (n)
  (cond
   ((equal n 0) 1)
   ((* n (fact (- n 1))))))

.|.(fact 10)

`M-x` edebug-defun enters the elisp debugger

`T` will step through the s-exps in fast trace mode (automatically evaluate the next s-exp every N ms) and the *edebug-trace* buffer will trace the whole process nicely, resulting in this:

{ edebug-anon0 args: nil
:{ fact args: (10)
::{ fact args: (9)
:::{ fact args: (8)
::::{ fact args: (7)
:::::{ fact args: (6)
::::::{ fact args: (5)
:::::::{ fact args: (4)
::::::::{ fact args: (3)
:::::::::{ fact args: (2)
::::::::::{ fact args: (1)
:::::::::::{ fact args: (0)
:::::::::::} fact result: 1
::::::::::} fact result: 1
:::::::::} fact result: 2
::::::::} fact result: 6
:::::::} fact result: 24
::::::} fact result: 120
:::::} fact result: 720
::::} fact result: 5040
:::} fact result: 40320
::} fact result: 362880
:} fact result: 3628800
} edebug-anon0 result: 3628800

Kawaii, isn't it ?

mercredi 27 mars 2013

Coursera proglang epilog

Done with proglang. Lost many points because of I'm an unorganized idiot who can't recall a deadline. Unlike the scala course, proglang rules are stricter, 50% penalty right away. Anyway, got new insights and good understandings on all assignments. Both courses seems to be 2nd year college level. It's time for graduate level courses on programming. I'm revisiting old courses I took but failed (either in concept understanding or grades or both), and also starring at brown CS1730, idu C311, ...

There are initiatives for study groups about SICP, or advanced interpretation/compilation from coursera.proglang forum. Interesting, but I don't know how it's gonna be organized.

I also need 2nd-3rd year level classes in physics, chemistry, ee. And I want to take MIT classes about advanced data structures lead by E.Demaine.

That's for long term future. Short term is job hunting season opening. And right now I'm kinda blue. I liked the #coursera-pl @ freenode irc channel. All the guys here were cool (from the old timers gurus to the youngsters). I don't like to part.

Also, the sourceforge migration of some ocaml lib to github, pitched by xtrmz_ from #coursera-pl. A little push for the ocaml ecosystem, which some past teachers are so fond of.

-

jeudi 7 mars 2013

transcode to dvd using ffmpeg dvdauthor and growisofs




* transcode

  ffmpeg -i input.asf -target pal-dvd output.mpg
                                                                                                                                     
* Now you can use this file to make a DVD:


  export VIDEO_FORMAT=NTSC # NTSC or PAL
  dvdauthor -t -o youroutputdirectory -f output.mpg

  dvdauthor -o youroutputdirectory                                      
  mkisofs -dvd-video -o dvdimage.iso youroutputdirectory

  growisofs -speed=4 -dvd-compat -Z /dev/dvd=dvdimage.iso
                                                                                                             
* Verify by comparing MD5SUM


  md5sum dvdimage.iso 
  ISOSIZE=$(( $(ls -l dvdimage.iso | awk '{ print $5 }') / 2048 ))
  dd if=/dev/dvd bs=2048 count=${ISOSIZE} | md5sum

from http://ubuntuforums.org/showthread.php?t=1123447

lundi 25 février 2013

limit stream -- convergent approximation for data

so many representation for a single entity
- url- path
- file handler
- file metadata
- file header

on a graphical side
- icon
- named cell
- preview

somehow they're ordered, like a lazy stream whose data is the limit

url | path -> r : lim stream
(r) -> file handler , r
   (r) -> file metadata , r
      (r) -> file header , r
         (r) -> file byte stream, ()

mercredi 6 février 2013

Never is the year of Linux on the Desktop

It's a non sense, unixness is not to give you a finished product but composable atoms to blend at will. There should be no one version of what a desktop is, anything of value should be implementable or drive the creation of a new atom. Unfortunately Linux desktop is 0.01% composable. It's all application on top of fat libraries, with low capabilities, and even less ergonomy.