Rubyの最近のブログ記事

他のことを調べていて、"Guard::CoffeeScriptですべてコンパイルし直す - ひげろぐ"を知ったのですが、全てをコンパイルし直すなら、guardが起動しているコンソールにリターンを打ち込むだけです。

$ guard
Guard uses Growl to send notifications.
Guard is now watching at '/tmp/sample'
(←ココでリターンキーを打った)
Compile coffee/app.coffee, coffee/sample1.coffee, coffee/sample2.coffee
Successfully generated Resources/app.js, Resources/sample1.js, Resources/sample2.js

その他、幾つか使えるコマンドがあり、https://github.com/guard/guard のInteractionsの項に説明があります。

Titaniumを使うときCoffeeScriptで書いているのですが便利ですね。

しかしRubyでこう書いてたのは、CoffeeScriptではどう書くの?(・ω・)って事が多いです。

さっきひとつ新しい発見があったので書いておきます。

外部サービスのAPIとかをたたくときクエリーパラメータをHashにためておいて下記の様にURLパラメータを作成しますよね?

CoffeeScriptだと同じように書く方法が分からなくて普通にループして配列に突っ込んで作ってました。

ここは包括?(Comprehensions)を使えば良いのですね!

とてもイイ!

下記でサクっと入ります。

負荷分散された環境で、SYSLOGなどを使わずにApacheやProxyのログが複数サーバにそのままはかれる設定になっている場合、ログを調査する際に複数の巨大なファイルを扱わなくてはならず面倒ですね。

なんとなく既にあって車輪の再発明をしている気がギュンギュンするのですが、ざっとググったところ見つからなかったので書いてみました。

使い方

$ aplogmerge.rb 1.log 2.log 3.log...

色々なケースにおけるテストとか全然やってないのですが何となく動いてそう。 あ、Ruby1.9.2でしか動作確認してません(汗)

Apacheのログはアクセスされた時間をレスポンスした時に出力するため、それぞれのファイル内で前後している行がある可能性があります。 その場合このプログラムでマージすると純粋に正しい出力にはならないかもしれませんが、概ね目的の出力は得られると思います。

日時を数値に変換してるとこはテキトーです。各行の前後関係が分かればよいだけなので、もっと速くていいロジックがありそう。

Cで書かないと実用に耐えないかな?と思いましたが約1GBのログ3つで実行したところ6分くらいで返ってきたので十分かなと。

profileすると現状、遅いのは比較のため日付を数値に変換している処理と、まだ先読みしてないファイルを特定するためArray#rejectしてるとこ。 気が向いたらもう少しチューニングしたいですが、現状十分な速度なのでもういいかなと(笑)

新しい環境にmongrelをインストールしようとして毎回ググってる事に気付き、備忘のため。


ちなみに --pre 付けないと、こんなエラー吐きます。
INFO:  `gem install -y` is now default and will be removed
INFO:  use --ignore-dependencies to install only the gems you list
Building native extensions.  This could take a while...
ERROR:  Error installing mongrel_cluster:
	ERROR: Failed to build gem native extension.

        /Users/iwazawa/opt/ruby-1.9.2-p290/bin/ruby extconf.rb
checking for main() in -lc... yes
creating Makefile

make
gcc -I. -I/Users/iwazawa/opt/ruby-1.9.2-p290/include/ruby-1.9.1/x86_64-linux -I/Users/iwazawa/opt/ruby-1.9.2-p290/include/ruby-1.9.1/ruby/backward -I/Users/iwazawa/opt/ruby-1.9.2-p290/include/ruby-1.9.1 -I.   -fPIC -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long  -o http11.o -c http11.c
http11.c: In function 'http_field':
http11.c:77: error: 'struct RString' has no member named 'ptr'
http11.c:77: error: 'struct RString' has no member named 'len'
http11.c:77: 警告: カンマ演算子の左側の式に効力がありません
http11.c: In function 'header_done':
http11.c:172: error: 'struct RString' has no member named 'ptr'
http11.c:172: error: 'struct RString' has no member named 'ptr'
http11.c:172: error: 'struct RString' has no member named 'ptr'
http11.c:174: error: 'struct RString' has no member named 'ptr'
http11.c:176: error: 'struct RString' has no member named 'ptr'
http11.c:177: error: 'struct RString' has no member named 'len'
http11.c: In function 'HttpParser_execute':
http11.c:298: error: 'struct RString' has no member named 'ptr'
http11.c:299: error: 'struct RString' has no member named 'len'
make: *** [http11.o] エラー 1


Gem files will remain installed in /Users/iwazawa/opt/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongrel-1.1.5 for inspection.
Results logged to /Users/iwazawa/opt/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongrel-1.1.5/ext/http11/gem_make.out

会社の一部の開発メンバーでプログラミング部をやろうという事になって、その中の一人がProject Eulerが面白いよということで、皆で始めたのがきっかけ。

数学の問題が難易度順に並んでいて、プログラムを書いて解を求めるっていうのが目的です。
ユーザ登録をすると答え合わせができるようになります。

使用するプログラミング言語は一応プロフィールに登録する事になっていますが、おそらく皆さん色々な言語でやっていると思いますね。やはり問題によって解きやすい言語、解きづらい言語がありますからね。

解の値を入力するだけの答え合わせなので、実は解を求められれば方法は何でもありではあります。

私は最初Scalaの勉強のために問題1と2はScalaで解いたのですが、問題3でまずお題の値がIntを超えていて、BigIntと再帰呼び出しで書くのが面倒になり、常に多倍長整数を使えるRubyに切り替えました(弱)RubyいいよRuby。

始めた頃は正直もういい歳なんだし面倒だなぁと思ってましたが(笑)クリアした問題が増えてくると1問解くごとに達成感があって楽しいんです。

英語のサイトなのでまず問題の理解が難しいのですが、日本語訳をしているサイトがあります!

問題数は今でも少しずつ増えていて現時点の直近では最後に2011年5月29日にProblem 340が登録されています。さすがに超難問の匂いがプンプンしますねw

プロフィールから自分の解いた数が記載されたバナーを取得することができて、このブログのサイドバー上に貼ってあります。これです。

はい、まだ20問しか解けてません(´・ω・`) ま、空いた時間でちょいちょいやってるだけなので少しずつ増やしていこうと思います。


次に書いたプログラムをどう管理しているかって言うと、もちろんローカルディスクのファイルとしては保存したあるのですが、誰かに見せたり意見を聞いたりするためにgist.githubを使っています。

gist.githubはコードスニペットを管理するツールとしては最高に使いやすいサービスです。

ただ、プロジェクト・オイラーだとそう簡単に答えが探せたらツマラナイので一応Privateで保存してあります。

Privateとは言ってもURLを知っていれば、誰でも見られます。例えばProblem 20の解を求める私の書いたプログラムはURLを知っていれば見られるはずです。おそらくPrivateは

・URLが複雑
・クローラにインデックスされない
・Embedタグが使えない

以外はPublicと変わらないんだと思います。

Publicで保存してEmbedタグを使えばブログのサンプルコード表示にも最適ですよ。


さて、プロジェクト・オイラーのProblem 20を解いてからもう1ヶ月も経ってしまったので、そろそろ21をやっつけるかな〜。しかしこのペースでは新しく増える問題(しかも難問)の方が多くて全く追いつけまてん!

第1引数に配列を渡すと[<prefix>, <postfix>]と指定できるんですね。

覚え書き
Hashのクラスメソッドを使う。

今日も休日出勤なちょい悪っぷり。それでは3章の気になる箇所。

P49 整数0除算はZeroDivisionError、実数0除算はInfinity。

P50 強く型付けされた言語なので、データ型が自動変換されることはない。整数と浮動小数点値の演算は例外的に自動変換される。
Rubyが強く型付けされた言語というところにそこはかとない違和感を感じたが、それは勘違いで、変数は型に束縛されていないが、インスタンス自身はキッチリしているという事みたい。

P52 宇宙船演算子(笑) いや名前にウけただけです。

今日は夏休みなのに仕事をしてきた不良なので少し疲れているけど、初めてのRuby2章は読んだ。 またまた気になったことだけ記載。

P31 配列の添字に負数を指定すると末尾から!
これは、結構驚きかも。確かにa[a.length - 1]なんだからa[-1]と略せてイイじゃんという話には納得。いやぁ、いいね。これいいね。早くむやみに使いたい。
あれ?もしやと思ってPerlでやってみたらPerlでも同じだった。今までPerlで何をやっていたのだ orz いや、まPerlとはつきあいは長いけど詳しくはないのだ。

P32 注意点:配列の添字アクセスはRubyの文法のように見えるが実はArray#[]メソッド呼び出し。なのでリファレンスマニュアルはArrayクラスを探すべし。

P37 do … end と { } の指針

  • 基本的にdo endを利用する
  • メソッドの戻り値を利用する場合のみ{}を利用する
  • それと、メソッドチェーンをする場合のみ波括弧を使う

著者はリソース管理ブロックには波括弧と書いてるけど、do … endのが私はいいなぁ。

P42 Enumeratorの説明がいまいちしっくりこない。まぁ、すぐに必要そうではないのでひとまずスルー。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちRubyカテゴリに属しているものが含まれています。

前のカテゴリはProgrammingです。

次のカテゴリはRuby on Railsです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。