$now = date('Ymd');
$birthday = "1990-07-01";
$birthday = str_replace("-", "", $birthday);
$age = floor(($now - $birthday) / 10000);
echo $age . "歳";
$ php app.php
33歳
随机应变 ABCD: Always Be Coding and … : хороший
$now = date('Ymd');
$birthday = "1990-07-01";
$birthday = str_replace("-", "", $birthday);
$age = floor(($now - $birthday) / 10000);
echo $age . "歳";
$ php app.php
33歳
requestsを使うとWebデータの操作ができる。特に使われるのはWebスクレイピングやWebAPIを使ったデータ取得
requestsはHTTPライブラリ。自分とWebサーバとのHTML等の受信を送受信するためのプロトコルで、HTTPにはデータの参照や更新などのメソッドが用意されている。
PythonにはHTTPライブラリの標準モジュールとしてurllib.requestがあるが、requestsを使用した方が楽にプログラミンができる。
urllib.requestの場合
import urllib.request
url = 'https://httpbin.org/get'
r = urllib.request.Request(url)
with urllib.request.urlopen(r) as response:
body = response.read()
print(body.decode('utf-8'))
requestsの場合
import requests url = 'https://httpbin.org/get' r = requests.get(url) print(r.text)
WebAPIからのデータ取得
import requests
url = 'https://zipcloud.ibsnet.co.jp/api/search'
params = {'zipcode':'7830060'}
r = requests.get(url,params=params)
print(r.text)
requestsを使うことにより直感的な記述が可能になる。
pycryptodomeとは?
L pycryptodomeはデータの暗号化・復号化を可能にするpythonライブラリ
L pycryptoの方が知名度があるが後継のようなもの
$ pip install pycryptodome
pycryptodomeは次の三つの処理がある
– 秘密鍵・公開鍵の作成
– 公開鍵を使ったデータの復号化
– 秘密鍵を使ったデータの復号化
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
private_key = key.export_key()
file_out = open("private.pem", "wb")
file_out.write(private_key)
file_out.close()
public_key = key.publickey().export_key()
file_out = open("public.pem", "wb")
file_out.write(public_key)
file_out.close()
公開鍵を使ったデータの暗号化
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Cipher import AES, PKCS1_OAEP
data = "日本語で書かれた秘密のメッセージ".encode("utf-8")
file_out = open("encrypted_data.txt", "wb")
recipient_key = RSA.import_key(open("public.pem").read())
session_key = get_random_bytes(16)
# セッションキーをRSA公開鍵で暗号化
cipher_rsa = PKCS1_OAEP.new(recipient_key)
enc_session_key = cipher_rsa.encrypt(session_key)
# データをAESセッションキーで暗号化
cipher_aes = AES.new(session_key, AES.MODE_EAX)
ciphertext, tag = cipher_aes.encrypt_and_digest(data)
[file_out.write(x) for x in (enc_session_key, cipher_aes.nonce, tag, ciphertext)]
file_out.close()
なるほど、深いな…
psycopg2はpythonからPostgreSQLに接続するためのライブラリ
C言語で書かれたlibpgのラッパー
ライブラリのインストール
$ pip install psycopg2
データベース作成
postgres=# create database mydb;
CREATE DATABASE
テーブル作成
postgres=# \c mydb
You are now connected to database “mydb” as user “postgres”.
CREATE TABLE users(
id SERIAL,
email varchar(255) NOT NULL,
password varchar(255) NOT NULL,
PRIMARY KEY(id)
);
mydb=# \dt
List of relations
Schema | Name | Type | Owner
——–+——-+——-+———-
public | users | table | postgres
(1 row)
import psycopg2
connection = psycopg2.connect(host='localhost',
user='postgres',
password='password',
database='mydb')
with connection:
with connection.cursor() as cursor:
sql = "INSERT INTO users(email, password) VALUES(%s, %s)"
cursor.execute(sql, ('webmaster@python.org', 'very-secret'))
connection.commit()
mydb=# select * from users;
id | email | password
—-+———————-+————-
1 | webmaster@python.org | very-secret
(1 row)
withを使わずに記述することも可能。その場合は、自動的に閉じないため明示的に閉じる必要がある
import psycopg2
connection = psycopg2.connect(host='localhost',
user='postgres',
password='password',
database='mydb')
cursor = connection.cursor()
sql = "INSERT INTO users(email, password) VALUES (%s, %s)"
cursor.execute(sql, ('webmaster2@python.org', 'much-secret'))
connection.commit()
cursor.close()
connection.close()
なるほど、psqlに接続するためのライブラリってことね
Pandasはデータ解析を容易にする機能を提供するPythonのデータ解析ライブラリ
Pandasの特徴は、データフレーム(DataFrame)などの独自のデータ構造が提供されており様々な処理が可能
表形式のデータをSQLまたはRのように操作することが可能
Pandasの例
– CSV, Excel, RDBなどにデータを入出力できる
– データの前処理(NaN/Not a Number, 欠損値)
– データの集約及びグループ演算
– データに対しての統計処理及び回帰処理
import pandas as pd # from pandas import Series s1 = pd.Series([1,2,3,5]) print(s1)
$ python3 main.py
0 1
1 2
2 3
3 5
### データフレーム
データフレームは二次元のラベル付きデータ構造で、Pandasでは最も多く使われるデータ型
import pandas as pd
df = pd.DataFrame({
'名前':['田中','山田','高橋'],
'役割':['営業部長','広報部','技術責任者'],
'身長':[178, 173, 169]
})
print(df)
print(df.dtypes)
print(df.columns)
$ python3 main.py
名前 役割 身長
0 田中 営業部長 178
1 山田 広報部 173
2 高橋 技術責任者 169
名前 object
役割 object
身長 int64
dtype: object
Index([‘名前’, ‘役割’, ‘身長’], dtype=’object’)
import pandas as pd
data = {
'名前':['田中','山田','高橋'],
'役割':['営業部長','広報部','技術責任者'],
'身長':[178, 173, 169]
}
df = pd.DataFrame(data, columns=["名前","役割","身長"])
df.columns = ["Name", "Position", "height"]
print(df)
$ python3 main.py
Name Position height
0 田中 営業部長 178
1 山田 広報部 173
2 高橋 技術責任者 169
### head()とtail()
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(20, 2)) print(df.head()) print(df.tail()) print(df.head().append(df.tail())) print(df.head(3).append(df.tail(3)))
$ python3 main.py
0 1
0 0.330724 -1.143377
1 -0.123135 1.368603
2 1.230545 0.606766
3 0.687297 -1.633271
4 0.365082 0.226383
0 1
15 0.822776 -2.105489
16 1.306649 0.672192
17 0.846219 0.454775
18 -0.376438 -0.903396
19 -1.165510 -0.558250
0 1
0 0.330724 -1.143377
1 -0.123135 1.368603
2 1.230545 0.606766
3 0.687297 -1.633271
4 0.365082 0.226383
15 0.822776 -2.105489
16 1.306649 0.672192
17 0.846219 0.454775
18 -0.376438 -0.903396
19 -1.165510 -0.558250
0 1
0 0.330724 -1.143377
1 -0.123135 1.368603
2 1.230545 0.606766
17 0.846219 0.454775
18 -0.376438 -0.903396
19 -1.165510 -0.558250
その他に多様な機能がある。
$ pip3 install pdfminer3
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from pdfminer3.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer3.converter import PDFPageAggregator from pdfminer3.pdfpage import PDFPage from pdfminer3.layout import LAParams, LTTextContainer resourceManager = PDFResourceManager() device = PDFPageAggregator(resourceManager, laparams=LAParams()) pdf_file_name = './sample.pdf' with open(pdf_file_name, 'rb') as fp: interpreter = PDFPageInterpreter(resourceManager, device) for page in PDFPage.get_pages(fp): interpreter.process_page(page) layout = device.get_result() for lt in layout: if isinstance(lt, LTTextContainer): print(lt.get_text()) device.close()
読み込み対象のPDFはこちら

これで実行してみる
$ python3 pdf_text1.py
1. フリーランス新法概要 1
1. フリーランス新法(フリーランス保護新法) 概要
2022年秋の臨時国会でフリーランス保護新法が成立すると報道されています。では、フリーランス保護新法とは一体どんなものなのでしょうか。
業務委託を行う事業者の遵守事項が規定されます。
ア) 業務委託の開始・終了に関する義務
①事業委託の際の書面の交付等
事業者がフリーランスに対して仕事を依頼するときは、「業務委託の内容(仕事内容)、報酬額等」を記載した書面を交付するか、メールなどの電磁的記
録を提供しなければならない
また一定期間以上、継続してフリーランスと仕事をする場合、契約期間や契約の終了事由、中途解約時の費用などを合わせて記載する必要がある
②契約の中途解約・不更新の際の事前予告
「中途解除日または契約期間満了日の30日前まで」にその旨を予告をしなければならない。またフリーランスから求められれば、事業者は契約の終了
理由を明らかにする必要がある。
イ) 業務委託の募集に関する義務
①募集の際の的確表示
不特定多数のフリーランスを対象に仕事を募集する場合は、正確かつ最新の情報を伝えなければならない。虚偽の表示や誤解を生むような表示は禁
止
②募集に応じた者への条件明示、募集内容と契約内容が異なる場合の説明義務
事業者は応募してきたフリーランスに対し、仕事内容や報酬等を明示しなければんらない。募集時点で明示した情報と異なる内容で契約した場合は、
その旨を説明する必要がある。
ウ) 報酬の支払いに関する義務
事業者はフリーランスから納品物やサービスの提供を受けた日から60日以内に報酬を支払わなければならない。
エ) フリーランスと取引を行う事業者の禁止行為
フリーランスに責任のある理由なしに受領を拒否する
フリーランスに責任のある理由なしに報酬を減額する
フリーランスに責任のある理由なしに返品を行う
相場に比べ、著しく低い報酬額を不当に定める
正当な理由なく、物の購入やサービスの利用を強制する
金銭やサービス、その他の経済上の利益を提供させる
フリーランスに責任のある理由なしに給与の内容を変更させたり、やり直させたりする
関係者外秘
1
2. フリーランス新法概要
2. フリーランス新法(フリーランス保護新法) 概要
オ) 就業環境の整備として事業者が取り組むべき事項
①ハラスメント対策
②出産・育児・介護との両立への配慮
2. 違反した場合の対応等
行政から必要な履歴確保措置が執行される
3.フリーランスの申告及び国が行う相談対応の実現
事業者に違反行為があった場合、フリーランスはその旨を国の行政機関に申告することができる。
関係者外秘
2
うおおおおおおお、これは凄い
テーブルを作成したのちにテーブルの主キー制約を変更したいことがある
その時に、ALTER TABLE ~ DROP CONSTRAINT と ALTER TABLE ~ ADD CONSTRAINT を使用する
### テーブル作成
CREATE TABLE test(a int PRIMARY KEY, b int, c int);
### 主キー制約の削除
名前をつけていなければ テーブル名_pkey でOK
ALTER TABLE test DROP CONSTRAINT test_pkey;
not nullの削除の方法
ALTER TABLE test ALTER COLUMN a DROP NOT NULL;
### 主キー制約の追加
ALTER TABLE test ADD CONSTRAINT test_pkey PRIMARY KEY(a, b);
### シーケンスとは
シーケンスとは連番を払い出してくれるもの。テーブルのIDなどを挿入する際に使用することができる
### シーケンスの使用例
テーブルのIDにシーケンスを使用する例
(1)シーケンスを作成する
(2)シーケンスをテーブルのIDとして挿入する
### シーケンスは以下のように作成
オプションには一番最初に払い出す番号をしているSTARTオプション(START 10)がある。開始番号を指定しなかった場合は1となる
### (1)シーケンスを作成する
CREATE SEQUENCE test_seq;
### (2)シーケンスの確認
testdb=# \d test_seq;
Sequence “public.test_seq”
Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
——–+——-+———+———————+———–+———+——-
bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1
### (3)シーケンスをテーブルのIDとして挿入する
testdb=# CREATE TABLE test_table (id int, name varchar(20));
CREATE TABLE
testdb=# INSERT INTO test_table VALUES (nextval(‘test_seq’), ‘suzuki’);
INSERT 0 1
testdb=# INSERT INTO test_table VALUES (nextval(‘test_seq’), ‘ito’);
INSERT 0 1
testdb=# INSERT INTO test_table VALUES (nextval(‘test_seq’), ‘sato’);
INSERT 0 1
testdb=# SELECT * FROM test_table;
id | name
—-+——–
1 | suzuki
2 | ito
3 | sato
(3 rows)
### (4)シーケンスの確認
testdb=# select currval(‘test_seq’);
currval
———
3
(1 row)
### シーケンスの値をリセット
select setval(‘test_seq’, 1);
なるほど、auto_incrementとは別に値を持つのね
dryrunとは予行練習のこと
–dryrunオプションでコマンドのシミュレーション結果が出力される
$ pip install timeout-decorator
タイムアウトの時間が来たら突然終わららせるのではなく、処理中のものを保存してから終了