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
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%とかを目標にしてたんなら過剰品質だと言われてもしかたがない
602デフォルトの名無しさん
2020/05/26(火) 09:09:34.75ID:285tMFTY Web関連の自動化でselenium使いたくて、
Pythonでいいかってなったとこはある。
Pythonでいいかってなったとこはある。
603デフォルトの名無しさん
2020/05/26(火) 11:43:23.28ID:6ileE2Zc 自動テストのコストは成果物を運用しながら継続的に改良していく中でペイしていくもので、SIなら突貫で作って一発動いたらあとは納品して終わりなんだから自動テストは実際要らんわ
Goで書くようなものなんて複雑怪奇な業務ロジックとかじゃなくシンプルな小物だろうし
Goで書くようなものなんて複雑怪奇な業務ロジックとかじゃなくシンプルな小物だろうし
604デフォルトの名無しさん
2020/05/26(火) 12:30:08.40ID:navi3B+X そんな会社まだ生き残ってんだ
605デフォルトの名無しさん
2020/05/26(火) 12:38:46.36ID:uV+m0fgU 特に一部上場に多い感触
606デフォルトの名無しさん
2020/05/26(火) 12:50:01.40ID:tQI2iyhC >>592
Qiitaの記事欲しい
てかPython触るぐらいなら機械学習分野もGoに入れ替わってほしいわ
PythonのC/C++バックエンドよりは多少遅くなるけど、クラウドの相性のよさとかライブラリの質考えたらGoのほうがいい(Numpyとかpandasとかはまた別だけど)
自動テストってどのテストを指してるのか分からないけど、テスト書かないのは後戻りできない負債になるよ
Qiitaの記事欲しい
てかPython触るぐらいなら機械学習分野もGoに入れ替わってほしいわ
PythonのC/C++バックエンドよりは多少遅くなるけど、クラウドの相性のよさとかライブラリの質考えたらGoのほうがいい(Numpyとかpandasとかはまた別だけど)
自動テストってどのテストを指してるのか分からないけど、テスト書かないのは後戻りできない負債になるよ
607デフォルトの名無しさん
2020/05/26(火) 13:08:22.92ID:uV+m0fgU608デフォルトの名無しさん
2020/05/26(火) 13:12:24.26ID:uV+m0fgU 事情通に聞いてみたのよ
なんで自動テストしないのか、って
それ始めちゃうと、なんで今までやらなかったのか、そう言われて困るお偉いさんが山ほどいるから、だとさ
なんで自動テストしないのか、って
それ始めちゃうと、なんで今までやらなかったのか、そう言われて困るお偉いさんが山ほどいるから、だとさ
609デフォルトの名無しさん
2020/05/26(火) 13:33:50.23ID:xe35/PQB 自社サービスとSIじゃビジネスモデルが全然違うんだから開発手法も違って当たり前
(俺は必ずしもそうだとは思わないが)仮に自動テストによってSIにおいても大幅な工数削減が可能だとして、それに何の意味がある?売上が減るだけじゃないか
お偉いさんの面子だのと人に鬱憤を押しつける悪い癖を自覚し、自分とその周囲の状況、そして問題の本質を正しく理解しよう
(俺は必ずしもそうだとは思わないが)仮に自動テストによってSIにおいても大幅な工数削減が可能だとして、それに何の意味がある?売上が減るだけじゃないか
お偉いさんの面子だのと人に鬱憤を押しつける悪い癖を自覚し、自分とその周囲の状況、そして問題の本質を正しく理解しよう
610デフォルトの名無しさん
2020/05/26(火) 13:44:25.86ID:uV+m0fgU フーン
611デフォルトの名無しさん
2020/05/26(火) 14:07:06.10ID:e8iGmvo7 NGワード:本質
612デフォルトの名無しさん
2020/05/26(火) 19:07:23.67ID:lsuseEJR Go は名前がダサい
以上
以上
613デフォルトの名無しさん
2020/05/26(火) 19:13:02.05ID:uV+m0fgU 検索で困るもんな
614デフォルトの名無しさん
2020/05/26(火) 19:15:33.38ID:7QcVxoyH C の立場も慮って下さい
615デフォルトの名無しさん
2020/05/26(火) 19:44:28.32ID:uV+m0fgU はじめての C
まぁいやらしい
という定番ネタのあるひとは黙っててください
D 言語は泣いていい
まぁいやらしい
という定番ネタのあるひとは黙っててください
D 言語は泣いていい
616デフォルトの名無しさん
2020/05/27(水) 01:44:41.20ID:lDZQxe+h 構造体の初期化で省略されたフィールドを既定値で初期化する方法を考えてたんだけど、こんなやり方でも構造体を初期化できるんだな(アンチパターンって言われそうだけど)
type Logger struct {
_ struct{}
mutex *sync.Mutex
Prefix string
Writer io.Writer
}
func (l Logger) New() *Logger {
l.mutex = &sync.Mutex{}
if l.Writer == nil {
l.Writer = os.Stdout
}
return &l
}
func main() {
l1 := Logger{}.New()
l2 := Logger{Prefix: "Looger: "}.New()
}
type Logger struct {
_ struct{}
mutex *sync.Mutex
Prefix string
Writer io.Writer
}
func (l Logger) New() *Logger {
l.mutex = &sync.Mutex{}
if l.Writer == nil {
l.Writer = os.Stdout
}
return &l
}
func main() {
l1 := Logger{}.New()
l2 := Logger{Prefix: "Looger: "}.New()
}
617デフォルトの名無しさん
2020/05/31(日) 22:30:09.36ID:MeZ7svrP https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=composite
webフレームワークのベンチマーク比較
1位にC#の新FW「dragon」ってのが入って話題になってた
これechoが入ってないのが気になるんだけど
流石にdjangoとかに負けると思えんし
どうなってんのこれ
webフレームワークのベンチマーク比較
1位にC#の新FW「dragon」ってのが入って話題になってた
これechoが入ってないのが気になるんだけど
流石にdjangoとかに負けると思えんし
どうなってんのこれ
618デフォルトの名無しさん
2020/05/31(日) 22:39:20.95ID:8Mxh+OkW drogonな
しかもC++じゃなね?
ttps://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks/C%2B%2B/drogon
しかもC++じゃなね?
ttps://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks/C%2B%2B/drogon
619デフォルトの名無しさん
2020/05/31(日) 23:27:34.17ID:MeZ7svrP はい。諸々すみませんでした(´・ω・`)
echoはなんかあったのかな
使ってるからゴタゴタとかちょっと気になる
iris?だっけ?(うろ覚え)goは前にも消滅したFWあったし
echoはなんかあったのかな
使ってるからゴタゴタとかちょっと気になる
iris?だっけ?(うろ覚え)goは前にも消滅したFWあったし
620デフォルトの名無しさん
2020/06/01(月) 00:44:15.52ID:0lojqVgc aspnetcoreって結構速かったんだな
621デフォルトの名無しさん
2020/06/01(月) 00:58:25.61ID:pVetmaYN ginはいるね
622デフォルトの名無しさん
2020/06/01(月) 01:12:53.36ID:RpkIRyj6 >>620
汎用フレームワークでここまでパフォーマンスいいのはすごいよね
汎用フレームワークでここまでパフォーマンスいいのはすごいよね
623デフォルトの名無しさん
2020/06/01(月) 08:54:16.54ID:glX8U9VC MSはaspnetcoreのベンチマークにTechEmpowerを使ってることを公言してるんで眉唾
オーバーフィッティングの可能性がある
オーバーフィッティングの可能性がある
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- アンケート調査で「高市発言は問題なし」 93.5%wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 生活保護の受給額ってなんでこんなに安いの?
- お前らは“スカイマイルタワー”建設計画を知っているか?
- これ誰か分かるか?
- 支払い詰まってインターネット止まった
- 万引きJC「すいません許してください!何でもしますから!」←どうする?
