「コード」カテゴリーアーカイブ

AngularJS と Rails の form_for を組み合わせる


AngularJS と Rails の form_for を組み合わせて使ってみました。 何より厄介なのは action 属性 が 自動でついてしまうことです。

環境

  • Rails 4.1.8
  • Ruby 2.2.2
  • AngularJS 1.4.7
  • Ubuntu 15.04

状況

Rails の form_for を使うと、 Rails が action 属性 から すべて 設定してくれます。 もちろん、 form タグ の属性を 追加することもできます。 ただし AngularJS を使う上では問題がありました。

問題になるのは次のコードです。

このコードでは、 ボタンをクリックすると AngularJS による処理が実行された後で 本来の form の処理が実行されます。

AngularJS は、 action 属性 がないときは 本来の form の処理を行わないのですが、 Rails で action 属性 が自動でつけられている以上どうしようもありません。 いや、 action 属性 を消す方法があるのかもしれませんが、 私は見つけることができませんでした。

解決法

form タグ に onsubmit="return false;" を付け加えます。

button タグ で type="button" とすると、 ボタンクリック時はどうにか二重処理を防げますが、 入力欄で Enter を押されたときは防げません。

また AngularJS: How to prevent form submission after click on button? に記載されているような方法もありますが、 javascript として 他のところで使えないので、 上に書いたやり方の方がきれいに見えます。


Perl でメールを送信する方法


Perl でメールを送信する方法を紹介します。 私はこの仕組みを、サーバの状態を必要な時にメールで通知するスクリプトなどで利用しています。 (参考: Perl の経験皆無の私が作ったサーバ監視スクリプト)

環境

スクリプトを実行するコンピュータ

今回は2種類の環境でやってみました。

ケース1

  • Ubuntu 15.04
  • Perl 5.20.2

ケース2

  • EC2 Amazon Linux 2015.03
  • Perl 5.16.3

SMTPサーバ

  • EC2 Amazon Linux 2015.03
  • Postfix
    • CRAM-MD5 でパスワード認証を行う。

コード

一番単純なサンプルコードを掲載します。

パスワード認証をしない場合は、 Digest::MD5Authen::SASL も必要ありません。 もちろん auth と書いてある行も不要です。 しかし今回は CRAM-MD5 でパスワード認証をしているので、 モジュールが必要になります。 Net::SMTPauth メソッド が Authen::SASL を利用し、 Authen::SASL の中で Digest::MD5 が利用されるという流れです。

Authen::SASL が入ってないと auth を実行しても認証がおこなわれません。 Digest::MD5 が入っていないと、 Error: No SASL mechanism found と表示されます。

パスワードの認証方式は 自動で判別されています。 認証サーバで Digest-MD5 が有効であれば CRAM-MD5 よりも Digest-MD5 を優先的に使います。

そして、認証をするにはインストールしなければならないパッケージがあります。

  • Ubuntu の場合
    • libdigest-hmac-perl
    • libauthen-sasl-perl
  • Amazon Linux の場合
    • perl-Authen-SASL

Amazon Linux の場合、 MD5 のモジュールが入っているパッケージ perl-Digest-MD5 はあらかじめインストールされています。

perl は最初からインストールされていることが多く、 Net::SMTP モジュール は最初から使えるのですが、 認証するとなると別途インストールが必要になります。


Passenger と Nginx で Rails を動かす インストール手順


Passenger, Nginx で Rails を動かすこととなりました。 しかし、デフォルトのインストール方法ではレスポンスに不要なヘッダが含まれてしまいますので、これを除去するために モジュールを含めて nginx のコンパイル・インストールを行いました。 以下はその記録です。

環境

  • Ruby 2.2.2
  • Nginx 1.8
  • Passenger 5.0.18
  • EC2 Amazon Linux 2015.03

手順

ruby はインストールされているものとして進めます。

  1. Passenger の インストール
  2. Nginx のインストール
    • Nginx 及び 必要なモジュールのダウンロード
    • コンパイル・インストール
  3. nginx の設定
  4. nginx の再起動 (または起動)

Passenger のインストール

gem install passenger を実行して、 Passenger をインストールします。

Nginx のインストール

ここで root 権限 を使って passenger-install-nginx-module とやれば、 nginx のインストールはできます。 nginx のソースをダウンロードしてコンパイルしてくれます。 しかし、その状態だと レスポンスヘッダに Nginx や Passenger の名前・バージョンが出力されます。

そういったヘッダを出力させないために、 モジュールを含めて Nginx をコンパイルする必要があります。

Nginx 及び 必要なモジュールのダウンロード

まずは Nginx と 必要なモジュールをダウンロードします。

sudo su - で root ユーザ に変更して、 cd /usr/local/src を実行します。

Nginx のダウンロード

Nginx (tar.gz形式) をダウンロードします。 このとき最新の安定版だったのは Nginx 1.8.0 でした。 Nginx の公式ダウンロードページからダウンロードできます。

ダウンロードができたら展開しておきます。

headers-more-nginx-module のダウンロード

シンプルな Nginx と Passenger で運用すると、 ヘッダに Nginx や Passenger のバージョン、 処理時間などが出力されます。 サーバの内側の情報をできるだけ外に出さないようにするために、 Nginx では headers-more-nginx-module というのを使って対処します。

こちらのモジュールは github から最新のバージョン(tar.gz形式)のURLを取得します。

リリース一覧ページ : Releases · openresty/headers-more-nginx-module

ダウンロードができたら展開しておきます。

展開後は、展開前のファイル名をわかりやすいものに変更しておきます。 Tab を使えば、 展開後のディレクトリ名を利用して(ある程度)簡単に入力できます。

コンパイル・インストール

インストールの際には 次のものが必要ですので、 ない場合はあらかじめインストールしておいてください。 なかったとしてもメッセージが表示されますので心配はいりません。

  • C コンパイラ (/usr/bin/cc)
  • C++ コンパイラ (/usr/bin/c++)
  • wget または curl
  • SSL をサポートしている curl の development header
  • Openssl development header
  • Zlib development header
  • rake, rack, ruby development header, rubygems

Nginx を過去に同じ場所に同じようにインストールしていた場合は、古い nginx 実行ファイル が nginx.old という名前になります。

スワップ領域

EC2 micro instance などを使っている場合で、 メモリが十分に無い場合(1GB以下の場合)はスワップ領域が必要になります。 root 権限 で次のコマンドを実行します。

メモリが足りないままインストールを実行した場合でも、インストール中に案内が表示されますので心配はいりませんが。

passenger-install-nginx-module を実行します。 特にオプションは必要ありません。

ここからインストールが始まります。

まずは 処理の説明が表示され、 Press Enter to continue, or Ctrl-C to abort. と表示されます。 Enter を押して続行します。 途中で()めたくなったら いつでも Ctrl-C を押せば止められます。

続いて Which languages are you interested in? と表示されるので 必要なものを画面の指示にしたがって選択し、 Enter を押します。

インストールされているソフトウェアのチェックが終わると、Do you want this installer to download, compile and install Nginx for you? と、 インストール方法を聞かれます。 ソースからコンパイルを行うので 2. No: I want to customize my Nginx installation. (for advanced users) を選びます。

また、 私の場合は PCRE というのがインストールされていなかったようで、 途中で自動的にダウンロードされました。

次にソースファイルの場所とオプションの入力が必要になります。 次のように入力しました。

Where is your Nginx source code located?
/usr/local/src/nginx-1.8.0
nginx のソースの場所です。
Where do you want to install Nginx to?
デフォルトのまま何も入力せず Enter を押しました。
nginx のインストール先です。
Extra Nginx configure options
--add-module=/usr/local/src/headers-more-nginx-module-0.261
nginx をコンパイルする際のオプションです。 headers-more-nginx-module を使用するため、 --add-module オプションを設定しています。 デフォルトで設定されるオプションはコンソール上に表示されます。

最後の意志確認をされますので、 まちがっていなければ Enter を押します。 コンパイルとインストールが実行されます。

nginx の設定

私は /opt/nginx/conf/nginx.conf.default をコピーして /opt/nginx/conf/nginx.conf を作って編集しました。 (もっときれいなやり方もあると思いますが。)

Rails を動かすだけなら 次のようにすれば OK です。 抜粋してサンプルを掲載します。 client_max_body_size はクライアントからの画像アップロードのために設定しています。 (デフォルトでは1Mだそうです。) その他の設定値の意味は Phusion Passenger users guide, Nginx version などに説明がありますのでそちらをご参照ください。

そこにヘッダレスポンス変更のための記述を追加します。

設定が間違っていないことを次のコマンドでチェックします。 エラーが表示されなければ OK です。

Nginx の再起動 (または起動)

再起動のときには /opt/nginx/sbin/nginx -s reload とやることが多いのですが、 今回はそれではうまくいきませんでした。

/opt/nginx/sbin/nginx -s stop で nginx を止めてから /opt/nginx/sbin/nginx を実行するとうまくいきました。

初めて起動する場合は /opt/nginx/sbin/nginx のみ実行すれば OK です。


Google Apps Script : 営業日だけ処理を実行したい場合


Google Apps Script で 営業日だけ処理をしたいということはないでしょうか。 営業日のみ朝のメール配信をしてほしい、そのほかにも、 週末だけ処理をしたいが金曜が祝日の場合はその前の日に処理をするなどがあります。 そういった祝日を考慮する場合の Script を考えました。

トリガを設定して平日にスクリプトが実行されるようにした上で、以下のコードを追加します。

祝日・休日を除いて処理をする

別の書き方をすれば、営業日のみ処理をする場合のことです。 Google Calendar を利用して 祝日を取得します。

処理の始めに次のコードを追加します。

日曜と土曜の場合は処理を中断し、 Google が用意している日本の祝日カレンダーに祝日予定が入っている場合にも処理を中断します。 曜日の選択はトリガの設定でも可能です。

もちろんこれを boolean を返すメソッドにするのもいいと思います。

もし、会社で 創業記念日・設立記念日 なども休みになっている場合は、 会社の特別休日カレンダーを作成して 処理を追加します。 getCalendarById の引数となるカレンダーIDは、 Google Calendar の該当のカレンダーについてカレンダー設定の画面を開くと確認できます。

続きを読む Google Apps Script : 営業日だけ処理を実行したい場合

毎日自動で Slack に天気予報を投稿するためのスクリプト


Slack に 毎日自動で天気予報を投稿するスクリプトを書きました。 Google Apps Script を使いました。 Google Apps Script なので、 祝日または休日だったら投稿しないという分岐もできます。 (参考: 営業日だけ処理を実行したい場合)

方針

  • 天気予報の取得は Open Weather Map を使用する。
  • Script は CoffeeScript を使用して記述する。
  • Slack へは、 Incoming WebHooks を利用して投稿する。
  • Google Apps Script を使って自動で定期的に実行します。

準備

Slack で Incoming Webhooks の URL を取得しておきます。

続きを読む 毎日自動で Slack に天気予報を投稿するためのスクリプト