dates.txt
2019-01-01 2019-02-01 2019-03-01
みたいなファイルがあった時に、このファイルの行をxargsコマンド経由で任意のコマンドの引数として渡す方法。
$ cat dates.txt | xargs -I{} 'echo {}'
dates.txt
2019-01-01 2019-02-01 2019-03-01
みたいなファイルがあった時に、このファイルの行をxargsコマンド経由で任意のコマンドの引数として渡す方法。
$ cat dates.txt | xargs -I{} 'echo {}'
今使っているのはMacBookPro 13inch late 2016 Two Thunderbolt3 portsなんだけど、2018年モデルのMacBookAirにCPUスコアは負けている...
Single-Core Score: 3886 Multi-Core Score: 7701
以下は2018年モデルのGeekBenchのスコア。
Single-Core Score: 4008 Multi-Core Score: 7396
Touch IDがついていてTouch Barがないモデルだし、重さも100gぐらい軽いし買い替えようか検討中...
Apple MacBook Air (13インチ, 1.6GHzデュアルコアIntel Core i5, 8GB RAM, 256GB) - ゴールド (最新モデル)
2019年がもう半分が過ぎてしまった。やばい。
▓▓▓▓▓▓▓▓░░░░░░░ 50%
— Year Progress (@year_progress) July 2, 2019
6月は頑張ってブログを書いた。それなりの分量の記事を書こうとすると週に1個が限界な気がするので、良いペースだと思う。
1日6時間以上寝る、ということを今年の目標にしている。ヘルスケアアプリによると6月は平均6時間13分だった。ただ、毎日6時間以上の睡眠ができているわけではないので、これは今後の課題である。
これは以下の3つに絞る。これ以外は必要になったら勉強する。
Goについては、Go言語による並行処理という本を読んでいるけどとてもわかりやすくてよい。
もともとの目標はIELTS 6.5だが、今の自分のレベルだと高すぎるのでOverall 6.0に下方修正する。そして勉強は相変わらずできていない。電車の中の隙間時間でなるべくやるのが良いのだろうけど、Goの本を読んだりするほうが楽しいのでそっちをやってしまっている。
特に進捗なし
6月は仕事がかなり落ち着いてきたのでプライベートの勉強がかなり捗った。来月もこれぐらいのペースで頑張って行きたい。
Go言語におけるcontextパッケージを使ったキャンセルやタイムアウトについて説明する。この記事を読むと以下について詳しくなれるはず...!
とはいいつつも、かなり自分向けのまとめではあるし既出のトピックなので以下の記事を読むともっとわかりやすいはず。
contextがあると何が嬉しいのかを説明するために、まずはdone channelを使ってキャンセルを行うコードを書いてみる。これはGo言語による並行処理のP.137に記載されていたサンプルプログラムを少し修正したものである。
このプログラムでやりたいことは、close(done)によってprintGreeting, printFarewell, genGreeting, genFarewell, localeの関数をキャンセルしたい、ということである。
このプログラムを実行すると以下の出力が得られる(場合によっては先にhello world!が出力されるかもしれない)。
$ go run context/done_chan/main.go goodbye world! hello world!
実行の流れとしては以下のようになっている(この図もGo言語による並行処理から引用)。
この図をより詳細に説明すると
<-time.After(5 * time.Second)
で5秒待ち、EN/US
を返すEN/US
の場合 hello
を返す<-time.After(5 * time.Second)
で5秒待ち、EN/US
を返すEN/US
の場合 goodbye
を返すdefer close(done)
が実行される(L12)では、以下のように defer close(done)
の部分を、close(done)した後にprintGreetingを呼び出すようにしたらどうなるだろうか?
defer func() { close(done) if err := printGreeting(done); err != nil { fmt.Printf("err=%v\n", err) } }()
上のように修正して再度プログラムを実行すると、以下のように出力される。
$ go run context/done_chan/main.go goodbye world! hello world! err = canceled
canceled
がprintGreetingのerrorとして返ってきた。このerrorはlocale関数の以下の部分で生成されたもので、done channelがすでにcloseされたため、selectのこのcaseに処理が来たということである。
select { case <-done: return "", fmt.Errorf("canceled") ... }
このようにprintGreetingやprintFarewellをchannelをcloseすることでキャンセルを実現することができた。それでは次に、contextパッケージを使ったキャンセルのやり方を見てみよう。
それでは、さきほどのdone channelの例をcontextを使って実装し直してみよう。
done channelの実装と比べた場合のポイントとしては以下である。
cancel
を呼び出すことでキャンセル処理を実行するctx
を渡す。これによって末端のlocaleまでctxを引き回しているこのプログラムを実行してみると、以下のような出力になりcontextを使ってキャンセルが実装できたことが確認できた。これがcontextパッケージの大きな機能の一つである。
$ go run context/with_cancel/main.go goodbye world! hello world! err = context canceled
ctx.Done
はcontextがキャンセルされるまでブロックされる受信専用のchannelを返す。このchannelからデータを取得できたということはキャンセルされたということなので、ctx.Err() でエラーを返すようにしているcontext canceled
というエラーはlocale関数のctx.Err()
の戻り値である。contextパッケージにはCanceled
というグローバル変数が定義されており、これが返却されている一番最初のdone channelのプログラムでは単純にprintGreetingやprintFarewellなどの関数の実行をキャンセルしたいタイミングでclose(done)
しているだけだが、例えばprintGreetingやprintFarewell(およびこれらが呼び出す関数)の呼び出しを、一定時間が経過した場合にキャンセルしたいと思った場合はどうすればよいだろうか? context.WithTimeoutを使うことでそのような実装が簡単にできる。
defer cancel()
するcancel
を呼び出すこのプログラムの実行結果は以下のようになる。
$ go run ./context/with_timeout/main.go cannot print greeting: context deadline exceeded cannot print farewell: context canceled
contextを使うことでキャンセルやタイムアウトが簡単に実装できることを説明した。この内容については以下のGo言語による並行処理にすべて書かれているし、よりgoroutineや並行処理について知りたい場合はこの本を読んでみることを強くオススメする。
ターミナル環境を見直す(1) - zsh + prezto編 - oinume journal の記事でデフォルトのshellをzshに切り替えたけど、tmuxでバンバン新しいタブを開くと起動の遅さが気になっていてそろそろどうにかしたいと思っていた。また、zshは便利だけど設定項目を覚えたり調べるのが大変だし、ほとんどの機能は使いこなせていなかったので、これを機にシンプルなbashに乗り換えてみた。この記事はその際にやったことのメモ。
以下によると次期macOS Catalinaではbashに代わってzshがデフォルトになるらしく、時代と逆行していて面白い。
maxOS mojaveのデフォルトのbashは3.2.57と古いので、まずは最新のbashをhomebrewでインストールする。
$ brew install bash
brewでインストールしたbashは /usr/local/bin/bash にあるので、これをログインシェルとして変更する。
$ chsh -s /usr/local/bin/bash (パスワードを聞かれる) chsh: /usr/local/bin/bash: non-standard shell
しかし、↑のようなエラーになってしまうので、 sudo vi /etc/shells
して /usr/local/bin/bash
を追記してもう一度 chsh コマンドで変更する。
$ chsh -s /usr/local/bin/bash
やはり素のプロンプトだと味気ないので、Prompt関連はけっこう設定をいじった。以下に詳細を書く。
定番のPowerline。bash-powerlineというものがあったので、これを以下のように少しカスタマイズして使っている。(Macの場合プロンプトの記号が$
ではなく
になるのがどうしても嫌だった)
export PS_SYMBOL='$' [ -f ~/dotfiles/bash-powerline.sh ] && . ~/dotfiles/bash-powerline.sh
デフォルトだとカレントディレクトリだけがプロンプトに表示されて、同じディレクトリが複数あるとどこにいるのかわからなくなる問題がある。zshだと ~/go/src/github.com/oinume/playground-go にいる場合は ~/g/s/g/o/playground-go のようにいい感じに省略してくれるので似たようなことがやりたかった。調べたところ、bashでもPROMPT_DIRTRIMという環境変数で似たようなことができる。PROMPT_DIRTRIM=2
にした場合は ~/.../oinume/playground-go
のようになる。一つ上のディレクトリ名がわかれば良いと思ったので、自分としてはこれで満足している。
zshでは当たり前にできるやつ。以下を .bash_profile に追加すればOK。
function share_history { history -a history -c history -r } PROMPT_COMMAND='share_history' shopt -u histappend export HISTSIZE=2000
Bash の小枝集のcdhist.sh + fzf で検索できるようにしている。.bash_profileでの設定は以下のようになっていて、Ctrl+@で呼び出せるようにしている。
[ -f ~/dotfiles/cdhist.sh ] && . ~/dotfiles/cdhist.sh _cd_cdhist() { cd "$(for i in "${CDHIST_CDQ[@]}"; do echo $i; done | fzf)" } bind -x '"\C-@": _cd_cdhist';
様々なalias、補完、プラグインが用意されているbash-itというものを使ってみる。
以下のようにインストールする。
$ git clone --depth=1 https://github.com/Bash-it/bash-it.git ~/.bash_it $ ~/.bash-it/install.sh
$ bash-it enable completion bash-it
$ bash-it enable plugin xyz
上記のコマンドを実行すると、~/.bash-it/enabled にsymlinkが作成される。以下のコマンドで alias, completion, pluginの一覧を見ることができるので、自分が使いそうなものを有効にしていくと良い。
bash-it show aliases bash-it show completions bash-it show plugins
[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)