Paradolia / Alex Smoke

IDMさも感じさせられるが、僕の中では有機っぽい音

ProductName Paradolia
Alex Smoke
Soma Recordings / ¥ 1,805 (2006-04-18)


A Moment To Myselfはヤバイ、パネェ。Personaもいい曲だと思う。重低音が響くスピーカーでのraveだったらオチる。

迷路のやつをHaskellで解いてみる(完)

昨日の続きここを参考にした。

import Monad
maze = ["**************************",
        "*S* *                    *",
        "* * *  *  *************  *",
        "* *   *    ************  *",
        "*    *                   *",
        "************** ***********",
        "*                        *",
        "** ***********************",
        "*      *              G  *",
        "*  *      *********** *  *",
        "*    *        ******* *  *",
        "*       *                *",
        "**************************"]

type Pos = (Int,Int)
type Path = [Pos]

findPos :: [String] -> Char -> Pos
findPos mz c =
    let y = findY mz c 0
        x = findX (mz!!y) c 0
    in (x,y)
    where
      findY :: [String] -> Char -> Int -> Int
      findY [] _ _     = error (c : " not found\n")
      findY (x:xs) c n | c `elem` x = n
                       | otherwise  = findY xs c (n+1)
      findX :: String -> Char -> Int -> Int
      findX (x:xs) c n | x == c     = n
                       | otherwise  = findX xs c (n+1)

canMove :: [String] -> Pos -> Bool
canMove mz (x,y) | mz !! y !! x == '*' = False
                   | otherwise             = True

nextSteps :: [String] -> Pos -> [Pos]
nextSteps mz (x,y) = filter (canMove mz) [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]

getAllPaths :: [String] -> Pos ->  Pos -> [Path]
getAllPaths mz st gl = getPath mz gl [ x : [st] | x <- nextSteps maze st]

getPath :: [String] -> Pos -> [Path] -> [Path]
getPath _ _ [] = fail "no Path"
getPath mz p1 ap@(path:queue)
    | p0 == p1 =  (return (reverse path)) `mplus` (getPath mz p1 queue)
    | otherwise = getPath mz p1 ( queue ++ [ x : path | x <- nextSteps mz p0, not (or (map (x `elem`) ap))])
    where p0 = head path


start = findPos maze 'S'
goal  = findPos maze 'G'
allpath = getAllPaths maze start goal

path全体で一度通った位置を再度通らないようにしないと終わらなかった。

「若い農力がアグリビジネスを変える!」に参加してみた

f-Biz主催のセミナーは初参加。若い農力がアグリビジネスを変える!というわけで、異分野すぎる気もするがまぁいいやということで。

実際参加者の6割は農業従事者だったらしい。

さて、パネラー討論でライスボディがオヤジギャグ的なネーミングセンスだったとかいう藤田さんのそういう話の流れで、小出さんがライスボディを最初においたのは富士川SAで、野菜作りも富士宮だから富士は藤田さん歓迎ムードですよ的な返しをしてたんだけど、そこで,「"ふじ"た」だけにというオヤジカウンターを返さなかったのが残念で仕方がない、悔やまれた。感想はそこに尽きる(嘘)。

あと、最初はシブヤ米って萌米みたいにパッケージングいじってマーケティングの手法で情報に付加価値くっつけてるだけなんじゃないの?とか思って聞いてたんだけど、エドウィンとの提携の話あたりを聞いてると、もう少し農業をたんに何かをつくるだけじゃなくて、そこに関わるものの営みもふくめて広く考えているんだなと思った。パッケージングも、他の商品ではごく普通にやられてるようなことがやられてないからそういう風に映るのかと認識を改めた。

あとは、味はリピーターになるかどうかの重要な要件だけど、最初にリーチするかどうかはあんま関係ないくて、リーチするためのパッケージングとかストーリー構築が重要っていうのも刺さった。思うに、酒屋ではじめての酒を選ぶのもじつはラベルに気合がはいってるかどうかだったりするもんな。で、酒屋さんはセレクトショップ的なとこを好んで使うので、情報も一緒に飲んでるっていわれれば納得なんだけど、セレクトショップ的な米屋さんて利用した事ないね。まぁ、実家が田舎で随時精米したての米が送付されてくるという体制が整っているからなんだけど。

結局、農業を単なる生産業として捉えるだけではなくて、もう少し生産の上流、下流、それに関わるヒトを見据えて再定義してるなぁと感じさせられたセミナーだった。航空を輸送じゃなくてサービス体験と再定義したとかいう話とダブった。「ちがった側面から農業を見る」ということを何度か藤田さんが話してたのも印象に残った。

農業を再定義するって言う話を含めて、どう生きるかという事に関しては農人日記が非常に刺激的だ。

僕もそろそろ、人生を再定義する時期にきているのだろうとつくづく感じる今日この頃であった。

アグリズムは明日新刊がでるらしいんだけど惜しいことにamazonには書影がない。

ProductName Agrizm (アグリズム) 2010年 03月号 [雑誌]

農業技術通信社 / ¥ 780 ()
近日発売 予約可

ProductName Agrizm(アグリズム) 2009年 12月号 [雑誌]

農業技術通信社 / ¥ 780 ()
在庫あり。

ProductName ギャル農業 (中公新書ラクレ)
藤田 志穂
中央公論新社 / ¥ 735 ()
通常5~6日以内に発送

Haskellで覆面算を解く

どう書くは知ってる言語で解くのは楽しいけど、習い始めの言語はつらい。というわけで、mixiの課題丸投げあたりをチョイスすることが多い。

覆面算を解くというのがあったのでやってみた。XYZ + WXYZ + WXYZ + VWXYZ + VWXYZ = UVWXYZを満たす文字をそれぞれ求める。

題意からU=1は自明なんだけどあえて力技で。

-- XYZ + WXYZ + WXYZ + VWXYZ + VWXYZ = UVWXYZ
-- 4*Z + 4*10*Y + 4*100*X + 3*1000*W + 10000*V = 100000*U

check :: [Int] -> Bool
check (u:v:w:x:y:z:_) = 10000*v + 3000*w + 400*x + 40*y + 4*z == 100000*u

notDup :: [Int] -> Bool
notDup (x:xs)= notDup' x xs
    where notDup' _ [] = True
          notDup' x yy@(y:ys) | x `elem` yy = False
                              | otherwise   = notDup' y ys

sol :: [[Int]]
sol = filter check $ filter notDup
      [[u,v,w,x,y,z]|u <- [0..9], v <- [0..9], w <- [0..9], x <- [0..9], y <- [0..9], z <- [0..9]]

全通りの組み合わせを作ってから数字がダブっている組み合わせを除いた。

結局、組み合わせを最初から使えばいいので、0から9の数字の中から6つを選んで、それらの入れ替えをしながらチェックをするのもやってみた。

import List


check :: [Int] -> Bool
check (u:v:w:x:y:z:_) = 10000*v + 3000*w + 400*x + 40*y + 4*z == 100000*u

comb :: [Int] -> Int -> [[Int]]
comb _ 0     = [[]]
comb [] _     = []
comb (x:xs) n = map (x:) (comb xs (n-1)) ++ comb xs n

permutation [] = [[]]
permutation xs = concat [map (x:) $ permutation (delete x xs) | x <- xs]

sol = filter check $ concatMap permutation (comb [0..9] 6)

combとpermutationはProgramming:玉手箱:組合せを参考にした

Afterglow / Vector Lovers

ノスタルジーを誘うダウンビートなトラック満載。

ProductName Afterglow
Vector Lovers
Vital / ¥ 2,204 (2007-10-09)
一時的に在庫切れですが、商品が入荷次第配送します。配送予定日がわかり次第Eメールにてお知らせします。商品の代金は発送時に請求いたします。

somaの透明感が好き。ユルユル。

Vector Lovers

よい

ProductName Vector Lovers
Vector Lovers
Soma / ¥ 1,851 (2004-09-14)


このくらい寒い夜にはいい感じのチル

ソファリにいった

初広見公園。古墳とか屋敷とかがある。あと、籠があって担げるようになっている。ゼンマイ侍好きの子どもたちはやたら喜んでいた。

1263475180 1263475216

併設されている公園。

1263475198 1263475210

さんざん行ってみたいと言ってたU隊長だが「これだったら、中央公園でいいわ」とぼそっとつぶやいたのは聞き逃さなかった。(離れた場所に遊び場あったけど)遊具的には大渕公園のが楽しいんじゃないか。きわだ路で蕎麦食えるし。

公園で遊んだら、そのまま降りて行って、吉原のsofariiでランチ。

つけナポに、五穀米ごはんを投入してスープを食べきるという技が最高でした。旨いですマジ。おすすめ。

1263475174 1263475204

U隊長の食べてたスープランチとガトーショコラ。

1263475192 1263475186

尚、つけナポの属性はつけ麺なので、僕の中ではラーメン的な扱いです。

それにしてもつけナポの公式サイトはあんまやるきないのかな(blog更新してないし)。やっつけナポリタンか?

迷路のやつをHaskellで解いてみる(未完)

実際にやってみると位置を記録すんのに手間取ったり(pythonはenumarateがあるので楽)とか、リストモナドの使い方をちゃんと理解してなかったりとかで、終わらん。

import List

maze = ["**************************",
        "*S* *                    *",
        "* * *  *  *************  *",
        "* *   *    ************  *",
        "*    *                   *",
        "************** ***********",
        "*                        *",
        "** ***********************",
        "*      *              G  *",
        "*  *      *********** *  *",
        "*    *        ******* *  *",
        "*       *                *",
        "**************************"]

type Pos = (Int,Int)
type Path = [Pos]

findPos :: [String] -> Char -> Pos
findPos maze c = 
    let y = findY maze c 0 
        x = findX (maze!!y) c 0
    in (x,y)
    where
      findY :: [String] -> Char -> Int -> Int
      findY [] _ _     = error (c : " not found\n")
      findY (x:xs) c n | c `elem` x = n
                       | otherwise  = findY xs c (n+1)
      findX :: String -> Char -> Int -> Int
      findX (x:xs) c n | x == c     = n
                       | otherwise  = findX xs c (n+1)

start = findPos maze 'S'
goal  = findPos maze 'G'

canMove :: [String] -> Pos -> Bool
canMove maze (x,y) | maze !! y !! x == '*' = False
                   | otherwise             = True

enableSteps :: [String] -> [Pos] -> [Pos]
enableSteps maze path@((x,y):_) = filter (canMove maze) [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]

getAllPaths :: [String] -> Pos -> [Path]
getAllPaths maze start = [[start]] >>= toward
                         where 
                           toward :: Path -> [Path]
                           toward path
                                  | not.null $ moves = map (:path) moves >>= toward
                                  | otherwise = [path]
                                  where 
                                    moves = enableSteps maze path

結局、リストモナドをどうつなげていったらいいのかというところでつまづいている。あと[String]っていう型じゃなくてMazeとかいう型にしといた方がよかったかも。

「アブダクション」を読んだ

年末からイノベーションに関する本をいろいろ読んでいたのだけどその流れでたどり着いた。これは名著でしょう。年明け早々いい本にあえてラッキーだ。

創薬ではある種の論理に基づいて、化合物の探索、合成を行う事になるわけだが、それはいわゆる定量的構造活性相関解析(QSAR)、定量的物性構造相関解析(QSPR)さらには動態特性(QSPkR)というような構造(やその特性)と変換したいパラメータの関連性からある程度論理的に探索対象を決定していくのが主流だ。ただし、このようなやり方では、ある意味推測が容易な答えしか出さないことが多いし、正しい答えの出るであろう予測の範囲もごく限られてしまうことが多い。予測範囲以外のものをアウトライヤーと呼び、予測の範囲外としてしまうが、実際にはそういう化合物の答えが知りたかったりするので常に苦労する。

我々は帰納的な推論から出発して、その枠を限りなく広げていきたいのだが、それはなかなか難しいし、実際問題として帰納の枠のなかでは無理ではないかと考えている。局所的な予測モデルを束ねてより大きい問題に対応すればよいのではないかという考え方もあるのだけど、それは結局、問題を小さくしておいてわかることの中だけで理解するということなのであまり上手くいかない。さらに、新規性の高い化合物にジャンプする(いわゆるホッピング)というものはQSARのような帰納的な推論方法からでは成し遂げることは非常に難しい。(ファーマコフォア探索は前提条件決め打ちだからなぁ、、)

いろいろ考えるに、結局創薬においては、それぞれのプロジェクトで(尤もらしい)仮説を構築できる力というものが一番重要なのだろうと考えているのだけど、本書はそういった仮説構築の論理というものに対して、帰納や演繹との対比をしながら明確に述べているので、QSARの論理的な限界はどこら辺なのかとか、より良い仮説を出すためにはどういう思考サイクルをまわせばいいかとかのヒントが満載だ。

ProductName アブダクション―仮説と発見の論理
米盛 裕二
勁草書房 / ¥ 2,940 ()
在庫あり。

さて、本書では科学的方法には帰納法の他に仮説の提案が必要であり、仮説の提案なしには帰納法を正しく用いることは出来ないと述べていて、その通りだと思う。しかし一方で、仮説は検討中の問題の現象についてもっともらしい、もっとも理にかなった説明を与えるものでなくてはならないとあるように、確度の高い仮説を構築するためには、高い分析能力や論理力、数多くの解析方法やマイニング方法への知識があってはじめて仮説提案力が高まるのだろうなと思うのだ。

  • 探求の論理学は思惟の動力学、論証の論理学は思惟の静力学
  • 分析的推論は前提の中にすでに含まれていること以上のことを結論をして導きだすことはできない
  • 現実の人間の思考においては、諸概念の意味は類比やモデルやメタファーなどによって絶えず修正され拡張されている
  • アブダクションとは説明仮説を形成する方法
  • 演繹、帰納、アブダクション
  • 発見のタイプ
    • ということの発見
    • なぜかの発見
  • 科学的仮説や理論は、観察された事実から導かれるのではなく、観察された事実を説明するために発明されるものである
  • アブダクションは遡及推論
  • 未知について推論するという目的にとって演繹は役に立たない
  • 仮説は検討中の問題の現象についてもっともらしい、もっとも理にかなった説明を与えるものでなくてはならない
  • 創造的想像力による推測の飛躍
  • アブダクションは理論を求める、帰納は事実を追及する
  • 単純帰納と質的帰納
  • 科学的方法には帰納法の他に仮説の提案が必要であり、仮説の提案なしには帰納法を正しく用いることは出来ない

HDBCとHDBC-SQLite3を入れた

21章は短い

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。

HDBC-2.1.0だと下のようなエラーがずらずらでるのでgitで入れる。

Database/HDBC/SqlValue.hs:585:9:
    Duplicate instance declarations:
      instance Typeable Day
        -- Defined at Database/HDBC/SqlValue.hs:585:9-20
      instance Typeable Day
        -- Defined in time-1.1.4:Data.Time.Calendar.Days

使ってみる

Prelude> :m Database.HDBC Database.HDBC.Sqlite3
Prelude Database.HDBC Database.HDBC.Sqlite3> conn <- connectSqlite3 "drkcore.db"
Prelude Database.HDBC Database.HDBC.Sqlite3> getTables conn
["entries","entry_tags","roles","tags","user_roles","users"]
Prelude Database.HDBC Database.HDBC.Sqlite3> \
quickQuery' conn "select title from entries where pubdate > '2010-01-01'" []
[[SqlByteString "\229\155\155\229\173\163\230\161\156\227\129\174\232\138\ ...

これをutf8で出力したいのでWIKIも読んどく。