apache のユーザ認証を Google Apps アカウントで行う Apache::Authn::GoogleApps

https://github.com/nazoking/perl-apache-authn-googleapps
perlの書き方とかドキュメントの書き方とかどうやったらCPANにあげられるのかとかテストの書き方とか英語とか全然分からないので知ってる人は何とかして欲しいです。apache のユーザ認証を Redmine で行う Redmine.pm を見ながら作りました。

使い方は、GoogleApps.pm をダウンロードして、/usr/lib/perl/Apache/Authn/GoogleApps.pm みたいなところにコピーして(詳しい場所は自分のlinuxさんと相談)、httpd.conf に

  PerlLoadModule Apache::Authn::GoogleApps
  <Location /svn>
     AuthType Basic
     AuthName GoogleAccount
     Require valid-user

     # ユーザ名に自動で補完するドメイン。
     GoogleAppsDomain example.com
     # 自動で補完するドメインをくっつけるタイミング。Always 常に None 付けない
     # Auto ユーザ名に @ が入っていなければくっつける(hoge と入れたら hoge@example.com にして認証)
     GoogleAppsDomainAppend Always
     # 認証に成功したらその結果をサーバにキャッシュしている時間(秒数)
     # キャッシュするけどスレッドごとに別っぽい(ARP::Pool)
     GoogleAppsCacheCredsMax 3600

     # ハンドラを使う宣言
     PerlAuthenHandler Apache::Authn::GoogleApps::handler
  </Location>

のように書いてhttpdをリロード。/svnにアクセスすると、Basic認証のダイアログが出て、GoogleAppsのアカウントでログインできます。

apache のモジュールとして動くのでsvnの認証ハンドラとかにも出来ますね。

apache←→Googlehttps ですが apache←→ブラウザ はBasic認証なので http だと盗聴されたら Google のパスワードまで漏れますね。

追加機能としては Googleグループを見て制限する方法が欲しいけど、まあとりあえず。

個人的な理由から CentOS5 で簡単に入れられること、は至上命題です。cpan install XXX みたいなのが必要になるのはNG。
centos だと yum install mod_perl perl-libwww-perl くらいで動作するんじゃないかなぁ。

いろんなモジュールに依存したくないのでキャッシュの仕組みに Redmine.pm が使っていた ARP::Pool 使ってるんですがスレッドごとに別なんですな……なんかいい方法ないの?

perlを実に久しぶりに触ったらさっぱり分からなくて特に最初の方のuse なんとかはどっか空そのままコピペしてきたのが大半なので誰か治してください。

あと中身見たら簡単に他の認証方法に利用できると思います。

subversion/apache と Redmine のユーザを同期

同期というか、apacheの認証情報にredmineで使っているデータベースを使う方法。
Redmine には Apache-perlモジュールとして Redmine.pm というのがある。
http://www.redmine.org/wiki/1/Repositories_access_control_with_apache_mod_dav_svn_and_mod_perl
例えばredmineを /sites/redmine にインストールしたとすると /sites/redmine/extra/svn/Redmine.pm がそれ。
centos の場合は

yum install httpd-devel mod_perl

あと

yum install perl-Digest-SHA1 perl-DBI

これだとDBIが古くてDBD::SQLiteが入れられないようなので(sqliteをデータベースに使ってない人は他のモジュールを入れよう)

cpan install DBI
cpan install DBD::SQLite

とかで目的のモジュールをインストールした後

mkdir /usr/lib/perl5/site_perl/5.8.8/Apache/Authn
cp /sites/redmine/extra/svn/Redmine.pm /usr/lib/perl5/site_perl/5.8.8/Apache/Authn

とかして、Redmine.pm のヘッダに書かれているように httpd.conf を設定すればよい。(バージョンによってちょっとずつ違うみたい)

<Location /svn>
  SVNParentPath "/var/svn"

で、

svnadmin create /var/svn/hoge

がしてある場合、

http://xxxx/svn/hoge

にアクセスすると、ダイアログが出て redmine 上のプロジェクト hoge においてリポジトリの閲覧権限があるかどうかを調べてくれる(redmineのプロジェクト名とsvnリポジトリ名は合わせないといけない)。
動作が気に入らなければRedmine.pm をカスタマイズすればいいじゃなーい

ドコモの携帯宛メールを転送できるdocomo_web_mailerをリリースしました

Docomo Web Mail というサービスをドコモが行っていて、i-mode宛のメールをwebから閲覧できます。
http://dwmail.jp/
でも転送機能とかがないので、rubyでなんとかするライブラリを作りました。
RubyGems に登録したので、 gem install docomo_web_mailer でインストールできます。

使い方は、まずはドコモWEBメールのアカウントを登録して、

require 'rubygems'
require 'docomo_web_mailer'

login_id, password = dwメールのid,パスワード
your_smtp_server,your_smtp_server_port = SMTPサーバ,ポート
forwarding_mail_address = 転送先メールアドレス

mailer = DocomoWebMailer.new
mailer.login( login_id, password )
maillist = mailer.mail_list_start(mailer.mail_label_list[:inbox],1000)
#nextmaillist = mailer.mail_list_get(maillist,1001,1000)
Net::SMTP.start( your_smtp_server, your_smtp_server_port ) {|smtp|
  for mail in maillist
    smtp.send_mail mailer.make_mail_to_smtp( mail ), mail.from, forwarding_mail_address
  end
}

とかすると、1000通のメールが forwarding_mail_address 宛に転送されます。
既読処理とかしないと毎回1000通送信されるけど。

ソースはこちら
https://github.com/nazoking/docomo_web_mailer

自分的には満足してこれ以上手を加えるつもりはないので、このサービスを使ってメールを出したい人とかはforkしてpull requestしてみてください。特に頑張った人にはgemの管理権限をやろう(上から目線)

【Webアプリ】iPhone4 で画像をきれいに表示するもう一つの方法【mod_rewrite】

iPhone4は解像度が高いので、画像を切り替えないと、もやっとする。

【Webアプリ】iPhone4 で画像をきれいに表示する色々な方法【試行錯誤編】 | KAYAC DESIGNER'S BLOG - カヤックの意匠部によるデザインやマークアップの話

Retinaディスプレイに画像を最適化させるのって意外とめんどいよね!

という現実に打ちのめされたので、まとめてみます。

によると

  • ぜんぶ高解像度の画像にする → 3Gで表示が重いかも
  • 画像を2種類つくって切り替える → 画像の数が多いとひとつひとつCSS指定するのが辛すぎる
  • 画像はスケーラブルなデータ形式で用意する → 次に作るときはそうしよう……
  • 画像はそもそも使わないデザインにする → 次に作るときはそうしよう……

ということで決定打はなさそうな感じ。

でも、画像の切り替えって USER_AGENT 見て mod_rewrite で画像置き換えれば楽勝じゃねwwww とか思って調べたら、iphone3も4も同じなのね…サーバでiphone3か4か見分けるのは無理。

なんかもっといい方法無いのかーと探し回ったら

iOS4とiPhone4にアプリケーションを対応させる - システム開発ブログ (システム開発のアイロベックス|東京都新宿区の業務システム開発会社)

このためSDK4では既存の画像のファイル名の後に「@2x」という文字列を付けて、
「既存ファイル名@2x.拡張子」という形で同じパスに設置することで、
iPhone4の場合は@2xの画像を優先して使用することが出来ます。

とかいう表記を見付けて大喜びしたけど無理でした。アプリだけなのね。
普通に考えてそんなリクエスト数が二倍になるような仕様入れるわけない……

でまあ、そこでもうちょっと考えた。
ブラウザの読み込みは常にHTML→画像であり、HTML中ではjavascriptが動くので、そこにリクエストヘッダに影響を与えるよう何かを書いてやればいい。cookieだ。
今回は全部の画像について高解像度版を用意する必要がないと判断したので(DBに入っているのもあるし)、ファイル名の最後に @1x とついているファイルのみ、それを @2x に置き換えるようにする。

<html>
<head>
<script>
document.cookie = "pxratio="+window.devicePixelRatio+"; path=/;";
</script>
</head>
<body>
<img src="button1@1x.png" height="43" width="100" alt="高解像度も用意">
<img src="button2.png" height="43" width="100" alt="高解像度は用意しない">
</body>
</html>

まー普通のフレームワークとか使ってれば全部のページのヘッダにjs書き込むとか簡単なはず。これで解像度二倍の環境では、画像リクエスト時のクッキーに「 pxratio=2 」が書き込まれる。後は mod_rewrite で振り分けてやればいい。ファイル名も指定したものを一括置換できる環境を用意するのは難しくない。

後は httpd.conf で

  RewriteEngine on
  RewriteCond %{HTTP_COOKIE} pxratio=2
  RewriteRule ^(.*)@1x(\.[^.]*)$ $1@2x$2

のような指定を適当なところに書く。

これで今回の目的は達成された。

GMailの差出人表示をわかりやすくするDisplayName gmail

日本の携帯のメール機能は素晴らしい。何が素晴らしいって、「差出人の名前を自分のアドレス帳で書き換えてくれる」機能が素晴らしい。

  • なんかよくわかんないけど国際化とか言ってメールの自分の名前を英語で入れてる奴は死んだ方がいいですね。欧米か!日本語になって他方が絶対識別しやすいじゃないですか。Y,A,M,D ……あ山田さん とかっていう考える時間を返して欲しいですよね。
  • 会社名が入ってない奴も社会人としてどうか。どこの山田だよ!みたいな。
  • かといって社名がやたら長いのを律儀に入れててメールの差出人欄からはみ出して、名前の部分が見えない奴も困ります。寿限無寿限無コーポレーションの誰だよ! ってメール開かないと見えないとか。
  • あと同姓同名とかいたら最悪。どっちの?開発部の方?営業の方?
  • たまに携帯からメールくれるときに名前がついて無くて暗号化されたメールアドレスのまま表示される

でも、相手のメールのルールなので、俺様ルールに書き換えてもらうってのはかなりハードル高い。

そんな感じなので、強制的に書き換えるグリモンを作りました。
http://userscripts.org/scripts/show/83927
おまけ機能として連絡帳のグループ情報も入っているので、スタイルシートでグループ毎の色分けが出来ます。

連絡先(アドレス帳)で、人に「ヒルズのハゲ」とか「馬面」とかわかりやすい自分あだ名をつけておくと、そのように表示されます(メールを作成したときにはその名前で相手に届くので注意しましょう)。

スタイルシートの変更はGreasemonkeyのメニューの「ユーザースクリプトコマンド」→「Gmail DisplayName style customize」から出来ます。最初のサンプルを見るとだいたい分かると思いますが、

span[contact~='グループ名']{ background: rgba(0, 255, 255, 0.04); }

の様な感じでグループ情報が、名前を示すspanタグのcontact属性に入っているので、グループ毎の色分けができます。
僕が分けているのは「社内」「社外」「私用」「ML」「メルマガ」「アラート」とかです。
複数のグループに属しているアドレスは複数のグループすべてがcontact属性にスペース区切りで入っています。また、自分のドレスは me 、アドレス帳にないモノは notincontact、アドレス帳にあるモノは incontact が contact属性に入っていますので、それらでも色分け可能です。

あと spanタグのemail属性にメールアドレスが入っていますので

span[email$="@gmail.com"]{  font-style: italic;  }

のような感じでグループを作らないドメインによる色分けとかも可能ですね。

エクリプスのアイコンを書き換えてショートカットを作成するスクリプト

eclipseのアイコンを変える(windows) を自動でやるスクリプト。プロジェクト毎にアイコンを入れ替えると複数のプロジェクトを受け持つ場合にとても便利!エクリプスのアイコンやスプラッシュも書き換えているのでalt+TABでもどのエクリプスか分かります!


140行目辺りのエクリプスアイコン、フォルダーアイコンのURL or パスは自分の好きなのに書き換えてください。

コマンドラインから

ruby \ruby\eclipse-icon.rb \projects\Hoge\workspace

の様にすると、

します。

ruby \ruby\eclipse-icon.rb [ワークスペース] [アイコンファイルパス] [エクリプス実行ディレクトリ]

のように指定できます。

windows専用。rubygems、RMagickが必要です。windows の RMagick はWindows RMagick とかでググればいいんじゃないでしょうか。

Greasemonkeyのインストールしますか?ダイアログを消す

ソースを表示してもソースをダウンロード始めたりとか、URLの末尾しか見てないのでjavascriptでなくても出てくるとか、挙動が気に入らないので、出ないようにする。

// URLを監視しているcontent-policyを削除
Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager).deleteCategoryEntry("content-policy","@greasemonkey.mozdev.org/greasemonkey-service;1","@greasemonkey.mozdev.org/greasemonkey-service;1",true,true);
// スクリプトを表示したときに通知エリアに出るそれの動作が、そのままだと旨く動かないので変更
GM_BrowserUI.installCurrentScript = GM_BrowserUI.installMenuItemClicked;

クロム権限で上の二つをやれば、何となく望みの動作になる。クロム権限でスクリプトを動かすには keysnail とか vimperator とか executeJS とか userchrome.js とか、自分で拡張作るとか……