ようへいの日々精進XP

よかろうもん

2020 年 06 月 26 日 (金)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

  • おやすみ
  • 起床後, 孤独に山王公園を 1 周ウォーキング
  • 終業後, 奥さんと山王公園を 1 周ウォーキング

ギョーム

  • ウィークリーレポート書いたり
  • 古いサーバーの調査だったり
  • サービスのコードを少し触らせてもらったり

今週はバタバタした感じが続いて, 腰を落ち着けてやりたいことが出来ていなかった感じだった. 疲れたなあ.

ディナー

手羽中とオクラ等の野菜をピリ辛ソースで絡めた最高のおかず. ビール (一週間に二回くらい本物のビールを頂けるようになりました) にとても良くあっていて幾らでも食べることが出来た. おいしゅうございました.

2020 年 06 月 25 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

  • おやすみ
  • 終業後, 孤独に山王公園を 2 周ウォーキング

ギョーム

  • AWS サポートへの問い合わせ, 問い合わせを書くのにもちゃんと情報を揃えて書かないといけないので神経をすり減らす
  • たまに ECS サービスをデプロイする際にメモリ不足でデプロイが失敗してしまう現象にぶち上がっていて, なんだかな... って感じ

aws.amazon.com

ディナー

長芋を巻いて豚バラ甘辛ソースで絡めた「長芋の豚バラ巻き」がご飯のおかずに最高で美味しゅうございました.

2020 年 06 月 24 日 (水)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

  • おやすみ
  • 終業後, 奥さんと山王公園を 1 周ウォーキング

ギョーム

  • 社内で kubernetes 勉強会を開催, まとまった形で kubernetes に勉強出来たのは久しぶりだったので, 良い勉強だった

ディナー

好物の鮭南蛮漬け, 美味しゅうございました.

社のイケメンエンジニアにコミットをまとめて下さいと怒られたので git rebase -i でコミットをまとめるチュートリアル

tl;dr

ある日, 社のイケメンエンジニア S 氏に「かっぱさんのプルリク, コミットまとめてくださいねー」とカジュアルに言われて, 「こ, コミットをまとめる??そんなん, やったことない」な状態になってしまったので, 手元の練習リポジトリでプルリクエストのコミットをまとめるチュートリアルをやったのでメモしておきます.

チュートリアル

ブランチを切る

チュートリアルで利用するリポジトリは以下のリポジトリ.

github.com

$ git clone git@github.com:inokappa/test001.git
$ git checkout -b 'matome-test'

修正する -> コミット -> 修正する -> コミット...

$ echo 'test1' >> README.md
$ git add README.md
$ git commit -m 'test1'
$ echo 'test2' >> README.md
$ git add README.md
$ git commit -m 'test2'
$ echo 'test3' >> README.md
$ git add README.md
$ git commit -m 'test3'
$ echo 'test4' >> README.md
$ git add README.md
$ git commit -m 'test4'
$ echo 'test5' >> README.md
$ git add README.md
$ git commit -m 'test5'

リポジトリにプッシュしてプルリクエストを作成

$ git push -u origin matome-test
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 12 threads
Compressing objects: 100% (15/15), done.
Writing objects: 100% (15/15), 1.56 KiB | 1.56 MiB/s, done.
Total 15 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
remote:
remote: Create a pull request for 'matome-test' on GitHub by visiting:
remote:      https://github.com/inokappa/test001/pull/new/matome-test
remote:
To github.com:inokappa/test001.git
 * [new branch]      matome-test -> matome-test
Branch 'matome-test' set up to track remote branch 'matome-test' from 'origin'.

プルリクエストを作成.

f:id:inokara:20200623234545p:plain

コミットが 5 つ並んでいることがわかります.

イケメンエンジニアに怒られる

f:id:inokara:20200623234657p:plain

コミットをまとめる

まずは, コミットをまとめる際, コミットのログを確認してコミット ID を確認します.

$ git log



commit db271fb99382d122fdfe398dfb4cf6bd37374ae0 (HEAD -> matome-test, origin/matome-test)
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test5

commit 1d33ea46079f3dc2ee2d560e26cdfd49cb44af01
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test4

commit ac826c4eb710838a7195e5d0f1723d04bf14689a
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test3

commit b7b065e1a40f829db2ae0718bc92f05d7dd94f66
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test2

commit d5e24c5f8837d26f81e02cb9ec2eaf93300c7831
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    test1

commit 483d4d6f0b4e697b876b4d27bce64a73d7106938 (origin/master, origin/HEAD, master)
Merge: 12cee31 e5d0bad

コミットログ test1 (コミット ID: d5e24c5f8837d26f81e02cb9ec2eaf93300c7831) からコミットログ test5 (コミット ID: db271fb99382d122fdfe398dfb4cf6bd37374ae0) について, コミットログ test1 に全部まとめたいと思います. そうすれば, 5 つ登録されていたコミットを 1 つにまとめることが出来そうです.

以下のように git rebase -i ${まとめるコミットの 1 つ前のコミット ID} を実行します. ちなみに -i--interactive の省略オプションです.

$ git rebase --interactive 483d4d6f0b4e697b876b4d27bce64a73d7106938

コミットログ test1 (コミット ID: d5e24c5f8837d26f81e02cb9ec2eaf93300c7831) にまとめる為, その一つ前のコミット ID: 483d4d6f0b4e697b876b4d27bce64a73d7106938 を指定しています. コマンドを実行すると以下のように出力されます.

pick d5e24c5 test1
pick b7b065e test2
pick ac826c4 test3
pick 1d33ea4 test4
pick db271fb test5

# Rebase 483d4d6..db271fb onto 483d4d6 (5 commands)
#
# Commands:

...

pick d5e24c5 test2 から pick db271fb test5 を以下のように修正して保存します.

pick d5e24c5 test1
s b7b065e test2
s ac826c4 test3
s 1d33ea4 test4
s db271fb test5

# Rebase 483d4d6..db271fb onto 483d4d6 (5 commands)
#
# Commands:

...

保存すると, さらに以下のように, まとめるコミットの全てのコミットメッセージを修正する為にエディタが開きます.

# This is a combination of 5 commits.
# This is the 1st commit message:

test1

# This is the commit message #2:

test2

# This is the commit message #3:

test3

# This is the commit message #4:

test4

# This is the commit message #5:

test5
...

これを以下のように修正して保存します.

まとめてしまいます.
# This is a combination of 5 commits.
# This is the 1st commit message:

test1 (まとめられます)

# This is the commit message #2:

test2 (まとめられます)

# This is the commit message #3:

test3 (まとめられます)

# This is the commit message #4:

test4 (まとめられます)

# This is the commit message #5:

test5 (まとめられます)
...

保存すると, 以下のように出力されました.

[detached HEAD c0f7634] まとめてしまいます.
 Date: Tue Jun 23 23:40:01 2020 +0900
 1 file changed, 5 insertions(+)
Successfully rebased and updated refs/heads/matome-test.

リポジトリに Force プッシュ

あとは, 以下のようにリポジトリに Force プッシュします. (既にリポジトリにプッシュしている為)

$ git push -u origin matome-test --force
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 440 bytes | 440.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:inokappa/test001.git
 + db271fb...c0f7634 matome-test -> matome-test (forced update)
Branch 'matome-test' set up to track remote branch 'matome-test' from 'origin'.

プルリクエストでコミットがまとめられていることを確認出来ました!

f:id:inokara:20200624000245p:plain

git log でも以下のように確認出来ます.

$ git log
commit c0f7634eb0614b82de332534cb928aa7fb353170 (HEAD -> matome-test, origin/matome-test)
Author: inokappa <inokara@gmail.com>
Date:   Tue Jun 23 23:40:01 2020 +0900

    まとめてしまいます.

    test1 (まとめられます)

    test2 (まとめられます)

    test3 (まとめられます)

    test4 (まとめられます)

    test5 (まとめられます)

以上

コミットをまとめてもイケメンにはなれませんでしたが, 今まで, git は clonepushpull くらいしか使ったこと無かったけど, 自分でやってみるとなんとなく理解しました. ありがとう, S 氏.

2020 年 06 月 23 日 (火)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

  • おやすみ
  • 業務後に山王公園を 2 周ウォーキング
  • 仕事で疲れていたので歩きもクタクタ, 背中の痛みも強かった

ギョーム

  • インフラ構成の変更
  • 障害対応

バタバタとした一日で疲れた...

ディナー

久しぶりのカレー. 奥さん特製の無水カレーがとても美味しくて食べ過ぎた.

AWS の AutoScaling Group をいじるコマンドラインツールを作っていたけど, ちゃんと使ってみたら意外に便利だったのでメモ

tl;dr

なにかの拍子に AWS の AutoScaling Group の以下のようなパラメータをいじるコマンドラインツールを作っていたんだけど, 実運用で使ってみたら意外に便利だったのでメモしておきます.

  • サービスメンテナンスの際に一時的に AutoScaling Group 内の EC2 起動台数を増やしたい
  • 同じく, EC2 の最大起動台数を調整したい
  • スポットインスタンスを使っていて, 一時的にスポットインスタンスとオンデマンドインスタンスの割合を調整した

作ったもの

だいぶん前に作っていて, 実運用で利用していなかったんですが... だいぶん雑な実装になっています. すいません.

github.com

インストールはバイナリをパスが通ったディレクトリに放り込んで下さい.

出来ること

事前に

環境変数に以下の内容を設定しておきましょう.

export AWS_PROFILE=your-profile-name
export AWS_REGION=ap-northeast-1

AutoScaling Group 一覧の取得

$ asg
+--------------------------+-------------------+------------------+----------+----------+
|  AUTOSCALING GROUP NAME  | RUNNING INSTANCES | DESIRED CAPACITY | MIN SIZE | MAX SIZE |
+--------------------------+-------------------+------------------+----------+----------+
| oreno-autoscaling-demo   |                 0 |                0 |        0 |        2 |
| oreno-autoscaling-demo1  |                 0 |                0 |        0 |        1 |
+--------------------------+-------------------+------------------+----------+----------+

desired capacity の変更

起動して欲しい EC2 インスタンス台数の変更することが出来ます.

$ asg --group=oreno-autoscaling-demo --desired=2 --dryrun
Will be updated as follows...
  Min              : 2
  Max              : 2
  Desired Capacity : 2

$ asg --group=oreno-autoscaling-demo --desired=2
Change the capacity of AutoScaling Group: oreno-autoscaling-demo
Do you want to continue processing? (y/n): y
+--------------------------+-------------------+------------------+----------+----------+
|  AUTOSCALING GROUP NAME  | RUNNING INSTANCES | DESIRED CAPACITY | MIN SIZE | MAX SIZE |
+--------------------------+-------------------+------------------+----------+----------+
| oreno-autoscaling-demo   |                 0 |                2 |        2 |        2 |
+--------------------------+-------------------+------------------+----------+----------+

起動して欲しい最大の EC2 台数の変更

起動して欲しい最大 EC2 台数を変更することが出来ます.

$ asg --group=oreno-terraform-dev-demo --max=10 --dryrun
Will be updated as follows...
  Min              : 2
  Max              : 10
  Desired Capacity : 2

$ asg --group=oreno-terraform-dev-demo --max=10
Change the capacity of AutoScaling Group: oreno-terraform-dev-demo.
Do you want to continue processing? (y/n): y
+--------------------------+-------------------+------------------+----------+----------+
|  AUTOSCALING GROUP NAME  | RUNNING INSTANCES | DESIRED CAPACITY | MIN SIZE | MAX SIZE |
+--------------------------+-------------------+------------------+----------+----------+
| oreno-autoscaling-demo   |                 2 |                2 |        2 |       10 |
+--------------------------+-------------------+------------------+----------+----------+

オンデマンドインスタンスとスポットインスタンスの台数の割合を変更

AutoScaling Group 内でスポットインスタンスを利用する場合, OnDemandBaseCapacity を超えるキャパシティを超える EC2 についてオンデマンドインスタンスとスポットインスタンスの割合を変更することが出来ます.

$ asg --group=oreno-terraform-dev-demo --per=10 --dryrun
Will be updated as follows...
  OnDemand Percentage : 10

$ asg --group=oreno-terraform-dev-demo --per=10
Change the ondemand percentage of AutoScaling Group: oreno-terraform-dev-demo.
Do you want to continue processing? (y/n): y
+--------------------------+-------------------+------------------+----------+----------+---------------------+
|  AUTOSCALING GROUP NAME  | RUNNING INSTANCES | DESIRED CAPACITY | MIN SIZE | MAX SIZE | ONDEMAND PERCENTAGE |
+--------------------------+-------------------+------------------+----------+----------+---------------------+
| oreno-autoscaling-demo   |                 0 |                0 |        0 |       10 |                  10 |
+--------------------------+-------------------+------------------+----------+----------+---------------------+

内部的には OnDemandPercentageAboveBaseCapacity の値を指定することになります.

docs.aws.amazon.com

ヘルプ

$ asg --help
Usage of asg:
  -desired string
        Set a Desired capacity number.
  -dryrun
        Show a update execution.
  -group string
        Set a AutoScaling Group Name.
  -max string
        Set a Max capacity number.
  -per string
        Set a OnDemand percentage number (%).
  -version
        Print version number.

以上

Terraform のような構成管理ツールで構築されている環境に対して, このようなコマンドラインツールでの操作が正しいアプローチなのかはわかりませんが, マネジメントコンソールからポチポチするよりはミスは防げそうな気がするので, よろしければ利用をご検討頂けると幸いです.

2020 年 06 月 22 日 (月)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

  • 朝, 山王公園を 3 周, ゆっくりと 30 分

ギョーム

  • メンテナンス
  • ドキュメント作成とか
  • Dockerfile でハマった, Dockerfile 内に if 文とか書いちゃいけないのかなって思った

ディナー

鯛のポワレ〜ラビゴットソース〜という小洒落たお魚が美味しゅうございました.

Alpine Linux Docker イメージを利用した Dockerfile 内で if else を使う時のメモ

tl;dr

Alpine Linux な Docker イメージを利用して Dockerfile を認めた際, カジュアルに if eles を使ったらちょっとハマったのでメモしておきます.

要件

  • Alpine Linux なコンテナイメージを使う
  • ビルド時の引数に FOO=foo1 を渡す, 尚, FOO の値は fooNN の部分は連番となる
  • ビルド引数 FOOfoo* の時とそれ以外で処理を分岐させる

Dockerfile

以下, サンプルの Dockerfile です.

FROM alpine

ARG FOO
ENV FOO=${FOO}

RUN apk update && apk add bash
RUN bash -c "if [[ ${FOO} =~ foo* ]]; then \
  echo 'fooooooooooooooooooooooooooooooooo'; \
else \
  echo 'No foo'; \
fi"

今回, 実は bash をインストールしている点が肝です.

実際にビルドすると以下のような結果となります.

# --build-arg FOO=foo1000 の場合
$ docker build -t alpine-docker:sample .  --build-arg FOO=foo1000
Sending build context to Docker daemon  3.072kB
... 略 ...
 ---> a10df44fcd50
Step 5/5 : RUN bash -c "if [[ ${FOO} =~ foo* ]]; then   echo 'fooooooooooooooooooooooooooooooooo'; else   echo 'No foo'; fi"
 ---> Running in 84ead69e85aa
fooooooooooooooooooooooooooooooooo
Removing intermediate container 84ead69e85aa
 ---> c6fea257b9c4
Successfully built c6fea257b9c4
Successfully tagged alpine-docker:sample

# --build-arg FOO=bar
$ docker build -t alpine-docker:sample .  --build-arg FOO=bar --no-cache
Sending build context to Docker daemon  3.072kB
... 略 ...
Step 5/5 : RUN bash -c "if [[ ${FOO} =~ foo* ]]; then   echo 'fooooooooooooooooooooooooooooooooo'; else   echo 'No foo'; fi"
 ---> Running in 4a4ae9072ebb
No foo
Removing intermediate container 4a4ae9072ebb
 ---> be1603b0ba4b
Successfully built be1603b0ba4b
Successfully tagged alpine-docker:sample

いい感じです.

ハマったところ

今回, ハマった原因は if 文を使ったことというよりも, Bash でしか利用出来ない比較演算子を利用して正規表現比較をやろうとしたことでした.

www.gnu.org

if [[ ${FOO} =~ foo* ]]; then
  echo 'fooooooooooooooooooooooooooooooooo';
else
  echo 'No foo'
fi

これですね.

Alpine Linux コンテナを素で起動した後, シェルは sh 又は ash です. shash も以下のように /bin/busyboxシンボリックリンクです.

$ docker run --rm -t -i alpine ash
/ # which ash
/bin/ash
/ # which sh
/bin/sh
/ # ls -l /bin/ash
lrwxrwxrwx    1 root     root            12 Apr 23 06:25 /bin/ash -> /bin/busybox
/ # ls -l /bin/sh
lrwxrwxrwx    1 root     root            12 Apr 23 06:25 /bin/sh -> /bin/busybox

試しに上記のスクリプトを実行してみます.

/ # if [[ "foo" =~ foo* ]]; then
>   echo 'fooooooooooooooooooooooooooooooooo';
> else
>   echo 'No foo'
> fi
ash: =~: unknown operand
No foo

ash: =~: unknown operand となり正しい比較が出来ません...ちなみに, 以下のように書いても正しい比較が出来ません.

/ # if [[ "foo1" == foo* ]]; then
>   echo 'fooooooooooooooooooooooooooooooooo';
> else
>   echo 'No foo'
> fi
No foo

そうですね. Alpine Linux を利用する場合, 何も考えずにコマンドを並べると ash の限定的な機能にハマる可能性があるということですね.

ちなみに, bash をインストールして確認してみました.

/ # apk add bash
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz
(1/4) Installing ncurses-terminfo-base (6.1_p20200118-r4)
(2/4) Installing ncurses-libs (6.1_p20200118-r4)
(3/4) Installing readline (8.0.1-r0)
(4/4) Installing bash (5.0.11-r1)
Executing bash-5.0.11-r1.post-install
Executing busybox-1.31.1-r9.trigger
OK: 8 MiB in 18 packages
/ #
/ # bash
bash-5.0#
bash-5.0# if [[ "foo1" == foo* ]]; then
>   echo 'fooooooooooooooooooooooooooooooooo';
> else
>   echo 'No foo'
> fi
fooooooooooooooooooooooooooooooooo
bash-5.0# if [[ "foo1" =~ foo* ]]; then
>   echo 'fooooooooooooooooooooooooooooooooo';
> else
>   echo 'No foo'
> fi
fooooooooooooooooooooooooooooooooo

意図したような結果となりました.

以上

メモでした. そもそも, Dockerfile の中で if else を使うことが正しいのかどうか判りませんが, 今後も多分ハマると思います.

Elasticsearch 検索周りTutorial (1)

tl;dr

Elasticsearch にログを放り込むだけであれば何度かやってきたけど, 検索周りは殆ど取り組めていなかったので, ちょっとずつだけど時間を設けてチュートリアルしていこうと思います.

今回はとりあえず docker-compose を使って Elasticsearch と Kibana を起動して検索するデータを放り込むところまで.

各種コードやメモ等は以下のリポジトリに放り込んでいきたいと思います.

github.com

Elasticsearch と Kibana を起動する

なんの変哲もない docker-compose.yml

version: '3.7'

services:
  elasticsearch:
    build:
      context: .
      dockerfile: Dockerfile.elasticsearch
    container_name: elasticsearch
    environment:
      cluster.name: docker-cluster
      ES_JAVA_OPTS: "-Xms1024m -Xmx1024m"
      bootstrap.system_call_filter: "false"
      transport.host: localhost
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
  kibana:
    build:
      context: .
      dockerfile: Dockerfile.kibana
    container_name: kibana
    ports:
      - 5601:5601

以下のように実行するだけです. 簡単ですね.

$ docker-compose up -d

気をつけないといけないのは, JVM のヒープサイズ. 起動や検索だけであれば, 1024m も確保する必要はありませんが, 後述のデータを放り込む際に小さいヒープサイズだとエラーになってしまいます.

データを放り込む

何か良い題材はないのかな

検索を試すためには何かしらの題材がほしいところですが, 今回は Abema TV の番組表が JSON で取得出来ることが判ったので, 番組表 JSON データを利用させていただくことにしました. JSON データの取得については, 以下の記事を参考にさせて頂きました.

nsdev.jp

ちなみに, なぜ, Abema TV 番組表にたどり着いたのか. それは, 今, 話題のドラマである「M 愛すべき人がいて」を見ていたら, Abema TV にたどりついて, Abema TV の番組表が良い感じで提供されていることから, これはもしや... と思い調査したところ, 番組表 JSON データにたどり着いた次第です.

www.tv-asahi.co.jp

abema.tv

bulk API で雑に放り込む

以下のような Ruby スクリプトを利用して番組表 JSON を Elasticsearch に放り込みました.

require "net/http"
require "uri"
require "json"

class AbemaTvSchedule
  ENDPOINT = "http://localhost:9200"

  def initialize(date, slots = [])
    @date = date
    @slots = slots
  end

  def post_index
    uri = URI.parse("#{ENDPOINT}/_bulk")
    http = Net::HTTP.new(uri.host, uri.port)
    req = Net::HTTP::Post.new(uri.request_uri)
    req["Content-Type"] = "application/json"
    req.body = bulk_data
    res = http.request(req)
    puts "#{res.code} #{res.body}"
  end

  private

  def bulk_data
    docs = ''
    @slots.each do |slot|
      doc_id = slot['id']
      doc = <<~EOS
      {"index":{"_id":"#{doc_id}","_index":"abema-channel-#{@date}","_type":"_doc"}}
      #{JSON.dump(slot)}
      EOS
      docs << doc
    end
    docs
  end
end

hash = JSON.parse File.read('abema-tv1.json')
hash.each do |c|
  next if c['slots'].empty?
  AbemaTvSchedule.new(c['date'], c['slots']).post_index
end

番組表 JSON ファイルは以下のような内容で構成されています (抜粋).

[
  {
    "channelId": "abema-news",
    "date": "20200621",
    "slots": [
      {
        "id": "CwYrZm89oahExf",
        "title": "ABEMA NEWS",
        "startAt": 1592661600,
        "endAt": 1592668800,
        "programs": [
          {
            "id": "89-107_s0_p328",
            "episode": {
              "sequence": 328
            },
            "credit": {
              "casts": [
                "ABEMAキャスター"
              ],
...

以下のようにスクリプトを実行すれば, Elasticsearch にデータのインポートが完了します.

$ ruby import-json.rb

当初は 1 件ずつ登録するような実装にしていましたが, 時間も掛かるし, ヒープサイズのエラーに悩まされました. Bulk API を利用することで, 処理時間は一気に短縮されました.

試しに検索

あの「M 愛すべき人がいて」を検索してみます. みんな大好き Dev Tools

f:id:inokara:20200621225232p:plain

更に, 「オンライン音楽祭【LIVE HUMAN 2020】Day 2」を検索してみます.

abema.tv

Kibana の Discover で検索してみます.

f:id:inokara:20200621225937p:plain

いい感じですが, 特にマッピングやアナライザ等の設定を行っていないため, より高度な検索を行おうとすると, 意図しない結果がヒットしたりするのではと考えています.

以上

ここから各種設定を行いながら, 番組タイトルと出演者をキーにして検索したり, より精度の高い検索結果が得られるように取り組んでいきたいと思います.

参考

www.elastic.co

qiita.com

2020 年 06 月 21 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

  • 夕方, 山王公園を 25 分スロージョッグ with 奥さん(2 周)

ギョーム

  • お休み

父の日

  • 贈り物は要らないと言われたので今年は何も送らなかったけど, 電話をしたら母と一緒に畑仕事中
  • 元気そうで安心した
  • これからも父, 母共々元気であることを祈る

Elasticsearch

  • 土日, ずーっと Elasticsearch をガチャガチャしてた
  • 検索周りについてちゃんと取り組めていないことを痛感

ディナー

先日, 好評だったゴーヤチャンプル. 今回は糸島揚げ (厚揚げっぽいやつ) が入っていてより旨味があって美味しゅうございました. 久しぶりに「あの唐揚げ」をテイクアウトしてビールで晩酌. あんまり呑まなくなってからたまに飲むビールがとても美味しく感じる.