僕がよく使うShellコマンドまとめ

個人的によく使ったShellコマンドを備忘録としてまとめておきます.

zshで動かしているため,bashだと若干動かなかったりする🙇‍♂️

合計を求める

合計を求める時は,awkを利用しています. awkコマンドは,最高に良くできるコマンドなので多用しまくりです.

## 指定したカラムの合計
❯❯❯ echo "1\n2\n3" | awk '{a += $1} END {print a}'
6

## 列ごとの合計
❯❯❯ echo "1 2 3" | awk '{for (i = 1; i <= NF; i++) a += $i} END {print a}'
6

awkコマンドについて少し解説すると,awkは渡ってきた文字列を空白区切りで分割しawk内部で$1,$2...として扱えるようにしてくれます. だからカラムの合計を求める時には,aという変数にひたすら$1を足してますね.

そしてもう一つNFというものがあると思います. これは空白区切りで分割した配列的なやつの長さだと思ってください. awk$0が分割前の元の文字列を意味するので,$1から初めて$NFまでforで回してあげています. そしてENDという文字の後に書いた処理は,最後に一回だけ呼ばれます. なので,出力は一回しかされないようにできます. 結構がっつり解説しましたがニュアンスが伝わればいいと思います.

平均を求める

## 指定したカラムの平均
❯❯❯ echo "1\n2\n3" | awk '{a += $1} END {print a/NR}'
2

## 列ごとの平均
❯❯❯ echo "1 2 3" | awk '{for (i = 1; i <= NF; i++) a += $i} END {print a/NF}'
2

NRは行数と思ってもらうといいと思います.

頻度を求める

ここから少しトリッキーな感じになっていきます.

❯❯❯ echo "1\n2\n3\n1" | awk '{a[$1]+=1} END {for (i in a) print i "," a[i]}' | sort
1,2
2,1
3,1

まずa[$1]a連想配列のように扱えます. そしてfor (i in a)とすることで,keyを取り出せます. 後は出力しておしまいです. 連想配列の指定したkeyに値が存在しなければ,その中身が0なり空文字なりに色々なってくれてすごいけど,バグ起きたらやばそうという印象です.

## 文字列連結もできる
❯❯❯ echo "1\n2\n3\n1" | awk '{a[$1]=a[$1] $1} END {for (i in a) print i "," a[i]}' | sort
1,11
2,2
3,3

## 文字列の例
❯❯❯ echo "hello\nworld\nsunday\nhello" | awk '{a[$1]=a[$1] $1} END {for (i in a) print i "," a[i]}' | sort
hello,hellohello
sunday,sunday
world,world

zip関数みたいなもの

pasteコマンドを利用します.

❯❯❯ ARR1=`seq 1 10`
❯❯❯ ARR2=`seq 21 30`
❯❯❯ paste <(echo $ARR1) <(echo $ARR2) | while read a b ; do echo $a $b ;done
1 21
2 22
3 23
4 24
5 25
6 26
7 27
8 28
9 29
10 30

## 変数に置くのがめんどくさければ以下のようにも書ける
❯❯❯ paste <(for i in `seq 1 10`;do echo $i;done) <(for i in `seq 21 30`;do echo $i;done) | while read a b ; do echo $a $b ;done
1 21
2 22
3 23
4 24
5 25
6 26
7 27
8 28
9 29
10 30

これによって,二つの異なるパラメータが入ったarrayを回してプログラムの引数にしたりなんかもできたりします. そしてここでちゃっかりプロセス置換というものを利用しています. このプロセス置換というものは,コマンドの書き込み先をそのままコマンドに渡せるという感じのものです. これの何が嬉しいのかというと,ファイルを作成しなくてもファイルを参照するようなコマンド(diffなど)に値を渡せます. diff <(hoge) <(hoge)などはよく使うので,覚えておくと良さげだと思います.

# echoで確認するとこんな感じになります
❯❯❯ echo <(echo hello)
/dev/fd/12

指定ディレクトリ内のファイルを回す

❯❯❯ ls dir
a.csv b.csv c.csv

# for
❯❯❯ for i in dir/*.csv ;do echo $i hello;done
dir/a.csv hello
dir/b.csv hello
dir/c.csv hello

# find while
❯❯❯ find dir -name "*.csv" | while read file ;do echo $file hello ;done
dir/a.csv hello
dir/c.csv hello
dir/b.csv hello

# find xargs
❯❯❯ find dir -name "*.csv" | xargs -I@ echo @ hello
dir/a.csv hello
dir/c.csv hello
dir/b.csv hello

好きなものを使えばいいと思っています. 個人的にはfind書いて,while readしていることが多い.

置換

sedコマンドをよく使います

❯❯❯ echo "hello\nworld\nsunday\nhello" | sed 's/he/hu/g' | sed 's/su/mo/g'
hullo
world
monday
hullo


## ファイルの中身を置換する
❯❯❯ cat test.csv
a
b
c
d
a
❯❯❯ sed -i -e 's/a/g/g' test.csv
❯❯❯ cat test.csv
g
b
c
d
g
❯❯❯ cat test.csv-e
a
b
c
d
a

sed -i <extension>と書くことで,書き換えを行う前のファイルのバックアップが取られます. その時のバックアップファイル名は,fileName + <extension>となります. 設定ファイルを少し書き換えたい時なんかは,結構便利です.

まとめ

とりあえず僕がよく使ってきたコマンドたちを紹介しました. この機会にぜひShellと戯れてくださいね.

おまけ

僕はターミナルで長いコマンドを打ったりするのですが,その時にはzshを利用しています. zshの良い点として,vim modeなるものがあります.(bashにもあるらしい) これはvimのようにノーマルモード,インサートモード,ヴィジュアルモードと切り替えができるだけでなく,アンドゥなどもできます. だからとりあえず少しミスっても安心感がでかく,ずっとShellで長いコマンドを書き続けられています.(それがいいのかは知らない) 皆さんも興味があればぜひ使ってみてください.

すごいHaskellたのしく学ぼう!を読みました.

すごいHaskellたのしく学ぼう!(通称:すごいH本)を読みました.ためになりすぎて,いろいろこれからの人生が楽しくなりそうだったので感想を書きます.

shop.ohmsha.co.jp

環境周りについては,こちらの記事を参考にしました.

qiita.com

Haskellという言語のシンプルさ

この本で出てくるHaskellのコードは,非常にシンプルで短いです. なので,読者の写経する心も折れない親切設計です. かつ基本的にファイルを作って,コンパイルして実行みたいなことをするのは8〜10章くらいだと思います. それ以外の章では,どこかのファイルに関数などの定義を書いて,それをREPL上にロードするだけで動きます. だからすぐに試せて,やってる感がでるので良いです.(ここ重要)

ちなみにロード方法は,REPL上で下のような感じに打つとロードできます.

*Main Lib> :l function.hs

関数型言語の特有の概念の習得

この本は,Haskellを学ぶのが主ですが,同時に関数型言語特有の概念も学べると思います. 特に僕が感動したのは, モナド です. このモナドとは,ある条件を満たしたもののことを指します. モナドは,Haskellの標準ライブラリとして提供されており,多くの種類があります. ざっくり言うと,与えられた型の文脈を損なうことなくいろいろできるすごいやつです. 正直,僕もまだぺーぺーなので,あまり詳しくは言えません.😇

まとめ

結構古い本ですが,今でもやはり関数型言語という概念を学ぶことには非常に新鮮味があり,みんなにお勧めできるぐらいにはすごかったです. Haskellを学びましたが,Scalaが書きたくなりました.(おいおい)

MiSTEL BAROCCO MD600を買いました.

👇のキーボードを買いました.

www.archisite.co.jp                           

買ったきっかけ

僕は普段使いとしてHHKBを利用しているのですが,ホームポジションFキーJキーの感覚が少し狭いと感じて来てしまいました. この問題の解決策として,分離式のキーボードを買えば良さそうと思いました. しかしamazonで分離式で検索するとあまり出てこなく,とりあえずすぐに目についたこれをお試し感覚で買いました.

初期設定

このキーボードは初期のままだとCapslockMacの左Ctrlの場所に配置されており,Macユーザ的にはつらみが激しいので設定を変更します.

こちらのブログを参考にして設定を行いました.

nillpo.hatenablog.com

一応書いて置くと,

  • FN + < or > or ?の三レイヤーがあり,好きなレイヤーを選択する.すると右下の二番目のランプが点灯すると思います.
  • FN + 右下Ctrlを押すと,三番目のランプが点灯します.
  • 上書きしたいキーを叩きます.(今回だとCaps
  • 変更後のキーを叩きます.(今回だと左下Ctrl
  • PNキーを押して変更を確定し,その後FN + Ctrlを押して三番目のランプを消して変更完了です.

打ち心地

今回,僕は青軸のキーボードを買ったのですが,なかなか軽い感じで打てて今のところは最高です. しかしながらスペースをだいぶ取っており,少し窮屈になった気がしています. 次は机をより良いものにする案件が生えて,人生はなかなか難しいです.

まとめ

キーボードは,本当にたくさん種類があり,今後もいろいろ試していきたいと思います. みなさんもぜひキーボードライフをエンジョイしてくださいね.

学内でGitについてのハンズオン勉強会を行いました

発表資料

speakerdeck.com

スライドを作成するときの参考にした資料

gihyo.jp

今回のスライドは大体の部分を,GitHub実践入門を見て作成しました. この本の4章では,非常に小さなケースを対象にして,Gitコマンドを叩きながら覚えていくことが記述されていました. 小さなケースというのはREADME.mdをガシガシいじっていくやつです. やっぱREADME.mdすげぇなという感想です.

スライドには載せなかったのですが,コンフリクトも小さいケースで起こしていて,感動を覚えました.あとrebaseなどの歴史改変系も.

またgit-challengeは,一回も行ったことがなかったのですがこの機会に調べることができたので, 良い機会だったかなと思います.

まとめ

普段使いこなせているつもりでも意外と知らないものが多かったりして,改めて身近なものでもアウトプットすることは大事だなと思いました.

参考にしました.

github.com

VuePressを触ってみた

VuePress

vuepress.vuejs.org

VuePressは,Vue.jsが使える静的サイトジェネレーターです.今回はVuePressを使って,デモサイトをデプロイするまでやります.

準備

さっそく準備をしていきます.

以下のコマンドを実行します.

# create working dir
mkdir vuepress-test

cd vuepress-test

# install VuePress
yarn add -D vuepress

# create index page
mkdir docs

echo '# Hello VuePress' > docs/README.md

package.jsonに以下の記述を追加しましょう.

"scripts": {
  "docs:dev": "vuepress dev docs",
  "docs:build": "vuepress build docs"
}

その後,以下のコマンドでbuildやらができるようになります.

# make a dev server
yarn docs:dev

# build static site
yarn docs:build

他のページを作成し,リンクを貼ってみる

まずページを作成します.

cd docs

# 設定ファイル置き場もついでに作成
mkdir .vuepress

echo "# first page" > First.md

echo "# second page" > Second.md

README.mdにリンクを貼るため,以下の記述を追加します.

[First](./First.md)

[Second](./Second.md)

これはマークダウンなので,マークダウンと同じ構文で書けます.

navbarにもリンクを貼るために.vuepress/config.jsを作成し,以下の記述を追加します. ついでにサイトのタイトルも設定しています.

module.exports = {
  title: 'VuePress-Test',
  description: 'Just playing around',
  themeConfig: {
    nav: [
      { text: 'Home', link: '/' },
      { text: 'First', link: '/First.md' },
      { text: 'Second', link: '/Second.md' },
    ]
  }
}

その後,ビルドすると以下のような画面になっていると思います.

f:id:MitubaEX:20180515020454p:plain

faviconについて

fiviconに使いたい画像は,.vuepress/publicに配置しておきます. そして.vuepress/config.jsに以下の記述を追加します.

head: [
  ['link', { rel: 'icon', type: 'image/png', href: '/fivicon.png' }],
]

deployについて

www.netlify.com

今回はnetlifyを利用します.

デプロイのためにあらかじめリポジトリを作成して,pushしておいてください.

対象リポジトリとして,作成したサイトを選択し,Build commandは以下のように設定してください.

yarn add -D vuepress; yarn docs:build

その後,Publish directoryにdocs/.vuepress/distを指定します.

後はデプロイされるのを待って完了です.

まとめ

今回はVuePressを使って,雑な静的サイトを作成しました. マークダウンで文字を書いていけるので,すごくお手軽感がありますね.

まだcomponentなど,Vue.jsの機能を利用した拡張を行なっていないので,また今度触っていきたいと思います.

5/13 (日) ビットサミットに行って来た

5/13(日)のビットサミットに行って来ました.

ビットサミットって?

bitsummit.jp

5/12~13の二日間,京都のみやこめっせで開催されたインディーズゲームの祭典です.インディーズゲームを実際に触ったり,開発者のトークセッションなんかも見れたりと面白みに溢れたイベントです.

気になったゲームたち

CARTO

制作はSunhead Gamesさんです.

どういうゲーム?

  • フィールドを探索して地図の断片を手に入れていく
  • マップを開いて,その地図の断片を好きな場所に配置する
  • 新しい場所に行けるようになるので,その場所を探索する

Sunhead Gamesさんが動画を投稿していたので,これを見たらだいたいわかると思います.

面白いと思った点

地図のーマスーマスを自由に移動や回転させたりできるので,基本的にキャラクターを操作して目的の場所に向かうという時間を地図を操作することで,大幅に短縮できます.

マップを探索するゲームは個人的に大好物なのですが,一工夫をすることで効率よくゲームを進められる点が新しいなと思いました.

よくあるマップ移動として特定の場所をワープできる機能などはよくあると思うのですが,自分でワープする場所を決めるような感覚で地図の断片を操作できる点が非常に自由度が高くて良いです.

リリースされるのが楽しみです😍

ghostpia

制作は超水道 さんです.

どういうゲーム?

  • ジャンルはデンシ・グラフィックノベルというジャンル
  • ビットサミットで見せてもらったものは,多くのイラストでアニメーションのような躍動感を持ったノベルゲームという印象でした.

面白いと思った点

繊細なイラスト,音楽から作り出されるすごく幻想的な世界を感じました.まだシナリオは読んでないのですが,隙間を見つけてやって行きたいと思います.

Switchでのリリースも予定しているとのことなので,そちらも楽しみです😍

入れました💪

他やってないけど気になったゲームたち

まとめ

13日のみの参加でしたが,非常に楽しく過ごすことができました.また来年も行って,面白いゲームを探して行きたいと思います🙏

tmux + zsh + fzf + ghqでセッションを作成して,指定リポジトリに移動する処理

挙動

  • tmuxを開いている状態で,C-gを押すとghqでgetしてきたリポジトリのリストを取得する.
  • 移動したいリポジトリを選択する.
  • 新規セッションが作成され,そのセッションに移動する.

コード

これを.zshrcに書いたら動くと思います.

function create_session_with_ghq() {
    # fzfで選んだghqのリポジトリのpathを取得
    moveto=$(ghq root)/$(ghq list | fzf)

    if [[ ! -z ${TMUX} ]]
    then
        # リポジトリ名を取得
        repo_name=`basename $moveto`

        # repositoryが選択されなかった時は実行しない
        if [ $repo_name != `basename $(ghq root)` ]
        then
            # セッション作成(エラーは/dev/nullへ)
            tmux new-session -d -c $moveto -s $repo_name  2> /dev/null

            # セッション切り替え(エラーは/dev/nullへ)
            tmux switch-client -t $repo_name 2> /dev/null
        fi
    fi
}
zle -N create_session_with_ghq
bindkey '^G' create_session_with_ghq

エラーもみ消している感

こんな感じで動く

f:id:MitubaEX:20180502234529g:plain

参考にしました

ghq+fzf on tmux | matsub

blog.chairoi.me