Goについて扱うスレッドです。
GoはGoogleによって開発された言語です。
公式ドキュメント
http://golang.org/doc/
日本語訳
http://golang.jp
※前スレ
Go language part 2
https://mevius.5ch.net/test/read.cgi/tech/1510395926/
探検
Go language part 3
■ このスレッドは過去ログ倉庫に格納されています
2019/10/17(木) 21:38:04.78ID:wMsZ+t6y
502デフォルトの名無しさん
2020/05/16(土) 13:02:51.76ID:e+rgeli+ エラーが起こる第一原因判明
ヘッダにContent-Typeが無いリクエストでParseMultipartFormすると、パースを打ち切るのではなくてエラーを返す
ショボい作りだ
ヘッダにContent-Typeが無いリクエストでParseMultipartFormすると、パースを打ち切るのではなくてエラーを返す
ショボい作りだ
503デフォルトの名無しさん
2020/05/16(土) 13:05:20.47ID:e+rgeli+ request.go の中身を初めて見たけど、エラー処理は雑だし残念すぎるなコレ
504デフォルトの名無しさん
2020/05/16(土) 13:11:02.15ID:bJ5k+aLx request.MultipartReader() の方を使ってみたら
505デフォルトの名無しさん
2020/05/16(土) 13:14:14.23ID:e+rgeli+506デフォルトの名無しさん
2020/05/16(土) 14:52:00.85ID:9I4cSVvN マルチパートって、要は多段formだっけ
507デフォルトの名無しさん
2020/05/16(土) 14:59:51.10ID:e+rgeli+ なのかな?よく知らない
でも、WebAPIでFormとしてデータを受けるときはParseFormの使用が罠なのは確実
それともbodyを自分で解析するのが定石だったりする?
でも、WebAPIでFormとしてデータを受けるときはParseFormの使用が罠なのは確実
それともbodyを自分で解析するのが定石だったりする?
508デフォルトの名無しさん
2020/05/16(土) 15:12:59.98ID:F08ATzLT >>502
>ヘッダにContent-Typeが無いリクエストでParseMultipartFormすると、パースを打ち切るのではなくてエラーを返す
これは正常な処理だよ
Context-Typeが"multipart/form-data" の場合
Context-Type のmultipart/form-dataの後に続くboundaryをキーにしてmultipartをパースするんだから
ParseMultipartFormがContext-Typeからパースに必要なboundaryを取得できなくてエラーになるのはいたって正常なことだよ
>ヘッダにContent-Typeが無いリクエストでParseMultipartFormすると、パースを打ち切るのではなくてエラーを返す
これは正常な処理だよ
Context-Typeが"multipart/form-data" の場合
Context-Type のmultipart/form-dataの後に続くboundaryをキーにしてmultipartをパースするんだから
ParseMultipartFormがContext-Typeからパースに必要なboundaryを取得できなくてエラーになるのはいたって正常なことだよ
509デフォルトの名無しさん
2020/05/16(土) 15:26:41.59ID:F08ATzLT >>508の補足
Content-Typeが無かったらboundaryが取得できないのにParseMultipartFormでパースしようとするからエラーを返す
Content-Typeが無かったらboundaryが取得できないのにParseMultipartFormでパースしようとするからエラーを返す
510デフォルトの名無しさん
2020/05/16(土) 15:30:06.54ID:9I4cSVvN 「この中にformがいっぱい入ってますよ」っていうformなんだよね
511デフォルトの名無しさん
2020/05/16(土) 15:43:30.65ID:F08ATzLT ヘッダーのContext-Typeで分岐して適切なParseなにがしを呼べってことです。
512デフォルトの名無しさん
2020/05/16(土) 16:52:50.26ID:e+rgeli+ >>511
何のメリットがあって呼ぶ方が判定しなければならないのか、教えてください
何のメリットがあって呼ぶ方が判定しなければならないのか、教えてください
513デフォルトの名無しさん
2020/05/16(土) 17:00:10.79ID:9I4cSVvN 駄々こねてるようにしか見えんぞ
514デフォルトの名無しさん
2020/05/16(土) 17:24:44.07ID:bJ5k+aLx う〜ん、Context-Type が指定されていないのに multipart を自動判別して
くれるライブラリとかフレームワークって他所の言語にあったりするのかな…?
くれるライブラリとかフレームワークって他所の言語にあったりするのかな…?
515デフォルトの名無しさん
2020/05/16(土) 17:34:03.50ID:e+rgeli+ 自動的に判定して分岐できるんだったら、それをライブラリがしないというのは手抜きだろ、と言っている
しかし、例えば文字コードの自動判定ではSJISとUTF-8のどちらでも有効であるマルチバイト文字が存在する
例)"【D"と"縲識"はどちらも E3 80 90 44
このようなケースがある課題では自動処理できないので、ライブラリの外側で何かしらの対応をしてやる必要がある
マルチパートFormという課題でも同じように呼ぶ方が対処してやらなければならない問題があるのだろうと思った
だから、その問題について教えてくださいと書いたんだ
駄々ではないと思うんだが間違っているか?
しかし、例えば文字コードの自動判定ではSJISとUTF-8のどちらでも有効であるマルチバイト文字が存在する
例)"【D"と"縲識"はどちらも E3 80 90 44
このようなケースがある課題では自動処理できないので、ライブラリの外側で何かしらの対応をしてやる必要がある
マルチパートFormという課題でも同じように呼ぶ方が対処してやらなければならない問題があるのだろうと思った
だから、その問題について教えてくださいと書いたんだ
駄々ではないと思うんだが間違っているか?
516デフォルトの名無しさん
2020/05/16(土) 17:40:18.88ID:e+rgeli+ 505で書いたように、一見問題がないような対処はできるけど(自分でも手抜きとはわかってる)、問題点の実体が見えてないと対処に漏れが無いという確証が持てないから
517デフォルトの名無しさん
2020/05/16(土) 17:40:39.14ID:is04b0b3 MIME Type
MIME Encoding
MIME Encoding
518デフォルトの名無しさん
2020/05/16(土) 17:45:07.11ID:GaPEU8I0 それはバウンダリの中身に、
Content-disposition: attachment; filename="xxxxx"
Content-Type: text/plain
なんかが書いてあるからできる動作であって、実はバウンダリの中身はかなり自由。
マルチパートの中にさらにマルチパートを入れるマトリョーシカのようなことをしてもかまわん。仕様上は。
これをきれいに自動でデシリアライズするのは結構難しいと思うけど。
そういう意味では、呼ぶ側が解釈を与えないといかんって割り切りは間違っちゃないんじゃないか?
他のコンパイル言語でどう対応してるのか気になるな。
Content-disposition: attachment; filename="xxxxx"
Content-Type: text/plain
なんかが書いてあるからできる動作であって、実はバウンダリの中身はかなり自由。
マルチパートの中にさらにマルチパートを入れるマトリョーシカのようなことをしてもかまわん。仕様上は。
これをきれいに自動でデシリアライズするのは結構難しいと思うけど。
そういう意味では、呼ぶ側が解釈を与えないといかんって割り切りは間違っちゃないんじゃないか?
他のコンパイル言語でどう対応してるのか気になるな。
519デフォルトの名無しさん
2020/05/16(土) 17:51:34.17ID:9I4cSVvN 仕事でAWSのAPI Gatewayって機能使った時に
マルチパートフォームデータだけは解釈してくれなかった
クラウドサービスの都合上外部のライブラリ入れるにはソースに同梱するしか無く、
それは嫌だったからバックエンドのLambda(goに対応しているけど仕事で使ったのは非go)で
自前でバウンダリのfrom-toを切り取った上でガン無視してリクエストbodyを拾うだけの処理を書いた記憶があるw
完全にスレチだけど
マルチパートフォームデータだけは解釈してくれなかった
クラウドサービスの都合上外部のライブラリ入れるにはソースに同梱するしか無く、
それは嫌だったからバックエンドのLambda(goに対応しているけど仕事で使ったのは非go)で
自前でバウンダリのfrom-toを切り取った上でガン無視してリクエストbodyを拾うだけの処理を書いた記憶があるw
完全にスレチだけど
520デフォルトの名無しさん
2020/05/16(土) 17:54:45.69ID:4LNE0T1O >>515
だってContent-Typeに現れるのはその2種類だけとは限らないから全部ライブラリ任せにはできんだろ。
だってContent-Typeに現れるのはその2種類だけとは限らないから全部ライブラリ任せにはできんだろ。
521デフォルトの名無しさん
2020/05/16(土) 17:55:54.20ID:e+rgeli+ ParseMultipartFormの説明で、必要に応じてParseFormを呼び出しますと書いてるのに、
ヘッダにContent-Typeが無ければエラーとするというParseFormにはない条件を入れてしまっているのがおかしいポイントだと思うんだけど
maxMemory引数はデフォルト値を中に持って、オプションとして変更できるようにするのが、こういったライブラリの定石だから(ソケットのタイムアウト時間設定とか)、これは問題点じゃない
いや引数の設計上の問題点だけど
ヘッダにContent-Typeが無ければエラーとするというParseFormにはない条件を入れてしまっているのがおかしいポイントだと思うんだけど
maxMemory引数はデフォルト値を中に持って、オプションとして変更できるようにするのが、こういったライブラリの定石だから(ソケットのタイムアウト時間設定とか)、これは問題点じゃない
いや引数の設計上の問題点だけど
522デフォルトの名無しさん
2020/05/16(土) 18:06:23.99ID:e+rgeli+ >>520
それが、parsePostForm関数ではその二種類しかハンドリングしてないんだよなぁ
ブラウザ側でとんでもない(サーバで汎用的な方法で解析できない)フォームデータを送るならブラウザの問題だろう
FormDataオブジェクトを使うと発生するContent-Typeくらい自動で処理しないライブラリってどうなの?
それが、parsePostForm関数ではその二種類しかハンドリングしてないんだよなぁ
ブラウザ側でとんでもない(サーバで汎用的な方法で解析できない)フォームデータを送るならブラウザの問題だろう
FormDataオブジェクトを使うと発生するContent-Typeくらい自動で処理しないライブラリってどうなの?
523デフォルトの名無しさん
2020/05/16(土) 18:13:07.38ID:bJ5k+aLx request.parsePostForm() は Content-Type が無ければ application/octet-stream と見なす様だ
func parsePostForm(r *Request) (vs url.Values, err error) {
:
ct := r.Header.Get("Content-Type")
// RFC 7231, section 3.1.1.5 - empty type
// MAY be treated as application/octet-stream
if ct == "" {
ct = "application/octet-stream"
}
ct, _, err = mime.ParseMediaType(ct)
:
func parsePostForm(r *Request) (vs url.Values, err error) {
:
ct := r.Header.Get("Content-Type")
// RFC 7231, section 3.1.1.5 - empty type
// MAY be treated as application/octet-stream
if ct == "" {
ct = "application/octet-stream"
}
ct, _, err = mime.ParseMediaType(ct)
:
524デフォルトの名無しさん
2020/05/16(土) 18:26:33.81ID:bJ5k+aLx RFC 7231 HTTP/1.1: Semantics and Content(日本語訳)
https://triple-underscore.github.io/RFC7231-ja.html#section-3.1.1.5
> 実施においては、リソースの所有者は、[生成元サーバが[所与の表現用
> に正しい Content-Type を供する]ように、常に適正に環境設定されてい
> る]とは限らないため、クライアントには、[ペイロードの内容を精査し
> て、指定された型を上書きする]ものもある【例:MIME sniffing】。その
> ようにするクライアントは、不正な結論を導くリスクを負い、追加のセ
> キュリティリスクを公開し得る(例:"特権拡大")。更には、送信者の意図
> をデータ形式を精査して決定するのは、不可能である: 多くのデータ形
> 式は、処理の意味論においてのみ相違するような、複数の MIME 型に合
> 致する。実装者には、そのような "内容 sniff 法" を利用するときは、
> それを不能化する手段を供することが奨励される。
https://triple-underscore.github.io/RFC7231-ja.html#section-3.1.1.5
> 実施においては、リソースの所有者は、[生成元サーバが[所与の表現用
> に正しい Content-Type を供する]ように、常に適正に環境設定されてい
> る]とは限らないため、クライアントには、[ペイロードの内容を精査し
> て、指定された型を上書きする]ものもある【例:MIME sniffing】。その
> ようにするクライアントは、不正な結論を導くリスクを負い、追加のセ
> キュリティリスクを公開し得る(例:"特権拡大")。更には、送信者の意図
> をデータ形式を精査して決定するのは、不可能である: 多くのデータ形
> 式は、処理の意味論においてのみ相違するような、複数の MIME 型に合
> 致する。実装者には、そのような "内容 sniff 法" を利用するときは、
> それを不能化する手段を供することが奨励される。
525デフォルトの名無しさん
2020/05/16(土) 18:28:03.02ID:e+rgeli+526デフォルトの名無しさん
2020/05/16(土) 18:35:18.02ID:bJ5k+aLx >>525
GitHub リポジトリの develop branch から引っ張ってビルドしたもの
$ go version
go version devel +810c27e9be Wed May 13 11:59:26 2020 +0000
GitHub リポジトリの develop branch から引っ張ってビルドしたもの
$ go version
go version devel +810c27e9be Wed May 13 11:59:26 2020 +0000
527デフォルトの名無しさん
2020/05/16(土) 18:49:32.90ID:e+rgeli+ あ、それ違う
それはParseForm(1180行あたり)から呼ばれる奴だ
つまりマルチパート非対応
ParseMultipartForm(1294行あたり)から呼ばれるmultipartReader(480行あたり)ではContent-Typeが無いと、やっぱりエラーを叩き返してる
それはParseForm(1180行あたり)から呼ばれる奴だ
つまりマルチパート非対応
ParseMultipartForm(1294行あたり)から呼ばれるmultipartReader(480行あたり)ではContent-Typeが無いと、やっぱりエラーを叩き返してる
528デフォルトの名無しさん
2020/05/16(土) 18:53:01.16ID:e+rgeli+ つまり現状でも
マルチパート非対応のParseFormでは、ctが無くてもOK
マルチパート対応のParseMultipartFormでは、ctが無ければエラー
という差異が存在している
マルチパート非対応のParseFormでは、ctが無くてもOK
マルチパート対応のParseMultipartFormでは、ctが無ければエラー
という差異が存在している
529デフォルトの名無しさん
2020/05/16(土) 18:57:51.02ID:e+rgeli+ ParseFormだとURLにフォームくっ付けてContent-Typeがないリクエストを想定してるけど
ParseMultipartFormだと、そういう形式のリクエストは認めていないという違いになって現れる
ParseMultipartFormだと、そういう形式のリクエストは認めていないという違いになって現れる
530デフォルトの名無しさん
2020/05/16(土) 19:07:51.23ID:e+rgeli+ 意図的にContent-Typeのないような感じのフォームデータは許さないサーバを書いてるから、エラーチェックしないという対応だけでも問題なさそう
531デフォルトの名無しさん
2020/05/16(土) 19:47:58.26ID:F08ATzLT >>530
content-typeがない場合
Request.Bodyの内容からapplication/x-www-form-urlencodedやmultipart/form-dataなどのデータ形式(content-type相当)を判断する必要がる。
multipart/form-dataに限ってはboundaryをRequest.Body内容から見つけ出す必要がある。
(keyValueを取得するにもboundaryが必要。)
で、ここで問題なのがRequest.BodyはSTDINからの入力でseekが出来ないのでデータ形式判定後に再度Request.Bodyを読み込むために何らかの方法でRequest.Bodyをキャッシュする必要が出てくる。
(multipart/form-dataはファイルもアップロード出来るのでメモリ上でのキャッシュには向かない)
それとhttp.Serverは常駐プロセスになるので、無駄なリソースを使って自動判別して自動でパースするよりcontent-typeで分岐してパースする方が合理的。
content-typeがない場合
Request.Bodyの内容からapplication/x-www-form-urlencodedやmultipart/form-dataなどのデータ形式(content-type相当)を判断する必要がる。
multipart/form-dataに限ってはboundaryをRequest.Body内容から見つけ出す必要がある。
(keyValueを取得するにもboundaryが必要。)
で、ここで問題なのがRequest.BodyはSTDINからの入力でseekが出来ないのでデータ形式判定後に再度Request.Bodyを読み込むために何らかの方法でRequest.Bodyをキャッシュする必要が出てくる。
(multipart/form-dataはファイルもアップロード出来るのでメモリ上でのキャッシュには向かない)
それとhttp.Serverは常駐プロセスになるので、無駄なリソースを使って自動判別して自動でパースするよりcontent-typeで分岐してパースする方が合理的。
532デフォルトの名無しさん
2020/05/16(土) 21:02:30.65ID:e+rgeli+533デフォルトの名無しさん
2020/05/16(土) 21:30:32.48ID:e+rgeli+ 最終的に
func (i *rInst) ParseForm() error {
v := i.request.Header.Get("Content-Type")
if v == "" {
return i.request.ParseForm()
} else {
return i.request.ParseMultipartForm(100 * 1024)
}
}
とすることにした
func (i *rInst) ParseForm() error {
v := i.request.Header.Get("Content-Type")
if v == "" {
return i.request.ParseForm()
} else {
return i.request.ParseMultipartForm(100 * 1024)
}
}
とすることにした
534デフォルトの名無しさん
2020/05/17(日) 07:48:09.08ID:8deP89zB >>532
> としても、ParseForm内で分岐させない理由にはなってないと思っちゃうんだけど、それについては?
そもそもParseFormがリクエストのパース処理を包括したラッパー関数だと何処で勘違いしたの?
なぜそこまで頑なにRequest-MethodとContent-Typeの値で分岐しようとしないの?
(Content-Typeの値の有無だけ確認して分岐したって言うのは無しよ)
>>533のあなたの最終的な実装を見るとあなたはContent-TypeとParseFormとParseMultipartFormを理解して使って無いの、何となく動くからってやっつけで実装したようにしか見えないの。
> としても、ParseForm内で分岐させない理由にはなってないと思っちゃうんだけど、それについては?
そもそもParseFormがリクエストのパース処理を包括したラッパー関数だと何処で勘違いしたの?
なぜそこまで頑なにRequest-MethodとContent-Typeの値で分岐しようとしないの?
(Content-Typeの値の有無だけ確認して分岐したって言うのは無しよ)
>>533のあなたの最終的な実装を見るとあなたはContent-TypeとParseFormとParseMultipartFormを理解して使って無いの、何となく動くからってやっつけで実装したようにしか見えないの。
535デフォルトの名無しさん
2020/05/17(日) 07:48:39.85ID:8deP89zB >>533
あなたの最終的な実装を元にして実装するならこんな感じかな(勝ってに拡張しちゃってるけど)
func (i *rInst) ParseForm() error {
var err error
r := i.request
ct := r.Header.Get("Content-Type")
ct, _, err = mime.ParseMediaType(ct)
if err == nil {
switch ct {
case "multipart/form-data":
if r.Method == "POST" {
err = r.ParseMultipartForm(100 * 1024)
} else {
err = errors.New(“invalid request”)
}
case “application/json”:
d := json.NewDecoder(r.Body)
// i.Json = make(map[string]interface{})
i.Json = &BindStructure{}
err = d.Decode(&i.Json)
default:
err = r.ParseForm()
}
}
return err
}
まぁ、頑張って。
あなたの最終的な実装を元にして実装するならこんな感じかな(勝ってに拡張しちゃってるけど)
func (i *rInst) ParseForm() error {
var err error
r := i.request
ct := r.Header.Get("Content-Type")
ct, _, err = mime.ParseMediaType(ct)
if err == nil {
switch ct {
case "multipart/form-data":
if r.Method == "POST" {
err = r.ParseMultipartForm(100 * 1024)
} else {
err = errors.New(“invalid request”)
}
case “application/json”:
d := json.NewDecoder(r.Body)
// i.Json = make(map[string]interface{})
i.Json = &BindStructure{}
err = d.Decode(&i.Json)
default:
err = r.ParseForm()
}
}
return err
}
まぁ、頑張って。
536デフォルトの名無しさん
2020/05/17(日) 08:01:02.13ID:Y3GCZn29537デフォルトの名無しさん
2020/05/17(日) 08:02:56.61ID:8deP89zB > i.Json = &BindStructure{}
の部分は
i.Json = BindStructure{}
の間違えでした。
の部分は
i.Json = BindStructure{}
の間違えでした。
538デフォルトの名無しさん
2020/05/17(日) 08:07:59.87ID:Y3GCZn29539デフォルトの名無しさん
2020/05/17(日) 08:10:55.71ID:8deP89zB 寝ぼけてるぽい、もう一回上げ直し
>>533
あなたの最終的な実装を元にして実装するならこんな感じかな(勝ってに拡張しちゃってるけど)
func (i *rInst) ParseForm() error {
var err error
r := i.request
ct := r.Header.Get("Content-Type")
ct, _, err = mime.ParseMediaType(ct)
if err == nil {
switch ct {
case "multipart/form-data":
if r.Method == "POST" {
err = r.ParseMultipartForm(100 * 1024)
} else {
err = errors.New(“invalid request”)
}
case “application/json”:
d := json.NewDecoder(r.Body)
// i.Json = make(map[string]interface{})
// err = d.Decode(&i.Json)
i.Json = &BindStructure{}
err = d.Decode(i.Json)
default:
err = r.ParseForm()
}
}
return err
}
>>533
あなたの最終的な実装を元にして実装するならこんな感じかな(勝ってに拡張しちゃってるけど)
func (i *rInst) ParseForm() error {
var err error
r := i.request
ct := r.Header.Get("Content-Type")
ct, _, err = mime.ParseMediaType(ct)
if err == nil {
switch ct {
case "multipart/form-data":
if r.Method == "POST" {
err = r.ParseMultipartForm(100 * 1024)
} else {
err = errors.New(“invalid request”)
}
case “application/json”:
d := json.NewDecoder(r.Body)
// i.Json = make(map[string]interface{})
// err = d.Decode(&i.Json)
i.Json = &BindStructure{}
err = d.Decode(i.Json)
default:
err = r.ParseForm()
}
}
return err
}
540デフォルトの名無しさん
2020/05/17(日) 08:16:05.54ID:Y3GCZn29 >>535
あ、REST-APIでよく使われる形式なのか
そういうForm使わない呼び出しはサポートしないんで割愛
POST以外のAPIアクセスは事前に拒絶してるから割愛
現状でも問題ないな(手抜き)
あ、REST-APIでよく使われる形式なのか
そういうForm使わない呼び出しはサポートしないんで割愛
POST以外のAPIアクセスは事前に拒絶してるから割愛
現状でも問題ないな(手抜き)
541デフォルトの名無しさん
2020/05/17(日) 08:21:16.95ID:Y3GCZn29542デフォルトの名無しさん
2020/05/17(日) 08:26:21.18ID:8deP89zB スレチになるのでちょっとだけ。
ブラウザが送るって言う解釈とはちょっと違うけどjavascriptで
fetch(url, {
method: 'POST',
headers:{"Content-Type": "application/json"},
body: JSON.stringify(data)
}).then(res => res.json()).then(function(resp) {
// ...
})
みたいにapplication/jsonでリクエストできます。
ブラウザが送るって言う解釈とはちょっと違うけどjavascriptで
fetch(url, {
method: 'POST',
headers:{"Content-Type": "application/json"},
body: JSON.stringify(data)
}).then(res => res.json()).then(function(resp) {
// ...
})
みたいにapplication/jsonでリクエストできます。
543デフォルトの名無しさん
2020/05/17(日) 08:35:11.77ID:Y3GCZn29 >>539
まって、Content-Typeが無いと mime: no media type になる気がするんだが(コード見ただけだけど)
Context-Type が無かったらParseFormの出番だと思う
まって、Content-Typeが無いと mime: no media type になる気がするんだが(コード見ただけだけど)
Context-Type が無かったらParseFormの出番だと思う
544デフォルトの名無しさん
2020/05/17(日) 08:36:58.14ID:8deP89zB >>541
> mime.ParseMultimediaTypeは呼んだ方がいい?
// ct に「;」がある場合に「;」より前を取得してるだけなので
// mime.ParseMultimediaType使わずにこれでもいい
if pos := strings.Index(ct. “;”); pos != -1 {
ct = ct[:pos]
}
> mime.ParseMultimediaTypeは呼んだ方がいい?
// ct に「;」がある場合に「;」より前を取得してるだけなので
// mime.ParseMultimediaType使わずにこれでもいい
if pos := strings.Index(ct. “;”); pos != -1 {
ct = ct[:pos]
}
545デフォルトの名無しさん
2020/05/17(日) 08:38:10.44ID:Y3GCZn29546デフォルトの名無しさん
2020/05/17(日) 08:40:22.86ID:8deP89zB > まって、Content-Typeが無いと mime: no media type になる気がするんだが(コード見ただけだけど)
ごめんこっちに置き換えてw
if pos := strings.Index(ct. “;”); pos != -1 {
ct = ct[:pos]
}
iphoneで書いてるからちょっと適当になりましたw
ごめんこっちに置き換えてw
if pos := strings.Index(ct. “;”); pos != -1 {
ct = ct[:pos]
}
iphoneで書いてるからちょっと適当になりましたw
547デフォルトの名無しさん
2020/05/17(日) 08:45:00.28ID:8deP89zB func (i *rInst) ParseForm() error {
var err error
r := i.request
ct := r.Header.Get("Content-Type")
if pos := strings.Index(ct. “;”); pos != -1 {
ct = ct[:pos]
}
switch ct {
case "multipart/form-data":
if r.Method == "POST" {
err = r.ParseMultipartForm(100 * 1024)
} else {
err = errors.New(“invalid request”)
}
case “application/json”:
d := json.NewDecoder(r.Body)
// i.Json = make(map[string]interface{})
// err = d.Decode(&i.Json)
i.Json = &BindStructure{}
err = d.Decode(i.Json)
default:
err = r.ParseForm()
}
return err
}
var err error
r := i.request
ct := r.Header.Get("Content-Type")
if pos := strings.Index(ct. “;”); pos != -1 {
ct = ct[:pos]
}
switch ct {
case "multipart/form-data":
if r.Method == "POST" {
err = r.ParseMultipartForm(100 * 1024)
} else {
err = errors.New(“invalid request”)
}
case “application/json”:
d := json.NewDecoder(r.Body)
// i.Json = make(map[string]interface{})
// err = d.Decode(&i.Json)
i.Json = &BindStructure{}
err = d.Decode(i.Json)
default:
err = r.ParseForm()
}
return err
}
548デフォルトの名無しさん
2020/05/17(日) 08:51:07.87ID:Y3GCZn29 現時点で
// SetParseMemory は ParseMultipartForm で指定するメモリサイズを変更します。
func (i *rInst) SetParseMemory(size int64) {
i.size = size
}
// ParseForm() error
func (i *rInst) ParseForm() error {
v := i.request.Header.Get("Content-Type")
if v == "" {
return i.request.ParseForm()
} else {
if pos := strings.Index(v, ";"); pos != -1 {
v = v[:pos]
}
if v == "multipart/form-data" {
return i.request.ParseMultipartForm(i.size)
} else {
return i.request.ParseForm()
}
}
}
とした
// SetParseMemory は ParseMultipartForm で指定するメモリサイズを変更します。
func (i *rInst) SetParseMemory(size int64) {
i.size = size
}
// ParseForm() error
func (i *rInst) ParseForm() error {
v := i.request.Header.Get("Content-Type")
if v == "" {
return i.request.ParseForm()
} else {
if pos := strings.Index(v, ";"); pos != -1 {
v = v[:pos]
}
if v == "multipart/form-data" {
return i.request.ParseMultipartForm(i.size)
} else {
return i.request.ParseForm()
}
}
}
とした
549デフォルトの名無しさん
2020/05/17(日) 08:54:49.63ID:Y3GCZn29 あ、これでいいのか
// ParseForm() error
func (i *rInst) ParseForm() error {
v := i.request.Header.Get("Content-Type")
if pos := strings.Index(v, ";"); pos != -1 {
v = v[:pos]
}
if v == "multipart/form-data" {
return i.request.ParseMultipartForm(i.size)
} else {
return i.request.ParseForm()
}
}
// ParseForm() error
func (i *rInst) ParseForm() error {
v := i.request.Header.Get("Content-Type")
if pos := strings.Index(v, ";"); pos != -1 {
v = v[:pos]
}
if v == "multipart/form-data" {
return i.request.ParseMultipartForm(i.size)
} else {
return i.request.ParseForm()
}
}
550デフォルトの名無しさん
2020/05/17(日) 08:55:11.84ID:8deP89zB >>545
>うん、でもそこはAPIの仕様だから
>汎用的なForm解析ならば必要だけど、自分のAPIだと割愛してよいってだけの話
わかりました。
サンプルがちょっとグダグダになってこめんなさいw
とりあえす頑張ってください。
>うん、でもそこはAPIの仕様だから
>汎用的なForm解析ならば必要だけど、自分のAPIだと割愛してよいってだけの話
わかりました。
サンプルがちょっとグダグダになってこめんなさいw
とりあえす頑張ってください。
551デフォルトの名無しさん
2020/05/17(日) 08:57:15.07ID:8deP89zB >>549
それでもいいです。
それでもいいです。
552デフォルトの名無しさん
2020/05/17(日) 09:00:02.16ID:Y3GCZn29 結局、application/json のために ParseForm から ParseMultipartForm を追い出してる?
やっぱり自分的には納得いかない
やっぱり自分的には納得いかない
553デフォルトの名無しさん
2020/05/19(火) 00:48:43.53ID:uas/zK5F archive/zip パッケージの仕様なのか、zip 自体の仕様なのかわからんけど
まーた穴に嵌まった
zip内のトップディレクトリにファイルがある
file1.txt
sub/file2.txt
という構成だったときには
sub/
というzipエントリもReadCloser.File配列に入ってくるのに
トップにファイルがなくて
sub/file2.txt
というように、サブディレクトリ以下にしかファイルが無かったときには
sub/
が入ってきてない(もしくは入らないzipがある)
orz
まーた穴に嵌まった
zip内のトップディレクトリにファイルがある
file1.txt
sub/file2.txt
という構成だったときには
sub/
というzipエントリもReadCloser.File配列に入ってくるのに
トップにファイルがなくて
sub/file2.txt
というように、サブディレクトリ以下にしかファイルが無かったときには
sub/
が入ってきてない(もしくは入らないzipがある)
orz
554デフォルトの名無しさん
2020/05/19(火) 00:49:54.57ID:uas/zK5F package main
import (
"archive/zip"
"fmt"
)
func main() {
list("jquery-ui-1.12.1.zip")
list("ant-1.10.7-javadoc.jar")
}
func list(name string) {
fmt.Println("----- " + name)
if f, err := zip.OpenReader(name); err == nil {
defer f.Close()
for _, fi := range f.File {
fmt.Println(fi.Name)
}
}
}
import (
"archive/zip"
"fmt"
)
func main() {
list("jquery-ui-1.12.1.zip")
list("ant-1.10.7-javadoc.jar")
}
func list(name string) {
fmt.Println("----- " + name)
if f, err := zip.OpenReader(name); err == nil {
defer f.Close()
for _, fi := range f.File {
fmt.Println(fi.Name)
}
}
}
555デフォルトの名無しさん
2020/05/19(火) 00:52:26.39ID:uas/zK5F 実行例
----- jquery-ui-1.12.1.zip
jquery-ui-1.12.1/jquery-ui.theme.css
・・・
----- ant-1.10.7-javadoc.jar
META-INF/
・・・
----- jquery-ui-1.12.1.zip
jquery-ui-1.12.1/jquery-ui.theme.css
・・・
----- ant-1.10.7-javadoc.jar
META-INF/
・・・
556デフォルトの名無しさん
2020/05/19(火) 04:56:52.36ID:eSOcgsmn Go最近始めたんだけど[]stringって型の書き方が違和感すぎるんだけど理由ってあるの?
他にこの配列の型導入してる言語もしりたい
他にこの配列の型導入してる言語もしりたい
557デフォルトの名無しさん
2020/05/19(火) 07:27:40.15ID:uas/zK5F 想像に過ぎないんだけど、
[]が後置だとmapも
map[keyType]valueTypeはvalueType[keyType]mapとなるはず
そしてmapをvalueとして持つmap
map[keyType]map[keyType]valueTypeはvalueType[keyType]map[keyType]map
なんか見辛いような、そうでもないような
そもそもmapって、なんで付けなきゃならないんだろ?
keyType付いてたら文脈で分かりそう
連想配列って元からそうだよな
[]が後置だとmapも
map[keyType]valueTypeはvalueType[keyType]mapとなるはず
そしてmapをvalueとして持つmap
map[keyType]map[keyType]valueTypeはvalueType[keyType]map[keyType]map
なんか見辛いような、そうでもないような
そもそもmapって、なんで付けなきゃならないんだろ?
keyType付いてたら文脈で分かりそう
連想配列って元からそうだよな
558デフォルトの名無しさん
2020/05/19(火) 09:57:39.34ID:uas/zK5F559デフォルトの名無しさん
2020/05/19(火) 15:39:15.28ID:uas/zK5F サーバで http.ResponseWriter への書き込みが WSAECONNABORTED (10053) でエラーになっているとき
http.server.go#1905 で return してるため、1907のc.setState で StateIdle がセットされない
そのため、http.Server の ConnState ハンドラでコネクション数を勘定してると数が合わなくなる
という罠に嵌まった
どうしよう……エラーを検知した時に勘定している数をデクリメントするか?
だって、 return の判定で使われてる shouldReuseConnection って隠蔽されてるから
http.server.go#1905 で return してるため、1907のc.setState で StateIdle がセットされない
そのため、http.Server の ConnState ハンドラでコネクション数を勘定してると数が合わなくなる
という罠に嵌まった
どうしよう……エラーを検知した時に勘定している数をデクリメントするか?
だって、 return の判定で使われてる shouldReuseConnection って隠蔽されてるから
560デフォルトの名無しさん
2020/05/19(火) 15:42:09.41ID:jC0iCWsp 罠にハマりっぱなしだな
561デフォルトの名無しさん
2020/05/19(火) 15:46:50.47ID:uas/zK5F テストでの罠検出には定評のある人材だから
すごかろう(やけくそ)
すごかろう(やけくそ)
562デフォルトの名無しさん
2020/05/19(火) 15:56:36.95ID:UZUeOLhY >>556
英語と同じ語順にした
array of string => []string
Cの場合それを使う構文と宣言を同じにしたせいで
ややこしくなったし
その反面教師だと思う
Cだと使う時も宣言もstring[]なんだよね
英語と同じ語順にした
array of string => []string
Cの場合それを使う構文と宣言を同じにしたせいで
ややこしくなったし
その反面教師だと思う
Cだと使う時も宣言もstring[]なんだよね
563デフォルトの名無しさん
2020/05/19(火) 15:57:44.45ID:uas/zK5F そもそも、問題のレスポンスでは20MBくらいのmpgファイルがリクエストされてるんだけど
こういったデカイ応答を返す場合って自分が知らない注意点がある?
Content-Length はファイルサイズ(21614145)
Content-Type は application/octet-stream
で送ってる
ブラウザでは動画はちゃんと出てる
こういったデカイ応答を返す場合って自分が知らない注意点がある?
Content-Length はファイルサイズ(21614145)
Content-Type は application/octet-stream
で送ってる
ブラウザでは動画はちゃんと出てる
564デフォルトの名無しさん
2020/05/19(火) 16:05:09.36ID:uas/zK5F ブラウザ側では数十msで受信してるから、タイムアウトじゃない
565デフォルトの名無しさん
2020/05/19(火) 16:16:50.77ID:uas/zK5F う、もしかすると送信するストリームが Content-Length よりも長いという可能性もあるのか
それでブラウザ側から終わった!と切断されてる可能性
面倒極まりないな
それでブラウザ側から終わった!と切断されてる可能性
面倒極まりないな
566デフォルトの名無しさん
2020/05/19(火) 16:50:34.24ID:uas/zK5F 深く考えずに
レスポンスの書き込みに失敗したらコネクション数をデクリメントする
ことにした
コネクション数が0になるまではWaitGroup.Waitで待ってる作りにしてたんで
レスポンスの書き込みに失敗したらコネクション数をデクリメントする
ことにした
コネクション数が0になるまではWaitGroup.Waitで待ってる作りにしてたんで
567デフォルトの名無しさん
2020/05/19(火) 17:19:44.24ID:h69Ba80R 普通は適当なサイズに分けてチャンクで送る
568デフォルトの名無しさん
2020/05/19(火) 17:35:35.62ID:uas/zK5F >>567
ResponseWriter の実体って、 chunkWriter ってstruct だから自動的にチャンクで送られるんじゃないの?
ResponseWriter の実体って、 chunkWriter ってstruct だから自動的にチャンクで送られるんじゃないの?
569デフォルトの名無しさん
2020/05/19(火) 17:38:29.19ID:uas/zK5F >>567
うわ、Headerでなんか設定しないと駄目なのか
うわ、Headerでなんか設定しないと駄目なのか
570デフォルトの名無しさん
2020/05/19(火) 17:57:05.30ID:uas/zK5F >>567
うーん、HTTP1.1だとTransfer-Encodingにidentityを指定していない場合は強制的にchunkで送られるんじゃないか疑惑
Content-Length不要のお知らせ?
うーん、HTTP1.1だとTransfer-Encodingにidentityを指定していない場合は強制的にchunkで送られるんじゃないか疑惑
Content-Length不要のお知らせ?
571デフォルトの名無しさん
2020/05/19(火) 18:02:54.20ID:uas/zK5F572デフォルトの名無しさん
2020/05/19(火) 18:09:43.56ID:MXbRkdCy 一貫してオレの都合よく動くようにできてないと騒いでるだけだな
573デフォルトの名無しさん
2020/05/19(火) 18:33:39.64ID:uas/zK5F 呼び出し順序に則って作らなければ動かないフレームワークってのは
屑って言うんじゃないの?
屑って言うんじゃないの?
574デフォルトの名無しさん
2020/05/19(火) 18:35:39.76ID:uas/zK5F いや、呼び出し順序に従わない場合はエラーにする
ならば仕方ないよそりゃ
OpenしないでReadできないのはおかしい、とか言わないから
ならば仕方ないよそりゃ
OpenしないでReadできないのはおかしい、とか言わないから
575デフォルトの名無しさん
2020/05/19(火) 18:38:32.19ID:uas/zK5F 明記しない制約は常識とは言わないから
576デフォルトの名無しさん
2020/05/19(火) 21:21:52.33ID:uas/zK5F >>567
Content-Length不要…以前の、設定しなけりゃチャンク送信!
orz
ちなみに、レスポンス書き込みがエラーになるブラウザはChromeとEdge
Firefoxだとエラーにならないのは何故だろう
Content-Length不要…以前の、設定しなけりゃチャンク送信!
orz
ちなみに、レスポンス書き込みがエラーになるブラウザはChromeとEdge
Firefoxだとエラーにならないのは何故だろう
577デフォルトの名無しさん
2020/05/19(火) 22:18:59.14ID:sE19LTm8 むしろエラーにしてほしい
変な俺様拡張がまかり通ると
そっちに甘えてそれが当たり前になって
文化や規約を企業に乗っ取られてしまう
変な俺様拡張がまかり通ると
そっちに甘えてそれが当たり前になって
文化や規約を企業に乗っ取られてしまう
578デフォルトの名無しさん
2020/05/20(水) 09:29:17.16ID:AEWLFsS8 458 に関係しての罠
プロジェクトをユーザ名とは関係しないディレクトリに置いても、まだ駄目だった
C:/Users/ユーザ名/go/pkg/mod/golang.org/x/text@v0.3.2/encoding/japanese/all.go
というように go get したパッケージの置き場から、ユーザ名は露呈する
嫌ならば GOPATH はユーザディレクトリの下に置いてはいけない
プロジェクトをユーザ名とは関係しないディレクトリに置いても、まだ駄目だった
C:/Users/ユーザ名/go/pkg/mod/golang.org/x/text@v0.3.2/encoding/japanese/all.go
というように go get したパッケージの置き場から、ユーザ名は露呈する
嫌ならば GOPATH はユーザディレクトリの下に置いてはいけない
579デフォルトの名無しさん
2020/05/20(水) 09:36:09.90ID:AEWLFsS8 そりゃ当たり前で気がつかないのがウカツだった…
参照してるパッケージだってコンパイルされるんだもんなぁ
参照してるパッケージだってコンパイルされるんだもんなぁ
580デフォルトの名無しさん
2020/05/25(月) 08:12:24.13ID:Jp/r3UJz 雑誌でGoはC++を嫌ったGoogleの技術者が作ったって書かれてたんだけどそうなの?
色んな情報見てきて初めて見たんだけど
色んな情報見てきて初めて見たんだけど
581デフォルトの名無しさん
2020/05/25(月) 09:08:49.12ID:D0zggZTk コンパイルの遅さに嫌気が差したってのは見たこと有るな、尚ソースは無い
582デフォルトの名無しさん
2020/05/25(月) 10:00:32.41ID:Qw1nrBQZ C++を嫌った技術者が作ったというのは曲解だと思うけど、
1. C++プログラマーだった人たちが新しい言語の研究プロジェクトを始めた
2. 新しい言語を作るにあたってC++のダメな点を洗い出す -> 結果としてC++嫌いになったw
という、特に驚くこともない話(C++のダメなところはそこらじゅうに既出ですし)
過去のインタビューでも出てた話だし、カンファレンスでもネタにされてた
https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html
https://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480
1. C++プログラマーだった人たちが新しい言語の研究プロジェクトを始めた
2. 新しい言語を作るにあたってC++のダメな点を洗い出す -> 結果としてC++嫌いになったw
という、特に驚くこともない話(C++のダメなところはそこらじゅうに既出ですし)
過去のインタビューでも出てた話だし、カンファレンスでもネタにされてた
https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html
https://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480
583デフォルトの名無しさん
2020/05/25(月) 11:32:33.83ID:ltgSCU1m 目的と合ってないから、目的を絞り混んで作った、いわゆるドメイン固有言語って認識
言語は問題解決に向いてる向いてないはあっても、良い悪いってのはそんなに無いよねという持論
言語は問題解決に向いてる向いてないはあっても、良い悪いってのはそんなに無いよねという持論
584デフォルトの名無しさん
2020/05/25(月) 12:20:31.75ID:83qlHvUW 同意しない
Goが絞り込んでいるのは用途ではなく開発スタイル
Goが絞り込んでいるのは用途ではなく開発スタイル
585デフォルトの名無しさん
2020/05/25(月) 13:20:36.16ID:gis+qwRr Go は、Ruby を極端にした感じ
継承より委譲。
継承を無くして、Duck Typing だけにした!
Ruby on Rails をやったら、やっぱり継承・抽象クラスがあると便利!
フレームワークには必要
継承より委譲。
継承を無くして、Duck Typing だけにした!
Ruby on Rails をやったら、やっぱり継承・抽象クラスがあると便利!
フレームワークには必要
586デフォルトの名無しさん
2020/05/25(月) 13:44:33.12ID:ltgSCU1m587デフォルトの名無しさん
2020/05/25(月) 16:38:07.00ID:Jp/r3UJz 問題解決力だけで言うとGoが一番高いの?
個人的にはフロントのネイティブ実装を強制されるって意味も含めてJSか、ライブラリの豊富さでPythonとかだと個人的に思うけど
個人的にはフロントのネイティブ実装を強制されるって意味も含めてJSか、ライブラリの豊富さでPythonとかだと個人的に思うけど
588デフォルトの名無しさん
2020/05/25(月) 16:41:08.15ID:AxcX2SLe 場合による
589デフォルトの名無しさん
2020/05/25(月) 17:19:57.39ID:quw8Fr75 pythonってそこまで書きやすいとは思わないなあ
インターフェースがないから
どのオブジェクトが何を実装してるのかわからない
やはりインターフェースは偉大
インターフェースがないから
どのオブジェクトが何を実装してるのかわからない
やはりインターフェースは偉大
590デフォルトの名無しさん
2020/05/25(月) 17:29:12.78ID:83qlHvUW Goはクラウドネイティブ開発に習熟してるがオーバークォリティなことをやりがちな奴が多い
JSは大半はゴミ、たまに凄いのもいる
Pythonは全体的に高学歴で頭良いけど動きゃいいって感じの奴が多い
どんな人間が欲しいか次第じゃないかな
JSは大半はゴミ、たまに凄いのもいる
Pythonは全体的に高学歴で頭良いけど動きゃいいって感じの奴が多い
どんな人間が欲しいか次第じゃないかな
591デフォルトの名無しさん
2020/05/25(月) 17:31:51.89ID:AueT0Sbh pythonは
import Hoge
したら
help(Hoge)
a = Hoge.hoge()
だったら
help(a)
import Hoge
したら
help(Hoge)
a = Hoge.hoge()
だったら
help(a)
592デフォルトの名無しさん
2020/05/25(月) 18:10:55.04ID:ltgSCU1m 場合つまり解決しようという問題による
問題解決能力って何よという話
グラフィカルでない
非同期処理が効果的
ならば少ない労力で実装できるという強みが売りかな
労力に関しては仕様が一頁で網羅できるGoの学習コストの低さが大きい
PythonだとCの知識前提で使うCythonでないとGoには太刀打ちできないというQuiita記事もある
総合力ではPythonの圧勝だろうけど、限定された問題ってのはそういうもの
問題解決能力って何よという話
グラフィカルでない
非同期処理が効果的
ならば少ない労力で実装できるという強みが売りかな
労力に関しては仕様が一頁で網羅できるGoの学習コストの低さが大きい
PythonだとCの知識前提で使うCythonでないとGoには太刀打ちできないというQuiita記事もある
総合力ではPythonの圧勝だろうけど、限定された問題ってのはそういうもの
593デフォルトの名無しさん
2020/05/25(月) 18:27:04.86ID:ltgSCU1m >>590
オーバークォリティか……耳に痛すぎる指摘だ
オーバークォリティか……耳に痛すぎる指摘だ
594デフォルトの名無しさん
2020/05/25(月) 19:39:14.90ID:UFuP99WV 用途によるとしか言いようがない気がする。
どれも銀の弾丸にはならんよ。
どれも銀の弾丸にはならんよ。
595デフォルトの名無しさん
2020/05/25(月) 21:22:07.97ID:oQRyx0Ul 銀の弾丸は狼男(もしくは悪魔)を倒すという用途に特化されてるんですが・・
596デフォルトの名無しさん
2020/05/25(月) 22:09:38.90ID:UFuP99WV ブルックスの論文を知ってて言ってたら申し訳ないんだが、ソフトウエアプロジェクトと言うものに対する銀の弾丸は無いって話だよ。
597デフォルトの名無しさん
2020/05/26(火) 06:33:05.73ID:tQI2iyhC オーバークォリティなことをやりがちな奴が多い
ってのは質が良いプロダクトを作るのには向いてないってこと?
ってのは質が良いプロダクトを作るのには向いてないってこと?
598デフォルトの名無しさん
2020/05/26(火) 06:39:27.10ID:12NedZz3599デフォルトの名無しさん
2020/05/26(火) 07:21:02.22ID:uV+m0fgU 単体テストやってたら過剰品質だと怒られたんだよな○KI電気SI
600デフォルトの名無しさん
2020/05/26(火) 07:48:46.09ID:FE3JTR8c 過ぎたるは猶及ばざるが如し
601デフォルトの名無しさん
2020/05/26(火) 08:32:48.79ID:2WnNvGhA >>599
カバレッジ100%とかを目標にしてたんなら過剰品質だと言われてもしかたがない
カバレッジ100%とかを目標にしてたんなら過剰品質だと言われてもしかたがない
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国「国連安保理の許可なしに日本攻撃可能」 Xで旧敵国条項に言及… ★2 [BFU★]
- 立憲・野田代表が主張 台湾有事答弁で「質問者批判は筋違い」「答弁がおかしい」「高市総理迎合のネット世論は危険」★4 [♪♪♪★]
- 【千葉】コンビニに尿入りペットボトル並べた疑い、26歳男「むしゃくしゃして」…購入した客が飲もうとしたところ臭いに違和感 [ぐれ★]
- 中国官製報道「日本経済はもう持たない」にネット民ツッコミ「ニュースだけ見てたら日本はもう百回くらい爆発してる」 [1ゲットロボ★]
- 日中関係悪化で「日本からもうすぐパンダがいなくなる」 中国SNSでトレンド1位に★2 [♪♪♪★]
- 【STARTO ENTERTAINMENT】timelesz、メンバーの不適切言動を謝罪「不用意かつモラルに反した発言であった」 全員の署名入りでコメント [Ailuropoda melanoleuca★]
- 【実況】博衣こよりのえちえちホロ分かり手クイズ🧪🏴‍☠🌸 ★2
- 【実況】博衣こよりのえちえちホロ分かり手クイズ🧪🏴‍☠🌸
- 【高市悲報】中国「国連安保理の許可なしに日本を攻撃可能だ」 [115996789]
- 【高市悲報】中国「国連安保理の許可なしに日本を攻撃可能だ」★2 [115996789]
- 日中戦争起きたら5日で自衛隊壊滅するらしい。じゃあ徴兵も無いし、俺等が必死になって反対してやる理由なくね? [237216734]
- 中国SNS「メディアがやたら日本が苦境だって報じてるけど本当?」→「嘘ですよ。ヤフコメを翻訳してみてください」 バレてしまうwwww [271912485]
