Gaiax TechEgg's Blog

非エンジニアがエンジニアを目指すブログ

インターンを卒業します!

こんにちはー!

おひさしぶりです!@fukufukumarimoです。 3月も終わりにさしかかり、出会いと別れの季節ですね。 私もこのブログを開設きっかけになったエンジニアインターンを3月末で卒業することになりました! それに伴いこのブログもクローズすることとなります。

6月より、Perlの基本的な内容をお送りしてきました。 ブログ公開当初では公開されていなかった、勉強する資料となったPerl入学式の資料も今では公開されています。 引き続き参考にしてくださいね。

6〜9月と基本的な内容を一通り勉強した後は、このエンジニア基礎の総仕上げとして、Amon2で簡易的なTwitterを作成しました。 その簡易的なTwitterを作成した後は、12月〜3月まで社内の蔵書管理ツールのチームにジョインさせていただき、エンジニア基礎学習では見落としていた箇所をまたこの期間でいろいろ学びました。

最後の投稿ではこの最終課題とチームにジョインした内容を振り返ってみたいと思います。

最終課題:簡易Twitterの作成

課題の内容

これまで学んできた知識を利用して、1人で1つのアプリケーションを開発する研修です。開発するアプリケーションの題材はAmon2を使った簡易的な「Twitter」です。ログインして発言を投稿できたり、フォロワーの発言をタイムラインで見れる機能を中心に実装します。この研修の目的は、「アプリケーション開発の全てを, 1人でチャレンジする」という所にあります。

実装内容

以下の機能を実装します。DB設計書、URL設計書、画面イメージなどは参考資料が作成されていました。

  • ユーザ登録
  • 発言投稿
  • タイムライン(ホーム)
  • ログイン
  • ログアウト
  • 全投稿表示
  • メンション確認
  • プロフィール編集

学んだ点

  • 一通りの実装仕方はわかった

Amon2をインストールして自分で実装を進めていったので、全体的に実装して形にしていく雰囲気は掴めたかなと思います。

  • 他人からコードレビューしてもらう大切さ

自分の知識だけで実装していく力も大切ですが、他人にコードを見てもらってレビューしてもらうことも大切だと感じました。自分が思いついたのとは違う切り口での実装方法もあります。それを知ることで、どんどん自分の実装できる幅が広がっていくなと感じました。

  • わからなかった時に質問する大切さ

私はこれが本当に苦手でした。わからないけど、あと5分ググったらわかりそう、と思って1日暮れてしまうタイプです。それを繰り返すと「今更聞けない」という気持ちに変わり、ますます質問できなくなるのです。これは悪循環に陥ってるので早期に脱したほうが身のためです。自分で「10分やってわからなかったら質問する!」というように決めて取り掛かっていくほうが賢明です。そして、質問する際は「なんで質問するに至ったか、どこがわからなくて詰まっていたか」を添えると、優しく教えてくれます。

  • エラー吐いた時の対処法

エンジニア基礎学習では学びきれなかった、エラー吐いた時の対処法。Dumperなどを使って、どこまできちんとデータが渡っているのか?を確認し、問題箇所をいち早く探すことがとても大切です。最初はエラー文がエラー内容を教えてくれているのにもかかわらず、その内容がわからない時があります。その時も素早く質問しましょう。また、エラー箇所を修正する時は「できてるはずなのにできないのはなんで?」というフィルターをかけてしまうと、非常につまづきポイントが見つけづらくなります。エラー文は嘘つきません。謙虚な心で見つけて対処しましょう。

  • 実装する楽しさ

自分が書いたコードがどんどん反映されて、形になっていくのは非常に楽しいです!!!!

社内蔵書管理ツールのチームへのジョイン

上記のツイッター課題を経て「ひとりでやる」というより「チームで何か取り組みたい」という意思があったため、このチームへジョインしました。社内蔵書管理ツールというのは、この名前の通り、社内にある本の在庫管理をするシステムで、2015年入社の新人エンジニアの方が研修の最終課題として制作しました。今、社内の本棚にある蔵書検索、貸し出しや返却もできます。Hipchatとも連携して、入荷した際にはメンションが飛んでお知らせするというような仕組みにもなっています。そんな今となっては欠かせなくなっているツールで、「棚卸し機能」があると、本の管理がとてもしやすくなるとのことで機能実装にかかわることになりました!

棚卸し機能

  • 本棚でISBNを入力して本の情報を読み込む
  • DBと照合して在庫数が一致するかどうかを確認する機能

学んだこと

  • チームでの連携

「チームで取り組みたい」という意思があっての参加なのにもかかわらず、ついつい報告連絡相談を怠りがちになってしまいました。「もう少し完成してから報告しよう」「もう少し考えてから質問しよう」と考えがちに。そこはチームなので、もっと自分をさらけ出してバンバン発言していくべきだったなと思います。コミュニケーションがなくなっていくことがチームとしてやっていく上では一番避けた方がいいことだとも感じました。チームって支え合う感じが一番の魅力なので感謝する気持ちを忘れないで、適度に頼ることも大切だと思いました。

  • 誰もが読んでわかりやすいコードをかくこと

また、コードはチームみんなの財産になるということを考えて、配慮しながらわかりやすい命名にしていく必要が有ります。また、実装も読んでわかりにくいものだと、他のチームメンバーへの負担がかかります。こういった点で常にわかりやすい命名、わかりやすい実装を心がけることが必要だと感じました。

もちろん最終課題時にも感じた質問する大切さも痛感しました。なかなか質問できない体質は変わりにくいですが、自分でも努力することが大切です。

まとめ

最終課題で「ひとり」ですすめていくことをメインにし、チームにジョインすることで「人と連携」しながらすすめていくことをメインにしていきました。このどちらにも共通していたことは、質問する大切さです。課題の早期発見や早期解決は物事をすすめていくにあたって、非常に効率的です。また、自分ではカバーできない知識もたくさんあるともいます。その知識を持っているのは自分の周りの人たちです。どんな機能もいろいろな実装の仕方があります。ひとによって見方が全然違うことを心に留めて、周りの方と協働してよりよいものを作り上げていくことを忘れないようにしたいです。

最後に

6月開設からご愛読してくださった皆様誠にありがとうございました。 この記事をもってブログ終了としたいと思います。 これからも自分でエンジニアリングを学び続けたいと思います。 Perlのコミュニティにいくつか顔を出させていただいた時に、お話ししてくださった皆様、どこかでまた見つけた時にはぜひ声かけてくださいね。

ありがとうございました!

Perl入学式の資料で勉強した人の話

こんにちは@fukufukumarimoです。
これはPerl入学式Advent Calenderの21日目です。


perl入学式校長と同じ会社にてエンジニアとしてのインターンをしています。
エンジニアとしてのインターンをし始めたきっかけはとってもささいなことです。
わたしがエンジニアを目指し始めたのもささいなことです。
わたしが初めて勉強する言語をPerlにしたのもささいな流れです。

ささいなことが何回も重なって、勉強し始めた日から半年経った今があるわけですが、
いつも感じるのは

「コードをかけばかくほどわかるようになる、質問をすればするほどわかるようになる」

ということです。

質問の大切さ

インターンを始めた頃、わたしに渡されたのは席とPCとメンターです。
出勤のたびに、席に座り、PCを開いて、Perl入学式の資料を読んでこなしていく日々が続きました。
「わからないことがあればきいていいよ」というメンターがいる、とっても優しい環境に恵まれながらも、 わたしはあまり(エラーが出すぎてどこから手をつければいいのかわからなくなった時以外)質問するほうではありませんでした。

質問をするという習慣がなかったのです。

そもそも質問の仕方がわかりませんでした。
こう書いたら、こう動くはずなのに、そう動いたか、、、なぜだろう?と一人で考えてばかりで、
「あともう少し考えれば、解決できるかも」という気持ちで、
5分が1時間になることもありました。
何が原因か特定の仕方すらわらないので、効率的に調べることもできなく、
ただ単に「できない」と嘆くようになりました。
でも、エラーがでるのは自分の書いたコードのどこかがその原因になっているわけで、
自然発生的にプログラムから不具合をおこしてるわけではないのです。
毎回「書いたプログラム通りにしか動かないんだよ」と教えられていました。

そうして、何時間も自分で考えてもわからなかったことが、質問をすると、
たったの何分かで解決し、わかるようになりました。
自分で考えることも大切だし、自力で解決するところまで持っていくことも大切だけど、
知ってしまえば一発で解決するようなことで
時間を永遠と消費するのは良くないことに気づきました。

コードレビューの大切さ

わたしの悪い癖のひとつが、わからない部分があっても、他のコードの例をみてよんで
自分の(間違った)仮説の中でわかったフリになっているだけというのがありました。
質問したり、資料について直接口に出して話したりすることがなく、
多くのことを読み間違えているのに気づかないまま、最終課題まで来てしまいました。

最終課題は、(たぶん世の中で一番簡単な)簡易的なTwitterでした。
コードレビューで「ここをhashで処理してみて」といわれても、
hash自体や、なんでここはhashにしたほうがよいかも理解できるけど、
データをどう設定して取得して渡していくのか?というデータフローが、
全然頭の中で整理できなかったのです。

ここに来てようやく気付いたのは、わたしの最大の弱点は「データフローの認識の甘さ」でした。
データがどう渡されて、どう展開されればよいのか?というような、全体の流れを読みきれてなかったのです。
コードレビューで「なんでこの処理にしたの?」に対して、話せば話すほど、
いままでなおざりにしていた細かい認識不足、データフロー、構文読み違いに気付きました。
勉強し始めて4,5ヶ月経った頃やっとでした。

振り返ってからの反省点


- わからないと思った時に質問しなかったこと - 自分の解釈で自分の中で納得してしまったこと - コードレビューの機会を短いスパンで設けなかったこと - データフローを直接書き出して確認せずに進めたこと


以上を踏まえてAmon2で簡易Twitterを作り終え、自分で何度かMojoliciousなどを触ってから、
いまは弊社のなかで蔵書管理を目的として作られた「しょこたん」という管理ツール
機能追加をしながら、チーム単位での開発に取り組んでいます。

いまも試行錯誤の日々ですが、常に心がけていることは

  • 5分考えてわからなかったことは質問する

    • 「目的:〜したい!」→「方法:そこためにこれを考えてしてみた!」→「結果:だけどこうなってしまった!」→「対処:なのでこうしてみた!」→相談or質問
    • 一連の流れを説明すると◎
  • 新しく実装する時はデータフローを紙に書いてからにする

    • 例:追加ボタンをおしたらPOST /addsub addにパラメータを送り、sessionからall_booksをgetし、パラメータを加えたものをsetし、GET /newsub newへパラメータを渡す。

f:id:fukufukumarimo:20151221154410j:plain

  • とりあえずコードを書いてみる

    • データフローができたらコードを書いてみる
    • 「こっちがいいかな?あっちがいいかな?」と迷わずにとりあえずコードを書いてみる
    • もしダメな場合も書いてみることでエラーがみれる
    • エラーをみることでなんでこの方法ができなかったのかが明確になる
  • コードレビューの機会を設ける

    • 自分のなかでは最善でも他人(読む側)には最善ではないかもしれない
    • 他の書き方があるかもしれない(知見の共有)


これを繰り返し続けていくことで、意識的に手を止めずにコードを書いて検証する癖がつきました。

Perl入学式の強さ

またこれらの要素が自然に揃っているのがPerl入学式」だと思います。
資料があって、その場で質問に答えてくれる人がいて、話す相手がいて、、、
しかもサポーターの方々はとっても理解ある人たちばかりです。
初心者の人がはまりそうなことも、わかってくれていて、
もし自分がはまることがあっても、恥ずかしがることはありません。
どんな質問にも、詳しく答えてくれます。
そもそも質問の仕方がわからなくても、まずそれを聞いちゃいましょう。

開発している時間のなかで、悩む時間やハマる時間があると次につながる!と
いうこともあると思うんですけど、変なループに陥って、
時間と見合わない結果を目の当たりにして、さらにループに陥るより、
さっさと質問して自分の実力をあげていくことができる環境だと思います。

わたしもいま、蔵書管理ツールの追加機能作成に携わっていますが、
コードを書く前から、結果をあれこれ懸念するより、
トライアンドエラーを繰り返してどんどん書く!どんどん質問!を繰り返すようにしています。
(昔よりよくなったつもり。。。w)

どこかで誰かに教える側の人へ

初心者に近い人にプログラミングを教える際は、
絶対にデバッグの方法」も一緒に教えてください!
この変数にちゃんとデータが渡っているかどうかをみるための方法を
知るだけで、エラーの原因を特定しやすくなり、
初心者特有のコードとにらめっこの時間は少なくなります!
わたしは「デバッ...グ...?」ってなっている期間が長かったので、
知った時にはもっと早く知っておけばなあという印象でした。
あと、すこしずつコード書いたら実行してエラー出ないかどうか確認する、
ということも忘れがちで、大量に書いて大量にエラーということもあるので、
(has too many errors...というエラー文を出したことが多数ある!)
はじめに教えておくとスムーズかなと思います!

さいごに

最初のわたしは

  • 質問できない
  • 自分の書いたコードも説明できない
  • 簡単な構文すら正しく理解できていない

コード負債三冠王でしたが、いまとなってはこの三冠が弱点だと知ったので、
これからももっと人よりもコードを書いて動かしていきたいです!!!

なにはともあれ、わたしのはじまりはPerl入学式の資料を勉強し始めたことからのスタートです!
いまでも資料を見返す時はいっぱいあります。
ブックマークバーに入ってます。ワンクリックで資料までとべます。
ライブラリよりも実際にどのように使うか書いてあるので使いやすいです。
最初に勉強した資料がPerl入学式の資料で必要な知識を高速に勉強できたのだと思います。

Perl入学式のような手厚い資料と手厚いサポータでの勉強会は
ぐぐっと実力をつけることができる貴重な機会だと思いますので
ぜひ一回参加してみてくださいね!

基礎① 10. Amon2 入門 第2部をやってみた

いよいよ基礎①が終了になります!

github.com

Perl入学式のこちらの資料に基づいて勉強しています。
今回は前回に引き続き、Amon2をつかってSchedulerアプリを作ります。
いままでは、Perl入学式の資料から抜粋して記載していましたが、
今回はSchedulerアプリを作る際にDBとして使用したSQLiteを中心に記載します!


エンジニア基礎①
1. Perl環境基礎
2. Hello,world!
3. Perl基礎
4. 配列・for文
5. ハッシュ
6. リファレンス
7. サブルーチン
8. 正規表現
9. Amon2 入門 第一部 
10.⭐️ Amon2 入門 第二部 ⭐️

ゴール?


  • Amon2でSchedulerアプリをつくる
  • アプリケーションを開発する際の順番の確認
  • SQLiteについて

順番

今回はこのような感じで進めていきましたね!

  1. DBスキーマ(sql/sqlite.sql)の設置
  2. Tengスキーマlib/Scheduler/DB/schema.pm)の編集
  3. テンプレートの編集(tmpl/index.tx, tmpl/include/layout.tx)
  4. lib/Scheduler/Web/Dispatcherの編集

アプリケーションを作る際は、まずはDB関連の設定を済ませてから、テンプレートやDispatcherの編集をします。
Amon2では、デフォルトでDBの設定がSQLiteになっているので、もしMySQLを使用する場合はconfigでDBの設定を変更します。

DB(Database)

DBとは管理されたデータのことをさします。そのなかでも、コンピュータ上で作成、保管され、専用のソフトウェアによって管理されるもののことを「データベース管理システム」(DBMS:Database Management System)といいます。

RDBMS(Relational Database Management System)

DBは、データをどのような構造で格納、管理するかによって様々な種類があり、よく利用されるのは「リレーショナルデータベース」(RDB:Relational Database)です。これは、データを複数の表(テーブル)で管理することによって、集合論で定義されてる関連性を扱えるようにしたデータベースの管理方式になります。テーブルは、属性を列、組を行で表しています。
ここでの集合論で定義されているとは、3つの見出しで構成されるテーブルがあったとすると、このテーブルの各列のデータは、各々のカラムの集合から1つずつ任意の要素をとり、その要素持った行が出来上がります。そして、言い換えると、この行は、各カラムの集合(型)の部分集合であると言え、3つの見出しの関係が成立しており、これが集合論で定義されているということです。
RDBMSとは、RDBを管理するための専用ソフトです。これは、ある管理領域で、テーブルの作成や消去、修正、更新、追加、検索、抽出、削除を行います。 そのなかでも今回使われているSQLiteの説明します!

SQLite

SQLiteはSchedulerのDBとして使用しましたね!
SQLiteはサーバーを立ち上げるわけではなく、そのままアプリケーションの中に組み込んで使用出来る軽量のRDBMSです。大規模なDBには向いていませんが、今回のような中小規模ならば、速度にも問題なく使用出来ます。

メリット

  • ファイルベースでの管理
  • バックアップが楽
  • レンタルサーバで利用可能なことが多い

今回はローカル環境でしたが、レンタルサーバRDBMSを使いたい時, ときどきMySQLが使えないことがありますが, SQLiteなら利用できる場合があります。

デメリット

  • パスワード設定がない
  • 同時に複数の書き込みができない
  • 日本語の情報がMySQLなどに比べて少ない

以上より、SQLiteは取り扱いが比較的簡単なRDBMSです。

Amon2でSchedulerを作成する際に大切になってくるDBに関して、少し取り上げてみました。
他のRDBMSでは、世界中でよく使用され、大規模なDBにも対応できるMySQLなどもあります。
どれくらいのデータ、どのようにデータを扱うかによって使い分けていきましょう。


私はデータベース関連の構造がわからなくて、最初の段階で「これはどうなっているのだろう?」とつまずきました。
ここではRDBMSでもSQLiteのみでしか取り上げられませんでしたが、
またMySQLなど他も取り上げられたらと思います。

基礎① 9. Amon2 入門 第1部 をやってみた

今回は実際にスケジュール管理アプリを作成していきます!

Amon2の構成を中心に見ていくAmon2第1部です!

github.com

Perl入学式のこちらの資料に基づいて勉強しています。どうぞご参考に!


エンジニア基礎①
1. Perl環境基礎
2. Hello,world!
3. Perl基礎
4. 配列・for文
5. ハッシュ
6. リファレンス
7. サブルーチン
8. 正規表現
9. ⭐️ Amon2 入門 第一部 ⭐️
10. Amon2 入門 第二部

ゴール?(めやす:60分)


  • WAFについて理解する
  • Amon2の準備・構成の理解

おさえておきたいこと


WAF(Web Application Framework)

WAF(ワッフ)とは、動的なウェブサイト、Webアプリケーション、Webサービスの開発をサポートするために設計されたものです。Web開発で用いられる共通した作業に伴う労力を軽減することを目的としています。例えば、データベースへのアクセスのためのライブラリや、セッション管理ができるものがあります。PerlでかけるWAFはいくつか存在し、Mojolicious、Mojoliciousをより簡易的な構造にしたMojolicious::Lite、そして今回のAmon2、Amon2をより簡易的にしたAmon2::Liteなどがあります。Rubyで書けるWAFはRuby on Railsなどが有名です。

Amon2

今回使用するAmon2はPerl製WAFのひとつです。Amon2は、ウェブアプリケーションを作っていく最低限の機能は備えており、とてもシンプルな構造になっています。初心者にとってわかりやすいのです!それゆえ自分で拡張することによって様々な機能を追加することができます。 Amon2は、クライアントサイドのJavaScriptもライブラリが読み込まれています。一通り使えるようになっているので、無駄な手間がかかりません。 今回はAmon2を使って、スケジュール管理アプリ「Scheduler」を作っていきます。

ではスタート!


1.Amon2のインストール

以前にCPANをインストールしているとおもいます。

gaiax-techegg.hatenablog.com


cpanmコマンドでAmon2をCPANコマンドでインストールしましょう。

$ cpanm Amon2


$ amon2-setup.pl ディレクトリ名でディレクトリに雛形を作ります。

$ amon2-setup.pl Scheduler


これで、Schedulerというディレクトリができました。

2.基本的なAmon2 Webアプリケーションの構成

Amon2は以下のようになっています。

Build.PL
builder
config
cpanfile
cpanfile.snapshot
db
lib
minil.toml
script
sql
static
t
tmpl
xt

主に使うものだけ解説します。

  • config:Amon2全般の設定ファイルになります。
  • cpanfile:cpanmモジュールを管理します。追加削除ができます。変更したら、carton installして差分を読み込みます。
  • db:RDBMSとしてSQLiteのデータを置きます。
  • lib:lib下のWeb/Dispatcher.pmでcontrollerにあたる部分になります。
  • sql:DBでのschemaの設置をします。
  • static:静的ファイル(css/javascript/imgなど)を置きます。
  • tmpl:index.txinclude/layout.txではviewにあたる部分の機能になります。

    「view」「controller」にあたる部分について詳しく見ていきましょう。

$ vi lib/Scheduler/Web/Dispatcher.pm

をすると、cdでディレクトリを移動しなくてもファイルを直接編集できます。


Controller

lib以下をみるとこのようになっています。

package Scheduler::Web::Dispatcher;
use strict;
use warnings;
use utf8;
use Amon2::Web::Dispatcher::RouterBoom;

any '/' => sub {
    my ($c) = @_;
    my $counter = $c->session->get('counter') || 0;
    $counter++;
    $c->session->set('counter' => $counter);
    return $c->render('index.tx', {
        counter => $counter,
    });
};

post '/reset_counter' => sub {
    my $c = shift;
    $c->session->remove('counter');
    return $c->redirect('/');
};

post '/account/logout' => sub {
    my ($c) = @_;
    $c->session->expire();
    return $c->redirect('/');
};

1;

packageでこのlib/Scheduler/Web/Dispatcher.pmをひとまとまりとして、Scheduler::Web::Dispatcherという名の関数として扱えます。use モジュール名;で依存モジュールをこのDispatcher内で使えることができます。any '/' => sub {...}post '/' => sub {...}などのサブルーチン、コンテキストの解説は、papixさんの資料(https://github.com/perl-entrance-org/Perl-Entrance-Textbook/blob/master/amon2/1.md#controller) がとても詳しく書いているので、ぜひ参考にしてみてください。

View

では次にviewにあたる部分です。viewにあたる部分はtmplのなかのindex.txと、include/layout.txになります。また、Amon2はText::Xslateというテンプレートエンジンを使用しており、シンタックスはデフォルトのKolonを使用しています。詳しくはドキュメントを参照してください。


ではまずはlayout.txからみていきましょう。

<!doctype html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title><: $title || 'Scheduler' :></title>
 
      ... 中略 ...

    <div class="container">
        <div id="main">
            <: block content -> { } :>
        </div>
        <footer class="footer">
            Powered by <a href="http://amon.64p.org/">Amon2</a>
        </footer>
    </div>
</body>
</html>

HTMLの書かれた中に<: block content -> { } :>があります。これはtmpl: override content -> {...}に記された内容を読み込みます。これによってtmplが複数に渡って書かれていても必要によって組み合わせることができるわけです。

tmpl/index.txをみてみましょう。

: cascade "include/layout.tx"

: override content -> {

<h1 style="padding: 70px; text-align: center; font-size: 80px; line-height: 1; letter-spacing: -2px;">Hello, Amon2 world!</h1>

    ... 中略 ...

<h2>Session counter demo</h2>

<p>You seen this page <: $counter :> times.</p>

<form method="post" action="/reset_counter">
    <input type="submit" name="Reset counter." class="btn btn-default">
</form>

: }

1行目の: cascade "include/layout.tx"は、2行目以降の: override content -> { ... :}で書かれている内容をinclude/layout.tx<: block content -> { } :>に渡すという意味です。


モジュールのインストール

まずは、アプリケーションに必要なモジュールをインストールしましょう。

以前紹介したCPANモジュールはアプリケーションで使用します。時間を表したい時は、Time::Pieceや、バリデーション(エンジニア基礎③で登場します)をしたい場合はFormValidator::Liteなどをつかいます。

Cartonは、Webアプリケーションの依存モジュールを管理してくれるアプリケーションです。cpanmコマンドでインストールしたモジュールとは別に管理してくれます。
Cartonは、cpanmモジュールなので、インストール時はcpanmコマンドでインストールしましょう。Cartonを利用する時は、cpanfileがあるディレクトリに移動してcarton installすると、使用できるようになります。

$ cpanm Carton
$ cd Scheduler
$ carton install

これで、必要なモジュールはcartonによってインストールされました!
インストールすると、localというディレクトリを生成し、この中に依存モジュールをインストールして管理しています。

インストールしたモジュールを利用しながら、Perlスクリプトを動かすには、carton execを利用します。今回のSchedulerの場合は、amon2-setup.plで雛形を生成した際にscript/scheduler-serverという起動用スクリプトが生成されているのでこれを使って、アプリケーションを起動します。

$ carton exec -- perl -Ilib script/scheduler-server
Scheduler: http://127.0.0.1:5000/


起動したら、ブラウザでlocalhost:5000に接続すると、Schedulerがでてきます!

参考:
Perl Advent Calendar Japan 2011 Teng Trac

第18回 Amon2によるWebアプリケーションの高速開発(2):Perl Hackers Hub|gihyo.jp … 技術評論社


今回は第一部としてAmon2の構成を中心にみていきました。
コンテキストへの理解と、全体的に変数やテンプレートをどう渡しているのかの流れを理解するのが大切です。
もし、わからないことがあれば ORM((O/Rマッパ, Object-Relational Mapper)は、RDBMSから取得した単一行のデータを特定のクラスと紐付けてオブジェクト化してくれる仕組み)ではTeng、tmplではText::XslateのKolonのドキュメントをみてみてください。
次回ではSchedulerを作っていきましょう。

Kichijoji.pmにいってきた!

みなさんは各地域で開催されているPerlのコミュニティをご存知でしょうか!?
もちろんガイアックスのある五反田でも「Gotanda.pm」を定期的に開催していますが、
吉祥寺でも「Kichijoji.pm」が1年前より@magnolia_k_さんによって開催されています!
今回は10月9日に開催された「Kichijoji.pm#5」(今回でちょうど1周年目?めでたい!)に参加してきたのでちょっと感想を書き留めておきたいと思います〜?

テーマ「長く続ける」

Talk一覧

  • 長く続けるサービスとテスト / yowcowさん
  • EU訪問 / papixさん
  • テストが全くなかったプロダクトでCIまでできるようになった話 / KZHさん
  • 私とWeb日記+α / songumuさん

LT一覧

  • エンジニアスケジュール管理の話 / htk291さん
  • 業務改善の技術 / ytnobodyさん
  • LLエンジニアのとある生存戦略 / i47_rozaryさん
  • ガラパゴスExcel / veryblueさん
  • Perl入学式に参加して初めてWebアプリを作った話(YAPCリベンジ) / gch0929さん
  • Perl初心者が、IoTでPerlを使おうとする話 / umaaaaa_chanさん
  • 新卒 Perl 一年目が JavaScriptアサーションライブラリ Chai を Perl に移植した話 / pine613さん
  • Qiita::Teamを導入して「長く続ける」為に僕達がやったこと / papixさん

心に残ったメモ

私とWeb日記+α / songumuさん

はてな東京オフィスの方ですが、今回の話は前半は長年続けていらっしゃるWeb日記の話、後半は更新系SQLを手で打つときに気をつけていることのお話でした。songumuさんのブログ、みなさんも一度はみたことあるのではないでしょうか?前回イベントレポートとしてあげたリジェクトコンの元となる「YAPC::Asia Tokyo 2015」にも登壇されていた方です!

www.songmu.jp

songumuさんはWeb日記を2003年から書き続けているそうで、少し形態は違いますが、私もこのブログを始めて思うところに通ずるところがありました。

  • 日常からのネタストック
     普段から「あれ、かきたいなー」とストックしておいて、ネタを日々探しておくこと。
  • 更新をしやすい環境を作る
     「更新」への壁を低くする。自分のやりやすいように、環境を整えることが大切。
  • 継続
     なにより大切。はじめたら続けてみる。

一番最後の継続って意外と大変ですよね。前ふたつの「ネタストック」「更新しやすい環境」を整えれば、継続しやすくなると思うので、自分の中でも心に留めておいて、このブログを続けていこうと思います。

Perl入学式に参加して初めてWebアプリを作った話(YAPCリベンジ) / gch0929さん

Perl入学式に参加したのがきっかけで、Webエンジニアに転職した@gch0929さんのアプリを作ってみた話。


なにがきっかけになって、どう役立つのかまたは影響するのかっていうのは、出会った時にはわからないので、だからこそ、続けてみることが大切だと感じました。続けてみて見えることが変わってきたり、そういうことがまた誰かのきっかけをつくったり。「Perlのコミュニティが良い」って書いてあるのは、こういうサイクルが永続的にあるからではないでしょうか。LTを聞いていて、私もがんばろう!と背中押されました(^o^)

感じたこと

Perl入学式がきっかけでweb関係に進んだ方(LT:Perl入学式に参加して初めてWebアプリを作った話(YAPCリベンジ) / gch0929さん)による、「PerlでWebアプリをつくってみた!」という発表がありました。LTだったので、質問などの時間はなかったのですが、その後twitterで「これ実装したらもっと良くなる」なんて言葉があったりもして、発表することによって自分の知識が100になっていったり、もしくは誰かを100にさせたり、120させたり、お互い刺激し合えるんだなと思いました。しかも、反応を直接もらえるのはモチベーション面でも良いことだし、Perl入学式がきっかけで転職したのを聞いて、人が人に与える影響力ってすごいなとも感じました。
今回のお題は「長く続ける」だったので、トークはテスト関連の話が多くて、「なにいってるかわかんない。。。」ってなりましたが、「最近の子はみんなテストかけますよ〜」なんていう情報を聞いて「むむむ。まじかよ。。。」となったりして、刺激を直にうけました。。あと、確実に前よりもわかることが増えてきて、こういうところでも自分の知識がトントンと増えてきたことを実感できるんだ!と楽しくなりました。こういうイベントはぜひまた参加したいですね!!!!!
そして大切なのはなによりも「懇親会に参加していろんな人と話しする」ことです!今回、懇親会への申し込みをすっかり忘れていて、参加できなかったのですが(大抵別申し込みなので、みなさんもお気をつけて!)、せっかく集まったのにここで交流しないなんてもったいないと思います。「最近こういうのが便利そう」だのいろんな意見を交換するのでもよし、根掘り葉掘りトーク内容を聞くのでもよし、、こういう場所に行かないとできないようなことを、機会があるなら手に入れるべきだと思います!次は絶対行くぞ!w

余談

おわったら、twitterでこんな流れに。。。

f:id:fukufukumarimo:20151014094147p:plain
次のKichijoji.pmは1月にあるそうですね! そこでは発表ですかね。。。!お楽しみに!?w

基礎① 8.正規表現をやってみた

みなさんにお知らせがあります!
このブログの元になっている資料が公開されました!

github.com


私はこれを元に勉強してきたので、皆さんも参考にしてみてください。
さて今回はもっともperlらしいといわれる「正規表現」には入ります!

エンジニア基礎①
1. Perl環境基礎
2. Hello,world!
3. Perl基礎
4. 配列・for文
5. ハッシュ
6. リファレンス
7. サブルーチン
8. ⭐️ 正規表現 ⭐️
9. Amon2 入門 第一部
10. Amon2 入門 第二部

ゴール?(めやす:30分)


おさえておきたいこと


正規表現

正規表現とは、幾つかの文字列を一つの形式で表すための表現方法です。正規表現によって、必要としているものを、膨大な文字列の中から自由自在に検出したり、置き換えたりすることができます。例えば、「検索機能」を実装する!ってなったときは、この正規表現を用いれば、「○○を含む検索」などのキーワードの設定ができるわけです!
でも、この正規表現はとても複雑なので、よく使うもの、基本的なものだけを紹介します!

メタ文字

正規表現で、幾つかの文字に対して特別な意味を与えています。これらを「メタ文字」といいます。

. ^ $ [ ] * + ? | ( )

これらのメタ文字を使って、条件にあったものがあるかどうか判定します!

いざスタート!


1. パターンマッチ

◼︎完全一致 eq

my $str = "pattern match!";
if  ( $str eq 'match') { 
      print "'$str'できました!\n";
}else{
      print "完全一致しませんでした。\n";
}

完全一致しませんでした。

eqは完全一致か否かをみます。
この場合$strmatchが完全一致しているのかをみているので、表示結果は「完全一致しませんでした。」になります。

◼︎含む =~ /文字/ /含まない !~ /文字/

my $str = "pattern match!";

if ( $str =~ /match/) {
  print "'$str'は'match'を含みます!\n";
}
if ( $str !~ /match/) {
  print "'$str'は'perl'を含みません。\n";
}

'pattern match!'は'match'を含みます!

=~ /match/=/ここに入った文字/が含まれると一致
!~ /match/=/ここに入った文字/が含まれないと一致

含む、含まないは以上のように表記することでパターンマッチすることができます。

2.文字列のマッチ

メタ文字を駆使して文字列を呼び出すことができます。

◼︎文字列の呼び出し

my $word = "五反田にはガイアックスがあるらしい";
if ( $word =~ /五反田(.+)ある/) {
  print "渋谷$1ない\n";
}

渋谷にはガイアックスがない

(.+)は任意の文字に一回以上マッチしたものを取得するので、(.+)には「五反田」と「ある」の間の「にはガイアックスが」が入ります。それを$1の変数として取得しています。これは複数個連ねることもできます。

◼︎複数個の文字列の呼び出し

my $word = "五反田にはガイアックスというIT系企業が多い";
if ( $word =~ /五反田には(.+)という(.+)/) {
  print "渋谷には$1はないが、$2\n";
}

渋谷にはガイアックスがないが、IT系企業が多い

前者の(.+)は$1、後者の(.+)は$2と、(.+)が複数ある場合は先頭から順に取得しています。

3.メタ文字

先ほど紹介した以外のよく使うメタ文字一覧

メタ文字 役割
. ピリオド。ワイルドカード:任意の一文字にマッチ!
* 直前におかれているものに0回以上マッチ!
.* 任意の文字に任意の回数マッチ!
+ 直前に置かれているものに1回以上マッチ!
.+ 任意の文字に一回以上マッチ!
? 直前のものが、1回現れるか、現れない、の2択!
( ) パターンをグループ化にしてマッチ!($1などで後方参照できます)
(?:) 後方参照しないグループ化!
\w アルファベット, 数字, アンダーバーの1文字
\W アルファベット, 数字, アンダーバー以外の1文字
\d 数字の1文字
\D 数字以外の1文字
\s 空白文字にマッチ
\S 空白文字以外にマッチ
\b 単語の境界(置いた前後)とマッチ
\B 単語の境界以外とマッチ
^ 行頭の文字列とマッチ
$ 行末の文字列とマッチ


これらの知識を使って、文字列のパターンマッチをしましょう!

【例1】
複数あるものの中から、必要な情報があるか確認できます。
「y」を含む言葉があるかどうか判定したい時、以下のようにします。

my $color = "red blue orange green yellow black white";
if ( $color =~ /y(.+)/) {
  print "あてはまるものはあったよ!\n";
}else{
  print "あてはまるものはなかったよ!\n";
}

あてはまるものはあったよ!


y(.+)は「y」と「なんらかの文字を含む」のを条件にしています。
今回は「yellow」があるので、「あてはまるものがあったよ!」に判定されました。
もし「skyblue」があった場合もマッチします!

「y」からはじまる言葉があるかどうかを判定したい時、以下のようにします。

my $color = "red blue orange green yellow black white";
if ( $color =~ /\b(y\S+)/) {
  print "y からはじまる単語 $1 がありました。\n";
}else{
  print "yからはじまる単語は見つかりませんでした。\n";
}

y からはじまる単語 yellow がありました。

これは2行目の(y\S+)で「yに続く文字が空白文字以外である」ことを判定し、\b(y\S+)\bを付け加えることで、「yの直前になにもなく(=yではじまる)、直後に空白文字以外が続く」ことを判定します。
よって、「yellow」がマッチするのです!

【例2】
もしなにかのサービスで新規ユーザの登録をするとき、よくみかける「アルファベット、数字、アンダーバーのみ使用可」というのもこの正規表現で判定することができます。

my $username = "marimo";
if ( $username =~ /\W/ ){
  print "アルファベット、数字、アンダーバーを使用してください。";
}else{
  print "登録可能です。";
}

登録可能です。

もし「marimo」ではなく「marimo*」をusernameで使用すると、「アルファベット、数字、アンダーバーを使用してください。」と表示されます!
1行目のmarimomy $input = <STDIN>;にして試してみてください!

【例3】変数として扱うこともできます。
もしなにかのサービスで子供が安全に使えるように検索機能で「凶暴」という言葉を制限するとします。

my $input = <STDIN>;
if ( $input =~ /凶暴/) {
  print "この言葉は検索できません。\n";
}else{
  print "検索結果を表示します。\n";
} 

↓凶暴と打った場合

この言葉は検索できません。

↓安全と打った場合

検索結果を表示します。

以上、正規表現を用いた例でした!

4.置換

s/置換したい文字/置換した後の文字/というふうにおくと置換できます。

my $word = "red blue yellow";
print "$word\n";
$word =~ s/red/orange/;
print "$word\n";

red blue yellow
orange blue yellow

1行目が置換前、2行目が置換後の文字列が表示されました!
例えば、今日の会議だけ、開始時間が一時的に変更になったとき、2行目を足せば大丈夫!

my $action = "今日の会議は10:00開始です。";
$action =~ s/10:00/12:00/;
print "$action\n";

今日の会議は12:00開始です。

--

以上が正規表現になります。
perlでの正規表現は分厚い本が一冊あるほど、奥が深いと言われています。。。
簡単な例を出して考えてみましたが、どんな風に使うか実感わいたでしょうか!?
メタ文字はこのほかにもいっぱいありますので、場合にあったメタ文字を探してくださいね!

YAPC::Asia 2015リジェクトコンにいってきた!

まずはYAPC::Asia Tokyo 2015


みなさん、東京ビッグサイトで行われた、YAPC::Asia Tokyo 2015ご存知ですか!? 私は今年、最初で最後のYAPCに参加してきました!(今年が最後なんだそうです泣)これは、Perlのカンファレンスで、PerlのパパのLarryWall(ラリーウォール)・Rubyのパパまつもとゆきひろさん・Perlに関しての技術書を執筆なさる牧大輔さんなど著名人や、Perlが大好きなエンジニアたちが一堂に集まりました!会場いっぱいに入るエンジニアのみなさんをみて、私のモチベーションはだだあがり!サイトに感想ブログのまとめがあるのでぜひみてみてください。
YAPC::Asia Tokyo 2015
そんなYAPC(ヤプシー)で数十人の方がトーク・LTで登壇なさったのですが、応募したけども惜しくもリジェクト(落選)してしまった皆様にもう一度チャンスを!ということで、YAPC::Asia 2015 リジェクトコンが9/11に開催されました!参加してきたのでレポートをあげたいと思います!
f:id:fukufukumarimo:20150916112438j:plain

リジェクトコン コンテンツ


トーク

LT

トーク


厳選してお届します!

Extreme remote working / @yusukebe

資料:http://www.slideshare.net/yusukebe/extreme-remote-working

株式会社オモロキのCTOのゆーすけべさんのトーク。「ボケて」のサービスは「フロントエンド」「バックエンド」「モバイルアプリ」の3つをしっかりと明確化させたリモートワークでなりたっているんですね。それぞれできることを、できる範囲で、個人の力量にお互いまかせられる信頼関係がこのチームにはあるんだなあと思いました。分業をしっかりと明確化することによって、リモートワークでもなんでもスムーズに仕事が進むわけですね!

光のMySQL 5.7 / @yoku0825

資料:http://www.slideshare.net/yoku0825/mysql-57-52669804

私には少し難しかったけれど、MySQLすこし触ってみようかなって思いました!!!DB周り、もっと勉強しようと思います!それにしても@yoku0825さんのMySQLについての知識は半端ないですね。。。それぐらいのめり込んで深く知っていきたいなとおもいます!

LT


厳選バージョンで!てつじさんの背中押される話と、以前よりお話聞きたかった津田さんのおはなし。。。

mod_perlプログラマーYAPCリジェクトコンで語るレガシー開発論 / @xtetsuji

資料:http://www.slideshare.net/xtetsuji/modperlyapc

前職でmod_perlを極めたtetsujiさんのLT。今までの仕事のお話や、それを通じてこう思うなど、今のエンジニアさんの技術的な面にもスピリチュアルな面にも触れる内容でした。LTのなかでもおっしゃってましたが、「若い人は自信がない!自信持っていいんだよ!」と励ましの言葉だったり、「スターエンジニアじゃない生き方も楽しい!」とエンジニアのみなさんの背中を押してくださいます!私もなんどもtetsujiさんに助けられました。テンポのいいまとめられた素晴らしいLTにみんなのめりこんで聞いていました!実際にきいてほしいところ。。!

採用を支える技術 / @crazygirl_lover

資料:http://www.slideshare.net/mamikotsuda1/ss-52705169

株式会社MobileFactoryで人事を主になさっている通称ジンジニアの津田さん。採用PDCA(現段階の問題や解決策を把握→起きてる問題の根源を特定→ 問題のなかで優先順位を特定→それに向けた解決策を検討→実施→レビュー...)は、エンジニアリングと似ていることを人事かつエンジニア視点よりお話されていました。課題を解決するためのコミュニケーションは素朴なPDCAの繰り返しでもあり、エンジニアリングに使っている力はチームビルディングにも役立っているということ。ゆーすけべさんの兼業のお話もですが、いろんな視点を持っていると物事を多くの側面から見ることができるんだなと身に沁みて思いました。

まとめ

今回のトークの技術的な話はあんまりわからなかったけれど、ここでわかったのは、

  • MySQLがなんだか深そうだな
  • アップデートによる言語の変化っておもしろいな
  • みんなそういう変化を楽しんでいるんだな
  • 立場によって見える視点が異なる
  • 何もわからない私でも参加できる素敵な雰囲気だった
  • いろんな人のプレゼンツールを見れた

っていうことです!お寿司もピザもビールも飲めたので満足です!w
f:id:fukufukumarimo:20150916112153j:plain
こんなまだまだ経験もない私も、こういうイベントに参加して、
自分では掘り下げられないようなお話も聞けたし、
やっぱり自分から何かに参加したり、積極的に動くのは大切だなーと思いました。
またイベント行ってきた際はかきますね!

資料

リジェクトコンについてのブログ