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

yunomuのブログ

酒とゲームと上から目線

Haskell

cabalでビルドをカスタマイズする

cabalファイルだけでは足りない事がある。どうしても単一のプログラムではできないこともあるし、TemplateHaskellでも生成できなくてやむなくソースコードを自動生成するスクリプトを書かざるを得ない事もあります。自動生成なんかやると何かに負けた気分に…

haskell-relational-recordとMySQLの識別子の大文字小文字

haskell-relational-record(hrr)とMySQLを使ってプログラムを書いてみようと思った。書き方自体はこのあたり。 https://github.com/khibino/haskell-relational-record https://github.com/krdlab/haskell-relational-record-driver-mysql元々haskell-relati…

UTCTimeをEqで検査する

UTCTimeが関わるテストをQuickCheckで書こうとしてハマった。まずUTCTimeをランダム生成するために、UTCTimeをArbitraryのインスタンスにしようとした。 UTCTimeはDayとDiffTimeの組になっていて、DayとDiffTimeはIntegerから作れるし、IntegerはArbitraryの…

Haskellで可変長引数

可変長引数を作りたかったわけではないんだけど、というか何がしたかったんだかよく覚えていないんだけど、こういうのを作った。 class Test a where test :: a -> Int test = const 0 instance Test a => Test (b -> a) where test f = 1 + test (f undefin…

io-streams

そろそろio-streamsで遊んでみよう。いや遊んでたのは実のところ随分前なんですけど。 http://hackage.haskell.org/package/io-streamsio-streamsというのはHaskellのストリーム処理ライブラリの一つで、シンプルなのが売りなのかな。 ストリーム処理には私…

JavaコードをHaskellで書きなおすのに手こずった話

「続・アルゴリズムを学ぼう」が発売されて、校正をほんのちょっと手伝ったお礼かなんかで発売された本を頂きまして、ぼちぼち読んだりしています。 前作に比べて使いやすいというか、親しみやすいネタが多くて面白いですね。 「続・アルゴリズムを学ぼう」h…

lens

しーんじてーこーころがとーきーめーいたー瞬間をー遠い昔のことですが、こんな記事を書きました。 record update - yunomuのブログ recordのupdateめんどくさいよねという話。で、コメント欄でふみさんに「lensあるよ」って言われました。 http://hackage.h…

record update

Haskellのrecordを使っているとこういう事をよくやる。 data Test = T { a :: Int, b :: String } updateA :: Test -> (Int -> Int) -> Test updateA t f = t { a = f (a t) } Test型のデータのaをf関数を使って更新したい。例えばほら、Stateにはmodify関数…

jhcをビルドする

環境:Mac OS X 10.8.2, GHC 7.4.2jhcはだいたい下記の記事に書いてあるとおりなんですが(autoreconfやaclocalが無い時はautoconfとautomakeをMacPortsとかでインストールするとたぶん大丈夫)、いろいろ引っかかりましたので。 簡約!λカ娘(4)の紹介とjhcの…

Haskellで特定のモジュールのコンパイルが遅すぎる

1つのモジュールのコンパイルに時間がかかりすぎて、5分間何も出力がなかったとしてビルド失敗扱いされるの、つらいものがある— 就活用アカウントさん (@eagletmt) 2013年1月24日という話があって。具体的にはaws-sdk(https://github.com/worksap-ate/aws-sd…

Haskell忘年会でAWS SDK for Haskellについて喋った

去る12月16日に行われたHaskell忘年会なるイベントでしゃべってきました。 忘年会もなにも勉強会とかにはあんましで出かけないのでほとんどの方ははじめましてという感じ? いや知ってる人も割といましたね。同僚とか同僚とか。その時の発表スライドです。 A…

少しはテストを楽しくやる(QuickCheck)

テストって別にやりたくないわけじゃないっていうかやりたいんですけど、なんかつい後回しになってしまうというか。 でも例えば外部システムとの連携部分だったりすると私は割と真面目にテストを書くんですが、普段はなんかなんとなく面倒臭い。面倒くさいと…

readを使って文字列をRead aに変換しようとする

最初はreadTextみたいな関数を作ろうとしていました。 readの、StringじゃなくてTextを取る版。 readText :: Read a => Text -> a で、最初はこんな感じで実装しようとしていた。 module Main where import Data.Text (Text) import qualified Data.Text as …

Haskellでコマンドラインパーサを使う2

前回とは違うライブラリを使ってみます。 前回: Haskellでコマンドラインパーサを使う - yunomuのブログ前回の記事ではcmdargsを使ったんですが、あれはあれで面倒くさいというか、あらかじめ定義したrecord型の通りにしかデータを取ることができないのがた…

Haskellでコマンドラインパーサを使う

コマンドライン引数のパースがだいたいどう転んでも面倒くさい。特にCとかJavaとかは本当に泣きたくなりますよね。まあJavaでコマンドラインのプログラムを書く事なんてあんまし無いかもしれませんけど。いや、ありますけど。泣きながら書いてました。Haskel…

Control.Concurrent.forkIOをもっとうまくやる

以前に、 Conduit + Attoparsec (+ Concurrent) - yunomuのブログこのあたりで forkIOステキ!みたいなことを書いたんだと思う。で、最近ようやくこのあたりを真面目に扱うようになり、「プロセス終了時にスレッド中断されてるじゃん!」ってことに気付いた…

simple-config v1.0.0

一人で開発していても共通ライブラリというものは増えていくものでして、でも大体はプロジェクト内だけで収まってしまうようなものだったり、外に出すための一般化がとても面倒臭かったり、ファイル1個とか関数いくつかだからコピペでいいかってなったりして…

簡易設定ファイルパーサジェネレータ

なまえがややこしい。設定ファイルって面倒くさいからあんまし書きたくなくて、だいたいはコマンドライン引数で済ませる方向で生きてきました。 が、それはそれで面倒だったりして、いやまあ結構便利なライブラリがそれぞれの言語や環境ごとにあったりするの…

HTMLパーサ

HTMLパーサに今まではTagSoupを使っていたんですけど、IOまわりをConduitで書き直してるついでになんか別のConduit対応パーサを使ってみようかなと思ってちょっと調べてみました。とりあえず一番簡単というか最初に目についたのはhtml-conduitのsinkDocを使…

Wai+WarpのWebサーバを拡張する

頂いたラムを飲みながらお送りしております。で、前の続きです。 前の:Wai + WarpでWebサーバを作る - yunomuのブログWaiのマニュアルを見てるとちょっと面白い型があって Network.Wai type Application = Request -> ResourceT IO Response type Middlewar…

HaskellからCライブラリを呼ぶ(FFI)

Haskellのなんでもアリ具合。ライブラリをビルドしてるとちょいちょい見えるFFIという文字列、気になって調べてみると、ForeignFunctionInterfaceというものがあって、これはHaskellからCの関数を呼び出すためのモジュールというか拡張らしい。 Haskellのも…

recv: invalid argument (Bad file descriptor)

この前(Conduit + Attoparsec (+ Concurrent) - yunomuのブログ)の記事に書いてあるコードを実行すると6〜8割くらいの確率でエラーが出ます。結構な確率で。 recv: invalid argument (Bad file descriptor) こんなの。recvとかfile descriptorとかそういう…

Wai + WarpでWebサーバを作る

WarpってWebサーバらしいですよ。 いやまあ今回はそういう前置きはいいんですけど、Yesodの人ことSnoymanさんが作っているWaiとWarpでWebサーバを書いてみようと思います。まずは調査。 Waiとはなんぞや。 Network.Wai Web Application Interfaceらしいです…

Conduit + Attoparsec (+ Concurrent)

Conduit 0.5が出て、わかりやすいチュートリアルが書かれていたので、それで一日中遊んでいたりしました。 ConduitとHaskellでネットワークプロキシサーバを作る - 純粋関数空間 Conduit楽しいですね。これを上から下までやってなんとなく感覚を掴んだところ…

Template Haskellで遊んでみる

メタプログラミングって最近よく聞くけど、必要性をあまり感じてなくて放置していたんだけど、よくよく調べるとCでいうところの関数マクロでコード書いたり、ソースを解析してライブラリのヘッダファイルを生成したりとか、普通にやってる事をもう少し言語の…

Stateモナドとモナドトランスフォーマー

前フリ 最近@seizansさんが新人Haskell使いを増やしまくっている。 で、その人達がググった時のために先にたくさんブログ記事書いて釣ろうぜっていう話をしていたけど、@kazu_yamamotoさんとか@nom4476さんらが仰るように、一旦自分がわかってしまうとなかな…

Filesystemモジュール

「Haskellで実行ファイル名をパス付きで取得する」って記事で出てきたFilePathって型がFilesystem.Pathで定義されているんですが、これをどう使ったらいいものかよくわかんなくて、とりあえずFilesystem.Path.CurrentOSをimportしてStringに変換して使ってい…

HaskellでCGI

最近「Haskellで~」ってタイトルばっかですね。 今回のも「CGIを書く」とかでいいのかもしれない。っていうほどHaskellのことばかり書いてるわけでもないのでそれはやり過ぎかもしれない。 たぶんそのうちRubyの記事も書きます。 Hello World で、Haskellで…

Haskellで実行ファイル名をパス付きで取得する

CGIを書くときとか、実行ファイルが置いてあるパスが欲しい事がある。 設定ファイルやデータの読み書きをするために。一応System.EnvironmentのgetProgNameで実行ファイルの名前は取れるんだけど、これにはパス名が付いてない。 getArgsにも入ってないし。 S…

HaskellでTwitterにpostする

例によってお酒を飲みながら書いているので文章が冗長です。御託はいいって人は本題まで飛ばしましょう。 枕っていうか前置き プログラミング言語選択の理由というのは結局のところライブラリだったり環境にインストールされてるのがそれしかなかったりとか…

Haskellで並列処理

あの、関数型言語の特徴としてよく「並列化しやすい」とか挙げられますよね。なんでかっていうのはなんかよくわかんないんだけど、やっぱりその、副作用っていうか、他のスレッドに影響を及ぼすような処理を書きづらいというか、影響を及ぼさない処理を書き…

なんでもアリ

プログラミングコンテストとか苦手なんだよねぇ。 でも「FizzBuzzで一番笑わせた奴が優勝」とか、そういうのならやりたい。なんて言ってたら大学の後輩がこんなのを教えてくれた。IOCCCで出てたFizzBuzz(?)のCode Golf(?)らしい?dev.c #include"/dev/tty" …

Parsecを使って正規表現の代わりにパーサを与えるgrepのようなものを作る

Haskellやるならパーサ作っておかなきゃいけないかなって。ということで試しにIPv4アドレスのパーサと、正規表現の代わりにパーサを与えるgrepのようなものを作ってみようかなと。 完成イメージはこんな感じ。(実際にはこの記事のコードの完成直前に固まり…

HaskellでOSコマンド実行

当たり前の事を当たり前にやりたいよね。ちょっとしたスクリプトを書く時に、OSのコマンドを実行してその結果をgrepしてcutしてとか、そういう事をよくやる。Haskellでやるかどうかっていうのは別として、そういうのってどうやるんだろうと思って。 grepとか…

getLineでファイルを最後まで円満に読む

UNIXっぽいストリームっぽいコマンドが作りたい。 といった時に、入力を「最後まで」読むにはどうしたらいいのという話。何も考えずにcatっぽいのを書くとこうなる。catじゃなくてechoだな。 import System.IO main :: IO () main = do l <- getLine putStrL…

Hoogleをローカルで使う

Haskellのマニュアル検索のHoogleってシステムがある。 http://www.haskell.org/hoogle/ 便利なんだけど、manに慣れた我々としてはコマンドで使いたいじゃない。Erlangもmanっぽいの用意してくれてるし。 ということで、パッケージがありそうなので入れてみ…

Redmineのプロジェクトの並びが気に入らないという話なのにHaskell書いてた

Redmineを使おうと思ってセットアップしてみたんですけど、なんか、プロジェクトのソート順が気に食わないというか。 プロジェクト1, 2, 3があって、そのサブプロジェクトがそれぞれあって、 1. 1-1 1-2 1-3 2. 2-1 2-2 3. 3-1 3-2という風に、当たり前のよ…

GHCをビルドする

その昔、ソフトウェアのインストールというのが一大イベントだった時代があったという。って20年前くらいですけど。 なぜ難しいかというと、今のようにパッケージ管理なんてものは無かったし、そもそもバイナリ配布できるほどいろんなものの規格が統一されて…

Haskellでインタプリタみたいなのを実装する時のBufferModeの事

Haskellはもういいよって言いながらまたHaskellの話。Haskellでdcっぽいのを作ってる時、 Haskellでdcっぽいのを作る その1 - yunomuのラクに生きたい Haskellでdcっぽいのを作る その2 型安全とは - yunomuのラクに生きたい 両方とも最後に「なんかコンパイ…

CentOSにソースからHaskell Platformを入れる

Haskell Platformってyumに無いの?ブログタイトルを「ラクに生きたい」にしたのに、ソースから入れる記事とかHaskellで悩んでる記事ばっか書いてるとなんか裏切ってる気が。いっそGentoo使いになって「苦労を買ってでもやるブログ」とかにしようかというこ…

Haskellでdcっぽいのを作る その2 型安全とは

Haskellでdcっぽいのを作る その1 - yunomuのラクに生きたい これを書いてから、なんか、なんとなく気持ち悪い感じで日々を過ごしていたんですが、 なんていうかアレですよ、「それモナドにしないの?」って、言われているような気がしていて。参考:「モナ…

Haskellでdcっぽいのを作る その1

「Haskellやると彼女ができる」という都市伝説がある。そういえばスタートHaskell第0回参加の時のアンケートで「なぜHaskellを始めたいか」って聞かれて「彼女ができると聞いて」って答えた気がする。そして私はHaskellを勉強しはじめてしまったので、今私に…

Mighttpd2のビルドしようかと思ったけれど

結論から言うとできてません。やたら早く目がさめたので遊んでる。Haskellはもういいよって言ったけど、なんか適当なHaskell実装は一度は見てみたいなぁとは思っていて、Mighttpd2のソースを見てみたら案外量が少なかったのでちょっとやる気が出た。気になる…