ほぼPython

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

プログラミングバイト、結構ツライ。

現在、Web系の企業でプログラミングおよびコーディングのバイトしてますが、2回に1回はツライ思いをします。

 

そのツライ思いの理由は単に自分の知識不足なことがほとんどで、しっかり勉強し直さなければいけないなと思い深く反省しております。

 

ただ、それ以外にも「あぁ、こういうことがあるんだなぁ」と思ったことが2点ありますので、その点について書いておこうと思います。(丁寧語終わり)

 

 

1. 「どれくらいで出来そう?」には長めに答えるべきだった話

 

とあるサイトのデモページを作成するようにお願いされた。HTML/CSSによるコーディングおよびJavaScriptによるちょっとした機能の追加という内容だった。

 

その際、「どれくらいで出来そう?」と聞かれたので、自分の能力を評価してもらうためにも、余裕を持って答えるのは良くないなと思い、きっと終わるだろう、くらいの時間で答えた。

 

作業は順調に進んでいた。このペースなら自分で宣言した時間よりも早く終わりそうだった。

 

しかし、そこで、別の社員の方が〇〇は△△にした方が良いとアドバイスをくれた。

 

そのアドバイスは非常にためになる内容だったし、実際のページではそのような処理になっていることがほとんどのようだ。

 

しかし、残念ながら自分が書いていたコードでそれを変更すると、すでに書いた部分の3割ほどを変更しなければいけない状況だった。

 

「時間がヤバイな」そう思いながらも、よろしくないコードは書きなおすべきだと思い、書き直した。

 

その結果、残念ながら宣言した時間内に終わらず、社員の方から「どう?」と様子を聞かれるハメになってしまった。

 

もちろん、まだ新人の僕に対して、かなり優しく接してくれているが、そりゃ内心では「おい!この無能!てめー自分で〇時間で終わるって言ったよな?そんくらいの作業さっさと終わらせろよ!」と、思っていたに違いない。そう思うと非常に情けない。ダサい!かっこ悪い!

 

コードを書いている途中で他の方からのアドバイスなどにより時間が伸びてしまう可能性があるのでそこも見越して「どれくらいかかりそう?」という問いにはある程度の余裕を持って答えるべきなのだなと感じた。

(まぁそもそもアドバイスの余地があるコードを書くことが問題なのだが)

 

 

 

 

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ファイルを使ったインストールなど、新しい方法を知ることもできて勉強になりました。

 

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

 

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

 

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

自己紹介とこれまでに作ったもの

 自己紹介

ブログ見てくださってありがとうございます。名古屋大学4年の理系陰キャです。化学系の大学院に進学予定です。

 

そこまでコミュ障ではないはずなのに友達がほぼいません。大学では(主に)化学を勉強していますが、2018年1月末にPythonにハマり、Webアプリケーションを作ったり、便利プログラム、化学計算をPythonで行うプログラムなどを書いています。

 

作ったものやその過程を大雑把にブログで紹介しています。あくまでも趣味なのでそこまでガチ勢ではないです。

 

プログラミング関係以外にもボクシング(ジムに6年通っていた)、カメラ(使用機種:Canon EOS 9000D, ぼちぼちPhtoshop使えます)、音楽(XJAPAN, DIR EN GREY, 椎名林檎, AquaTimez, アニソンop, ボカロ)、アニメ(好きなアニメ一覧)が好きです。

 

かなりの、にわかレベルで、仮想通貨、政治、法律、ギター、ピアノ、小説、医療技術、統計学、心理学、脳科学、SF、筋トレ、アートも好きです。

 

以下にこれまでに作ったものを載せておきます。

 

 

 

フラッシュ暗算

作成日:2017/12/16

これはJavaScriptの勉強をしていたときに作りました。フラッシュ暗算のページです。正直載せるほどのものでもないと思いますが、一応。

 

f:id:short_4010:20180815234348j:plain

 

TwiGraph

作成日:2018/02/23

Pythonの勉強を始めて、一番最初に作ったサイトです。

選択期間の日別ツイート数を可視化します。ツイート数の分布からその人の生活習慣などを推測出来たら面白いなと思って作成しました。

 

 トップページはこんな感じです。

 

f:id:short_4010:20180815235504j:plain

結果画面はこんな感じです。

 

f:id:short_4010:20180815235734j:plain

 

 

スマホからアクセスの場合は、縦に並びます。結構デザインがクソです。

 

Otaku Detector

作成日:2018/04/03

このサイトでは、オタクである確率を%で表示します。

数学的にどれくらい正しいかわかりませんが僕がやったのは

ツイッターで200人分くらいのユーザーのツイート頻度を取得

・それらのユーザーがオタクかどうか主観的に分類

・このデータを教師データとしてロジスティックモデルの変数を決定

という流れです。

あなたがツイッターでログインすると、ツイート頻度を計算し、ロジスティックモデルに当てはめ、オタクである確率を計算します。

 

f:id:short_4010:20180816003305j:plain

 

サイトの雰囲気はIBMPersonality Insightsを参考にしました。

 

ぷちばず検索

作成日:2018/06/09

 ツイッターでRT数を指定してツイートを検索するサイトです。

検索しすぎてAPI制限がかかるのを避けるために、15分間はサーバーにキャッシュが保存され、同じ結果を表示します。

f:id:short_4010:20180816010701j:plain

 

 検索すると、結果をツイートを埋め込む形で表示します。

f:id:short_4010:20180818145117j:plain

 

 

雑学☆雑記

作成日:2018/08/17

Pythonとデータベース(MySQL, PostgreSQL)を接続したくなったので、接続してみました。HerokuでPostgreSQLが使えたので、雑学をひたすら書き溜めてデータベースに保存していくページを作ってみました。

 

f:id:short_4010:20180818152543j:plain

 

 

その他もPythonで動かすツイッターの特定ユーザーのメディアを全部DLするプログラムや、Pythonで動かすババ抜きなども作っています。コードはGitHubのgistに挙げています。

Yunaka12’s gists · GitHub

 

 

 

 

 

 

 

 

 

 

 

任意の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の使用回数を減らせたり、いいことがたくさんですね。

 

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