git branch を fzf で選択していい感じに一括削除

git branch を fzf で選択していい感じに一括削除

git の branch を fzf で選択して削除するというもの

git-remove-branch()
{
  local branchs q k results
  while out=$(
    git branch | sed -e 's/\*//g' -e 's/\ //g' \
               | sed -e 's/master//g' -e 's/develop//g' \
               | fzf --ansi --multi --no-sort --reverse --query="$q" \
                     --print-query --expect=ctrl-d); do
    q=$(head -1 <<< "$out")
    k=$(head -2 <<< "$out" | tail -1)
    branchs=$(sed '1,2d' <<< "$out" | awk '{print $1}')
    branchs=("${(@f)$(printf $branchs)}")
    [ -z "$branchs" ] && continue
    if [ "$k" = ctrl-d ]; then
      for branch in $branchs; do
        git branch -D $branch
        if [ $? -eq 0 ]; then
          results=($results $branch)
        fi
      done
      printf "\n\e[31m Deleted branchs:\e[0m\n"
      for result in $results; do
        printf "\t\e[32m $result\e[0m\n"
      done
      printf "\n"
      break
    fi
  done
}

Ctrl-i で 複数選択後,Ctrl-d で削除

f:id:maxmellon:20160925031448g:plain

React 用 の Slider UI plugin つくりました

react-simple-slider

github.com

趣味アプリ作ってる時に既存のものを利用しようと思ったのですが, 既存のものがビミョだったので,1から作りなおしました.

(具体的には,デザインを変えづらかった,DOM構造が複雑だった.個人的にもっとシンプルなのが欲しかった)

使い方

      <Slider
        height={20}
        width={300}
        default={150}
        max={300}
        onChange={onChange}
        backStyle={{ backgroundColor: 'black', }}
        frontStyle={{ backgroundColor: 'red' }}
      />

みたいな感じです.

なるべくシンプルになるようにしました.

ref を指定すると

const value = this.refs.slider.getValue();
this.refs.slider.setValue(value);

みたいな感じで setValuegetValue を利用することができます.

EventEmitter Speed BATTLE!!!!

eventemitter比較しました.

javascript といえば,eventemitter, eventemitter といえば,javascript

(たぶん)

そんな,Eventemitter のベンチマークを書きました.

  • 調査対象.

    • node の標準搭載のEventEmitter
    • EventEmitter2
    • EventEmitter3
    • EventEmitter4
    • fast-event-emitter (計測時はEventEmitter5としています)
  • 参考にしたサイト

yosuke-furukawa.hatenablog.com

ここのeventemitterのベンチマークを勝手ながら流用させていただいています.

gist.github.com

結果発表

// EventEmitterHeatUp x 1,854,119 ops/sec ±3.33% (81 runs sampled)
// EventEmitter x 1,941,173 ops/sec ±2.13% (80 runs sampled)
// EventEmitter2 x 3,324,465 ops/sec ±2.08% (84 runs sampled)
// EventEmitter3 x 1,239,810 ops/sec ±1.57% (85 runs sampled)
// EventEmitter4 x 236,741 ops/sec ±1.42% (92 runs sampled)
// EventEmitter5 x 3,572,485 ops/sec ±1.81% (87 runs sampled)

// Fastest is EventEmitter5

5 > 2 > 1 > 3 >4 の順で速度がはやいみたい.

emit() の反応速度は,一概に新しい奴が早いわけではないみたい.

5 はまだスター数がそこまで多くないので様子見. 3 はon の第2引数にundefined入れても例外が投げられず,よくわからないとこでコケる. これからは,eventemitter2 を使うことにします.

ネイティブモジュール非依存のマルチプラットフォームで音を鳴らすことのできるnode-moudleを作った

github.com

背景

Electronアプリで通知音を鳴らしたいが,音にまつわるモジュールがネイティブ絡んできて辛い. かつ,DOMのaudioを使いたくないという場面があった.

ネイティブが絡むと,node-gypを使ったりしてビルドが若干めんどくさくなるし, ちょっと音を鳴らしたいだけの時には重いモジュールが多いように感じた.

そこで,できるだけミニマムかつシンプルなモジュールを作成した.

利用方法

nodeのコードでは次のように使える.

var simplayer = require('simplayer');

var musicProcess = simplayer('/path/to/sound.mp3');

var musicProcess = simplayer('path/to/song.mp3', function (error) {
  if (error) throw error;
  console.log('end of song!');
});

require('simplayer') することで得られる関数を呼び出すとchild_processインスタンスが帰ってくる. なので,再生した音楽を監視したりするのであれば,child_processと同じように扱えば良い.

注意としては,windowsはwavフォーマットのみ対応 ということである. powershell というか, .NET の System.Media.SoundPlayer でmp3を再生する手段があれば教えていただきたい.

一応,cliも提供している.グローバルインストール後に,

simplayer /path/to/sample.mp3

すれば,実行できる.

実装

イデアは,openerを参考にした. openerは,各プラットフォームごとにファイルを開くコマンドをchild_processでspawnしているだけの シンプルなモジュールだ.macでいうopenや,windowsでいうcmdそものもが便利なのもあって非常に使いやすい.

openerと同じように各プラットフォームの音楽再生をするコマンドをよべば,音楽でも似たようなことが実現できる. ...と思っていたが,windowsには音楽を再生するコマンドはない.

そこで,このモジュールでは,powershellを使うことにした. powershellを通せば,.NETが提供している様々なものが使える. 今回は,System.Media.SoundPlayer を使って音を鳴らすことにした.

powershell.exe -NoExit (New-Object System.Media.SoundPlayer path\to\sound.wav).Play()

のようにすると,即席でwavファイルを再生できる.-NoExit オプションを付与している理由は, 音楽の再生が終了する前に,powershell.exeのプロセスが終了してしまうからだ.

他のプラットフォームは,macでは,afplay, linuxではaplay(ALSA) を用いるようにした.

作ってみて

30行程度の関数をモジュール化するのかどうか迷ったが,openerがものすごい利用されているのを見て, 公開しようと思った.

オレオレテキストドキュメント用プラグイン vim-tmngつくった

f:id:maxmellon:20151216004107p:plain

github.com

SLP内のvimmerは,Star or Contribute してほしいな(チラチラ.star1つですごくモチベーションにつながる

vim-tmngとは

SLPや研究室の議事録でよく使われるドキュメントフォーマットである”TmngDocument(たまねぎドキュメント)” を Syntaxハイライトするvimプラグインです. TmngDocumentの特徴としては,■, ●,◎,○などのマーカーを多用します.

SLPとは、香川大学工学部のプログラミングサークルである

対象ユーザー

  • 主に僕
  • SLP内のひよっこvimmerからベテランvimmerまで.
  • TmngDocument形式で大量のドキュメントを書く必要のあるゼミ生

背景

ほんとは,markdownとかそういうかんじのナウでヤングなフォーマットのドキュメントが書きたかった. でも,我らボスの意向や,過去のドキュメントの関係からフォーマットを変更することはムズいとのことだ. なら,そのフォーマットに合わせて便利ツールつくればいいじゃん! エンジニアのひよっこなんだから,見のまわりを便利にするツールくらい自作したい!

最低限の機能要求

  • とりあいず色
  • テンプレートの生成
  • ,.の置換
  • 80文字以内での折り返し

現状,この要求は満たしている

demo

f:id:maxmellon:20151216005050p:plain

こんな感じで色つきます,スペースが全角だったり,入ってなかったりしていると色がきえるので,TmngDocument形式を覚えていないSLP1年生にも優しいです!

こだわりポイント

docment

僕はすごく英語が苦手だ.なので英語はできるだけ書きたくないし自信もない. だけど,vimのためなら英語でドキュメントが書けた.これはすごいことだ.vimはプログラミングの勉強にもなるし,開発も円滑にするし,英語の勉強にもなる.しかも,就活で話すネタにもなる.vimって最高だよね.

test,lint

微量ながら単体テストのコードを書いている.テスティングフレームワークには,vimspecを利用している. vimspecを採用した理由は,非常にシンプルで提供しているものが非常に少なくミニマルなものだからだ.機能をたくさん提供するプラグインではないので,これで十分だった. 一応,TravisCI上でもテストしている.

いまは,関数のテストしかできていない.syntaxハイライトが付いているかどうかをテストする方法や,テスティングフレームワークがあれば,教えてほしい. 将来的には,vim-vspec などに乗り換えたい

testだけではなく,vint というlintツールを使ってお行儀のよいプラグイン作りを目指している. ツールがたくさんあってすごくべんり.

今後の課題

  • TmngDocument→課題ページ

僕がほしい.(課題ページとは,研究室内で数年後の後輩のためや,データを蓄積を目的としたHTML静的ページの集合)

  • vim内からのPOST

ドキュメントを管理するAPIサーバーを用意してvim-tmngから叩いてPOSTできるようにとうにとかしてみたい.

  • tmng-lint

このプラグインとは直接は関係がない.けどほしいもの.

TmngDocumentは,先輩の添削が推奨されている.しかしセンパイもいつも暇なわけではない. lintがあれば,後輩たちはある程度最低限フォーマットを整えた状態にすることができる. そうすれば,後輩もdocumentを書きやすくなるし,先輩も添削する時間が少なくてすむ.

つくってよかったこと

vimプラグインがどうやって作られているか深く理解することができた. 自分の成長とともにvimも成長していくのがすごく嬉しい. 苦手な正規表現や英語にも,vimを通せばガンガン勉強できる.さいこうだ

初めて作ったプラグインとしては,個人的には非常に満足できるものとなった. 引き続き拡張を続けていきたい.

あと個人的に良かった(すごくすごく)ことは,大学に入ってプログラミングを知った学部1年生が,Contributeしてくれたことです.

僕が学部1年のときは,gitやgithubどころかプログラミング言語を授業でしか書いたことがなかった.しかもC言語だけ.

そう考えるとほんと感動的

Let's VIM Life !!!!

人類はもっとvim本来の機能を使うべきだった

反省

自分は、vim本来の機能を使いこなす前にpluginの力に染まってしまった。 そのことを強く後悔している。デフォルトのmappingを潰し,vimrcをメタボ化させ... そういったvimmerが今後増えないように,今回はこのアドベントカレンダーを通して vim本来の素晴らしさを伝えたいと考えている. vim本来の機能に詳しくなることは,vimrcのダイエットにも繋がる.

はじめに

所属サークルにいるvimmerが使っていなさそうな機能に焦点を当てているので, 若干紹介している機能に偏りがある恐れがあります. vim本来の機能について網羅して知りたい人は,vim-helpを熟読しましょう.

あ,SLP KBIT アドベントカレンダー2015 12日目です

www.adventar.org

便利機能

  • <C-o> : 直近のジャンプポイントへジャンプする.

まずjumpのvim help を見てみよう. (vimmerググる前にvim helpを見るべし)

==============================================================================                                                                                
8. ジャンプ                                     jump-motions                                                                                                  
                                                                                                                                                              
「ジャンプ」とは次のコマンドのどれかを意味します: 新しいファイルの編集を始める                                                                                
コマンドと、"'", "`", "G", "/", "?","n", "N", "%", "(", ")", "[[", "]]",                                                                                      
"{","}", ":s", ":tag", "L", "M", "H" です。これらのコマンドのうちのどれかを                                                                                   
使ってカーソルを「ジャンプ」させた場合、ジャンプする前のカーソルの位置は覚えて                                                                                
おかれます。その位置を含む行を削除したり変更したりしていなければ、"''" と                                                                                     
"``" コマンドを使ってその位置に戻ることができます。

helpを見たとこで私が実際に使用するタイミングを紹介したいと思う. 例えば,javaソースコードvimで書いていたとしよう.その際,おそらく不要なimport文の削除や, import文の追加,package名の修正がしたい時が来るだろう.そのとき, gg でページトップに 行くとする.ggで1行目に移動したものの十中八九,その作業を終えたあとは,前の位置に戻りたいだろう. そこで <C-o> をタイプする.そうすると,前回編集した場所に移動することができる. jumpするポイントは :jumplist で確認することができる. jump地点の登録は,"'", "`", "G", "/", "?","n", "N", "%", "(", ")", "", "",
"{","}", ":s", ":tag", "L", "M", "H"を利用した時に登録される

とりあいず少し前の位置に戻りたいときは押して見る.使っていくうちにどこに飛ぶかがわかってくると思います. <C-o>も数字と組み合わせることができます. 3<C-o>だと,3つ前のジャンプポイントに移動します. vimマッピングは組み合わせの幅がとても広いので積極的に使っていきましょう.

  • gf : カーソル位置の文字列をパスとみなして,そのファイルを編集する

たとえば,C言語を編集していたとする.その時に自分で作成したヘッダファイルをインクルードするとする. そうした時,よくヘッダーファイルを編集したい時が出てくる.そういった時,このマッピングの出番だ.

#include "../path/to/hea■er.h"  

このとき,にgfをタイプすることで,ヘッダファイルに移動することができる. これは,ファイルだけではなく,URLにも適用できる. markdownにリンクを埋め込むとき,ちょっとサイトを確認したい時にも活用できるのでぜひ覚えておこう.

  • <C-^> : 直前のバッファに移動する

これは,gf と組み合わせると非常に強力です. gfして移動したファイルの先で,<C-^>をタイプすることで直前のバッファつまり移動前のファイルに移動することができます.

  | file A |   gf ----------->  | file B |
               <---------- <C-o>
  • オペレータ,テキストオブジェクト

vimの各種mappingは,オペレータとテキストオブジェクトの組み合わせで出来ています. オペレータ,テキストオブジェクトについて知らないサークル生も居るかもしれませんが, ひとまず一覧を見てみましょう.

オペレータ一覧 ※1

マッピング 動作
c 変更する
d 削除する
y yankする

※1 他にもたくさんのオペレータがありますが,ここでは多用するこの3つにしぼります.

マッピング 範囲
aw iw word
a( i( a) i ) () ※2
a" i" ""
a' i' ''

※2 括弧の種類を変更すると対応した括弧に

これらを組み合わせることで,直感的にテキストを編集することが出来ます. 例えば, ciw としましょう. 覚えかたは, change inner word です. ちなみに,cawだと単語の外側の空白を含めて削除します.

Normalモードで以下のカーソル位置でciwすると

i am a hogep■ge
i am a ■

となります.

vimにおける,オペレーターcは,削除してインサートモードに入るを指します. すなわち変更するということですね.

ciwfoobarと入力することで

i am a hogep■ge
i am a ■
i am a foobar

となることがわかります. ciw,ci" di" ci' di' yiw 当たりはほんとによく使うので覚えておいて損はないです.

ここからは,上級生もあんまり使ってなさそうな機能を紹介していきたいと思います.

  • QuickFix

まずは,helpを見てみる.

=============================================================================
1. QuickFixコマンドの使い方                     quickfix Quickfix E42

Vimには編集-コンパイル-編集のサイクルを加速するための特別なモードがある。これ
はAmigaのManx's Aztec C compilerのquickfixオプションにインスパイアされた。Cコ
ンパイラから出力されたエラーメッセージをファイルに保存し、Vimでそのエラーにジャ
ンプするというアイディアである。エラーメッセージを全部覚えておかなくても、それ
ぞれの問題を検証し、修正することができる。

QuickFixコマンドはより一般的に、ファイル中の位置のリストを作成し、ジャンプする
ために使うことができる。例えば、:vimgrepはパターンにマッチした位置をリストす
る。スクリプト中でgetqflist()を使ってこれらの位置を参照することができる。
そのため、編集・コンパイル・修正のサイクル以外にも多くの事に利用できる。

AmigaでManx's Aztec C compilerを使っているなら、Vimと連携させる方法について
quickfix-manxを見よ。別のコンパイラを使用するならば、エラーメッセージを一度
ファイルに保存してVimを "vim -q filename" で起動する。これをする簡単な方法の1
つはコマンド:makeである (後述)。各コンパイラからのエラーメッセージを解釈させ
るためには、オプション 'errorformat' をセットする (下のerrorformatを参照)。

QuickFixは,makeやgrepの出力をwindowに出すことができ,表示された行の上で, <Enter>をタイプすることで,該当ファイルの該当行にジャンプすることができるというものだ.

よくあるのが,vimを一旦閉じ,コマンドラインagしてその結果を目で見て, ファイルを一つ一つ開き,再度vimを開き :行数 で該当箇所に移動している例. これ,vimgrepQuickFixを使えば,vimを閉じずに高速で同じことが出来ますよ!

f:id:maxmellon:20151211032418g:plain

他にも,makeやコンパイルの結果をQuickFixに出力することも出来ます. エラー位置一覧が出るので,すぐに修正が可能です!(多分名前の由来はここから)

f:id:maxmellon:20151211033136g:plain

QuickFix-windowを自動的に使う場合には以下の設定を追加します.

augroup QuickFixCmd
  autocmd!
  autocmd QuickFixCmdPost *grep* cwindow
augroup END

ctags

==============================================================================
5. タグファイルの書式                           tags-file-format E431

                                                ctags jtags
tagsファイルは "ctags" のような外部コマンドによって生成される。それはそれぞれ
の関数へのタグを含んでいる。"ctags" のあるバージョンでは "#defined" マクロや
typedef、enumなどに対してもタグを作ることができる。

コマンドラインctags -R .でタグを作成することができ, vim内で<C-]>をタイプすることで定義元にジャンプすることが出来ます. tagsfileの生成を自動化するプラグインもありますが, まずはvimの機能のみの状態で使うことをおすすめします.

f:id:maxmellon:20151211034536g:plain

関数の定義元にジャンプしたいときは,とても多くかなり作業効率を上げます. ctagsを使うことによってIDEにも負けない大胆な移動が出来ます.

まとめ

  • vim本来の機能だけですごく高機能.
  • pluginをよく理解せずに導入するのは危険,よくない.
  • /*連打を 多用するのではなく,vimgrepを使おう.
  • うちのサークルには,QuickFixを使うvimmerがほとんど居ない.もったいない.
  • もっとhelp読もう

この記事では,一部を除いて移動に関する機能を中心に紹介を行いました. サークルメンバもjを連打して移動するvimmerではなくて,少ないタイプ数で効率よくエディットできる,vimmerを目指しましょう!

Let's Vim Life !!!!!

参考サイト

http://www.infiniteloop.co.jp/blog/2011/11/vim-operator/

150日連続Contribute達成した.

f:id:maxmellon:20151108145658p:plain

githubのアカウントを作成(リニューアル)して,丁度今日で1年が経った. github上のContributionStreakも150日を達成した. 毎日コミットすることを意識してから,とても技術力が高まったように感じている.

150日前に出来なかったことで,今できるようになったことがとてもたくさんある.

などなど.

これからも毎日コミットすることを心がけていきたい.

毎日プログラミングすることで,自分自身の時間が少なくなっているのではないかと 思われがちだが,毎日コミットすることで開発力,開発速度が高まり, 逆に自分自身の時間も増えているように最近は感じている.

365日までに頑張りたいことは,今温めているWebアプリケーションを,完成まで持っていくことと, 新しく,electronを用いたクライアントアプリケーションの作成に挑戦したいと考えている.

最終的には,1000dayくらい目指したい.