tshohe's memo

おぼえたことをかく

iOS12のショートカットの便利な使い方

色々と話題になってますが、最近リリースされたiOS12のショートカット便利ですね。(もともとWorkflowってのがあったみたいですが)
一つのショートカットで複数のアクションを定義することができるのでちょっとしたプログラミング的なことも出来るみたいです。(変数定義まで出来るとは...)

おまけにWidgetとして配備しておくことでロック解除せずに最小限のアクションで処理が実行できます。

普段使い出来そうな便利そうな使い方まとめてみました。

WiFi ON/OFF

色んな所で紹介されているやつ。
Wi-Fiを設定」で勝手に自動ONになるWiFiをお手軽に永続無効化出来ます。

SSHスクリプト実行

SSHログインして任意のコマンドを実行するというもの。

  • Raspberry Piの頻出操作(shutdown等)
  • サーバのリソース確認コマンド

とか登録しておいたら便利そう

URLの内容を取得

指定したURLに対してリクエストを実行可能です。
固定のURLはもちろん変数で指定した値が埋め込めたり、リストで選択した値が埋め込めたりと自由度が高いです。

ショートカットは下記のように作ります

  1. リスト
    • URLに埋め込む候補を全部登録
  2. リストから選択
  3. URL
    • URL内に「選択した項目」を挿入
  4. URLの内容を取得

家のRaspberry Piで、URLで指定した赤外線信号をTV等に送付するようなアプリケーションを実行しているのですが、これまで 「iPhoneロック解除 -> Safari起動 -> リモコン用Webページに移動 -> ボタンタップ」だったものが「iPhoneロック画面でスワイプ -> ボタンタップ」で済むようになりました。便利。

iPhoneのヘルスケアのデータをKibanaで見てみる

ウェアラブルバイスを使っているとiPhoneのヘルスケアにいろいろな情報が蓄積されていくので、それらのデータをエクスポートして可視化してみます。

勿論各デバイスごとの可視化ツールやヘルスケア自身のグラフがあるので、普通に波形が見たいだけであればそれで十分かと思いますが、Aggregationやらなんやらをやりたい場合はElasticsearchに投入してKibanaで見るほうがいろいろと便利かなーと思います。

ヘルスケアデータのエクスポート

ヘルスケアアプリケーションの右上の人型のアイコンを選択し、プロフィール画面に移動します。

f:id:tshohe:20180810013836p:plain

プロフィール画面の一番下にある「ヘルスケアデータを書き出す」というところからエクスポート出来ます。

f:id:tshohe:20180810013849p:plain

LogstashからElasticsearchへ投入

xml filter を利用することで、XML形式のヘルスケアデータをElasticsearchへ投入します。

conf

input {
  file {
    path => "/tmp/healthcare.xml"
    type => "helthcare"
    start_position => "beginning"
  }
}

filter {
  if [type] == "helthcare" {
    xml {
      source => "message"
      store_xml => "false"
      remove_namespaces => "true"
      xpath => ["Record/@type", "metricsType"]
      xpath => ["Record/@sourceName", "sourceName"]
      xpath => ["Record/@creationDate", "creationDate"]
      xpath => ["Record/@value", "value"]
    }
  }
  if [creationDate] != "" {
    mutate {
      replace => {"metricsType" => "%{metricsType[0]}"}
      replace => {"sourceName" => "%{sourceName[0]}"}
      replace => {"creationDate" => "%{creationDate[0]}"}
      replace => {"value" => "%{value[0]}" }
    }
  }
}

output {
  if [metricsType] != "" {
    elasticsearch {
      hosts => localhost
      index => "healthcare-%{+YYYY.MM.dd}"
    }
  }
}

template

PUT _template/healthcare
{
  "index_patterns": "healthcare-*",
  "mappings": {
    "doc": {
      "dynamic_templates": [
        {
          "integers": {
            "match_mapping_type": "long",
            "mapping": {
              "type": "long"
            }
          }
        },
        {
          "strings": {
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ],
      "properties": {
        "creationDate": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss Z"
        },
        "value": {
          "type": "long"
        }
      }
    }
  }
}

indexはこんな感じ

GET healthcare-*/_search?size=1

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 10639,
    "max_score": 1,
    "hits": [
      {
        "_index": "healthcare-2018.08.10",
        "_type": "doc",
        "_id": "5hdrJGUBVvfK6smIRtRR",
        "_score": 1,
        "_source": {
          "metricsType": "HKQuantityTypeIdentifierHeartRate",
          "value": "98",
          "path": "/tmp/healthcare.xml",
          "@version": "1",
          "@timestamp": "2018-08-10T15:18:41.852Z",
          "host": "hostname",
          "type": "helthcare",
          "sourceName": "iPhone",
          "creationDate": "2017-11-27 21:56:01 +0900"
        }
      }
    ]
  }
}

どのmetricsType(/HealthData/Record/@type)がどんな意味を持っているかはAppleのDocumentに記載されています。

Health Data Types | Apple Developer Documentation

日毎の心拍数の最大値のグラフを描画するとこんな感じ(時計付けてない日も多くて結構抜けてる...)

f:id:tshohe:20180811002938p:plain

心拍数ランキングとかも描画できる

f:id:tshohe:20180811003347p:plain

他にも

  • GPS情報のTileMapへの描画
  • 睡眠時間のグラフ化
    • 一定基準下回るとアラート上げたり

等色々と遊べそうです。

より便利にするためには

今はiPhoneでエクスポートして、移動して、展開して...みたいな手順で何かと手間がかかりますが、エクスポート先としてSlackやGoogle Driveが選択できるので、例えば

といったこともできるはずです。

Mercari meetup for SRE のメモ

メルカリさんが開催しているSREイベントに参加したのでそのメモ。

mercari.connpass.com

発表

オープニング&SREチームのご紹介 by @masartz

  • 2015/11から発足
  • Application ~ Infrastructureまで見る
  • 全員で16人。内訳は下記の通り。
    • ML Platform * 1
    • Microservice * 5
    • Reliability, Scalability * 9 ★今日はココ
    • Engineering Manager * 1
  • 朝の監視は当番制
    • 打刻から出社確認
  • 朝会はSlackで実施。スレッドにずらっとやること書いていく。
  • ITSはJIRA
    • Slackから「add todo (.*)」というメッセージで起票できるようにしている。
  • ポストモーテム残す文化あり
    • 批判しない、原因特定に集中
    • 障害報告や再発防止策の振り返りは全員参加

Traffic Optimization by @cubicdaiya

  • API通信に関する話
  • コンテンツ配信ではakamai, fastlyといったCDNを利用
  • モバイルは通信速度遅いのを前提とする。WiFiは前提にしない。
  • アプリのデータ通信量は極力減らし低速でもストレスが貯まらないように作る
  • JSONgzip圧縮
  • レイテンシのほうが圧縮オーバヘッドより圧倒的に高いらしい。
    • コストもネットワークのほうがCPUよりも高くつく

構成

API Gateway --gRPC--> 各種Service --JSON over HTTPS--> Sakura(旧API)
  • nginxはgzipのデフォルト圧縮レベルが低い2(apacheは6)
    • メルカリは6指定
  • マスターデータのJSONのサイズが大きい

    • 基本はgzip
    • zopfliはgzipの最高レベルより圧縮率が高いが処理時間が長すぎ
    • brotliも高圧縮率だが、CPUコストが大きく対応プラットフォームが限られており使っていない
  • アクセス数等は10ヶ月で1.5倍くらいのペースだけど帯域幅は変化なし

    • --> akamai <--> imageFlux(画像変換) <--> s3
    • imageFluxによるリサイズ/WebP化が効果的(半分くらいになるものも)
    • 変換はオンザフライ、リサイズのCPUコストは無視できるレベル
    • iOSはWebP非サポート、Android5+なら使える
  • "ネットワークはCPUより高い"

Expanding World of Data @kazeburo

  • DCが石狩にある(Sakura Internet)
  • GCP東京リージョンとのレスポンスタイムは205ms
  • DatabaseはMySQLを利用中
    • 現在はMySQL5.6~5.7を利用
    • 出品数が10億個超えたのでitemテーブルも10億レコード
    • 400,000 qps
    • outbound 14Gbps
  • 東京DCMySQLのマネージドサービスを提供検討中
    • 3台構成クラスタ(Galera Clusterとか検討中)
    • innodb clusterは来年から(FBが使い始めたら...)
  • データベース運用
    • DBクラスタはサービスごとに分ける。小さいものはCloud SQL
    • ストレージは6.4TB
    • 1U4TBのが出るらしいのでストレージはしばらく耐えられそう?(メモリが高いから辛いとか)
    • RAID0

GitLab Meetup #9 のメモ

GitLab Meetup Tokyo #9: Auto DevOps GA 記念」に参加したのでそのメモ。

発表

「GitLab Auto DevOps & K8S をオンプレ環境に構築してみた」 by @h-kob & @sh-miyoshi

  • オンプレ案件が多くGitLab.com/GKE使えないらしい
  • 素のk8sクラスタ構築は大変らしいので、kubeadmで構築しているらしい。
    • デフォルトでセキュアなクラスタ作れる
    • ただデフォルト権限ではgitlab-runner動かないらしい(pod作成権限が必要)
  • Auto DevOpsはまだRBAC非対応なのでABACで対応
  • Auto Review Appsはブランチごとの動作確認環境を立ててくれる
  • MergeRequestからテスト結果、静的/動的解析結果が参照できる

「GitLab CE で取得する監査ログ」 by @teyanol

  • 監査についての話
  • 監査ログはEE Premium, Ultimateのみ
    • イベントの監査ログであっても、clone等は監査不可能
  • /var/log/gitlab/gitlab-(rails|shell)/にログが出力されている。
    • application.log: login
    • gitlab_access.log:
    • gitlab-shell.log: git command(ssh), zipダウンロード, Web編集
    • production_json.log: git command(http)

「Update of GitLab GCP migration」 by @Guenjun (GitLab Inc.)

  • gitlab.comはgithubに比べると遅い。
  • gitlab.comはGitLab GEOという仕組みでデータのレプリケーションをしている。(レイテンシは30ms程度, DR的な目的)

「GitLab helm chart beta版:AWS/Azure/GCP徹底比較」 by @jvasseur

  • GitLabをhelm chartでGKEにインストールできる
    1. kubectlで接続可能にする
    2. RBAC設定
    3. ストレージ設定
    4. helm/tillerインストール
    5. helm chartリポジトリ設定
    6. helmコマンド
    7. DNSレコード登録
  • AWS, Azure, GCPによる比較。GCPがいい感じだったらしいが動かなくて逆転負け。

「www.gitlab.jp on GitLab Pages」 by @hiroponz

  • Jekyll, Hugo使える
  • Let's Encryptの更新が面倒、issueは上がっているのでそのうち自動化になるかも?
  • http://www.gitlab.jp/ をGitLab Pagesで作成中とか

「GitLab から GitLab に移行したときの思い出」 by @YOMOGItaro & @ysaotome

  • 部内GitLabから全社公式のGitLabへ移行した話
  • Export/Import APIが当時なかったらしく手動で移行したらしい。(今はあるとか)
    • Importはprivateが参照可能なユーザじゃないと失敗するとか
  • Jenkins等他に依存しているものがあると辛い

その他

これまでぎっとらぼとか言ってたけど、ぎっとらぶが正しいのかな?
Yomikataだとぎっとらぼのほうが順位高いな。色々おかしいけど。

gitlab の読み方|YOMIKATA

ログの発表のときにマケプレで入れたGitLabのログを見てみたら、コンテナが細かく分離しているので少しパスが違ってました。

$ kubectl exec -it gitlab-1-unicorn-xxxxxxxxxx-xxxxx /bin/bash

$ cd /var/log/gitlab
git@gitlab-1-unicorn-xxxxxxxxxx-xxxxx:/var/log/gitlab$ cat application.log
# Logfile created on 2018-07-23 15:02:12 +0000 by logger.rb/56815
July 23, 2018 15:02: Failed Login: username=admin ip=x.x.x.x
July 23, 2018 15:03: User Created: username=tshohe email=xxxx@xxx.xxxip=124.34.121.45 confirmed:true
July 23, 2018 15:07: User Logout: username=tshohe ip=x.x.x.x
July 23, 2018 15:07: Failed Login: username=admin ip=x.x.x.x
July 23, 2018 15:08: Successful Login: username=root ip=x.x.x.xmethod=standard admin=true
July 24, 2018 10:14: Administrator created a new project "Administrator / test"

GCP MarketplaceでGitLabをGKEにデプロイ

7/18のアップデートでMarketplaceから様々なコンテナアプリケーションをGKEにもデプロイできるようになったらしいので試してみます。
GKEの画面の左のパネルからMarketplaceを選択することでKubernetesアプリ選択画面を開くことができます。

f:id:tshohe:20180723234459p:plain

デプロイできるアプリケーションのラインナップはこんな感じ。

  • Aerospike Enterprise Edition
    • flash-optimized, in-memory KVS
  • Aqua Security
    • cloud native container platform
  • Cassandra
  • CloudBees Core
    • CI/CD Automation Engine
  • Couchbase Autonomous
    • Couchbase management
  • CyberArk Conjur Open Source
    • Enterprise class secrets management system
  • Datastax
    • Cassandra based database
  • DivvyCloud Enterprise
    • guard rails for cloud infrastructure
  • Elastic GKE Logging
  • Elasticsearch
  • Elastifile
    • k8s volume provider
  • GitLab
  • Grafana
  • InfluxDB
  • Jenkins
  • Kasten K10
    • Data management platform for stateful application on k8s
  • Memcached
  • neo4j
  • nginx
  • Prometheus & Grafana
  • RabbitMQ
  • Seldon Core
  • Spark Operator
  • Wordpress

ぱっと見興味を惹かれたのはKasten, Elastifile, Seldonとかですが、GitLab meetupが明日開催されるということもあり今回はGitLab環境を用意してみます。

f:id:tshohe:20180723231852p:plain

構成を押してクラスタを選択(無ければ作成)し、アプリインスタンス名とベースドメインを入力、デプロイを押下します。

f:id:tshohe:20180723233504p:plain

10分弱くらいでデプロイできました。

f:id:tshohe:20180723235629p:plain

f:id:tshohe:20180723235702p:plain

https://gitlab.[base domain]/ で接続できます。(DNS, TLS certificate設定とかは別途必要です)

f:id:tshohe:20180724000010p:plain

rootユーザのパスワードはkubectlコマンドで取得します。

$ kubectl get secret \
  --namespace default \
  gitlab-1-gitlab-initial-root-password \
  -ojsonpath={.data.password} \
  | base64 --decode

料金調査

Understanding Billing for GCP Marketplace  |  GCP Marketplace  |  Google Cloud

商用ソリューションを購入した場合は、ソフトウェア使用量 + Google Cloud Platformリソース使用量となるみたいです。ソフトウェア使用料は、Google Cloud Platform請求書に個別の広告申込情報として表示されるとのこと。

自宅でKibanaを最大限に活用してみる #1

自宅でのElastic Stack活用事例その1

ルータのsyslog可視化

我が家のBaffalo製ルータ(WSR-2533DHP)にはsyslogを他ホストに転送する機能があります。

f:id:tshohe:20180719231933p:plain

syslogをLogstash/Fluentd/rsyslogd等で集約しElasticsearchに投入することで、様々な情報を可視化可能です。ログに知らないMacアドレスがあったらアラート上げるようにしてみても面白そう。(基本的にはMacアドレスフィルタリングしてると思うので意味は薄いですが)

f:id:tshohe:20180719232152p:plain

NetFlow/sFlowが出力できるルータ(Ciscoとか)だと下記でネットワークトラフィックも可視化できます。まあ管理画面にダッシュボードとかありそうですが。

Logstash (logstash-input-udp + logstash-codec-netflow) www.elastic.co

Fluentd github.com

TeamGantt + Trello 連携を試してみる

最近何かの記事で見たガントチャート作成ツール「TeamGantt」の使用感をチェック。

https://www.teamgantt.com/

1 Project 3人までであればFreeで利用できるみたいです。

今回試してみたかったのがTrelloとの連携機能。Trelloのカードをガントチャートに追加したり、日付や完了率等を同期してくれるみたいです。

http://info.trello.com/power-ups/teamgantt

連携手順

Trello側のボードメニューからPower-Upを選択します。

f:id:tshohe:20180703214056p:plain

TeamGanttを検索し選択

f:id:tshohe:20180703214149p:plain

歯車アイコン > 「Power-Upの設定を編集」から、TeamGanttの認証情報を入力しアカウントをリンクします。

f:id:tshohe:20180703214231p:plain

あとはプロジェクトを選択して紐づけ完了です。

f:id:tshohe:20180703214311p:plain

これでTrello側でカードを作成したタイミングで、TeamGanttにもタスクが作成されるようになりました。
あとはTrelloの右上の「View in TeamGantt」を押すとボード上にガントチャートを表示することができます。

f:id:tshohe:20180703214358p:plain

f:id:tshohe:20180703214446p:plain

まとめ

  • Pros
  • Cons
    • 人は紐付いていないので、アサインはどちらかで管理する必要がありそう。(タイマー機能やレポート機能を使うのであればTeamGanttが良さそう)

まだまだ色々機能がありそうなので、暇な時に試して遊ぼう...。