背景が透過色のPNGのサムネイルを作るときの注意

PNG は透過色をサポートしている。で、タイトルに書いたように背景が透過色(というか透明)な画像から ImageMagic の convert コマンドで JPEG のサムネイルを作ると、もともと透明だった背景が黒くなってしまう。
これまでサムネイルだからいいか、と放置してたんだけど、↓このページで解決法を見つけた。

 cf. 透明度を含む画像を JPEG に変換する時の背景色 – [awm-Tech]

これまではこうやってサムネイルを作ってた。

takatoh@apostrophe $ convert -thumbnail 200x200 src.png thumbnail.jpg

だけどこれだと背景が黒くなってしまう。
そこでこうする。

takatoh@apostrophe $ convert -thumbnail 200x200 -flatten src.png thumbnail2.jpg

これだと背景が白くなる。-flatten オプションの意味が、調べてもいまいちよくわからなかったんだけど、元画像の後ろに白いレイヤーを重ねているみたいだ。-background オプションも使えて、例えば次のようにすると背景が赤くなる。

takatoh@apostrophe $ convert -thumbnail 200x200 -flatten -background red src.png thumbnail3.jpg

-background のデフォルトが白みたい。
ともかく、これからは -flatten をつけるようにしよう。

ImageMagickでR,G,BのRとBを入れ替える

手元に色のおかしい bmp 画像があった。どうも R,G,B が入れ替わっているらしい。
ImageMagick の convert コマンドで何とかできないかとググってみたら、↓このページを見つけた。

 cf. ImageMagickを使ったグレイスケール、反転、RGB入れ替えについて – Qiita

このページによると、いったん R,G,B それぞれの画像に分解してから、順番を入れ替えて合成すればいいようだ。詳しくは書かないけど、中間ファイルを作らなきゃいけないし、convert コマンドのオプション指定も難しい(詳しくは理解してない)。それでも試してみると、どうやら R と B を入れ替えると正常らしい色に変換できた。
とはいえ、画像ファイルは千個以上もあっていちいち手でやってられないので、スクリプト(バッチファイル)を書いた。
一つは、色のおかしい bmp ファイルを正常な png ファイルに変換するスクリプト。

@echo off
convert %1 -fX R img_R.png
convert %1 -fX G img_G.png
convert %1 -fX B img_B.png
convert ( img_B.png img_G.png img_R.png ) -set clorspace RGB -combine -set colorspace sRGB img_BGR.png
convert -flip img_BGR.png %2
del img_*.png

もう一つは、上記のスクリプトをカレントディレクトリの全 bmp ファイルに適用するスクリプト。

for %%I in (*.bmp) do convertBGR %%I %%~nI.png

これで全部正常になった。

デーモンとして動かすSinatraアプリにユーザーのインストールしたRubyを使わせる

以前作った Sinatra アプリ(フォトビューワー)をデーモンとして動かそうとしてハマった記録。
Sinatra アプリをデーモン化したことは前にもやったことがあるので、基本的にはその時のエントリを見ながらやったんだけど、一つだけ、ハマりどころがあった。それはアプリが Ruby 2.0 以降(だっけ?)にサポートしているキーワード引数を使って書いてあるのに対して、システムにインストールされているのは Ruby 1.9.3 だってこと。ユーザーは rvm でインストールした 2.3.0 を使っているのでテスト中は動くけど、いざ本番になってみるとシステムの 1.9.3 が使われるので動かない。
どうにかしてデーモンにも rvm でインストールした 2.3.0 を使わせたい。
探し方が悪いのか、ググっても情報が出てこない。結局解決策を見つけたのは、自分のエントリだった。

つまり、起動スクリプトで GEM_PATH と GEM_HOME に rvm のパスを設定して export すればいいようだ。書いた起動スクリプトがこれ:

#!/bin/sh

PATH=/home/potov/.rvm/rubies/ruby-2.3.0/bin:/home/potov/.rvm/gems/ruby-2.3.0/bin:/sbin:/bin:/usr/bin
GEM_PATH=/home/potov/.rvm/gems/ruby-2.3.0
GEM_HOME=/home/potov/.rvm/gems/ruby-2.3.0
export PATH
export GEM_PATH
export GEM_HOME

POTOV_ROOT=/home/potov/potov

case "$1" in
start)
cd ${POTOV_ROOT}
unicorn -c unicorn.conf -D
;;
stop)
PID=`cat ${POTOV_ROOT}/unicorn.pid`
kill -QUIT ${PID}
;;
*)
echo "Usage: potov {start|stop}"
exit 1
;;
esac

exit 0

当然 PATH も rvm の Ruby のパスを設定している。
ともあれ、これで無事起動するようになった。

新しいPCが届いた

HP の EliteBook Folio G1 ってやつ。1週間ほど前の夜中、薄くて軽くて頑丈、っていう惹句についうっかりとポチッたもの。確かに12.5型にしては軽い。
OS は Ubuntu じゃなくてプリインストールの Windows 10 Home をそのまま使うことにした。MS-Office を使いたいからそのほうがいいんだよね。
朝からセットアップを始めて、一通り終わったところ。rubygems がエラーをはいてちょっとハマったけど、他は特に問題なし。ホスト名は sofa にした。
以下、インストールしたアプリケーション。

  • Microsoft Office 2013
  • Firefox
  • Dropbox
  • Ruby
  • Python
  • Node.js
  • Gauche
  • Haskell
  • Perl
  • Git
  • 秀丸エディタ

とりあえずこんなところか。rubygems の問題の解決方法はエントリーを分けて書く。

Ubuntu:有線LANを繋がるようにした

はじめに

今まで Ubuntu マシンの nightschool は無線で接続していた。けれどうちの環境(無線LANルータは1階、マシンは2階にある)のせいか、接続が不安定で速度も遅かった。2階にイーサネットのジャックがあるので有線でつないでみたものの、どういうわけかリンクが確立しない(リンクランプが点灯しない、Ubuntu で Ethernet接続が有効にならない)という状況だった。
マシンを買って以来約2年近くもこの状態だったのだけど、ようやく解決するために重い腰を上げた次第。

参考にしたページ

このページが参考になった。

 cf. UbuntuでNICを認識しない場合の対応 – RainbowDevilsLand

状況の確認

まずは現在の状況の確認から。ifconfig コマンドで NIC の状況を見てみる。

takatoh@nightschool $ ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス f8:bc:12:78:84:ab  
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000 
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

lo        Link encap:ローカルループバック  
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:65536  メトリック:1
          RXパケット:110255 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:110255 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0 
          RXバイト:629344324 (629.3 MB)  TXバイト:629344324 (629.3 MB)

wlan0     Link encap:イーサネット  ハードウェアアドレス 54:35:30:bc:ed:f9  
          inetアドレス:192.168.1.5  ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: fe80::5635:30ff:febc:edf9/64 範囲:リンク
          inet6アドレス: 2408:212:ac6:e200:5635:30ff:febc:edf9/64 範囲:グローバル
          inet6アドレス: 2408:212:ac6:e200:75ec:809a:c077:3ea5/64 範囲:グローバル
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:46490 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:49384 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000 
          RXバイト:6255035 (6.2 MB)  TXバイト:18310646 (18.3 MB)

イーサネットの NIC (eth0)自体は認識しているようだけど、アドレスが割り振られていない。
参考にしたページに書かれているのは、NIC 自体が認識されていない場合の対処法だけど、ダメ元で同じようにドライバをインストールしてみることにした。そこで、NIC のチップの種類を調べる。

takatoh@nightschool $ lspci | grep 'Ethernet\|Network'
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0c)
03:00.0 Network controller: Qualcomm Atheros QCA9565 / AR9565 Wireless Network Adapter (rev 01)

Realtek の RTL8111/8168/8411 っていうチップのようだ。

ドライバのダウンロードとインストール

Realtek のダウンロードセンターから、RTL8111 を検索してダウンロード。0004-r8168-8.041.01.tar.bz2 というファイルだ。
これを展開する。

takatoh@nightschool $ tar xjvf 0004-r8168-8.041.01.tar.bz2

中に含まれている README ファイルを読むと、autorun.sh を実行すればいいようだ。

takatoh@nightschool $ cd r8168-8.041.01
takatoh@nightschool $ sudo ./autorun.sh

Check old driver and unload it.
rmmod r8169
Build the module and install
Can't read private key
Backup r8169.ko
rename r8169.ko to r8169.bak
DEPMOD 3.13.0-79-generic
load module r8168
Updating initramfs. Please wait.
update-initramfs: Generating /boot/initrd.img-3.13.0-79-generic
Completed.

Completed と出ている。うまくいったか?

確認

ふたたび ifconfig コマンドで確認。

takatoh@nightschool $ ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス f8:bc:12:78:84:ab  
          inetアドレス:192.168.1.20  ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: 2408:212:ac6:e200:fabc:12ff:fe78:84ab/64 範囲:グローバル
          inet6アドレス: fe80::fabc:12ff:fe78:84ab/64 範囲:リンク
          inet6アドレス: 2408:212:ac6:e200:486:4ce3:78a7:b216/64 範囲:グローバル
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:13 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:25 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000 
          RXバイト:1993 (1.9 KB)  TXバイト:4054 (4.0 KB)
          割り込み:45 ベースアドレス:0x4000 

lo        Link encap:ローカルループバック  
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:65536  メトリック:1
          RXパケット:110581 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:110581 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0 
          RXバイト:629379076 (629.3 MB)  TXバイト:629379076 (629.3 MB)

wlan0     Link encap:イーサネット  ハードウェアアドレス 54:35:30:bc:ed:f9  
          inetアドレス:192.168.1.5  ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: fe80::5635:30ff:febc:edf9/64 範囲:リンク
          inet6アドレス: 2408:212:ac6:e200:5635:30ff:febc:edf9/64 範囲:グローバル
          inet6アドレス: 2408:212:ac6:e200:75ec:809a:c077:3ea5/64 範囲:グローバル
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:58509 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:60687 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000 
          RXバイト:7434710 (7.4 MB)  TXバイト:19433795 (19.4 MB)

おお、eth0 にもアドレスが割り振られている。画面右上には Ethernet接続のマークも出ている。どうやらうまくいったようだ。

まとめ

イーサネットの不具合は、ドライバをインストールしたら治った。
接続状況はこうなった。

Screenshot from 2016-04-30 09:11:13

Strawberry PerlにはFortranコンパイラが含まれている

なぜかは知らないけど、このとおり。

^o^ > which gfortran
C:/Strawberry/c/bin/gfortran.EXE

せっかくなので、ちょっと使ってみることにした。

program hello
print *, 'Hello, world!'
end program hello
^o^ > gfortran -o hello hello.f90

^o^ > hello
 Hello, world!

昔、大学で習った FORTRAN77 とはずいぶん趣が違うな。

NginxのユーザディレクトリでPHPを動かす

Nginx の設定ファイルの server セクションで次のように設定する。

# User dir (PHP)
location ~ ^/~([^/]+?)/(.+\.php)$ {
    alias /home/$1/public_html/$2;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    include fastcgi_params;
}

# User dir (static)
location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
    index index.html index.htm;
    autoindex on;
}

# For PHP
location ~ \.php$ {
    root /var/www/html;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

キモは User dir (PHP) のセクションを For PHP のセクションよりも前に書くこと。そうしないとブラウザで PHP のファイルにアクセスしても Not found になってしまう。なぜなら location ~ \.php$ に先にマッチしてしまってファイルが見つからないから(たぶん)。

Windows10にアップグレードした

Windows マシン(valarie)を Windows7 から Windows10 にアップグレードした。昨日からダウンロードを始めて、今朝になってやっと終わった。2GB 超えのダウンロードは不安定なうちの無線LANにはつらいよ。

ダウンロードを別にすれば、アップグレード自体はすんなりといった。……ように見えたけど、なんと Office が起動できない。正確に言うと、起動するとあっという間にウィンドウが閉じてしまう。
スタートメニュー→設定→アプリと機能からインストールされている Office 2013を選ぶと、利用不可となっている。こりゃ再インストールしないとダメかなと思いつつ修復をやってみたら、うまく動作するようになった。利用不可のままなのが気になるけど。

そのほかはまだあまり試してないけど、インストールしてあるゲームのうち少なくともいくつかはダメな模様。Ruby や Python は大丈夫そう。ゲームは VirtualBox で Windows7 を使うか。

wikiの引越し

昨日は MySQL をインストールするところから始めて、MediaWiki を動かすところまで書いたけど、そのあと Windows マシンで運用している既存の wiki の引越しもしたのだった。今日はその手順について、(うろ覚えで)書く。

データベースとファイルのバックアップ

まずはデータベースの中身をファイルに吐き出させる。msqldump をいうコマンドを使うんだけど、パスが通ってなかったのでフルパスで指定。

^o^ > C:\VertrigoServ\Mysql\bin\mysqldump -u root -p wiki > wiki.sql

それから、アップロードしたファイルが保存されているフォルダを zip で固める。

^o^ > cd \www\wiki
^o^ > zip -r images.zip images

2つのファイルを持って、Ubuntu のマシンに移動。

データベースの更新とファイルの配置

Windows マシンから持ってきた wiki.sql ファイルを MySQL に読み込ます。

takatoh@nightschool $ mysql -u root -p wiki < wiki.sql

それから、images.zip を展開。すでに images フォルダがあるけどそのまま上書きする。

takatoh@nightschool $ cd /var/www/html/wiki
takatoh@nightschool $ unzip images.zip

これで一応完了。

エラー発生

ところがブラウザでアクセスしてみると、エラーが発生した。画面には「A database query error has occurred. This may indicate a bug in the software.」とか出ている。どうもデータベースのエラーのよう。ググってみたら↓このページを見つけた。

 cf. [RESOLVED] Database error in upgrading from 1.18 to 1.22

どうやら、mw-config/index.php にアクセスしてインストールをやり直せってことらしい。そのとおりにする。インストールの画面になり、進めていくとLocalSettings.php の中の $wgUpgradeKey の値を入力しろと促されるので入力する。そしたら何やらデータベースをアップグレードしているようになり、完了。
再度ブラウザでアクセスすると、ちゃんと表示された。

画像が表示されない

これは単にファイルのパーミッションの問題だった。images フォルダを展開、上書きした時に所有者が takatoh になってしまって、wiki のユーザーからアクセスできないようになっていた。なので、次のようにして解決。

takatoh@nightschool $ sudo chown -R 2246:500 images
takatoh@nightschool $ sudo chmod -R 755 images

Windowsマシンからだと表示がおかしい

Ubuntu マシンから、localhost でアクセスするぶんには問題は解決したけど、Windows マシンからアクセスすると表示がおかしい。おかしいというのは、本文は表示されるんだけど、スタイルシートなんかが読み込まれていない感じ。
ググって見つけたページがここのコメント欄。

 cf. XAMPP1.81が社内のLANに公開できない – QA@IT

LocalSettings.php の中の $wgServer の値が localhost になっているのが原因らしい。次のようにホスト名に変えた。

$wgServer = "http://nightschool";

これで、無事 Windows マシンからもちゃんと使えるようになった。