ppt->pdf の変換をAmazon Linux上で実施する

はじめに

Amazon Linux上でppt->pdf変換をする為に、LibreOfficeを導入する手順を以下に記載する。 最新のAMIにてインスタンス起動後、パッケージを最新化し、依存関係のあるパッケージを追加インストールする。

環境

  • AMI version : amzn-ami-hvm-2015.03.0.x86_64-gp2

インストール対象

インストール手順

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。 コントローラ、モデルになるべく手は加えずに、新しいレイアウトをリクエストパスに応じてレイアウトを変更する。

環境

方法

メソッドの外では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

認証機能にDeviseを利用しているシステムで「Routing Error」によりサインアウトできない場合の対処

はじめに

最初に述べておくと、実はDeviseは何も関係ない。jqueryjquery_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メソッドが存在しないという事が分かった。

stackoverflow.com

後一歩だ。

jquery_ujs.jsが古いという事は、jquery-railsのバージョンが古いはず!と思ったのに、GemのバージョンはRails3系のもので問題なさそう。

qiita.com

こちらの記事を参考にしてみると、以下のメッセージがでた。

% 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」コマンドがなかったのでしょう。;-)