Perlがくしゅう帳(Rubyも)

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

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があります。今年も開催していきますので、皆さん是非ご参加下さい。

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

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

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

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

第3章

  • 3-1 二分探索法の関数の中身を書き換える問題。if文を2回重ねて比較しているコードを1回のif文のコードに書き換える。(if文の工夫)

  • 3-2 文字列の中の空白やタブを可視化した文字列に置き換えるコード(switch文を使って)。

  • 3-3 文字列の中の省略形記号(a-zや0-9など)を展開させるコード(ループを使って)。

  • 3-4 整数を文字列に変換するコード。2の補数での負数表現を使った場合、負数最小値は最左ビットを含めた数値表現になる為、負数取り扱い時に工夫が必要。

  • 3-5 符号なし整数値を指定された進数表現に変換するプログラム。

  • 3-6 桁数の指定も含めた整数を文字列に変換するプログラム。文字列が桁数に満たない時はブランク文字を使って右詰めにする。

実はずいぶん前に終えていた第3章。
問題文の読解が難しかったのと、3−4、3−5のテクニック的な部分は難しかったのでアンサーブックからヒントを得て自分なりのコードを書いてみた。
第4章は近日中に上げる予定です。

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

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

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

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

第2章

  • 2-1 問題文の意味がよくわからないのでパス。

  • 2-2 1行の文字列を取得するfor文を、論理演算子を用いて書く。

  • 2-3 16進数文字列を整数値に変換するコード。

  • 2-4 文字列s1から、s2に含まれる文字を削除するコード。

  • 2-5 文字列s1の中から、文字列s1がマッチした位置を返す。含まれていなかったら、-1を返す。

  • 2-6 ビット(2進数の値)の一部を取得して入れ替える関数。

  • 2-7 ビットの一部をビット反転する関数。

  • 2-8 ビットの回転させる関数。回転とは右にシフトで押し出された値が左からシフトされる様子。

  • 2-9 ビットの中の'1'の個数を数える関数。

最初、意味がさっぱり分からなくて解説をググって「x & (x - 1)の挙動」を目の当たりにして感動。 コードのアルゴリズムで感激したのは、フィボナッチ数を再帰で取得するコード以来。

  • 2-10 大文字を小文字に変換するプログラム。if-else文を使わずに、? : 式を使って書く。

少しずつ進めて第2章が終了。 ビット演算のコードが面白かったのだけれど、実際には何処で活用すれば良いのだろうか。

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

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

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

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

第1章

  • 1-21 ブランク列をタブとスペースを組み合わせて最小数で構成しなおす関数

  • 1-22 n文字目までの最後の非ブランク文字で改行するプログラム。

  • 1-23 Cのソースからコメント文を除去するプログラム。ファイル読み込みはまだやっていないので、テキストはcat と | で受け取る事とする。

  • 1-24 Cのソースから( )[ ]{ }が足りているか調べるプログラム。同じくテキストはcat と | で受け取る事とする。

テキスト処理に正規表現が使えないの、辛い。 とりあえず第1章はなんとか終了。

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

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

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

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

第1章

  • 1-16 問題文がよくわからない

  • 1-17

  • 80文字は長いので、8文字以上ある行を出力する

1-17

  • 1-18
  • 行末のブランク、タブを削除 && 空白行を削除して出力する

  • 1-19
  • 文字列を逆さまにして出力する

  • 1-20
  • 決まったタブストップで語句を区切って出力

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

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

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

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

第1章

  • 1-10
#include <stdio.h>
int main(){
  int c;
  while((c = getchar()) != EOF){
    if(c == '\t'){
      printf("\\t");
    }else if(c == '\b'){
      printf("\\b");
    }else if(c == '\\'){
      printf("\\\\");
    }else{
      putchar(c);
    }
  }
}
  • 1-11
#include <stdio.h>
#define IN  1
#define OUT 0

int main(){
  int wordcounter, nowstatus;
  int c;
  nowstatus = OUT;
  wordcounter = 0;
  while((c = getchar()) != EOF){
    if(c == '\t' || c == ' ' || c == '\n'){
      nowstatus = OUT;
    }else if(nowstatus == OUT){
      nowstatus = IN;
      ++wordcounter;
    }
  }
  printf("%d\n", wordcounter);
}
  • 1-12
#include <stdio.h>

#define IN  0
#define OUT 1

int main(){
  int nowstatus = OUT;
  int c;
  while((c = getchar()) != EOF){
    if(c == ' ' || c == '\t' || c == '\n'){
      if(nowstatus == IN){
        printf("\n");
        nowstatus = OUT;
      }
    }else{
      nowstatus = IN;
      putchar(c);
    }
  }
}
  • 1-13
#include <stdio.h>

#define IN  0
#define OUT 1
int main(){
  int wordsize[10];
  int c;
  int i,j,k,l;
  int wordstatus;
  wordstatus = OUT;
  i = 0;
  for(j = 0; j < 10; j++){
    wordsize[j] = 0;
  }
  while((c = getchar()) != EOF){
    if(c == ' ' || c == '\t' || c == '\n'){
      if(wordstatus == IN){
        if(i <= 9){
          wordsize[i] += 1;
        }else{
          wordsize[9] += 1;
        }
        wordstatus = OUT;
        i = 0;
      }
    }else{
      wordstatus = IN;
      i += 1;
    }
  }
  for(k = 0; k < 10; k++){
    l = 0;
    if(wordsize[k] != 0){
      printf("%2d:%d",k ,wordsize[k]);
      while( l < wordsize[k]){
        printf("*");
        l += 1;
      }
      printf("\n");
    }
  }
}
  • 1-13-2
#include <stdio.h>

#define IN  0
#define OUT 1
int main(){
  int wordsize[10];
  int c;
  int i,j,k,l,m;
  int wordstatus;
  wordstatus = OUT;
  i = 0;
  for(j = 0; j < 10; j++){
    wordsize[j] = 0;
  }

  while((c = getchar()) != EOF){
    if(c == ' ' || c == '\t' || c == '\n'){
      if(wordstatus == IN){
        if(i <= 9){
          wordsize[i] += 1;
        }else{
          wordsize[9] += 1;
        }
        wordstatus = OUT;
        i = 0;
      }
    }else{
      wordstatus = IN;
      i += 1;
    }
  }

  int output[50];
  for(k = 0; k < 50; k++){
    output[k] = 0;
  }

  for(l = 0; l < 10; l++){
    if(wordsize[l] >= 5){
      output[l] = 1;
    }
    if(wordsize[l] >= 4){
      output[10 + l] = 1;
    }
    if(wordsize[l] >= 3){
      output[20 + l] = 1;
    }
    if(wordsize[l] >= 2){
      output[30 + l] = 1;
    }
    if(wordsize[l] >= 1){
      output[40 + l] = 1;
    }
  }

  for(m = 0; m < 50; m++){
    if(output[m] == 1){
      printf("*");
    }else{
      printf(" ");
    }
    if((m % 10) == 9){
      printf("\n");
    }
  }
  printf("0123456789\n");
}
  • 1-14
#include <stdio.h>

int main(){
  int ascii[128];
  int c;
  int count;
  int i,j,k;
  for(i = 0; i < 128; ++i){
    ascii[i] = 0;
  }

  while((c = getchar()) != EOF){
    ascii[c] += 1;
  }
  for(j = 0; j< 128; ++j){
    if(ascii[j] > 0){
      count = ascii[j];
      printf("%c:", j);
      for(k = 0; k < count; k++){
        printf("*");
      }
      printf("\n");
    }
  }
}
  • 1-15
#include <stdio.h>

float changeunit(float f);

int main(){
  float fahr, selsius;
  int lower, upper, step;

  lower = 0;
  upper = 300;
  step = 20;

  fahr = lower;
  printf("fahr-selsius conversion table\n");
  while(fahr <= upper){
    printf("%3.0f %6.1f\n", fahr, changeunit(fahr));
    fahr += step;
  }
}

float changeunit(float f){
  float v;
  v = ((5.0/9.0) * (f - 32.0));
  return v;
}

第2回 なにわPerlを開催しました。

なにわPerl主催のTomchaです。

平成27年2月21日、joe'sビジネスセンターさんの場所をお借りして、第2回なにわPerlを開催しました。

大事なこと

会場をお貸し頂いたjoe'sさんでは、VPSサービスのホスティング等、自作webアプリをインターネット上に公開する為のサーバーホスティング等をされています。オレオレserverが欲しいなぁ等、興味のある方はwebサイトにプランの説明などが書いてありますので、ご覧下さい。

なにわPerl

今回は総勢3名でもくもくしました。 内容は、

  • Perl入学式第5回で時間切れとなったTest周りの自習
  • 続・はじめてのPerlの読書
  • 第6回Perl入学式の資料作成
  • Rubyを使ってのウェブアプリ開発

などでした。何気ない会話から情報交換が出来たりするのも、もくもく会の良いところですね。
テスト関係の話で、どうやってテストを書くか、どこまで書くかなども教えてもらいました。

こんな雰囲気で開催しました

togetterにまとめてあります。 第2回 なにわPerl - Togetterまとめ

懇親会

懇親会は会場近くのお初天神の居酒屋で軽く飲みました。
個室だったのですが、料理をGetリクエストした後、レスポンスが帰るまで30min(msecじゃない)とかかかってたので、毎回店選びで迷わなくて済むように馴染みの良い店を開拓しないといけないなーと思いました。

次回なにわPerlについて

日時はまだ未定ですが、第3回もやりたいと思っています。 Perl入学式を卒業した後もPerlで何かを作ったり話したりできるので活用してください。もちろん、他の言語でも参加OKです。
DoorKeeperのコミュニティにとりあえず登録しておくと、次回開催情報がメールで受け取れますので、興味のある方は登録してみて下さいね。

なにわPerlのコミュニティはこちら↓

http://naniwaperl.doorkeeper.jp/