趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • esp8266用の環境を構築する(続き)

    投稿日 2015年 4月 10日 コメントはありません

    ESP8266用の環境構築の続きです。

    7.MicroPythonをビルドしてみる

    ExampleはMakefileが複雑すぎる、ということでESP8266用のMicroPythonをビルドしてみました。

    1)ソースコードのダウンロード

    gitでダウンロードしてきます。

    ~$ git clone https://github.com/micropython/micropython
    Cloning into 'micropython'...
    remote: Counting objects: 26530, done.
    remote: Compressing objects: 100% (341/341), done.
    remote: Total 26530 (delta 165), reused 0 (delta 0), pack-reused 26185
    Receiving objects: 100% (26530/26530), 17.02 MiB | 1.85 MiB/s, done.
    Resolving deltas: 100% (18858/18858), done.
    Checking connectivity... done.
    ~$

    2)ビルドしてみる

    makeしてみます。

    ~$ cd micropython/
    ~/micropython$ ls
    ACKNOWLEDGEMENTS bare-arm esp8266 logo stmhal unix
    CODECONVENTIONS.md cc3200 examples minimal teensy unix-cpy
    LICENSE docs extmod py tests windows
    README.md drivers lib qemu-arm tools
    ~/micropython$ cd esp8266/
    ~/micropython/esp8266$ make
    Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
    mkdir -p build/genhdr
    CPP ../py/qstrdefs.h
    makeqstrdata ../py/qstrdefs.h qstrdefsport.h 
    Generating build/genhdr/py-version.h
    mkdir -p build/lib/mp-readline
    mkdir -p build/py
    mkdir -p build/py/../extmod
    mkdir -p build/stmhal
    CC ../py/mpstate.c
    CC ../py/nlrx86.S
       :
       :
    CC ../py/../extmod/moduhashlib.c
    CC ../py/../extmod/modubinascii.c
    CC strtoll.c
    CC main.c
    CC esp_mphal.c
    esp_mphal.c:28:21: fatal error: ets_sys.h: No such file or directory
     #include "ets_sys.h"
                         ^
    compilation terminated.
    make: *** [build/esp_mphal.o] エラー 1
    ~/micropython/esp8266$

    ということで、ヘッダファイルが見つからないようで、エラーになってしまいました。

    3)原因調査とMakefileの修正

    このファイルはSDKの中に含まれているようです。

    ~$ find . -name "ets_sys.h" -print
    ./esp-open-sdk/esp_iot_sdk_v0.9.5/include/ets_sys.h

    ~/esp-open-sdk ディレクトリの下では、SDKのインストール時に sdk から esp_iot_sdk_v0.9.5 へのシンボリックリンクが張られているので、Makefileの冒頭にあるESP_SDKの定義を以下のとおり修正します。(コメントアウトしたのが修正前の内容)

    #ESP_SDK = $(shell $(CC) -print-sysroot)/usr
    ESP_SDK = /home/xxx/esp-open-sdk/sdk

    4)ビルドの続き

    ビルドの続きを行います。

    ~/micropython/esp8266$ make
    Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
    Generating build/genhdr/py-version.h
    CC esp_mphal.c
    CC gccollect.c
    CC uart.c
    CC modpyb.c
    CC modpybpin.c
    CC modesp.c
    AS gchelper.s
    CC ../stmhal/printf.c
    CC ../stmhal/string0.c
    CC ../stmhal/pyexec.c
    CC ../stmhal/pybstdio.c
    CC ../lib/mp-readline/readline.c
    LINK build/firmware.elf
     text data bss dec hex filename
     283992 1456 48664 334112 51920 build/firmware.elf
    Create build/firmware-combined.bin
    ('flash ', 48288)
    ('padding ', 17248)
    ('irom0text', 237208)
    ('total ', 302744)
    ~/micropython/esp8266$

    無事にビルドができました。

    8.esptoolの準備

    ESP8266のROM書き換えのためのツールである esptool も ~/esp-open-sdk/esptool の下に準備されます。

    ESP8266との接続の方法はこのディレクトリ内の README.md に記述されています。

    ## Protocol
    If GPIO0 and GPIO15 is pulled down and GPIO2 is pulled high when the module leaves reset, then the bootloader will enter the UART download mode. The ROM auto-bauds, that is, it will automagically detect which baud rate you are using. esptool defaults to 115200.
    esptool uses the RTS and DTR modem status lines to automatically enter the bootloader.
    Connect RTS to CH_PD (which is used as active-low reset) and DTR to GPIO0.
    

    ということで、ESP8266とUSB-UARTモジュールの間を以下の結線をします。

    • CH-PDをRTSに接続
    • GPIO0をDTRに接続
    • GPIO15をGNDへプルダウン
    • GPIO2を3.3Vへプルアップ

    この接続をしておけばesptoolが勝手にESP8266をブートローダモードに移行させてくれるようです。
    <esptoolsの参考情報>
    https://testpypi.python.org/pypi/esptool/0.1.0

     9.Hack a Dayで発見した記事

    Hack a DayでESP8266に書き込む方法が載ってました。

    http://hackaday.com/2015/03/18/how-to-directly-program-an-inexpensive-esp8266-wifi-module/


  • MicroPythonをビルドしてみた

    投稿日 2015年 3月 19日 コメントはありません

    MicroPythonをUbuntu上でビルドしてみました。

    まあ、特に難しいところはなくビルドできちゃいました。

    1.ソースを持ってきます

    なんのことはなく、gitコマンドで持ってきます。

    ~$ mkdir micropython
    ~$ cd micropython/
    ~/micropython$ git clone https://github.com/micropython/micropython
    Cloning into 'micropython'...
    remote: Counting objects: 26526, done.
    remote: Compressing objects: 100% (337/337), done.
    remote: Total 26526 (delta 163), reused 0 (delta 0), pack-reused 26185
    Receiving objects: 100% (26526/26526), 17.01 MiB | 1.30 MiB/s, done.
    Resolving deltas: 100% (18856/18856), done.
    Checking connectivity...

    2.ビルドします

    unixディレクトリに移動して、makeするだけです。

    ~/micropython$ cd micropython/
    ~/micropython/micropython$ cd unix
    ~/micropython/micropython/unix$ make
        :
        :
    modffi.c:32:17: fatal error: ffi.h: そのようなファイルやディレクトリはありません
    #include <ffi.h>
    ^
    compilation terminated.
    make: *** [build/modffi.o] エラー 1
    ~/micropython/micropython/unix$

    一部ヘッダがないと怒られてしまいました。調べてみると、libff-devパッケージに含まれるヘッダファイルのようです。

    パッケージを追加して続けます。

    ~/micropython/micropython/unix$ sudo apt-get install libffi-dev
    パッケージリストを読み込んでいます... 完了
    依存関係ツリーを作成しています 
    状態情報を読み取っています... 完了
    以下のパッケージが新たにインストールされます:
     libffi-dev
    アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 9 個。
    99.8 kB のアーカイブを取得する必要があります。
    この操作後に追加で 323 kB のディスク容量が消費されます。
    取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty/main libffi-dev amd64 3.1~rc1+r3.0.13-12 [99.8 kB]
    99.8 kB を 0秒 で取得しました (199 kB/s)
    以前に未選択のパッケージ libffi-dev:amd64 を選択しています。
    (データベースを読み込んでいます ... 現在 386967 個のファイルとディレクトリがインストールされています。)
    Preparing to unpack .../libffi-dev_3.1~rc1+r3.0.13-12_amd64.deb ...
    Unpacking libffi-dev:amd64 (3.1~rc1+r3.0.13-12) ...
    Processing triggers for man-db (2.6.7.1-1ubuntu1) ...
    Processing triggers for doc-base (0.10.5) ...
    Processing 1 added doc-base file...
    Registering documents with scrollkeeper...
    Processing triggers for install-info (5.2.0.dfsg.1-2) ...
    libffi-dev:amd64 (3.1~rc1+r3.0.13-12) を設定しています ...
    ~/micropython/micropython/unix$

    気を取り直してmakeするとあっさり完了しました。

    3.試しに動かしてみる

    ドキュメント通りに動かしてみます。

    ~/micropython/micropython/unix$ ./micropython
    Micro Python v1.3.10-215-g005a7f4 on 2015-03-17; linux version
    >>> list(5 * x + y for x in range(10) for y in [4, 2, 1])
    [4, 2, 1, 9, 7, 6, 14, 12, 11, 19, 17, 16, 24, 22, 21, 29, 27, 26, 34, 32, 31, 39, 37, 36, 44, 42, 41, 49, 47, 46]
    >>> quit()
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
    NameError: name 'quit' is not defined
    >>>

    quit()では終了できず、Ctrl-Dで終了させます。

    4.テストにかけてみる

    これもドキュメント通りに。

    ~/micropython/micropython/unix$ make test
    Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
    cd ../tests && MICROPY_MICROPYTHON=../unix/micropython ./run-tests
    pass basics/0prelim.py
    pass basics/andor.py
    pass basics/array1.py
      :
    pass unix/ffi_callback.py
    pass unix/ffi_float.py
    395 tests performed (15494 individual testcases)
    395 tests passed
    ~/micropython/micropython/unix$

    あっさり動きました。


  • USB LCDモジュールの製作

    投稿日 2013年 10月 12日 コメントはありません

    PIC18F14K50を使ってUSBで接続・制御するグラフィックLCDモジュールを作ってみました。

    OLYMPUS DIGITAL CAMERA

    LCDモジュールは手持ちの秋月の128×64のグラフィック液晶です。

    OLYMPUS DIGITAL CAMERA

    PIC18F14K50では端子が不足するので、74HC273(Dラッチ)を使って制御信号をラッチしてからLCDモジュールのデータ線に信号を与えています。

    OLYMPUS DIGITAL CAMERA

    この74HC273はパーツ箱に眠っていたもので、デートコードは8820でした。つまり1988年の第20週ですから25年以上前の1988年5月下旬頃に製造されたものということになります。無事に動くか少し不安ではありましたが・・・。

    OLYMPUS DIGITAL CAMERA

    裏側はこんな感じでぐちゃぐちゃになってしまいました。本当はLCDは180度回した形で取り付けたかったのですが、このLCD、図面の右側から端子が振ってあって、思いっきり間違えてしまいました。それで急遽LCDの方を回して、コネクタをもう一つつける形にしてしまいました。

    ファームウェアは例によって /dev/ttyACM0 としてUSBシリアルとして認識されるようになっていて、液晶モジュールへの制御信号とデータの繰り返しで垂れ流すとそのままLCDモジュールをPICが制御するようになっています。PC側はPythonで記述してあって、一旦GDライブラリを使ってビットマップ上にTrueType(のビットマップフォント)を展開した後、LCD用のコマンド列を生成するようになっています。LCDにはnaga10フォントで半角24文字×6行の表示ができるようになっています。


  • TwitterのストリーミングAPIを試してみた

    投稿日 2013年 9月 3日 1つのコメント

    Twitterからリアルタイムに情報を得るStreaming APIを試してみました。

    $ sudo easy_install pip
    $ sudo pip install tweepy --upgrade

    として、パッケージ管理ツール pip をインストールした後、tweepy をアップグレードしました。その後、キーワードを含む tweet を入手するスクリプトをいろんなところを参考にしながらなんとか作りました。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import sys
    import json
    import tweepy  
    import re
    
    # Account 
    consumer_key= '  '
    consumer_secret= ' '
    access_token= ' '
    access_token_secret= ' '
    
    class Listener(tweepy.streaming.StreamListener):
        def on_data(self, data):
            if data.startswith("{"):
                tweet = json.loads(data)
                if 'text' in tweet:
                    user = tweet['user']
                    text = re.sub(r'\n',r' ',tweet['text'].encode('utf-8')) # 改行コード除去
                    print tweet['id'],":",tweet['lang'],":",user['screen_name'].encode('utf-8'),":", \
                                  user['name'].encode('utf-8'),":", text
            return True
    
        def on_error(self, status):
            print status
    
    if __name__ == '__main__':
        l = Listener()
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
    
        stream = tweepy.Stream(auth, l)
    #    filterの宣言部分 @ /usr/local/lib/python2.7/dist-packages/tweepy/streaming.py
    #    def filter(self, follow=None, track=None, async=False, locations=None, 
    #        count = None, stall_warnings=False, languages=None):
    #    パラメータの使い方は https://dev.twitter.com/docs/streaming-apis/parameters
        stream.filter(languages=['ja'],track=['AKB', 'HKT', 'NMB'])

    15~27行目がデータ受信時の処理で、データを分析してユーザー名やscreeen_name、tweetの内容などを表示します。29行目からが認証で、34行目でstreaming apiを呼び出しています。
    39行目でフィルタの内容を設定していて、ここでは日本語のTweetで、「AKB,HKT,NMB」を含むものをキーワードとしています。キーワードは日本語のようなスペース区切りではない言語では正常に動作しないようです。

    同じ処理は、on_data ではなく、 on_statusを使うとJSONの解析もTweepy側でやってくれるようで、on_status版も上げておきます。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import sys
    import json
    import tweepy  
    import re
    
    # Account
    consumer_key= ' '
    consumer_secret= ' '
    access_token= ' '
    access_token_secret= ' '
    
    class Listener(tweepy.streaming.StreamListener):
        def on_status(self, status):
            print status.id,":", \
                   status.lang,":", \
                   status.user.screen_name.encode("utf-8"),":", \
                   status.user.name.encode("utf-8"),":", \
                   re.sub(r'\n',r' ',status.text.encode("utf-8"))
            return True
    
        def on_error(self, status):
            print status
    
    if __name__ == '__main__':
        l = Listener()
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
    
        stream = tweepy.Stream(auth, l)
    #    filterの宣言部分 @ /usr/local/lib/python2.7/dist-packages/tweepy/streaming.py
    #    def filter(self, follow=None, track=None, async=False, locations=None, 
    #        count = None, stall_warnings=False, languages=None):
    #    パラメータの使い方は https://dev.twitter.com/docs/streaming-apis/parameters
        stream.filter(languages=['ja'],track=['AKB', 'HKT', 'NMB'])

    取得できるデータは、あるtweetを参考に分析してみたところ、

    {u'contributors': None,
     u'truncated': False,
     u'text': u'\u301017\u6642....00#NMB #HKT48\u3000#HKT',
     u'in_reply_to_status_id': None,
     u'id': 3744....11520,
     u'favorite_count': 0,
     u'source': u'<a href="http://twittbot.net/" rel="nofollow">twittbot.net</a>',
     u'retweeted': False,
     u'coordinates': None,
     u'entities': {u'symbols': [],
                   u'user_mentions': [],
                   u'hashtags': [{u'indices': [68, 74], u'text': u'AKB48'},
                                 {u'indices': [75, 79], u'text': u'AKB'},
                                 {u'indices': [80, 86], u'text': u'SKE48'},
                                 {u'indices': [87, 91], u'text': u'SKE'},
                                 {u'indices': [92, 98], u'text': u'NMB48'},
                                 {u'indices': [99, 103], u'text': u'NMB'},
                                 {u'indices': [104, 110], u'text': u'HKT48'},
                                 {u'indices': [111, 115], u'text': u'HKT'}],
                   u'urls': [{u'url': u'http://t.co/f4....w6kL', u'indices': [8, 30], u'expanded_url': u'http://com.nicovideo.jp/community/co....411', u'display_url': u'com.nicovideo.jp/community/co....\u2026'}]},
     u'in_reply_to_screen_name': None,
     u'id_str': u'3744....1520',
     u'retweet_count': 0,
     u'in_reply_to_user_id': None,
     u'favorited': False,
     u'user': {u'follow_request_sent': None,
               u'profile_use_background_image': True,
               u'default_profile_image': True,
               u'id': 63.....87,
               u'verified': False,
               u'profile_image_url_https': u'https://.......png',
               u'profile_sidebar_fill_color': u'DDEEF6',
               u'profile_text_color': u'333333',
               u'followers_count': 1,
               u'profile_sidebar_border_color': u'C0DEED',
               u'id_str': u'63.....87',
               u'profile_background_color': u'C0DEED',
               u'listed_count': 0,
               u'profile_background_image_url_https': u'https://......png',
               u'utc_offset': 32400,
               u'statuses_count': 25632,
               u'description': None,
               u'friends_count': 1,
               u'location': u'',
               u'profile_link_color': u'0084B4',
               u'profile_image_url': u'http://......png',
               u'following': None,
               u'geo_enabled': False,
               u'profile_background_image_url': u'http://......png',
               u'name': u'\u308a\u3063..........\uff09',
               u'lang': u'ja',
               u'profile_background_tile': False,
               u'favourites_count': 0,
               u'screen_name': u'KK....ty',
               u'notifications': None,
               u'url': None,
               u'created_at': u'Sun Jul 15 18:..:.. +0000 2012',
               u'contributors_enabled': False,
               u'time_zone': u'Osaka',
               u'protected': False,
               u'default_profile': True,
               u'is_translator': False},
     u'geo': None,
     u'in_reply_to_user_id_str': None,
     u'possibly_sensitive': False,
     u'lang': u'ja',
     u'created_at': u'Mon Sep 02 08:..:.. +0000 2013',
     u'filter_level': u'medium',
     u'in_reply_to_status_id_str': None,
     u'place': None}

    というような感じで、ユーザー名などは入れ子になったデータ構造になっていますので、on_data版ではソースの20行目のように一旦’user’データを取り出しています。

     


  • 環境情報をRaspberry PiでTweetしてみる

    投稿日 2012年 9月 16日 コメントはありません

    いろいろネタが揃ってきたので、 Raspberry Piで環境情報をつぶやかせてみることにしました。

    まず、環境を取得するハードウェアは、以前作った気圧計・温湿度計を使います。LCDの表示がついていますが、とりあえずはそのままにしておきます。Arduinoベースのこの気圧計・温湿度計は、5秒ごとに気圧、温度、湿度を測定し、9600bpsでUSBシリアルに送信してきます。

    続きを読む »


  • Pythonでシリアルポート操作

    投稿日 2012年 9月 15日 コメントはありません

    ArduinoベースのデバイスをUSB経由で操作するにはシリアルポートとして操作するのが一番お手軽です。
    そこで、こんどはシリアルポートの操作をPythonで行う方法を試してみました。

    続きを読む »


  • Twitter用Pythonライブラリのtweepyを試してみました

    投稿日 2012年 9月 14日 コメントはありません

    Raspberry Piからツイートする方法を調べるため、Pythonライブラリのtweepyを試してみます。

    続きを読む »


  • PythonでUSBのパイプを扱う方法

    投稿日 2012年 7月 18日 コメントはありません

    Pinguino(PICマイコンでArduinoのようなことをするもの)について調べていたら、

    http://wiki.pinguino.cc/index.php/Interfacing_with_Python

    にUSBのパイプをPythonで扱う方法が出ていた。

    PinguinoではUSBでホストとのデータ送受信ができるようであり、そのための例として載っている。
    (ちなみにPinguinoは秋月で売っている PIC32MX220F032BのQFP44ピンバージョンであるPIC32MX220F032Dを搭載したバージョンがOLIMEXから販売されている)

    ここによれば、

    On Computer Side

    #!/usr/bin/env python
    #
    import usb
    busses = usb.busses()
    # Search pinguino between all the usb devices
    for bus in busses:
      devices = bus.devices
      for dev in devices:
        if dev.idVendor==0x04d8 and dev.idProduct==0xfeaa:
          pingu = dev
    # Get a device handler for th usb device
    dh = pingu.open()
    # Set configuration 3 an interface 0
    dh.setConfiguration(3)
    dh.claimInterface(0)
    # Read 5 bytes in Bulk mode, convert them to 
    # a string and print it
    while 1 == 1: 
      cadena = ""
      for i in dh.bulkRead(0x82, 5, 10000):
        cadena += chr(i)
      print cadena

    という簡単な記述で扱えるらしい。

     


  • wxPythonをインストールする

    投稿日 2011年 8月 6日 コメントはありません

    PythonでGUIアプリケーションを作るためにwxPythonをインストールします。

    wxPyWikiのページにしたがってインストールしていきます。

    $ sudo apt-get install curl
    パッケージリストを読み込んでいます… 完了
    依存関係ツリーを作成しています
    状態情報を読み取っています… 完了
    以下のパッケージが自動でインストールされましたが、もう必要とされていません:
    linux-headers-2.6.32-21 linux-headers-2.6.32-21-generic
    これらを削除するには ‘apt-get autoremove’ を利用してください。
    以下のパッケージが新たにインストールされます:
    curl
    アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 6 個。
    209kB のアーカイブを取得する必要があります。
    この操作後に追加で 328kB のディスク容量が消費されます。
    取得:1 http://jp.archive.ubuntu.com/ubuntu/ lucid-updates/main curl 7.19.7-1ubuntu1.1 [209kB]
    209kB を 0s で取得しました (347kB/s)
    未選択パッケージ curl を選択しています。
    (データベースを読み込んでいます … 現在 184857 個のファイルとディレクトリがインストールされています。)
    (…/curl_7.19.7-1ubuntu1.1_i386.deb から) curl を展開しています…
    man-db のトリガを処理しています …
    curl (7.19.7-1ubuntu1.1) を設定しています …

    $ curl http://apt.wxwidgets.org/key.asc | sudo apt-key add –
    % Total % Received % Xferd Average Speed Time Time Time Current
    Dload Upload Total Spent Left Speed
    104 1678 104 1678 0 0 937 0 0:00:01 0:00:01 –:–:– 1700
    OK

    として、次に、/etc/apt/sources.listに以下の内容を書き加えます。(10.04LTSの場合)

    # wxWidgets/wxPython repository at apt.wxwidgets.org
    deb http://apt.wxwidgets.org/ lucid-wx main
    deb-src http://apt.wxwidgets.org/ lucid-wx main

    その後、以下のコマンドを実行します。(結果は省略)

    $ sudo apt-get update
    $ sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n
    $ sudo apt-get install python-wxgtk2.8 python-wxtools wx2.8-i18n libwxgtk2.8-dev libgtk2.0-dev

    コマンドラインから「xrced」と入力するとGUIを設計するためのツール XRCed が起動することを確認できました。


  • Python2.5のインストール

    投稿日 2011年 8月 5日 コメントはありません

    Ubuntu10.04LTSに標準でインストールされるPythonは2.6なのですが、Google App Engine で使うPythonは2.5だったりします。なので、2.5をインストールします。

    googleさんで調べてみると、以下の方法が簡単でした。

    $ sudo add-apt-repository ppa:fkrull/deadsnakes
    Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret-keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver keyserver.ubuntu.com –recv FF3997E83CD969B409FB24BC5BB92C09DB82666C
    gpg: 鍵DB82666Cをhkpからサーバーkeyserver.ubuntu.comに要求
    gpg: 鍵DB82666C: 公開鍵“Launchpad Old Python Versions”を読み込みました
    gpg: 処理数の合計: 1
    gpg: 読込み: 1 (RSA: 1)
    $ sudo apt-get update
    ヒット http://archive.ubuntulinux.jp lucid Release.gpg
    無視 http://archive.ubuntulinux.jp/ubuntu/ lucid/main Translation-ja
    (途中省略)
    ヒット http://ppa.launchpad.net lucid/main Sources
    取得:6 http://dl.google.com stable/main Packages [1,183B]
    24.2kB を 5s で取得しました (4,460B/s)
    パッケージリストを読み込んでいます… 完了
    $ sudo apt-get install python2.5
    パッケージリストを読み込んでいます… 完了
    依存関係ツリーを作成しています
    状態情報を読み取っています… 完了
    以下のパッケージが自動でインストールされましたが、もう必要とされていません:
    linux-headers-2.6.32-21 linux-headers-2.6.32-21-generic
    これらを削除するには ‘apt-get autoremove’ を利用してください。
    以下の特別パッケージがインストールされます:
    python2.5-minimal
    提案パッケージ:
    python2.5-doc python2.5-profiler
    以下のパッケージが新たにインストールされます:
    python2.5 python2.5-minimal
    アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 6 個。
    4,114kB のアーカイブを取得する必要があります。
    この操作後に追加で 14.9MB のディスク容量が消費されます。
    続行しますか [Y/n]?
    取得:1 http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu/ lucid/main python2.5-minimal 2.5.5-8~ppa2~lucid1 [1,220kB]
    取得:2 http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu/ lucid/main python2.5 2.5.5-8~ppa2~lucid1 [2,893kB]
    4,114kB を 15s で取得しました (264kB/s)
    未選択パッケージ python2.5-minimal を選択しています。
    (データベースを読み込んでいます … 現在 184153 個のファイルとディレクトリがインストールされています。)
    (…/python2.5-minimal_2.5.5-8~ppa2~lucid1_i386.deb から) python2.5-minimal を展開しています…
    未選択パッケージ python2.5 を選択しています。
    (…/python2.5_2.5.5-8~ppa2~lucid1_i386.deb から) python2.5 を展開しています…
    man-db のトリガを処理しています …
    desktop-file-utils のトリガを処理しています …
    python-gmenu のトリガを処理しています …
    Rebuilding /usr/share/applications/desktop.ja_JP.utf8.cache…
    menu のトリガを処理しています …
    python-support のトリガを処理しています …
    python2.5-minimal (2.5.5-8~ppa2~lucid1) を設定しています …

    python2.5 (2.5.5-8~ppa2~lucid1) を設定しています …

    libc-bin のトリガを処理しています …
    ldconfig deferred processing now taking place
    menu のトリガを処理しています …

    これで以下のように2つのpythonが使えます。

    $ python2.5 -V
    Python 2.5.5
    $ python2.6 -V
    Python 2.6.5
    $ python -V
    Python 2.6.5