やっとこさSledgeが動いた
Sledgeを知っていますか?
Sledgeというのは、PerlのWebアプリケーションフレームワークです。
2003年にオープンソースとして公開されました。公式ページのurl(http://sl.edge.jp/)に残るように、開発したエッジ(後のLivedoor)の名を冠したプロダクトです。
公開から15年近く経っていますが、Webサービスのバックエンドとしてインターネットの片隅で稼働しており、うちもここ数ヶ月業務で触れているプロダクトです。
Sledge関連情報
インストールしようとググると、Apache1.3とmodperlでの構築を前提としている記事にあたります。
そして現在、Apache1.3とmodperlは現行のOSにインストールする方が難しい・・・ただし、一度動いてしまえば、これらの記事が大いに参考になります。
特にお世話になっている記事を紹介します。
そして、貴重な活字での情報です。vol.1 で終わってしまっているのが悲しい・・・
Sledgeをインストールする
環境
macos 10.14 で試しています。
~/Desktop $ sw_vers ProductName: Mac OS X ProductVersion: 10.14.5 BuildVersion: 18F132
Perlは 5.28 を利用。
~/Desktop $ perl -v This is perl 5, version 28, subversion 0 (v5.28.0) built for darwin-2level (with 1 registered patch, see perl -V for more detail) Copyright 1987-2018, Larry Wall (中略)
Sledgeの立ち上げにはPlackを使います。 Plackのバージョンは 1.0047
~/Desktop $ perl -MPlack -le'print $Plack::VERSION' 1.0047 ~/Desktop $ plenv -v plenv 2.2.0
インストール
ソースをGithubからダウンロード
tokuhiromさんのPSGI対応版を使います。
~/Desktop $ git clone git@github.com:tokuhirom/Sledge.git Cloning into 'Sledge'... remote: Enumerating objects: 174, done. remote: Total 174 (delta 0), reused 0 (delta 0), pack-reused 174 Receiving objects: 100% (174/174), 79.06 KiB | 487.00 KiB/s, done. Resolving deltas: 100% (19/19), done.
作成したローカルリポジトリの中に入り、リモートブランチを確認します。
~/Desktop $ cd Sledge/ ~/Desktop/Sledge (master) $ git branch --remote origin/HEAD -> origin/master origin/feature-psgi origin/master
origin/feature-psgi
に切り替えます
~/Desktop/Sledge (master) $ git checkout -b future-psgi origin/feature-psgi Branch 'future-psgi' set up to track remote branch 'feature-psgi' from 'origin'. Switched to a new branch 'future-psgi'
ローカルにcloneしたリポジトリの中に eg/hello.psgi
というファイルがあるので、これを一つ上の階層にコピーします。
~/Desktop/Sledge (future-psgi) $ cp eg/hello.psgi .
コピーしたファイルを編集します。
~/Desktop/Sledge (future-psgi) $ vi hello.psgi
3行目に use lib qw(lib/)
を追加します。
use strict; use warnings; use lib qw(lib/);
plackupで立ち上げます
~/Desktop/Sledge (future-psgi) $ plackup hello.psgi HTTP::Server::PSGI: Accepting connections at http://0:5000/
ブラウザで http://localhost:5000
にアクセスして、てすと
と出てくればokです。
これはt/template
の中にあるunicode.html
ってのを読み込んで表示しています。
ここまで超苦労した
これ、上に書いてある手順だけだと簡単に思えるかもしれないけど、ここまで持ってくるの、めっちゃ大変だったんだからー
まぁ、主な理由はこの hello.psgi
を見つけられなくて、会社にあるSledgeシンプル版を参考にして色々と遠回りしてたのが原因です。
このtokuhiromさんのPSGI対応版が独習用に良いんじゃないかな、というのはPerl入学式の2月の合宿でカルパさんやわいとんさんから聞いてはいたけど、そっから思いっきり回り道して、cartonでモジュールインストールしてみたり、会社で使っているやつを参考にして編集したりして、動かない日々が続いてたわけです。
で、なんとか自前で作ったページ(hello.psgi
とは別)が動いて、やったー!って思ったらもっとシンプルな実装が元々あったというね。
とりあえず、これで動きました、という例を残しておきます。
Perl入学式 2019 in東京 第3回 お疲れ様でした
受講された方、サポーターの方、大雨の中お疲れ様でした。
講師をやったジャージの人です。
Perl入学式第3回となります。今回はカリキュラム改定に伴う進捗調整のため、前半を第1回、第2回の復習にあて、後半で正規表現を学びました。
講義に利用したスライドはMarkdown形式で公開しています。復習に使ってください。
問題の意味がわからない、とか、このような解答例はどうだろう?という方はSlackのPerl入学式チャンネル(招待フォーム)やtwitterでハッシュタグ #Perl入学式 をつけて聞いてみてください。
応答速度、監視頻度などの面からSlackの方をお勧めします。
講義中のネタについて
Perlcon 2019
東欧にあるラトビアの首都・リガでPerlCon2019が開催されます。
Perl入学式の初代校長のpapixさん、Perl入学式 沖縄のAnaTofuZさんが登壇します。すごい!
講義中に使ったスライド
自作のスライドです。
特に、最後のページにある Everything はWindowsマシン使うなら必須のソフトだと思っています。CUIはまだ抵抗がある、という方にも優しいGUIのソフトです。ぜひ使ってみてください。
お仕事での正規表現
最近の仕事で使った正規表現はこんな感じです。
特定の語を含む文書を検索し、その文書のタイトルやtimestampなどのメタ情報を収集する
# qwショートカットを利用 my @urls = qw( http://perl.example.com/sironekotoro.png http://perl.example.com/sironekotoro.html http://perl.example.com/cat.jpg http://perl.example.com/cat.doc http://perl.example.com/kuroneko.gif http://perl.example.com/kuroneko.js ); for my $url (@urls) { if ( $url =~ /^http:.*[gif|jpg|png]$/ ) { $url =~ s/^http/https/; } print $url . "\n"; }
ピザ会のお題
Perl入学式 in東京 では講義終了後、希望者で集まりピザ会と称した懇親会を行っています。
(ジュース・ピザ代は実費)
昨年からそこで余興として xtetsuji さんが課題を出し、そこにチャレンジャーが回答して公開する、というようなことをやってます。
xtetsujiさんからのお題ですが、今回は「0〜99までの数字を漢数字を受け取ってアラビア数字にする」でした。
問題のレギュレーションはそのうちxtetsujiさんから公開されるはずですが、入力として与えられる文字列は以下です。
一 二 十 十一 三四 二十一 三十四 三十 三〇
これらの文字列を
1 2 10 11 34 21 34 30 30
に変換するスクリプトを作成します。
うちの回答は「ハッシュテーブルを使ったもの」「正規表現を使ったもの」の折衷型だったので、これを分離して2つのスクリプトに分けて掲載します。いずれも第3回までで習った内容のみで書いています。
あわせて、Perl入学式での範囲にない関数や正規表現を使ったものを「漢数字をアラビア数字にする(Perl入学式でやっていないところ)」として追加で載せておきます。
次回のPerl入学式
次回のPerl入学式 in東京は7月の開催を予定しています。
Perlを学ぶ初心者の鬼門、リファレンスをやります!時間があればHTML入学式もやるかもしれません・・・
皆さんの受講をお待ちしております!
Perl入学式 2019 in東京 第2回 お疲れ様でした
受講された方、サポーターの方、お疲れ様でした。
講師をやったジャージの人です。
カリキュラムを改版して臨んだ第2回となります。
講義に利用したスライドはMarkdown形式で公開しています。復習に使ってください。
また、復習問題を用意しています。
第1回と第2回でやった内容のみで解ける問題となっています。ぜひ挑戦してみてください。
復習問題の解答例もありますので、参考にしてください。
問題の意味がわからない、とか、このような解答例はどうだろう?という方はSlackのPerl入学式チャンネル(招待フォーム)やtwitterでハッシュタグ #Perl入学式 をつけて聞いてみてください。
応答速度、監視頻度などの面からSlackの方をお勧めします。
ピザ会のお題
Perl入学式 in東京 では講義終了後、希望者で集まりピザ会と称した懇親会を行っています。
(ジュース・ピザ代は実費)
昨年からそこで余興として xtetsuji さんが課題を出し、そこにチャレンジャーが回答して公開する、というようなことをやってます。
xtetsujiさんからのお題ですが、今回は「正弦波を描く」でした。
三角関数、昨年冬あたりに高校数学の復習でやっていたので
- 正弦波: sin(サイン)を使う
- 最大は 1
- 最少は -1
というところまでは知っていたのですが、それをコードに起こすロジックがわからない・・・(5分くらいは考えた)
しかし、それでも何とか、それっぽいのを・・・と頑張った結果がこれです!それっぽい何かが出力されます。
xtetsujiさん曰く「似ている、近似・・・というよりも禁じ手ですね」
こんなの世に出していいんだろうか。ってまぁ、こういうのこそ晒していきましょう。晒しただけ強くなれます(強さとは
コードにコメントも書きましたが、Perl入学式の第1回, 第2回の内容で書いています。
リベンジマッチ正弦波を描く・実況中継
そもそも、昨年冬に俺は三角関数の復習をしたんじゃなかったのか?という悔しさがあります。
俺がやったのは問題の解き方だけなのか?という反省もあります。
ということでリベンジマッチです。
まず、Perlのsin関数とは、というところを調べます。
sin EXPR
sin(ラジアンで示した) EXPR の正弦を返します。 EXPR が省略されたときには、$_ の正弦を返します。
ふむふむ。ラジアンが何かはともかく、数学用語だから数字入れてみればいいのかな?
print sin(1) . "\n" # 0.841470984807897
やはり数字が返ってきた。でも、ラジアンが何者かを理解しないとsin関数はうまく使えないみたい。ではラジアンとは?
(ここで「ラジアン 中学生」「ラジアン 高校」「ラジアン わからない」「ラジアンとは」などでググる)
ほーほー、三角関数を求める時の角度ではなく、円の半径と弧の長さから導き出されるものなのね。しかも、角度とラジアンの変換公式もある。
となると、こういう戦略はどうだろう
- $kakudo って変数を用意する。初期値は0
- whileループを用意・・・いや、無限ループが怖いからfor文にしておこう。最初は20回くらい処理を繰り返してみる
- ループ処理の中では、$kakudoを +30 していく
- $kakudoは360を超えても気にしない。2週目に入ったという感じで。スノーボードの720ターンみたいな(2回転するターン)
my $kakudo = 0; for ( 1 .. 20 ) { print $kakudo . "\n"; $kakudo = $kakudo + 30; } # 出力 # 0 # 30 # 60 # 90 # 120 # ... # 570
よさそう。では、この角度をラジアンにするロジックを考える・・・その前に、Perlにそういう関数がないかな?って調べてみる。
やっぱりあった。しかもタイトルが既にうちの求めてるものそのまま。おなじみ、木本先生のサイト。安心して参考にさせてもらう。
use Math::Trig 'pi', 'deg2rad'; my $kakudo = 0; for ( 1 .. 20 ) { print '角度:' . $kakudo . "\n"; print 'ラジアン:' . deg2rad($kakudo) . "\n"; $kakudo = $kakudo + 30; } # 出力 # 角度:0 # ラジアン:0 # 角度:30 # ラジアン:0.523598775598299 # 角度:60 # ラジアン:1.0471975511966 # ... # 角度:570 # ラジアン:3.66519142918809
うんうん、よさそう。
でも、この変数 $kakudo
わかりやすいけど、角度とラジアンの変換関数に揃える形で変数名を変えておこう。
あと、このラジアンの値をsin関数に与えるから、それ用の変数も用意しておこう。
use Math::Trig 'pi', 'deg2rad'; my $deg = 0; for ( 1 .. 20 ) { # ラジアン my $rad = deg2rad($deg); # サイン my $sin = sin($rad); print 'サイン:' . $sin . "\n"; print '-' x 10 . "\n"; $deg = $deg + 30; # 出力 # サイン:0 # サイン:0.5 # サイン:0.866025403784439 # サイン:1 # サイン:0.866025403784439 # サイン:0.5 # サイン:1.22464679914735e-16 # サイン:-0.5 # サイン:-0.866025403784438 # サイン:-1 # サイン:-0.866025403784439 # サイン:-0.5 # サイン:0 # ... }
ちゃんと増えて、減って、増えて、を繰り返してる。けど、値が小さすぎて * で表示した時に困りそう。
あと、マイナスの値の時はどうしよう?
sinの最大値は1 , 最小値は -1 だから・・・1を足せば、0から2の間の値をとるようになるはず。
値が小さすぎる問題は、単純にsinの値を10倍くらいにしてみる。
sinって変数に足したり引いたりしちゃうと本来の意味が変わってしまうから、ちゃんと * の数を格納する変数 $star
を新規に用意しよう。
use Math::Trig 'pi', 'deg2rad'; my $deg = 0; for ( 1 .. 20 ) { # ラジアン my $rad = deg2rad($deg); # サイン my $sin = sin($rad); # sin + 1 を加えて正の値にしたものを # グラフを構成する * の数とする my $star = $sin + 1; # 最大値2,最小値0ではグラフに華がないので、 # 10倍の値にする $star *= 10; # 小数点は邪魔なので、int関数で小数点を切り捨てた # 値に丸める $star = int($star); print 'グラフの * の数:' . $star . "\n"; $deg = $deg + 30; # 出力 # グラフの * の数:10 # グラフの * の数:15 # グラフの * の数:18 # グラフの * の数:20 # グラフの * の数:18 # グラフの * の数:15 # グラフの * の数:10 # グラフの * の数:4 # グラフの * の数:1 # グラフの * の数:0 # グラフの * の数:1 # グラフの * の数:4 # グラフの * の数:10 # グラフの * の数:15 # グラフの * の数:18 }
ちょっと数字の増減のペースが気になるけど、行けそうな気がする。
* を数字分だけ表示してグラフっぽくしてみる。
さらに、ループの数も増やして1000回くらいやってみる。
0.5秒ごとにループが回るように、高精度のsleepもいれちゃおう。
このあたりは昨日スクリーンで見た xtetsuji さんの模範解答を参考に。
そして完成したコードがこちら。
ということで、うちの回答リベンジ編でした。
おまけ
完成したコードの33行目を以下のように変更すると、同じ行でグラフが伸びたり縮んだりします
printf("%-20s\r", '*' x $star);
Perl入学式 2019 in東京 第1回 お疲れ様でした
受講された方、サポーターの方、お疲れ様でした。
講師をやったジャージの人です。
毎期、新しい挑戦をしているPerl入学式ですが、今期はカリキュラムを改版して臨んだ第1回となります。
スライドはMarkdown形式で公開しています。
また、復習問題も追加しました。
あわせて復習問題の解答例も作成しております。
第1回でやった内容のみで解ける問題となっています。時間のある時や大連休の時にぜひ挑戦してみてください。
欲望ドリブン!
プログラムに限らないのですが、何かの習熟・上達には「欲望」が欠かせません。
「仕事を早く終わらせたい」「仕事を楽にしたい」「もっと稼げる仕事に就きたい」「xxxな画像を集めたい」
なんでも良いです。欲望が大事です。
そして、Perl入学式沖縄のアナグラくんのスライドが超いいので置いておきます。
みんな見て!
Hello World ~我々は如何にしてプログラミングを学習して いくべきか、その議論で見えた一筋の道標とは~ - Speaker Deck
第1回 落ち穂拾い
昨年秋に開校した際の補足記事です。参考にご覧ください。
また、テキストエディタAtom, VSCodeを使ってPerlを快適に書くための設定を書いてみました。こちらもどうぞ。
ピザ会のお題
Perl入学式 in東京 では講義終了後、希望者で集まりピザ会と称した懇親会を行っています。
(ジュース・ピザ代は実費)
昨年からそこで余興として xtetsuji さんが課題を出し、そこにチャレンジャーが回答して公開する、というようなことをやってます。
今回の出題は、「元号 -> 西暦コンバータ」でした。
Perl入学式 第1回 ピザ会 課題 2019/04/13 · GitHub
この問題を解くためには第1回で学んだ
- スカラー変数
- 標準入力
- 四則演算
に加えて「正規表現」が必要です。
講義中に「正規表現ができると何が嬉しいんですか?」って聞かれたやつですね。
正規表現を使うと、「文字の並びのパターンから文字列の操作ができる」というのが嬉しいところです。
以下は平成のみのコンバータですが、ここでは文字の並びのパターンを
「先頭が文字2文字で、そのあとに数字が続き、"年"で終わる文字列」
として正規表現を使っています。解説を入れたらかえって分かりにくくなるという悲しみがあります・・・
平成○○年 と入力すると西暦にして返してくれる君 — Bitbucket
本来のxtetsujiさんの問題に沿った内容で回答したのが以下です。せっかくなのでおまけも実装してみました。
- 全角数字を入れてもok
- 昭和をS, 平成をH, とする短縮記法でもok
和暦を引数に与えると西暦年を応えてくれる — Bitbucket
(2019年04月20日 追記) 元号から西暦を求めるクイズも作ってみました。明日に控えDBスペシャリスト試験の直前勉強があまりにも捗らなくて現実逃避した結果です
https://bitbucket.org/snippets/sironekotoro/ge5aAA
Perl入学式 in東京 2019 第2回
5月中旬以降での開催を予定しています。
待ちきれないという方、過去の講義スライドも公開しています。そちらで予習をお願いします。
また、復習や疑問点がある方はぜひ、Perl入学式のSlackに参加してそこで問い合わせてください。
問い合わせの際に、問題のあるコードをブログやgist(GitHub), Snippet(Bitbucket)などに貼り付けてもらえると助かります。
このブログでも、Perl入学式に関するエントリを載せていますので、参考にどうぞ。
それでは、第2回でもお待ちしています!
Perl入学式 2018 in東京 秋開講 第5回 お疲れ様でした
受講された方、サポーターの方、お疲れ様でした。 講師をやったジャージの人です。
スライド中の練習問題と復習問題ですが、昨年夏に書いた解答例をblogに掲載しています。 参考にしてください。 sironekotoro.hateblo.jp
あと、時々つかったスライドも置いておきます。 docs.google.com
以下、うちが用意していた資料です。
Perl入学式では、HTMLの簡単な知識は所与のものという体でやってきたのですが、そうでない方もいる・・・ということで準備していたMarkdownです。
mojoliciousで寿司を回転させるソースです。
昨年夏に作った「最終問題」例です。
mojoliciousで作られている商用サイト
忘れていて講義中に言及できなかったのですが、今回学習したmojoliciousは以下の商用サイトで利用されています。
MVCのモデルを考えつつ、Webにどのような情報が送られ、処理されて表示されているか?を考えてみると良いと思います。
mojoliciousでfizzbuzz
今回の講義中、うちが詰まってしまったmojoliciousでfizzbuzzのコード、リベンジ編です。
3パターン用意してみました。
クリックすると展開されます
gist.github.com
Perl入学式を卒業したら?
Perl入学式の卒業後、読んで自習してみると良いかも?という本については以下のエントリにリストアップしています。 sironekotoro.hateblo.jp
何度か言及しましたが、Perl入学式を修了すれば「初めてのPerl」で挫折することはありません。挑んでいきましょう。
#Perl入学式 、はじめてのPerlで挫折した人にもおすすめ(私です pic.twitter.com/4CWFdhhCkx
— sironekotoro (@sironekotoro) 2019年3月29日
2019年度のPerl入学式
カリキュラム・テキスト改版中
現在、カリキュラムの順番入れ替えをと講義テキストの改版を進めています。
新カリキュラムの構成は以下となっています。
Perl入学式 in東京 2019 第1回は4月13日開講!
perl-entrance-tokyo.connpass.com
Perl入学式は2周目, 3周目の参加も歓迎します。また、少し時間が空いての再参加ももちろん歓迎です。
すでにPerlが実行できる環境にある場合、15時からの参加をお勧めします。
そして、大阪でも2019年度 第1回の開催が告知されています。Perl入学式くんに襲われてる通天閣のイラスト、いいですね
perl-entrance-osaka.connpass.com
また、サポーターとしてPerl入学式を一緒に運営・盛り上げていってくれる方も募集中です。 教えたり、一緒に考えることで学びはとても深くなります。
参加はこちらから!
それでは、2019年度もよろしくお願いします!
Perl入学式 2018 in東京 秋開講 第4回 お疲れ様でした
受講された方、サポーターの方、お疲れ様でした。 講師をやったジャージの人です。
スライド中の練習問題と復習問題ですが、昨年夏に書いた解答例をblogに掲載しています。 参考にしてください。
あと、時々つかったスライドも置いておきます。
ピザ会のお題
Perl入学式 in東京 にて恒例となったピザ会のお題です。今回のお題は・・・
「サラリーマン川柳」のサイトから川柳を集め、それを元に「上の句」「中の句」「下の句」で分割し、ランダムに組み合わせ、新たな俳句を生成せよ!
というもの
__DATA__
セクションにそのまま俳句コピっておっけーというレギュレーションだったので、サクッと出来たのがこちら。
下はWebから持ってきて10句を表示する版。
(httpsのサイトへのアクセスが必要なので、IO::Socket::SSL
とNet::SSLeay
が必要。)
ルビ部分の削除をサブルーチンに分離し、ルビの削除と俳句部分の抜き出しに正規表現を利用しています。
川柳をランダムに生成する(Webから撮ってきて10首ほど表示版) — Bitbucket
次回予告
Perl入学式 in東京 第5回ですが、3月30日(土曜日)を予定しています。
今回、時間が余れば以下の第5回予告編スライドを投入したかったのですが、存外時間が押して紹介できなかったので、ここで紹介して供養しまする。
Perlの会社に入社して1週間経ちました
重要開示
支給Mac
- MacBook Pro 13インチ
- 使っていて動作が重いと感じることはない
- 個人で使っているMacBook Air 2013年モデルと比べて、モジュールのインストールとかは明らかに速い(当たり前
- TouchBarには不安があったので、物理ファンクションキーでよかった
- 追加のディスプレイは現在調達中でありがたい
- アプリのインストールは必要であれば入れてokという、利用者を信頼してくれるスタイル
業務ツール
- 出退勤管理
- メール・カレンダー
- チャット
- プロジェクト管理
- ソースコード管理
- Dockerイメージ管理
勤務
- コアタイムありのフレックス制
- コアタイムは11時〜17時
- 金曜日のみ11時〜16時
- 自分で働く時間を決められるってことで、自制しないといつまでも会社にいてしまうの危険
- 勤務自体は8時から可能
- ただし、ビルに入館できるビルカードを受領していないので、誰かが来た後でないと入ることはできない状態
- 1回くらいは8時出勤17時退社を体験してみたい
渋谷
- 新宿と比べて、明らかに飯屋の系統が違う感
- 系統自体もだが、店自体も多い
- 太る
- 通勤経路は色々試し中
- 探検が必要
- しかし渋谷は地上も地下もダンジョン・・・時間の余裕がないと死ぬ
開発スタイル
- 個人に本番環境に近いVPSサーバを用意
- 「まかないサーバ」と呼ばれている
- 飲食店の「まかない飯」みたいな感じ?
- CentOS7
- まかないサーバ内に手順書に従って環境を構築
- root権限ありなので、必要に応じてfairewallの設定を自分でしたりする
- 検証環境の構築はDocker
- GitHubでの流れ
- ブランチを切って、そこで編集し、Pull Requestして取り込んでもらう
- この辺りの共同開発は初めてなのであたふたしながらやってる
- 手順書のtypoや更新されていないところをプルリクの練習がてら修正してる
- そしていろいろ間違う
- 今まで
git push origin master
しか知らなかったんや・・・
入社前の自分に伝えたいこと
- さくらのVPSでCentOS 7 のサーバを立てて練習して壊せ
- 開発ソースをローカルで編集して、いちいちサーバに上げて実行、なんてのは迂遠と思うようになり、viとかemacsすごいんでは?ってなるから慣れておけ
- gitに関しては、わかばちゃん本で基礎を固めた後、コマンドベースで解説してある「魔王教授と学ぶGitコマンド入門 ダウンロード版 【オマケつき】 」を手元に置くのが良い
- Plack HandbookでPlackを触っておけ
- miyagawa/plack-handbook
- 一部省略とかあるから気をつけたり、分からなかったら聞いていけ
- 前職や、今まで取得した情報処理試験で学んでたことが現場で見ることができて楽しいので、まぁ心配するな
- チャットで本物のワンライナーが流れてくるという福利厚生がある。楽しみにしておけ