Perlがくしゅう帳(Rubyも)

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

Perl入学式夏休みドリル その3

Perl入学式ドリル(入学式第2回編)の続きです。

Let's challange!

配列操作の命令

  • [問41] 配列@numを宣言し、 1から1000までの整数を配列に代入する。(要素数は1000個になります)
  • [問42] 問41で作成した配列を利用して、1000から1まで逆順に並んだ数字の配列@rev_numを作る。
  • [問43] 問42で作成した@rev_numの要素を昇順にソートした配列@sort_numを作る。

for文

  • [問44] 問41で作成した@numの要素を先頭から順番に出力する。(for文を使う)
  • [問45] 問41で作成した@numの要素のうち、先頭から10番目までの要素出力する。(for文を使う)
  • [問46] 問41で作成した@numの要素のうち、100番目から110番目までの要素出力する。(for文を使う)
  • [問47] 問41で作成した@num、問42で作成した@rev_numを使い、2つの配列の同じ添字の値を足した時全て1001になるか調べるコードを書く。(for文を使う)
  • [問48] 問41で作成した@num、問43で作成した@sort_numを使い、2つの配列の同じ添字の値が全て同じになるか調べるコードを書く。(for文を使う)
  • [問49] C言語風のforループ文を使い、10回ループするコードを書く。
  • [問50] 問49のfor文を使い、画面に10回'Papix!!'と出力させる。

Perl入学式夏休みドリル その2

Perl入学式ドリル(入学式第2回編)の続きです。

Let's challange!

標準入力

  • [問21] 変数$nameを宣言して、キーボードから名前を入力してもらい、変数に代入する。
  • [問22] 変数$nameと$nickを宣言し、キーボードから名前とニックネームを入力してもらい、変数に代入する。
  • [問23] 問22で作った変数を利用し、"◯◯さんのあだ名は△△です。"と出力する。1行で出力し、行の一番最後で改行する。
  • [問24] 変数$year, $monthm $dayを宣言し、キーボードから誕生年、月、日を入力してもらい変数に代入する。
  • [問25] 問24で作った変数を利用し、"あなたの誕生日は◯年◯月◯日です。"と1行で出力し、行の最後で改行する。

文字列演算

  • [問26] "Papix" "xtetsuji" "校長" "教頭" の4つの文字列を、'.'(ドット)を使って連結し、Print文1行でPapix校長とxtetsuji教頭を出力する。校長と教頭の間は改行すること。
  • [問27] 苗字と名前を別々に入力し、苗字+スペース+名前と連結させ、変数$nameに代入し、変数の中身を出力する。

if文

  • [問28] キーボードから「0か1のいずれか」を入力させて、入力した値が1なら画面に'OK'の文字を出力させる。
  • [問29] キーボードから文字列を入力させて、入力した文字が「Perl」なら、画面に'入学式'の文字を出力させる。
  • [問30] キーボードから「1〜10」の数字を入力させて、入力した数が5なら、画面に'5'と出力させ、それ以外なら画面に'5以外'と出力させる。
  • [問31] キーボードから文字列を入力させて、入力した文字が「Perl」なら、画面に'Larry'の文字を、入力した文字が「Ruby」なら画面に'Matz'を出力させる。

論理演算子

  • [問32] キーボードから「1〜100」の数字を入力させて、入力した数字に応じて「50以下の偶数」「50以下の奇数」「51以上の偶数」「51以上の奇数」のいずれかを出力させる。
  • [問33] キーボードから「1〜30」の数字を入力させて、入力した数字が「3の倍数」又は「3の数字が含まれている」場合、'3!'と出力させる。
  • [問34] キーボードから文字を入力させて、入力した文字が「Perl」「Ruby」「Python」のいずれかの時は'LL'と出力し、それ以外の時は'other language'と出力させる。

配列

  • [問35] 配列名「array」を宣言する。
  • [問36] 配列名「array」に、1から10までの数を順番に代入する。
  • [問37] 問36で作った配列の添字'5'の値を出力する。
  • [問38] 問36で作った配列を利用し、配列の先頭から3番目の要素、6番目の要素、10番目の要素の足し算を行い、結果を出力する。
  • [問39] 問36で作った配列を利用し、配列の先頭の値と配列の末尾の値を入れ替える。
  • [問40] 配列名「fruits」を宣言し、'apple','orange','banana','kiwi'を代入する。

Perl入学式夏休みドリル その1

Perl入学式ドリル(入学式第2回編)

Perl入学式第2回より文法の講義が始まりました。まず基本を覚えるにはとにかく反復練習。 反復練習といえば、そう、子供の頃夏休みにやったアレです。宿題ドリルです。

ここでは、第2回で学習した事を忘れないために最初の50問で単純なコードを書く問題、そして51問からは応用的な問題を用意しました。 時間をストップウォッチで測って記録をとるもよし、何度も繰り返して身につけるもよし、第3回につなげる復習にご活用下さい。

ドリルすんのかい、せんのかい、すんのんかい!

では、ドリルスタートです。

基本事項

  • [問1] 3行のおまじないを書いたファイル、'basic.pl'を作る。 (※以下、コードの最初に3行のおまじないを書くこと。)
  • [問2] 画面に「Perl entrance」と出力する'perlentrance.pl'を作って実行する。
  • [問3] 画面に「I love Perl.」と出力し、改行する'loveperl.pl'を作って実行する。
  • [問4] 画面に「YAPC成功祈願」と出力し、改行する'yapc.pl'を作って実行する。

スカラ変数

  • [問5] スカラ変数を一つ宣言する'sc_val.pl'を作る。 (※以下、"ファイルを作る"を問題文から省略する。)
  • [問6] スカラ変数を一つ宣言し、その変数に次の行で'Perl'という文字列を代入する'コードを書く。
  • [問7] スカラ変数を1つ宣言し、同じ行で同時に 'TMTOWTDI' という文字列を代入するコードを書く。
  • [問8] 6で作った変数の中身を画面に出力するコードを書く。
  • [問9] 7で作った変数の中身を画面に出力し、改行もするコードを書く。 (※以下、"コードを書く"を問題文から省略する。)
  • [問10] スカラ変数を3つ宣言する。
  • [問11] スカラ変数3つを宣言し、それぞれに任意の整数を代入する。

四則演算

(※以下、スカラ変数は'変数'と表記します。)

  • [問12] 変数4つを宣言し、3つの変数に任意の整数を代入する。残り1つの変数に、3つの変数を合計した数字を代入する。(変数同士を足し算して代入すること。)
  • [問13] 12で作った4つの変数を利用して、"◯足す◯足す◯は◯です。"という文字を出力して改行する。
  • [問14] 変数2つ$heightと$weightを宣言し、身長150cm体重60kgのAさんの値を代入する。
  • [問15] 14で作ったデータを利用し、AさんのBMIを出力する。(BMIは、体重(kg)÷身長(m)の2乗で求めます。)
  • [問16] 3つの商品の単価を代入する変数を3つ($apple, $banana, $peach)を宣言し、それぞれに単価(りんご250円、バナナ150円、桃120円)を代入する。
  • [問17] 16で作った変数を利用して、りんご10個、バナナ8本、桃5個の合計金額に消費税8%を上乗せして出力する。(小数点以下の端数は)
  • [問18] 17の材料全てでミックスジュースを作ったら、20杯分が出来た。ミックスジュース1杯分の原価を出力する。
  • [問19] 100を3で割った時の余り、7で割った時の余り、11で割った時の余りをそれぞれ出力する。
  • [問20] ピザ1枚1300kカロリーを16等分し、7人でなるべく均等になる様分けて食べた。7人が摂取したカロリーをそれぞれ出力する。

関西Ruby会議06にスタッフとして参加した

今回Organizerをされた@ogomさんと、hommachi.rbでの繋がりがあったので、関西Ruby会議のスタッフに参加させて頂きました。
オープンソース・ソフトウェア(OSS)は、色んな人の自主的なギブアンドテイクの正のスパイラルで成り立っていると思っていて、自分は本業の仕事はエンジニア・IT関連ではなく、技術的にOSSへ恩返しすることは出来ず、せめて体を使って少しでも恩返しできればなぁという思いがあり、今回手を挙げさせていただきました。
道案内と第二会場の見回りしかできず、極々微力でしたが、少しでもお役に立ててよかったと思っています。

開始前に路上で道案内を担当していた時の出来事。西中島南方をぼーっと眺めている時、ふと目を凝らすとそこには...

初Matzとの遭遇は、なんと路上でした。もうテンパッて軽く会釈するしか出来ませんでしたが、一気にテンションが上がりました。

さて、自分なりに関西Ruby会議06を振り返った出来事や心に引っかかった事を書きとめたいと思います。

まつもとゆきひろさんの基調講演。

  • やりたい事に対する情熱、何をやりたいのかという想い、それを大切にする生き方。
  • 「重要なのは『あなた』がHaapyかどうか。」

非常に心に突き刺さりました。自分は非エンジニアなので、プログラミングに関わる時間が少ない反面、好きな事だけプログラミングできるというある意味幸せな立場である事を再認識しました。

smalruby

  • ScrachのRuby版との事ですが、ブロックを積み上げて遊ぶ『子供モード』から、エディタでコードを書く『大人モード』への転換を、学習する子供のタイミングでシームレスにできる仕組みは素晴らしいアイデアだなーと思いました。小学生の頃、「こんにちはマイコン」を片手にBasicで遊んでた頃を思い出しました。やっぱり大事なことは、「プログラミングが好き」かどうか、ですね。

RspecとMinitestの話

  • 今回、一番聞きたかった話でとても参考になりました。現在、RspecのQiita記事を読んだりしながらも、Testが書けない、書き方がよくわからない、と悶々と悩みがあったのですが、どうやら自分が今必要としているのは、多機能だけどDSLを覚えたり制約があるRspecより、Minitestを使うべきという気付きが得られました。もっと規模が大きく複雑なプログラムを書く時に新しくRspecを覚えるのがよさそうだと思いました。
  • 心のなかで「テストのドヤ神様」と思っていた伊藤さんのトークは、想像通りドヤ感が溢れていました。

技術的には未熟なので、難しい話もありましたが、今回一番の思い出は、

舞い上がってTypoしてるし・・・。

Happy Hackingの言葉を胸に、これからもプログラミングをEnjoyし続けようと、再確認出来た非常に有意義な1日でした。
スタッフの皆様、発表者の皆様、ありがとうございました。

さて、来月もエンジニアのお祭り

yapcasia.org

だ!!!

デバッグ時のお助けGemを作ってRubygemsに公開してみた

プログラムを書いて自分の思い通りに動かない時にこんな事やりません?

  • 変数や配列などの値が何なのか、片っ端からprintしてみる
  • if文や条件分岐などで、どこを通っているのか調べる為に、何かしらのprint文を埋め込んで、何処を通ったか可視化して調べてみる
  • Rubyの場合、オブジェクトが何のクラスなのか、とりあえず puts hoge.class で出力して調べてみる

いわゆる、Printデバッグってやつですね。自分で作っているプログラムはそんなに大きくない事と、テスト駆動する程までもなかったり、そもそもテストの書き方もイマイチピンときていなかったり。

で、自分用にデバッグを助ける為に、ログを書き出すGemを作ってみました。

どんな事が出来るか

任意のログファイルを生成し、それに色んな値を書き出すクラスを作ってみました。 プログラムの冒頭部分でオブジェクトを生成します。引数には、書き出すログのファイルパスを指定します。

プログラム内の任意の場所で、

  • v メソッド:引数で渡した変数などの値をログに出力する
  • c メソッド:引数で渡したオブジェクトのクラス名、親クラス名をログに出力
  • f メソッド:’ここ通りましたよ’フラグをログに出力

する事ができます。

色々思案したこと

  • あくまで一時的な用途なので、メソッド名は最短の1文字にした。
  • 今回はテストを書いてみた。
  • 英語は全く使えないので、Google翻訳を使って苦しい文を乗せた

bundlerを使ってGemを公開するまでの流れ

  1. bundleを使って、ひな形を作る

    bundle gem gem_name --test

  2. libディレクトリの直下の.rbファイルに、moduleを定義し、中に目的のClass定義を書く。
  3. specディレクトリ直下に、spec_gem_name.rbファイルを作成し、テストを書く。
  4. gem_name.gemspecファイルを編集して、gemの内容等を英語で書く。編集内容はこんな感じ
  5. github用にREADME.mdも編集する。
  6. rake buildコマンドでビルドして
  7. rake installコマンドでローカル環境にインストールして動くか試す。
  8. Githubにpushする
  9. rake release でrubygems.orgに公開する

出来上がったGemは、rubygebs.orgGithubに上げてみました。

プログラミング言語C K&R著の演習問題を解答していく その7

C言語のバイブルと言われる、K&Rの「プログラミング言語C」を第一章から読み進めて演習問題を記録していく。

プログラミング言語C 第2版 ANSI規格準拠

プログラミング言語C 第2版 ANSI規格準拠

本を読んでコードを書いたのが全開ブログを書いた時期で、以降、Cに触れる期間が相当空いてしまって随分忘れてしまってる... 継続する事が大事ですね。

第4章

  • 4-1 文字列の中のパターンマッチで、最も右側のインデックスを返す関数を書く。

  • 4-2 文字列を浮動小数点型(float)に変換するコードを指数表記できるように改変。

  • 4-3 みんな大好き逆ポーランド記法の電卓プログラムに、余り(%)を演算するコードを追加する。 複数のファイルから1つの実行バイナリを生成する。

  • 4-4 みんな大好き逆ポーランド記法の電卓プログラムに、値の複製や2値の交換機能を追加する。

  • 4-5から10 は面倒臭くなったのでパス。
  • 4-11もパス。

  • 4-12 再帰を使って整数を文字に変換するプログラム。再帰の仕組みって芸術的な感じがして好き。

  • 4-13 再帰を使って文字列を逆転させる関数。

  • 4-14

    defineを使ったマクロ機能を使うプログラム。いわゆる「置換」機能と理解。

第4章、関数の使い方を学ぶ章。 再帰は仕組みがすごく好きなのだけれど、うまく使う方法がいまいちマスターできていないので使い処を知りたい所存。

Perl鍋#6に参加して、Mouseを使ったオブジェクト指向の書き方とグランフロント大阪を満喫してきた

Perl鍋に参加しました

大阪でPerlをもくもくと書いて発表したり教え合う勉強会、Perl鍋#6に参加してきました。 この勉強会の主催者は、Perl入学式in大阪で講師もされている @nqounet さんです。 勉強会の位置づけは、Perl入学式でひと通り基礎を学んだその次のステップ、「自ら何かを作ってみよう」という趣旨だそうです。

会場はグランフロントの中にあるKnowledge Salonという会員制スペース、広くて綺麗で、飲食も可能な最高の空間でした。

最近はC言語Rubyを主に勉強していたので、Perlを書くのは久しぶりでした。 何を作るか、は始まってから考えようと

Perl CPANモジュールガイド

Perl CPANモジュールガイド

を持参して行きました。 主催の @nqounet オブジェクト指向の設計が難しい云々といった雑談から、Perlで書くならMouseというモジュールが良いという話になり、PerlでMouseを使って基本的な書き方を試してみました。

書いた(試した)コード

Mouseは、

package Hoge;
use Mouse;
1;

と書くだけで、Hogeクラスが定義できて、クラスの中で

has 'bar'=>(); 

と書くとプロパティ(インスタンス変数)、サブルーチンを書くことでメソッドが定義出来てしまいます。 今までは、Perlオブジェクト指向といえば、blessを使って・・・と結構理解するまで難しかったイメージでしたが(過去のブログ記事)Mouseモジュールを使えば、簡単に実現出来ますね。とても簡単に。

継承だとかメソットのオーバーライド等を例にして、Perl入学式スタッフのクラスを定義し自己紹介をするコードを書いてみました。

github.com

Staff が大元のクラス、そこから継承させた派生クラスがPapixクラス、Azumaクラス、そしてPapixクラスから更に継承させたクラスがBoolfoolクラスです。ごく短いコードなので、読めばすぐに雰囲気がつかめるかと思います。

staff.pl

ファイルを実行すると、各クラスのインスタンスが自己紹介をします。 f:id:tomcha0079:20150613003230p:plain

まとめ

今回参加して、初めてMouseのモジュールを使った事も勉強になりましたが、 @nqounet さんが作ったSlackのウェブフックも解説付きでコードを見せてもらい、こちらも新しい知見が得られました。evalを使ったエラートラップのイディオムとか、なるほどなーって感じでした。 また、普段書く機会が無いので、久しぶりにPerlオンリーの書く機会が出来たので良かったです。 普段、Perl書く機会が無いんだけどなーって方にオススメです。

大阪では、Perl入学式の次のステップとしての勉強会、Perl鍋なにわPerlがあります。今年も開催していきますので、皆さん是非ご参加下さい。