第13回名古屋Scala

11/19 に、第13回名古屋Scala勉強会に参加してきました。

  • 27章 オブジェクトを使ったモジュラープログラミング
    • モジュールとしてオブジェクトを捉える
      • Lift とかそうなってる
      • OCaml の(ファーストクラス)モジュールに近い
      • 継承とかも出来る
    • DI
      • 結構普通、そんなにおっきいこと言ってない
      • 外部から依存性注入出来るようにしましょう
        • 高階関数使ってもできる (1個の時)
          • 複数個の時はインタフェースとか作ることが多い
          • 関数はメソッド1つのインタフェース的なもの
    • Java
      • 残念、イラネ、Scala でおkとか
  • 28章 オブジェクトの等価性
    • equals と ==
      • 参照等価、等価、比較
      • 実装する際には、意図しない再帰に注意 (C# ==(A a, object b) 内で、a == null 判定とか)
    • null は Null 型 (Null型 : p196(11章))
    • LSP
      • bleis 先生による LSP 違反の例
      • 値のセマンティクスを持っているクラスを継承可能にしていることがそもそもの問題
        • 個人的には、そのクラスのインスタンスを生成できるクラスは継承を許したくない
      • case class 素敵
        • 継承も出来るっぽい
        • でも継承すると LSP 違反の問題が・・・ (case class なら大丈夫?)
    • hashCode
      • Hashable インタフェース的なもの作って、Hash系データ構造で Hashable 要求すれば、いい感じに hashCode 強制できそうな
      • commons 素敵
      • タプルいい感じ (リストでもおk)
    • 小さめの机を幾つか集めた感じにしていたので、議論が2つくらい同時進行することがあった
      • 学級崩壊に戸惑う担任の北村先生
    • あひさめ君が OCaml を始めるようです
      • よーく君も OCaml を始めたそうです (プログラミングの基礎 読了とか)

GitとGitHubを体験しながら身につける勉強会 第2回

10/30 に、GitとGitHubを体験しながら身につける勉強会 第2回 に参加してきました。

始まる前に、bleis と F# の GUI まわりって Functional ちっくに書けたりするっぽいねとか、
そういうことは osiire さんが詳しいよとか話してたら、なんとご本人登場。
さらにゆるPerlの人たちが少し遅れて登場。(時系列ぁゃしぃ)


自分は中級コースに参加。
Magistol君とペアで githubでいろいろやってみる。
そういえばお魚君は初級コースにいたような。
Magistol君のPCはなんか環境が残念なことになってた。


pull リクエストもらったときに、githubの下にあったやり方で、
branch 作る → 「git pull url的な master」ってやったけど、
リクエストもらったリポジトリを remote に add して update すると取れるので、
それを rebase なりして reset するのがいい感じらしい。


あと、submodule ってのがあって、リポジトリの中にリポジトリ作ったり出来るらしい。
自分はそこまで行かなかったけど、結構便利そうな機能だ。


F# が楽しそうなので、F#の環境も入れないと。

  • 懇親会
    • vim vs emacs とか
    • 豊橋クラスタを純粋な世界に染め上げる目標は着々と進行中?とか
    • 名古屋Scala が 11/19 にあって、次の日の 11/20 は麻婆豆腐会があるとか
      • 辛いのが苦手なはずのあのイケメン先生が学食の激辛麻婆豆腐的なものにチャレンジするとか
    • 11/27 に Coq Party があるので、皆さんも是非。とか
    • 「払ーった気がーしたー。払ーった気がーしたーんだー。」とか


帰りはMagistol君とお魚君と。
彼らは行きも一緒に来ていてラーメンを食べるなどしたらしい。
豊橋駅からはMagistol君の車で送ってもらえた。わーい。

Boost.勉強会 #3 関西

10/23に、Boost.勉強会 #3 関西に行ってきました。

千里中央駅からが分かりにくい・・・><
10時ちょっと過ぎに到着・・・

  • まとめかメモかなんかそういう
    • 発表資料が遅延評価されたらしく、順番が少し前後
    • C++かわいい。」
    • OAuth めんどいらしい
    • D はとてもホットな言語なのでみんなご存じでしょう
    • D 言語は就職にも有利らしい
    • C++ : 闇の軍団が使うらしい 使うと発狂する
    • D じゃないとダメなんでしょうか? Boost じゃダメなんでしょうか?
      • C++ っていい言語なんですかね?
    • trickerr.h 素敵
    • ひどいひとがいたんですね
    • 「アルゴリズムの詳細を知らないが大丈夫か?」
      • 「大丈夫だ、問題ない」
      • 「一番いい最短経路アルゴリズムを頼む」
    • ラムダ式分からない人は分かってください
    • プリプロセッサの自動生成には Perl
    • Function は一回死んだ方がいいらしい (組み込み)
    • 牛じゃなくてヌー
    • iostream を1週間で作り直そう → ミリ
    • プレゼント → 「昇龍拳」 → 「どやっ」
    • STL : 「コンテナ×イテレータ×アルゴリズム」
    • PropertyMap : 「データ構造×(デスクリプタ、イテレータ、プロパティマップ、ビジター)×汎用アルゴリズム」
    • しまめん先生はとてもしまめん
    • 魔導書 と C++TT にサインもらったよ
  • 帰りとか
    • 大阪-名古屋間で bleis 先生と C# かわいい ってやってた
    • 名古屋駅で改札通ったときに最終の1本前出てて、40分待ち・・・
    • 豊橋駅から徒歩かと思ったが留学生の友人に車を出してもらえた わーい

Jaav っぽいの

なんか bleis 先生が関数型っぽいライブラリを Java で作ってるっぽくて、自分も作ってみようかなーって適当に作ってたらとても残念な感じになったのでのっけてみる。

コードは rf0444's jaav at master - GitHub に。
よくもこんなキチ(ry


まずは Function インタフェース。これがないと始まりませんよねー。

public interface Fun<T, R> {
    R _(T x);
}

メソッド名 _ ってw。Jaav もこうらしいw。


続いて Unit。

public enum Unit { _ }

_ 万能説ww。


Function の便利メソッド達。楽しすぎてやばい。(Fun的な意味でw)

public static <T1, T2, T3> Fun<Fun<T2, T3>, Fun<Fun<T1, T2>, Fun<T1, T3>>> compose() {
    return new Fun<Fun<T2,T3>, Fun<Fun<T1,T2>,Fun<T1,T3>>>() {
        @Override
        public Fun<Fun<T1, T2>, Fun<T1, T3>> _(final Fun<T2, T3> f1) {
            return new Fun<Fun<T1,T2>, Fun<T1,T3>>() {
                @Override
                public Fun<T1, T3> _(final Fun<T1, T2> f2) {
                    return new Fun<T1, T3>() {
                        @Override
                        public T3 _(T1 x) {
                            return f1._(f2._(x));
                        }
                    };
                }
            };
        }
    };
}
public static <T1, T2> Fun<Fun<? super T1, ? extends T2>, Fun<T1, T2>> cast() {
    return new Fun<Fun<? super T1,? extends T2>, Fun<T1,T2>>() {
        @Override
        public Fun<T1, T2> _(final Fun<? super T1, ? extends T2> f) {
            return new Fun<T1, T2>() {
                @Override
                public T2 _(T1 x) {
                    return f._(x);
                }
            };
        }
    };
}


Option も作ってみたけど、便利メソッドを関数型ちっくに書こうとして、型推論が出来ないようで全部自分で書くという残念なことに。(まぁこれはこれで面白いww)

public static <T1, T2> Fun<Fun<T1, Option<T2>>, Fun<Option<T1>, Option<T2>>> bind() {
    return new Fun<Fun<T1,Option<T2>>, Fun<Option<T1>,Option<T2>>>() {
        @Override
        public Fun<Option<T1>, Option<T2>> _(final Fun<T1, Option<T2>> f) {
            return new Fun<Option<T1>, Option<T2>>() {
                @Override
                public Option<T2> _(Option<T1> x) {
                    return x.flatMap(f);
                }
            };
        }
    };
}
public static <T> Fun<Option<Option<T>>, Option<T>> join() {
    return Option.<Option<T>, T>bind()._(Funs.<Option<T>>id());
}
public static <T1, T2> Fun<Fun<T1, T2>, Fun<Option<T1>, Option<T2>>> map() {
    return new Fun<Fun<T1,T2>, Fun<Option<T1>,Option<T2>>>() {
        @Override
        public Fun<Option<T1>, Option<T2>> _(final Fun<T1, T2> f) {
            return Option.<T1, T2>bind()._(Funs.<T1, T2, Option<T2>>compose()._(Option.<T2>unit())._(f));
        }
    };
}
public static <T1, T2> Fun<T2, Fun<Fun<T1, T2>, Fun<Option<T1>, T2>>> maybe() {
    return new Fun<T2, Fun<Fun<T1,T2>,Fun<Option<T1>,T2>>>() {
        @Override
        public Fun<Fun<T1, T2>, Fun<Option<T1>, T2>> _(final T2 x) {
            return new Fun<Fun<T1,T2>, Fun<Option<T1>,T2>>() {
                @Override
                public Fun<Option<T1>, T2> _(final Fun<T1, T2> f) {
                    return Funs.<Option<T1>, Option<T2>, T2>compose()._(Option.<T2>getOrElse()._(x))._(Option.<T1, T2>map()._(f));
                }
            };
        }
    };
}
public static <T1, T2 extends T1> Fun<Option<T2>, Option<T1>> cast() {
    return Option.<T2, T1>map()._(Funs.<T2, T1>cast()._(Funs.<T2>id()));
}


あとはリスト系もやろうと思ったけどここまででおなかいっぱいになってやめたww。

わんくま名古屋勉強会#15

10/16 に、わんくま名古屋勉強会 #15に参加してきました。

C++かわいい。λかわいい。
VBにパターンマッチはないらしい。(C++にもない?)


懇親会で、bleis 先生が Java で Jaav っていうライブラリ作ってるって言ってた。
(パターンマッチは少しあるらしい)

第12回名古屋Scala

10/15 に、第12回名古屋Scala勉強会に参加してきました。

  • 24章 抽出子
    • HaskellView Pattern ってのがある
    • リスト 24.1
      • これはひどい
        • Scalaである意味がない。split後なにやってるか分からない
      • パターンマッチ素敵
        • なにやってるかとてもよく分かる
    • => (Scala, Coq) と -> (F#, OCaml)
      • => が普通らしい
    • F#では関数の先頭は小文字 (メソッドの先頭は大文字)
    • F#ではメソッド使うときは変数に型指定が必要 (推論不可) らしい
  • 25章 アノテーション
    • @deprecated
      • C#ではコンパイルエラーに出来る
        • →消せばいいじゃんw
    • ファイルクローズのチェックにアノテーションが使える
      • → ローンパターンでおk
        • ローンパターン使ってなかったら警告とか
    • 副作用や所有権の確認
  • 26章 XMLの操作
    • 別になくてもいい・・・
    • \ と \\ が残念
  • 懇親会

手羽先うめぇ!

  • bleis宅

次の日に わんくま同盟 名古屋勉強会 #15 があったので、泊めてもらうことに。
a-hisame君も一緒。
自分は、泊めてもらう分と、前回ゴミ持って帰るの忘れてた分ってことで、まず食器洗いを引き受けた。
食器洗った後、bleis とプログラム談義したりしてた。
a-hisame君は何故か床で寝てた。
bleis が寝た後、自分は AB の続きを見る。(2時位〜)
・・・・・・
天使ちゃんマジ天使。
天使ちゃんマジ天使。
・・・・・・
ってことでAB見終わった (7時前)

名古屋Hackathon

10/9に名古屋Hackathon - ラムダ村に参加しました。

自分は Coq 組で参加。Coq to Scala をやってた。
Coq 組の朝は遅い。にわとりなのに。


環境構築に時間かかってた。make 長い・・・
最初は SchemeHaskell のを修正していく感じだったけど、読むだけでいっぱいいっぱい。
終了30分前くらいに、空実装から組んでいった方がいけそうだってことで、初めから。
結局、項定義のほんの一部をちょっとだけ作った。
組んでるときは型のある言語素晴らしいけど、自動生成ではき出す先としては動的型付けの方が楽。

yoshihiro503「型のない言語は良いなぁ!」
会場「ざわ・・・ざわ・・・」
会場「まさかあの yoshihiro503 さんからそんな言葉が・・・」

http://twitter.com/RKTM/status/26823635597


今まで使ったことなかった、Coq の Extraction 周りについて勉強するとても良い機会になった。
コードはそのうち公開するかも。といっても大したことしてないけど。

GitとGitHubを体験しながら身につける勉強会

9/18 に、GitとGitHubを体験しながら身につける勉強会に参加してきました。

USBメモリにぶち込んだ Ubuntu の初実践(?)。

  • merge とか使わない。rebase 使う。 (by bleis)
  • .bashrc の PS1 に $(__git_ps) で現在のブランチを表示できる
    • 自分の .bashrc もこんな感じにした (Ubuntu)↓
#if [ "$color_prompt" = yes ]; then
#    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
#else
#    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
#fi  
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\] : \[\033[01;34m\]\w$(__git_ps1)\[\033[00m\]
\$ '
PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w$(__git_ps1)\[\e[0m\]\n\$ '
  • git cat-file -p ハッシュ で、ハッシュの指す中身を見る
    • 中身
      • commit
        • tree
          • tree
            • ディレクトリ
          • blob
            • ファイル
        • parent (commit)
          • 一個前のコミット (ある場合のみ)
  • git push = git push origin master
    • master から辿れるコミットのみ push
    • git push (リモート名) (ブランチ名)
  • git reset
    • git reset
      • インデックスを戻す。ワーキングディレクトリはそのまま。
    • git reset --hard
      • インデックス、ワーキングディレクトリを戻す。
      • 今のブランチごと移動する感じ
  • git のマージ
    • (必要なら rebase して、) git reset --hard でマージ
      • fast forward マージの代わりに、移動
      • やってることは同じ
  • gitconfig
    • 自分の .gitconfig はこんな感じ ↓ (名前/メールアドレス部分省略)
[color]
	ui = auto
[core]
	editor = vim
[alias]
	log-all = log --graph --all --color --pretty='%x09%h %cn%x09%s %Cred%d%Creset'

log-all は git logで、gitk --all くらい情報ほしい から頂きました。

  • git add -p
    • ファイルの一部をステージするとかできる
  • git stash
    • 一時的に他のブランチに移って移動できる
  • bleis
    • いきなり講師を振られて難なくこなす bleis さんマジ bleis!


いろいろやった場所 : rf0444's hoge at master - GitHub