2013/02/16

iPhoneぽい高速スクロールをAndroidでも。

iPhoneって、ステータスバー触ると、ガララララララララ・・・ ってすんごい高速で上までスクロールしますよね。
あのときって、結構、描画頻度落としてスクロールしてるんですよね。

Androidでも、同様に、高速スクロール時に描画頻度を落とせないかなーと思い、実験。


コード差分は、すんごいテキトーだけど、こんな感じ。
25msec以内の描画要求は、わざと25msecまで待たせて、描画要求をふんづまらせてるだけ。
https://gist.github.com/yi01/c50c0828b4d05cb5e5ea/revisions

2013/01/27

2台のVPSを1台に集約。




さくらのVPSの1Gプラン(980円/月)+2Gプラン(1480円/月)を借りていたが、
ちょっと毎月2400円は高いかなと思い、しかももともと2台借りていた理由が拠点間のIPSecの練習だったわけで・・・。

2Gプランのほうに集中させてみた。

ポイントとしては、
・基本的にはOpenVPNつかってNAPTな構成。入り口であるsakuraはコンテンツサーバー機能はほとんど無くルーティングとメンテナンス用の機能のみ。
・ただ、HTTPサーバ機能(port 80)については、これまでどおりのURLをなるべく保ちたかったゆえ、nginxによるリバースプロキシの構成にした。


ただ、ちょっと気になるのが、NAPTに使っているPassportも、リバースプロキシに使っているnginxも、パフォーマンス的にイマイチ・・・?
Windowsだから仕方ないのかな。
もとがLinuxのrinetdによるNAPT、Apacheのリバースプロキシだったのと比較すると明らかにパフォーマンス悪い。

チューニング話は気が向いたらまたそのうちに・・・



(2013/01/28 追記)
nginxが我慢ならん勢いでハングしまくるので、lighttpdに換えました。
古きよき軽量サーバーだけあって、非常に安定していて速いです。

confはこんな感じ。ほとんどサンプルそのまま。
server.document-root = "C:\Program Files\LightTPD\htdocs"
server.modules = ( "mod_access","mod_alias","mod_proxy" )

dir-listing.activate = "enable"

index-file.names = ( "index.html", "index.htm")
url.access-deny = ( "~", ".inc" )

## include mimetype mapping file
include "mimetype.conf"


$HTTP["host"] == "web-hack.org" {
    proxy.server  = ( "" => 
        (( "host" => "192.168.124.22", "port" => 80 ))
    )
}

$HTTP["host"] == "www.web-hack.org" {
    proxy.server  = ( "" => 
        (( "host" => "192.168.124.18", "port" => 80 ))
    )
}


$SERVER["socket"] == "sakura.web-hack.org:443" {
    ssl.engine           = "enable"
    #ssl.ca-file          = "cert\ca.crt"
    ssl.pemfile          = "cert\server.pem"
    proxy.server  = ( "" => 
        (( "host" => "192.168.124.10", "port" => 80 ))
    )
}

$HTTP["host"] == "sakura.web-hack.org" {
    proxy.server  = ( "" => 
        (( "host" => "192.168.124.10", "port" => 80 ))
    )
}

2012/12/31

いつの間にやら消えていたiPhoneのUSBテザリング設定を復活させる。

最近、iPhone 4SをUSBにさしてもなぜかUSBテザリングしてくれないなぁ?と思っていたら、割と有名な不具合のようで、あちこちのフォーラムサイトにいろいろ載ってました。

MacOS X Snow Leopard(10.6.8) + iPhone 4Sな自分には
https://discussions.apple.com/thread/4367664?start=0&tstart=0
のAppleUSBEtherHost.kext (2.2.0)を使う解決策がキタ━(゚∀゚)━!でした。

AppleUSBEthernetHost.kext 2.2.0を落としてきて解凍して
suでrootになって
rm -r /System/Library/Extensions/AppleUSBEthernetHost.kext
mv /Users/<名前>/Downloads/AppleUSBEthernetHost.kext /System/Library/Extensions/
chmod -R 755 /System/Library/Extensions/AppleUSBEthernetHost.kext
chown -R root:wheel /System/Library/Extensions/AppleUSBEthernetHost.kext
find /System/Library/Extensions/AppleUSBEthernetHost.kext -type f | xargs chmod 644

2012/12/25

iPod touch (第4世代)を家庭用のサーバーマシンにする。ついでに古いマシンと冗長構成にする。

大学院の時から使い続けているiPod touch 第2世代がそろそろ古くなってきたので
& きのうたまたまアキバでiPod touch 第4世代 64GBが13000円で売っていたので


購入。


こいつが2年以上サーバに使ってたほう。彼女との交際期間よりなg(ry
構築したときのメモは→ http://plog.web-hack.org/2011/02/ipod-touch-iphone-php.html

んで、こっちが新しいの。
カメラがついてたり。iOS 6だったり。

・・・。
ん、、iOS 6???

JailBreakできねーじゃん!!!!

しかたがないので、tethered jailbreakで我慢。

蛇足:
 ソフマップさん、頼むからiOS 5.1で初期化処理やってください。
 Jailbreakなんて例外にしても、マップがあれだと、価値が半減ですよ。
 そもそも、iOS 6のっけると動作がモッサリしてるし。

で、

iPod touchをサーバにしていて、不安定になったりしてrebootかけた、ってことは
ここ2年以上一度もないわけだが、
だけども、やっぱりクラッシュしてしまうと(Just Bootをいちいち手元でやってあげないと)サーバとしての機能が果たせないということになるのは困る。

よって、古いiPod touchも残しつつ冗長構成をとることに。


ちなみに、うちはプライベートIPしか振ってくれないマンションゆえ、
OpenVPNとさくらVPSをつかって、ちょっと特殊なネットワーク構成にしていて、

 [web-hack.org]
   ↓
さくらVPS上の鯖 …192.168.123.1
↓  ↓  ↓  ↓
○  ○  ○  ○ …192.168.123.0/24

構築方法は→http://plog.web-hack.org/2011/11/vpsopenvpnipod-touchweb.html

こういうネットワーク構成を前提に説明をすすめます。
以降の作業は、さくらVPS上の鯖でのものです。(新旧iPod touch側は同じHTTPサーバを2つ用意するだけなので、省略)

apache2の下記のモジュールを有効化。
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http

そんで、/etc/apache2/sites-available/defaultに
<VirtualHost *:80> 
    ServerName web-hack.org

    <Proxy balancer://web-hack/>
        BalancerMember http://192.168.123.10/
        BalancerMember http://192.168.123.18/
    </Proxy>

    ProxyPass / balancer://web-hack/
    ProxyPassReverse / balancer://web-hack/
</VirtualHost>
って書く。
192.168.123.10が古いiPod touch
192.168.123.18が新しいiPod touch

これで、あとは
sudo /etc/init.d/apache2 restart
とやるだけで、簡易ロードバランサのできあがり。


なんか
balancer://web-hack/

balancer://web-hack
と書いてしまうと、よくわからない
[Mon Dec 24 23:33:21 2012] [warn] proxy: No protocol handler was valid for the URL /favicon.ico. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
みたいなエラーが出ます。けっこうはまりました。

2012/11/20

Android(4.0以降)にはグローバルプロキシ設定が隠れているようだ。

最近、Galaxy Note(GT-N7000)にCyanogenMod 10を導入していろいろソースを見たりいじったりしてるわけですが、
たまたまなんだか気になるものを発見したのでメモ。

あれ?プロキシ設定あるよ?

まあ、なにもしなくてもWifi設定からできるけど、あれって「ブラウザでしか使えまへん」って思いっきり書いてあるし。
こっちはどうなんでしょう?
(そのうちtcpdumpとって見てみます)

以下、自分のEvernoteにメモってたことそのままコピペw
------------------------
ICSくらいからAsIsでメニュー自体は実装されているようだ。
ただ、動きが保証できていないのか、非表示にされてる。


    158         // Enable Proxy selector settings if allowed.
    160         DevicePolicyManager mDPM = (DevicePolicyManager)
    161                 activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
    162         // proxy UI disabled until we have better app support
    163         getPreferenceScreen().removePreference(mGlobalProxy);
    164         mGlobalProxy.setEnabled(mDPM.getGlobalProxyAdmin() == null);


163, 164行目をコメントアウトすると、メニュー自体は見れるようになる。



そして、ConnectivityManagerがわにGlobalProxyをセットするルートもあるようだ。


    257         ProxyProperties p = new ProxyProperties(hostname, port, exclList);
    258         // FIXME: The best solution would be to make a better UI that would
    259         // disable editing of the text boxes if the user chooses to use the
    260         // default settings. i.e. checking a box to always use the default
    261         // carrier. http:/b/issue?id=756480
    262         // FIXME: If the user types in a proxy that matches the default, should
    263         // we keep that setting? Can be fixed with a new UI.
    264         ConnectivityManager cm =
    265                 (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
    266 
    267         cm.setGlobalProxy(p);


もっと根っこをみていくと、単純なDBセットのようだ。

   2806             ContentResolver res = mContext.getContentResolver();
   2807             Settings.Secure.putString(res, Settings.Secure.GLOBAL_HTTP_PROXY_HOST, host);
   2808             Settings.Secure.putInt(res, Settings.Secure.GLOBAL_HTTP_PROXY_PORT, port);
   2810                     exclList);

------------------------


ということは・・・・
ルートハックさえしてしまえば
ってやって、書き換えれちゃうわけですね。


ただ、下記のようなソースコメントがあるくらいなので、どのくらいまともに動くのかは…使ってみないとわからんですね。
   162         // proxy UI disabled until we have better app support




:追伸:

一応検証したので。

プロキシ設定のUIから、DBに設定値が行く事は確認した。

adb shell 'echo "select * from secure;" | sqlite3 /data/data/com.android.providers.settings/databases/settings.db'
129|global_http_proxy_host|hoge-hoge.org
130|global_http_proxy_port|8080
131|global_http_proxy_exclusion_list|abc.com

ただ、tcpdumpを取ってみると、反映はされていない。3G/Wifi環境ともに
・Facebook
・Google Talk
・Google Play
・マピオン

どれも直接接続しに行ってる。すくなくとも4.1.2では。
全然グローバルじゃねえ!!!

っていう結果でした。