rooted NOOK Color に Google 日本語入力を入れたよ

ちょっとてこずったので,メモ.
今回,やりたかったことと完全に一致する記事が見付からなかったので,色んな手順をマージしている.
バグった時に自己復帰できない人は手を出さないこと…ってそんな人は NOOK Color なんかに手を出してねーか.

これやると, android 2.2 のコアな部分の設定が少しだけ垣間見れるので,やって良かったと思う.

ちなみに,hadacchi の大好きな OpenWnnニコタッチ対応版 を使う場合は,com.hiroshica.android.input.nicownn2/NicoWnnJAJPでいいと思うけど,めんどくせーので試してない.
sourceforge の方は DL したこともないので知らない.

前提

  • ファームは1.3.0.(1.1 以下なら, autonooter が楽らしい.)
  • microSD は 3.8GB 以上のものを用意する.
    後に紹介する CMW のイメージサイズで十分である.具体的には,1GB の microSD で良い.

root化

  1. CrockworkMod (1gb CWM 3.2.0.1 sdcard) を DL
    win32diskimager を DL
    ( 参照 [GUIDE] Install CM7 or CM9(!) + Clockworkmod to EMMC - ALL NOOKS! (Updated:1/28/12) - xda-developers )
  2. CWM の zip から img を展開
  3. win32diskimager で microSD カードへ書き込み
  4. Manual nooter を DL
    ( 参照 [NC][1.2][1.3] ManualNooter 4.6.16 - xda-developers )
  5. manual nooter を 3. で作成した microSD カードへ書き込み
  6. nook color へ,5. で作成した microSD カードを差し込み,再起動
  7. 注:CWM Recovery では, ボリュームキーで上下にカーソル移動する
    install zip from sdcard → choose zip from sdcard → 4. の zip
    怖い人は,backup を取ること.
  8. microSD を抜いて, reboot
    ( CWM Recovery の画面で,上下にループさせてると,そのうち return とかいう選択肢が出てくるので, top menu まで戻る )
  9. zeam launcher を選択すれば,OK
    ( 1.2.0 の場合,再起動に 1 回失敗するらしいが,気にせず改めて再起動をかければ良いらしい )

adb を使えるようにする

  1. Nook Color ADB Install.zip を DL
    ( 参照 [SCRIPT] Nook Color USB Drivers and ADB Setup (WinXP&7) - xda-developers )
  2. 解凍して adbfix.bat を実行
  3. デバイスマネージャからnook color を選択し,ドライバ更新
    先の 11. で解凍したフォルダの usbdrivers フォルダを指定
  4. ddms を起動
    ( 何故か,adb shell を叩いても device not found が返っていたが, ddms を起動して reset adb とか叩いたら,adb shell が通るようになった )
  5. cmd から adb shell

日本語入力をインストール

  1. Market から Google Japanese Input をインストール
  2. adb shell から
    mount -o rw,remount -t yaffs2 /dev/block/mtdblock03 /system
  3. Google Japanese Input をコピー
    adb pull /data/app/com.google.android.inputmethod.japanese-1.apk
    adb push com.google.android.inputmethod.japanese-1.apk /system/app
  4. sqlite3 を DL
    ( 参照 SQLite Home Page )
  5. adb pull /data/data/com.android.providers.settings/databases/settings.db
  6. sqlite3 settings.db
  7. update secure set value = 'com.android.inputmethod.latin/.LatinIME:com.google.android.inputmethod.japanese/.MozcService' where name = 'enabled_input_methods';
  8. adb push settings.db /data/data/com.android.providers.settings/databases
  9. adb shell から
    cd /data/data/com.android.providers.settings/databases
    chmod 660 settings.db
    chown system settings.db
  10. reboot
  11. nookcolor tool で choose keyboard から Google Japanese Input Beta を選択

nook color 買ったよ

NOOK Color
NOOK Color

【楽天の個人輸入】NOOK Color by Barnes & Noble WiFi eReader
で,買ってみた.
この商品は,日本国内では手に入らないので,どこかで個人輸入するしかない.
アメ国の Refurbished ということで,どんな粗悪品が来るかとヒヤヒヤした.(注文時,リンク先の表示は brand-new だったのに,明細では TheRealDirectDeals という Refurbished 商品を陳列していた業者の取扱だった)
実際届いてみれば,上記の写真の状態で, hadacchi の手元に届いた品は,新品同様の品だった.

注意:1/29現在,このリンク先から注文されるのは,TheRealDirectDeals の取り扱う Refurbished ……「メーカーが整備した中古」にあたる.商品の状態は覚悟の上で注文すること.

ファームのバージョンは1.3.0.
さて,これはどう料理してくれようか.

Android メモ

何か増えたら,追記して日付更新します.

  • adb remount で /system とかを書き込み可能な状態で remount できる
  • wipe data/factory reset で,ROMの初期状態に戻る.
  • gapps が気に食わない場合は,無効化and削除:
    http://smartgoods.me/2011/07/disabling_preinstall_apps/
    http://d.hatena.ne.jp/unagi_brandnew/20100627/1277578526
    adb shell して pm list packages -f でパッケージ名とapkの対応を調べて,
    無効化 → pm disable packagename
    削除 → 無効化 + rm apkname; pm uninstall packagename
    戻す時は,apk を用意して adb install apknameとか./system/app にあったアプリでこれが使えない場合は,/system/app に apk を入れて reboot
  • いらなさそうなアプリ候補
    • 天気とニュース GenieWidget
    • メール Email
    • CarHome CarHomeGoogle,CarHomeLaunch
    • 電話系(wifiのみの場合) Phone,TelephonyProvider
    • ボイスダイヤル VoiceDialer
    • ギャラリー(Gallery3Dを入れる場合) Gallery
    • SMS(MMS) Mms

VAIO TYPE-C (VGN-C61HB) に WinXP を入れてみた

追記
FeliCa ポートのドライバは,誤ったものを入れると削除もロールバックもできなくなるので,注意されたい.
復元ポイントを有効にしていれば,戻せるのかも知れないが,私は有効にしていないので手遅れ.
これからトライする人は要注意.

Vista がやたら重いので,Win XP を入れた.
基本的には,XP のインストール CD をドライブにつっこんで,クリーンインストールし,ドライバを入れるだけ.
問題は,ノートPCの場合,適切なドライバに何を選択すべきかよく分からないこと.
一応,VAIO のダウングレード情報は,1つ前の機種になるが, SONY VAIO type C part4 の >>15 を参考にした.
いくつか動かないものがあるので,デバイスマネージャのデバイスを右クリックし,
詳細タブから「PCI\VEN_xxxx&DEV_xxxx」をそのまま入力し,検索する.
driver-id.info とか devid.info とか,色々出てくるので,罠driverではないことを祈りながらインストールする.
一番肝心の Ethernet ドライバが先のスレの情報で当たらない上,XP SP2 で WPA 対応してないために,自宅の環境では,よく分からないドライバを入れざるを得ない.

ちゃんと当たれば,Vista 時代と比べればとても軽快な使い心地が待っている.

幸運を祈る

元利均等返済方式

計算の理屈については,元利均等返済方式における割賦金の算定についてを参照のこと.
返済シミュレータは,元利均等返済方式の返済シミュレータを参照のこと.

シミュレータの使い方.
割賦回数指定のシートと,割賦金指定のシートがあるので,目的に応じて選択する.
シート内の薄黄色のセル(借入条件)にパラメータを入力する.
繰り上げ返済の効果を見るには,繰上返済金欄へ金額を入力する.
頭金は,繰上返済金欄の返済月0ヶ月の欄に入力する.
実返済回数の欄が,頭金や繰上返済の効果を盛り込んだ実際の割賦回数となる.

注意.
割賦金指定のシートの返済予定総額の欄は,割賦金と割賦回数からのみ算定しているため,誤差が入る.
泣かないこと.

SSL でアクセスするページ(https) のエラー

Internet Explorer 9 で,「https://...」というURLにアクセスすると,「Internet Explorer ではこのページは表示できません」というメッセージが表示される場合がある.
色々と原因が考えられるが, Firefox など他のブラウザでアクセスできるのに IE でアクセスできない場合は,インターネットオプションに問題がある場合がある.

「インターネットオプション」>「詳細設定」のタブを選択して,
「TLS 1.1 の使用」
「TLS 1.2 の使用」
のチェックボックスを外すと,問題が解決することがある.
一方で,TLS 1.2 に対応したページが表示できなくなることもあった.

ということで,面倒ながらアクセスしたサイトでエラーが出る度に,オプションを変えてアクセス仕直すなどの試みが必要となるかも知れない.

Android で MP3 の ID3 タグが文字化け

Shift-JIS で書かれた ID3 タグは文字化けするらしい.
解決するには,MP3tag で mp3 を開いて,タグを保存し直せばOK.

注意:Windows 7 で mp3tag の日本語用 lang ファイルをインストールフォルダ配下の lang フォルダへコピーする時, Windows 標準のエクスプローラでコピーしないと,オプションで選択できない.
UAC 絡みっぽいけど,詳しい原因は知らない.

spammer counter v4 と viewer v2

当サイトでは, spammer と思しき IP アドレスからのアクセスを禁止している.しかし,禁止後もアクセスを続けるしつこい spammer が多い.
特にしつこい spammer は何か,あっさり消えた spammer は誤爆かも知れない,という観点から,アクセス禁止後も引き続き継続するアクセスを, IP アドレス毎にカウントしたい.
ということで,前回の spammer counter v3 では, MySQL を使って簡易に実装した.

今回は, IP アドレス毎にソートできるようにした.
これは,

  • ある程度の IP アドレスのレンジでアクセスを繰り返す spammer をネットワークアドレスで弾いて,.htaccess をスリムにしたい.
  • ネットワークアドレスによる指定で,過剰に絞りすぎているレンジがあれば,アクセス禁止を解きたい.

という狙いから, IP アドレスでソートをかけ,可読性を高めるためだ.

spammer counter v4

ソースコードに入る前に注意

.htaccess へ ErrorDocument 403 を追記する場合,その飛ばし先のファイルへのアクセスは可能とすること.
さもなくば, 403 の転送で無限ループが発生する.
具体的には,.htaccess へ下記を追記.hogehoge.phpの部分は,設置したphpファイル名に変更すること.

ソースコード

<?php
header('HTTP/1.1 403 Forbidden');
header('Content-Type: text/html; charset=iso-8859-1');
?>
<!DOCTYPE HTML PUBLIC '-//IETF//DTD HTML 2.0//EN'>
<HTML><HEAD>
<TITLE>403 Forbidden</TITLE>
</HEAD><BODY>
<H1>Forbidden</H1>
<?php printf('You don't have permission to access %s\non this server.',
             htmlentities(strip_tags($_SERVER['REQUEST_URI']))); ?><P>
<HR>
<ADDRESS><?php
$e = explode(' ',$_SERVER['SERVER_SOFTWARE']);
printf('%s Server at %s Port %d',$e[0],$_ENV['SERVER_NAME'],$_ENV['SERVER_PORT']);
?></ADDRESS>
</BODY></HTML>
<?php
// MySQL
$mySqlHost = 'xxx.xxx.xxx';
$dbname    = 'database_name';
$user      = 'user_name';
$password  = 'password';
$table     = 'spam_counter';

// connecting
$mobj = mysql_connect($mySqlHost,$user,$password);
if ($mobj == FALSE) { die('broken');}

// count IP addr
$addr    = $_SERVER['REMOTE_ADDR'];
$addr_pt = explode('.',$addr);
if (count($addr_pt)<4) { die('wrong address...');}

$sql_str = sprintf('insert into %s (ipaddr,number,ip1,ip2,ip3,ip4) '
                   .'values ('%s',1,%s,%s,%s,%s) on duplicate key update number=number+1;',
                   $table,$addr,$addr_pt[0],$addr_pt[1],$addr_pt[2],$addr_pt[3]);

mysql_select_db($dbname,$mobj);
$done=mysql_query($sql_str);
mysql_close($mobj);
if ($done == FALSE) { die('no response...');}

?>

説明 (前回からの差分)

IP アドレスを分割して,格納しているだけ.
カウントさせるために,主キーたる IP アドレスは保持.

spammer viewer v2

当然,テーブルが変更になるため, viewer にも変更が加わる.

ソースコード

<?php require_once './php/head.inc.php'; ?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'
    'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='ja' lang='ja'>
 <head><title>spammer viewer v2</title></head>
 </body>
 <h1>spammer viewer v2</h1>
 <table style='border: black solid 1px;'>
 <tr>
  <th>IP addr
   <a href='<?php echo $_SERVER['PHP_SELF'];?>?mode=ip&order=asc'>▲</a>
   <a href='<?php echo $_SERVER['PHP_SELF'];?>?mode=ip&order=desc'>▼</a>
  </th>
  <th># of access
   <a href='<?php echo $_SERVER['PHP_SELF'];?>?mode=num&order=asc'>▲</a>
   <a href='<?php echo $_SERVER['PHP_SELF'];?>?mode=num&order=desc'>▼</a>
  </th>
 </tr>
<?php
// MySQL
$mySqlHost = 'xxx.xxx.xxx';
$dbname = 'database_name';
$user = 'user_name';
$password = 'password';
$table = 'spam_counter';

$mode      = $_GET['mode'];
$order     = $_GET['order'];

if ($mode == 'num' and $order=='asc') { $oby = ' order by number ASC;';}
elseif ($mode == 'num') { $oby = ' order by number DESC;';}
elseif ($mode == 'ip' and $order=='desc') { $oby = ' order by ip1,ip2,ip3,ip4 DESC;';}
elseif ($mode == 'ip') { $oby = ' order by ip1,ip2,ip3,ip4 ASC;';}
else { $oby = ';';}

// connecting
$mobj = mysql_connect($mySqlHost,$user,$password);
if ($mobj == FALSE) { die('broken');}

mysql_select_db($dbname,$mobj);

$done=mysql_query('select * from '.$table.$oby);
//$done=mysql_query('select * from '.$table.' order by CAST(ipaddr AS SIGNED);');
mysql_close($mobj);
if ($done == FALSE) { die('no response...');}

$total = 0;
$num_host = 0;
$ostr = '';
while ( $row = mysql_fetch_row($done)) {
    $ostr .= sprintf('  <tr><td>%s</td><td style=\'text-align:right;\'>%d</td></tr>\n',$row[0],$row[1]);
    $total = $total + (int)$row[1];
    ++$num_host;
}
$ostr .= sprintf('  <tr><td>total</td><td style=\'text-align:right;\'>%d</td></tr>\n"
                 .'  <tr><td># of hosts</td><td style=\'text-align:right;\'>%d</td></tr>',$total,$num_host);
print $ostr;

?>
 </table>
 </body>
</html>

説明 (前回からの差分)

分割した IP アドレスの前から 1Byte 毎の値で,複数キーによるソートをかけているだけ.

おまけ

SQL文

テーブル作成.

create table spam_counter
(
ipaddr varchar(16) not null,
number int unsigned not null,
ip1 tinyint unsigned not null,
ip2 tinyint unsigned not null,
ip3 tinyint unsigned not null,
ip4 tinyint unsigned not null,
primary key (ipaddr)
);

スパマーの REMOTE_ADDR

spammer の中でも,頻繁にアクセスのあるホストをアク禁にしているのは,トップページからもリンクしているアクセス禁止リストの通りだが,
その集計結果を spammer viewer | hadacchi blog に出力させてみた.
このうち,どの程度が踏み台にされている一般PCなのかは,よく分からない.
1つ1つ,whois を引けば分かるように思うが,時間がない.

これだけ弾いていても,現在なお 100件/日 の spam 投稿がなされる.
特に今月に入って, Akismet が検出できない記事が増えている (2件/日) ので,困っている…

逆に,投稿したハズなのに表示されないということがあれば,誤検出している可能性が高いので,右下にあるフォームから苦情を飛ばして欲しい.
これだけスパムが届くと,誤検知がないか,チェックしていられない.