2013年3月アーカイブ

RMagickを使って画像Exif位置情報を10進値に変換

iPhoneやAndroid携帯で撮影した写真にはGPSによる位置情報を付けることができます。最近ではGPSに対応したデジタル一眼レフカメラも普通にあるようですしサービスを作る上で利用したいですね。

ImageMagickコマンドで確認

Exifの位置情報はどんな風に格納されているのかImageMagickを使って見てみましょう。

$ identify -verbose ~/Desktop/image.jpg  | grep itude
exif:GPSAltitude: 9509/501
exif:GPSAltitudeRef: 0
exif:GPSLatitude: 35/1, 3850/100, 0/1
exif:GPSLatitudeRef: N
exif:GPSLongitude: 139/1, 4497/100, 0/1
exif:GPSLongitudeRef: E

どうやら60進数の文字列として格納されてそうです。

#ちなみにこの位置は昨日のお昼ご飯のお弁当なので会社の場所です。うちじゃないですよ(笑)

Rubyでハンドリング

RailsからアクセスするとなるとRMagickを使うのが楽そうです。

Google Mapsなどを使って表示しようとすると10進のFloatの方が扱いやすそうですので変換してみます。緯度経度の値の中に文字列表記の除算が出てきますが、RubyにはRationalライブラリが含まれているのでFloatに変換する直前までRationalで行けば楽チンで誤差も最小限。

Google Mapsで確かめて見ましょう。


大きな地図で見る

iPhoneのGPSなので少しずれてますが10m程度でした。

おまけ

日本では必要ないはずですが、世界をにらんだサービスであればGPSLatitudeRefとGPSLongitudeRefも見て調整する必要があるようです。

ownCloudをCentOS 6.2にセットアップして自分だけのDropbox

Dropbox++

Dropboxは激しく便利ではあるのですが現在、私の無料で使える容量は7.25GB。十分とはいえ、いつも気にしながら使わないと溢れる容量です。

本来の用途では使ってないのですがCamera Uploadsボーナス早期ベータ テスト期間で増えた容量5GBはありがたかった。現在は最大の追加は3GBみたいです。

Bitcasa(10GB!)など他の選択肢も増えてきましたが、もっと!(欲張り...)

それなりのサービスが欲しかったら課金しなさいですよね...ごもっともです(-ω-)

Dropboxですと毎月約$10で100GB。いいですね。たしかに高いというほどではない。バックアップもされているでしょうから安いくらいでしょうか。

しかしネットに繋がってさえいれば複数のMacで常に同期された状態のディスクスペースって、技術的にはそれほど難しくないよな〜自分のアカウントのS3を使って出来るんじゃね? (Dropboxと同程度の正確性は難しいかもですが) ていうかあるに違いないと探してみるとS3じゃないけど、すぐひとつ見つかった。

ownCloud

インストール

さっそく試してみるのです。

このブログを運用しているVPSサーバを借りているのでそこにインストールします。ディスクは150GB以上余っていますから、これが使えれば私のMBAのSSD容量以上なので十分すぎます。

http://owncloud.org/install/ の.tar Archiveボタンをクリックするとダウンロードのための簡単な説明が表示されますのでリンクのURLをコピーして、

cd /path/to/work
wget http://download.owncloud.org/community/owncloud-5.0.0.tar.bz2
tar jxvf owncloud-5.0.0.tar.bz2

表示されているownCloud Administrators Manualリンクに飛ぶと、PHPが必要とのこと。自分では全く使わないので入っていない。そこから入れます(汗)

sudo yum install php php-gd php-xml php-intl

セットアップ

必要な道具は揃ったのでいよいよownCloudのセットアップをします。

sudo mv owncloud /path/to/htdocs/
cd /path/to/htdocs/owncloud
chown -R www:www app config

chownコマンドは自分の環境でhttpdが動かしているユーザを指定してください。

http://www.iwazer.com/owncloud/ にアクセスするとエラー(-ω-)

Apacheのログを確認すると

owncloud/.htaccess: ErrorDocument not allowed here

と出てました。.htaccessを使えない様です。権限を変えるのが面倒だったので、この.htaccessファイルをApacheのconf.dにコピーして読み込ませちゃいます。

sudo mv -p .htaccess /path/to/conf.d/owncloud.conf
sudo /etc/init.d/httpd restart

こんどは、ページが表示されましたが、まだ足らないようです。

ここに書かれている設定を行います。

sudo mkdir data
sudo chown www:www data
sudo yum install php-mysql php-mbstring php-pdo
sudo /etc/init.d/httpd restart

MySQLはもともと入っていたのですがパッケージのバージョンが合わなかったので、yumから入れ直しました。その際、パッケージリポジトリとしてremiを使いましたが、手順はCentOS6 で remi から php や mysql をインストールするための yum の設定を参照しました。

はたして...

adminアカウントとすべきユーザ名とパスワードを入力すれば、アカウント作成&ログインします。

クライアントアプリ

Desktop appボタンをクリックしてMac Client(WindowsPCの方はそちらを)をダウンロードしてインストールします。

インストールしたowncloudアプリを起動すると、サーバへの接続設定ダイアログが表示されます。

さすがにhttpでは不安だったのでSSLにしました。自分しか使わないのでもちろんオレオレ証明書です。オレオレですよ警告は出ますが接続できました。

HomeフォルダにownCloudというフォルダが作成されていると思います。そこにファイルやディレクトリをコピーしてみると...メニューバーのアイコンがDropboxのようにクルクルはじめた!!

同期が終わったらしいのでブラウザからも確認してみると、ちゃんと同期されているようです。Dropboxに比べると少し遅いかなという印象でした。

もう一台で同期を試す

もう一台のロートルMacBookにもインストールして、こんどはダウンロード側を試してみました。

...だがしかし...いくら待っても同期される気配なし(-ω-)古いMacなのでOSがSnow Leopardで止まってるのですが、一応サポート対象ではあります。ずいぶん時間が経ってからSync Directory Statusがエラーになったり正常に戻ったりとイマイチな感触(笑)

まだこの状態ではDropboxから移行するわけにはいかないですが、ownCloudはオープンソースなのでGithubにリポジトリがあります!

https://github.com/owncloud

直せちゃいますね!(PHPかぁ...)

最後に

容量を気にせずに自分のための同期フォルダを持てるownCloudは非常に便利そうです。

じつはownCloudはファイルの同期だけではなく、というかそれは機能のごく一部で、音楽やカレンダーや連絡先をも同期するクラウドサービスなのです。いやクラウドの定義が微妙だけど、ネットの向こう側にデータがあるという意味で。

まだ使い始めたばかりですので後日またレポートしようと思います。

Railsコンソールを使ってコントローラのなかで色々試す

Railsのコントローラの中ではいろいろなヘルパーメソッドが使えますが、コードを書く際にRailsコンソールを起動してトライアンドエラーで試してみたいことがよくあります。

今まではrails serverを起動してソースコードに一時的にdebuggerやbinding.pryを記述することで停止させていたのですが、一時的でもソースコードにすぐ不要になるコードを書くのは気持ち悪いものですし、うっかりcommit、pushしてしまうとかなりしょんぼりです。

ソースコードを書き換えずにRailコンソールから止める方法を考えてみました。

Rails consoleからdebuggerを起動してブレークポイントを設定する

ここまでは簡単です。

$ bundle exec rails c
> debugger
(rdb:1) b HomeController.index
(rdb:1) c
>

最後にc(ontinue)コマンドでデバッガから抜けてconsoleに戻っています。

コントローラを呼ぶリクエストを実行する

続いて目的のコントローラを実行します。Railsコンソールにはappヘルパーがあって、直接リクエストを呼ぶことができます。HomeController#indexがrootにルーティングされているなら、getメソッドを使って

> app.get '/'
Breakpoint 1 at HomeController:index
/path/to/repository/app/controllers/home_controller.rb:8
def index
(rdb:1) 

これで、Controller内のconsoleで実験できるようになりました。

コントローラの中でコンソールを使ってみる

例えばクッキーを操作するcookiesヘルパーを試してみます。

(rdb:1) p cookies.signed[:hoge] = ['a','b','c']
["a", "b", "c"]
(rdb:1) p cookies[:hoge]
"BAhbCEkiBmEGOgZFVEkiBmIGOwBUSSIGYwY7AFQ=--3dd62e6bec43666604256e897ca65b925d4bb7f1"
(rdb:1) p cookies.signed[:hoge]
["a", "b", "c"]
(rdb:1) 

この方法ならステージング環境のRailsコンソールでもいろいろな確認ができそうです。

新しいRailsアプリを作りたくてRMagickをインストールしようとしたらImageMagickが見つからないと怒られた。

経験上これは使おうとしたRMagickのバージョン2.13.2に対してインストールされているImageMagickのバージョンが古い時になる。おそらく新しいImageMagickをHomebrewで入れてあげればうまくいくはず。

Install Specific Version of Tool With Home Brew にやり方が載っていました。

まずはHomebrewが認識しているパッケージを最新に更新します。

$ cd$(brew --prefix)
$ brew update

現在は6.7.7-6がインストールされているのですがはたして...

$ brew versions imagemagick
6.8.0-10 git checkout 45a4978 Library/Formula/imagemagick.rb
6.7.7-6 git checkout 834ce4a Library/Formula/imagemagick.rb
6.7.5-7 git checkout f965101 Library/Formula/imagemagick.rb
  :

より新しい6.8.0-10が登録されています。

先程のversionsでリストされた対象バージョンのgitコマンドを実行するとインストールできるようになります。

$ git checkout 45a4978 Library/Formula/imagemagick.rb
$ brew install imagemagick
Error: imagemagick-6.7.7-6 already installed
To install this version, first `brew unlink imagemagick'

あら?エラー。6.7.7-6があるのでインストール先からunlinkするように言われています。

$ brew unlink imagemagick
Unlinking /usr/local/Cellar/imagemagick/6.7.7-6... 65 links removed

再びインストール実行。

$ brew install imagemagick
==> Installing imagemagick dependency: freetype
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/freetype-2.4.11.mountain_lion.bottle
######################################################################## 100.0%
==> Pouring freetype-2.4.11.mountain_lion.bottle.tar.gz
   /usr/local/Cellar/freetype/2.4.11: 57 files, 2.5M
==> Installing imagemagick
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/imagemagick-6.8.0-10.mountainlion.bo
Already downloaded: /Library/Caches/Homebrew/imagemagick-6.8.0-10.mountainlion.bottle.tar.gz
==> Pouring imagemagick-6.8.0-10.mountainlion.bottle.tar.gz
   /usr/local/Cellar/imagemagick/6.8.0-10: 1422 files, 45M

無事インストールされました。確認してみます。

$ brew list imagemagick
/usr/local/Cellar/imagemagick/6.8.0-10/bin/Wand-config
/usr/local/Cellar/imagemagick/6.8.0-10/bin/stream
 :

さて、新しく作るアプリはこれでいいとして、既存のをメンテしたくなったらどうするの?という疑問が浮かびますね。そちらのRMagickもバージョンアップするというのも手ですが依存ライブラリの関係上難しいこともあるでしょう。

そんなときのためにHomebrewでインストールされているパッケージはバージョンを切り替えることができます。

$ brew switch imagemagick 6.7.7-6
Cleaning /usr/local/Cellar/imagemagick/6.7.7-6
Cleaning /usr/local/Cellar/imagemagick/6.8.0-10
65 links created for /usr/local/Cellar/imagemagick/6.7.7-6

これで、前のバージョンが使えるようになりました。戻すのも同様にbrew switch <package name> <version>ですよ。

このアーカイブについて

このページには、2013年3月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2013年2月です。

次のアーカイブは2013年4月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。