Git LFSをAmazon S3でいい感じにする話
はじめに
皆さんはソースコードリポジトリの保存先として,GitHubなどのホスティングサービスをお使いでしょうか. また,リソースファイルなどのバイナリファイルを管理するためのリポジトリのサイズが肥大化していたりしないでしょうか.
実は,GitHubなどのホスティングサービスでは推奨されるリポジトリのサイズが決められており,そのサイズを大幅に超過するようなリポジトリは運営による凍結・削除の対象となってしまうことがあるのです.
この記事では,そうしたリポジトリの肥大化を,バイナリファイルをソースコードとは別で管理することによって防ぐことが可能なGit LFS (Large File Storage)と,Git LFSのサーバとしてAmazon S3を活用する方法などを紹介します.
続きを読むGoogle Homeで普通のシーリングライトを制御する
はじめに
先日,Google Home Miniを購入しました.
Google Home Miniポチった pic.twitter.com/WyIUj1NlbY
— social.0ko.me/@YDKK (@YDKKK) 2017年10月24日
Google関連のサービス・製品*1を多く利用しているので,それらと連携出来たら便利そうだと感じたのと,どうやらAPIを通して機能を拡張できそうだと分かったのが購入の決め手です.
さて,せっかくGoogle Homeを購入したので,音楽を再生したり,ニュースを聞いたりする他にシーリングライトなどの家電を制御したりしたくなってきます.
Google Homeで家電を制御する
Google Homeには,元々家電などを制御する機能が搭載されていますが,これを利用することができるのはPHILIPS Hueなどの一部のスマート家電のみです.
残念なことに,我が家で使用しているシーリングライトはHueではなく,一般的な,リモコンで操作するタイプのLEDシーリングライトです.そのため,そのままではGoogle Homeから制御することができません.
Google Homeの機能拡張
そこで目を付けたのが,APIを通した機能の拡張です.調べたところ,Google Homeの中身*2はGoogle Assistantであり,Dialogflow上でアプリを作成してActions on Google経由で呼び出すことによって機能を拡張することができるようです.
しかし,この方法で作成したアプリは起動のために毎回「テスト用アプリに接続」というようなコマンドを言わないと使用することができない*3ようです.部屋の明かりを点けるために毎回そうしたコマンドを言うのは面倒ですし,何より直感的ではありません.
そこで次に調べたのが,IFTTTを使用する方法です.IFTTTを使用して連携する場合には,どういう訳か*4「テスト用アプリに接続」というようなコマンドを言わずに,直接制御用のコマンドを認識することが可能なようです.シーリングライトの制御という目的を考えれば,アプリにはそれほど高度な機能は求められず,せいぜいWebhookが使えれば十分なので,今回はIFTTTを使用することにしました.
シーリングライトの制御
次に問題になるのが,Webhookを受け取った後に,どうやってシーリングライトを制御するかという点です.先述の通りHueなどのスマート家電ではないので,制御するためにはリモコンを使用するほかなさそうです.そこで,リモコンの信号を解析し,その通りに真似してしゃべることで制御することができるのではないかと考えました.ちょうど秋月通販で買い物をする予定があったので,ついでに赤外線受信器や赤外線LEDなどを買いそろえました.
さて,リモコン信号の解析ですが,手元にArduinoもどき*5があったので,それを使用することにします.調べたところ,ArduinoのライブラリにIRremoteというものがあり,リモコン信号の送受信をサポートしていたのでこれを使用することとしました.
こんな感じのスケッチで,受信したリモコンの信号を出力させます.
IR Receive.c
gist.github.com
回路図なんかは,ググればいくらでも出てくると思うので,そちらを参照してください.
一つ注意が必要な点として,我が家で使ってるシーリングライト*6はリモコンの信号が長いようで,IRremoteライブラリそのままでは全ての信号を受信しきれなかったため, IRremoteInt.h
ファイルの43行目にある #define RAWBUF
の値を500ぐらいの大きな値に変更しています.
そして,受信した信号を元に次のようなスケッチを作成しました.このコードは,デジタル入力の2ピンと4ピンを監視し, HIGH
になった場合にはそれぞれリモコンの全灯と消灯の信号を送信しています.
IR Send.c
gist.github.com
Webhookを受信して,Arduinoに伝えるのはRaspberry Piを使用しました*7.C#で簡易HTTPサーバを書き,アクセスに応じてGPIOを制御してます.
ひとまず,モノとしてはこんな感じになりました.
できた pic.twitter.com/MNqn1CAYc6
— social.0ko.me/@YDKK (@YDKKK) 2017年11月3日
最後に,IFTTTでこんな感じのアプレットを作成して完成です.
出来上がったもの
実際に動かしている様子は次の通りです.
Google Home Mini買ったので部屋の明かりを制御させたら最高になった pic.twitter.com/nlQ8aouum2
— social.0ko.me/@YDKK (@YDKKK) 2017年11月3日
システム全体の構成図はこんな感じ.Google HomeとWebサーバより右側が我が家の中です.
終わりに
とりあえず家にあるもので作ったので,ラズパイとかArduinoのあたりが煩雑になってる気がする.既製品のスマートリモコンの類を利用したり,ESP-WROOM-02みたいなWi-Fiマイコンを使ったりするともっとスマートに仕上がりそう.
最初のうちは,つい今までの習慣で自然とリモコンに手が伸びてしまいますが,すぐに慣れました.両手がふさがってても明かりを点けられたり,消し忘れた際に遠くから喋るだけで明かりを消したりできるので最高です.
今後は,何か良さそうなものがあれば他のものも制御してみたいです.
Splatoon2向けの何かを作ったりもしてみようと思ったのですが,ログイン周りの処理が変わってからは iksm_session
を自動生成できないようなので保留してます.
Vpassのパズル認証を突破する
SMBCから
★━━【三井住友カード】━★ 【重要なお知らせ】Vpassログイン時の「パズル認証」導入について ★━━━━ 2017年8月7日 ━★
などと書かれたメールが届きました.
どうやら今後Vpassにログインする際にパズル認証が必要になるらしいです.
メール本文には人の手によるログイン操作であることを認証するものでございます
とあります.
個人的にはDr.Walletで請求額取得できなくなりそうで嫌だなぁという感じですが,果たしてパズル認証に機械的なログイン試行を防ぐ効果はあるのでしょうか.
実際にログインページで使われてるパズル認証を見てみると,よく見かけるもので,調べてみるとCapy社のパズルキャプチャのようです.
このパズル認証は既にだいぶ前に突破されています*1が,今回Vpassのログイン画面で使用されているものはピースの輪郭が白で塗りつぶされており,この手法が使えないように対策してあるようです.
そういえば近頃の Capy のパズル認証はエッジを白で塗りつぶしたりして俺の突破手法を無効化しているのだな
— 22歳 (@KOBA789) 2017年8月11日
しかし,見ての通りピースをはめる部分の色が単色で,しかも固定という何を考えているのかよく分からない*2仕様になっています.こんなパズルでは突破手法を考えるまでもなく,単純な画像処理だけで簡単にピースをはめる部分の座標が求まります.
せっかくなので画像処理の練習がてらにコードを書いてみました.C#で適当に書いたところ,80行程度でクリップボードから張り付けた画像に対してピースをはめる部分を求めるという処理が書けました.コードはGistに置いておく*3ので気になったら見てみてください.
さて,これでVpassのログイン画面に使われているパズル認証がいかに意味のない*4ものであるかが分かったと思います.また,こうしたタイプの認証は視覚障害者などに対するアクセシビリティを損なうという指摘も多数あります.
個人的には,こんな意味のないパズル認証を導入するよりも,reCAPTCHAを使うなり二段階認証を使うなりした方が,よっぽど機械的なログイン試行に対して有効で,ユーザビリティを損なわないと思います.そうしたうえで,安全なAPIを通してDr.Walletをはじめとする家計簿アプリなどが情報を取得できるような未来が来たら良いなーと思ってます.うーん,現状を鑑みるとなかなか難しそうですね.
*1:https://news.gehirn.jp/security/513/
*2:見やすさを考慮してる?
*3:https://gist.github.com/YDKK/1a3199934ca1d5f6f5c8b2bc923cf915
*4:今回は背景色を使っただけですが,仮にこれが対策されたところでエッジ検出するなりいくらでも方法はあると思います
Slackを黒くする
SlackのWindowsアプリが白くて目が疲れるので,黒くするお話.
SlackのWindowsアプリはElectron製で,jsで書かれているので簡単に中身を弄れる.
下記の内容の利用は自己責任でお願いします.
app.asarを展開
今回はBoW上で作業した.
まず,
Ubuntuに最新のNode.jsを難なくインストールする - Qiita
を参考にBoW上にnodejsをインストール.
npmを消す前に apt-get install node-gyp
でnode-gypもインストール.
そして,asarを展開(バージョンは環境に合わせて読み替えること).
npm install -g asar cd %LOCALAPPDATA%/slack/app-2.3.3/resources asar e app.asar app.extract
ロード時にcssを適用
Webviewが読まれるタイミングで,好きなcssをinjectionする.
アプリ版も,中身のhtmlはweb版とほとんど変わらないので,web版と同じuserstyleを適用できる.
Slackでは,Webviewのpreloadで\src\static\ssb-interop.js
を読みに行ってるので,このファイルの末尾に次のように追記する.
onload = function(){ $.ajax({ url: "https://cdn.rawgit.com/laCour/slack-night-mode/master/css/raw/black.css", success: function(css) { $("<style></style>").appendTo("head").html(css); } }); }
app.asarをパッキング
編集したファイルをパッキングして,app.asarを上書きする.
asar p app.extract app.asar
サイドバーの色も揃える
このままでは,サイドバーだけ元の色のままなので,Preferencesからサイドバーの色も調節する.
#363636,#2A2A2A,#222222,#FFFFFF,#4A5664,#FFFFFF,#94E864,#bf360c
完成
これで,黒くて目に優しいSlackの出来上がり.
※Slackのバージョンアップの度に同じ操作を適用する必要あり.
公式で黒テーマ提供してくれれば良いのだが….
参考
GP7 ドアミラーカバー交換
疲れからか、不幸にも電信柱に追突してさせてしまったドアミラー君
ディーラーでカバー上下とレンズの割れてしまったランプを注文
お客様感謝デイが近かったのでお願いして10%引きに
自分で交換すると言ったので技術料は無し
つらい
無線LANルータ(WN-AC1167DGR)を再起動させるやつ
使ってる無線LANルータ(WN-AC1167DGR)が,定期的に再起動しないとスループットがどんどん落ちる(200Mbps→20Mbpsみたいな感じ)ので外から再起動させられるように書いた.
無線LANルータ(WN-AC1167DGR)を再起動させるやつ
Html Agility Packと,管理ページにログインするためのIDとPassを設定に追加する必要あり.
あとurlのホストを各自の管理ページに向ける.
最初だけ手動で起動してIDとPassを入力すれば,あとはタスクスケジューラとかに登録して好きな間隔で呼べばおk.
関係ないけどHtml Agility Pack,なんでデフォルトだとformがエレメントになるんだろう.