Home > Latest topics

Latest topics 近況報告

たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。

萌えるふぉくす子さんだば子本制作プロジェクトの動向はもえじら組ブログで。

宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能! シス管系女子って何!? - 「シス管系女子」特設サイト

Page 1/248: 1 2 3 4 5 6 7 8 9 »

RubyのCGIスクリプトでService Hookを受けて実行した外部コマンドの標準出力を文字列として受け取る - Apr 02, 2013

1つ前のエントリで、Rubyでバッククォートで実行した外部コマンドの標準出力を何故か受け取れないと書いてたんだけど、追記した通り、これは「RubyスクリプトがCGIで実行されているせいで標準入出力がCGI用に使われており、バッククォートで起動した子プロセスはその標準入出力を引き継ぐから、子プロセスから標準出力に出した内容が文字列として呼び出し元のスクリプトに返される代わりに、CGI経由でクライアント(GitHubのService Hookのエージェント)に返されてしまっている」ということだった(すとうさんに教えていただいた)。

で、対策として spawn()Process.waitpid() を使うと良いというアドバイスを頂いて、以下のように直してみた。

#!/usr/bin/ruby1.9.1
require "cgi"
require "shellwords"
require "json"
require "logger"
require "stringio"

SYNC_SCRIPT = "/home/piro/shared/or/tools/upload_nightly_xpi.sh"
RELEASE_SCRIPT = "/home/piro/shared/or/tools/release_addon.sh"
SSH_KEY = "/path/to/secret_key"
BASE_DIR = "/home/piro/shared/xul"
USER = "piro"

logger = Logger.new("/home/piro/shared/post-receiver.log")
#logger = Logger.new("/dev/null")
logger.level = Logger::INFO

# 子プロセスの実行結果(標準出力)を常に文字列で受け取るユーティリティ
def run(command_line)
  pipe_in, pipe_out = IO.pipe
  Process.waitpid(spawn(command_line, [:out, :err] => pipe_out))
  pipe_out.close
  pipe_in.read
end

cgi = CGI::new
puts "Content-Type: text/plain\n\n"
begin
  payload, = cgi.params["payload"]
  payload = JSON.parse(payload)
  project = payload["repository"]["name"]

  project_dir = File.join(BASE_DIR, Shellwords.escape(project))
  makefile = File.join(project_dir, "Makefile")
  if File.exist?(project_dir) and File.exist?(makefile)
    logger.info "build #{project}"
    sudo = "sudo -u #{USER} -H"
    command_line = "#{sudo} #{SYNC_SCRIPT} -i #{SSH_KEY} -b #{BASE_DIR} -d #{project_dir}"
    logger.info command_line
    logger.info run(command_line)

    command_line = "cd #{project_dir}; git describe"
    logger.info command_line
    current_commit = run(command_line).strip
    logger.info current_commit
    # 現在のコミットがタグを打ったまさにそのコミットである場合、
    # git describeの結果はタグ名だけになる。
    # なので、それをトリガーにしてリリース処理を走らせる。
    if !current_commit.empty? && !current_commit.match(/\A.+-[0-9]+-g[0-9a-f]+\z/)
      logger.info "=> release commit"
      command_line = "#{sudo} #{RELEASE_SCRIPT} -i #{SSH_KEY} -b #{BASE_DIR} -n #{project}"
      logger.info run(command_line)
    else
      logger.info "=> regular commit"
    end
  end

  logger.info "ok"
  p "ok"
rescue Exception => error
  logger.error error
  logger.info "ng"
  p "ng"
end

run() というのを定義していて、ここでパイプを作って spawn() の子プロセスの標準入出力に設定して、実行が終わるまで待ってパイプから実行結果を文字列として読み出す、ということをしている。(パイプを使う方法もすとうさんに教えていただいた。)

あと、このスクリプトは ~/public_html 以下に置いてるんだけど、apacheユーザで実行されてしまってファイルのアクセス権が……という事にも地味に悩まされていて、それでsudoを使ってたんだけど、suexecというApacheモジュールを使うと良いと教えてもらって sudo a2enmod suexec; sudo service apache2 restart としてみた。でもこの状態で git pull とかさせるとどういうわけか「error: cannot open .git/FETCH_HEAD: Permission denied」と言われてしまって(whoの結果ではapacheユーザじゃなくpublic_htmlがあるユーザになってるのに、何故だ……)、それで結局相変わらずsudoしている。

アドオンの自動ビルドとかリリース手順の自動化とか - Mar 30, 2013

以前、update.rdf関係を半自動生成するために頑張ったことがあって、各アドオンの紹介ページのHTMLからupdate.rdf(未署名)を作るあたりまでは自動化できてたんだけど、そこ止まりになっててまだまだ手動でやらなきゃいけないことが多くて、億劫で余計にリリースが滞る……という状況になっている。

それで、これじゃいかん!と思ってもっと自動化を進めることにして、とりあえずリポジトリのmaster/HEADを元に自動でテスト用ビルドを作るようにはした

で、その知見を元にもう少し頑張って、開発版ではなくリリース版の方ももっと自動化するというチャレンジをしている。

続きを表示する ...

携帯から送られたメールの中に含まれている絵文字を判別したかった - May 31, 2010

またRailsなんですけど。

携帯端末のメールで絵文字を入力した物を送信して、Railsアプリ(いわゆる勝手サイトにあたるもの)でそれを受信したら何か処理をしたい、っていう場面でどぉぉぉーもうまくいかなくて一日悩んでた。

ActionMailer::Baseを継承した独自のクラス(Mailmanとかそういう名前で定義してる)のMailman.receive()に渡ってきたメールの内容から、絵文字を検出したかった。

class Mailman < ActionMailer::Base
  def receive(mail)
    some_operation(mail.subject)
    some_operation(mail.body)
  end

  def some_operation(string)
    # ここで絵文字を検出したい
  end
end

jpmobileとかMbMailとかが利用できるのかなと思ったんだけど、うまくいかない。DoCoMoの端末から絵文字入りのメールを送っても、絵文字のコードにマッチするはずの正規表現に全然マッチしない。

んで、もっとよく調べてみたら、勝手サイトだからなのか何なのか、DoCoMoのメールサーバからメールが送られる時点で絵文字の情報は完璧に失われるんですね絵文字は全部「〓」に変換されてしまってて、〓の文字コードは(Unicodeだと)0x3013だから、さっきのコード表から作った正規表現にはマッチするわけがない。

まあ、やりたかった事は「絵文字があったらエラーを返す」という事だったので、「〓」が有るか無いかだけ見るというソリューションでだいたい問題なかったんですけれども。(「〓」自体を送信できないという問題は残るけど、こんな文字は普段使わないからその問題は無視する)

1日まるまる無駄にしてしまった……

メールのヘッダに埋め込む用に文字列をBase64エンコードする - May 28, 2010

所用でRuby on Railsのテストケースを書いているのですが、メールを受信してあれこれする処理のテストのためのfixtureを用意するのにいちいちホントにメールを送信してそのソース文字列をコピペするとかそういう事をやってたら面倒すぎたので、Subjectとかのヘッダ部分を簡単に書き換える方法を探した所、Rubyでやるのが早いっぽい事が分かったのですが、忘れそうなのでメモしておきます。

irbを起動して

require "base64"
def encode( str )
  "=?iso-2022-jp?B?" + Base64.encode64( NKF.nkf( '-j --utf8-input', str ) ).chomp + "?="
end

を貼り付ける。後はencode("文字列")でその都度結果を見ればいい。

XPCOMのRubyバインディング - Mar 15, 2009

僕をRubyの人にさせるんだったらRXPCOMでも作ってくんないと無理ですよ!(←Ruby覚えてもアドオン開発以外やる気なしなのか!) とかなんとかこないだ会社で言ってたけど、調べてみたらもうありました、rbXPCOM

Ruby on Rails - Mar 17, 2006

「Railsについて今更勉強を始めたいんだけど、どっからやればいいのかしら。もしかしてMySQLの使い方から?」「そんなことせんでもRails本いっこ買っとけ」ということでごろうさんオススメのRails本、ていうか現時点で日本語の書籍としては唯一のRails本なんだそうなんだけど、Railsによるアジャイルアプリケーション開発Amazon.co.jp)を買った。アマゾンは品切れ、ジュンク堂でも店頭在庫無しの重版待ちという有り様だったので、紀伊國屋書店BookWebでゲットです。

これでおいらもWeb 2.0に追いついてやるぜー(棒読み)

この本を買う直接のきっかけになった件は結局PHPとprototype.jsによるやっつけ仕事でそれなりに何とかなったっぽい?ので、後からやって来たこの本を見て正直「どーしよ……」感もないこともないんだけど、4000円近く出してしまったのだし何とかして元を取らないとやっとれません。そんな動機。

……で、この分厚くてデカイ本をどうやって会社まで持って行こうか。

Ruby on Rails - Jan 01, 1970

「Railsについて今更勉強を始めたいんだけど、どっからやればいいのかしら。もしかしてMySQLの使い方から?」「そんなことせんでもRails本いっこ買っとけ」ということでごろうさんオススメのRails本、ていうか現時点で日本語の書籍としては唯一のRails本なんだそうなんだけど、Railsによるアジャイルアプリケーション開発Amazon.co.jp)を買った。アマゾンは品切れ、ジュンク堂でも店頭在庫無しの重版待ちという有り様だったので、紀伊國屋書店BookWebでゲットです。

これでおいらもWeb 2.0に追いついてやるぜー(棒読み)

この本を買う直接のきっかけになった件は結局PHPとprototype.jsによるやっつけ仕事でそれなりに何とかなったっぽい?ので、後からやって来たこの本を見て正直「どーしよ……」感もないこともないんだけど、4000円近く出してしまったのだし何とかして元を取らないとやっとれません。そんな動機。

……で、この分厚くてデカイ本をどうやって会社まで持って行こうか。

Ruby on Rails - Jan 01, 1970

「Railsについて今更勉強を始めたいんだけど、どっからやればいいのかしら。もしかしてMySQLの使い方から?」「そんなことせんでもRails本いっこ買っとけ」ということでごろうさんオススメのRails本、ていうか現時点で日本語の書籍としては唯一のRails本なんだそうなんだけど、Railsによるアジャイルアプリケーション開発Amazon.co.jp)を買った。アマゾンは品切れ、ジュンク堂でも店頭在庫無しの重版待ちという有り様だったので、紀伊國屋書店BookWebでゲットです。

これでおいらもWeb 2.0に追いついてやるぜー(棒読み)

この本を買う直接のきっかけになった件は結局PHPとprototype.jsによるやっつけ仕事でそれなりに何とかなったっぽい?ので、後からやって来たこの本を見て正直「どーしよ……」感もないこともないんだけど、4000円近く出してしまったのだし何とかして元を取らないとやっとれません。そんな動機。

……で、この分厚くてデカイ本をどうやって会社まで持って行こうか。

Ruby on Rails - Jan 01, 1970

「Railsについて今更勉強を始めたいんだけど、どっからやればいいのかしら。もしかしてMySQLの使い方から?」「そんなことせんでもRails本いっこ買っとけ」ということでごろうさんオススメのRails本、ていうか現時点で日本語の書籍としては唯一のRails本なんだそうなんだけど、Railsによるアジャイルアプリケーション開発Amazon.co.jp)を買った。アマゾンは品切れ、ジュンク堂でも店頭在庫無しの重版待ちという有り様だったので、紀伊國屋書店BookWebでゲットです。

これでおいらもWeb 2.0に追いついてやるぜー(棒読み)

この本を買う直接のきっかけになった件は結局PHPとprototype.jsによるやっつけ仕事でそれなりに何とかなったっぽい?ので、後からやって来たこの本を見て正直「どーしよ……」感もないこともないんだけど、4000円近く出してしまったのだし何とかして元を取らないとやっとれません。そんな動機。

……で、この分厚くてデカイ本をどうやって会社まで持って行こうか。

Ruby on Rails - Jan 01, 1970

「Railsについて今更勉強を始めたいんだけど、どっからやればいいのかしら。もしかしてMySQLの使い方から?」「そんなことせんでもRails本いっこ買っとけ」ということでごろうさんオススメのRails本、ていうか現時点で日本語の書籍としては唯一のRails本なんだそうなんだけど、Railsによるアジャイルアプリケーション開発Amazon.co.jp)を買った。アマゾンは品切れ、ジュンク堂でも店頭在庫無しの重版待ちという有り様だったので、紀伊國屋書店BookWebでゲットです。

これでおいらもWeb 2.0に追いついてやるぜー(棒読み)

この本を買う直接のきっかけになった件は結局PHPとprototype.jsによるやっつけ仕事でそれなりに何とかなったっぽい?ので、後からやって来たこの本を見て正直「どーしよ……」感もないこともないんだけど、4000円近く出してしまったのだし何とかして元を取らないとやっとれません。そんな動機。

……で、この分厚くてデカイ本をどうやって会社まで持って行こうか。

Page 1/248: 1 2 3 4 5 6 7 8 9 »

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のコメント

最近のつぶやき