Hatena::ブログ(Diary)

DebugIto’s diary このページをアンテナに追加 RSSフィード

2016-10-16

stackageの特定のresolverに上がっているパッケージバージョンを調べるツール


指定したHaskellパッケージのバージョン番号が指定したstackage resolverでいくつなのかを調べるコマンドラインツールを作った。

例えばこのように使う。

$ staversion --resolver lts-4.2 --resolver lts-7.0 conduit base
------ lts-4.2
conduit ==1.2.6.1,
base ==4.8.2.0

------ lts-7.0
conduit ==1.2.7,
base ==4.9.0.0

自分はHaskellパッケージを作る際、travis-CIを使ってresolverはいくつか変えながらテストを回し、その結果を依存先パッケージのバージョン範囲(.cabalファイルのbuild-dependsセクション)に反映させている。その場合、テストした各resolver(特にそのうちの最新と最古のもの)における依存先パッケージのバージョン番号を知る必要がある。stackage.orgのWebサイトでは、最新のLTSやnightlyにおけるパッケージバージョン番号は分かっても、古いresolverでのバージョン番号をまとめて表示することができない。

staversionを使えば、こういったバージョン番号調査をまとめて実施できる。現状では、stackがローカルにダウンロードして置いているビルドプランファイルを読み込んでバージョン番号を調べる。のちのち、自らネットワークを通じてビルドプランファイルをダウンロードできるようにする予定。

ところで、そもそも.cabalの依存先パッケージのバージョン番号範囲はどれだけマジメに書くべきなのだろうか。バージョン上限を入れるとやはりいろいろ面倒くさい。この間hspecのメジャーバージョンアップがあったが、コードの対応作業は全く必要ないにもかかわらず、ビルドを検証して.cabalを書き直す作業だけでそれなりに大変だった。

Zipper関連のパッケージ


先日コーディングしていてZipperが必要になる場面に出くわした。それは単純なList zipperだったので自前で実装して済ませたが、ふと、汎用的なZipperライブラリがあるかどうかが気になったので、少し調べた。

syz

traverse-with-class

uniplate

comonad-extras

zippo

zippers

  • zippers: Traversal based zippers
  • lensパッケージに依存。
  • LensやIndexedLensを使ってZipperのフォーカスを動かす。
  • (:>)といった型コンビネータ(?)を使い、非均一なデータ構造を辿る場合でも経路の型情報を全て保持する。


使い勝手がよさそうなのはsyzであるが、generic programmingを使う以上、型安全性が少しだけ弱いように思える。実際に使う場合はMaybeがたくさん出てきそう。

zippersはかなり型安全に見えるが、lensへの依存はそれなりに重い。また、Zipperの型を自分で正しく記述するのは至難の業なようにも思える。全て型推論に任せられるならいいが。

2016-09-22

Haskellでテンキーに動的なキーバインドを設定できるやつを作った


テンキーに対して動的なキーバインドを設定するためのHaskellライブラリ"WildBind"をリリースした。

現状はX11デスクトップ環境のみサポートしている。要はxbindkeysみたいなものだが、その実体は普通のHaskellモジュールである。以下のようにして使う。

import WildBind.Task.X11
import System.Process (spawnCommand)

main = wildNumPad myBinding

myBinding = binds $ do
  on NumCenter `run` putStrLn "Hello, world!"
  on NumPageUp `run` spawnCommand "firefox"

「動的なキーバインド」というのは、ここでは2通りの意味で使っている。

第1に、WildBindではアクティブなウィンドウに応じてキーバインドを変化させることができる。例えば、Firefoxが開いているとき、動画プレーヤー(VLCとか)が開いているとき、PDFビューワ(evinceとか)が開いているとき、それぞれに対してキーバインドを設定すれば、それらが自動的に切り替わる。

第2に、WildBindではキーバインド自体が状態を持ち、自身の状態によってキーバインドを変化させることができる。そのため、例えばEmacsのようにキーシーケンスに対してアクションを割り当てることができる。

なお、現状ではWildBindはテンキー上のキーにのみ、キーバインドを設定できる。これは、全てのキーを対象とするように作るのが面倒だったのと、全てのキーを対象とした場合は動的なキーバインドなどほとんど必要ないと思ったからである。テンキーという限られたスペースに可能な限り機能を詰め込むのがWildBindの基本的な考え方である。

詳しい説明やコード例はGitHub上のREADMEを参照されたい。



ところで余談だが、WildBindは数年前に作ったNumpaarというものが元になっている。

NumpaarはPerlとCで書かれていて、やたら複雑なマルチプロセス構成になっており、使いづらい上に不安定だった。そこで今回、全てをHaskellで書き直すことにしたのだった。

2016-09-11

慢性上咽頭炎の近況 (5)


前回の近況から3ヶ月が経過した。これまであったことを記す。

幸い、あれから症状が極端に悪化することはなく、耳鼻科に行くこともなく過ごせている。

ただ、依然としてたまに以下の症状が現れている。

  • 頭がぼうっと熱い感覚。午前中からお昼にかけてが多い。
  • 軽いめまい。
  • 疲労感。特に夜に感じ、眠くなる。鼻の奥がツーンとする感覚や、軽い頭痛を伴うことがある。

6月下旬と8月下旬、それぞれ1〜2週間ほどこうした症状が現れていた。

症状が出るきっかけというか、原因についてはよく分からない。睡眠不足、気候の変化、あるいは心理的ストレスだろうか。ただ、症状が出ているときはかなり早く寝てもすぐにはよくならなかったように思う。

とはいえ、逆に言えば上記の期間以外はほとんど症状を感じなかったので、ずいぶん良くなったほうだと思う。

2016-08-21

ロリポップ!のサーバ移設でInternal Server Errorが出たので対応


ブログやQiitaに書かないようなこと(最近は主にUbuntuインストールメモ)は個人的に立てているPukiWiki(http://debugitos.main.jp/)の方に書くようにしているが、昨日ここにアクセスしたら"Internal Server Error"が出てしまっていた。

このPukiWikiロリポップ!のサービスでホストしていただいているのだが、そういえば8/18に「サーバ移設」が行われていた。

ということで、多分このせいでエラーが出るようになったのだろう。

いろいろ調べたところ、どうもアクセス制限のための設置していた.htaccessがいけなかったらしい。もともとは<Files>ディレクティブを使って一部のファイルにのみアクセス制限をかけていたが、これを取り除くと動くようになった。

サーバ移設によってApache httpdのバージョンが2.2から2.4に上がったらしいが、そのせいでエラーになっていたのか、それとも利用可能なディレクティブがより少なく設定されているのか、よく分からない。

ただ、この作業の過程でよかれと思ってPHPのバージョンを5.2から5.6に上げたのだが、そのせいで今度はPukiWikiバグによるエラーが出るようになった。

どうやら古いバージョンのPukiWikiではPHP 5.4以降でエラーが出るらしい。

ということで、せっかくなのでPukiWikiを最新版に差し替えて、ついでにEUC-JPからUTF8に移行することにした。

まず、phpをローカルにインストールする。コマンドラインで起動できれば十分。

$ sudo aptitude install php-cli php-mbstring

次に、以下のサイトからdata2utf8.php.txtをダウンロードし、data2utf8.phpに名前変更。

data2utf8.phpPukiWikiのルートディレクトリに設置して、実行。

$ php -f data2utf8.php

これで文字コードの変換は完了。

UTF-8の最新版PukiWikiに旧PukiWikiのデータを流し込む。

$ cp -an ../old/wiki/* wiki/
$ cp -an ../old/attach/* attach/

backupやcacheは面倒なのでいじらなかったが、これでなんとなくうまく動くようになった。

あとは適宜skinを移植。基本的にimageリソースとskin/pukiwiki.{css,skin}.phpをコピーすればそのまま動いた。

ただ、これでサイト上のPukiWikiページにアクセスするとどうもページロードが遅い。というか、スタイルがワンテンポ遅れて当たっている感じだ。調べてみると、pukiwiki.css.phpのロードに700msもかかっていた。遅すぎる。

ということで、pukiwiki.css.phpが吐いたCSSを手動でファイルに保存し、skinではこのCSSファイルを直接読みこむように変更したところ、だいぶマトモなスピードで動作するようになった。

2016-06-05

慢性上咽頭炎の近況(4)


前回の近況からまた2ヶ月がたったので、これまであったことを記す。

Bスポットの終了


2016年4月5日にいつも通り耳鼻科でBスポット療法を受けた。この日でだいたいBスポットを始めてから半年が経過したことになる。症状はだいぶ改善してきているし、ここでいったん定期的なBスポット療法をやめ、様子を見ることになった。

耳鼻科の先生が言うには、「何ヶ月かしてまた戻ってくる人もいれば、こない人もいる。ともかく鼻呼吸を心がけよ」とのことだった。

それからここ2ヶ月の間は以下のような症状があった。

  • 後鼻漏。
  • 頭がぼうっとする感覚。目まいほどではないが、午前中に間食すると起こりやすかった。
  • 光がまぶしい感覚。特に午後3時から4時あたりで西日が強い時によく感じた。
  • 軽い吐き気。頻度は高くなかったが、液晶モニタでずっと文書を読んでいる時などに感じた。

こういった症状はコーヒーを飲んだり涼しい場所に移動することでやわらげることができた。

いずれにせよ、これらの症状は次第に弱くなってきており、今ではほとんど感じない程度になっている。

その他の措置


鼻うがいは朝夕に1日2回、引き続き行っている。特に寝ている間に鼻の奥に鼻水がたまることがあるので、朝に鼻うがいをすると気分がスッキリする。

さすがに鼻うがいには慣れてきたようで、水を押し込むタイプでも吸い込むタイプでもほぼ百発百中で鼻からノドに流せるようになってきた。不慣れなうちは、特に押し込むタイプではノドに抜けなかったことがあったが、ノドに抜ける感覚をイメージしながらゆっくり水を押し流すとうまくいくように思う。

腕と頭へのお灸は、最近は頻度を少し減らしてみている。結局効果があったのかどうか、よく分からない。鍼灸院で買ったもぐさがまだだいぶ余っているので、それを使い切るまでは続けようかと思っている。