8月目標
最近ブログ書けてないので月初めに目標をたてて遂行していこうかと。
8月目標
- Reactを使ってポートフォリオを作成(youtubeをみながら)
- 本業でjavascriptを使って勉強しつつ貢献する(アイデアはqiitaに書く)
- python記事も週1ペースでUdemyのを補完していく
- paizaに登録したのでランクを上げていく
実務未経験でpythonだけは求人も少なくて狭き門だと感じたので、
フロントエンドでReactとJavascriptを7月はやっていっていたのですが
今月はfirebaseとかを使ってreactでデプロイまでできればと計画中。
また客観的に評価をしてもらいたいのでfindyでのランク付以外にも
paizaを使ってランクを上げていく。
paizaの試験なんか質問がクセがないか?回答コードが簡単なんだけど
問題を理解するのに時間かかる笑
freeCodeCampで正規表現を勉強する!
引き続きfreeCodeCampで正規表現も勉強。
matchとかもそうだけどエディタで検索するときにも使えるので
正規表現は結構使えるとよさそう。
スペルミスなどやある程度おおまかな検索をしたい場合は.をつける。
.testでしか使えない?
の中に検索したい文字を入れるとその文字があると出力される。
[aoe]ならa,o,eぞれぞれ検索してくれるし、[a-z]とかならアルファベット全てを検索してくれる。
数字も可能で両方合わせることも可能。/[a-c4-6]/giならabc、456を検索してくれる。
giなので大文字小文字どちらも、同じのもリストに入れてくれる。
検索されないようにするには^を先に入れる。
同じ文字が続く場合は検索したい文字の後ろに+をつけるとまとめて検索してくれる。
s+だとsが1個以上検索、sが2個以上の場合はss+を入力
後ろに何個ついてようが個数を気にせず検索する場合は*を使う
^はの中にいれると検索されないようにする機能を持つが、[]がないと文章の最初という意味になる。
その検索文字が最後の場合は$を検索文字の後ろにつける。
ショートハンド
?の使い方
検索対象をグループしたい場合は()の中に入れる
検索したものを変更したい場合は.replaceを使う。正規表現と合わせて使う
freeCodeCampでjavascriptを勉強する!ES6編
javascriptの基礎からES6も勉強。
アロー関数とか「なにこれ?」状態だったので、
今回これを勉強できてかなりためになった。
無料というのがすごい。
function部分の省略
引数が固定でない場合でも対応できるargumentオブジェクト
ES6ではテンプレートリテラルが使える
pythonでいうprint(f"{name} is {age}")みたいなもの
ファンクションの変数と引数が同じ場合は省略できる。
オブジェクト内でのファンクションの省略
class表記ができるように
classを使う時は最初にconstructorを記述して初期値を設定する。
pythonでいうdef __init__みたいなもの
type="module"で外部jsをインポートができる
promise文で処理を変えたり順序を変更できるようになる
ES6は特に覚えたかった部分のjsなので、だいぶ勉強になりました。
FreeCodeCampでjavascriptを勉強して簡単にまとめてみる。
一通りpythonの基礎はできてきたかなと思って求人を色々見ていると
関西とかでは実務なしのpythonエンジニアはかなり狭き門と感じたので、
フロントエンドもかじってみようとjavascriptも始めることに。
書き方はpythonと似たようなところがあるのでそんなに違和感なくできてる感じです。
とりあえず無料でもしっかり勉強できそうなところで
英語がメインではありますがfreeCodeCampで初歩からスタート。
https://www.freecodecamp.org/learn
とりあえず基礎をメモ的にまとめてみる。
変数定義
前はvarを使っていたがローカルにおいてもグローバルに使えてしまってややこしいので
今はletやconstを使う。
letは定義したものは変更できるけど、
constは基本的にはできない。(配列を定義した場合、配列内のデータは変えられる)
for文、while文、do while文
for文はほぼpythonにも似てる感じ。
pythonなら
pynum = 0
for i in range(10):
pynum += 1
print(pynum)
while文
js
pynum = 0
while pynum < 10:
pynum += 1
print(pynum)
jsにはdo whileというwhileに入る前に1回whileの処理ができる構文がある
再起関数
pythonではわからなかったけどjsで勉強してようやくわかった。
関数の中に自身の関数を入れてforを使わず回転させる。
if elseを使わず分岐ができる 構文
時々出てきたこの構文よくわかってなかったけどこれで納得。
その他よく使うファンクション
freeCodeCampで無料でここまで勉強できるのはすごい!
英語もそんなに難しい英語じゃないのでやりやすいと思います。
次はES6まとめ。
*1:previousValue, currentValue) =>
DAY36 めちゃくちゃ下げた米国の個別株の理由をニュースで知るアプリを作る!
DAY35抜かしちゃったけどAPIの呼び出しの練習なので、
DAY36に飛んで実践。
後日やるけど試したかったのでスクレイピングもつけています。
今回はスクレイピング部分の説明はなしでやります。
米国株の値動きがわかるAPIから今日と昨日の価格を取得して、
暴落していたらその理由がないかニュースAPIでニュースを検索して表示する、
というようなツールを作ります。
暴落しても全体の地合いで個別でニュースがない場合もありますが。。。
では始めます。
from get_company_name import get_company_name
import requests
#dotenv-templete
import os
import datetime as dt
from dotenv import load_dotenv
from os.path import join, dirname
load_dotenv(verbose=True)
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
#dotenv-templete
STOCK_NAME = input("Type Company Code eg.TSLA : ")
STOCK_API = os.getenv("STOCK_API")
STOCK_ENDPOINT = "https://www.alphavantage.co/query"
NEWS_API = os.getenv("NEWS_API")
NEWS_ENDPOINT = "https://newsapi.org/v2/everything"
today_news = dt.datetime.today()
today_news = today_news.strftime("%Y-%m-%d")
company_name = get_company_name(STOCK_NAME)
print(company_name)
最初の2行はAPIでjsonを取得するためのrequestsと、
yahooファイナンスから英語の企業名を取得するスクレイピングの自作コードをインポートしてます。
次はAPI関連の情報で、STOCK_NAMEはinputで自分が気になる会社コードを
入れられるようにしています。
today_news部分は今日の日付を取得してNEWS APIのパラメータに合わせたフォーマットに変換しています。
APIで株価データを取得するコーディング
def get_stock_price():
params = {
"function": "TIME_SERIES_DAILY",
"symbol": STOCK_NAME,
"apikey": STOCK_API,
}
url = STOCK_ENDPOINT
r = requests.get(url, params=params)
data = r.json()["Time Series (Daily)"]
data_list = [value for (key,value) in data.items()]
today_data = float(data_list[0]["4. close"])
yesterday_data = float(data_list[1]["4. close"])
if today_data <= yesterday_data * 0.9:
print("OMG! why?")
get_stock_news()
else:
print("Keep it!")
url=をエンドポイントとしてリクエストし、paramsに必要事項を入力して
データをもらっています。
パラーメーターはAPIのドキュメントに書いてあります。
とりあえずrequiredだけやっとけば最低限の価格は取得できます。
取得したjsonを内包記述でリスト変換し、今日と機能の終値だけを取得します。
ニュースを取得するという機能を実装しています。
ニュースを取得する機能の実装
def get_stock_news():
params = {
"q": company_name,
"from": today_news,
"apikey": NEWS_API,
"language": "en",
"searchIn": "title",
}
response = requests.get(NEWS_ENDPOINT, params=params)
response.raise_for_status()
data = response.json()
if data["articles"] == []:
print("no news...")
else:
article_source = data["articles"][0]["source"]["name"]
article_title = data["articles"][0]["title"]
article_url = data["articles"][0]["url"]
print(f"{article_source} : {article_title} - {article_url}")
get_stock_price()
こちらはNEWS APIを使います。
同じようにドキュメントを見てパラメータをparamsにいれていきます。
入力例を見た方がわかりやすいかと思います。
sourcesではニュースサイトの指定もできるので、たとえばCNNだけから取得するということも可能。
取得がもしできなかったり空の場合は no news...と表示し、
あった場合は取得したjsonからメディア名・ニュースタイトル・リンク先を
アウトプットするようにしています。
スクラッチにしてはちゃんと機能したものが作れたので気分がいいです笑
APIを使ったデータ解析になれてきたら、
yahooファイナンスの日本株のapiでfor で全部の株のデータ取得して
解析とかしてみたいな。
Gitはこちら。
pythonとphpの記述比較
pythonの基礎的な記述方法は覚えたつもりなので、
phpの方も少しさらってみると用途は違うものの少しアレンジすれば
phpもできるんじゃなかろうかと思い違いをまとめてみた。
javascriptも基本かじってきているのでそれも後日復習する予定。
変数の定義
記述方法
リストの記述
コンソールに出力する方法
ifの記述
whileの記述
for文の記述
ランダムな整数の出力方法
for文の入れ子記述
ユーザー定義関数
処理の中断・break・continue
引数の個数を限定しない記述方法
用途以外の大まかな違いは、
変数には$がつく
関数はpython = def , php = function
な感じですね。
pythonのコードがすっきりして書きやすいのを再確認しました。
変数とか毎回$つけんのめんどくさい…笑
DAY34 APIでデータを自動的に取得して毎回質問の違うクイズアプリを作る!
今回はかなり難しくてできなかったのでいい復習になった。
それぞれの機能をわけて1つのアプリとして作ります。
今回はDAY17でやったクイズアプリを、コンソールではなく
tkinterのGUIを使ってより遊びやすくするアプリを作成します。
また質問もTRIVIA APIから毎回取得して
毎回違う問題を出すようにします。
UIはこんな感じ。
APIからデータを取得するファイルを作成する
data.py
import requests
params = {
"amount": 10,
"category": 18,
"difficulty": "easy",
"type": "boolean"
}
response = requests.get("https://opentdb.com/api.php", params=params)
response.raise_for_status()
response = response.json()
quiz_list = response["results"]
今回のAPIはキーも要らず簡単なものなので、シンプルに。
requestsでapiのエンドポイントにアクセス。
raise_for_statusをすることでアクセスエラーが起きた時にどのエラーかを教えてくれるようにしています。
quiz_listで余計な部分は飛ばして整形しています。
クイズ内容を質問・答えのセットとしたオブジェクトとして管理する
整形したjsonをアプリで出力しやすくするためにオブジェクト化します。
クイズモデルとして1つのクラスを作成します。
quiz_model.py
class Question:
def __init__(self, q_text, q_answer):
self.text = q_text
self.answer = q_answer
これはjsonの中にあるクイズ内容と答えをセットにするテンプレみたいなものを作っています。
main.py
from data import quiz_list
from quiz_model import Question
quiz_bank = []
for quiz in quiz_list:
q_text = quiz["question"]
q_ans = quiz["correct_answer"]
new_quiz = Question(q_text, q_ans)
quiz_bank.append(new_quiz)
quiz = QuizMachine(quiz_bank)
起動ファイルでjsonデータとモデルデータをインポートして、
for文で1つずつ質問と答えをとりだし、new_quizでオブジェクト化をして
quiz_bankのリストに入れていきます。
最後のQuizMachineでは整形したデータを取得して
クイズゲームを担当する機能で、次に実装していきます。
クイズを扱う機能のファイルを作成する
quiz_machine.py
import html
class QuizMachine:
def __init__(self, quiz_bank):
self.question_number = 0
self.score = 0
self.quiz_bank = quiz_bank
self.current_question = None
def still_has_questions(self):
return self.question_number < len(self.quiz_bank)
def next_question(self):
self.current_question = self.quiz_bank[self.question_number]
self.question_number += 1
q_text = html.unescape(self.current_question.text)
return f"Q.{self.question_number}: {q_text}"
def check_answer(self, user_answer):
correct_answer = self.current_question.answer
if user_answer.lower() == correct_answer.lower():
self.score += 1
return True
else:
return False
QuizMachineというクラスを作ります。
整形したデータはmain.pyでさらに出題しやすいように抽出されたデータを作るのですが、
そのデータからクイズを出す機能を作ります。
主に
- データを取得する
- スコアの設定
- データがある分次々と出題する
- 正解かを判断する
です。
上から説明すると、init部分では初期状態として、スコアと取得したデータ、今何問目かを初期化します。selfの次にquiz_bankがある通り、このクラスを使う時は()にquiz_bankを入れることで機能します。
still_has_questionは取得したデータの数を数えて、その分だけ数を出力するもの。
出力されなかったらクイズ終了の表示をUIのファイルがする予定。
next_questionでは初期値のquestion_numberのリストの内容を取得してから1を足して
質問内容を出力しています。
これをすることでリストとしては0番目の内容が見た目は1番目として見せることができます。
htmlをインポートしているのは、質問の中には "+= 1" のように
ウェブサイト上で表記するための記号がある場合があります。
それをpython上でもきちんと表示されるように変換するためのファンクション = unescapeを使うためにインポートしています。
UIを作成する
design.py
from tkinter import *
from quiz_machine import QuizMachine
THEME_COLOR = "#efefef"
class QuizUI:
def __init__(self, quiz_brain: QuizMachine):
self.quiz = quiz_brain
self.window = Tk()
self.window.title("Quizzler")
self.window.config(padx=20, pady=20, bg=THEME_COLOR)
self.score_label = Label(text="Score: 0", fg="#333", bg=THEME_COLOR)
self.score_label.grid(row=0, column=0, columnspan=2)
self.canvas = Canvas(width=300, height=250, bg="white")
self.question_text = self.canvas.create_text(
150,
125,
width=280,
text="Some Question Text",
fill="#333",
font=("Arial", 20, "italic")
)
self.canvas.grid(row=1, column=0, columnspan=2, pady=50)
true_image = PhotoImage(file="images/maru.png")
self.true_button = Button(image=true_image, highlightthickness=0, command=self.true_pressed)
self.true_button.grid(row=2, column=0)
false_image = PhotoImage(file="images/batsu.png")
self.false_button = Button(image=false_image, highlightthickness=0, command=self.false_pressed)
self.false_button.grid(row=2, column=1)
self.get_next_question()
self.window.mainloop()
UIにQuizMachineをインポートすることでUIファイルでQuizMachineの機能が使えるようになります。
innitに(self, quiz_brain: QuizMachine)を入れて、
self.quiz = quiz_brainを入れることで継承ができます。
あとはtkinterの今まで使った機能と同じ感じ。
丸ボタンを押すとtrue_pressed、バツボタンでfalse_pressedという機能を発火します。
一通りのUIができたので、最後にクイズを取得する機能 = get_next_question()を入れて
innit部分は終了。
次に、UI上の変化として
を実装していきます。
design.py
def get_next_question(self):
self.canvas.config(bg="white")
if self.quiz.still_has_questions():
self.score_label.config(text=f"Score: {self.quiz.score}")
q_text = self.quiz.next_question()
self.canvas.itemconfig(self.question_text, text=q_text, fill="#333")
else:
self.score_label.config(text=f"Final Score: {self.quiz.score}")
self.canvas.itemconfig(self.question_text, text=f"Quiz is End!\nYour Score is {self.quiz.score}", fill="#333")
self.true_button.config(state="disabled")
self.false_button.config(state="disabled")
def true_pressed(self):
self.give_feedback(self.quiz.check_answer("True"))
def false_pressed(self):
is_right = self.quiz.check_answer("False")
self.give_feedback(is_right)
def give_feedback(self, is_right):
if is_right:
self.canvas.config(bg="blue")
self.canvas.itemconfig(self.question_text, fill="#fff")
else:
self.canvas.config(bg="red")
self.canvas.itemconfig(self.question_text, fill="#fff")
self.window.after(1000, self.get_next_question)
self.quiz.機能 は、QuizMachineに記述したdefの機能を読み込ませています。
一番最初に背景を白に設定しているのは答えを押した後に背景が青か赤になってしまっているのでそれをクリアするためです。
最初にstill_has_questionsを使うことでクイズがあるかどうかを判断しています。
そこからクイズがあればテキストをnext_question()を起動して
return として出力している Q1: クイズ のテキストをq_text の変数に格納し、
クイズ表示部分に表示をしています。
true_pressed, false_pressedはcheck_answer()を起動して
True,またはFalseを入れることで
correct_answer と同じかどうかをチェックしてあっていたらスコア+1でTrueを返す、
間違っていたらFalseを返します。
という機能にしています。
自分の答えが合っていると+1をしてTrueを返す quiz.check_answerですが、
Falseの時だけ is_rightという機能が付いています。
それは下のgive_feedbackの部分で正解だったら青背景、間違っていたら赤背景にするためです。
UI部分もできたのでmain.pyの最後にUIのクラスを追加して出来上がり。
ファイルを行き交う継承とか結構ややこしい。。。
Gitはこちら