Python関連のことを調べてみた2020年04月13日

Python関連のことを調べてみた2020年04月13日

Django管理画面のカスタマイズ はじめの一歩

Djangoの管理画面のカスタマイズを実施します。
デフォルトのDjangoの管理画面はあまりイケてる感じではないですが、デザインを自分好みに変えられます。
そのための第一歩として、**どのファイルをいじればよいのか?**を整理します。

# Djangoのインストールおよびプロジェクトの作成
この記事読んでる人でDjangoをインストールしてない人は少ないと思いますが、
もしいらっしゃる場合は[こちらの記事](https://qiita.com/Shirokuma_0607/items/db30765b9aa9374cd676)を参照してください。

# adminアプリケーションのtemplateの場所を確認
環境をどうやって作成しているかで十人十色ですが、Pythonの実行環境からライブラリにインストール場所を探してください。
`django.contrib.admin.templates`というディレクトリがあるはずです。
この中に、adminアプリケーションのtemplateが格納されています。
**※このファイルを直接いじるようなこと

aiohttp_session で EncryptedCookieStorage を使う際のシークレットキー生成

備忘録。

[aiohttp_session の EncryptedCookieStorage](https://aiohttp-session.readthedocs.io/en/stable/reference.html#aiohttp_session.cookie_storage.EncryptedCookieStorage) を使う際のシークレットキーは、32バイトの bytes-like object もしくはそれを base64 エンコードした文字列でなくてはならない。

“` console
$ pip install cryptography
“`

“` python
from cryptography.fernet import Fernet

print(Fernet.generate_key().decode())
“`

Pythonのpathlib備忘録

# pathlibとは
Python 3.4(?)以降の標準ライブラリにある便利機能([公式ドキュメント](https://docs.python.org/ja/3/library/pathlib.html#concrete-paths))
os ライブラリに代替する機能を多く揃えているだけじゃなく、もうなんか、すごい奴。

色々できすぎて優秀すぎるが故、調べるのが結構手間だったりする(機能が多すぎる)
そこで個人的によく使う`Path`の使い方のみ手早く記載していく。
もっと良い方法等あればコメントを頂きたく存じます。

### Pathオブジェクト準備
“`python
# インポート
from pathlib import Path

# オブジェクト作成
p = Path(r”C:\Users\admin\Desktop\temp\hoge.txt”)
“`

### 各種情報の取得方法
“`python
# ファイル名
print(path.name) # >> hoge.txt
# ファイル名 拡張子なし
print(path.stem) # >> hoge
# 拡張

言語処理100本ノック2020 第一章

## 第1章:準備運動

[言語処理100本ノック2020版](https://nlp100.github.io/ja/)が公開されたのでこの機会に解いていく際のログ。
自分のjupyter notebookをmarkdownに起こしたものなので,説明は少なくなってしまっています。少しでも参考になればと思い,ブログとGitHubにまとめる予定のものをQiitaにも投稿してみました。

こんな素晴らしい教材を提供していただける先生方に頭が上がりません。

### 00.文字列の逆順

> 文字列”stressed”の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

“`python
def reverseStrings(s):
return s[::-1]

print(reverseStrings(“stressed”))
“`

desserts

### 01.パトカータクシー

> 「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ

“`python
def extractStrings(s):

言語処理100本ノック 2020 第5章: 係り受け解析

先日,[言語処理100本ノック2020](https://nlp100.github.io/ja/)が公開されました.私自身,自然言語処理を初めてから1年しか経っておらず,細かいことはよくわかっていませんが,技術力向上のために全ての問題を解いて公開していこうと思います.

すべてjupyter notebook上で実行するものとし,問題文の制約は都合よく破っていいものとします.
ソースコードはgithubにもあります.[あります](https://github.com/nymwa/nlp100/blob/master/chapter05.ipynb).

4章は[こちら](https://qiita.com/nymwa/items/447211c40dc657132c91).

環境はPython3.8.2とUbuntu18.04です.

# 第5章: 係り受け解析
> 夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを

Python + OpenCVで野球ボールをトラッキング

久しぶりにOpenCVのサイトを見たら新しくなってたので、ちょっと触ってみました。

Home

だいぶ前にJavaで野球ボールをトラッキングをしていたので、今回はPythonでやってみました。
トラッキングは、背景差分とテンプレートマッチングを組み合わせて行います。

## 環境構築

環境は以下になります。

– Python : 3.8.0
– OpentCV : 4.2.0

`venv`で環境を作っています。`venv`じゃなくても問題ないです。

“`console
$ python -m venv pythonOpevCV
$ cd pythonOpenCV
$ Script\activate
$ python -m pip install –upgrade pip
$ pip install opencv-python
Successfully installed numpy-1.18.2 opencv-python-4.2.0.34
“`

`numpy`もインストールされるんや。

## 用意するもの

以下のものを用意してくださ

(自分用メモ) Python のパッケージとモジュール

なんとなくわかった気になって使っている人が多そうな、Python のパッケージとモジュールについてざっくりと勉強します。

# 動機

他人の書いた Python の機械学習のコードがあります。
カレントディレクトリからみて `./a/b/c.py` の場所に実行したいファイルがあります。
このファイルは `__name__` の値によって2通りに動作する、よくある形式で書かれています。
中では `./a/b/d.py` を `import d` によって **絶対 import** しています。

このとき、`PYTHONPATH` をデフォルトのままと仮定すると、`python ./a/b/c.py` とした場合と、他の python ファイルから `import a.b.c` とした場合で、どちらが正しく動作するかが変わります。
前者が動いている状態では後者が動かず、後者が動くように、`c.py` 内を相対 import に書き換えると前者が動かなくなります。
一体何が起こっているのだろうかというのが、今回勉強する動機です。

後者の状況をもう少し説明します。ユニットテストのため

PEP 560 (Core support for typing module and generic types) を読んだよメモ

昨日に引き続いて `__origin__` という属性について調べていたら、PEP 560 — Core support for typing module and generic types という PEP にたどり着きました。この PEP は 3.7 から採用されているので、すでに実装が存在して触ることができるやつです。

## 概要

* 型ヒントが登場したとき、Python 本体に手を入れないように設計していた
* しかし、当時(バージョン 3.6)は 3つの問題があった
* `typing` モジュールのパフォーマンス
* メタクラスの競合
* `typing` モジュールで使われている多数のハック

## アプローチ

* `__class_getitem__` 、 `__mro_entries__` というふたつのスペシャルメソッドを追加する
* `__class_getitem__`
* クラスオブジェクト向けの `__getitem__`
* `Iterable[int]` などの場面で利用される
* `__mro_entri

どの8進数リテラルが使えるかはプログラミング言語によって異なる

(この記事は [地平線に行く](https://yujisoftware.hatenablog.com/entry/octet_literal) とのマルチポストです)

8進数を表記する文法は、主に以下の3つがあります。
(二番目と三番目は分かりにくいですが `ゼロ オー`[^octet] です)

* プリフィックスとして `0` を付与する (例: `0123`)
* プリフィックスとして `0o` を付与する (例: `0o123`)
* プリフィックスとして `0O` を付与する (例: `0O123`)

これらのうち、各プログラミング言語がどの文法を採用しているかを表にまとめました。

|言語|`0`|`0o`|`0O`|
|:–|:–:|:–:|:–:|
|C|○|×|×|
|PHP|○|×|×|
|Perl|○|×|×|
|Java|○|×|×|
|Scala (~2.9)|○|×|×|
|Scala (2.10~)|×|×|×|
|Kotlin|×|×|×|
|C#|×|×|×|
|Rust|×|○|×|
|Swift|×|○|×|
|Go|○|○|○|
|

Python curses でマウスのホイールの判定を取得する方法

## 環境
– Mint 19.10
– Python 3.7.5

## はじめに
curses にマウスのホイール判定が用意されていなかったので自作した。

これを読む前に前提となっている[この記事](https://qiita.com/t4t5u0/items/bd5270d0a7b3def35a03)を読んでほしい。

## 症状
ホイール判定をとれない

## 原因
curses には、マウスのクリック判定などが用意されているが不十分で、ホイール判定。特に下にスクロールするときの判定が用意されていない。

## 解決策
判定部分のコメントは日本語入力の記事を参照。擬似コードです。windowオブジェクトをきちんと宣言していません

“`python
import curses

window = curses.stdscr()
key = window.getch()

text_pool = [key]
if 0x00 <= key <= 0x7f: pass elif 0x80 <= key <= 0xbf: print(key) exit

Python curses で日本語を入力する方法

## 環境
– Mint 19.10
– Python 3.7.5

## はじめに
cursesのgetch() を使った場合にUTF-8でエンコードしたときに日本語(マルチバイト文字)がうまく受け取れなかったので、処理部分を作った。

## 症状
例えば ‘あ’ と打った場合には、0xe3 0x81 0x82 の3バイトに分けて、3回分入力されてしまう。しかし、これでは都合が悪い。(本当にほしいのは0x3042)

## 原因
getch() は1バイトずつ入力を見るので、UTF-8では3バイト分ある日本語などを正しく受け取れない。ということで、UTF-8のエンコーダを自作してやる。

## 解決策

先頭バイトを見ると、その文字列が何バイトか確定するから、以下のように条件分岐させる。
※擬似コードです。stdscrの部分などは省いています。windowオブジェクトを適宜宣言してください

“`python
import curses

window = curses.stdscr()
key = window.getch()

# マルチバイト文字の加工
# 日本語だと3バイ

デュアルスクリーンのスクリーンショットをドラッグアンドドロップで切り抜く

# 課題
デュアルスクリーンにしたところ、Windowsデフォルトのスクリーンショットで両方の画面が1枚の画像に写り込んでしまう。
片方の画面だけの画像がほしい。

# 環境
– Windows 10
– 画面は HD縦置き と HD横置き が左右に並んでいる

# 解決策
– python + OpenCV で実装
– OpenCVは日本語パス非対応なのでnumpyを経由する
– batに画像ファイルをドラッグアンドドロップで実行できるようにする
– (毎度コマンドを打つのは不便なので)

#実装

“` python:screenshot-cropper.py
# -*- coding:utf8 -*-
import sys
import os
import cv2
import numpy as np

def main():
if not (len(sys.argv) == 2):
return
img_path = sys.argv[1]
if not os.path.exists(img_path):

日本人の名前の一部を対義語に変換する

# はじめに

大学生時代、ひょんなことから友達の名前の一部を対義語にして呼んでみたことがありました。

* 西郷隆盛→東郷隆盛
* 小野妹子→大野妹子

何回か繰り返していると、ある友達のツボにハマってしまい、笑い過ぎて身動きが取れなくなってしまいました。その友達に久しぶりに喜んでもらいたい、あとはそれを自動化できたら(?)という思いがありプログラムで実装しました。

# 日本人の名前の一部を対義語に変換する

## データベース

[LinkData](http://ja.linkdata.org/home)より、[KeitarouNakayama](http://user.linkdata.org/user/KeitarouNakayama/work)さんが公開している“[漢字一文字の対義語](http://ja.linkdata.org/work/rdf1s3497i)”を利用させていただきました。380種の漢字(190対)でパブリックドメインです。

## 実装

関数を実装するコードは以下のようになりました。

“`python
import random
import

【第2回】pythonで某Authenticator的なツールを作ってみた

## 表示するユーザー情報をDB化してみた。
– 前回はユーザー情報をソースにそのまま書き込まないといけなかった。
– 初回実行時にgauth.dbってファイルがなければ作成する。
– INSERT INTO文でuser1〜3までをDBに入れてる。
– 実行すると実行した瞬間の認証番号を表示する。

“`python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tkinter as tk
import pyotp
import sqlite3
import os

if(os.path.exists(‘gauth.db’)):
pass
else:
# データベースに接続する
conn = sqlite3.connect(‘gauth.db’)
c = conn.cursor()
# テーブルの作成
c.execute(”’CREATE TABLE gauth(id integer primary key AUTOINCREMENT, name text, private

71日目 SIRモデルでこの自粛がいつまで続くか予測してみました

#SIRモデルを計算してみました。

新型コロナの流行はいつまで続くんだろう。
昨日のNHKスペシャル[「新型コロナウイルス 瀬戸際の攻防 〜感染拡大阻止最前線からの報告〜」](https://www.nhk.jp/p/special/ts/2NY2QQLPM3/episode/te/BLNZP53V36/)を参考に計算してみました。

##[SIRモデル](https://ja.wikipedia.org/wiki/SIR%E3%83%A2%E3%83%87%E3%83%AB)とは
感染症の流行〜収束を計算するのに使われている方程式です。

##PythonでSIRモデルを実装する
Pythonで実装したコードが[scipython.com](https://scipython.com/)にありましたので、使わせていただきました。

[The SIR epidemic model](https://scipython.com/book/chapter-8-scipy/additional-examples/the-sir-epidemic-model/)

“`SIR.py
im

Pythonで毎日AtCoder #34

### はじめに
[前回](https://qiita.com/taxfree_python/items/1356b8f7a76d1c6f2db1)
Boot camp for Beginnersをやっていきます

### #34
[ABC075-B](https://atcoder.jp/contests/abc075/tasks/abc075_b)

**考えたこと**
forとifで置き換えていくだけ

“`python
h, w = map(int,input().split())
s = [list(input()) for _ in range(h)]

for i in range(h):
for j in range(w):
count = 0
if s[i][j] == ‘#’:
continue
for n, m in ([-1,1],[-1,0],[-1,-1],[0,1],[0,-1],[1,1],[1,0],[1,-1]):
if i + n < 0 or

Pythonを使って正規表現で『時刻』とってみた

## 結論
pythonで『時刻』をとる正規表現はこちら。

“`python
pattern_date = ‘((0?|1)[0-9]|2[0-3])[:時][0-5][0-9]分?’
“`

## 準備
正規表現のチェックツールは以下が便利。
https://regex101.com/
こちらで確認しながらコードを実行する、という流れになります。
![スクリーンショット 2020-04-12 23.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189978/35f47b39-f359-3817-36a2-926f8978b239.png)

あと、Pythonの正規表現全般については、こちらがわかりやすいです。
書き方わからなくなったら、いつも参考にしてます。
https://qiita.com/luohao0404/items/7135b2b96f9b0b196bf3

では、早速コード書いていきましょう。
まずは、正規表現を使うためのライブラリをインポート。

“`pytho

スパコン ITO のバッチ処理で TensorFlow の実行手順

[スパコンITO](https://www.cc.kyushu-u.ac.jp/scp/index.html) のサブシステムB([ITO-B](https://www.cc.kyushu-u.ac.jp/scp/system/ITO/01_intro.html))には GPU が搭載されています.ITO-B で TensorFlow を実行する方法を紹介します.GPU を使うためにバッチ処理が必要となります.そのため,Jupyterではなく,Pythonコードとして実行する必要があります.
スパコンITOのフロントエンドにおいて,TensorFlow を実行する手順は[こちらの記事](https://qiita.com/jsasaki/items/07b6f6630653eae4ee4f)で紹介しました.手順はフロントエンドの場合と共通する部分が多いですが,ITO-Bでのバッチ処理の方が簡単です.
**以下の手順はすべて スパコンITO の ログインノード で行います.**

# TensorFlow のインストール
Minicondaで構築した Python の base 環境を前

PythonでABC162のA~Cを解く

### はじめに
今回はABC三完でした。dは文字列系の問題なので飛ばして、Eを考えてました。

### A問題
[問題](https://atcoder.jp/contests/abc162/tasks/abc162_a)

**考えたこと**
strで引いてinで確認する

“`python
n = input()
if ‘7’ in n:
print(‘Yes’)
else:
print(‘No’)
“`

### B問題
[問題](https://atcoder.jp/contests/abc162/tasks/abc162_b)

**考えたこと**
普通にfizzbuzzするだけ

“`python
n = int(input())

ans = 0
for i in range(n+1):
if i % 3 != 0 and i % 5 != 0:
ans += i
print(ans)
“`

### C問題
[問題](https://atcoder.jp/contests/abc162/tasks/abc162_c)
1

AtCoder Beginner Contest 162 参戦記

# AtCoder Beginner Contest 162 参戦記

## [ABC162A – Lucky 7](https://atcoder.jp/contests/abc162/tasks/abc162_a)

2分で突破. 書くだけ.

“`python
N = int(input())

if str(N).count(‘7’) > 0:
print(‘Yes’)
else:
print(‘No’)
“`

## [ABC162C – Sum of gcd of Tuples (Easy)](https://atcoder.jp/contests/abc162/tasks/abc162_c)

4分で突破. なぜか間違って先にC問題やってた. ジャッジシステムが詰まってて、オンライン実行が使えなくて時間がかかった. まあ、問題文通りに書くだけなんだけど、TLE になりそうだったので定数倍に手を入れた.

“`python
def main():
from math import gcd

K = int(input())

r