<   2012年 05月 ( 20 )   > この月の画像一覧

おさらい

Real World Haskell の読書ばかりしていたら、自分で全くプログラムを書かなくなった。それで、今日は ghci 上でおさらいをしてみた。

まず、階乗の計算。

Prelude> let fact 0 = 1; fact n = n * fact (n-1)
Prelude> fact 5
120

次はフィボナッチ数列

Prelude> let fib = 0 : 1 : zipWith (+) fib (tail fib)
Prelude> take 10 fib
[0,1,1,2,3,5,8,13,21,34]

クイックソート

Prelude> let qsort [] = []; qsort (x:xs) = qsort (filter (<= x) xs) ++ [x] ++ qsort (filter (>x) xs)
Prelude> qsort [20,12,5,31]
[5,12,20,31]

サイコロを2つ振った時の目の出方

Prelude> [(x,y)| x <- [1..6], y <- [1..6]]
[(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(6,1),(6,2),(6,3),(6,4),(6,5),(6,6)]

その和

Prelude> [x+y| x <- [1..6], y <- [1..6]]
[2,3,4,5,6,7,3,4,5,6,7,8,4,5,6,7,8,9,5,6,7,8,9,10,6,7,8,9,10,11,7,8,9,10,11,12]

ここで Data.List モジュールをロード

Prelude> :m + Data.List

上の和の並べ替え

Prelude Data.List> sort [x+y| x <- [1..6], y <- [1..6]]
[2,3,3,4,4,4,5,5,5,5,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,9,9,9,9,10,10,10,11,11,12]

おなじスコアはまとめる。

Prelude Data.List> group $ sort [x+y| x <- [1..6], y <- [1..6]]
[[2],[3,3],[4,4,4],[5,5,5,5],[6,6,6,6,6],[7,7,7,7,7,7],[8,8,8,8,8],[9,9,9,9],[10,10,10],[11,11],[12]]

スコアと出現頻度のペアを作る。

Prelude Data.List> map (\x -> (head x, length x)) $ group $ sort [x+y| x <- [1..6], y <- [1..6]]
[(2,1),(3,2),(4,3),(5,4),(6,5),(7,6),(8,5),(9,4),(10,3),(11,2),(12,1)]

7の目が一番出やすいのが分かった。

ペアを作って、とかスコアを並び替えてなど、抽象的な考えのままプログラムできてしまうので、プログラムを作っているのだという実感が涌かない。楽だからいいのだけれど。
[PR]
by tnomura9 | 2012-05-31 16:49 | Haskell | Comments(0)

DANCEROID 名作選

【DANCEROID】Baby Maniacs【踊ってみた】
【DANCEROID】ポーカーフェイス【踊ってみた】
【DANCEROID】イアイア★ナイトオブデザイア【踊ってみた】
【DANCEROID】メグメグ☆ファイアーエンドレスナイト【踊ってみた】

【愛川こずえ】トゥインクル×トゥインクル踊ってみた【いとくとら】
【まぁむ×こずえ】純情☆ファイター【踊ってみた】
【暴風雨の中で】ナキムシピッポを踊ってみた...【本編はラスサビから】
【いくらミンカ】メランコリックを踊ってみた【魚民】

【いとくとら】男女踊ってみた【愛川こずえ】
[PR]
by tnomura9 | 2012-05-31 07:41 | ボーカロイド | Comments(0)

RWH の読み方(48) 第6章

Real World Haskell 第6章 Using Typeclasses

Relaxing Some Restirctions on Typeclasses

Haskell 98 report のタイプクラスのインスタンスについての文法は実用的なプログラムには使いづらい。GHC ではこれらの制限を緩和するための言語拡張が用意されている。

タイプクラスのインスタンスにリストを使う場合、Haskell 98 では [a] のように要素が必ずタイプ変数でなければならない。したがって [Char] のようなインスタンスは文法エラーになる。[Char] (String) のような頻繁に使われるデータ型がタイプクラスのインスタンスにできないのは不便なので、GHC では言語拡張 TypeSynonymInstances が用意されている。

次のプログラムはコンパイルに失敗するが、

class Foo a where
  foo :: a -> a

instance Foo String where
  foo = id

実行例:

Prelude> :l classtest.hs
[1 of 1] Compiling Main             ( classtest.hs, interpreted )

classtest.hs:4:0:
    Illegal instance declaration for `Foo String'
        (All instance types must be of the form (T t1 ... tn)
         where T is not a synonym.
         Use -XTypeSynonymInstances if you want to disable this.)
    In the instance declaration for `Foo String'
Failed, modules loaded: none.

次のようにソースの冒頭の pragma で TypeSynonymInstances 言語拡張を指定するとコンパルも実行もできるようになる。

{-# LANGUAGE TypeSynonymInstances #-}

class Foo a where
  foo :: a -> a

instance Foo String where
  foo = id

実行例:

Prelude> :l classtest.hs
[1 of 1] Compiling Main             ( classtest.hs, interpreted )
Ok, modules loaded: Main.
*Main> foo "hello"
"hello"

このセクションでは他に OverlappingInstances 言語拡張についても述べているが、OverlappingInstances 言語拡張については前回の記事で紹介している。

How Does Show Work for Strings?

The OverlappingInstances 言語拡張のない Haskell 98 で文字列と整数のリストでは show 関数を使った文字列への変換で異なる出力になるようにするトリックについて解説してあるが、パスする。

How to Give a Type a New Identity
Differences Between Data and NewType Declalations
Summary: The Three Ways of Naming Types

Haskell でユーザ定義の型を定義するのに、data キーワードを使う場合、type キーワードを使う場合、newType キーワードを使う場合の3つの方法がある。

data キーワードを使ってユーザ定義型を作る方法は既に前章で記述されているのでここでは説明がない。

type キーワードは、
type String = [Char]
のように既存のデータ型の synonym (同義語)を指定するだけだから、特に詳しい説明はなくても理解できる。

newType キーワードは用途が制限された data キーワードのように働く。その制限とは、newType キーワードで定義できるデータ型は、一つだけのデータ・コンストラクタしか定義できないことだ、さらにそのデータ・コンストラクタは、フィールドの値として一つの値しかとることができない。newType で定義できるデータ型の例は、
newType Okay = ExactlyOne Int
だ。たった一つのデータ・コンストラクタ ExactlyOne とそのたったひとつのフィールド Int の形式を必ず取る必要がある。

このような不便な型宣言がなぜ必要かというと、それは newType で定義されたデータ型の実装は、data で定義されたデータ型の実装よりはるかに軽量になるからだ。

上に示した3つのセクションを使って、newType の特徴が詳しく調べられているが、実装の話になるのでスキップする。
[PR]
by tnomura9 | 2012-05-27 19:57 | Haskell | Comments(0)

RWH の読み方(47) 第6章

Real World Haskell 第6章 Using Typeclasses

Living in an Open World

このセクションではタイプクラスの設計が open world になるように設計されているということを説明している。つまりタイプクラスにインスタンスをどこからでも追加できるということだ。

モジュールのようなコンテクストの中でオーバーロードできるインスタンスが決まっているのを closed world と言うらしい。open world と closed world は演算子/関数のオーバロードの方式に関する専門用語らしいが、読みこなせなかった。

このセクションの最初のコード例は、toValue や fromValue のオーバーローディングがいつでもできますよという例だ。

後半の2つのコード例は、次のセクションに関連してくる。

タイプクラスによる関数のオーバーローディングのどの定義を使うかは引き数の型によって選択されるが、曖昧な引き数が複数の型に解釈できるときに、Overlapping instances エラーが発生する。そういうインスタンスを発生させやすい型によるオーバーロードの定義の例を示している。

When Do Overlapping Instances

このセクションでは前のセクションで定義した、[a] というインスタンス

instance (JSON a) => JSON [a] where

と [(String, a)] というインスタンス

instance (JSON a) => JSON [(String, a)] where

の2つが、[("foo", "bar")] というデータに関して overlapping instance になるため、実行時エラーになってしまうことを示している。つまり、このデータが [a] なのか [(String, a)] なのか区別できないからだ。

理屈では分かっても実際にコードをテストしてみないとわからないので test.hs というファイルにコードを記述してテストしてみる。まず、データ型 JValue を思い切り手抜きして次のように定義する。

data JValue = NotDefined deriving (Show)

これを ghci で :l test.hs でテストするとコンパイルできる。そこで、JSON クラスの宣言を追加する。

class JSON a where
  toJValue :: a -> JValue
  fromJValue :: JValue -> Either String a

これも ghci の :r コマンドでテストするとコンパイルできる。さらに、String 型を JSON クラスのインスタンスにする。

instance JSON String where
  toJValue s = NotDefined
  fromJValue = undefined

今度は、インスタンスの宣言の仕方がよくないと指摘されてしまう。

Prelude> :r
[1 of 1] Compiling Main ( test.hs, interpreted )

test.hs:7:0:
    Illegal instance declaration for `JSON String'
        (All instance types must be of the form (T t1 ... tn)
         where T is not a synonym.
         Use -XTypeSynonymInstances if you want to disable this.)
    In the instance declaration for `JSON String'
Failed, modules loaded: none.

そこで指摘のとおりにソースの冒頭に TypeSynonymInstances スイッチを ON にする pragma を書き込む。

{-# LANGUAGE TypeSynonymInstances #-}

もう一度 :r コマンドでテストしたら今度は成功した。

Prelude> :r
[1 of 1] Compiling Main ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> toJValue "hello"
NotDefined

そこで、いよいよ [a] と [(String, a)] を JSON クラスのインスタンスにする。

instance (JSON a) => JSON [a] where
  toJValue [a] = NotDefined
  fromJValue = undefined

instance (JSON a) => JSON [(String, a)] where
  toJValue [(s, a)] = NotDefined
  fromJValue = undefined

今度は :r コマンドでテストすると、次のようにインスタンスの宣言が悪いので FlexibleInstances スイッチを使うようにとのメッセージが出る。

Prelude> :r
[1 of 1] Compiling Main ( test.hs, interpreted )

test.hs:17:0:
    Illegal instance declaration for `JSON [(String, a)]'
        (All instance types must be of the form (T a1 ... an)
         where a1 ... an are type *variables*,
         and each type variable appears at most once in the instance head.
         Use -XFlexibleInstances if you want to disable this.)
    In the instance declaration for `JSON [(String, a)]'
Failed, modules loaded: none.

そこで、FlexibleInstances スイッチを pragma に追加する。

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}

再度 :r でテストするとコンパイルできるが、
*Main> :r
Ok, modules loaded: Main.

次のように toValue を [("foo", "bar")] に関数適用すると、RWH の本文に見られたような Overlapping instances エラーがでる。

*Main> toJValue [("foo", "bar")]

<interactive>:1:0:
    Overlapping instances for JSON [([Char], [Char])]
      arising from a use of `toJValue' at <interactive>:1:0-24
    Matching instances:
      instance (JSON a) => JSON [a] -- Defined at test.hs:13:9-28
      instance (JSON a) => JSON [(String, a)]
        -- Defined at test.hs:17:9-38
    In the expression: toJValue [("foo", "bar")]
    In the definition of `it': it = toJValue [("foo", "bar")]

ここまでで、このセクションの内容は再現できたが、次のセクションに出てくる OverlappingInstances 言語拡張を pragma に記述してみる。

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, OverlappingInstances #-}

するとインスタンスの overlapping の問題も解決されて、めでたく toValue [("foo", "bar")] が実行される。

*Main> :r
[1 of 1] Compiling Main ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> toJValue [("foo", "bar")]
NotDefined

タイプクラスを実際のプログラムで活用するためには、Haskell 98 report の仕様だけでは使い難いようだ。この場合でも、GHC の言語拡張をソースの冒頭の部分で pragma に記述することで使い易くなるのが分かる。

蛇足だが、テストプログラムの全文を次に示す。

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, OverlappingInstances #-}

data JValue = NotDefined deriving (Show)

class JSON a where
  toJValue :: a -> JValue
  fromJValue :: JValue -> Either String a

instance JSON String where
  toJValue s = NotDefined
  fromJValue = undefined

instance (JSON a) => JSON [a] where
  toJValue [a] = NotDefined
  fromJValue = undefined

instance (JSON a) => JSON [(String, a)] where
  toJValue [(s, a)] = NotDefined
  fromJValue = undefined
[PR]
by tnomura9 | 2012-05-22 06:45 | Haskell | Comments(0)

きょお☆

ストロボナイツ

【きょお☆】 ストロボナイツ 【踊ってみた】

ソロ

【きょお☆】*ハロー、プラネット。【踊ってみた】
【きょお☆】教えて!!魔法のLyric【おまけあり♡】
【お誕生日記念♪】ハッピーシンセサイザ踊ってみた【きょお☆】
【きょお☆】Gravity=Reality踊ってみた【小雨の中】
【きょお☆】WAVEFILE fullver.【踊ってみた】HD

コラボ

【きょお☆】くれよん / Crayon 踊ってみた【ちえ】HD
【Koaz☆】Baby Maniacs【きょお☆・沖魅弥・あゆあゆっ・ずんずん】HD
[PR]
by tnomura9 | 2012-05-21 05:02 | ボーカロイド | Comments(0)

RWH の読み方(46) 第6章

Real World Haskell 第6章 Using Typeclasses

第6章ではあまり実際のコードのテストをしていなかったのでおさらいをしてみる。

まず、自前のタイプクラスの使い方の演習。

ファイル名:eqclasses.hs

class BasicEq a where
  isEqual, isNotEqual :: a -> a -> Bool

  isEqual x y = not (isNotEqual x y)
  isNotEqual x y = not (isEqual x y)

instance BasicEq Bool where
  isEqual True True = True
  isEqual False False = True
  isEqual _ _ = False

BasicEq タイプクラスを定義して、generic funcition として isEqual と isNotEqual を定義している。次に instance キーワードで Bool 型を BasicEq タイプクラスのインスタンスに登録する。

実行例:

*Main> :l eqclasses.hs
[1 of 1] Compiling Main ( eqclasses.hs, interpreted )
Ok, modules loaded: Main.
*Main> isEqual True True
True
*Main> isNotEqual True True
False

次は、Typeclasses at Worl: Making JSON Easier to Use セクションの実習。

まず、SimpleJSON モジュールが必要なので再掲する。

ファイル名:SimpleJSON

-- file: chap05/SimpleJSON
module SimpleJSON
  (
    JValue(..)
  , getString
  , getInt
  , getDouble
  , getObject
  , getArray
  , isNull
  ) where

data JValue =
    JString String
  | JNumber Double
  | JBool Bool
  | JNull
  | JObject [(String, JValue)]
  | JArray [JValue]
    deriving (Eq, Ord, Show)

-- accessor functions
getString :: JValue -> Maybe String
getString (JString s) = Just s
getString _ = Nothing

getInt :: JValue -> Maybe Int
getInt (JNumber n) = Just (truncate n)
getInt _ = Nothing

getDouble :: JValue -> Maybe Double
getDouble (JNumber n) = Just n
getDouble _ = Nothing

getBool :: JValue -> Maybe Bool
getBool (JBool b) = Just b
getBool _ = Nothing

getObject :: JValue -> Maybe [(String, JValue)]
getObject (JObject o) = Just o
getObject _ = Nothing

getArray :: JValue -> Maybe [JValue]
getArray (JArray a) = Just a
getArray _ = Nothing

isNull v = v == JNull

JSON タイプクラスの宣言と、JBool 型についての toJValue 関数と、fromJValue 関数のテスト。

ファイル名: JSONClass.hs

import SimpleJSON

type JSONError = String

class JSON a where
  toJValue :: a -> JValue
  fromJValue :: JValue -> Either JSONError a

instance JSON Bool where
  toJValue = JBool

  fromJValue (JBool b) = Right b
  fromJValue _ = Left "not a JSON boolean"

実行例は次のようになる。toJValue はうまく動いた。

*Main> :l JSONClass.hs
[1 of 2] Compiling SimpleJSON ( SimpleJSON.hs, interpreted )
[2 of 2] Compiling Main ( JSONClass.hs, interpreted )
Ok, modules loaded: SimpleJSON, Main.
*Main> toJValue True
JBool True

ところが、formValue を試すと formValue のタイプパラメータの型が曖昧だというエラーになってしまう。

*Main> fromJValue (JBool True)

<interactive>:1:0:
    Ambiguous type variable `a' in the constraint:
      `JSON a' arising from a use of `fromJValue' at :1:0-22
    Probable fix: add a type signature that fixes these type variable(s)

困ってしまって、"Real World Haskell fromJValue not work" で Google 検索していたら、戻値の型指定をすれば良いと教えてもらった。read の時と状況が似ている。

*Main> fromJValue (JBool True) :: Either JSONError Bool
Right True
*Main> fromJValue (JNumber 3) :: Either JSONError Bool
Left "not a JSON boolean"

動作確認ができたので、次のセクションに読み進めることができるようになった。
[PR]
by tnomura9 | 2012-05-20 12:36 | Haskell | Comments(0)

@小豆

ソロ

【@小豆】『プラチナ』-shin'in future Mix- 【リベンジ動画】
【@小豆】Yurufuwa Jukai Girl ゆるふわ樹海ガール【踊ってみた】HD
【@小豆】Sadistic Love サディスティック・ラブ踊ってみた【JKラスト】HD
【@小豆】Heart Beats【踊ってみた】HD
@小豆 教えて!!魔法のLyric【踊ってみた】
【再うp】踊ってみた@小豆【せーのっ】
【@小豆】 『プラチナ』-shin'in future Mix- 【踊ってみた】
【@小豆】 Hello / How are you♡ ハロ/ハワユ 【踊ってみた】HD
[PR]
by tnomura9 | 2012-05-20 08:25 | ボーカロイド | Comments(0)

The World Warrior

ここから、

【ゆりにゃ】The World Warrior (rap ver.)【踊ってみた】

ここへ来て、

The World Warrior street fighter 2 hyadain HD

ここへたどり着いた。

Hyadain/ヒャダイン


元気が出ました。ヒャダインさんありがとう。
[PR]
by tnomura9 | 2012-05-19 17:36 | ボーカロイド | Comments(0)

RWH の読み方(45) 第6章

Real World Haskell 第6章 Using Typeclasses

Typeclasses at Work: Making JSON Easier to Use

このセクションでは、まず、簡単なJSONのデータをHaskellの形式に翻訳している。次に元々のJSONの記述と Haskell のデータ型に翻訳したものを引用する。

JSON版

{
  "query": "awkward squad haskell",
  "estimatedCount": 3920,
  "moreResults": true,
  "results":
  [{
    "title": "Simon Peyton Jones: papers",
    "snippet": "Tackling the awkward squad: monadic input/output ...",
    "url": "http://research.microsoft.com/~simonpj/papers/marktoberdorf/",
   },
   {
    "title": "Haskell for C Programmers | Lambda the Ultimate",
    "snippet": "... the best job of all the tutorials I've read ...",
    "url": "http://lambda-the-ultimate.org/node/724",
   }]
}

Haskell 版

result :: JValue
result = JObject [
  ("query", JString "awkward squad haskell"),
  ("estimatedCount", JNumber 3920),
  ("moreResults", JBool True),
  ("results", JArray [
     JObject [
      ("title", JString "Simon Peyton Jones: papers"),
      ("snippet", JString "Tackling the awkward ..."),
      ("url", JString "http://.../marktoberdorf/")
     ]])
  ]

Haskell 版の場合、リストの要素の型は全て同じでなくてはならないなどのHaskellの型システムの制約から、データは全て JValue のデータコンストラクタによってラッピングして使用しないといけない。

そのため JSON の要素の置き換えや作成などを行うときも JNumber や JString などの複数のデータコンストラクタを使い分けなければならない。これではデータ操作の関数を記述するときに関数の記述が複雑になってしまう。一方型付けのないシステムでは、そういう詳細の検討はいらないので、どんなタイプのデータも同じ関数で処理できて、表記が簡単になる。(しかしランタイムのバグが紛れ込む可能性が高い。)

そこで狙いとしては、toValue x という関数を定義して、x の型を toValue が識別してデータコンストラクタを自動的に選択するようにしたい。Show クラスの関数の show が引き数の型を自動判別して文字列に変換するのに似ている。

また、fromValue :: JValue というように関数の戻値を :: (type signature) で指定することでコンテナの値を formValue 関数だけで取り出したい。これは、Read クラスの関数 read が文字列を type signature にしたがって様々な型のデータに変換するのと似ている。

ただし、read クラスの場合は引き数が全て文字列だったが、fromValue の場合は引き数は JValue 型なので type signature の指定とコンテナのデータ型が合っていない場合はエラーになる。そこで、formValue では戻値を Either 型にすることで、プログラムを止めずにエラー処理できるように工夫してある。

このように、タイプクラスのシステムを利用することで、煩雑になりがちなデータ型ごとの処理を関数でひとつにまとめることができる。

More Helpful Errors

このサブセクションでは、Either 型について述べてある。Either 型は標準で組み込まれており、関数の実行が失敗するような場合の処理に利用されている。Maybeと似ているが、Maybeは関数の実行が失敗した時単に Nothing を返すだけだが、Either 型では、Left と一緒に文字列のメッセージを返すことができる。

次に Either 型のデータ型の定義をを示す。

data Either a b = Left a | Right b deriving (Eq, Ord, Read, Show)

Either a b とあるが別にデータコンストラクタがパラメータを2つ取るという意味ではなく、a 型と b 型という2つの型が利用されるという意味だ。

これを使って fromValue の実行が失敗した時にエラーメッセージを返すようにするためには次のようにする。

instance JSON Bool whrere
  toJValue = JBool
  fromJValue (JBool b) = Right b
  fromJValue _ = Left "not a JSON boolean"

Making an Instance with a Type Synonym

このサブセクションではインスタンス宣言をする時に次のように type synonym を使えず、インスタンスがリストのとき、リストの要素としては type parameter のみが許されることを説明している。例えば次のような instance 宣言は許されない。

instance JSON String where

String は [Char] の type synonym (型の別名)だからだ。タイプクラスのインスタンスとして [a] は使えるが、[Char] は使えない。Haskell 98 Report の文法の性質から、type synonym はインスタンスとして使えないし、また、 リストも [a] のように type parameter を使ったリストではない [Char] 等のリストはインスタンスとして使用できないからだ。

Haskell 98 Report の文法を読んでみたが、部分的な抜粋だったのかよくわからなかった。レポート全体を理解して読むのは無理のような気がする。

Haskell 98 Report では文法を規定しているだけだが、それに準じて実装すると、文法の範囲以外のものはエラーになってしまう。しかし、GHC は拡張機能を持っており、ソースにコンパイル時の行動を指示する次のような pragma を記述しておくと、type synonym もインスタンスとして使うことができる。

{-# LANGUAGE TypeSynonymInstances #-}

単純なデータ型を使うタイプクラスの使い方は割にシンプルだが、複雑なデータ型になってくると上のように運用が難しくなる。後のサブセクションでは、型同士の衝突について述べてあるようだ。これらの知識も実際にプログラムを作ってテストしてみないと分からないが、今の段階ではとりあえず説明を読んで理解するだけにする。

上の説明にしても、Haskell 98 Report に記述されている Haskell の文法を読みこなしたり、GHC の pragma とはなんだろうと調べてみたり、脱線をかなり深くしないと本当の理解には繋がらない。それだけ、プログラム言語の理解をするということは奥深いということだが、灘高の国語の先生が授業で使った「銀の匙」という小説を題材に徹底的に脱線して題材を掘り下げるという方法が、こんな所にも直接的な形で生きている。

単に、目の前の仕事を片付けるという意味では、こういう探索の仕方は時間の浪費だが、しかし、これがなされていないと突然起こったエラーメッセージの処理などが解決できず立ち往生することにもつながる。脱線の労苦を覚悟するという態度も忘れるわけにはいかない。プログラマの生産性には100倍以上の差があるという話だが、こういう無駄な努力の積み重ねが見かけの驚異的な生産性の元になるのだろう。

著者たちのそういう知識の探索の様子が、今回のRWHの本文の理解のしがたさの端々に現れているような気がする。著者たちの簡単な説明が背後の深い知識の積み重ねの上になされている場合、その背景を知らない読者は分かり難いと考えるのだ。

続きは次回で。
[PR]
by tnomura9 | 2012-05-18 18:29 | Haskell | Comments(0)

名作コスプレ

初音ミク、巡音ルカ

[Luka & Miku] Happy Synthesizer Dance ver.

初音ミク

【marie】どうしてもミクコスでワールドイズマインを踊ってみたかった!
【りりあ】初音ミク ワールドイズマイン in 豊郷小学校旧校舎
【小倉唯】「みくみくにしてあげる♪【してやんよ】

鏡音リン、レン

【AMU×LUNA】踊ってみた リモコン 【リンレンコス】

メイコ

《complete》-Nostalogic(single edit)-踊ってみた

八九寺真宵

【ゆりにゃ】 ☆化物語☆八九寺のコスプレで帰り道 【踊ってみた】

涼宮ハルヒ

【わた&ささ】最強パレパレード【超会議で踊ってみた】HD
[PR]
by tnomura9 | 2012-05-18 04:04 | ボーカロイド | Comments(0)