2011年05月25日

PocketPC 2002エミュレータ日本語化

昨日の続き。

PPC2002エミュレータの日本語化は、マイクロソフトからまだダウンロード可能の模様(http://download.microsoft.com/download/pocketpc/Utility/2002.1/NT5XP/EN-US/Japanese-NoRadio.exe)。
ダウンロードして解凍したら、(SDKのインストール先)\Windows CE Tools\wce300\Pocket PC 2002\emulation の下に "Japanese-No Radio"フォルダをフォルダごとコピーして、レジストリを変更。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Tools\Platform Manager\{F384D888-F9AA-11D1-BB9E-00A0C9C9CCEE}\{DE9660AC-85D3-4C63-A6AF-46A3B3B83737}\{F384D894-F9AA-11D1-BB9E-00A0C9C9CCEE}\{67C8D913-F0CF-486A-8CF0-CE7D116225E8}]
"Path"="(SDKインストール先)\\Windows CE Tools\\wce300\\Pocket PC 2002\\emulation\\japanese-no radio\\jpnnoril.bin"
 こんな内容のテキストファイルを作って、"ppc2k2emujp.reg"(リンク先のファイルはサンプル)とか適当な名前で保存して、ダブルクリックするとよい。

 これでエミュレータが日本語に。
ppc2002emu-jp.png
タグ:EVC PocketPC WinCE PDA
posted by usoinfo at 07:12 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年05月24日

PocketPC 2002 のコンパイル環境

 今更に、PocketPC 2002のコンパイル環境を整える。
 なんでPPC2002なのかと言うと、昔のPDAが安くジャンクで出回っていて、当時人気だったカシオのカシオペア、東芝のGENIO、コンパック(HP)のiPAQなどが今手に入る。
 それで、手に入ったのはいいものの、それをどう活用していくかというと、問題に直面する。今更PPC2002のアプリケーションが開発・メンテナンスされているわけはないので、ちょっとしたものは自分で作っしまおうと言うことになる。今のVisual Studioはスマートデバイスの開発環境も統合されているが、PPC2002用なんていう大昔の遺物のコンパイルは、当然Visual Studioではできない。それどころか、eMbedded Visual Tools 4.0でもできない。開発には、eMbedded Visual Tools 3.0が必要である。
 ここで問題にぶち当たるわけだが、もうマイクロソフトからeMbedded Visual Tools 3.0はダウンロードできない。公開終了なのである。そして、PPC2002のためには当然、PocketPC 2002 SDKが必要である。が、これももうマイクロソフトからはダウンロードできない。公開終了なのである。要するに、もう触れてくれるな黒歴史、ということなのであろう。

 そうは言っても、コンパイル環境が欲しいので、なんとか入手の法。すべて2011/05/24現在の情報。

1. eMbedded Visual Tools 3.0 を探してきて入手。HPC:Factorからダウンロードした(http://www.hpcfactor.com/downloads/details.asp?r=0D692AFF-501F-48D1-9D1C-C494078E201D 要アカウント登録)。或いは、他の所から探す場合、ファイル名は EN_WINCE_EMBDVTOOLS30.exe である。参考にされたい。

2. PocketPC 2002 SDK を探してきて入手。これは cnet Downloads から。http://download.cnet.com/Pocket-PC-2002-SDK/3000-2206_4-10731597.html

3. 開発用のマシンを用意。当然、WindowsCEベースなのでActiveSyncで接続することになる。Windows Vista以降からCEベース機との接続はWindows Mobile デバイスセンターに取って代わられ、ActiveSyncは非対応である。デバイスセンターはPPC2002は非対応である。なので、XPの走るマシンを1台用意するのがいいのではないかと思われる。ActiveSyncは、まだマイクロソフトからダウンロードできる(http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=9e641c34-6f7f-404d-a04b-dc09f8141141)。まあ、コンパイル環境を整えるだけなら、ActiveSyncは使わないという選択肢もあり得る。

 マシンに、eVC3をインストールし(CE2.11ベースのSDKも付いているので、それも入れればコンパイルできる。MIPSのMobileGearとか古いカシオペアとか。)、PPC2002SDKもインストールする。全てをインストールするなら、だいたい2Gくらいのディスクがあればよい。eVCは英語だけど、まあ仕方ない。これで、プラットフォームに"Pocket PC 2002"を選べば、今さらPDAのバイナリが作れるというわけである。

 ついでなので、さっそく、昔ソースコードが公開されていたGSPlayerという音楽再生ソフトをビルドしてみる。
 まずソースを入手(http://www.afterdawn.com/software/source_codes/gsplayer.cfm)。開発元は既に公開していない模様であるが、探したところ、2.28が入手できた。
 これを開発環境に持っていき、解凍する。

 まず、libをビルドする。libmad libovd maply の各フォルダがあるので、それぞれ、

・libmad.lib
  1. (解凍先)\libmad\libmad.vcw をeVC3で開く
  2. Active WCE Configurationに"Pocket PC 2002"を選択
  3. Active Configurationに"Win32 (WCE ARM) Release"を選択
  4. Build
  5. (解凍先)\lib\ARMRel\libmad.lib ができる
・libovd.lib
  1. (解凍先)\libovd\libovd.vcw をeVC3で開く
  2. Active WCE Configurationに"Pocket PC 2002"を選択
  3. Active Configurationに"Win32 (WCE ARM) Release"を選択
  4. Build
  5. (解凍先)\lib\ARMRel\libovd.lib ができる
・maplay.lib
  1. (解凍先)\maplay\maplay.vcw をeVC3で開く
  2. Active WCE Configurationに"Pocket PC 2002"を選択
  3. Active Configurationに"Win32 (WCE ARM) Release"を選択
  4. Build
  5. (解凍先)\lib\ARMRel\maplay.lib ができる

 次に本体をビルドする。
  1. (解凍先)\GSPlayer2\WinCE_PPC2\GSPlayer2.vcwを開く。(WinCE_* は、動かしたいデバイスによって適当な物を。英語版はGSPlayer2e.vcwを。)
  2. (解凍先)\lib\ARMRel\ の下にある *.lib を (解凍先)\lib\ARMV4Rel\ にコピー
  3. Active WCE Configurationに"Pocket PC 2002"を選択
  4. Active Configurationに"Win32 (WCE ARM) Release"を選択
  5. プロジェクトにUIHelper.h/UIHelper.cppが入っていないようなので、FileViewの"GSPlayer2 files"を右クリック→"Add Files to Project..."→UIHelper.hとUIHelper.cpp選択してOK
  6. Build
  7. (解凍先)\bin\jpn\WinCE_HPC\ARMRel\GSPlayer2.exe ができる


 これで完成。
 後は、できたexeをデバイスに持っていって実行すればよい。カシオペアE-3000で動作を確認。

IMG_8001s.jpg

 動いたのだが、何故か手元の実機は、母艦のSDカードリーダーで書き込んだサイズの小さいファイルがE-3000で正しく読めない。本体が古いから、故障かなあ。。。(ちなみに、ジャンクPDAは、電脳売王でよく掘り出し物が出るので、買っている。参考になれば幸い。)
タグ:EVC PocketPC WinCE PDA
posted by usoinfo at 14:49 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年05月17日

iptables で日本以外のアクセスを全部拒否する

 今日たまたまサーバの様子をmuninで見たら、普段は見かけないCPU usageが出ていたので、どうしたんだろうと思って調べると、sshdが余計に動いている。不審に思ってnetstatしてみると、.cnからのsshブルートフォース攻撃を受けていた。本来、JPのアドレスから以外のアクセスはiptablesで叩き落としていたのだが、先日いろいろカーネルをいじっていた時にiptablesの設定を変更して、そのJPフィルターを外したままにしてしまっていたのである。反省しきり。

 と、いうのは経験談として、日本以外のアクセスを全部拒否する、である。やりたいことは、RIRから日本に割り当てられているアドレスだけをリストアップして、iptablesでACCEPTし、該当しないものはDROPへ落とす、ということである。
 割り当て済みIPアドレスのリストはAPNICが配布している(http://ftp.apnic.net/stats/apnic/delegated-apnic-latest)が、このアドレスの一覧はiptablesにそのまま流し込めるようなフォーマットをしていない。しかし、このリストを使いやすいようにアドレス/マスクの形式に変換して提供している Office Namiという素晴らしいサイトがあるので、有り難くこれを使用させて貰うことにする。

 とりあえず、cidr形式のリストをダウンロードして、コマンドに列挙するなら、こんな感じになる。
% wget -q -O - http://nami.jp/ipv4bycc/cidr.txt.gz | \
gzip -d | \
grep "JP" | \
awk '{print "iptables -I RH-Firewall-1-INPUT 1 -p all -s ",$2," -j ACCEPT"}' \
> jpfilter.sh
% head jpfilter.sh
iptables -I RH-Firewall-1-INPUT 1 -p all -s 1.0.16.0/20 -j ACCEPT
iptables -I RH-Firewall-1-INPUT 1 -p all -s 1.0.64.0/18 -j ACCEPT
iptables -I RH-Firewall-1-INPUT 1 -p all -s 1.1.64.0/18 -j ACCEPT
iptables -I RH-Firewall-1-INPUT 1 -p all -s 1.5.0.0/16 -j ACCEPT
(略)
 awkのiptableコマンドの引数は環境に応じて適当に変更が必要だが、これで出てきたjpfilter.shをrootで実行すれば、今のiptablesにJPフィルターが追加できる。

 しかし、日本からのアクセスだからと言って無条件に許可するわけではないので、もう少し手を加える。
 INPUTチェインに入ってきたパケットは、日本以外のアクセスであれば叩き落とし、日本からのアクセスであれば、通常のフィルター動作を適用したいので、

1. 日本のアドレスのリストは ALLOW-JP-INPUT という別チェインにし、
2. INPUTチェインでは通常のフィルター(RH-Firewall-1-INPUT)でなくALLOW-JP-INPUTに渡し、
3. ALLOW-JP-INPUTチェインでは許可したものだけをRH-Firewall-1-INPUTに渡す

という風にする。
というわけで、まず /etc/sysconfig/iptables は、こんな感じ。
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:ALLOW-JP-INPUT - [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 127.0.0.0/8 -j ACCEPT
-A INPUT -s 192.168.0.0/16 -j RH-Firewall-1-INPUT #これはローカルネットワークの許可用
-A INPUT -j ALLOW-JP-INPUT
-A INPUT -j DROP
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
(略)
 そして、{{{ALLOW-JP-INPUTチェインを生成する}スクリプトを作る}スクリプトを作る}。ややこしい。起動毎に適用したいので、/etc/sysconfig/iptabels-allowjp にフィルター内容を保存することにして、そのスクリプトを作るためのスクリプトを(get-iptable-jp.sh)作成。スクリプト get-iptable-jp.sh によって、スクリプト iptabels-allowjp が作成され、iptables の起動毎に iptabels-allowjp を実行させる、ということだ。
#!/bin/sh
wget -q -O - http://nami.jp/ipv4bycc/cidr.txt.gz |\
gzip -d |\
grep "JP" |awk '{print "iptables -A ALLOW-JP-INPUT -p all -s ",$2," -j RH-Firewall-1-INPUT"}'\
> /etc/sysconfig/iptables-allowjp
 次いで、/etc/rc.d/init.d/iptables に、起動時にJPフィルターを適用するように変更を加える。start() 内で、
:
if [ -n "$IPTABLES_MODULES" ]; then
echo -n $"Loading additional $IPTABLES modules: "
ret=0
for mod in $IPTABLES_MODULES; do
echo -n "$mod "
modprobe $mod > /dev/null 2>&1
let ret+=$?;
done
[ $ret -eq 0 ] && success || failure
echo
fi

if [ -s /etc/sysconfig/iptables-allowjp ]
then
/bin/sh /etc/sysconfig/iptables-allowjp
fi

touch $VAR_SUBSYS_IPTABLES
:
 以上のものが出来たら、get-iptable-jp.sh を実行してJPフィルター設定スクリプトを作成した後、service iptables restart。iptables -nL でフィルターが出来ているか確認する。

 アドレスの割り当ては変更されることがあるので、何日かに1回定期的に、get-iptable-jp.sh をしてiptablesをrestartするように、cronを回しておくとよい。
posted by usoinfo at 10:05 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年04月25日

iptableのチェインの途中にルールを差し込む

既に動いてるiptableの途中に新しくルールを差し込む方法。
INPUTにルールを追加する場合の例:
# /sbin/iptables -n -L INPUT --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0
 INPUTチェインを見ると、RH-Firewall-1-INPUTチェインを参照しているので、そっちを見る。
# /sbin/iptables -n -L RH-Firewall-1-INPUT --line-number
Chain RH-Firewall-1-INPUT (1 references)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
3 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
4 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:445
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53
6 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
7 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
8 DROP all -- 0.0.0.0/0 0.0.0.0/0
 リストの番号を見て、入れたい番号を見る。例えば、6番の次に192.168.0.0/16から3306番宛tcpを追加する時は、
# /sbin/iptables -I RH-Firewall-1-INPUT 6 \
-m state --state NEW -m tcp -p tcp --dport 3306 -s 192.168.0.0/16 -j ACCEPT
# /sbin/iptables -n -L RH-Firewall-1-INPUT --line-number
Chain RH-Firewall-1-INPUT (1 references)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
3 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
4 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:445
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53
6 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
7 ACCEPT tcp -- 192.168.0.0/16 0.0.0.0/0 state NEW tcp dpt:3306
8 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
9 DROP all -- 0.0.0.0/0 0.0.0.0/0
 こんな具合。
 一時的なものでないなら、追加した後忘れず /etc/sysconfig/iptables あたりにも追加して、リブートしても忘れないようにしておくのがよい。
タグ:Linux 管理
posted by usoinfo at 10:47 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年04月23日

PEAR::HTTP_Client で普通のPOSTでも multipart/form-data にする

 HTTP_Client->post() では、4番目の引数にファイルを指定すると、自動的にマルチパートのPOSTデータを作成してmultipart/form-dataで投げてくれる。逆に言うと、2番目の引数のPOSTデータだけを渡した場合は、リクエストボディにname=value&name=value&...のデータが入れて投げられるので、multipart/form-data にはならない。
 
 あまり需要はないと思うが、ファイルでなく普通のPOSTデータだけを渡して、リクエストを multipart/form-data にしたい時は、こうである。
		$client = new HTTP_Client();
$header = array('Content-Type' => 'multipart/form-data');
$client->setDefaultHeader($header);
$resp = $client->post($url,$data);
 要するにContent-typeヘッダを強制的にmultipart/form-dataにセットしてやれば、勝手にマルチパートなリクエストになるという寸法である。例えば、送出データがメモリ上の変数内にあってテンポラリファイルに落としたくないとき、などに使えないこともない、かもしれない。
タグ:PHP PEAR Linux
posted by usoinfo at 15:03 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年04月22日

PHPで multipart/form-data でPOSTされた生データを取得する

 PHPでは、php://inputのストリームをオープンすることで、HTTPのリクエストボディを生データのまま取得できる。これで、PHPが文字コードをいじったり、デコードしたりして、意図しない操作をデータに加えていると思われるとき、デバッグに有効である。しかし、そこのドキュメントにも書いてあるように、「php://input は、 enctype="multipart/form-data" に対しては使用できません。」である。フォームからのファイル投入の時などに、生データを取ってデバッグしようとすると、ちょいと困る。
 そこで、このPHPの挙動をバイパスして、multipart/form-data の生データを取得する方法。

 これは結局の所、リクエストのContent-typeを見て、Content-type: multipart/form-data の時にそのようになっている。なので、受け取ったリクエストが multipart/form-data だったら、そのContent-typeを引っぺがしてやればいい(その代わり $_FILES は使えなくなると思うけど)。
 .htaccess(または環境によってhttp.confでも)に、こんな感じで引っぺがすSetEnvIfをくべてやる。
SetEnvIf content-type (multipart/form-data)(.*) MULTIPART_FORMDATA=true
RequestHeader unset content-type env=MULTIPART_FORMDATA
 しかる後、PHP側で
	$stdin = fopen('php://input', 'r'))
while(!feof($stdin)){
echo fgets($stdin, 1024);
}
fclose($stdin);
 こんな感じで、ストリームからPOSTの生データが取れる。
タグ:PHP Linux HTTP
posted by usoinfo at 11:30 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年04月04日

MySQL 5.5 ではDATE型とDATETIME型の比較結果が異なる

 端的に言うと、今までは日の00:00:00を指したDATETIME値と同日のDATE値は等しかったが、5.5.x では異なる。
 今までのMySQLでは、
mysql> SELECT CAST( DATE(SYSDATE()) AS DATETIME ) = CAST( DATE(SYSDATE()) AS DATE )
AS datecomp;
+----------+
| datecomp |
+----------+
| 1 |
+----------+
 結果は真だが、MySQL 5.5.10 では、
mysql> SELECT CAST( DATE(SYSDATE()) AS DATETIME ) = CAST( DATE(SYSDATE()) AS DATE )
AS datecomp;
+----------+
| datecomp |
+----------+
| 0 |
+----------+
 同じSQL文でも結果は偽である。

 これは、DATE型とDATETIME型を比較するときの暗黙の型変換に仕様変更があったということか。
 以前のMySQLでは、DATE型と、同日の'00:00:00'の時刻を持つDATETIME型は同じ値だった(DATE型がDATETIME型に暗黙に変換される時、'00:00:00'を加えられていた)が、5.5.xでは、違う値として処理される。
 次のようなSQLを実行してみると、
5.5.10
mysql> SELECT CAST( DATE(SYSDATE()) AS DATETIME ) > CAST( DATE(SYSDATE()) AS DATE )
AS test;
+------+
| test |
+------+
| 1 |
+------+

5.0.77
mysql> SELECT CAST( DATE(SYSDATE()) AS DATETIME ) > CAST( DATE(SYSDATE()) AS DATE )
AS test;
+------+
| test |
+------+
| 0 |
+------+
 となるので、DATE型がDATETIME型に暗黙に変換される場合、'00:00:00' より小さい時刻の値で埋められるように変更されたのではないだろうか(ドキュメントは軽くしか読んでないけどどっかに書いてあるかも)。

 DATE() 関数で日付の切り捨てをしていたりするプログラムは、注意を要する。
 今までと同じ結果を得るためには、CAST() で明示的にDATETIME型に変換してやる必要があるようである。
CREATE TABLE datetest (
idnum INTEGER,
tdate DATETIME,
CONSTRAINT pk_datetest PRIMARY KEY (idnum)
);
INSERT INTO datetest (idnum,tdate)
VALUES(1,STR_TO_DATE('2011/04/04','%Y/%m/%d'));
INSERT INTO datetest (idnum,tdate)
VALUES(2,STR_TO_DATE('2011/04/04 12:00:00','%Y/%m/%d %H:%i:%s'));

-- 5.0.77の場合 SYSDATEは11/04/04 07:00:00
mysql> SELECT * FROM datetest WHERE tdate <= DATE(SYSDATE());
+-------+---------------------+
| idnum | tdate |
+-------+---------------------+
| 1 | 2011-04-04 00:00:00 |
+-------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM datetest WHERE tdate <= CAST( DATE(SYSDATE()) AS DATETIME );
+-------+---------------------+
| idnum | tdate |
+-------+---------------------+
| 1 | 2011-04-04 00:00:00 |
+-------+---------------------+
1 row in set (0.00 sec)

-- 5.5.10の場合 SYSDATEは11/04/04 07:00:00
mysql> SELECT * FROM datetest WHERE tdate <= DATE(SYSDATE()); -- 5.0.77と違う結果が返される
Empty set (0.00 sec)

mysql> SELECT * FROM datetest WHERE tdate <= CAST( DATE(SYSDATE()) AS DATETIME );
+-------+---------------------+
| idnum | tdate |
+-------+---------------------+
| 1 | 2011-04-04 00:00:00 |
+-------+---------------------+
1 row in set (0.00 sec)
タグ:Linux MySQL
posted by usoinfo at 07:31 | Comment(1) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年04月01日

LVMを使って既存のext3パーティションをオンラインリサイズ

 昨今のLinuxは、インストール時にパーティショニングをおまかせモードにすると、/boot 以外をLVMで作ってくれる。LVMを使われると、所謂パーティションツールで特定のところだけを移植したりするときに軽く困るのでわざと使わないこともあるのだが、LVMを使っているとそれはそれで便利なときもある。例えば、/ が足らない時。
 例えば、/dev/hda1が/boot、/dev/hda2がLVM、/dev/hda3 がFAT32、みたいなマシンがあって、こんな感じにファイルシステムが埋まってしまったとする。
% df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
38G 36G 1.1G 95% /
/dev/hda1 99M 25M 70M 26% /boot
/tmpfs 501M 0 501M 0% /dev/shm
/dev/hda3 60G 20G 39G 33% /export/fat
 一昔前なら/をでかく取っておけば良かったと後悔後の祭りになるが、LVMだとオンラインで領域を追加できる。例えばこの時に、hda3のパーティションを潰して、/を拡張しみよう、ということである。
 おおざっぱに言うと、LVMパーティションを追加してPV作成->VGにPVを突っ込んで拡張->LVを拡張->ファイルシステムを拡張、という操作が必要である。

 まずfdiskでhda3を潰し、Linux LVMパーティションを確保する。IDは0x8e。d -> 3 -> n -> p -> 3 -> [RET] -> [RET] -> t -> 3 -> 8e -> w だ。
 こんなパーティションテーブルになった。
デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 4864 38965657+ 8e Linux LVM
/dev/hda3 4865 12161 58613152+ 8e Linux LVM
 これで追加するLVMパーティションが確保できたので、これを既存のLVMに追加する。
 最初に、pvcreateでPVを作り、LVMパーティションを使えるようにする。
# pvcreate /dev/hda3
Physical volume "/dev/hda3" successfully created
# pvdisplay /dev/hda3
"/dev/hda3" is a new physical volume of "55.90 GB"
--- NEW Physical volume ---
PV Name /dev/hda3
VG Name
PV Size 55.90 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID i3iHBK-Lm4l-wIR1-iKBl-gFlJ-063G-kDI9nM
次に、/ が入っているVGである VolGroup00 に、今作ったPVを追加する。VGを見るコマンドはvgdisplay。追加前は
# vgdisplay
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 37.16 GB
PE Size 32.00 MB
Total PE 1189
Alloc PE / Size 1189 / 37.16 GB
Free PE / Size 0 / 0
VG UUID JOT4c8-pOkz-hVtX-Aprl-fOol-Ow01-EgeRfl
(以下略)
だったところに、vgextendで追加する。
# vgextend VolGroup00 /dev/hda3
Volume group "VolGroup00" successfully extended
# vgdisplay VolGroup00
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 93.03 GB
PE Size 32.00 MB
Total PE 2977
Alloc PE / Size 1189 / 37.16 GB
Free PE / Size 1788 / 55.88 GB
VG UUID JOT4c8-pOkz-hVtX-Aprl-fOol-Ow01-EgeRfl
 VGサイズが拡張されたので、VGの中にあるLVの拡張を行う。LVを見るコマンドはlvdisplay。拡張前は
# lvdisplay
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol00
VG Name VolGroup00
LV UUID rJeiKe-4a8g-52sS-nAwu-Yeah-z9wx-U2C5tm
LV Write Access read/write
LV Status available
# open 1
LV Size 35.19 GB
Current LE 1126
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
(以下略)
だったところに、lvresizeで追加する。
# lvresize -L +58G /dev/VolGroup00/LogVol00
Extending logical volume LogVol00 to 35.19 GB
Logical volume LogVol00 successfully resized
# lvdisplay
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol00
VG Name VolGroup00
LV UUID rJeiKe-4a8g-52sS-nAwu-Yeah-z9wx-U2C5tm
LV Write Access read/write
LV Status available
# open 1
LV Size 91.06 GB
Current LE 2914
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
(以下略)
 次がようやく最終段階。/ のファイルシステムをリサイズ。ext3 なら、resize2fsでオンラインのまま拡張できる(resize2fsは結構時間が掛かる)。
# resize2fs -p /dev/mapper/VolGroup00-LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/mapper/VolGroup00-LogVol00 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/mapper/VolGroup00-LogVol00 to 23871488 (4k) blocks.
The filesystem on /dev/mapper/VolGroup00-LogVol00 is now 23871488 blocks long.
# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
89G 24G 61G 28% /
/dev/hda1 99M 25M 70M 26% /boot
/tmpfs 501M 0 501M 0% /dev/shm
 とまあ、これでめでたく、/が拡張された。
posted by usoinfo at 10:52 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年03月30日

MySQL 5.5.x をソースからコンパイルしてインストール

 長らくMySQLは5.1.x系を使ってきたが、5.5.x系列も出てから1年程経って、マイナーバージョンも10になったので、そろそろ移行してもいいかなという気分になってきた。なんかマルチコアCPUでの性能が上がっているみたいだし。
 で、早速5.5.x系(今日の時点では5.5.10)のソースtarballをダウンロードしてきて、./configure;make しようと思ったのだが、、、、、アレ?configureがない。5.5.x は、今までとソースからのコンパイル方法が微妙に変わっていた。

 まず、コンパイルには cmake が必要。CentOSでは入ってないが、yumでRPMForgeから入れられる。(RPMForgeはこのへんからアーキテクチャに合ったrpmを導入)
 で、MySQLのソースをダウンロードして、ユーザーmysqlで展開。

 まずはコンパイルオプションを見る。
% cmake -LAH
-- MySQL 5.5.10
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/mysql/src/mysql-5.5.10
-- Cache values
// path to the executable
ACLOCAL_EXECUTABLE:FILEPATH=/usr/bin/aclocal

// path to the executable
AUTOCONF_EXECUTABLE:FILEPATH=/usr/bin/autoconf
:
(略)
 5.1では、標準の文字コードをSJISで使っていたので、これもSJISでコンパイル。ついでにSSLもenableする。

% cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_SSL=system \
-DDEFAULT_CHARSET=sjis -DDEFAULT_COLLATION=sjis_japanese_ci
% make
 いくつかwarningは出たが、コンパイルは終了。今走ってる5.1を止めて、make installし、走らせる。ぱっと見、特に問題なく動いているようだ。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.5.10 Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
タグ:Linux MySQL
posted by usoinfo at 08:19 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年03月07日

逆ジオコーダーTwitter BOTを位置情報付きツイートに対応

逆ジオコーダーTwitter BOTを、位置情報を含むツイートに対応させてみた。

statuses/mentions で位置情報の緯度経度が取れないと思ったのは勘違いで、取れてはいたが、PHPのsimplexml_load_stringがXMLを処理するときに、うまく処理できていないらしくてデータが落ちていただけだった。
というわけで、JSONで取って、json_decode を使ったら、ちゃんと緯度経度が取れた。

携帯のツイッタークライアントから、位置情報を付加して @usogeo2addr に何か言うと、住所に変換します。
posted by usoinfo at 16:27 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする