Windowsで使用されるインストールパッケージのファイル形式、Microsoft Installerというプログラムの元の名前に由来。プログラムのインストール、保存、削除に使用される
Month: July 2023
【PostgreSQL】pg_repackとvacuum full
pg-repackはテーブルの再編成を行えるPostgreSQLの拡張ツール
VACUUM FULLはテーブルの排他ロックがかかり、実行に長い時間がかかる
pg-replackは短い間しか排他ロックをかけないため、リリース戦略としては有効
pg_repackの再編成の種類
– オンラインCLUSTER(テーブルデータを物理的にINDEX順で並び替え)
– 指定カラムでレコードを並び替える
– オンラインVACUUM FULL(レコードの隙間を詰める)
– 指定テーブルのインデックス再構築・再配置
pg_repack
postgres=# \dn
List of schemas
Name | Owner
——–+———-
bank1 | postgres
bank2 | postgres
public | postgres
(3 rows)
スキーマ全体にcluster, vacuum full
postgres=# pg_repack bank1
カラムを指定してレコードを並び替え
pg_repack -o role_id -t user test_schema
pg_repack -o role_id,id -t user test_schema
テーブルを指定してVACUUM FULLを実行
pg_repack -n -t foo test_schema
pg_repack -n -t foo -t bar test_schema
pg_repack -x -t users test_schema
PostgreSQLが追記型アーキテクチャとなっているためファイルサイズが大きくなると肥大化する
auto vaccumがonになっている
VACUUM FULL, REINDEXは気軽に実行できない
VACUUM FULL実行中は排他ロックがかかるのでテーブル参照処理もできなくなる
pg_repackは排他ロックを瞬間的にだけ掛けて、必要最小限だけのロックとなるため、参照・更新処理が実施できる
西暦から年齢に変換
$now = date('Ymd'); $birthday = "1990-07-01"; $birthday = str_replace("-", "", $birthday); $age = floor(($now - $birthday) / 10000); echo $age . "歳";
$ php app.php
33歳
【python】requests
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を使うことにより直感的な記述が可能になる。
【python】pycryptodome
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()
なるほど、深いな…
【python】psycopg2
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に接続するためのライブラリってことね
[Python] pandasとは
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
その他に多様な機能がある。