全力で怠けたい

怠けるために全力を尽くしたいブログ。

Pixela の CLI ツール pa が v1.8.0 にバージョンアップしました。

Pixela の CLI ツール pa が v1.8.0 にバージョンアップしました。

v1.8.0 アップデート内容

Pixela v1.26.0 に対応するバージョンアップとなります。

具体的には、graph サブコマンドに add, subtract サブコマンドが追加されています。

それぞれのサブコマンドが対応する Pixel API エンドポイントは次の通りです。

サブコマンド Pixel API エンドポイント
add PUT - /v1/users/:username/graphs/:graphID/add
subtract PUT - /v1/users/:username/graphs/:graphID/subtract

v1.8.0 へのアップグレード方法

Homebrew を使っている場合は、次のコマンドにてアップグレードできます。

$ brew update && brew upgrade pa

go install コマンドでアップグレードすることもできます。

$ go install github.com/ebc-2in2crc/pa/cmd/pa@latest

現場からは以上です。

内閣府の「平均寿命の推移」の CSV が扱いやすくなるようにワンライナーで整形してみた。

はじめに

もうだいぶ前のことだけど、Twitter で「内閣府の公開している『平均寿命の推移』がデータとして最悪な CSV」と話題になっていたので、最悪な CSV が扱いやすくなるようにワンライナーで整形してみた。

ワンライナー

先に書いてしまうと、平均寿命の推移 CSV を整形するワンライナーは次のようになる。

$ cat h0304080.csv | \
   nkf -Luw | \
   sed '1,3d' | \
   sed '/^$/,$d' | \
   tr -d ' ' | \
   awk -F, '{a[NR]=$4" "$5" "$6; $4=$5=$6=""; print}END{for(i=0;i<NR;i++){print a[i]}}' | \
   grep -v '^ *$' | \
   sed 's/(.*)//' | \
   awk '$1 ~ /^[0-9]/{y=substr($1,0,2)}; $1 ~ /^ /{gsub(" ","",$1); $1=y $1}; {print}' | \
   awk '{print $1,$1,$2,$3}' | \
   teip -f2 -- wareki -K - | \
   awk '{$2="(" $2 ")"; print}' | \
   sed 's/ //' | \
   sed 's/ /,/g'

1947(昭和22),50.06,53.96
1948(昭和23),55.60,59.40
1949(昭和24),56.20,59.80
# ... 省略 ...
2002(平成14),78.32,85.23
2003(平成15),78.36,85.33
2004(平成16),78.64,85.59

このあとは、平均寿命の推移の CSV が扱いにくい原因と、その原因を解消する方法をワンライナーを分解しつつ書いていく。

平均寿命の推移の CSV が扱いにくい原因

平均寿命の推移の CSV が「データとして最悪」とまで言われるのは、CSV データとして扱いにくい内容になっているためだろう。

CSV データとして扱いにくい原因としては、次のものがある。

  • 余計なヘッダーとフッターが含まれている
  • データ中に意味のないスペースが含まれている
  • 1行あたり2レコードが含まれている
  • 西暦の上2桁が省略されているレコードがある
  • 元号が省略されているレコードがある
  • 和暦のフォーマットが異なるレコードがある

余計なヘッダーとフッターが含まれている

平均寿命の推移の CSV は、Excel で human readable (?) なドキュメントを作り、CSV フォーマットでエクスポートした感じで、次のような余計なヘッダー / フッターが含まれている (ヘッダー、フッターといえるものではないが)

↓ヘッダー

図8 平均寿命の推移,,,,,
,,,,,(歳)
年,男,女,年,男,女

↓フッター

注1:厚生労働省「生命表」による。平均寿命は、各年の0歳児の平均余命を,,,,,
   いう。,,,,,
 2:1947、55、60、65、70、75、80、85、90、95、2000年は「完全生命表」、,,,,,
   その他の年は「簡易生命表」。,,,,,

データ中に意味のないスペースが含まれている

50.06 ,53.96 , のように、カンマの前に意味のないスペースが含まれている。

1行あたり2レコードが含まれている

平均寿命の推移 CSV を扱いにくい最大の原因は、1行あたり2レコードが含まれていることだろう。

1行あたり2レコードが含まれていても、含まれるレコードがデータ的に連続しているものであれば整形しやすいことが多いが、平均寿命の推移 CSV はデータ的に連続していないレコードが1行に含まれており、扱いにくさを増す原因になっている。

1947(昭和22),50.06 ,53.96 , 77(昭和52),72.69 ,77.95 
 48(  23),55.60 ,59.40 , 78(  53),72.97 ,78.33 

西暦の上2桁が省略されているレコードがある

任意の行について、西暦の上2桁が上の行と同じ場合、西暦の上2桁がスペースに置き換えられる形で省略されている。

データとして欠落しているものになっており、これもまたこの CSV を扱いにくくする原因になっている。

1947(昭和22),50.06 ,53.96 , 77(昭和52),72.69 ,77.95 
 48(  23),55.60 ,59.40 , 78(  53),72.97 ,78.33 

元号が省略されているレコードがある

西暦の上2桁の省略とだいたい同じ *1

和暦のフォーマットが異なるレコードがある

和暦は <元号>年 というフォーマットになっているが、64・平成元 のように2つの和暦が含まれ、フォーマットが異なるレコードがある。

 59(  34),65.21 ,69.88 , 89(64・平成元),75.91 ,81.77 

ワンライナーの解説

文字コードと改行コードを変換する

平均寿命の推移 CSV文字コードShift_JIS に、改行コードが CRLF になっていて、少々扱いにくい。 まずは文字コードUTF-8 に、改行コードを LF に変換しておく。

$ cat h0304080.csv | \
   nkf -Luw 

余計なヘッダーとフッターを削除する

ヘッダーの行数は1〜3行目に決まっているので、sed で削除する。

   sed '1,3d' | \

フッターは、実データのあとの空行以降がフッターとなるので、空行以降を sed で削除する。

   sed '/^$/,$d' | \

余分なスペースを削除する

50.06 ,53.96 , に含まれるような余分なスペースを削除する。

   tr -d ' ' | \

1行あたり1レコードにする

awk で次のように処理し、1行あたり1レコードにする。

  1. 1行に含まれる2レコードのうち、1レコード目を出力する
  2. 2レコード目は配列に保存しておく
  3. 1, 2 をすべての行で行う
  4. すべての行を処理し終わったら、配列に保存しておいた2レコード目を全て出力する
   awk -F, '{a[NR]=$4" "$5" "$6; $4=$5=$6=""; print}END{for(i=0;i<NR;i++){print a[i]}}' | \

awkOFS 変数は指定せず、各フィールドはデフォルトの区切り文字のスペースで区切らせる。

空行を削除する

1行あたり1レコードにする際、空行 / スペースだけを含む行ができてしまうので、削除する。

   grep -v '^ *$' | \

元号・和暦を削除する

元号・和暦は一旦削除し、あとで西暦から求める。

元号・和暦は で囲まれているので、その部分を sed で削除する。

   sed 's/(.*)//' | \

西暦の上2桁を補完する

西暦の上2桁が欠損しているデータについて、次のようにして西暦の上2桁を補完する。

  • 1つめのフィールドが 1947 のように数字で始まっていたら、先頭の2桁を記憶しておく
  • 1つめのフィールドが全角スペースで始まっていたら、全角スペースを記憶しておいた2桁に置き換える
   awk '$1 ~ /^[0-9]/{y=substr($1,0,2)}; $1 ~ /^ /{gsub(" ","",$1); $1=y $1}; {print}' | \

元号・和暦を追加する

西暦,男性の平均寿命,女性の平均寿命 のようになっているデータを、西暦,西暦,男性の平均寿命,女性の平均寿命 のように西暦のフィールドを1つ増やす。

   awk '{print $1,$1,$2,$3}' | \

2つめのフィールドの西暦を元号・和暦に変換する。

teip を使って2つめのフィールドだけを処理対象にし、wareki を使って西暦を元号・和暦に変換する。

   teip -f2 -- wareki -K - | \

元号・和暦を , で囲む。

   awk '{$2="(" $2 ")"; print}' | \

西暦と元号・和暦を1つのフィールドにまとめる

西暦と元号・和暦を区切っているスペースを sed で削除し、1つのフィールドにまとめる。

   sed 's/ //' | \
   sed 's/ /,/g'

区切り文字をスペースからカンマに戻す

sed でスペースをカンマに変換する。

   sed 's/ /,/g'

以上。

参考サイト

*1:データが西暦を含んでいれば、元号というか和暦は必要ないような気がする

wareki コマンドが西暦を標準入力から読み込めるようになりました。

wareki コマンドが v1.2.0 にバージョンアップして、西暦を標準入力から読み込めるようになりました。

西暦を標準入力から読み込めるように

wareki コマンドは v1.2.0 より前は標準入力からの読み込みに対応しておらず、複数の西暦を処理するときは xargs コマンドと組み合わせる等する必要がありました。

$ seq 2018 2020 | xargs -I@ wareki @
H30
H31
R2

v1.2.0 にて標準入力からの読み込みに対応したので、複数の西暦を処理するときはパイプで wareki コマンドに流し込めるようになっています。 xargs と組み合わせるときは入力ごとにプロセスが生成されていましたが、西暦をパイプで流し込めるようになったため、入力ごとにプロセスを生成する必要がなく、速度向上 & 省メモリで動作するようになっています。

$ seq 2018 2020 | wareki -
H30
H31
R2

pixela4go が v1.7.0 にバージョンアップしました。

pixela4go が v1.7.0 にバージョンアップしました。

Pixela v1.26.0 に対応するバージョンアップとなります。

v1.7.0 アップデート内容

Pixela v1.26.0 で追加された2つの API エンドポイントに対応しています。

追加された2つのエンドポイントを利用すると、「既存の値に加算 / 減算した上で値を更新したい」というよくあるユースケースをより簡単に処理できるようになります。

具体的には、今まで GET /v1/users/<username>/graphs/<graphID>/<yyyyMMdd> エンドポイントを呼び出して値を取得 & PUT /v1/users/<username>/graphs/<graphID>/<yyyyMMdd> エンドポイントを呼び出して値を更新、としていたところを、1回のエンドポイント呼び出しで値を更新できるようになるので、とても便利です。

ぜひ pixela4go を v1.7.0 にアップデートして、Pixela v1.26.0 で追加された便利なエンドポイントを利用しましょう!

PUT - /v1/users/<username>/graphs/<graphID>/add エンドポイントに対応

Pixela v1.26.0 で追加された PUT - /v1/users/<username>/graphs/<graphID>/add エンドポイントに対応するメソッドを実装しています。

PUT - /v1/users/<username>/graphs/<graphID>/add エンドポイント の説明と使い方に関しては API ドキュメント を参照してください。

PUT - /v1/users/<username>/graphs/<graphID>/subtract エンドポイントに対応

Pixela v1.26.0 で追加された PUT - /v1/users/<username>/graphs/<graphID>/subtract エンドポイントに対応するメソッドを追加しています。

PUT - /v1/users/<username>/graphs/<graphID>/subtract エンドポイント の説明と使い方に関しては API ドキュメント を参照してください。

現場からは以上です。

Slack の絵文字をファイルに保存する方法。

Slack の絵文字をファイルに保存する方法のメモ。

まず、保存したい絵文字を入力 & 投稿し、絵文字を右クリックして「画像をコピーする」を実行する。

入力欄にて「ペースト」 & 投稿し、画像をアップロードする。

投稿された画像をダウンロードする。

以上。

AWS Lambda で Go のバイナリを実行すると「/var/task/main: /lib64/libc.so.6: version `GLIBC_2.32' not found」を出力して止まるときにやったこと。

はじめに

AWS Lambda で Go のバイナリを実行すると次のメッセージを出力して止まるときにやったことのメモ。

/var/task/main: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by /var/task/main)

結論

この事象に関しては こちら と原因が同じ。

結論としては、Go のバイナリをビルドするときに CGO_ENABLED=0 のように指定し、cgo を無効にすればいい。

参考サイト

GitHub Actions で作業ディレクトリを変更する方法。

はじめに

モノレポで開発をしていると、GitHub Actions のワークフローで作業ディレクトリを変更したり、デフォルトの作業ディレクトリを変更することが増えた。 作業ディレクトリを変更する方法、デフォルトの作業ディレクトリを変更する方法をメモしておく。

cd コマンドで作業ディレクトリを変更する

GitHub Actions では cd コマンドで作業ディレクトリを変更できる。

たとえば、こんなワークフローを実行した場合は、

name: Working Directory
on:
  workflow_dispatch:

jobs:
  print-working-directory:
    runs-on: ubuntu-latest

    steps:
      - name: step1
        run: |
          pwd
          cd subdir
          pwd

出力結果は以下のようになる。

/path/to/repo
/path/to/repo/subdir

ただし、作業ディレクトリの変更はステップ内だけにとどまり、ステップが変わると作業ディレクトリは元に戻る。

      - name: step1
        run: |
          cd subdir
          pwd

      - name: step2
        run: |
          pwd

↑ このワークフローの実行結果は以下のようになる↓

/path/to/repo/subdir # step1
/path/to/repo        # step2

working-directory を指定

working-directory を指定すると、スコープに応じてデフォルトの作業ディレクトリを変更できる。

ステップのデフォルトの作業ディレクトリを変更

ステップで working-directory を指定すると、ステップ内のデフォルトの作業ディレクトリを変更できる。

作業ディレクトリの変更はステップ内だけにとどまり、別のステップには適用されない。

      - name: step1
        working-directory: subdir
        run: |
          pwd

      - name: step2
        run: |
          pwd

↑ このワークフローの実行結果は以下のようになる↓

/path/to/repo/subdir # step1
/path/to/repo        # step2

ジョブのデフォルトの作業ディレクトリを変更

ジョブで defaults.run.working-directory を指定すると、ジョブ内のデフォルトの作業ディレクトリを変更できる。

作業ディレクトリの変更はジョブ内のすべてのステップに適用されるが、別のジョブには適用されない。 また、任意のステップで作業ディレクトリを変更しても、別のステップの開始時には working-directory で指定したデフォルトの作業ディレクトリが適用される。

name: Working Directory
on:
  workflow_dispatch:

jobs:
  print-working-directory:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: subdir

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: step1
        run: |
          pwd
          cd ..
          pwd

      - name: step2
        run: |
          pwd

↑ このワークフローの実行結果は以下のようになる↓

/path/to/repo/subdir # step1
/path/to/repo        # step1
/path/to/repo/subdir # step2

ワークフロー全体のデフォルトの作業ディレクトリを変更

ワークフローで defaults.run.working-directory を指定すると、ワークフロー全体のデフォルトの作業ディレクトリを変更できる。

name: Working Directory
on:
  workflow_dispatch:

defaults:
  run:
    working-directory: subdir

jobs:
  print-working-directory:
    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: step
        run: |
          pwd

  print-working-directory-2:
    runs-on: ubuntu-latest

    steps:
      - name: checkout
        uses: actions/checkout@v3

      - name: step
        run: |
          pwd

↑ このワークフローの実行結果は以下のようになる↓

/path/to/repo/subdir # step1
/path/to/repo/subdir # step2

working-directory の指定は、より小さいスコープでの指定が優先される

working-directory の指定は、より小さいスコープでの指定が優先される。

  • ステップとジョブのそれぞれで working-directory を指定した場合は、ステップでの指定が優先される
  • ジョブとワークフロー全体のそれぞれで working-directory を指定した場合は、ジョブでの指定が優先される

参考サイト