地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【手元メモ】jqチートシート

ほしい要素だけ抜き出す

jq '{name, description}'

指定した複数の要素をスペース区切りの文字列として出力する

jq -r '"\(.id_str) \(.text)"' < file

文字列のエスケープを解除して出力する

  • -rオプションを使う
$ echo '{"key": "value\n\"aaaa\""}' | jq .key
"value\n\"aaaa\""
$ echo '{"key": "value\n\"aaaa\""}' | jq -r .key
value
"aaaa"

素の文字列を1行ずつJSON文字列にエスケープする

  • -Rを使う
$ printf '"aaa\nbbb cccc\tdddd' | jq -R
"\"aaa"
"bbb cccc\tdddd"

複数行の素の文字列を1つのJSON文字列にエスケープする

  • -R--slurpを使う
$ printf '"aaa\nbbb cccc\tdddd'
"aaa
bbb cccc    dddd
$ printf '"aaa\nbbb cccc\tdddd' | jq -R --slurp
"\"aaa\nbbb cccc\tdddd"

文字列に改行が含まれているJSONを扱う

例として以下のようなJSONがあったとします。

{
  "text": "遅れた!今描いた。\n\n#key\n#Kanon\n#水瀬名雪誕生祭\n#水瀬名雪誕生祭2019\n#12月23日は水瀬名雪の誕生日 https://t.co/zOGPbmBkwI",
  "id_str": "1209146623982366720",
  "source": "<a href=\"http://twitter.com/#!/download/ipad\" rel=\"nofollow\">Twitter for iPad</a>",
  "created_at": "Mon Dec 23 16:19:54 +0000 2019",
}

ほしい要素はtextid_strです。 安直に、jq -r '"\(.id_str) \(.text)"'とやると、

$ cat tweet.json | jq -r '"\(.id_str) \(.text)"'
1209146623982366720 遅れた!今描いた。

#key
#Kanon
#水瀬名雪誕生祭
#水瀬名雪誕生祭2019
#12月23日は水瀬名雪の誕生日 https://t.co/zOGPbmBkwI

このように\nがunescapeされてしまうので改行がはいってしまいます。

そこで、textに含まれる\n\x1fに置き換えることにしました。

#!/bin/sh

RS="$(printf '\x1e')"
US="$(printf '\x1f')"

cat tweet.json                        |
jq -r '"\(.id_str) \(.text)'${RS}'"'  | # text の末尾にRSをつける
tr '\n' ${US}                         | # \n をUSで置換する
sed 's/'${RS}${US}'/'${RS}'/g'        | # RSとUSが連続している箇所をRSで置換する
tr -d '\n'                            | # grepが出力した末尾の \n を除去する
tr ${RS} '\n'                           # RSを \n で置換する

プライムデーで買ったもの

を振り返っていたが開催期間中に家で出たゴキブリが衝撃的過ぎてあまりものを買っていないことに気づいた。これまで無駄使いで不要なものまで買っていたがそれどころじゃないようなことが起きるとどうやら物欲は減るらしい。ちなみに出たゴキブリは1回見ただけで取り逃して以降見ていない。ゴキブリムエンダーを使ってみたがまだ効果は見られず...

Amazon.co.jp: ゴキブリ ムエンダー 家中まるごと ゴキブリ 駆除 80プッシュ(最大120畳) : ドラッグストア

次回はいっぱい買うぞ

GitHub Actionsでeb cliを使う

jobs:
  build:

    runs-on: ubuntu-latest
    env:
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-python@v2
        with:
          python-version: '3.x'
          cache: 'pip'

      - name: Install awsebcli
        run: |
          pip install -r requirements.txt
          echo "~/.local/bin" >> $GITHUB_PATH

      - name: eb version
        run: eb --version

スピンロックの思い出(?)

社内勉強会でスピンロックという単語が出てきてずっと前にユーザー空間アプリケーションでスピンロックを使おうとしてレビューで反対されたというのを思い出した。その時はDBMSなんかが排他制御にpthread_mutexを使わず、独自にユーザー空間のspinlockを実装してるみたいなのを読んでコード書いてたなくらいの考えだったと思う。指摘内容はスケジュールはカーネルに任せましょうくらいの理解。(ロックを保持したスレッドがCPU待ちになって、スピンロックの解放を待つ側のスレッドは、ロックの解放をビジーループで待つため、CPU時間を多く使用するという自体が発生しうる。何がしたいねんということになってしまう。)

ユーザ空間でのスピンロック実装はLinus Torvaldsが比較的最近言及していたものを見つけた。強い言葉での否定が多々あるがなるほどなぁという感想でした。

www.realworldtech.com