TomoProgの技術書

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

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

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

久しぶりのDjangoを使って掲示板を作ってみるシリーズを書いていこうと思います。

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

完成した・・・?

こんな風に考えていたんです。
とりあえず、作りながら切りが良いときにブログ書いていくか。

そんなことを思いながら手当たり次第に作っていったところ、

キリがいいところってどこだよ・・・。

となって結局ブログをほぼ更新しませんでした。

しかし、とりあえず動くものを作るという目標は達成せねば・・・

というわけで、とりあえず動くものを作ってみました。

PythonBoardというPython関連のことについて話し合える掲示板です。
http://ik1-326-23085.vs.sakura.ne.jp/PythonBoard

Python関連のことに限定していますが、この記事を見ていただいた方は是非トピック立ててみたり返信してみたり、適当に使ってみてください!!

まだ追加したい機能がいくつかあるので、その時は機能ごとにブログを書いていこうと思います。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

辞書型のKeyErrorを回避する

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

久しぶりにブログ書こうと思います。

今回はPythonの辞書型を使っていると遭遇するKeyErrorについて少し調べてみました。
それでは頑張っていきましょう。

辞書型って何?

KeyErrorの前にまずは辞書型について少し書いておきます。
辞書型とは任意のキーに対して値を持てる型のことです。
他の言語でハッシュマップや連想配列という言葉を聞いたことがある人はそれとほぼ同じ型だと思います。

辞書型を使う場合は波括弧を使って「'キー':'値'」の形で表現します。

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

def main():
    person_dict = {'name':'tomoprog', 'age':24, 'blood':'A'}
    print(person_dict['name'])
    print(person_dict['age'])
    print(person_dict['blood'])

if __name__ == "__main__":
    main()
実行結果:
tomoprog
24
A

person_dictという変数に辞書型を定義し、「変数名['Key']」で定義した辞書型の値にアクセスしています。
ちなみに辞書型の値は数値でも文字列でも構いません。

KeyErrorを出力してみる

それでは今回の本題に入っていきましょう。
まずはKeyErrorを実際に起こしてみます。

とは言っても引き起こすのは簡単で、存在しないキーで辞書にアクセスするだけです。
実際にKeyErrorを引き起こしたコードがコチラ

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

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}
    print(d['name'])
    print(d['age'])
    print(d['blood'])
    print(d['height'])

if __name__ == "__main__":
    main()
実行結果:
tomoprog
24
A
Traceback (most recent call last):
  File "dict.py", line 11, in <module>
    main()
  File "dict.py", line 8, in main
    print(d['height'])
KeyError: 'height'

heightという存在しないキーで辞書にアクセスしたためKeyErrorが出力されています。

KeyErrorを回避する

KeyErrorが出力されると強制的にプログラムが終了してしまいます。
強制的に終了されては困る場合はこのKeyErrorを対処しないといけません。

対処する方法としては

  1. 辞書にキーが存在するかを確認してからアクセスする
  2. try-exceptを実装する

この2つの方法が考えられます。

実際に2つの方法で対処してみましょう。

辞書にキーが存在するかを確認してからアクセスする

キーを確認してからアクセスする場合はinまたはgetを使用します。
inを使う場合はもし、キーが辞書にあればというif文を書くことでKeyErrorを回避できます。

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

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}

    if 'age' in d:
        print(d['age'])
    else:
        print("d do not have 'age' key")

    if 'height' in d:
        print(d['height'])
    else:
        print("d do not have 'height' key")

if __name__ == "__main__":
    main()
実行結果:
24
d do not have 'height' key

getを使う場合は辞書型.get()メソッドを使用します。
存在する場合は第1引数、存在しない場合は第2引数を返します。

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

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}
    print(d.get('name', None))
    print(d.get('height', None))

if __name__ == "__main__":
    main()
実行結果:
tomoprog
None

どちらかと言えばgetを使うほうがif文が必要ない分綺麗に書けそうです。

try-exceptを実装する

try-exceptを使用する場合はKeyErrorが出力される部分をtryで囲み、exceptでKeyErrorを捕捉します。

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

def main():
    d = {'name':'tomoprog', 'age':24, 'blood':'A'}
    try:
        print(d['height'])
    except KeyError:
        print("KeyError Exception.")

if __name__ == "__main__":
    main()
実行結果:
KeyError Exception.

try-exceptが実装されることで、KeyErrorが出力されたときも強制終了することなく実行できます。

まとめ

今回は辞書型のKeyErrorの回避方法として、いくつか例を上げてみました。
個人的にはgetを使う方法が一番綺麗に簡潔に書けるので好きです。
KeyErrorで詰まった時は是非参考にしてみてください。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

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

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

Djangoを使って掲示板を作ってみる Part0を書いてから3日ほど経過しました。
そろそろPart1を書こうと思います。

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

掲示板に必要なページを考える

まずは掲示板に必要なページを考えていきます。
とりあえず、思いついたものをどんどん書いていきます。

1. トピックの一覧ページ
2. トピックの内容を一覧できるページ
3. トピックを作成するページ
4. トピックの内容に対して返信するページ
5. 使い方の説明をするページ
6. お問い合わせページ
7. ログインページ

かなり大雑把ですが、とりあえずこの7ページを作れば掲示板としては機能しそうかなと思いました。
作っていく間にこれも必要、あれも必要となった場合は臨機応変にいきましょう。

DBを設計する

とりあえず、DBも大雑把に設計してみます。
djangoのmodels.pyに定義した内容は以下の通りです。

from django.db import models

# Create your models here.
class Topic(models.Model):
    """ Topic Table """
    title = models.CharField(max_length=500)
    register_name = models.CharField(max_length=20)
    register_datetime = models.DateTimeField()
    update_name = models.CharField(max_length=20)
    update_datetime = models.DateTimeField()

    def __str__(self):
        return self.title

class TopicDetail(models.Model):
    """ TopicDetail Table """
    title = models.ForeignKey(Topic, on_delete=models.CASCADE)
    text = models.TextField()
    register_name = models.CharField(max_length=20)
    register_datetime = models.DateTimeField()
    update_name = models.CharField(max_length=20)
    update_datetime = models.DateTimeField()

    def __str__(self):
        return self.title

Topicという親テーブルとそれに紐づくTopicDetailという子テーブルを作りました。
Topicテーブルの一覧を表示するページからトピックを選択することで、TopicDetailの内容を表示するページに遷移するようにイメージして作ってみました。

DBに関しても別のテーブルが必要になったり、テーブルのフィールドや属性を変更したくなった時は随時変更していきます。

とにかくざっくり動くものを目指して作っていきます!!

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

Vimで「;」(セミコロン)を使ってみる

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

今日はVimで「;」(セミコロン)の使い方を知らなかったので、ここに書いておこうと思います。

例えば以下の様な例文があったとしましょう。

My favorite programming language is python!!

カーソルが先頭にあったとして、programmingの「p」にカーソルを移動させたいときはどうすればいいでしょうか?

地道に「l」を押して右にカーソルを移動させてもいいですが、今回の例文では「fp」と入力すると瞬時に移動できます。

「f」を押してから任意のキーを押すことで、現在のカーソル位置から前方検索を行い、マッチした場所にカーソルを移動させることが出来ます。

ここまでは知っていたのですが、ここからさらに次の「p」に移動しようと思った時、もう一度「fp」と入力しないと移動できないとずっと思っていました。

しかしそんな面倒なことはしなくていいです。
なぜなら、
「;」を押すことで直前の「f」コマンドを繰り返す事が出来ますから!!

今まで「.」コマンドでなんで「f」コマンドを繰り返せないんだろうと思っていたのですが、「;」だったのですね・・・

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter

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