2014年の目標

忘れないためにもメモをしておく

痩せる

昨年は痩せる痩せると言いつつも、結局体重が変化することなく年末を迎えてしまい、正月で逆に増加するというなんとも情けない結果になってしまったので、今年こそは10kg痩せる。

自転車に乗る

上の目標とほぼ同じになってしまうんだけど、痩せるための手段として、今はほぼ部屋のオブジェとなってしまっている自転車を再開する。

写真を撮る

一昨年に買ったミラーレスカメラが常にカバンに入っているんだけど、実際に写真を撮るのは月に数回程度。しかも撮るのはほぼ決まった風景という状態だったので、今年はもっと数を撮る。
で、撮った写真はFlickrで管理する。

プログラムを書く

仕事以外のプログラムを何か作りたい(できれば、その過程をブログに書きたい)

日記・ブログを書く

これが一番難しそうなんだけど、日記・ブログを継続して書く。

mysql2のインストールではまる

Rails4.0も正式リリースされたとういうことで、早速アプリを作ろうとしたところ、
mysql2のインストールで予想にはまってしまったので、後々のためにメモしときます。


ちなみに環境は


この状態でDBにMySQLを利用するRailsのプロジェクトを作成して

$ bundle install

を実行すると、mysql2のインストールの部分で

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /usr/local/opt/rbenv/versions/2.0.0-p195/bin/ruby extconf.rb
    checking for rb_thread_blocking_region()... yes
    checking for rb_wait_for_single_fd()... yes
    checking for mysql.h... no
    checking for mysql/mysql.h... no
    -----
    mysql.h is missing.  please check your installation of mysql and try again.
    -----
    *** extconf.rb failed ***
    Could not create Makefile due to some reason, probably lack of necessary
    libraries and/or headers.  Check the mkmf.log file for more details.  You may
    need configuration options.

    Provided configuration options:
            --with-opt-dir
            --without-opt-dir
            --with-opt-include
            --without-opt-include=${opt-dir}/include
            --with-opt-lib
            --without-opt-lib=${opt-dir}/lib
            --with-make-prog
            --without-make-prog
            --srcdir=.
            --curdir
            --ruby=/usr/local/opt/rbenv/versions/2.0.0-p195/bin/ruby
            --with-mysql-config
            --without-mysql-config


Gem files will remain installed in /Users/shizm/work/sample/vendor/bundle/ruby/2.0.0/gems/mysql2-0.3.11 for inspection.
Results logged to /Users/shizm/work/sample/vendor/bundle/ruby/2.0.0/gems/mysql2-0.3.11/ext/mysql2/gem_make.out

An error occurred while installing mysql2 (0.3.11), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.3.11'` succeeds before bundling.

というようなエラーが発生しました。


エラーメッセージが

 「とりあえず gem install mysql2 が成功するか確認しろ」

って言ってるので言われるままにやってみるも、やっぱり失敗。


ということで、まずは

 --without-mysql-config

オプションのせいで MySQL の各種ファイルが参照できなくなってるんじゃ?
ってことで
MySQL関係のファイルは /usr/local/lib /usr/local/include とかに入ってるのは確認済みだから、これが原因じゃないのは明らかなんだけどね・・・)

$ which mysql_config
/usr/local/bin/mysql_config

でパスを確認して

gem install mysql2 -- --with-mysql-config=/usr/local/bin/mysql_config

とやってみるが、まだ同じエラーがでる。


こうなったらGoogle先生の力を借りるしかないってことで検索したら、ズバリな記事がありました。

Random Acts of Sentience: gem install mysql2 missing mysql.h on OS X


上の記事に書かれている通り /usr/local/bin/mysql_config の120行目辺りに定義されているパラメータを編集して

bundle install

を実行したら、無事に mysql2 のインストールに成功しました。

PaperclipでPDFを添付した時に、サムネイル画像の作成で失敗した

Railsアプリで添付ファイルを簡単に実現するために

https://github.com/thoughtbot/paperclip

を利用させてもらってます。


このライブラリを使うとPDFファイルをアップロードして、ついでに画面表示用のサムネイル画像を作る
といった処理も簡単に書けるので重宝してました。


しかし、あるPDFをアップロードしてみたところバックエンドで呼び出される ImageMagick の identify
コマンドがエラーを返してしまいました。


どうやらOSの標準パッケージに含まれる GhostScript のバージョンが古いのが原因っぽいので、これを
バージョンアップ、ついでに ImageMagick も最新に上げる事にしました。


あ、ちなみにOSは CentOS 6.3 32bit

GhostScriptを更新

$ wget http://downloads.ghostscript.com/public/ghostscript-9.07.tar.gz
$ tar zxvf ghostscript-9.07.tar.gz
$ cd ghostscript-9.07
$ ./configure --disable-compile-inits
$ make
$ sudo make install

ImageMagickを更新

事前にrpmforgeは使えるようにしておいて、
まずはrpmのビルドに必要なrpmbuildをインストール

$ sudo yum install rpm-build

次に、ImageMagickのrpmをビルドするのに必要な各種パッケージをインストール(この辺りは環境に応じて色々と変わる)

$ sudo yum install bzip2-devel
$ sudo yum install freetype-devel
$ sudo yum install libjpeg-devel
$ sudo yum install libpng-devel
$ sudo yum install libtiff-devel
$ sudo yum install giflib-devel
$ sudo yum install ghostscript-devel
$ sudo yum install djvulibre-devel
$ sudo yum install libwmf-devel
$ sudo yum install jasper-devel
$ sudo yum install libtool-ltdl-devel
$ sudo yum install libXt-devel
$ sudo yum install lcms-devel
$ sudo yum install librsvg2-devel
$ sudo yum install OpenEXR-devel

で、ImageMagickのrpmをsrpmから作り直してインストール

$ wget ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/linux/SRPMS/ImageMagick-6.8.3-2.src.rpm
$ sudo rpmbuild --rebuild --clean --rmsource ImageMagick-6.8.3-2.src.rpm
$ sudo rpm -Uvh /root/rpmbuild/RPMS/`uname -i`/ImageMagick-*.`uname -i`.rpm


これまでの作業が終わった段階で、コマンドラインで
gs --version
identify --version
を実行すると、たしかに両方とも最新になってる。

問題となったPDFファイルに対して identify コマンドを実行すると期待した値が返ってくる。


よしよし、これで万事解決した。
さーてRailsのアプリからもアップロードしてみるか・・・・



失敗。。


なんで???


どうやら、Passengerで動作させているアプリの場合、パスとして /usr/local/bin よりも /usr/bin の方が
優先されているらしく、/usr/bin 以下に残っているOS標準の gs コマンドが呼び出されているのが原因のようです。
WEBrickの場合は問題なかったのに)


調べたところ、ImageMagickが形式変換を行う際のパラメータは設定ファイルに定義されているのが分かったので
http://blog.loadlimits.info/2010/04/imagemagick%E3%81%AEpdf%E5%A4%89%E6%8F%9B%E7%94%A8gs%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%B7%AE%E3%81%97%E6%9B%BF%E3%81%88%E3%82%8B/
このサイトに従って

 /etc/ImageMagick/delegates.xml

に記載されている gs コマンドのパスを

 /usr/local/bin/gs

に書き換えたら正常に動作するようになりました。

Rubyで半角文字を全角に変換する

jcode.rbを利用するので 1.8系までだけど・・・

# coding: utf-8

require 'jcode'

hankaku = 'アイウエオ-12345'
NKF.nkf('-WwXm0', hankaku).tr("!-~\s", "!-〜 ")

Linux系ならこれで構わないんだけど、ここで変換した文字列をファイルに出力してWindowsのエディタで開くと
みごとに全角ハイフンが文字化けしてくれる。


原因を調べてみると、どうやらUTF-8において全角ハイフンを表すコードは複数あるようで、上記のコードで変換
すると「e2 88 92」というコードに変換される。


Windowsではこのコードが表示できないために文字化けが発生している。

とりあえずの対応として、変換後の文字列に含まれる全角ハイフンのコードをWindowsでも表示できるものに書き換える

# coding: utf-8

require 'jcode'

hankaku = 'アイウエオ-12345'
NKF.nkf('-WwXm0', hankaku).tr("!-~\s", "!-〜 ").gsub(/\xe2\x88\x92/, "\xef\xbc\x8d")

これ以外にもWindowsで表示できないコードに変換されてしまう問題はきっとあるんだろうけど、
なんかスマートに変換する方法ないかな・・・

LinuxからWindowsの共有フォルダをマウントする

LinuxからWindowsの共有フォルダをマウントするには

# mount -t cifs -o username=ユーザー名,password=パスワード //192.168.XXX.XXX/share /mnt/windows_share

というようにすればいいが、これだとWindows側で再起動などが行われてしまうと接続が切れてしまう。


そこで、Linux側では起動時に共有フォルダをマウントし、かつ定期的にマウント状態を確認してみる。


まずは起動時にマウントするために /etc/fstab に 以下の設定を追記する。

//192.168.XXX.XXX/share   /mnt/windows_share               cifs    username=ユーザー名,password=パスワード 0 0


続いて、共有フォルダのマウント確認と、切断されている場合は再マウントを試みるシェルスクリプトを作成する。
ちなみに、マウントの確認は一般ユーザーでマウントポイントに適当なファイルを touch してみて、成功したら接続されていると判断する。



後はこのスクリプトを root の cron で定期的に実行するようにしておけばOK

*/5 * * * * /root/mount_windows_share.sh 1> /dev/null

Ubuntu 11.04 Xmodmapが読み込まれない現象への対応

キーボードの Ctrl と CapsLock を入れ替える場合、通常は「システムの設定」 - 「キーボード」 - 「レイアウト」 - 「オプション」から 「Swap Ctrl and CapsLock」を選べばいい





別の方法として、ホームディレクトリに .Xmodmap というファイルを作成し、その中にキーを入れ替える設定を書いておけば、次回起動時に、


「modmapファイルを読み込みますか?」


みたいな事を聞いてきて、そこで設定をすれば万事解決する・・・はずだった・・・・


反映されない



なんで?



このように、設定したはずの .Xmodmap が読み込まれない場合は

1. Gnomeの設定エディタを起動する

Alt + F2 キーを押すとアプリケーションのランチャーが起動するので、そこで「gconf-editor」と入力し、設定エディタを起動する。

2. 設定エディタで以下の値を変更する

/desktop/gnome/peripherals/keyboard/general/update_handlers

この値が「.Xmodmap」となっていると思うので「$HOME/.Xmodmap」に変更する

これで、次回起動後は無事に設定ファイルが読み込まれるはず

VMware Playerのネットワーク接続がSymantec Endpoint Protectionによって切断される問題への対応

クライアントにSymatec Endpoint Protectionがインストールされた状態でVMwarePlayer上の仮想環境で
ネットワーク接続の方法を「ブリッジ接続」にすると、SEPが


「vmnetbridge.sysの通信を遮断しました」


みたいな警告メッセージを発してネットワークを切断してします。


随分前からこの問題には悩まされていたけど調べてもよく分からず、いつもNAT接続をしていたわけだけど、
今日やっと対応方法が分かりました。


どうやら原因はゲストOSのIPv6が有効になっているためのようです。
(何か変なパケットが飛んで、それが原因でブロックされてる?)


ゲストOSのIPv6を無効化することで無事にブリッジ接続出来るようになったので、以下を備忘録として残しておく。
(ちなみに、GUIのネットワーク設定からIPv6を無効にするだけではダメ)

How To Disable IPv6 Under Ubuntu 10.04/10.10/11.04

1.IPv6が有効になっているか確認する

$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
0

2.カーネルパラメーターでIPv6を無効にする

$ sudo vim /etc/sysctl.conf


net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

3.上で設定した内容を読み込ませる

sudo sysctl -p

4.IPv6が無効になっていることを確認する(ifconfigでも大丈夫)

$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
1


これで無事にゲストOSでブリッジ接続出来るようになった