SoftBank HealthCare Exporter を書きました
ソフトバンクの体組織計に毎日乗っていても全然データを見ていなかったので可視化しました。
https://github.com/s-aska/softbank_healthcare_exporter
しかし
社会は厳しい。
現在ではWiFiに対応した体組織計も販売されているようなので、使えなくなったら考えましょう。
タニタ 体組成計 インナースキャンデュアル RD-901-BK(ブラック) iPhoneアプリで健康管理/最小表示50g
- 出版社/メーカー: タニタ(TANITA)
- メディア: ホーム&キッチン
- この商品を含むブログ (1件) を見る
SSL証明書の有効期限を監視するexporterを書きました #prometheuscasual
なお先程のライブコーディングのカンペはこちらになります https://t.co/4sep5VgvmH #prometheuscasual
— 贈与税 回避 方法 (@moznion) 2016年6月14日
カンペを見ながらやってみました。
Let's Encrypt ちゃんと更新出来ているのか問題
Let's Encrypt で調子に乗って色んなドメインのSSL証明書をとっていると全部ちゃんと cron で更新出来ているか不安になってくるので Grafana のダッシュボードを見て安心感を得られるようにしました。
設定ファイルはURLで指定
設定ファイルはローカルではなく Gist や S3 に置く設計になっているので Docker Hub や Deploy to Heroku でカジュアルに使えて便利です。
設定ファイル弄るためだけに fork したり、自分用の Dockerfile 書いたりするのはイマイチだし設定変える GUI あっても永続化はどうするかとか考えると Gist に設定ファイル置いて URL で指定というのが一番合理的でした。
Grafana も Docker での使い勝手を意識してかやたら環境変数でなんでも設定できるようになっていますね。
自分用 Prometheus、自分用 Grafana
何かしら可視化したい欲求は定期的に訪れますが可視化のところが億劫でいつもやらないでいたら Grafana が最高だったのでやれました。
次は体組織計の可視化にチャレンジしようかと思います。
英語と筋トレとプロテイン
利用規約とプライバシーポリシーをtextlintでチェックするようにしました
欲張っていろんな rule を指定したので初っ端のインストールコマンドが
npm install -D textlint textlint-plugin-html textlint-rule-common-misspellings textlint-rule-general-novel-style-ja textlint-rule-incremental-headers textlint-rule-max-appearence-count-of-words textlint-rule-max-length-of-title textlint-rule-no-double-negative-ja textlint-rule-no-doubled-conjunction textlint-rule-no-doubled-conjunctive-particle-ga textlint-rule-no-doubled-joshi textlint-rule-no-dropping-the-ra textlint-rule-no-hankaku-kana textlint-rule-no-mix-dearu-desumasu textlint-rule-no-nfd textlint-rule-no-todo textlint-rule-sjsj textlint-rule-spellcheck-tech-word textlint-rule-spellchecker
とえらい長いコマンドになったのですが無事導入できました。
nodejs を travis でやるのが初めてで最初インストールできない rule があったのですが、公式のドキュメントにあるように .travis.yml を調整して事なきを得ました、やりましたね。
Building a Node.js project - Travis CI
.travis.yml
sudo: false language: node_js node_js: "stable" script: - npm run textlint env: - CXX=g++-4.8 addons: apt: sources: - ubuntu-toolchain-r-test packages: - g++-4.8
利用規約とプライバシーポリシーを日本語と英語で書きました
経緯
「利用規約が日本語じゃないので☆1です」というお叱りのレビューを頂きました。
— Aska (@su_aska) 2016年5月18日
この機会に図なども多用しわかりやすい日本語の利用規約作成し、将来は順次対応言語も拡大を検討致します。
プロダクトを成長させるのはユーザー、あらゆる声に感謝🙏
出来たのはこちらです。
サードパーティ製のログ解析やクラッシュレポートを付けるのは気が引けるなぁと思い付けていなかったのですが、今回プライバシーポリシーにもその旨を明記する事と致しました。
利用規約が定型的なものになりがちなのに対してプライバシーポリシーはサービスについて細かく書く余地が多く、良い機会でした。🙏
これからも時間を見つけてヘルプを書いたりしようと思います。
NSRegularExpressionやNSDataDetectorで指定するrangeにはString.utf16.countを使う
テキストからリンクを抜き出す場合などよくこういったコードを見ますが、テキストにサロゲートペアが含まれているとマッチの対象がサロゲートペアの分短く解釈され、末尾が切れたりします。
let text = "🍣 is sushi http://example.com/hello" let detector = try! NSDataDetector(types: NSTextCheckingType.Link.rawValue) let matches = detector.matchesInString(text, options: [], range: NSRange.init(location: 0, length: text.characters.count)) for match in matches { let link = (text as NSString).substringWithRange(match.range) print(link) // -> http://example.com/hell }
String.utf16.count を使うと期待した結果を得ることが出来ます。
let text = "🍣 is sushi http://example.com/abc" let detector = try! NSDataDetector(types: NSTextCheckingType.Link.rawValue) let matches = detector.matchesInString(text, options: [], range: NSRange.init(location: 0, length: text.utf16.count)) for match in matches { let link = (text as NSString).substringWithRange(match.range) print(link) // -> http://example.com/hello }
しかしこれは本当に気づきにくくSwiftライブラリでも characters.count を利用している例が多いです。