読者です 読者をやめる 読者になる 読者になる

RSpec で pending しても before :context が呼ばれてしまう

結果だけ先に書いてしまいますが『pending しているスコープで before :context を定義すると before のブロックが呼ばれます』。 どういうことかというと次のように before :context 内で例外が発生した場合、テストが失敗してしまいます。 describe X do #…

Ruby の Method#=== が定義されていないのでつらい問題

Method#=== が定義されていなくてつらい問題です。 Proc#=== Proc オブジェクトでは #call で評価することが出来ますが、そのエイリアスとして #=== が存在します。 upcase = proc { |a| a.upcase } upcase.call "homu" # => "HOMU" upcase === "mami" # => …

Ruby で mixin したモジュールを削除する gem をつくった

Ruby でメタプログラミングをやっているとどうしても『mixin したモジュールを削除したい』という欲求にかられるのでつくりました。 インストール $ gem install unmixer 使い方 require "unmixer" # Unmixer は refinements を使用してるので using して使…

【初心者C++er Advent Calendar 2016 21日目】C++ でプリプロセスマクロを使う場面

C++

初心者C++er Advent Calendar 2016 21日目の記事です。 さて、巷ではマクロを使用したコードを公開すると『static const を使え』や『typedef しろ』、『関数テンプレートでおk』などと斧が飛んでくる突っ込まれることが多いです。 これは C++ では『基本的…

Ruby 2.4 で refinements の制限が緩和された

さて、先日 Ruby 2.4 がリリースされました。 Ruby 2.4.0 リリース [refinements の制限を緩和] Ruby 2.4 では refinements の制限が緩和され、#send からも refine されているメソッドが呼び出せるようになりました。 class X; end module Ex refine X do d…

【初心者C++er Advent Calendar 2016 20日目】関数テンプレートの呼び出しに優先順位をつける

C++

初心者C++er Advent Calendar 2016 20日目の記事です。 クリスマスが終わって『もはや Advent Calendar とは…』となってるんですが、まあ埋まってないより埋まってるほうがいいかなーと。 今回は初心者向けかどうか怪しい内容ですが、ちょっとしたハックでも…

【初心者C++er Advent Calendar 2016 19日目】C++ 楽しいメタプログラミングしよう

C++

初心者C++er Advent Calendar 2016 19日目の記事です。 クリスマスから少し過ぎてしまいましたが、最後に楽しくメタプログラミングしてみる記事でも。 初心者C++er Advent Calendar 2016 が全部うまるといいですね。 [メタプログラミングとは] メタプログラ…

【初心者C++er Advent Calendar 2016 17日目】C++ で型と値を理解する

C++

初心者C++er Advent Calendar 2016 17日目の記事です。 初心者ネタに型と値の話でも。 [値とは] C++ における値とは数値や文字列、クラスのインスタンスなどを指します。 // 数値や小数 42 3.14f // 文字や文字列 'c' "homu" // クラスのインスタンス std::s…

【初心者C++er Advent Calendar 2016 11日目】C++ で型によるコンパイル時条件分岐技法まとめ

C++

初心者C++er Advent Calendar 2016 11日目の記事です。 空いてるようなのでまた書きました。 さて、初心者用ということで型を使用した『コンパイル時条件分岐技法』を簡単に紹介してみます。 [注意] 本記事では C++11 で動作することを想定してるコードにな…

【C++ Advent Calendar 2016 13日目】C++ で楽しく Expression Templates しよう

C++

C++ Advent Calendar 2016 13日目の記事です。 13日目が空いてるようなのでちょっと Expression Templates というマニアックなネタでも。 まあ C++ プロの方なら Expression Templates なんて余裕ですよね。 [注意] 本記事のコードは基本的には C++14 に準じ…

【C++ Advent Calendar 2016 22日目】C++ で enable_if を使うコードのベストプラクティス

C++

[追記] @pink_bangbi typename std::enable_if<..., std::nullptr_t>::type* = nullptr の * は余計ではありませんか。これだと nullptr_t にする意味が— akinomyoga (@akinomyoga) 2016年12月22日 すみませんすみません、修正しました。 [本編] C++ Advent …

unite-oldfiles つくった

Vim

最近 v:oldfiles というのが流行ってるらしいのでつくった。 [プラグイン] osyo-manga/unite-oldfiles NeoBundle "osyo-manga/unite-oldfiles" 最近は unite.vim よりも denite.nvim が主流らしいがわたしは使用していない。

【初心者C++er Advent Calendar 2016 13日目】予約済み識別子に注意しよう

C++

初心者C++er Advent Calendar 2016の13日目が空いてるようなの書きました。 本記事は初心者C++er Advent Calendar 201613日目の記事になります。 初心者C++er Advent Calendar 2016では 3回目の記事になりますが、今回は予約済み識別子の話です。 [予約済み…

RSpec のマッチャで === を使う

通常 eq を使用すると == が使われるんですが、これを === で比較したかった。 このように任意の演算子でテストしたい場合は次のように書ける。 expect(9).to be > 6 expect(3).to be <= 3 expect(1).to be < 6 expect('a').to be < 'b' expect(String).to b…

【初心者C++er Advent Calendar 2016 8日目】関数テンプレートと関数オブジェクト

C++

タイトルは釣りです。 初心者C++er Advent Calendar 2016 8日目の記事になります。 8日が空いていたので簡単なものを書きます。 前回の記事を書いたあとに (省略されたtemplateのが気になった)— Sd2E 002/100 (@chiwawa_star) 2016年12月6日 と、言われたの…

【初心者C++er Advent Calendar 2016 3日目】C++ で型推論(auto)しよう

C++

初心者C++er Advent Calendar 2016 3日目の記事です。 3日目が空いてるようなので書いてみました。 今回は初心者向けの Advent Calendar ということで軽めの記事になります。 また、本記事では C++14 を基準としたコードになります。 [C++ で型を書く場面] …

【Ruby Advent Calendar 2016 1日目】 Ruby でブロックを簡潔に定義する

Ruby Advent Calendar 2016の1日目の記事になります。 わたしはあまり Rails と言ったフレームワークや Ruby がよく利用されてる Web 界隈には詳しくはないので、本記事は Ruby という言語に関するネタになります。 [Ruby といえば] さて、表題のブロックで…

Ruby の Hash でキーが存在しなかった時の初期値を設定する

table = [] table[index] ||= [] table[index] << name みたいに [] で初期化するようなコードは table = Hash.new { |hash, key| hash[key] = [] } table[index] << name という風に .new に渡すブロック内で値を初期化することができる。

起動時に xmodmap の設定を反映させる

xmodmap でマウスのボタンを入れ替えたんですが、これだけではログイン時に設定が反映されませでんした。 [~/.xinputrc に読みこむ設定を追加する] ~/.xinputrc に以下の設定を追加する必要があります。 if [ -f ~/.xmodmap ];then xmodmap ~/.xmodmap fi こ…

Vim の map() や filter() に渡すラムダ内で v:val や v:key が使用できる

Vim

ちょっとした小ネタですが、従来、map() や filter() に渡す文字列式の中では v:val や v:key を使用することが出来ます。 echo map([1, 2, 3], "v:val + v:val") " => [2, 4, 6] echo filter({ "mami" : 1, "mado" : 2, "homu" }, 'v:key =~ ''^m''') " => …

Ruby の正規表現でパスをいい感じに記述する

例えば、Ruby の正規表現内でパスを含む際に /^\/path\/to\/hoge.*/ みたいに書くことがあると思います。 この時にパスの / は \/ という風にエスケープして記述する必要があります。 [%r を使う] こういう時に %r を使うと綺麗に書くことが出来ます。 %r{^/…

Ubuntu でマウスのボタンを入れ替える

最近新しいマウスを購入したんですが、サイドに付いてるボタンの配置が以前つかっていたマウスと逆だったので設定を変更しました。 [xmodmap を使って入れ替える] xmodmap を使うのがよさそうだったのでやってみました。 設定は ~/.xmodmap ファイルに記述し…

Vim 8.0 で追加された関数 json_decode()/json_encode()

Vim

Vim 8.0 では JSON 形式のデータを扱う機能が追加されました。 [注意] Vim のヘルプを日本語翻訳してるvimdoc-jaですが、まだ最新版の Vim のヘルプに追従しておらず jsondecode()、jsonencode() と表記されていますが、正しくは json_decode() と json_enco…

Vim 8.0 で追加された定数 v:t_TYPE

Vim

Vim 8.0 では新しく type() が返す値が v:t_xxx のような定数として追加されました。 v:t_bool Value of Boolean type v:t_channel Value of Channel type v:t_dict Value of Dictionary type v:t_float Value of Float type v:t_func Value of Funcref type…

#tap で任意の戻り値を返す

以前も書いたような気がしますが、#tap で任意の戻り値を返したい場合は break を使用します。 # #tap は通常自身を返す p 10.tap { |myself| myself + 32 } # => 10 # #tap で戻り値を返したい場合は break を使用する p 10.tap { |myself| break myself + …

パソコンを新しくした

久々に金が手に入ったのでメインで使用してるデスクトップパソコンを新しくしました。 もちろん自作です。 流石にこの時代に Core2Duo はつらかった。 [構成] 【CPU】Core i7 6700K BOX 【CPUクーラー】虎徹 SCKTT-1000 【メモリ】CMK16GX4M2A2666C16 [DDR4 …

Vim の funcref() した関数を削除した時の挙動

Vim

ふと、気になったので試してみました。 [funcref() した後に :delfunction する] function! Test() return "test" endfunction let F = funcref("Test") delfunction Test echo F() " E933: 関数は削除されました: Test " E15: 無効な式です: F() まあ、これ…

Ruby の Symbol#to_proc に引数を渡す拡張

『[1,2,16].map(&:to_s(16)) みたいにかきたいよねー』というやつ。 class Symbol def call *args, &block proc { |myself| myself.send self, *args, &block } end end p [1, 2, 16].map(&:to_s.(16)) # => ["1", "2", "10"] #call を定義してこういう風に…

Ruby で alias_method の元の名前を取得する

RUby で alias_method した元の名前を取得したい場合 Method#original_name で取得することが出来ます。 class X def homu "homu" end alias_method :mami, :homu alias_method :mado, :mami end x = X.new p x.method(:homu).original_name # => :homu p x.…

RSpec で指定した行のテストのみ実行する

rspec に渡すファイル名の末尾に ファイル名:行番号 と指定すればその行番号のテストのみが実行されます。 $ rspec path/to/hoge_spec.rb:42 これで42行目に関連してるテストが実行されます。

rake spec で特定のファイルのテストを実行する

rake spec で特定のファイルのテストを実行したい場合、次のようにして SPEC にファイル名を設定して実行します。 $ SPEC=spec/path/to/hoge_spec.rb rake spec

Ruby の binding オブジェクトからローカル変数にアクセスする

Binding#local_variable_get でローカル変数にアクセスする事が出来ます。 def func a, b add = a + b # このメソッド内のコンテキストを返す binding end context = func 1, 2 # #local_variable_get でコンテキストの変数を取得する p context.local_varia…

Ruby の binding オブジェクトと eval()

Ruby では現在のスコープのコンテキストを bindig オブジェクトとして扱う事が出来ます。 def func a, b add = a + b # このメソッド内のコンテキストを返す binding end p func 1, 2 # => #<Binding:0x00000000c0fe18> [binding オブジェクトと #eval()] bindig の利用方法はいくつか</binding:0x00000000c0fe18>…

Vim 8.0 で追加された関数 funcref()

Vim

Vim 8.0 で新しく funcref() という関数が追加されました。 これは function() と同じように関数参照を取得する関数になりますが、『関数が上書きされても元の関数を呼び出す』という違いがあります。 function! Test() return "Test" endfunction let Funct…

Boost 1.62.0 がリリース

C++

最近はあまり Boost も触っていないが Boost 1.62.0 がリリースされたらしい。 今回は新しく以下の2つのライブラリが追加された。 Fiber QVM 両方共、昔から提案はされていたもののなかなか組み込まれなかったので、今回追加されたのは感情深い。

Vim 8.0 で追加された関数 exepath()

Vim 8.0 で新しく exepath() という関数が追加されました。 これは『絶対パス、相対パス、または $PATH の中に存在する場合は、そのフルパスを返す』という関数になります。 echo exepath("gvim") " => /usr/local/bin/gvim echo exepath("ruby") " => /usr/…

Vim 8.0 で追加された機能 closure

Vim

Vim 8.0 では関数に closure 機能が追加されました。 これは、関数外のローカル変数をキャプチャするための機能です。 function! s:init() let value = 0 " closure キーワードを追加することで関数外のローカル変数をキャプチャできる function! s:count() …

Vim 8.0 で追加された機能 タイマーを一時停止する

Vim

前回書き忘れたので追記。 timer_pause() を使用します。 " 一時停止 call timer_pause(timer_id, 1) " 再開 call timer_pause(timer_id, 0) これで一時的にタイマーを停止したり、任意のタイミングで再開する事が出来ます。

Vim 8.0 で追加された機能 タイマー

Vim

Vim 8.0 ではついに Vim script にタイマー機能が追加されました! この機能を使用することで処理をブロックしないで関数を呼び出すことが出来ます。 [基本的な使い方] タイマーは timer_start() 関数を使用して任意の関数を n 時間後に呼び出す事が出来ます…

Vim 8.0 で強化された機能 辞書関数

Vim

さて、以前の辞書関数は次のように call() と辞書を経由して呼び出す必要がありました。 let s:dict = { "value" : 0 } function! s:dict.up() let self.value += 1 return self.value endfunction let s:f = s:dict.up echo call(s:f, [], s:dict) " => 1 e…

RSpec で not_change マッチャを定義する

通常、Rspec で『変更されないことを検証する』場合、change マッチャを使用します。 # subject を呼び出しても hoge が変更されないことを検証する it { is_expected.not_to change{ hoge } } [not_change マッチャを定義する] 上記のコードでも問題ないの…

Ruby の ObjectSpace を利用して、オブジェクト名からクラスオブジェクトを探す

Ruby で例えば "String" という文字列からその名前のクラスオブジェクトを取得したい場合があるとします。 そういう場合は ObjectSpace から逆算して検出することができます。 # クラスオブジェクトの一覧を取得する classes =ObjectSpace.each_object(::Cla…

Vim 8.0 で追加された Vim script の機能 Lambda

Vim

Vim 8.0 ではついに Vim script に Lambda が追加されました! Lambda を定義する場合は { args -> expr } という構文を使用します。 " Lambda は関数参照を返す " epxr にはその名の通り "式" のみ書くことができる let F = { a, b -> a + b } echo F(1, 2)…

Vim 8.0 で追加された新しいシンタックス

Vim

Vim 8.0 では新しく以下の言語に対応しました。 New Syntax/Indent/FTplugin files: AVR Assembler (Avra) syntax Arduino syntax Bazel syntax and indent and ftplugin Dockerfile syntax and ftplugin Eiffel ftplugin Euphoria 3 and 4 syntax Go syntax…

Vim 8.0 で追加された機能 function() 関数

Vim

Vim 8.0 では function() 関数の引数が新たに追加されました。 [引数の束縛] function() の第二引数に第一引数に渡す関数の引数を渡すことで、引数の束縛を行うことができるようになりました。 function! Plus(a, b) return a:a + a:b endfunction " 第一引…

Vim 8.0 で追加された機能 uniq() 関数

Vim 8.0 で『配列の隣り合う同じ値の要素を削除する』uniq() 関数が追加されました。 echo uniq([1, 1, 3, 2, 2, 3, 3, 1]) " => [1, 3, 2, 3, 1] また、重複する要素をすべて削除したい場合は、 sort() と併用して使用します。 " sort() してから uniq() す…

Vim 8.0 で追加された機能 :smile

Vim

Vim 8.0 で :smile というコマンドが追加されました。 このコマンドを実行すると以下のような出力がされます。 それだけ。 [コマンドが追加された経緯] :smile コマンドは次のような経緯で追加されたらしいです。 @pink_bangbi neovim 出てきたりして空気が…

Vim 8.0 で追加された機能 EndOfBuffer ハイライトグループ

Vim

Vim 8.0 で EndOfBuffer というハイライトグループが追加されました。 これはバッファ外に表示されてる ~ の部分を制御するハイライトグループになります。 以下のようにハイライトを設定することで ~ のハイライトを無効にすることが出来ます。 highlight l…

Vim 8.0 で追加された機能 v_<C-a>/v_<C-x>

Vim

カーソル下の数字などをインクリメントする <C-a> が Visual モードでもできるようになりました。 選択した範囲の数字に対してインクリメントをすることが出来ます。 [v_g<C-a>/v_g<C-x>] これと似た機能で v_g<C-a>/v_g<C-x> というのも追加されました。 これは 1. 1. 1. 1. というよ</c-x></c-a></c-x></c-a></c-a>…

Vim 8.0 で追加された機能 'breakindent'

Vim

Vim 8.0 で 'breakindent' というオプションが追加されました。 これは、行を折り返しするときにインデントを考慮するようになるオプションになります。 [set nobreakindent] [set breakindent] 便利。