ほぼPython

Not技術ブログBut勉強ブログ 内容には誤りがあることが多いです

プログラミングが出来ると人生得する

久しぶりの更新です。

 

今日は、プログラミングのおかげで人生得した経験について書いていこうと思います。

 

人生得したと言うといろいろありますが、特に「プログラミングできない人は手動でやるんだろうけど、俺はプログラミングできるからコードにやらせます(ドヤ顔)」みたいな事例に絞ります。

 

あ、とは言っても僕のプログラミングレベルは趣味程度なのでそこまですごいことはできません、つまり、そこまでインパクトのあるエピソードはありません。そこはご了承ください。

 

1. 学校から与えられたシミュレーションソフトに不備があったので自分で作ったらテストが免除になった

 

えー、これはですね。大学から河川を流れる汚染物質の拡散シミュレーションソフト(Flash)が配布されました。シミュレーションと言っても、ちょっとした方程式に則って、時間と距離を変数として汚染物質の濃度が三次元グラフとして表示できるようなものでした。

 

しかし、このソフトにちょっとしたバグがあり、イライラしたのでJavaScriptで同じようなことが出来るアプリケーションを作成しました。

バグがない点を除けば、劣化版コピーみたいなものです。

しかし、せっかく作ったのでレポートでさりげなくアピールはしました。

 

その結果、定期試験前に先生からメールが来て「君はよく頑張ったからテスト受けなくて良いよ!成績はSだよ!」と言われました。自分スゲーーってなりました。まぁ友達いないんでこの喜びを誰とも共有できなかったんですけどね。

 

2. 卒業研究の実験データの処理を自動化した

 

これはまさに「退屈なことはpythonにやらせよう!」って感じです。卒業研究では、化学センサの作製を試みていたのですが、センサの出力データをエクセルに移してグラフ化するという作業がありまして、1回やっただけで嫌になりました。そこで、その作業をpythonで自動化しました。これにより実験後のデータ処理の時間が大幅に短縮され、卒業研究の間も比較的時間にゆとりのある暮らしをすることができました。空いた時間にひたすらバラエティを見てました。生産性はゼロでしたね、はい。

 

3. ホームページの単調な修正をせずに済んだ

 

これは本日の出来事です。研究室のホームページの単調な修正をお願いされてしまいました。その修正というのは研究室から出している論文の書式の変更です。特に名前の部分を変更してくれとお願いされてしまいました。論文全部で300本ほどあり、その中に著者が何名もいるのでこれをチマチマと書き換えていたら日が暮れてしまいます。

 

そこで、pythonの出番です。(?)

pythonでHTMLの書き換えたい部分を抜き出して、正規表現を使って名前の部分を整形し、元に戻すというような処理をさせればすぐに終わります。

 

 

しかし、、、!

 

悲しいことにここ半年ほどまともにpythonを使っていなかったのですっかり忘れてしまっていました。残念!

 

そこで、バイトでも使っていたJavaScriptの力を借りることにしました。JSの方も3ヶ月くらいまともなコードを書いてはいなかったので、悪戦苦闘したものの、書き換えに成功しました。

単純に書き換えていたらもっと長い時間がかかったことが予想されますし、単純労働なので非常にキツかったと思います。そんなめんどくさい作業をプログラミングで出来たのは達成感ありましたね。

 

まとめ

以上3つが、プログラミングができたおかげで得したことです。たぶんもっと高度なことができるようになるともっと何かを解決するのに役立つんだと思います。いやはや、プログラミングとは素晴らしいですね(python勉強しなおせ)

Herokuでデータベース(PostgreSQL)を使うときにかなり役に立ったリンク集

お久しぶりです。卒論が忙しくて全然ブログ更新できませんでした。

本日卒論を提出し、一応、卒論は終わったので(まだ卒業発表がありますが・・・)

卒論終わった記念に早速ブログ書いておきます。

 

今回は僕がHerokuでデータベース(PostgreSQL)を使う際に、かなり役に立ったリンクを用途別にまとめようと思います。

 

ネットの情報は玉石混交(正しくは交ではなく、淆)なので参考になる記事と参考にならない記事があり、参考にならない記事が上位にヒットすることも多々あるので、ここで、実際に参考になった記事をまとめておきます。

 

Herokuでデプロイしたアプリでデータベースを使うのに必要な手続きは

 

postgreSQLをインストールすること

②Herokuのアプリを拡張し、データベースを追加すること

(③Herokuからコマンドでデータベースを操作すること)

Pythonからデータベースを操作すること

 

この4つだと思います。③に関しては必ずしも必要なわけではないですが、確認とかで使います。

 

 

postgreSQLのインストール方法

www.dbonline.jp

 

Herokuのアプリにデータベースを追加する方法

qiita.com

 

Herokuでデータベースにアクセスする方法

qiita.com

 

PythonからPostgreSQLを操作する方法(psycopg2モジュール)

d.hatena.ne.jp

 

以上、この4つのリンクが非常に助かりました。

当リンク集が誰かのお役に立てることを願っています。

 

あまり役に立つかわかりませんが、一応Flask使って作成したデータベースのデモサイトを作成しました。ソースはすべてGitHubに載せてありますので、ご参考までに。

github.com

 

 

 

 

PythonのGUI自動化で自作Webサイトにアクセスを試みた

今日、図書館で退屈なことはPythonにやらせようを読んでいたらGUIオートメーションについての記載がありました。

 

GUIオートメーションとは、キーボードやマウスをプログラムで操作してフォームの入力など退屈な作業を自動化するといった話のようです。

 

当然の発想ですが、GUIオートメーションによって、セキュリティが(ものすごく)低いサイトに対してなら簡単にアクセス出来ます。

 

ということで、さっそくやってみました。

 

今回用意したデモサイトは

フォームに4桁のパスワード(数字)を入力し、パスワードが一致すると他のサイト(僕が前に作ったデモサイト)に飛ぶという仕様になっています。

さらに、何度入力を間違えてもロックがかからないというセキュリティがひどいものになっています。(そもそもパスワードの認証部分はJSで書いていて、まったくパスワードになっていませんが、見かけ上パスワードということで。)

 

pyautoguiというすごく便利なモジュールを使って

 

・マウスの制御によりフォームのクリック

・キーボードの制御によるパスワードの入力

 

を行います。そして、別ページに飛べるまでループを続けるという処理により、アクセスしています。

 

 

退屈な動画ですが、アクセス動画はこちらです。

 

 

 

 

 

くどいようですが、マウスクリックや入力はすべてプログラムが制御しています。

ただ、動画を見ていただけるとわかると思いますが、思っていた以上に動きが遅いです。

そうは言っても4桁ですべて数字・何回ミスしてもロックされないというゆるゆるセキュリティのサイトがもしあれば、こういうプログラムを起動して放置しておけば、侵入できてしまうので、危ないですね。(まぁ、そんなサイトはないと思いますが・・・)

 

手入力なんかせずとも、GUI自動化をすれば繰り返しのフォーム入力の自動化など面白いことがいろいろできます。皆さんもぜひ試してみてはいかがでしょうか。

 

コードはすごく簡単なので、今回は公開はしないでおきます。

ほとんどpyautogui.clickとpyautogui.typewriteだけしか使ってないです。

 

 

 

PythonとMySQLを接続しようと思ったら遠回りしてしまい苦労した話

Pythonでデータベースを使う必要が出てきました。

 

そこで、とりあえず、MySQLとつなげてみようと思い、MySQLのインストールから始めました。最終的にはPythonからデータベースをいじることに成功しましたが、結構遠回りしたので、せっかくなのでまとめておきます。

 

合計所要時間は100分です。遠回りにかかった時間は60分です。

きっと遠回りしなければ、1時間もかかりません・・・。

 

MySQLのダウンロード・インストール

MySQLのダウンロードおよびインストール、その後のPATH通しなどは以下のサイトを参考に、ハマることなく、終えました。

このサイト、信じられないほどわかりやすかったです。

 

 

MySQLのインストールとPATH通しが終わったら、さっそくデータベースを作ってみました。

 

データベースを作成

まず、コマンドプロンプトからmysqlに接続します。

mysql -u root -p

 

データベースを作成します。今回、名前はsampleとしました。

create database sample;

 

データベースにテーブルを作成します。今回はpersonというテーブルを1つだけ作成しました。ちなみに、「id」のデータ型はint型、「name」データ型はvarchar(20)型を指定しています。

create table sample.person(id int, name varchar(20));

 

テーブルが作成できているか確認します。テーブルを表示します。

show tables from sample;

 

作成したテーブルにデータを挿入します。

insert into person(id,name) values(1453 ,'Yanagi');

 

テーブルのデータを表示します。無事、データが入っています。

select *from sample.person;

 

僕は、これで満足したのですが、ユーザーというのも作成する必要があるようです。 

 

ユーザーの作成

create user hoge@localhost IDENTIFIED BY 'password';

 

ユーザーの権限の設定

grant all on sample.* TO hoge@localhost;

 

これで、MySQLの方は終わりました。たぶんここまで30分くらいでした。

 

Pythonとの接続(失敗した手順)

さて、MySQLはいい感じだったので、Pythonから操作するというメインの部分にとりかかりました。

 

まず、ググったら mysqlclient というモジュールが良いと出てきました。そのため、このモジュールのインストールを以下のように試みました。

pip install mysqlclient

しかし、エラーが出ました。

 

エラーメッセージ:

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": url

 

 そこで、【python】ライブラリインストール時に「error: Microsoft Visual C++ 14.0 is required.」エラーが発生を参考にエラーの対処に取り掛かりました。

 

しかし、その後もcl.exeが無い?と言ったようなエラーが出ました。(エラーメッセージは消してしまいました・・・)

 

ここまで来て、このまま突き進むのは良くないと感じ、別の方法を調べました。

 

すると、mysqlclientがWindowsでインストールできない | coffee break designs.というページに行き付きました。

このページを参考にwhlファイルを直接ダウンロードし、それを利用してインストールしようと試みました。

 

しかし、ここでもまたエラーが。

 

エラーメッセージ:

●● is not a supported wheel on this platform.

 

どうやら、whlファイルにはいくつか種類?があり、対応しているものを選ばないといけなかったようです。

 

qiita.com

 

ここに載っている方法で対応しているタイプを調べました。

 

これでwhlファイルがあるフォルダに移動し

pip install ファイル名.whl

 

 とすることで、無事、mysqlclientのインストールに成功しました。

 

ここに至るまでに60分・・・

しかし・・・!!

 

実際にPythonからこのモジュールを使おうとするとエラーが発生しました・・・。

 

エラーメッセージ:

_mysql_exceptions.OperationalError: (2059, <NULL>)

 

調べてみると、こんな回答が。

stackoverflow.com

僕の場合にも当てはまるかわかりませんが、この回答者はMySQLをダウングレードしたら使えるようになったそうです。MySQLのダウングレードはまたいろいろとハマりそうだと思い、ここにきて別のモジュールを使おう・・・と思いました。

 

Pythonとの接続(成功した手順)

このページを参考に進めたら、どこにもハマることなく10分でPythonからMySQLを操作することに成功しました・・・。

www.sejuku.net

 

まとめ

結果的には、間違った方向へ進んでしまいかなりの時間を無駄にしてしまいました。

 

しかし、whlファイルを使ったインストールなど、新しい方法を知ることもできて勉強になりました。

 

そしてバズワードと侍エンジニア塾ブログは非常にわかりやすかったです。

 

今後、データベースを使ったものを作っていきたいと思います。

 

ここまで読んでいただきありがとうございました。

任意のTwitterユーザーの画像・動画・GIF動画を保存するプログラムをまた、少し改良。

前に作ったものですが、さらに改良して、画像・動画・GIF動画が添付された際のツイートとその日時をエクセルファイル(.xlsx)に保存するようにしました。

 

コマンドプロンプトから実行し、DocumentにユーザーIDごとにフォルダが作られます。このフォルダをそのままにしておけば、再度起動した際、(見かけ上)更新分のみDLします。

 

まぁ、同じような機能をもつもっと優れたアプリは山ほどあります。完全に自己満ですね・・・。(自分のはコマンドプロンプトから起動する感じだし)

 

改良版ソースはこんな感じです。

Pythonでババ抜きシミュレーターを作った

こんにちは。

どうやら、今日でちょうど、このブログを開設して半年だそうです。このブログの開設と同時にPythonを始めたので、Pythonを勉強し始めてからちょうど半年が経ったということになりますね。

 

さて、来る8月某日に大学院入試(化学系)を迎える私ですが、諸事情により(?)全く入試の勉強をする気は起きず、勉強は放置しておき、ババ抜きシミュレーターを作ってみました。(友人に触発された)

 

簡単にできると思って作り始めたのですが、かなり苦労しました。

これまでは、「モジュールの使い方がわからない」とか「APIの仕様がわからない」というわからないがほとんどでしたが、今回のプログラムについては「処理の流れをどうすればいいかわからない」という、調べてもそう簡単に解決する問題ではない悩みでした。(競プロにおける、この問題わからない、に近い)

 

Twitterでそんなことを呟いていたら、「やることを箇条書きにしてみるといい」というアドバイスをいただいたので、箇条書きにしてみました。これにより、一気に作業が進み、たぶん完成しました。

 

実際に、プログラムを実行する。

今回は、プレイヤーの人数は10人にしました。

まず、各プレイヤーにカードが分配され、かぶっているカードは捨てられます。

 

f:id:short_4010:20180727175152p:plain

 

次に、それぞれのプレイヤーが次のプレイヤーからカードを引きます。手札にカードのかぶりがあったらカードを捨てて、手札が0枚になったら上がります。

 

f:id:short_4010:20180727175524p:plain

 

途中も、同じようにひたすら進んでいきます。最後のターンを載せておきます。

 

f:id:short_4010:20180727175825p:plain

 

ちなみに、「ターン」については、あるプレイヤーが1回カードを引いたら「1ターン」にしています。そのため、##118ターン目 と書いてありますが、実際に、ゲームが終了したのは、119ターン目になります。(ちょっと書き方が微妙だなと思ったが、これが一番きれいに書けたので妥協しました)

 

最後に、結果が表示されます。

 

f:id:short_4010:20180727180459p:plain

 

苦労した点について

特に苦労したのは、手札が0枚になったら上がるという処理です。

 

当然ですが、カードを引いたプレイヤーだけではなく、カードを引かれたプレイヤーも手札が0枚になる可能性があります。このあたりの場合分けをできるだけキレイに書きたいと思い、もがいていました。しかし、プレイヤー自体を配列として持っているので、上がるプレイヤーの配列上の位置によって処理を変える必要があるなど、どうしても読みにくいコードになってしまいました。

 

さらに、プレイヤーが上がったときに、上がった後のプレイヤーからゲームを再開するにはどうすればいいかという点も苦労しました。これについては、プレイヤーの配列を並び替えてループし直すという処理により解決したはずです。

 

醤油も載せておくので、ぜひコピーしてシミュレートしてみてください!(あと、もし、間違っているところに気づいたらご指摘お願いします!!)

ソース

 

 

 

PythonのTinyDBを使ってキャッシュっぽい機能をつくる。

PythonのモジュールにTinyDBというものがあります。

これは、指定したデータをjsonファイルで保存してくれて、簡単なデータベースとして使えます。

 

さて、ぷちばず検索でTwitterAPIを使ってツイートを検索する際に、すぐにAPI制限に引っかかってしまうため、誰かがアクセスしたら、その時に取得したツイートリストをデータベースに保存して、15分間はそのデータベースから読みこむという処理をしています。15分経つと、またAPIを使ってツイッターにアクセスします。(ちなみに、HEROKUはアクセスが無いと30分でデータベースは消えてしまいますが、今回はずっと保持していたいデータなわけではないので問題ない)

 

こんな感じの機能をキャッシュというっぽい(要出展)ので単体で、この機能だけのコードを書いてみました。

 

今回は、コードが実行されるとi=0からi=100000000まで計算されるという重い処理をしています。しかし、30秒以内にもう一度コードが実行された場合、データベースから読み込むので計算せずに済み、処理が早くなります。

 

初回実行時

f:id:short_4010:20180704224004j:plain

 

これを見ると、実行に15秒くらいかかっていることがわかります。

 

 

30秒以内にもう一度実行した場合

f:id:short_4010:20180704224013j:plain

 

これを見ると、0.4秒で実行が完了していることがわかります。

 

キャッシュを使えば、処理の時間を短縮出来たり、APIの使用回数を減らせたり、いいことがたくさんですね。

 

ソースも載せておきます。