最近読んだモナドに関する記事一覧

最近読んだモナドに関する記事一覧

■絶対に理解出来ないモナドチュートリアル
http://konn-san.com/prog/never-understood-monad-tutorial.html

モナドとはモナドである
http://fumieval.hatenablog.com/entry/2013/06/28/224439

モナドの六つの系統[Functor x Functor]
http://fumieval.hatenablog.com/entry/2013/06/05/182316

モナドが解らない人へ、図解で絶対わかるモナドのしくみ
http://d.hatena.ne.jp/qtamaki/20130624/1372086242

圏論とかモナドなんて簡単だからscalaを使って説明してみた
http://rirakkumya.hatenablog.com/entry/2013/03/31/191056

■QAで学ぶMonad
http://d.hatena.ne.jp/kazu-yamamoto/20110413/1302683869

モナドはメタファーではない
http://eed3si9n.com/ja/monads-are-not-metaphors

■Functors, Applicatives, And Monads In Pictures
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html

結論としては、やっぱりよく分からない。
上述の絶対に理解出来ないモナドチュートリアルで書かれていた、
オブジェクト指向と同様、使ってればそのうち分かるというのを聞いて、
なんとなくしっくりきた。
オブジェクト指向が騒がれたときも、車がオブジェクトでアクセルがメソッド、
みたいな解説が溢れ、それに対して分かりにくいだろというツッコミもよくあった。
で、一体なんだろうと思ってるうちに、なんとなく使えるようになっていた。
使えるようになったというのは語弊があるかもしれない。
オブジェクト指向とは何かと突っ込んで聞かれたら答えられない。
まあモナドも学術的な理解は置いておいて、コード書いてればそんな感じで
使えるようになるのかもしれない。
とりあえず今のところの理解としては、コンテナの中に入った値に対して、
何かよろしく処理をしてくれるもの、ぐらいである。

Scalaでお手軽並列処理

parallel collectionを使う。
http://docs.scala-lang.org/ja/overviews/parallel-collections/overview.html

scala> val l = List(1,2,3,4,5,6,7,8,9,10)
l: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> l.par.foreach(i => println(s"[${Thread.currentThread.getName}] : ${i}"))
[ForkJoinPool-1-worker-10] : 1
[ForkJoinPool-1-worker-12] : 8
[ForkJoinPool-1-worker-11] : 6
[ForkJoinPool-1-worker-11] : 7
[ForkJoinPool-1-worker-12] : 9
[ForkJoinPool-1-worker-12] : 10
[ForkJoinPool-1-worker-10] : 2
[ForkJoinPool-1-worker-13] : 3
[ForkJoinPool-1-worker-11] : 5
[ForkJoinPool-1-worker-12] : 4

使える場所は限られるだろうが、なんというお手軽さ・・・。

UbuntuにSun Java 6u30を入れる

OracleJavaのライセンスを変更したおかげで、
CanonicalがSun Javaのアップデートをできなくなったので、
新しいSun Javaを自分で入れる方法。
実行は自己責任で。
ネタ元はここ。
http://www.omgubuntu.co.uk/2012/01/canonical-reverse-java-uninstall-decision

Javadebパッケージを作ってくれるスクリプトがあるので、ダウンロードして実行
参考:http://blog.flexion.org/2012/01/16/install-sun-java-6-jre-jdk-from-deb-packages/

cd ~/
wget https://raw.github.com/flexiondotorg/oab-java6/master/oab-java6.sh -O oab-java6.sh
chmod +x oab-java6.sh
sudo ./oab-java6.sh

■/var/local/oab/debに作成したdebがある。
ls -lh /var/local/oab/deb

  • rw-r--r-- 1 root staff 10324 2012-01-20 17:38 Packages
  • rw-r--r-- 1 root staff 2926 2012-01-20 17:38 Packages.gz
  • rw-r--r-- 1 root staff 248 2012-01-20 17:38 override
  • rw-r--r-- 1 root staff 27466934 2012-01-20 17:37 sun-java6-bin_6.30-3~oneiric1_i386.deb
  • rw-r--r-- 1 root staff 12130034 2012-01-20 17:38 sun-java6-demo_6.30-3~oneiric1_i386.deb
  • rw-r--r-- 1 root staff 1910 2012-01-20 17:38 sun-java6-fonts_6.30-3~oneiric1_all.deb
  • rw-r--r-- 1 root staff 10758238 2012-01-20 17:38 sun-java6-javadb_6.30-3~oneiric1_all.deb
  • rw-r--r-- 1 root staff 20251540 2012-01-20 17:38 sun-java6-jdk_6.30-3~oneiric1_i386.deb
  • rw-r--r-- 1 root staff 9239520 2012-01-20 17:38 sun-java6-jre_6.30-3~oneiric1_all.deb
  • rw-r--r-- 1 root staff 1760 2012-01-20 17:37 sun-java6-plugin_6.30-3~oneiric1_i386.deb
  • rw-r--r-- 1 root staff 17913776 2012-01-20 17:38 sun-java6-source_6.30-3~oneiric1_all.deb
  • rw-r--r-- 1 root staff 3700 2012-01-20 17:38 sun-java6_6.30-3~oneiric1_i386.changes

Javaインストール
入れたいものを入れる。以下は全て入れる場合。
sudo apt-get install sun-java6-*

Java切り替え
sudo update-alternatives --config java
使用したいJavaの番号を押してENTER

■確認
$ java -version
java version "1.6.0_30"
Java(TM) SE Runtime Environment (build 1.6.0_30-b12)
Java HotSpot(TM) Server VM (build 20.5-b03, mixed mode)

ScalaでRubyのFile.joinみたいなのを実装

こんな感じで。

  /**
   * 与えられた複数の文字列からファイルパスを作成する。
   */
  def createPath(pathes: String*): String = {
    import java.io.File
    pathes.foldLeft(""){(s, p) => (new File(s, p)).getAbsolutePath()}
//    ("" /: pathes){(s, p) => (new File(s, p)).getAbsolutePath()}
  }

foldLeftと/:、どちらでもいいのですが、どちらが主流なんでしょうね。
なんとなく自分はfoldLeft派。

ちなみに実行するとこうなります。

scala> createPath("tmp","hoge","moga","piyo.csv")
res87: String = /tmp/hoge/moga/piyo.csv