Djangoチュートリアルをしてみる③(アカウント作成)

さて、前回はテーブルの作成まで行いました。 今回は管理ユーザを作成していきたいと思います!

さっそく以下のコマンドを実行します。

python manage.py createsuperuser

以下のような表示が出るので、ユーザ名を入力してください。

Username:ユーザ名

Eメールアドレスです。

Email address:メールドレス

最後はパスワードです。 2回求められるので、同じパスワードを入力しましょう。

Password:
Password (again):
Superuser created successfully.

ここまで出来たら以下のURLにアクセスしてみましょう! http://127.0.0.1:8000/admin/

ユーザ名とパスワードが求められると思うので、先ほど登録したユーザ名とパスワードを入力してログインしてみてください。

f:id:r_chonsuke:20190613215401p:plain

こんな感じの画面が出てきましたでしょうか?

でも、このままではpollsアプリを編集できません!

そこで、admin.pyを以下のソースコードで編集。 admin.siteにQuestionモデルを登録します。 ```Python from django.contrib import admin

from .models import Question

admin.site.register(Question)

これで、管理画面でユーザやクエスチョンテーブルを編集できるようになりました!
今回はいったんここまで!

機械学習エンジニアを目指して③(Slackbot編)

前回、次回はクラスについて書きますといいましたが・・すみません汗

今回はPythonを用いて簡単なSlackbotを作成していきたいと思います!

プライベートですがゆくゆくは、こういうこともしてみよう。 - 今日食べたいものをslackに書く。 - 食べたいもののデータをDBに保管する。(ここまでは今週中にしたい・・) - ある程度データが集まってきたらPandasを用いてそのデータから食べたいものの確率を出して統計学的に有意があるメニューを今日食べたいメニューとして提案する!!!!!!!! - メニューで悩まなくていいのでみんな幸せ(すごい)

なんか、うん。

不安点 - ほとんどが夜はお寿司か唐揚げ、昼は明太子パスタになりそう(なる)

ああああああ・・・これこの3種類しか提案してくれなくなるんじゃ・・・(不安)

環境

  • IntelliJ IDEA
  • Python3.6
  • Slack
  • anaconda(もしかしたらいらないかも・・)

hubotの導入

  1. 左のメニューバーからAPPの「+ アプリを追加する」を選択してください。

  2. 次に上の検索欄に「hubot」と打ち込むと、hubotが出てくると思うので、それをインストールしてください。

  3. 設定の追加を押し、次の画面でユーザ名を入力後、hubotインテグレーションの追加ボタンを押下します。

  4. すると、ダイレクトメッセージにSlackBotという人(?が追加されたと思います!

Pythonプロジェクトの作成

さっそくPythonプロジェクトを作っていきましょう!!

今回はこんな感じの構成で作りました!

  • slackbot(プロジェクト名)
    • plugins
      • reply_manager.py
      • init.py
    • slackbot_settings.py(これだけ名前の変更不可)
    • manage.py

各種ファイルの作成

まずは、slackbot_settings.pyから触っていきたいと思います。 slackbotに関する設定ファイルです。 API_TOKENについては、hubotの導入の設定画面で作成したAPI_TOKENを使用してください!

# slackのhubotで作成したAPI_TOKENを設定
API_TOKEN = "xxxx-xxxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx"

# 何言ってるのかわからなかったとき
default_reply = "え、ぽちょじゃないけど?"

# 外部ファイルの読み込み
PLUGINS = [
    'plugins',
]

次に、manage.pyです。 これは単純にPython起動用のファイルです。

from slackbot.bot import Bot

def main():
    bot = Bot()
    bot.run()

if __name__ == "__main__":
    print('start slackbot')
    main()

最後に、reply_manager.pyです。 slackの画面で打ち込んだ文字を判別し、一致するものがあればそれに対応した言葉を返します。

from slackbot.bot import respond_to

@respond_to('ぽちょ')
@respond_to('ぽちょですか?')
def rep_message(message):
    message.reply('え、ぽちょだけど!')

@respond_to(文字列)の文字列部分に書かれた言葉がslackに書き込まれたら、 message.reply('文字列')に書かれている言葉を返すというものです。

多分これでbot宛にslackを送ったらちゃんと反応が返ってきてくれると思います!(簡単)

また、上記だとメンションを指定する感じですが、下記の書き方だとメンション指定なしに、全ての言葉に反応します。

from slackbot.bot import listen_to

@listen_to('ぽちょですか?')
def rep_message(message):
    message.reply('え、ぽちょだけど!')

たったこれだけでSlackBotの基本的な動作が出来ちゃいます!!

とりあえずいったんここまで・・・

Djangoチュートリアルをしてみる②


さて、今回はチュートリアル2に移りたいと思います!

まずはデータベースの設定から行っていきます。

Djangoには標準でSQLiteが入っているらしいですが、今回はPostgreを使っていきたいと思います。

データベースの設定


mysite/settings.pyを開き、「DATABASES」の中身を以下の通り書き換えます。
また、あらかじめデータベースは作成しておいてください。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'データベース名',
        'USER': 'ユーザ名',
        'PASSWORD': 'パスワード',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

それではデータベースにテーブルを作成していきたいと思います。

$ python manage.py migrate

これで、settings.pyのINSTALLED_APPSで指定してる全てのアプリケーションが実行されます。

次にModelを作成していきます。

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

上記のコードでは、QuestionテーブルとChoiceテーブルを定義しています。

そして、mysite/settings.pyのINSTALLED_APPSに'polls.apps.PollsConfig',を追記することで、Djangoにpolls/apps.pyのPollsConfigを認識させます。

以下のコマンドを実行します。

$ python manage.py makemigrations polls

pollsの下に0001_initial.pyというファイルが作成されました。
中には、polls/models.pyで定義した内容が記載されているのが確認できると思います。
こうすることで、Djangoのモデルに変更があったことをマイグレーション の形で保存出来ます。

それでは実際にここで作成したマイグレーションをもとに、実際にテーブルを作成していきたいと思います!

$ python manage.py sqlmigrate polls 0001

※この時点ではまだテーブルは作成されていません。
下のコマンドを入力することによりテーブルが作成されます。

$ python manage.py migrate

これでテーブルが作成されたと思います!

Djangoチュートリアルをしてみる①

Djangoチュートリアルを見ながら実際に簡単なアプリを作っていきたいと思います!
はじめての Django アプリ作成、その 1 | Django ドキュメント | Django

今回はanacondaを使用して、仮想サーバー上で作成していきます!
それでは・・さっそく!

環境


まずはCtrl + Shift + Pで「Python: select interpriter」を選択し、今回使用する仮想サーバーを選択します。
f:id:r_chonsuke:20190521222424p:plain

次にプロジェクトを作成します。
VSCodeのTerminalで今回のプロジェクトを作成するディレクトリに移動し、以下のコマンドを実行します。

django-admin startproject mysite

現在選択されているディレクトリに、「mysite」というプロジェクトができたでしょうか?
f:id:r_chonsuke:20190521222915p:plain

作成されていたら、VSCodeで実際に作成されたディレクトリにいってみましょう!

それではまずはPollアプリケーションを作成していきます。
Djangoでは、プロジェクトの下にいくつものアプリケーションが作成されるイメージみたいです。

ターミナルに以下のコマンドを入力します。

python manage.py startapp polls

MYSITEというプロジェクトの直下に、pollsというアプリケーションが出来たと思います。

それではViewを作成していきます。
polls/views.pyに以下のコードを記載していきます。(元々書かれているコードは消しても大丈夫です)

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

次にpollsディレクトリの直下に、urls.pyというファイルを作成し、以下のコードを記載します。

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

そして、mysite/urlsに「path('polls/', include('polls.urls')),」を追記します。
(importにincludeを追加するのも忘れないでください!!私は忘れてSS上げなおしました・・)
f:id:r_chonsuke:20190521232024p:plain

ここはどういうことかといいますと、polls/urlsをinclude(include('polls.urls'))することによって、polls/にアクセスした際にpolls/urlsに記載されているモジュールの名前(この場合はindexという関数名)を探しにいきますという仕組みみたいです。

それでは実際サーバーを起動してみます。

python manage.py runserver

以下のURLにアクセスしてみてください。
http://localhost:8000/polls/

ブラウザに「Hello, world. You're at the polls index.」という文字が表示されていれば無事成功です。

機械学習エンジニアを目指して②(制御構文、関数、クラスについて)

概要


今回はPythonの制御構文や関数について書いていきたいと思います!
制御構文についてはプログラマにとってはお決まりの、

  • 分岐
  • 繰り返し

について触れていきます。

関数については書き方や使い方などを書いていきたいと思います。

制御構文

分岐

  • if文

if文はJavaと同じく分岐をさせたいときに使用します。
ただ、書き方がJavaと少し違います!

if 条件: // ヘッダには「:」が必要
    // 処理(※処理の前に半角スペースが4つ必要!)
elif:
    // 処理
else:
    // 処理

例えばこんな感じです。

val = 'Pocho'
if val == 'Pocho':
    print('私はPochoです')
elif val == 'Poco':
    print('私はPocoです')
else:
    print('私はPochoでもPocoでもありません!')

また、Pythonにも三項演算子があるようです。
書き方はちょっと独特・・

変数 = 条件がTrueの時の値 if 条件  else 条件がFalseの時の値

例えばこんな感じです。

val = 'Pocho'
result = '私はPocho' if val == 'Pocho' else '私はPoco'

という風に書くと、
「私はPocho」という値がresultに代入されます。
真ん中に条件式書くのか・・・

繰り返し

  • for文

まずは、繰り返しで最もよく使われると思われるfor文の説明からしていきます!

for 変数 in イテラブルオブジェクト:
    // 処理

例えばこんな感じです。

for i in range(5):
    print(i)

とすると、
1
2
3
4
5
と表示されます。

またJavaと違い、enumerateという関数を使用すれば、(要素番号,要素)というタプルを返すことも可能です。
例えば・・

for i, name in enumerate(names):
    print('{}番目:{}'.format(i, name)

とすれば、iには要素番号、nameには要素(names)の値が返ってきます。

さらにさらに・・
zipという関数を使うことにより複数のイテラブルオブジェクトを返すことが可能!

numbers = [1, 2, 3]
first_names = ['Pocho', 'Poco', Popo']
last_names = ['Poccho', 'Pococo', 'Popopo']
for number, first_name, last_name in (numbers, first_names, last_names):
    print('{}番目:{}{}さん!')

と書くと、
1番目:PochoPocchoさん!
2番目:PocoPococoさん!
3番目:PopoPopopoさん!
という風に出力されます!これは便利!

関数


次は関数について触れていこうと思います!
書き方はこんな感じ!

def 関数名(引数1, 引数2, 引数3......):
    # 処理
    # 戻り値がある場合はreturn

# 実際コードにしてみると・・
def add(num1, num2):
    return num1 + num2

print(add(3, 5)) # 8が出力される。

また、引数のデフォルト値も設定できます。
デフォルト値を設定すると、引数を渡さなかった場合にデフォルト値が引数として設定されます。

def add(num1, num2 = 0):
    return num1 + num2

print(add(3)) # num2には0が設定され、「3 + 0」の結果で答えが「3」となる。

とりあえず今回はここまで・・・
クラスについては少し長くなりそうなので、また次回書いていこうと思います!!

機械学習エンジニアを目指して①(Python入門)

自己紹介

人生初ブログとなります、Pochoです。
今はJavaのエンジニアとして働いていますが、機械学習エンジニアに興味を持ち現在勉強中です!
(そのうち機械学習の現場に入りたいなぁ・・)

Javaと同じことが出来たり、同じような構文などは省くこともありますが、(基本的には書いていく予定・・)
勉強して便利だなぁっと思った内容などを書いていきたいと思いますのでよろしくお願いします!
(指摘やこういう関数あるよ!こういうのも現場でよく使う!などあれば優しく教えてもらえると非常にうれしいです・・!)
それではさっそく!
※今回Python3を使用しています。

型について

・型変換

# int型からstr型に変換
val = 5
val = str(val)

#str型からval型に変換
val = '5'
val = int(val)

・型の確認

val = 'Pocho'
val_type = type(val) # str型

# 型の比較も出来る
val_type == str # True

val = 0.5
val_type = type(val) #float型
val_type == float # True

val_type = type(.5) # 0.5と解釈される(float型)
val_type == float # True

演算

普通にint型をint型で割るとfloat型になる。
少数以下切り捨て除算にしたければ、「//」を使用する。

# int / int はfloat型になる
val = 4 / 2 # val = 2.0
type(val) # float型になる

# 少数以下切り捨て除算
val = 4 // 2 # val = 2
type(val) #int型になる

・乗算

Pythonではstrとint型の乗算が可能!(使うかはわからないけど・・)

'Pocho' * 3 # 「PochoPochoPocho」になる

また、「**」とするところでN乗を計算することが出来る!

5 ** 2 # 5の2乗で「25」

文字列メソッド

・大文字小文字への変換

Javaでいうところの「toUpperCase()」「toLowerCase()」
書き方は以下の通り。

'PoCho'.lower() # 'pocho'
'PoCho'.upper() # 'POCHO'

formatの使い方

これもJavaのformatメソッドと同じ使い方。

name = 'Pocho'
'初めまして!私は{}です!'.format(name) # '初めまして!私はPochoです!'

浮動小数

比がその浮動小数点数の値となるような整数の組を返してくれる!

0.5.as_integer_ratio() # (1, 2)⇒1/2

でもなぜか、0.4だと・・

0.4.as_integer_ratio() # (3602879701896397, 9007199254740992)

なんていうとんでもない数字が・・
調べてみると、分母が2のN乗という条件のもとで近似を探していることが原因のようです。
参考:https://minus9d.hatenablog.com/entry/2017/11/30/225715
(3602879701896397 / 9007199254740992をすると0.4になりました。)

リスト

Javaのリストと同じですが、微妙に違う点があります。

val = [2, 6, 3, 9, 5, 4]
len(val) # リストのサイズ:6
val[0] # 2
val[-1] # リストの末尾にアクセス:4
val[-3] # リストの末尾から3番目:9

# スライス
val[0:2] # 先頭から2つの要素を選択:[2, 6]
# 先頭の0は省略出来る
val[:2] # [2, 6]

val[3:len(val)] # 3番目から末尾までの要素を選択:[9, 5, 4]
# 後ろのlen(val)は省略出来る
val[3:] # [9, 5, 4]

# 要素番号を指定しない場合はすべての要素を選択
val[:]:[2, 6, 3, 9, 5, 4]

・数値と文字の混合も可能

val = [2, 'P', 3, 'o', 5, 'c', 4, 'h', 'o']

・値の追加

val = [2, 6, 3, 9, 5, 4]
val.append(10) #  [2, 6, 3, 9, 5, 4, 10]

#多重リストの場合はこんな感じ
val = [[0, 1, 2], ['P', 'o', 'c', 'h']]
val[1].append('o')

・タプル

Javaにはありませんが、中の要素を変更できないリストのことをいいます。

# リストと違って()でくくる
val = (2, 6, 3, 9, 5, 4)

# 以下のコードを実行するとエラーになる
val[0] = 10

#--------------------------------------
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: 'tuple' object does not support item assignment
#--------------------------------------

※追加、変更、削除全てダメみたい

辞書

JavaでいうMapみたいなもの。

dic = {'Po': 0, 'ch': 1, 'o': 2}
dic['Po'] # キーに対しての値が取得できる(結果:0)

・キーの一覧を取得する

dic.keys() # 結果:dict_keys(['Po', 'ch', 'o'])

・値の一覧を取得する

dic.values() # 結果:dict_values([0, 1, 2])

・新しく要素を追加する

dic['Poccho'] = 3 # 結果: {'Po': 0, 'ch': 1, 'o': 2, 'Poccho': 3}


とりあえず今回はここまで!!
不慣れで読みづらかったと思いますが、最後まで読んでくれてありがとうございます!!
エンジニアの方のコメントお待ちしてますっ
次回は制御文についてを書いていきたいと思います!