カテゴリー: tech

  • python で csv を結合する

    pandas を使う事で容易に結合できる。

    例えば以下のような csv ファイルがあったとする

    a.csv

    NO,CODE
    1,987
    2,111
    3,222
    

    b.csv

    ID1,ID2,CODE
    1,111111111111111111,111111111111111111
    2,222222222222222222,222222222222222222
    

    pandas を使うことで容易に結合する事ができる

    import pandas as pd
    
    # まず2つのCSVを読み込む
    a = pd.read_csv('./a.csv', encoding='utf-8')
    b = pd.read_csv('./b.csv', encoding='utf-8')
    
    # b の ID1 を NO に置換する
    b_ = b.rename(columns={'ID1': 'NO'})
    
    # a とb 2つのCSVを結合する。結合する際のキーは NO とする
    df_merged = pd.merge(a, b_, on='NO')
    
    # 確認
    print(df_merged)
    
    # CSV ファイルとして出力する
    df_merged.to_csv("merged.csv", index=False)
    

    結果

     % python3 main.py
       NO  CODE_x                 ID2              CODE_y
    0   1     987  111111111111111111  111111111111111111
    1   2     111  222222222222222222  222222222222222222
    

    今回、結合した csv ファイルそれぞれに CODE というカラムがそれぞれに存在している。

    pd.merge の第一引数になったファイルは _x という suffix がつき、

    第二引数になったファイルには _y という suffix が付く。

  • pip で install するパッケージの version を確認する

    python で開発をする場合、requirements.txt に install したいパッケージを書く事が多いが、その際 install するパッケージの version を知りたい場合がある。

    (さらに…)
  • ERROR 2026 (HY000): SSL connection error: error:14077102:SSL routines:SSL23_GET_SERVER_HELLO:unsupported protocol

    mysql コマンドで接続しようとした際このエラーに陥った。

    原因はおそらく TLS の問題。

    mysql command の場合 --ssl-mode=DISABLED オプションをつけることで回避可能

    mysql -h10.10.0.1 -uuser -p --ssl-mode=DISABLED
    

  • boto3 でファイルをアップロードする

    python 経由で s3 にファイルをアップロードしたくなる場合がある。

    本記事はその際のメモ。

    import boto3
    
    # 書き込み先バケット
    BUCKET = 'output-bucket'
    INPUT= 'hoge.csv'
    OUTPUT = 'hoge.csv'
    # OUTPUT = 'DIR/DIR/hoge.csv'
    
    
    s3 = boto3.resource('s3')
    s3.Bucket(BUCKET).upload_file(Filename=INPUT, Key=OUTPUT)
    
    

    ポイントとして、書き込み先の s3 のディレクトリに対し書き込むとき、存在しないディレクトリを対象にすると、存在しないディレクトリは一緒に作られる。これは、そもそも s3 にディレクトリという考えがないためである。

    それについては以下の記事を参照

  • Makefile make: `test’ is up to date.

    以下のように Makefile のあるディレクトリに ファイルもしくはディレクトリが存在する場合がある。

    % tree
    .
    ├── Makefile
    └── test
    
    

    このような環境の場合、同名のコマンドが Makefile に記載がある場合は `test’ is up to date. というエラーが表示され Make ファイルが実行されない。

    test:
    	echo hogehoge
    

    これを対処するには、.PHONY を宣言することにより回避可能となる

    .PHONY: test
    test:
    	echo hogehoge
    

    以上。

  • snowflake でテーブル定義を確認する

    mysql であれば show create table コマンドでDDLを確認することができるが、

    snowflake ではこのコマンドを使うことができない。

    snowflake では以下のコマンドを使うことでDDL を確認することができる。

    select GET_DDL ('TABLE', 'テーブル名');
    

    結果は以下の通り

    >select GET_DDL ('TABLE', 'TEST');
    +----------------------------------------+                                      
    | GET_DDL ('TABLE', 'TEST')      |
    |----------------------------------------|
    | create or replace TABLE TEST ( |
    | 	ID NUMBER(18,0),                                                                                 |
    | 	TARGET_DATE DATE,                                                                                 |
    | 	CREATION_DATE TIMESTAMP_NTZ(9) NOT NULL                                                                                 |
    | );                                     |
    
  • python3 でディレクトリがなければ作る

    exist_ok を使うことで 1行にまとめることができる

    os.makedirs("作りたいディレクトリ", exist_ok=True)
    

    例えば以下の通り

    os.makedirs("~/.ssh/", exist_ok=True)
    

  • Error: Unknown command: cask brew cask コマンドができない問題

    % brew cask install snowflake-snowsql
    Error: Unknown command: cask
    

    cask コマンドは install コマンドのオプションになったそうだ

    今は、

    brew install --cask snowflake-snowsql 
    

    を叩くことでインストールできる。

    参考情報

    https://qiita.com/horit/items/03e6ae6599253afcd75c

  • [git cherry-pick]他ブランチ変更を自分のブランチに取り込む

    チーム開発をしていると、他の人のブランチでが変更された内容を自分のブランチに取り込みたい場合がある

    その対処法を紹介。

    解決方法のひとつに git cherry-pick を使うというものがある。

    Apply the changes introduced by some existing commits

    https://git-scm.com/docs/git-cherry-pick

    とあるように、コミットを元に変更を適用してくれる。

    使い方は以下の通り

    git cherry-pick 4b0774ffe といったように、commit hash を後ろに加える。

    $ git cherry-pick 4b0774ffe
    [feature/hoge3d0e697] change date
     Author: sumito.tsukada <sumito.tsukada@hoge.com>
     Date: Wed Jan 12 11:07:04 2022 +0900
     1 file changed, 2 insertions(+), 2 deletions(-)
    

    覚えておくとなにかと便利。

  • Makefile から パラメータストア(SSM) を呼んで docker-compose に渡す

    Makefile 内で環境変数を docker-compose に渡そうとしてもうまく環境変数が展開されなかった。

    Makefile の冒頭で SSM を呼び出す定義を書き、

    make run

    実行すると同時に呼び出し処理を呼ばせるような作りをすることによって実現できた。

    
    set-env := export AWSSSMPARAM1=$(shell aws ssm get-parameters --names "AWSSSMPARAM1" --with-decryption --region ap-northeast-1 --query "Parameters[].Value" --output text) ;\
    	export AWSSSMPARAM2=$(shell aws ssm get-parameters --names "AWSSSMPARAM2" --with-decryption --region ap-northeast-1 --query "Parameters[].Value" --output text)
    
    run:
    	$(set-env) && docker-compose up -d 
    

    セキュアな情報をローカルで持ちたくない場合はあると思うし、使える場面ば多そうだ。