Open18
daily memo
ピン留めされたアイテム
目的
日々の技術的な学びをメモしておくことで、記事の材料としたい
2022-05-09
-
vscodeスクリーンキャストモード
- 入力キーボードを表示してくれる。
-
sqlのview参照時は、create view時の記載したsqlが実行されるイメージ?
- 以下の通り、viewを参照するたびに記載されているsqlが実行されていることがわかる。
-- テストデータ作成参考: https://goodbyegangster.hatenablog.com/entry/2019/05/06/111009
create table random (code int);
insert into random (code)
select (random() * 100) from generate_series(1, 10);
CREATE OR REPLACE VIEW view_test as
select * from random
UNION ALL
select * from random
;
select * from view_test ;
code
------
94
89
88
7
44
7
14
21
64
54
94
89
88
7
44
7
14
21
64
54
(20 rows)
-- 新たにデータを10件投入してみる。
insert into random (code)
select (random() * 100) from generate_series(1, 10);
select * from view_test ;
code
------
94
89
88
7
44
7
14
21
64
54
28
88
41
18
14
70
73
15
1
66
94
89
88
7
44
7
14
21
64
54
28
88
41
18
14
70
73
15
1
66
(40 rows)
2022-05-10
- psql
- psql login onliner
- PGPASSWORD=<パスワード> psql -U <ユーザ名> -h <ホスト名>
- psql command option
- psql -q オプション
- psql login onliner
- docker-compose volume mountで パッケージデータが消失してしまう問題は以下の解決策で回避できる。
- 解決策1: docker-compose run <サービス名> <パッケージinstallコマンド>
- 解決策2: docker-compose.ymlにentrypointを記載する
- 解決策3: docker-compose volumeを追加してmountする
まずは現象の確認
# https://zenn.dev/gakin/scraps/4cc16e7761d1ef 「Dockerfileを修正」まで構築
rm -rf node_modules/
# コンテナ再ビルド
docker-compose up -d --build
docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------
nodedev_node-dev_1 docker-entrypoint.sh /bin/ ... Exit 1
# ログ確認→ moduleがなくてコケている。
docker-compose logs
Attaching to nodedev_node-dev_1
node-dev_1 |
node-dev_1 | > app@1.0.0 dev /app
node-dev_1 | > npx ts-node-dev --respawn src/app.ts
node-dev_1 |
npx: installed 52 in 8.128s
node-dev_1 | Cannot find module 'typescript
解決策1: docker-compose run <パッケージinstallコマンド>
docker-compose run node-dev npm install
# node_moduleが作成されている。
ls
Dockerfile docker-compose.yml node_modules package-lock.json package.json src tsconfig.json
# コンテナ起動する
docker-compose up -d
# コンテナログを確認→hello worldが表示されていることを確認
docker-compoe logs -f
Hello, world!
解決策2: docker-compose.ymlにentrypointを記載する
version: '3'
services:
node-dev:
build:
context: .
dockerfile: Dockerfile
tty: true
volumes:
- .:/app
entrypoint: >
/bin/sh -c "
npm install && npm run dev
"
rm -rf node_modules/
# コンテナ起動
docker-compose up -d
# コンテナログ確認→問題なく実行できていることを確認
docker-compose logs -f
> app@1.0.0 dev /app
> npx ts-node-dev --respawn src/app.ts
[INFO] 11:43:18 ts-node-dev ver. 1.1.8 (using ts-node ver. 9.1.1, typescript ver. 4.6.4)
Hello, world!
解決策3: docker-compose volumeを追加してmountする
version: '3'
services:
node-dev:
build:
context: .
dockerfile: Dockerfile
tty: true
volumes:
- .:/app
- node_modules-volumes:/app/node_modules/
volumes:
node_modules-volumes:
2022-05-11
- vscode
- ファイル差分の確認
- https://atmarkit.itmedia.co.jp/ait/articles/1806/08/news028.html
- vscodeの上記メニューバーから compareと入力し、比較対象のファイルを選択することで差分を確認できる。
- 例えば、一つのファイルの内容から比較したい場所がある場合は、ctrl + N で一時ファイルをそれぞれ作成し、比較することもできる。
- マルチカーソルをショートカットで
- Alt + Ctrl + カーソル上下 / option + command + カーソル上下
- 参考:https://qiita.com/TomK/items/3b1f5be07d708d7bd6c5#alt--ctrl--カーソル上下--option--command--カーソル上下
- それぞれの行にそれぞれの項目をコピーしたい
- コピー先をマルチカーソルで選択の状態でコピーしたいデータを全体選択してコピー&ペースト
- 拡張機能: Code alignment
- 指定した文字位置でコードを揃えることができる
- 参考:https://baba-s.hatenablog.com/entry/2016/06/10/100000
- ファイル差分の確認
- graphene
- non null fieldの定義
- postgres
- 外部キー制約の解除
- ALTER TABLE <テーブル> DROP CONSTRAINT <外部制約名>;
- 外部キー制約の解除
2022-05-12
- vscodeショートカット
- 対の括弧にジャンプ
- Mac : Shift + Cmd + \、Win : Ctrl + Shift + \
- 対の括弧にジャンプ
- postgres
- カラム数取得方法
select
count(column_name)
from
information_schema.columns
where
table_name='テーブル名'
- sqlalchemy
2022-05-13
- line meetup
- graphql ddd
- 長期保存用ストレージクラス S3 Glacier ディープアーカイブ
- sqlalchemy
2022-05-14
- vscode
- 拡張機能: vsnote
- vscodeでノートとかをかけ、tagで管理ができる。gitのリポジトリを保存先にしておけば、commitやpushをvscodeのパレット上から実行できる
- 拡張機能: pastimage
- スクショとかした画像をmarkdownに保存できる。vsnoteでmarkdownを保存する
- 拡張機能: vsnote
- Github
- cli: ghコマンド
brew install gh
- cli: ghコマンド
gh auth login
# public repo list
gh repo list --visibility public --limit 100
# public→privateに変更する
gh repo edit <repo-name> --visibility private
2022-05-15
- vscode
- snippet作成方法
- markdownのスニペットを有効にする設定
"[markdown]": {
"editor.wordWrap": "on",
"editor.quickSuggestions": true,
"editor.snippetSuggestions": "top"
}
- snippet generater便利
- markdownの折りたたみ(details, summary タグ)のsnipeet作成
markdown.json
"details_tag": {
"prefix": "ghdetail",
"body": [
"<details>",
"<summary>$1</summary>",
"",
"",
"</details>"
],
"description": "gh_details_tag"
}
- vagrant
- vagrantfileのboxを変更するには、
vagrant destroy
で削除してから、vagrant up
- unmount /mnt エラー問題についての解決方法
- vagrantfileのboxを変更するには、
- ansible
- 設定を行う側のサーバーにansibleクライアントが入っていれば、設定対象サーバーにansibleのクライアントを入れなくてもよい。
- window to linux file path
2022-05-16
- python
from typing import Union
def function(test: Union[modelA, modelB]):
"""
Args:
test: modelAもしくはmodelBを取る
"""
pass
- k8s
- configファイルのマージ
KUBECONFIG=~/.kube/config:~/config kubectl config view --flatten
2022-05-17
-
vscode
- 拡張機能: 連番入力
- https://marketplace.visualstudio.com/items?itemName=tomoki1207.vscode-input-sequence
- 使い方
- 連番を入力したい部分を選択肢、ctrl + alt + 0 を入力し、「0」を入力すると連番が入力できる。
- 参考: https://オンライン将棋教室・香.com/instructor-blog/200622visual-studio-code-input-sequence/
- 拡張機能: 連番入力
-
pytest
- テストでprintの標準出力する
-
-s
オプションで可 - 参考: https://qiita.com/greenteabiscuit/items/6497db1009b8d385ccaa
-
sqlalchemy
- truncate table
import sqlalchemy as sa
from sqlalchemy.orm import scoped_session
from sqlalchemy.ext.declarative import declarative_base
engine = sa.create_engine(
sa.engine.url.URL.create(
drivername="mysql+pymysql", # or postgresql
username=db_user, # e.g. "my-database-user"
password=db_pass, # e.g. "my-database-password"
host=db_hostname, # e.g. "127.0.0.1"
port=db_port, # e.g. 3306
database=db_name, # e.g. "my-database-name"
)
)
session = scoped_session(
sessionmaker(
autocommit = False,
autoflush = False,
bind = engine
)
)
Base = declarative_base()
class User(Base):
"""
ユーザモデル
"""
__tablename__ = 'users'
id = Column('id', Integer, primary_key = True)
name = Column('name', String(200))
age = Column('age', Integer)
email = Column('email', String(100))
engine = test_session.get_bind()
engine.execute(f'TRUNCATE TABLE {User.__tablename__}')
- postgres
- 接続中のセッションを切断する
- pg_terminate_backend関数を使うとセッションを切断することができる
- pg_stat_activityビューを使って現在接続中のプロセスを確認
- 参考: https://qiita.com/iewori/items/0461f2c0e9e8ce0fd1ee
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
-- don't kill my own connection!
pid <> pg_backend_pid()
-- don't kill the connections to other databases
AND datname = 'database_name'
;
2022-05-18
- sqlalchemy
- engine, sessionの動作確認方法
コード
# 参考:https://dev.classmethod.jp/articles/sqlalchemy-connection-pooling/
import sqlalchemy as sa
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.pool import QueuePool
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.dialects.mysql import TIMESTAMP as Timestamp
from .base import Base
# database_source_nameの作成
dsn = sa.engine.url.URL(
drivername="mysql+pymysql", # or postgresql
username="root", # e.g. "my-database-user"
password="pass", # e.g. "my-database-password"
host="mysql", # e.g. "127.0.0.1"
port=3306, # e.g. 3306
database="gg", # e.g. "my-database-name"
)
engine = sa.create_engine(
dsn
)
session = scoped_session(
sessionmaker(
bind=engine
)
)
# model定義
Base = declarative_base()
class User(Base):
__tablename__ = "user"
user_id = Column(String, primary_key=True, nullable=False)
# 確認: session作成時のpool情報確認 → この時点ではクエリが発行されていないので、poolの数は0のまま
session_engine.get_bind().pool.status()
# 確認:クエリ実行→クエリ実行すると connection数が増える. mysql側でconnection数が増えることを確認
session_engine.query(User).all()
session_engine.query(User).first()
session_engine.get_bind().pool.status()
# 'Pool size: 5 Connections in pool: 0 Current Overflow: -4 Current Checked out connections: 1'
# 確認: sessionを閉じてもconnection数が減らないことを確認する。→ checkoutされた checkout connecction が poolに戻されるだけ
session_engine.close()
session_engine.get_bind().pool.status()
# 'Pool size: 5 Connections in pool: 1 Current Overflow: -4 Current Checked out connections: 0'
session_engine.get_bind().dispose()
- k8s
- startUpProbe, livenessProbe
- startUpProbeは起動が遅いコンテナとかに設定しておくと便利な設定。startUpprobeでコンテナにアクセスして問題なさそうならリクエストが本コンテナに誘導されるようになる。startUpProbeでアクセスできることを確認したら、livenessProbeに受け継ぐ
- LivenessProbeはpodがちゃんと生きているかを確認するための設定。
- startUpProbe, livenessProbe
- docker-compose などで別コンテナと通信方法をまとめる
- curl http://<docker-compose サービス名>
- ping <docker-compose サービス名> ※docker-composeはサービス名で名前解決できる
version: "2"
services:
containerA:
image: yauritux/busybox-curl
tty: true
containerB:
image: nginx
動作確認
containerAからcontianerBへ通信する方法を見てみる。
# コンテナ起動
docker-compose up -d
# コンテナログイン
docker-compose exec containerA sh
# コンテナ内で動作確認
curl http://<docker-compose サービス名>
curl http://containerB
nginxのhtmlが取得できた。
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
ping <docker-compose サービス名> ※docker-composeはサービス名で名前解決できる
ping containerB
PING containerB (****): 56 data bytes
64 bytes from ****: seq=0 ttl=64 time=0.727 ms
64 bytes from ****: seq=1 ttl=64 time=0.118 ms
2022-05-19
- sqlalchemy
- engine
- echo='debug' optionを追加するとdebugログを標準出力
- echo_pool='debug' optionを追加するとpoolに関するdebugログを標準出力
- 参考:https://docs.sqlalchemy.org/en/14/core/engines.html#sqlalchemy.create_engine.params.echo_pool
- session.close
- sessionを閉じるというか connection poolに戻すというイメージ
- session.closeしておかないと、wait timeoutでDB側から接続を切られた状態で、再度接続しようとすると、
pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')
で怒られる
- engine
- mysql
- connection pool
- dockcer compose で wait_timeoutを設定する
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --wait_timeout=10
- k8s
- デバック
- docker cmd, entrypoint上書き
- デバック
2022-05-20
- k8s
- Nodeの停止方法
-
kubectl cordon
で対象nodeへの誘導を止め、 -
kubectl drain
コマンドで対象nodeを追い出す- Daemonsetは各Nodeにpodを存在させるためのオブジェクトなので、そのままだと実行できない。
--ignore-daemonsets
をつけると実行できる。
- Daemonsetは各Nodeにpodを存在させるためのオブジェクトなので、そのままだと実行できない。
- 参考:https://cstoku.dev/posts/2018/k8sdojo-21/
- Node-old, Node-new(podいない)ときにdrainコマンドすると、podがいない状態になることがあるので、PodDisruptionBudget オブジェクトを作る必要がある
-
- Nodeの停止方法
2022-05-24
- GraphQL
- GraphiQL
-
Uncaught Error: Mode graphql failed to advance stream.
エラー解消- 手順
- ディベロッパーツールを開く
- アプリケーション タブ > ローカルストレージ > http://localhost (or whatever)
- "すべて消去" ボタンをクリック (🚫) or 右クリック→消去
- Chrome Menu > その他ツール > タスクマネージャー
- 該当のプロセスを削除して、再度アクセス
- 参考:https://github.com/graphql/graphiql/issues/735
- 手順
-
- vscode
- ショートカット
- 行選択: shift + l
- シンボルに移動: ctrl(cmd) + shift + o
- エディターグループを左右に移動: cmd(crtl)+K ←→
- https://johobase.com/vscode-keyboard-shortcuts/
- ショートカット
- windows
- windows path to linux path
- https://askubuntu.com/questions/900283/windows-filepath-converted-to-linux-filepath
win2lin () { f="${1/C://c}"; printf '%s\n' "${f//\\//}"; }
$ file='C:\Users\abcd\Downloads\testingFile.log'
$ win2lin "$file"
/c/Users/abcd/Downloads/testingFile.log
$
$ file='C:\Users\pqrs\Documents\foobar'
$ win2lin "$file"
/c/Users/pqrs/Documents/foobar
2022-05-25
- sqlalchemy
- hybrid_property
- DBのカラムの値をpython側で修正して好きな値とか返せるようにできる。
- 参考:https://podhmo.hatenadiary.org/entry/20120129/1327837366
- offical docs: https://docs.sqlalchemy.org/en/14/orm/extensions/hybrid.html
- hybrid_property
- netstat
- tcp通信の状態を調べるためのコマンド
Proto Recv-Q Send-Q Local Address Foreign Address State
- 参考:https://engineers-life.com/linux_command/network_linux/linux_netstat/
- laravel singleton
- cookie cutter
- テンプレートRepositoryを作るときに便利なツール
- 参考:https://buildersbox.corp-sansan.com/entry/2022/04/05/110000
2022-06-13
- postgres
- テーブルのアクセス権限表示
\z <TABLE_NAME>
- pangres
- https://github.com/ThibTrip/pangres
- dataframeを postgresに upsertできるやつ
- pandera
- https://pandera.readthedocs.io/en/stable/
- dataframeの型チェックできるやつ
- sqlacodegen
- 既存db テーブルの sqlalchemy modelを自動生成してくれるやつ
- https://github.com/agronholm/sqlacodegen
DB_DRIVER=postgresql
DB_USER=postgres
DB_PASS=password
DB_HOST=postgres
# DB_DRIVER=mysql
# DB_USER=mysql+pymysql
# DB_PASS=password
# DB_HOST=mysql
DB_NAME=test
# テーブル全部作る場合
sqlacodegen ${DB_DRIVER}://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME} --outfile output.py
# 特定table郡から作るばあい
sqlacodegen ${DB_DRIVER}://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME} --outfile output.py --tables <table名1>,<table名2>
2023-01-25
- postges 変数
-
\set 変数 値
- ex) \set hoge ' ' → \echo hoge で確認できる
-
- kustomize
- kubectl manifestをいい感じに管理してくれルツーる
- docker save, docker import ,export
- コンテナimageのレイヤ情報を tar形式でexport,importとかできるやつ
2023-01-26
- journalctlについてコンテナログを確認する
- journalctl -f -u docker.service
- vscode コード整形ショートカット
- win: Shift + Alt + F
- sqlalchemy で外部結合
- istouter=trueを設定する
- postgres テーブル一覧確認sql
WITH table_list AS
(SELECT tablename
, tableowner
FROM pg_tables -- postgres table
WHERE schemaname not like 'pg_%'
AND schemaname != 'information_schema'
UNION SELECT sequencename AS tablename
, sequenceowner AS tableowner
FROM pg_sequences -- postgres sequence
UNION SELECT pg_views.viewname AS tablename
, pg_views.viewowner AS tableowner
FROM pg_views -- postgres view
LEFT OUTER JOIN pg_class ON pg_views.viewname = pg_class.relname
WHERE schemaname = current_schema() )
SELECT *
FROM table_list;