試行錯誤のおと

日々の試行錯誤した結果です。失敗することが多い記録、それだけでっす!

Conky で Github Grass Graph を rsvg で描画する

Linux Desktop を使っていない人や興味のない人にはほとんど旨味のない記事です。

毎日コードを書こうと思っていても、モチベーションを維持するのは難しいことが多いなと最近思ってる。 Github の Grass Graph を必然的に見るようにしたかったので、 conky に表示させてみた。

簡単に書くとシェルスクリプトと imlib で画像表示するだけで終わる。

Github の Grass Graph を取得して png に変換するスクリプト

#!/bin/sh
set -eu

ID="kizkoh"
curl https://github.com/${ID} | awk '/<svg.+class="js-calendar-graph-svg"/,/svg>/' > grass.svg
convert grass.svg grass.png

.conkyrc のサンプル

own_window_type conky
${image ./grass.png -p 0,0 -s 470x120 -f 3600}

ただ、ハックに物足りなさを感じたので、ちょっと Lua で頑張ってみた。

使用しているディストリで Conky の Lua rsvg モジュールを有効にする。 Lua rsvg は /usr/lib/conky/librsvg.so に入るので有効かどうかはここを見るとわかるみたい。 Conky のモジュールとしてインストールされるけど、 librsvg に依存しているだけなので普通に Lua からも使える。 Gentoo だと app-admin/conkylua-rsvg USE フラグを有効にしてビルドすると、 Lua rsvg が入る。

Lua rsvg はドキュメントがないので、ソースコードを読んで関数の役割を把握する。 といっても toluapp でバインディングが作成されているだけなので、関数を参照して rsvg 本家のドキュメントと照らし合わせればよいので簡単。 (最初は Lua 知識ゼロ だったので readelf でシンボルを読んでいた><)

それで書いたコードは以下のリンク。Cairo で描画しているので動作には Cairo モジュールも必要。

手元の Conky はこんな感じで表示されている。

f:id:kizkoh:20170620215925p:plain

出来上がったコードは Github に置いてある。
dotfiles/github_grass.lua at master · kizkoh/dotfiles · GitHub

いつも目がいくところ (Google Calendar とかの予定を表示させたりしている) にあるので、コードを書かないとなと気づきを与えてくれたり、芝生を育てるのが目的になってコードを書くモチベーションを維持できるようになったのでよい。 (最近うまくいってなくて説得力がないのが玉に瑕)

一つ欠点があって .conkyrc を書き換えたり、 SIGUSR1 をプロセスに送って設定をリロードさせると以下のようなエラーが発生する。

conky: received SIGHUP or SIGUSR1. reloading the config file.
conky: Syntax error (/home/kizkoh/.conkyrc:2: '=' expected near 'conky') while reading config file. 
conky: Assuming it's in old syntax and attempting conversion.
(process:15389): GLib-GObject-WARNING **: cannot register existing type 'RsvgHandle'

(process:15389): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed

こうなると SIGKILL を送るしかなくてすごく面倒。はじめは Lua の書き方が悪いのかと思っていて調べていたけれど、それほど困ってはいなかった。けれどもどうしてこのようなエラーが発生するのかは気になっていたので時間が空いたときに調べていくと Conky の問題だと分かるようになってきた。

話題がすっかり変わりそうなのと深入りして長くなりそうなので、この記事はひとまずこのへんにして問題の調査の過程は次回の記事に書くとします。