4
1

More than 3 years have passed since last update.

カフェでプログラミングしてる風(でも何もやってない)Goコード(プログレスバーバージョン)

Last updated at Posted at 2021-03-16

おしゃれなカフェで...

私はエンジニア。
コーヒー片手にWindowsのノートPCでプログラミングしています。

っていうのは置いといて・・・
カフェでプログラミングしてる風(でも何もやってない)Java(クソ)コードを見た後に、職場であがった話題を絡めたネタ記事です。

唐突ですがCRについて

最近、職場でCRについてのこんな話題があがりました。

恥ずかしながら、キャリッジリターンの意味を初めて理解した、ただの改行コードと思ってた。
これ、カーソルを先頭に戻すコードだったんですね

例えばこんな感じ。

opt = 'aaa'
opt += 'bbb\r'
print opt   # aaabbb

opt += 'ccc'
print opt   # cccaaa

\r (キャリッジリターン) はカーソルを先頭に戻す動きなので、元々のaaabbbに対してcccが上書きされます。
カーソルはcccの位置なので、元からあるbbbは上書きされずに残ります。

改行コードはタイプライターの名残らしいです。

CR LF
カーソルを行頭に戻す カーソルを次の行に移す

という意味になります。
Windowsの改行コードはCR+LFですが、要は「カーソルを行頭に移動して、次の行に移動しろ!」という2つの動作で改行しているわけです。
みなさん知ってました?私は知ってました。

よくある進捗表示

コマンドラインで進捗表示でるやつあるじゃないですか。
あと、\-/|をくるくる回すやつ。
あれって、CR使ってたんですね!!
みなさん知ってました?私は知りませんでした。

というわけでネタアプリ

っていう会話から本家様の記事を思い出してしまったので、\r使ってプログレスバー対応してみました。
そろそろGoを触ろうかと思って、人生で初めてGoを書きました。

それと、毎回done!だとおもしろくないので、たまーに失敗するようにしてみました。
乱数判定いじれば確率変えられます。あまり大きな値にしすぎると毎回FAILになるので、そこはお好みで調整してください!

cafeProgress.go
package main

import (
    "fmt"
    "math/rand"
    "strings"
    "time"
)

// 進捗表示の桁数
const MAXDIGITS = 50

func main() {

    // 乱数初期化
    rand.Seed(time.Now().UnixNano())

    for {

        // 0%~100% まで
        for percent := 0; percent <= 100; percent++ {

            // 最大maxDigits桁に対して、いまの進捗分の#桁数
            progress := percent * MAXDIGITS / 100

            // ランダムでエラーを発生させる
            seed := rand.Intn(65535)
            hasError := seed < 64 // 65536÷64で1/1024でエラーになる

            // 進捗バーを作る
            marker := "#"
            if hasError {
                marker = "-"
            }
            done := strings.Repeat(marker, progress)
            notyet := strings.Repeat(".", MAXDIGITS-progress)

            // メッセージの出力
            msg := "\r"
            if hasError {
                msg = "FAIL.\n"
            }
            if percent == 100 {
                msg = "SUCCESS.\n"
            }
            fmt.Printf("%3d%% [%v%v] %v", percent, done, notyet, msg)

            // エラーだったら次のターン
            if hasError {
                break
            }

            // 素敵感の演出
            var osooso = rand.Intn(100)
            time.Sleep(time.Millisecond * time.Duration(osooso))
        }
    }
}

動かしてみる

cafeProgress.gif

おー、これはきっと何かしていますね!!
ちゃんと#で上書きされていますし、進捗パーセント表示もいい感じです!!
FAILが表示されたときに「しまった!」とか小声で言えば、さらに何かやってる感がアップすること間違いなしですね!!!

おわりに

ちょっとやってみたくなっただけなんです。
普段はまじめ(?)な記事を書いてますので、どうか許してください。

謝辞

@keiji-kataokaさん、リファクタリングありがとうございます!

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1