Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP]kadai3 happylifetaka #44

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

happylifetaka
Copy link

@happylifetaka happylifetaka commented Nov 25, 2018

課題3-2は途中段階ですが一旦コミットいたしました🙇‍♂️

課題3-1 タイピングゲームを作ろう

  • 標準出力に英単語を出す(出すものは自由)
     決められた英単語のみを出すようにして実装しました。
  • 標準入力から1行受け取る
  • 制限時間内に何問解けたか表示する
     正解数と失敗数を表示するように実装しました。

今後の改善点(課題)
・英単語の外部ファイル化
・テストの実装

課題3-2 分割ダウンロードを行う

  • Rangeアクセスを用いる
  • いくつかのゴルーチンでダウンロードしてマージする
  • エラー処理を工夫する
  • キャンセルが発生した場合の実装を行う

実装概要
 http.Head でダウンロード先のファイルサイズ取得やRangeアクセスができるかを確認し、
指定された分割数で一時ファイル(例:1.temp.download、2.temp.download…)
としてダウンロードを行い、全てのダウンロード完了後一時ファイルを結合しました。
一時ファイルはファイルを結合後消去します。

今後の改善点(課題)
・エラー処理の工夫
・キャンセルが発生した場合の実装・・・タイムアウトなど?
・分割ダウンロード失敗時の復旧処理
・小さいファイルの場合は分割せずにダウンロードを行う
・テストの実装

@knsh14
Copy link

knsh14 commented Nov 27, 2018

どんなエディタを使っているかわからないのですが、フォーマッタがかかってないように見えます。
まだ使われてないようなら今すぐエディタの保存時に goimports かけて修正するように設定してください。

@happylifetaka
Copy link
Author

@knsh14 失礼いたしました。golandを試用で使った際、フォーマッタの設定が漏れておりました。普段はVSCodeを使用しております。修正しコミットいたしました。🙇‍♂️

Copy link

@mizkei mizkei left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

簡単にですが、コメントしましたので、参考にしていただければと思います

kadai3-1/happylifetaka/typinggame/typinggame.go Outdated Show resolved Hide resolved
return nil
}

func canRangeDownload(h http.Header) bool {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

http.Header には Get(key string) (value string) が実装されているので、forせずに確認することもできます

for _, f := range filenames {
err := os.Remove(f)
if err != nil {
return err
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

場合によりますが、ここにおけるエラーは一つのファイルを消せないことでなく、消せなかったファイルが存在することだと思います
したがって、途中でエラーになった場合でもそのエラーを保存し、最後まで実行して、消せなかったファイル一覧としたほうが良いと思います

}

reader := io.MultiReader(files...)
b, _ := ioutil.ReadAll(reader)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

エラーは捨てないほうが良いです

}
defer file.Close()

file.Write(([]byte)(b))
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ioutil.ReadAllですべて読み込んでしまって、Writeするよりもio.Copyで扱った方が効率が良い場合が多いです

return err
}

io.Copy(out, res.Body)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

io.Copyもエラーを返す可能性があるので、捨てないほうが良いです


out_path := strconv.Itoa(index) + ".temp.download"
out, err := os.Create(out_path)
defer out.Close()
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

エラーのチェックをしてから out の変数を触ったほうが良いです
理由は、エラーが帰ってきている時点でファイルが作成されているかどうかわからない( out がnilの可能性がある)ため、そのCloseは利用しないほうが良いです

// url :download target url.
// saveFilePath:save file path.
// div:Number of divided downloads.
func (d *Downloader) Download(url string, saveFilePath string, div int64) error {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

連続する変数の型が同じ場合は省略可能です (url, saveFilePath string, div int64)

@happylifetaka
Copy link
Author

@mizkei レビューありがとうございます。大分たってしまいましたがレビューでの指摘内容修正致しました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants