tornadoでHTTPSのウェブページを作ってみた。

かなり久しぶりの更新です。。
サボり気味だったので一応生存確認と言う事で今回もtornadoの記事です。
せっかくtornadoを使ってWebページを公開するところまでやったので
最低限のHTTPSの実装もやってみました。

以下その時の覚書です。

事前準備

オレオレ証明書の作成

HTTPSの実装で必要不可欠である証明書の類のものを準備します。
準備はとっても簡単、下記コマンドを打つだけでOK。

$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

tornadoスクリプトHTTPS仕様にする

tornadoの公式に落ちているコードをHTTPS仕様にしてみました。
※一部抜粋

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(make_app, ssl_options={
        <b>"certfile":"server.crt"</b>,
        <b>"keyfile":"server.key"</b>,
    })
    http_server.listen(<b>8443</b>)

import tornado.httpserver
import tornado.ioloop
import tornado.web
全体のコード
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("../static/test.html")

make_app=tornado.web.Application([
        (r"/", MainHandler),])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(make_app, ssl_options={
        "certfile":"server.crt",
        "keyfile":"server.key",
    })

    http_server.listen(8443)
tornado.ioloop.IOLoop.current().start()

以上でtornadoでのHTTPS実装でした。

SSHの公開鍵認証の設定手順

個人的にLinuxサーバを利用する機会があり
その時に公開鍵の設定を行ったので手順を残す。

各種環境

クライアントPC:Mac book air
サーバ:Conoha VPS Ubuntu 14.04.5

クライアント側で鍵の生成

クライアントPCで秘密鍵と公開鍵の生成を行います。
鍵生成コマンドを2種類ありますが今回はRSAで生成を行います。

$ ssh-keygen -t rsa

実行すると対話式で鍵の保存場所やパスフレーズを聞かれますので
任意の設定を行う。

問題なく鍵が生成されたか確認を行う。

$ cd ~/.ssh/
$ ls id*
id_rsa		id_rsa.pub

上記のように「id_rsa」と「id_rsa.pub」が生成されていればOK
ちなみに「id_rsa」が秘密鍵で「id_rsa.pub」が公開鍵である。
くれぐれも秘密鍵が外部に漏れないように注意してほしい。

サーバに公開鍵を登録する。

先ほど生成した公開鍵をサーバに登録するので
scpコマンドでサーバに公開鍵を転送させる。

scp -r ~/.ssh/id_rsa.pub root@<サーバのIPアドレス>:/root/

とりあえずサーバの/root/直下に転送。
そこからサーバの「authorized_keys」に公開鍵を登録する。

# ls /root/
id_rsa.pub
# cat id_rsa.pub >> ~/.ssh/authorized_keys
# chmod 600 ~/.ssh/authorized_keys
# logout
$ ssh -p 22 root@<サーバのIPアドレス>

lsコマンドで/root/に公開鍵が転送されているのを確認し、
authorized_keysに登録する。
その後、パーミッションの変更を行い一度サーバからログアウトする
再度sshコマンドでログインを試みる。

Python3 Jupyter Notebook導入メモ

前回TensorFlowのセットアップ記事を書いたので
今回はTensorFlowで試行錯誤する際に便利な
Jupyter Notebookを導入してみようと思います。

下記コマンドでインストール行う。

$ pip install jupyter

そして起動。

$ jupyter notebook

うまく動作すればブラウザが起動して、Jupyter Notebookが
表示されるはずです。
f:id:kyamisama:20180923114022p:plain

今後使い方についても書いていこうと思います。

TensorFlowのインストールから簡単な計算までやってみる。

先日書店にて入門書向けの深層学習の導入本を購入したので
TensorFlowの導入メモを残してみる。

深層学習とはなにか

今更このような事を説明するのは無粋だと思う。
何しろこの手の情報はネットや書籍がごまんと転がっているからだ。
それでも私のアウトプットとして役だって貰うため説明させていただく。

深層学習 ディープラーニングについて

深層学習とは、多層構造のニューラルネットワークを用いた機械学習のことである。
今でこそ人気の分野であると世間に知れ渡っているが、その火付け役となったのは
2012年に開催された画像認識コンテストだと言われている。
この大会は大規模な画像認識・分析をソフトウェアで行わせる。
具体的にはImageNetで公開されている飛行機やピアノなどの
様々なものが写っている写真データを学習させ、
写真に何が写っているか認識させ、その精度を競うものだ。
そして、この年にカナダ・トロント大学チームが深層学習を利用して
2位のチームを大きく引き離して優勝したのだ。

深層学習の特徴(手法)について

深層学習の手法は、それ以外のものを比べて大きく異なる点がる。
それは特徴量の抽出だ。
従来の手法だと人間が特徴量を指定する必要があったが、
深層学習では学習データから気概が自動的に特徴量を抽出する。

TensorFlowについて

TensorFlowはGoogleオープンソースで公開している機械学習ライブライアである。
深層学習を始め、いろいろな機械学習に利用できる。
機械学習ではこのライブライの人気がとても高いので資料も充実している。
機械学習の導入としては打って付けだろう。

TensorFlowのインストールを行う

ここまで話が長くなったが早速TensorFlowをインストールしていく。
ちなみにTensorFlowはWindowsにはインストールが出来ない。
もしWindowsでTensorFlowを利用したいのであればDockerやWMware上で
Linuxを動かし、そこにインストールする事をオススメする。

今回はmacを使ってインストールを行う。
その前にPyenvを使ってAnacondaをインストールしておく。

$ pyenv install anaconda3-4.1.1
$ pyenv global anaconda3-4.1.1
$ pyenv rehash

ここからTensorFlowのインスール

$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.10.0-py3-none-any.whl
$ pip install --upgrade $TF_BINARY_URL

それでは無事にTensorFlowがインストール出来たか確認してみよう。
以下のように「hello」が表示されていれば問題ない。

$ python
>>> import tensorflow as tf
>>> sess=tf.Session()
>>> hello=tf.constant("hello")
>>> sess.run(hello)
b'hello'
>>> 

TensorFlowで簡単な計算をさせてみる

とりあえずサンプルコードを実行してみる。
うまく動作すれば「6234」と値が返ってくるはずだ。

$ cat calc1.py 
# Tensorflowを取り込む
import tensorflow as tf

# 変数a,bに数字を代入
a = tf.constant(1234)
b = tf.constant(5000)

# 計算式を定義
add_op = a + b

# セッションを開始
sess = tf.Session()
res = sess.run(add_op) # 式を評価
print(res)

実行結果

$ python calc1.py 
6234

Tornadoを使ってHTMLページを表示させる

前回の記事の続きでTornadoを使ってHTMLページを表示させたいと思います。
ただ今回は前回と違って、ヒアドキュメントを使ったHTMLの表示ではなく
TornadoからHTMLファイルを呼び出す事で表示させます。

Tornadoファイルの用意

それでは前回記事で使ったTornadoファイルのヒアドキュメント部分を
削除したものを用意します。
このプログラムは実行するとブラウザに”hello world”の文字列を返えします。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello,world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

HTMLファイルの用意

HTMLファイルはネットで適当に転がっているサンプルを使用します。

<!DOCTYPE html>
 <html>
   <head>
   </head>
    <body>
     <p>hello,world</p>
    </body>
 </html>

Tornadoのstaticpathを使って静的ファイル(HTMLファイル)を指定する

参考URL:https://sites.google.com/site/tornadowebja/documentation/overview
上記URLを参考にしてTornadoファイルを変更していきます。
まず、def make_app():を下記コードのように変更します。

def make_app():
    settings = {
    "static_path": os.path.join(os.path.dirname(__file__), "static"),
}
    return tornado.web.Application([
    (r"/", MainHandler),
], **settings)

これでstaticpathの設定は完了です。

次にlocalhost:8888にアクセスした際にHTMLファイルを見に行く設定を行います。
MainHandler内を下記コードのように変更します。

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("static/E4.html")

これでTornadoファイルを保存して実行してみます。
問題なければ正常にHTMLファイルが表示されます。

Python3でfizz buzz問題やってみた

fizz buzz問題は私が本格的にPythonの勉強をし始めた頃に
一番最初に取り組んだ課題です。
なので今回は備忘録ではなく、ただの日記です。(笑)

Python3でfizz buzz問題をやってみる!

プログラミングの勉強をしていてよく耳にする「FizzBuzz問題」ってのをやってみました。
ここで一言、勘違いしてもらっては困りますので言っておきますが、
FizzBuzz」とは元は長距離ドライブ中や飲み会の時に行われる言葉遊びなのです。
その遊びをプログラムの問題としたのが「FizzBuzz問題」と言うわけですね。

そもそもFizzBuzzって??

wikiによると下記のような遊びのようです。
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。
次のプレイヤーは直前のプレイヤーの次の数字を発言していく。
ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、
5で割り切れる場合は「Buzz」、両者で割り切れる場合
(すなわち15で割り切れる場合)は
Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を
数の代わりに発言しなければならない。
発言を間違えた者や、ためらった者は脱落となる。

実際にFizzBuzz問題に挑戦!!

先ほどご紹介した通り、3で割り切れる場合は「Fizz」、
5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は
Fizz Buzz」と表示されるようにプログラムを組めばいいわけです。

1から100までやると表示が長くなるので20までにしておきます。
下記にプログラムコードと実行結果を紹介します。

for i in range(1,21):
    if i % 15 == 0:
        print("fizzbuzz")
    elif i % 3 == 0:
        print("fizz")
    elif i % 5 == 0:
        print("buzz")
    else: 
        print(i)

で下記が出力結果ですね。

1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz

とまぁこんな感じでしょうか。
もっとスマートにプログラムを書けるよって方は是非ともコメントで
教えて欲しいですね!!

それでは今日はこの辺で!
昨日に引き続きブログ1記事更新完了!!
さて、いつまで続くやら。。

Python3でTornadoを動かしてみる

久しぶりの更新ですね。やっぱり習慣化してないとブログ書くのも大変ですね。。。
なので頑張って習慣化する為、1記事書きます!
内容は今勉強中のTornadoについてです。

Tornadoとは?

そもそもTornadoってなんでしょう?
Webフレームワークの一つですね。公式サイトは以下からどうぞ

http://www.tornadoweb.org/en/stable/#

公式サイトによると、

TornadoはFriendFeedで開発されたPythonのWebフレームワーク(非同期通信ライブラリ)です。
ノンブロッキングネットワークI / Oを使用することで、Tornadoは数万のオープン接続に拡張でき、
ロングポーリング、WebSocket、および各ユーザーへの長時間の接続が必要なその他のアプリケーションに最適です。

とあります。
つまりどゆこと??ってなりますよね。
とりあえず以下の特徴があるんだな程度の認識を持って頂ければよいかと。

FriendFeedが開発(Facebook社)
・Python2系, Python3系, PyPyで動作する
・シンプルだから高速に動作する
・テンプレートエンジンが同梱されている
・シングルプロセス、シングルスレッド

特にパフォーマンスに関しては目を見張るものがあります。
以下にベンチマーク結果を紹介しておきます。
Wiki参照です。
https://ja.wikipedia.org/wiki/Tornado_(Web%E3%82%B5%E3%83%BC%E3%83%90)

f:id:kyamisama:20180910181932p:plain

Tornadoのインストール

以下コマンドでTornadoをインストール

$ pip install tornado

Hello Worldを表示させる

公式サイトにサンプルソースコードが紹介されているのでそのままコピペして動かしてみる。

import tornado.ioloop
import tornado.web
 
	class MainHandler(tornado.web.RequestHandler):
    	def get(self):
        	self.write("Hello, world")
 
	def make_app():
    	return tornado.web.Application([
        	(r"/", MainHandler),
    ])
 
	if __name__ == "__main__":
    	app = make_app()
    	app.listen(8888)
    	tornado.ioloop.IOLoop.current().start()

簡単にコードを簡単に説明する。

class MainHandler(tornado.web.RequestHandler):
    	def get(self):
        	self.write("Hello, world")
    
RequestHandlerクラスのgetメソッドを継承し、HTTPリクエストGETが来た場合
self.writeにより”Hello World”を表示する。
    
def make_app():
    	return tornado.web.Application([
        	(r"/", MainHandler),
    ])

r"/"のrは正規表現を表す。"/"は現在の階層を差す。つまりカレントディレクトリである。
なのでlocalhost/にブラウザからアクセスするとMainHandkerクラスが呼ばれ、アクセスがGETであれば
Hello Worldをブラウザに表示する仕組みだ。

HTMLページをブラウザに表示させる

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('''
	<!DOCTYPE html>
	<html>
	<head>
	</head>
	<body>
	<p><font size="10" color="#00ff00">Test!</font></p>
	</body>
	</html>
''')

class MainHandler2(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, samurai")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
	(r"/test/", MainHandler2),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
tornado.ioloop.IOLoop.current().start()

サンプルコードにヒアドキュメント形式でHTMLをPythonプログラム内に埋め込んでいる。
実行して頂ければ分かると思うが、これでも一応HTNLを表示することは出来る。

おそらくこのような方法でHTMLを表示させたいんじゃないんだ!!って方が多いと思いますので
次回TornadoプログラムからHTMLファイルを呼び出す方法をご紹介したいと思います。

それでは今回ははここまでです。
閲覧しに来てくださった方ありがとうございました。