2013年10月3日木曜日

RailsBaseURIを指定したRailsアプリケーションでアイコンが消える問題

Railsアプリケーションをルートではなくサブディレクトリで動作させている場合、Apacheのhttpd.confにRailsBaseURIを指定する。 このときAssetのprecompileで生成されるパスが/assetとなっているために、例えばgifやpngなどのアイコンが画面から消えてしまう事象が発生した。

この問題を解決するにはAssetをprecompileする際にRAILS_RELATIVE_URL_ROOTという環境変数にRailsBaseURIに設定したパスを与えればよい。

たとえば

RailsBaseURI = /subdir
のときは
rake assets:precompile RAILS_ENV=production RAILS_RELATIVE_URL_ROOT="/subdir"

Capistranoでは以下のオプションを設定する。

set :asset_env, "#{asset_env} RAILS_RELATIVE_URL_ROOT=/subdir"

2012年10月27日土曜日

CloudStack 2.2.15のインストールパッケージを自作する

CloudStack 2.2系の最新版は2.2.15ということになっているらしい。このバージョンは以下の様な重要な変更点(詳しくはリリースノートを参照のこと)があるのでぜひともバージョンアップしておきたいと思うのだが一般には公開されないもののようだ。

ということでgitリポジトリからパッケージを自作してみることにした。なおOSはターゲットOS、ビルドOSともにCentOS 6.3を使用してる。

githubからソースコードを入手する

以下のコマンドでgithubからソースコードを入手する。

git clone https://github.com/CloudStack-extras/CloudStack-archive.git

カレントディレクトリにCloudStack-archiveというディレクトリが作成され、masterブランチのソースコードが展開されるはずだ。

以降CloudStack-archiveディレクトリで作業を行う。

ブランチを2.2.15に変更する

以下のコマンドで2.2.15のソースコードを展開する。

git checkout -b 2.2.15 TAG_CLOUDPLATFORM_2.2.15_GA2

TAG_CLOUDPLATFORM_2.2.15_GA2というタグが2.2.15のリリース版のハズ(正確なところはよくわからない)。

ビルドに必要なRPMパッケージをインストールする

waf viewrpmdepsというコマンドを実行すればコンパイルに必要なパッケージ一覧が得られる。これらのRPMをyumなりでインストールする。

[mas00 CloudStack-archive]$ ./waf viewrpmdeps
glibc-devel
gcc
commons-httpclient
java-1.6.0-openjdk-devel
rpm-build
ws-commons-util
tomcat6
MySQL-python
jpackage-utils
/usr/bin/mkisofs
'viewrpmdeps' finished successfully (0.001s)

RPMをビルドする

CloudStackのビルドスクリプトはターゲットOSをCentOS/RHEL/Ubuntuとそれぞれ区別して処理を行うように作られているが、CentOS用の処理は(JavaのCLASSPATHなど)色々とおかしいところがあるので、ビルドするOSがCentOSである場合、RHEL6であるように振る舞うように以下の様な変更を行う。

rm /etc/redhat-release
echo Red Hat Enterprise Linux Server release 6 > /etc/redhat-release
mv /etc/centos-release /etc/centos-release.orig

準備が出来たら早速ビルドする。

./waf rpm --package-version=2.2.15 --release-version=0.1

うまくビルドできればartifacts/rpmbuild/RPMS/x86_64にRPMパッケージが作成されているはずだ。

[mas00 CloudStack-archive]$ ls artifacts/rpmbuild/RPMS/x86_64
cloud-agent-2.2.15-0.1.el6.x86_64.rpm
cloud-agent-libs-2.2.15-0.1.el6.x86_64.rpm
cloud-agent-scripts-2.2.15-0.1.el6.x86_64.rpm
cloud-baremetal-agent-2.2.15-0.1.el6.x86_64.rpm
cloud-cli-2.2.15-0.1.el6.x86_64.rpm
cloud-client-2.2.15-0.1.el6.x86_64.rpm
cloud-client-ui-2.2.15-0.1.el6.x86_64.rpm
cloud-console-proxy-2.2.15-0.1.el6.x86_64.rpm
cloud-core-2.2.15-0.1.el6.x86_64.rpm
cloud-daemonize-2.2.15-0.1.el6.x86_64.rpm
cloud-deps-2.2.15-0.1.el6.x86_64.rpm
cloud-python-2.2.15-0.1.el6.x86_64.rpm
cloud-server-2.2.15-0.1.el6.x86_64.rpm
cloud-setup-2.2.15-0.1.el6.x86_64.rpm
cloud-test-2.2.15-0.1.el6.x86_64.rpm
cloud-usage-2.2.15-0.1.el6.x86_64.rpm
cloud-utils-2.2.15-0.1.el6.x86_64.rpm

インストールパッケージを使ってインストールする

ビルドされたRPMパッケージをそのままrpm -ivhしても良いのだが、yumを使用して依存RPM含めて一気にインストールしたい場合はCloudStackのインストールパッケージを借用する。

  1. CloudStack-2.2.14-1-rhel6.1.tar.gzをダウンロードして展開する
  2. CloudStack-2.2.14-1-rhel6.1/ossディレクトリにあるRPMを2.2.15のものに置き換える
  3. CloudStack-2.2.14-1-rhel6.1ディレクトリに移動し"createrepo -d ."を実行する
  4. CloudStack-2.2.14-1-rhel6.1/install.shを実行してインストールする

インストール後の注意点

2.2.14までエージェントのスレッド数の上限(DirectAgentPoolSize)は500とハードコーディングされていたが、2.2.15からdirect.agent.pool.sizeというグローバルコンフィグレーションパラメータでこの値を設定するようになっている。

ところがこの値のデフォルト値が1000となっており、Linuxのulimitを設定しない場合のプロセス上限を超えてしまうので、Out of memory例外を出してCloudStackが停止してしまう。インストール後速やかにこの値を1000以下(2.2.14と同様500で良いと思う)に設定する必要がある。

おそらくこのバグのad hocな対処が原因である。

2011年7月31日日曜日

間接照明を導入してみる

省エネでリラックス感があり、健康にも良いとされる間接照明を我が家でも導入してみたので、まとめてみたい。

まずはTVの裏の間接照明


TVの裏に間接照明を設置するのは、TVの眩しさを低減するという意味で目の健康に良いらしい。ってなことで、ホームシアターをやる人たちの間では間接照明の定番となっている。私もまずここから設置することにした。

TVの裏はあまりスペースがなく、また熱が発生すると色々と問題がある。よって直管型蛍光灯を照明として使用するのがもっとも適している。

軽く、大きくなく、値段が安いということで、日本グローバル照明の以下の製品を購入した。この製品には今回は使用していないが半分が反射板になっているカバーが付属している。直接光をコントロールしたい間接照明向きに作られているのだろう。こういう用途にはぴったりである。



設置の様子はこんな感じ。固定にはカーナビなどを固定するための自動車用の両面テープを使用している。

点灯すると、以下のような感じになる。

正面から見ると、こんな具合。

どうだろうか。まずまずの出来だと自画自賛している。

部屋全体をほんのり明るくする照明


TV裏の照明はこのような感じでいい雰囲気に仕上がったが、部屋が暗いままである。間接照明でほんのり明るくしてみたい。

直接光を用いず部屋を全体明るくするために、天井に照明を当てて反射光で部屋を明るくするという方法ある。こういう用途に使用できるのがアッパーライトだ。

アッパーライトとは、名前の通り天井を照らすための上向きの照明装置だ。直接光が目に入らないように、人間の目線より高い位置に設置するのが普通である。よって、形状としては170cm以上の棒状のスタンドの先に電球が上向きに付いているようなものが多い。

使用した製品は、この物ズバリではないのだが、以下のような製品である。


設置してみるとこんな感じ。

電球は白熱電球では電気代が怖いので電球型蛍光灯を使用している。最初東芝の製品を使っていたが、演色性に問題(全体的に緑がかる)があってオーム電機というメーカーの安価な製品に切り替えて使用している。といってもベストというわけではなく東芝よりマシというところ。電球についてはこれからもLED電球含め色々試してみたい。

TVの照明と組み合わせるとこんな感じだ。

間接照明のOn/Offはリモコンで


間接照明は複数の照明から構成されることが多い。これらの照明をいちいち手動でOn/Offしていたのではたまらない、ということで集中的にOn/Offするためのリモコンを使用している。

リモコンコンセントという以下のような製品である。


今は2灯をOn/Offするのみだが、800Wまで使用できるのでこれから何灯増えても間接照明のスイッチとしては困ることはなさそうである。

まとめ


以上のような感じで導入した間接照明。TVで映画を見ながらウィスキーをちびちびやるのは、なかなかのものである。

トータルのコストは5,000円程。この程度の出費でホテルのラウンジや喫茶店に居るようなリラックス感が得られるのだから安いものだ。

間接照明には副交感神経を刺激する効果があり健康にも良いとされているが、それはまたおいおい。

2011年2月11日金曜日

HomeBrewを使ってみる

HomeBrewは最近登場したMacOS X用パッケージマネージャ。同様なものにはMacPortsfinkがあるが、以下のような点はHomeBrew独特のものだ。

  • perlやrubyなどMacOS Xに最初からインストールされているものがあれば、積極的にそれを使用する。(例えばMacPortsはperlやrubyを必要とするパッケージがあれば、OSに入っているそれらを使わずに、わざわざMacPorts専用のperlやrubyをインストールするように作られている。)
  • パッケージのルール(Formulaと呼ぶ)がrubyで書かれる。
  • パッケージのインストール先として標準的な/usr/local/を使う。

これまではMacPortsのお世話になっていたが、MacPortsの複雑さ、OSにバイナリが存在するものまでいちいちコンパイルをしなければならない面倒さに何とかならないかと思っていたのでHomeBrewに移行してみることにした。

MacPortsのアンインストール

ガイドを参考に一気に

sudo port -f uninstall installed
sudo rm -rf \
    /opt/local \
    /Applications/DarwinPorts \
    /Applications/MacPorts \
    /Library/LaunchDaemons/org.macports.* \
    /Library/Receipts/DarwinPorts*.pkg \
    /Library/Receipts/MacPorts*.pkg \
    /Library/StartupItems/DarwinPortsStartup \
    /Library/Tcl/darwinports1.0 \
    /Library/Tcl/macports1.0 \
    ~/.macports

HomeBrewのインストール

Installationを参考にこのような感じで。

ruby -e "$(curl -fsSLk https://gist.github.com/raw/323731/install_homebrew.rb)"

パッケージのインストール

いつも使っているものを次々とインストール

brew install lv # などなど

FDcloneをインストールする

有ればあったで便利なファイラーFDcloneはHomeBrewのパッケージには存在しないが、HomeBrewならば簡単に追加することができる。

以下のようにアーカイブのURLを引数にcreateコマンドを実行する。

brew create http://hp.vector.co.jp/authors/VA012337/soft/fd/FD-3.00j.tar.gz

Formula名(パッケージ名)を聞かれるのでfdcloneと入力。

formula name [FD-3.00j]: fdclone
Warning: Version cannot be determined from URL.
You'll need to add an explicit 'version' to the formula.

エディタが開くのでFormulaファイルを編集する。とは言っても最初からある程度内容が自動的に記述されているので、必要に応じて変更・追加する程度。今回は以下のようにしてみた。

require 'formula'

class Fdclone <Formula
  url 'http://hp.vector.co.jp/authors/VA012337/soft/fd/FD-3.00j.tar.gz'
  homepage 'http://hp.vector.co.jp/authors/VA012337/soft/fd/'
  md5 '9e12c8a1480cc5f535bf6df852a0defc'
  version '3.00j'

  # depends_on 'cmake'

  def install
    system "make", "PREFIX=#{prefix}"
    system "make MANTOP=#{man} install"
    system "make MANTOP=#{man} jcatman"
  end
end

ここまでできたら、あとは普通にinstallコマンドを叩く。

brew install fdclone

気になった点

  • MacPortsでは可能だった日本語manが表示できない。MacPortsのGNU groffは日本語に対応しているが、MacOS Xのgroffは日本語に対応していない。従ってHomeBrewパッケージの日本語manも表示ができない。
  • sshfsが動かない。原因は今のところ不明。

2011年1月24日月曜日

Mac OS X Finderのディレクトリ名ローカライズを任意に設定する

MacOS XのFinderでは一部のディレクトリ名がローカライズされるようになっている。例えば以下のような感じ。

  • Applications⇛アプリケーション
  • Desktop⇛デスクトップ
  • Documents⇛書類

これらのディレクトリの実体は英語名で存在している。Finderはこのディレクトリの中に.localizeというファイルが存在することをチェックし、存在すれば上記のようにローカライズして表示するような仕組みになっている。

このようにローカライズされるディレクトリ名を任意に設定することも出来る。以下のファイルを編集する。

/System/Library/CoreServices/SystemFolderLocalizations/Japanese.lproj/SystemFolderLocalizations.strings

とりあえず以下のような行を追加してみた。

"Archives" = "アーカイブ";
"Temporary" = "テンポラリ";

あとはこのようなディレクトリを作成し、その中に.localizedを作成する。

mkdir Archives
touch Archives/.localized
mkdir Temporary
touch Temporary/.localized

killall Finder等でFinderを再起動するとこのようになる。

ちなみに実際のディレクトリは以下のとおりである。

[NO]imac[~]$ ls
Applications/ Documents/    Library/      Pictures/     Temporary/
Archives/     Downloads/    Movies/       Public/       bin/
Desktop/      Dropbox/      Music/        Sites/        src/

英語のディレクトリ名が日本語で表示されていることがおわかりだろうか。

2011年1月21日金曜日

昔のガラケーで録った動画をiPhotoに取り込む 

昔々Vodafon時代のシャープの携帯電話で撮った写真と動画をディスク上に発見した。2003〜2005年頃のモノのようだ。貴重な思い出の品なので、iPhoneやデジカメでそうしているように写真、動画共にiPhotoに取り込むことにしたが、動画だけは取り込むことができない。さてさて…。

まず動画のフォーマットを調べてみる。mediainfoの結果は以下のとおり。拡張子はASFである。

General
Complete name                    : MOL009.ASF
Format                           : Windows Media
File size                        : 428 KiB
Duration                         : 8s 717ms
Overall bit rate                 : 402 Kbps
Maximum Overall bit rate         : 458 Kbps
Encoded date                     : UTC 2005-05-03 04:46:58.000

Video
ID                               : 1
Format                           : MPEG-4 Visual
Codec ID                         : M4S2
Codec ID/Hint                    : Microsoft
Description of the codec         : ISO MPEG-4('M4S2')
Duration                         : 8s 733ms
Bit rate                         : 346 Kbps
Width                            : 320 pixels
Height                           : 240 pixels
Display aspect ratio             : 4:3
Frame rate                       : 15.000 fps
Color space                      : YUV
Chroma subsampling               : 4:2:0
Bit depth                        : 8 bits
Bits/(Pixel*Frame)               : 0.300
Stream size                      : 368 KiB (86%)

Audio
ID                               : 2
Format                           : ADPCM
Codec ID                         : 45
Codec ID/Info                    : G.726
Codec ID/Hint                    : Microsoft
Description of the codec         : G.726
Duration                         : 8s 717ms
Bit rate                         : 32.0 Kbps
Channel(s)                       : 1 channel
Sampling rate                    : 8 000 Hz
Bit depth                        : 4 bits
Stream size                      : 34.1 KiB (8%)

動画のフォーマットはiPhotoがサポートしているmovコンテナに乗りそうなので、ffmpegを使ってコンテナのみロスレス変換(ASF⇛MOV)してみることにした。

for i in *.ASF ; do ffmpeg -i $i  -acodec copy -vcodec copy ${i%.*}.mov; done

変換は終了したが、QuickTime Playerで再生しても音声が鳴らない。ADPCMはサポートしない?

今度は動画はそのままで、音声をAACにエンコードしてmovにしてみた。

for i in *.ASF ; do ffmpeg -i $i  -acodec libfaac -ac 1 -ab 48000 -vcodec copy ${i%.*}.mov; done

今度はうまくいったようだ。ちなみにオーディオのビットレート48000は、それ以上にするとエラーになるぎりぎりの値にしてある。

iPhotoに取り込む前にタイムスタンプを元の動画にそろえておこう。

for i in *.ASF ; do touch -r $i ${i%.*}.mov ; done

うまくiPhotoに取り込むことができた。目的達成である。

2011年1月15日土曜日

整備品Time Capsule 2TBを買った

宅急便で到着。何の変哲もないダンボールにTime Capsuleとケーブル、それとCDだけが入っている簡素包装っぷりに多少驚く。あのAppleの美しいデザインのケースが好きな人は整備品に手を出さないほうがいいかも知れない。

初期セットアップ

iMacに入っていたAirMacユーティリティでセットアップを行う。特に難しいことはない。うちの場合はアクセスポイントとしてセットアップを行うので、接続共有を「切(ブリッジモード)」で構成する。


ディスクの構成

これが悩みどころ。

Time CapsuleはAD連携のような気の利いた機能はないが、Time Capsuleにアクセスするアカウントを複数作成することができ、いわゆるNASのように使用することが出来る。しかしバックアップ用、NAS用と用途に応じてディスク使用量を(正規には)制限することができない。そうなると放っておけば際限なく増えていくTime MachineのバックアップがNAS領域を圧迫するため、NASとして使うかTime Machineバックアップ専用ストレージとして使うか。実質は二者択一である。

しばし悩んだがTime Machine専用として使うことにした。よく良く考えてみればiTunesのホームシェアリングやDropBoxのような便利な共有ソフトウェアのおかげで、個人的にNASのような手段でファイルを共有する用途を想像できないからだ。

設定は以下のようになる。アカウントを作成せず、iMacからのみアクセスする。


使い勝手、その他

バックアップストレージとしては13MB/sec程度のスループットがでるので概ね良好。無線LAN APとしても十分なスループットが出ており特に問題ない。

よくよく設定を見てみるとsyslog転送やSNMPの設定があったりして、なにげにSMBにも使えそうである。