Vim - 開いているファイルや選択しているコード行をGithubで開く
チーム開発をしている時など、「選択しているコード行のGithub URLが欲しい」ケースは多い。
URLで指定した行番号をハイライトしてくれる、こういうURL。
https://github.com/previm/previm/blob/12226fa0e3e807a6498cd6bd6de8af70278203fe/autoload/previm.vim#L64-L65
レビュー時やチャット上で共有する時に使う。
Vim上でサクッとやるには以下のどちらかのプラグインで実現できる。
vim-fugitive + vim-rhubarb
vim-fugitiveを入れるとgit管理下において:Gbrowse
コマンドが使えるようになる。
このコマンドはg:fugitive_browse_handlers
に設定されたハンドラを使用してURLを開く。
開きたいコードを行選択してから:Gbrowse
すればOK。もちろん行指定が不要なら引数なしでそのまま:Gbrowse
を実行すればいい。
このg:fugitive_browse_handlers
はもちろん自分で設定できるけど、vim-rhubarbを入れると勝手に設定してくれる。
(vim-rhubarbはhubを利用するためのプラグイン)
なお:Gbrowse
実行時に「fugitive: "origin' is not a supported remote」というエラーが出る場合はプラグインが古いので更新すること。
g:fugitive_browse_handlers
が空の場合は「fugitive: No Gbrowse handler found for '...'」といったエラーになる。
open-browser.vim + open-browser-github.vim
これは作者のtyruさんが紹介記事を書かれているのでそちらを参考に。
基本的な使い方は:Gbrowse
と変わらない。
http://tyru.hatenablog.com/entry/20130125/useful_vim_commands_for_getting_along_with_github
どっちを使う?
どちらも素晴らしいのでお好きな方でいいと思う。
hubを良く使う人はvim-rhubarbを入れておくと便利なのかもしれない。僕はほとんど使っていないので便利度は分からない。
open-browser-github.vimのtyruさんは日本人なので、困った時に質問しやすいかもしれない。
この記事のきっかけ
今回のケースに対応するコードを、僕は.vimrcに書き捨てで設定していた。
Vim環境を整理するにあたってそのコードを消して、:Gbrowse
が動くように四苦八苦した。
(最初はプラグインが古くて動かず、次にg:fugitive_browse_handlers
がなくて動かなかった)
あとになって「そういえばopen-browser-github.vimがあったな」と思い出して結局そっちを使うことにしたのだけど、せっかくなので調べたことを残しておくことにした。
Laravelのセッションに関するテストでSession name cannot be emptyが出て落ちる場合の対応
軽い気持ちでcomposer update
したらテストが落ちて、その調査と暫定対応をしたのでメモ。
エラーログ
PHPUnit\Framework\Exception: [2017-12-04 00:44:41] testing.ERROR: Session name cannot be empty, did you forget to call "parent::open()" in "Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler"?.
原因
AbstractSessionHandler
の2ヶ月前の変更による。
[HttpFoundation] Make sessions secure and lazy · symfony/http-foundation@55ca8d8 · GitHub
かつ、もう一つ。
テストケースにphpunitの@runInSeparateProcess
を付けていると落ちる。
ちゃんと原因を追っていないですが、別プロセスゆえにparent::open()
とparent::destory()
がバラバラになっているのかな。分かりませんが。
なんでこのアノテーションを付けているかというと、依存ライブラリのStaticファサードをモックにしたかったから。
PHPUnitで静的(static)メソッドのモック - Qiita
なお StaticMethods をモッククラスとして定義するので、別のテストで StaticMethods を呼ぶと意図しない結果になります。例えば、次のようなテストケースだと test1 の実行時に StaticMethods がモックとして定義されるので test2 のテストは通りません。 @runInSeparateProcess アノテーションを使えば test1 は別プロセスになるので回避できます。
前も@runInSeparateProcess
の挙動でハマったから、これ使いたくない。
その場合はStaticファサードをラップするクラスを自分で用意する必要がある。
対応
ちゃんとやっている余裕はないので暫定対応。
上記のコードを読むとsession.use_cookies
を使っていることが分かるので一時的にoffっている。
# これをテストコードの適当なところに書く ini_set('session.use_cookies', false);
結論
テスト大事。
とはいえ、今回は「テストでしか落ちない」ケースではあるんだけど。
TRCとopenBDを利用した新刊一覧を表示するサイトを作った
こちらのニュースを今日知りました。
数日前にアナウンスがあったようですが、見落としていました。
せっかくなので、無料かつ飽きない程度の実装で「新刊一覧」サイトを作りました。
サイトはこちらです。 https://trc-opendata-viewer.herokuapp.com/
よろしければご覧ください。
そんなアクセスされないと思いますが、無料枠なのでアクセスが多いとダメかもしれません。
サイトの概要
上記サイトにある「TRC新刊図書オープンデータ」を利用しています。
zipのtsvに書かれているISBNの一覧を元に表示しているだけです。数件ISBNがないデータがありますが、それは表示されません。
書影にはopenBDを使わせてもらっています。
よって、openBDに書影がない本は書影部分が表示されません。
(残念なことにファーストビューの本は全部ない)
検索等、凝った仕組みはありません。現状、追加開発する予定もありません。
それらを作り込もうとするとTRCのデータだけではダメで色々面倒だからです。
タイトルや書籍名の絞込実装ぐらいは出来ますが、個人的にその必要性をまだ感じていません。
(具体的な名前が分かっていればググるので、一覧でどうこうする必要がない)
zipの更新
zipは毎週更新されるようですが、現状はまだ1つしかないので自動更新は考えていません。
(ローカルのzipを読んでいます)
この辺りはどうしようか考え中です。
こちらの非公式アーカイブを利用させて頂こうかなと思っていますが、ひとまず様子見です。
https://github.com/takahashim/trc_opendata
現状の使い勝手
正直、自分でも使っていくかどうか微妙。
なんとなく書影を眺めているのは楽しいけど、リピーターになるにはもっとUIが洗練されないといけないと思う。
利用者としてページングが面倒なのだけど、インスタみたいなローディング方式にするのも微妙かなあと思ったり。どうなんだろう。
PHPのnull[0]はエラーにならないしnoticeも出ない
背景
null変数に添字アクセスするところで、落ちると思っていたら落ちなくてびっくりした。
環境
OSX 10.11.5
PHP 7.0.14 (cli) (built: Apr 1 2017 23:41:23) ( NTS )
Copyright © 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright © 1998-2016 Zend Technologies
再現
まずは普通の配列に対して、存在しない添字アクセスをするとどうなるか。
<?php $a = []; var_dump($a[1]);
上記コードを実行すると、以下のようにnoticeを出力する。
Notice: Undefined offset: 1 in /Users/kanno/workspace/sandbox/piece/2017/06/25-1036.php on line 4 PHP Notice: Undefined offset: 1 in /Users/kanno/workspace/sandbox/piece/2017/06/25-1036.php on line 4 NULL
ではnullに対して添字アクセスしてみる。
<?php var_dump(null[0]); var_dump(null[1]);
上記コードを実行するとnoticeが出ない。というかエラーにすらならない。
NULL NULL
わお…。
ちなみに勝手に配列になったりしないかどうかも確認したが、さすがにそれは大丈夫だった。
<?php $a = null; var_dump($a[1]); var_dump($a);
NULL NULL
ちなみにforeachもいけちゃうのかと思いきや、これはwarningだった。
<?php foreach (null as $x) { }
Warning: Invalid argument supplied for foreach() in /Users/kanno/workspace/sandbox/piece/2017/06/25-1036.php on line 2 PHP Warning: Invalid argument supplied for foreach() in /Users/kanno/workspace/sandbox/piece/2017/06/25-1036.php on line 2
count(null)
は0だから普通のfor文ならいけちゃうけど。
<?php for ($i=0; $i < count(null); $i++) { }
Gaucheで指定文字を指定回数繰り返す書き方
背景
Gaucheで指定した文字を指定した回数だけ繰り返したい。
Rubyでいう"a" * 5
、PHPでいうstr_repeat('a', 5)
のようなこと。
irb(main):002:0> "a" * 5 => "aaaaa"
目的は受け入れテストにて「x文字以上ならエラー」というケースでx文字を簡単に用意したかったから。
(Vimですぐ出来るけど、練習のためにGaucheのやり方を調べた)
結論
1文字の繰り返しでいいならmake-string
。
gosh> (make-string 5 #\a) "aaaaa"
文字列で繰り返したいならリストを作ってからapplyする方法っぽい。
gosh> (apply string-append (make-list 5 "Vim")) "VimVimVimVimVim"
ちなみにClojureでも似たような感じっぽい。
user=> (apply str (repeat 3 "str"))
追記: 他の書き方も教えて頂いた。
文字列ポートを使えばこんな風にもかけますね。 文字列の繰返しに限って言えば多くの場合はリストを作ってから apply の方が効率的だと思いますが。 pic.twitter.com/d4lgfSgXiE
— 齊藤敦志@仕事ください (@SaitoAtsushi) 2017年6月24日
調べ方
まずはGaucheのドキュメントをrepeat
とかcycle
とかのキーワードで探したが辿り着けず。
GaucheというよりSchemeでの書き方が分かればいいはず、ということでググっていたら以下に辿り着いた。
色々な言語での実装例があって面白かった。 Repeat a string