Perlがくしゅう帳(Rubyも)

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_で活動しています。 最近は主にPerl関連の勉強会やコミュニティに参加しています。移転前のブログはこちら->http://ruby.doorblog.jp/

続・さくらVPS+CentOS7で、独自ドメインのウェブサイトを公開するまでの道のり〜https編〜

前回の記事で、無事nginxのリバースプロキシを利用した、さくらVPS + Centos7環境でのwebサイトを公開をすることができました。

さて、次の一歩として、サーバー証明書を導入してhttpsアクセス出来るようにするチャレンジです。

サーバー証明書

今回は無料の Let's Encrypt を使ってみようと思います。この証明書は、LineBotでも使える証明書となっているので、ゆくゆくはこのサーバーでLineBotも作ってみようかというのが最終的な野望です。

Let's Encrypt は、日本語の解説ページもあり、言われる通りすすめるだけでインストールができました。

Let's Encrypt の使い方 - Let's Encrypt 総合ポータル

sudo ls -la /etc/letsencrypt/live/tomcha.net/
# で確認すると、以下のリンクが出来ていました。

cert.pem -> ../../archive/tomcha.net/cert1.pem
privkey.pem -> ../../archive/tomcha.net/privkey1.pem

nginxの設定

前回、nginx.conf で、listen 80; とか書いた感じを、 listen 443;で書いたのを追加すればいいのかなーと予想してみる。

ググッて参考にしたページがこちら。ほぼ予想通りだった。

nginx で ssl 設定をする | dogmap.jp

証明書、鍵のリンクが自分の環境とは異なっているので、その部分は書き換えてnginx.confを修正。

sudo vim /etc/nginx/nginx.conf

書き足した内容は

server {
    listen 443 default ssl;
    ssl on;
    # サーバ証明書(サーバ証明書に中間CA証明書を連結したもの)
    ssl_certificate      /etc/letsencrypt/live/tomcha.net/cert.pem;
    # 秘密鍵
    ssl_certificate_key  /etc/letsencrypt/live/tomcha.net/privkey.pem;  

    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:8080;
        }
    }
}

ngnxをRestartして....

sudo service nginx restart

ブラウザからhttpsで開いてみると...

httpsでアクセスできたーーーー!!証明書キターーーーー!

f:id:tomcha0079:20160803205724p:plain

さくらVPS+CentOS7で、独自ドメインのウェブサイトを公開するまでの道のり

SakuraVPSで独自ドメイン運用しているwebサイト、CentOS6からCentOS7に再インストールしてからずっと放置していたので、作業したこと、詰まったことメモ。

やりたい事は、

  1. http://tomcha.net へのアクセスで、独自サイトを表示。
  2. 独自サイトはSinatra + Passenger で動かす。
  3. httpsも出来るように、証明書を設置。証明書はLet's Encryptを使う。
  4. ポートフォワード(前回はiptables,今回はfirewalledを使用)以外に、nginx にもちょっと手を出してみる。

やったこと手順

sinatra + passenger でwebアプリを実行

bundle exec passenger start -p 80 -d

な、なんといきなりエラーががが。どうもポート80で起動すると怒られる。
色々ググってみると、CentOS7では、1024より若いポートで何かするにはroot権限が必要みたい&&怒られる様。

ポート80が駄目だったので、任意のポート(記事の例は5000番)で実行して80番へのアクセスから飛ばす作戦。

bundle exec passenger start -p 5000 -d

80番ポートと443番ポートで外からアクセス出来るように設定。

# 開いてるPublicゾーンのポートの確認
firewall-cmd --list-ports --zone=public
# ポートを開ける
firewall-cmd --add-port=80/tcp --zone=public --permanent
firewall-cmd --add-port=443/tcp --zone=public --permanent
# 設定を有効化
firewall-cmd --reload

80番ポートへのアクセスを5000番ポートに投げる設定。CentOS7から使われているfirewalledを使った設定。

# public ゾーンのポートフォワードを確認
firewall-cmd --zone=public --list-forward-ports
#public ゾーンで TCP80,443の通信をTCP:5000へ投げる設定
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=5000
firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=5000

firewalledのポートフォワードでの転送ではなく、nginxのリバースプロキシで制御する方法

  • nginxのステータス確認方法
sudo service nginx status
  • nginxのリバースプロキシの設定
    • /etc/nginx/nginx.conf をsudoで編集
server{
    listen 80;
    server_name  tomcha.net;

    location \ {
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:5000;
    }
}
  • nginxのリスタート等コマンド
sudo service nginx start
sudo service nginx stop
sudo service nginx restart

nginxのリバースプロキシを使った場合、これで設定はOKなはずなのに、サイトにアクセスするとnginxのエラーページが表示される。
なので、nginxのログを調べてみた。

sudo ls -la /var/log/nginx/
  # -> error.logってファイルが存在することがわかる。
sudo cat /var/log/nginx/error.log
  # -> connect() to 127.0.0.1:5000 failed (13: Permission denied)が出まくる。

どうもパーミッションの関係で5000番ポートへの接続ができていない。色々ググッてみたところ、SELinuxのセキュリティで引っ掛かってるみたい。
この辺から、かなり手に負えない感じなので、色々参考にさせてもらったサイトはこちら。

CentOS7.1 64bit SELinuxによるアクセス制御 | kakiro-web カキローウェブ

SELinuxが妨害してるのか、一度SELinuxを無効化して確認してみる。

getenforce
  # -> 現在有効か無効か確認

# 無効化してみる
sudo setenforce Permissive

SELinuxを無効化すると、ちゃんとSinatraで作ったwebアプリが表示された。ということは、こいつが邪魔をしている模様。
ググッてみて、同じ状況の対策が書かれている記事を発見。同じようにやってみる。

qiita.com

www.crystalsnowman.com

# SELinuxをもう一度有効化。
sudo setenforce Enforcing
  # -> 予想通り繋がらなくなった。

# SELinuxの状態を表示するツールsesearchを実行したが、コマンドが見当たらず。ツールをインストール。
sudo yum install setools-console

# SELinuxの状態を表示させる。オプションはコピペした
sesearch -A -C -s httpd_t -t http_cache_port_t -c tcp_socket

# httpd_can_network_relayのbool値を変更。(拒否DTをはずす)
sudo setsebool -P httpd_can_network_relay=1
  # -> 元に戻す時は httpd_can_network_relay=0 に。



繋がったーーーー

再帰プログラムを書いて遊んでみた

再帰を使ったプログラムを初めて見たのは、数年前にiPhoneプログラミング勉強会でフィボナッチ数列を出力するコードを見た時だった。 自分のプログラミング原点はBASIC、バリバリの手続き型言語思考の自分にとって、それはとても衝撃的な出来事で、初めて見た時はなんて芸術的なコードなんだ!と衝撃を受けた。 手続き型言語でコードを考えると、まさにやる事を頭のなかで順番にコードに置き換えて書いていく事になるのだが、再帰プログラミングでは、定義した自分自身にさらに問いただすという、自問自答の様な、合わせ鏡の様な不思議なロジック。フィボナッチ数列を出力するコードは、見様見真似で書ける様にはなったけれど、きちんと再帰を使えるには程遠い状態だ。

で、少し前からコレを解いて遊んでいた時に

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

再帰でも書けますよ!という問題があったので、再帰プログラムを書く練習をしてみた。 今の自分にうってつけのブログ記事を見つけたので、練習がてらRubyでコードを書いてみた。

bleis-tift.hatenablog.com

が、記事の回答はC#とF#という、ギターのコードなら押さえられるけれどプログラミング言語としては全く基礎知識がなかったので、なんとなく感覚で書いてみた。(なので、書いたコードに突っ込みがあればやさしく突っ込んでください。)

コードを書く時に課したルールは記事に書いてある通り、

  • forループを使わない。
  • 変数への再代入を使わない。

だ。そして、意識したのは、

  • if文で、最終形の状態で結果をreturnする
  • 最終形に至っていない時は、値を一つ取り出して最終形に1歩近づけて自らを呼び出す。

の2点。慣れれば、なんとか同じパターンを使って書くことが出来た。 関数を渡して〜系の問題は、Procオブジェクトに判定ブロックを書いて表現してみた。

果たして、ちゃんとこれで合ってるのかな?

配列の値を合計する関数 sum

Recursion1

続きを読む

さくらVPSにCentOS7を再インストールした

さくらVPSで動かしてるアプリが結構ぐちゃぐちゃになってきた

いろいろ変なwebアプリを作っては上げて動かしているうちに、一度綺麗に整理したいな〜と思ったので、一念発起してOSをクリーンインストールしてみた。 せっかくの機会だったので、今までのCentOS6.5から7にバージョンを上げてチャレンジ。

入門書を読み進めながら、平行して進めてみた。

実践!  CentOS 7 サーバー徹底構築

実践! CentOS 7 サーバー徹底構築

インストール

公式のサポートページに記載された手順通りに進めたら、あっさりと入った。

https://help.sakura.ad.jp/app/answers/detail/a_id/2397

インストールした後

sshでアクセスするポートをデフォルトの22番から他のポートへ変更する。(セキュリティ上)

  • sshをバックアップ
  • sshd_configのポートを書き換え
    • sudo vi /etc/ssh/config
    • Port22の コメント(#)をはずす

    • 下にPort hogeを追記
  • SELinuxのポリシーを先に変更(ツールインストールされているか確認)
  • されていなければyumでインストール
  • 設定を変更
  • 変更を確認
  • sshdをリスタート
    • sudo systemctl restart sshd
  • firewallを書き換え
    • sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-alt.xml
  • 作ったssh-altのport=22をport=hogeに書き換え
    • firewall-cmd --reload
    • firewall-cmd --add-service=ssh-alt
    • firewall-cmd --permanent --add-service=ssh-alt
  • 新たなポートhogeからsshできる事を確認してから、sshを削除
    • firewall-cmd --remove-service=ssh
    • firewall-cmd --permanent --remove-service=ssh
    • firewall-cmd --reload
    • firewall-cmd --list-all
  • sshをリスタート
    • service ssh restart

rootでのsshログインを出来なくする。(一般ユーザーで入って、sudo や su コマンドで対応する様にする)

  • 設定ファイルの書き換え
    • vi /etc/ssh/sshd_config
    • PermitRootLogin yesをnoに

使うツールのインストール

passenger + sinatra で、webサーバデーモンとして稼働させるコマンド

  • bundle exec passenger start -d -p hoge(port番号)

CentOS7からの変更点でちょっとつまったところ

  • iptablesではなく、firewallでポートの制御をする。
    • firewall-cmd —permanent —zone=public —add-port=hoge(port番号)/tcp

目標達成

とりあえず、必要だった以前稼働していたwebアプリは動いたので目標達成。

キッカソンを開催して、第16回Kansai.pmにも参加しました。

バタバタしているうちに、月が変わってしまいましたね...

キッカソンを開催しました。

なにわPerl主催の @tomcha_です。 3月19日〜3月20日の1泊2日で、京都の菊香荘と古心庵で「キッカソン」を開催しました。 菊香荘でハッカソン、別名Perl入学式修学旅行ですね。

f:id:tomcha0079:20160319121404j:plain

f:id:tomcha0079:20160319152936j:plain

総勢13名、西は福岡、東は五反田から、その他愛知からと全国からエンジニアの方が集まりもくもくと作業しました。

初日に会場の古心庵というレンタルスペースに13時に現地集合。 こちらの会場では普段朝クラという早朝から生でクラシック音楽が聞けるというイベントも開催されております。

朝クラ情報はこちら

ピアニストの方は @xtetsujiさんの同級生の方だとか。また、キッカソン中は何かとお世話をして頂きありがとうございました。

さて、肝心のもくもく作業ですが、全員の軽い自己紹介と今回やりたい事を発表した後、

ひたすらもくもくと

f:id:tomcha0079:20160323183425j:plain

ひたすら...

f:id:tomcha0079:20160323124835j:plain

わき目もふらずに...

f:id:tomcha0079:20160323124845j:plain

楽しく作業?をする事ができました。今旬の”いかなごくぎ煮”がデプロイされたのが決定打でした。

f:id:tomcha0079:20160319133725j:plain

お酒を飲んでワイワイしながらプログラミングなんて、普段職場では出来ないですよね。 周りに相談したりと、わいわいとても楽しくできました。

20時に一旦作業を終了させて、宿泊先の菊香荘へ。1泊2食付きの標準プランの晩ご飯はこんな感じです。若手はご飯をもりもり食べてましたね。お酒を飲みながら技術の話やら、業界内のトークやらが飛び出し、夕食タイムは気がつけば23時くらいまで喋っていたと思います。

f:id:tomcha0079:20160319201154j:plain

夕食の後は、部屋に集まって飲んだりわいわいと。自分は3時頃まで周りにアドバイスをもらいながらコードを書いてました。

菊香荘の朝食はこんな感じでした。豪華、食後の珈琲又は紅茶付き。

f:id:tomcha0079:20160320084155j:plain

2日目の午前中は前日とは打って変わって、真剣にみなさん作業をされていました。

ざざっと写真を見ながら様子を振り返りましたが、もう、楽しかった以外の感想が見つからないですね。(目的のプログラムは未完成でしたが...) また次回企画をしようと思いました。

第16回 Kansai.pmに参加しました。

キッカソンが終わってから、京都で昼ごはんを食べたり電子部品!を買ったりした後に大阪梅田へ移動。

一応会場スポンサーみたいな感じでした。

トークの内容に関しては、結構コアな内容でなんとなく追いかけて漠然と理解するのが精一杯だったので、公開されたスライドや他の人のブログに任せて感想などを。

非職業エンジニアがこういう会に参加して一番楽しみにしている事は、エンジニアさんとの交流や、実際にプロの技を目の当たりにする事ができる事ですね。 ライブコーディングは、 - どういう順序で思考し、どうコードに落とし込んでいくか。 - ファイルの構成、ディレクトリの構成 などなど、プロの方にとっては当たり前の事を見れるのでとても勉強になります。教則ビデオみたいな感じですね。

その時の動画とソースコードなんかが後からでも見れるとよいですね。 テスト駆動のペアプロなんかも見てみたいですね。通称ぶつかり稽古というやつですね。

LTでキッカソンの成果の話も出来ました。スライドはこちら。

kansai.pmスライド · GitHub

3月の連休、Perlとプログラミングと日本酒三昧でとても楽しく過ごせました。京都最高!

そして、第17回Kansai.pmミートアップは今年も開催されるそうです。楽しみですね。

サンタクロースを支えるIT技術のトークを聞いた結果、サンタクロースになった話

メリークリスマス!

今日はクリスマス・イブですね。
今日は少し真面目に、YAPC::ASIA 2015サンタクロースを支えるIT技術のトークを聞いたきっかけで、本物の?サンタクロースになった話を書きます。

YAPCでこのトークを聞いた時は、「あー、こういう活動もあるんだなぁ」といった感じで、@ishikawaさんがRTした公式Twitterチャリティーサンタ大阪支部を取り敢えずフォローしたのが始まりでした。

ちょっとしたきっかけでサンタクロースになる講習会を受け、その時に運営スタッフの方から「支えるIT技術」の事の相談を受けたことをきっかけに、クリスマス・イブも仕事が終わった後は時間あるので、ちょっとお手伝いしにきました。

仕事が終わって会場に到着した時には、もうサンタクロースは世界の各家庭へお仕事に行った後でした。

特に仕事もなかったので、スタッフの方から「街角に立って子供たちに飴をくばってきませんか?」と誘われ、丁度同じように仕事帰りで参加されていた こじー さんとスーツ組2名が交代でサンタクロースに変身して街角へ。

大阪では、ちょうど御堂筋イルミネーションを開催していたので、結構子供連れの家族が居ました。

ちびっこ達は、「サンタさんだー」と声をかけてきてくれたり、声をかけたら最初は怖がっていた子供も、話しかけると素直に返事をしてくれたり。よい子にはサンタ飴を配ってきました。

また、観光にきている外国人、大人もみんなニコニコ声をかけてくれました。

色んなクリスマス・イブの過ごし方があると思いますが、少しだけみんなに自分のHappyをわけてあげて自分もハッピーになる、まさにOSSコミュニティの様な活動でした。

とてもHappyですね!素晴らしい活動です!

さて、このチャリティーサンタの活動は来年ももちろん続きます。

サンタとしてボランテイアに参加したい方 スポンサーとして協力したい方 そして自分の子供の為に、家にサンタを呼びたい方

もし、クリスマス・イブに時間があるし、誰かをHappyにする事でもしてみたいな〜と思ったあなた、来年もチャンスがありますよ!

あなたのHappyが誰かのHaappyに、そしてまた、自分自身のHappyに。

公式ページはこちらです。

www.charity-santa.com

それでは皆さん、メリークリスマス! 

〜〜 John LennonのHappy Xmasを聴きながら 〜〜

Perl入学式応用編 解答例

なんとかクリスマスまでには間に合いました。

Perl入学式 夏休みドリル応用編の解答例です。

解答編はあくまで一つの例であり、かつ、第2回までの講義内容で書いています。もっと違う書き方やもっと工夫した書き方もありますので参考の一つと捉えていただければ幸いです。また、内容で何か質問があれば@tomcha_宛メンションなりコメント欄に書いて下さい。

それでは8問分どうぞ!

全部出来ましたでしょうか?自分でも問題を作ってみて、解答を公開するのも楽しいかもしれませんね。

それではメリークリスマス、Perl6のリリースを正座で待ちましょう!