有理数の定義は既知とします。 有理数でない実数を無理数といいます。
ここでは \( \sqrt{2} \) が無理数であることを証明します。
続きを読む 証明: \( \sqrt{2} \) は無理数有理数の定義は既知とします。 有理数でない実数を無理数といいます。
ここでは \( \sqrt{2} \) が無理数であることを証明します。
続きを読む 証明: \( \sqrt{2} \) は無理数Perl でメールを送信する方法を紹介します。 私はこの仕組みを、サーバの状態を必要な時にメールで通知するスクリプトなどで利用しています。 (参考: Perl の経験皆無の私が作ったサーバ監視スクリプト)
今回は2種類の環境でやってみました。
一番単純なサンプルコードを掲載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/usr/bin/perl use strict; use utf8; use warnings; use Digest::MD5; use Authen::SASL; use Net::SMTP; my $header = "From: from@sample.com"; $header .= "nTo: to@sample.com"; $header .= "nSubject: subject"; $header .= "nMIME-Version: 1.0"; $header .= "nContent-Type: text/plain; charset=UTF-8"; $header .= "nContent-Transfer-Encoding: Base64n"; $smtp = Net::SMTP->new('mail.sample.com', Port => 587); $smtp->auth('user@sample.com', 'password'); $smtp->mail('from@sample.com'); $smtp->to('to@sample.com'); $smtp->data(); $smtp->datasend($header); $smtp->datasend("n"); $smtp->datasend('message body'); $smtp->quit; |
パスワード認証をしない場合は、 Digest::MD5
も Authen::SASL
も必要ありません。 もちろん auth
と書いてある行も不要です。 しかし今回は CRAM-MD5 でパスワード認証をしているので、 モジュールが必要になります。 Net::SMTP
の auth
メソッド が Authen::SASL
を利用し、 Authen::SASL
の中で Digest::MD5
が利用されるという流れです。
Authen::SASL
が入ってないと auth
を実行しても認証がおこなわれません。 Digest::MD5
が入っていないと、 Error: No SASL mechanism found
と表示されます。
パスワードの認証方式は 自動で判別されています。 認証サーバで Digest-MD5 が有効であれば CRAM-MD5 よりも Digest-MD5 を優先的に使います。
そして、認証をするにはインストールしなければならないパッケージがあります。
Amazon Linux の場合、 MD5 のモジュールが入っているパッケージ perl-Digest-MD5 はあらかじめインストールされています。
perl は最初からインストールされていることが多く、 Net::SMTP
モジュール は最初から使えるのですが、 認証するとなると別途インストールが必要になります。
Passenger, Nginx で Rails を動かすこととなりました。 しかし、デフォルトのインストール方法ではレスポンスに不要なヘッダが含まれてしまいますので、これを除去するために モジュールを含めて nginx のコンパイル・インストールを行いました。 以下はその記録です。
ruby はインストールされているものとして進めます。
gem install passenger
を実行して、 Passenger をインストールします。
ここで root 権限 を使って passenger-install-nginx-module
とやれば、 nginx のインストールはできます。 nginx のソースをダウンロードしてコンパイルしてくれます。 しかし、その状態だと レスポンスヘッダに Nginx や Passenger の名前・バージョンが出力されます。
そういったヘッダを出力させないために、 モジュールを含めて Nginx をコンパイルする必要があります。
まずは Nginx と 必要なモジュールをダウンロードします。
sudo su -
で root ユーザ に変更して、 cd /usr/local/src
を実行します。
Nginx (tar.gz形式) をダウンロードします。 このとき最新の安定版だったのは Nginx 1.8.0 でした。 Nginx の公式ダウンロードページからダウンロードできます。
1 |
wget http://nginx.org/download/nginx-1.8.0.tar.gz |
ダウンロードができたら展開しておきます。
1 |
tar xvfz nginx-1.8.0.tar.gz |
シンプルな Nginx と Passenger で運用すると、 ヘッダに Nginx や Passenger のバージョン、 処理時間などが出力されます。 サーバの内側の情報をできるだけ外に出さないようにするために、 Nginx では headers-more-nginx-module というのを使って対処します。
こちらのモジュールは github から最新のバージョン(tar.gz形式)のURLを取得します。
リリース一覧ページ : Releases · openresty/headers-more-nginx-module
1 |
wget https://github.com/openresty/headers-more-nginx-module/archive/v0.261.tar.gz |
ダウンロードができたら展開しておきます。
1 |
tar xvfz v0.261.tar.gz |
展開後は、展開前のファイル名をわかりやすいものに変更しておきます。 Tab を使えば、 展開後のディレクトリ名を利用して(ある程度)簡単に入力できます。
1 |
mv v0.261.tar.gz headers-more-nginx-module-0.261.tar.gz |
インストールの際には 次のものが必要ですので、 ない場合はあらかじめインストールしておいてください。 なかったとしてもメッセージが表示されますので心配はいりません。
Nginx を過去に同じ場所に同じようにインストールしていた場合は、古い nginx 実行ファイル が nginx.old
という名前になります。
EC2 micro instance などを使っている場合で、 メモリが十分に無い場合(1GB以下の場合)はスワップ領域が必要になります。 root 権限 で次のコマンドを実行します。
1 2 3 4 |
sudo dd if=/dev/zero of=/swap bs=1M count=1024 chmod 644 /swap sudo mkswap /swap sudo swapon /swap |
メモリが足りないままインストールを実行した場合でも、インストール中に案内が表示されますので心配はいりませんが。
passenger-install-nginx-module
を実行します。 特にオプションは必要ありません。
1 |
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 というのがインストールされていなかったようで、 途中で自動的にダウンロードされました。
次にソースファイルの場所とオプションの入力が必要になります。 次のように入力しました。
/usr/local/src/nginx-1.8.0
--add-module=/usr/local/src/headers-more-nginx-module-0.261
--add-module
オプションを設定しています。 デフォルトで設定されるオプションはコンソール上に表示されます。最後の意志確認をされますので、 まちがっていなければ Enter を押します。 コンパイルとインストールが実行されます。
私は /opt/nginx/conf/nginx.conf.default
をコピーして /opt/nginx/conf/nginx.conf
を作って編集しました。 (もっときれいなやり方もあると思いますが。)
Rails を動かすだけなら 次のようにすれば OK です。 抜粋してサンプルを掲載します。 client_max_body_size
はクライアントからの画像アップロードのために設定しています。 (デフォルトでは1Mだそうです。) その他の設定値の意味は Phusion Passenger users guide, Nginx version などに説明がありますのでそちらをご参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
http { passenger_root /path/to/passenger-x.x.x; passenger_ruby /path/to/bin/ruby; server { location / { index index.html index.htm; client_max_body_size 10M; passenger_enabled on; root /var/rails/root/public; passenger_base_uri /var/rails/root; rails_spawn_method smart; rails_env development; # or production } } } |
そこにヘッダレスポンス変更のための記述を追加します。
1 2 3 4 5 6 |
http { more_clear_headers Server; more_clear_headers ETag; more_clear_headers X-Powered-By; more_clear_headers X-Runtime; } |
設定が間違っていないことを次のコマンドでチェックします。 エラーが表示されなければ OK です。
1 |
/opt/nginx/sbin/nginx -t |
再起動のときには /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 で 営業日だけ処理をしたいということはないでしょうか。 営業日のみ朝のメール配信をしてほしい、そのほかにも、 週末だけ処理をしたいが金曜が祝日の場合はその前の日に処理をするなどがあります。 そういった祝日を考慮する場合の Script を考えました。
トリガを設定して平日にスクリプトが実行されるようにした上で、以下のコードを追加します。
別の書き方をすれば、営業日のみ処理をする場合のことです。 Google Calendar を利用して 祝日を取得します。
処理の始めに次のコードを追加します。
1 2 3 4 5 6 7 8 9 |
var currentDate = new Date(); var weekday = currentDate.getDay(); if (weekday == 0 || weekday == 6) { return; } var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) { return; } |
日曜と土曜の場合は処理を中断し、 Google が用意している日本の祝日カレンダーに祝日予定が入っている場合にも処理を中断します。 曜日の選択はトリガの設定でも可能です。
もちろんこれを boolean を返すメソッドにするのもいいと思います。
もし、会社で 創業記念日・設立記念日 なども休みになっている場合は、 会社の特別休日カレンダーを作成して 処理を追加します。 getCalendarById
の引数となるカレンダーIDは、 Google Calendar の該当のカレンダーについてカレンダー設定の画面を開くと確認できます。
Slack に 毎日自動で天気予報を投稿するスクリプトを書きました。 Google Apps Script を使いました。 Google Apps Script なので、 祝日または休日だったら投稿しないという分岐もできます。 (参考: 営業日だけ処理を実行したい場合)
Slack で Incoming Webhooks の URL を取得しておきます。