プログラミングに足を突っ込む30女

プログラミング初心者のmemoと日々の歩み

【Python】プラスとマイナスを反転させる

前回行った時間から、1日経過していたら実行する…
のような完全自分用アプリを作っていて、

それを改良している時に

この数字をそのまま簡単にマイナスに出来ないかな…!!!!

となることがあった。


一週間以上前のことで、なぜそうしたかったのかは忘れてしまったのだけど
簡単反転方法だけここに記しておく。









文系でも数字が苦手でも簡単

私はそもそも算数から苦手なのです。

そんな私でも簡単。一行。覚える必要なし。



プラスをマイナスにする

skinAge = 15
skinAgeDream = -skinAge

print( 'あなたの肌年齢は' + skinAgeDream + '歳です' )

# 出力結果
# あなたの肌年齢は-15歳です



このメモ分かりにくい。


つまり、



a = 30
b = -a

print( b )

# 出力結果
# -30


ということです。




マイナスをプラスにする

これも同じです。


a = -30
b = -a

print( b )

# 出力結果
# 30



超簡単。






JSON形式とはなんなのか無視してたけど向き合った

拡張子.jsonっていうのがよく出てくる。

「なんか設定とか書いてるやつでなんかやるときに付いてくるややこしい大人のファイル」という認識で
私なんかに理解できるわけない、と思い
ほぼ無視してました。

理解せぬまま見よう見まねでちょろっといじったりしてて、
ずーっと気になったまま放置してた。

やっと向き合う気になったので、
ここに記しておく。










JSONとは

JavaScript Object Notation」の略でデータ定義言語らしいです。

……えーっと、ちょっとよく分からないんですが

XMLとかありますよね。
私はこれも無視し続けてたんですが、
これもデータ定義言語。

最近ではJSONが使われるケースが増えてるってことです。

JavaScript」と名前に付くくらいなので、
JavaScriptに深い関連がありそう。

JSに触れたことがある人は中身を見たらすぐにどういうものか分かるはず。



JSON記述方法

JavaScriptと変わりなく書けます。

Pythonで言うところの辞書型。

{title”: "プログラミングに足を突っ込む30女",
“writer": “satsukiin”,
“age”: “30s”
}


こんな感じでオブジェクトは全体を{}で囲んで
“キー名”:”値” と表記する。

要素同士は「 , 」で区切る。

例えば…



{user1”: {name”: “団長”,
        “age”: 45,
        “gender”: “男”
    },
    “user2”: {name”: “クロ”,
        “age”: 42,
        “gender”: “男”
    },
    “user3”: {name”: “ヒロ”,
        “age”: 42,
        “gender”: “男”
    }
}

某大サーカス団とは一切関係ありません、偶然です




としておけば、
団長とクロとあともう1人誰だっけ?
となっても、

user3のnameを指定すればちゃんともう1人の名前が出てくるわけです。

我ながら分かりにくい例え。

ちなみに配列も
[]で囲んで「 , 」で区切れば入れ込めます。





JSONPythonに読み込んで使う


PythonJSONデータを使ってみる。


JSONデータの読み込み

まず最初にJSONを使うライブラリをインポート。

import json

他のライブラリもだけど、
importは最初に書いておく。

そして、

a = open( ‘yasuda.json’ )
b = json.load( a )

print( b )

#実行結果▼
#{“user1”: {“name”: “団長”,“age”: 45,“gender”: “男”},“user2”: {“name”: “クロ”,“age”: 42,“gender”: “男”},“user3”: {“name”: “ヒロ”,“age”: 42,“gender”: “男”}}


yasuda.jsonに深い意味はありません。

最初のopenでファイルを開いてaに代入。

次でaに入ったJSONをロードします。

プリントすると、ちゃんとyasudaが出てきます。





データの取り出し


JSONデータはload()Pythonに読み込むと、辞書型になっています。

なので、Pythonの辞書と同じように使えるわけです。


print( b[“user1”] )

#実行結果
#{“user1”: {“name”: “団長”,“age”: 45,“gender”: “男”}}


こんな感じ。





Pythonからデータを書き込む

便利な関数があるので簡単に書き込むこともできます。


import json

dictionary = {
    “user4” : {
        “name” : “渡部”,
        “age”: 47
    },
    “user5”: {
        “name”: “小笠原諸島”,
        “age”: 48
    }
}

a = open(‘anja.json’, ‘w’)
son.dump( dictionary, a )


まず辞書を作って、それをそのまま書き込む感じですね。

open()の第二引数’w’は、
データを開くときに書き込みの権限も与えるためのもの。

json.dump()で書き込みます。





まとめ

JSONって意外に読みやすい!!









【Python】リストに関する注意点とメモ


新しく知ったこと。(たぶん超初心者用)



リストを複製する際の注意点

リストを通常方法でコピーしたら、別物として扱われず、変更内容もコピーされてしまう。

colors = ["red", "blue", "green"]
colors_copy = colors

colors_copy[0] = "pink"

print( colors_copy )
print( colors )

# 出力結果 ▼
# ["pink", "blue", "green"]
# ["pink", "blue", "green"]


colors_copyしか変更していないのに、
コピー元のcolorsの方も変更されている。

これを、変更が適用されないようにするには、
リストを代入する時にcolors_copy = colors[:]とすれば良い。
[:]を付けると別物として扱ってくれるみたい。

colors = ["red", "blue", "green"]
colors_copy = colors [:]

colors_copy[0] = "pink"

print( colors_copy )
print( colors )

# 出力結果 ▼
# ["pink", "blue", "green"]
# ["red", "blue", "green"]

for文でリストのインデックスも取り出す


今までの私はfor文で何度目のループかカウントしたかった時は全て
ループ内でcnt += 1として、カウント用の変数を作っていた。

だけどもインデックスを取り出せる、
enumerate()関数というものがあったらしい。

インデックス取り出せたらこの変数必要ないね…!!

使い方も簡単だった。

for 変数1, 変数2 in enumerate(リスト名) :


これだけ。
変数1にはインデックス番号(リストの添え字番号)が入り、
変数2には値が入る。

実際の使用例▼

colors = ["red", "blue"]

for index, value in enumerate( colors ) :
    print( index, value )

# 出力結果 ▼
# 0 red
# 1 blue

二次元リストをforで取り出す


二次元っていう考え方が苦手で、辞書に逃げがちなんだけど
他の言語でも開発現場でも二次元リストはよく使われているらしい。

でもPythonの二次元リストはforで回せば取り出すの簡単そう…!
これに慣れてすぐに理解できる癖をつけてから進めると楽かもしれない。


numbers = [ [ 1, 2, 3 ], [ 4, 5, 6 ] ]

for a, b, c in numbers :
    print( a, b, c )

# 出力結果 ▼
# 1 2 3
# 4 5 6






【はてなブログ】ソースコードを色付け−−はてな記法



他の人のブログを見ると、みんなソースコードソースコードっぽくなっている。

print ("憧れのやつ")

どうやるのこれ??
と思って調べたらこれが出てきた。


help.hatenablog.com

はてな記法というやつを使えば、簡単に出来るらしい!

ヘルプ内にも書いてるし、このまま書けばいいだけじゃん
と思うかもしれない。

私もそう思っていた。

だけど、
全然できない!!!!

多分他の人の倍、時間がかかった…
私みたいな人がいたら、参考にしてください…
いないと思うけど…


はてな記法を使う


記述方法をはてな記法に設定する方法は、検索したらいっぱい出てくるので簡単に済ませる。


はてな記法を選択する記事編集画面
ブログ記事の編集画面


記事を書く編集ページで左上の『プレビュー』の横の『編集』のところから
はてな記法』を選ぶ。

以上。



ソースコードを色付けする


はてな記法を使って、ソースコードソースコードっぽくする。

 >|python|
 print('憧れのやつ')
 ||<


これをそのまま書くと、実際の記事では

print('憧れのやつ')


↑こうなる。


pythonの部分は、違う言語を使うのなら変える必要がある。


ここで対応ファイルライプ一覧が見れる↓

ソースコードを色付けして記述する(シンタックス・ハイライト) - はてなダイアリーのヘルプ



スーパーpre記法が使えない!!そんな時は


上記の通りにやっても、私はなぜか出来なかったんです。

>|python|
print('憧れのやつ')
|

↑こうなる。

こうなってどうにも出来ない場合は、前後に無駄なスペースが入ってしまっていないかチェックしてみて。
私はこれだった。



時間をすごく無駄にした気がする…





【Python】ランダムな数字を生成する — random



何かとちょいちょい使う機会のあるrandomについてメモがてら書いておく。

random関数とは?

random関数は乱数を生成してくれる。
ランダムで何かをしたいって時に使う関数。
例えば…

  • サイコロを1から6までの数字の間で表示させたい。
  • 毎回ランダムに違う言葉を表示させたい。
  • じゃんけんゲーム

という時に使う。



Pythonでrandom関数を使う

簡単なので使ってみる。

randomモジュールをimportする

まずは最初にインポートしておく必要がある。
importは一番上に書いておく。

import random


これでインポートはオッケー。random関数が使えるようになっている。

print(ramdom.random())

これを実行したら、1.0未満の小数点数が表示されていると思う。

random()だと、0.0以上1.0未満の浮動小数点数の乱数を生成することになっている。

最初のrandomがrandomモジュール
後のrandom()がrandom関数になる。


randomモジュール内の他の関数を使う

randomモジュールには他にも関数があるので、
それを利用して色んなランダムをやってみる。

範囲内の数値をランダムに出力

randint()関数

randint(開始数, 終了数)という風に使う。
引数(aとb)で範囲を設定する。

randintのintは整数値ということなので、
この結果は整数値のみが出力されることになる。

print(random.randint(1,6))
uniform()関数

uniform(開始数, 終了数)という風に使う。
こっちは浮動小数点値が出力される。

print(random.uniform(1,6))

リストからランダムに要素を出力する

choice()関数
list = [‘グー’, ‘チョキ’, ‘パー’]
print( random.choice( list ) )

リスト内のどれか1つがランダムに出力される。

sample()関数
list = [‘花子’, ‘光代’, ‘貞子’, ‘太郎’, ‘哲夫’, ‘栄作’]
random.sample( list, 2 )

ランダムにリスト内の2つの要素が出力される。
第二引数(2の部分)で、数が選べる。
3にすると3つの要素が出力される。


リスト内の名前が昭和じみていることは気にしてはいけない。





PythonとHerokuで寂しさを埋めるLINE Botを作った



急にLINE Botが作りたい!と思い立ち、ググりまくって作りました。

どうせ作るのなら使えるものがいい!と思ったものの、
何が使えるのか自分でも分かりません。
ただ一つ、私の話を聞いてほしい…と思ったので、
私の話にただただ相槌を打って聞いてくれる私
を作ることにしました。

そうなんだ とか なるほどね! とか言ってくれるやつです。


LINE Developers登録

普段のLINEアカウントで登録する → LINE Developers

  • 開発者名:ニックネームでもOK
  • 新規プロバイダーを作成:プロバイダーとは、サービス提供者(企業・個人)のこと。開発者名と同じでOK
  • チャネル作成:1つのチャネルが1つのBotを表す。新規チャネルを作成する。


LINE Messaging APIを選択する。

Messaging APIを選択している様子
真ん中を選択する



LINE Messaging APIの登録

  • アプリアイコン画任意
  • アプリ名
  • アプリ説明
  • 大業種 なんでもOK
  • 小業種 なんでもOK
  • メールアドレス
  • プライバシーポリシーURL 任意
  • サービス利用規約URL 任意


登録作成すると、チャネル一覧に新しく追加されているので、選択して設定画面に進む。


※ググっていると、この登録時にプランの選択があるとよく書かれているが、2019年4月からプランが統合されて、フ リープランでプッシュ通知が使えるようになっている。なので、そのままでOK。


LINE Messaging APIの設定

  • 自動応答メッセージ
  • 友達追加時の挨拶


利用するかしないか選択できるので選んでおく。 自動応答メッセージは勝手に返信をしてしまう機能なのでオフ、あいさつもオフにしたが、Botの説明のためにオンにし ておいても良いかなと思った。


LINE機能の利用を設定する画面
▲初期設定では「利用する」になっている


アクセストーク


Herokuに環境変数として設定するので、ここで発行しておく。
失効までの時間は0で。
流出してしまったらすぐに再発行すること。

Webhook送信


必ず、利用するに設定しておく。
Webhook送信でイベントを受け取るので、利用していないとBotとして働かない。

Webhook URL


HerokuのURLを入力するので、今のところは空欄でOK。
こちらも設定しないと動かないので、あとあと出てくるところで必ず設定すること。



Herokuの登録と設定

まずHerokuに登録 or ログインする。
英語だけど、なんとなくで進められる。

ログインしたら、「New」を押すとドロップダウンするので、 「Create new app」で新規アプリを作成。



ログイン後のCreate new app選択画面
Herokuにログイン後、新規アプリを作成する

  • App name : 被ってはいけないなので、オリジナルの名前で登録する。
  • Choose a region : 「United States」でOK


作成したら、Settingのタブから設定画面へ。
Domains and certificatesの箇所にあるURLに/callbackを最後につけたURLを
LINE Messaging APIWebhook URLに入力しておく。

https://○○○.herokuapp.com/callback となる。○○○の中には、先ほど設定した「App name」が入る。


ローカルでgitにpushするために

ターミナルで操作するため、
Herokuコマンドとgitコマンドがインストールされていない場合はインストールから始める。
インストールできているかどうかは、バージョンを確認するコマンドで。

$ heroku -v
$ git --version

インストールのコマンドは

$ brew install heroku
$ brew install git

インストールしたら初期設定が必要。
ユーザ名とメールアドレスを設定しておく。
ユーザ名は自由に設定する。

$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"

次に、作業を行うディレクトリ(フォルダ)をローカルに作成する。
ターミナルから行わなくてもOK。


$ mkdir line_bot

作成できたら、ターミナルでこのディレクトリの中に入る。


$ cd line_bot

ローカルでHerokuにログイン

$ Heroku login --interactive

で登録メールアドレスとパスワードを聞かれるので、入力する。
--interactiveオプションをつけることによって、ターミナルでログインができる。
つけないと、ブラウザからWebサイトに接続される。


Enter your Heroku credentials: Email: ○○@○○○○
Password: *********

二回目からはEmailアドレスは自動で入るので、enterキーを押すだけで良い。
以下の文字が出てきたらログイン成功。


Logged in as ○○@○○○○

git initとリモートリポジトリ設定

まずはgitの初期ファイルを作る。


$ git init

リモートの設定をする。


$ heroic git:remote -a アプリ名

環境変数を設定する

LINE Developersで発行したアクセストークンとChannel Secretを設定する。 YOUR_CHANNEL_ACCESS_TOKENにはアクセストーク
YOUR_CHANNEL_SECRETにはChannel Secretを設定する。


heroku config:set YOUR_CHANNEL_ACCESS_TOKEN=○○○○○○○○○○○
heroku config:set YOUR_CHANNEL_SECRET=○○○○○○○○○○○

HerokuのWebサイトのSettingsからも設定は可能。

環境変数設定画面
Reveal Config Varsボタンをクリックすると設定が現れる。



必要なファイルの作成

必要なファイルを先ほど作成したline_botディレクトリ下に作成する。

設定ファイルの作成

PythonでBot開発時に必要な設定ファイルは

runtime.txt

Pythonのバージョンを記載する▼

python-3.6.8

HerokuでサポートされているPythonバージョンを使う。
サポート情報は → Heroku Python Support


requirements.txt

importするライブラリを記載。
ここへ書いておけば、自動的にHerokuへインストールしてくれる。

Flask==0.12.2
line-bot-sdk==1.8.0
Procfile

実行方法を記載。
動かすPythonファイルを記載。

web: python main.py

Pythonファイルの作成

main.py
# ライブラリ
from flask import Flask, request, abort
from linebot import ( 
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    FollowEvent, MessageEvent, TextMessage, TextSendMessage, ImageMessage, ImageSendMessage, TemplateSendMessage, ButtonsTemplate, PostbackTemplateAction, MessageTemplateAction, URITemplateAction
)
import os import random

# フレームワーク(Flask)
app = Flask(__name__)

#LINE Access Token
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"] #LINE Channel Secret
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN) handler = WebhookHandler(YOUR_CHANNEL_SECRET)


@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']
    # get request body as text
    body = request.get_data(as_text=True) 
    app.logger.info("Request body: " + body)
    # handle webhook body
    try:
        handler.handle(body, signature) 
    except InvalidSignatureError:
        abort(400) return 'OK'


# ここからメッセージイベント
@handler.add(MessageEvent, message=TextMessage) def handle_message(event):
    kyoukans = ["わかるー!", "確かにそうだね", "それめっちゃわかるわ…", "いいと思う!!", "それでそれで!?", "まじかー", "さすが!", "絶対そう", "うん、君が正しい", "うんうん", "やば", "面白い", "草生えるわ","爆笑", "なるほどなー"]
    kyoukan = random.choice(kyoukans)

    line_bot_api.reply_message( event.reply_token,TextSendMessage(text= kyoukan)
    )


kyoukansリストの中から、ランダムに返すだけのBot
リストの中には、自分が言われたい言葉を山ほど入れよう。


git push

ファイルを作成したら、いよいよファイルをアップロードする。
再びターミナルを操作する。

$ git add .
$ git commit -m “コメント” 
$ git push heroku master

コメントの中は自由。
分かりやすいコメントを入れておく。


これで動くはず。


動かない場合(既読スルーになる)


疑うところ。

  • Channel Secretとアクセストークンは正しいか。
  • Webhook URLは正しいか。接続確認もしてみる。
  • gitのユーザ名とメールアドレスは設定しているか。
  • 設定ファイルに記述ミスはないか。
  • requirements.txtに必要のないライブラリが記載されていないか。

作ってみた感想


自分が欲しい言葉をくれるから嬉しい。
が、余計に寂しい。

リストの中に"草生えるわ","爆笑"を入れたせいで、
「人生しんどいよねー」と送った時に
「爆笑」と返ってきたのでイラっとした。

次はプッシュ通知も使って何か作ってみたい。



参考にさせていただきました▼
【初心者向け】PythonによるHeroku環境で簡単LINEBot開発 | 技術ブログ | MIYABI Lab






というか複雑なBotを作れる人以外は、
プログラミングが出来なくてもLINE Botを作れるサービスもあるようなので、それで作ってもいいかも。
これとか → LINE@運用ツール【Poster】