【.NET】F#について語れ2【OCAML】

■ このスレッドは過去ログ倉庫に格納されています
2011/05/01(日) 02:46:49.52
MSResearchから出てきた.NETで使える関数型言語のひとつF#
OCAMLの流れを汲むこの言語、いろいろと面白そうなことができそう。
そろそろ日本語の情報が充実してきそうなこの言語について、幅広く語れ。

http://www.fsharp.net/

前スレ
【.NET】F#について語れ【OCAML】
http://hibari.2ch.net/test/read.cgi/tech/1186030985/

関連スレなどは >>2-
2016/03/01(火) 20:07:37.96ID:GW+Y//Y5
良いものが流行らず消えてく何てことは数限りなくあった
F# は今頑張らないと消えると思う
2016/03/31(木) 20:11:09.32ID:EaHe9wWS
F#はこれから頑張るとかいう時期は終わってるでしょ
今あるのは一通り評価得た結果あって
一部の人は気に入った、ということでいいと思う
普及するのまだまだこれからだ!
なんていう寝言はさすがにやめてほしいが
2016/04/02(土) 12:34:40.46ID:thGUj6UI
未来の言語(ω)
2016/04/02(土) 21:52:10.85ID:Ir4Fa+v1
世界で最も支払いの良い言語はF#
http://i.gzn.jp/img/2016/03/18/stack-overflow-developer-survey-results/snap5225.png
http://gigazine.net/news/20160318-stack-overflow-developer-survey-results/

ここだけ見ると勘違いしてしまいそうだ
2016/04/03(日) 13:58:40.61ID:SJ9U6W4k
求人してるのが海外の金融関連中心ってのもあるかもね。
暗黙的に統計か金融の知識が必要な気がする。
2016/04/06(水) 12:57:58.71ID:QwJxwviB
F#オンリーの案件はむしろ稀でしょ
F#がわかる=C#エキスパート+実務経験あり&並行化の知識あり
と遅延評価すると妥当になる
731デフォルトの名無しさん
垢版 |
2016/05/01(日) 16:56:51.63ID:tKi6j9CT
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています

言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?

Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al

ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw


The Covenant Project
概要

Covenantは、純粋P2Pのファイル共有ソフトです

目的

インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します

特徴

Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)

接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
1t
2016/06/11(土) 17:16:42.35ID:ZtEjhTwV
F#勉強しはじめたばっかりですが、どなたか教えてください

Visual Studio 2015でF#プロジェクト作ってみたんですが、
「新規フォルダーの作成」のメニューがどこにも見当たらない
JavaとかC#とかでは、パッケージやnamespaceの階層に合わせてソースフォルダ掘ったりしますが、
F#ではそういうの無くて、ソースファイルはフラットに置いておくものなんでしょうか?
733デフォルトの名無しさん
垢版 |
2016/06/11(土) 17:30:27.31ID:zSGsCTOB
>>732
extentionでF# Power Toolsというのを落とせばその機能が使える。
2016/06/11(土) 17:46:54.54ID:ZtEjhTwV
>>733
できました!
ありがとうございます
2016/06/23(木) 00:57:26.96ID:zQLdlEzo
>>733
*extension*
2016/08/22(月) 01:34:27.92ID:+JfquTF3
F#の未来はわからないがMLの流れは絶えることはない
2016/08/22(月) 01:38:01.40ID:+JfquTF3
MLが生んだletは立派に独り立ちを始めている
2016/08/23(火) 18:31:49.04ID:kLQdwxaf
コボラーに対抗してエムエラーと名乗ろう
2016/08/30(火) 06:15:16.07ID:Wv3ZANeS
OCamlも捨てがたい
http://qiita.com/HirofumiYashima/items/98d35b40dde12bbb5d6d
2016/08/30(火) 06:21:19.09ID:Wv3ZANeS
>>739
このサイトには誤訳があるので注意してね
741デフォルトの名無しさん
垢版 |
2016/08/30(火) 20:42:10.14ID:vrBeNxH6
間違いの無い記事は少ない
間違いを見つけ乍ら読むのがリテラシー
2016/09/02(金) 02:36:07.94ID:D4RF+Hn1
discriminated unionも次々に採用されてるな
やれやれ
743デフォルトの名無しさん
垢版 |
2016/09/02(金) 06:36:24.81ID:93bhRaHZ
どこに採用されてる?
2016/09/02(金) 07:20:36.66ID:D4RF+Hn1
typescript
2016/10/09(日) 13:09:22.51ID:7SKhoL6o
.netにバインドするライブラリってのは
たとえばデリゲートをどうすんのかとか
属性どうするのかとかですぐつまづいてしまう
JScript.NETやIronPythonがまさにそうだ
F#はそのへん良く頑張ってるな
2016/11/13(日) 17:24:09.92ID:4ToPYL6s
F#というより.netの使い方の勉強に時間取られてなんだかね
2016/11/15(火) 16:44:14.09ID:G5nfQU/Z
質問させてください
F#をC#と併せて勉強中です。C#の場合、高階関数に渡すラムダ式の中で
以下のように配列のインデックスを使えるのですが、F#だとどう書けばよいか分かりません
F#のラムダ式中で配列のインデックスを使う方法があればお教え願います

(C#)
var array1 = new[] { 12, 33, 46, 8, 23, 42, 41};
var array2 = array1.Where((x, index) => index % 2 == 0).ToArray(); // array1の偶数番目のみの配列を新たにつくる

(F#)
let array2 = Array.filter (fun x index -> index % 2 = 0) array1 // こうはできない
2016/11/15(火) 17:51:26.35ID:Z1GMtli2
ちょっと長ったらしくて、もっとスマートなやり方があるかもしれんが
とりあえずは、こうすればできる

Array.mapi (fun index x -> (index, x)) array1 |>
Array.filter (fun (index, x) -> index % 2 = 0) |>
Array.map (fun (index, x) -> x)
2016/11/15(火) 18:46:06.01ID:G5nfQU/Z
>>748
なるほど、mapiだとインデックスが使えるんですね
そこで一旦indexを要素にもったタプルの配列をつくると
勉強になりました
750デフォルトの名無しさん
垢版 |
2016/11/15(火) 20:50:47.44ID:OT10uw27
filterとmap重ねるならchoose使え
2016/11/15(火) 23:40:23.50ID:s5pds+TJ
indexed ( ボソッ
2016/11/16(水) 18:51:58.42ID:URMKBQmU
>>750-751
ありがとうございます
スマートに書けるようになりました

Array.indexed array1 |> Array.choose (fun (index, x) -> if index % 2 = 0 then Some x else None)
2016/11/16(水) 19:16:01.41ID:5e/LkvO+
>>747
普通にこれでいいよLinq要らない
http://ideone.com/rfIh9S
2016/11/16(水) 19:33:48.20ID:URMKBQmU
>>753
わざわざありがとうございます
こういうyieldを使った書き方はまだ詳しく勉強してないんですが、
こっちだと中間のデータをつくらないんでパフォーマンスがよさそうですね
勉強して試してみます
2016/12/13(火) 03:00:30.70ID:1DM7j7BI
F#って普通に個人で趣味アプリ作ったりする場合でもC#と比べて恩恵感じられる?
関数型って算術演算や金融関係で威力を発揮するけどそれ以外だと却って手間が増えるだけみたいなイメージある
2016/12/13(火) 03:18:24.44ID:neuXXcOh
出力が手間ってだけじゃね
2016/12/13(火) 09:05:12.17ID:/Iv3sNJB
>>755
C#に比べてVSのサポートがイマイチって所が多々あるけれど、それを補ってかつはるかに上回るメリット得られるお。
正直C#でなんかサポートが足りない所、たとえばUI周りとか以外で使いたくないしF#使える所は全部F#で書いてる。
2016/12/13(火) 09:06:19.31ID:/Iv3sNJB
F#はバージョンが5つぐらい進んだC#と捉えるのが正しいと思う
2016/12/13(火) 12:12:52.87ID:hu4l98Ut
うむ
2016/12/13(火) 15:31:59.53ID:c8n9s3lN
>>757
そんなにすごいのか
興味あったし頑張って勉強してみるよ
2016/12/13(火) 19:01:53.31ID:QZ8rc8DA
>>760
やってみて損はないと思いますー
実案件で使えなくても考え方学ぶことでC#での書き方も良くなると思うし、実案件でも人の問題とかなければ使える場面は多々あると思う。
2016/12/13(火) 20:54:07.46ID:MsMt5e8s
みんな、競プロでもっとF#とOCamlを使おうぜ
2016/12/27(火) 16:04:36.71ID:r8OAYz75
勉強し始めたけど、いつなくなるのか心配
MSって、切るときはバッサリ行くよな
764デフォルトの名無しさん
垢版 |
2016/12/27(火) 16:22:15.15ID:ov9/Tp6R
もうとっくにイってます
2017/01/16(月) 12:32:54.03ID:w3fpx7c2
F#デビューしようと思って本探してるんだがC#er向けの本ってないのな
ググるとサイトはいっぱい出てくるけど
こういう場合は関数型言語について書かれた本をとりあえず買っとけばいいのかな
2017/01/16(月) 13:40:50.81ID:of8fDlu0
Real World Functional Programming: With Examples in F# and C#
かな。たしか英語の原書しかないけど
でもまずプログラミングF#読んだ方がいいと思う
2017/01/16(月) 14:05:39.31ID:cZ5PGvSb
俺は実践F#関数型プログラミング入門って本で勉強したけど、なかなか良い本だったよ
書き方が平易な感じでサクサク進められて、基礎的な部分は一通りキッチリ習得できたと思う
2017/01/16(月) 16:56:59.00ID:rgwnOlnx
勉強中で悪いんだけど

実践F#関数型プログラミング入門は確かにとっつきやすいんだけど
説明不足と思われるところが散見されるように思う
かといってプログラミングF#で十分ってわけではないんだけど

例えば、今アクティブパターン見てるんだけど、いまいち動作がわかんねー
分類としての役割と、型変換の役割があるみたいだけど、
その内部動作っというか、統一的にどのように動作してるのかがわからん
2017/01/16(月) 21:42:59.51ID:meiXzXMj
実装は関数呼び出しの条件一致だろうけど、使うぶんにはそのパターンになるかどうかって感じでよくないか?
パラメータわたしのやつは順序がおかしくて分かりづらいと思うが
2017/01/16(月) 21:44:10.62ID:meiXzXMj
>>766
俺もその本で関数型学んだ
モッナードとかは無いけどオブジェ脳の人が感触をつかむのには良いよね
2017/01/17(火) 12:28:38.43ID:8zwXc9tZ
>>769
以下の=ソース=において、 | FIleExtension ".jpg"はどう動作すると考える?
プログラミングF#には記述があるからわかるけど
普通に ".jpg"はFIleExtensionの引数にしか見えない

疑問点1 match式の|の後はパターンの記述だけど、関数呼び出しの場合の約束事が不明
疑問点2  | FIleExtension ext は.jpgの方とほぼ同じ記述だけど、こちらは代入
       さしあたって、切り分けできるのかな? 出来たとしても、わかりずらいし。

=========== ソース ============

let (|FIleExtension|) filepath=Path.GetExtension(filePath)

let determinFIleType(filepath :string)
match filepath with
| FIleExtension ".jpg"->printfn "画像"
| FIleExtension ext->printfn "未知 [%s]" ext
772711
垢版 |
2017/01/17(火) 12:30:49.29ID:8zwXc9tZ
あれ?空白が無視されてるな

match式以降はブロック別で、ずれてますので、
まぁわかりますよね
2017/01/17(火) 15:40:46.37ID:AtzKNi4C
|の後は元の値がこのパターンに合うか?って感じの比較対象が来るのでFileExtension ".jpg"と言う値って感じに掴んでる。
正規表現の奴はそのregexを元にほにゃららを返す値って感じ。
けどほんとはパターンを区別するって言うセレクターとした方がいいのかな?
2017/01/17(火) 16:21:52.44ID:8zwXc9tZ
たぶん違う

| FIleExtension ".jpg"->printfn "画像"の方は、
FIleExtensionの引数がfilepathで、その結果が".jpg"とマッチするかどうか

| FIleExtension ext->printfn "未知 [%s]" extの方は
FIleExtensionの引数がfilepathで、その結果をextに代入(let束縛?)

って、ことみたい(プログラミングF#に記述の例で上のように解釈するような説明あり)
実践F#にも同様な例(P295)はあるけど、こちらは、説明なし
2017/01/17(火) 16:57:47.21ID:AtzKNi4C
いや俺はそう言う風な理解をしてるって話なんだが。
実体は上から順番に関数呼び出しの条件マッチだと思うが動作の仕組みを知りたいんだったらILを見れば。
2017/01/17(火) 17:34:24.12ID:8zwXc9tZ
>ILを見れば。
たしかにね。いままで避けてきたから、考え付かなかった。

ただ、実践F#の方はなんの説明もないんだよ
それで理解できるわけないってーの
(| FIleExtension ".jpg" なら、FileExtensionの引数は”.jpg”でその結果が、filepathとマッチが
普通の理解だと思う)

多分、F#の文法理解のキモは、実践F#のどっかに書かれてた、
”let束縛や関数束縛にはパターンマッチが宿る”ってのがあって

それは何ぞやってことかなとも思うんだけど 
2017/01/27(金) 13:06:20.11ID:r/dqFSyQ
UnityをF#でやるってどうおもう?
2017/01/27(金) 16:23:08.47ID:11vmh7q9
やってる人いるっぽいけど、興味あるので是非人柱って欲しい
2017/01/29(日) 11:32:18.42ID:85P/1kIo
Xamarinでも使えると聞きたけど、実際に実用に耐えるレベルで使える感じ?
それともまだちょいきびしい?
2017/01/29(日) 16:34:59.12ID:SZxfjGEN
>>763
バージョンが5つぐらい進んだC#
くらい凄いのがなくなるわけ無いじゃん
781デフォルトの名無しさん
垢版 |
2017/01/29(日) 16:36:43.65ID:SZxfjGEN
>>777>>779
勘違いしちゃいけないのは
成長中とかじゃなくてとっくに成熟してる分野だからな
一部の人が持ち上げてるだけで一般的にはそうでもないだけ
2017/01/29(日) 16:38:12.30ID:SZxfjGEN
>>755
関数型って算術演算や金融関係で威力を発揮する
という理屈を解説してくれ
2017/01/29(日) 17:58:10.02ID:OOBDM7kI
怒濤の3連投
2017/01/29(日) 22:48:48.26ID:fQuWVzYo
>>779
使えるし実案件で使ってる。
全部F#とかはやりにくいところもあると思うけど可能。
ロジックをF#でとかは普通に可能。
ただしDLLの参照はプロジェクトファイル直で編集しないとダメかも
2017/01/30(月) 04:57:10.64ID:W8ulMPLc
連投ニキ結局何が言いたいのか分からなくて草
2017/01/30(月) 08:55:41.75ID:HBz5xnGW
f#はmonoで動くように作ってるので問題無いが、
あとはC#と同じくiosの制限に引っかからないかぐらいかな。
動的コード減らすように、ios向けにコンパイラ改良してるみたいではあるが。
2017/01/30(月) 09:52:08.15ID:jGIG+dJc
sprintfの引数5個以上にすると実機ですっ飛ぶけど後は何も問題になってない
2017/02/24(金) 21:55:29.29ID:VHgIchSB
軽量構文では前方参照できてもよくない?
というか前方参照できないのがVSに統合してるのに広がらない大きな理由のような
2017/02/24(金) 22:38:24.91ID:U+jKQ1wi
F# 4.1 から namespace rec ... で前方参照できるようになるらしい
https://github.com/fsharp/fslang-design/blob/master/FSharp-4.1/FS-1009-mutually-referential-types-and-modules-single-scope.md
2017/02/25(土) 00:05:57.36ID:CJKdrsAk
>>788
そんな理由でF#使うのやめるような奴いねーよ
2017/02/27(月) 22:45:13.58ID:C8vMoSWL
immutableでもちゃんと書けるんだすごーい→しばらくして
現実に引き戻されちゃうold Cですら前方宣言あったよね?と
2017/02/27(月) 22:52:50.08ID:x8Zfjmi0
むしろ適度に参照制限されてた方がいい。ミュータブルよりイミュータブルが利点を持つのと一緒
2017/03/01(水) 22:42:04.78ID:G3+Z4HPe
(O抜きの)CAML当時のPCでは関数型言語のコンパイラで前方参照なんてやってたら
まるで使い物にならなかっただけの流れだとなんとなく思う
2017/03/02(木) 17:03:36.98ID:7GIcFobN
前方参照やりだすと型推論が面倒くさいことになりそうな気がする
トップレベルの定義は型注釈必須になっちゃったりするんじゃね
2017/03/03(金) 00:27:09.47ID:0HpXceRa
F# 4.1 未満でも↓のように関数の前方参照ができるし、前方参照に比べて余分な型注釈が必要になることもない
 let rec f1 () = f2 "" + f3 1
 and f2 s = s.Length
 and f3 x = x
むしろ f2 のように型推論が強化される場合もある
2017/03/03(金) 01:21:41.94ID:EBp4jZQp
多分、今話題に上がってる前方参照って、同一のlet式内って狭い範囲の話じゃないと思うよ・・・
2017/03/03(金) 02:47:10.16ID:GTe30Tvn
前方参照できないとトップダウンでは書けないよね
上から下にいくにつれて詳細化するほうが読みやすい
2017/03/03(金) 07:08:48.90ID:xbhGesOG
>>797
何言ってるのかよく分からん
799デフォルトの名無しさん
垢版 |
2017/03/03(金) 20:42:40.44ID:BaUfKJHp
>>798
わかるよ!
800デフォルトの名無しさん
垢版 |
2017/03/03(金) 22:41:27.26ID:Q3zcIHzi
おれもわからん
2017/03/03(金) 23:04:52.74ID:xbhGesOG
上から下にかけて詳細化って何。
インターフェース定義とその具体的実装的なことでも言ってんの?
802デフォルトの名無しさん
垢版 |
2017/03/03(金) 23:27:50.49ID:BaUfKJHp
>>800
わかるよ!
803デフォルトの名無しさん
垢版 |
2017/03/04(土) 00:32:28.38ID:/imazuHh
>>802
わからんいうてる奴に「わかるよ!」ってなんやねん
ガイジか死ね氏ねウンコアヘアヘ仮面
804デフォルトの名無しさん
垢版 |
2017/03/04(土) 12:38:53.96ID:GRvQ2lmz
急に延びてると思ったら
またいつものあれか
805デフォルトの名無しさん
垢版 |
2017/03/06(月) 23:36:11.45ID:f18Wvt72
https://ja.osdn.net/pastebin/4865

↑これっぽいことをF#でやりたいんだけど↓うまくいかない、よいアイデアありませんか?

https://ja.osdn.net/pastebin/4866
806805
垢版 |
2017/03/06(月) 23:37:58.97ID:f18Wvt72
guard的なものを作りたい
2017/03/08(水) 16:37:28.78ID:JcxcGB31
Microsoft、「F# 4.1」と「Visual F# Tools for Visual Studio 2017」を発表
http://forest.watch.impress.co.jp/docs/news/1048457.html
808デフォルトの名無しさん
垢版 |
2017/03/08(水) 16:50:08.16ID:jMX+hATM
まだ保守されてたんだな
2017/03/12(日) 14:15:47.40ID:n/E4ZIwb
研究所に担当者が興味持っている間は続くんじゃないかな。

Open EditionのREADMEには、F# Core Engineering Groupって書いてあったけど、どこの組織かはよく分からない。
https://github.com/fsharp/fsharp/blob/master/README.md#maintainers
810デフォルトの名無しさん
垢版 |
2017/03/19(日) 13:32:32.34ID:UkA4tC4+
>>804
数ヶ月書き込みがない過疎スレで「いつものあれ」とか無理あるだろ
あらクソスレにずっといついてるいつものあれでしたか
2017/04/15(土) 20:49:04.54ID:TK0/vAtg
質問です

let add x y = x+y

を用いた関数合成した場合

■関数定義成功
1.let ft = add 10>> add

■関数定義失敗
2.let ft = add >> add
3.let ft = add >> add 10

2.、3.が失敗する理由は何でしょうか?
812デフォルトの名無しさん
垢版 |
2017/04/15(土) 21:07:11.49ID:PugiXhCo
FSharpFuncが+演算子のオーバーロードを持ってないからだろ
2017/04/15(土) 22:13:15.85ID:TK0/vAtg
>>812
let add x y = x+y を let add x y = 0
にしてみたんだけど、やっぱだめでした。

エラーは以下。
エラーの見方がよくわかんないんですけど、
これ見ると、>>の左側のaddは一引数を求めると考えていいんですよね?

> let test = add>>add;;
let test = add>>add;;
----------------^^^

stdin(13,17): error FS0001: 型が一致しません。
'(int -> int) -> 'a'
という指定が必要ですが、
'int -> int -> int'
が指定されました。型 'int -> int' は型 'int' と一致しません
2017/04/15(土) 23:41:37.70ID:PugiXhCo
>> オペレータのシグネチャ見てみ。
>>は('a->'b)->('b->'c)->('a->'c)となってる。つまり('a->'b)の関数と('b->'c)の関数を受け取って('a->'c)を返す。
ここでaddを見るとint->int->intなのでこれはまたint->(int->int)でもある。
つまりintを受け取ってint->intを返す。
ここで'a->'bに当てはめると'aがint、'bがint->intとなる。
そうすると>>の右の値は(int->int)->'cでなければならない。
けれどaddを渡していてそれはint->int->intであって(int->int)->intではない。
2017/04/16(日) 00:13:53.65ID:NYnhF7Pd
>>814
Thx 大枠理解しました。

>ここでaddを見るとint->int->intなのでこれはまたint->(int->int)でもある。
特にこの見方は非常に参考になります。

多分今回の件きちんと理解すると、
自分の中でごっちゃになってる部分が結構すっきりすると思います
ここから先は、調べてみます
ありがとうございました
2017/05/06(土) 19:25:54.59ID:2H+eGUwc
X Y Z Nとスペースで区切られた文字列が標準入力から入力された時、
Console.ReadLine().Split [|' '|]を、一つのletでint X Y Z Nそれぞれに入れるのには
どうしたらいいでしょうか?
2017/05/06(土) 22:00:28.94ID:ME74CfU1
>>816
日本語でOK
2017/05/06(土) 22:02:02.03ID:h+8d1h53
英語でもOK
819デフォルトの名無しさん
垢版 |
2017/05/06(土) 22:30:58.28ID:IkyXTWA8
>>816
let [|X;Y;Z;N|]=...
2017/05/07(日) 01:04:25.17ID:2BTsLj3O
>>819
ありがとうございます。

それ前に一回試してみてて、「試してみたけどマッチ不完全って出てムリでしたよ」書こうとして、
もう一回試してみたら、ちゃんとコンパイルできました。

何を言っているかわからないと思いますが、エラーは他の所だったんだなぁと。
821デフォルトの名無しさん
垢版 |
2017/05/07(日) 04:37:20.17ID:Q0T7PduY
競プロでもやってんのか
822デフォルトの名無しさん
垢版 |
2017/05/07(日) 07:56:21.67ID:nWdzBJ3w
>>820
ワーニングは出るけどコンパイルは出来るはず。
それもエラーになるような設定ってできるのかな。
けどおかしな文字列与えたら実行時にすっ飛ぶから、ほんとはlet じゃなくmatch使うべき。
2017/05/07(日) 14:03:57.99ID:2BTsLj3O
>>822
match憶えました。

>>821
PAIZAのPOH7でF#が使えるのでやってみました。F#歴3日くらいです。
とりあえず全部解けたけど、ちゃんとした本を読んだ方がいいんだろうなぁ……
824デフォルトの名無しさん
垢版 |
2017/05/08(月) 23:05:02.96ID:9wTmIyqX
こないだの炎上()の件で知名度あがったのかパイザ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況