覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

HomeBrew で jqをインストールしてみる

jsonデータを整形・絞り込みできるjqコマンドをmacOSにインストールしたかったので、HomeBrewでインストールしてみました。


インストール

以下を実行します。

$ brew install jq


実行時のログは以下の様な感じでした

$ brew install jq
==> Installing dependencies for git: pcre2
==> Installing git dependency: pcre2
==> Downloading https://homebrew.bintray.com/bottles/pcre2-10.32.mojave.bottle.tar.gz
Updating Homebrew...
######################################################################## 100.0%
==> Pouring pcre2-10.32.mojave.bottle.tar.gz
🍺  /usr/local/Cellar/pcre2/10.32: 224 files, 5.5MB
==> Installing git
==> Downloading https://homebrew.bintray.com/bottles/git-2.19.2.mojave.bottle.tar.gz
######################################################################## 100.0%
==> Pouring git-2.19.2.mojave.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions and functions have been installed to:
  /usr/local/share/zsh/site-functions

Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/git
==> Summary
🍺  /usr/local/Cellar/git/2.19.2: 1,520 files, 40.1MB
==> Caveats
==> git
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completions and functions have been installed to:
  /usr/local/share/zsh/site-functions

Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/git
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Warning: Aleth (formerly cpp-ethereum) has been removed from Homebrew. Please install binary releases from https://github.com/ethereum/aleth/releases.
==> Auto-updated Homebrew!
Updated 3 taps (homebrew/core, homebrew/cask and ethereum/ethereum).
==> New Formulae

(中略)

==> Renamed Formulae
ark -> velero                              gnatsd -> nats-server                      todolist -> ultralist
confluent-oss -> confluent-platform        php72 -> php@7.2                           transmission -> transmission-cli
gloo-ctl -> glooctl                        resin-cli -> balena-cli
==> Deleted Formulae
apple-gcc42          gdnsd                js-test-driver       pdftoedn             rock                 tomcat@6
at-spi2-atk          gnome-doc-utils      ld64                 percona-server@5.6   ruby@1.8             typesafe-activator
at-spi2-core         go@1.4               libggz               php@5.6              ruby@2.3             varnish@4
cctools              go@1.8               libguess             php@7.0              safe                 whirr
cctools-headers      gradle@2.14          liblastfm            plan9port            scala@2.10           xmoto
compose2kube         gtk-engines          libutf               pldebugger           smlnj                zxing-cpp
cputhrottle          gtk-murrine-engine   lysp                 protobuf@2.5         solr@5.5
dsd                  guile@2.0            minisat              protobuf@2.6         solr@6.6
erlang@18            gv                   monax                pyexiv2              swig@3.04
ffmbc                hyper                node@6               rlvm                 tmux-cssh

==> Installing dependencies for jq: oniguruma
==> Installing jq dependency: oniguruma
==> Downloading https://homebrew.bintray.com/bottles/oniguruma-6.9.3.mojave.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/f0/f00f8c6f8afd8875fed685a9190cb0c5e9b5ceef58ef1e489fb17a42bddc9672?__gda__=exp=1
######################################################################## 100.0%
==> Pouring oniguruma-6.9.3.mojave.bottle.tar.gz
🍺  /usr/local/Cellar/oniguruma/6.9.3: 17 files, 1.3MB
==> Installing jq
==> Downloading https://homebrew.bintray.com/bottles/jq-1.6.mojave.bottle.1.tar.gz
==> Downloading from https://akamai.bintray.com/71/71f0e76c5b22e5088426c971d5e795fe67abee7af6c2c4ae0cf4c0eb98ed21ff?__gda__=exp=1
######################################################################## 100.0%
==> Pouring jq-1.6.mojave.bottle.1.tar.gz
🍺  /usr/local/Cellar/jq/1.6: 18 files, 1MB
==> `brew cleanup` has not been run in 30 days, running now...
Removing: /Users/yuki/Library/Caches/Homebrew/git--2.19.2.mojave.bottle.tar.gz... (15.2MB)
Removing: /Users/yuki/Library/Caches/Homebrew/go--1.11.1.sierra.bottle.tar.gz... (140.5MB)
Removing: /Users/yuki/Library/Caches/Homebrew/icu4c--62.1.sierra.bottle.tar.gz... (25.4MB)
Removing: /Users/yuki/Library/Caches/Homebrew/jenv--0.4.4.tar.gz... (18KB)
Removing: /Users/yuki/Library/Caches/Homebrew/nkf--2.1.4.sierra.bottle.tar.gz... (157.8KB)
Removing: /Users/yuki/Library/Caches/Homebrew/node--11.2.0.sierra.bottle.tar.gz... (13.3MB)
Removing: /Users/yuki/Library/Caches/Homebrew/pcre2--10.32.mojave.bottle.tar.gz... (1.8MB)
Removing: /Users/yuki/Library/Caches/Homebrew/tree--1.8.0.sierra.bottle.tar.gz... (50.5KB)
Removing: /Users/yuki/Library/Caches/Homebrew/yarn--1.12.3.tar.gz... (1.1MB)
Removing: /Users/yuki/Library/Caches/Homebrew/z3-4.7.1.sierra.bottle.tar.gz... (27.3MB)
Removing: /Users/yuki/Library/Caches/Homebrew/openssl-1.0.2o_2.sierra.bottle.tar.gz... (3.7MB)
Removing: /Users/yuki/Library/Caches/Homebrew/gdbm-1.14.1_1.sierra.bottle.tar.gz... (182.5KB)
Removing: /Users/yuki/Library/Caches/Homebrew/gettext-0.19.8.1.sierra.bottle.tar.gz... (7.8MB)
Removing: /Users/yuki/Library/Caches/Homebrew/readline-7.0.3_1.sierra.bottle.tar.gz... (497.3KB)
Removing: /Users/yuki/Library/Caches/Homebrew/python@2-2.7.15.sierra.bottle.tar.gz... (18.3MB)
Removing: /Users/yuki/Library/Caches/Homebrew/wget-1.19.5.sierra.bottle.tar.gz... (1.3MB)
Removing: /Users/yuki/Library/Caches/Homebrew/cmake-3.11.3.sierra.bottle.tar.gz... (11.8MB)
Removing: /Users/yuki/Library/Caches/Homebrew/boost-1.67.0_1.sierra.bottle.tar.gz... (86.6MB)
Removing: /Users/yuki/Library/Caches/Homebrew/linkage.db... (48KB)
Removing: /Users/yuki/Library/Caches/Homebrew/sqlite-3.24.0.sierra.bottle.tar.gz... (1.7MB)
Removing: /Users/yuki/Library/Caches/Homebrew/nodebrew-1.0.0.tar.gz... (26.3KB)
Removing: /Users/yuki/Library/Caches/Homebrew/solidity-0.4.24.tar.gz... (1.1MB)
Removing: /Users/yuki/Library/Caches/Homebrew/portable-ruby-2.3.3_2.leopard_64.bottle.tar.gz... (12.4MB)
Removing: /Users/yuki/Library/Caches/Homebrew/ethereum-1.8.10.sierra.bottle.tar.gz... (64.2MB)
Removing: /Users/yuki/Library/Caches/Homebrew/portable-ruby-2.3.7.leopard_64.bottle.tar.gz... (12.4MB)
Removing: /Users/yuki/Library/Caches/Homebrew/go-1.10.3.sierra.bottle.tar.gz... (102.6MB)
Removing: /Users/yuki/Library/Caches/Homebrew/openssl-1.0.2o_1.sierra.bottle.tar.gz... (3.7MB)
Removing: /Users/yuki/Library/Caches/Homebrew/watch-3.3.15.sierra.bottle.tar.gz... (30.9KB)
Removing: /Users/yuki/Library/Caches/Homebrew/nmap-7.70.sierra.bottle.tar.gz... (7.1MB)
Removing: /Users/yuki/Library/Caches/Homebrew/libunistring-0.9.10.sierra.bottle.tar.gz... (1.4MB)
Removing: /Users/yuki/Library/Caches/Homebrew/ccache-3.4.2.sierra.bottle.tar.gz... (89.8KB)
Removing: /Users/yuki/Library/Caches/Homebrew/libidn2-2.0.5.sierra.bottle.tar.gz... (217.4KB)
Removing: /Users/yuki/Library/Caches/Homebrew/Cask/adoptopenjdk--11.0.1,13.tar.gz... (181.1MB)
Removing: /Users/yuki/Library/Logs/Homebrew/z3... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/tree... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/wget... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/libidn2... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/ccache... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/python@2... (3 files, 123.9KB)
Removing: /Users/yuki/Library/Logs/Homebrew/go... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/gdbm... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/cmake... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/boost... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/libunistring... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/icu4c... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/nkf... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/readline... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/sqlite... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/yarn... (100B)
Removing: /Users/yuki/Library/Logs/Homebrew/solidity... (6 files, 563.5KB)
Removing: /Users/yuki/Library/Logs/Homebrew/nodebrew... (104B)
Removing: /Users/yuki/Library/Logs/Homebrew/gettext... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/watch... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/node... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/jenv... (100B)
Removing: /Users/yuki/Library/Logs/Homebrew/nmap... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/openssl... (64B)
Removing: /Users/yuki/Library/Logs/Homebrew/ethereum... (64B)
Pruned 0 symbolic links and 2 directories from /usr/local


サンプル的に試してみる

例えば、以下の郵便番号による住所検索 API

curl で実行して、それを jq コマンドにパイプで渡してみます(queryパラメータの postal に指定している値が郵便番号)

curl "http://geoapi.heartrails.com/api/json?method=searchByPostal&postal=1060032" | jq


実行してみると以下のようになります。

$ curl "http://geoapi.heartrails.com/api/json?method=searchByPostal&postal=1060032" | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1882    0  1882    0     0  59882      0 --:--:-- --:--:-- --:--:-- 60709
{
  "response": {
    "location": [
      {
        "city": "港区",
        "city_kana": "みなとく",
        "town": "六本木一丁目",
        "town_kana": "ろっぽんぎ1ちょうめ",
        "x": "139.740991",
        "y": "35.665082",
        "prefecture": "東京都",
        "postal": "1060032"
      },
      {
        "city": "港区",
        "city_kana": "みなとく",
        "town": "六本木二丁目",
        "town_kana": "ろっぽんぎ2ちょうめ",
        "x": "139.737087",
        "y": "35.666974",
        "prefecture": "東京都",
        "postal": "1060032"
      },
      {
        "city": "港区",
        "city_kana": "みなとく",
        "town": "六本木三丁目",
        "town_kana": "ろっぽんぎ3ちょうめ",
        "x": "139.735452",
        "y": "35.663977",
        "prefecture": "東京都",
        "postal": "1060032"
      },
      {
        "city": "港区",
        "city_kana": "みなとく",
        "town": "六本木四丁目",
        "town_kana": "ろっぽんぎ4ちょうめ",
        "x": "139.733837",
        "y": "35.665489",
        "prefecture": "東京都",
        "postal": "1060032"
      },
      {
        "city": "港区",
        "city_kana": "みなとく",
        "town": "六本木五丁目",
        "town_kana": "ろっぽんぎ5ちょうめ",
        "x": "139.735248",
        "y": "35.658358",
        "prefecture": "東京都",
        "postal": "1060032"
      },
      {
        "city": "港区",
        "city_kana": "みなとく",
        "town": "六本木六丁目",
        "town_kana": "ろっぽんぎ6ちょうめ",
        "x": "139.729932",
        "y": "35.659856",
        "prefecture": "東京都",
        "postal": "1060032"
      },
      {
        "city": "港区",
        "city_kana": "みなとく",
        "town": "六本木七丁目",
        "town_kana": "ろっぽんぎ7ちょうめ",
        "x": "139.726863",
        "y": "35.664751",
        "prefecture": "東京都",
        "postal": "1060032"
      }
    ]
  }
}

これだけで、JSONを見やすく整形した状態で出力してくれます


jq コマンドは、かなり色々とできるはずなので、使い方調べながらもっと使いこなせるようになりたいです。

sort と uniq で出現回数順にランキング

Linux なんかで、何かしらのコマンドの結果から重複したデータを出力して、
その結果を出現回数順に並べたいというのがまーまーよくあります。

ほぼ、イディオムみたいなもんです。(が、自分は毎日使うわけではなく忘れることがあるのでここにメモしておくことにしました)

やり方は、sortuniq コマンド利用して以下の通りです

{何かしらのコマンド等で重複データを出力した結果} | sort | uniq -c | sort -nr


例えばコマンドで以下のような重複するデータを含むIPアドレス群(例えばWebサーバへのアクセス元のIPアドレス群)が得られた場合

106.73.78.92
171.193.59.149.168
209 207.46.204.192
203 59.106.108.114
105.72.77.110
120 66.249.70.136
120 66.249.70.136
137 78.46.120.35
202 66.249.69.107
107.72.78.97
106 66.249.69.121
105.72.77.110
137 78.46.120.35
129 66.249.69.65
105.72.77.110
120 66.249.70.136
117 66.249.69.131
107.72.78.97
105.72.77.110
106 66.249.69.121

これらに対して先ほどのコマンドを実行すると結果は以下になります(出現回数とIPアドレスが出現回数の降順で表示されます)

   4 105.72.77.110
   3 120 66.249.70.136
   2 137 78.46.120.35
   2 107.72.78.97
   2 106 66.249.69.121
   1 209 207.46.204.192
   1 203 59.106.108.114
   1 202 66.249.69.107
   1 171.193.59.149.168
   1 129 66.249.69.65
   1 117 66.249.69.131
   1 106.73.78.92


このぐらいのコマンドの使い方は記憶しておけよって言われそうですが・・・。

Office365製品の画面がチラつく時の対策

Microsoft の Office製品(Office 2016のみ?)を使っていると、
急にウィンドウ内が白くなってそのウィンドウをクリックしないと実際にそこに書かれている内容が参照できない。
というような チラつき、画面の点滅 のような現象が発生することがあります。

一度発生すると、ずっと発生し続けて相当に面倒な状態になります。(まともに内容が表示されない、画面描画が遅い・・・)
私は、Outlook等 でこの現象に出くわしました。

端末環境にもよると思いますが、私の場合は
ハードウェア グラフィック アクセラレータを無効化することで本現象が発生しなくなりました。


設定手順は、対象製品を起動した上で、
[ファイル] > [オプション] > [詳細設定] > [ハードウェア グラフィック アクセラレータを無効にする] にチェックを入れる。 です。

設定画面は以下のようになっています。

f:id:nini_y:20190810083106p:plain


同じような現象にはまってしまってる人が、これで解消すればよいのですが・・・。

「仕事ごっこ ~その“あたりまえ”、いまどき必要ですか?」

「仕事ごっこ ~その“あたりまえ”、いまどき必要ですか?」 を読んでみました。

仕事ごっこ ~その“あたりまえ

仕事ごっこ ~その“あたりまえ"、いまどき必要ですか?


内容紹介は以下のようになっています

「郵送」「印刷して配布」
「とりあえず打ち合わせ」
「手書き」「メールを送ったら電話で確認」「押印」
「メール添付で圧縮してパスワードつけて、パスワードは別送」
「ひたすらテレアポ」「とにかく相見積り、コンペ」
「年末年始の挨拶や表敬訪問」「スーツ&ネクタイ」「ダイバーシティごっこ」

ちょっと待って、それってホントに必要ですか?

仕事のスピードを遅くし、時間をムダにし、成長機会を奪い、社外の人とのコラボレーションを邪魔し、
優秀な人を遠ざける慣習やルール――それが、“仕事ごっこ"。

これまでの常識を、シニカルなものがたり+ツッコミで、笑い飛ばしながらアップデート! 


この本では冒頭で、仕事ごっこ を以下のように定義しています。

  • 生まれた当初は合理性があったものの、時代や環境や価値観の変化、および技術の進化にともない、生産性やモチベーションの足をひっぱる厄介者と化した仕事や慣習。
  • コラボレーション、ひいてその組織とそこで働く人の剣山な成長を邪魔する形骸化した仕事や慣習。あるいは、仕事のための仕事。


冒頭では、さらに以下のようにも書かれています。

仕事は生きものです。生まれた当初は意味があった。しかし、時代の変化、法制度の変化、テクノロジーの変化、働く人たちやお客さんの価値観の変化・・・さまざまな変化の中で、やがて陳腐化し、時代遅れになります。
そうして、いつの間にか私たちの足をひっぱる厄介者になってしまっているのです。
仕事は生きもの。だからこそ、いったん立ち止まり、正しくアップデート(最新化)していかなければなりません。


この後、各章で、特に大企業でありがちな 仕事ごっこ の事例が紹介されています。

よく分かるなーと思える事例もあれば、まだそんなことしてるの?とさえ思う事例もあります。
どれもこれも、当初は何らかの意味があったのでしょうが、今となっては仕事の生産性を落とすだけのものと化しているものがほとんどです。


薄い本で内容も平易なので、すぐ読み終わることができます。


ただし、難しいなーと思ったのが、
この本をもっとも読んでほしい上級の役職の人ほど、この本を手に取ることはないだろうということです。

若手の方が読んで、内容に納得し自分より下の世代には 仕事ごっこ が残らないように努力するしかないのかな・・・
と、なかなか難しさも感じました。

「社会は変えられる: 世界が憧れる日本へ」

「社会は変えられる: 世界が憧れる日本へ」
たまたまこの本を知る機会があり、読んでみました。

社会は変えられる: 世界が憧れる日本へ

社会は変えられる: 世界が憧れる日本へ


内容紹介は以下のようになっています

超高齢社会を迎え、医療費・介護費の膨張には歯止めがかからず、今や世界に冠たる国民皆保険制度は風前の灯火。
ところが医療関係者や製薬企業などの“専門家"は、古い制度や体制に守られ、同時に縛られ、「沈みゆく豪華客船」の中での席取り合戦に終始するばかり。
この苦境を乗り切るため、現役官僚の著者は、社会・経済システムの見直しによる「生涯現役社会」の創設を説く。
社会全体が変わる中で初めて持続可能な社会保障制度の構築が可能になるという。
前途多難に違いないが、関係者がより広い視点から問題を捉えて行動することができれば、
誰一人切り捨てることなく国民皆保険制度を維持する道が見えてくると主張する。
著者は実際にこれまでも、業界内では「不可能」と考えられていた数々の課題に、“部外者"の視点から切り込み、改革を成し遂げてきた。
その経験から、絶望するのは、まだ早いと説く。著者が思い描くのは、次世代に残すべきこの国の未来であり、
世界が羨望と畏敬の念を持って見つめる「憧れの国」日本の姿だ。


目次は以下の通りです

  • 第一章: 問題の本質を問い直す
  • 第二章: 時代に合わなくなった社会保障制度
  • 第三章: 社会は変えられる! ー 時代に合わない「制度」、業界の「常識」への挑戦
  • 第四章: 世界が憧れる日本へ


以下は、導入となっている「はじめに」の部分からの一部抜粋です

先が見えない難しい状況に陥った時に、私たちは往々にしてこれまで通りのやり方を押し通そうとするか、
「仕方がない」と言ってなにもしないことを正当化してしまうものです。
ところが、一歩引いてより広い視座から全体を俯瞰できるかどうかで、その後の展開は大きく変わります。
対応策が見つからなかった課題でも、違った視点から眺めることで、思いがけないヒントが見つかるものです。
現在、日本の社会保障制度は聞き的な状況にあります。
・・・なかでも「年金」の問題は、将来自分が受け取るお金の話ですから、不安に感じる人も多いでしょう。
・・・実は「年金」よりも遥かに深刻な問題を抱えているのが、日本の医療を支える「国民皆保険制度」です。
誰もが当たり前のように利用している公的医療保険が危機的な状況にあります。
・・・

これら含めて日本の現在の医療に関わる制度を、一度乗船すればいつでも自由に最高の食事などを楽しむことができて目的地まで運んでくれる「豪華客船」に例えています。
ただし、この「豪華客船」は今のままでは沈みゆくことがほぼ確実です。
これは、この筆者が指摘しているだけではなく、多くの場面で課題として上がっており、間違いないことです。

筆者は、今一度日本の医療制度の問題点を整理して、どう対策を打つかというよりも、社会の変化に対してどう考え方や構造を変えるべきかといったところを主張しています。

特に、発症した病気を「治す」医療から「予防」や「管理」を基本とする医療へ転換する という主張は完全に同意します。


ただ、日本の医療制度の問題に対して、あまりに大きな変革が必要となるため、いくら主張されても本当にそんなことが可能なのかと思えてしまいます。
しかし、筆者は官僚としてこれまで多くの無理だとしか思えない課題に取り組み、なんとか解決へ導いてきた事例を三章で述べています。
正直、この章で少ない文章にまとめて書かれていますが、
筆者がいくつものとんでもない苦難へ立ち向い、ギリギリのところまで努力・実行することを諦めず、解決へ導いてきた話は驚きしかありません。

三章の内容を読んでいくつもの難題を解決したこの筆者の主張であれば、医療に関する各種変革に対する話も可能性はゼロではないと感じました。
そしてこの筆者が警鐘を鳴らす問題であるからこそ、日本の医療に関する問題が本当に深刻で、タイムリミットが迫っているとも思えました。


この本を読むべきターゲットは、基本的に日本人全員だと思います。
おおげさな言い方かもしれませんが、現代の日本人がこの筆者の主張を一旦理解することが重要な気がします。
(もちろん、単純な賛成だけではなく批判も出てくると思いますが、とにかくこの本で分かりやすく書かれている現在の日本の課題を理解すべきだと思います)