この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
vim は色々なコマンドがありますが、色々ありすぎてなかなか覚えられません。
今回ご紹介の移動コマンド「メソッド単位で移動」も、便利っぽいけど
なかなか覚えていられないたぐいのものですので、メモがてら投稿します。
]m 次のメソッドの始めに移動
]M 次のメソッドの終わりに移動
[m 前のメソッドの始めに移動
[M 前のメソッドの終わりに移動
ぜひお試しください!
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
vim は色々なコマンドがありますが、色々ありすぎてなかなか覚えられません。
今回ご紹介の移動コマンド「メソッド単位で移動」も、便利っぽいけど
なかなか覚えていられないたぐいのものですので、メモがてら投稿します。
]m 次のメソッドの始めに移動
]M 次のメソッドの終わりに移動
[m 前のメソッドの始めに移動
[M 前のメソッドの終わりに移動
ぜひお試しください!
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
会社で使っていたPCが壊れ、新しいPCを申請したらMacBookが来ました。ようこそ。
Macに慣れなかった為、Cent5を入れることに。
仮想サーバーとか、共存とかではなく、Macを全部消してCentを入れます。
WindowsPCにCentを入れる感覚で普通にインストールすると、普通に完了画面まで進みました。
なんだ、入るじゃん。と思いPCを再起動すると、フォルダにクエッションマークがついたアイコンが点滅していました。つまり駄目でした。
普通に入れるとブートローダーがうまく行かないらしい。
下記URLの記事通りにMacのCDでフォーマットしてからインストールしたらうまく入りました。
http://mobile-dev.izanagi-izanami.net/blog/?p=8
・MS-DOSファイルシステム、サイズ:0.1GB
ここがポイントですね。
私のMacだと0.1GBにならなくて7GBが最小単位でしたが、問題ありませんでした。
最後にMacを潰してCentを入れたメリットデメリットをご紹介。
とはいっても、まだあんまり使っていないのですが。
なんといっても使い慣れたOSは使いやすいです。
クライアントのサーバーと近い環境で開発出来るのはバグが少なくなる気がします。
MacBookに付いているキーボードに支障が出ています。
基本は使えますが記号系が一部互換性ないです。
致命的なのはパイプが使えません。history | grep hogeが入力出来ません。
別のキーボードを差して使っています。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
iPhone や Android を凌ぐとも言われる[要出展]スマートフォン、Palm Pre 向けのアプリケーションを作ってみましょう。
下記の解説は Mac を用いています。Windows 版はそのうち書かれることでしょう。
Palm Developer Center より、VirtualBox と Palm webOS SDK をインストールします。
DoRuby! は Ruby の解説サイトらしいので、Eclipse ではなく Aptana を使ってみることにします。Aptana のインストール方法は aptanaのインストールと使い方について をご覧ください。
メニューの Help > Install New Software… を開きます。
Add… ボタンを押して出る画面の Location 欄に http://cdn.downloads.palm.com/sdkdownloads/eclipse-update-site/site.xml
を入力。
Palm webOS SDK を選択し、Next を押します。その後色々聞かれますが OK ないし Yes ボタンを選んでいけばインストールが完了します。
メニューの File > Other… を選択。
Palm webOS > Hello World Application を選択。
アプリケーションフォルダに入っている Palm Emulator を起動します。色々ダイアログが出ますが適当に切り抜けてください。
Aptana に戻って実行ボタン
Palm Pre 端末が日本でも発売されることを願っています。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
最近モバイルでの開発をしていた際、各キャリアのユーザ識別IDを取得し、自動ログインをさせる機能を作成したことがあるのですが、その識別IDはいろいろとお約束があるらしく、少しハマったところなので、メモ書き程度にまとめてみます。各キャリア(DoCoMo、au、SoftBank)で取得できる端末識別ID・ユーザ識別IDについて、いろんな決まりごとがあるので、調べた範囲で書きます。
まずはDoCoMoからー
☆DoCoMo
DoCoMoでは、端末識別番号・iモードID・UID(公式サイトのみ)が取得できます。
・iモードID
URLのパラメータに「guid=ON」を付けると取得できる半角英数7桁の識別子。
公式サイトでなくても取得出来ますが、SSL対応しているページでは取得出来ません。
・UID
DoCoMo公式サイトに限り、URLのパラメータに「uid=NULLGWDOCOMO」を付けると取得できる半角英数12桁の識別子。
これも、SSL対応ページでは取得できません。
また、「uid=NULLGWDOCOMO」となっていますが、「NULLGWDOCOMO」の部分は12桁の半角英数であれば、「NULLGWDOCOMO」である必要はないらしいです。
だから、UIDを取得するときは12桁かどうかのチェックが必要になりますね!
SSLページで取得出来ないというのは結構クリティカルでした。。。
ちなみに対応としては、SSLページへの遷移の前に1つアクションを挟む(iモードID・UIDが取得できるアクションで取得する)か、SSLページへのリンクに何かパラメータをつけて、そのパラメータが無いと自動ログインとしてみなさない、といった対応が必要です。
(セッション情報を用いた成りすましに注意!!)
au、SoftBankに関しては、また別途追記します。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
ActiveRecord(以下AR)のバージョンが低いとfindでincludeとselectの併用ができません。
※確認バージョン:1.14.4
下記findを実行するとidだけの結果を取得することができます。
Hoge.find(:all, :select => "id")
ただ古いARでincludeオプションを含めて実行するとselectが効きません。
Hoge.find(:all, :select => "id", :include => :foo)
対応策としてはincludeの代わりにjoinを使うことで回避をすることはできます。
冗長になってしまいますが。
ARのバージョンが新しければ問題無く動作します(2.1で確認)
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
さて、突然出来たiPhoneアプリレビューコーナー。今回は筆者の趣味によるチョイスで「金沢将棋レベル100」を紹介します。昔からあるコンピュータ将棋の老舗、「金沢将棋」のiPhone版です。
名前からも分かる通り、本アプリの特徴はコンピュータの強さを100段階!に調節できることです。レベル1だと定跡も使わず、ほぼランダムで動かしているような印象。レベル100だとアマチュア初段ぐらいの力はありそうです。
コンピュータとの対局に勝つと、手合い(ハンデ)に応じてメダルが貰えます。飛車角を落として勝つと玉メダル。 また、貰ったメダルに応じて、使える盤・駒が増えていきます。メダルの一覧を一つずつ埋めていくのが地味に楽しいです。
個人的にはiPhoneの将棋アプリは盤の見やすさと駒の操作性が勝負と思っていますが、本アプリではメニューが簡潔に表示されていて盤が広く取ってありとても見やすく、操作もストレス無くスムーズに行えます。デフォルトではタップするとズームするようになっていますが、設定でズームをOFFにしたほうが操作がしやすいかもしれません。
さて、本アプリのメイン機能であるコンピュータとの対局も期待通りのクオリティですが、 さらに本アプリを良くしているのが、棋譜の保存とメール送信機能です。
単にコンピュータとの対局を保存してメールするだけならそれほど便利ではありませんが、自由に棋譜が入力できる対人戦モードを利用すると、外出先で指した将棋の棋譜を入力して、メール送信する事が出来ます。
しかもうれしい事に棋譜の形式は、通常テキスト形式とCSA形式から選ぶ事が出来ます。CSA形式はコンピュータにとって読み易い形式で、読み込み対応しているアプリケーションが多いため、他のアプリケーションにデータをインポートし易くて便利です。棋譜を管理できるiPhoneアプリもありますが、このアプリだけでも手軽に棋譜が保存できますね。
ご購入はこちらからどうぞ。金沢将棋レベル100
目次
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
こんにちは。エンジニアの はる です。
今回はちょっとだけマニアックにswfのバイナリ解析方法について書いてみたいと思います。
バイナリって何となく苦手意識のある方も多いかと思いますが、swfのバイナリ解析は数パターンの計算方法だけ抑えてしまえば意外と素直に読み解けてしまいます。
文系大学出身&英語が読めない私でも大丈夫だったので、興味のある方は是非!
まずはバイナリファイルを閲覧・編集できる環境を用意します。
バイナリエディタは様々なものがありますが、自分の環境や好みに合わせて選んでみてください。代表的なものを下記します。
1. バイナリモードでswfファイルを開く
vi -b hoge.swf
2. テキスト形式から16進数ダンプ形式に変換
:%!xxd
3. 16進数ダンプ形式からテキスト形式に変換
:%!xxd -r
解析するためにはSWFファイルが必要です。適当にSWFをパブリッシュして用意しておきましょう。
※今回の記事では、非圧縮のSWFをもとに解説させていただきます。解析用SWFは、「ファイル」→「パブリッシュ設定」→「SWF設定:ムービーの圧縮」のチェックをはずしたものをパブリッシュしましょう。
解析中に2進数・10進数・16進数の相互変換が沢山あります。このあたりの計算方法は事前に覚えておくか、基数変換を簡単に行えるWEBサイトやソフトが沢山ありますので、用意しておきましょう。
以上の用意ができたら、解析用SWFをお好きなバイナリエディタで開けば、準備完了です。
SWFのバイナリは下記のような形式で構成されています。
ヘッダ(header、header_movie)に基本情報が格納されており、コンテンツ(tag block)にシェイプやスクリプト等のコンテンツ情報が順々に格納されています。
SWF | |||||||||
---|---|---|---|---|---|---|---|---|---|
header(8バイト) | header_movie(可変長) | tag block(可変長) | tag block(可変長) | .. | end tag | ||||
圧縮有無(3バイト) | SWFのバージョン(1バイト) | ファイルサイズ(4バイト) | ステージの幅・高さ(可変長) | フレームレート(2バイト) | _rootのフレーム数(2バイト) | TLC構造(可変長) | TLC構造(可変長) | … | 2バイト |
まずはヘッダから読み解いていきましょう。ヘッダから読み取れる情報は以下の6種類です。
上記の情報が格納されているヘッダの構成は以下のようになっています。
ヘッダ | |||||
---|---|---|---|---|---|
header(8バイト) | header_movie(可変長) | ||||
圧縮有無(3バイト) | SWFのバージョン(1バイト) | ファイルサイズ(4バイト) | ステージの幅・高さ(可変長) | フレームレート(2バイト) | _rootのフレーム数(2バイト) |
それでは実際にバイナリを読み解いていきましょう。1バイト目から順に解説していきます。
SWFが圧縮されたものがどうかを判別します。
16進数 | 説明 | 備考 |
---|---|---|
46 57 53 | 圧縮されていないSWF | FWS |
43 57 53 | 圧縮されたSWF(※SWF6以降のみ) | CWS |
CWSの場合、8バイト以降がZLIB圧縮されていることを示しています。この場合、8バイト以降をZLIB展開する必要があります。
※以降の解説はFWSの前提ですすめさせていただきます。
SWFのバージョンが格納されています。以下の例の場合、SWF7形式であることが分かります。
16進数 | 説明 | 備考 |
---|---|---|
07 | SWFのバージョン |
swfファイルのファイルサイズが格納されています。ただし、数値はリトルエンディアン形式で格納されているため、注意が必要です。
16進数 | 説明 | 備考 |
---|---|---|
ec 52 01 00 | ファイルサイズ | リトルエンディアン形式 |
<計算方法>1. バイトスワップ
ec 52 01 00 | |
逆順 | 00 01 52 ec |
2. 10進数に変換
1.の結果(16進数) | 000152ec |
---|---|
10進数 | 86764 |
3. ファイルサイズ = 86764 byte
ステージの幅・高さが格納されています。ただし、数値はRECT構造体で表現されているのに加え、単位はTWIPSのため、注意が必要です。
16進数 | 説明 | 備考 |
---|---|---|
70 00 09 60 00 00 96 00 00 … | ステージの幅・高さ | RECT構造体で表現。単位はTWIPS(トゥイップ) |
<計算方法>1. 2進数に変換
16進数 | 70 00 09 60 00 00 96 00 |
---|---|
2進数 | 01110000 00000000 00001001 01100000 00000000 00000000 10010110 00000000 00000000 |
2. 最初の5ビットを10進数に変換
2進数 | 01110 |
---|---|
10進数 | 14 |
3. 2.の結果毎に6ビット目以降を区切る(余りのビットは捨てられます)
最初の5ビット | 14ビット | 14ビット | 14ビット | 14ビット | 余りのビット |
---|---|---|---|---|---|
01110 | 000 00000000 000 | 01001 01100000 0 | 0000000 0000000 | 0 10010110 00000 | 000 |
4. 3.の結果を10進数に変換
X座標の最小値 | X座標の最大値 | Y座標の最小値 | Y座標の最大値 | 余りのビット | |
---|---|---|---|---|---|
16進数 | 00000000000000 | 01001011000000 | 00000000000000 | 01001011000000 | 000 |
10進数 | 0 | 4800 | 0 | 4800 | – |
5. 4.の結果がtwipのため、ptに変換(1pt=20twips)
X座標の最小値 | X座標の最大値 | Y座標の最小値 | Y座標の最大値 | |
---|---|---|---|---|
twips | 0 | 4800 | 0 | 4800 |
pt | 0 | 240 | 0 | 240 |
6. 縦幅 = 240px, 横幅 = 240px
フレームレートが格納されています。
16進数 | 説明 | 備考 |
---|---|---|
00 08 | フレームレート | 逆順にした結果の1ビット目が整数部、2ビット目が小数部 |
<計算方法>1. バイトスワップ
00 08 | |
逆順 | 08 00 |
2. 整数部、小数部を10進数に変換
1.の結果(16進数) | 08.00 |
---|---|
10進数 | 8.0 |
3. フレームレート = 8 fps
_root(メインタイムライン)のフレーム数が格納されています。
16進数 | 説明 | 備考 |
---|---|---|
14 00 | _rootのフレーム数 | リトルエンディアン形式 |
<計算方法>1. バイトスワップ
14 00 | |
逆順 | 00 14 |
2. 10進数に変換
1.の結果(16進数) | 00 14 |
---|---|
10進数 | 20 |
3. _rootのフレーム数 = 20
ヘッダの解析はこれで終了です。SWF解析の肝は次バイトからのコンテンツ(tag block)ですが、これはヘッダ解析で行った計算方法の応用です。
ここから先は、tagの種類毎にtag blockの構造が異なるため、Adobe社が配布している『SWF file format specification』を片手にtagの種類を特定し、それに合った計算方法で解析していくことになります。
今回は一例として、ヘッダに続くtab block(SetBackgroundColor)の解説を行います。
1. タグ形式1(※「length < 3f」)の場合
コンテンツ | |||
---|---|---|---|
tag block(可変長) | … | ||
record header(2バイト) | contents(lengthバイト) | … | |
tag(10ビット) | length(6ビット) | contents(lengthバイト) | … |
2. タグ形式2(※「length >= 3f」または特殊形式)の場合
コンテンツ | ||||
---|---|---|---|---|
tag block(可変長) | … | |||
record header(6バイト) | contents(lengthバイト) | … | ||
tag(10ビット) | 3f(6ビット) | length(4バイト) | contents(lengthバイト) | … |
16進数 | 43 02 ff ff ff ff 0a 05 00 00 00 69 6e 69 74 00 3f 03 3a 03 00 00 88 06 01 1e 00 00 … |
---|---|
2進数 | 01000011 00000010 11111111 11111111 11111111 11111111 … |
16進数 | 説明 | 備考 |
---|---|---|
43 02 | tag(10ビット)+length(6ビット) | リトルエンディアン形式 |
<解析方法>1. バイトスワップ
43 02 | |
逆順 | 02 43 |
2. 2進数に変換
16進数 | 02 43 |
---|---|
2進数 | 00000010 01000011 |
3. 10ビット、6ビットに分割
tag | length |
---|---|
0000001001 | 000011 |
4. 『SWF file format specification』のp.271〜p.273をもとにtagの種類とlengthを算出する
2進数 | 10進数 | 結果 | |
---|---|---|---|
タグ種別 | 0000001001 | 9 | SetBackgroundColor |
length | 000011 | 3 | 3 |
5. タグ形式2(※「length >= 3f」または特殊形式)の場合、続く4ビットを取得し、lengthを算出する6. 続くlengthバイトを取得し、『SWF file format specification』の各タグ処理の記載に沿って解析
※SetBackgroundColorの場合
RGB | ff ff ff |
---|
※setBackgroundColorは、必ずコンテンツの先頭に位置し、「長さ:5バイト」となる
setBackgroundColor(5バイト) | ||
---|---|---|
tag(1バイト) | length(1バイト) | RGB(3バイト) |
あとはtagの種類毎に決められたフォーマットで解析していき、順々にコンテンツ(tag block)を解析していきます。
このswfのバイナリ構造を抑えておくと、例えば、Flash単体では通常取得することが困難な情報をバイナリレベルでswf内に埋め込んでから出力するアプリケーション開発したり、swfmillで出力されるxmlフォーマットもバイナリ構造と近いので理解しやすくなったりします。 皆さんもちょっとアブノーマルなバイナリの世界にいかがでしょうか?
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
MYSQLで高速な日本語全文探索を実現するため、tritonnでMYSQL+Sennaにする。
■tritonnとは?
MySQLから全文検索エンジンSennaを利用可能にするための改造を行うプロジェクトのこと。
■Sennaってなんなの?
Sennaは組み込み型の全文検索エンジン。
■Sennaの特徴
・組込み型
MySQLに組み込んで使用する為、MySQLがアプリケーションからSennaを隠蔽します。
開発者の方はSQL文を操作するだけで、全文検索を実行できます。
・高速
キーワードがテキスト内のどの位置にあるかという位置情報を持った、
完全転置インデックスを採用している為、フレーズ検索においても高速な検索が可能です。
・即時検索
作成したインデックスに対して、インクリメンタルに文書の追加/変更/削除の操作を加えることができるため、
文書に次々と変更が加えられる場合にも、一度作成したインデックスを作成し直す必要がありません。
■なんでSennaをいれる必要あるの?
1. MySQLには日本語環境で使用するための十分な全文検索機能ができない。
・MySQLのFULLTEXTインデックスのキーワード抽出を行うパーサが、
「半角スペースで区切られているものをキーワードとして認識する」という実装になっているため。
・LIKE演算子による部分一致検索は可能だが、インデックスを一切使用することができなくなってしまうため、
テーブルのフルスキャンが発生します。
2. MYSQLでは全文検索を行うための実装面での十分な高速化が行われていない。
■toritonn 導入について
toritonnのダウンロードについて
http://qwik.jp/tritonn/download.html
toritonnのユーザガイド
http://qwik.jp/tritonn/userguide.html
■tritonnの2ind機能(2インデックス同時使用機能)
MySQLではクエリを実行する際、1つのテーブルに対してFULLTEXTインデックスと他のインデックスを組み合わせて利用することができません。
従ってFULLTEXTインデックスを用いる用いた場合、以下のような問題が生じます。
1. limit指定で出力を制限しても応答が遅い問題
2. count(*)等で件数を取得するだけでも応答が遅い問題
3. 全文検索以外の条件で絞り込む処理が遅い問題
4. 全文検索以外の条件でソートする処理が遅い問題
上記の問題を解決するために、MySQLが全文検索用のインデックスと通常のインデックスの両方を併用できるようにするのが2ind機能です。
■2ind利用法
Tritonnパッチをあてると、MySQLのサーバ変数(SESSIONスコープ)に”senna_2ind”という変数が追加されます。
下記のどちらかの方法で、2ind機能の利用を動的にOn/Offすることができます。
・my.cnfあるいはmysqldの起動オプションで”–senna-2ind”を指定する。
・SETコマンドでONを設定してください。→ mysql> SET SESSION senna_2ind=ON;
以下、公式より2ind機能使用について、注意書きがあります。
注意:2ind機能はまだ安定度合いとしてはβ段階にあります。
実際に利用する前に有効かどうか、利用環境で問題は無いかどうかをご確認の上、使用してください。
■参考文献
■Senna 組み込み型全文検索エンジン
http://qwik.jp/senna/FrontPageJ.html
■toritonnプロジェクト
http://qwik.jp/tritonn/
■toritonn ユーザガイド
http://qwik.jp/tritonn/userguide.html
■MySQLで全文検索 – FULLTEXTインデックスの基礎知識
http://www.tatamilab.jp/rnd/archives/000389.html
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
今回は、場所を覚えられない人必見の「ここメモ!」を試してみました。
自分も一度行ったところを忘れてしまうタイプなので、周辺情報など記録しておくと便利!?
起動すると、GPSが動きますが現在地を地図上に表示してくれるので、 後はタイトルと写真を写して保存する。いちいち場所入力せずに済むのでとても便利です!!
録音機能もあるので、音声でコメントなんか吹き込んでおいたり、特徴的な音を録音しておくと更に分かりやすいかも・・・
登録した場所なんかは、登録日を軸として日別/週別/月別にリストで表示されます。
まだ使いこなせてないのですが、登録日を軸として表示ではなく、全てのリストを表示して欲しいなと思いました。
地図からのピン検索などユニークな検索もあったので、面白いです。
色々な場面での話題にもなりそうなので重宝しそうです。
iTunesのリンク貼っておきます!!こちらからどうぞ
「ここメモ!」
目次
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Ruby1.9 で Rails2.3 を動かす方法を紹介します。
Ruby1.9 を Rails で動かす上で、一番頭を悩ませる問題が、
incompatible character encodings: ASCII-8BIT and UTF-8
というエラーかと思います。
Ruby1.9 から String に Encoding を持つようになりました。
これにより異なる Encoding 同士では、比較・結合を行うことができず、上記のようなエラーが発生してしまいます。
これは、Magic Comment で script encoding をUTF-8で指定しても、DB の Encode を UTF-8 に指定しても発生してしまいます。
これには色々と原因があるのですが、大きくは ActionView のレンダリング時に、ASCII-8BIT で出力される部分があるのが問題となります。
通常、Ruby1.9 でコーディングする際には、Magic Comment を記述し、script encoding を明示します。
この方法だけで、基本的な1ファイルでの View のレンダリングは問題なく行えます。
しかし、partial や layout を利用して、複数の View を組み合わせた場合に、問題が発生します。
ActionView は、内部的に読み込んだ View ファイルを buffer に格納し、順次結合していきますが、
buffer の Encoding が、partial した View と結合される際に、ASCII-8BIT となってしまうため、エラーが発生するようです。
ということで、ActionView にパッチを当てます。
View ファイルを読み込み、順次結合してる部分に問題があるので、その部分を UTF-8 に Encode するように指定します。
パッチを当てる方法は何でもいいのですが、今回は alias_method_chain を使った方法で記述します。
下記コードをlib以下などに格納して、起動時に読み込まれるようにします。
# -*- coding:utf-8 -*-
module ActionView
module Renderable
private
def compile_with_magic_comment!(render_symbol, local_assigns)
locals_code = local_assigns.keys.map { |key| "#{key} = local_assigns[:#{key}];" }.join
source = <<-end_src
# -*- coding:utf-8 -*-
def #{render_symbol}(local_assigns)
old_output_buffer = output_buffer;#{locals_code};#{compiled_source}
ensure
self.output_buffer = old_output_buffer
end
end_src
begin
ActionView::Base::CompiledTemplates.module_eval(source, filename, 0)
rescue Errno::ENOENT => e
raise e # Missing template file, re-raise for Base to rescue
rescue Exception => e # errors from template code
if logger = defined?(ActionController) && Base.logger
logger.debug "ERROR: compiling #{render_symbol} RAISED #{e}"
logger.debug "Function body: #{source}"
logger.debug "Backtrace: #{e.backtrace.join("\n")}"
end
raise ActionView::TemplateError.new(self, {}, e)
end
end
alias_method_chain :compile!, :magic_comment
end
end
actionpack/lib/action_view/renderable.rb の68,69行目に Magic Comment を追加するだけです。
このパッチだけで、レンダリング時の Encoding の問題はほぼ解決できるのですが、
次に問題になってくるのが、日本語の文字列をフォームから GET で送信した場合です。
この場合は、
incompatible character encodings: UTF-8 and ASCII-8BIT
というエラーが発生します。
これは、送信されたデータを text_field などに再セットする場合に発生します。
UTF-8 の view に対して、ASCII-8BIT の文字列を結合しようとしているのがエラーの原因となります。
どうやらこの問題は Rack::Utils.unescape にあるようです。
Rack は、URL をデコードする際に、マルチバイト文字列を ASCII-8BIT として Encode してしまいます。
POST も同様に Form データの parse 時に同様の問題が発生しますが、GET と同じ対応で対処することは可能です。
ただし、POST の場合はこれだけでは解決せず、multipart 指定のフォームについては別途対処する必要があります。
multipart 用の parser である、Rack::Utils::Multipart.parse_multipart の戻り値の文字列は ASCII-8BIT となってしまうので、こちらも別途対処する必要があります。
上記の問題は、Rack にパッチを当てることで解決することは可能です。
ただし、この挙動自体は Rack としては正しい動作ではあります。
Encoding の問題はアプリケーション側で解決すべきで、Rackは関知すべきではないからです。
ということで、上記の問題を解決するパッチを ActionController に当てます。
パッチの適用方法は ActionView と同様です。
# -*- coding:utf-8 -*-
module ActionController
class Request
private
def normalize_parameters_with_force_encoding(value)
(_value = normalize_parameters_without_force_encoding(value)).respond_to?(:force_encoding) ?
_value.force_encoding(Encoding::UTF_8) : _value
end
alias_method_chain :normalize_parameters, :force_encoding
end
end
actionpack/lib/action_controller/request.rb の472行目の normalize_parameters を修正します。
これにより、アプリケーションのコントローラでparamsを利用する時点で、リクエストパラメータに含まれる文字列は、UTF-8 に Encode されているので、view との結合も問題なく行うことができます。
今回紹介した ActionView、ActionController を修正する方法で、Ruby1.9 上で Rails2.3 系をとりあえず動かすことはできそうです。
ただし、利用するプラグインやAPサーバによっては、別途対応が必要な場合があるようです。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
たろちゃんです。SourceForge.JP のプロジェクトをSubversionからGitへ移行しましたのでその時に記録から手順を紹介します。
僕が現在開発しているエレコマはSourceForge.JPにてホスティングを行っており、開発リソースをすべて一元管理しております。
開発当初、弊社内のレポジトリがSubversionであった事や僕自身にSubversionの運用ノウハウがあったことからSourceForge.JPでもSubversionを採用していました。
しかしながら、Railsのプロジェクトという特性からか、何人かgit-svnを利用している方がおり、また開発に集中するという意味でもGitの方が魅力的であるため、今回SubversionからGitへ移行しました。
まずはGit自体を有効にします。Gitを有効にするためにはSourceForge.JPへ管理者としてログインしてからプロジェクトのメニューの「管理」から「プロジェクト情報変更」を選択して「プロジェクト情報変更画面」を出します。この中にある「利用する機能」にあるGitを利用のチェックボックスを有効にして情報を保存します。
続いてプロジェクトのメニューの「ソースコード」から「Git管理」を選択して、「新規Gitレポジトリを作成」というリンクを辿り、必要な情報を入力をしてGitレポジトリを作成します。数分のち、作成済が解除され、レポジトリが有効になります。
エレコマの場合は以下の内容で生成されました。
git clone tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
では、さっそく移行作業を開始しましょう。
まずは作業用ディレクトリを作成し、移動します。
$ mkdir -p ~/develop/elecoma/tomove_git
$ cd ~/develop/elecoma/tomove_git
次にgit svn cloneを使ってSubversionのデータをすべて取得します。–prefixには svn/ を追加してリモートレポジトリをわかりやすくします。
$ git svn clone --prefix svn/ -s svn+ssh://tmatsuzawa@svn.sourceforge.jp/svnroot/elecoma/
そしてgit remote add を使ってSourceForge.jpのGitレポジトリを追加します。リモートレポジトリの名前はoriginとします。
$ cd elecoma
$ git remote add origin tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
あとはmasterの内容をリモートレポジトリ(origin)へ push します。念のため –dry-run をつけて内容を確認しておくとよいでしょう。
$ git push origin master --dry-run
(初回実行時にgit.sourceforge.jpをsshのknown_listへ追加するか確認されます)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new branch] master -> master
$ git push origin master
Counting objects: 2581, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2504/2504), done.
Writing objects: 100% (2581/2581), 6.94 MiB | 2.83 MiB/s, done.
Total 2581 (delta 1006), reused 0 (delta 0)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new branch] master -> master
以上で、masterの内容をリモートレポジトリへすべて push しました。しかし、エレコマではリリースごとに tag を切っていますので、こちらも反映します。
Subversionでの tag はGitにおいては branch に相当します。まずはリモートの branch を確認します。
$ git branch -r
origin/master
svn/1.0.x
svn/tags/1.0.6
svn/tags/1.0.7
svn/tags/release-1.0.1
svn/tags/release-1.0.2
svn/tags/release-1.0.3
svn/tags/release-1.0.4
svn/tags/release-1.0.5
svn/trunk
この場合は svn/tags/release-1.0.1 という branch がGitにおける tag に相当します。なので、branch に移動して tag を切ってそれを push していきます。
$ git checkout svn/tags/release-1.0.1
$ git tag 1.0.1
$ git push --tags origin --dry-run
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new tag] 1.0.1 -> 1.0.1
$ git push --tags origin
Counting objects: 1, done.
Writing objects: 100% (1/1), 266 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new tag] 1.0.1 -> 1.0.1
これで tag が切れました。他の tag も同様に作業をしていきます。
$ git checkout svn/tags/release-1.0.2
$ git tag 1.0.2
$ git push --tags origin
Counting objects: 2, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 454 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new tag] 1.0.2 -> 1.0.2
.
.
.
$ git checkout svn/tags/1.0.7
$ git tag 1.0.7
$ git push --tags origin
Counting objects: 1, done.
Writing objects: 100% (1/1), 259 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new tag] 1.0.7 -> 1.0.7
以上ですべての tag が切れました。
あとは、別のディレクトリで git clone をして確認をしましょう。
なお、エレコマでは 1.0.x という branch も存在していましたが、 git ではリリースされたものに対しては branch を用意する必要がないためこのままにしておきます。必要に応じて、以下のようにして branch を作成して作業をするとよいでしょう。
$ git branch RB_1.0.7_1 1.0.7
なお、このテクニック自体はSourceForge.JP以外でも使えると思います。SubversionからGitに移行を検討している方はぜひ参考にしてください。
さて、これで2.x系の開発が…はかどるといいなぁ…
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
WEBサーバ2台構成でpoundによるLBを行う例を書きます。
サーバの情報など
web-vip : 10.0.0.10
web1 : 10.0.0.11
web2 : 10.0.0.12
今回の例ではpoundをweb1に設置し、負荷分散先をweb1、web2とします。
設定方法としては、poundでport80をListenし、web1のport8000、web2のport80へLBする。
という感じです。
poundの設定です
ListenHTTP
Address 10.0.0.10
Port 80
Service
BackEnd
Address 10.0.0.11
Port 8000
End
BackEnd
Address 10.0.0.12
Port 80
End
End
End
以上の設定で完了です。
必要に応じて負荷分散の割合を変更することができますので、
様子をみてweb1の分散を減らしてあげる必要があるかもしれません。
また、インストールに関しては、下記エントリーが大変参考になりました。
http://doruby.kbmj.com/curi/20100313/Pound_HTTP_2048kb_
あと、poundをweb1のみに設置している理由はListenのAddressの重複が許されていないが為です
なのでpoundが落ちた場合などはweb2へvipをうつしますので、web2は80でlistenしてます
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
mod_rpafを使ったIPアドレスのアクセス制限に悩まされたので紹介します。
リバースプロキシ(pound)などを使った環境でapacheのアクセスログに
出力されるIPアドレスがプロキシサーバのIPになる問題を解決するために利用されるmod_rpafですが、
ログの問題はクリアしたところで、IPアドレスを使ったアクセス制限が機能しない問題に悩まされました。
今回利用したmod_rpafのバージョンは0.6です。
apache2.2.xの環境で試しています。
インストール方法は割愛です。
インストール後に以下のような設定ファイルを記述します。
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips <プロキシサーバのIPアドレス>
「Allow from」にIPアドレスを記載したアクセス制限は機能しなかったのでRewriteCondを使った制限に書き換えました。
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx
↓
RewriteCond %{REMOTE_ADDR} !^XXX\.XXX\.XXX\.XXX$
RewriteRule ^.*$ - [F,L]
mod_rpafのソースまでは見ていないですが気付き難いですね。
当然mod_authとmod_rewriteで扱う変数が違うのでしょう。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
ども、 rick No.17です。
今回は正規表現で以外とはまりがちというか忘れがちなことについて書きます。Railsのvalidateの一つである
validates_format_ofを使用している時にちょっとはまりました。
こんな記事があるとします
hoge
hogehoge
しかし、開発者は改行を付けてほしくない。
なので改行をした記事は、投稿できない様にしたいわけです。
$vi app/models/hoge.rb
class Hoge < ActiveRecord::Base
validates_format_of :body, :with => /^[^\r\n]*$/, :message => “は、改行禁止です”
end
記事のカラムはbodyカラムで、改行禁止の正規表現を書いたつもりでした。。が、、、、
全然問題なく改行しても登録されてしまう。。。
なぜか???
答えは^と$でした。
^は行頭、$は行末であり文の先頭から最後ではない。
つまり改行前の「hoge」と改行後の「hogehoge」しか見てくれない為、
改行の\nはマッチしない。
hoge\n
hogehoge
上記の下線部分しかみてくれないわけですね。
では、どうすればいいか?
\Aと\zを使用すればいいのです。
\A\zは改行を無視して文頭、文末を見てくれるので一文の中から改行の有無を探してくれます。
$vi app/models/hoge.rb
class Hoge < ActiveRecord::Base
validates_format_of :body, :with => /\A[^\r\n]*\z/, :message => “は、改行禁止です”
end
あぁそういえばそうだね。といったかんじですが、
なにげに忘れてしまいがちなので覚えておきましょう。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
急にタイトル通りのエラーが出てしまいました。
ruby-1.8.6にてgemいじってたら
% gem install rails -v=1.2.6
WARNING: RubyGems 1.2+ index not found for:
RubyGems will revert to legacy indexes degrading performance.
Updating metadata for 1 gems from http://gems.rubyforge.org/
.
complete
^U
Bulk updating Gem source index for: http://gems.github.com/
Successfully installed activesupport-1.4.4
Successfully installed activerecord-1.15.6
Successfully installed actionpack-1.13.6
Successfully installed actionmailer-1.3.6
Successfully installed actionwebservice-1.2.6
Successfully installed rails-1.2.6
6 gems installed
Installing ri documentation for activesupport-1.4.4...
ERROR: While executing gem ... (NoMethodError)
undefined method `fdiv' for 0:Fixnum
な事をいわれてしまいました。インストール自体はできている模様なので問題なさそうですが、ドキュメントのインストールでこけてます。たぶん。その場しのぎの回避策で~/.gemrcに
install: --no-ri --no-rdoc
update: --no-ri --no-rdoc
とか書いてみました。
根本的な解決になってないですが気が向いたらまたおってみます。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
最近WindowsXPの起動が遅くて、アプリケーションの立ち上げに時間がかかります。ブラウザ立ち上げるのに5分くらいかかります。
タスクマネージャーで確認してみると、wuauclt.exeというWindowsUpdateの自動更新プロセスをなんとかしてみます。
wuauclt.exeはWindowsXP起動直後、タスクマネージャーにてプロセスをメモリ使用の大きい順でソートすると上のほうに出てきます。
このプロセスは今までのWindowsUpdateで今まで何を更新してきたかの履歴を調べ、その時点での最新のアップデートを監視するようです。なので、履歴が多ければ多いほど負荷がかかるようです。
解決方法としてはアップデート履歴を消すこと
参考URL
http://www.inoran.com/archives/2009/0523_1753.php
↑のサイトを参考に、以下を実行します。
1. Automatic Upates(自動更新)サービスを停止
2. DateStoreフォルダの内容を削除
※私の場合、このフォルダの容量は200MBちょいありました。
3. AutomaticUpdates(自動更新)サービス再開
今までに比べてPC起動からブラウザ立ち上げまでの時間が少し早くなったような気がします。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
画像ファイルからEXIF情報を取り出すにはどうしたら良いのでしょうか?
まず、そんな疑問に今回は挑戦しました(大げさ)。
画像ファイルからEXIF情報を取り出すにはどうしたら良いのでしょうか?
まず、そんな疑問に今回は挑戦しました(大げさ)。
RubyのExifライブラリは幾つかあるようですが、現在も開発が進んでいるものが少ないようです。
そんな中、
http://rubyforge.org/projects/exifr
を見つけました。
ライセンスはRubyライセンスです。
今回、このexifrを利用して、画像ファイルからEXIF情報を取得します。
画像ファイルからEXIF情報、特にデジタルカメラのメーカー名、カメラ名を取得したいと思います。
(今回はSONY DSC-W300で撮影した画像を利用します)
gemからインストールしてみます。
sudo gem install exifr
インストールはとても簡単です。
gemが古い場合はインストール時にErrorが起こってしまいます。
sudo gem install rubygems-update
sudo update_rubygems
をしてgemのバージョンを最新版にするといいでしょう
では、実際にirbから使ってみましょう。
tomonori:~# irb
irb(main):001:0> require 'rubygems'
irb(main):002:0> require 'exifr'
irb(main):003:0> file = '/path/to/filename'
irb(main):004:0> exif = EXIFR::JPEG.new(file)
irb(main):005:0> exif.make
=> "SONY"
irb(main):006:0> exif.model
=> "DSC-W300"
irb(main):007:0> exif.width
=> 2048
irb(main):008:0> exif.height
=> 1536
irb(main):009:0> exif.date_time
=> Sat Dec 20 16:14:57 +0900 2008
exifrというライブラリを利用することで簡単に画像ファイルからEXIF情報を取得できました。
これを利用することで、カメラ情報などが画像から取得できます。
今回は試しておりませんが、どのケータイから撮影されたものかもわかりますので、そのユーザが撮った画像であるかどうかの判断にも利用出来るかと思います。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
こんにちは、KBMJの中平@railsエンジニアです。
今回は、ruby on railsでデータをCSVファイル出力が簡単にできる プラグインついて書きます。
前回、ruby on railsでデータをExcelファイルに出力する方法を書きましたが
ExcelファイルよりCSVファイルに出力する機会が多いだろうと思います。
また、railsでCSVファイルを出力するのは、さまざまな方法がありますが、
今回は設定も簡単で、コードの記述も比較的少なくてすむ to_csvというpluginの使い方について書こうと思います。
OS : Windows Vista
Ruby : 1.8.6
ruby on rails : 2.1 (2系以上ならto_csvが使えると思います)
ruby script/plugin install git://github.com/arydjmal/to_csv.git
to_csv はfastercsvが必要なため
gem install fastercsv
def index
@users = User.all
respond_to do |format|
format.html
format.xml { render :xml => @users }
format.csv { send_data @users.to_csv }
end
end
@users.to_csv で取得したデータをCSV形式にしています。
また README.rdocに書いているオプションを解説すると
@users.to_csv
すべてのカラムを出力
@users.to_csv(:only => [:last_name, :role])
onlyで指定したカラムを出力
@users.to_csv(:headers => false)
先頭行にカラム名を出力しない
@users.to_csv(:except => [:last_name, :role])
exceptで指定したカラム以外を出力
@users.to_csv(:except => :role, :methods => :admin?)
:methodsはカラム名?で記述したカラムのデータのnullを判定しているぽい
nullだったらfalse null以外はtrueを表示している
このような動作をするようです。
このあたりは、find時に出力データをrails側で制御してもいいかもしれません。
コントローラー名/index/hoge.csv
というようにアクション名の後ろにファイル名をつけてブラウザでアクセスすると
データがCSV形式で出力されますので、ファイルに保存後エディタ等で開くとデータを見ることができます。
なお、この出力したファイルをExcelで表示してみるとわかるのですが、
なんと日本語が文字化けします。これはto_csvの出力がUTF8になっているためで、Excelはsjisでないと日本語が文字化けしてしまいます。
原因は出力時の文字コードですので、kconvなどを利用して、CSVデータを出力している部分に tosjis をしてあげればいいでしょう。
この to_csvというplugin は簡単に導入できてコードも数行で済みますので、ruby on rails から CSV形式でデータ出力 を簡単にしたい場合には試してみてはいかがでしょうか?
Ary Djmal / to_csv plugin: Better Excel Compatibility
http://arydjmal.com/2008/6/11/to_csv-plugin-better-excel-compatibility
arydjmal’s to_csv at master – GitHub
http://github.com/arydjmal/to_csv
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
こんにちは。KBMJの本多です。
今回はcounter_cacheの使い方を紹介します。
counter_cacheとは、RailsのActiveRecordでRDB関連の設定の1つです。
これを設定することにより、親子関係のテーブルにおいて、親テーブルが子テーブルの
件数をキャッシュすることができるようになります。
例えばいろんな商品のクチコミサイトがあるとします。
そこでは各商品毎にクチコミを複数件登録することができ、
商品一覧ページにクチコミ件数を表示したり、クチコミ件数が多い順に並び替えたりできる、という設定です。
さて、クチコミ件数が多い順に並び替える時はどんなSQLを発行しましょうか。
商品とクチコミは1対多の関係なので、各テーブルとカラムは以下の通りです。
(今回の説明に必要ないモノは省いています)
・商品(親テーブル)
モデル名:Item
テーブル名:items
カラム:id, name
・クチコミ(子テーブル)
モデル名:Comment
テーブル名:comments
カラム:id, item_id, comment
・クチコミのモデル内での商品との紐付け設定
class Comment < ActiveRecord::Base
belongs_to :item
end
この場合、発行されるSQLはこんな感じです。
select *,
(select count(*) from comments where comments.item_id=items.id ) as count
from items
order by count desc;
Rails的な書き方だと
Item.find(:all,
:select => “*,(select count(*) from comments where comments.item_id=items.id ) as count”,
:order => “count desc”)こうなります。
動けば何でも良いのであればこれで良いのですが、このやり方だとデータ量が増えた時に処理が重くなる原因になります。
対象の商品の全クチコミをカウントするので当然「index?なにそれ?」状態です。
さすがに↑のやり方は重いですが、こういう書き方もできます。
SELECT items.id, count(comments.id) as count
FROM items
left join comments on comments.item_id=items.id
group by items.id
order by count desc;
Rails的な書き方だと
Item.find(:all,
:select => “items.*, count(comments.id) as count”,
:joins => “left join comments on comments.item_id=items.id”,
:group => “items.id”,
:order => “count desc”)こうなります。
子テーブルをleft joinで引っ張ってきて、group化する事でカウント処理を行わないようにしました。
…SQLが目に見えて複雑化していますね。
先程の1件ごとのカウントよりはだいぶマシですが、indexが使えないので後々重くなると思います。
また、group byの指定は使用するDBがMySQLの時のみこの書き方が使用可能です。
postgresの場合はselectする項目(countを除く)をすべて指定する必要があります。かなり面倒です。
今回の例題はitemsテーブルのカラムがid, nameだけなので全部書けば良いですが、実際の開発ではこんなにカラムが少ないわけもなく、
開発現場から悲鳴が聞こえてくるハメになります…。
そこで今回紹介するcounter_cacheの出番です。
先程紹介したテーブルのカラム、及びモデルの設定を以下のように追加します。
・商品(親テーブル)
モデル名:Item
テーブル名:items
カラム:id, name, comments_count
・クチコミ(子テーブル)
モデル名:Comment
テーブル名:comments
カラム:id, item_id, comment
・クチコミのモデル内での商品との紐付け設定
class Comment < ActiveRecord::Base
belongs_to :item, :counter_cache => true
end
itemsテーブルに追加したcomments_countは:default => 0にする必要があります。
これだけでクチコミが増えたり減ったりした時にカウントを計測してitemsテーブルのcomments_countに保存されるようになります。
先程のSQLも以下のように変化します。
select *
from items
order by comments_count desc;
Rails的な書き方だと
Item.find(:all,
:order => “comments_count desc”)こうなります。
これならリスト取得時にクチコミ数をカウントする手間がなくなり、
またcomments_countにindexを貼ることができるため処理速度が改善されます。
是非何かの役立ててください。
それでは。
GOOD RAILS!!
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
ロードバランサーによくPoundを使用しますが、うっかりしてるととんでもない落とし穴にはまります。
ある日出社すると、、、
Mさん「テスト環境でちゃんと動作する検索フォームが本番環境だと動きません。どうやらPoundがHTTPヘッダーを2048byteしか受け取れないみたいです。Apacheは4096byte受けてるのでロードバンラサーをかましてないテストではうまくいっちゃてるみたいです。」
「おはようございます」を交わす前にこんな会話からはじまるのでした。
よくよく調べると同じ症状で困ってる先人方がたくさんおりました。
つまりGETリクエストにあまりに長いクエリーを突っ込んだり、2kbを超えるようなCookieを仕込むと「長すぎるよ」って怒られるようです。
この怒られる限度が2kbか4kbの差で挙動が変わるようです。
最新のバージョンでは改善されているようですが、CentOS を使用していた関係上yum管理のものを入れておいたほうがよいだろうと rpmforge から入れた 2.4.3-1.el5.rf を使用していました。
対処法1:最新版のソースからコンパイルして入れ替える。
対処法2:新し目のrpmを探してきて入れ替える。
今回はやっぱりrpmでいれておきたいので対処法2を模索しました。
新し目のバージョンのrpm はここから拾えます。
今回はCentOS5.4なのでEPEL 5なPound-2.4.4-1.el5.x86_64.rpmで良いでしょう。
HTTPヘッダーのサイズはPoundヘッダーソースファイル内(pound.h)に
#define MAXBUF 2048
のように定義してあるのでMAXBUFが4096であることを確認する為に、Pound-2.4.4-1.el5.src.rpmも落としてソースを確認します。
2.4.4-1.el5は MAXBUF 4096 だったのでこれなら問題は起きないはずです。
rpmforgeから入れた2.4.3-1.el5.rfからはアップデートできなかったので一度削除。
# yum remove pound -y
それからダウンロードしてきた物をインストール
# yum install Pound-2.4.4-1.el5.x86_64.rpm --nogpgcheck -y
以上を入れなおした結果、Poundを経由しても問題の長いGETクエリー(4kb以下)を発行する検索フォームも動作するようになりました。
この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Macもwindowsも両方使いたい!
そんなあなたに捧げます。Macとwindowsでマウスの共有ができるソフトの紹介です。
Mac: MacOS 10.5
Windows: WindowsXP
synergy
こちらよりソフトのダウンロード
Macは、〜OSX.tar.gz
Winは、〜.exe
をそれぞれ落とします。
今回は、Mac側をサーバー、Win側をクライアントにする説明します。
ダウンロードしたファイルを解凍。中にある「synergys」ファイルを
/usr/local/bin/
配下にコピーします。コマンドはこんな感じ。
# sudo cp synergys /usr/local/bin/これでソフトの設置完了。
次に設定ファイルを書きます。
解凍した中に入っているsynergy.confを編集します。
section: screens
hogemac.local: #Mac側のIPアドレスなど
hogewin: #Win側のIPアドレスなど
end
section: links
hogemac.local:
right = hogewin
hogewin:
left = hogemac.local
end
上記設定は向かって左側にMac、右側にWinを置くと仮定した設定です。
Mac側のIPアドレスは、
システム環境設定→共有
内の、「ローカルネットワーク上のコンピュータから、次のアドレスでこのコンピュータにアクセスできます」のあとに書いてある〜.local
がそのまま使えます。
Win側は、ローカルIPなり、物理アドレスなりを設定して下さい。
設定ファイルが完成したら、# sudo mv synergy.conf /etc/で/etc/配下へ移動。これで設定ファイルの設定は完了です。
次に起動スクリプトを作成します。
アプリケーション→AppleScript→スクリプトエディタ
を起動
do shell script “/usr/local/bin/synergys -f –config /etc/synergy.conf -n hogemac.local”と書き、任意の名前で保存。このスクリプトをMacログイン時に読ませれば、自動でsynergyを起動してくれます。
これでMacの設定はおしまい。
ダウンロードしたソフトを解凍、そして起動。
Use another compute’s shared keybord and mouseにチェックを入れ、Other Computer’s Host NameにMacのローカルIPを入れて下のTestを押下。
うまく行ったらStarを押下。これで起動します。
以上で設定終了です。
これで、Macとwindowsでマウスの共有ができます。