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

ぜんぶむきます

100万円上限でKyashリアルカードの再発行案内が来た

久しぶりに技術以外の記事。題名通り。

100万円って書いたけど14ヶ月弱メインカードとして使った結果なので
残念ながら日頃からすごい額の散財をしている訳ではない。(したい)

結論から

  • Kyashリアルカードにはいくつか制限がある
    • 1日の利用限度額5万円
    • 1ヶ月での利用限度額12万円
    • カード自体の利用限度額100万円
  • カード自体の利用限度額に達すると使えなくなるが再発行で対応
    • 自分の場合は90万使った時点でメールが来た
      • メールから再発行依頼が可能で一週間目処で届く
      • 届いた後にその旨返信するとそのタイミングでカードの切替処理が行われる
      • そのためいきなり使えなくなることはなさそう(その前にメール等で気づけば)

再発行の流れ

f:id:uskey:20190218190114p:plain:w500

こんな案内メールが来た。
リンクを踏むとtayoriという外部サービスのメールフォームに飛ばされて
そこで住所やらなにやらを入力すると再発行手続きは終わり。
(飛んだ先がkyash.tayori.comから始まるURLだったので、本物…?となった)

新しいリアルカードが届くのは一週間前後かかるとのこと。
新しいカード受領後に別メールに返信すると、新しい方がアクティブになるとのことなので
それまでは変わらず手元のリアルカードを使い続けられる。

これまで

Kyashを使い始めたのは2018年1月頃からで、最初は仲間内での割り勘などに利用していた。
他にもpaymoというサービスがあって、その時のメンバーに合わせて使い分けていたのだけど
Kyashが2018年6月に2%還元を開始した後はとりあえずネットでの支払いはほぼ全てKyashを通すようにした。

運良くリアルカードが初期に手に入ったため、飲み会での立て替えや普段の買い物などにも利用した結果
時々は月の上限額ギリギリになって、キャッシュバックがおいしい感じになった。

f:id:uskey:20190218190733p:plain:w300
(おいしい様子)

2%還元キャンペーン以降は周囲の人も積極的にKyashを使うようになったので
現金しか使えないようなお店でも、後でKyashで回収みたいな事ができて
物理通貨をやりとりする煩わしさから解放されてかなり楽になった。

Kyash残高が残っているときは優先的にそちらから利用されるのも透過的でかなり使い勝手がいい。
Amazonだったり、近所の薬局やスーパーでKyashを利用するだけで勝手に残高から利用されるので
その体験に慣れてからはKyashに残高がいくら残っているか気にしなくなった。

アカウント凍結問題

あんまり手放しで称賛しまくるのもフェアじゃない(感じがする)ので
一度アカウントが凍結されてしまったことがあったのでその件も載せる。

理由はクレジットカードを変更した際に、名前のスペルが違っていたため(多分)。
片一方は母音を重ねたスペルで、もう一方は一つだけみたいなスペルの違い。

変更後に無事アカウントが凍結されてしまった。

こちらもエンジニアなので「あ〜なるほどですね〜」という気持ちになりながら
想定される理由とかをずらっと書いてサポートにメールを送って祈った。


(凍結してあわあわする様子)

やっぱり決済系サービスは分散させとかないとダメか…
と傷心していたところ翌日には解除されてファンになる私(ちょろい)

当時Kyash自体まだすごい大きい組織ではないと記憶していたけど
休日で解決まで24時間かからないのは、中の人すげーなと普通に感動してしまった。

リスク管理の記事とかで『ピンチをチャンスに』とか書いてあると
いや普通にピンチはピンチだろ正気か?とか思ってたけど
この件の対応である種の安心感とか信頼を持ってしまったので不覚にも腹落ちしてしまった。

運営のみなさんへ

Kyashいつもとても便利に使っています!ありがとうございます!
39円送る時に出る隠しアニメーションもかなりイケてるので
自分の携わるプロダクトのどこかでそういう遊び心を入れたいなって思ってます。

今後もガンガン使っていきたいので引き続きよろしくおねがいします。

Qiita/Qiita:Teamの投稿を一括置換するツールをGoで作った

経緯

社で運用している複数のQiita:Teamを統合することになった。
統合にあたり、投稿やプロジェクト自体は問題なく移行できるが記事内のURL参照は自動で置換されないことがわかった。

そのままだと他の投稿への参照が切れてしまうので修正が必要だが膨大な量の投稿を手動でやるのは面倒、というか無理。

作った

github.com

Qiita, Qiita:Teamのトークン、置換前文字列、置換後文字列、所属Qiita:Teamドメインを設定すると
これまで自分が書いた全ての投稿の本文内の文字列を置換する。

試したけどできなかったこと

管理者アカウントでの全ユーザー全投稿の一括置換。作業工数的には一番これが理想だったけど無理そう。
もしかするとAPIドキュメントで見落としがあるかもしれないけど、見つけられなかった。

実装メモ

  • github管理しているプロジェクトは、$GOPATH/src/github.com/{user}/{repo}として置いた方がよい
    • 更新かけるたびに毎回 go getするハメになって何かおかしいと気づく
      • これまでプロジェクト内で他のパッケージを作ったことがなかった
  • Goをすごい便利でモダンなBetter Cと思ってたのでAPIアクセス大変そうに思ってたけどそうでもなかった
    • リクエスト/レスポンスの定義はAPIリファレンスのサンプルオブジェクトをjson-to-goに貼って終わり
      • 便利!!!
  • type hogehoge []structで定義した型の要素でハマった。具体的にはトップレベルが配列のjson
    • hogehogeをパースした後別メソッドにhogehoge[0]を渡したいときどうすれば…
      • 配列を内包するオブジェクトを作ってそれをUnmarshalした
      • 言語仕様をふわっとしか理解してない弊害が
  • Qiita API v2の PATCH /api/v2/items/:item_idでハマる
    • エラーメッセージは特になくて、"forbidden"みたいなログしか出ない
    • 記事によってtagがある無しでハマってた…?更新対象をtitleとbodyだけにすると解決。

オチ

統合後、Qiita記事同士のリンクはいい感じに対応されていて必要なかった。無念。
それはそうだよね…

どこかで使うことがあれば使おうと思う。多分ない。

はじめてOSSにコントリビュートした

概要

github.com

上記のリポジトリに出したPullRequestが2つマージされた。
仕事でも使っていたライブラリなのでうれしい!

行った変更

  • テスト設定の変更
  • 依存するライブラリの更新

テスト設定の変更

この変更を入れる前はテストコードの一部がシステムのロケーションに依存していて
いわゆるen_USの環境でないシステム上だとmvn testに失敗するケースのある状態になっていた。

原因はxls(xlsx)ファイルのセル内にある日付形式の文字列 aa/bb/cc を読み込む際に
mm/dd/yyとするか、dd/mm/yyと解釈するかの基準が明示的に指定されていないためだった。

最初にチェックアウトしてまずテストを試した時に、日付文字列の読み込みテストで失敗してしまっていたので
多分ロケーション周りだろうと思って、Macの言語設定やタイムゾーンを色々試して通るようになったのを確認後に
mvn testJVMのパラメータを渡すにはどうすれば良いんだっけという点を調査して対応した。

知らなかったけど、maven-surefire-pluginというものがあるらしい。

https://github.com/takezoe/xlsbeans/pull/12

理由に気がつくと確かに理屈はわかるんだけど、自国以外で動作するようなコードであって
かつ言語設定が絡むようなものを実装したことがなかったので、色々調べながら対応していて勉強になった。

依存するライブラリの更新

こっちが最初解決しようとしていた問題。いわゆるJar地獄問題で
依存するライブラリが別バージョンの同じライブラリを参照していると
不幸な問題が発生することがまれによくある

今回のケースでは内部的に利用しているjavassistのバージョンに問題があった

$ mvn dependency:tree
~略~
[INFO] com.github.takezoe:xlsbeans:jar:1.2.6
[INFO] +- net.sourceforge.jexcelapi:jxl:jar:2.6.12:compile
[INFO] |  \- log4j:log4j:jar:1.2.14:compile
[INFO] +- org.apache.poi:poi:jar:3.6:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1:runtime
[INFO] |     +- logkit:logkit:jar:1.0.1:runtime
[INFO] |     +- avalon-framework:avalon-framework:jar:4.1.3:runtime
[INFO] |     \- javax.servlet:servlet-api:jar:2.3:runtime
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile
[INFO] |  +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile
[INFO] |  |  +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] |  |  |  \- stax:stax-api:jar:1.0.1:compile
[INFO] |  |  \- org.apache.geronimo.specs:geronimo-stax-api_1.0_spec:jar:1.0:compile
[INFO] |  \- dom4j:dom4j:jar:1.6.1:compile
[INFO] |     \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] +- ognl:ognl:jar:3.0.2:compile
[INFO] |  \- javassist:javassist:jar:3.11.0.GA:compile <=ココ
[INFO] \- junit:junit:jar:3.8.1:test

詳しくはPullRequestに記載しているけど、あるバージョン以下のjavassistの機能(?)をJDK8で利用すると
java.io.IOException: invalid constant type: 18というエラーを吐いて死ぬという問題がある。

https://github.com/takezoe/xlsbeans/pull/10

もちろんプロジェクト依存関係の設定側で特定バージョンの使用を強制させるワークアラウンドもあるけど
依存しているライブラリのAPIの互換性に問題がなければ、より色々なバージョンで動作した方がよいでしょう
ということで、古いjavassistを参照しないよう、ognlのバージョンを上げた差分を作ってPullRequestを出した。

オチ

両方調べて解決するのに4時間くらいかかったんだけど実際の差分はpom.xmlの数行だけ。
次回はソース部分の修正で貢献できるようにがんばります。

f:id:uskey:20190211163856p:plain:w400

Mac環境 再構築用メモ

いつも使ってるマシンが急に死んだりしたときリカバリ手順が無いと詰んでしまうので整理。
両方のマシンが生きていて、移行するならツールなりなんなりを使ったほうが良さそう。

優先度をつけて一時的な環境として割り切って使うならフルで実施しなくても大丈夫だった。

普段からやっておくこと

やってないと飛んだ時に詰むので注意する。

  • 鍵ファイルやhome/.*に配置されているファイルのバックアップ
  • ネットワーク設定の把握()

導入するもの

意外といろいろ使ってたので列挙

Chrome

www.google.com

初期ブラウザは普段遣いブラウザを入れるためにある。
ログインするとブックマーク、拡張機能やパスワード管理が使えるので
人によってはこれだけで一通りの環境が戻ってくるかもしれない。

入力関連

  • karabiner-elements

pqrs.org

普段JISキーボード使いなので左CapsLockを潰してControlにするくらいしかしてない。
USキーボードを使うことになったときは、最下段を大胆に変えて対応する。
記号キー周りは使ってるうちに思い出すのでメイン部分はほぼ変えない。

f:id:uskey:20190120081723p:plain:w500
US→嘘JISへのバインディングの様子

www.google.co.jp

システム環境設定>キーボード>入力ソースからデフォルトの設定を外す。

コミュニケーションツール

  • Slack

slack.com

複数ワークスペースに入っている人は個別にドメインを入れて参加するより
メールアドレスから所属済みワークスペースを検索した方が早い。

https://slack.com/get-started#find

  • LINE

開発ツール

  • Git Kraken

www.gitkraken.com

Gitクライアント。イカがかわいいのと体感でSourceTreeより軽い。

  • SDKMAN

sdkman.io

JVM系は一通りこれで入りそう。
メイン言語JavaなのでJavaとGradleなどを導入。

www.jetbrains.com

  • Docker

docs.docker.com

  • Postman

www.getpostman.com

  • iTerm2

www.iterm2.com

その他

  • Inkdrop

inkdrop.app

ノートアプリ。
日々の記録とかいろいろなメモは一旦放り込んで後からタグ付けして整理している。便利。

思い出したら追記する。

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

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