1read 100read
2012年5月プログラム189: 関数型言語ML (SML, OCaml, etc.), Part 6 (532)
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▼
J#って何のためにあるの? (152)
EAを語るスレ (227)
【QBASIC互換!?】FreeBasic【GPL】 (498)
プログラミング言語 Scala 8冊目 (133)
【node.js】サーバサイドjavascript【Rhino】 (755)
☆Raspberry Pi☆でプログラム1 (599)
関数型言語ML (SML, OCaml, etc.), Part 6
1 :09/06/15 〜 最終レス :12/05/08 関数型言語MLについて語るスレッドです。 MLは、確固とした理論的背景を持つ言語でありながら、 現実的なソフトの開発にも使用できる実用性を備えた言語です。 また、プログラミングの初心者が最初に学習する言語としても優れています。 総本山 Standard ML http://www.smlnj.org/ Objective Caml http://caml.inria.fr/ocaml/ 前スレ 関数型言語ML(SML, OCaml, etc.), Part 5 http://pc12.2ch.net/test/read.cgi/tech/1186292994/
2 : プログラミングの初心者が最初に学習する言語としても優れているのに、 学習者が増えないのはなぜなの?
3 : >>2 教える側が理解していないから。
4 : >>2 初心者が日常で使うにはハードルが高いからかな
5 : 前スレでもあったけどOcamlとHaskellってどっちが初心者に向いてるのかな? Lispいじってた俺にとってはOcamlの方が見た感じ楽そうに見えるけど Lisp、Ocaml、Haskellマスターの意見が聞いてみたいな
6 : standard MLをさらっとやってから決めれば。
7 : >>5 型つき関数型言語の背景にある背景理論(ラムダ計算)をぱっと勉強したいならHaskell, 実用で長いこと使いたいならOCaml。
8 : オブジェクトを使わずにステートマシンを作るのによい方法はありますか? 勉強のためにStateパターンをモジュールを使ってやってみようと思ったのですが、 相互依存を回避するうまい方法が思いつきません。 また、状態をそれぞれ別モジュールにするにせよ、一箇所にまとめるにせよ、動的に切り替えるためには 結局パターンマッチさせてそれらを呼び出すようになると思いますが、もっとスマートな方法はありますか?
9 : >>8 まずは具体的な実装例を挙げてみたら?
10 : うん、なんか簡単な問題例を出してくれないとわかんないよ。
11 : state machineの問題例というとよくあるのはストップウォッチとか。
12 : 実際の問題を簡単にした問題例です。 流れ: キャラクタがバイトをして財布がいっぱいになったら銀行へ行く ということを目標金額まで繰り返し、到達したらその金がなくなるまで 家でごろ寝し、なくなったらまた働く キャラクタは ・バイトをする : 手持ちが1増える ・銀行で貯金をする : 手持ちを0にし、貯金が1増える ・家で寝る : 貯金が1減る の状態を取ります。 財布の許容量は3、目標貯金額は5とします。 Ocaml的な解決方法のアドバイスをいただけると幸いです。 ちなみに元々の問題は「実例で学ぶゲームAIプログラミング」 という本の2章に出てくる、上記の問題例にいくつか余分な状態を 追加したようなものです。 元々の問題をとりあえず実装してみたソースとサンプルソースも あげてみました。 http://www1.axfc.net/uploader/Sc/so/9827.lzh
13 : スレ違いではありますが、もう1つ後学のために質問をさせてください。 アップロードするのは初めてでよくわからないままaxfcを 使用したのですが、プログラム板で一般的に使用されている アップローダーというものはあるのでしょうか?
14 : >12 その手の奴って素直に状態保持した方が色々スッキリしそうなんだけどどうなのエロイ人
15 : >>12 > キャラクタは > ・バイトをする : 手持ちが1増える > ・銀行で貯金をする : 手持ちを0にし、貯金が1増える > ・家で寝る : 貯金が1減る > の状態を取ります。 ニート解: キャラクタはバイトせず取り敢えず銀行へ行く ということを目標金額まで繰り返し、到達したらその金がなくなるまで 家でごろ寝し、なくなったらまた働かずにまた銀行へ行く
16 : 継続っぽくすればいいんじゃない?
17 : コードを晒すにはここがいいよ http://codepad.org/
18 : なんで12の問題にStateパターンが適してるのかよくわからない。。
19 : interface State { void whatToDoNext(); } みたいなインターフェイスがあって、 class RichState implements State { public void whatToDoNext() { goToTheBank(); } class PoorState implements State { public void whatToDoNext() { work(); } ... みたいなイメージですか?
20 : これくらいなら引数に状態を持たせて各状態を手続きで表せばよくね?
21 : >>20 のやり方がいいんじゃねーかな たぶん>>16 も同じこと? たぶん両者が言ってるのはこんな感じ?(1/2) type action = | Work // バイトをする | Deposite // 銀行で貯金をする | Rest;; // 家で寝る type life_state = | Working // …ということを目標金額まで繰り返し | Resting;; // ごろ寝 let sigma event state = match (event, state) with // バイトをする: 手持ちが1増える | (Work, (budget, account)) -> (budget + 1, account) // 銀行で貯金をする: 手持ちを0にし、貯金が1増える | (Deposite, (budget, account)) -> (0, account + 1) // 家で寝る: 貯金が1減る | (Rest, (budget, account)) -> (budget, account - 1);;
22 : (2/2) let rec life state days = printfn "%A" (state, days); if days = 0 then () else match state with // 財布がいっぱいになったら銀行へ行く | (Working, (3, account)) -> life (Working, sigma Deposite (3, account)) (days - 1) // ということを目標金額まで繰り返し | (Working, (budget, 5)) -> life (Resting, sigma Rest (budget, 5)) (days - 1) // (財布がいっぱいになるまでは働く) | (Working, s) -> life (Working, sigma Work s) (days - 1) // 到達したらその金がなくなるまで家でごろ寝し、なくなったらまた働く | (Resting, (budget, 0)) -> life (Working, sigma Work (budget, 0)) (days - 1) // (なくなるまではごろ寝する) | (Resting, s) -> life (Resting, sigma Rest s) (days - 1);; 改行が…まぁいいか ちなみにF#です
23 : >>16 継続について調べてみます。 >>17 ありがとうございます。今度コードを晒すときに使ってみます。 >>19 おそらくそのイメージで合っていると思います。 (とはいってもJavaはよくわからないのですが・・・) トップレベルでキャラクタクラスのUpdateを呼び出すと、保持している 派生状態クラスのインターフェースに自身を渡して実行。あとはよろしく。 状態の切り替えも勝手にお願いね。 的なコードが元々のサンプルコードです。 >>21 コードを書いていただきありがとうございます。 例題を簡略化したせいで反ってわかりにくくなってしまい、すみませんでした。 とりあえず継続というものを調べつつもう少し考えて見ます。 皆様ありがとうございました。
24 : 考えてみたけどこれじゃだめ? (* 1/2 *) type state = { cash: int; deposit: int; action: unit -> state } let rec work_state cash deposit = { cash = cash; deposit = deposit; action = (fun () -> print_endline "work"; let cash' = succ cash in if cash' < 3 then work_state cash' deposit else rich_state cash' deposit )} and rich_state cash deposit = { cash = cash; deposit = deposit; action = (fun () -> print_endline "go to the bank"; let deposit' = succ deposit in if deposit' < 5 then work_state 0 deposit' else neet_state 0 deposit' )}
25 : (* 2/2 *) and neet_state cash deposit = { cash = cash; deposit = deposit; action = (fun () -> print_endline "sleep"; let deposit' = pred deposit in if deposit' > 0 then neet_state cash deposit' else work_state cash deposit' )} let initial_state = work_state 0 0
26 : この規模だといいけど、 行動の結果と選択を独立に実装できる方が 将来の拡張にはよいんじゃないかな、 特に質問者はゲームAIの本読んでるらしいし。
27 : いつのまにやらObjective Caml is 3.11.1でてる
28 : OCamlで副作用のあるライブラリを使っていて、 クロージャの(環境の)合成がしたくなったのですが失敗します 再現コードを書くと ma,mbは期待通りですがmcは毎回1が出力されます 環境の中の環境ってのは呼ばれるごとに新しい環境になるからってことですかね let a x f= let r = ref x in fun ()->Printf.printf "%d" !r;f(); r:=!r+1;; let b x f= let r = ref x in fun ()->Printf.printf "%d" !r;f(); r:=2* !r;; let c x f = fun ()->(a x (b x f))();; let ma = a 0 (fun ()->Printf.printf "a\n" );; let mb = b 1 (fun ()->Printf.printf "b\n");; let mc = c 1 (fun ()->Printf.printf "c\n");; ma();;ma();;ma();; mb();;mb();;mb();; mc();;mc();;mc();; てことはOCamlのオブジェクト指向部分ちゃんと覚えないとだめかな by poor man
29 : let rec length list = match list with [] -> 0 | x::rest -> 1 + length rest;; このリストの長さを返す再帰関数の動きなんですが、下へ展開していって ループが終了したら、上に値が戻ってくるイメージでOKですか? length [2; 1; 3] = match [2; 1; 3] with | 2 :: [1; 3] -> 1 + length [1; 3] = match [1; 3] with | 1 :: [3] -> 1 + length [3] = match [3] with | 3 :: [] -> 1 + length [] = match [] with [] -> 0 1 + 0 1 + 1 1 + 2 length [2; 1; 3] = 3
30 : 上とか下でなくて、行って戻ってくるイメージですね。ブーメランみたいな。
31 : IDないんですね。29,30,31は、29です。
32 : インデントを浅くしろw 基本的に再帰は漸化式と同じと考えれば良い。 それで合ってるが、一々動作を深く考えずに関数を定義出来るようになるのが 最初の一歩だから精進すべし。
33 : ども。インデントはあれかなぁと書いた後に思いました。 命令型言語だとカウントする変数を作ってa = a + 1みたいな イメージが強くて直感的にこのソース見て理解出来なかったので。 書いて見ると理解出来るもんですね。精進します。
34 : >>29 ocamlのトップレベルには#traceというディレクティブがあって、 指定した関数の動きが表示される 再帰関数の動きを確認するのにはやや便利だから使ってみて # #trace length;; length is now traced. # length [1;2;3];; length <-- [<poly>; <poly>; <poly>] length <-- [<poly>; <poly>] length <-- [<poly>] length <-- [] length --> 0 length --> 1 length --> 2 length --> 3 - : int = 3
35 : >>34 こういうのあったんですね。助かります。どもです。
36 : 前スレって埋まる前に落ちたんですか?
37 : うん
38 : >>28 質問をまず推敲してくれ。「期待」とやらが何かわかんねー。 > てことはOCamlのオブジェクト指向部分ちゃんと覚えないとだめかな それは違うだろ。
39 : >>28 let c x f = a x (b x f);; これが28の期待に沿っているといいのだが。
40 : ttp://flyingfrogblog.blogspot.com/2009/03/hlvm-has-been-released.html HLVMってのはLLVMの関数型特化版、みたいなイメージ? OCamlはこっちになるの? おしえてエロいひと
41 : 釣りなの?釣りなの? > HLVMってのはLLVMの関数型特化版、みたいなイメージ? そういう理解でいい。 HLVM そのものの批判は詳細を知らないのでできないけど、 - Caml team は HLVM プロジェクトには全く噛んでない。 - Caml team と consortium が関知しない code generation の総入れ替えはありえない。 - HLVM で騒いでいる奴は各種言語メーリングリストの有名粘着。何かというとすぐ自分の有料メールマガジンに誘導。 - なんかちょっとした toy example が出来るたびに大騒ぎ。正直みんな食傷している。 将来化ける事もあるかもしれない。が、今は放置をお薦め。時間の無駄。
42 : >>41 前スレでも話題になってたHarropのこと?
43 : ttp://www.infoq.com/jp/news/2008/03/revoerability-and-testing-oo-fp ここに 「Feathers氏に反対する人の多くは、関数型のコード乱雑になる原因は、 関数型ではないイディオムを関数型言語に持ち込んだこと以外にはないと 信じている。」 っていう記述があるけど、関数型言語のイディオム(とかデザインパターン)って どんなのがあるの?おしえてエロいひとー
44 : >>43 原文を読んでみると、単に副作用のない純粋関数型のコードを 関数型のイディオムと呼んでいるように思えるな。
45 : >>43 そうだとするとあまりに漠然としていて多少の窮屈感が欲しくなるな。 ノーパンでスカートを穿いているような、あるいは力戦になって次に なにを指せばいいのかわからない、そんな感じ。 そのうちそういうのがまとめられればいいなぁ。
46 : >>45 のアンカーまちがえた。 >>44 が正解
47 : >>45 おっしゃる事があまりに漠然としていて多少の具体感が欲しくなるな。 ノーパンでスカートも穿いてないような、あるいは序盤なのに次に なにを指せばいいのかわかってない、そんな感じ。 そのうちそういうのをまとめられるようになってくれ。
48 : >>45 関数型が嫌いor慣れてない人の多くは純粋関数型の副作用の無い世界を 非常に窮屈だと感じるわけで。不感症になったのも慣れということだなw
49 : >>43 そのまんま、関数型スタイルだろ。
50 : >>41 ありがとん参考になった! ベンチマークだけみて速いなーとか思っただけなんで、 そんな背景があったとはまったく知らんかったyo
51 : >>50 GC なしで早いよーと叫ばれてもね。 普通にMLのプログラムがコンパイル出来るようになったら ベンチを見てみてもいい。
52 : >>43 デザインパターンってぶっちゃけてみれば、バッドノウハウのことでしょ。 関数型言語にそんなのないよ。
53 : 昨晩の議論の結果、「デザインパターン」はありませんが、「あるあるネタ集」ならあることになりました。
54 : >>52 関数型言語にデザインパターンがないということはないだろう。要は「あるあるネタ集」(の粒度がある程度あるもの)のことなんだから。 オブジェクト指向でのデザインパターンは関数型言語ではバッドノウハウになり得るというのは同意。
55 : >>52 バッドノウハウはアンチパターン
56 : F#>Java いずれこうなるから安心しろ。
57 : いずれw
58 : あらゆる意味でF#>>>>Javaだろ。Windows上では。 特に関数型言語が好きだからとかではなく。客観的事実。
59 : Javaはネイティブで動かないから。 スレッドで動いてるガベコレも時々挙動がおかしくなるから。
60 : 最終話「structをfunctorに」 すべてを終わらせる時…! C・Y・C第1巻は、発売未定です。夢野カケラ OCaml : チクショオオオオ!くらえC++!ガベージコレクション! C++ : さあ来いOCaml!実はオレは一回不正なメモリ操作しただけで死ぬぞオオ! (ガッ) C++ : グアアアア!こ、この地上でもっともバカな言語と呼ばれる四天王のC++が… こんな不純粋関数言語に…バ…バカなアアアアアア (ドドドドド) C++ : グアアアア Delphi : C++がやられたようだな… VB : フフフ…奴は四天王の中でも最弱… C# : MLごときに負けるとは手続き型言語の面汚しよ… OCaml : くらええええ! (ズサ) 3言語 : グアアアアアアア OCaml : やった…ついに四天王を倒したぞ…これでJavaのいるWindowsのWindowが開かれる!! Java : よく来たなObjective Caml…待っていたぞ… (ギイイイイイイ) OCaml : こ…ここがWindowsだったのか…!感じる…Javaの魔力を… Java : OCamlよ…戦う前に一つ言っておくことがある。お前は私を倒すのに 『オブジェクト指向』が必要だと思っているようだが…別になくても倒せる OCaml : な 何だって!? Java : そしてお前の入門書は増えてきたので最寄りの本屋へお取り寄せしておいた。 あとは私を倒すだけだなクックック… (ゴゴゴゴ) OCaml : フ…上等だ…オレも一つ言っておくことがある。このオレに生き別れたF#が いるような気がしていたが別にそんなことはなかったぜ! Java : そうか OCaml : ウオオオいくぞオオオ! Java : さあ来いOCaml! OCamlのnative codeが世界を救うと信じて…! ご愛読ありがとうございました!
61 : > OCaml : こ…ここがWindowsだったのか…!感じる…Javaの魔力を… ワロタ
62 : F#ってOCamlとどれほど違うの?
63 : >>62 F#スレにこんなのあったよ 553 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/01(月) 22:32:37 >>552 OCamlのみ 多相ヴァリアント、ファンクタ、注釈ありで型がつく箇所では省略しても必ず型推論できる性質 Camlp4/5、ビルド関係のツール(F#はしょぼい) オブジェクト指向部分は根本的に違う(nominal/structural)
64 : >>63 ありがとう。なんか半分以上わからないけど。わかった事にしとく。
65 : >>60 ワロタw WindowsのWindowにやられたww
66 : >>50 caml-list で Harrop が New HLVM examples! というサブジェクトで騒いでるから、それ見て、判断して。
67 : >>63 ここで聞くのもアレだけど 型推論が残念なことになったのは演算子のオーバーロードのせい?
68 : >Java : そうか そうかってwww どんだけスルー
69 : List.fold_left (fun (x,_) y -> x + y) 0 [(1,1)];; を通そうとしたところ This expression has type int but is here used with type int * 'a といわれてしまいます。うまい方法はないのでしょうか?
70 : >>69 高階関数の引数が順番逆なだけじゃね フォールドライトならそれでおkかも
71 : すいません スレよごしてしまって .... おっしゃる通りでした .... orz
72 : fold 辺りまで来たら、フィーリングでデバッグするんじゃなくて、 ちゃんと型を確認しだしたほうがいいね。
73 : http://itpro.nikkeibp.co.jp/article/COLUMN/20061212/256657/?ST=develop ↑ここを読んでいて、LablGLをインストールしようとして失敗しました。 どうしたらいいか教えてください。 OSはWindowsXPです。 ・lablgl-1.04-win32.zipをObjective Caml以下のディレクトリに直接展開しました。 ・Microsoft Visual C++ 2008 Redistributable Package (x86).をインストールしました。 ・glut-3.7.6-bin.zipをダウンロードし、glut32.dllをsystem32フォルダにコピーしました。 ・コマンドプロンプトを開き、 C:\Program Files\Objective Caml\lib\lablGLまで移動し、 ocaml build.mlをコマンドプロンプトから実行しました。 途中までは走っていたのですが、以下のようにエラーが出ました。 C:/Tcl/lib tk84.lib tcl84.lib gdi32.lib user32.lib " togl.cmo ocamlc.opt -w s -I +labltk -a -o lablglut.cma -cclib -llablglut -dllib -llablglu t -cclib "glut32.lib " glut.cmo ocamlopt.opt -w s -I +labltk -c raw.ml 'ml' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 File "raw.ml", line 1, characters 0-1: Error: Assembler error, input left in file C:\DOCUME~1\****<※ユーザ名>\LOCALS~1\Temp\camla smd25ac5.asm Native build failed: error 2 You can still use the bytecode version Now ready to use on an OCaml MSVC port ※ここまで またコマンドプロンプトから > lablglut を実行した際にもエラーが出ました。 Cannot load required shared library dlllablgl. Reason: C:\Program Files\Objective Caml\lib\stublibs\dlllablgl.dll: このアプリケ ーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケ ーションを再度インストールすることにより問題が解決する場合があります。 ※ここまで
74 : 原因はわからんが、参考までに labltkはインストールしてるか ocamlはネイティブコンパイラまでインストール済か Activetclはバージョン8.5系だと動かなかったので8.4を入れる build.mlを実行した際に cygwinのlink.exeが使われるとエラーになるので 環境変数からcygwinのパスをはずす glutはそれと同じバージョンで動いたよ
75 : >>74 レスありがとうございます。 ですがどうも上手く行かないので、悩んでいます。 どこかで薦められてOCamlは "Self installer (3.11.0) for the port based on the MinGW toolchain" が入ってますが、Cygwin入れてないんです。これが原因なのかなぁ。 Cygwin以前入れたのですが今は外してしまってます。 近いうちに再度Cygwinをインストールしてみることにします。 読み進めたいので、このまま>>73 の第五回は一応読むだけ読んで、 次に行きたいと思います。
76 : ocaml用のサウンドライブラリ(スピーカーから音を出したりマイクの音を拾ったり)で一番ポピュラーなのって何かな?
77 : >>76 OCamlSDL でサポートしてなかったら自作して公開よろ。
78 : >>77 だって、作るとしたらWin32APIとかOSSとかALSAとかいろいろサポートして、なおかつメンテもしないといけないんでしょう? 嫌ですよ。
79 : >>78 うわなんかヘタレられた。 自分のやりたいAPIのインターフェースだけ作りゃいいじゃん。 メンテもしたけりゃするだけでいいじゃん。 初期化とかは何かのライブラリ関数呼ぶだけだし。 やりたいことはほとんどデバイスから ノンブロッキングに読んだり書いたりするだけで大抵出来るっしょ。
80 : >>79 そんな俺しか使わないライブラリを公開するぐらいなら、公開せずに手元に持っておいて、作り溜めしときますよ。
81 : >>75 俺もなんかそうなる。 OCamlは3.10.2でLablGLは1.03にもどしたら上手くいった
82 : >>81 ありがとうございます。1.03にしたら "OCaml build.ml"は上手く行ったようです。 しかし 「ocamlrun.exe - コンポーネントが見つかりません ocamlrun.dll が見つからなかったため、このアプリケーションを開始できませんでした。」 となってしまいまたもや失敗。 >>73 のリンク先を見るとLablGLのインストールが失敗してるというのですが インストールしなおしても同じエラーメッセージが出ます。はてさて。 OCaml本体は"ocaml-3.11.0-win-msvc.exe"をインストールしなおしました。
83 : Windowsだとライブラリのビルドでつまづくことが多いよね。 OcamlSDL関連のビルドで上手くいなかくてビルドを諦めた。 OCaml自体はプログラミング入門者にも比較的優しいと 思うけど環境は若干敷居が高めだと思う。 んでWindows使うのが悪いとかいわれちゃうとしょんぼりする。 そもそもLinux系を使うこと自体、本職でない人にとっては 普通ではないわけで。
84 : あれぇ?書き込めた。どうせアク禁の巻き添えで書き込めないだろうと 勉強不足を棚に上げた愚痴>>83 を書いてみたら・・・。 ごめんなさい。反省しています。
85 : OCamlユーザは計算機科学の研究者が多いんだから、それは仕方ないだろ
86 : 教育用というか初心者向けのサイトですらUNIX前提の記述が多いように思えるけどな。
87 : UnixやLinuxがプログラミング教育に適しているからだろう。
88 : >>85 >>86 うん。わかってはいるんだ。あんな書き込みをしてしまってごめんとしかいいようがない。
89 : まあ、ドザーはおとなしくF#でも弄ってなさいって事だw
90 : >>82 (いまさらだが)OCamlのReadmeを見ると MinGWの場合は Do *not* install the Mingw/MSYS development tools from www.mingw.org: these are not compatible with this Caml port (@responsefile not recognized on the command line). って書いてあるからCygwinが必要なんだと思われる。 英語は雰囲気で読んでいるので間違っていたら誰かやさしく叱ってくれ。
91 : >>84 > あれぇ?書き込めた。どうせアク禁の巻き添えで書き込めないだろうと > 勉強不足を棚に上げた愚痴>>83 を書いてみたら・・・。 この精神でビルドがんばれ。 どうせビルドできないと思ってもできるかも。
92 : いやcygwin/mingw系はさっさとあきらめるのが吉だと思う
93 : >>89 そんなこと言ってるから関数型はいつまでたってもドマイナーなんだよ
94 : それって何か問題があるんだっけ?
95 : スレとは関係ないが、東北型言語を使用する俺は「だっけ?」が方言かどうかわからなくなるときがある。
96 : そうですけ?
97 : >>95 それは、ずいぶん、どい なか です ね
98 : 東北型言語と聞いたら、語尾に#を付けるんだと思った。
99 : そういうもんなんだとあきらめる事にしましたw 結局Cygwinなんか入れるよりもお勉強用のLinuxマシンを用意した方が早そうですね。 レス頂いてありがとうございます。
100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼 ▲
【マック】Macintoshプログラミング質問箱 (482)
Visual Studio 2008 Part 21 (574)
日本発、次世代言語: 織田信長 (528)
くだすれPython(超初心者用) その13 (590)
【糞.NET】裏切り者には死を【アンチゲイツ】 (327)
日本発、次世代言語: 織田信長 (528)
--log9.info------------------
鹿児島のDQNバーダーを語れ (124)
【エサの前で】ハシビロコウ その2【不動】 (641)
カモ好きの人 (802)
【ツル】 九州探鳥旅行 【どこに見に行く?】 (112)
カラスに持って行かれた物 (215)
2004年ウグイス初鳴、ツバメ初認情報 (136)
谷津干潟に行きませんか? (131)
野鳥観察とかネクラだよねキモーいw (332)
東京都のカワセミ目撃スレッド (373)
** -- ** お な が 好 き ** -- ** (524)
!!関東の野鳥スポット!! (515)
カラスの害について2 (980)
野鳥観察板 お勧め本ってなんかありますか? (266)
バードウォッO (143)
【文化放送】 朝の小鳥 【日曜朝5:15】 (500)
ペンギンを飼うことは可能か? (531)
--log55.com------------------
【S=F】菊池たけし総合 136【NW】
神我狩・セイクリッドドラグーン総合9リミット目
【完全】永い後日談のネクロニカ16日目【捕食】
【SRS】トワイライトガンスモーク その2
トーキョーN◎VA Act.132
【卓ゲ全般】困ったちゃんスレ338
良いサークル 悪いサークル(オンライン編)11サイト目
良いサークル/悪いサークル 九州編 第七版