まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2017/01

この記事の続きです:


IBM LinuxONE コミュニティクラウド上に作った仮想サーバーにいわゆる "LAMP"(=Linux + Apache HTTPD + MySQL + PHP) 環境を構築してみます。まずは上記記事を参考に仮想サーバーを作り、SSH でリモートログインします:
2017010403


ミドルウェアの導入作業を伴うため、ルート権限を持ったユーザーにスイッチしておきます:
$ sudo /bin/bash
#


LAMP 環境に必要なミドルウェアや言語環境をまとめて導入します(赤字はコメント):
# yum install httpd -y (Apache HTTP サーバー)
# yum install mysql-server mysql -y (MySQL)
# yum install php php-mbstring php-mysql php-gd php-pear php-xml php-devel -y (PHP)

また以下は LAMP 環境構築においては必須ではありませんが、使うことも多いというか、あると便利だと思うので必要に応じて導入しておいてください:
# yum install screen -y (screen)
# yum install git -y (git)
# yum install java-1.8.0-ibm-devel -y (JDK 1.8)

ミドルウェアを起動する前にファイアウォールの設定を行います。デフォルトの LinuxONE では iptables によるファイアウォールが有効になっており、このままでは http(s) によるアクセスができません。今回の環境では iptables を無効にしておきましょう:
# /etc/init.d/iptables stop
# chkconfig iptables off

あらためて各ミドルウェアを起動し、また自動起動設定をしておきます:
# /etc/init.d/httpd start
# /etc/init.d/httpd mysqld
# chkconfig httpd on
# chkconfig mysqld on
# exit
$

この時点で Apache HTTP サーバーが動いています。iptables の解除が成功していれば http://(IPアドレス)/ にアクセスすることができるようになっているはずです:
2017010601


さて、MySQL に関しては root のパスワードを設定しておきましょう。この例では P@ssw0rd というパスワードにしていますが、ここは必要に応じて変えてください:
$ mysql -u root

mysql> set password for root@localhost=PASSWORD('P@ssw0rd');
mysql> exit

これで LinuxONE 上でも LAMP の環境が作れました! ちなみに PHP のバージョンは 5.3.3 が導入できます:
$ php -v
PHP 5.3.3 (cli) (built: Dec 15 2015 04:50:47)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

メインフレーム(IBM z Systems)の Linux 環境である LinuxONE を無料で 120 日間試用できる IBM LinuxONE コミュニティクラウドを紹介します:
https://developer.ibm.com/linuxone/


なお、この記事は 2015 年 12 月に公開したこの記事に似ていますが、いくつか変更点があるため、内容を 2017 年1月時点の最新版にして書き直したものです:
LinuxONE Community Cloud を使う


予定としては、この LinuxONE コミュニティクラウドを使って、cakePHP が動く環境を構築する所までの一通りの手順を紹介しようと思っています。とりあえず今回は同環境にユーザー登録してサーバーを申し込み、そのサーバーにアクセスするまでの手順を紹介します。


まず、ユーザー登録を行うため、IBM LinuxONE Community Cloud にアクセスし、トップページの "Request your trial" と書かれたボタンをクリックします(Ubuntu 環境を選択する場合のみ右側の "Test drive it now" ボタンをクリックします):
2017010401


LinuxONE の申込画面に移動します。ここでは名前や住所、メールアドレスなどを英語で入力していきます。一番下のテキスト欄には申込みの利用目的を記載してください:
2017010402


画面下にスクロールし、2箇所のチェックボックスにチェックを入れます。そして SMS を受け取れる(つまり手元にある)携帯電話の番号を入力します。国番号は日本の "81" を選択し、電話番号の最初の 0 を除いた番号( 080 で始まる場合であれば 80 から)を記載して、"Get Code" ボタンをクリックします:
2017010403


しばらくすると、指定した携帯電話の SMS に数字の登録コードが送られてきます:
IMG_0163


先程の画面に戻り、入手した登録コードを "Get code" ボタンの右にあるフィールドに入力して "Request your trial" ボタンをクリックします:
2017010404


暫く待つと、指定したメールアドレスに登録結果が送られてきます。成功していると、LinuxONE コミュニティクラウドへのリンクと、ログイン時に指定する User ID (メールアドレス)およびパスワードが記載されています。これでサインアップは完了です:
2017010405


では IBM LinuxONE コミュニティクラウドにログインしてみましょう。メールで送られてきた URL にブラウザでアクセスし、サインイン画面が表示されたらメールで受け取った User ID とパスワードを入力して、"Sign in" ボタンをクリックします:
2017010406


正しくログインできると以下のようなトップ画面に移動します。今回はここから仮想サーバーを作成したいので、Virtual Servers の "Manage Instances" と書かれたボタンをクリックします:
2017010401


最初の段階ではまだサーバーが1つも存在してないはずなので、以下のような画面になります(作成後は簡易ステータス画面になります)。それでは LinuxONE のインスタンスを作成するため、この画面の "Create" ボタンをクリックします:
2017010402


Step 1 では最初にインスタンス名、次にその説明文を入力します。その下の Step 2 では OS のイメージを選択します(この図では RHEL 6.7 を選択していますが、SuSE Linux も含めて好きなディストリビューション/バージョンを選んでください):
2017010403


その下の Step 3 ではサーバースペックを選択します。そして Step 4 ではログイン時に利用する SSH 鍵を指定します。鍵ペアのファイルを手元に持っている場合はそれをアップロードしていただいても構いません。ここでは新規に作成する前提で紹介しますので "Create" をクリックします:
2017010404


鍵の名前を入力し、"Create a new key pair" ボタンをクリックします:
2017010405


PEM 形式の秘密鍵ファイルのダウンロードが始まるので、これを保存してください:
2017010406


作成した鍵は画面から選択できるようになっているはずです。この鍵を選んで、最後に "Create" ボタンをクリックしてください:
2017010407


元の画面に戻ります。先程はサーバーインスタンスが1つも存在していなかったのですが、作成したサーバーが準備されています(この時点ではまだ準備中です):
2017010408


数分待ってステータス(Status)欄が Active に変わるとサーバーインスタンスが準備完了です。IP Address 欄を見ると、このサーバーの IP アドレスが表示されていることも確認できます:
2017010409


ではこのサーバーにリモートログインしてみましょう。SSH クライアントを使って、確認した IP アドレスに接続します(図は Windows の Tera Term):
2017010401


認証ではユーザー名に "linux1" を指定します。パスフレーズはなしで、鍵ファイルに先程ダウンロードしたファイルを指定します:
2017010402


IBM LinuxONE コミュニティクラウドのサーバーにログインできました!
2017010403


念のため /proc/cpuinfo を cat してみます。アーキテクチャが IBM/S390 になっていて、メインフレームサーバーが使われていることがわかります:
2017010404


以前試した時は DNS の設定が不十分だったりして、ここから更にネットワークの環境設定が必要だったりしたのですが、現在ではそういったこともなく、このまま利用開始できるサーバーとなっています。

(注 2017/Jan/11 追記)
現在でも LinuxONE コミュニティクラウドの RHEL6 では DNS の設定が不充分でした。 /etc/sysconfig/network-scripts/ifcfg-eth0 の最後に以下の1行を加えるなりして、DNS サーバーを手動で設定する必要があります:
  :
  :
DNS1=8.8.8.8

この LinuxONE の環境は 120 日間使える仮想サーバーなので、色々な使い勝手があります。次回以降で LAMP としての環境構築も含めて紹介する予定です。



2017 年もよろしくお願いします。 m(__)m

さて、2017年1月1日は日曜日でした。ということは2017年1月はいきなり「13日の金曜日」を迎えることになります。

13日の金曜日は「不吉の象徴」のように言われていますが、ではこの「13日の金曜日」はどのくらい珍しいのでしょうか? 2017年の(コードの)書き初めの意味でプログラミングで調べてみることにしました。

調べる内容は「13日は何曜日になることが多いのか?」を調べて、その中で金曜日が平均とくらべてどの程度珍しいのか/珍しくないのかを調べてみることにします。

この計算をするには、うるう年を意識する必要があります。くわしくはウィキペディアあたりを調べていただきたいのですが、うるう年は400年周期で計算する必要があります。簡単に説明すると、こんなルールです:
 (1) 4 年に一度(西暦で 4 で割り切れる年)がうるう年である
 (2) ただし 100 でも割り切れる年は例外としてうるう年ではない
 (3) ただし 400 でも割り切れる年は例外の例外としてうるう年である

というわけで、今回は西暦 2000 年 1 月から、西暦 2399 年 12 月まで、一ヶ月毎に各 13 日が何曜日になっているのかを調べることにします。そして各曜日ごとに何回ずつ発生していたのかを最終的に出力します。こういうことはプログラミングが手っ取り早いですよね。今回は PHP を使うことにしました。以下の内容を f13.php という名前で保存します:
<?php

//. タイムゾーンを設定
date_default_timezone_set('Asia/Tokyo');

//. 配列を初期化
$w = array(7);
for( $i = 0; $i < 7; $i ++ ){
  $w[$i] = 0;
}

//. 2000年1月から2399年12月までの13日が何曜日か調べる
for( $y = 2000; $y < 2400; $y ++ ){
  for( $m = 1; $m <= 12; $m ++ ){
    $t = mktime( 0, 0, 0, $m, 13, $y );
    $n = date( 'w', $t );
    $w[$n] ++;
  }
}

//. 結果を出力
for( $i = 0; $i < 7; $i ++ ){
  echo( "w[$i] = $w[$i]\n" );
}
?>

最後に結果を出力しますが、配列の 0 番目が日曜日、 1 番目が月曜日、2 番目が火曜日、・・・という出力結果になります。つまり金曜日は 5 番目です。

また 400 年間(400 x 12 = 4800 ヶ月間)で7つの結果に振り分けられるので、仮に平坦化されているとすると、4800 / 7 = 685.71... なので、各曜日ごとに 685 回から 686 回現れることになります。

さて、実行結果はというと・・・
# php -f f13.php
w[0] = 687
w[1] = 685
w[2] = 685
w[3] = 687
w[4] = 684
w[5] = 688
w[6] = 684

400 年間の中で 688 回の 13 日の金曜日が見つかったことになります。金曜日は平均以上どころか最頻出曜日だったことがわかりました。


というわけで、「『13 日の金曜日』は滅多にない不吉な日」ではなく、「13 日といえば金曜日」といえるほど、最も頻出のパターンだったことになります。


このページのトップヘ