Quantcast
Channel: mattintosh note
Viewing all 891 articles
Browse latest View live

Node-RED から Zabbix にデータを連携する

$
0
0

始める始めると言いつつまだ始めてない FlashAir Lua。Zabbix は Zabbix Sender が無くてもソケット通信ができればデータを送れるのは前に試したときにわかったけど、FlashAir の Luaからソケット通信が出来るかどうかがわからない。とりあえず HTTP で何かするのは出来そうなので Node-RED の勉強がてらインターフェイスを準備しておく。

今回は Docker の node-red-docker を使用。

$ sudo docker run -it -p 1880:1880 --name node-red-alpha nodered/node-red-docker

http://localhost:1880を開いて Node-RED へ。

https://screenshots.firefoxusercontent.com/images/1da8feef-b58b-4d7e-b84f-e8f8be064180.png

まずは入力になるノードを作成していく。HTTP GET と HTTP POST は両方作る必要はなく、用途に合わせて作成。

入力で HTTP GET ノードを作成。

https://screenshots.firefoxusercontent.com/images/d88d3bbb-9142-4499-a74a-4d180708163f.png

入力に HTTP POST ノードを作成。

https://screenshots.firefoxusercontent.com/images/452224bf-bb5f-457b-a28a-de6d8cd0fa0a.png

中間に JSONノードを作成。

https://screenshots.firefoxusercontent.com/images/eb706692-1ef6-40f2-bf62-c22f3f5034bd.png

その次に TCPリクエストノードを作成。ポートは Zabbix の待受ポートを指定する。

https://screenshots.firefoxusercontent.com/images/8900e8c9-f675-4371-8590-b58ade174df6.png

一通り出来上がるとこんな感じ。あとはデプロイしておしまい。

https://screenshots.firefoxusercontent.com/images/5274ced3-d902-4246-ab11-fcf49c5321c3.png

テストで GET、POST 両方試してみる。Zabbix に送る JSONはこんな感じ。ホストは raspberrypi-zero、キーは testを作成してある。

{"request": "sender data"
,   "data": [{"host": "raspberrypi-zero"
        ,   "key": "test"
        ,   "value": "0"
        }]}

まずは GET。data は配列で送る必要がある。$RANDOMはシェルの変数で適当な数値が入る。

curl -g-X GET "http://localhost:1880/get?request=sender+data&data[0][host]=raspberrypi-zero&data[0][key]=test&data[0][value]=${RANDOM}"

次に POST。Content-Type: application/jsonを忘れずに。

curl -X POST -H'Content-Type: application/json'--data\'{"request": "sender data",   "data": [        {"host": "raspberrypi-zero"        ,   "key": "test"        ,   "value": "'${RANDOM}'"        }    ]}' http://localhost:1880/post

いずれも成功すれば Zabbix からメッセージが返ってくる。このメッセージが返ってこなければ TCPリクエストに失敗している可能性がある。また、 processed ではなく failed になってしまう場合は host や key が間違っていたり、JSONの内容が間違っている可能性がある。

ZBXDZ{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000064"}

Zabbix のダッシュボードでデータを確認してみる。

https://screenshots.firefoxusercontent.com/images/e3b3106f-0d5f-4bc1-a6b4-24f0eb74c1a1.png

Node-RED はデータを視覚的に繋げられて、モニタリングやデバッグがもできるので面白い。


Raspberry Pi で AC100V を制御する

$
0
0

先日参加した「IoT もくもく会」で SSR(ソリッド・ステート・リレー)の存在を教えていただいたので早速、秋月電子SSRキットを買ってきた。お値段250円。

https://screenshots.firefoxusercontent.com/images/8cd5f241-e88d-4d53-8406-760ff5168f83.png

akizukidenshi.com

この製品はトライアック、フォトトライアック、サージ吸収素子、抵抗、基板がセットになったもの。各部品を別々にも買えるけど多分キットで買ったほうが安い。AC100V 側の穴が M2(か M2.6 だったような気がする)なので M3 の丸型端子を接続するには穴を拡張する必要がありそう。時間なくてそのへんの部品を買いにいけていないのでまた来週末にでも考える。

リレーとして使うので接続は簡単。十数ワットなのでいまのところ放熱板はつけていない。とりあえず Raspberry Pi Zero の GPIO からフォトトライアック側の回路に接続してシェルから操作してみる。

おぉ…感動。

DC12V なら車で扱ってたから平気なんだけど AC100V はちょっと不安。(感電はもちろん発火とか)

で、Google Home を買ったついでに Raspberry Piに Home Assistant を入れてボタンを作る。Home Assistant の設定はこちらのページが非常に参考になった。

qiita.com

Raspberry Piで Home Assistant を起動できたら ~/.homeassistant/configuration.yamlにボタンの設定を追加する。

switch:platform: command_line
    switches:arest_pin_four:command_on :"echo 1 >/sys/class/gpio/gpio16/value"command_off:"echo 0 >/sys/class/gpio/gpio16/value"friendly_name: IKEA の LED ランプ

これで PC でもスマホでもブラウザから操作ができるようになった。

https://screenshots.firefoxusercontent.com/images/91160444-b7cc-4ccc-82ff-c80f8b089471.png

いざ実験。

おぉ…か(ry

Home Assistant は始めて使ったけど、Google Home アプリのようにアクティビティログが残るので「いつ起動した?」っていうのが確認できて便利。

https://screenshots.firefoxusercontent.com/images/d5594eae-aa22-4073-8067-3dfc8e9d03d9.png

https://screenshots.firefoxusercontent.com/images/91eca051-0708-4f1e-a058-0def7476931c.png

あとは Google Home と連携して「ねぇ、Google。居間の電気をつけて」ができれば完璧。

なんだけど時間が無いのでそれはまた今度。

Mac や Linux でコミケカタログROM版は使えるのか?

$
0
0

だいぶ前から「Macで Nihonshu や EasyWine.app でコミケカタログは見れるのか?」というお題を立てていましたが、C93 で遂に DVD-ROM 版を買いましたので、いざ検証。

まずはイメージ化。

$ dd if=/dev/rdisk3 of=C93.iso bs=64m

イメージをアタッチします。

$ hdiutil attach C93.iso

Wine Explorer で Z:¥Volumes¥CCC93を開きます。いくつか EXE ファイルがありますが、ここでは STARTUP.EXEを実行します。

f:id:mattintosh4:20171230122952p:plain

[インストール]をクリックします。なお、[ディスクから起動]でもカタログは利用可能です。

f:id:mattintosh4:20171230123537p:plain

ここは何も表示されないので[次へ]をクリックします。

f:id:mattintosh4:20171230123746p:plain

インストールを進めていきます。

f:id:mattintosh4:20171230124046p:plain

f:id:mattintosh4:20171230124133p:plain

Macではデスクトップショートカットを作成しても使えない(はず)なのでチェックを外してもいいでしょう。

f:id:mattintosh4:20171230124211p:plain

f:id:mattintosh4:20171230124239p:plain

f:id:mattintosh4:20171230124315p:plain

[起動]をクリックします。

f:id:mattintosh4:20171230124410p:plain

[DVDROMカタログを起動する]をクリックします。

f:id:mattintosh4:20171230124500p:plain

情報送信については任意で選択します。

f:id:mattintosh4:20171230124539p:plain

Circle.msに登録しているメールアドレスとパスワードを入力します。

f:id:mattintosh4:20171230124604p:plain

カタログに付属しているシリアル番号を入力します。

f:id:mattintosh4:20171230124626p:plain

データベースを作成します。

f:id:mattintosh4:20171230124700p:plain

f:id:mattintosh4:20171230124728p:plain

無事に DVDROMカタログが起動しました。

f:id:mattintosh4:20171230124808p:plain

検索やチェックリストの書き出しなども問題なく動きます。

f:id:mattintosh4:20171230124839p:plain

次回からは C:¥Program Files¥コミケット¥カタログブラウザ93¥ccatalog.exeでカタログを開けるようになります。(.desktop ファイルは Linux向けなので Macでは使用できなかったはずです)

Linux版の Wine でも同様に問題なく使うことができました。

ここ数回はマップだけ印刷してツイッター見つつフラフラ回る感じでしたが、ROM版めちゃめちゃ便利ですね。2,500円で下調べに必要な時間がかなり短縮されるので非常に助かりました。

C93 も明日で最後ですが皆さん頑張りましょう(*゚∀゚)

Windows版との差については確認していません。

qaac の準備が面倒くさいのでスクリプト化した

$
0
0

LinuxiTunesAAC/ALAC エンコーダーを使うために WINE 経由で qaac を使うんだけど、qaac の準備がめんどくさかったのでスクリプト化した。

Linuxで qaac を使う方法は過去記事参照。

mattintosh.hatenablog.com

qaac のバージョンは執筆時点では 2.64。引数に WindowsiTunes 64-bit 版のインストーラーを指定すればいいだけにしてある。

2.64 固定番と最新版の2種類がある。git ls-remoteで最新のタグを拾おうかと思ったけど、GitHubAPIで最新版の名前と URL が取得できたので jq で済ますことにした。

  • p7zip、curlが必要。latest の場合は jq も必要。
  • 2.64 固定番で qaac のバージョンを上げたければ QAAC_VERSIONQAAC_SHA1SUMを変更する。

■ 2.64 固定版

$ git clone https://gist.github.com/mattintosh4/d5116168d0743d437ea1150cf11588d7 qaac_builder
$ cd qaac_builder
$ bash qaac_builder_2.64.sh ~/Downloads/iTunes64Setup.exe

■ 最新版

$ git clone https://gist.github.com/mattintosh4/d5116168d0743d437ea1150cf11588d7 qaac_builder
$ cd qaac_builder
$ bash qaac_builder_latest.sh ~/Downloads/iTunes64Setup.exe

WINE で qaac64.exe を実行してエラーが出なければOK。

$ wine qaac_2.64/qaac64.exe --check
qaac 2.64, CoreAudioToolbox 7.10.9.0
libsoxconvolver 0.1.0
libsoxr-0.1.3b1

Docker イメージでも作るかな…。

■ 2.64 固定版スクリプト

■ 最新版スクリプト

なお、最新版の JSONhttps://api.github.com/repos/nu774/qaac/releases/latestで取得することができる。

{"url": "https://api.github.com/repos/nu774/qaac/releases/6441962",
  "assets_url": "https://api.github.com/repos/nu774/qaac/releases/6441962/assets",
  "upload_url": "https://uploads.github.com/repos/nu774/qaac/releases/6441962/assets{?name,label}",
  "html_url": "https://github.com/nu774/qaac/releases/tag/v2.64",
  "id": 6441962,
  "tag_name": "v2.64",
  "target_commitish": "master",
  "name": "v2.64",
  "draft": false,
  "author": {"login": "nu774",
    "id": 489444,
    "avatar_url": "https://avatars3.githubusercontent.com/u/489444?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/nu774",
    "html_url": "https://github.com/nu774",
    "followers_url": "https://api.github.com/users/nu774/followers",
    "following_url": "https://api.github.com/users/nu774/following{/other_user}",
    "gists_url": "https://api.github.com/users/nu774/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/nu774/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/nu774/subscriptions",
    "organizations_url": "https://api.github.com/users/nu774/orgs",
    "repos_url": "https://api.github.com/users/nu774/repos",
    "events_url": "https://api.github.com/users/nu774/events{/privacy}",
    "received_events_url": "https://api.github.com/users/nu774/received_events",
    "type": "User",
    "site_admin": false},
  "prerelease": false,
  "created_at": "2017-05-19T12:21:05Z",
  "published_at": "2017-05-19T12:29:11Z",
  "assets": [{"url": "https://api.github.com/repos/nu774/qaac/releases/assets/3912283",
      "id": 3912283,
      "name": "qaac_2.64.zip",
      "label": null,
      "uploader": {"login": "nu774",
        "id": 489444,
        "avatar_url": "https://avatars3.githubusercontent.com/u/489444?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/nu774",
        "html_url": "https://github.com/nu774",
        "followers_url": "https://api.github.com/users/nu774/followers",
        "following_url": "https://api.github.com/users/nu774/following{/other_user}",
        "gists_url": "https://api.github.com/users/nu774/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/nu774/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/nu774/subscriptions",
        "organizations_url": "https://api.github.com/users/nu774/orgs",
        "repos_url": "https://api.github.com/users/nu774/repos",
        "events_url": "https://api.github.com/users/nu774/events{/privacy}",
        "received_events_url": "https://api.github.com/users/nu774/received_events",
        "type": "User",
        "site_admin": false},
      "content_type": "application/x-zip-compressed",
      "state": "uploaded",
      "size": 3055646,
      "download_count": 2190,
      "created_at": "2017-05-19T12:28:48Z",
      "updated_at": "2017-05-19T12:29:09Z",
      "browser_download_url": "https://github.com/nu774/qaac/releases/download/v2.64/qaac_2.64.zip"
    }],
  "tarball_url": "https://api.github.com/repos/nu774/qaac/tarball/v2.64",
  "zipball_url": "https://api.github.com/repos/nu774/qaac/zipball/v2.64",
  "body": "Fixed regression of 2.63: HE-AAC frames were incorrectly multiplexed."
}

Linux で qaac がさくっと使える Docker コンテナを作った

$
0
0

C93 で CD を色々買ってきたので PC に取り込もうとしたんだけど、新しい PC に qaac の実行環境を作ってなかったので Docker で作れるようにしてみました。

github.com

Docker コンテナイメージを作成する

Docker コンテナを作る前に qaac のセットアップが必要です。(コンテナ内で qaac のセットアップをしようと思ったのですが、セットアップ用のパッケージを入れるとイメージサイズが大きくなるのでホスト側で作成することにしました)

$ git clone https://github.com/mattintosh4/docker-qaac64
$ cd docker-qaac64
$ ./qaac_builder.sh

イメージを作成します。qaac は Wine 経由で実行するようになっているため、Wine のセットアップに多少時間がかかります。Wine は Ubuntuリポジトリではなく WineHQ のリポジトリを使うようになっています。(後日、時間が出来たら依存関係の数を減らす予定)

$ docker build -t qaac64 .

qaac は GitHubAPIから常に最新版の情報を取得するので最新版が落ちてきます。

iTunesのバージョンは 12.7.2 ですが、Appleの配信が終了すると使えなくなる可能性があります。その場合、iTunes64Setup.exe をブラウザでダウンロードし、qaac_builder.shと同じディレクトリに置いて iTunes64Setup.exe.sha1を更新してもらえらば好きなバージョンが使えます。

$ sha1sum iTunes64Setup.exe > iTunes64Setup.exe.sha1

qaac64.exe を使う

docker imagesでイメージが作成されていることを確認します。

$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
qaac64                    latest              c6e8b5ada977        6 hours ago         985 MB
ubuntu                    xenial              00fd29ccc6f1        2 weeks ago         111 MB

コンテナ内で qaac を使ってエンコードをするわけですが、肝心のオーディオファイルはホスト側にあるので Docker のボリューム機能を使ってコンテナ内にホストのディレクトリをマウントさせる必要があります。

基本的な書式は下記の通りです。作業用ディレクトリ等を作成せずに使う場合はパスにスペースが混入する可能性があるので $PWD部分を "$PWD"としておいた方が安全かもしれません。--rmを忘れるとエンコードの度にコンテナが増えていくので気をつけましょう。 (WINEPREFIX をイメージを作成する際に実行していたのですが、何故かそのあと qaac64.exe を実行するとアクセス出来ないというエラーになってしまうため毎回 WINEPREFIX の作成に数秒かかります)

docker run --rm-v$PWD:/mnt qaac64 wine qaac64.exe

以下、カレントディレクトリに BIN や CUE ファイルがある場合の例です。BIN は cdrdao で抽出した状態のもので、フォーマットは s16bになります。

$ docker run --rm -v $PWD:/mnt qaac64 wine qaac64.exe --raw --raw-format s16b --raw-channels 2 --raw-rate 44100 cdda.bin

CUE シートを使う場合はオプションに --text-codepage 65001UTF-8の場合)を追加します。--fname-format等でアーティスト、アルバム名の指定ができます。詳しくは qaac のヘルプを読んでください。

$ docker run --rm -v $PWD:/mnt qaac64 wine qaac64.exe --raw --raw-format s16b --raw-channels 2 --raw-rate 44100 --text-codepage 65001 cdda.cue

毎回 docker run と書くのが面倒な場合

~/.bashrcなどに関数を書いておくとよいです。

qaac64(){ docker run --rm-v"$PWD":/mnt qaac64 wine qaac64.exe "$@";}

Ubuntu 17.04 Zesty から 17.10 Artful へ

$
0
0

apt-get updateしたら URL が見つからないよと言われたので。リポジトリftp.riken.jp にしてるんだけど Zesty のサポートが2018年1月までだったのでサーバから無くなったようだ。

$ cd /etc/apt
$ sudo gzip -k sources.list
$ sudo sed -i'' 's/zesty/artful/g' sources.list
$ sudo apt-get update
$ sudo apt-get dist-upgrade

あと、Macで久しぶりに git 使ってたら git tag --sort=v:refnameが使えなくなってた。一番新しいタグを拾うのに使ってたのに…。

調べてみたら for-each-refで一番新しいタグを拾いたければ --count=1 --sort=-taggerdateで逆順出せばいいようだ。楽ちん。

git for-each-ref --sort=-taggerdate --count=1 --format '%(refname:short)' refs/tags

Wine 3.0 版 EasyWine Nihonshu をプレリリースしました

$
0
0

Wine 3.0 がリリースされたので各種頒布物をビルドしました。

  • EasyWine-20180121_wine-3.0.dmg
  • MikuInstaller-Kai-Kit_wine-3.0.dmg
  • wine-3.0_nihonshu-20180121.tar.bz2
  • ws_wine-3.0_nihonshu-20180121.tar.7z

matome.naver.jp

パッチは 2.x 系からそのまま引き継いでいます。仕事が忙しくあまり時間がないため、細かい動作チェックしてませんので人柱版です。WINEPREFIX に重要なデータを入れている場合はバックアップを取っておいた方がいいかもしれません。

いつの間にか HKEY_CURRENT_USER\Software\Wine\Mac DriverRetinaModeという設定が増えてたので Retina環境の方は設定してみるとより良い環境になるかもしれません。レジストリのプリセットは変更してないのでそのうち更新する予定です。

次の更新は夏予定。では。

VirtualBox の UEFI で Ubuntu が起動しない

$
0
0

EFIブートの PC 用に USB メモリを作ってるんだけど、インストール後に VirtualBoxを落として起動したら Ubuntuが起動しない…と。

なんか前にも同じようなことがあった気がするけど、どうやったっけ…で調べたら詳しく解説してくれてる方がいた。

www.downtown.jp

UEFIシェルからパーティションは見えてるのでそこにある EFIファイルを起動する。ここでのパスの区切りはバックスラッシュっぽい。

FS0:\EFI\ubuntu\grubx64.efi

よくわからなければ FS0を選択して EFI/ubuntuまで移動して grubx64.efiを実行する。cdでは普通のスラッシュで移動できる。どっかのあれみたいだな…。

FS0:
cd EFI/ubuntu
grubx64.efi

「コマンドなんてわかんねーよクソッ!」みたいな場合は exitUEFIシェルを落として、CUIメニューにある Boot Maintenance Managerを開く。

f:id:mattintosh4:20180308230012p:plain

Boot From Fileを選択する。

f:id:mattintosh4:20180308225935p:plain

ボリュームラベル無しのパーティションを選択。

f:id:mattintosh4:20180308225910p:plain

EFIを選択。

f:id:mattintosh4:20180308225851p:plain

ubuntuを選択。

f:id:mattintosh4:20180308225740p:plain

grubx64.efiを選択。

f:id:mattintosh4:20180308225754p:plain

GRUBが起動するのであとはいつも通り。

f:id:mattintosh4:20180308225814p:plain

/boot/efi/EFI/ubuntu/grubx64.efi/boot/efi/EFI/boot/bootx64.efiにコピーしておけばいいっぽいけど、VirtualBoxだけの問題なら別にいいか…。


Cisco Packet Tracer 7.1.1 を Ubuntu 16.04 や Debian 9 以降にインストールする方法

$
0
0

f:id:mattintosh4:20180527001644p:plain

会社で CCENT/CCNAの教材作成用に Cisco Packet Tracer を使う用事があったので Linux版のインストール方法を残しておく。

Ubuntu 16.04 以降では Packet Tracer 7.1.1 をインストールしただけでは起動できない

Linux向けの Cisco Packet Tracer 7.1.1 は Ubuntu 14.04 を対象にしているようなので Ubuntu 16.04 以降の環境では一部のライブラリが存在せず起動できない。

installスクリプトによってインストールされた packettracerコマンドでは >/dev/null 2>&1となっているためエラーが出力されないが、PacketTracer7を直接実行するとライブラリが見つからないというエラーを確認することができる。

linus@ubuntu1804:~/Applications/pt-7.1.1$ LD_LIBRARY_PATH=lib bin/PacketTracer7  
bin/PacketTracer7: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory
linus@ubuntu1804:~/Applications/pt-7.1.1$ LD_LIBRARY_PATH=lib ldd bin/PacketTracer7 | grep "not found" | sort | uniq
        libicui18n.so.52 => not found
        libicuuc.so.52 => not found
        libpng12.so.0 => not found

Packet Tracer 7.1.1 を使用するにあたり、追加で必要になるライブラリは下記の通り。Kali Linux (MATE Edition) でも試したが libxslt が不足していたような気がする。

ディストリビューション追加で必要なライブラリ
Ubuntu 16.04.4 LTS xeniallibicui18n.so.52
libicuuc.so.52
Ubuntu 18.04 LTS bioniclibicui18n.so.52
libicuuc.so.52
libpng12.so.0
Debian 9libcrypto.so.1.0.0
libicui18n.so.52
libicuuc.so.52
libpng12.so.0
Kali Linux (Mate Edition)後日確認予定

Packet Tracer 7.1.1 のインストール

適当なディレクトリ(ここでは ~/Applications/pt-7.1.1とする)を作成して、その中に Packet Tracer 7.1.1 for Linux 64 bit.tar.gzを展開する。このとき savesディレクトリ以下に書き込み権限が無く、エラーを吐くので sudoで展開する。

mkdir-p ~/Applications/pt-7.1.1
cd       ~/Applications/pt-7.1.1
sudo tar xzf ~/Downloads/Packet\ Tracer\ 7.1.1\ for\ Linux\ 64\ bit.tar.gz

展開直後のトップディレクトリの構成は下記の通り。

linus@ubuntu1804:~/Applications/pt-7.1.1$ tree -F -L 1
.
├── Sounds/
├── art/
├── backgrounds/
├── bin/
├── eula.txt
├── extensions/
├── help/
├── install*
├── languages/
├── lib/
├── saves/
├── set_ptenv.sh
├── set_qtenv.sh
├── templates/
├── tpl.linguist
└── tpl.packettracer

10 directories, 6 files

インストールはトップディレクトリにある installスクリプトを実行し、EULAを読んだ後にインストールディレクトリを指定する。「/usr/local/binpackettracerをインストールしますか?」のような質問をされるので「はい」にすれば LD_LIBRARY_PATHの設定をしてくれる /usr/local/bin/packettracerを配置してくれる。

./install

依存関係の解決

Packet Tracer 7.1.1 には Qt5 のライブラリが同梱されている。

linus@ubuntu1804:~/Applications/pt-7.1.1$ tree -F lib
lib
├── libQt5Core.so -> libQt5Core.so.5.5.1*
├── libQt5Core.so.5 -> libQt5Core.so.5.5.1*
├── libQt5Core.so.5.5 -> libQt5Core.so.5.5.1*
├── libQt5Core.so.5.5.1*
├── libQt5DBus.so -> libQt5DBus.so.5.5.1*
├── libQt5DBus.so.5 -> libQt5DBus.so.5.5.1*
├── libQt5DBus.so.5.5 -> libQt5DBus.so.5.5.1*
├── libQt5DBus.so.5.5.1*
├── libQt5Gui.so -> libQt5Gui.so.5.5.1*
├── libQt5Gui.so.5 -> libQt5Gui.so.5.5.1*
├── libQt5Gui.so.5.5 -> libQt5Gui.so.5.5.1*
├── libQt5Gui.so.5.5.1*
├── libQt5Multimedia.so -> libQt5Multimedia.so.5.5.1*
├── libQt5Multimedia.so.5 -> libQt5Multimedia.so.5.5.1*
├── libQt5Multimedia.so.5.5 -> libQt5Multimedia.so.5.5.1*
├── libQt5Multimedia.so.5.5.1*
├── libQt5MultimediaWidgets.so -> libQt5MultimediaWidgets.so.5.5.1*
├── libQt5MultimediaWidgets.so.5 -> libQt5MultimediaWidgets.so.5.5.1*
├── libQt5MultimediaWidgets.so.5.5 -> libQt5MultimediaWidgets.so.5.5.1*
├── libQt5MultimediaWidgets.so.5.5.1*
├── libQt5Network.so -> libQt5Network.so.5.5.1*
├── libQt5Network.so.5 -> libQt5Network.so.5.5.1*
├── libQt5Network.so.5.5 -> libQt5Network.so.5.5.1*
├── libQt5Network.so.5.5.1*
├── libQt5Positioning.so -> libQt5Positioning.so.5.5.1*
├── libQt5Positioning.so.5 -> libQt5Positioning.so.5.5.1*
├── libQt5Positioning.so.5.5 -> libQt5Positioning.so.5.5.1*
├── libQt5Positioning.so.5.5.1*
├── libQt5PrintSupport.so -> libQt5PrintSupport.so.5.5.1*
├── libQt5PrintSupport.so.5 -> libQt5PrintSupport.so.5.5.1*
├── libQt5PrintSupport.so.5.5 -> libQt5PrintSupport.so.5.5.1*
├── libQt5PrintSupport.so.5.5.1*
├── libQt5Script.so -> libQt5Script.so.5.5.1*
├── libQt5Script.so.5 -> libQt5Script.so.5.5.1*
├── libQt5Script.so.5.5 -> libQt5Script.so.5.5.1*
├── libQt5Script.so.5.5.1*
├── libQt5ScriptTools.so -> libQt5ScriptTools.so.5.5.1*
├── libQt5ScriptTools.so.5 -> libQt5ScriptTools.so.5.5.1*
├── libQt5ScriptTools.so.5.5 -> libQt5ScriptTools.so.5.5.1*
├── libQt5ScriptTools.so.5.5.1*
├── libQt5Sensors.so -> libQt5Sensors.so.5.5.1*
├── libQt5Sensors.so.5 -> libQt5Sensors.so.5.5.1*
├── libQt5Sensors.so.5.5 -> libQt5Sensors.so.5.5.1*
├── libQt5Sensors.so.5.5.1*
├── libQt5Sql.so -> libQt5Sql.so.5.5.1*
├── libQt5Sql.so.5 -> libQt5Sql.so.5.5.1*
├── libQt5Sql.so.5.5 -> libQt5Sql.so.5.5.1*
├── libQt5Sql.so.5.5.1*
├── libQt5Svg.so -> libQt5Svg.so.5.5.1*
├── libQt5Svg.so.5 -> libQt5Svg.so.5.5.1*
├── libQt5Svg.so.5.5 -> libQt5Svg.so.5.5.1*
├── libQt5Svg.so.5.5.1*
├── libQt5WebKit.so -> libQt5WebKit.so.5.5.1*
├── libQt5WebKit.so.5 -> libQt5WebKit.so.5.5.1*
├── libQt5WebKit.so.5.5 -> libQt5WebKit.so.5.5.1*
├── libQt5WebKit.so.5.5.1*
├── libQt5WebKitWidgets.so -> libQt5WebKitWidgets.so.5.5.1*
├── libQt5WebKitWidgets.so.5 -> libQt5WebKitWidgets.so.5.5.1*
├── libQt5WebKitWidgets.so.5.5 -> libQt5WebKitWidgets.so.5.5.1*
├── libQt5WebKitWidgets.so.5.5.1*
├── libQt5Widgets.so -> libQt5Widgets.so.5.5.1*
├── libQt5Widgets.so.5 -> libQt5Widgets.so.5.5.1*
├── libQt5Widgets.so.5.5 -> libQt5Widgets.so.5.5.1*
├── libQt5Widgets.so.5.5.1*
├── libQt5XcbQpa.so -> libQt5XcbQpa.so.5.5.1*
├── libQt5XcbQpa.so.5 -> libQt5XcbQpa.so.5.5.1*
├── libQt5XcbQpa.so.5.5 -> libQt5XcbQpa.so.5.5.1*
├── libQt5XcbQpa.so.5.5.1*
├── libQt5Xml.so -> libQt5Xml.so.5.5.1*
├── libQt5Xml.so.5 -> libQt5Xml.so.5.5.1*
├── libQt5Xml.so.5.5 -> libQt5Xml.so.5.5.1*
└── libQt5Xml.so.5.5.1*

0 directories, 72 files

packettracerコマンドのソースである tpl.packettracerを見ると LD_LIBRARY_PATHでインストール先の libディレクトリを参照するになっている。

#!/bin/bashecho Starting Packet Tracer 7.1.1PTDIR=III
export LD_LIBRARY_PATH=$PTDIR/lib
pushd$PTDIR/bin > /dev/null
./PacketTracer7 "$@"> /dev/null 2>&1popd> /dev/null

どのライブラリが足りないのかを lddを使って確認する。

Ubuntu 16.04〉

libicuuc.so.52は libicu52 に含まれるのでこれは libicu52 のパッケージを入れれば解決できる。

linus@ubuntu1604:~/Applications/pt-7.1.1$ LD_LIBRARY_PATH=lib ldd bin/PacketTracer7 | grep "not found" | sort | uniq
        libicui18n.so.52 => not found
        libicuuc.so.52 => not found

Ubuntu 18.04〉

Ubuntu 18.04 の場合は libicu52 に加え、libpng12 が不足している。

linus@ubuntu1804:~/Applications/pt-7.1.1$ LD_LIBRARY_PATH=lib ldd bin/PacketTracer7 | grep "not found" | sort | uniq
        libicui18n.so.52 => not found
        libicuuc.so.52 => not found
        libpng12.so.0 => not found

Debian 9〉

Debian 9 の場合は更に libcrypto.so.1.0.0が不足しているが、これは libssl-1.0.0 に含まれる。

linus@debian9:~/Applications/pt-7.1.1$ LD_LIBRARY_PATH=lib ldd bin/PacketTracer7  | grep "not found" | sort | uniq
        libcrypto.so.1.0.0 => not found
        libicui18n.so.52 => not found
        libicuuc.so.52 => not found
        libpng12.so.0 => not found

依存関係のパッケージの入手

いずれのディストリビューションも libicu52 を必要とするが、APT でインストールできるのは libicu55 や libicu57 以降になっている。

linus@ubuntu1604:~/Applications/pt-7.1.1$ apt-cache search libicu
icu-devtools - Development utilities for International Components for Unicode
libicu-dev - Development files for International Components for Unicode
libicu55 - International Components for Unicode
libicu55-dbg - International Components for Unicode
libicu4j-4.4-java - Library for Unicode support and internationalization
libicu4j-49-java - Library for Unicode support and internationalization
libicu4j-java - Library for Unicode support and internationalization

そこで、http://ftp.jaist.ac.jpあたりから対象パッケージの DEBファイルをダウンロードしてくる。

Ubuntu

※以降、Ubuntu 16.04 の場合は libpng12 は最初からインストールされているので読み飛ばしてかまわない。

wget http://ftp.jaist.ac.jp/pub/Linux/ubuntu/pool/main/i/icu/libicu52_52.1-3ubuntu0.8_amd64.deb
wget http://ftp.jaist.ac.jp/pub/Linux/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb

Debian

Debian 9 の場合は libssl-1.0.0 もダウンロードする。

wget http://ftp.jaist.ac.jp/pub/Linux/debian/pool/main/i/icu/libicu52_52.1-8+deb8u7_amd64.deb
wget http://ftp.jaist.ac.jp/pub/Linux/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_amd64.deb
wget http://ftp.jaist.ac.jp/pub/Linux/debian/pool/main/o/openssl/libssl1.0.0_1.0.2l-1~bpo8+1_amd64.deb

依存関係のインストール

Ubuntu

libicu52、libpng12 は現行バージョンと名前が異なるため衝突しないと思われるので dpkgコマンドでインストールする。詳細な検証はしていないのでパッケージをインストールしたくない場合は下の手動配置方法を参照。

sudo dpkg -i libicu52_52.1-3ubuntu0.8_amd64.deb
sudo dpkg -i libpng12-0_1.2.54-1ubuntu1_amd64.deb

Debian

dpkg -i libicu52_52.1-8+deb8u7_amd64.deb
dpkg -i libpng12-0_1.2.50-2+deb8u3_amd64.deb 
dpkg -i libssl1.0.0_1.0.2l-1~bpo8+1_amd64.deb

これで Packet Tracer 7.1.1 が起動できるようになる。

【番外編】 Packet Tracer とライブラリを手動で配置する方法

パッケージをインストールをしたくない場合は DEBファイルからライブラリだけを取り出せばよい。DEBパッケージの中にある data.tar.xzを取り出して中を見てみる。libicu52 の場合、必要になるのは ./usr/lib/x86_64-linux-gnu以下にあるものだけ。

linus@ubuntu1804:~/Applications/pt-7.1.1$ ar p libicu52_52.1-3ubuntu0.8_amd64.deb data.tar.xz | xz -dc | tar tvf -  | sort -k6
drwxr-xr-x root/root         0 2018-03-28 01:08 ./
drwxr-xr-x root/root         0 2018-03-28 01:08 ./usr/
drwxr-xr-x root/root         0 2018-03-28 01:08 ./usr/lib/
drwxr-xr-x root/root         0 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/
lrwxrwxrwx root/root         0 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicudata.so.52 -> libicudata.so.52.1
-rw-r--r-- root/root  23512848 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicudata.so.52.1
lrwxrwxrwx root/root         0 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicui18n.so.52 -> libicui18n.so.52.1
-rw-r--r-- root/root   2121040 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicui18n.so.52.1
lrwxrwxrwx root/root         0 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicuio.so.52 -> libicuio.so.52.1
-rw-r--r-- root/root     55304 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicuio.so.52.1
lrwxrwxrwx root/root         0 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicule.so.52 -> libicule.so.52.1
-rw-r--r-- root/root    358408 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicule.so.52.1
lrwxrwxrwx root/root         0 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libiculx.so.52 -> libiculx.so.52.1
-rw-r--r-- root/root     47112 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libiculx.so.52.1
lrwxrwxrwx root/root         0 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicutest.so.52 -> libicutest.so.52.1
-rw-r--r-- root/root     64864 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicutest.so.52.1
lrwxrwxrwx root/root         0 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicutu.so.52 -> libicutu.so.52.1
-rw-r--r-- root/root    195344 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicutu.so.52.1
lrwxrwxrwx root/root         0 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicuuc.so.52 -> libicuuc.so.52.1
-rw-r--r-- root/root   1525776 2018-03-28 01:08 ./usr/lib/x86_64-linux-gnu/libicuuc.so.52.1
drwxr-xr-x root/root         0 2018-03-28 01:08 ./usr/share/
drwxr-xr-x root/root         0 2018-03-28 01:08 ./usr/share/doc/
drwxr-xr-x root/root         0 2018-03-28 01:08 ./usr/share/doc/libicu52/
-rw-r--r-- root/root       317 2013-12-25 01:45 ./usr/share/doc/libicu52/NEWS.Debian.gz
-rw-r--r-- root/root      1807 2018-03-28 01:08 ./usr/share/doc/libicu52/changelog.Debian.gz
-rw-r--r-- root/root      7016 2013-12-25 01:45 ./usr/share/doc/libicu52/copyright
drwxr-xr-x root/root         0 2018-03-28 01:08 ./usr/share/lintian/
drwxr-xr-x root/root         0 2018-03-28 01:08 ./usr/share/lintian/overrides/
-rw-r--r-- root/root       176 2013-12-25 01:45 ./usr/share/lintian/overrides/libicu52

DEBファイルからライブラリだけを取り出すが、その際、--strip-components=2オプションで2階層ほど削って展開することで余計なファイル移動を省略する。--strip-components=3で、もう一段階削って lib直下に libicu52 のライブラリを展開するようにしてもいいが、なんとなく分けたかったので lib/x86_64-linux-gnu以下に展開するようにする。(paxコマンドがあればそちらでパスを変換して取り出すのもあり)

ar p libicu52_52.1-3ubuntu0.8_amd64.deb data.tar.xz | xz -dc | tar xf - --wildcards'*/lib/x86_64-linux-gnu/*'--strip-components=2

これで libの直下に x86_64-linux-gnuディレクトリが作成され、libicu52 のライブラリが展開される。

linus@ubuntu1804:~/Applications/pt-7.1.1$ tree -F lib
lib
├── libQt5Core.so -> libQt5Core.so.5.5.1*
├── libQt5Core.so.5 -> libQt5Core.so.5.5.1*
├── libQt5Core.so.5.5 -> libQt5Core.so.5.5.1*
├── libQt5Core.so.5.5.1*
:
中略
:
└── x86_64-linux-gnu/
    ├── libicudata.so.52 -> libicudata.so.52.1
    ├── libicudata.so.52.1
    ├── libicui18n.so.52 -> libicui18n.so.52.1
    ├── libicui18n.so.52.1
    ├── libicuio.so.52 -> libicuio.so.52.1
    ├── libicuio.so.52.1
    ├── libicule.so.52 -> libicule.so.52.1
    ├── libicule.so.52.1
    ├── libiculx.so.52 -> libiculx.so.52.1
    ├── libiculx.so.52.1
    ├── libicutest.so.52 -> libicutest.so.52.1
    ├── libicutest.so.52.1
    ├── libicutu.so.52 -> libicutu.so.52.1
    ├── libicutu.so.52.1
    ├── libicuuc.so.52 -> libicuuc.so.52.1
    └── libicuuc.so.52.1

1 directory, 88 files

libpng12 もライブラリだけを取り出すことができるが、こちらは /usr/lib/x86_64-linux-gnuにあるのはシンボリックリンクで、実体は ./lib/x86_64-linux-gnu/libpng12.so.0になっている。

linus@ubuntu1804:~/Applications/pt-7.1.1$ ar p libpng12-0_1.2.54-1ubuntu1_amd64.deb data.tar.xz | xz -dc | tar tvf - --wildcards '*/x86_64-linux-gnu/*' | sort -k6
lrwxrwxrwx root/root         0 2016-01-07 03:08 ./lib/x86_64-linux-gnu/libpng12.so.0 -> libpng12.so.0.54.0
-rw-r--r-- root/root    149904 2016-01-07 03:08 ./lib/x86_64-linux-gnu/libpng12.so.0.54.0
lrwxrwxrwx root/root         0 2016-01-07 03:08 ./usr/lib/x86_64-linux-gnu/libpng12.so.0 -> /lib/x86_64-linux-gnu/libpng12.so.0

シンボリックリンクの方は展開しても意味が無いので ./lib/x86_64-linux-gnuだけを展開する。これはそのまま展開すれば相対パスでちょうどよく lib/x86_64-linux-gnuに配置される。

ar p libpng12-0_1.2.54-1ubuntu1_amd64.deb data.tar.xz | xz -dc | tar xf - --wildcards'./lib/x86_64-linux-gnu/*'
linus@ubuntu1804:~/Applications/pt-7.1.1$ tree -F lib
lib
:
中略
:
└── x86_64-linux-gnu/
    :
    中略
    :
    ├── libpng12.so.0 -> libpng12.so.0.54.0
    └── libpng12.so.0.54.0

1 directory, 90 files

Debian 9 の場合は arコマンドが無いので busybox arを使う。

busybox ar p libicu52_52.1-8+deb8u7_amd64.deb data.tar.xz      | xz -dc | tar xf - --wildcards'*/lib/x86_64-linux-gnu/*'--strip-components=2
busybox ar p libpng12-0_1.2.50-2+deb8u3_amd64.deb data.tar.xz  | xz -dc | tar xf - --wildcards'./lib/x86_64-linux-gnu/*'
busybox ar p libssl1.0.0_1.0.2l-1~bpo8+1_amd64.deb data.tar.xz | xz -dc | tar xf - --wildcards'*/libcrypto.so.1.0.0'--strip-components=2

ライブラリだけを取り出しても通常のインストールとは異なるため packettracerコマンドを自作する。これはルートディレクトリにある tpl.packettracerを参考に変更すればよい。

〈packettracer〉

libicu52 や libpng12 のライブラリを lib/x86_64-linux-gnuの下に配置したので、LD_LIBRARY_PATHx86_64-gnu-linuxディレクトリを追加する必要がある。tpl.packettracerでは pushdpopd相対パスで実行するようになっていたが、気に入らなかったのでフルパス呼び出しに変更した。

PT7HOME環境変数QT_DEVICE_PIXEL_RATIO環境変数installスクリプトを使用したときに、同ディレクトリにある set_qtenv.shset_ptenv.shによって必要に応じて /etc/profileに書き出されるもの。これも一応追加しておく。

#!/bin/bashPTDIR=$(cd"$(dirname "$0")"&& pwd)export LD_LIBRARY_PATH=$PTDIR/lib/x86_64-linux-gnu:$PTDIR/lib
export PT7HOME=$PTDIRexport QT_DEVICE_PIXEL_RATIO=auto
exec"$PTDIR"/bin/PacketTracer7 "$@">/dev/null 2>&1

このスクリプトpackettracerという名前で実行権限を付与して実行すれば Packet Tracer が起動する。

chmod+x packettracer
./packettracer

続いて、デスクトップエントリも自分で配置する。

cp bin/Cisco-PacketTracer.desktop ~/.local/share/applications

packettracer/usr/local/binに配置していないので適切なパスに変更する。また、インストール先を /opt/ptから変更しているのでアイコンのパスも変更しておく。

〈~/.local/share/applications/Cisco-PacketTracer.desktop〉

[Desktop Entry]Encoding=UTF-8
Type=Application#Exec=packettracer %FExec=/home/linus/Applications/pt-7.1.1/packettracer %F#Icon=/opt/pt/art/app.pngIcon=/home/linus/Applications/pt-7.1.1/art/app.png

Name=Cisco Packet Tracer
Categories=Application;Network;

MimeType=application/x-pkt;application/x-pka;application/x-pkz;

デスクトップファイルのデータベースを更新する。

update-desktop-database ~/.local/share/applications

これでアプリケーションメニューに「Cisco Packet Tracer」が表示されるようになる。

f:id:mattintosh4:20180527001525p:plain


任意のパッケージだけ APT に追加できたような気がするけど忘れた。

VirtualBoxでゲストの Ubuntuに Packet Tracer をインストールして X11転送でホスト側に持ってきてみたけどまぁまぁ動くのでアプリケーションサーバとして稼働させておけば複数台にインストールする手間が省けるかも。

f:id:mattintosh4:20180527012646p:plain

Cisco Packet Tracer 用 Docker コンテナを作る

$
0
0

タイトルの通り。Cisco Packet Tracer が Ubuntu 14.04 向けなら Ubuntu 14.04 で環境を作ればいいじゃない!」というノリ。

「ん?X11転送以外で Docker コンテナから GUIウィンドウってホストに持ってこれるのか?」と思ったけど -v /tmp/.X11-unix/X0:/tmp/.X11-unix/X0でソケット共有したら普通に使えた。

-v $HOME/pt:/home/cisco/ptとかでホストのディレクトリをマウントしておかないとファイルを作成してもコンテナから取り出せなくなる。

git clone https://gist.github.com/4a18b03d22d1206e55bdfcc73ebc7172.git docker-packettracer
cd docker-packettracer
cp ~/Downloads/Packet\ Tracer\ 7.1.1\ for\ Linux\ 64\ bit.tar.gz .
docker build -t packettracer .
docker run -v /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 -v$HOME/pt:/home/cisco/pt --name packettracer packettracer

一度コンテナを作ったあとは docker startだけでよい。

docker start packettracer

Ubuntu で Atom や Haroopad のフォントが汚い

$
0
0

Haroopad。なかなか良いアプリなんだけど Ubuntu 18.04 で使っているとなぜだかレンダリングがおかしい。うちは KDEだし仕方ないのかなぁ〜なんて思ってて、Atomを使う用事があったので起動したらこいつも汚い。freetypeか pango あたりかな、なんて調べたら同じ症状の人発見。

github.com

どうも libefreetype6 の 2.8.1 がダメっぽい。Atomの方は Atom自体をアップグレードしたら正常になったが、Haroopad は最新版でもダメ。

なので libfreetype6 を 2.8.0 にダウングレードしてバージョン固定。

wget http://ftp.jaist.ac.jp/pub/Linux/ubuntu/pool/main/f/freetype/libfreetype6_2.8-0.2ubuntu2_amd64.deb
wget http://ftp.jaist.ac.jp/pub/Linux/ubuntu/pool/main/f/freetype/libfreetype6_2.8-0.2ubuntu2_i386.deb
sudo dpkg -i libfreetype6_2.8-0.2ubuntu2_amd64.deb
sudo dpkg -i libfreetype6_2.8-0.2ubuntu2_i386.deb
sudo apt-mark hold libfreetype6

Begin: Running /scripts/local-premount で Ubuntu の起動が遅い

$
0
0

昨日ぐらいから Ubuntuを起動するときにやたら時間がかかるようになった。nosplash で起動しているので画面にログは出ているのだけど Begin: Running /scripts/local-premountのあたりで止まっている様子。

/scripts/local-premountと言えば /etc/initramfs-tools/scripts/local-premountなんだろうけど、新しくファイルが作成されているわけでもないしディレクトリ自体も変化はない。

調べてみたら同じ症状の人がいた。

askubuntu.com

/etc/initramfs-tools/conf.d/resumeはなかったので新しく作成してとりあえず下記のコードを書き込む。

RESUME=none

んで initramfs を更新。

sudo update-initramfs -u

再起動してみたら直った。直近で持ち運びのためにスリープとかしてたのが問題だったのだろうか?

復帰用のスワップ領域の UUID を書いておくものっぽいけどとりあえず noneで様子見しておくか。

このエラーを詳しくみようと dmesgとか journalctlとかで探してみたんだけど見つからなかった。どこに記録されてるんだ???

Environments

NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

Wine 3.13 版 EasyWine.app リリースしました

$
0
0

タイトルの通りです。今回は諸事情により WineSkin 版と MikuInstaller-Kai-Kit 版はありません。

matome.naver.jp

Google URL Shortenerが終了してたので久しぶりに bit.ly 使いました。インターフェイスが色々変わっていてびっくり。

今年は「夏コミ前に 64-bit 版出すぞ!」とか言いながら忙しくて Macと向き合う予定がありませんでした。最近ようやく少し落ち着いてきたので年内には 64-bit 版作りたいなぁと思っています。今年の夏コミカタ ROM は Ubuntuで見てたんですがなんか重いんですよね。自分でビルドした Wine 使おうかしら。

最近転職して以前よりかは自由な時間が増えた(気がする)のでまた新しく何か始めてみようかと思ってます。んで、自分も技術書典かコミケに出展してみたいなぁと思ったのですがネタがなく…絵心もなく、技術的なことなら世の中にもっとすごい人いるしなぁ…という感じ。Wine 関係の折本でも出せば誰か一人くらいは買いに来てくれるだろうか。

今年の夏コミは暑かったですね。自分は1日目と3日目一般参加でしたが雨も降らなくてよかったです。参加された皆様お疲れさまでした。

ではでは。

Elasticsearch と Kibana で遊んでみたよ

$
0
0

エンジニアで記事を書くと言えば Qiita でしょうか。先日、数年ぶりに記事を投稿してみましたがやっぱりなんか書きづらいなぁと。というかいつからあそこは自分の年収を書く場所になったのやら。

そんな話は置いておき、7月に転職しました。会社に所属はしてますが、いまのところはフリーランスっぽい感じで仕事してます。昨日、家の書類の片付けをしていたら前の会社の給料明細が出てきたのでちまちまと開封していたんですが(いつも郵便で来て開封してなかった)、最後の方は有休消化のみだったせいか、最終的な支給額は17万弱でした(おいおい高卒かよ)。都内の会社でも賃金の安いところはこんなもんなんですかね。転職の理由は色々ありますが、「いまの会社にいると人生無駄にするなぁ〜」と思ったのが一番ですかね。エンジニアとしての技術が全然詰めない。プライベートの方がよほど勉強になっていました。

いまの会社に入ってから AWSを色々と自由に触れるようになったので仕事で使ったり遊びで使ったりしているんですが、前々から使いたいと思っていた Elasticsearch Service をちょっと真面目に使うようになりました。

Elasticsearch や Kibana は Docker を使っても構築できるんですが、パブリックな環境に一台常駐して置いておかないとデータ収集が面倒です。Elasticsearch Service はボタンぽちぽちでアクセス制限とかの設定するばすぐ使えて優れものですね。本格的な請求はまだ来てませんが EC2 インスタンス 1台分で 1,000 〜 2,000 円くらいじゃないかな。(全然違ったらごめんなさい)

さて、いままで IoT デバイスの温度くらいしか収集していなかった Elasticsearch Service ですが、お仕事で Google Playストアの仕様を調べる機会がありまして、進めていくうちに「これ Elasticsearch に入れた面白そう」と思ったので色々とデータを突っ込んでみることにしました。

先に言ってくと、Google Playストア全体ではなく、アプリに限定した話です。

私は iPhoneユーザなので Androidは旧式のタブレットくらいしか持ってなくてほとんど利用してないのであまり市場の状況というのがわからず。

アプリページを見るとこんな感じですね。このページの随所に分析用として使えるデータが点在しています。それをクローリングしていく感じです。クローラーは自作でもいいですし、Pythonとかで google-pley-scraper みたいなものもあるのでそちらを利用するのもありでしょう。今回、私は自分でクローラーを作成しました。

f:id:mattintosh4:20181008220307p:plain

アプリページ以外にもランキングや特集コーナーがあります。こちらもランキングでは順位が付いてたりします。マーケティング関係のお仕事をされている方であればこういう情報も必要でしょうね。(下の画像は事前登録系なので順位は特に無いと思います)

f:id:mattintosh4:20181008220459p:plain

クローラーを作成したらあとは Elasticsearch に合わせた JSONを投げるだけでどんどん登録してくれます。たまに型を間違ったりするのでその場合は事前に定義を作成したり、Kibana 側で調整します。ただ、DATA 型は 最初から書式を合わせておいた方が無難ですね。

f:id:mattintosh4:20181008215724p:plain

本当はもう少し細かく拾う情報を拾う予定でしたが、とりあえず Elasticsearch と Kibana を使ってみたかったので項目を少し省きました。

{"_index": "play",
  "_type": "apps",
  "_id": "",
  "_version": 1,
  "_score": null,
  "_source": {"genreId": "GAME_ACTION",
    "developerAddress": "東京都千代田区神田須田町2-8-2 プライム神田ビル 9階",
    "icon": "https://lh3.googleusercontent.com/aeULuMyhf0kzv-i-ICR1YV1m1zwdCjM7w9-6v49NwyO5s_sa-26Y_gUy72I6DflfLcQ",
    "description": "これが君の望んでいる「海戦-ロマン-」<br><br>・擬人化艦船 少女×シューティングRPG! <br>世界中の艦船を可愛い少女に擬人化した艦船を操作するシューティングRPGの登場! <br>個性豊かなキャラクターが織り成す『アズールレーン』の世界、いざ抜錨せよ!<br><br>・簡単操作で爽快感のあるシューティングゲーム! <br>『アズールレーン』最大の特徴はシューティングゲーム <br>・最大で6隻からなる艦隊を編成し、敵の砲火を縦横無尽に潜り抜け、敵を倒そう! <br>・敵の弾には当たっても大丈夫!自動操作もあり、アクションが苦手な人でも楽しめる!<br><br>・あなただけの艦隊を作り上げよう! <br>日本の艦船も含め、世界中の有名な、時にはマニアックな艦船が登場! <br>・100種以上の艦船と可愛く綺麗なキャラクター達が特徴! <br>・好感度システム搭載、お気に入りのキャラクターを自由に強化し、あなただけの娘に!<br><br><br>公式ツイッター <br>@azurlane_staff",
    "3-starts": 1137,
    "4-starts": 3426,
    "developerEmail": "cs@azurlane.net",
    "title": "アズールレーン",
    "2-starts": 632,
    "5-starts": 14225,
    "developerWebSite": "http://www.azurlane.jp",
    "crawledTime": "2018-10-08T21:49:48+0900",
    "score": 4.3141346,
    "developerId": "/store/apps/developer?id=Yostar,+Inc.",
    "reviews": 8362,
    "ratings": 21147,
    "price": 0,
    "genre": "アクション",
    "familyGenre": null,
    "currency": "USD",
    "inAppItem": null,
    "offeredBy": "Yostar, Inc.",
    "released": "2017/09/13",
    "summary": "新感覚美少女戦艦シューティングRPG",
    "1-star": 1727,
    "contentRatingDescription": "ヌード",
    "requiresAndroid": "4.3 以上",
    "privacyPolicy": "http://www.azurlane.jp/private.html",
    "version": "1.5.2",
    "installs": 1000000,
    "familyGenreId": "GAME_ACTION",
    "size": "52M",
    "contentRating": "16 歳以上",
    "developer": "Yostar, Inc.",
    "updated": 1536891354},
  "fields": {"crawledTime": ["2018-10-08T12:49:48.000Z"
    ],
    "released": ["2017-09-13T00:00:00.000Z"
    ]},
  "highlight": {"title": ["@kibana-highlighted-field@アズールレーン@/kibana-highlighted-field@"
    ]},
  "sort": [1539002988000]}

んでワクワクするのが Kibana のヴィジュアライザやダッシュボードですね。3日ほど回してみてるところですが、ジャンル指定無しのランキング情報を拾ってみるだけでも結構面白いです。クローラを稼働させているサーバのリソースなんかも同じダッシュボードで監視できるようにしています。

f:id:mattintosh4:20181008213651p:plain

まずはランキングに登場するアプリのインストール数別の割合です。Google Playストアのランキングには多いところで最大 600 位まで表示されるようになっていますが、100 万ダウンロード以下だけで約8割を占めます。FacebookTwitterなんかの有名アプリはほんの一部なんですね。

f:id:mattintosh4:20181008225327p:plain

こちらはリリース時期が新し目のアプリの評価推移です(色設定するの忘れた)。9月末に配信された Nintendo のドラガリアロストが順調に評価を獲得していますね。「アトリエ オンライン ~ブレセイルの錬金術士~」や「カスタムキャスト」なんかも順調(たまに評価数が減る現象はよくわからない)。ワイルドアームズはいまいち伸び悩んでいるようです。

f:id:mattintosh4:20181008221836p:plain

そしてこちらはトップセールスランキングのアプリです。1位は「LINE:ディズニー ツムツム」で、その次にモンスト、パズドラと続きます。意外にも FGOは評価数が少なく、単純にリセマラやらなんやらでダウンロード数だけ増えてるって感じなんでしょうかね。グラブルは低評価が少ないのでサービス的には悪くないって感じなんでしょうか。

f:id:mattintosh4:20181008221938p:plain

自分の中ではモンストって結構人気アプリだと思ってたんですが、ストア全体で見た時に実際どうなのか?範囲をゲームだけに絞って評価数をタイトルごとに並べてみます。そしたら「クラッシュ・オブ・クラン (Clash of Clans)」がダントツの1位。モンストはなんと80位でした。

f:id:mattintosh4:20181008222950p:plain

実際には「評価数が多い=売上が高い」というわけではありませんがある程度の指標にはなるかなぁと。

次に企業にいってみましょう。

こちらはランキングに掲載されているアプリが多い企業の割合です(ゲームカテゴリだけで絞っていません)。どれだけランキング入りする人気アプリを多く配布しているかですね。こちらは「BANDAI NAMCO Entertainment Inc.」と「SQUARE ENIX Co.,Ltd.」が1、2位をいったりきたりという感じです。

f:id:mattintosh4:20181008223655p:plain

Google Playストアはどんなジャンルが人気なの?」っていうのはこちらのグラフです。ロールプレイングが人気で、パズルやアクションなどはだいたい同じくらいですね。

f:id:mattintosh4:20181008224307p:plain

ではジャンルごとにディベロッパーの割合を出してみましょう。Kibana の Split chart を使うとこんなのも簡単に出来ます。ロールプレイングはスクエニ、パズルはやや LINE が優勢、アクションはバンナムの一強。ディベロッパーごとの得意としている分野がわかりますね。

f:id:mattintosh4:20181008224504p:plain

最後にこちらは試験中ですが、時間ごとのジャンルの推移です。曜日や時間帯で人気ジャンルって変わってくるのかな?と思って収集してみているところです。

f:id:mattintosh4:20181008224909p:plain


Elasticsearch の何がすごいってこれだけ色々グラフとか作って表示設定とか変えてるのに反応がすぐ返ってくるところ。ヒートマップの色を変更するとたまにバグって全部黒くなることがあったりしますが概ね良好です。6 系でいくつか仕様が変わったようでネット上の情報が古くなっていることもありましたが、ネットで調べた範囲の情報でこれくらい遊べました。

私はスマホ用アプリは製作しないので Google Playストアや iTunesストアの情報はあまり興味がなく、今後もストア情報を収集し続ける予定はないのですが、今後の仕事の次第ではもうちょっとクローラーを改良してみたりしようかと思っています。

ストア情報とは別に Yahoo や Googleトレンドワードを拾ってタグクラウドにしてるんですが、こっちは結構面白いです。Twitterは Developer 登録をしないと使えないようなので申請しているところですがどれくらいかかるのやら。

f:id:mattintosh4:20181009002840p:plain

次に遊ぶとしたら TwitterAPIですかね。今年から来年にかけて Elasticsearch をもうちょっと覚えていきたいなと思ってます。

ではまた。

久しぶりに HDD を買った

$
0
0

ネットワークストレージの空き領域が無くなったのでいい加減買い足し。地雷と言われてる ST4000DM004 にした。Western Digitalはあまり好きじゃないし、昔ほど HDD の性能に拘りは無い。

いまはネットワークインターフェイスの関係で Raspberry Pi 3 から NanoPi NEO2 に移設している ST3000DM001 の 情報を久しぶりに見てみる。この製品は LaCieの LCH-MNR030U3 だった気がする。

$ sudo smartctl -d sat --all /dev/sdc
smartctl 6.5 2016-01-24 r4214 [aarch64-linux-4.14.0] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 7200.14 (AF)
Device Model:     ST3000DM001-1CH166
Serial Number:    
LU WWN Device Id: 5 000c50 072d3946e
Firmware Version: CC47
User Capacity:    3,000,592,982,016 bytes [3.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Form Factor:      3.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2, ACS-3 T13/2161-D revision 3b
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Wed Oct 24 23:00:25 2018 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
See vendor-specific Attribute list for marginal Attributes.

General SMART Values:
Offline data collection status:  (0x82) Offline data collection activity
                    was completed without error.
                    Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
                    without error or no self-test has ever 
                    been run.
Total time to complete Offline 
data collection:        (  575) seconds.
Offline data collection
capabilities:            (0x7b) SMART execute Offline immediate.
                    Auto Offline data collection on/off support.
                    Suspend Offline collection upon new
                    command.
                    Offline surface scan supported.
                    Self-test supported.
                    Conveyance Self-test supported.
                    Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                    power-saving mode.
                    Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                    General Purpose Logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    ( 317) minutes.
Conveyance self-test routine
recommended polling time:    (   2) minutes.
SCT capabilities:          (0x3085) SCT Status supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   115   099   006    Pre-fail  Always       -       93865696
  3 Spin_Up_Time            0x0003   095   092   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       341
  5 Reallocated_Sector_Ct   0x0033   099   099   010    Pre-fail  Always       -       1384
  7 Seek_Error_Rate         0x000f   072   060   030    Pre-fail  Always       -       17171518
  9 Power_On_Hours          0x0032   063   063   000    Old_age   Always       -       32806
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       316
183 Runtime_Bad_Block       0x0032   099   099   000    Old_age   Always       -       1
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   099   000    Old_age   Always       -       3 3 3
189 High_Fly_Writes         0x003a   098   098   000    Old_age   Always       -       2
190 Airflow_Temperature_Cel 0x0022   059   044   045    Old_age   Always   In_the_past 41 (Min/Max 26/46 #11)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       298
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       344
194 Temperature_Celsius     0x0022   041   056   000    Old_age   Always       -       41 (0 10 0 0 0)
197 Current_Pending_Sector  0x0012   081   081   000    Old_age   Always       -       3128
198 Offline_Uncorrectable   0x0010   081   081   000    Old_age   Offline      -       3128
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       32804h+35m+07.860s
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       9655026104
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       6272904990

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

おや…不良セクタが。

んで ST4000DM004 の S.M.A.R.T 結果。

$ sudo smartctl -d sat --all /dev/sda
smartctl 6.5 2016-01-24 r4214 [aarch64-linux-4.14.0] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     ST4000DM004-2CV104
Serial Number:    
LU WWN Device Id: 5 000c50 0bae57ca7
Firmware Version: 0001
User Capacity:    4,000,787,030,016 bytes [4.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5425 rpm
Form Factor:      3.5 inches
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   ACS-3 T13/2161-D revision 5
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Wed Oct 24 23:16:50 2018 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART Status not supported: Incomplete response, ATA output registers missing
SMART overall-health self-assessment test result: PASSED
Warning: This result is based on an Attribute check.

General SMART Values:
Offline data collection status:  (0x00) Offline data collection activity
                    was never started.
                    Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
                    without error or no self-test has ever 
                    been run.
Total time to complete Offline 
data collection:        (    0) seconds.
Offline data collection
capabilities:            (0x73) SMART execute Offline immediate.
                    Auto Offline data collection on/off support.
                    Suspend Offline collection upon new
                    command.
                    No Offline surface scan supported.
                    Self-test supported.
                    Conveyance Self-test supported.
                    Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                    power-saving mode.
                    Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                    General Purpose Logging supported.
Short self-test routine 
recommended polling time:    (   1) minutes.
Extended self-test routine
recommended polling time:    ( 488) minutes.
Conveyance self-test routine
recommended polling time:    (   2) minutes.
SCT capabilities:          (0x30a5) SCT Status supported.
                    SCT Data Table supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   082   065   006    Pre-fail  Always       -       155888737
  3 Spin_Up_Time            0x0003   096   096   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       10
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   064   060   045    Pre-fail  Always       -       2374933
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       74 (114 172 0)
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       2
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   062   060   040    Old_age   Always       -       38 (Min/Max 25/40)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       2
193 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       18
194 Temperature_Celsius     0x0022   038   040   000    Old_age   Always       -       38 (0 25 0 0 0)
195 Hardware_ECC_Recovered  0x001a   082   065   000    Old_age   Always       -       155888737
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0
240 Head_Flying_Hours       0x0000   100   253   000    Old_age   Offline      -       42 (161 240 0)
241 Total_LBAs_Written      0x0000   100   253   000    Old_age   Offline      -       2713040728
242 Total_LBAs_Read         0x0000   100   253   000    Old_age   Offline      -       9811923

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

大容量 HDD は 1 TB 単位で使うことにしているので MBRでもいいんだけど一応 GPT。あと、サイズは 1 TiB ではなく 1TB にすることにしてる。

$ sudo gdisk -l /dev/sda
GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 7814037168 sectors, 3.6 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): 720AE297-8557-4BAD-85E0-9514702E8D91
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 7814037134
Partitions will be aligned on 2048-sector boundaries
Total free space is 1537101 sectors (750.5 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048      1953127047   931.3 GiB   8300  Linux filesystem
   2      1953128448      3906253447   931.3 GiB   8300  Linux filesystem
   3      3906254848      5859379847   931.3 GiB   8300  Linux filesystem
   4      5859381248      7812506247   931.3 GiB   8300  Linux filesystem

いつもの癖でそのまま mkfs.ext4したらなんか stripe=8191とか付いてるから tune2fsで見てみる。

$ mount -t ext4
/dev/mmcblk0p2 on / type ext4 (rw,relatime,data=ordered)
/dev/sdb1 on /media/HDCL-UT1 type ext4 (rw,noatime,data=ordered)
/dev/sdc1 on /media/ST3000DM001-1 type ext4 (rw,noatime,data=ordered)
/dev/sdc2 on /media/ST3000DM001-2 type ext4 (rw,noatime,data=ordered)
/dev/sdc3 on /media/ST3000DM001-3 type ext4 (rw,noatime,data=ordered)
/dev/sda1 on /media/ST4000DM004-1 type ext4 (rw,noatime,stripe=8191,data=ordered)
/dev/sda2 on /media/ST4000DM004-2 type ext4 (rw,noatime,stripe=8191,data=ordered)

なんで RAID stripe width付くの…。

$ tune2fs -l /dev/sda1
tune2fs 1.42.13 (17-May-2015)
Filesystem volume name:   ST4000DM004-1
Last mounted on:          /media/ST4000DM004-1
Filesystem UUID:          763e8fa3-1bf1-448f-b3c6-4915e144c2b2
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              61038592
Block count:              244140625
Reserved block count:     12207031
Free blocks:              162198379
Free inodes:              60786672
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      1024
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
RAID stripe width:        8191
Flex block group size:    16
Filesystem created:       Sun Oct 21 21:27:39 2018
Last mount time:          Fri Feb 12 01:28:03 2016
Last write time:          Fri Feb 12 01:28:03 2016
Mount count:              3
Maximum mount count:      -1
Last checked:             Sun Oct 21 21:27:39 2018
Check interval:           0 (<none>)
Lifetime writes:          313 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     32
Desired extra isize:      32
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      fff5cb63-86e3-4e0b-996e-78a6c3c4fbdf
Journal backup:           inode blocks
Checksum:                 0xffeec98a

多分 Raspberry Pi(Arch Linuxだったか?)でフォーマットしたものと NanoPi NEO2(Ubuntu)でフォーマットしたものの差分。Filesystem feature に 64bitが入ってるなぁ。

$ diff -u <(tune2fs -l /dev/sdc1) <(tune2fs -l /dev/sda1)
--- /dev/fd/63    2018-10-24 23:47:34.016343443 +0900+++ /dev/fd/62    2018-10-24 23:47:34.020343277 +0900@@ -1,10 +1,10 @@
 tune2fs 1.42.13 (17-May-2015)
-Filesystem volume name:   ST3000DM001-1-Last mounted on:          /media/ST3000DM001-1-Filesystem UUID:          c1b88656-446a-4083-9c22-69f49146cf91+Filesystem volume name:   ST4000DM004-1+Last mounted on:          /media/ST4000DM004-1+Filesystem UUID:          763e8fa3-1bf1-448f-b3c6-4915e144c2b2
 Filesystem magic number:  0xEF53
 Filesystem revision #:    1 (dynamic)
-Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize+Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
 Filesystem flags:         signed_directory_hash 
 Default mount options:    user_xattr acl
 Filesystem state:         clean
@@ -13,32 +13,35 @@
 Inode count:              61038592
 Block count:              244140625
 Reserved block count:     12207031
-Free blocks:              12663554-Free inodes:              60732730+Free blocks:              162198379+Free inodes:              60786672
 First block:              0
 Block size:               4096
 Fragment size:            4096
-Reserved GDT blocks:      965+Group descriptor size:    64+Reserved GDT blocks:      1024
 Blocks per group:         32768
 Fragments per group:      32768
 Inodes per group:         8192
 Inode blocks per group:   512
+RAID stripe width:        8191
 Flex block group size:    16
-Filesystem created:       Mon Jan 12 22:02:10 2015-Last mount time:          Fri Feb 12 01:28:02 2016-Last write time:          Fri Feb 12 01:28:02 2016-Mount count:              76+Filesystem created:       Sun Oct 21 21:27:39 2018+Last mount time:          Fri Feb 12 01:28:03 2016+Last write time:          Fri Feb 12 01:28:03 2016+Mount count:              3
 Maximum mount count:      -1
-Last checked:             Mon Feb 22 23:42:01 2016+Last checked:             Sun Oct 21 21:27:39 2018
 Check interval:           0 (<none>)
-Lifetime writes:          2027 GB+Lifetime writes:          313 GB
 Reserved blocks uid:      0 (user root)
 Reserved blocks gid:      0 (group root)
 First inode:              11
 Inode size:              256
-Required extra isize:     28-Desired extra isize:      28+Required extra isize:     32+Desired extra isize:      32
 Journal inode:            8
 Default directory hash:   half_md4
-Directory Hash Seed:      367fc8dd-0a4d-4fa7-90ea-77026a99d6a1+Directory Hash Seed:      fff5cb63-86e3-4e0b-996e-78a6c3c4fbdf
 Journal backup:           inode blocks
+Checksum:                 0xffeec98a

パーティションのセクター数は同じなのにファイルシステムのサイズ微妙に違うし。ディストリによって /etc/mke2fs.confって違うのか。

$ df -H -t ext4
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p2   16G  3.6G   12G  24% /
/dev/sda1       984G  323G  612G  35% /media/ST4000DM004-1
/dev/sda2       984G  898G   36G  97% /media/ST4000DM004-2
/dev/sdb1       985G  882G   53G  95% /media/HDCL-UT1
/dev/sdc1       985G  933G  1.4G 100% /media/ST3000DM001-1
/dev/sdc2       985G  926G  8.2G 100% /media/ST3000DM001-2
/dev/sdc3       985G  927G  7.5G 100% /media/ST3000DM001-3

そしてデータ移動しつつ1日経って気づいたけど i-node のサイズ変えるの忘れてた(´・ω・`) もう 1 TB 分データ移動したのに…。i-node 余り過ぎやん。

$ df -i -t ext4
Filesystem        Inodes  IUsed     IFree IUse% Mounted on
/dev/mmcblk0p2    906240  68652    837588    8% /
/dev/sda1       61038592 260739  60777853    1% /media/ST4000DM004-1
/dev/sda2       61038592 541012  60497580    1% /media/ST4000DM004-2
/dev/sdb1       61054976 540946  60514030    1% /media/HDCL-UT1
/dev/sdc1       61038592 306389  60732203    1% /media/ST3000DM001-1
/dev/sdc2       61038592 473815  60564777    1% /media/ST3000DM001-2
/dev/sdc3       61038592 322747  60715845    1% /media/ST3000DM001-3

てことで残りの 2 パーティションを xfs にした。

$ df -HT -t ext4 -t xfs
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/mmcblk0p2 ext4   16G  3.6G   12G  24% /
/dev/sda1      ext4  984G  323G  612G  35% /media/ST4000DM004-1
/dev/sda2      ext4  984G  898G   36G  97% /media/ST4000DM004-2
/dev/sda3      xfs   1.0T  148G  853G  15% /media/ST4000DM004-3
/dev/sda4      xfs   1.0T  1.1G  999G   1% /media/ST4000DM004-4
/dev/sdb1      ext4  985G  882G   53G  95% /media/HDCL-UT1
/dev/sdc1      ext4  985G  933G  1.4G 100% /media/ST3000DM001-1
/dev/sdc2      ext4  985G  926G  8.2G 100% /media/ST3000DM001-2
/dev/sdc3      ext4  985G  927G  7.5G 100% /media/ST3000DM001-3

ん???

ext4と xfs って 1 TB だと 15 GB もサイズに差出るのかよ…。

※ST4000DM004-3 はデータ移動中なので使用量が増えてるけど ST4000DM004-4 は未使用。xfs は未使用でも初期段階で 1.1 GB 使ってる。

一応 i-node 数も見ておく。

$ df -iT -t ext4 -t xfs
Filesystem     Type    Inodes  IUsed     IFree IUse% Mounted on
/dev/mmcblk0p2 ext4    906240  68653    837587    8% /
/dev/sda1      ext4  61038592 260958  60777634    1% /media/ST4000DM004-1
/dev/sda2      ext4  61038592 541012  60497580    1% /media/ST4000DM004-2
/dev/sda3      xfs  488281216  13972 488267244    1% /media/ST4000DM004-3
/dev/sda4      xfs  488281216      3 488281213    1% /media/ST4000DM004-4
/dev/sdb1      ext4  61054976 540946  60514030    1% /media/HDCL-UT1
/dev/sdc1      ext4  61038592 306389  60732203    1% /media/ST3000DM001-1
/dev/sdc2      ext4  61038592 473815  60564777    1% /media/ST3000DM001-2
/dev/sdc3      ext4  61038592 322747  60715845    1% /media/ST3000DM001-3

もう xfs でいいや(´・ω・`)


で、rsyncで sdb1 から sdb2、sdb3 にそれぞれ同じデータ量を書き込んだんだけど差がありすぎる。sdb は 512 byte セクタで sda は 4 K セクタでまぁ変わるものなんだろうが、ext4と xfs で 65 GB も差が出た。

Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sdb1      ext4  985G  882G   53G  95% /media/HDCL-UT1
/dev/sda2      ext4  984G  898G   36G  97% /media/ST4000DM004-2
/dev/sda3      xfs   1.0T  899G  101G  90% /media/ST4000DM004-3

Filesystem     Type    Inodes  IUsed     IFree IUse% Mounted on
/dev/sdb1      ext4  61054976 540946  60514030    1% /media/HDCL-UT1
/dev/sda2      ext4  61038592 541012  60497580    1% /media/ST4000DM004-2
/dev/sda3      xfs  196981880 541004 196440876    1% /media/ST4000DM004-3

NanoPi NEO2 の APT サーバを JP サーバに変更

$
0
0

パッケージのアップデートしようと思ったらハッシュ不一致とか出るのでサーバ変更。

デフォルトの /etc/apt/source.listではサーバは http://ports.ubuntu.comに設定されている。

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted

## Uncomment the following two lines to add software from the 'universe'
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://ports.ubuntu.com/ubuntu-ports/ xenial universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial universe
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted

deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe
deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse

http://jp.archive.ubuntu.comで ARM バイナリのミラーを提供しているとのことなのでこちらを利用させていただく。

$ sudo gzip /etc/apt/sources.list
$ gzip -dc /etc/apt/sources.list.gz | sed '/^deb/s|ports.ubuntu.com|jp.archive.ubuntu.com|' | sudo tee /etc/apt/sources.list

差分。

--- /dev/fd/63   2018-11-10 16:59:09.349566783 +0900+++ sources.list  2018-11-10 16:58:16.946964003 +0900@@ -1,35 +1,35 @@
 # See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
 # newer versions of the distribution.
 
-deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted-deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted+deb http://jp.archive.ubuntu.com/ubuntu-ports/ xenial main restricted+deb-src http://jp.archive.ubuntu.com/ubuntu-ports/ xenial main restricted
 
 ## Major bug fix updates produced after the final release of the
 ## distribution.
-deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted-deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted+deb http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-updates main restricted+deb-src http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-updates main restricted
 
 ## Uncomment the following two lines to add software from the 'universe'
 ## repository.
 ## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
 ## team. Also, please note that software in universe WILL NOT receive any
 ## review or updates from the Ubuntu security team.
-deb http://ports.ubuntu.com/ubuntu-ports/ xenial universe-deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial universe-deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe-deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates universe+deb http://jp.archive.ubuntu.com/ubuntu-ports/ xenial universe+deb-src http://jp.archive.ubuntu.com/ubuntu-ports/ xenial universe+deb http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-updates universe+deb-src http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-updates universe
 
 ## N.B. software from this repository may not have been tested as
 ## extensively as that contained in the main release, although it includes
 ## newer versions of some applications which may provide useful features.
 ## Also, please note that software in backports WILL NOT receive any review
 ## or updates from the Ubuntu security team.
-deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted-deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted+deb http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-backports main restricted+deb-src http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-backports main restricted-deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted-deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted-deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe-deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security universe-deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse-deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security multiverse+deb http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-security main restricted+deb-src http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-security main restricted+deb http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-security universe+deb-src http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-security universe+deb http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-security multiverse+deb-src http://jp.archive.ubuntu.com/ubuntu-ports/ xenial-security multiverse

整形して並べるとこんな感じ。

deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial            main        restricted
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial            main        restricted
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-updates    main        restricted
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-updates    main        restricted
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial            universe
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial            universe
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-updates    universe
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-updates    universe
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-backports  main        restricted
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-backports  main        restricted
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   main        restricted
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   main        restricted
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   universe
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   universe
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   multiverse
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   multiverse

短い方が管理しやすいかな。

$ gzip /etc/apt/sources.list
$ gzip -dc /etc/apt/sources.list.gz | sed -n '/^deb/s|ports.ubuntu.com|jp.archive.ubuntu.com|p' | column -t | sudo tee /etc/apt/sources.list
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial            main        restricted
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial            main        restricted
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-updates    main        restricted
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-updates    main        restricted
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial            universe
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial            universe
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-updates    universe
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-updates    universe
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-backports  main        restricted
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-backports  main        restricted
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   main        restricted
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   main        restricted
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   universe
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   universe
deb      http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   multiverse
deb-src  http://jp.archive.ubuntu.com/ubuntu-ports/  xenial-security   multiverse

NanoPi-NEO2 で MIB の変換ができない

$
0
0

YAMAHA WLX202 が来たので snmpwalkでデータを取ってみたりしてるんだけど変換されない。というかエラーがゴソゴソと出る。

X86_64 Ubuntuには snmp-mib-downloaderパッケージがあるけど NanoPi-NEO2 の aarch64 Ubuntuのパッケージリストには出てこない。APT のリポジトリを弄ったせいか?

アーカイブ見てみたらパッケージはあるので手動でインストールすることにした。

依存関係の smistripを入れておく。

$ sudo apt-get install smistrip

snmp-mibs-downloaderDEBパッケージを拾ってきてインストールする。

$ wget 'http://jp.archive.ubuntu.com/ubuntu-ports/pool/multiverse/s/snmp-mibs-downloader/snmp-mibs-downloader_1.1+nmu1_all.deb'
$ sudo dpkg -i 'snmp-mibs-downloader_1.1+nmu1_all.deb'

テスト。

$ snmptranslate -m all .1.3.6.1.2.1.2.2.1.2
IF-MIB::ifDescr

fluentd で使うので実際は MIB の変換ができるかどうかは重要ではなかったりする。

いまの Kibana には Serial Differencing Aggregation というのがあるので IfInOctets/IfOutOctets などの総計から時系列で差分を計算してくれるらしい。欠点(?)として最初のポイントは差分が無いので必ず 0 になってしまう。回避方法はありそうだけど時間がないのでとりあえずこれでいいや。

f:id:mattintosh4:20181113013256p:plain

Amazon Elasticsearch Service 6.x 用に curator をインストールする

$
0
0

容量削減のためインデックス自動削除に curator を導入することにした。

Amazon Elasticsearch Service のバージョンは「6.2.3」。EC2 インスタンスの AMI は「Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-07ad4b1c3af1ea214」。

$ curl -sq 'https://search-XXXX-XXXX-XXXXXXXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.es.amazonaws.com'
{
  "name" : "_XXXXXX",
  "cluster_name" : "XXXXXXXXXXXX:XXXX-XXXX",
  "cluster_uuid" : "XXXXXXXXXXXXXXXXXXXXXX",
  "version" : {
    "number" : "6.2.3",
    "build_hash" : "XXXXXXX",
    "build_date" : "2018-07-16T10:43:54.041989Z",
    "build_snapshot" : false,
    "lucene_version" : "7.2.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
$ cat /etc/ec2_version 
Ubuntu 18.04.1 LTS (Bionic Beaver)

標準の APT でインストール出来る elasticsearch-curatorはバージョンが 5.2.0 で、Amazon Elasticsearch Service 6.2.3 とは互換性エラーが発生するため 5.6.0 をインストールする必要があった。

www.elastic.co

DEBパッケージからインストールする場合

$ wget 'https://packages.elastic.co/curator/5/debian9/pool/main/e/elasticsearch-curator/elasticsearch-curator_5.6.0_amd64.deb'
$ sudo dpkg -i elasticsearch-curator_5.6.0_amd64.deb

リポジトリを登録してインストールする場合

$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo 'deb [arch=amd64] https://packages.elastic.co/curator/5/debian stable main' | sudo tee /etc/apt/sources.list.d/curator.list
deb [arch=amd64] https://packages.elastic.co/curator/5/debian stable main
$ sudo apt-get update
$ sudo apt-get install elasticsearch-curator

pip3 でインストールする場合

pip3でも 5.6.0 がインストール可能だったので試してみたところ特に問題なかった。

$ pip3 install elasticsearch-curator

curator_cliでのテスト

コンフィグを作成。

$ mkdir ~/.curator
$ cat <<! >~/.curator/curator.yml
client:
  hosts:
    - search-XXXX-XXXX-XXXXXXXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.es.amazonaws.com:443
  use_ssl: True
!

インデックスが拾えるかテスト。

$ curator_cli show_indices
.kibana
 :
 :

~/.curator/delete_indices.ymlを作成。logstash-で始まる日付ベースのインデックスを1日分残して削除する。

actions:1:action: delete_indices
    description: delete old logstash indexes.
    options:disable_action:Falseignore_empty_list:Truefilters:- filtertype: pattern
      kind: prefix
      value: logstash-
    - filtertype: age
      source: name
      direction: older
      timestring:'%Y.%m.%d'unit: days
      unit_count:1

テストなので --dry-runで実行。

$ curator --dry-run ~/.curator/delete_indices.yml 
2018-11-21 22:20:39,436 INFO      Preparing Action ID: 1, "delete_indices"
2018-11-21 22:20:39,494 INFO      Trying Action ID: 1, "delete_indices": delete old logstash indexes.
2018-11-21 22:20:39,600 INFO      DRY-RUN MODE.  No changes will be made.
2018-11-21 22:20:39,600 INFO      (CLOSED) indices may be shown that may not be acted on by action "delete_indices".
2018-11-21 22:20:39,600 INFO      DRY-RUN: delete_indices: logstash-2018.11.20 with arguments: {}
2018-11-21 22:20:39,600 INFO      Action ID: 1, "delete_indices" completed.
2018-11-21 22:20:39,600 INFO      Job completed.

あとは cron に登録しておく。


以下、elasticsearch-curator 5.2.0 での検証結果。

標準のリポジトリから elasticsearch-curatorパッケージをインストール。

$ sudo apt-get install elasticsearch-curator
$ curator_cli --version
curator_cli, version 5.2.0

互換性エラーが発生した。

$ curator_cli show_indices
2018-11-21 20:33:05,764 ERROR     Elasticsearch version 6.2.3 incompatible with this version of Curator (5.2.0)
Traceback (most recent call last):
  File "/usr/bin/curator_cli", line 11, in <module>
    load_entry_point('elasticsearch-curator==5.2.0', 'console_scripts', 'curator_cli')()
  File "/usr/lib/python2.7/dist-packages/curator/curator_cli.py", line 5, in main
    cli(obj={})
  File "/usr/lib/python2.7/dist-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python2.7/dist-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python2.7/dist-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python2.7/dist-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/curator/singletons.py", line 531, in show_indices_singleton
    client = get_client(**c_args)
  File "/usr/lib/python2.7/dist-packages/curator/utils.py", line 800, in get_client
    'Error: {0}'.format(e)
elasticsearch.exceptions.ElasticsearchException: Unable to create client connection to Elasticsearch.  Error: Elasticsearch version 6.2.3 incompatible with this version of Curator (5.2.0)

Version Compatibility | Curator Reference [5.2] | Elasticを確認してみると Curator 5.2 は ES 5.x 系までの記載しかなかった。

f:id:mattintosh4:20181121203926p:plain

2018-11-21 時点の現行バージョンは 5.6.0 なのでそっちならいけるかと思い確認してみと注釈に AWS ES (which is different from installing Elasticsearch on your own EC2 instances) version 5.3 officially supports Curator.とは書いてあるが AWS ES 6.2 に関する記載は無かった。

f:id:mattintosh4:20181121204905p:plain

Raspberry Pi で Elasticsearch と Kibana

$
0
0

AWS Elasticsearch Service をお試してで使ってみたけど用途に対してコスパが悪いので、余ってる Raspberry Pi 3 Model B で運用することにした。Elasticsearch と Kibana を1台の Raspberry Pi 3 Model B で稼働させるのは重いので現在は ASUS Tinker Board や PINE64 Rock64 4GB を使ったり、Kibana だけ手元の Ubuntuで実行していたりする。

各種バージョン

Elasticsearch や Kibana は依存関係のバージョンが厳しいので(例えば Node.js のバージョンが 8.15.0 だと動かない、など)今回は下記の通りに合わせる。Javaは Elasticsearch、Node.js は Kibana で使用する。

  • Elasticsearch: 6.5.2
  • OpenJDK: 1.8.0
  • Kibana: 6.5.2
  • Node.js: 8.14.0
  • curator: 5.6.0

Elasticsearch のセットアップ

Debian系で Elasticsearch を使う場合は DEBパッケージを使うか、MACOS/LINUX用の TAR を解凍して使う方法がある。今回は保存用のストレージ等も分けるので TAR ファイルを使う方法にする。

Java Runtime Environment 8 をインストールする。特に Javaで開発する予定もないのでヘッドレス版。

※そのうち直るかもしれないが、openjdk-8-jre-headlessのインストール後処理でエラーが発生する。もう一度 openjdk-8-jre-headlessをインストールすれば正常に終了する。

sudo apt-get update
sudo apt-get install openjdk-8-jre-headless

Elasticsearch をダウンロードする。

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.2.tar.gz
tar xf elasticsearch-6.5.2.tar.gz

elasticsearch-6.5.2/config/jvm.optionsJVMのメモリ設定を変更する。Raspberry Pi 3 Model B はメモリが 1 GB なので 512 MB くらいにしておく。

#-Xms1g
#-Xmx1g
-Xms512m
-Xmx512m

Elasticsearch の設定を elasticsearch-6.5.2/config/elasticsearch.ymlで行う。xpack.ml.enabled: falseの設定が無いと起動しない。localhost以外からのアクセスも許可するので transport.hosttransport.tcp.portを設定する。

xpack.ml.enabled:falsenetwork.host: 0.0.0.0
http.port:9200transport.host: localhost
transport.tcp.port:9300

Elasticsearch を起動する。起動まで数分かかる。

elasticsearch-6.5.2/bin/elasticsearch

localhost:9200にアクセスして Elasticsearch が起動しているか確認する。Raspberry Piでは avahi-daemonが有効になっているのでクライアントが対応していれば raspberrypi.local:9200でもアクセスできる

curl localhost:9200
{"name" : "Z0Eokyo",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "NV6kGw3iQBiF7voqb6tIcA",
  "version" : {"number" : "6.5.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "9434bed",
    "build_date" : "2018-11-29T23:58:20.891072Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

Kibana のセットアップ

Kibana には ARM 版が無いので Linuxx86_64 版をダウンロードする。

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.2-linux-x86_64.tar.gz
tar xf kibana-6.5.2-linux-x86_64.tar.gz

こちらもアクセス制限は設けないので kibana-6.5.2-linux-x86_64/config/kibana.ymlserver.host: 0.0.0.0を設定する。

server.host: 0.0.0.0

Raspberry Piなどの ARM デバイスで Kibana を使う場合、同梱されている Node.js が x86_64 用だったりするので Node.js を別途用意する必要がある。ネットで一通り見た感じ「node/bin/nodeをバックアップして…」とか書かれているが、あまり好きな方法ではないかな。

kibana-6.5.2-linux-x86_64/bin/kibanaを見てみると、自動で nodeファイルを探すようになっているが、実行できなければ whichで他の場所にある nodeファイルを探しに行くようになっている。

#!/bin/shSCRIPT=$0# SCRIPT may be an arbitrarily deep series of symlinks. Loop until we have the concrete path.while [-h"$SCRIPT"] ; dols=$(ls -ld "$SCRIPT")# Drop everything prior to ->link=$(expr"$ls" : '.*-> \(.*\)$')if expr"$link" : '/.*'> /dev/null; thenSCRIPT="$link"elseSCRIPT=$(dirname "$SCRIPT")/"$link"fidoneDIR="$(dirname "${SCRIPT}")/.."NODE="${DIR}/node/bin/node"test-x"$NODE" || NODE=$(which node)if [!-x"$NODE"]; thenecho"unable to find usable node.js executable."exit1fiNODE_ENV=production exec"${NODE}"$NODE_OPTIONS--no-warnings"${DIR}/src/cli"${@}

で、同梱されている node実行ファイルは ARM 上では実行できない。

$ node/bin/node
-bash: node/bin/node: cannot execute binary file: Exec format error

同梱されている nodeは使わないので実行権限を削除する。

chmod -x kibana-6.5.2-x86_64/node/bin/node

https://nodejs.org/dist/v8.14.0/からデバイスに合ったバイナリをダウンロードする。

wget https://nodejs.org/dist/v8.14.0/node-v8.14.0-linux-armv7l.tar.xz
tar xf node-v8.14.0-linux-armv7l.tar.xz

Node.js のインストールは下記のようなインストールスクリプトを使う方法もあるが、Kibana が Node.js のバージョンをチェックしているため、APT でアップデートが発生すると動かなくなってしまう可能性があり、Kibana との組み合わせではこの方法は向いていないと思われる。

curl -sL https://deb.nodesource.com/setup_8.x | bash -
apt-get install -y nodejs

nodeにパスを通して Kibana を起動する。

PATH=$HOME/node-v8.14.0-linux-armv7l/bin:$PATH kibana-6.5.2-x86_64/bin/kibana

Pythonでプログラムを書く

Python 3 用の PIP をインストールする。

sudo apt-get install python3-pip

今回はユーザ環境でしか使わないので ~/.config/pip/pip.confを下記のように設定しておく。「GPIO にアクセスするのに root 権限必要なんじゃ!」っていうデバイスの倍は sudo でどうぞ。

[global]
user = true

PIP をアップグレードする。

pip3 install -U pip

PATHを通しておく。

PATH=$HOME/.local/bin:$PATH

Python 3 用の elasticsearchモジュールをインストールする。

pip3 install elasticsearch

まずは簡単に CPU の温度を投げるだけのプログラムを書いてみる。Pythonタイムゾーンを扱う場合、datetime.now(timezone(timedelta(hours=+9)))と書くのが最初は少々面倒に感じるが、慣れれば定型文のように感じる。

とりあえずデータを投げる場合

#!/usr/bin/env python3from elasticsearch import Elasticsearch
from datetime import datetime, timedelta, timezone

es = Elasticsearch('localhost:9200')
withopen('/sys/class/thermal/thermal_zone0/temp') as f:
    timestamp, cpu_temp = datetime.now(timezone(timedelta(hours=+9))), int(f.read())
body = {
    '@timestamp': timestamp.isoformat(),
    'temperature': cpu_temp,
}
response = es.index(index='foo', doc_type='_doc', body=body)
print(response)
{'_version': 1, '_type': '_doc', 'result': 'created', '_seq_no': 0, '_index': 'foo', '_shards': {'failed': 0, 'total': 2, 'successful': 1}, '_id': 'RFfzK2gBykMjt7Ru8Nx9', '_primary_term': 1}

インデックスのセッティングとマッピングを追加する場合はこんな感じ。実際には毎回データを投げるわけではなく elasticsearch.helpersを使って1秒間隔で取得したデータを60秒間隔でまとめて Elasticsearch に投げるようにしている。

セッティングとマッピングを行う場合

#!/usr/bin/env python3from elasticsearch import Elasticsearch
from datetime import datetime, timedelta, timezone
import socket

hostname = socket.gethostname()
es = Elasticsearch('localhost:9200')

# CPU の温度を取得withopen('/sys/class/thermal/thermal_zone0/temp') as f:
    timestamp, cpu_temp = datetime.now(timezone(timedelta(hours=+9))), int(f.read())

# インデックス名の生成(logstash-%Y.%m.%d と同書式)
es_index = '-'.join([hostname, timestamp.strftime('%Y.%m.%d')])

# インデックス作成ifnot es.indices.exists(index=es_index):
    es_setting = {
        'settings': {
            'number_of_shards'  : 1,
            'number_of_replicas': 0,
        }
    }
    es_mapping = {
        '_doc': {
            '_all': {
                'enabled': False,
            }
        }
    }
    es.indices.create(index=es_index, body=es_setting)
    es.indices.put_mapping(index=es_index, doc_type='_doc', body=es_mapping)

# ポストデータ作成
es_body = {
    '@timestamp': timestamp.isoformat(),
    'hostname'  : hostname,
    'name'      : 'temperature',
    'value'     : cpu_temp,
}

# ポスト
response = es.index(index=es_index, doc_type='_doc', body=es_body)

print(response)

elasticsearch.helpers で Bulk API

適当に書いたので真似しない方がいいかもしれない。

#!/usr/bin/env python3from datetime import datetime, timedelta, timezone
from elasticsearch import Elasticsearch, helpers
from time import sleep
import socket

hostname = socket.gethostname()
es = Elasticsearch()

defgetCpuTemp():
    withopen('/sys/class/thermal/thermal_zone0/temp') as f:
        timestamp, temp = datetime.now(timezone(timedelta(hours=+9))), int(f.read())
    return timestamp, temp

data = []
whileTrue:
    timestamp, cpu_temp = getCpuTemp()
    es_index = '-'.join([hostname, timestamp.strftime('%Y.%m.%d')])
    ifnot es.indices.exists(index=es_index):
        es.indices.create(index=es_index, body={'settings':{'number_of_shards': 1, 'number_of_replicas': 0}})
        es.indices.put_mapping(index=es_index, doc_type='_doc', body={'_doc':{'_all':{'enabled': False}}})
    source = {
        '@timestamp' : timestamp.isoformat(),
        'hostname'   : hostname,
        'temperature': cpu_temp,
    }
    data.append({
        '_index' : es_index,
        '_type'  : '_doc',
        '_source': source,
    })
    iflen(data) >= 60:
        try:
            helpers.bulk(es, data)
            data = []
        except:
            pass
    sleep(1)

X-Pack Monitoring を無効にする

f:id:mattintosh4:20190108163654p:plain
Elasticsearch - X-Pack Monitoring

Monitoring を使うと細かくヘルスチェックデータを保存してくれるけど Raspberry Pi 3 Model B ではそれ自体が重い(CPU クロックが常に上がりっぱなし)。しかもインデックスのサイズが毎日 900 MB くらいになる。

クラスタを組んでいるわけでもないし、個人で使う分には必要ないので X-Pack Monitoring を無効にする。

elasticsearch-6.5.2/config/elasticsearch.yml

xpack.monitoring.enabled:false

家の外からのアクセス

家の中であればプライベート IP アドレスで問題ないんだけど、外でちょっと人に見せたりとかする場合に。めんどくさくて家には VPN入れてないので SSHでやっている。SSHのローカルフォワードで Elasticsearch と Kibana を動かしている Raspberry Piにそれぞれ接続している。

例えば Elasticsearch が入った Raspberry Pi192.168.1.1、Kibana が入った Raspberry Pi192.168.1.2であれば下記のように ssh_config を設定すればよい。

Host home-bastion
    Hostname XXX.XXX.XXX.XXX
    Port XXXXX
    LocalForward 9200 192.168.1.1:9200
    LocalForward 5601 192.168.1.2:5601

これで手元の Ubuntuからは curllocalhost:9200にアクセスすれば Elasticsearch に繋がるし、ブラウザで localhost:5601にアクセスすれば Kibana に繋がる。

電子書籍の情報を Elasticsearch で収集する

$
0
0

Raspberry Pi Elasticsearch の検証用に色々とデータを収集。

最近 Amazonプライムで色々と漫画を見てるのだけど、他のストアではどうなんだろうなと思って電子書籍のランキングなんかを拾ってきてる。

ストアによってランキングから拾える情報が異なるため、ストア間の値の紐付けもしないといけないんだけどまだそこまでは手が回っていない。例えば Google Playにはランキングページに出版社情報が無いため、書く書籍のページも巡回しなきゃいけない、など。また、単に電子書籍で漫画と言ってもカテゴリが細かく分かれているのでその辺りの調査も必要だったりする。

Amazonはランキングの更新間隔が1時間と公表されているので毎日よく変動していて、週刊誌の発売(公開)日は特に変動が激しい。逆に Google Playは1日1回程度とあまり変動は見られない。

Amazonは期間限定無料配信をよくやっているので「お、これちょっと読んでみたかったんだよな」と、割と役に立っている。

最近はどのストアを見ても「転スラ」が上位にランクインしていて人気あるのだなぁと感じる。(自分も全巻揃えた)

f:id:mattintosh4:20190109223612p:plain
Elasticsearch/Kibana - Amazon Books

f:id:mattintosh4:20190109223519p:plain
Elasticsearch/Kibana - App Store Books

f:id:mattintosh4:20190109223746p:plain
Elasticsearch/Kibana - Google Play Books

リモートの IP を拾っている部分があるのは APIサーバの仕様調査のため。一般に公開されている情報ではないので経験談だが、App StoreiTunes Search APICDNの振り分けで「キャッシュ有り」と「キャッシュ無し」のどこに繋ぎに行くかわからず、ただ単にクローリングしただけでは正しい結果にならない可能性がある(同じ日本国内の同じタイミングでも A さんが見ているランキング結果と B さんが見ているランキング結果が異なることがあるということ)。キャッシュを回避する問い合わせ方法もあるけどそちらは多分推奨されていない。

とりあえずいまはストアごとにクローラーを作ってデータを拾ってこれるかどうか実験中。それが終わったらインデックスの設計やらなんやら考えて、ゆくゆくは電子書籍の新刊情報や無料配信中の情報なんかを全ストアまとめて見れるようなものを作る予定。

最近ようやく Elasticsearch のことがなんとなくわかるようになってきたのでセミナーにでも行って情報収集してみようかな。

Viewing all 891 articles
Browse latest View live