最近読んだモナドに関する記事一覧
最近読んだモナドに関する記事一覧
■絶対に理解出来ないモナドチュートリアル
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を入れる
OracleがJavaのライセンスを変更したおかげで、
CanonicalがSun Javaのアップデートをできなくなったので、
新しいSun Javaを自分で入れる方法。
実行は自己責任で。
ネタ元はここ。
http://www.omgubuntu.co.uk/2012/01/canonical-reverse-java-uninstall-decision
■Javaのdebパッケージを作ってくれるスクリプトがあるので、ダウンロードして実行
参考: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
ScalaのREPLでクラスパスを追加したい場合
■REPL開始時に読み込む方法
scala -cp /home/hoge/hoge.jar
■REPL実行中に追加する方法
:cp /home/hoge/hoge.jar