Supernova http://blog.dealforest.net be careful, be bravely Wed, 10 Feb 2010 11:22:46 +0000 http://wordpress.org/?v=2.8.6 ja hourly 1 mod_proxy + mod_proxy_balancer を使用した際の reverse proxy の設定のメモ http://blog.dealforest.net/2009/11/apache-cofig-reverseproxy/ http://blog.dealforest.net/2009/11/apache-cofig-reverseproxy/#comments Thu, 19 Nov 2009 06:04:40 +0000 admin http://blog.dealforest.net/?p=613 忘れそうだったのでメモ

ProxyRequests Off
ProxyPreserveHost On
ProxyPass / balancer://hogehoge/ timeout=2
ProxyPassReverse / balancer://hogehoge/
<Proxy balancer://hogehoge>
    BalancerMember http://192.168.1.1 loadfactor=10 keepalive=Off
    BalancerMember http://192.168.1.2 loadfactor=10 keepalive=Off
</Proxy>

ポイントは ProxyPreserveHost On ってところ。
ProxyPassReverse だけだと proxy 先に header の Host: をそのまま送ってくれるようになる。

参考資料

]]>
http://blog.dealforest.net/2009/11/apache-cofig-reverseproxy/feed/ 0
XML::Simple で RSS の entry を順番通りに取り出す方法 http://blog.dealforest.net/2009/09/xml-parse-in-order/ http://blog.dealforest.net/2009/09/xml-parse-in-order/#comments Sun, 06 Sep 2009 09:38:17 +0000 admin http://blog.dealforest.net/?p=595 たとえばこんな感じのフィードがあったとします。

<?xml version="1.0" encoding="utf-8"?>
<feed>
    <entry>
        <key>blog1</key>
        <title>blog1-title</title>
        <content>blog1-content</content>
    </entry>
    <entry>
        <key>blog2</key>
        <title>blog2-title</title>
        <content>blog2-content</content>
    </entry>
    <entry>
        <key>blog3</key>
        <title>blog3-title</title>
        <content>blog3-content</content>
    </entry>
    <entry>
        <key>blog4</key>
        <title>blog4-title</title>
        <content>blog4-content</content>
    </entry>
    <entry>
        <key>blog5</key>
        <title>blog5-title</title>
        <content>blog5-content</content>
    </entry>
</feed>

単純に parse するとハッシュに格納されるので
entry の並び順はめちゃくちゃになります。

dump結果

$VAR1 = {
          'entry' => {
                     'blog2' => {
                                'content' => 'blog2-content',
                                'title' => 'blog2-title'
                              },
                     'blog5' => {
                                'content' => 'blog5-content',
                                'title' => 'blog5-title'
                              },
                     'blog4' => {
                                'content' => 'blog4-content',
                                'title' => 'blog4-title'
                              },
                     'blog1' => {
                                'content' => 'blog1-content',
                                'title' => 'blog1-title'
                              },
                     'blog3' => {
                                'content' => 'blog3-content',
                                'title' => 'blog3-title'
                              }
                   }
        };

ランキングの RSS とかだと entry の順番が変わるだけで致命的です。
今回がまさにその状態。
blog1〜5の順番で entry に入っていてほしかったのです。

できないかと思って調べてたらいけました。
how to preserve XML::Simple element order
どうやら Tie::IxHash を使えばいけそうとのこと。
Tie::IxHash については ハッシュのキーを挿入(追加)した順番通りに取り出す がとても
まとまっておりわかりやすいです。

#!/usr/bin/perl
 
use strict;
use warnings;
 
use Tie::IxHash;
use XML::Simple;
use Data::Dumper; 
 
*XML::Simple::new_hashref = 'new_hashref';
sub new_hashref {
    my $self = shift;
    tie my %hash, 'Tie::IxHash';
    %hash = @_; 
    return \%hash;
}
 
my $parser = XML::Simple->new();
my $xml = $parser->XMLin('sample.xml');
warn Dumper $xml;
 
1;
 
__END__
結果
$VAR1 = {
          'entry' => {
                     'blog1' => {
                                'content' => 'blog1-content',
                                'title' => 'blog1-title'
                              },
                     'blog2' => {
                                'content' => 'blog2-content',
                                'title' => 'blog2-title'
                              },
                     'blog3' => {
                                'content' => 'blog3-content',
                                'title' => 'blog3-title'
                              },
                     'blog4' => {
                                'content' => 'blog4-content',
                                'title' => 'blog4-title'
                              },
                     'blog5' => {
                                'content' => 'blog5-content',
                                'title' => 'blog5-title'
                              }
                   }
        };

このように new_hashref を Tie::IxHash で tie してやった
ハッシュリファレンスを返すように override してやれば大丈夫です。
XML::LibXML でも同じようなことはできるらしいです。

]]>
http://blog.dealforest.net/2009/09/xml-parse-in-order/feed/ 0
snow leopard 移行したまとめ http://blog.dealforest.net/2009/08/migrate-over-t-snowleopard-from-leopard/ http://blog.dealforest.net/2009/08/migrate-over-t-snowleopard-from-leopard/#comments Sat, 29 Aug 2009 15:02:34 +0000 admin http://blog.dealforest.net/?p=587 snow leopard が届いた。
もちろん待てるわけもなく気づけば移行していたw

64bit で使いたかったからアップデートすると ports と Xcode, SDK 周りで
ハマりそうな気も凄いしたから結局クリーンインストールすることにした。

アップデート自体は QuickSilver と KeyRemap4MacBook が使えないと
作業効率に支障きたすからどうしようかと思ってたけど
TimeMachine にバックアップとって試してみた。

アプリケーション


iStat menu がそもそもつかえない。
しばらくしたら対応版がでるみたい。
それまでの我慢ということでしばらく放置。

本家対応済み。
前よりも個人的には使いやすくなっています。

QuickSilver はここから最新版を落とせばちゃんと動く。

KeyRemap4MacBook に関してはパッチをあててくれている人がいて無事に動作した(DL)
パッチも本家に送っているらしい。とりあえず暫定的には使える。
感謝感謝。

その他の Tips

起動時はデフォルトだと 32bit モードで起動している。
Snow Leopardの起動カーネルを32bitから64bitに変更『32- or 64-bit Kernel Startup Mode Selector』
を参考にしてデフォルトを 64bit にした。


safari だけ SIMBL をなぜか使えてる。
SIMBL を使う場合は 32bit モードで開けばいけるとのこと。
ただ GreaseKit はスクリプトが消えている。
追加もできないので結局使えてないようなもの。
ただいかんせん動作が不安定すぎる。。。
それにしても SIMBL 使えないのは不便すぎる。

追記 2009-09-06 22:00
InputManager がそもそも使えないから Logicool のドライバも入らないし。
なにより Terminal.appで選択時にコピーするSIMBLプラグインを作りました
使えなくなったのが相当不便。

あと 64bit の場合だとMac::Growl が使えなくなる。
MacPerl や Carbon 系のアーキテクチャが 32bit にしか対応していないためとのこと。
ソースはここ。
これどうにかならないかなぁ〜。

updatedb に関しては

sudo touch /var/db/locate.db
sudo chown nobody:wheel /var/db/locate.database

しておかないと権限の問題で locate.databse が生成されない。

snow leopard とは関係ないけど ports の perl が 5.10.1 になっていた。
体感速度はあがった気がするし今のとこは leopard に戻す!!
といったこともないので入れなおして良かったかな。
また随時追加していきます。

参考資料

Snow Leopardにアップデートした後に気をつけること 主にMacPortsとrubygemsについて
enabling SIMBL on Snow Leopard

追記 2009-09-06 22:00

■ Safari 関連

SIMBL本家が Snow Leopard 対応!!

64bit に対応した Safari の SIMBL プラグイン。
Tab 系と GreaseKit が 64bit で対応しているのが相当あつい!!
あとは Glims と SafariStand が対応してくれればほぼほぼ問題ない状態になりそう。

GreaseKit のスクリプトのまとめはここがよくまとまっています

■ Input switcher が組み込まれている!!

これすごい便利。なぜかデフォルトだとオフられているので設定が必要。
「言語とテキスト」->「入力ソース」->「入力ソースのオプション」
これを、「書類ごとに異なるものを使用」を選択する。
そうすると InputSwicter と同じようにアプリ毎に入力ソース(英字、ひらがな、etc)が保存されるようになる。

]]>
http://blog.dealforest.net/2009/08/migrate-over-t-snowleopard-from-leopard/feed/ 0
“Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法”が便利すぎる件 http://blog.dealforest.net/2009/08/repositorys-branch-preview-zsh-prompt/ http://blog.dealforest.net/2009/08/repositorys-branch-preview-zsh-prompt/#comments Fri, 21 Aug 2009 18:19:18 +0000 admin http://blog.dealforest.net/?p=562 “Git だろうと Mercurial だろうと、ブランチ名をzshのプロンプトにスマートに表示する方法” で紹介されている zsh の vcs_info という関数を使って
git や mercurial のブランチ名をプロンプトに表示しているみたいです。

git 使ってたら実際どのブランチいじってるのかわからなくなることが
多々あって困ってたのでさっそく導入してみました。

git リポジトリ

svn リポジトリ

svn リポジトリ

はまったのは “vcs_info: function definition file not found” というエラーが
表示され vcs_info が使用できなかった。
これはバージョンを 4.3.6-dev-0+20080929-1 以降にすればいいらしい。

mac の ports の場合は zsh-devel でいれないと 4.3.6 以下なので使用できない。
zsh-devel をインストールして /opt/local/bin/zsh-4.3.10 から /bin/zsh へと
/etc/zprofile から /opt/local/etc/zprofile へシンボリックリンクを張って準備完了。

zprofile のシンボリックリンクを張らないと PATH の環境変数が足らなくなる。
/usr/bin とかその辺の PATH をここを呼んで足してるみたい。
.zshrc の設定に関しては本家の方で詳しくまとまってます。
.zshrc の一部抜粋でこんな感じです。

autoload -Uz vcs_info
zstyle ':vcs_info:*' formats ':(%s)%b'
zstyle ':vcs_info:*' actionformats ':(%s)%b|%a'
precmd () {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"
}
PROMPT="%{${fg[yellow]}%}[%n@%m%1(v|%F{green}%1v%f|)%{${fg[yellow]}%}]%{${reset_color}%}%b "

zsh ちゃんと勉強すればもっと便利になりそうだな

参考資料

vcs_info: function definition file not found

アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。

]]>
http://blog.dealforest.net/2009/08/repositorys-branch-preview-zsh-prompt/feed/ 0
「Flash Liteで作る 携帯コンテンツ実践教科書」を読んで http://blog.dealforest.net/2009/08/read_books_of_flashlite/ http://blog.dealforest.net/2009/08/read_books_of_flashlite/#comments Sun, 02 Aug 2009 15:21:32 +0000 admin http://blog.dealforest.net/?p=541 MIDI au => SMAF softbank => SMAF コンパクトサウンド(.fls) 便利 Flash Lite が自動的に端末に合わせた音データを選択して再生してくれる Mobile & Device Developer Center だと繰り返しとかで対応していない 対応していない実機もある 全てをカバーするなら UA を見て出し分ける必要がある 複数音を同時に鳴らせない サウンドの繰り返しの際に処理が遅れる 待ち受けだと音が鳴らない 最適化について 線の最適化 :「修正」->「シェイプ」->「高度なスムーズ」 ベクターの最適化 : 「修正」->「シェイプ」->「最適化」 テキストについて 12, 24px を使う 変数のプロパティに直接 「/:newsTxt」みたいに指定できるのは知らなかった mblength => 2バイト文字での長さ (FlashLite1.1のみ) GPSについて docomo [...]]]> これはかなりの良書です。
これから Flash Lite を勉強しようとしてたり、すでにやってる人にもお奨めできる1冊です。
むしろこれ以外で役に立つ本が今までなかった。

書籍としてもサンプルにQRコードがついていて何もしなくても確認もできるし
Flash Lite1.1 の書き方と FLash Lite2.0 の両方のサンプルがついててわかりやすい。

中でも役にたつのが Chapter 10 と Chapter 11。
これだけのために本書をかったとしても損はないと思うくらいの内容。
さらに Flash Lite 3.1 までもカバーしています。

未だに知らなかったはまりどこもたくさんあったので著者の方々には本当に感謝です。
以下、簡単な自分用のまとめです。

音について

  • 機種毎の拡張子
    • docomo => MIDI
    • au => SMAF
    • softbank => SMAF
  • コンパクトサウンド(.fls) 便利
  • Flash Lite が自動的に端末に合わせた音データを選択して再生してくれる
    Mobile & Device Developer Center だと繰り返しとかで対応していない
    対応していない実機もある
  • 全てをカバーするなら UA を見て出し分ける必要がある
  • 複数音を同時に鳴らせない
  • サウンドの繰り返しの際に処理が遅れる
  • 待ち受けだと音が鳴らない

最適化について

  • 線の最適化 :「修正」->「シェイプ」->「高度なスムーズ」
  • ベクターの最適化 : 「修正」->「シェイプ」->「最適化」

テキストについて

  • 12, 24px を使う
  • 変数のプロパティに直接 「/:newsTxt」みたいに指定できるのは知らなかった
  • mblength => 2バイト文字での長さ (FlashLite1.1のみ)

GPSについて

  • docomo => 使えない
  • au => getURL(”device:location?url=CGIのURL);
  • softbank => getURL(”location:auto?url=CGIのURL);

お気に入りについて(auのみ)

  • 表示 => getURL(”device:home/bookmark”);
  • 登録 => getURL(”device:home/bookmark?url=[URLエンコードされたURL]&title=[URLエンコードされたもの]“);

Tips

  • 動的な変数の参照 (Flash Player6以前) ex) eval(”hoge” add 1);
  • 書き換え ex) set(”hoge” add 1, 0);
  • バイブレータ振動中は描画速度が落ちる
  • 決定キーを押しても一時的に処理が遅くなる
  • 同じタイミングでフレームの遷移、変数の代入したら駄目
  • ドットズレをさせないためには MC のサイズを偶数値にし位置を整数値にすればよい
  • 変数の初期値は”"
  • _width, _height は読み取り専用
  • マスクレイヤーの MC は操作できない
  • call で別の階層にあるラベルも call で呼べる ex) call(”../:hoge”);
  • 透明なオブジェクトの重なりは5階層までは正常に表示できる
  • && || よりも and or の方が処理が早い

あと、ここには書かれてなかったけどメモリの使用量を確認するときは
Mobile & Device Developer Center で確認するだけでなく
メインを実機で確認した方がいいと思う。
以前にメモリ使用量が実機だと倍になっていることがあったので
めんどくさいけど実機で見た方がいい。
あと、ビットマップ画像はそのままメモリに乗るのでバランス良くビットマップ画像を使う。

アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。

]]>
http://blog.dealforest.net/2009/08/read_books_of_flashlite/feed/ 1
リバースプロキシ後の webDAV に https で mv できない http://blog.dealforest.net/2009/07/subversion_behind_an_apache_reverse_proxy/ http://blog.dealforest.net/2009/07/subversion_behind_an_apache_reverse_proxy/#comments Wed, 29 Jul 2009 17:07:34 +0000 admin http://blog.dealforest.net/?p=528 サーバーの構成はこんな感じ

LB に pound (http, https 使える状態)
webDAV に mod_dav_svn を使って http で apche がたっている。

で、今回の問題が https で checkout したリポジトリに対して mv や rename すると
svn COPY 502 bad gateway over HTTPS と言われてコミットできない。
http だと問題なく mv, rename がコミットできる。

以下 http://www.digilib.org/modules/bwiki/index.php?Subversion#zca25176 より引用

これはHTTPS超えて、SVNを管理する場合、ファイル移動する際発生する問題。
davのモジュールは相対ではなく、絶対パスで管理するから。 
Subversion付属のsvnserveなら問題発生しない。

って書かれてたので半ばあきらめてた。
ただいかんせん、ほかにも https でやってるとこもある。
現に会社では webDAV, https という組み合わせでもできていた。

サーバのセットアップをやったついでに調べるとこれの回避方法をようやくみつけた!!

Subversion behind an Apache Reverse Proxy

ここに書いてあるとおりで、
どうやらリバースプロキシを使って、https で client からアクセスがいき
webDAV が http でたっている場合に怒られるらしい。

LoadModule headers_module modules/mod_headers.so
RequestHeader edit Destination ^https http early

こうしてやるといいとのこと。
これでよーやく気兼ねなく mv や rename ができるようになった。
快適快適

LB はさまずに直接 apache で受けたら回避できる問題だけど
Slowloris Dos攻撃 もあるから LB を間にいれときたいってのもあるしね。

それにしても https で pound が proxy すると
pound 以降は http で通信が行われてるっていう
認識だったんだけど違うのかな??

おいおい調べることにして寝る。

]]>
http://blog.dealforest.net/2009/07/subversion_behind_an_apache_reverse_proxy/feed/ 0
LDR+SBM Counter にコメント一覧機能をつけてみた http://blog.dealforest.net/2009/07/ldrsbm-counter-add-function-of-commet-list/ http://blog.dealforest.net/2009/07/ldrsbm-counter-add-function-of-commet-list/#comments Sun, 12 Jul 2009 18:27:53 +0000 admin http://blog.dealforest.net/?p=527 最近 FF から Safari に本格的に移行しようとしててネックになったのが tombloo と SBMカウンタ。
これがないと相当不便。
という訳で SBMカウンタ を SIMBLE とかで作ってる人いないかなと思って探すと
greasemonkey スクリプトで実装している方がいました。

Safari で動く LDR+SBM Counter を公開しました

いかんせん、これだとコメント一覧が取得できません。
それがあると文句なし!!!
ということで衝動で勉強がてら実装しちゃいました。

dealforest’s ldrsbmcounter at master – GitHub

デフォルト表示

フォーカスをはずしてる時

フォーカス時

フォーカスを当てた時

ロゴをクリックするとコメントのフィルタリングできます。
LDR をクリックすると全てのコメントが表示されます(画像用意してないだけw)。
とりあえず Safari4 で動くようにしかしてません。
一応 FF でも動いてるっぽい(スタイルが微妙にずれる)。
delicious だと SBMカウンタ の場合とコメントがずれるので
そのうち取得する API を変更する予定。
そーすると MD5 絡みがいらなくなるからコードがばっさり少なくなる。
あとコードはリファクタ前の状態。
けっこー汚いけど、眠いからそのうちする。

と、まぁ〜そのうちよくなる感じ。
本家さんが対応するまで??の仮対応みたいなノリで。
Safari で SBM カウンタで困ってる人がいればどーぞー

追記 2009-07-13 03:28:11

ブログ書いた後に気づいたけど本家の方で機能追加されてた。。。
なんて無駄なことしたんだろーかー。
まぁ勉強になったからいいやー。
というわけで使おうとした方はこちらのを入れて下さい。

]]>
http://blog.dealforest.net/2009/07/ldrsbm-counter-add-function-of-commet-list/feed/ 2
WEB+DB PRESS あたった http://blog.dealforest.net/2009/06/prezent-webdb-press/ http://blog.dealforest.net/2009/06/prezent-webdb-press/#comments Thu, 25 Jun 2009 16:36:51 +0000 admin http://blog.dealforest.net/?p=522 ほんとにあたんだー
初めて知った。

あたったー

]]>
http://blog.dealforest.net/2009/06/prezent-webdb-press/feed/ 0
Mac で screen 起動後に pbcopy を動くようにする方法 http://blog.dealforest.net/2009/06/can-use-pbcopy-on-screen/ http://blog.dealforest.net/2009/06/can-use-pbcopy-on-screen/#comments Wed, 24 Jun 2009 17:40:40 +0000 admin http://blog.dealforest.net/?p=518 ずっと pbcopy が動かなくてなんでだろうと思ってたけど
screen を起動しなかったら動いてることにきづいた。

ここをみると Ports で screen をいれればいいらしい。
でもそれじゃ動かない。で、色々と調べると
どうやらパッチをあてて自分でコンパイルすればよさげ。
というわけでさっそくコンパイルしたら pbcopy ができるようになった!!

以下、コンパイルの流れ。
http://git.savannah.gnu.org/cgit/screen.git
ここから screen のソースをおとしてくる。

パッチを下記のサイトを参考にあてる。
Macのscreen + pbcopy
screen で pbcopy/pbpaste が動かない問題
ちなみにパッチファイルをまとめて gist にあげた。(DL)
これを screen/src の中に保存。
そして screen/src の中に移動。

1
2
3
4
5
patch -s -p0 < screen-mac-pbcopy.patch    <- これでパッチがあたる
autogen.sh
./configure -prefix=/opt/loca/                    <- ports と同じ場所にいれたかったから prefix をつけただけ。
make
sudo make install

これで vim で “*y とすると pastebord にもコピーできた。
日本語まじりの文字をコピーしようとすると nkf が必要。
vim・mac間でクリップボードを介してやり取りする方法 完結編
を参考にして設定しました。

これでそーとー快適。
やっぱり pastebord や clipbord は共有されてるにかぎる。

]]>
http://blog.dealforest.net/2009/06/can-use-pbcopy-on-screen/feed/ 0
Gist を Vim から操作する Gist.vim が相当便利 http://blog.dealforest.net/2009/06/vim-plugin-gistvim/ http://blog.dealforest.net/2009/06/vim-plugin-gistvim/#comments Mon, 08 Jun 2009 16:14:25 +0000 admin http://blog.dealforest.net/?p=505 id:mattn さんが作った Gist.vim が gists を使う際にとても便利です。
curl が必要なのと id と token を vimrc に書けば使える。
ちなみに git config に設定していれば書かなくても大丈夫

簡単に操作の説明。(version 2.5)

let g:github_user = 'dealforest'
let g:github_token = 'XXXXXXXXXXXXXXXXXX'
:Gist ポストされます。
:’<,'>Gist 矩形選択部分をポストします
:Gist -p privateモードでポスト
:Gist xxxx idを指定して開く
:Gist -l [ユーザID] (ユーザーを指定して)一覧を開く
:Gist -la 全てのユーザの最新gist一覧
:Gist -c XXXXX クリップボードにコピー
:Gist -e 編集。ただし gist buffer 上でしかできない。

ショートカット

nnoremap <silent> ,gn :Gist<cr>
nnoremap <silent> ,gl :Gist -l<cr>
nnoremap <silent> ,ga :Gist -a<cr>
nnoremap <silent> ,ge :Gist -e<cr>
nnoremap <silent> ,gp :Gist -p<cr>
nnoremap <silent> ,gr :Gist
nnoremap <silent> ,gu :Gist -l

こんな感じでショートカットを作ってます

パッチ

実際に使っていて凄い便利。
ただ :Gist xxxx がどーしても動かなかったので gist.vim を修正した。

@@ -391,7 +398,7 @@
     elseif arg =~ '^\(-e\|--edit\)$' && bufname =~ bufnamemx
       let editpost = 1
       let gistid = substitute(bufname, bufnamemx, '\1', '')
-    elseif len(gistls) > 0 && len(gistnm) == 0
+    elseif len(gistnm) == 0
       if editpost == 1
         let gistnm = arg
       elseif len(gistls) > 0

gistls についてはそれ以下のところで判断してるのでここでいれたら動かないと思う。

あと自分用に少しカスタマイズした。
:Gist で POST した後に :Gist -l で一覧を表示した際
少しラグがありさきほど POST したのが表示されない。
修正したり変更したりするのが不便。というわけで POST 後に自動的に
buffer に開くようにした。これで :w で再度ポストもそのままできるから便利。
split して開くのがどーかとも思うけど、まぁいいやと放置

@@ -340,13 +340,6 @@
   let res = substitute(res, '^.*: ', '', '')
   if len(res) > 0 && res != 'http://gist.github.com/gists'
     echo 'done: '.res
+
+    let mx = '^http://gist.github.com/\(\d\+\)$'
+    if res =~# mx
+      let gistid = substitute(res, mx, '\1', '')
+      echo gistid
+      call s:GistGet(g:github_user, g:github_token, gistid, 0)
+    endif
   else
     echoerr 'Post failed'
   endif

GistListAction と動作が似てる(ほぼそこのコピペ)からいじればいいとは思うけど
そもそも vimscript そこまで分からなってないため妥協。
とりあえず動いてるしいいかと。。。

デバッグとかってどーするもんなんだろ。
みんな echo でしてんのかな。
効率いい方法はどうしたものか。

]]>
http://blog.dealforest.net/2009/06/vim-plugin-gistvim/feed/ 1