Amazon注文履歴で振り返る2018とご挨拶

はじめまして、この記事は ねおりん Advent Calendar 2018 の14日目の記事です。
前日は @rk_102 さんの ねおりんとフレンズに送る個人的今年良かったもの でした。ガンスリンガーガールが気になったので買いました!!!!!!!!!!!!!

ねおりんさんは前職のパイセンである @anochick 氏の元同僚で重度の小倉唯オタクでオタクってことしかしりません。やがて君になるは良いです。

今年買ってよかったものの話をしようとしたんですが、年々増えつつあるAmazonの購入履歴で1年を振り返るやつをやります。 今まで

f:id:miyachik:20181213134549p:plain f:id:miyachik:20181213134607p:plain f:id:miyachik:20181213134942p:plain

この購入数は記事制作時点だったので、 @rk_102 さんの記事を見て買ったガンスリンガーガールがプラスされてしまいました。

1~4月

f:id:miyachik:20181213135232p:plain

漫画ばっかり買っていた、というか年々Amazon購入量が増えているのも単純に漫画を買いすぎているフシがあるだけかもしれない。

はよかった、3巻完結で今年の夏に終わってしまったのがさみしい。

ねねね (ガンガンコミックス)

ねねね (ガンガンコミックス)

ねねね、もよかった。ただいろんな問題がありそうでなかなか2巻がでない。

あとはムダヅモ無き改革が16巻まとめ買い75円みたいなセールがやっていて釣られていた。ちゃんと読んだ。面白かった。
特にセールはやってなかったみたいだけどゆるキャンもまとめ買いしていた。

あとはなにあらしはなにあらしは良い。良い。

5~9月

f:id:miyachik:20181213194804p:plain

キーボードを作った。分離キーボードが流行っていて、興味があったのでBOOTHで Ergo42の基盤とケースを買って作った。

【販売終了】Ergo42 キーボードキット - たのしい人生(別館) - BOOTH

今Ergo42を買うならErgo42 Towelがおすすめみたいです。

Ergo42 Towel(フルセット/基本セット) - たのしい人生(別館) - BOOTH

最初は全然慣れなかったんだけど、キーボードが真正面になければいけないという常識がなくなるので良い。
f:id:miyachik:20181213200006p:plain

トニカクカワイイが良かったのでギフトで何人かにテロしたりした。

f:id:miyachik:20181213200219p:plain

GoogleHomeMiniで「おっけーぐーぐる電気をつけて!」したかったのに家の電気が蛍光灯でつきそうになかったのでスタンドを買って実現した。

10~12月

f:id:miyachik:20181213201405p:plain

42.5inch 4K Monitorを買った。お家QoLを上げるのがすごい好きで、できる限り家にいたい。残念ながら現職はリモートワークの制度がないので泣きながら出社している。
土日は大体PCの前に張り付いているので、良さを享受できる時間が長く非常に良い。
圧倒的に画面おっきいしDot単位で考えたらコスパめっちゃ良かったんじゃない!?って考えたんですが、そんなことはありませんでした。残念。比較対象の21.5inch Monitor

irb(main):002:0> 11980.0 / (1920 * 1080)
=> 0.005777391975308642
irb(main):003:0> 54980.0 / (3840 * 2160)
=> 0.006628568672839506

まとめ

来年もいっぱいお買い物したい。

ご挨拶

よろしくおねがいします。

明日は shelf703 さんです 🐈💨💨💨

合宿して開発

開発合宿

にいきました、3週間前に。
場所は湯河原のおんやど恵
開発合宿プランがあってBlogを書くと料金が半額になるプランがあって有名なところ、これを使った。
開発合宿モニタープラン
メンバーはhiragramチームのなかまたち hiragr.am

すすめかた

Kibelaでしおりをつくってもらっていた、持ち物からタイムスケジュールとお昼のお店まで書いてあってとても便利だった。 困ったらここを見る的なところを作っておくと捗る。

hiragram.kibe.la

ChatはSlackに#gassuku Channel作ってやっていた。がっすく。

宿代とかでかめのお金だけ現金で払ってタクシーとか電車とかご飯のお金はKyashでやった。Kyash便利最高、現金で集金してくる飲み会に行きたくない。

ウォレットアプリ Kyash - いつものお支払いを2%お得に

やったこと

WKWebViewで遊んでた。成果物は別途書く(かも)
業務ではRailsJavaScriptしか書いていないので、新鮮
学べたこととして、JSからNativeの処理を呼び出したいときはpostMessageみたいな要領でいける。
WKUserScript作って、WKWebViewに突っ込むだけでできる。
ちょっと詰まったところとして、WKUserScriptを生成するときにいつJSを実行するかのinjectionTimeを指定できるんですがどうも想定どおりにうまくうごかず、.atDocumentEndを指定してもJS実行時にまだDOMができてない、みたいなことがあったので、JS側で頑張るようにした。
https://developer.apple.com/documentation/webkit/wkuserscript/1537750-init

// 差し込みたいJS
let path = Bundle.main.path(forResource: "main", ofType: "js")!
if let data = NSData(contentsOfFile: path){
    script = String(NSString(data: data as Data, encoding: String.Encoding.utf8.rawValue)!)
}
let userScript = WKUserScript(source: script, injectionTime: .atDocumentEnd, forMainFrameOnly: true)        
let controller = WKUserContentController()
controller.addUserScript(userScript)
// callbackHandlerに対してpostMessageをするので、JavaScriptはcallback名を知っている必要がある
controller.add(self, name: "callbackHandler")

let configuration = WKWebViewConfiguration()
configuration.userContentController = controller
self.webView = WKWebView(frame: view.bounds, configuration: configuration)

JS側で取れるまで回してclearIntervalした(本当はもうちょっとちゃんとやるべき)
.atDocumentEndDOMContentLoaded相当で onloadじゃない?のかな(?)
もちろん DOMContentLoadedで書き出されるであろう値に関しては問題ないんですが最近のSPA的にJSがDOMをRenderingしていく場合だと気にする必要がありそう。
なので下記Sampleだとtitleタグを取ってるだけなので再現はしません。

// main.js
var callback = function(){
    var ele =document.querySelector("title")
    webkit.messageHandlers.callbackHandler.postMessage(ele[0].text);
    clearInterval(setIntervalId);
}
var setIntervalId = setInterval(callback, 1000)

感想

今回のメンバーはみんな得意分野(Swiftマン、美味しいお店、オタク)が違う人がいて、雑に質問とかを投げあえてる感じがよかった。
Swift周りで詰まってて古い情報見て悩んでたりしたのを教えてくれたりしたのでいっぱいSwiftできたのがよかった。合宿後もちょくちょく進めている。
旅館の真隣にローソンができていてよかった(ちょっと前にできたらしい)

夜中足湯コーディング、ふやける

会議室広くてよかったので、また行ったりしたい。

AppleEvent 2018めも

TL;DR

  • AppleWatch Series4
    • 画面がちょっと大きくなって
    • 電気センサーが増えて心電図が取れるようになった
    • バンドに互換性アリ
    • series4$399,cellular $499
    • series3を$279に値下げ
    • 9/14 予約、9/21 発売
    • WatchOS 5は9/17
  • iPhone XS
    • 基本的にはXからチップ向上、DSDS対応ぐらい
    • 二枚目のSIMはe-SIMで対応キャリアに日本がなさそう
    • 中国モデルはSIMスロット2個あるらしく、日本でもこっち売れ
    • XS $999, 9/21
    • XS Max $1099, 9/21
  • iPhoneXR
    • 液晶版iPhoneX(3DTouchなし)って感じ、発売がちょっと遅い
    • $749, 10/19 予約, 10/26発売

OP茶番

ミッションインポッシブル(はい)

AppleWatch

  • SmartWatchという新ジャンル
  • watchFace
  • 表示サイズが30%ぐらい向上
  • 40mmと44mm
  • スピーカー音量でかくなったりマイクの位置が変わって反応よくなったりしたらしい
  • チップも向上(S4)
  • 転倒検知もできるようになった(難しいらしい)
    • 単純に腕を下げた場合と落ちた場合の区別とか
    • 検知後1分間動かないと緊急連絡先に連絡、とかするらしい(ぶっ倒れた用?)

f:id:miyachik:20180913040848p:plain

  • ノギスの物理フィードバック(アプリ選択とか)
  • 低心拍の警告
  • 心電図(電気センサーの搭載)
    • 初の一般向け?心電図搭載家電みたいなことも言ってた
    • 米食品医薬品局(FDA)の認可済(ちゃんとしてるよアピール)
  • 遠隔転送は後日
  • 連続駆動は18時間
  • GPSonは6時間
  • バンドに互換性アリ
  • series4$399,cellular $499
  • series3を$279に値下げ
  • 9/14から予約9/21から発売
  • WatchOS 5は9/17

iPhoneXS

  • 防水性能IP68(水深2mに30分をクリア)
  • ゴールド、シルバー、スペースグレイ
  • 2688x1242ピクセル、330万画素、458ppi
  • 6.5inchのXS-Max
  • Face ID 強化
  • A12 bionic(4 core GPU,6 core CPU, 8 core NeuralEngine)
  • 512GB(!)
  • iPhoneXより30分XSMaxは90分バッテリーが持つ
  • 撮影後に被写界深度の変更(背景ボケの調節)、すごい
  • Dual SIM(eSIM(日本はなさそう))
    • 中国はeSIMが使えないので物理的にSIMが二枚刺さる
  • XS $999, 9/21
  • XS Max $1099, 9/21

    iPhoneXR

  • 白、黒、黄、ネイビーブルー、オレンジ、赤
  • LiquidRetinaDisplay
    • 有機ELじゃなくて液晶らしい
    • 120Hz
    • 3DTouchはなし
  • XSと同じA12 bionic
  • 有機ELじゃない廉価版iPhoneXSみたいな位置?
  • 5Cほど機能差はないんだけど、液晶で差をつけて価格低下って感じ
  • 64 128 256GB
  • $749, 10/19 予約, 10/26~

他OS

WatchOS 5

  • 9/17

    iOS12

  • 9/17

    Mojave

  • 9/24

その他

Xs,Xrとか全部大文字らしい(Storeの正式表記) Mac Mini,ベゼルレスiPadPro、AirPowerの行方や如何に...! 僕は初めてWatchだけ買うかもしれない 一覧から消えるiPhoneXの図 f:id:miyachik:20180913040942p:plain

WWDC 2018 メモ

ARKit2

  • AR空間共有が提供されて楽になるらしい
  • ゲーム企業じゃないんだからゲームのデモはほどほどにしてほしい。ARすげー!!!!!!!!!は初回だけ

Photo

  • iCloudPhotoLibraryでアルバムの共有ができるらしい
  • 顔認識で人と結びつけて共有提案など

Siri

iOS12

  • dnd(通知なしモード)、良い
  • Memoji(どうでもいい)
  • facetimeで32人同時通話
    • Animojiも使える
    • すごい部分は多いんだけど既存は食えると思わないし32人同時通話で拍手が起こるのは2013年ぐらいまでにしてほしい

~~ この辺から飽きてくるのでレポートが雑になる ~~

WatchOS

tvOS

MacOS

  • もはべ(Mojave)
  • スクリーンショットのとり方がiOSによって即時編集できるとか
  • Finder強化とか
  • ちらっとITP強化っぽい話があって気になっている
    • alert出さないとトラッキング系の広告でないみたいな
    • StorageAccessAPI系なのかは不明
  • Fingerprint
    • Webサイトを閲覧するとき、設定、Fonts、Pluginsなどでサイト間のトラッキングに利用される

CreateML

iOS12 Safari

ここ数年で一番悲しかった(当社比) 欲しいものがないのでViveProのフルセット在庫を探しています。

ブックマークレットを書こうとしたらShadow DOMでちょっと躓いた話

あけましておめでとうございます

まず

僕はあまりブックマークを使用せず、履歴だけで生きるようにしています。
特に強い理由はないんですが、Chromeのアドレスバーが優秀なのでマウスでブックマークを探すより cmd + L でアドレスを打ったほうが早いから、ぐらいです。

困ったこと

そういう生活をしていると、履歴を整理する必要が出てきます。
例えば、同じ系列のツールを使っていて乗り換えたりしてもう滅多に使わなくなったサイトの履歴が残り続けていると、常にそれがアドレスバーの優先度高で補完に出てきてしまい、わりとフラストレーションが溜まります。
かといって、履歴を全消ししてしまうとその日のパフォーマンスが1/3ぐらいになってしまうので、特定のドメイン配下の履歴だけいい感じに消したくなります。
なので、ブックマークレット(JavaScript snippet)を書きました。

できたもの

実行ページはここ chrome://history/

infiniteList = document.querySelector("#history-app::shadow > #main-container #content #history::shadow > #infinite-list");
historyItems = infiniteList.getElementsByTagName("history-item");
for(let ele of historyItems){
    if (!ele.hidden) ele.querySelector("::shadow > #main-container #checkbox").click()
}

これで基本的に40件ぐらいチェックされるので、あとは一回消してもう一回実行して、みたいなことをしないといけない。 scrollを含めてやれば全部自動でできそうなんだけど、ShadowDOM内部の更新タイミングみたいなのが順当になっていなくて綺麗にできそうになかったので諦めた。

解説

基本的にChromeの履歴ページはShadowDomのネストになっており、ReactのComponent単位でShadowRootオブジェクトが挟まっているような形になっています。 そして、ShadowRootを挟む際にはselectorに ::shadow > をつけて掘っていきます。

<body>
  <div id="main-container">
    #shadow-root
      <div id="shadow-item"></div>
  </div>
</body>

に対して

// これは何もhitせず
document.querySelector( "#shadow-item" );
// shadow-rootを掘る必要がある
document.querySelector( "#main-container::shadow > #shadow-item" );

です。 ページ内にあるチェックボックスを全部つけるぐらい楽だろうと思って軽い気持ちで書き始めたら意外に詰まってしょげでした。
あとは、とりあえずガッとComponentを出して、Listの中身が2件でも他のListをhiddenにしているだけのようで?表示されているかどうかを見ないと無を選択してしまいこのようになってしまうので注意が必要でした。

f:id:miyachik:20180206203114p:plain

こんなことするならちまちまボタン押したほうが早くない?

はい

アイマスハッカソンに参加した話と安部菜々

この記事はアイドルマスターアドベントカレンダーの18日目の記事です。
前日はtwoterabytesさんで安部菜々にすくわれたかもしれない話です。
うさみんかわいいですよね。今は恒常うさみんがたのしみ。できればスカチケの直前でお願い致します。

アイマスハッカソン

アイマスハッカソンというイベントの第二回が開催されました。
アイマスハッカソンについては以下を参照ください。

github.com

主な目的は

アイドルを愛でる。アイマスに貢献(Contribute)する。  

アイマスの二次創作界隈において、歌姫庭園とかミリフェスとかミリオンリーとかニコ動とかTwitterとかいろいろあるけれど、エンジニアを主な対象とした時にこれという機会がありません。  

これはアイマス界の損失だ!と思い、企画してみました。エンジニアだって、なんかやりたい。  

で、副業でエンジニアっぽいことをしてる人たちが一度に集まって面白そうなナニカを作って盛り上がろうぜというイベントです。今回で第二回を迎えました。

アイマスハッカソン2017

今回はなんと"やよい"つながりということで弥生株式会社 様、懇親会スポンサーに株式会社grooves 様がついてくれました。

imas.connpass.com

こういう趣味系ハッカソンにスポンサー様がついてくれるのはすごくありがたいですね!!!!!!!!!!!!最高です!!!!!!!!!!!

成果物

前回は公式の4コマであるアイドルマスターシンデレラガールズ劇場をいい感じに分割する、miyachik/deregeki-divider を作りました。
今回は、分割したコマをいい感じに感情分類してtwitterのリプライやチャットツールに貼り付けてコミュニケーションを取るために必要な、感情分類をするためのWebAppを作りました。
スライドにも書きましたが、感情分類を適当なAPIに投げてできないかやってみたらアニメ画像なので無のResponseが帰ってきてかなしくなったりしていました。(当たり前)
結構気にはなっていたActiveStorageをいじれる機会にもなったり、趣味とエンジニアリングがいい感じに交差して充実していました。

speakerdeck.com

配信アーカイブもあるよ!

www.youtube.com

雑感

今回は約30人ほどの人数が集まり、個人やチームで開発を行いました。改めて運営の方々には感謝です...!
各チームいろいろな得意分野を持っていて、JavaScriptでぱぱっとゲームを作る人や、Unity使ってARする人、AppleWatchいじり倒す人や形態素解析の話をしまくる人など、本当に色々な発表があってよかったです
次回は3/10にアイマスハッカソン2017 in Osakaが開催決定しているとのことで、お近くの方はぜひ参加してみてください!

Golangでどこでもtwitterできるbinaryをつくる

2018/02/08 追記

記事中で紹介していたgo-bindataの作者がgithubアカウントを削除し、そのアカウントを別の誰かが取得したそうです。

善意でこの行為を行っているとは考えにくいので、go get -u github.com/jteeuwen/go-bindata/...は行うべきではないです。 記事執筆時点では、有志の方がforkしてくれているので、そちらを参照するのが良さそうです(mattnさんありがとうございます)

github.com

ドリコムアドベントカレンダー16日目

ドリコム Advent Calendar 2017 この記事はドリコムアドベントカレンダー の16日目です。
前日はgremitoさんの「オレオレDockerfileを作って、サーバーサイドの開発をやっている話。」です。

あなたは誰

先月ドリコム社に中途入社したid:miyachik です。サーバーサイド側のコード書いている人です。
主にRailsを書いて、たまにJavaScriptGolangをさわったりするぐらい。

twitterの話

みなさんtwitterしてますよね。昼夜問わず変な人がいっぱいいてとても有意義で無意義です。
そして、みなさん(おそらく)エンジニアだと思うので、terminal上でコマンドを叩いたときに、よくわからんエラーを吐いてエラったときの鬱憤をネットの海に叫びたい気持ちが多々あると思います。僕はあります。

gotwi

そんな衝動を解決するために、miyachik/gotwi というものを先日リリースしました。

github.com

いわゆるGo製のCLItwitterクライアントなんですが、現状だとつぶやことしかできません。(というかユースケースがそれしかありません)
プログラムを書いていて適当に愚痴りたいときに、ブラウザやクライアントに戻って呟いたりしちゃうと、うっかり変なつぶやきが目に止まって時間を取られてしまったりしまいがちですよね。
そんな人のために求められているのが、このgotwiです。つぶやく機能しかありません。(replyのshowぐらいは実装予定)
terminal上で動作できて、クロスコンパイル可能なのでどこにでもbinaryを配布することができます。
以前も似たようなCLIクライアントをThorを使ってRubyで実装していたのですが、アクセストークンの扱いや、成果物のポータビリティがいまいちだったりで、そのコードを書いたPC上ぐらいでしか使用していませんでした。
ところが、Goで書いたことによってアクセストークンをgo-bindataで埋め込みつつ、任意環境で実行可能なbinaryに吐き出すことが可能になったので、個人持ちのPCから任意のEC2、どこでも簡単に動かすことができます。
今回はその中でも便利だったgo-bindataを使った話をしたいと思います。

go-bindata

go-bindataは、任意のdataをビルドして、dataをbinaryに変換しGoのコードに埋め込みアクセスできるようなgoのソースを生成してくれるライブラリです。

Install

% go get -u github.com/mattn/go-bindata/...
% go-bindata -h

で、問題なければgo-bindataコマンドが使えるようになっています。

Build

以下のディレクトリ構成で作業をするとして

├── Makefile
├── README.md
├── main.go
├── settings.local.toml
└── settings.sample.toml

このsettings.local.tomlをbuildするbinaryに含めることによってアクセストークンなどの秘匿情報を実行binaryに含めてしまうことができます。
今回はtwitterAccess Tokenが必要になるので、下記を参考に自分のAccess Tokenを取得するようにしてください。(2017年12月時点)

Access tokens from apps.twitter.com — Twitter Developers

.tomlとは、yamlのような設定記述言語で、yamlより色々とシンプルな点や、Goのサポートが厚いことからよくGo界隈では使われています。

github.com

# settings.local.toml
ConsumerKey="YOUR TWITTER_CONSUMER_KEY"
ConsumerSecret="YOUR TWITTER_CONSUMER_SECRET"
AccessToken="YOUR TWITTER_ACCESS_TOKEN"
AccessSecret="YOUR TWITTER_ACCESS_SECRET"

これを

% go-bindata settings.local.toml

とすることで、settings.local.tomlの中身が圧縮してbinaryに変換され、アクセス可能なメソッドの生えているbindata.goが生成されていると思います。
あとは、以下のように、Asset("#{ファイル名}")とすることで、binaryに埋め込んだ文字列やその他のリソースを読み込むことが可能です。

func main() {
    data, err := Asset("settings.local.toml")
    if err != nil {
        panic(err)
    }
    fmt.Print(string(data))
}

debug時などに注意が必要なのは、data本体はbindata.goに含まれているので、実行時にbindata.goを含める必要があります。

% go run main.go bindata.go
ConsumerKey="YOUR TWITTER_CONSUMER_KEY"
ConsumerSecret="YOUR TWITTER_CONSUMER_SECRET"
AccessToken="YOUR TWITTER_ACCESS_TOKEN"
AccessSecret="YOUR TWITTER_ACCESS_SECRET"

gotwiでは、このようにしてアクセストークンなどをbinaryに埋め込んでいるので、あとは任意の環境にビルドしたbinaryを、実行したいサーバーに配置することで、どこでも実行することが可能になります。

gotwiのクロスコンパイル

様々な環境で動かすためには、build時に$GOOS,$GOARCHを指定する必要があります。
環境変数に指定できるものは下記を参考にしてください。

Installing Go from source - The Go Programming Language

指定なしでbuildをした場合は、build時の環境が参照されるようになります。
例えば、Linuxamd64な環境へのbuildは以下のようになります。

% GOOS=linux GOARCH=arm64 go build main.go bindata.go
=> 直下に gotwi が生成される
% ./gotwi "Hello!"
=> "Hello!"が投稿

その他にも、build時には任意のオプションをつけられるので、公式のドキュメントを参照すると良いです。

go - The Go Programming Language

注意点

  • このbinaryが流出してしまうと、それこそ誰でもアクセストークンの所有者として呟けてしまうので、管理には気をつけてください。
  • go-bindataでビルドしたbindata.goの時点では、Goのソースに圧縮されたbyte列が入っているだけなので、ちょっと頑張ればアクセストークンを復号できるんじゃないかと思います(それこそ無圧縮とかにすると簡単に)。なので.gitignoreしましょう。

まとめ

  • どこでも実行可能な自分が呟けるbinaryを吐き出せる、gotwiを作りました。
  • 使い始めて一ヶ月くらいですが、なかなか快適です。クロスコンパイル可能なbinaryを吐き出せるGoは雑なCLIツールを作るのに非常に良い
  • AWS LambdaのGoサポート の話もありますし、Golangは良い
  • twitterはほどほどに

明日は hayabusa333 さんの「Elixir環境構築にて暗号化でエラーにならないために」です。