2013/09/01

HTC J ISW13HTのWifiを安定させる!

Wifi接続が不安定

auで3円運用するための、解約メモ | Hiroaki's blogで購入したHTC J ISW13HT、Wifi接続が不安定で、まともに使えない。 2.4GHzのアクセスポイントが2つ、5GHzのアクセスポイントが1つあり、5GHzのポイントに接続しにいくものの、IPアドレスが割り当てられるまで待ちきれないらしく、割り当て中の表示になったと思ったら2.4GHzのポイントに接続しに行き、結局アドレスが割り当てられない。
WifiをチェックするAndroidアプリを作った | Hiroaki's blogの正式公開版をGoogle Playから入れていたので、それが原因かとアンインストールしてみたのだけど、状況変わらず。

設定の問題?

ふと思って、Wifiの設定を5GHzだけにしてみた。

今までとは違い、ちゃんとIPアドレスが割り当てられ、通信できるようになった。原因って、これ?

いちいち切り替えるのは不便

そうと分かっても、公衆無線LANサービスの多くのアクセスポイントはまだ2.4GHzだし、でも、5GHzでサービスしているポイントであれば、空いているであろう5GHzで接続したい。でも、いちいち切り替えるのは面倒。結局、「Wifi使えねー」ってことになっちゃうよね、こんな状態だと。

無線周りのupdateが出るまで、この端末は外に持ち出せないかなぁというのが結論。安く手に入れたのがせめてもの救い。



MACのメニューバーが狭い

メニューバーが狭い

アプリをいろいろインストールしたら、メニューバーにアイコンがいっぱい並ぶようになった。

メニューバーにアイコンが表示しきれていない!メニューバーのアイコンのメニューから操作するようなアプリが使えない事態に!

これか!

みんなどうしているんだろう?広いディスプレイを使うからこういった問題には直面しないのか? MacBook Airを使うような人は、そんなにアプリを入れないのだろうか?と思いながらググってみたところ、 目から鱗が落ちるとはこのことだった。『AccessMenuBarApps』でメニューバーを広く使う! | 男子ハックという記事を発見。早速入れてみる。

これか!上のメニューバーのようにいっぱいいっぱいになっていても、AccessmenuBarAppsを起動すると、下のようにすっきり。
いちいちアプリを立ち上げるのはかったるいのだが、ジェスチャーで起動するように設定して解決。これは便利!



2013/08/26

P-01D復旧作戦

文鎮化?

なんか調子が良くないなぁと思ってP-01D を再起動してみたら、Docomoのロゴの画面から進まない。 ロゴを出して固まっているのではなさそうで、よーくみていると、一定期間でロゴが一瞬消える。 が、またロゴが表示されて繰り返し。
root取って何か作業していたわけでもなく、しいて言えば、ネットワークドライブのアプリで大量のファイルがあるフォルダを開いていたくらい。

復旧できないかもがいてみる

P-01Dのアプリを整理する | Hiroaki's blogで 使用したroot化セットを使うと、一応、USB経由でリカバリーモードに入れた。手順に従って緊急用のイメージを入れていたので助かった。
緊急用のイメージで起動して、バックアップを戻そうとしたら、バックアップがなかった。いや、root化セットでバックアップは作成していたのだけど、それを戻そうとしても、通常起動しないときは無力っぽい。いや、いろいろがんばればできるのだろうけど。

諦めて

結局、■ P-01D 再設定 ■: boon blogを参考に、factory reset。きれいに初期化されたので、すべて再設定。もちろん、注意! Google 2段階認証プロセスにしていたら、Android 2.x用のパスワードが必要 | Hiroaki's blogに書いたように、パスワードを再度準備。
端末だけ再設定して、root化セットの復元メニューで戻せたのかもしれないけど、いい機会なので、アプリも入れなおし&削除しなおし。
今度はリカバリーモードのメニューからもバックアップを作成しておく。次に同じ症状がでても、今度はリカバリーモードからリストアできるはず。



2013/08/11

P-01Dのアプリを整理する

アプリがいっぱい…

ぷらら3Gでテザリング | Hiroaki's blog にも書いたけど、P-01D にはプレインストールされているアプリがたくさんあり、自分が使いたいアプリを入れるスペースがほとんど残っていない。 ガラケーと同じノリで、プレインストールで小金を稼ごうとした結果なのかもしれないけど、このままでは不便。

root化してアプリを消す

プレインストールされているアプリは、普通には消せない。ので、root化して消すことにする。
root化は危険を伴う作業なので、自己責任で行うこと。この投稿も、紹介する記事も、何かトラブルが発生したとしても、責任を負うものではない。
root化
こちらで紹介されているroot化セットを使って、バックアップを取ってからroot化を行う。
アプリの整理
Titanium Backupを入れる。このアプリで、プレインストールされているアプリを消す。 を参考に。
Docomoの契約回線を使うわけではないし、通話もしないので、ガシガシ消しちゃう。



FANの掃除にエアダスター

暑い

夏だということを考慮しても、今年は暑い。外気が高ければ当然マシンも熱くなる訳で、MacBook Airのキーボードが結構熱い。
熱い原因は外気だけではない。ホコリが溜まって排気がうまくいっていないということもある。

掃除

そんなわけで、マシンの掃除。MacBook Airはキーボードの上側、ディスプレイとのつなぎ目にFANの口があるので、ホコリを取りにくい。 取りにくいのであれば吹き飛ばしてしまえ!ということで、Digio エアダスター/ノンフロン 390ml DGC-JB8を購入。写真だと大きさがわかりにくいけど、500mlのペットボトルよりも大きい。ノズルが付いているので、今回のような狭いところにもピンポイントで吹きつけられる。


2013/08/06

開発環境もクリック一発! Nitrous.IO

もっと簡単に環境を用意する

ドットインストールのRuby on Rails入門をRails4でやってみる | Hiroaki's blogでは環境を用意するところから始めたが、もっと手軽に!というのであれば、Nitrous.IOというのもアリ。

Nitrous.IO

Nitrous.IOは、クリック一発で立ち上がる開発用サーバ+Web版IDE。サーバはAmazon EC2に用意される。
のいずれかを使った開発を行うことができる。
Web版IDEにはサーバにログインした状態のフレームも用意されるので、IDEから抜けることなく、Webアプリの雛形を生成することが可能。
Better JavaとしてScalaGroovyを試してみたいので、これらの環境も提供してほしいなぁと思ったり。
Nitrous.ioへの登録は、こちらからどうぞ。

手軽に環境が用意できるのは嬉しいけど、「環境構築はさっぱり」って人を量産することにならないかな?


2013/07/20

ドットインストールのRuby on Rails入門をRails4でやってみる

Javaだけやっているのも危険ではないか?ということで、3分動画でマスターする初心者向けプログラミング学習サイト - ドットインストールRuby on Rails入門をやり始めてみた。

どーせやるなら最新版で!ということで、Rails4 と Ruby 2.0の環境を 入門Chef Solo - Infrastructure as Codeをみながら作った。のだが、当然のことながら、バージョン違いでレッスンの通りでは動かない箇所がちらほら。

#26 新しい記事を追加しよう (3)
万年素人からGeekへの道のroute_paramsメソッドをまねて、post_paramsメソッドを作る。また、Post.newのパラメータをpost_paramsと書き換える。
#33 記事を更新してみよう (3)
これも上と同じ。update_attribute()の引数をpost_paramsにする。
#36 削除処理をAjax化しよう (2)
ずばりな記事がこれ。ドットインストール Ruby on Railsの基礎 #36 でAjaxによるPost削除処理が動かない - 定食屋おろポン

この先はこれからやるので、また動かない箇所が出てくれば、その2で。





2013/06/22

Privoxyのログをfluentdで送る

いろいろなログをfluentdに集めてみるシリーズ。Privoxyのログを集めてみる。PrivoxyはiPhone, Android用のProxyをたててみる - 3 | Hiroaki's blogとか。
を参考に、formatやtime_formatを決めてみた。

<source>
  type tail
  format /^(?<time>[^ ]* [^ ]*) (?<id>[^ ]*) (?<action>(Request|Crunch:[^:]*):) (?<path>.*)$/
  time_format %F %T.%L
  path /var/log/privoxy/logfile
  pos_file /var/tmp/privoxy-logfile.pos
  tag td.privoxy.access
</source>
これをtd-agent.confに追加。


2013/05/12

Macbooi Airの温度情報をfluentdで扱う

httpのアクセスログじゃぁ物足りないので、Macの温度情報を扱ってみる。
MacでScreenのステータスライン(hardstatus)にCPU使用率&温度とメモリ使用率を表示させる - mfumiの日記を参考にTemperature Monitorをインストールし、出力をちょっと整形。
#!/bin/sh
/bin/echo -n "`/bin/hostname` "
#/bin/echo -n "macbook-air "
cmd=/Applications/TemperatureMonitor.app/Contents/MacOS/tempmonitor
$cmd -tv|/usr/bin/sed 's/,/ /g'
2行目と最終行の空白部分はタブ。
これを動かせば、マシン名とあちこちの測定結果をTSV形式で出力してくれる。ので、fluentdのexecプラグインでキックするようにする。
<source>
  type exec
  command 上記script
  keys host,time,core1,core2,core3,core4,disk,battery,charge,battery2,battery3,diode,proximity,palmrest,heatsink,logicboard,mainboard,bay
  tag td.system.temperature
  time_key time
  time_format "%Y-%m-%d %T %z"
  run_interval 300s
</source>
keysの行は
tempmonitor -th
の出力を見て決定。マシンによって測定できる内容が変わるのだそうだ。


2013/05/05

ビックデータを体験する-準備編

ビックデータブームって

ビックデータブームって、一昔前のデータウェアハウスブームと同じような臭いがする。
で、こういったものは、とにかくデータがないと始まらない。分析しようと思ってからデータを集め始めても、遅いのだ。
とはいうものの、分析対象とするデータをいろいろと集めるのもシンドイ作業。手元にあるデータで手っ取り早く試してみたい。
もう1つの問題は、データをどこに集めるのかということ。集めるための大容量のサーバを用意すべきなんだろうけど、手軽に試すという範疇を超えてしまう。

Treasure Data

こういった問題を解決する方法があった。Hadoop-based Big Data as a Service on the Cloud | Treasure Dataというのがあり、容量の制限はあるものの、試してみることができる。
データは、syslogで収集しているものを使えばよい。とにかくまずは使ってみて、そこから何に適用できるかを考える。

td-agent

Treasure Dataに登録すると、そのままデータ登録・操作のプログラムのインストールとチュートリアルに進むようになっているので、その手順に従う。
td-agentは、乱暴に言うと、fluentdの安定版。従って、td-agentが提供されていないOSでは、fluentdを使う。他にも、fluent-agent-liteというのがあるけど、手軽に試してみる段階では考えなくてよさそう。

td-agent(fluentd)は
  • データを受け取って
  • フォーマットの整形とかして
  • 保存先に送信する
ということをやる。今回は
  • データはsyslog
  • フォーマットの整形はなし
  • 保存先はTreasure Data
とし、td-agent.conf(fluentd.conf)に設定を記述していく。

syslogからのデータ取得

td-agentは、syslogのようにデータを受け取ることが可能なので、
<source>
type syslog
port 5140
bind 127.0.0.1
tag td
</source>

のように記述しておくと、port 5140で動いているsyslogdのように見える。なので、syslogd.confに

*.*       @127.0.0.1:5140
と書いておくと、今のsyslogが受信している内容をすべてtd-agentに渡すことができる。

Treasure Dataへ保存

<match td.*.*>
  type tdlog
  apikey xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

  auto_create_table
  buffer_type file
  buffer_path /var/log/td-agent/buffer/td
  use_ssl true
  flush_interval 10s
</match>
と記述しておくと、自動でfacility名でデータベースを作り、priority名でテーブルを作ってくれる。

td-agentを起動してエラーが出てなければ、syslogdにシグナルを送ってsyslogd.confの再読み込みをさせて、準備OK。

td

Treasure Dataに保存したデータにアクセスするのが、tdコマンド。これについては、次回。


2013/04/14

サーバーのマザーボード交換

家のネットワークをようやくギガビットにしたので、サーバもバージョンアップしてGigaに対応したドライバを使うようにしようと思った。そこで、FreeBSD7→8にしようと、kernelを入れ替えて再起動させたところ、起動時のbeep音がしない。ディスプレイを繋げてみたところ、BIOSの画面すらでていない。1uのラックマウント型のケースに入れているので、熱がこもってどこかイカれてしまったんだろう。
インテル® デスクトップ・ボード D425KT。これ、いつ買ったんだっけ?と悩んでもサーバが動かないまま不便なので、代わりのマザーボードを購入。


1uのラックに収まるマザーボードは、意外と少ない。オーディオの縦に並んだ端子が、高くてひっかかってしまうのだ。というわけで、今回も無理矢理押し込んで使えているIntelのマザーにする。インテル Atom Onboardマザーボード BOXD2500HN 【Mini-ITX】。これをいつも通り無理やり押し込んで、復旧。ディスクのパーティションを認識しないとかちょっとトラブルがあったけど、livefsのkernelをまるっとコピーしたら動いたので、とりあえず良しとする。ゴールデンウィークにちゃんと対処する、できれば、FreeBSD 8にすると。

せっかくギガビットにしたんだから、外部との接続も速くしたいというのでいろいろ調べたのだけど、それはまたの機会に。



2013/04/07

CentOS 5.9にしたら、openswan+xl2tpdが繋がらなくなった!

Amazon EC2にVPN Serverをたてる(L2TP編) | Hiroaki's blogをパクってCloudCore上にopenswan+xl2tpdでVPN Serverを立てていたのだが、CentOS 5.9にアップグレードしたところ、繋がらなくなった。
ログをよーく見ると、
STATE_QUICK_R2: IPsec SA established transport mode
とあるので、IKEでキーの交換まではできているらしい。tcpdumpでパケットとにらめっこしていたら、どうやらこのメッセージの後、繋ごうとしているクライアントからのパケットに対し、応答を返していない様子。
ググっていくつかのサイトの設定と自分の設定とを見比べる。と、
rightsubnet=vhost:%priv
って記述でいいの?これを
rightsubnet=0.0.0.0/0
に直してみたところ、解決。
leftnexthop
もいらなさそうなので、削除。
openswan-2.6.32になって、解釈が変わったというか、今までたまたま動いてきたってこと?2.6.38ではAndroid 4.0.4用のworkaroundも入ったようなので上げてみたいけど、またハマルのは嫌だなぁ。


2013/04/04

2in1 契約でMNPする時のはまりポイント

ドコモのfoma契約だと安価に回線を増やせる2in1契約。MNPするために2in1契約したときの注意点が1つ。
2in1で契約した回線のMNP手続きは、電話で行う。ネットでは手続きできない。
ドコモのサイトには載っていないので、ネットで手続きしようとして???な状態になってしまうけど、単に2in1で増やした回線に対する手続きはネットでできないというだけのこと。何日待ってもできるようになる訳ではないので、とっとと電話してしまいましょう。


2013/01/09

ぷらら3Gでテザリング

FixAPN - Google Play の Android アプリdocomo P-01Dの組み合わせで、MVNOの回線でもテザリングができるというので、中古のP-01Dを買ってきて、試してみた。
OKばっちり。


ぷらら3Gの設定は、上のキャプチャの通り。

Wifiルータよりは手軽にいじれるP-01Dだが、使わないアプリが山のように入っているのにはまいった。空き容量があまりないので、日常使うアプリを入れるのは断念。



2013/01/05

注意! Google 2段階認証プロセスにしていたら、Android 2.x用のパスワードが必要

2段階認証プロセスの説明文

概要

Android 2.xは2段階認証プロセスに対応していない。従って、2段階認証プロセスを有効にしたGoogle アカウントを設定しようとした場合、アカウント情報のページで専用のパスワードを生成する必要がある。

アカウントの認証が成功しない

いろいろあって、中古のスマホを購入した。Googleアカウントを登録しようとIDとパスワードを入力すると、エラーになる。IMEの変換を間違えたのかと何度か繰り返したものの、アカウントの認証は成功しない。
「もしかして、やられた?」と思ってGmailのページをずぅっと下にスクロールさせ、右下の「アカウントアクティビティの詳細」を見てみると、特に問題はなさそうだ。

2段階認証プロセス

このアカウントは2段階認証プロセスに切り替えていたことを思い出し、Googleのアカウントページからアカウント情報を眺めていた。
「Android Login V1」なんてサービスが登録してある。
さらにアプリケーション固有のパスワードを設定するところを見ると、「旧式の Android スマートフォン」ととして登録してある。

Android 2.3は対応していないアプリケーション

中古で買ったスマホは、Android 2.3だったため、2段階認証プロセスに対応していかった。従って、
  • あらかじめアプリケーション固有のパスワードを生成し
  • スマホでGoogleアカウントを登録するとき、生成したパスワードを入力する
という手順が必要だった。ちょっと前に購入したHTC J(Hiroaki's blog: auで3円運用するための、解約メモ)はAndroid 4.xでこの手順が不要だったため、気付くのが遅れた。 Android 2.xと4.xでは、こんなところも変わっているんだ。

型落ちのスマホを格安で打っていることも多いので、
  • 年末から騒がれているから、よくわからないけど2段階認証プロセスにしてみた。
  • スマホはよくわからないので、販売店で設定してもらおう。
ってノリの人だと、見事にはまるね。


2013年年賀状

これでみんな1回以上登場。


2013/01/01

auで3円運用するための、解約メモ


MNP一括0円とか、捨て身のように見えてくるau。そうはいっても、こちらも懐に余裕があるわけなどないので、ありがたく利用させていただく。

このとき、販売店で付けられたいろいろなオプションを解約していないと、月々の支払いが安くならない。
ダブル定額スーパーライト
auを使うのが初めてで、au IDの取得など3Gを使うことがあるというので、付けてみた奴。au IDを取得したら、Webから解約予約。実際に解約されるのは、月替わり。
インターネット接続サービス(EZ WIN/IS NET)
3Gでネットを使うために必要。また、電源を入れたときに3Gの通信が発生することがあるというので、購入時には付けておいた。用が済んだら、サポートに電話して解約。
安心ケータイサポート
3円運用を考えると、不要。端末が故障したら、そのまま回線を放置してしまえばいい。3円運用×2年縛りなので、ほうっておくのが一番安い。インターネット接続サービスと一緒に解約。
auスマートパス
いらない。スマートパスのアプリから解約できるのだが、そのとき、SIMを挿していないとエラーになってしまう。ダブル定額スーパーライトを解約する前にこっちを解約しておくか、auスマートパスのサポートに電話して解約する。
スマートパスのシステムがトラブルとかで、通常のサポート窓口と、スマートパスの窓口と、別々に電話して解約する必要があった。auのページを見ても、どこに電話すればいいの?って感じだった(全体を一覧で見ることができない)ので、解約した人の手続きを参考にする。
auスマートパスの退会方法 | すまコジ ひょかレポ: auスマートパスをパケットを発生させずにサクっと退会する方法
SIMをまだ挿しているなら、Wi-Fi接続でもOK!au スマートパス解約手順 | マイスクラップブックでいけるけど、挿していないと、アンケートに答えた後にエラーになる!

3Gで通信するつもりはないので、一応、SIMは抜いておく。HTC Jって、どう蓋をはずすの?ってことで、これ。

蓋をはずして、SIMを抜いておきましょう。


2012/12/22

iPhone, Android用のProxyをたててみる - 3

Hiroaki's blog: iPhone, Android用のProxyをたててみる - 2の続き。Privoxyの設定編。

configの設定
Privoxyの設定はconfigファイルで行う。コメントを除いた設定ファイルは、こんな感じ。
confdir /usr/local/etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on.
actionsfile user.action      # User customizations
filterfile default.filter
filterfile user.filter      # User customizations
logfile logfile
debug      1 # Log the destination for each request Privoxy let through.
debug   1024 # Log the destination for requests Privoxy didn't let through, and the reason why.
debug   4096 # Startup banner and warnings
listen-address  :8118
toggle  1
enable-remote-toggle  0
enable-remote-http-toggle  0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 4096
forward /       localhost:8080
forward :443    .
forwarded-connect-retries  0
accept-intercepted-requests 1
allow-cgi-request-crunching 0
split-large-forms 0
keep-alive-timeout 50
connection-sharing 1
socket-timeout 300

enable-compression 1
compression-level 9
actionsfile、filterfileは後ろで説明することにして、重要なのは、toggle 1。これで、Privoxyによるコンテンツの書き換えを有効にする。

actionsfile
「どんな操作を行うか」を定義したのが、actionsfile。柔軟に設定できるようになっているが、それがかえって難しく感じさせている気がする。というわけで、ここではよく使いそうな2つのパターンを説明する。
{+block{理由}}
適用させるドメイン or URLのpath
 :
ブロック。リクエストを中継しない。アクセスを禁止させたいドメインなどの指定に使う。
{+filter{フィルタ名}}
適用させるドメイン or URLのpath
 :
コンテンツを書き換えるときに使う。例えば、iOSではフラッシュを見ることができないため、コンテンツに埋め込まれているフラッシュを除去するときに使う。

filterfile
actionsfileで指定するfilterを定義する。コンテンツの書き換え方を記述する。

match-all.actionは、すべてのURLに対して適用するactionを書く。そうでなくてもよいのだが、ファイル名と内容を合わせておいたほうがよいだろう。これには手を加えずに、user.actionに記述するほうがよいかも。
default.filterは、あらかじめ定義されているフィルタ。フィルタは、定義しただけでは適用されないため、ここで読み込んでおいても問題ないだろう。
自分の設定は、user.actionuser.filterに記載する。広告除去 - Privoxy Wikiなどが参考になる。

ここまでやれば、自分の興味のないページへのアクセスや、端末の関係で見れないデータをダウンロードしてくることなど、無駄な処理をずいぶん省けると思う。データ転送量での速度制限が当たり前のように行われているので、こうやって自衛するのも有効なはず。


2012/12/15

iPhone, Android用のProxyをたててみる - 2

Hiroaki's blog: iPhone, Android用のProxyをたててみる - 1の続き。今回は、Apache Web Server編。

今回の概要
  • Apache Web ServerでCache Serverの設定を行う。
  • 画像圧縮のscriptを用意する。
  • Privoxyの上位Proxyとして、Apache Web Serverを指定する。

Apache Web ServerでCache Serverの設定
Apache HTTP サーバ バージョン 2.2 ドキュメント - Apache HTTP サーバを読む。以上。
なんだけど、画像圧縮とかやるとなると、サンプルが欲しくなる。
<IfModule !mod_proxy.c>
LoadModule proxy_module libexec/apache22/mod_proxy.so
LoadModule proxy_http_module libexec/apache22/mod_proxy_http.so
LoadModule proxy_connect_module libexec/apache22/mod_proxy_connect.so
LoadModule proxy_ftp_module libexec/apache22/mod_proxy_ftp.so
</IfModule>
<IfModule !mod_deflate.c>
LoadModule deflate_module libexec/apache22/mod_deflate.so
</IfModule>
<IfModule !mod_ext_filter.c>
LoadModule ext_filter_module libexec/apache22/mod_ext_filter.so
</IfModule>

<IfModule mod_ext_filter.c>
ExtFilterDefine gif-filter \
    mode=output intype=image/gif \
    cmd="/usr/local/libexec/airHproxy/gif-filter.sh"
ExtFilterDefine jpeg-filter \
    mode=output intype=image/jpeg \
    cmd="/usr/local/libexec/airHproxy/jpeg-filter.sh"
ExtFilterDefine png-filter \
    mode=output intype=image/png \
    cmd="/usr/local/libexec/airHproxy/png-filter.sh"
<IfDefine DEBUG>
ExtFilterDefine debug-before \
    mode=output \
    cmd="/usr/bin/tee /tmp/filter.before"
ExtFilterDefine debug-after \
    mode=output ftype=21 \
    cmd="/usr/bin/tee /tmp/filter.after"
</IfDefine>
</IfModule>

<IfModule !mod_cache.c>
LoadModule cache_module libexec/apache22/mod_cache.so
<IfModule !mod_mem_cache.c>
LoadModule disk_mem_module libexec/apache22/mod_mem_cache.so
</IfModule>
</IfModule>

<IfModule mod_cache.c>
CacheMaxExpire 108000
CacheLastModifiedFactor 0.1
CacheDefaultExpire 3600
CacheIgnoreNoLastMod On
<IfModule mod_disk_cache.c>
CacheRoot "/var/cache/apache22"
CacheDirLevels 5
CacheDirLength 3
</IfModule>
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 512000
</IfModule>
</IfModule>
Listen *:8080
<VirtualHost *:8080>
    ServerName proxy.example.jp
    DocumentRoot /var/empty
    CustomLog /var/log/httpd/httpd-proxy-access.log combined
    ErrorLog /var/log/httpd/httpd-proxy-error.log
    #DeflateFilterNote Ratio ratio
    #LogFormat "%h %l %u %t \"%r\" %>s %b/%{ratio}n%%" common_deflate
    #CustomLog /var/log/httpd/proxy_access.log common_deflate

    <Location />
        Deny from all
    </Location>

    ProxyRequests On
    ProxyVia On
    #ProxyRemote * http://127.0.0.1:3128
    NoProxy www.example.jp
    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1

        AddDefaultCharset Off

        <IfModule mod_ext_filter.c>
        <IfDefine !DEBUG>
        SetOutputFilter html-filter;gif-filter;png-filter;jpeg-filter
        </IfDefine>
        <IfDefine DEBUG>
        SetOutputFilter debug-before;html-filter;gif-filter;png-filter;jpeg-filter;DEFLATE;debug-after
        ExtFilterOptions DebugLevel=9 LogStderr
        </IfDefine>
        </IfModule>
    </Proxy>
</VirtualHost>

これを/etc/httpd/conf.d/proxy.conf として保存(CentOS 5なので)。設定を反映させる方法は略。
CloudCoreだとメモリ2GのVPSなので、キャッシュはメモリに取る設定にしてみた。gif、jpeg、pngについては、外部フィルタを呼び出す形。設定を晒してみて思ったけど、deflateの設定はいらなさそうだなぁ。

画像圧縮のscript
Air H" を使っていたときに用意していた設定を流用。どこかのサイトにあったのを持ってきたものだったはずなのだが、原典は不明。

/usr/local/libexec/airHproxy/gif-filter.sh
#!/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin
export PATH

cd `dirname $0`
. ./common-settings
# -resize WxH> とすると WxH のサイズからはみでる大きさの画像だけ、
# そのサイズに収まるように縮小する。範囲内ならサイズ変更しない。

convert +adjoin gif:- gif:- | convert $opt -colors 32 +dither -colorspace Transparent +profile "*" gif:- gif:-

で、common-settingsの内容は
#
case "$HTTP_USER_AGENT" in
*AH-K3001V*) opt="-resize 240x320>";;
*iPod*)
*Darwin*)
        opt="-resize 640x960> -unsharp 0"
        ;;
*SC-02B*)
*FlipboardProxy*)
        opt="-resize 480x800> -unsharp 0"
        ;;
esac
jpegやpngも同じ~と思ったら、画像フォーマットによってconvertのオプションが微妙に異なる。

/usr/local/libexec/airHproxy/jpeg-filter.sh
#!/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin
export PATH

cd `dirname $0`
. ./common-settings

exec convert $opt -quality 85 +profile "*" jpeg:- jpeg:-
/usr/local/libexec/airHproxy/png-filter.sh
#!/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin
export PATH

cd `dirname $0`
. ./common-settings

exec convert $opt -colors 32 +dither -colorspace Transparent -quality 99 +profile "*" png:- png:-


Privoxyの設定
上位のproxyを設定するのは、configファイル中のforward。
forward /       localhost:8080
forward :443    .
のようにする。SSLはproxyを通す必要がないので、.を指定する。configのコメントにもあるように、アクセス先によって使用するproxyを変えたり、proxyを使わなかったりということができる。

これで、端末側の設定がいらない、画像圧縮を行うproxyができあがり。でも、せっかくPrivoxyを使っているので、次回は広告を除去してみる。


2012/12/08

iPhone, Android用のProxyをたててみる - 1

iPod Touch(iPhone/iPad)とAndroid向けに、Proxy Serverを立てて、広告の除去や画像の圧縮をやるようにしてみた。

透過Proxyにする

Android 2.xも対象にする。これはProxyの設定がないので、設定なしで使える透過Proxyとする。
透過Proxyを通すため、VPNを必須とする。つまり、VPN接続したとき、透過Proxyを通るようにする。
CentOS 5で構築してみる。透過ProxyにはPrivoxy を使う。画像圧縮には、The Apache HTTP Server Projectのmod_ext_filterを使って、ImageMagickを呼び出す。

Privoxyのインストールには注意が必要

VPNについては、Hiroaki's blog: Amazon EC2にVPN Serverをたてる(L2TP編)などを参照、ということで、省略。

Privoxyはrpmで入れてOK。と思ったら、古いバージョンだと透過Proxyの機能がない。設定ファイルに

accept-intercepted-requests 1
と書いて起動できなかったら、バージョンが古いor透過Proxyを無効にしてコンパイルされている。この場合、一度rpmで、実行時に必要となるライブラリもろともインストール。/etc/rc.d/init.d/privoxy を適当な場所にコピーしてから、アンインストールし、最新版をソースから入れ直す。
./configure && make && make installという標準パターンでOKなのだが、透過Proxyを使いたいのと、どうせなら圧縮もさせたいので、
./configure --enable-accept-filter --enable-compression --with-user=privoxy --with-group=privoxy
とする。詳しくは、./configure --help を。

installが終わったら、コピーしておいた /etc/rc.d/init.d/privoxy を元に戻して、中身を確認。インストール先が /usr/local になっているので、PATHやP_CONF_FILEの値を修正しておく。そうそう、ユーザーとグループも、それぞれprivoxyというのが必要(というか、./configureの時に--with-user=と--with-group=で指定した奴が必要)なので、確認してなければ作っておく(詳細は略)。

Privoxyの設定

まずは、透過Proxyが動くようにする。apacheでの画像圧縮は、その次。

Privoxyの設定ファイルはいくつかあるが、/usr/local/etc/privoxy/config が親玉。非常に長いので圧倒されてしまうが、コメント行を取っ払ってしまうと、20行ちょっと。取り合えず動かすために

  • toggle 1 → toggle 0
  • #debug 1 と #debug 4096 と #debug 8192 の行の先頭の#を取る
  • accept-intercepted-requests 0 → accept-intercepted-requests 1
と直したら、service privoxy start とやって起動させてみる。ログは/var/log/privoxy/logfileに出力されるので、ユーザprivoxyで覗いてみる。ちゃんと起動できていればPort 8118でListenしているはずなので、netstatで確認。/var/run/privoxy.pid が書けなくても起動しないので、ディレクトリのアクセス権限にも注意。

透過Proxyの設定

あと一息。
透過Proxyにするためには、本来まっすぐ進むはずのパケットを無理やり回り道させるような設定が必要になるので、iptableに設定を追加する。

iptables -A PREROUTING -s 192.0.2.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 8118
iptables -A POSTROUTING -o eth0 -s 192.0.2.0/24 -j MASQUERADE
のような設定。192.0.2.0は、VPNでiPhone/Androidに割り当てるIPアドレス、eth0は、透過Proxyを動かしているマシンからパケットが出て行くときのInterfaceなので、使用環境に合わせて変更すること。

これで、画像圧縮はしないけど、透過Proxyとして動作する。iPhone/AndroidからVPN接続して、いくつかサイトを見てみて、 /var/log/privoxy/logfile にアクセス先が出力されていれば、OK。