質問: 翻訳をしてくれた@nekketsuuuと@akiに感謝します。 --- 9年ほど前、私は自身初の Golang プロジェクトに取り掛かっていました。小さいプロジェクトで、私は若く、自信過剰でした。「サーバーにアプリをデプロイするスクリプトを書く時間なんてもったいない!アプリを更新するために必要なコマンドはたった3つ、これくらいじゃ間違えることはない!」 ある晩、帰宅し、アプリ開発を始めます。勉強し働いた後このプロジェクトに手を付けたためやや疲れている中、真夜中にアプリの新バージョンを作り終え、整理し、サーバーへの更新を始めました: ``` ... scp -P ... -i ... user@host:/path/to/server_folder ssh ... ``` 私はサーバーにゲストとしてログインしていました(後程判明したのですが、ゲストには特権付きユーザーとして権限が与えられていました)。そして私は、とても手慣れたコマンドを打ち始めます: ``` ... cd /path/to/server_folder/my_cool_go_app/ rm -rf . / ``` 最後の行を打った後、何らかの理由でターミナルが入力モードに帰ってきません。rm コマンドで止まっています。おかしいです。「あっ!しまった、ドットとスラッシュの間にスペースが入ってる!」 ! しかも最悪なことに、それはプロダクション用のサーバーでした。さて、その晩私はバックアップの重要性を知り、如何に簡単にデプロイを行えてしまうかを知りました。私はデプロイスクリプトを書きました。 このような背景ストーリーから、次の質問が生まれました:rm コマンドでの打ち間違いを防ぐには? --- さて、この話は一体何のことでしょう?それは、面白いコンテストについてです! =) ### 技術的な質問にまつわるベストストーリーコンテスト 私たちそれぞれが、実はプログラミングに関連する面白いストーリーを持っているのではないでしょうか。それはもしかすると悲しい、或いは単に珍しいというだけのストーリーかもしれません。今回、そういった質問の背後にあるストーリーをコミュニティメンバーと共有する機会を設けました。楽しくするために、コンテスト形式でストーリーを共有したいと思います。コンテストのルールはいたって簡単です: 1. メインサイトで技術的な質問を投稿してください。 2. 次に、メインサイトで投稿した質問にまつわるストーリーを、メタのこの質問の回答として投稿してください。(わかりやすくする為に、メインサイトでの質問のリンクをそのストーリーの投稿に含めることを忘れないでください。) *※ 期間中に新しく質問をしなくてはならないというわけではありません。過去にプラス投票や回答がついているあなたの「古い質問」を見つけて、それについての裏話を投稿することもOKです👍* 以上です! 入賞者は、以下のスコアの合計が最も大きかった3名のユーザーです:メインサイトでの質問のスコア+その質問についた回答のスコアの合計(マイナススコアの回答や削除済み回答は除きます)+ストーリーの書かれた回答のスコア。入賞者には何かしらクールなものを贈呈します。 コンテストは9月1日から9月30日までです。9月末にストーリーを投稿しても公平になるように、集計は10月10日に行います。 **是非ストーリーを共有してください!** 書き忘れていましたが、もし複数のストーリーがあれば、遠慮せず全て共有してください。ひとつの回答にひとつのストーリーです =)
回答: Go 1.13 がリリースされました🎉🎉 このバージョンでは `defer` のパフォーマンスが 30 % 向上したと書かれているなど、ワクワクが盛りだくさんです。寝ようかと思っていましたが取りやめ。早速手元の Go 環境をひとつずつアップデートし始めました。 Linux 環境向けの Go は、.tar.gz として配布されています。私はブラウザから `go1.13.linux-amd64.tar.gz` をダウンロードし、展開しました。 ``` $ mv go1.13.linux-amd64.tar.gz ~ $ cd $ tar -xf go1.13.linux-amd64.tar.gz $ # この後、展開して出来た新しい Go と、今使っている元々の Go を入れ替える予定でした。 ``` ところで、この環境の `$GOPATH` は `~/go` でした(Go では、`$GOPATH` 以下のディレクトリでソースコード等を管理します)。また `go1.13.linux-amd64.tar.gz` のルートディレクトリの名前も `go` です。 結果として、様々なリポジトリが保存された `$GOPATH` の上に Go 環境自体が展開されてしまいました。しかも `go/src` など同名のディレクトリがあったせいで、ネストして展開されています。幸いなことに `$PATH` へ `${GOPATH}/bin` が追加されていたため、まだホームディレクトリで展開しただけなのに `go version` が 1.13 に上がりました。いや幸いじゃないです。困った。 ``` $ go version go version go1.13 linux/amd64 # ちょっと待って何かがおかしい(古いバージョンを確かめようとして初めて、何かミスったことに気付きました) ``` この結果眠気は弾け飛び、こちらの質問をするに至りました: **圧縮ファイルの展開をundoしたい** 今回のうっかりは割と危なくて、もし同じ名前のファイルが存在していたら上書きしてしまうところでした。影響が少なくて良かった。 ### 教訓 * また同じ間違いをしそうなので、自動化スクリプトを組んでおく。 * コマンドを実行する際は、そのコマンドを undo するにはどうすれば良いか考えてから実行する。 * 寝る前に作業をしない。