ppt->pdf の変換をAmazon Linux上で実施する
はじめに
Amazon Linux上でppt->pdf変換をする為に、LibreOfficeを導入する手順を以下に記載する。 最新のAMIにてインスタンス起動後、パッケージを最新化し、依存関係のあるパッケージを追加インストールする。
環境
- AMI version : amzn-ami-hvm-2015.03.0.x86_64-gp2
インストール対象
- Libre Office 4.4.5.2 (URL:http://ftp.yz.yamagata-u.ac.jp/pub/tdf/libreoffice/stable/4.4.5/rpm/x86_64/LibreOffice_4.4.5_Linux_x86-64_rpm.tar.gz)
インストール手順
1.Libreofficeの安定版のダウンロード
[ec2-user@HOSTNAME ~]$ sudo wget http://ftp.yz.yamagata-u.ac.jp/pub/tdf/libreoffice/stable/4.4.5/rpm/x86_64/LibreOffice_4.4.5_Linux_x86-64_rpm.tar.gz --2015-07-30 15:49:58-- http://ftp.yz.yamagata-u.ac.jp/pub/tdf/libreoffice/stable/4.4.5/rpm/x86_64/LibreOffice_4.4.5_Linux_x86-64_rpm.tar.gz ftp.yz.yamagata-u.ac.jp (ftp.yz.yamagata-u.ac.jp) をDNSに問いあわせています... 133.24.255.153, 2001:df0:25e:e100::2 ftp.yz.yamagata-u.ac.jp (ftp.yz.yamagata-u.ac.jp)|133.24.255.153|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 229543691 (219M) [application/x-gzip] `LibreOffice_4.4.5_Linux_x86-64_rpm.tar.gz' に保存中 LibreOffice_4.4.5_Linux_x86-64_rpm.tar. 100%[=================================================================================>] 218.91M 10.4MB/s 時間 17s 2015-07-30 15:50:15 (13.2 MB/s) - `LibreOffice_4.4.5_Linux_x86-64_rpm.tar.gz' へ保存完了 [229543691/229543691] [ec2-user@HOSTNAME ~]$ ls -l 合計 224168 -rw-r--r-- 1 root root 229543691 7月 26 20:45 LibreOffice_4.4.5_Linux_x86-64_rpm.tar.gz
2.LibreOfficeインストール
[ec2-user@HOSTNAME ~]$ tar xvzf LibreOffice_4.4.5_Linux_x86-64_rpm.tar.gz [ec2-user@HOSTNAME ~]$ cd LibreOffice_4.4.5.2_Linux_x86-64_rpm/RPMS [ec2-user@HOSTNAME RPMS]$ ls -l 合計 227896 -rw-rw-r-- 1 ec2-user ec2-user 2009269 7月 22 23:35 libobasis4.4-base-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 10512363 7月 22 23:35 libobasis4.4-calc-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 136276871 7月 22 23:39 libobasis4.4-core-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 5840 7月 22 23:34 libobasis4.4-draw-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 90267 7月 22 23:35 libobasis4.4-en-US-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 24592 7月 22 23:34 libobasis4.4-en-US-base-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 53113 7月 22 23:39 libobasis4.4-en-US-calc-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 17581 7月 22 23:35 libobasis4.4-en-US-math-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 198259 7月 22 23:35 libobasis4.4-en-US-res-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 2578 7月 22 23:39 libobasis4.4-en-US-writer-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 272463 7月 22 23:35 libobasis4.4-extension-beanshell-script-provider-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 607734 7月 22 23:34 libobasis4.4-extension-javascript-script-provider-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 2967421 7月 22 23:35 libobasis4.4-extension-mediawiki-publisher-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 1126661 7月 22 23:39 libobasis4.4-extension-nlpsolver-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 911712 7月 22 23:35 libobasis4.4-extension-pdf-import-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 3454117 7月 22 23:39 libobasis4.4-extension-report-builder-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 49135 7月 22 23:39 libobasis4.4-filter-data-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 516463 7月 22 23:34 libobasis4.4-gnome-integration-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 3819458 7月 22 23:39 libobasis4.4-graphicfilter-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 10498395 7月 22 23:34 libobasis4.4-images-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 1101371 7月 22 23:35 libobasis4.4-impress-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 135292 7月 22 23:39 libobasis4.4-kde-integration-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 127168 7月 22 23:34 libobasis4.4-librelogo-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 528172 7月 22 23:34 libobasis4.4-math-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 119110 7月 22 23:39 libobasis4.4-ogltrans-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 175537 7月 22 23:39 libobasis4.4-onlineupdate-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 17938837 7月 22 23:35 libobasis4.4-ooofonts-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 2535 7月 22 23:40 libobasis4.4-ooolinguistic-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 1576354 7月 22 23:39 libobasis4.4-postgresql-sdbc-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 12591 7月 22 23:39 libobasis4.4-python-script-provider-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 11134454 7月 22 23:40 libobasis4.4-pyuno-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 5355887 7月 22 23:35 libobasis4.4-writer-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 448351 7月 22 23:35 libobasis4.4-xsltfilter-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 458249 7月 22 23:39 libreoffice4.4-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 2150 7月 22 23:40 libreoffice4.4-base-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 2149 7月 22 23:35 libreoffice4.4-calc-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 6573937 7月 22 23:34 libreoffice4.4-dict-en-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 1381515 7月 22 23:39 libreoffice4.4-dict-es-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 2236196 7月 22 23:39 libreoffice4.4-dict-fr-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 2151 7月 22 23:34 libreoffice4.4-draw-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 7701 7月 22 23:35 libreoffice4.4-en-US-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 6500542 7月 22 22:11 libreoffice4.4-freedesktop-menus-4.4.5-2.noarch.rpm -rw-rw-r-- 1 ec2-user ec2-user 2177 7月 22 23:34 libreoffice4.4-impress-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 2150 7月 22 23:34 libreoffice4.4-math-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 4029793 7月 22 23:34 libreoffice4.4-ure-4.4.5.2-2.x86_64.rpm -rw-rw-r-- 1 ec2-user ec2-user 2169 7月 22 23:34 libreoffice4.4-writer-4.4.5.2-2.x86_64.rpm [ec2-user@HOSTNAME RPMS]$ rm libobasis4.4-gnome-integration-4.4.5.2-2.x86_64.rpm [ec2-user@HOSTNAME RPMS]$ sudo yum install *.rpm 読み込んだプラグイン:priorities, update-motd, upgrade-helper libobasis4.4-base-4.4.5.2-2.x86_64.rpm を調べています: libobasis4.4-base-4.4.5.2-2.x86_64 … インストール: libobasis4.4-base.x86_64 0:4.4.5.2-2 libobasis4.4-calc.x86_64 0:4.4.5.2-2 libobasis4.4-core.x86_64 0:4.4.5.2-2 libobasis4.4-draw.x86_64 0:4.4.5.2-2 libobasis4.4-en-US.x86_64 0:4.4.5.2-2 libobasis4.4-en-US-base.x86_64 0:4.4.5.2-2 libobasis4.4-en-US-calc.x86_64 0:4.4.5.2-2 libobasis4.4-en-US-math.x86_64 0:4.4.5.2-2 libobasis4.4-en-US-res.x86_64 0:4.4.5.2-2 libobasis4.4-en-US-writer.x86_64 0:4.4.5.2-2 libobasis4.4-extension-beanshell-script-provider.x86_64 0:4.4.5.2-2 libobasis4.4-extension-javascript-script-provider.x86_64 0:4.4.5.2-2 libobasis4.4-extension-mediawiki-publisher.x86_64 0:4.4.5.2-2 libobasis4.4-extension-nlpsolver.x86_64 0:4.4.5.2-2 libobasis4.4-extension-pdf-import.x86_64 0:4.4.5.2-2 libobasis4.4-extension-report-builder.x86_64 0:4.4.5.2-2 libobasis4.4-filter-data.x86_64 0:4.4.5.2-2 libobasis4.4-graphicfilter.x86_64 0:4.4.5.2-2 libobasis4.4-images.x86_64 0:4.4.5.2-2 libobasis4.4-impress.x86_64 0:4.4.5.2-2 libobasis4.4-kde-integration.x86_64 0:4.4.5.2-2 libobasis4.4-librelogo.x86_64 0:4.4.5.2-2 libobasis4.4-math.x86_64 0:4.4.5.2-2 libobasis4.4-ogltrans.x86_64 0:4.4.5.2-2 libobasis4.4-onlineupdate.x86_64 0:4.4.5.2-2 libobasis4.4-ooofonts.x86_64 0:4.4.5.2-2 libobasis4.4-ooolinguistic.x86_64 0:4.4.5.2-2 libobasis4.4-postgresql-sdbc.x86_64 0:4.4.5.2-2 libobasis4.4-python-script-provider.x86_64 0:4.4.5.2-2 libobasis4.4-pyuno.x86_64 0:4.4.5.2-2 libobasis4.4-writer.x86_64 0:4.4.5.2-2 libobasis4.4-xsltfilter.x86_64 0:4.4.5.2-2 libreoffice4.4.x86_64 0:4.4.5.2-2 libreoffice4.4-base.x86_64 0:4.4.5.2-2 libreoffice4.4-calc.x86_64 0:4.4.5.2-2 libreoffice4.4-dict-en.x86_64 0:4.4.5.2-2 libreoffice4.4-dict-es.x86_64 0:4.4.5.2-2 libreoffice4.4-dict-fr.x86_64 0:4.4.5.2-2 libreoffice4.4-draw.x86_64 0:4.4.5.2-2 libreoffice4.4-en-US.x86_64 0:4.4.5.2-2 libreoffice4.4-freedesktop-menus.noarch 0:4.4.5-2 libreoffice4.4-impress.x86_64 0:4.4.5.2-2 libreoffice4.4-math.x86_64 0:4.4.5.2-2 libreoffice4.4-ure.x86_64 0:4.4.5.2-2 libreoffice4.4-writer.x86_64 0:4.4.5.2-2 依存性関連をインストールしました: libXdamage.x86_64 0:1.1.3-4.7.amzn1 libXfixes.x86_64 0:5.0.1-2.1.8.amzn1 libXinerama.x86_64 0:1.1.2-2.7.amzn1 libXxf86vm.x86_64 0:1.1.3-2.1.9.amzn1 libdrm.x86_64 0:2.4.52-4.12.amzn1 libpciaccess.x86_64 0:0.13.1-4.1.11.amzn1 mesa-dri-drivers.x86_64 0:10.1.2-2.32.amzn1 mesa-dri-filesystem.x86_64 0:10.1.2-2.32.amzn1 mesa-dri1-drivers.x86_64 0:7.11-8.7.amzn1 mesa-libGL.x86_64 0:10.1.2-2.32.amzn1 mesa-libGLU.x86_64 0:10.1.2-2.32.amzn1 完了しました!
3.変換に必要な依存パッケージのインストール
[ec2-user@HOSTNAME ~]$ yum list | grep cups-libs cups-libs.i686 1:1.4.2-67.21.amzn1 amzn-updates cups-libs.x86_64 1:1.4.2-67.21.amzn1 amzn-updates [ec2-user@HOSTNAME ~]$ sudo yum install cups-libs 読み込んだプラグイン:priorities, update-motd, upgrade-helper 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ cups-libs.x86_64 1:1.4.2-67.21.amzn1 を インストール … インストール: cups-libs.x86_64 1:1.4.2-67.21.amzn1 依存性関連をインストールしました: avahi-libs.x86_64 0:0.6.25-12.17.amzn1 gnutls.x86_64 0:2.8.5-14.13.amzn1 jbigkit-libs.x86_64 0:2.0-11.4.amzn1 libtiff.x86_64 0:4.0.3-20.20.amzn1 完了しました! [ec2-user@HOSTNAME ~]$ yum list | grep dbus-glib dbus-glib.i686 0.86-6.10.amzn1 amzn-main dbus-glib.x86_64 0.86-6.10.amzn1 amzn-main dbus-glib-devel.x86_64 0.86-6.10.amzn1 amzn-main [ec2-user@HOSTNAME ~]$ sudo yum install dbus-glib 読み込んだプラグイン:priorities, update-motd, upgrade-helper 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ dbus-glib.x86_64 0:0.86-6.10.amzn1 を インストール … インストール: dbus-glib.x86_64 0:0.86-6.10.amzn1 完了しました!
4.変換
[ec2-user@HOSTNAME ~]$ /opt/libreoffice4.4/program/soffice.bin --headless --convert-to pdf test.pptx convert /home/ec2-user/test.pptx -> /home/ec2-user/test.pdf using filter : impress_pdf_Export
参考URL
Resque 1.x系 のキューイング中のジョブ一覧を取得する
キューイング中のジョブ一覧はResqueモジュールのpeekメソッドを利用する。
※GithubのResqueプロジェクトのソースを参照 github.com
peekメソッドは以下の3つの引数をとる。
- 第1引数:一覧を取得したいキューの名前(Workerの@queueで指定するもの)
- 第2引数:キューの情報を取得する位置を指定
- 第3引数:第2引数で指定した位置から取得するジョブの数を指定
peekメソッドのソースには、 pagerと連携する為に利用できる旨がコメントとして記載されていた。
今回は任意のジョブ一覧ではなく全てのジョブ一覧が欲しいので、 第2引数に0、第3引数にはジョブの配列サイズを指定する。
以下サンプル。
_queue_name = "sample_queue" queuing_jobs = Resque.peek(_queue_name, 0, Resque.size(_queue_name)) queuing_jobs = [queuing_jobs] unless queuing_jobs.instance_of?(Array) queuing_jobs.each do |j| # ジョブに渡された引数の取得 arg0 = j["args"][0] arg1 = j["args"][1] … # do something... end
キューに存在するジョブが1件の場合、戻り値が配列ではなくなるので、 ジョブ一覧に対して反復処理をする前提の場合は、サンプルの様に必ず配列として扱えるように型を合わせるような工夫が必要。
もう少し細かい制御をしたい場合は、redisメソッドで取得できるredisのコネクションを利用する。
例えばキューイングされたジョブをピンポイントで取得したい場合は、
Resque.redis.lindex(インデックス番号)
とインデックス番号(0から始まる正数)を指定すれば良い。
Shellの関数内でインタラクティブに得た文字列を戻り値として利用する方法
結論から述べると、「標準エラー出力を利用する」が答えである。が、備忘録もかねてその答えにたどり着いた経緯も含めて以下に記す。
Shellにおける関数では戻り値をとる場合、return文が利用できる。しかしこのreturn文、引数に0-255の正数しかとる事ができない。しかもこの戻り値を取得するには、関数を呼び出した後に$?変数(特殊変数)にアクセスする必要がある。
$ cat hoge.sh #!/bin/sh # # define fuction. ######################################### hoge(){ ### do something... if エラー発生; then return 1 else return 0 fi } # # main. ######################################### hoge if [ $? -ne 0 ]; then echo "エラー!!" else echo "正常終了" fi
高級言語になれている人は、とても扱いづらいと思うのではないだろうか。というか、自分は扱いづらいと思った。
でも実際には文字列を返すテクニックも存在する。ネットを調べるとすぐに出てくるが、「関数呼び出しをバックコートで行い、echo」を利用するというものだ。
$ cat fuga.sh #!/bin/sh # # define fuction. ######################################### fuga(){ ### do something... if エラー発生; then echo "エラー!!" return 1 else echo "正常終了" return 0 fi } # # main. ######################################### msg=`fuga` echo $msg
これができれば全て解決、問いいたいところだが、このfuga関数内ではmsg変数に代入したい文字列以外標準出力する事ができない。
しかし変数に代入される文字列は「標準出力されたもの」が対象である。従って「標準エラー出力」をうまく利用すれば、関数内でインタラクティブに文字列を取得し、戻り値として返す事ができるのではないかと考えた。
$ cat piyo.sh #!/bin/sh # # define fuction. ######################################### decho(){ echo "$1" 1>&2 } get_string(){ decho "input> \c" while read val; do if [ "$val" != "" ]; then break fi decho "input> \c" done echo "$val" } # # main. ######################################### return_val=`get_string` echo $return_val
以下実行結果。
$ ./piyo.sh input> <Enter> input> <Enter> … input> piyo piyo
上記の手法により標準入力から任意の文字列を取得し、表示するといった処理を関数内にまとめ、戻り値に取得した文字列を渡すという処理が実現できた。 (サンプルではshellのようにEnterのみが押された場合は、処理を終えずに次の入力待ちをするようにしている。)
以下のように出力を使い分ける事がポイントだ。
- 標準エラー出力 : 対話用の出力用として利用
- 標準出力 : 戻り値用として利用
ネットを調べても上記の方法を紹介しているサイトは見つからなかった。同じ悩みを持つ人の一助になればと思う。
リクエストのパスに応じてレイアウトを変更する
概要
既存のシステムの機能はそのままで異なるレイアウトを平行運用したい場合のTips。 コントローラ、モデルになるべく手は加えずに、新しいレイアウトをリクエストパスに応じてレイアウトを変更する。
環境
- rails 3.2.11
方法
メソッドの外ではrequest変数にアクセスできないため、コントローラに適用するlayoutにシンボルを定義し、遅延評価させる。
% bundle exec rake routes … hoge_root GET /hoge(.:format) hoge#index … hoge2_root GET /hoge2(.:format) hoge#index …
% cat hoge_controller.rb class HogeController < ApplicationController layout :hoge_layout def index end … private def hoge_layout if request.fullpath.split("/")[1] == 'hoge2' 'hoge2' else 'hoge' end end end
参考URL
- ruby/rails/RailsGuidesをゆっくり和訳してみたよ/Layouts and Rendering in Rails - 株式会社ウサギィwiki ※「2.2.13.2 実行時でのレイアウトの選択」参照
認証機能にDeviseを利用しているシステムで「Routing Error」によりサインアウトできない場合の対処
はじめに
最初に述べておくと、実はDeviseは何も関係ない。jqueryとjquery_ujsのバージョンには気をつけろというお話。
環境
Gemfileの中身は以下の通り。
gem 'rails', '3.2.11' gem 'devise', '3.2.4' gem 'jquery-rails', '3.1.0'
問題
ある画面でリンクを用意し、そのリンクを押下してサインアウトしようとすると、、、
<a href="/users/sign_out" data-method="delete" rel="nofollow">サインアウト</a>
以下の「Routing Error」がでてしまう。
No route matches [GET] "/users/sign_out"
ルーティングを見てみると、
% bundle exec rake routes | grep sign_out destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
サインアウトはDELETEメソッドで呼び出す必要がある事が分かる。 エラーの通りGETで呼び出してしまっている事が問題という事が分かった。
またもう一つの事実として 問題はjquery1.10.2をロードしている画面のみで発生しており、 少し古いjquery1.6.2をロードしている画面では発生しない(サインアウトできる)ことが分かった。
TwitterのBootstapを利用する為に新しいjqueryを導入する必要があった訳だが、思わぬところでつまずいてしまった。
調査
Railsでは現在GET/POSTしかないHTTPでCRUD操作を実現する為に、formのinputタグのnameに「_method」を指定する。
CRUDのD(DELETE)を行う場合は<input name="_method" type="hidden" value="delete" />
と指定する。
http://guides.rubyonrails.org/form_helpers.html
今回の問題が発生したのはaタグで生成したリンクだが、実はこのリンクは押下時にformタグに置き換えられている。
これを実現しているのは、jquery_ujs.jsというスクリプトでGemの「jquery-rails」によってインストールされる。
linkClickSelectorメソッド内で呼び出されるhandleMethodメソッド内でリンクがformタグに置き換わっている事が分かる。
「data-method」で「delete」と指定していれば<input name="_method" value="delete" type="hidden" />
と置き換わる。
… $(rails.linkClickSelector).live('click.rails', function(e) { var link = $(this); if (!rails.allowAction(link)) return rails.stopEverything(e); if (link.data('remote') !== undefined) { rails.handleRemote(link); return false; } else if (link.data('method')) { rails.handleMethod(link); return false; } }); … handleMethod: function(link) { var href = link.attr('href'), method = link.data('method'), csrf_token = $('meta[name=csrf-token]').attr('content'), csrf_param = $('meta[name=csrf-param]').attr('content'), form = $('<form method="post" action="' + href + '"></form>'), metadata_input = '<input name="_method" value="' + method + '" type="hidden" />'; if (csrf_param !== undefined && csrf_token !== undefined) { metadata_input += '<input name="' + csrf_param + '" value="' + csrf_token + '" type="hidden" />'; } form.hide().append(metadata_input).appendTo('body'); form.submit(); } …
原因
ここまで調査して、ようやくブラウザのデバッグ用コンソールに以下のメッセージが出力されている事に気付く。
[Error] TypeError: undefined is not a function (evaluating '$(rails.linkClickSelector).live') (anonymous 関数) (jquery_ujs.js, line 266)
最初はlinkClickSelectorがないと言われているのかと思ったが、「liveメソッドがない」という事だった。 調べていくと、jquery1.9以降にliveメソッドが存在しないという事が分かった。
後一歩だ。
jquery_ujs.jsが古いという事は、jquery-railsのバージョンが古いはず!と思ったのに、GemのバージョンはRails3系のもので問題なさそう。
こちらの記事を参考にしてみると、以下のメッセージがでた。
% bundle exec rails g jquery:install deprecated You are using Rails 3.1 with the asset pipeline enabled, so this generator is not needed. The necessary files are already in your asset pipeline. Just add `//= require jquery` and `//= require jquery_ujs` to your app/assets/javascripts/application.js If you upgraded your app from Rails 3.0 and still have jquery.js, rails.js, or jquery_ujs.js in your javascripts, be sure to remove them. If you do not want the asset pipeline enabled, you may turn it off in application.rb and re-run this generator.
まとめると、以下を行えば良さそうだ。
- Rails3.1でasset pipelineがenableの場合、このコマンドでjsをインストールする必要がある。
- app/assets/javascripts/application.jsに「//= require jquery」および「//= require jquery_ujs」を追記する。
- Rails3.0からアップグレードした場合、jquery.js/rails.js/jquery_ujs.jsを削除しなければならない。
対処
今回の問題は asset pipelineを有効にしていても、app/assets/javascripts配下に古いバージョンのjsが存在するとそちらを優先する為に発生していたようだ。 古いバージョンのjsを削除し、以下のように設定すると問題なく動作した。
% cat app/assets/javascripts/application.js // Place your application-specific JavaScript functions and classes here // This file is automatically included by javascript_include_tag :defaults // //= require 'jquery_ujs'
% cat app/views/layouts/hoge.html.erb <head> … <%= stylesheet_link_tag 'bootstrap_flatly/bootstrap.css' %> <%= stylesheet_link_tag 'bootstrap_flatly/usebootstrap.css' %> <%= stylesheet_link_tag 'bootstrap_flatly/dashboard.css' %> <%= stylesheet_link_tag 'bootstrap_flatly/sticky-footer-navbar.css' %> <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> <!--[if lt IE 9]> <%= javascript_include_tag 'bootstrap_flatly/html5shiv.js' %> <%= javascript_include_tag 'bootstrap_flatly/respond.min.js' %> <![endif]--> <%= javascript_include_tag 'https://code.jquery.com/jquery-1.10.2.min.js' %>★←jqueryはapplication.js内ではロードさせない <%= javascript_include_tag 'bootstrap_flatly/bootstrap.min.js' %> <%= javascript_include_tag 'bootstrap_flatly/usebootstrap.js' %> <%= javascript_include_tag 'jquery-ui-1.8.16.custom.min.js' %> <%= javascript_include_tag 'jquery.inputtips-1.0.0-min.js' %> <%= javascript_include_tag :application %>★←application.jsのロード … </head>
上記は参考までにBootstrapのflatlyというテーマとダッシュボード用のテーマを導入した際にロードしたcssとjs。 Bootstrapのテーマが古いjqueryだと動作しないため、application.jsでjquery.jsをロードしないように注意が必要。
ansible-playbookの適用ホストを制限する
ansible-playbookの適用ホストを制限する方法。
% ansible-playbook -l ホスト名 playbookファイル名
実際にどのホストが有効になっているか確認するのであれば、
% ansible-playbook -l ホスト名 --list-hosts playbookファイル名
とすれば良い。
マニュアルですぐに見つけれなかったので、備忘録としてメモ。
http://docs.ansible.com/intro_patterns.html
「ホスト名」の所は、ホストグループから特定のホストを除外するなど、柔軟な表現が可能。
lsコマンドのパーミッションを数字形式で表示する
個人的な技術メモから抜粋シリーズ(シリーズ化するのか!?)第1弾。
見慣れている人でも注意深くみないと間違えやすいlsコマンドのパーミッション。 数字形式での表示をlsがサポートしていればいいのだが、類似するコマンドもない。 ということで、ls -lの行頭にあるパーミッションを数値で拡張表現してくれるperlスクリプトを作成した。
1行目にも数値が表示されるのはご愛嬌。
#!/bin/perl # # define functions. # sub retSnum($$){ my $w = shift; my $f = shift; my $n = 0; if(($f eq 'U') && ($w eq 's' || $w eq 'S')){ $n = 4; } if(($f eq 'G') && ($w eq 's' || $w eq 'S')){ $n = 2; } if(($f eq 'S') && ($w eq 't' || $w eq 'T')){ $n = 1; } return $n; } sub retPnum($){ my $w = shift; my $n = 0; if($w eq 'r'){ $n = 4; } if($w eq 'w'){ $n = 2; } if($w eq 'x'){ $n = 1; } if($w eq 's'){ $n = 1; } if($w eq 't'){ $n = 1; } return $n; } # # main procedure. # while(<>){ chomp; my $unit1 = 0; my $unit2 = 0; my $unit3 = 0; my $unit4 = 0; my $i = 0; foreach $w (split //, $_) { if($i > 9) { break; } if(1 <= $i && $i <=3 ) { $unit1 += retSnum($w,'U'); $unit2 += retPnum($w); } if(4 <= $i && $i <=6 ) { $unit1 += retSnum($w,'G'); $unit3 += retPnum($w); } if(7 <= $i && $i <=9 ) { $unit1 += retSnum($w,'S'); $unit4 += retPnum($w); } $i++; } printf("%d%d%d%d %s\n", $unit1, $unit2, $unit3, $unit4, $_); }
以下、実行結果。
% ls -l /usr/bin/sudo | ./perm2num.pl 4511 -r-s--x--x 1 root wheel 164896 10 31 15:51 /usr/bin/sudo
setuid、setgid、sticky bitにも対応してます。
このスクリプトを書いたのは数年前だけど、 今調べたら「stat」コマンドなるものでもっと簡単に実現できそう。 なぜ当時はこれを書いたのか? おそらく普段業務で利用するSolaris10には「stat」コマンドがなかったのでしょう。;-)