おしゃれなカフェで...
私はエンジニア。
コーヒー片手に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
になるので、そこはお好みで調整してください!
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))
}
}
}
動かしてみる
おー、これはきっと何かしていますね!!
ちゃんと#
で上書きされていますし、進捗パーセント表示もいい感じです!!
FAIL
が表示されたときに「しまった!」とか小声で言えば、さらに何かやってる感がアップすること間違いなしですね!!!
おわりに
ちょっとやってみたくなっただけなんです。
普段はまじめ(?)な記事を書いてますので、どうか許してください。
謝辞
@keiji-kataokaさん、リファクタリングありがとうございます!