Amazon

2011年9月26日月曜日

プロキシサーバーSquidをWindowsでセットアップ

プロキシサーバーとして利用できるフリーのSquidのWindows版インストール手順のメモ
参考元はこちら
  1. squidのページよりSquid 2.7 for Windowsをダウンロード
  2. 解凍してC:\squidとなるようにフォルダを配置
  3. C:\squid\etc\mine.conf.default, squid.conf.defaultをそれぞれコピーしてmine.conf, squid.confに名前変更
  4. squid.confの"acl localhost src 127.0.0.1/255.255.255.255"の行の後に次の行を追加"acl lan src 192.168.0.0/255.255.255.0"
  5. "http_access allow manager localhost"の次の行、"http_access deny manager"の前の行に"http_access allow lan"を追加(lanは上記で追加した名前)
  6. visible_hostnameにプロキシサーバーのホスト名を追加(例proxy.hogehoge.co.jp)
  7. コマンドプロンプトでC:\squid\sbinに移動
  8. % squid -z でスワップ用のディレクトリを作成
  9. % squid -i でsquidをWindowsのサービスとして追加
  10. コントロールパネル->管理ツール->サービスでSquidのサービスを開始する 
     
    ちなみに10でサービスの起動に失敗する場合は、6のサーバーにアクセスできない場合(DNSが解決できない場合を含む)に起こる




2011年9月24日土曜日

ケータイで使用できる絵文字の素材

DoCoMo, au, Softbankの絵文字一覧は
http://www.kent-web.com/bbs/epad.html

http://trialgoods.com/emoji/?career=sb&page=all
などで参照できる。けど、著作権的にアウトらしいので、他のものを探していたらTypePadが絵文字をフリーで公開しているらしく、携帯向けコンテンツを作成するときは有用そう。

TypePadの絵文字アイコン画像と、携帯コンテンツ表示モジュールをフリー(自由)ライセンスで公開

http://start.typepad.jp/typecast/

あとは絵文字使用時にライセンスを明記すればOK

2011年9月17日土曜日

mixiアプリのuseragent


mixiアプリを開発していると、色々ハマる。
きっとPC版、モバイル版、スマフォ版とバラバラに作ってるせいだろうけど。

そんなわけで今日ハマったのはmixi側から送られてくるUserAgentの情報
PC版は外部リクエストAPIを使用するとHTTP_USER_AGENTがユーザーのブラウザ情報ではなく "
mixi-platform/1.1"となる。これじゃあブラウザによって処理を変えることができないじゃんよ。。。
スマフォ版、モバイル版はOpenSocialのgadgets.io.makeRequest()メソッドを使わないので外部にリクエストできるので、useragentはユーザーのブラウザ情報が表示される。
さて、どう対処すべきか。。。

2011年9月16日金曜日

ケータイ、Androidの文字コードの袋小路


mixiモバイル、touch、PC版アプリを同時に作ろうとしていて文字コードの袋小路にハマる。
たぶんこれはmixiモバイルに限らないのでメモしておこう。

モバイル系は
au, docomo, softbankはShift-JISに対応。但し、
CSSを使う場合はiモード対応XHTMLにする必要がある。
XML宣言とi-mode用のDOCTYPE宣言が必要。

docomo, softbankはutf-8でも問題ないが
auはau browser6.2はutf-8に対応していない。7.2は対応している。
3G端末に限って言うと、UTF-8が使える条件は次のようになっている。
参照元はこちら
機種 XHTML HTML XHTML
(SSL)
HTML
(SSL)
docomo 3G
au ブラウザver7.2
au ブラウザver6.2 × × ×
SoftBank 3G
○:文字化けしない △:一部の条件下で文字化け ×:文字化けする

次にtouch版
iPhoneの場合、Shift-JISでもUTF-8でも問題ない。
Androidの場合、2.1においてはShift-JISだと問題がある。

参照元はこちら
文字エンコーディング Content-Typeヘッダ xml宣言の有無 結果
Shift_JIS text/html
application/xhtml+xml ×
UTF-8 text/html
application/xhtml+xml
EUC-JP text/html
application/xhtml+xml ×

つまりShift-JISだとAndroid  2.1で非対応となり、UTF-8だとau携帯が非対応(文字化け)となってしまう。
Shift-JISにして、Android 2.1の時だけContent-Typeヘッダーをtext/htmlに変換するのが一番手がかからないかなぁ。。。

Android 2.1でのShift-JISページの取り扱い

mixi touchアプリを作っていたときのこと。
Android 2.1のシュミレーターでテストしてたら
「Unsupported encoding Shift_JIS」のエラーが出ました。
2.2, 2.3では起こらないのになんでやねん?

そこで 調べていたらまさしくビンゴなブログを書いている方がいらっしゃいました。

Andorid2.1のブラウザはShift_JISをサポートしないのか?


Content-Typeヘッダの出力をtext/htmlにしたらどうか?XML宣言を書かなければ?、文字エンコーディングがUTF-8、EUC-JPなら?とパターンをそれぞれ用意し、表示した結果を以下の表にまとめてみました。
文字エンコーディング Content-Typeヘッダ xml宣言の有無 結果
Shift_JIS text/html
application/xhtml+xml ×
UTF-8 text/html
application/xhtml+xml
EUC-JP text/html
application/xhtml+xml ×




いや、そういうバグはやめてくれ。。。

2011年9月6日火曜日

Pythonによるモバイル開発の文字コード2

前回に引き続き、Pythonの文字コードで引っかかったお話。
今回はPythonというよりも、Opensocial APIのgadgets.io.endoceValues()メソッドのお話。

Opensocialのアプリを作成している際
HTML側のメタタグで
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" />
と指定した上で
<input type="button" onclick="postSubmit()"/>
と書く。

この時、JavaScriptの
function postSubmit(){
...
var value1="";
var value2="";
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.POST;
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
var post_data{
'key1':value1,
'key2':value2,
} 
params[gadgets.io.RequestParameters.POST_DATA] = gadgets.io.encodeValues(post_data);
と書いてPOSTリクエストをすると、
gadgets.io.endoceValues()が有効になり、
POSTされる文字コードは,入力オブジェクトを URL エンコードしたデータ文字列に変換される。
POST のデフォルト エンコードは application/x-www-form-urlencoded でありShift-JISではない。
 
よって、Python側で受けるとき
self.request.charset="Shift-JIS"
をセットしてしまうと返って文字化けを引き起こしてしまう。
ということで、JavaScriptからPOSTされた場合には、self.request.charset="Shift-JIS"
は呼ばないようにif文を書いてあげる。
userAgent=detectAgent(self.request.user_agent)
if userAgent != 'pc':
 
ここでdetectAgentメソッドは独自メソッドで、self.request.user_agent(HTTP_USER_AGENT)に入っている文字列からpcかsmartphoneかmobileかを判定する。
def detectAgent(userAgent):
    if userAgent.startswith('DoCoMo'):
        return 'mobile'  
    elif userAgent.startswith('KDDI-'):
        return 'mobile'
    elif userAgent.startswith('SoftBank'):
        return 'mobile'
    elif userAgent.startswith('Vodafone'):
        return 'mobile'
    elif userAgent.startswith('Mozilla/5.0 (iPhone'):
        return 'smartphone'
    elif userAgent.startswith('Mozilla/5.0 (Linux'):
        return 'smartphone'
    else:
        return 'pc' 
あまりスマートな書き方じゃないけど、とりあえず暫定版ということで。

2011年9月3日土曜日

Pythonによるモバイル開発の文字コード1


携帯Webサイトを作る際、文字コードがShift-JISにするのが一般的。
このWebサイトからフォームで日本語を POSTする場合、
Python側で受取る時に注意が必要。
通常PythonではUTF-8で受取るため、文字化けを起こす。

そこで、self.request.get('xxx)とする前に
self.request.charset('Shift-JIS')で文字コードを指定する。
こんな感じ

def post(self):
        self.request.charset="Shift-JIS"
        self.request.get('hoge')

Pythonでテスト駆動開発2 -Aptanaからnoseの実行-

前回noseを使って、Pythonでテストを実行する方法について書いた
今回はAptana(Eclipse)からPythonのテストフレームワークのnoseを使用する方法をまとめます。

テストするクラスとテストコードは前回のtest1.py, test2.py

test1.py, test2.pyでは使用していないけど、
テストコードで以下の一文があると、まずライブラリが見つからないとAptana(Eclipse)から怒られる。
from nose.tools import ok_, eq_

ということで解決策
1. プロジェクトを右クリックしてプロパティ
2. PyDev - PYTHONPATHにnoseのライブラリフォルダを追加
 (C:\Python27\Lib\site-packages\nose-1.1.2-py2.7.egg)

テストの実行は
test2.pyの最後に
if __name__ == '__main__':
    import nose
    nose.main()
の記述を入れると、pythonの実行ファイルと認識されて、Eclipseの実行設定ファイルで読み込めるようになる。

ちなみに実行設定ファイルは以下の通り。




で、上記を実行すると
Failure: ImportError (No module named testdata) ... ERROR
Failure: ImportError (No module named sancho.unittest) ... ERROR
Failure: ImportError (No module named sancho.unittest) ... ERROR
Failure: ImportError (No module named sancho.unittest) ... ERROR
Failure: ImportError (No module named sancho.unittest) ... ERROR
Failure: ImportError (No module named sancho.unittest) ... ERROR
Failure: ImportError (No module named sancho.unittest) ... ERROR
Failure: ImportError (cannot import name AES) ... ERROR
Failure: ImportError (No module named testdata) ... ERROR
という結果になる。

このプロジェクト内のテスト(class Testxxx)を全部実行するため、 本来テストしたいもの以外も実行されてしまっている。

ということで、必要なテストだけを実行する場合は--tests=NAMEオプションを付けて実行する。
通常はnose.main()にargs=["-v","--name=tests2.py"] を渡して
test.py
if __name__ == '__main__':
    import nose
    nose.main(args=["-v","--name=tests2.py"] )
とするのが一般的のようだけど、何故か引数が有効にならない。
Aptana(Eclipse)を使用する場合はmainへの引数は実行設定ファイルで設定するようです。



で実行するとverboseモードになって(test.xxx ... okみたいな)テスト結果が表示される。

test2.TestDollar.Multiplicaton_test ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK


○注意点
class名はTestxxxとTestで始めること
メソッド名はyyy_testとすること

2011年9月1日木曜日

Pythonでテスト駆動開発1

Pythonでテスト駆動開発を行うためのツールとしてunittestとnoseがある。参考はこちら
unittestでは必要なクラスを継承するなど、いくつかの決まりごとがあるが、noseでは正規表現 "(?:^|[b_.-])[Tt]est" にマッチしたクラス・関数が実行されるようになっているため、ルールがシンプル。

noseのインストール
% easy_install nose
 
○テスト実行時
テストの実行は次の2種類があります。
  1. nosetests コマンドでテスト対象のファイルやディレクトリを指定
  2. テストスクリプト内でテストを実行
(1) の場合は、nosetests の引数にテストファイルを指定、あるいは -w オプションでテストファイルを含んだディレクトリを指定することでテスト実行します。
(2)の場合は、テストプログラム内で nose.main 関数を呼び出すようにします。
def test_compare():
    assert 1==1
if __name__ == '__main__':
    import nose
    nose.main()


テストクラスが入っているディレクトリ内で 
% nosetests 
 
サンプルクラス(test1.py)
#-*- coding: utf-8 -*-

class Dollar():

    def __init__(self, amount=0):
	self.amount = amount

    def times(self, multiplier):
	self.amount *= multiplier
テストコード(test2.py)
#-*- coding: utf-8 -*-

from test1 import Dollar
from nose.tools import *

class TestDollar():

    def testMultiplicaton(self):
        five = Dollar(5)
        five.times(3)
        eq_(15, five.amount)
成功すると
---------------------
Ran 1 test in 0.047s

OK
失敗すると
======================================================================
FAIL: test2.TestDollar.testMultiplicaton
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\nose-1.1.2-py2.7.egg\nose\case.py", line 1
97, in runTest
    self.test(*self.arg)
  File "C:\temp\test2.py", line 11, in testMultiplicaton
    eq_(10, five.amount)
  File "C:\Python27\lib\site-packages\nose-1.1.2-py2.7.egg\nose\tools.py", line
31, in eq_
    assert a == b, msg or "%r != %r" % (a, b)
AssertionError: 10 != 15

----------------------------------------------------------------------
Ran 1 test in 0.562s

FAILED (failures=1)
○オプション

verbose モード

「-v」 オプションを有効にすると、verbose モードでテストが実行されます。-vvv のように v を重ねると、より verbose なメッセージが表示されます。

pdb 対応


「--pdb」 オプションを有効にすると、テストプログラムで例外が起きると同時に、pdb が起動し、デバッグモードに入ります。

「--pdb-failures」オプションを有効にすると、テストプログラムでテストが失敗すると同時に、pdb が起動し、デバッグモードに入ります。

パターンマッチ


「-i 正規表現パターン」オプションを有効にすると、正規表現にマッチしたファイルのみがテスト実行されます。

「-e 正規表現パターン」オプションを有効にすると、逆に正規表現にマッチしたファイルは実行されなくなります。


○さらに詳しく理解するには
nose まとめ 1

Amazon3