Ruby

Crystal 言語で CLI ツールを書いてみる

Crystal はつくりかけの言語です.この記事は 0.8.0 を元に書きましたが,今後かなり変更されることが予想されます Crystal は Ruby に強くインスパイアされたコンパイル言語です.結構前から気になっていて,Crystal のコンパイラが Ruby で書かれていた頃…

メモ化された手続きを簡単に記述できるモジュールを書いてみた

Hash でお手軽にメモ化 で書いた Hash を用いたメモ化が結構気に入ったので,メタプログラミングの練習がてら,もう少し簡単にわかりやすく書けるモジュールを作ってみた. こんな風に使える. # ブロックを与えて呼び出すと,Memo のスコープ内にブロックで…

Hash でお手軽にメモ化

しつこく Hub を読む Hash#new に2引数のブロックを渡すと,存在しないキーにアクセスしようとするとそのブロックが呼ばれるようにできることは前から知っていたけれど,それをキャッシュに利用できるのは知らなかった. まず,Hash#new はこんな感じで使え…

Vim で Ruby を書くためのプラグイン3つ書いた

そういえば,Qiita の Ruby アドベントカレンダーで記事を書いた. Vim で Ruby を書くためのプラグイン3つ書いた

Ruby 2.0 のキーワード引数を補完する neocomplcache ソースを書いた

neco-ruby-keyword-args というプラグインを作りました. neco-ruby-keyword-args Ruby 2.0 では,引数を名前で指定するキーワード引数が追加されました. 今まではハッシュを引数にすることで擬似的に名前渡しを実現していましたが,もうそんなことをする必…

pry-debugger と pry-nav の相性が悪い

pry-debugger と pry-nav の両方をインストールしていると pry:23: stack level too deep (SystemStackError)と出て pry コマンドが起動しなくなってしまった. 調べてみると pry-debugger と pry-nav の相性が悪いようで,pry-nav をアンインストールしたら…

ヒアドキュメントを便利にする String#undent メソッド

元ネタは Homebrew の String#undent メソッドです. ここで紹介するものはそれを少し賢くしています. class String def undent min_space_num = self.split("\n").delete_if{|s| s=~ /^\s*$/ }.map{|s| s[/^\s+/].length }.min gsub(/^[ \t]{,#{min_space_…

mikutter の 正規表現フィルタリングプラグインを書いた

ダウンロードはこちらから.regex_filterインストールは $HOME/.mikutter/plugin に regex_filter.rb を放り込むだけです.設定画面に新しいタブが追加されます.最近は Arch Linux で mikutter を使って Twitter を閲覧しているのですが,フィルタ機能が弱…

rbenv は起動が遅い?

僕の環境では zsh の precmd() に Ruby のスクリプトをフックしているので,コマンド入力ごとに Ruby のスクリプトが走るのですが,rbenv に変えた時に precmd() でもたつくような気がしたので,少し測ってみました. rbenv の ruby を使った場合 % time $HO…

Proc に2項演算子を定義してみた

class Proc %w[ + - * / ** % | & ^ > < >= <= == <=> >> << =~ != !~ ].map{|i| i.to_sym }.each do |op| define_method(op) do |rhs| apply_binary(rhs,&op) end end private def apply_binary rhs raise "block is needed" unless block_given? Proc.new{…

Proc#=== の使い道

Proc オブジェクトの呼び出し方法はいくつかあります proc = Proc.new{|i,j| i*j} proc.call(2,3) #=> 6 proc.(2,3) #=> 6 proc[2,3] #=> 6 proc === [2,3] #=> 6 が,一番最後のはどこで使うんだろうと思っていたんですが,case when では === を用いて比較…

REXML で XML を解析し Hash に変換する

REXML は Ruby に標準でついてくる XMLパーサです.XML な文字列を食わせるとパースして REXML::Document として利用できます. しかし,REXML のドキュメントを見て扱いを知らなければならないので,Hash で取りたいこともあると思います.実際 ActiveSuppo…

メタプログラミング入門(2) ネストしたスコープ

Ruby では,一般的な手続き型言語と違いスコープがネストしません. var1 = 0 class Hoge # var1 は見えない var2 = 1 def huga # var1 も var2 も見えない end end class 内で共有できる変数としてインスタンス変数がありますが,特定のメソッドだけ共有し…

Ruby メタプログラミング入門(1) 動的なメソッドディスパッチ

メソッドが存在しない場合に必ず呼ばれるメソッド,method_missing をオーバーライドすることにより実現します. #!/usr/bin/env ruby # -*- coding: utf-8 -*- # 1度の試行につき4回実行されるルーレット.ただし,前回の値より小さい値しか出ない. class …

Homebrewで最新のGCC 4.6.3 をインストールするためのパッチを書いてみた

こちらに置いています. https://github.com/rhysd/others/blob/master/gcc-4.6.0-to-4.6.3.patchインストール方法は Homebrewで最新のGCC ( gcc-4.6.2 ) をインストールするためのパッチを書いてみた と同じなので割愛. 以前この方法でgcc-4.6.2をインスト…

rbenv で gem を使った時に rbenv rehash しなくて良くする

rvm が多機能&壊れやすすぎて Homebrew の ruby を直にインストールして使っていたのですが,Homebrew の ruby はバージョンを上げるときにgemで入れたコマンドを引き継いでくれなかったり,gemでインストールしたコマンドを反映してくれないので,rbenv と…

SONY Go For It: 1) の解答

問題 http://www.sony.co.jp/SonyInfo/Jobs/newgrads/sus/q01.html 解答 life_clock.rb #!/usr/bin/env ruby # -*- coding: utf-8 -*- # FILE: life_clock.rb # AUTHOR: rhysd (http://d.hatena.ne.jp/rhysd/) # License: MIT license {{{ # Permission is h…

RubyでGoogleのプログレスバーを作る

この記事を元ネタにしています. GoogleプログレスバーをPHPで作ってみる - たら風呂ソースコードはここにあります. others/google_progress.rb at master · rhysd/others · GitHubただ真似をするだけでは面白く無いので,ちゃんと色を付けてみました. コ…

zshでプロンプトにTwitterのタイムラインを表示する

ネタです.zshのプロンプトを2段にし,1段目にtwitterのホームタイムラインを表示します. 作業効率が落ちたりしても私は責任を持てないので,自己責任でお願いします…!まずこちらからget1tweet.rbを落としてきて適当なところに置きます. https://github.c…

Ruby1.8でtwitter idのQuineを書いた

Quine(クワイン)とは,自身のソースコードを出力するプログラムのことです. クワイン (プログラミング) - Wikipedia今回は見よう見真似でRubyで作ってみました. 参考:Google Code JamTwitterではLinda_ppというアカウントで投稿しているので,それを大…