読者です 読者をやめる 読者になる 読者になる

Raspberry Pi 2 Model BにRaspbianをインストールして初期設定する方法

Raspberry Pi 2 Model Bを買って色々と遊んでいます。OSを入れなおしたりする際に再度悩まないよう、Raspbianのインストールと初期設定を実施した際のメモを残しておこうと思います。

Raspberry Pi 2 Model B (1)

Raspberry Pi 2 Model B (1)

NOOBS経由でRaspbianをインストール

以下を参考にインストール。

インストールしたRaspbianのVerは以下の通り。

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.1.17-v7+ #838 SMP Tue Feb 9 13:15:09 GMT 2016 armv7l GNU/Linux
pi@raspberrypi:~ $ cat /proc/version
Linux version 4.1.17-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) ) #838 SMP Tue Feb 9 13:15:09 GMT 2016

Raspbianの初期設定

ネットワークはUSB無線LANアダプタを接続したら、特に設定等実施しなくても普通に繋がった。

Raspbianではraspi-configというツールが用意されており、これ経由で基本的な初期設定を実施出来る。 デフォルトのターミナル(LXTerminal)でraspi-configを実行すると設定画面で文字化けが発生していたので、jfbtermを入れた後にraspi-configを実行。

sudo apt-get update
sudo apt-get install jfbterm
sudo raspi-config

raspi-configで設定出来るのは下記9項目。

  1. Expand Filesystem
  2. Change User Password
  3. Boot Options
  4. Wait for Network at Boot
  5. Internationalisation Options
  6. Enable Camera
  7. Add to Rastrack
  8. Overclock
  9. Advanced options

それぞれの項目を以下の通り設定。

  • Expand Filesystem

    • NOOBS経由でインストールすると最初からsdカードサイズに応じたパーティション構成になっているようなので、何もする必要なし。
  • Change User Password

    • ユーザ名=piのパスワードを変更しておく。
  • Boot Options

    • 基本的にssh接続で利用するのでDesktopGUIは不要。「B2 Console Autologin」を選択。
  • Wait for Network at Boot

    • どちらでも良いが「Fast Boot without waiting for network connection」を選択しておく。
  • Internationalisation Options

  • Enable Camera

    • とりあえず使わないのでDisable。
  • Add to Rastrack

    • デフォルトのままで変更する必要なし。
  • Overclock

  • Advanced options

    • 「A4 SSH」をEnableにしてssh接続出来るようにしておく。
    • 「A3 Memory Split」からgpuに割り当てるメモリ量を変更出来る模様。今は一旦デフォルトのままにしておく。
    • その他、SPI、I2C、Serialなど使いたいものがあれば有効化しておく。
    • 最後に「A0 Update」で raspi-config自体をアップデートしておく(本当は最初にアップデートしておいた方が良いかも)。

あとは入れたいものを適当に

日本語フォント、ibusのインストール。 以下を参考に。

sudo apt-get install fonts-vlgothic
sudo apt-get install ibus-anthy

色々と設定ファイルを編集するのに必要なのでvimもインストールしておく。

sudo apt-get install vim
mkdir -p ~/.vim/bundle
git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

大体これぐらいまで設定すればssh経由でログインして普通に使えるようになりました。

Pythonでvirtualenvの使う方法

概要

virtualenvPythonの仮想環境を作るためのライブラリです。 virtualenvを使えば、プロジェクト毎に仮想環境を作成し各環境にライブラリをインストールすることが出来るので、ライブラリの依存関係がごちゃごちゃになるのを回避出来ます。

virtualenvをより便利に使うためのライブラリとして、virtualenvwrapperが有名ですが、この記事ではvirtualenvwrapperについては触れずに、virtualenvの使い方について記載します。

インストール方法

pip経由でインストール出来ます。

$ pip install virtualenv

virtualenvで仮想環境構築

クリーンな仮想環境を作る場合。

$ virtualenv [env_name]

グローバルのsite-packagesにインストール済みのモジュールを引き継いで仮想環境を作る場合。

$ virtualenv [env_name] --system-site-packages

補足

--system-site-packagesオプションをつけるとグローバルのsite-packagesにインストール済のモジュールを引き継ぎます。 ちなみに、昔のvirtualenvでは、この動作がデフォルトだったので、グローバルのsite-packagesを引き継ぎたくない場合は—no-site-packagesというオプションを付けていたようです。 最近のvirtualenvではデフォルトが--no-site-packages相当の動作になっているので--no-site-packagesは非推奨(というか不要)です。

virtualenvで仮想環境切り替え

仮想環境を有効化する。

$ source [env_name]/bin/activate

仮想環境の切り替えが正常に動作しているか確認する。

$ which python
/Users/***/[evn_name]/bin/python

みたいな感じで、virtualenvで作成した仮想環境内のpythonを参照していればok.

仮想環境を無効化するには以下のコマンドを入力する。

$ deactivate

virtualenvの仮想環境内にpip経由でライブラリをインストール

仮想環境を有効化した状態で、pip経由でインストールすれば、仮想環境内にのみライブラリがインストールされます。

$ source [env_name]/bin/activate
$ pip install [lib_name]

次に、仮想環境内にインストールされていることの確認してみる。

$ pip list
・・・(インストールしたモジュールが表示される)

ここで一旦、仮想環境を無効化して・・・

$ deactivate

再度、インストール済みモジュールを確認

$ pip list
・・・(仮想環境上に導入したモジュールは表示されないはず)

以上です。

Pythonでsetuptools, pipを使ってパッケージ管理する方法

概要

pythonのパッケージ管理に関する前回の記事で、2014年現在におけるpythonのパッケージ管理としては、とりあえずsetuptoolsとpipを導入すればOK。と記載したので、今回の記事ではその具体的な導入方法、利用方法について記載します。

環境構築の流れは以下の通りです。

  1. setuptoolsのインストール
  2. pipのインストール
  3. pipを使って任意のパッケージをインストール

pipは、setuptoolsを便利に使うためのスクリプトなので、まずはベースとなるsetuptoolsをインストールし、その後pipという順にインストールします。

setuptoolsのインストール

手順

以下に記載されている各々の環境のインストール方法に従います。

結局は、ez_setup.pyをダウンロードしてきて実行すればOKです。 私の環境[Mac OS X Mavericks(10.9.1)]では、以下のコマンドでインストールしました。

sudo curl https://bootstrap.pypa.io/ez_setup.py -O - | python

Mac OS X Mavericksでは以下のディレクトリにインストールされます。

/Library/Python/2.7/site-packages/setuptools-2.1-py2.7.egg

pipのインストール

手順

次にpipをインストールします。以下に記載されている方法でインストールします。

こちらも、get-pip.pyをダウンロードしてきて実行すればOKです。 私の環境では以下のコマンドでインストールしました。

sudo curl https://bootstrap.pypa.io/get-pip.py -O | python

Mac OS X Mavericksでは以下のディレクトリにインストールされます。

/Library/Python/2.7/site-packages/pip

pipインストールに関する補足1

pipは、OSのパッケージマネージャを使って以下のようにインストールしても問題ありません。

#Debian, Ubuntu
sudo apt-get install python-pip
#Fedora
sudo yum install python-pip

ただし、pip公式サイトによると、

On Linux, pip will generally be available for the system install of python using the system package manager, although often the latest version will be unavailable.

ということで、OSのパッケージマネージャ経由でインストール出来るのは、最新版ではなく少し古いVerになるようなので、最新版を使いたい方は上述のget-pip.pyを使った方法でインストールして下さい。

pipインストールに関する補足2

setuptoolsをインストールすると「easy_installコマンド」が利用出来るようなるので、これを使ってpipをインストールしても問題ありません。

sudo easy_install pip

ただし、前回の記事にも記載したように、pipはeasy_installを置き換えるために開発されたものであり、今後はpipを使っていく方針なので、pip自身をインストールする時にだけわざわざeasy_installを使う理由も無いと思います(今後はeasy_installは使わないので忘れてしまって問題ナシ)。

pipインストールに関する補足3

実はsetuptoolsがインストールされていない環境で、get-pip.pyを実行すると、自動的にsetuptoolsがインストールされます。このため、手っ取り早く環境構築したい場合は、get-pip.pyをダウンロードしてきて実行すれば、setuptools,pipの両方がインストールされて簡単です。

とは言え、この記事に記載しているように、順を追ってインストールしてみるとsetuptools,easy_install,pipの関係性を理解しやすくなると思うので、一度は愚直にインストールしてみるのも悪く無いと思います。

pipを使って任意のパッケージをインストール

手順

ここまでの対応でpipが使えるようになっているはずなので、あとはpipを使ってパッケージをインストールしていけば良いです。

pip install matplotlib
pip install virtualenv
pip install wxPython
pip install bottle
・・・

まとめ

setuptools,pipの導入方法について記載しました。 これら2つを導入しておけば、pythonのパッケージを普通にインストールしたり、アンインストールしたりする分には事足りるはずです。

pipは、virtualenvと組み合わせて使うと更に便利ですが、本記事としては一旦ここまでとしてvirtualenvの導入方法、利用方法については、別途まとめたいと思います。

pythonパッケージ管理についてのまとめ(distutils,setuptools,distribute,pip,easy_install)[2014年版]

前提

pythonのパッケージ管理は、進化の歴史がとてもややこしいので混乱を招きがちです。 Web上の情報には古いものも多いです。このため、pythonのパッケージ管理に関するブログ記事等を参考にする場合は、記事の記載日時を確認して、なるべく新しい情報を参考にした方が良いです。古い情報と新しい情報で逆の事が書いてあったりするので、気をつけないと混乱します(例えば、distributeを使え!という情報、distributeを使うな!という情報の両方があったりします)。

先に結論

結局pythonのパッケージ管理には何を使えば良いの?という疑問に対して、手っ取り早く結論を書いてしまうと、

  • setuptools
  • pip

を導入すれば問題ないと思います(2014年7月時点)。

pythonのパッケージ管理について

はじめに

pythonのパッケージ管理では、setup.py, distutil, distutil2, setuptools, distribute, pip, easy_installなど色々なキーワードが出てきて、それぞれが何を意味しているのかが分かりにくいと思うので、それぞれについての説明を以下に記載します。

setup.py

  • setup.pyはpyhonモジュールを配布する際に必ず必要なスクリプトファイル
  • ファイル内部ではsetup関数を使ってモジュールをビルドしている
  • setup関数はPython標準モジュールのdistutilsで定義されている

distutils、setuptools、distribute、distutils2

  • distutilsを拡張するために開発されたのがsetuptools
  • setuptoolsの開発が滞ったため、setuptoolsをforkして登場したのがdistribute
  • distributeの機能をpython標準のdistutilsにバックポートしようとしたものがdistutils2
    • distutils2はpython3.3ではpackagingと呼ばれている
    • しかしながら、distutils2(packaging)の開発は停止してしまっている(latest-releaseが2012年3月)
  • setuptoolsが開発再開し、distributeの内容がバックポートされたのが最新のsetuptools(Ver0.7以降)

歴史としては以下の通り。

distutils -> setuptools -> distribute -> distutils2 -> setuptools(Ver0.7以降)

easy_install、pip

  • easy_installはsetuptoolsを便利に使うためのスクリプト
  • pip は easy_installを置き換えて更に便利にしようとして開発されたもの
    • すなわち、pipはeasy_install と同様の機能を提供する(easy_installには無いアンインストールの機能なども提供する)
  • easy_installとの互換性がないので、使うのであればどちらか一方にした方が良い

まとめ

上に記載したような状況なので、まずsetuptoolsを使うというのは、特に悩む余地もないと思います。 easy_installを使うか、pipを使うかは自由に選べば良いと思いますが、virturalenvと一緒に使うことなどを考えると個人的にはpipが便利だと思いpipを使ってます。

参考URL

As of July 2013, all of the other answers to this question are two years out-of-date. When you come across advice on Python packaging issues, remember to look at the date of publication, and don't trust out-of-date information.

この記事はもう古いので、いまはdistributeではなくてsetuptoolsをインストールしてください。setuptoolsはプロジェクトが再始動してdistributeよりも新しい実装になっています。

PythonのUnicodeDecodeError、UnicodeEncodeErrorを正しく理解する

はじめに

Pythonで日本語を扱おうとすると「UnicodeDecodeError」、「UnicodeEncodeError」に悩まされるというのをよく聞きます。
私自身もこれまではエラーが発生してもなんとなく曖昧な理解で乗り切ってきましたが、以下の記事を読んで色々と調べたら自分なりにスッキリしたので、整理した内容についてサンプルコードを交えながらまとめたいと思います。

なお、以下の説明はPython2.xを対象とした内容になっています(基本的な考え方はPython3でも同じです)

ポイント

  • Pythonの文字列型について
    • 文字列(str型)とユニコード文字列(unicode型)は別物
    • 「str型」
    • unicode型」
      • Unicodeを表現可能な型(純粋なバイト列よりも多くの情報をもった文字列形式、と考えると分かりやすい?)
  • Encode、Decodeという言葉について
    • Encode/Decodeが何から何への変換を指しているか?
      • Encode・・・「unicode型」→「str型(utf8, euc-jp, shift-jisなどなど)」に変換すること
      • Decode・・・「str型(utf8, euc-jp, shift-jisなどなど)」→「unicode型」に変換すること
  • 自分自身が利用している環境について知っておくべきこと
  • Pythonの暗黙的な文字列型変換について
    • pythonが「unicode型」と「str型」を自動的に変換する場合がある
      • エラーの大半はこれが原因
    • 自動的にDecodeされるケース
      • unicode型」と「str型」を連結、比較など(str→unicodeへの自動変換)
    • 自動的にEncodeされるケース
      • print文で標準出力・標準エラーに出力する場合など(unicode→strへの自動変換)

上にも書いたように、「UnicodeDecodeError」、「UnicodeEncodeError」の大半はPythonの暗黙的な型変換によって発生しています。Pythonが内部的に「unicode型」<->「str型」の変換を試みるものの、正しく変換出来ない場合にこれらのエラーは発生します。と、言葉で書いてもなかなか分かりづらいので、どういう場合にエラーが発生するのかについて実際のソースコード例を記載します。

なお、以下の例ではデフォルトエンコーディングが「ascii」、ロケール設定は「utf-8」、ソースコードは「utf-8」で記述しているものとします。

まずは「UnicodeDecodeError」を理解するための例を以下に記載します。

[UnicodeDecodeError編 例1] str型とstr型の連結

ソースコード
str_string1 = "日本語" #これはutf-8のstr型
str_string2 = "English" #これはutf-8のstr型

print type(str_string1)
print type(str_string2)

#str型とstr型を演算しているので、特に変換は発生せずにstr型同士が連結される
# →結果の型はstr
joined_string = str_string1 + str_string2
print type(joined_string)
print joined_string
実行結果
<type 'str'>
<type 'str'>
<type 'str'>
日本語English

[UnicodeDecodeError編 例2] unicode型とunicode型の連結

ソースコード
unicode_string1 = u"日本語" #これはunicode型
unicode_string2 = u"English" #これはunicode型
print type(unicode_string1)
print type(unicode_string2)

#unicode型とunicode型を演算しているので、特に変換は発生せずunicode型が連結される
# →結果の型はunicode型
joined_string = unicode_string1 + str_string2
print type(joined_string)
print joined_string
実行結果
<type 'unicode'>
<type 'unicode'>
<type 'unicode'>
日本語English

[UnicodeDecodeError編 例3] unicode型とstr型(デフォルトエンコーディングで扱える文字)の連結

ソースコード
unicode_string = u"日本語" #これはunicode型
str_string = "English" #これはutf-8のstr型(asciiで扱える文字)

print type(unicode_string)
print type(str_string)

#unicode型とstr型を演算しようとしているので
#暗黙の型変換によってstr型がデフォルトのエンコーディング(ascii)でデコードされる
# →utf-8の文字列「English」はasciiでデコード可能なので、問題なく文字列が結合される
joined_string = unicode_string + str_string
print type(joined_string)
print joined_string
実行結果
<type 'unicode'>
<type 'str'>
<type 'unicode'>
日本語English

[UnicodeDecodeError編 例4] unicode型とstr型(デフォルトエンコーディングで扱えない文字)の連結

ソースコード
unicode_string = u"日本語" #これはunicode型
str_string = "日本語" #これはutf-8のstr型(★asciiで扱えない)

print type(unicode_string)
print type(str_string)

#unicode型とstr型を演算しようとしているので
#暗黙の型変換によってstr型がデフォルトのエンコーディング(ascii)でデコードされる
# →utf-8の文字列「日本語」はasciiでデコード出来ないので例外発生
joined_string = str_string + unicode_string
print type(joined_string)
print joined_string
実行結果
<type 'unicode'>
<type 'str'>
Traceback (most recent call last):
File "multi_byte_string.py", line 80, in <module>
joined_string = byte_string + unicode_string
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

UnicodeDecodeErrorにどう対処すれば良いか?

上述の問題は、プログラムの内部でunicode型とstr型が混在し、pythonが内部で暗黙的に変換を行うことによって発生しています。したがって、pythonの暗黙的な変換に頼らずにプログラマが明示的に文字列の型を意識して、変換を実施すれば問題は発生しません。
ちなみに今回の例では、ソースコード上でstr型として定義された文字列の扱いについて記載していますが、utf-8euc-jpなどのエンコーディングで作成されたファイルを扱う場合もこの方針は同様です。ファイルからデータを読み込んだ時点で、まずunicode型に変換し、プログラムの内部では基本的unicode型で処理すれば問題は発生しません。

ソースコード

問題回避するための例を以下に示します。utf-8のstr型を明示的にunicode型に変換した上で連結しています。

unicode_string = u"English" #これはunicode型
str_string = "日本語" #これはutf-8のstr型

decoded_string = unicode(str_string,"utf-8") #utf-8のstr型をunicodeにデコードする
decoded_string = str_string.decode("utf-8") #←この書き方でも同じ

joined_string = decoded_string + unicode_string
print type(joined_string)
print joined_string
実行結果
<type 'unicode'>
<type 'str'>
<type 'unicode'>
日本語English

問題なく文字列が連結されました。


次に「UnicodeEncodeError」を理解するためにprint文の振る舞いの例について以下に記載します。
print文にunicode型の文字列を渡すと、暗黙的なEncodeによって型変換が実施されます。この変換処理は出力先が端末であるか、ファイルであるかによって振る舞いが異なります。

[UnicodeEncodeError編 例1] print文による出力(端末に出力)

ソースコード
unicode_string = u"日本語" #これはunicode型
print unicode_string #unicode型をprint文に渡すとロケール設定(utf-8)でエンコードされる

# 「日本語」はutf-8でエンコード出来るので問題なし
$python multi_byte_string.py
実行結果
日本語

[UnicodeEncodeError編 例2] print文による出力(ファイルへのリダイレクト)

ソースコード
unicode_string = u"日本語" #これはunicode型
print unicode_string #unicode型をprint文に渡すとデフォルトエンコーディング(ascii)でエンコードされる

# 「日本語」はasciiでエンコード出来ないので例外発生
$python multi_byte_string.py > result.txt
実行結果
Traceback (most recent call last):
  File "multi_byte_string.py", line 101, in <module>
    print unicode_string
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

UnicodeEncodeErrorにどう対処すれば良いか?

  • printなどの暗黙的なEncode処理を伴う処理にはunicode型を渡さない(str型に変換してから渡す)
    • 暗黙的なEncodeが実施されないようにすればUnicodeEncodeErrorは発生しません
  • 標準出力をラップする
    import sys, codecs
    sys.stdout = codecs.getwriter("utf-8")(sys.stdout)


以上、UnicodeDecodeErrorとUnicodeEncodeErrorについて簡単な例を交えつつまとめました。pythonでの日本語の扱いは一見ややこしいですが、理解してしまえばそこまで複雑な話ではないと思います。より詳しい内容については以下のページなどが参考になると思います。

gitのコミットログ編集用エディタをvimにする

今更な感がありますが最近gitを使い始めました。githubのアカウントも取得したので活用していきたいと思います。
で、コミット時のエディタをvimにする方法を忘れないようにメモ

git config --global core.editor 'vim -c "set fenc=utf-8"'

githubのwebページはutf-8のようなので、日本語ログが文字化けせずに読めるようエンコードutf-8指定しておきます。

PythonからYahooキーフレーズ抽出WebAPIを使う

概要

Yahooから提供されているテキスト解析WebAPIの中のキーフレーズ抽出APIを使って、入力された任意の文からキーフレーズ(重要語句)を抽出してみました。

テキスト解析WebAPIの中には「日本語形態素解析API」などがありますが、単に入力文から特徴的な単語を抜き出したいだけであれば、「キーフレーズ抽出API」の方がシンプルで簡単だと思います。
結果の形式はXMLJSONPHP Serializeから選択することが出来ます。今回はJSONで受け取ることにしました。

ソースコード

#coding:utf-8

import json
import urllib
import urllib2

#取得したアプリケーションIDを指定
appid = "***"

#キーフレーズ抽出APIのURL
pageurl = "http://jlp.yahooapis.jp/KeyphraseService/V1/extract"

#入力文
sentence = u"東日本大震災の影響で2度登板が流れ、実戦は6日の巨人戦以来、約2週間ぶり。それでも「試合で投げることに関して不安はない。調整が遅れているのは自分だけじゃない」と話していた斎藤だったが、プロの洗礼を浴びてしまった。斎藤は降板後「コントロールも良くなかったし、変化球の切れも良くなかった。"

def extract_keyphrase(sentence, id):
    sentence = urllib.quote_plus(sentence.encode("utf-8"))
    query = "%s?appid=%s&output=%s&sentence=%s" % (pageurl, id, "json", sentence)

    c = urllib2.urlopen(query)
    json_str = c.read()
    result = json.loads(json_str)

    return result

result = extract_keyphrase(sentence, id=appid)

#scoreの大きい順に表示
for k,v in sorted(result.items(), key=lambda x:x[1], reverse=True):
    print "keyphrase:%s, score:%d" % (k.encode("utf-8"), v)

実行結果

keyphrase:斎藤, score:100
keyphrase:東日本大震災, score:94
keyphrase:変化球, score:80
keyphrase:コントロール, score:76
keyphrase:洗礼, score:67
keyphrase:実戦, score:61
keyphrase:降板後, score:53
keyphrase:巨人戦, score:53
...(省略)

公式のドキュメントによると、キーワードと共に取得出来るスコアは以下のような値との事です。

Scoreは、重要度を示す目安の数値です。先頭のKeyphraseのScoreは100となり、以下相対的な重要度に応じて 100以下の値が割り当てられます。