Perlがくしゅう帳(Rubyも)

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

さくら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のリリースを正座で待ちましょう!

第1回 電罰戦トーナメント 初代電罰王者にPerlで挑んだ話

Perl入学式in大阪のサポーターをやっている@Tomcha です。

この記事はPerl入学式アドベントカレンダー2015の14日目の記事です。折り返し地点を過ぎました。昨日はin東京でサポーターをされている@tsucchiさんでした。おや?ブログの到着が少し遅れているようですが楽しみに待ちましょう。

さて、記事タイトルになっている"電罰戦トーナメント"とは?? 初代電罰王者とは??*1

みなさんご存知無いかもしれませんが、平成27年12月10日、グランフロント大阪にて行われた"コンピュータープログラムによる三目並べ*2ゲーム選手権"とその優勝プログラムの事なんですね。聞いた事ないですか?それもそのはず、今勝手に名付けました、スミマセン。

---タイトルの釣りはここまで---

実はこれ、in大阪サポーターの@nqounetさんが主催されている、Perl入学式を卒業した脱初心者を対象にした、Perlで何かを作る勉強会「Perl鍋」で企画された大会なんです。 対戦マッチングプログラムはPerl鍋に参加されている@sago35tkさんがPerlで書かれ、Githubで公開されています。

github.com

で、どんなプログラム書いたの?

今回自分に課したテーマは、"コンピューターが自分で考える"プログラムです。 テーマは色々あると思うのですが、”とにかく勝つ(負けない)プログラム”、"過去の対戦結果から学習して成長するプログラム"、"効率良く書いた極力短いプログラム"などなど色々あると思います。今回は最近興味を持っているコンピューター将棋のエッセンスを取り入れて、

  1. 手を2手先、3手先・・・と先読みする(探索)
  2. 読んだ手の盤面に点数をつける(評価関数)
  3. 点数の高い(良い)と評価した盤面になるような次の1手を返す。

を目指しました。あと評価計算にビット演算なんかも詰め込んでみました。*3

...が、これ弱いです。ランダムで手を指すRand君には割りと勝ちますが、初代電罰王のNqounet.pm、Sago.pmには全く歯が立ちません。(笑)
原因は明快で、盤面を評価する評価関数が正しくない(評価の仕方が偏っている)なのですが、まぁ、自分のプログラムが必死で考えてこれが良いんじゃない?と判断した手を指してはいるので、とりあえずは満足しています。

https://github.com/sago35/PerlNabe-Sanmoku/blob/master/lib/PerlNabe/Sanmoku/Tomcha.pm

コードは自分がやりたかった事を詰め込んでいるので、あまり参考になる部分は無いですが、入学式で習った文法の中で、使い所が少し分かりにくい部分の使用例を挙げてみます。
まずは、リファレンス(参照)と値渡しの使い分けについてです。

159 行目 my @datacp = @$data;

これは make_te という、現在の盤面を配列リファレンスで引数にして渡すと、打てる手の候補をどんどん作る(2手、3手・・・の先読みも作る)サブルーチンの中のコードです。
2手先3手先を読むには、現在の盤面に手を打った状態、さらには相手が手を打ち返した状態の盤面に加工して評価する必要があるのですが、元の盤面データを「リファレンスで受け取っている」ので、リファレンスでの値を変更してしまうと元のデータが書き換わってしまい、別の可能性の手を評価する時に元の手が何だったのか分からなくなってしましますよね。
なので、$dataの配列リファレンスをデリファレンスし、@datacpという新しい配列にコピーして加工をしています。
「参照」と「値渡し」の使い分けが必要なケースの例ですね。

次の例は、ループ分におけるnextやlastの使いどころです。

176行目、185行目 next;

これは、次に打てる手を全て読んだ後に、その次の手を読みさらにその次・・・と手を深く読んでいく為にwhileループで手の生成ルーチンを回しているのですが、この中でこれ以上先を深く読む必要がなくなる時、すなわち

  1. 先行、後攻のどちらかが勝った時(それ以上は読んでも意味が無い)
  2. プログラムで指定している読みの深さ($depth)まで読みが達した時(何手先まで読むと設定している場合など)

1や2まで読んだ時、それ以上先の手を生成させず、違う手の可能性を読む為に次のループにスキップする例です。

先の手を読むイメージ
f:id:tomcha0079:20151213222247p:plain

さて、ここまで読むと自分でも試してみたくなりますよね??

自分でも作ってみるには

作るべきプログラムの仕様は簡単で、

  1. Mooを使ってプログラムのひな形を継承します。(深く理解してなくても、コピペでOK)

  2. calc_next というサブルーチンを作ります。

  3. calc_next は9つの値が入った配列が引数として渡されます。

  4. clc_next は1つの数字を返します。

そう、書くべき内容はたったこれだけです。

実際にやってみよう

まずは@sago35tkさんのGithubページからソースコードを任意の場所にダウンロードします。

git clone git@github.com:sago35/PerlNabe-Sanmoku.git

まずはデフォルトで入っている「Sample君」と「Rand君」を戦わせてみましょう。Sample君は左上から順に空いているマスに駒を置くプログラム、Rand君は空いているマスにランダムに駒を置くプログラムです。

実行の仕方は、ダウンロード時に生成された'PerlNabe-Sanmoku'ディレクトリに移動して、'script/sanmoku.pl' を実行します。Sample君、Rand君等の思考プログラムは 'lib' ディレクトリに入っていますので、パスを通す(Perl に lib ディレクトリの中のプログラムを読みこませる)必要があります。ターミナルでの操作はこんな感じ。

cd PerlNabe-Sanmoku

perl -Ilib script/sanmoku.pl Sample Rand

すると画面はこんな感じになってゲームが始まります。 エンターキーで1手ずつ進めていきます。 f:id:tomcha0079:20151213130512p:plain

では、実際に自分のプログラムを作ってみましょう。 Sample.pmを同じディレクトリ内で別名をつけてコピーします。これを改造していけば、オリジナルのプログラムが作れちゃいます。

仕組みは、サブルーチン calc_next に現在の盤面が9個の要素のリストが渡されます。先頭から順番に、左上、上、右上、左、中、右、左下、下、右下とZ順になっています。配列の中身は、0が空、1が自分の駒、2が相手の駒です。
盤面に駒が無い状態だと、(0,0,0,0,0,0,0,0,0)のリスト、センターに自分の駒がある盤面は(0,0,0,0,1,0,0,0,0)と表されます。
そして、calc_next はリストを受け取って処理をした結果0〜9の数字を返します。これが自分の打つ駒位置をあらわします。リストの順番と同じですね。
このサブルーチンの中でどう計算して手を考えるかがそれぞれのプログラムの差となります。
そして、先頭行に書かれている

package PerlNabe::Sanmoku::Sample;

の末尾のSampleの部分を自分の単語に書き換えます。頭文字は大文字です。
そして、ファイル名も書き換えたものと同じにします。

package PerlNabe::Sanmoku::Tomcha;

だと、Tomcha.pmといった具合です。

プログラムがちゃんと完成すれば、対戦させてみましょう。上に書いた通り、コマンドラインから実行します。第1引数が先手、第2引数が後手です。引数はファイルの名前から.pmを除いたものです。

perl -Ilib script/sanmoku.pl 第1引数 第2引数

どうでしょう、ちゃんと対戦が始まりましたか?

何か自分で作ったものが動くって、楽しいですよね!!

Let's enjoy programming. Happy Hacking!!

Perl入学式のその先は・・・

Perl入学式は全6回で終了です。全6回の内容を習得して初めてスタートラインに立てた状態です。スタートラインに立った後、どう使っていくか、どうコードを書いていくか、どう学習を発展させていくか、がとても大事に思います。
Perl入学式in大阪では卒業後の関連勉強会として、「Perl鍋」Perlでそれぞれ何かを作る勉強会)や「なにわPerl」(自習目的のもくもく会)などを開催していますので、是非参加してみて下さい。新しいプログラミングの楽しさが発見できると思います。
わたくし@tomcha_が主催している「なにわPerl」では、年末の12月30日にもくもく会を開催します。
関西在住のエンジニアさん、学生さん、ちょうど帰省しているエンジニアさん、学生さん、その他なにか勉強やもくもく作業をしたい方(プログラミング関連の)は是非ご参加下さい。もちろん、サンデープログラマーの方もどうぞ!(主催者もアマチュアプログラマーです。)

また、東京では「五反田Perl」、福岡では「天神Perl」も関連イベントとして開催されています。日程など詳しくはPerl入学式公式ページでご確認下さい。

さて明日は

明日の「Perl入学式 Advent Calendar 2015」は、in東京で受講生からサポーターに成られ、先日講師デビューを果たされた@gomaaburamax さんの記事です。楽しみですね!

*1:電玉戦にしようと思ったら先に使われてたので、電罰戦トーナメントにした。元ネタが分かりにくい?

*2:小学生の時、運動会の練習とかでの待ち時間に地面に書いて遊んだマルペケゲームですね

*3:完全に個人的な趣味です。ビット演算しなくても書けます。

Perl入学式ドリル 解答編

Perl入学式夏休みドリルを作ってはや数ヶ月、季節はもうクリスマス目前ですね。

問題を作ったまま解答編をアップするのを失念いたしておりました。

とりあえず、基礎編の解答例をアップいたします。応用編も近日中にアップする所存であります。

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

それでは50問分、一挙にどうぞ!

Perl入学式夏休みドリル 応用編

遅くなってすみません

夏休み、終わってしまいましたね。。。
第2回復習ドリルも少し手の込んだ応用編を用意してみました。
問題は第2回までの知識で書ける範囲になっていますが、第3回の予習をされた方や、もっと便利な関数とか書き方知ってるよ!って方は自由にコードを書いてもらって構いません。もし、自分なりのコードが書けたら、Githubのアカウントを作って、Gist(ちょっとしたコードを書いて公開できるサービス)で公開して受講者同士でお互いに書いたコードを見せ合うのも良いのではないでしょうか。そういう時は自分の書いたGistのアドレスをTwitterで #Perl入学式 のハッシュタグを付けて呟いてみましょう!

もし、どう書けばよいかわからない、ヒントが欲しい、等のご要望があれば、Perl入学式チャットで質問するもよし、なにわPerlで質問して頂いても構いません。

コードには、入学式で説明したおまじないの3行を書くようにしてください。
問題は全部で8問用意してみました。

Let's enjoy programming!


[問1] 以下の配列を使って、しりとりが完成する様、単語と単語の間を->でつなげて画面に出力してください。

my @words = ('肉','イカ','ラッパ','カニ','クジラ');

# 出力例
# イカ->カニ->肉 ....

[問2] 5つの数字の入力してもらい、5つ入力された後に昇順に並べ替えたものを画面に出力するプログラムを書いて下さい。


[問3] 好きな食べ物をいくつか入力してもらい、入力された順番の逆順に画面に出力するプログラムを書いて下さい。入力の受付は、食べ物の代わりにENDと入力されると終了して下さい。(reverse関数ってのがありましたよね?)

#
# プログラム実行時の画面イメージ
#
# $> 好きな食べ物を入力して下さい>apple
# $> 好きな食べ物を入力して下さい>orange
# $> 好きな食べ物を入力して下さい>banana
# $> 好きな食べ物を入力して下さい>END
# $> banana orange apple
#

[問4] 問3を、reverse関数を使わずにコードを書いて見て下さい。(reverse関数と同じ機能を自分のコードで書いてみてください。)


[問5] 合計時間を計算する、時間計算電卓を作りましょう。プログラム実行時のイメージはこんな感じです。

#
# プログラム実行時の画面イメージ
#
# $> 時間電卓です。時間と分を別々に入力して下さい。終わる時は、ENDを入力して下さい。
# $> '時間'を入力して下さい>5
# $> '分'を入力して下さい。>30
# $> '時間'を入力して下さい>3
# $> '分'を入力して下さい。>10
# $> '時間'を入力して下さい>4
# $> '分'を入力して下さい。>35
# $> '時間'を入力して下さい>END
# $> '分'を入力して下さい。>
# $> 合計は13時間15分です。
#

[問6] 「自分の言った(入力した)言葉が1つ遅れて帰ってくる装置(会話BOT)」を作って、会話してみましょう。
コンピューターは、必ず最初に「こんにちは。」の挨拶から始まります。2回目の返事は「あなたの名前はなんですか?」です。
次からは、あなたが答えた返事を繰り返します。ENDと入力すると終了します。イメージはこんな感じです。

# 1つ遅れて返事する君(終わる時は、'END'と入力しましょう。)
# com>> こんにちは。
# you>こんにちは。
# com>>あなたの名前は何ですか?
# you>tomchaです。
# com>>こんにちは。
# you>さっき、あいさつは済ませましたよ?
# com>>tomchaです。
# you>それは私の名前ですが。
# com>>さっき、あいさつは済ませましたよ?
# you>そうです、済ませました。
# com>>それは私の名前ですが。
# you>済ませましたっていう名前なんですか?
# com>>そうです、済ませました。
# you>え?
# com>>済ませましたっていう名前なんですか?
# you>END

[問7] 1つの数字を入力してもらい、2からその数字までの間にある素数を全て出力するプログラムを書いてください。


[問8] メールアドレスを作って出力するプログラムを書いて下さい。
コンピューターはアカウント名(@の前部分)を聞いてきます。そして、ドメイン(@の後ろ)は3つ候補が出てきますので数字で選択します。
これを繰り返して下さい。終わる時はENDと入力します。
そして、作成したメールアドレスを画面に出力して下さい。イメージはこんな感じです。

# アカウント名を入力して下さい。(終了はEND) >tomcha
# ドメインを入力して下さい。
# 0: foo.net
# 1: bar.net
# 2: baz.net
# No? >1
# アカウント名を入力して下さい。(終了はEND) >hoge
# ドメインを入力して下さい。
# 0: foo.net
# 1: bar.net
# 2: baz.net
# No? >2
# アカウント名を入力して下さい。(終了はEND) >fuga
# ドメインを入力して下さい。
# 0: foo.net
# 1: bar.net
# 2: baz.net
# No? >0
# アカウント名を入力して下さい。(終了はEND) >END
# ドメインを入力して下さい。
# 0: foo.net
# 1: bar.net
# 2: baz.net
# No? >
# tomcha@bar.net hoge@baz.net fuga@foo.net

どうでしょう。全部コードが書けましたでしょうか? 第3回まで復習して忘れないようにしましょう!