俺です

クソザコなりにあがいてるRubyist

カンファレンスに行った話

この記事は,FUN Advent Calendar 2016 12/19だった記事です.

とても遅れて大変申し訳無いです.

www.adventar.org

二回目の自己紹介

ハンドルネーム:Chikuwait

Hakodate.rbのOrganizerです.

僕がカンファレンス行ったきっかけ

 まず皆さん好きな言語とかあると思います. 例えば機械学習ブームでアツいPythonとか関数型言語Haskellなど色々好きなものがあると思います. 僕はRubyが大好きだったりします.ただ, とても残念なことに函館はコミュティ活動があまり活発ではなく, 未来大の中でギークな人たちが細々と集まってるかなと思います. 僕自身も未来大にRubyist居るんかなーってちょっと期待しては見たんだけど, Pythonのほうが強くてなんか同類いなくて少ないなぁって思いながら前期の最初の方を過ごしてました. しかし, 人生二週目説が濃厚な緑のITヤクザ(D.Takahashi.cpp14 (@yaemonsan))に出会ったのが運の尽きなのか, 色々あってOSC北海道(オープンソースカンファレンス)に行きました. 行ってビックリ,「こんなギークな人が居るんだなぁ、ギークな人ともっと喋りたいなぁ」ってよくわからない謎の刺激を受けました. それからRubyのイベントとかコミュニティに参加したいなぁ...。なんて思って解析学に苦しめられながら大学生活送っていました(解析の単位は無事取れました). そしたら今度はよく絡むバブみ君こと、てまーくん(西崎芽依 (@Tkon_sec))が講義サボってLinuxConferenceに行ってしまいました. それを見て良いなぁって思いながら, 俺もカンファレンス行くぞ!って気持ちになりました. そして調べていく中で夏休み真っ只中の9月に実家の愛知からそう遠くない今日でRubyKaigiがあるのを知り, これは行くしかねぇなぁ!ってなって参加登録しました. つまりはITヤクザやバブみ君の影響を受けたということです.

カンファレンスのお金に関わる話

 ただ, カンファレンスに行くって言っても,ただで行けるわけでは無いです. 勿論お金はかかります. RubykaigiにはSuper Early Bird, Early Bird, Regular3つのチケットが存在し, それぞれ10,000, 20,000, 30,000円の価格となっています. それぞれ学生には厳しい出費となっていますが, なんと嬉しいことに学生は5000円で参加できます. Super Early Birdの半額で参加できるのはとても嬉しいですね. また,Rubykaigiは三日間ありますが, 最終日だけは誰でも無料で参加することが出来ます. Rubykaigi以外のカンファレンスでも学生割引は存在するところが多いので, お金のない大学生には優しいかなって思います.あと必要となるのは宿泊代+移動費+食事ってところかなと考えます. 幸いにも僕は愛知から京都までの移動でしたので新幹線代もさほど掛からず, ホテルもカプセルホテルにしたのでそこまで負担にはならなかった気がします. また会場では昼食が出たのですが, 3日間随分と良い昼食だったのでそれだけで5000円の元を取ることが出来ました.

 

Rubykaigiに行った時の話

 長くなりましたがやっとRubykaigi中の話. しかし, ここでは技術的な話は置いておいて, コミュニティとの関わりや,全体を通したを話していこうかなって思います. Rubykaigiのスポンサーで某100万人が使う名刺アプリの会社がブースを出して居たのですが, 初日に丁度ブースの前に立ち止まった時に立ち話をしてコミュニティの話をして札幌にはRubyのコミュニティはあるが, 同じ北海道でも函館からは遠いから参加できないって話をしたら「じゃあ、函館にもコミュニティ作ろう!」みたいな話になりました. その立ち話が始まりでHakodate.rbを作るということになりました. そんな感じで1日目が終わりました.2日目は某名古屋のベンチャーさんのドリンクアップに参加して色んな人とギークな話をしたり色んなRubyの話をできました. この時,台湾の方に英語で話しかけられたのですが, 僕の英語力が残念なお陰でとても残念な英会話になりました. Rubykaigi全体を通して言えることなのですが, セッションも半分以上が英語で高校生レベルの英語は最低限必要だよなぁって痛感しました. 最終日は長くなるので短くまとめますが, 色々あってRubyのパパと話して本学で講演会を開こう!みたいな話になりました. 3日間総じて色んな人にお世話になりっぱなしでした.

 

で、何が言いたいの?

某炎上事件のようにまず人脈!なんて大層なことはいいませんが, カンファレンスに言ったりすると, 大学では普段居ないような人(コミッター, コントリビューター等々)と好きな技術の話をしたり, 普段好きな技術はこういう風に使われているんだっていうような事を知ることができます. 普段大学で一人でシコシコ開発するよりも圧倒的に得れるものがあると思います.だから皆カンファレンスに行こう!そして得た技術を自分がコミュニティを運営して周りに布教しよう!

 

最後に

Rubykaigiが発端で行われたRuby on Railsハンズオン@はこだて未来大

hakodate-ruby.connpass.com

や特別講演会「イノベーションの真実」

www.fun.ac.jp

は盛況で終わることができました,ありがとうございました.

また、特別講演会の内容はyoutubeで配信されているのでいつでも見ることができます.

www.youtube.com

ぜひ、見ていただければ幸いです.

ポエムでしたが、ありがとうございました. 良いお年を! 

 

Rubyで構造体を使った型のあるプログラミングをしてみる

この記事はFUN Advent Calendar 12/13日の記事です.

www.adventar.org

書き手

はじめに

こんにちは. 今回はRubyで形のあるプログラミングをしてみようと思います.
しかし、Rubyは動的型付け言語であり型はありません. ですので今回はGemを使って一般的な静的型付けにあるような型を使ってみようとするものです.
※注意
この内容で登場してくる型はあくまでもGemを使って行うものであり、Ruby3で実装される予定のある型とは大きく異なります.

構造体とは

構造体(こうぞうたい、英: structure)はプログラミング言語におけるデータ型の一つで、1つもしくは複数の値をまとめて格納できる型。それぞれのメンバー(フィールド)は型が異なっていてもよい点が配列と異なる。

Wikipediaは申しています. 構造体っていうとC言語のイメージがとても強いのでCでちょっとした復習を.

Cでよくある構造体

#include <stdio.h>

struct grade{ /* Define structure */
    int id;
    int grade; 
    char name[30];
};
int main(void){
    int i;
    /* Define structure var and structure array */
    struct grade students[20];
     
    /* Input data*/
    for(i=0;i<20;i++){
        scanf("%d", &students[i].id);
        scanf("%s", students[i].name);
        scanf("%d", &students[i].grade);
    }
    /* Check input data */
    for(i=0;i<20;i++){
        printf("ID:%d NAME:%s GRADE:%f\n", students[i].id, students[i].name, students[i].grade);
    }
    return 0;
}

まぁ, よくあるC言語の入門書とかにありそうですよね. 復習なので.

RubyのStructクラス

やっとタイトルのRubyが出てきました.
僕は普段メインでRuby触ってるんですが, Rubyにも構造体としてStructクラスあるんです. 若干影薄い気もするけど.
Structクラスはサブクラスを新たに生成します. 構造体サブクラスではメンバに対するアクセスメソッドが定義されています.

第一引数がStringクラスの場合の使用例

human=Struct.new("Human", :name, :sex, :age, :address)
adam=human.new("adam", "man",15,"Hakodate,Japan")
adam.sex="woman"
puts adam

f:id:chikuwa_it:20161213131016p:plain

このように第一引数がStringクラスの場合はそれがクラス名になります. よって小文字から始まることはできません.

第一引数がSymbolクラスの場合の使用例

Hoge = Struct.new(:foo, :bar, :hogehoge)
p Hoge

f:id:chikuwa_it:20161213220909p:plain

第一引数がSymbolクラスの場合, 生成した構造体クラスは名前の無いクラスとなります. また最初に代入された定数名がそのままクラス名になります.

ブロック指定

human=Struct.new("Human", :name, :sex, :age, :address)do
    def hello
        "hey,#{name}"
    end
end
human.new("Andy","man",20,"London,UK").hello

f:id:chikuwa_it:20161213223904p:plain 上記のようにブロックを評価される事ができます. また, 定義したStructはブロックパラメータにも引き渡されます.

しかしながら, あくまで動的型付け言語での構造体です. やっぱり型はありません.
今回の目的はRubyで表題通り型のあるプログラミングをしてみることです. そこで今回はTypeStructというgemを導入してやってみることにします.

github.com

TypeStructを使う

以下のように定義することで型を付けれるようになります.

require "type_struct"
Human=TypeStruct.new(
    name: String,
    sex: String,
    age: Integer,
    address: String,
)

f:id:chikuwa_it:20161213233915p:plain

また、通常のStructとほぼ同じようなやり方でインスタンスを生成することができます.

require "type_struct"
Human=TypeStruct.new(
    name: String,
    sex: String,
    age: Integer,
    address: String,
)
michael=Human.new(
    name: "michael",
    sex: "man",
    age: 48,
    address: "California,USA",
)
puts michael

f:id:chikuwa_it:20161213234641p:plain

例外処理

require "type_struct"
Human=TypeStruct.new(
    name: String,
    sex: String,
    age: Integer,
    address: String,
)
asupe=Human.new(
    name: "michael",
    sex: 114514#TypeError
    age: 48,
    address: "California,USA",
)

f:id:chikuwa_it:20161214003207p:plain 型定義に則ってない値でインスタンス化をするとTypeStruct::MultiTypeErrorというエラーを返してくれます.
このGemの良いところは動的型付け言語ありながら, 型チェックをしてくれるということです.
これで想定外のエラーを検知することができます. いいね.

まとめ

動的型付け言語はバグを見つけることが難しいと言われてたりします.
こういう風に実行時に定義に則ってないって怒られることでちょっと幸せになります.
TypeStructにはよく出来たサブクラスであるArrayOf,HashOf,Interfaceなどがあります.
また、StructはHashより若干高速らしいです. もしStructを使う機会があれば是非お試しあれ.

明日の記事は 西崎芽依 (@Tkon_sec) | Twitter です.

Rubyのオープンクラス

やっとタイトルらしいことを書くことにする。
まず、オープンクラスってなんぞや。

=>既存するクラスをいつでも再オープンし,
メソッド修正・追加など任意の変更を加えられる機能のこと。

なるほど。
とりあえず、簡単な例でも。

class Hoge
  def return_class_name
    'hoge'
  end
end
class Hoge 
  def return_class_name_double
    'hogehoge'
  end
end

object=Hoge.new
object.return_class_name  =>'hoge'
object.return_class_name_double =>'hogehoge'

この時、class Hogeの段階ではクラスは存在しない。
Rubyがこのクラス定義の内部に入った時にクラスを定義する。
そして、二回目のclass Hogeの段階では既にこのクラスは存在しているため、Rubyはこのクラスを定義せずに
クラスをオープンして新しいメソッドを追加する。
これがオープンクラスの動きらしい。
しかも既存のクラスを再オープンすることはStringやArrayといった標準メソッドでも適用されるらしい。

つまりあれだ、安易にクラスにコードを追加すると知らずに既存のメソッドを上書きする可能性があるということ。
(こういうコードをモンキーパッチと言うらしい)
恐ろしや。