読者です 読者をやめる 読者になる 読者になる

taketoncheir.log

Like the Decatoncheir by Poseidon Industrial, This blog is Yet Another Storage for My Long Term Memories.

Install GHC and cabal on Arch (& Yaourt)

ArchLinux

Haskell PlatformをArchで使おうとしたら、リポジトリに登録されていない。
同僚に聞いたら

Haskell Platformはオワコン"

だそうなので、VagrantからArchのVMを立ててGHCとcabalをいれて構築することにした。
まぁ確かに、ほとんどcabal sandboxしか使わない。

GHC & cabal
# # ghc
# sudo pacman -Sy --noconfirm ghc

# # cabal-install
# sudo pacman -Sy --noconfirm cabal-install
# cabal update
# cabal install cabal-install -j4 --prefix=/home/vagrant/local
Yaourtのインストール (GHCとは関係ない)

ついでにYaourtもインストール (参考)

# sudo pacman -Sy base-devel
# sudo pacman -Sy diffutils gettext yajl curl
# cd /usr/local/src
# sudo wget https://aur.archlinux.org/packages/pa/package-query/package-query.tar.gz
# sudo tar xvzf package-query.tar.gz
# cd package-query
# sudo makepkg --asroot ; echo $?
# sudo pacman -U package-query-1.2-2-x86_64.pkg.tar.xz
# cd /usr/local/src
# sudo wget https://aur.archlinux.org/packages/ya/yaourt/yaourt.tar.gz
# sudo tar xvzf yaourt.tar.gz
# cd yaourt
# sudo makepkg --asroot ; echo $?
# sudo pacman -U yaourt-1.3-1-any.pkg.tar.xz

fabricで上記セットアップを行うものは以下
https://github.com/takei-shg/fabfile-archlinux

# runs with pacman -Syu
fab -H 127.0.0.1 -u vagrant --port 2222 base.all_withSysUpgrade haskell.all

gen-idea設定を書いたbuild.sbtは~/.sbt/plugins/build.sbtに配置する

Scala

ScalaプロジェクトをIntelliJ Ideaで扱えるようにするためには、
プロジェクトのbuild.sbtがあるディレクトリにて

$ sbt gen-idea

としますが、そのままだと

[error] Not a valid command: gen-idea

と怒られます。プロジェクト内に、sbt-ideaプラグインの参照先が含まれていないからです。

こちらのように各プロジェクトのbuild.sbtに書いてもいいのですが、いちいち書き換えるのは面倒なので、.sbtの中に共通設定として持たせてしまいます。

~/.sbt/plugins/build.sbt

resolvers += "sbt-idea-repo" at "http://mpeltonen.github.com/maven/"

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.5.1")

sbt-ideaのバージョンが合わずにこけることがあります。
その時は最新に変えましょう。

これでcheck out後にすぐsbt gen-ideaと打つだけでIntelliJで開発できる。

Functional Programming Principles in Scala in 2013/Sep Week 2

Scala

week 2の備忘録

# Higher Order Functions

  • とりあえず、こいつがScalaのEBNF (Extended Backus-Naur form)だ
  • | はalternative, [...]はoption, {...}はrepetitionを表す
  • varがない。functionalな部分について、ということか?
// Types

Type         = SimpleType
             | FunctionType
FunctionType = SimpleType '=>' Type
             | '(' [Types] ')' '=>' Type
SimpleType   = Ident
Types        = Type {',' Type}

// Expressions

Expr         = InfixExpr
             | FunctionExpr
             | if '(' Expr ')' Expr else Expr
InfixExpr    = PrefixExpr
             | InfixExpr Operator InfixExpr
Operator     = Ident
PrefixExpr   = ['+' | '-' | '!' | '~'] SimpleExpr
SimpleExpr   = ident
             | literal
             | SimpleExpr '.' ident
             | Block
FunctionExpr = Bindings '=>' Expr
Bindings     = ident [':' SimpleType]
             | '(' [Binding {',' Binding }] ')'
Binding      = ident [':' Type]
Block        = '{' {Def ';'} Expr '}'

// Definitions

Def          = FunDef | ValDef
FunDef       = def ident {'(' [Parameters] ')'} [':' Type] '=' Expr
ValDef       = val ident [':' Type] '=' Expr
Parameter    = ident ':' [ '=>' ] Type
Parameters   = Parameter {',' Parameter }
  • (x: Int)はcall-by-value, (x: => Int)はcall-by-name
  • classで型宣言できる
class Rational(x: Int, y: Int) {
  def numer = x
  def denom = y
}

Functional Programming Principles in Scala in 2013/Sep Week 1

Scala

Scala作者のOderskyさんが自ら解説するScalaのオンライン講義があります。

Functional Programming Principles in Scala (Coursera)

先週から始まったので、ざっと見たところをメモっておきます。
時間節約のためビデオは見てません。あしからず。

※とても大雑把なので、元の講義を参照して下さい!

Week 1 Functions & Evaluations

  • Scalaでの評価戦略
    • Scalaは基本的にはCall by Value (評価戦略についてはTaPLが詳しかった)
      • Call by Valueは引数から評価し、その後に関数の簡約
      • Call by Name は関数の簡約を先に行い、引数の評価が最後
      • そのほうがパフォーマンスが良い
      • 引数を評価してから簡約する
      • Call by Nameにしたいときは、引数の型指定に => をつける
        • def constOne(x: Int, y: => Int) = 1
        • 以下のコードはCall by Valueでloopが先に評価され、無限ループとなる
def loop: Int = loop
def count(x: Int, y: Int) = x
> count(1, loop) // 無限ループ!
  • defで宣言した変数にはCall by Name, valで宣言した変数にはCall by Valueで式が作られる
  • Scope
    • block内の変数宣言はblock内からのみ参照可能
    • blockの外はshadowで呼べる
    • 行末には暗黙的にセミコロンが入るので、複数行の式を表すには()で囲むかオペレータを行末にする
  • 末尾再帰
    • 末尾再帰であれば、簡約の最中に関数自身と同じ形が現れる。そのため、その関数のスタック領域を再利用できる。
    • 末尾再帰でなければ、式が多重に結合する形になりスタックを大きく消費する
    • Scalaでは末尾再帰でないと最適化されない
    • @tailrecアノテーションでチェックできる
感想

再帰の書き方あたりはすっ飛ばされてるんですね。
再帰の考え方や実装方法については、@kazu_yamamotoさんの再帰ドリルが参考になるかと。
使用言語はHaskellですが、書き方はほぼ同じなので難しくないと思います。

評価戦略まで突っ込んでいて、Excerciseも面白いし、この講義は当たりですね!
時間を見つけて続けていきたいと思います。


Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版


型システム入門 −プログラミング言語と型の理論−

型システム入門 −プログラミング言語と型の理論−

  • 作者: Benjamin C. Pierce,住井英二郎,遠藤侑介,酒井政裕,今井敬吾,黒木裕介,今井宜洋,才川隆文,今井健男
  • 出版社/メーカー: オーム社
  • 発売日: 2013/03/26
  • メディア: 単行本(ソフトカバー)
  • クリック: 68回
  • この商品を含むブログ (8件) を見る

Chrome DevToolsのテーマを変えてみた

*
Chromeのテーマ、スポンジボブのファニーな顔が好きなのですけど、欠点があってDevToolsのボタンが黒く塗りつぶされてしまう。

テーマの色設定を変えたりすればできるのかと思いましたが、効果なし。
テーマの作り方

そこで、DevTools themeで検索すると、あ、こっちでできますね。

今回はmnml-devtools-themeというのにしてみた。

適用手順
  • 好きなリポジトリからCustom.cssをdownload
  • (OSXだと)`~/Library/Application Support/Google/Chrome/Default/User StyleSheets/Custom.css`を置き換え
  • リロード

以上で完了。他にもいろいろあるし結構遊べそう。

私のVim-Plugin開発環境(仮)

VimL

事の発端

Evernoteのエディタがいけてません。
私はツリー形式でメモをとるので、Indent up/downがスムーズにできてほしい。
あと、メモを取った内容をブログ等に貼り付けたい。
これらが満たされないので、Evernoteに見切りをつけました。

で、XML等に変換されずそのままテキストを保存してくれるSimplenoteに移ったのですが、こちらもエディタがイケてない。

  • ブラウザ版は自動インデントがないからだめ。
  • OSX/Ubuntuで動いて欲しいのでOSXネイティブはダメ
  • NotationalVelosityはNvPyと互換性あるかと思って使ってみたけど、tagがupdateされない
  • NvPyはエディタがイケてなさすぎる
  • 本当はMobileからも編集したいけど、ひとまず諦めた

OS非依存で普通のエディタ、となると普段使っているVimでプラグインないかな、となったわけです。

VimにおけるSimplenoteプラグインの現状

Big Sky :: VimからSimpleNoteを使う方法は何個かありますよという宣伝。

これによると、いくつかあるのだけど。
どれもちょっとずつ古かったりでちゃんと動かない。
活発に開発されているのはmrtazz/simplenote.vimだけだったりする。

mrtazz/simplenote.vimpythonに依存しているみたいだし、どうせならmetarw + uniteでPluginを書いてみようかと。

Vim-Plugin開発環境

参考になったのはこちら
Vimプラグインが出来るまで - ぼっち勉強会

以下、備忘録的に自分の環境を書いておく。

  • ~/.vim/plugin以下に開発中のコードを配置
  • 以下の文言を各スクリプトに追加、ロードさせた(sn.vimスクリプトをロードさせる場合)。
if exists("g:loaded_sn")
  finish
endif
let g:loaded_sn = 1
  • プラグイン化する段階でコードをコピペ

なんとかVCSで管理できないものだろうか。
こちらのエントリーではできているようなのだが、一度試してできなかったので挫けた。
Vim プラグインの開発スタイルのお話 - 永遠に未完成

その他、備忘録

  • metarwは今回の場合ネットワーク経由でリソースを管理するので、遅い。キャッシュ等の仕組みが必要。
  • デバッグは基本的にlet g:hogeを埋め込んで:echo g:hogeってやってた
  • エラーメッセージの確認は:messagesで

結局、mrtazz/simplenote.vimが一番よさそうだ。
これをuniteに対応させるのがいいのかもしれないです。

あ、今回の記事は完全に備忘録ですので、もっと良い開発環境構築法がありましたら是非教えて頂ければ。よろしくお願いします。

ソースコード

metarw + uniteで書いてみたコードは以下。
mattnさんのコードをforkさせてもらいました。
takei-shg/vim-metarw-simplenote
takei-shg/unite-source-simplenote

実践Vim 思考のスピードで編集しよう!

実践Vim 思考のスピードで編集しよう!

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技

E. Kmettさんに圏論学習の教材を聞いてみた

Haskell Scala 圏論

先週末、ekmett勉強会なる会が開かれました。
(発起人の@tanakhさん、ありがとうございます!)

ekmettとは、HaskellやScalaにて重要なlibrary群を、ありえないスピードで作り上げていくEdward Kmmetさんのことです。

勉強会にはekmettさんがビデオチャットで参加されていて、会の最後は質問大会となりました。

その中で、私が

「Kmettさんの抽象力の源泉はどこにあるのか?」

と尋ねたところ(@nushioさん、通訳ありがとうございます!)

「(意訳すると)圏論

とのお答えでした。


ちなみに、ekmettさんがHaskellを始めたのは2006年だとのことです。
JavaScriptJavaScriptでコンパイルする場面に遭遇し、よりよい方法を探した結果だったとか。

Kmettさんに圏論初学者におすすめの資料を問うたところ、

  • Awodey's Category Theory

フリー
(追記:ワークスアプリケーションズで行われた圏論勉強会資料。講師の中村さんによりHaskellの実例も交えながら、Awodey本に出てくる圏論の基礎概念が紹介されています。おすすめ)

Category Theory (Oxford Logic Guides)

Category Theory (Oxford Logic Guides)

  • 圏論の基礎 (S.マックレーン)

圏論の基礎

圏論の基礎

  • Conceptual Mathematics: A First Introduction to Categories by Lawvere & Schanuel

Conceptual Mathematics: A First Introduction to Categories

Conceptual Mathematics: A First Introduction to Categories

  • Algebra by Serge Lang

(追記: ekmettさんのコメントを反映、皆さんコメントを一読下さい)

Algebra (Graduate Texts in Mathematics)

Algebra (Graduate Texts in Mathematics)

  • Introducing Categories to the Practicing Physicist by B. Coecke

(@mmitouさんに教えて頂いたものを追記)
フリー

以上をあげて頂いたので、皆さんに共有します。

しっかし、ekmettさん、まじ凄いし優しいし偉大すぎるわぁ

======

(追記)