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

みどりねこ日記

よくわからないけど、頑張りますよ。

Pythonを呼べるLispを作った話

この記事はLisp Advent Calendar 2016 5日目の記事です。 Futhonとは Futhonとは、Pythonが呼べるLispである。 先日作ってみた。 読み方は「ふとん」である。 本記事は、Futhonの内部実装がどうなっているかを簡単に説明する。 すごく小さな実装(ソースコー…

シン・雪女の話

ある日、おじいさんが山へ芝刈りに行って参りました。 とっぷりと日が暮れたころ、雪が降り始め、村に帰られなくなりました。 すると遠くにぽぅっと灯りがみえるではありませんか。 おじいさんはほっとして、一夜の宿を頼もうと、その一軒家を尋ねました。 …

エンジニアライフ始まります(卒業できれば)

来年からエンジニアとして東京で働くことになった. 関東にお住まいのエンジニアの皆様,どうぞよろしくお願いします. 就職活動は大変だった. 明らかに実力不足で落ちたと認識している企業が2社,そして人事面接で落ちた会社数あまた. テクニカルな面接は…

近況

なぜかはわからないが毎年1月24日に記事を書いていることが判明し,せっかくなので近況報告(という名の研究室紹介). NAISTでの大学院生生活をはじめてもう少しで1年くらい経つ. 僕はいま知能コミュニケーション研究室というところに所属して自然言語処理…

YANSに参加してきました

YANS参加したよ!ってブログ書こうと思ったけど、24時間しか参加してないし夜はお酒飲みすぎて記憶が飛んでるから書けることがあんまりない— でりひろ (@delihiros) 2015, 9月 5 大体上に書いてあるとおりなんですが、そういうわけにもいかないので絞り出し…

「迷子になったら動くな」を検証してみた

今日友達とホームセンターに行ったら迷子になってしまった。 いや、はぐれちゃっただけなんだけど、僕は携帯を持ってなかったし、この年で迷子センターに行くのもなーってことでしばらくウロウロして探した。 そこでふと幼い頃「迷子になったらそこから動く…

簡単に人の顔に泥を塗る方法

僕は人の顔に泥を塗るのを得意とするのですが、泥を塗るのにも労力がかかるんですよ。 なので常日頃からこの作業を自動化できないかと思っていたので、論文の息抜きにやってみました。 import sys, cv2, random imagefilename = sys.argv[1] image = cv2.imr…

ヤドカリごっこ

結局NAISTで自然言語の研究することに決めた。 関係者各位よろしくお願いします。 高校時代と大学入った当初はプログラミング言語に一番興味あって、当然大学院もそっち方面を研究しようと思っていた。 まさか自分が当時一番胡散臭いと思っていた自然言語に…

大学のメールアドレスにスパムメールが届いた人へ

おはようございます。 昨日酔った勢いでスパムメールを書いてしまいました。 大学のメアド宛にこんなメールが pic.twitter.com/7CI1v45l3k— Shunichi (@FreeForAll_FAL) 2014, 9月 3 今は公開している。 そもそもなぜこんなことをしたかというと、大学からフ…

東京大学大学院情報理工学系研究科合格しました

無事合格しました。 関係者の皆様、特に研究室のメンバーとアルバイト先の方々、ありがとうございました。 入学した場合は創造情報学専攻の千葉研究室でプログラミング言語の研究などをすると思います。 先月NAISTの窓口に問い合わせたところ、悩む猶予をい…

NAIST合格しました

奈良先端科学技術大学院大学情報科学研究科に合格しました。 みなさんには大変お世話になりました。ありがとうございました。 僕は言語処理とかに興味があったのですが、うちの大学ではそのへんを扱っている研究室はなかったので外部の院を探していたところ…

何もしていないのに壊れた話

友人のLinux MintのXが急に立ち上がらなくなった。 彼が席を立ってしばらくして戻ってきたらそうなっていたらしい。 彼はとくに心当たりもないとのことだったので、とりあえずはログを読んでみたが特に異常もない。 結果から簡単に言うとcinnamon-screensave…

Clojure内部のメソッド定義について

最近Clojureのコード読んでたんですが、いたるところ(このへんとか)に public Object invoke() ; public Object invoke(Object arg1) ; public Object invoke(Object arg1, Object arg2) ; public Object invoke(Object arg1, Object arg2, Object arg3) ;…

instaparseで遊ぶ

この記事はClojure Advent Calendar 2013 - Qiita [キータ]19日目の記事です。 instaparse 本記事ではinstaparseというライブラリを使って遊んでみます。 instaparseはEBNFやABNFで記述された文脈自由文法から自動的にパーサを生成してくれます。 左再帰、…

シリコンバレーいってきた

夏のインターンの関係で、シリコンバレー行ってきた。 すごいおいしいみたいな印象があったライスクリスピー、久しぶりに食べたらクッソまずかった。 けど友達にも「美味しいよこれ!!!」って言って買わせた手前、美味しいねこれ!って言いながら食べ続け…

macroless unless

(defn unless [test then else] (if test (else) (then))) (unless true #(println "hello") #(println "good bye")) good bye nil 素直にマクロ使おう。

Clojure:binding と遅延シーケンス

Clojure in Action読んでて、へえってなったのでメモ。 当然と言えば当然なのかもしれないけれど。 (def ^:dynamic *factor* 10) (defn multiply [x] (* x *factor*)) (map multiply [1 2 3]) (binding [*factor* 20] (map multiply [1 2 3])) Clojure の va…

夏休み

VOYAGE GROUPとDeNAインターンに参加した。 どちらも徹夜続きで死ぬかと思った。楽しかったけれど。 両方優勝することができたけれど、他チームと比べてダントツ!ってわけじゃなかったし、悔しい。 DeNAインターンの途中に楽天ハッカソンに参加して惨敗して…

宮島のケチなおばあさんの損失

広島の宮島にある厳島神社をご存知だろうか。 1400年も昔に創建され、平家も信仰したという由緒正しい神社で景観もすばらしく、日本三景のひとつであり世界文化遺産でもある。 私は広島出身で、 それも宮島に程よく近い中学高校に通っていたので、放課後…

パーサの連接とか

前回までに出てきた基本的なパーサをくっつけることで複雑なパーサが書けるわけですが、 今回はそのような連接とかを手助けしてくれるパーサコンビネータを紹介?します。 Kern のパーサコンビネータはシーケンス化、反復、選択、それと括弧の対応とかの面倒…

数字のパース

kern にはいくつか数値のパーサが用意されてて、これらは結果として文字列ではなく適切な数値型を返します。これらのパーサは名前空間 lexer 内のそれらに比べてサポートする数値型は少ないし、空白とかコメントとかもスキップしません。つまるところ、大き…

Kern のプリミティブパーサ

Kern にもプリミティブなパーサがあって、これらを組み合わせていくことで大きなパーサを作るというのが関数型らしいパーサの作り方なわけですが。 それらをちょっと見ていきます。 Kern けっこうかわいいわあ。 (use 'blancas.kern.core) return は常に成功…

Clojure の パーサコンビネータライブラリ Kern

Clojure でパースするとき、みんなどうしてるんだろう。 Parsec のようなものがあればいいのに〜、と思って探してみたところ、この Kern が一番よさげだった。 特徴 状態モナドベースのコンビネータ群 C, Java, Haskell, Shell の構文をサポート パースと式…

Clojure on Mac OS X Lion : heroku + compojure + hiccup

絶賛テスト前でつらいので現実逃避してClojureで遊んでみた。 開発は Emacs + nrepl + clojure-mode + leingingen です。 https://github.com/technomancy/clojure-mode https://github.com/kingtim/nrepl.el https://github.com/technomancy/leiningen この…

動物がものになるとき

昨夜遅くに帰宅してお酒をあおったあとそのまま寝てしまったようで、起きると11時になっていた。 今日は講義が休みだったので大したことはない。さて、同人誌の記事を書かねば。 自宅で同人誌が書けないことは自明なのでとりあえず駅前の美味しいワッフル…

どういったときに IORef を使うべきか

どういったときに IORef を使うべきか、という疑問が湧いてきたので、ぐぐってみると stackoverflow に同じ質問してる人がいたのでそれを訳してみる(2009年のものだから情報古いかも)。 "いつ IORef を使うべきか混乱しています。 IORef を使うべきか…

構文メモ

関数型言語 <ラムダ式> ::= <変数> | <ラムダ式> <ラムダ式> | λ <変数> . <ラムダ式> | ( <ラムダ式> ) <関数定義> ::= ( <関数名> <ラムダ式> )論理型言語 <論理式> ::= <リテラル> | <論理式> -> <論理式> | <論理式> ∧ <論理式> | <論理式> ∨ <論理式> |…

Parsec を使って Apache のログファイルをパースしてみる2

さて、ログの行をパースすることができるようになったので、これをコマンドラインツールにしましょう。今回は IO と do 記法を用いて作業します。ですので、少なくとも基本は知っていることが望ましいです。もし不安なら、Learn You a Haskell を読みましょ…

Parsec を使って Apache のログファイルをパースしてみる

この記事について この記事は、 Erik さんのvariadic.me - Adventures in Parsec - Part 1を翻訳したものです。 導入 Haskell について知っていればいるほど良いですが、あなたが熱心な Haskeller であるならこの記事は少々退屈に感じるでしょう。もし Haske…

さらなるパーサへの誘い

引き続き、Magnus氏のブログの翻訳です。 前回の記事に対して、Conal Elliottから興味深いコメントを頂きました。 もっと関数的でApplicativeな書き方をしてもいいかもね。 doで繋がったParsecコードをliftM, liftM2, ...といったように置換してみよう。読ん…

パーサへの誘い

Magnusさんのご厚意により、邦訳してもよいことになりましたので掲載させて頂きます。 もとの記事はこちらのAdventures in parsingです。 私はParsecが使いこなせるようになりたいと常日頃から思っていました。何度か試してみたのですが、そのいずれもどこか…

Scalaは関数型プログラミング言語ではない

面白い記事があったので読んでみました。翻訳です。ライセンスはCreative Commonsです。 しばらくScalaで仕事をして、疑う余地なく以下のことが断言できるようになりました。”Scalaは関数型言語ではありません。クロージャを持ち、静的な型を持つオブジェク…

Haskellモナドトランスフォーマー(12)

今まで、MaybeTとListTという2つの非常に単純なモナドトランスフォーマーの実装をしてきました。それから、少し遠回りをしてモナドをそれのトランスフォーマーに持ちあげるという話もしましたね。ここでは、その二つの考えを、StateTという標準ライブラリの…

Haskellモナドトランスフォーマー(11)

liftの実装はわりと素直です。MaybeTトランスフォーマーの場合を見てみます。 instance MonadTrans MaybeT where lift mon = MaybeT (mon >>= return . Just) 内側のモナドを値に適用し、サンドイッチで言う真ん中までの処理を行ったあと、>>=演算子と型コン…

Haskellモナドトランスフォーマー(10)

モナドトランスフォーマーによって合成されたモナドを使うとき、内側のモナドをきちんと考える必要がないようにしたいところです。そのほうが綺麗でシンプルなコードになるからです。内側のモナドの型を持った値を扱う計算の中でdoブロックを使うより、内側…

Haskellモナドトランスフォーマー(9)

標準ライブラリの中でも、とりわけ使いやすい関数の一つに、liftMがあります。モナディックでない関数をモナドの関数に持ち上げます。型を見てみましょう。 liftM :: Monad m => (a1 -> r) -> m a1 -> m r さて、liftMは関数(a1 -> r)と、a1を保持したモナド…

Haskellモナドトランスフォーマー(8)

次はリストトランスフォーマーを考えましょう。 Maybeトランスフォーマーのように、1つ引数をとるコンストラクタ付きのデータ型を定義します。 newtype ListT m a = ListT { runListT :: m [a] } ListTモナドの実装も、もとのListモナドのそれと非常に似通…

Haskellモナドトランスフォーマー(7)

さて、前回の記事では>>=演算子を実装しました。しかし、実際のところ、何が起きているのでしょうか。 (>>=)演算子は、サンドイッチの層を一枚ずつ剥がし、中の値に関数を適用し、その結果である新たな値を新しいサンドイッチの中に詰めて返すのだと考えても…

Haskellモナドトランスフォーマー(6)

Maybeトランスフォーマーのデータ型を宣言するところから始めましょう。MaybeTコンストラクタはひとつ引数を取ります。トランスフォーマーは、元のモナドと同じデータを取るので、newtypeキーワードを使用することにします。dataキーワードを使ってもいいの…

Haskellモナドトランスフォーマー(5)

モナドトランスフォーマーがいかにして動いているのかは、どのように>>=演算子が実装されているかを理解するとわかるでしょう。>>=演算子の実装は、トランスフォーマーではない、もとのモナドのそれと非常に似ていることがわかると思います。トランスフォー…

Haskellモナドトランスフォーマー(4)

モナドトランスフォーマーはモナドの結合を簡単にするモナドの、特別な種類です。例えば、ReaderT Env IO aはEnv型の環境から読み取り、IOを行い、型aを返すことができる計算です。モナドトランスフォーマーの型コンストラクタはモナドのそれにパラメータ化…

Haskellモナドトランスフォーマー(3)

さて、準備が整ったので、getPasswordやそれを利用するコードを書きなおしてみましょう。 getValidPassword :: MaybeT IO String getValidPassword = do s <- lift getLine guard (isValid s) return s askPassword :: MaybeT IO () askPassword = do lift $…

Haskellモナドトランスフォーマー(2)

関数getPasswordとそれを利用するコードを簡潔に書くために、IOモナドにMaybeモナドの特性を与えるモナドトランスフォーマーを定義します。これを、モナドトランスフォーマーの慣例的な名付け方に従い、最初に与える特性を持つモナドの名前+Tとし、MaybeTと…

Haskellモナドトランスフォーマー(1)

ここまでで、モナドがどういうもので、IOモナドは不純な計算のため、Maybeは失敗するかもしれない計算のために、…というように、どのように使われるのかが理解できたのではないかと思います。実際の作業の中で、複数のモナドの特性を扱いたい場合があります…

Haskellのモナド3(5)

モノイドについて知らないなら、この記事がわからなくても問題無いです。モノイドは、幾つかの公理を満たす、単位元(ゼロ)と2項演算(プラス)の2つのメソッドがあるクラスです。 class Monoid m where mempty :: m mappend :: m -> m -> m 例えば、リス…

Haskellのモナド3(4)

mplusとmzeroの他にも、いくつか知っておくべき関数があります。msum MonadPlusのインスタンスを扱っている時に、モナドのリスト[Maybe a]、つまり[[a]]を受け取ってそれをmplusで折りたたんでいくという作業をよく行います。msumがまさにそれです。 msum ::…

Haskellのモナド3(3)

MonadPlusのインスタンスは、モナドのインスタンスがモナド則を満たす必要があるのと同様に、いくつかの法則を満たさなくてはなりません。残念ながら、これらの法則はまだ確定していません。ただ、確実に必要なのが、mzeroとmplusがモノイドを形成することで…

Haskellのモナド3(2)

入力をパースする伝統的な方法として一つづつ文字を消費する関数を書くという方法があります。すなわち、文字列をとって、それを切り離して、もしそれの先頭が予め決めた条件(例えば、大文字しか受け付けないという条件)を満たすならそれらを順次消費して…

Haskellのモナド3(1)

モナドについて学ぶうちに気づかれたかもしれませんが、どちらも計算結果の個数を表現するという意味でMaybeモナドとリストモナドは結構似ています。 すなわち、Maybeモナドを使用して計算が失敗する可能性(0個または1個の結果)を、リストモナドを使用し…

Haskellのモナド2(6)

最初の方に、return xは”なにもせずに”ただxを返すのだと説明しました。この考えは、Stateモナドのように副作用を起こすモナドにおいて使うとき、初めて色々な意味を持ちます。すなわち、Stateモナドの計算は内部状態を書き換えることでその後の計算の結果に…