Ruby

URLの抽出

30分プログラム、その186。HTMLからのURL抽出。 上で書いたワンライナーをごにょごにょしたやつ。特にいいネタを思いつかなかったので。変ったのは、 ワンライナーじゃなくなった マジックナンバーがなくなった ソートと重複削除を追加 使い方 $ curl -s htt…

URLの抽出(ワンライナー)

ファイルからURLというかドメイン名だけを抽出するワンライナー。 ruby -ruri -e 'puts $<.read.scan(URI.regexp("http")).map{|x| x[3]}' $ $ echo 'http://howdyworld.org' | ruby -ruri -e '...' $ ruby -ruri -e '...' index.html

autoinsertっぽい何か

30分プログラム、その185。Emacsのautoinsertっぽいことをやるコマンドラインプログラム。今までautoinsertでプログラムの先頭に#!やらライセンス情報やらを挿入していた。かなり便利。ただ、最近Vimなども使うようにしているのでEmacsでしか使えないのはい…

たらいまわし関数

30分プログラム、その184。Rubyでたらいまわし。輪講の準備でメモ化(memoization)を調べてたら、たらい回し関数のことを思い出したので書いてみる。 曰く、遅延評価だと早くなる関数らしく、Haskellってすげーという文脈でよく登場する。普通に計算するやつ…

URLエスケープ

30分プログラム、その174。URLエスケープをするコマンド。MacのOperaやSafariでWikipediaなどを見るとURLが「http://ja.wikipedia.org/wiki/素数」のようになる。わかりやすいけれども、日記からリンクを貼るときはURLエスケープする必要がある。今までは、…

Python風getopt

30分プログラム、その165。Python風getopt。 昔何かでPythonのgetoptは実に使いやすい、という記述を読んだ気がするので、Rubyに適当に移植してみる。どう使いやすいかというと、RubyのOptionParserは次のように書く。 require 'optparse' option = [] opt =…

grepの速度測定

30分プログラム、その164。grepの速度を測っていみる。 Rubyである文字列を含むファイルを検索する場合、自前で実装するのと、grepコマンド使うののどちらが速いか測定してみた。 検索するファイルの拡張子も指定したかったので、findとも組合せている。 使…

ファイルに特化したcat

30分プログラム、その163。ファイルに特化したcat。 最近、複数のJavascriptを結合するのにcatを使ってる。(id:mzp:20071013:js) cat *.js > foo.jsただ、これだと結合したやつから元のファイルを得ることができなくて、たまに困る。そこで、結合時にファイ…

Nullオブジェクト

30分プログラム、その158。Nullオブジェクトを作る。RubyのNilClassは無関係で、デザインパターンのほうのNullオブジェクト。適当に要約すると、処理Aをするクラスと、処理Bをするクラスと、何もしないクラスを用意して、それぞれ状況に応じて別のクラスに渡…

scrAPIを試す。

30分プログラム、その155。Rubyのスクレイピングツールキット scrAPIを参考に、scrAPIを試す。最初は、URLを入力すると何人がLivedoor Readerとかで購読しているかを表示するWebサービスを作るつもりだったんだけど途中で面倒になった。なので、コマンドライ…

which for Ruby

30分プログラム、その154。Ruby用のWhich。requireしているファイルが、実際はどこに置いてあるかを調べてくれる。標準ライブラリの中を除いたり、Rubygemsで入れたライブラリを取り出したりするときに便利。久しぶりに、必要に迫られて作ったプログラム。 …

ディレクトリ比較プログラム

30分プログラム、その152。ディレクトリ比較プログラム。 今日の仕事中に、バックアップしたコードと最新のコードを比較して、変更されたファイルを知りたいときに $ for i in */*.java do; cmp $i ../backup/$i doneと書いたときに思いついた。昔書いたこと…

格子点の列挙

30分プログラム、その156。格子点の列挙。 二次元平面上の格子点(X,Y座標がともに整数の点)を、原点から近い順に列挙してください。 同じ距離の点はどういう順番でも構いませんが、可能であればX軸に一番近い第一象限の点から原点を中心として反時計回りの順…

アルファベットの繰り上がり

30分プログラム、その149。アルファベットの繰り上がり。 Excelの桁表示は 1桁目はA、2桁目はB、以下C、D、 E…とすすみ、Zの次はAA AB AC…と続きます。AZの次はBAです。 この表記法で1から100までを表示してください。出力結果は下記のサンプルの「...」の部…

フェルマーの小定理で素数判定。

30分プログラム、その148。フェルマーの小定理で素数判定をやってみる。 ネタがないと相談したら、id:selvaggioが教えてくれた。要するに pow(a,n-1) % n != 1が真ならそれは合成数、偽なら素数の可能性がある、ということですね。実に単純な式。暗号回りで…

古いファイルの削除

30分プログラム、その139。Loading...をマネしてみる。削除はシェルでやればいいので、二週間前のファイルを出力することだけに注力している。まあ、実際はzshで rm **/*(m-14)とやれば、2週間より前のファイルを削除できるわけですけどね。 使い方 $ ruby o…

MovableTypeに投稿

30分プログラム、その136。MovableTypeに投稿するRubyプログラム。はてダラのMovableType版を作りたいので、それの基本となる部分。コマンドラインオプションが多すぎて使いずらいので、これを使ったラッパをそのうち書こう。 使い方 次のようなsample.txtを…

仲間はずれの判定

30分プログラム、その134。仲間はずれの判定。眠いので、あまり調子がよくない。明日、別の言語でやりなおす。 とりあえず動いてるけど、なにか漏れがある気がする。 使い方 $ ruby class.rb [1, 1, 1, 1, 1] = homo [1, 1, 2, 1, 1] = quasi_homo [2, 1, 1,…

==を定義するモジュール

30分プログラム、その133。毎回、似た==メソッドが面倒なので、モジュールを作ってみた。例えば、次のようなクラスの場合、 class Hoge def initialize(a,b) @a = a @b = b end end こんな感じの==メソッドを定義する。 class Hoge attr_reader :a,:b def ==…

RUBY_PLATFORM

Wiki系過去ログ - あさあさ.tkによるとRubyでの判定方法は、 RUBY_PLATFORM.include?("win") でも、これだとDarwinにひっかかってしまう。るびまによると、 /mswin(?!ce)|mingw|cygwin|bccwin/という正規表現を使えばいい。

whichコマンドをWindowsに

30分プログラム、その133。whichコマンドをさくっと再実装。Windowsでwhichがつかえないのが嫌だったので実装してみた。でも、よく考えたらWindowsでRubyは一般的じゃないっ!しかも、手元にWindowsマシンがないから試せないっ。 使い方 $ ruby which.rb ruby…

強度チェック付きパスワードジェネレータ

30分プログラム、その127。強度チェック付きのパスワードジェネレータ。自分で作るのは面倒というか不安だったので、apgとcracklibを使っている。apgなのは、こいつが生成するPronounceable Password(発音可能なパスワード,英単語っぽいけど英単語じゃないパ…

paste改良版

30分プログラム、その122。id:Gemmaさんからの挑戦状。 『問題。100万行のファイルでも大丈夫なように改良しなさい。』 使い方 ファイルの生成はワンライナーで。 $ perl -e 'print "a\n"x1000000' > aで、実行するとこうなる。 $ ruby big.paste.rb [a-c] a…

ファイルのマージ(pasteコマンド)

30分プログラム、その120。ファイルをマージするプログラム。昔、書き捨てたプログラムの改造版。書いてから気がついたけど、pasteコマンドそのものだった。 使い方 $ cat 01 000 111 222 333 444 $ cat 02 AAA BBB CCC DDD $ cat 03 aaa bbb ccc ddd $ ruby…

小町算

30分プログラム、その118。小町算をevalのあるRubyでリベンジ。やっぱりevalがあると楽ですね。 使い方 $ ruby komachi.rb 12.0+34.0+5.0*6.0+7.0+8.0+9.0 1.0+23.0-4.0+56.0+7.0+8.0+9.0 1.0/2.0/3.0*456.0+7.0+8.0+9.0 1.0*2.0+34.0+5.0+6.0*7.0+8.0+9.0 1…

shuffle関数

30分プログラム、その117。配列をシャッフルする関数。 久しぶりにシンプルな課題。こういうのを考えるのは結構好きなのです。 使い方 $ ruby shuffle.rb 1 2 3 4 5 6 7 [4, 1, 3, 5, 7, 2, 6] ソースコード 先頭から順にみていき、それを後続のどれかと入れ…

ispellラッパ(失敗)

30分プログラム、その108。ispellのラッパを書こうとして失敗した。 やりたかったのは、Emacsのスペルチェッカで"readLine"のような単語をちゃんと認識できるようすること。で、ispellのラッパを書いて、"readLine"->"read Line"のように変換するようにして…

ぷりてぃな配列

30分プログラム、その104。綺麗に配列を出力してみる。 sprintfを使えばいいじゃん、という言葉は聞こえないもん。 使い方 t = [] t << ['Alice',20] t << ['Bob',10] t << ['Charry',30] puts t.map{|name,point| ["#{name}: ",'[','='*point,']'] }.to_s …

Spamブロック付きコメントプラグイン

30分プログラム、その100。Hikiのコメントプラグインspamブロッック付き。100回目なのにしょぼいのは気にしない。標準でついてくるコメントプラグインをハックして、英数字のみから成るコメントをはじくようにした。あと、id:selvaggioに「コメントプラグイ…

mixi APIを使う

30分プログラム、その98。mixi APIを使ってみよう。mixiツールバーが新着日記を表示していたので、パケットキャプチャをしてみた。そしたら、新着日記をAtomAPIっぽいやつで取得していたので、Rubyで取得できるようにしてみた。 使い方 $ ruby mixi.rb ユー…