2011年12月10日土曜日

Python 3 チュートリアルを Python 2 で試しながら読んでみた #1

Django が、Python 3 に対応していないので、Python の勉強をするなら Python 2 環境に慣れておかないとダメ。ということで、手元にある「Python チュートリアル 第2版」のコードを Python 2.7.2 (Windows XP) 上で試してみたよ。

とりあえず、Python 2 インタプリタをめいっぱい Python 3 互換で動くようにするために、次のようなスタートアップファイルを作成した。あくまで、対話環境の初期化ファイルなので、ファイルを指定して実行するときは、同じようなインポートをファイルごとに記述する必要がある。

# -*- coding: utf-8 -*-
from __future__ import division, print_function, unicode_literals
from future_builtins import ascii, filter, map, hex, oct, zip

それで、環境変数 PYTHONSTARTUP にそのファイルのパスを登録した。ちなみにエディタは、IDLE を使用している。設定は、フォントを FixedSys の10ptに変更し、Default Source Encoding を UTF-8 に変更した。ただし、IDLE 上のインタプリタでは、スタートアップファイルが反映されなかったので、Python (command line) で起動したインタプリタ上で実行している。

さて、チュートリアルを読み進めていこう。

最初の関門かなと思ったのは、「3.1.1 数値」の割り算の部分。Python 2 と Python 3 で動作が異なる部分だけど、スタートアップファイルの設定で、同じ動作をしてくれた。素晴らしい。

次の問題は、文字コード。日本人プログラマーなら1度は頭を悩ませたことがある問題。「3.1.3 Unicode について」のところも、スタートアップファイルの設定で、ほぼ同じ動作をしてくれた。

ここから先は、当分トラブルはなさそうだなと思っていたら、「4.1 if 文」に伏兵が潜んでいたよ。input 関数の引数にスタートアップファイルで設定したまま非 Ascii 文字を含む文字列を入れるとダメっぽい。input 関数は、テストコードくらいでしか使わないだろうけど、こういうエラーが生じることは覚えとかないとかな。

「4.2 for 文」で、print 文と print 関数の違いを見た。出力が、タプルとして評価された結果になってしまっている。スタートアップファイルの設定があれば問題はない。

「4.3 range() 関数」では、range 関数の戻り値を print 関数の引数としたとき、動作が異なるところが見られる。Python 3 の range 関数は、Python 2 の xrange 関数と同様に反復可能体 (iterable object) を返すが、Python 2 の range 関数はそうではないためだ。とりあえず、range 関数を使ったままのコードで for 文の動作は問題ない。

「4.7.1 引数のデフォルト値」で、Python 2 と Python 3 での input 関数の違いに遭遇。Python 2 の raw_input 関数が Python 3 での input 関数になったそうだ。Python 2 の input 関数は、Python 3 での eval(input()) になるらしい。

4章まで読了。次回は5章から。Pythonista 目指して頑張ろう。

  • Python 2.7.2

    >>> (50-5*6)/4
    5
    >>> 8/5
    1
    >>> 'Hello\u0020World !'
    'Hello\\u0020World !'
    >>> 'あいう'.encode('utf-8')
    
    Traceback (most recent call last):
      File "", line 1, in 
        'あいう'.encode('utf-8')
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 0: ordinal not in range(128)
    >>> x = int(input("整数を入れてください: "))
    整数を入れてください: 42
    >>> a = ['cat', 'window', 'defenestrate']
    >>> for x in a:
    ...     print(x, len(x))
    ...
    ('cat', 3)
    ('window', 6)
    ('defenestrate', 12)
    >>> print(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(range(5))
    [0, 1, 2, 3, 4]
    >>>
  • Python 2.7.2 (Python 3 互換設定済)

    >>> (50-5*6)/4
    5.0
    >>> 8/5
    1.6
    >>> 'Hello\u0020World !'
    u'Hello World !'
    >>> 'あいう'.encode('utf-8')
    b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'
    >>> x = int(input("整数を入れてください: "))
    Traceback (most recent call last):
      File "", line 1, in 
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)
    >>> a = ['cat', 'window', 'defenestrate']
    >>> for x in a:
    ...     print(x, len(x))
    ...
    cat 3
    window 6
    defenestrate 12
    >>> print(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(range(5))
    [0, 1, 2, 3, 4]
    >>>
  • Python 3.2.1

    >>> (50-5*6)/4
    5.0
    >>> 8/5
    1.6
    >>> 'Hello\u0020World !'
    'Hello World !'
    >>> 'あいう'.encode('utf-8')
    b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'
    >>> x = int(input("整数を入れてください: "))
    整数を入れてください: 42
    >>> a = ['cat', 'window', 'defenestrate']
    >>> for x in a:
    ...     print(x, len(x))
    ...
    cat 3
    window 6
    defenestrate 12
    >>> print(range(10))
    range(0, 10)
    >>> list(range(5))
    [0, 1, 2, 3, 4]
    >>>

参考文献

2011年8月15日月曜日

Android の定石 #1 スプラッシュ画面の表示

Android の定石っぽいものをメモとして書いておくことにした.出来る限り,正しいコードを書くように心がけるつもりだけど,Android の開発を始めて1ヶ月も経ってないので,いろいろ間違ってたりするかもしれない.間違っていたら,ぜひ教えてください.

さて今回は,スプラッシュ画面(スプラッシュスクリーン)を Android で実現する方法について.

基本的な流れは,次のとおり.

1. スプラッシュ画面(スプラッシュ画像を表示するアクティビティ)を表示する.



2. N ミリ秒後にスプラッシュ画面から遷移する.



1 は,レイアウト XML ファイルに ImageView を追加し画像を表示するだけなので割愛する.

重要なのは 2.時間を待って画面遷移をさせるために,Handler#postDelayed() を使用する.Handler#postDelayed() は,N ミリ秒後に Runnable オブジェクトの run() を実行するメソッドだ.(Handler クラスを一文で表すとなんだろうなぁ…….)

実際のコードは次のとおり.コードを見た方がわかりやすい.

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// スプラッシュ画面から、1000ミリ秒後に遷移する。
new Handler().postDelayed(new Runnable() {
public void run() {
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent);

// アクティビティを終了させることで、スプラッシュ画面に戻ることを防ぐ。
MainActivity.this.finish();
}
}, 1000);
}
}


スプラッシュ画面表示時間は,values/integers.xml などに入れておくのも良いかと思う.

プロジェクトファイルは下記 URL に置いてあるので,参考にしてほしい.

http://idisk.mac.com/takuya0301/Public/Android/Example001.zip

参考文献:
Android Developers: Handler
素人のアンドロイドアプリ開発日記: splash画面を作成してみる。

2011年5月8日日曜日

HP Compaq nx6320 で Intel Wireless WiFi Link 4965AGN を使う方法

※起動しなくなってもいっさい保証できないので,自己責任で実施してね.

HP Compaq nx6320 が認めているカード以外は,BIOS ではじかれる.BIOS にホワイトリストが含まれているらしい.なので,ホワイトリストを除去した(正確には,ホワイトリストを参照しないなのかな?) BIOS を書き込めば,Intel Wireless WiFi Link 4965AGN などの Wi-Fi カードが動作する.(なお,このカードは,オークションで安く出回っている.)

ということなのだが,自力でやる方法を探す暇がなかった.とりあえず,ダウンロードサイトなどで出回っているツールを使って解決できたので,自己責任で使用してください.

sp38742_SLIC21_SLPon_no_whitelist.zip

なお,ネタ元は,参考文献をどうぞ.

参考文献:
ログ速: 【HP】HPCompaq nx6320/6310買得 No3【ビジネス】 (>>690)
My Digital Life Forums: This is no request thread! HP COMPAQ bioses, how to modify the bios? [Archive] (>>TTAV134 14 Aug 2009, 11:01 PM)

2011年4月10日日曜日

写真を Aperture 3 から flickr に GPS 情報付きでアップロードする方法

写真を Aperture 3 から flickr に GPS 情報付きでアップロードするには,以下のような Aperture と flickr の設定変更が必要なのだ.

1. Aperture 3 の設定
アップロードする写真に位置情報を含めるようにする設定をする.

1.1.「Aperture > 環境設定… > 詳細 > 公開する写真に位置情報を含める」をチェックする.

2. flickr の設定
アップロードされる写真の位置情報を公開するようにする.

2.1. flickr にログインする.
2.2. グローバルメニューの You の横の▼をクリックし,プルダウンメニュー中の Your Account をクリックする.
2.3. Privacy & Permissions タブをクリックする.
2.4. Import EXIF location data の右端にある Edit をクリックする.
2.5. Yes please, that would be lovely. をチェックし,SAVE ボタンをクリックする.

これで自動的に,写真についている GPS 情報が flickr の Your Maps に反映される.

僕の場合はこんなかんじ.(コンタクトの追加もぜひしてねw)
Flickr: Explore TSUCHIDA Takuya's photos on the map

flickr の日本地図は残念な感じなので,改善を期待.(たぶん,アメリカの Yahoo! 地図の問題だろうけど.)

2011年4月6日水曜日

MacPorts から SpiderMonkey をインストール

MacPorts がインストールされている状態であれば,次のコマンド打つだけ.

$ sudo port -c install spidermonkey

次のコマンドでインタプリタを起動できる.

$ js

2011年4月3日日曜日

NetBeans 6.9.1 付属の GlassFish のアップデート方法

Mac OS X 上で NetBeans 6.9.1 をインストールしたら,GlassFish のアップデートが Update Tool からうまく実行できなかったのでメモ.

とりあえず,直接 pkg コマンドで GlassFish のアップデートを実行したらうまくいった.(既存環境でやって,一度失敗してるので,壊したくない人はやめといた方が無難かも.)

$ cd /Applications/NetBeans/glassfish-3.0.1/bin/
$ sudo ./pkg image-update
$ ./asadmin start-domain --upgrade
$ ./asadmin start-domain
$ ./asadmin stop-domain

ここまでやっとくと,とりあえず最新版になって,NetBeans 6.9.1 からも正常に起動できるっぽい.

蛇足だけど,GlassFish の日本語メッセージの文字コードは,Shift JIS みたいだからターミナルの設定変えて実行すると良い.