レタスのかわをぜんぶむく

ぜんぶむきます

githubで脆弱性アラートが出てたので対応した

githubリポジトリが依存しているライブラリなどをスキャンして
脆弱性があるバージョンを使っているとアラートを出してくれる。(知らなかった)

なにげなく前回の記事で作ったリポジトリを眺めていたときにアラートを発見した。

f:id:uskey:20181204003459p:plain

なるほどなにか脆弱性があるっぽい。

f:id:uskey:20181204004049p:plain

どうやら内部で利用している `requests` というライブラリに脆弱性があるとのこと。

f:id:uskey:20181204004304p:plain

2.19.1以前だとhttpsからhttpにリダイレクトされた際に問題がある模様。

そこまで分かればとりあえずPipfile.lockを更新後動作確認して対応完了。
調べたところどうやらこの仕組みは2017年11月から動作しているもので
現在はJS, Ruby, Python, Java, .NETをサポートしているらしい。


そういうのはメールで通知くれ頼む〜と思って、通知設定を確認したら以下のようになっていた。

f:id:uskey:20181204004842p:plain

もしかすると2017年11月以前に登録したユーザーはデフォルトだと通知が飛ばないようになってるかもしれない。
ので、全部受け取るように変更した。

今回のケースでは特に影響の無いタイプの脆弱性だったため、「ほーん」という感じだったが
CVE追っかけたりするのはかなり大変なのでとても助かる。

Goでカラバリをシュッと生成するCLIツールを作った

作った

github.com

動機

社外の人も参加する勉強会的なイベントで
プレゼンをする機会があり、資料作成にすごい時間がかかり非常につらかった。
人前で喋るのはすごく嫌いというわけじゃない(≠得意)けど、資料作成は苦手。

どうせなら資料きれいな方がよかろ、図も入れたろとなった時に絵心が不在なので
ライセンス的にセーフな素材を色々なところを探しまわる必要がありつらい。

配色・デザインセンスは壊滅的なものの、視認性良くないだろ的な部分は気づいてしまうので
色味調整するために色々いじっていると更にすごい時間がかかってしまいつらい。

他にもいい方法あるかも知れないけど、GIMPダウンロードしてきて色相調整して書き出して…
みたいなことをやっていると、あと2時間後に発表みたいなことになっているのでとてもつらい。

いい感じの素材があったら、それをもとに簡単に別の色のパターンが出てきて欲しい。

機能

画像をひとつ入力に取って色相(彩度、輝度)を変化させた画像を複数出力する。
イメージはこんな感じ。
f:id:uskey:20181204011200p:plain

仕組み

まず入力された画像を内部的にRGBカラーモデルからHSL色空間に変換する。
HSL色空間では、色相(Hue)を極座標系のように扱えるため
色相を少しずつ変えていけば同じ彩度輝度で別の色パターンを簡単に生成できる。
後は出てきて欲しい画像の数に合わせて、色相の分割数を増減してファイルとして出力する。(初期値は10)

(参考)
zemax.seesaa.net

その他細々としたこと

HSL色空間を利用してカラバリを作るにあたって考慮しないといけなかった点はグレースケール画像と白黒の単色画像。
グレースケール画像は彩度が、白黒の単色画像は彩度と輝度が0なので、いくら色相を変化させても元の色のまま。
今回のツールではグレースケールか白黒の単色画像を検出して、その場合は彩度と輝度に適当な値(50%)を入れている。

go内部で色の取り扱いは乗算済みアルファが用いられているので単純なRGBと思っていじるとイメージ通りにならない。
(値域が0 ~ 255ではなく0 ~ 65025 (255*255))
なのでストレートアルファとして扱いたいときは、color.NRGBAを使う必要がある。

(参考)
qiita.com

謝辞

ヒューマンピクトグラム2.0 様
種類すごいたくさんあって改変利用OKで本当に助かりました。
pictogram2.com

物理出勤ボタンを作った

今勤めている会社では最近になって労働形態が裁量労働制からコアあり(12-16)のフレックスになった。
そのため出退勤の記録を(割と)ちゃんとつけるようになったのだが、それがまあまあ面倒。
いや、そこまで言うほど面倒ではないのだけれど、忘れる。忘れるので後から怒られる。

これまで特に記録していなかったのだからまあ仕方ない気もするが、怒られるのは困る。
ということで、ちょっと前に買って持て余していたAWS IoT Enterprise Buttonを使って物理出勤ボタンを作った。

前提

会社では勤怠管理にジョブカンという勤怠管理ツールを使っている。

これまで1ホップ前とか2ホップ前の会社では使っていなかったのだけれど結構導入している企業もある模様。No.1って書いてあった。
公式にSlack連携を提供していて、なんと設定をするとSlackのコマンドで出退勤時の打刻、稼働時間表示、残有給表示などなどができる。
これで気まずい思いをしながら人事のお兄さんお姉さんに残有給を確認したりする必要がなくなった。

それで、今回はIoT Buttonが押されると出退勤時の打刻がされて欲しい。
ジョブカンがAPIを提供していればそこを叩いてもよいのだけど、ちょっと調べた感じだとなかったので
ジョブカンに連携しているSlack側に対してどうにかしてコマンドを実行させる。

構成

f:id:uskey:20181017104005p:plain:w350

IoT Buttonが押されたらそれをトリガにAWS IoTからAWS LambdaでSlackにコマンドを実行する。
スラッシュコマンドでジョブカンが動作して出退勤の打刻がされる。
登場人物少ないしかんたん(そうに見える)。

準備

スクリプトの作成

社が使ってる言語はJava, Ruby, Goだけど、個人的に小さいのを書くのにはPythonを使うことが多いのでPython
前にbotを作るのに使った下記のライブラリを使う。

github.com

APIを利用してコマンドを実行する場合留意する点は2つ。

通常のIncoming Webhooksなどであれば連携用のトークンを生成して利用すればよいのだけど
今回の場合、Slack上でジョブカン連携済みユーザーとして投稿するためレガシートークンを利用する。
(レガシートークンは現在非推奨となっているが、ユーザーになりすまして投稿する必要があるため致し方ない)

  • 非公開APIchat.command を利用する

非公開APIchat.command を利用する。
Slack側のAPIドキュメントには無いが、何故か有志が公開したものが以下にある。

github.com

非推奨のトークンで非公開のAPIを叩いていて非常に治安が悪い。
動作しなくなる可能性もあるので、その場合は諦めて別の実装にするか諦めるかする。

書いた

github.com

書いたコードは20行ちょっと。
Lambdaに上げるために関連するライブラリも含めてzip化している。
こういう時周辺ライブラリが充実してる言語は強いなあと思う。

Lambda側の用意

新たにLambda Functionを作成して、スクリプトはさっきのリポジトリのzipファイルを設定する。
ランタイムは Python 3.6, ハンドラは上記のzipだと slack_slash_command.lambda_handler

ユーザーのレガシートークン、投稿先のチャンネル、発行するコマンド、付随するテキスト(省略可)を環境変数に設定する。
f:id:uskey:20181017105219p:plain:w400

テストして意図したチャンネルに投稿されていればOK。

IoT Buttonのセットアップ

セットアップにはスマートフォン向けアプリがあるのでそれを使う。

iOS : https://itunes.apple.com/us/app/aws-iot-button-dev/id1178216626?mt=8
Android : https://play.google.com/store/apps/details?id=com.amazonaws.iotbutton&hl=ja

f:id:uskey:20181017030447p:plain:w200
起動してログインするとこの画面である。

精神年齢が小学生のままなので、この時点でIoT Buttonの外箱とか捨てちゃっていた。
箱の横にバーコードとかあって、スキャンすると一発らしいけど丁寧にデバイスIDを手打ちしていく。
6, 10, 14文字目を入力すると、バグって二文字入力されるという不具合があって厳しい(自分の環境だけ?)
ここで入力ミスをしたり、次のWifiSSIDやパスワードでミスると最初からやりなおしになる。
入力も楽しい!と思える人以外は素直に箱を残しておいた方がよさそう。

Amazon 1-clickから Lambdaへの連携を設定する

IoT Buttonとの接続に成功すると、AWSコンソールのAWS IoT1-Clickから登録したデバイスの設定が出来るので対応する。
ブラウザからIoT Buttonの残電池容量とか見れるのいい感じ。

プロジェクトを新規作成して名前を設定、デバイス種別をすべてのボタンに設定
アクションをLambda関数の選択として 、さっき作ったLambda Functionを設定する。

プロジェクトを作成後、新規プレイスメントの設定をしてさっき登録したIoTデバイスを選択して終了。
うまくいっていれば、IoT Buttonを押すと3秒~5秒くらいおいてSlackにコマンドが送信される。

オチ

セットアップして早速使おうと思ったらコアタイムに遅刻した。つらい。
(普通にSlackからスラッシュコマンドを手打ちして実行した)
ということでまだちゃんと使ってないけどもこんな感じです。

f:id:uskey:20181017025502j:plain:w350

社のみんなたちは僕の机で見つけても連打しないであげてください。

職を転してちょうど1年が過ぎた

なんとなく過去のFacebookメッセンジャーのログを眺めていたら、
現職の社長と入社日の調整のやりとりのログを見つけた。

『使いたいPCやキーボードやマウスはなんですか?』
「えっ、なんでも選んでいいの?めっちゃ高いやつ買ったろ!」

というところから始まり、

「地方からの引っ越しなのでもうちょい待って欲しい!」
『いや、それは都合いいタイミングで良いから落ち着け』

みたいなところで終わってて、どんだけ楽しみだったんだ自分と思って笑ってしまった。

ログの日付が2017年3月10日で、その1ヶ月後の4月10日に入社したので
昨日でちょうど転職して一年になる。思い返すとあっという間だった。

辞めエントリは絶対に書かないと…と思ったまま1年が過ぎてしまったので
時が過ぎて記憶が極端に美化される前に、転職前後に何を考えてたかを思い出して書く。

続きを読む

CUIでSubversionを使う

SubversionCUIで使っていて、
GUIだと出来たけどアレどこいったアレ!
となることが多いのでそれをまとめた。

# urlで指定されたリポジトリをチェックアウトする
$ svn checkout url

# 今いるディレクトリををurlで指定したリポジトリにスイッチする
$ svn switch url

# 現在のディレクトリのリポジトリのURLを確認する
$ svn info

# ワーキングコピーの変更/追加/不明ファイルリストを表示する
$ svn status

# numで指定された件数ログを表示する。
$ svn log --l num

# fileをSubversionの管理対象に追加
$ svn add file

# 現在のディレクトリ以下を更新
$ svn update

# Conflictしたfileを解決済みに設定する
$ svn resolved file

# fileの変更を破棄する
$ svn revert file

# file1, file2, ...をコミットメッセージを設定してコミット
$ svn commit -m 'message' file1 file2 ...

とりあえず、普段使いになりそうなコマンドを上記に列挙。
いつもはだいたい下記のような感じで使っている。

編集分をコミットする場合
# 作業先ブランチが正しいか確認
svn info
# 意図した修正がちゃんと入ってるか確認
svn diff
# 上記全体のログが長い場合、コミットするファイル一覧取得
# '?'から始まるファイルは管理されていない。
# たりないファイルがあればsvn addで追加する。
svn status | grep ^? -v
# コミットのコピペ用にファイル名一覧を出力
svn status | grep ^? -v | awk '{print $2}'
# メッセージを追加してコミット、file1, 2は上記から貼り付け
svn commit -m '' file1 file2 ...
スイッチする場合
# 現在のディレクトリをurlで指定されるリポジトリにスイッチ
$ svn switch url
# (ぶつかってたら) 全部解決したことにする
$ svn resolve -R .
# (ぶつかってたら) 新しいリポジトリを向いているので変更を破棄
$ svn revert -R .
一括でhogeりたい時(追加/削除/変更の破棄)
# 一括追加
$ svn status | grep -e "^?" | awk '{ print $2 }' | xargs svn add
# 一括削除
$ svn status | grep -e "^\!" | awk '{ print $2 }' | xargs svn del
# 一括破棄
$ svn status | grep ^? | awk '{print $2}' | xargs svn revert

ブランチ(という名の)ディレクトリがたくさんあって
その中を縦横無尽にswitchしまくる必要があるのなんか面白い。


そうそう、会社のみんなLinux系あんまりつかわないから
ちょっとしたワンライナ書くだけでドヤ顔できると思ったら

力説しても「はぁ、そうなんですね…」という顔で
「すごいですね」と後輩に言われるの
SE☆CHI☆GA☆RA!
(上記はフィクションであり実在の個人及び団体となんら関係はありません)

いつもタブの数が爆発している人へ

One Tab入れましょう。以上。
Web系キラキラ女子エンジニアな先輩に教わってから
2秒でヘビーユーズ。むしろ出会うのが遅すぎた。

Chromeだったらコレ。chrome.google.com

Firefoxだったらコレ。addons.mozilla.org


使う場面としては、例えば、夕方オフィスでMP切れるじゃないですか
あ、19時過ぎた、息抜きにgigazineのヘッドライン見よーつって

f:id:uskey:20150825023304p:plain

これだよ!

ちょっとでも食指が伸びた記事をクリックするとこうなる
アイコンが見えなくなってからが勝負みたいな。

分かる分かるっていう人はこっち側です、ようこそ。
とりあえず一旦全部クリックしてみて、それから考える派ね。

それでも安心。OneTabがあれば、ポチって押すだけでこう。
あ、押すのは右上の水色の漏斗みたいなアイコンです。

f:id:uskey:20150825023739p:plain

OneTab内にリンクがリストされて、他のタブは閉じられる。
しかもかなり便利なことに、一括で戻せたり、
リストをロックしたり、名前をつけて保存したり出来る。

一旦頭冷やして、後でゆっくり読むことも出来るし
なんなら何か調査系のタスクでとりあえずリンク踏みまくって
OneTabで保存して、ちゃんとそれぞれ評価したり出来る。
もちろん全破棄してもいい!

便利!







f:id:uskey:20150825182603p:plain

まぁ既に結構積んでるけどな!

iOSの端末種別についてハマった話

ユーザーの登録している諸々のサーバログについて、
iPhone5だけ集計してというオーダーが来た。

既にDBにはその情報が入ってたのだけど
問題はそのフォーマット。

iPhone3,1

いやいや

そんなエンシェント端末使ってる人おらんやろ
と思って色々調べてみたら、どうやら

iPhone3,1 というのは iPhone 4を指す端末情報らしい。

最初はUnity内のメソッドで取れたりする情報なのかと思って
調べてみたらどうやら違っていて、iOS向けの広告SDK
リファレンスで見つけて、iOS側を調べたら発見。

使ったこと無いし、あんまりObjective-C使わないけど

struct utsname u;
uname(&u);
NSString *machine = [NSString stringWithCString:u.machine];

こんな感じで取れるっぽい。

最初サーバー側読んで、UA内に端末情報入ってないよねぇ…
とか思って首捻ってたんだけど、どうやらクライアント側で
取得したものをPOSTデータか何かに入れて、サーバ側で処理が正解。

割と新しいっぽいリストも見つけたのでリンク
List of iOS device codes types a.k.a. machine ids (e.g. iPhone1,1) and their matching product names · GitHub

うーむ、ネイティブ側の知識足らないっすなー
Unity使わずネイティブでゲーム以外のアプリ作ってみようかな