カテゴリー: Mac

  • jqコマンドでJSONから指定した項目を取得・変換する

    jqコマンドでJSONから指定した項目を取得・変換する

    JSONはウェブのデータ交換形式として広く使われていますが、大量のデータを扱うときはデータをフィルタリングしたり整形したりすることが必要になることがあります。今回は、jqコマンドを使ってJSONから特定の項目を取り出し、新しい形式に整形する方法、特定の条件にマッチするレコードのみを選択する方法、そしてmap関数の使い方を紹介します。

    JSONデータの例

    以下に、我々が今回扱うサンプルのJSONデータを示します:

    {
    "records": [
    {
    "id": 1234,
    "user": {
    "id": 5678,
    "account": "user1@example.com",
    "status": 0,
    "attributes": []
    },
    "attributes": [
    {
    "values": [
    {
    "value": "2023-01-01T00:00:00"
    }
    ],
    "id": 2,
    "name": "Date"
    },
    {
    "values": [
    {
    "value": "AB01"
    }
    ],
    "id": 1,
    "name": "Code"
    }
    ]
    }
    ],
    "meta": {
    "totalCount": 999,
    "page": 1,
    "countPerPage": 1,
    "maxPage": 999
    }
    }

    このデータには複数のレコードが含まれ、各レコードにはuser情報とattributes情報があります。

    jqコマンドで特定の項目を取得

    今回の目的は、各レコードから特定の項目を取得し、それを新しい形式に整形することです。これを達成するために、jqコマンドを使用します。

    以下に、新しい形式にデータを整形するためのjqコマンドを示します:

    jq '[.records[] | {EmployeeNumber: .user.id, Email: .user.account, GradeDate: .attributes[0].values[0].value, Grade: .attributes[1].values[0].value}]' input.json

    このコマンドは以下の操作を行います:

    1. レコード配列の各要素に対して操作を行います。
      (.records[] |)。
    2. 新しいオブジェクトを作成し、その中に指定のキーと値を設定します({EmployeeNumber: .user.id, Email: .user.account, GradeDate: .attributes[0].values[0].value, Grade: .attributes[1].values[0].value})。
    3. すべての新しいオブジェクトを包含する配列を作成します([…])。

    これにより、各レコードは新しい形式のオブジェクトに変換され、すべてのオブジェクトが配列に格納されます。それぞれのオブジェクトは EmployeeNumber、Email、GradeDate、Grade の 4つのフィールドを持ちます。

    特定の条件にマッチするレコードを選択

    また、jqは特定の条件にマッチするレコードだけを選択するためのフィルタリング機能も提供しています。たとえば、statusが0のレコードだけを選択するには、以下のようにします:

    jq '[.records[] | select(.user.status == 0) | {EmployeeNumber: .user.id, Email: .user.account, GradeDate: .attributes[0].values[0].value, Grade: .attributes[1].values[0].value}]' input.json

    このコマンドではselect(.user.status == 0)を使用して statusが0のレコードだけを選択しています。

    map関数の使い方

    関数は、配列の各要素に関数を適用して新しい配列を作成するためのものです。たとえば、各レコードのattributesの中のvaluesを取り出すには以下のようにします:

    jq '.records[] | .attributes | map(.values[].value)' input.json

    このコマンドでは、まず各レコードのattributesを取り出し(.records[] | .attributes)、それからmap関数を使って各attributesの中のvaluesのvalueを取り出しています(map(.values[].value))。

    結論

    このように、jqコマンドは非常に強力で柔軟なツールであり、JSONデータの検索やフィルタリング、変換に最適です。特にselect関数とmap関数は、データのフィルタリングや変換において非常に便利です。

    様々な場面でのデータ操作に活用してみてください。また、jqのドキュメンテーションは非常に充実していますので、さらに高度な操作を学びたい場合はそちらを参照してみてください。

  • qemu: uncaught target signal 11 (Segmentation fault) – core dumped

    m1/m2 mac に powershell のコンテナを動かして powershell の modules をインストールすると、core dump を吐いて止まってしまうことがある。その対処法を紹介。

    /# pwsh -Command Install-Module -Name Microsoft.Graph -F
    qemu: uncaught target signal 11 (Segmentation fault) - core dumped
    Segmentation fault
    

    イメージを lts を利用することで回避ができた

    docker run --platform linux/x86_64  -it mcr.microsoft.com/powershell:lts-ubuntu-22.04 /bin/bash
    Unable to find image 'mcr.microsoft.com/powershell:lts-ubuntu-22.04' locally
    lts-ubuntu-22.04: Pulling from powershell
    Digest: sha256:cb32194aa46f144c09c1a6610eee2684e3642b8609370aba927ab995b413931f
    Status: Downloaded newer image for mcr.microsoft.com/powershell:lts-ubuntu-22.04
    root@6d03d590fb19:/# pwsh -Command Install-Module -Name Microsoft.Graph -F
    root@6d03d590fb19:/#
    
  • mac でファイルの文字コードを確認する

    生成したファイルの文字コードを確認したいケースがある。

    file コマンドを用いて確認することが可能

    file --mime /tmp/xxx/csv
    

    結果は以下の通り

    $ file --mime /tmp/xxx/csv
    /tmp/xxx/csv: text/csv; charset=utf-8
    

    utf-8 であることを確認

  • Macで録ったmovファイルをgifに変換する

    Macで録ったmovファイルをgifに変換する

    tl;dr

    Macで撮ったmovファイルをgifに変換する方法を紹介。

    手軽に動画のスクリーンショットを撮れるようになっていた

    気がついたらショートカット1発で動画が録れるようになっていた。Mojave から `command + shift + 5 ` で動画のスクリーンショットを録ることができる。

    しかし、デフォルトではmovファイルとして出力される。mov画像は容量も大きくなるし、軽くて使い勝手の良いgitにしたいことがある。 

    `ffmpeg`を使う。

    まだインストールしていなければインストールする。brewコマンドで一発。

    brew install ffmpeg

     

    変換コマンド

    ffmpeg -i [変換元movファイル] -r 24 [変換後gifファイル]

    例)

    ffmpeg -i ~/Desktop/画面収録\ 2019-12-22\ 23.47.33.mov -r 24 chrome.gif

    アウトプット(gifファイル)

    以下の通り。非常に軽量なのでサイトに載せることも容易になった。

     今日からgif多めのブログになりそうだ。

  • MacのターミナルからChromeを開いてサイトにアクセスする

    MacのターミナルからChromeを開いてサイトにアクセスする

    tl;dr;

    ターミナルからGoogle chromeを起動する方法を紹介。起動シェルに登録すれば1行で任意のページを開くことができる。

    起動方法

    実は、macのopenコマンドの後ろに` -a` オプションを付ければ任意のアプリケーションで起動することができる。

    もっと使いやすくする

    起動シェルにaliasを登録する事で、もっと短くすることができる。

    `vi ~/.zshrc`

    以下の行を追加

    alias chrome="open -a 'Google Chrome'"

    その後、sourceコマンドで`~/.zshrc`を再読み込みさせる。

    source ~/.zshrc

    これで、`chrome https://tsukada.sumito.jp` と入力すると、上記と同じ結果になる。

    他によく使うツールを登録する。

    例えばmacに標準搭載のPreviewなど登録すると便利。

    alias preview="open -a 'Preview'"

    `source` コマンドで読み込ませればよい。

  • zsh: no matches found:  zshでscpコマンドで失敗

    zsh: no matches found: zshでscpコマンドで失敗

    はじめに

    zshでscpコマンドで失敗した。

    % scp -r root@tkd002:/tmp/hoge* .
    zsh: no matches found: root@tkd002:/tmp/hoge*

    原因とその対策についてまとめる

    原因

    zshの補完でひっかかってしまうようだ。

    setopt nonomatch

    .zshrcへ一行追加すればよいが、その場限りの場合は上記コマンドを単純に実行するだけでもよい。

    % setopt nonomatch
    % scp -r root@tkd002:/tmp/hoge* .
    hoge.analyze-sentiment       100% 3865   884.6KB/s   00:00    
    % 

     

     

     

     

  • MacOSX のzshでlessコマンド(source-highlight)の色付け

    MacOSX のzshでlessコマンド(source-highlight)の色付け

    はじめに

    lessコマンドは通常、白と黒の画面で表示されるため、vimのように色付けしたいことがある。“` source-highlight “` を使ったlessコマンドで色付けする方法を紹介。

    設定

    install

    brew install source-highlight
    

    このような画面が表示されればinstall完了だ。

    環境変数を設定

    ~/.zshrc を編集

    export LESS='-R'
    export LESSOPEN='| /usr/local/bin/src-hilite-lesspipe.sh  %s'

    読み込み

    source ~/.zshrc

    確認

    vimと同じ色付けになるわけではなく、若干の差異は発生する

    vimで開いたjsonファイル

    色付けしたlessで開いたjsonファイル

    vimで開いたymlファイル

    色付けしたlessで開いたymlファイル

     

    特にymlファイルは対応できていない印象。しかし、shellやjsonは見やすくなる。

  • nodeのversion管理をnvmで行う

    nodeのversion管理をnvmで行う

    はじめに

    Linux/Macにてnodeのversion管理を手軽に行うよう、nvmで切り替えれられるようにする

    nvmインストール

    nvmのオフィシャルリポジトリはこちら

    https://github.com/creationix/nvm

    ここに記載があるように、installを行う。

    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash

    ~/.bash_profileに環境変数を追加する

    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
    [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

    変更した~/.bash_profileを読み込む

    source ~/.bash_profile

    stableをインストール

    nvm install stable

    を行うと、stableをインストールすることが可能。

    執筆時のversionは以下の通り

    # node -v
    v11.12.0

    任意のversionをインストール

    nvm ls-remoteコマンドを実施すると、インストール可能なversionが列挙される

    # nvm ls-remote
            v0.1.14
            v0.1.15
            v0.1.16
            v0.1.17
            v0.1.18
            v0.1.19
            v0.1.20
            (略)

    version 8.9.4をインストールする際は以下の通り実施する

    nvm install v8.9.4

    aliasを切り替える

    # nvm alias default v8.9.4
    default -> v8.9.4
    

    version変更を確認

    # node -v
    v8.9.4
    

     

  • Vimでインデントを整形する

    Vimでインデントを整形する

    はじめに

    vimでフォーマット(インデント)を自動で整えたい時があるので、その方法を紹介。

    gg=G

      gg でファイルの先頭に移動
    =  がインデント修正
    G  で最後まで実施する

    という意味になる

  • UnicodeDecodeError: ‘utf-8’ codec can’t decode byte

    UnicodeDecodeError: ‘utf-8’ codec can’t decode byte

    はじめに

    Pythonで機械学習の勉強をはじめるようになって、ファイルを読み込むことが多くなった。

    その際、UTF-8フォーマットじゃないと何かと

    “` UnicodeDecodeError: ‘utf-8’ codec can’t decode byte “`

    というエラーに陥ることになってしまったので、手順をまとめる

    nkfコマンドのinstall

    macでデフォルトで入っていないのでbrewコマンドでinstallする

    “`brew install nkf “`

    変換

    まずは作業前

     

    $ file --mime data.csv
    data.csv: text/plain; charset=unknown-8bit

    変換コマンド

    “` nkf -w –overwrite data.csv “`

    $ file --mime data.csv
    data.csv: text/plain; charset=utf-8

    文字コードが代わり、エラーは出なくなった。