Skip to content

Conversation

segakazzz
Copy link

@segakazzz segakazzz commented Jul 25, 2020

課題3-1, 課題3-2のPRです。
よろしくお願い致します。

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

  • 標準出力に英単語を出す(出すものは自由)
  • 標準入力から1行受け取る
    -制限時間内に何問解けたか表示する

回答

実行方法

cd cmd
go build -o kadai3-1
 ./kadai3-1 -json ../testdata/words.json

オプション

  • -json 入力データをjsonfileで指定
  • -sec 制限秒数を指定
$ ./kadai3-1 -h
Usage of ./kadai3-1:
  -json string
        Path to source json file to import (default "../testdata/words.json")
  -sec int
        Seconds to timeout (default 10)

実行出力例

$ ./kadai3-1 -json ../testdata/words.json
[1] drive >>> drive
[2] part >>> part
[3] available >>> available
[4] yellow >>> yellow
[5] hollow >>> 
--------------------------------------------------------------------------------
Timeout!
#          Your Input           Answer               Correct?
================================================================================
1          drive                drive                ⭕    
2          part                 part                 ⭕    
3          available            available            ⭕    
4          yellow               yellow               ⭕    
[Summary]
Num of Questions     Num of Correct ANS   Match Ratio[%]       Timeout Duration[sec]
================================================================================
4                    4                    100.00               10s  

jsonのデータ形式

  • オンラインでランダムワードから生成できるツールを用いて、10000個のワードを作成 https://onlinerandomtools.com/generate-random-json
  • 実行時には、ランダムソートを行うので、10000個の中からランダムに出題できる
[
  "recall",
  "work",
  "cold",
  "star",
  ...
 ]

感想及び課題

  • テストコード生成をする。コード生成と同時にテストを書く癖をつけたい。

課題3-2【TRY】分割ダウンローダを作ろう

分割ダウンロードを行う

  • Rangeアクセスを用いる
  • いくつかのゴルーチンでダウンロードしてマージする
  • エラー処理を工夫する
  • golang.org/x/sync/errgourpパッケージなどを使ってみる
  • キャンセルが発生した場合の実装を行う

回答

実行方法

cd cmd
go build -o kadai3-2
./kadai3-2 -u https://file-examples-com.github.io/uploads/2017/04/file_example_MP4_1920_18MG.mp4 -d ../testdata/ -s 10 -n 10

オプション

  • -d 出力先のディレクトリを指定
  • -n ダウンロード分割数を指定
  • -s タイムアウト秒を指定
  • -u ダウンロードするファイルのURLを指定
$ ./kadai3-2 -h
Usage of ./kadai3-2:
  -d string
        Directory to save file (default "./testdata/")
  -n int
        Number of parallel process (default 10)
  -s int
        Seconds to timeout (default 10)
  -u string
        Target URL to download (default "https://d2qguwbxlx1sbt.cloudfront.net/TextInMotion-VideoSample-1080p.mp4")

実行出力例

$ ./kadai3-2 -u https://file-examples-com.github.io/uploads/2017/04/file_example_MP4_1920_18MG.mp4 -d ../testdata/ -s 10 -n 10
[4]...Downloaded. Start: 7135936, End: 8919919, Size:1783983
[5]...Downloaded. Start: 8919920, End: 10703903, Size:1783983
[0]...Downloaded. Start: 0, End: 1783983, Size:1783983
[3]...Downloaded. Start: 5351952, End: 7135935, Size:1783983
[6]...Downloaded. Start: 10703904, End: 12487887, Size:1783983
[8]...Downloaded. Start: 14271872, End: 16055855, Size:1783983
[9]...Downloaded. Start: 16055856, End: 17839844, Size:1783988
[1]...Downloaded. Start: 1783984, End: 3567967, Size:1783983
[7]...Downloaded. Start: 12487888, End: 14271871, Size:1783983
[2]...Downloaded. Start: 3567968, End: 5351951, Size:1783983
====================================================================================================
Download Completed!
[Summary]
----------------------------------------------------------------------------------------------------
URL                            https://file-examples-com.github.io/uploads/2017/04/file_example_MP4_1920_18MG.mp4
Output File                    ../testdata/file_example_MP4_1920_18MG.mp4
Split Count                    10                            
Remote Size (Bytes)            17839845                      
Local Size (Bytes)             17839845                      
Elapsed                        3.520312025s                  
====================================================================================================

処理の説明

  • http.Clientで対象ファイルのヘッダー情報から、ファイルサイズを取得
  • サイズをn分割して、ダウンロードするバイト位置を計算
  • Go Routineを用い、各々ダウンロードを行う
  • 一つのGo Routineでエラーが発生した場合は処理をキャンセルする
  • 指定のタイムアウト秒数を過ぎたら、親処理をキャンセルし、contextを用い子処理(分割ダウンローダー)を全てキャンセルする

感想及び課題

  • テストコードをしっかり書きたい。Go Routine仕様時のテストの書き方など、調査が必要。
  • contextでの処理はもっと色々なことができそうなので、勉強したい。

@segakazzz segakazzz added kadai3-1 課題3-1 kadai3-2 課題3-2 labels Jul 25, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kadai3-1 課題3-1 kadai3-2 課題3-2
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant