Ruby

irb tips(仮) メソッド定義は一行で

こんばんは。irb、使ってますか? irbでは複数行に渡るメソッド定義が可能です。しかし、部分的に修正する場合でも、全て書き直して再定義しなければなりません(たぶん)。 そこで、今回のtipsです。メソッドを定義する際、無理やり一行で記述します。あと…

reject!とdelete_ifの違い

レシーバに変更がなかった場合の動きが異なります。 reject! : nilを返す delete_if : レシーバを返す破壊的メソッド全てが、破壊されなかった場合にnilを返すわけではないようです。間違えて覚えていたのが、リファレンスマニュアルを眺めていて発覚。バ…

ディレクトリのサイズをまとめて計算するスクリプト

エクスプローラがディレクトリサイズの一覧を表示してくれないので、Rubyで書きました。 まずは、ひとつのディレクトリのサイズを求めるメソッドです。 def dir_size(dir_path) dir_size = 0 Dir.entries(dir_path).reject{|x|/^\.+$/=~x}.each do |file_nam…

配列のつくりかた

配列は、最も基本的なデータ構造です。Rubyの配列は、「可変長」「イテレータが簡単」などの理由で、利便性が高くなっています。 配列のプログラム内での使い方ですが、まずは配列を作成しなければなりません。一般的には、 [1, 2, 3] と記述します。角括弧…

【ワンライナー】ファイルの一括リネームを一行で書く

今回は、いわゆるワンライナーに挑戦してみます。お題は、前々回の、ファイルをリネームするプログラムです。 Dir.entries('./').reject{|x|/\.$/=~x}.sort_by{|fname|File.stat('./'+fname).mtime}.each_with_index{|fname,index|File.rename('./'+fname,'.…

ちょっとした重複コード対策

一般的なプログラミングの世界では、DRY(Don't repeat yourself)の原則やらOAOO(Once and Only Once)の原則やらで言われているように、コードの重複は避けるべきという考え方が主流です。 例えば、変数「a」と変数「b」の内容を出力したいとしましょう。その…

ファイルを更新時間順にソートしてリネームするプログラム

li{ margin-bottom: 10px; } #!ruby -Kspath = ARGV[0] #末尾に"\"を付加することfnames = Dir.entries(path) fnames.delete_if { |x| /.*\.$/ =~ x }fnames.sort! do |a, b| File.stat(path + a).mtime.strftime("%Y%m%d%H%M%S") File.stat(path + b).mtime…

ニコ動でRubyの動画を探す方法

キーワード「Rubyist」または「RubyKaigi」で検索する タグ「ruby」で検索する

RubyでWindowsアプリ その0 環境構築 / その1 簡易カウンタ

今回は、RubyでWindows用GUIアプリケーションを作成します。Rubyのホームは黒い画面(Windowsでいうコマンドプロンプト)だと思うのですが、最近はRails用言語だという説もありますね。たしかに我々一般人はグラフィカルな環境で生きていますが・・・黒い画…

テキストファイルの内容をソートするプログラム その5 「例外処理」

ファイル操作は、例外が発生しやすい処理です。パスが1文字間違っていたためにファイルが見つからない、他のプログラムで使用していたためアクセスできないなど、些細なことが大きな問題となってしまいます。 そのため、このプログラムでも例外処理を行うこ…

テキストファイルの内容をソートするプログラム その4 「パターンマッチと負の添字」

■変更点 読み込めるファイルを.txtと.csvに限定 文字列判定に比較演算子(=~)を使用 file_path = ARGV[0] search_str = ARGV[1] if /^(txt|csv)$/i !~ file_path.split(".").[](-1) puts "扱えないファイルです。" exit endtemp_lines = [] File.open(file_…

テキストファイルの内容をソートするプログラム その3 「コマンドライン引数と式展開」

■変更点 検索用正規表現文字列を外部から受け取る 可読性と保守性を高めるため、ファイルを扱う部分の記述を変更 open(組み込み関数)⇒File.open(クラスメソッド) File.openメソッドの呼び出しにブロック引数を使用(Fileオブジェクトの有効範囲がブロッ…

テキストファイルの内容をソートするプログラム その2

その2では、検索機能を付けてみたいと思います。やり方は、ファイルに書き込んでいる部分を、if文で囲むだけです。 temp_lines.each do |line| if line.match(/irb/) write_file.puts line end endここでは、"irb"という文字列が含まれている行のみを書き込…

テキストファイルの内容をソートするプログラム その1

その1なので例外処理も何もしていませんが、CSV形式の並び替えには十分使えます。 file_path = ARGV[0]read_file = open(file_path) write_file = open("result_" + file_path, "w")temp_lines = [] read_file.each do |line| temp_lines endtemp_lines.sor…

書籍「初めてのRuby」 はじめに

「初めてのRuby」を購入して読み始める。「プログラミング言語Ruby」と迷ったが、読みやすさを重視して選択。冗長な部分を削って早く読めるようにというのは本ブログの思想である。以下、「はじめに」の要約。 プログラミングの際、私は使用している言語の世…

loopやTCPServerに時間制限をかける

「timeout」を要求し、 timeout(秒数) { loop { } #何もしない無限ループ }のように書くと、指定した秒数が経過した後、例外(TimeoutError)が発生します。 具体的には、次のように使用します。 require "timeout" #10秒間、クライアントを待つサーバープロ…