ImageMagick6 を Fedora 26 にインストールする
諸事情により Fedora 26 で ImageMagick を使える環境を用意することになりました。
普通だったら yum install して終わりなのですが、リポジトリに上がっているのはインストールしたい ImageMagick6 ではなく、ImageMagick7 のようでした。
なのでソースからビルドしてみたいと思います。
jpg, png モジュールをインストールする
ImageMagick6 本体をビルドしただけでは、取り扱う画像フォーマットが限定されています。jpg や png を扱えない…というより、ほとんどの画像フォーマットが使えないようです。画像フォーマットのデコーダー等は ImageMagick 本体には含まれておらず、自分で用意してくれということなのだと思います。画像フォーマットのライセンスやらもいろいろ事情がありそうです。
そこで、ImageMagick6 をビルドする際に必要な画像フォーマットのパッケージをインストールしておきます。
以下は jpg, png に関するパッケージです。devel パッケージもインストールしておくことに注意してください。# yum install libjpeg libjpeg-devel
# yum install libpng libpng-devel
Wand の画像フォーマットエラー
jpg, png に関するパッケージをインストールしておかないと、いざ ImageMagick6 を使おうとした時にエラーになります。
python から ImageMagick6 を使える Wand では、以下のようなエラーが発生します。Traceback (most recent call last):
File "wandtest.py", line 4, in <module>
with Image(filename='sample.jpg', format='JPEG') as img:
File "/home/momokan/python/wand/wand/image.py", line 2744, in __init__
self.read(filename=filename, resolution=resolution)
File "/home/momokan/python/wand/wand/image.py", line 2822, in read
self.raise_exception()
File "/home/momokan/python/wand/wand/resource.py", line 222, in raise_exception
raise e
wand.exceptions.MissingDelegateError: no decode delegate for this image format `JPEG' @ error/constitute.c/ReadImage/504
Exception TypeError: TypeError("object of type 'NoneType' has no len()",) in <bound method Image.__del__ of <wand.image.Image: (empty)>> ignored
ImageMagick6 をインストールする
ソースコードは github に上がっています。なのでこれを持ってきましょう。$ git clone https://github.com/ImageMagick/ImageMagick6
そうしたら clone した ImageMagick6 ディレクトリに移動し、configure, make, make install します。
この辺りのビルドの仕方は伝統的な C プログラムですね。$ cd ImageMagick6
$ ./configure
$ make
# make install
configure のオプションにインストールディレクトリなんかもあるはずなのですが、面倒なので特に指定していません。指定しない場合には /usr/local/lib に共有ライブラリ(.so ファイル)がインストールされます。
続きを読む
WEB 技術,
python
コメント (0) 2018/05/07 16:41:26
npm リポジトリを verdaccio で構築する
前回 npm パッケージを作ってみましたが、npm でパッケージを作っていくとそれをリポジトリに公開したくなってきます。NodeJs には https://www.npmjs.com/ という公式リポジトリが存在しますが、一般公開したくない npm モジュールを置きたいとか、npm リポジトリ自体も自分で構築したいという要望もあるでしょう。
自前の npm リポジトリサーバーはいくつか存在するのですが、今回は構築の簡単な verdaccio を使ってみようと思います。
verdaccio をインストールする
npm リポジトリ用のサーバーにログインし、verdaccio をインストールします。
npm モジュールとして提供されているので、npm コマンドでインストールできます。# npm install --global verdaccio
verdaccio をインストールしたマシンをそのままサーバーとして使うので、--global を指定してグローバル環境にインストールします。
私の環境では /usr/lib/node_modules/verdaccio/ 配下にインストールされました。
続いて verdaccio を起動します。$ verdaccio &
verdaccio は root 権限がいらないそうなので、一般ユーザーで起動します。
これで verdaccio の npm リポジトリにアクセスできるようになっています。
verdaccio を動かしているマシンの DNS を verdaccio.example.com とした場合、アクセス URL は http://verdaccio.example.com:4873 です。
続きを読む
WEB 技術,
JavaScript
コメント (0) 2018/04/12 20:06:02
sqlite3 で SELECT 結果の行番号を取得する
SQL を使っていると、SELECT した結果セットの各行について、結果セット中での行番号を知りたい、という場面にたまに遭遇します。こういうやつです。SELECT * FROM books ORDER BY price;
id title price
---------- -------------- ----------
3 Art with Basis 600 #行番号: 1
4 Book List 990 #行番号: 2
1 Civilizations 1000 #行番号: 3
2 Dream Post 1200 #行番号: 4
5 El sant magina 1500 #行番号: 5
一般的な一覧系の処理では先頭から N 件とりだすことが多いので、OFFSET で取り出した件数を指定すれば行番号を意識せずに続きをとることができます。
ただ、ID からその行の結果セット中での位置を知ろうとすると、やはり行番号が欲しくなってくるのです。結果セットがソートされていたり、ソートされているカラムがユニークでなかったりするとかなり面倒なことになります。特定の ID の行の前後 3 行ずつを取りたい、というような時に困ってしまうわけです。
結果セット中での行番号を取得するために、Oracle では ROWNUM 擬似列や ROW_NUMBER() 関数が用意されているそうです。
また、MySQL ではユーザ定義変数を使うことで、SELECT 時に行番号を計算し、出力することができます。SET @rownum := 0; SELECT *, (@rownum := @rownum + 1) FROM books;
しかし sqlite3 では ROW_NUMBER() 的な機能もユーザー定義変数的な機能も実装されていないので、これらの方針をとることはできません。ネットを見てみると以下のようなクエリで計算している例がありますが、境界値として WHERE 句で使っているカラム(ここでは id カラム)がユニークでない場合、境界値として機能しないため、厳密な行番号はとれません。SELECT id, title, price, (SELECT COUNT(*) FROM books b2 WHERE b1.id >= b2.id) AS rownum FROM books b1 ORDER BY rownum;
id title price rownum
---------- -------------- ---------- ----------
3 Art with Basis 600 1
4 Book List 990 2
1 Civilizations 1000 3
2 Dream Post 1200 4
5 El sant magina 1500 5
※ ORDER BY rownum は見やすさ重視のためにつけたもので、必須ではありません。
もう 1 点、この方法では 1 行毎にサブクエリで行番号をカウントするため、参照性能に問題があります。MySQL では悪名高き DEPENDENT SUBQUERY にあたるためです。
続きを読む
WEB 技術
コメント (0) 2017/02/01 19:45:13
Cookie Clicker で自動クリックする Greasemonkey スクリプトを書いてみた
『気づいたら朝になっていた』『腱鞘炎患者製造機』と一部で人気のブラウザゲーム Cookie Clicker をはじめてみました。
このゲームの目的はただひたすらにクッキーを作ることです。
画面左の大きなチョコチップクッキーをクリックすることで、おいしそうなクッキーが1枚手に入ります。
作ったクッキーとひきかえにアイテムを買うことでクッキーの生産効率がアップし、さらに多くのクッキーを作れるようになります。
クッキーを何個作ったら何かが起こるとか、そういうのはありません。(PS3 的な実績はありますが。)本当にそれだけ。
……なぜそうまでして人はクッキーを作り続けるのか……。
……このクッキーにいったいどれだけの意味があるというのか……。
しかしあなたに悩むための時間はありません。
「おい新入りィ!!手が止まってんぞォッ!!」
どこからか親方の声が聞こえてきます。
そう、考える暇があるのなら、ひたすらクッキーをクリックし続けるのです。
この宇宙をクッキーで埋め尽くすために……。
―――以上クッキー中毒者の脳内ストーリーより。
という感じで怪しいくらいにはまってしまう Cookie Clicker ですが、いい加減マウスが壊れそうになってきたので、自動でクリックしてくれるグリモンスクリプトを書いてみました。(ようやく本題)
画面左に表示されるクッキーだけでなく、稀に出現するボーナスアイテム: 金のクッキーも自動でクリックしてくれます。
注意
このスクリプトによって Cookie Clicker のゲームバランスを壊したとしても、当方は一切責任を負いません。
ご自身で心ゆくまで手作りクッキーを焼いた上で、自己責任のもとご利用ください。
Cookie Clicker からクリックをとったらただの Cookie ですからね…。
ただ、クリックで作れるクッキーの数は、自動生産されるクッキーのだいたい 3 % くらいのようなので、クリックを自動でまわしても極端に有利になるということもなさそうです。1 秒間に 33 回クリックしてやっと自動生産量と同じになる感じ。
続きを読む
WEB 技術
コメント (2) 2013/09/17 12:30:35