さくらのレンタルサーバにPython3.6.1をインストールした

Python3.4をインストールしたのが昨年6月だから、ほぼ1年経っている。

手元のPCのPythonは、Anacondaという超便利な仕組みでインストールして、Python 3.6.0になっている。このPCで作ったプログラムをさくらのレンタルサーバに転送して実行したらエラーがでてしまった。

dateteimモジュールで、W3C Datetime 形式のタイムスタンプ、つまり 2004-09-22T14:12:14+00:00 という形式のやつを作りたいので下記のように書いて

dt.isoformat(timespec=’seconds’)

Python3.4.3で実行したら、

‘timespec’ is an invalid keyword

と怒られた、というわけだ。Python 3.6で動いてるんだから、プログラムの回避策を考えるよりもPythonをバージョンアップしたほうが早い。

前置きはそこそこに、Python 3.6.1のインストールはあっけなく終わった。

前回記事のさくらのレンタルサーバにPython3.4をインストールするのとおりに、「3.4.3」 を 「3.6.1」 に変更してやったらうまくいった。やっぱり作業を記録しておくのは大事ですね。ということで、再び記録しておく。

取得したソースのURL
https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

% python3
Python 3.6.1 (default, May  6 2017, 18:08:26)
[GCC 4.2.1 20070831 patched [FreeBSD]] on freebsd9
Type "help", "copyright", "credits" or "license" for more information.
% pip3 -V
pip 9.0.1 from /home/bty/local/python/lib/python3.6/site-packages (python 3.6)
%

Windows10にPython3.5をインストール

ひさしく、ブログを更新していなかったが、Python3 をインストールしたのでメモしておく。
僕のPC環境は以下のとおり。

Thinkpad T410
Windows 10 (64bit)

ダウンロード

まずは、Python3 をダウンロードする。
https://www.python.org/downloads/windows/

Windows10(64bit) に適合するPython を選択した。
Python 3.5.1 Windows x86-64 executable installer

インストール

ダウンロードしたインストーラプログラムを実する。
僕は、Python3.5 を C:Python35のディレクトリにインストールしたかったので、Customize installration を選択した。

Add Python 3.5 to PATH をチェックして、Customize installation をクリック。
Optional Features の各項目にチェックがはいっているがそのまま Next をクリック。
Customize install location を C:\Python35 にして Install をクリック。

インストーラプログラムが終了したら、エクスプローラで c:\Python35のフォルダが作られ、フォルダの中にPythonのプログラムファイルができているのを確認した。

環境変数の設定

さて次に、僕は Python2.7をインストールしていたので、Windowsのシステム環境変数 path から Python2.7を削除しなければならない。

Windows10のコントロールパネルは、windowsキーと x を同時に押すと画面が表示される。システムとセキュリティを選択して、「システム」をクリック。「設定の変更」をクリックすると、システムのプロパティ画面が表示される。詳細設定タブを選択し、環境変数をクリックすると、やっと目的の[環境変数]を変更する画面が表示される。ここで、Path から C:\Python27\ と c:\Pyton27\Scripts\ を削除する。先ほどPython3.5をインストールするときに、 Add python 3.5 to PATH をチェックしていたしたので、C:\Python35\ と C:\Python35\Scripts は環境変数 Path にちゃんと書かれていた。

起動確認

これで環境変数も書き直したので、Dos窓を開いて、Python が立ち上がるか確認する。

Python 3.5.1 のインストールが完了した。

さくらのレンタルサーバにPython3.4をインストールする

前回の記事で Python 3.3をインストールして、精神的に消耗してしまったが、気を取り直して、Python 3.4をインストールする。

まずは前回インストールしたPython 3.3 と インストールに使ったファイルたちをばっさり削除した。

% rm -rf ~/local/python/*
% rm -rf ~/work/py3/*

ここからがPython 3.4のインストールの始まり。

■Python3.4をインストール

% mkdir -p ~/work/py3
% cd ~/work/py3
% wget --no-check-certificate https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
% tar zxvf ./Python-3.4.3.tgz
$ cd ./Python-3.4.3
$ ./configure --prefix=$HOME/local/python
$ make
$ make install

インストール先は $HOME/local/python ディレクトリになる。

■.cshrcを修正する

% emacs ~/.cshrc
-----
set path = ($path $HOME/local/python/bin)
setenv PYTHON $HOME/local/python/lib
-----
% source ~/.cshrc
% rehash

前回のPython 3.3インストールで設定したものと同じ。

■とりあえず、実行してみる

% python3
Python 3.4.3 (default, Jun 14 2015, 18:41:52)
[GCC 4.2.1 20070831 patched [FreeBSD]] on freebsd9
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/home/bty/local/python/lib/python34.zip', '/home/bty/local/python/lib/python3.4', '/home/bty/local/python/lib/python3.4/plat-freebsd9', '/home/bty/local/python/lib/python3.4/lib-dynload', '/home/bty/local/python/lib/python3.4/site-packages']
>>>

実行できるようになった。sys.pathを表示して、どこにパスが通っているか確認した。

% pip3 -V
pip 6.0.8 from /home/bty/local/python/lib/python3.4/site-packages (python 3.4)

pipもちゃんと動く。Python3.3とはえらい違い、Python 3.4のインストールは超簡単。

さくらのレンタルサーバでPython3.3をインストールした記録

普段使っているPCにPython3をインストールしたので、さくらのレンタルサーバでもPython3を使えるようにした。Pelicanを動かしてみたいので、Quickstart — Pelican 3.5.0 documentationを読んだら、Python3.3と書いてあったので、Python3.4をあきらめ、Python3.3をインストールすることにした。

Pelicanのドキュメントをよく読んだら、Python2.7.xで動かすのがベストで、Python3については、Python3.3+でおおむね動く(意訳)と書いてあるではないか。「+」とは、「以上」という意味になると思われるので、Python3.4でもOKということか。苦労してインストールしたわりには報われない結果となった。

でも、せっかくインストールしたのでPython3.3が使えるようになった記録を残しておくことにした。

■Python3.3をインストール

% mkdir -p ~/work/py3
% cd ~/work/py3
% wget --no-check-certificate https://www.python.org/ftp/python/3.3.6/Python-3.3.6.tgz
% tar zxvf ./Python-3.3.6.tgz
$ cd ./Python-3.3.6
$ ./configure --prefix=$HOME/local/python
$ make
$ make install

どこのディレクトリにインストールするか迷ったのだが、$HOME/local/pythonが正解のようだ。いらなくなったら、まるごと捨てれば良いから管理が楽になる。

■.cshrcを修正する

% emacs ~/.cshrc
-----
set path = ($path $HOME/local/python/bin)
setenv PYTHON $HOME/local/python/lib
-----

% source ~/.cshrc
% rehash

pathの設定で、set path = ($HOME/local/python/bin) とやってしまったら、OSのコマンドを実行しようとしたら「コマンドが見つからない」エラーが発生。しばらくの間、途方に暮れた。しかたがないので、ローカルPCからWinScpを起動し、.cshrc をダウンロードして修正し、アップロードして難を逃れた。

■とりあえず、実行してみる

% python3
Python 3.3.6 (default, Jun 14 2015, 10:23:21)
[GCC 4.2.1 20070831 patched [FreeBSD]] on freebsd9
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/home/bty/local/python/lib/python33.zip', '/home/bty/local/python/lib/python3.3', '/home/bty/local/python/lib/python3.3/plat-freebsd9', '/home/bty/local/python/lib/python3.3/lib-dynload', '/home/bty/local/python/lib/python3.3/site-packages']
>>>

ちゃんと実行できるようになった。sys.pathを表示して、どこにパスが通っているか確認した。

■pipをインストールする

Python3.4からはpipが標準装備なのだが、3.3は自分でインストールしなきゃならん。最初にeasy_installをインストールして、その後で pip をインストールする。面倒な作業になった。

% cd ~/work/py3
% wget --no-check-certificate https://pypi.python.org/packages/source/d/distrib\
ute/distribute-0.6.49.tar.gz
% tar zxvf distribute-0.6.49.tar.gz
% cd distribute-0.6.49
% python3 setup.py install

インストールが終わったので、実行してみるとエラー発生。

% easy_install pip
error: can't create or remove files in install directory

The following error occurred while trying to add or remove files in the
installation directory:
    [Errno 13] Permission denied: '/usr/local/lib/python2.7/site-packages/test-\
easy-install-74228.write-test'

よくよくエラーメッセージ見ると、Phthon2.7のeasy_installを実行していた。

% which easy_install
/usr/local/bin/easy_install
% which easy_install-3.3
/home/bty/local/python/bin/easy_install-3.3

Python3用のeasy_installを探したらちゃんとあったのでホッとした。3.3用のものとわかるようにeasy_install-3.3を使う。

% easy_install-3.3 pip
....
Installed /home/bty/local/python/lib/python3.3/site-packages/pip-7.0.3-py3.3.eg\
g
....

pipのインストール完了。さて実行しようとすると、pipが無いというエラーメッセージがでる。pip3も同じ。

% pip
pip: Command not found.
% pip3
pip3: Command not found.
% rehash
% pip3

またまた、rehashコマンドを打ち忘れてしまっていた。これでやっとpipが使えるようになった。

UNIXの部屋 コマンド検索:rehash (*BSD/Linux)から
コマンドをタイプしたとき、シェルは実行可能ファイルを見つけるために、毎回 PATH で指定されたディレクトリを検索するわけではない。ハッシュテーブルに実行可能なコマンドを登録し、そこからコマンドを呼び出している。

このため、新しくシェルスクリプトを作ったり、パッケージをインストールした場合、実際はパスの通ったディレクトリに実行可能ファイルがあるにもかかわらず、そのコマンドがハッシュテーブルに登録されていないため、コマンドを見付けることができない場合がある。このようなときは rehash でハッシュテーブルの再構築をすることで、シェルに新しいコマンドを認識させることができる。

sh・bash では毎回 PATH に記述されたディレクトリを検索するので、csh・tcsh の rehash に相当するコマンドはない。

参考
Python 3.3 と pip をインストールした | Lonely Mobiler
Python3をさくらサーバー(FreeBSD)にインストール – Qiita
シェル変数と環境変数 – サーバエンジニアの知恵袋

Windows7にPython3.4の後にPython3.3をインストールしてはまったこと

Windows7にPython3.4をインストールした後、PyAudioがPython3.3までしかサポートしていないことがわかり、Python3.3をインストールしたのだが、PyAudioのサンプルプログラムを動作させようとしてはまってしまった。

PyAudio: PortAudio v19 Python BindingsのExamplesをエディタにコピペしてsample.pyの名前で保存した。いつものように、拡張子.pyにはPythonが関連づけてあるから、sample.pyを実行させた。

> sample.py
Please build and install the PortAudio Python bindings first.

PortAudioをインストールしなさいというメッセージがでてサンプルが実行できない。インストールした C:\Python33\Lib\site-packages\pyaudio.py を開いてメッセージを表示する部分をみると、

# attempt to import PortAudio
try:
    import _portaudio as pa
except ImportError:
    print("Please build and install the PortAudio Python " +
          "bindings first.")
    sys.exit(-1)

_portaudioモジュールを読み込もうとしたときに例外が発生しているようだ。C:\Python33\Lib\site-packagesディレクトリにはちゃんと_portaudioモジュールがあるし、そのほかに原因があるのだろうか、と悩んでしまった。

そこでまずは基本にもどり、pythonを起動してから、import pyaudio とやると上述のメッセージは出ない。ということは、コマンドプロンプトで sample.py とファイル名だけで実行させると、Python3.4が起動して実行していた。python sample.py とやれば、Python3.3が起動してsample.pyが実行される。

Windows7の拡張子付けを調べてみた。

>assoc .py
.py=Python.File

>ftype python.file
python.file="C:\Windows\py.exe" "%1" %*

ファイル拡張子 .py にファイル・タイプ Python.Fileが定義付けされている。起動するプログラムは “C:\Windows\py.exe” “%1” %* であることがわかった。Ptyon3.4をインストールしたときに py.exe が作られていたが、その後でPython3.3をインストールしても上書きされていない。Python3.3と3.4のインストール挙動の違いがハマリの原因だった。

試しに、バージョンを表示するプログラムを書いて実行すると、

# test.py
import sys
print(sys.version)
>test.py
3.4.2 (v3.4.2:ab2c023a9432, Oct  6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)]

>python test.py
3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:37:12) [MSC v.1600 32 bit (Intel)]

スクリプトの前にちゃんと python を入力すれば問題無いのだった。

Python 3.3をWindows7にインストールした

Python3の最新版は3.4.2なのだが、PyAudioがPython3.3までしかサポートしていない。しかたないので、Python3.3を探したところ、バイナリーで提供されているのは3.3.5が最新で、2014年3月9日にリリースされている。その後にセキュリティ対応した3.3.6が2014年10月12日にリリースされているのだが、ソースリストだけでWindows用を含めてバイナリーはリリースされていない。

Python Release Python 3.3.5 | Python.orgのページからWindows x86 MSI installerをダウンロードして、ダブルクリックで起動、すべてデフォルトでインストールを進める。C:\Python33にPython3.3.5がインストールされた。

コマンドプロンプトからpythonと起動すると、当然ながら Python3.4.2が起動する。

スタート→コンピュータを右クリックでプロパティ選択→「コンピュータの基本的な情報の表示」の画面が表示される→「設定の変更」をクリック→「システムのプロパティ」画面が表示→「詳細設定」タブをクリック→「環境変数」をクリックして「環境変数」画面を表示→システム環境変数のPathを編集し、

……;C:\Python34;C:\Python34\Scripts;……

……;C:\Python33;C:\Python33\Scripts;……

と変更する→後は[OK]で画面を閉じていく。

新しくコマンドプロンプトを起動し、pythonと起動すると、Python3.3.5が無事に起動した。

しかし、モジュールをインストールするために必要な pip が使えない。c:\Python33のディレクトリを表示させてみると、Python3.4と違って、C:\Python33\Scriptsのディレクトリが無いのだ。

pipの本家Installation — pip 6.0.8 documentationを読むと、Python2.7.9以降とPython3.4以降にはpipが標準で含まれているのだが、Python3.3は自分でインストールしなければならないことがわかった。説明通りに、ページのリンクからget-pip.pyをダウンロードし、c:\Python33\Scriptsを作り、このディレクトリにget-pip.pyを移動した。カレントディレクトリをc:\Python33\Scriptsにしてから、python get-pip.pyを実行する。

C:\Python33\Scripts>python get-pip.py
Collecting pip
  Downloading pip-6.0.8-py2.py3-none-any.whl (1.3MB)
    100% |################################| 1.3MB 240kB/s
Collecting setuptools
  Downloading setuptools-12.1-py2.py3-none-any.whl (502kB)
    100% |################################| 503kB 455kB/s
Installing collected packages: setuptools, pip


Successfully installed pip-6.0.8 setuptools-12.1

C:\Python33\Scripts>dir
 ドライブ C のボリューム ラベルは Windows7_OS です
 ボリューム シリアル番号は 2A55-22CF です

 C:\Python33\Scripts のディレクトリ

2015/02/14  12:13    <DIR>          .
2015/02/14  12:13    <DIR>          ..
2015/02/14  12:13            92,008 easy_install-3.3.exe
2015/02/14  12:13            92,008 easy_install.exe
2015/02/14  12:00         1,608,741 get-pip.py
2015/02/14  12:13            91,980 pip.exe
2015/02/14  12:13            91,980 pip3.3.exe
2015/02/14  12:13            91,980 pip3.exe
               6 個のファイル           2,068,697 バイト
               2 個のディレクトリ  79,348,703,232 バイトの空き領域

これでようやく、pipも使えるようになり、Python3.3の環境ができた。

Python3でfeedparserを使う

ちょこちょこと時間を見つけてはPython3を使ってみてはいたのだが、年末年始の休みに入り、まとまって時間が取れるので昔にPython2で書いたスクリプトをPython3で試してみることにした。

まずはPythonのfeedparserを使ってみるをPython3で書き直す。

feedparserモジュールをpipを使ってインストールする。

> pip install feedparser

インストールできたバージョンは5.1.6だった。pypiをみると確かに5.1.3が最新バージョンだ。feedparserモジュールの使い方は、Documentation — feedparser 5.1.3 documentationに書いてある。

Yahooニュースで国内ニュースのrssフィードを取得する。

# -*- coding: utf-8 -*-

import feedparser

rssurl='http://rss.dailynews.yahoo.co.jp/fc/domestic/rss.xml'
d = feedparser.parse(rssurl)

for entry in d['entries']:
    print("title:", entry.title)
    print("published: ", entry.published)
    print("link: ", entry.link)

結果は次のとおり。

title: 都内の男性 エボラ検出されず
published:  Mon, 29 Dec 2014 19:59:19 +0900
link:  http://dailynews.yahoo.co.jp/fc/science/ebola/?id=6144135
title: 自衛隊派遣で恒久法を検討
published:  Mon, 29 Dec 2014 18:36:45 +0900
link:  http://dailynews.yahoo.co.jp/fc/domestic/defence_policy/?id=6144126
title: 指定廃棄物 見えぬ各県処分
published:  Mon, 29 Dec 2014 18:24:41 +0900
link:  http://dailynews.yahoo.co.jp/fc/domestic/radioactive_waste/?id=6144124
title: 三が日まで全国的に荒れ模様
published:  Mon, 29 Dec 2014 16:32:05 +0900
link:  http://dailynews.yahoo.co.jp/fc/domestic/weather/?id=6144114
title: 民主代表選 長妻氏が出馬表明
published:  Mon, 29 Dec 2014 16:15:41 +0900
link:  http://dailynews.yahoo.co.jp/fc/domestic/democratic_party_of_japan/?id=6144113
title: 危険ドラッグ 輸入に刑事罰
published:  Mon, 29 Dec 2014 14:43:03 +0900
link:  http://dailynews.yahoo.co.jp/fc/domestic/unregulated_drugs/?id=6144096
title: 佳子さま20歳 結婚まだ考えず
published:  Mon, 29 Dec 2014 11:21:25 +0900
link:  http://dailynews.yahoo.co.jp/fc/domestic/imperial_family/?id=6144082
title: 日本のギャルは消えたのか
published:  Mon, 29 Dec 2014 12:58:24 +0900
link:  http://dailynews.yahoo.co.jp/fc/economy/apparel/?id=6144089

pipが起動しない

Windows7の環境にPython3をインストールしたけど何もやっていない。ひさしぶりにPhthonを触ってみようと、pipでモジュールをインストールしようとしたらpipが起動しない。環境変数Pathにpipのディレクトリを追加して起動できるようになった。

僕の場合、Python3のセットアップをしたとき、C:\Python34にインストールする設定にした。pipはこのディレクトリ配下のどこかにあるはずなので探したら、C:\Python34\Scripts にあるのを見つけた。下記の手順で環境変数Pathに追加してあげる。

「システムのプロパティ」で[環境変数]をクリック。

python-kankyo1

システム環境変数のリストからPathを編集して C:\Python34\Scripts; を追加してやる。

python-kankyo2

Dos窓(cmd.exe)は環境変数を変更した後に、もう一度起動しないと環境変数が反映されないので注意。恥ずかしいことに、昔これではまったことがる。

python-kankyo3

これで、いわゆる「Pathを通した」のでpip を実行できるようになる。

そろそろPython3に移行しようと思った

普段使いのThinkPad X200が故障してしまい、そのひとつ後継のThinkPad X201をこれから使うことにした。某オークションで価格重視で落札したものだが状態はあまり良くなかった。もう少しお金をかけて状態の良いものを選べば良かったかもしれない。

幸いにもDTOD領域が残っていたので、ThinkPad X201付属のWindows7をインストールして最初から構築し直しとなった。PythonはこれまでのPython2.7からPython3.4.2をインストールした。Python3を使うのは初めてで、まずはprintの使い方が違っていてびっくり。これは先が思いやられる。ネットでPython2とPython3の違いを解説してあるサイトをざっくり読んでいる。これまで書いてきた自分のプログラムも動作しないので、いろいろと見直しが必要で、ちょっと面倒なことになりそうだ。

新環境
ThinkPad X201(Corei5 M560 2.67GHz,RAM 3GB)
Windows 7 Proffsional (32bit)
Python 3.4.2
Emacs 24.3.1

あいかわらずしょぼい環境だが、そんなにパワーが必要なことはやらないので、今のところはこれで十分かな。しかし、ThinkPad自慢のキーボードがへたっていて、どうも打ちにくいので不満が残る。中古だからしょうがないかとあきらめムード漂う中、キーボードをどうにかして調達しようと計画している。

VoiceText Web APIをPythonで使ってみる

音声合成のWeb APIがあったので、Pythonで使ってみます。このサービスはベータ版ということですが、HOYAサービス株式会社が提供しています。もしかして「Misakiという女性の音声合成で有名だったんじゃないだろうか」と思って調べたら、サンプル音声 | HOYA音声合成ソフトウェア VoiceTextにありました。

さっそく、VoiceText Web API (β版)から利用登録してAPIキーを入手しました。

実験環境

  • ThinkPad X200
  • Windows7 Professional 64bit
  • Python 2.7.3

プログラムを書く

最近慣れてきたrequestsモジュールで音声データをダウンロードするプログラムを書きましたが…、

#coding:utf-8

import requests

url = 'https://api.voicetext.jp/v1/tts'
API_KEY = 'YOUR API KEY'

payload = {
    'text': 'おはようございます',
    'speaker': 'hikari',
    }

r = requests.post(url, params=payload, auth=(API_KEY,''))

f = open("test.wav", 'wb')
f.write(r.content)
f.close()

実行するとエラーが発生しました。

requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:1407742E:SSL routines:
SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

これはもしかしての”はまり”の予感的中です。

requestsモジュールのバージョンが低いからではないかと思い、pip でupgradeして

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.__version__
'2.3.0'
>>>

最新バージョンになったにもかかわらず、同じエラーが発生します。

requestsモジュールをやめ、昔ながらのurllibとurllib2でプログラムを書いてあげても、エラーメッセージが発生しました。

urllib2.URLError: <urlopen error [Errno 1] _ssl.c:504: error:1407742E:SSL routin
es:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version>

これは何かのバグなのかも、同じエラーで悩んでいる人がいるに違いないと思い、ネットで検索して回避策を見つけました。

requests_toolbelt 0.1.0 documentation

サーバー側のOpenSSLのバージョンによっては、SSLバージョンのネゴシエーションがうまく動作できないのが原因のようです。requests_toolbeletモジュールをインストールし、SSLAdapterでSSLに使うバージョンを指定することで動作するになりました。

> pip install requests_toolbelet

プログラムを書き直す

#coding:utf-8

from requests_toolbelt import SSLAdapter
import requests
import ssl
import sys

url = 'https://api.voicetext.jp/v1/tts'
API_KEY = 'YOUR API KEY'

payload = {
    'text': 'おはようございます',
    'speaker': 'hikari',
    }

s = requests.Session()
s.mount(url, SSLAdapter(ssl.PROTOCOL_TLSv1))
r = s.post(url, params=payload, auth=(API_KEY,''))

print "status code:", r.status_code
if r.status_code != 200:
    print "error:", r.json()['error']['message']
    sys.exit()

f = open("test.wav", 'wb')
f.write(r.content)
f.close()

プログラムを実行して得たwavファイルは下記で再生できます。VoiceText Web API (β版)に反するようなので音声再生をやめます。ちょっと残念。

(2)当社のサーバーから出力された音声データは、本サービスを利用したアプリケーション内のみで使用すること
(3)当社のサーバーから出力された音声データを、直接的または間接的に配布しないこと(但し、当社の事前の書面による承諾がある場合はこの限りではありません)

VoiceText WEB APIの音声品質は抜群に良いです。ベータ版ということですが、このまま無償でサービスを続けてほしいですね。そして無償の利用範囲を広げていただけるとありがたいです。

PythonでFlickr APIを使って写真を検索する(その2)

前回では検索結果をJSON形式で取得できることがわかったので、写真をダウンロードしてみます。

実験環境

  • ThinkPad X200
  • Windows7 Professional 64bit
  • Python 2.7.3

写真をダウンロードする

検索結果から写真が保存されているURLを得るために、Photo Source URLsに仕様が書かれています。

これによると写真のURLは下記フォーマットで決定されることがわかります。

https://farm{farm-id}.staticflickr.com/{server-id}/{id}_{secret}.jpg

前回エントリーで取得した結果と比べてみると、

      {
        "farm": 4,
        "id": "14676462357",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "107369966@N07",
        "secret": "de3d8c1e63",
        "server": "3882",
        "title": "Fruits Daifuku picture2"
      },

farm-idにfarmの値を、server-idにserverの値を、idにidの値を、secretにsecretの値をあてはめてURLを作れば、写真が保管されているURLになります。

前回エントリーのプログラムをベースにして、”daifuku”の写真を50枚ダウンロードするプログラムを書いてみました。

# -*- coding: utf-8 -*-

import requests

url = 'https://api.flickr.com/services/rest/'
API_KEY = 'YOUR API KEY'

payload = {
    'method': 'flickr.photos.search',
    'api_key': API_KEY,
    'text': 'daifuku',
    'per_page': '50',
    'format': 'json',
    'nojsoncallback': '1'
    }

r = requests.get(url, params=payload)

resp = r.json()
tpl_url = 'https://farm%s.staticflickr.com/%s/%s_%s.jpg'
count = 1
for i in resp['photos']['photo']:
    img_url = tpl_url % (i['farm'],i['server'],i['id'],i['secret'])
    print "#%04d" % count, img_url
    r = requests.get(img_url)
    fname = "%04d.jpg" % count
    f = open(fname, 'wb')
    f.write(r.content)
    f.close()
    count += 1

実行させると、おいしうな大福の写真がダウンロードできました。でもちょっと違う写真もちらほら見えます。検索APIにはパラメータが数多くあるので、いろいろと試してみるとおもしろそうです。

WS000054

PythonでFlickr APIを使って写真を検索する

Flickr APIを使うブログ記事が気になり、せっかくのお休みなのだが台風も来ていることだし、Pythonでやってみることにした。参考にした下記ブログサイトではJavaでプログラミングしている。

Flickr APIを使ってみよう(1.APIキーの取得) | Tech Booster

本家FlickrのAPIの説明は下記URLに説明されている。英語力に自信の無い僕はGoogle翻訳でざっと説明を読んだ。

Flickr Services

実験環境

  • ThinkPad X200
  • Windows7 Professional 64bit
  • Python 2.7.3

APIキーの取得

何はともあれ、APIキーを取得しないとAPIを使えない。最初にYahoo.comのアカウントを取得し、次にFlickrのAPIキーを取得する手順となります。

下記URLを表示させると、YahooのID入力画面が表示されたので、Create New AccountからYahooアカウントを取得します。
https://www.flickr.com/services/api/keys/

WS000051

アカウントを作る過程で携帯電話番号を入力しなければなりません。Yahoo.comから登録した携帯電話に”4桁の番号”が届き、本人認証する仕組みになっているようです。日本の携帯電話番号で大丈夫なのかと不安になりましたが、ちゃんと自分の携帯にCメールで受信できました。これは凄い、ちょっと感動ものでした。

さて、無事にログインできたら、下記URLからAPI KEYを取得します。
https://www.flickr.com/services/apps/create/apply/

仕事じゃないんで、Non-Commercialから登録します。
WS000052
アプリケーションの名前と利用目的を入力してsubmitすると、API KEYとsecretを取得できます。

写真検索する

写真を検索するために知っておかないといけないのは、検索するときに使うURL、検索APIの仕様、JSONレスポンスの仕様です。

検索結果をJSON形式で表示するプログラムを書いてみます。

# -*- coding: utf-8 -*-

import json
import requests

url = 'https://api.flickr.com/services/rest/'
API_KEY = 'YOUR API KEY'

payload = {
    'method': 'flickr.photos.search',
    'api_key': API_KEY,
    'text': 'daifuku',
    'per_page': '5',
    'format': 'json',
    'nojsoncallback': '1'
    }

r = requests.get(url, params=payload)

print r
print json.dumps(r.json(), sort_keys=True, indent=2)

Flickr APIのurlは https://api.flickr.com/services/rest/ でパラメータを次のようにしてみました。method に 検索のAPIを、api_keyに 先ほど取得した自分のAPIキーを指定します。textに検索するワードを入力しますが、今回は daifuku を検索することにします。そして、per_pageは検索結果数ですが、結果をわかりやすく表示するため5を指定し、formatは検索結果をjson形式とし、jsonコールバックは使わないようにnojsoncallbackに1を指定します。

requests.get でAPIをたたき、検索結果を取得し、json.dumpsメソッドで整形することで、段組のついたわかりやすい表示で出力します。

<Response [200]>
{
  "photos": {
    "page": 1,
    "pages": 597,
    "perpage": 5,
    "photo": [
      {
        "farm": 4,
        "id": "14676462357",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "107369966@N07",
        "secret": "de3d8c1e63",
        "server": "3882",
        "title": "Fruits Daifuku picture2"
      },
      {
        "farm": 3,
        "id": "14804540585",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "32889649@N08",
        "secret": "3d735c3f54",
        "server": "2904",
        "title": "ichigo daifuku"
      },
      {
        "farm": 6,
        "id": "14769419672",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "55490231@N08",
        "secret": "c47646a535",
        "server": "5563",
        "title": "berry daifuku"
      },
      {
        "farm": 3,
        "id": "14583104169",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "55490231@N08",
        "secret": "5a32527b06",
        "server": "2895",
        "title": "Yomogi daifuku/\u84ec\u5927\u798f"
      },
      {
        "farm": 4,
        "id": "14741129311",
        "isfamily": 0,
        "isfriend": 0,
        "ispublic": 1,
        "owner": "64779930@N08",
        "secret": "33c49c4e18",
        "server": "3881",
        "title": "Mmoochhiii! Azukii! Strawberries!"
      }
    ],
    "total": "2985"
  },
  "stat": "ok"
}

ちょっと長くなったので、続きは次のエントリーで

PythonでBing Search APIを使って画像を検索する

ゆーすけべーさんの本を読んでいたら、「いかにして大量のおっぱい画像をダウンロードするのか」という章があって、高校生がプログラミンを始めるキッカケになったというエピソードに笑えました。若い男性がプログラムに興味を持つきっかけとなるには、ベストな話題かもしれません。

ということで、僕もPythonで画像を検索するプログラムを作ってみました。ところが、1ヶ月前ぐらいに作ったプログラムで、どうやって調べたのか忘れてしまい、ブログに書くためほぼ最初から調べ直しというアホなことをやってます。つぎからはちゃんとメモしておくことにしよう。

プログラムを作るにあたって、同じことをやっている記事がないか、Googleで検索したらBing Search API を使いたいと思ったのでPythonでラッパーを作ってみた – [[ともっくす alloc] init]がヒットしたので参考にしました。

BeingでSearch APIを使うためには、Microsoftアカウントが必要となります。まだ持っていない人も、Bing Search API | Microsoft Azure Marketplaceから、ひと月5,000トランザクション(無料)を選択して表示されるログイン画面からMicrosoftアカウントを取得できます。
WS000048
無事に購読契約できたら、Microsoft Azure Marketplaceのアカウント情報に表示されるプライマリアカウントキーを記録しておきます。APIでデータ要求するときにサイト認証で使います。

Search APIの使い方はBing API Migration Guide にあります。

実験環境

  • ThinkPad X200
  • Windows7 Professional 64bit
  • Python 2.7.3

画像を検索するので、APIへアクセスするためのURLは
https://api.datamarket.azure.com/Bing/Search/Image
となります。クエリパラメータは、検索するワードをQueryパラメータに指定し、レスポンスのフォーマットを指定する$formatパラメタ-にJSONを指定します。

URLにアクセスするにはベーシック認証で接続します。

r = requests.get(bing_url, params=payload, auth=('', MS_ACCTKEY))

Bing API Migration Guide にあるように、user-nameを入力無しとし、パスワードにアカウントキーを指定します。ただ、よくわからないんですが、user-nameとパスワードの両方にアカウントキーを指定しても動作するみたいです。プログラムではパスワードだけにアカウントキーを指定しています。

検索した結果のレスポンスはJSON形式になっているので、画像URL(MediaURL)を抜き出して画像をダウンロードします。画像URLのファイル名の拡張子をみてJPEGファイルのみを対象とします。
また、プログラムを実行する環境がWindowsの場合、画像データを書き込むときはバイナリモードでファイルを開きます。

f = open(fname, 'wb')

こうしないとダウンロードしたJPEGデータが正常に保存できません。

プログラムで検索するワードは「大福」にしました。好きなワードに変更すれば、それなりの画像が取得できます。このプログラムはAPIの基本的な使いかたを調べるために作ったので、検索結果は50個までです。

また、APIにアクセスするときのパラメータの説明は下記にまとまっています。
Bing API Schema Guide
感心したのは、Adultというパラメータがあり、性的なレベルを指定して検索結果をフィルタリングします。Offはフィルタリングしない、Moderateは露骨な性的画像コンテンツ(画像、ビデオ)をフィルタリングし、Strictは含まないようにフィルタリングすることになっています。どこまでが露骨な性的表現になるのか、いろいろと実験してみないことにはわかりませんが…。

#coding:utf-8

import os
import requests

def bing_search(query):
    bing_url = 'https://api.datamarket.azure.com/Bing/Search/Image'
    MS_ACCTKEY = 'your account key'

    payload = { '$format': 'json',
                'Query': "'"+query+"'",
              }
    r = requests.get(bing_url, params=payload, auth=('', MS_ACCTKEY))

    count = 1
    for item in r.json()['d']['results']:
        image_url = item['MediaUrl']
        root,ext = os.path.splitext(image_url)
        if ext.lower() == '.jpg':
            print image_url,
            r = requests.get(image_url)
            fname = "%04d.jpg" % count
            f = open(fname, 'wb')
            f.write(r.content)
            f.close()
            print "...save", fname
            count += 1

if __name__ == '__main__':
    bing_search('大福')

おしそうなおっぱい「大福」の画像をダウンロードできました。
WS000050

Requests + Bootstrap で楽天APIからHTMLページを作る

Pythonでrequestsモジュールを使えば、楽天APIを手軽に扱えることがわかったので、戻ってきたJSONデータからHTMLファイルを作って画面を表示させてみる。表示させる画面のHTMLは、cssフレームワークのBootstrapを利用して、これまたお手軽に作ってみた。

つい最近までcssフレームワークという言葉は知らなかった。このところのマンネリ化を打破するために「Webサービスのつくり方」という本を買って読んでいたら、サイトの見栄えをよくするためのcssフレームワークの利用について書いてあった。こういう便利なものを使えば、ほとんどcssを書かずにページをお手軽に作成できることを知った。この本は技術を奥深く説明するというより、「こんなことやってサイト作ってますよ」というスタンスでエッセー風に書いてあるので読みやすい。

楽天ウェブサービスAPI
APIは前回同様に楽天ウェブサービス: 楽天商品検索API(version:2014-02-22) | API一覧を使う。

APIを叩いて戻ってきたJSON形式のレスポンスから、検索結果の商品名(itemName)、商品価格(itemPrice)、商品画像128x128URL(mediumImageUrls)を取得してHTMLを作る。JSONで得られたデータの文字コードはUNICODEになっているので忘れずにUTF-8に変換する。商品画像はリストで最大3枚を得られるが最初の画像URLを使うことにする。

Bootstrap
BootstrapはGetting started – BootstrapからBootstrapをダウンロードする。解凍するとbootstrap-3.2.0-distフォルダが作られて、css、fonts、jsのフォルダが出来ている。この3つをこれから作るHTMLファイルを置いておくWEBサーバのディレクトリにコピーしておく。

cssフレームワークという考え方や、cssで使われる言葉の意味がよくわからなかったので下記の本を読んだ。AmazonのカスタマーレビューなどではBootstrap本家の説明を読めば十分だという意見もあったのだが、薄い本でさくっと読めて、グリッド、モバイルファーストなどという言葉も理解できて僕にとっては良かった。

実験環境

  • ThinkPad X200
  • Windows7 Professional 64bit
  • Python 2.7.3
  • さくらのレンタルサーバ(スタンダード)

プログラム

# -*- coding: utf-8 -*-

import requests

html = '''<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>rakuten web service</title>
  <link href="./css/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
<div class="container">
  <div class="row">
    <div class="col col-md-12">
      <h1>楽天ウェブサービスのテスト</h1>
    </div>
  </div>
  <!-- 商品開始 -->
  %s
  <!-- 商品終了 -->
  <div class="row">
    <div class="col col-md-12">
      <p>&copy; 2013 bty備忘録 All rights reserved</p>
    </div>
  </div>
</div>
<!-- /container -->

<script src="http://code.jquery.com/jquery.js"></script>
<script src="./js/bootstrap.min.js"></script>
</body>
</html>'''

def make_html(items):
    hitems = []
    for i in items:
        hitem = [
            '<div class="col col-md-3"><div class="well">',
            '<p>%s</p>' % i['name'],
            '<p>%s yen</p>' % i['price'],
            '<img src="%s">' % i['imgurl'],
            '</div></div>']
        hitems.append('\n'.join(hitem))

    nitems = len(items)
    nrow = nitems / 4
    if nitems % 4: nrow += 1
    #print nitems, nrow
    hrows = []
    for n in range(nrow):
        hrow = ['<div class="row">']
        for i in range(4):
            nitem = n * 4 + i
            #print nitem
            if nitem >= nitems: break
            hrow.append(hitems[nitem])
        hrow.append('</div>')
        hrows.append('\n'.join(hrow))
    return html % '\n'.join(hrows)


def search():
    url = 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222'
    payload = {
        'applicationId': [アプリID],
        'keyword': 'ラジオ',
        'hits': 30,
        #'sort': '+itemPrice',
        }
    r = requests.get(url, params=payload)
    resp = r.json()

    items = []
    for i in resp['Items']:
        h = {}
        item = i['Item']
        h['name'] = item['itemName'].encode('utf8')
        h['price'] = item['itemPrice']
        h['imgurl'] = item['mediumImageUrls'][0]['imageUrl'].encode('utf8')
        items.append(h)
    return items

if __name__ == '__main__':
    items = search()
    html = make_html(items)
    print html

プログラムを実行するとHTMLが表示されるので、たとえばtest1.htmlという名前でリダイレクトしてファイルに保存し、WinSCPなどで自分のサイトに転送すれば完成する。転送先のディレクトリにはBootstrapのcss、fonts、jsのフォルダがある。

作成したHTMLページ
http://bty.sakura.ne.jp/raku/test1.html

WS000047

PythonのRequestsモジュールで楽天APIを使ってみる

PythonでHTTPを扱うときはurllib、urllib2モジュールを使うものだと思っていたが、最近はRequestsモジュールを使うらしいことがわかった。試しにRequests: 人間のためのHTTP ? requests-docs-ja 1.0.4 documentationを読みながら、楽天APIで使ってみた。

実験環境
ThinkPad X200
Windows7 Professional 64bit
Python 2.7.3

まずは楽天ウェブサービス: API一覧でAPIを何にするかざっと見る。楽天商品検索API (version:2014-02-22)を使ってみることにした。

使い方は楽天ウェブサービス: 楽天商品検索API(version:2014-02-22) | API一覧に書いてある。

入力パラメータの数はたくさんあるけど、必須なのはアプリID(applicationId)と検索キーワード(keyword)の2つだけ。あとは、1ページあたりの取得件数(hits)を10に、価格が安い順に並べる(sort=+itemPrice)ことにする。

APIを叩いて戻ってきたJSON形式のレスポンスから、検索結果の総商品数(count)と商品名(itemName)、商品価格(itemPrice)を表示させる。

# -*- coding: utf-8 -*-

import requests

url = 'https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222'

payload = {
    'applicationId': [アプリID],
    'keyword': 'Python',
    'hits': 10,
    'sort': '+itemPrice',
    }

r = requests.get(url, params=payload)

resp = r.json()
print "num of kensaku =",resp['count']
print '-'*40

for i in resp['Items']:
    item = i['Item']
    print item['itemName']
    print item['itemPrice'], 'yen'

実行した結果は以下のとおり。

num of kensaku = 7922
----------------------------------------
【中古】マジックザギャザリング/英語版/C/Visions(ビジョンズ)/黒 [C] : Python/ニシキヘビ【10P13Jun14】【画】
60 yen
【中古】マジックザギャザリング/日本語版/C/Visions(ビジョンズ)/黒 [C] : ニシキヘビ/Python【10P13Jun14】【画】
60 yen
Python: Quick Reference - Cheat Sheet - Print & LaminateDigital Print & Laminate-【電子書籍】
196 yen
フォトアンクルソックス◎PYTHON/ニシキヘビ☆かわいい靴下通販☆【メール便可】●【楽ギフ_包装選択】
199 yen
PYTHON/ニシキヘビ◎フォトアンクルソックス☆かわいい靴下通販☆/シネマコレクション【メール便可】【RCP】
199 yen
【中古】 Flashy Python / Skin And Bones 【CD】
216 yen
【中古】 Flashy Python / Skin And Bones 【CD】
216 yen
Absolute Beginner’s Guide to Python 2.6 Programming-【電子書籍】
294 yen
Beginning Python Programming-【電子書籍】
294 yen
Possum and Python-【電子書籍】
304 yen

ubuntu server 14.04 LTSで音声を出力する

サーバーだけど、音を出したい。下記サイトに解決方法が書かれていた。

Ubuntu server: install Alsa sound and MOC (Music On Console) | How to
Playing Audio Files on Ubuntu Server 12.04+ | Learned Stuff

音を出力するためには、alsa serverが必要となる。早速インストールする。

$ sudo apt-get install alsa

ログインするときに使うユーザをaudioグループに追加する。
僕のユーザ名はbtyなので次のようにコマンドを叩く。

$ sudo adduser bty audio
Adding user <code>bty' to group </code>audio' ...
Adding user bty to group audio
Done.

# 本当に追加されたか確認するには
$ id bty
uid=1000(bty) gid=1000(bty) groups=1000(bty),4(adm),24(cdrom),27(sudo),29(audio),30(dip),46(plugdev),112(lpadmin),113(sambashare)

ここで、設定を反映させるためリブートする。

$ sudo reboot

alsamixer を起動し、マスターコントロールのミュートを外すして、音量を調整する。

$ sudo alsamixer

WS000035

Masterと書かれている部分で”MM”となっていたらミュートの状態だ。ミュート外すにはMキーを押す。

WS000037

alsaをインストールしたとき、テスト用のwavファイルが作られているので再生してみる。

$ sudo find / -name *.wav
/usr/share/sounds/alsa/Rear_Right.wav
/usr/share/sounds/alsa/Rear_Left.wav
/usr/share/sounds/alsa/Front_Right.wav
/usr/share/sounds/alsa/Noise.wav
/usr/share/sounds/alsa/Side_Left.wav
/usr/share/sounds/alsa/Rear_Center.wav
/usr/share/sounds/alsa/Side_Right.wav
/usr/share/sounds/alsa/Front_Left.wav
/usr/share/sounds/alsa/Front_Center.wav

$ aplay /usr/share/sounds/alsa/Front_Center.wav

ちゃんと聞こえたらOK。

mp3のファイルだって音声出力できる。lameとmocをインストールする。

$ sudo apt-get install lame moc

■NHKラジオを聞く

NHKはらじる★らじる NHKネットラジオをサービスしている。
こんなところにも貴重な受信料収入を投資しているのだ。せっかくだから、毎月支払う受信料をネットワークでラジオを聞いて回収することにしよう。

mplayerをインストールするとubuntu serverでも聞くことができる。

$ sudo apt-get install mplayer

$ mplayer -playlist http://mfile.akamai.com/129933/live/reflector:46051.asx

WS000036

下記サイトにNHKネットラジオのURLが掲載されている。

Ubuntu に関する個人的メモ > mplayer でらじる★らじるを聴く

民間のネットラジオのRADIKOも聞きたいと思ったのだが、ちょっと研究してみないと難しそうだ。参考になるは下記サイト。

マッタリとコーヒーでも・・・

ubuntu server 14.04 LTSで無線LANを使えるようにする

昔にやったけど、当然のごとく、忘れてしまった。

下記サイトの説明がわかりやすかったので、参考にして ubuntu server 14.04 LTSで無線LANを設定した。

WiFi/HowToUse – Debian Wiki

Command Lineの項目以降が参考になる。

1.モジュールのインストール
無線LANの接続に必要となる wpasupplicantとwireless-toolsは既にインストール済みであった。

# apt-get install wpasupplicant wireless-tools

2./etc/network/interfacesの設定ファイルはroot以外からは読み書きできないようにファイルのパーミッションを設定する。

# chmod 0600 /etc/network/interfaces

3.WPA PSKハッシュ値を計算する

# wpa_passphrase myssid my_very_secret_passphrase
network={
        ssid="myssid"
        #psk="my_very_secret_passphrase"
        psk=ccb290fd4fe6b22935cbae31449e050edd02ad44627b16ce0151668f5f53c01b

4.無線LANのインタフェースwlan0に静的IPアドレスを設定する

基本的に有線LANの設定の時と同じで、wpa-ssidとwpa-pskが増えただけ。
wpa-pskには上記で計算した WPA PSKハッシュ値 を書く。

# vi /etc/network/interfaces

auto wlan0
iface wlan0 inet static
       address 192.168.11.183
       netmask 255.255.255.0
       network 192.168.11.0
       broadcast 192.168.11.255
       gateway 192.168.11.1
       dns-nameservers 192.168.11.1
       wpa-ssid myssid
       wpa-psk ccb290fd4fe6b22935cbae31449e050edd02ad44627b16ce0151668f5f53c01b

無線LANのインタフェース wlan0 を立ち上げると、wpa_supplicantプロセスがバックグランドで起動する。

# ifup wlan0

クライアントからsshで接続できたので、普段は使わないであろう有線LANはコメントアウトすることにした。

ThinkPad T60にubuntu server 14.04 LTSをインストール

ひさしぶりの投稿だが、性懲りも無く、インストールの備忘録。

さて、またまた使わなくなった ThinkPad T60 に、この4月にリリースされたばかりの Ubuntu Server 14.04 LTS をインストールした。

ネットで検索すると、すでにたくさんの人がインストールしており、そのインストールの手順などを公開されている。そのなかで、下記サイトを参考にすすめることにした。

Server World

■インストールメディアの準備

下記サイトからインストールイメージをダウンロードして、DVDに焼いた。

Download Ubuntu Server | Download | Ubuntu

■インストール

ネットワークに接続した ThinkPad の電源をONにし、[F12]キーを押すと起動ドライブの選択画面になる。DVDをドライブに入れ、DVDドライブを選択するとインストールが始まる。

参考にしたサイトにしたがって、最初の言語選択では「英語」を選択した。

インストールするソフトウェアの選択画面では、
・OpenSSH server
・LAMP server
を選択した。

なんだかんだと選択する画面があるが、ほぼデフォルトですすめて終了する。

LAMPとはLinux, Apache, MySQL, PHPのこと。また、インストール時のネットワークは無線LANでも接続できるのだが、インストールが終わった後に設定は残っていない。これが使えれば楽なんだけどなあ、と思いつつ前回はあきらめた。今回は、とりあえずLANケーブルで接続しておいてインストールした。

インストール後の設定

なにはともあれ、sshで接続できるようにするぞ、と思っていたのだったが、sshd_configの修正は必要無く、デフォルトのままで接続できてしまった。

■ネットワーク設定

インストールした後はDHCPに設定されているので、/etc/network/interfaces に静的IP使うように設定する。

$ sudo vi /etc/network/interfaces

# 下記を追加する
iface eth0 inet static
address 192.168.11.182
network 192.168.11.0
netmask 255.255.255.0
broadcast 192.168.11.255
gateway 192.168.11.1
dns-nameservers 192.168.11.1

$ sudo ifdown eth0
$ sudo ifup eth0

■IPv6を無効にする

$ sudo su -
[sudo] password for bty:
# echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
# sysctl -p
net.ipv6.conf.all.disable_ipv6 = 1
# exit
logout
$

■WEBサーバ動作の確認

ブラウザから 192.168.11.182 を叩いたら下記画面が表示された。
WS000034

■PHPのインストール確認

バージョンを表示させた

$ php --version
PHP 5.5.9-1ubuntu4 (cli) (built: Apr  9 2014 17:11:57)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

WordPressのテーマ変更とカスタマイズした

会社の帰りに運悪く電車事故が発生。なかなか動きださないので、時間をつぶすため本屋さんにしかたなく行った。なんとなく手に取った本がとても良さそうで、B5サイズで薄いわりに内容がまとまっていて、値段も安いので買ってしまった。

そう言えば、ブログに使っている WordPress はネットで探したテーマをインストールしたぐらいで、何も手を入れていなかった。というか、どうやって良いのかわかりませんでした。

「初心者でもつまずかない!絶対できるWordPress入門書」と帯にあるとおりです。

テーマを簡単にカスタマイズする方法もわかったし、普段何気なく使っている投稿でも便利な方法がわかったし、プラグインも便利なのがあるのがわかったし、僕みたいな初心者にはピッタリでした。ネットでいろいろ探すより、よくまとまった一冊の本が良いみたいです。

とりあえず、本に書いてあるとおりに、twentythirteenをカスタマイズできました。

ただ、引用のblockquoteの文字が大きくて不釣り合いなのを小さくし、タイトルの文字を強調するするためにboldにしています。(TwentyThirteenでH1~H6のフォントサイズを調整する | work.logを参考にさせてもらいました)

/*----------------------------------------------
Misc.
----------------------------------------------*/

.entry-title {
    font-weight: bold;
    margin: 0 0 5px;
}

.entry-content blockquote {
    font-size: 13px;
    padding: 5px 10px;
    background-color: #f7f5e7;
}

blockquote p {
    margin: 0;
}

PythonスクリプトでDjangoにデータを登録する

前の記事で作ったアパート部屋のデータベースに、管理画面からデータを登録できるようになったが、いちいち画面を開いて入力して登録するのが面倒くさい。

部屋データのCSVファイルを作って、Pythonスクリプトから一気にデータベースに登録してみる。

PythonスクリプトからDjangoのデータベースを操作するには、Django の manage.py スクリプトが参考になる。

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

スクリプトが Django の models モジュールを読み込めるようにするため、
DJANGO_SETTINGS_MODULE 環境変数がプロジェクトの settings.py を指すようにする。

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings")

あとは csv ファイルを読みこんで Heyaモデルのインスタンスを作り、データを代入して保存(save)する。ただし、Windows環境で作った csvファイルは、文字列の文字コードが cp932 なので utf-8 に変換しなければならない。

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings")

import csv
from apartment.models import Heya

reader = csv.reader(open("kaijyu-1.csv"))

for r in reader:
    print r
    h = Heya()
    h.tanako = r[0].decode('cp932').encode('utf-8')
    h.bango = r[1]
    h.hirosa = r[2]
    h.yachin = r[3]
    h.save()

csvファイルは kaijyu-1.csv のファイル名で次のとおり。

ベムラー,101,2DK,35000
バルタン星人,102,2DK,35000
ネロンガ,103,1DK,30000
巨大ラゴン,201,2DK,36000
グリーンモンス,202,2DK,36000
ゲスラ,203,1DK,31000
アントラー,301,2DK,40000
レッドキング,302,2DK,40000
チャンドラー,303,1DK,37000

データを登録するスクリプトはプロジェクトのディレクトリ直下に保存して実行した。

これ以外のディレクトリでスクリプトを動作させるには、sys.path を設定してプロジェクトがどこにあるのかを Python に伝えておく必要がある。

このプロジェクトのディレクトリは c:\Users\skw\django\myproj なので、

sys.path.append(r'c:\Users\skw\django\myproj')

とすればよい。

たとえば、どこのディレクトリに置かれても、Djangoデータベースの内容を表示するスクリプトは次のとおり。

import sys
sys.path.append(r'c:\Users\skw\django\myproj')

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings")

from apartment.models import Heya

for h in Heya.objects.all():
    print h.tanako
    print h.bango
    print h.hirosa
    print h.yachin