しゃちの備忘録

これからC++を始める人によるC++の備忘録です(今のところ)

Jupyterを用いたデータ分析環境づくり

PythonのJupyterを使ったデータ分析環境の完成を目指します.

Python側の準備

Pythonでデータ分析をする上で便利な(必須 ?)なパッケージを入れて行きます. いらないものは,インストールしなければいいと思います. 今後の説明では,jupyterの話をするので最低限pip3 install jupyterしてもらえれば,いいと思います.

パッケージ名 用途
numpy 多次元配列や行列用の数学関数ライブラリ
これを使うことでPythonが本来苦手な大量のデータの取り扱いを高速に行えるようになる
pandas データ解析のために使用するライブラリ
データはこれで扱うことが多い(?)
scikit-learn 機械学習用ライブラリ
識別の要
jupyter 実行内容と結果を丸々記録できるツール
必須ではないが実行内容とメモなどを併用して取れるのであるととても便利
$ pip3 install numpy
$ pip3 install pandas
$ pip3 install scikit-learn 
$ pip3 install jupyter

jupyter notebookについて

先にあげた3つは実際の処理や計算に直結する部分なのでその時々に解説するつもりですが, Jupyterは環境そのもの(?)なので今ここで説明しておきます.

まずは適当なディレクトリを作成し,そのディレクトリ直下でjupyter notebookと入力します.

$ jupyter notebook

するといくつかメッセージが流れブラウザが自動的に立ち上がると思います. もし立ち上がらなければ,流れたメッセージの中からThe Jupyter Notebook is running at: **********のようなアドレスを見つけ出し,そのアドレスを開いてあげてください. f:id:teru0rc4:20170728151845p:plain

通常ここには,jupyter notebookを入力したディレクトリの中身が表示されます(今回はからのディレクトリを作成したのでこんな感じになっています). ここで作業をするのですが,jupyterではノートブックという形式でソースコードや,その解説,結果などをまるっと保存します. なのでノートブックの作り方を解説して行きたいと思います.

ノートブックを作って作業する

f:id:teru0rc4:20170729155857p:plain

右上のnewをクリックすると,Python3と出てきます.(2系の人はpython2??) これをクリックしてあげます. すると…!!

f:id:teru0rc4:20170729155927p:plain

これでノートブックは作成されました. あとはInと書かれた部分にPython のコードを打ち込んであげるだけです. このlnがついてハイライトされた枠をセルと呼ぶらしいです.

f:id:teru0rc4:20170729160852p:plain

特定のセルを選択しハイライトされた状態でCtrl+enterをすると,今現在のセルに打ち込んだ内容を実行することができます. shift+enterをするとセルの追加もできます. セルを適度に区切ってやることで,ここまででこんな感じになっている.というのを実行結果ごと保存できるのがjupyterの強みです.

さらに,上のタブからcodeをクリックし,出てくるメニューからMarkdownを選ぶと…, f:id:teru0rc4:20170729160909p:plain

f:id:teru0rc4:20170729161008p:plain

セルにマークダウンの記法が入力できるモードになり,shift+enterをすると, f:id:teru0rc4:20170729161058p:plain マークダウンの記法に従った文章がノートブックに追加されます.

コードを書き,その解説などをマークダウンの記法で綺麗にまとめることが簡単にできます.

ちなみに新規のノートブックを立ち上げた際,Python3を選んだ理由ですが, 他の言語を指定することもできるからのようです(詳しくは知りません…). もともとは ipython notebookをなのっていたのですが,他の言語に対応した際, Jupiter notebookに名前を変えたらしいです.

ノートブックを保存/jupyterを停止する

ノートブックの保存は上のバーのFileの中のSave and Checkpointからすることができます. オートセーブの設定になっていれば自動的にUntitled.ipynbという名前で保存されていると思います. リネームは対象のノートブックを開いてFileの中のRenameでできます. 今回はsample.ipynbという名前にしました.

f:id:teru0rc4:20170729161931p:plain

保存していれば,最初の画面でsample.ipynbが追加されているのが確認できると思います.

f:id:teru0rc4:20170729162023p:plain

終了したい場合, ブラウザのページは閉じてあげて問題ないです. jupyterを起動したターミナル上でCtrl+Cをしてあげて, jupyterを停止してあげれば終了は完了です.

f:id:teru0rc4:20170729162505p:plain

過去のノートブックを開く

開きたいノートブックがあるディレクトリで,jupyter notebookとしてやり, 上と同じように,The Jupyter Notebook is running at: **********で示されたアドレスを開くとファイル一覧にノートブックの名前があるので, それをひらけば過去の状態をそのままに,追記や編集ができます

https://utano.jp/entry/2016/01/jupyter-ipython-notebook-install/

おわりに

Jupyterのあれこれをまとめました

これを書いた目的は, KaggleのチュートリアルであるTitanic: Machine Learning from Disaster(https://www.kaggle.com/c/titanic)に挑むまでの準備の際に, Jupyterを準備したということに由来してます. それはまた次回書きます.(いつになるかな…)

Macでhomebrewを使いPython3+OpenCV3環境を整える

目標

Macでhomebrewを使って,Python3でのOpenCV3環境を整えます.

大まかな手順は以下の通り

  1. homebrewのインストール
  2. OpenCV3のインストール
  3. 動作確認

homebrewをインストール

詳細は昔書きました. XcodeとHomebrewについて - しゃちの備忘録

やることは次だけ

$ xcode-select --install
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

OpenCV3の準備

ここからOpenCVのインストールをしていきます. 基本的には以下のコマンドで良いようです.

$ brew install opencv3

ですがPythonで行う場合は,どちらかのバインディングしかインストールできないため, オプションにて指定をしてやらねばならないようです(他の言語でどうなのかは自分の方では把握してません…)

Python3でOpenCV3を使う場合は,

$ brew install opencv3 --with-python3 --without-python

Python2でOpenCV3を使う場合は,

$ brew install opencv3 --with-python3

でいいようです.

また,OpenCV3はインストールした段階では,/usr/localにリンクされていないので, リンク作成のためにコマンドを入力します.

$ brew link opencv3 --force

ここで気をつけなければいけないのが, すでにOpenCV2を導入している場合,OpenCV2でインストールしていたファイルを上書きしようとしてしまうらしいです, なので,上を実行する前にOpenCV2のリンクを切る,アンインストールする,またはOpenCV3はvirtualenvなどで使用するなどの対策をとりましょう.

brewでインストールしたopencv2のリンクを切るためには以下のコマンドをやれば良さそうです(--forceはいらないかもしれません).

$ brew unlink opencv2 --force

OpenCVを試す

上で紹介したPython3とC++(選択理由は私が使うから)でのOpenCVの挙動確認をします. OpenCVAPI等の解説をするつもりはないです.

Pythonのターミナル上で,import cv2ができればOKです. cv2.__version__でバージョン確認もできるので,そこで3.x.xであれば問題ないと思います.

f:id:teru0rc4:20170814235520p:plain

おわりに

リリースからだいぶ遅ればせながらOpenCV3用の環境を立てました. Pythonも3系に移行したし,やりたいこともあったので. それについても頑張ってかきたいですね….

ここまで読んでいただきありがとうございました.

Python3系でtesseractを使ってOCRをやってみる

前回の続きです. 今回はPythonでtesseractを使い,OCRをしてみるところまで挑みたいと思います. OCR(工学文字認識)そのものについては前回書いたので省略します. teru0rc4.hatenablog.com

tesseract

tesseractのインストール

tesseractとはGoogleで開発されているOCRエンジンです. homebrewを使いインストールします(homebrewについては過去に記事書いているのでご参照下さい)

$ brew install tesseract

f:id:teru0rc4:20170721165955p:plain みょろみょろログが出て,インストール完了です. 実は最初の状態だと英数字にしか対応していません. ので,次節にて日本語対応させたいと思います.

その前に,現在のtesseractのバージョンと,対応言語の確認をして起きたいと思います. バージョンの確認は

$  tesseract -v

から行います.

そして現在tesseractのOCRに対応している言語は次のように確認することができます.

$ tesseract --list-langs

ちなみに,OCRをする際に使う辞書ですが以下のディレクトリに格納されていることが確認できます. 人によっては違う可能性はあると思います(未検証). 今後はディレクト/usr/local/share/tessdata/にあるという設定でお話ししたいと思います. もし違う場合は読み替えていただけると幸いです

$ ls /usr/local/share/tessdata/

f:id:teru0rc4:20170721170135p:plain

辞書の追加

上で示したディレクト/usr/local/share/tessdata/に日本語用辞書/usr/local/share/tessdata/を追加し,日本語にも対応するようにします.

https://github.com/tesseract-ocr/tessdataから,自分にtesseractに対応したバージョンの日本語用データ jpn.traineddataを,/usr/local/share/tessdata/にダウンロードします. 上に貼ったリンクは2016年7月21日現在3.05を指しています.今後は変わる可能性があるので気をつけてください. バージョンが3.04であるならば,先ほどの下部に「3.04はこちら」的なリンクがあるのでそちらを参照ください.

上のGitHubから,jpn.traineddataというファイルをダウンロードし,/usr/local/share/tessdata/ドラッグ&ドロップなりで格納してもいいし, コマンドから一発でダウンロード格納もできます.(自分の環境での読み替えには注意して下さい)

$ curl -L -o /usr/local/share/tessdata/jpn.traineddata 'https://github.com/tesseract-ocr/tessdata/raw/master/jpn.traineddata'

f:id:teru0rc4:20170721231011p:plain ちゃんと追加できると,tesseract --list-langsをした時にjpnが追加されると思います. この方法で他の言語の追加もできます.

辞書追加時のエラーについて

ここで私の環境で日本語辞書を追加しようとした時に起きたエラーについて. 上記の方法で辞書を追加し,追加した辞書に対応する言語を使おうとすると, 大量のエラーを吐きました.(無限ループっぽい?)

原因を調査してもクリティカルなものは出てこなかったのですが, 過去に似た症例は存在していて(3.03から3.04に上がった時), 設定項目が変更されているのでその部分の対応でエラーを吐いているらしいです.(詳細は不明) 方法としては,現在配布されている3.05用辞書を修正するか,性能は下がるけど急辞書を使用するかすればいいようです.

ので,今回はtesseract3.05で,3.04用の辞書を使っています. 以下のコマンドを打つか,ダウンロードして直接格納して上げてください.

$ curl -L -o /usr/local/share/tessdata/jpn.traineddata 'https://github.com/tesseract-ocr/tessdata/raw/3.04.00/jpn.traineddata'

辞書の修正についてはそのうち機会があれば.

コマンドライン上での実行

tesseractはコマンドライン上で使うこともできます.

まずは文字が入っている適当な画像を準備します. 今回は次の画像をtest.pngとしました.(ワード自体に意味はないです)

f:id:teru0rc4:20170802213250p:plain

この画像を置いたディレクトリで以下のコマンドを入力して見てください.

$ tesseract test.png result -l jpn

tesseractは先ほどインストールしたtesseractを使うためのコマンドです. 第一引数でOCR対象の画像を指定します. 今回は先ほどの画像sample.pngを指定しています. resultというのは認識結果をどんな名前のテキストファイルで保存するかを指定しています.今回はresult.txtが生成されます -l jpnは辞書の名前です.今回は日本語の辞書を指定しています

上のコマンドを実行し,OCRを行なった結果がこちらです.

本 日 は晴天な り

不自然な半角スペースが入ってますが,これが認識結果ままです. こんな感じにささっとOCRができました.

PythonOCRをする(pyocr)

私は主にPythonであれこれすることが多いので,PythonOCRをする環境のメモも書いておきます.

pyocrのインストール

Pythonでtessetacを動かすためのラッパーライブラリをインストールします.

$ pip3 install pyocr

インストールはこれだけです.

実際のコード例

github.com

pyocr開発者様のGithubに非常に丁寧にのってますのでそれを拝借して解説します.

from PIL import Image
import sys

import pyocr
import pyocr.builders

tools = pyocr.get_available_tools() # OCRツールの有無の確認
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)

tool = tools[0]
print("Will use tool '%s'" % (tool.get_name())) # 使用するOCRツールの名前が出ます,変えたい場合は一個前の参照先を変えること

langs = tool.get_available_languages() # 使用できる言語の確認
print("Available languages: %s" % ", ".join(langs))

lang = langs[0]
print("Will use lang '%s'" % (lang)) # 使用する言語について

これは,pyocrを通して,tesseractなどが使用できることを確認するだけのプログラムです. 私の環境で実行したところ,以下のような結果が出力されました.

Will use tool 'Tesseract (sh)'
Available languages: eng, jpn, osd
Will use lang 'eng'

次にコマンドラインでやったような,画像のテキスト化をやるPythonプログラムです.

from PIL import Image
import sys

import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)

tool = tools[0]

txt = tool.image_to_string( # ここでOCRの対象や言語,オプションを指定する
    Image.open('test02.png'),
    lang='jpn',
    builder=pyocr.builders.TextBuilder()
)
print(txt)

12行目までは,tesseractの確認とそんなに変わりません. 大きく違うのは,tool.image_to_stringの部分です. 引数として画像(実行するディレクトリからの相対パスでもいいし,絶対パスでも大丈夫なようです),翻訳の言語,pyocr.builders.TextBuilder()で示されるOCRの際のオプションを指定することで,OCRの実行ができます.

実行すると引数として渡した画像のOCR結果を出力してくれます. 結果は変数txtに保存されているのでいろんな応用もできそうです.

kaggleについて

Kaggleの勉強会に参加することになったので,最低限の知識をつけるため書いていきます. コンペ参加までの流れを確認します. チュートリアルに実際に挑む話はまた今度.

Kaggleとは

データ分析の勉強やコンペが行われているサイトです. 分析内容やデータは様々で,それらに対し最適なモデルは何かを探り提出することで,分析の制度を競います. 中には賞金が絡んだものもあるらしいです,すごい.

大事なのは最適なモデルは何か,というところなので, 競技の環境は様々です. 例えば,PythonやRや,Excelなどでもいいようです.

世界中の人が挑んでいるデータ分析の課題が集まっているがKaggleなので, それだけでやってみる価値はあるのではないでしょうか?

Kaggleを始める

Keggleを始めるためには,Kaggleのアカウントを作らねばなりません.

www.kaggle.com このリンクからアカウント作成ができます.(既に持っている人は割愛,右上のlog inから) f:id:teru0rc4:20170726162248p:plain

ここからユーザIDやユーザネームやメールアドレスを登録,すると登録したメールアドレスに確認のメールが届くので,「activate」をクリックすると登録は完了です. f:id:teru0rc4:20170726162751p:plain

分析問題に挑む

Kaggleのアカウントが作れたので,続いて実際の課題に挑むところまでやってみたいと思います.

log inした状態でKaggle(https://www.kaggle.com)にアクセスすると以下の画面になると思います. この状態で上のバーから「Competitions」をクリックします. f:id:teru0rc4:20170726165638p:plain

するとこのように今行われているコンペの一覧が出て来ます(下にスクロールすると大量に出て来ます.) f:id:teru0rc4:20170726170007p:plain

ページの見方

これがコンペのページです. いろんなタブがあるのでざっくり解説します. f:id:teru0rc4:20170726170206p:plain

タブ名 機能
Overview コンテストの概要が書いてあります.
Description,Evaluation,Prizes,Timelineなど.
Data コンペで使用するデータセットです.
Kernels コンペごとに設けられたそのコンペに関する記事です.
誰かが挑んだ分析方法やその結果などがのってたりします.
Discussion コンペに関する議論の場です.
Leaderboard スコアボードです.順位等々が確認できます.
Rules より詳しいルールです.
Team コンペ参加後に追加される項目,自身所属するチームの情報などが載ってます.

チュートリアルに挑む

今回はチュートリアルであるTitanic: Machine Learning from Disaster(https://www.kaggle.com/c/titanic)に挑んでみたいと思います. 上で示した画像は同コンペの画面になります(Overviewの中身が多少違うのは賞金がかかったものではないためだと思われます)

上でも示した通り,私が挑んだ話はまた今度. DataタブのTutorialsの項目にはPython, R, Excelで挑んだ人が書いた手順書のようなものがあります. それを参考に識別器を作りましょう.

おわりに

雑に情報をまとめて見ました. 本当は並列して挑んでいてそこまで書こうかなと思ったのですが,長くなりそうなので分割です. ちなみに自分はPythonで挑んでます.

OCR(光学文字認識)について

本記事は,OCRをやってみたいなーっと思い始めた人の備忘録です. OCRとは何かから始まり,OCRを試す方法について調べたところまでまとめます.

コードとかはないです.ごめんなさい. 一応今後やる予定ではあります.

OCR(工学文字認識)とは

まずはOCR(Optical Character Recognition, 光学的文字認識)と呼ばれる技術について,簡単に説明をしたいと思います. OCRとは手書きや印刷された文字を,スキャナやカメラにより取得した画像などから読みとり,コンピュータ上で扱える文字に変換する技術のことを指します.

f:id:teru0rc4:20170716012626p:plain その手順は大きく4ステップに分かれています. 入力は上で軽く触れたように手書きや印刷された文字を画像化したものになります.

それらの画像に対して最初に行われるのがレイアウト解析です. 例えば新聞などを例に考えると,新聞の中には本文や見出しだけでなく写真などや緯線や罫線,枠などが存在します. これらの中でOCRの対象である文字を含む部分,本文や見出しなどの領域を解析します.

続いて行われるのは, レイアウト解析により文字があると判定された部分を行ごとに分けるステップです. 縦書きと横書きのケースとがあると思いますが, 個人的な感想ですが,横書きの方がいい制度が出るのかなという印象を受けました.

f:id:teru0rc4:20170716031556p:plain そして行ごとに分けられた文章を単語ごとに分解します. よく使われる手法としては横に広がる行に対して,上下方向にひいた線がどれくらい交わっているかを調べ,交わりっている部分が少ない部分を文字の切れ目と判定するという方法があるらしいです.(言葉にしにくいので何となく図にしました…) しかし,文字の感覚が狭かったり,この手法だけでは文字の境目だと誤検出してしまうような構造の文字もあるため, 正確に1文字1文字切り出すのは難しいそうです.

このような手順を踏むことで1文字1文字をデータ化し,行ごとにつなぎ直すことで文字全体のデータ化をしているらしいです.

OCRをためしてみる

そんなおCRを手軽(?)に試せる方法がいくつかあるらしいのでまとめました.

googleOCR

googleドライブからファイルをアップロードし,当該ファイルをgoogleドキュメントから開くことで,そのファイルに対してOCRを行なってくれるらしいです. パパッと使うならこれで十分そうです.

tesseract-ocr

tesseractとはGoogleで開発されているOCRエンジンです.(ここまで書いて上のgoogle Driveもtesseract使ってるんだろうなと気がつきました…)

各種言語からの呼び出しもできるようです. Pythonではpyocrというラッパーモジュールが存在しました.

まとめ

雑にOCRについて調べました. tesseractとpyocrについては今後使って見たいのでまた更新します.

おわりに

ブログ書きたいと思いつつ最近はいろんなことの調べごとの方が多くなってきたので,せっかくだしコード以外の調べごとも書いておこうということで書いてみました. とりあえずOCRについてでした. まとめの通り,近々コードに起こしたいですね….

virtualenvの使い方

備忘録. 新規性は全く無いけど,今後も使う可能性が高いので書いておきます.

Python仮装環境をまるっと作ることができるvirtualenvの準備から使い方までまとめておきます. よく一緒に話に上がることが多いpyenvとpyenv-virtualenvについても,名前と違いだけ触れておきます.

virtualenv

virtualenvとは/インストー

Pythonでの仮想環境を作成,管理できるパッケージです. パッケージなのでインストールではpipを用います(詳細は後述) これを用いる一つのメリットとして,同一バージョンだけど異なる環境を複数作成することができます

python3系の場合は以下のコマンドからインストールできます.

$ pip3 install virtualenv

pip3 listをして,virtualenv (xx.xx.xx)と追加されてれば完了です.

使ってみる

実際に使ってみます.今回はenv_test01という名前の環境を作ります.

$ virtualenv env_test01

これだけです.するとenv_test01というディレクトリができていると思います.この中にPythonの環境がまるっと入っている形になります.(いらなくなれば全部削除すればいいわけです) 上でも述べたように,virtualenvのメリットとして同一バージョン間の異なる環境構築が手軽にできるという点があります. 名前を変更してやればそのぶんだけ環境が作れるわけです.

オプションを指定しなければvirtualenvをインストールした環境と同じ環境が構築されます. 指定する場合は

$ virtualenv env_test02 -p python2.7

というふうにすると,異なるバージョンの環境を構築できます.

では作った環境を使って見ましょう. ディレクトリを移動して,bin/activateを対象に以下のコマンドを入力します.

$ cd env_test01
$ cd bin
$ source activate 

一行でsource env_test01/bin/activateでもいいとおもいます. すると先ほど作ったまっさらな環境に入ることができました. あとは好きにするだけです.

最後に入った環境の閉じ方だけ紹介して, 使い方解説は終了です,お疲れ様でした.

$ deactivate 

参考に私の環境での実行での様子を載せておきます. f:id:teru0rc4:20170627162950p:plain

似ているのの紹介

上で名前だけあげたpyenvとpyenv-virtualenvについて,名前と違いだけ触れておきます(個人的な備忘録)

pyenv

virtualenvと同じくPythonでの仮想環境を作成,管理できるパッケージです. 歴史的にはvirtualenvのが古いらしいです. バージョンが異なる環境を作れますが,モジュールを管理しているディレクトリが共通なので, 同一バージョン間で異なる環境がこれ単体ではできません. それを解決するのがpyenv-virtualenvのようです.

pyenv-virtualenv

pyenv-virtualenvはpyenvのプラグインになります. virtualenvとは無関係です(私も事前調査で混乱しました.混同して説明されているケースもあるので注意). これを使うことで,モジュールを別々のディレクトリで管理できるようになり,同一バージョン間で異なる環境が立てられるようになるようです.

終わりに

必要になって書いたのがひと月以上前なのですが,最後の使ってみる部分の記述をずっとしてなくて, ふと思い立って一気に書き上げました.

やりたいことを成すための調査→事前知識まとめ/方法決定→実行→ブログに起こす,までのステップで最後の部分をしっかりやりきることが少なく, これからはちゃんと最後までやりきりたいなーと感じたので, とりあえずここからやっていきます.

Pythonでwebアプリを作ってみる その2(SimpleHTTPServerを使う)

前回(Pythonでwebアプリを作ってみる その1 - しゃちの備忘録)の続きです.

SimpleHTTPServerを用いてシンプルなWebサーバを作って見ました. 個人的に忙しかったり,記事が消えたりしましたが私は元気です.

今回の目標

SimpleHTTPSerbverで,サーバーを立ち上げて何かを表示できるようになる.

Webサーバとは

Wikipediaによると以下の通り.

Webサーバ(ウェブサーバ)は、HTTPに則り、クライアントソフトウェアのウェブブラウザに対して、HTMLやオブジェクト(画像など)の表示を提供するサービスプログラム及び、そのサービスが動作するサーバコンピュータを指す。 広義には、クライアントソフトウェアとHTTPによる通信を行うプログラム及びコンピュータ。

クライアントからのリクエストに基づいて,なんらかのデータを返すのがサーバの仕事のようです. PythonではDjangoなどが有名だと思います.

SimpleHTTPServerでWebサーバを立てる

とりあえず,HTTPリクエストを返すシンプルなWebサーバを作成するということで,SimpleHTTPServerを使って見たいと思います. Pythonに標準モジュールとして入っているので,準備の手間が省けるのもポイントです.

なお今回は,Python3系を使用しています. 少しだけPython2系の場合にも触れますが,基本的にはPython3系で話を進めて行きます.

Pythonを起動し,コンソールに以下のコードを入力して見ましょう.

>>> import http.server
>>> http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler)

すると以下のような画面になります. f:id:teru0rc4:20170530145838p:plain

この状態でhttp://localhost:8000にアクセスして,ディレクトリリスト(じゃない場合もあり得る?)が見えていたらひとまずOKです..

ここまでの段階で,上で入力したコードにより,localhost(自分のPC)8000番ポートにサーバが建てられ, 上記アドレスにアクセスすることで,そこの状態が確認できる,と言った状態になりました. 特に指定しなければ,ポートは自動的に8000,が割り当てられます. もしサーバのポートを指定したい場合は,http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler, port=8001)と言った風に最後にport = *****といった記述を追加してあげて下さい. 特にサーバに関しての設定等を行なっていないので,ひとまずは自分のディレクトリの中身がみれるという状態になります.

本当に最低限ではありますが,これでサーバ立てはできました. 建てたサーバの停止方法は,Ctrl + Cになります.これをしないとこれ以降サーバを建てる時に前回以前の建てたサーバが残ってしまい,指定したポートにサーバを立てられないことが起こるので気を付けましょう.(その場合,サーバの当該プロセスを探してkillすればいいので,そこまで焦る必要もないです.方法は後述)

ワンライナーでサーバを起動する方法

もう一つ,SimpleHTTPServerでサーバをささっと立てる方法を記述しておきます. 先ほどはPythonのプロンプト場での入力でしたが,今回はPythonプロンプトを立ち上げる前の段階でのコマンドになります.

$ python3 -m http.server

このようにすると上と同じようにサーバを構築できます,ポート番号を指定したい場合はpython3 -m http.server 8001のようにするとできます.

サーバがうまくたたち上がらない場合

上で述べたコマンドを実行した場合に,下のようにAddress is already in useと出ることがあります. f:id:teru0rc4:20170530151328p:plain

このようなメッセージが出る場合,サーバを立てようと指定したポートにすでにサーバが立ち上がっている(前回以前にちゃんとkillできていなかった)ことが起きています. なので,残ってしまっているプロセスをキルしてあげる必要があるのです.

立ち上がっているサーバのプロセスをキルしたい場合

psコマンドを使うことで,現在立ち上がっているプロセスの確認ができます. f:id:teru0rc4:20170612153313p:plain

その中にhttp.server ****(****はポート番号)というプロセスがあるはずです. 今回はこのプロセスをキルします. 該当プロセスのPID(プロセスID)を確認し,kill -15 *****と入力します. -15とすることで,プロセスの強制終了ができます.

今回の例では以下のような感じになってます. キルが実行され,該当プロセスが消えているのがわかると思います. f:id:teru0rc4:20170612153622p:plain

おわりに

この後どうしようかなーと思っていたのですが,そのうちにひと月経ってしまったので, ひとまずここまで公開します.

次は立てたサーバで何か動かすところからやりたいと思います.

追記

SimpleHTTPServerで作業する内容もう少し続くのかなと思ったら動的なものを作ろうと思ったら使わなそうなので, そのあと調べたことを追記してSimpleHTTPServer関連の話はここで打ち切りたいと思います.

サーバアクセス時の処理について

今回使用したSimpleHTTPSerbverを上のような手順で使用した際,サーバ立ち上げたときディレクトリのリストが出力されたと思います.(厳密には現在の作業ディレクトリのリスト)

これはSimpleHTTPSerbverに, サーバを立てた時のディレクトリに「index.html」,「index.htm」がある場合,それらを開く. ない場合はディレクトリリストを開くという実装になっているからです.(ので前回は~/のディレクトリリストが取得されたのです)

詳しい話はdo_GETの中(send_head)に定義されていました. github.com

index.html以外を開く場合はそれようのオプションもあるので,困ることはないと思います. ので,実際にディレクトリリスト以外を表示するところまでやって見たいと思います.

index.htmlを記述し動かす

今回は以下のようなファイルを作成しました. ファイル名はindex.htmlとしてください.

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>SampleHTML</title>
  </head>
  <body>
    <p>Python is awesome!</p>
  </body>
</html>

またサーバーを起動するスクリプトも,ファイルに保存してしまいたいと思います. ***.py(***は何でも良い,今回は暫定的にserver.pyとして話を進めます)という名前で保存します.

import http.server
http.server.test(HandlerClass=http.server.SimpleHTTPRequestHandler)

これら2つのファイルを同じディレクトにいれ保存してあげてください. f:id:teru0rc4:20170711154241p:plain

そして,server.pyを実行します.

$ python3 server.py
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

f:id:teru0rc4:20170711154602p:plain

するとこんな風に先ほどindex.htmlに記述されたwebページが出力されました. このようにindex.htmlを表示するだけですがこれでwebサーバが建てられました.

しかし,これでは静的な変化のないサイトの記述しかできません. 次回は動的なサイトを記述できるよう,別のモジュールを使いたいと思います.