グラフとかを異なるバージョンの Excel で操作したりすると起こるらしい。
グラフをクリックしたりして上書き保存したら消えた。
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件/日) ので,困っている…
逆に,投稿したハズなのに表示されないということがあれば,誤検出している可能性が高いので,右下にあるフォームから苦情を飛ばして欲しい.
これだけスパムが届くと,誤検知がないか,チェックしていられない.
Android カスタマイズ
Android のメモリを増量(?)する.
compcache 使ってもイマイチだったので,マニアックなことをしてみることにした.
前提.
root 化済. (rooted phone)
過去記事では Android 1.6 に戻しているが,その後に Android 2.2 にまた戻している.
カスタム ROM として, CyanogenMod-6.1.0-DS を導入済.
操作する PC は Windows 7 Prof. SP1 で, ADK とか adb は導入済. (adb version 1.0.26)
やること概略
hboot 書き換え.
kernel 変更.
###用意するもの
- rootが取れていて, recovery を書き換え済な HT-03a .ない人は,手順書/Recoveryの変更 | Android Custom Cookbookとか見てやれば,なんとかなると思う.
- Android SDK を導入済で, android-sdk-windows (win の場合) の tools と platform-tools に path を通した PC . Android マーケットのツールから root を取った人は,導入してないかも知れない. eclipse なんて複雑で重いソフトはいらない.全部 DOS で叩く.
- microSD -> SD なるアダプタ.だいたいの microSD にアダプタはついてくるので,手元にあると思う.
- SD カードが差さる,カードリーダ/ライタ.持ってない場合は,必ず,最初に下記の手順を全部読んで,必要なデータを microSD に入れておくこと.それでも,必ず何か入れるべきものを漏らすので,素直に用意しといた方がいいけど.
具体的手順
基本的には,とりあたまさんのおぼえがき: HT-03Aでまだまだ戦う (RAM増量編)を適用するだけ.
ただし,単に rooted なだけでは,fastboot が動作しないため,ちょっとハマる.
というか, fastboot を調べる所から,ハマる.
なので,具体的に書く.
- 手順書/SPL変更手順 | Android Custom Cookbook の通り,update.Engineering-SPL-HBOOT-1.33.2005-signed.zip をSDカードへコピー.
- 一旦電源を落としてから,Home+電源ボタンで,リカバリーモードに入る.
- RA のバージョンに依るけど, backup っぽい選択肢を選ぶ→ nandroid の backup っぽいのを選ぶ.
hadacchi の導入している 1.7.0 の場合,
[Backup/Restore] -> [Nand backup] -> Homeを押して実行 - 結構時間をかけて終わったら,さっきコピーしたzipを適用する.
flash zip っぽいのを選ぶ.
hadacchiの場合,
[Flash zip from sdcard] -> [update.Engineering-SPL-HBOOT-1.] -> Homeで実行 - Home+戻るボタンで,reboot させる.トップメニューからの reboot では正しく反映されない.
- またリカバリーモードに入るので,[Power off] -> Home
- microSD へ, hboot-1.33.0013d.img と radio-2.22.27.08.img をコピー
- microSD を HT-03a に差して,ボリュームダウン+電源ボタンで起動
- USB で PC と接続する
- 戻るボタンで fastboot モードに入る
- コマンドプロンプトでとりあたまさんのおぼえがき: HT-03Aでまだまだ戦う (RAM増量編)にある hboot と radio の img を置いたフォルダに移動し,
fastboot flash radio radio-2.22.27.08.img
fastboot flash hboot hboot-1.33.0013d.img
fastboot reboot-bootloader
を実行. - 同様に,
fastboot erase system -w
fastboot erase boot
して端末の menu ボタンで電源断. - microSD へ,とりあたまさんのおぼえがき: HT-03Aでまだまだ戦う (RAM増量編)にある Kernel 2.6.35.11 とやらをコピー.
- Home+電源 ボタンでリカバリーモード起動
- バックアップした nandroid のリストア.
hadacchi の場合,
[Backup/Restore] -> Nand restore -> なんかバージョンを選ぶ -> Home - kernel 2.6.35.11 の zip を適用.
hadacchi の場合,
[Flash zip from sdcard] -> [boot-cm_2635.11_ds_32b_radio270] -> Home - 再起動しておしまい.
hadacchi の場合,
[Reboot system now] -> Home
関係ないけど知ったこと
CM6.0 導入端末で,/sd-ext を書き込みできるよう / をremountしてからsd-extにuserinit.shを入れても,次回起動時に消される.
対処法として考えられるのは,init.dに入れてしまうことだが,なぜかcompcacheのサイズは変更されなかった.
adb shellで,compcache start <size>(KB単位)
とすれば,サイズは変更できる.
Windows 8 Developer Preview
Windows8 を Windows 7 Prof. x64 上にゲストOSとして入れてみた.
Windows Virtual PC にはうまく入れられなかったので,VirtualBox へ入れた.
環境はこんな感じ.
ホストOS | Windows 7 Prof. SP1 |
---|---|
ハード | AMD x64 アーキテクチャ |
VM | VirtualBox 4.0.12 |
インストール時の設定等 | |
VBox の OS 選択 | Windows 7 (x64) |
RAM | 1024MB |
グラフィックカードの設定 | RAMは30MB 2D/3Dアクセラレーション ON |
これで動いた.
その他,メモ.
- Windows 8 のインストールには,Windows Live ID を準備させられた.アカウントは Live ID と連携する.Androidをインストールするのに似ている気がする.
- Windows 8 搭載のブラウザは, IE 10.
- Windows 8 のエクスプローラでは,Office 2007 以降に採用されたリボンが使われていた.
- 愛用の あふw (afxw) は動いた.
- Firefox は,2011/9/23 現在ではインストールできない.OSが未対応とエラーが出る.バイナリ入れたら動きそうな気もするが,試してましぇん.
- Winキー+○ のショートカットは健在.
Win+R
→shutdown /s /t 1
でシャットダウン
ubuntu でファイル暗号化
crypt -- mcrypt を入れる。crypt コマンドをエミュレートしてもらえる。
openssl -- openssl を入れる。
gnupg -- gnupg を入れる。コマンドは gpg。
FTPサーバでディレクトリ一覧を表示させない
ProFTPDの場合。
.ftpaccess を表示させたくないディレクトリへ作成。
ファイルの中身はこんな感じ。
<Limit DIRS> DenyAll </Limit>
ただしこの設定を行なうと、親フォルダからそのディレクトリ自体を表示できなくなる。
Windows 標準の FTP クライアントの場合、
cd -- 不可
put -- 可能
具体的には、
put hogehoge.txt invisible_dir/hogehoge.txt
のように名前を直接指定して転送すれば、転送は可能。
公的SSL証明書は,お高い
会社から,よく PC の設定など自分のメモを見るために,自分の blog へアクセスすることがある.
メモを会社から投稿することもある.
でも,ちょっと情報セキュリティに気を使う会社なら投稿内容の監視くらいはしていそうなので,
SSL 通信で投稿内容を暗号化したいなーとか思ったのでした.
SSL の証明書って,たっけーのね…
最大手 VeriSign の場合,最安で 85,050 円とか,泣ける.
で,安いとこないかなーと探したら,こんなトコがありました → サイフにやさしいSSL証明書
2,880 円~ とか.びっみょー.
オレオレ証明書もいいけど,どうせなら第三者機関の証明書が欲しい…という人にとっては, 240円/月はお手頃なのだろうか.
spammer counter v3
IP アドレスでアクセスを禁止している spammer が,その後どれだけアクセスを続けているかをカウントする php コードを,今回は MySQL を使って実装した.
まず最初に注意点. ErrorDocument 403 で php ファイルへ飛ばす場合,その php ファイルへのアクセスは可能とすること.
さもなくば, 403 の転送で無限ループが発生する.
具体的には,.htaccess へ下記を追記.hogehoge.phpの部分は,設置したphpファイル名に変更すること.
<Files hogehoge.php> allow from all </Files>
spammer のアクセスが集中している時など,どうしても
spammer counter v2
では,ファイル書き込みに失敗するようだ.
その結果,度々ファイルがクリアされてしまっていた.
んで,よく考えたらこのサイトでは MySQL を使う blog が2つも動いていることを思い出したので,
DB で実装することにした.
とても楽チン.
そのコードは,こんな感じ.
<?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 = 'spammer_counter'; // connecting $mobj = mysql_connect($mySqlHost,$user,$password); if ($mobj == FALSE) { die('broken');} // count IP addr $addr = $_SERVER['REMOTE_ADDR']; mysql_select_db($dbname,$mobj); $done=mysql_query('insert into '.$table.' (ipaddr,number) values (''.$addr.'',1) ' .'on duplicate key update number=number+1;'); mysql_close($mobj); if ($done == FALSE) { die('no response...');} ?> 欠点は,データを見るのに DB を叩く必要があること. それは嫌なので,viewer も作った. </p> <p class="pre"> <?xml version='1.0' encoding='Shift_JIS'?> <!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</title></head> </body> <h1>spammer viewer</h1> <table style='border: black solid 1px;'> <tr><th>IP addr</th><th># of access</th></tr> <?php // MySQL $mySqlHost = 'xxx.xxx.xxx'; $dbname = 'database_name'; $user = 'user_name'; $password = 'password'; $table = 'spammer_counter'; // connecting $mobj = mysql_connect($mySqlHost,$user,$password); if ($mobj == FALSE) { die('broken');} mysql_select_db($dbname,$mobj); $done=mysql_query('select * from '.$table.';'); mysql_close($mobj); if ($done == FALSE) { die('no response...');} while ( $row = mysql_fetch_row($done)) { printf(' <tr><td>%s</td><td style=\'text-align:right;\'>%d</td></tr>\n',$row[0],$row[1]); } ?> </table> </body> </html>