Ruby における関数オブジェクトとブロック引数とは…?

Ruby 2.6 で追加される Proc#>> に Symbol も渡したいよねー内部で #to_proc も呼び出してほしいよねーと考えた時の覚書。 現在 Proc#>> には #call が定義されているオブジェクトを渡せる なにをしたい Proc#>> に #to_proc が定義されているオブジェクトも…

【Ruby Advent Calendar 2018】あなたのしらない Refinements の世界【3日目】

Ruby Advent Calendar 2018 3日目の記事になります。 なんとか日付が変わる前に書けました…。 何を書こうか迷ったんですが、この記事では今年 Ruby にパッチを投げまくったディープな Refinements の世界について書いてみようかと思います。 そもそも皆さん …

Ruby の Hash をソートする時の注意

Hash をソートしたい場合、Hash#sort でソートすることが出来るんですが、このメソッドは [key, value] の配列に変換してからソートが行われます。 なので Hash#sort の戻り値も配列になります。 hash = { b: "homu", c: "mami", a: "mado" } # #sort の戻り…

Ruby で yield_self のめっちゃ便利な使い道

Ruby 2.5 で追加された #yield_self という地味に便利なメソッドがあります。 これは『レシーバを引数としてブロックを呼び出す』というメソッドになります。 既存のメソッドとして #tap と似ていますが、#tap とは異なり『ブロックの戻り値を #yield_self …

Ruby 2.5 系で CSV.generate のバグ

Ruby 2.5 系で CSV.generate を使用しようとしたら意図しない動作をして、調べてみたらバグだったのでそのまとめ。 しかし、これ、結構クリティカルなバグだと思うんですけど、全然話題になってないのが不思議(当時は話題になっていたのかもしれないけど。 …

Ruby で nil が含まれている配列をソートする

さて、Ruby の配列でソートを行いたい場合、配列内に nil があるとうまくソートできないことがあります。 ary = ["homu", nil, "mado", nil, nil, "mami", "saya", nil] # Error: comparison of String with nil failed (ArgumentError) ary.sort これは、『…

Kernel.#proc でブロックを渡さなかった時の挙動

さて、 Kernel.#proc といえば普通は『ブロックをオブジェクトとして扱う時』に使用します。 # ブロックをオブジェクト化する plus = proc { |a, b| a + b } # もしくは Proc.new でもどうようの挙動になる # plus = proc { |a, b| a + b } # #call でブロッ…

Ruby Hack Challeng で Refinements のバグを治そうとした話

前回参加した Ruby Hack Challeng からだいぶ時間が経ってしまったんですが、その時にやっていたことを覚書程度に書いておこうかと。 ちなみにバグと言っていますが、バグなのか微妙なところだったり。 あと結構フィーリングで書いているので実際の Ruby(の…

deoplete.nvim をいれてみた

Vim

完全に食わず嫌いっていうか現状の neocomplete.vim で満足していたんですが、稀によく補完が重すぎてアイエエエエエとなることがあるので、重い腰を上げて deoplete.nvim を入れてみました。 導入 NeoBundle "Shougo/deoplete.nvim" NeoBundle "roxma/nvim-yarp" N…

Cookpad Ruby Hack Challenge #5 [二日間開催] に行ってきた話

先週の月木に Cookpad Ruby Hack Challengeに行ってきました。 わたしは今回で4回目の参加になります。 1日目 1日目はコミッタの人が Ruby の実装や内部についてお話しつつ、実際に Ruby のコードを見たり触ったりしよう、というような内容でした。 1日目は…

Ruby で HTML を整形する

最近 HTML をゴニョゴニョする事が多いんですが、HTML が整形されておらず見づらい事がままあります。 いい感じに整形して出力したいなーと思って調べてみたら標準ライブラリに CGI.pretty というのがありました。 require "cgi" html = <<~EOS <html> <head> <title>Example D</title></head></html>…

Ruby でメソッドの定義元をシュッと調べる

デバッグなどしている時に Rails の実装を読みたい!、ということはよくあると思うんですが、そういう時にシュッと定義元を開きたいですよね。 優秀な IDE とかだとそういう機能もあるかもしれませんが、irb や pry を実行している時にサクッと調べたいです…

[CombNaf x 学生LT] 第12回 学生エンジニアLT大会!!!で LT してきた

してきました。 相変わらず学生ではないんですが、遠目で見ていたりします。 今回は普段の学生LT とは違い CombNaf という別のコミュニティと合同で開催されました。 そのため、参加者が多かったり、普段の学生LT とは結構雰囲気が違っていたような感じでし…

Vim 8.1 がリリース!!

Vim

朝起きたら Vim 8.1 がリリースされていました。 Vim 8.0 のリリースが 2016/09/12 なので約1年8ヶ月ぶりとなるリリースです。 大きな追加点としてはやはり :terminal が実装されたことですかね。 わたしは :terminal はクソだと思っているんですが、リリー…

3,4月で気になった Ruby のパッチ、提案

書こう書こうと思っていて結局書いてなかったシリーズ。 とりあえず、現状まとめていたやつだけ放出。 Feature #14579: Hash value omission - Ruby trunk - Ruby Issue Tracking System JavaScript みたいに Hash を定義する時に『値を省略してキーだけ渡し…

第9回 学生エンジニア限定LT大会!!!でスライドの作り方の LT してきた

もう1週間以上も経ってしまいましたが第9回 学生エンジニア限定LT大会!!!に遊びに行ってきました。 自分でブログ書けと言って書いてなかった 今回は寿司とピザを食べることが出来たぞ!!! [reveal.js + markdown でスライドをつくろう!!] と、言うこ…

C++ で std::tuple を使ってバージョン番号を比較する

C++

元ネタ:C++ バージョン番号を比較する方法 - イネマルのプログラミング備忘録 #include <tuple> #include <iostream> int main(){ // 適当なバージョンデータ auto appA = std::tuple{ 2, 0, 101, 2 }; auto appB = std::tuple{ 2, 0, 100, 3 }; // C++11 で使いたいなら std</iostream></tuple>…

1,2月で気になった Ruby のパッチ、提案

去年、Ruby のパッチを書き始めた頃から開発者向けの ML に参加しているんですが、その中で面白そうなパッチや提案が結構目に付くので定期的にまとめてみようかと。 Feature #13784: Add Enumerable#filter as an alias of Enumerable#select - Ruby trunk -…

Ruby 25 周年記念パーティでデバッグ出力を行う gem つくってきた

今日 2018年2月24日は Ruby が誕生してちょうど 25年目! ということで記念パーティに行ってきました。 まあなんとなく行ってきたんですが、別に偉い人の話を聞いてもしょうがないので会場ではひたすら Ruby のコードを書いていました。人の話を聞いているよ…

C++ の std::tuple で動的にループする

C++

たまに C++ を書かないと忘れるので…。 [コード] #include <tuple> #include <iostream> #include <string> template<typename F, typename T, std::size_t I> void apply_impl(F f, T const& t){ f(std::get<I>(t)); } template<typename F, typename T, std::size_t ...Indices> void apply_impl(F f, T const& t, std::size_t n, std::inde…</typename></i></typename></string></iostream></tuple>

Vim script でいい感じにデバッグ出力する

Vim

Vim script でデバッグ出力を行いたい場合、以下のようなスクリプトを定義しておくことで『変数名:値』みたいな出力をすることが出来ます。 command! -nargs=* \ Debug \ try \| echom <q-args> ":" string(<args>) \| catch \| echom <q-args> \| endtry 使い方 let hoge = 42 " </q-args></args></q-args>…

第8回 学生エンジニア限定LT大会!!! でエモい話をしてきた

前回に懲りずに学生に混ざってLTしてきました。 9年間ブログを書き続けて得たもの https://osyo-manga.github.io/slide-gakusei_LT-08-9years-blog/#/ 内容は『アウトプットすることで自分にもプラスになるんやで』みたいな事を話してきました。 まあ、アウ…

表参道.rb #31 で LINE でお天気bot をつくった話をしてきた

LT してきました。 今回もご飯がとても美味しすぎた…。 LINE でお天気bot をつくった話 https://osyo-manga.github.io/slide-omotesandorb-31-otenki-bot/index.html#/ と、いうことで今回は珍しく生産性のある話をしてきました。 年末に LINE でお天気 bot …

Ruby で (a ==1 && a== 2 && a==3) の結果を真にする

と、いうのが JavaScript 界隈で流行っているので Ruby でもやってみた == メソッドを定義する 多分一番簡単なやり方。 比較演算子そのものの結果を変えます。 a = Object.new def a.== other true end p a == 1 && a == 2 && a == 3 # => true a メソッドを…

Ubuntu で Dropbox の同期が出来なかったときの対処方法

最近 Ubuntu を入れ直したんですが、その時に Dropbox の同期がうまくいかなかったので覚書。 Linux 版の Dropbox アプリの場合、デフォルトの設定では『1 万件以上のフォルダを監視すること』が出来ないため、以下のようなコマンドを端末から実行して回避す…

Ruby の Hash のキーを Symbol に変更する

Ruby の Hash のキーを Symbol に変更したい場合、Ruby 2.5 で追加された Hash#transform_keys を使うとよさそう。 hash = { "name" => "homu", "age" => 14 }.transform_keys(&:to_sym) # => {:name=>"homu", :age=>14} こういうのをやりたいことは稀によく…

Toyama.rb に参加してきた

タイミングよくちょっと近くへ行く用事があったの Toyama.rb に参加してきました。 勉強会の内容はみんなで雑談しながらもくもくして最後にやったことを各自で発表するような会です。 やったこと Ruby 2.5 の導入 Ruby 本体をビルド ファイルローカルなトッ…

C++ で each_split

C++

C++ で split というと『戻り値型とかどうするの』みたいな問題があるんですが、『それなら戻り値ではなくて each みたいに関数オブジェクトを渡せばいいじゃん』みたいな感じでやってみた。 #include <iostream> #include <sstream> #include <string> auto each_split = [](auto src, </string></sstream></iostream>…

rbenv をインストールしたので覚書

今まで めんどくさかったので rbenv を使っていなかったのですが Ruby 2.5 をインストールする為に入れたのでその覚書。 rbenv とは?みたいなことは以下の記事を参照してください。 rbenvとは?(rbenvを利用したRubyのインストール) - Qiita 事前準備 す…

2017年を振り返ってみて

残り25分しかないんですが雑に書いてみます。 C++ 相変わらず Twitter とかでてきとーに言ってる事が多かったです。 C++ 界隈のニュースで言えば、つい先日やっと C++17 がリリースされましたね。 これでやっと <variant> や <optional> が標準ライブラリに追加されたり、構造化</optional></variant>…