TomoProgの技術書

底辺プログラマーが達人プログラマーになるまで

Djangoを使って掲示板を作ってみる Part0

皆さん
こんにちは、こんばんは
TomoProgです。

GWも最終日となりました。
皆さんはどのように過ごしましたか?

私は3泊4日で福岡に旅行に行ってきました!!
博多ラーメン、モツ鍋も食べれたし、太宰府にも行けたので、満足いく九州旅行でした。

それはさておき、前のブログでDjangoを使ってWebアプリを作るという目標を掲げたので、どんなWebアプリを作るのかをここに書いておこうと思います。

それでは頑張っていきましょう。

どんなWebアプリを作るの?

まずはどんなWebアプリを作るのかですが、
Python質問掲示板」
を作成したいと思います。

質問掲示板と書いてありますが、基本的にPythonに関する情報なら何でも有りにしようと思います。

なんで作ろうと思ったの?

理由としては、

  1. Pythonの情報は英語が多いので、日本語でも気軽に情報交換できるサイトが欲しい。
  2. PHPPerlを用いた掲示板作成は多いが、Python掲示板を作ったという情報は見かけない。
  3. 掲示板作成を通じて、Djangoの使い方やDB設計などを経験し、自分自身のスキルを磨く。

それらしいことを理由としてあげていますが、
作ってみたいなと思ったから作る。
これが全てだと思います!!

期間は?

2ヶ月を目標にしようと思います。

最後に

実は一度掲示板を作成しましたが、挫折しました。
今回はとにかく動くものを目指して頑張っていこうと思います。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

Django + Apache + mod_wsgiでWebサーバを構築してみた

皆さん
こんにちは、こんばんは
TomoProgです。

気がつけばもう4月も最終日。
この4月に書いた記事数を見てみると、

YouTubeを禁止した記事しか書いてなかったんですね。

毎日書くと言っていた日々は何だったのか。
もうそんなことは知りません。笑

長々とした前置きは置いておき、
今回はUbuntuDjangoApache、mod_wsgiを使ってWebサーバを構築してみました。

それでは頑張っていきましょう。

DjangoApache?mod_wsgi

そもそも、DjangoApache、mod_wsgiってなんぞやという人も多いと思うので、自分の整理のためにも簡単に説明してみようと思います。

  • Django(ジャンゴ)とは

DjangoPythonで書かれたWebフレームワークの1つです。
PythonのWebフレームワークは数多く存在しますが、その中でもフルスタックのWebフレームワークなのが特徴的で、Webアプリを作成するために必要な機能はDjangoだけでほぼ実装できるみたいです。
かなり多くの機能を提供してくれるのですが、なんと無料で使用できます。
ちなみに読み方は「ジャンゴ」です。
「ディージャンゴ」と読んだ人は私と同レベルです。笑

  • Apache(アパッチ)とは

Webサーバソフトウェアの1つです。
ほとんどのWebサービスはこのApacheで動いているのではないかと思っています。
初版は1995年に公開されたらしいです。
20年以上経った今でも多くの人が使用しているのは驚きですね。
ちなみにApacheDjangoと同じで無料で使えます。

  • mod_wsgi(モッドウィズギィ)とは

mod_wsgiPythonプログラムをApache上で動作させるために必要なモジュールです。
ApacheDjangoで作ったWebサービスを公開するときに使用します。
こちらも無料で使用可能です。

必要なものをインストールする

さて、使用するソフトやモジュールの紹介も終わったので、早速Ubuntuにインストールしていきましょう。

まずは、WebサーバソフトウェアであるApacheをインストールします。
ターミナルを開いて、以下のコマンドを入力します。

$ sudo apt-get update
$ sudo apt-get install apache2
$ sudo apt-get install apache2-dev

構築した環境にブラウザからアクセスして以下のようなサイトが出てきたらApacheのインストールは完了です!!
f:id:TomoProg:20160430111459j:plain

次はDjangoをインストールしていきましょう。
Djangoは仮想環境で構築したいので、毎回お世話になるvirtualenvを入れていきます。

$ sudo apt-get install python3-pip
$ sudo pip3 install virtualenv

virtualenvがインストールできたところで、仮想環境を作成し、仮想環境に入っておきます。
WebAppの部分は任意で構いません。

$ virtualenv --no-site-packages WebApp
$ cd WebApp
$ source bin/activate

(WebApp)がターミナルの先頭に表示されれば仮想環境に入れている状態です。
(virtualenvコマンドでWebAppの部分を変更した人はその変更した名前になっていればOKです。)

さて、仮想環境も出来たので、Djangoをインストールします。
と言っても仮想環境内でたった一行入力するだけです。

$ pip install django

djangoがインストール出来たかどうかはインタラクティブシェルを起動して、以下のコードを入力します。

>>> import django
>>> django.get_version()

インストールしたdjangoのバージョンが表示されればOKです。

  • mod_wsgiをインストール

あとはmod_wsgiに関するモジュールをインストールしていきます。
こちらも仮想環境内でインストールします。

$ pip install mod-wsgi
$ pip install mod-wsgi-httpd

インストールに少し時間がかかるので、気長に待っていてください。

これで必要なものはすべてインストール完了です。

Djangoを使ってWebアプリを作成する

必要なものをすべてインストールしたので、次はDjangoを使用した時に出力されるIt Worked!のページを出力してみます。

まずは、仮想環境内でDjangoプロジェクトを作成します。
mysiteの部分は任意のプロジェクト名で構いません。

$ django-admin startproject mysite

プロジェクトのディレクトリが作成されていれば成功です。

あとは上記で作成したDjangoプロジェクトを以下のコマンドで80番ポートで起動させます。

$ cd mysite
$ sudo ../bin/mod_wsgi-express start-server --port=80 --user=djangowebserver mysite/wsgi.py

userに指定するユーザはログインしているユーザの名前を入れておけば大丈夫みたいです。

もし、Apacheが起動している場合は80番ポートが既に使用されているためエラーになると思います。
その場合は以下のコマンドでApacheを一度止めてから、上のコマンドを試してみてください。

$ sudo service apache2 stop

さて、ブラウザでアクセスしてみると・・・
f:id:TomoProg:20160430140445j:plain

It Worked!!
Djangoが80番ポートで起動出来ました!!

まとめ

Django + Apache + mod_wsgiを使ってWebサーバを構築出来ました。
これを使って何かWebアプリを作成する予定です。

Djangoは公式ドキュメントも充実しているので、Python使っている人でWebフレームワーク使いたいという人はDjangoを使ってみてはどうかと思います。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

YouTube禁止令を発動してみた

皆さん
こんにちは、こんばんは
TomoProgです。

前回書いたブログが3月20日
今日は4月3日。

久しぶりの更新です。

今週一週間は頑張ろうとか書いた記事は完全に意味が無かったですね。
過ぎたことは流しておきましょう・・・

それはさておき、

今回はChrome拡張機能YouTubeを禁止してみました。

それでは頑張っていきましょう。

Chrome拡張機能を勉強する

まずはChrome拡張機能を自分で作れないと話にならないので、勉強することにしました。

勉強にはドットインストールの動画を使用するのが効果的でした。
http://dotinstall.com/lessons/basic_chrome_v2dotinstall.com

Chrome拡張機能には目的に合わせて4つの機能があるみたいです。

・Browser Action
ツールバーに常駐し、いつでも起動することが出来る
・Page Action
特定のページで起動することが出来る
・Content Scripts
特定のページで自動で実行する
・Context Menu
右クリックメニューから起動することが出来る

これら4つの機能すべてを動画で簡単に説明しているので、動画を一通り見れば簡単な拡張機能は作れるようになると思います。

どんな拡張機能を作るか考える

さて、勉強が終わったところで、どんな拡張機能を作るかを考えてみます。

私が思いついた禁止する方法は、

  • YouTubeのサイトを開けなくする。
  • YouTubeのサイトを開いたときに自動で違うページに飛ばしてしまう。

この2つでした。

今回は後者の機能を実装してみたいと思います。

実際に作ってみる

勉強も終わり、実装したい機能も考えたので、あとは実際に作るだけです。

自動で違うページに飛ばす方法が良く分からなかったので、以下のサイトを参考にさせていただきました。
stackoverflow.com

以下の3つのスクリプトが今回の拡張機能に使用するスクリプトです。

manifest.json

{
    "name": "Stop YouTube",
    "version": "0.1",
    "manifest_version": 2,

    "description": "YouTubeのサイトを開くとGoogleホームページへ飛びます。",

    "permissions":[
        "tabs"
    ],

    "background": {
        "scripts": ["background.js"]
    },

    "content_scripts": [
        {
            "matches": ["https://www.youtube.com/*"],
            "js": ["myscript.js"]
        }
    ]
}

background.js

chrome.runtime.onMessage.addListener(function(request, sender) {
    chrome.tabs.update(sender.tab.id, {url: request.redirect});
});

myscript.js

chrome.runtime.sendMessage({redirect: "https://www.google.com"});

manifest.jsonChrome拡張機能のタイトルなどのメタ情報を書いておくjsonファイルです。

基本的にはbackground.jsに指定したページへ移動させるスクリプトを書いておき、myscript.jsに移動したいURLを記述しておきます。

また、myscript.jsが起動するサイトはmanifest.jsonのmatchesに指定したサイトにアクセスしたときに起動するようにしています。

文章にしてみるとあまり詳しいことは分かっていないことが露呈しますね・・・。

あとは上記の3つのスクリプトを一つのフォルダにまとめて、Chrome拡張機能として追加するだけで、簡単にYouTubeを開いたときにGoogleのホームページに飛ばすことができました。

まとめ

今日はChrome拡張機能を自作してみました。

これでYouTube生活からおさらば出来ると信じています。

拡張機能をOFFにしなければ・・・

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

今週は頑張ろうかな

皆さん
こんにちは、こんばんは
TomoProgです。

前回書いたブログが3月12日。
気付けば約1週間ほど放置状態でした。

なぜなら・・・

書くネタが全く思い浮かばなかったから!!

1週間放置してネタが思いついたわけではありませんが、今週はブログ更新できるように頑張ろうと思います。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

Vimに自作コマンドを組み込んでみた

皆さん
こんにちは、こんばんは
TomoProgです。

今回は私がPythonのプログラムを書き始めるときに、ほぼ毎回書くコードをVimコマンドで自動入力できるようにしてみました。

それでは頑張っていきましょう。

毎回同じことを書くのは面倒くさい

私がPythonのプログラムを書いているとほぼ毎回書くコードがあります。
それがコチラ

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

def main():

if __name__ == "__main__":
    main()

コマンドラインから実行した際に、main関数からプログラムがスタートするように、このコードをほとんどのPythonプログラムで書きます。

1度や2度書くくらいなら何とも思わない量なのですが、Pythonプログラムを作るたびに、毎回毎回書くのは面倒です。

というわけで、この6行をVimのコマンドで入力できるようにしてみます!!

自作コマンドをVimScriptで作成する

Vimで自作コマンドを作る場合はVimScriptというVim専用のスクリプトを使用します。
他のプログラム言語を触ったことがある人は割りと簡単に習得出来そうです。

それでは早速、VimScriptで自作コマンドを作っていきます。

私が作成したコマンドがコチラ

:command! -nargs=1 PyTemplate call PyTemplateFunc(<f-args>)

function PyTemplateFunc(template)
    if a:template == "main"
        :r ~/.vim/mycmd/py_template/main.py
    elseif a:template == "docstr" || a:template == "ds"
        :r ~/.vim/mycmd/py_template/docstr.py
    else
        echo("Nothing Python Template.")
    endif
endfunction

1行目の:commandで始まる行がコマンドを定義している部分です。
今回はPyTemplateという名前でコマンドを定義しました。
コマンドを実行すると、PyTemplateFunc関数が呼び出されるようになっています。

PyTemplateFunc関数の中身を見てみましょう。
templateの中身(PyTemplateコマンドに渡した引数)がmainであれば、main.pyを読み込むようになっています。
ついでにドキュメンテーション文字列のサンプルもコマンドで入力できるようにdocstrの場合はdocstr.pyを読み込みます。

main.pyとdocstr.pyの中身は以下の通りです。

# main.py
#-*- coding:utf-8 -*-

def main():

if __name__ == "__main__":
    main()
# docstr.py
""" This is a documentation string sample

Please Write Desciption

How To Use:
    import sample
    help(sample)
"""

.vimrcにコマンドを登録する

自作コマンドが完成したので、Vimから呼び出せるように.vimrcを編集します。
:sourceの後に作成したVimコマンドファイルのパスを指定します。

:source ~/.vim/mycmd/py_template/py_template.vim

実際にやってみる

登録も出来たので、実際にVimコマンドラインモードで自作コマンドを実行します。

:PyTemplate main

ドキュメンテーション文字列のサンプルを入力する場合は

:PyTemplate docstr
もしくは
:PyTemplate ds

両方実行してみた結果がコチラ

実行結果:
#-*- coding:utf-8 -*-

""" This is a documentation string sample

Please Write Desciption

How To Use:
    import sample
    help(sample)
"""

def main():

if __name__ == "__main__":
    main()

どちらも入力することが出来ました!!

今日の成果

  • Vimの自作コマンドを作成できた!!
  • Pythonプログラムの毎回書く部分を自動化できた!!

今回はVimの自作コマンドを作って、毎回の作業を効率よくしてみました。
これから少しだけPythonでのプログラム作成が快適になりそうです。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

応用情報技術者試験まで残り38日となりました

皆さん
こんにちは、こんばんは
TomoProgです。

一ヶ月くらい前にこんな記事を書きました。
tomoprog.hatenablog.com

そうです。
実は応用情報技術者試験に申し込んでいたんです。

タイトル通り応用情報技術者試験まで残り38日・・・。



全く勉強していない!!



というわけで、残り38日間勉強します。

それではまた〜

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

サイコロの目が6分の1の確率って本当!?

皆さん
こんにちは、こんばんは
TomoProgです。

なんか昨日一日で約50PVぐらいされたようで、今月も100PVを達成出来ました!!
多くの人に見ていただけるのは非常にありがたいことです。
これからもマイペースに記事を書いていけたらと思います。

今回はサイコロの確率をPythonで計算してみました。

それでは頑張っていきましょう。

6回振れば1回は出るって本当?

ふと思ったんです。
サイコロを振って指定した目が出る確率は6分の1です。
でも、実際に6回振っても出ないときもある・・・

じゃあだいたい何回振れば6分の1になるんだろう?

今回はこんな疑問をPythonで解いていこうと思います。

サイコロプログラムを書く

まずはサイコロをプログラムで書いてみます。

#-*- coding:utf-8 -*-
import sys
import random

def dice_roll():
    """
        Content:
            サイコロを振る
    """
    return random.randint(0, 5)

def main():
    """
        Content:
            エントリーポイント
    """
    #--------------------------------
    # サイコロを振る回数を取得
    #--------------------------------
    roll_num = int(sys.argv[1])

    #--------------------------------
    # サイコロを振る
    #--------------------------------
    dice_list = [0]*6
    for i in range(roll_num):
        dice_list[dice_roll()] += 1

    #--------------------------------
    # 結果表示
    #--------------------------------
    print(dice_list)

if __name__ == "__main__":
    main()

実行引数にサイコロを振る回数を指定します。
指定した回数分だけdice_roll関数を呼び出し、出た目の回数をカウントしていきます。

実際に100回サイコロを振ってみた結果は以下のようになりました。

実行:
$ python3 dice.py 100
実行結果:
[21, 11, 13, 11, 21, 23]

6分の1で出るのであれば

100 ÷ 6 = 16.66666....

それぞれの出た回数が16付近であればいいのですが、そうでもなさそうですね。

実行結果をグラフ化する

上記のプログラムでサイコロを振るプログラムは完成しました。
もっと沢山サイコロを降る前に、もう少し実行結果を分かりやすくするためにグラフで表示してみようと思います。

Pythonにはもちろんグラフを表示するための便利なモジュールも用意されています。
今回はmatplotlibというモジュールを使用します。

ただ、このmatplotlibは他のモジュールとの依存関係が強いのかインストールするのがかなり大変でした。
Ubuntu14.04で使用する場合は以下のコマンドを順に入力していけばインストール出来ました。

$ sudo apt-get install python3-pip
$ sudo apt-get install libfreetype6-dev
$ sudo apt-get install libxft-dev
$ sudo apt-get install libffi-dev
$ sudo pip3 install cairocffi
$ sudo pip3 install matplotlib

さて、matplotlibを使用する環境が整ったので、先ほどのサイコロプログラムを改良し、円グラフを表示してみます。

#-*- coding:utf-8 -*-
import sys
import random
import matplotlib.pyplot as plt

def dice_roll():
    """
        Content:
            サイコロを振る
    """
    return random.randint(0, 5)

def main():
    """
        Content:
            エントリーポイント
    """
    #--------------------------------
    # サイコロを振る回数を取得
    #--------------------------------
    roll_num = int(sys.argv[1])

    #--------------------------------
    # サイコロを振る
    #--------------------------------
    dice_list = [0]*6
    for i in range(roll_num):
        dice_list[dice_roll()] += 1

    ##--------------------------------
    ## グラフ表示
    ##--------------------------------
    fig = plt.figure(figsize=(8, 8))
    ax = fig.add_subplot(111)
    labels = [str(x) for x in range(1, 7)]
    ax.pie(dice_list, labels=labels, autopct="%1.1f%%", startangle=90, shadow=True)
    plt.show()

if __name__ == "__main__":
    main()

matplotlibを使う場合はimport文にmatplotlibを書いておきます。
import文でasを使用するとimportしたモジュールに別名を付けられるので便利です。
ax.pieでdice_listの中身の内容で円グラフを書くように指定しています。

実際に実行して表示してみます。

実行:
python3 dice.py 100

f:id:TomoProg:20160307234457j:plain

リストの結果を表示するよりもグラフで表示できたほうが格段に見やすくなりました。

沢山振ってみる

グラフの表示も可能になったので、今度は沢山のパターンでサイコロを振ってみます。
30回ずつサイコロを振る回数を増やしていくとこんな感じです。
(スタートが左上でZ字の順です。)
f:id:TomoProg:20160308000227j:plain
f:id:TomoProg:20160308001739j:plain

1枚目の上段のグラフ(30回〜120回)はバラバラなイメージが有りますが、下段(150回〜240回)は結構綺麗な円になりました。
2枚目(270回〜480回)に入るとかなり6等分に近づき、あまり変化が見られなくなりました。

まとめ

  • 大体150回くらいから6分の1の確率に近づいてくる。
  • 大体300回くらいサイコロを振れば6分の1の確率にかなり近くなる。

今回はPythonでサイコロを振ってグラフを描いてみました。
やるたびにまた結果は違うと思うと確率って奥深いですね。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter