Raspberry Pi 2 Model BにRaspbianをインストールして初期設定する方法
Raspberry Pi 2 Model Bを買って色々と遊んでいます。OSを入れなおしたりする際に再度悩まないよう、Raspbianのインストールと初期設定を実施した際のメモを残しておこうと思います。
- 出版社/メーカー: Raspberry Pi
- メディア: エレクトロニクス
- この商品を含むブログ (9件) を見る
Eleduino Raspberry Pi 2 Model B アクリル ケース ブラック White+Black
- 出版社/メーカー: Eleduino
- メディア: エレクトロニクス
- この商品を含むブログを見る
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項目。
- Expand Filesystem
- Change User Password
- Boot Options
- Wait for Network at Boot
- Internationalisation Options
- Enable Camera
- Add to Rastrack
- Overclock
- 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
以下を参考に、Locale, Timezone, Keyboardの設定変更。
-http://www.asahi-net.or.jp/~qb3k-kwsk/raspberry/setup/setup01.html
Enable Camera
- とりあえず使わないのでDisable。
Add to Rastrack
- デフォルトのままで変更する必要なし。
Overclock
- オーバークロックの設定。必要な時に変更することにして一旦デフォルトのまま。
Advanced options
あとは入れたいものを適当に
日本語フォント、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の使う方法
概要
virtualenv
はPythonの仮想環境を作るためのライブラリです。
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。と記載したので、今回の記事ではその具体的な導入方法、利用方法について記載します。
環境構築の流れは以下の通りです。
- setuptoolsのインストール
- pipのインストール
- 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
- Differences between distribute, distutils, setuptools and distutils2?(stackoverflowでのやりとり)
- Flimm氏の回答[answered Feb 7 '13 at 14:37]が非常に参考になる
- 元の質問は2011年に投稿されており色々と議論があるが、古い情報を鵜呑みにするのはヤメてね、との記載があり2013年時点での最新情報をまとめてくれている(2014年7月時点でもこの状況は同じ)。
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.
- setuptoolsを使うときはsetuptoolsではなくてdistributeを使え!
- 2011年の記事ですが、2013.11.11時点で下記内容を追記してくれている
この記事はもう古いので、いまはdistributeではなくてsetuptoolsをインストールしてください。setuptoolsはプロジェクトが再始動してdistributeよりも新しい実装になっています。
Python パッケージ管理技術まとめ (pip, setuptools, easy_install, etc)
- pythonのパッケージ管理全般についてまとまっていて分かり易い。
-
- pipの導入方法、使い方に関する分かり易い記事。
-
- distributeはsetuptoolsにマージされたから、そっち使ってねという記載あり。
-
- distributeからsetuptoolsへの移行方法など
PythonのUnicodeDecodeError、UnicodeEncodeErrorを正しく理解する
はじめに
Pythonで日本語を扱おうとすると「UnicodeDecodeError」、「UnicodeEncodeError」に悩まされるというのをよく聞きます。
私自身もこれまではエラーが発生してもなんとなく曖昧な理解で乗り切ってきましたが、以下の記事を読んで色々と調べたら自分なりにスッキリしたので、整理した内容についてサンプルコードを交えながらまとめたいと思います。
なお、以下の説明はPython2.xを対象とした内容になっています(基本的な考え方はPython3でも同じです)
ポイント
上にも書いたように、「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-8、euc-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での日本語の扱いは一見ややこしいですが、理解してしまえばそこまで複雑な話ではないと思います。より詳しい内容については以下のページなどが参考になると思います。
PythonからYahooキーフレーズ抽出WebAPIを使う
概要
Yahooから提供されているテキスト解析WebAPIの中のキーフレーズ抽出APIを使って、入力された任意の文からキーフレーズ(重要語句)を抽出してみました。
テキスト解析WebAPIの中には「日本語形態素解析API」などがありますが、単に入力文から特徴的な単語を抜き出したいだけであれば、「キーフレーズ抽出API」の方がシンプルで簡単だと思います。
結果の形式はXML、JSON、PHP 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以下の値が割り当てられます。
参考
- Yahoo WebAPIの使い方について
- dictをvalでソートする方法について