macOS Mojaveが最高なんだけど、もっと最高になるアプリ Gray のご紹介

macOSを使用している皆さん、Mojave最高ですよね?

Mojaveにまだアップデートできてない方、ぜひアップデートしましょう
アップデートして1週間立ちましたが、開発環境面で問題は起こっていません

ですが、1点だけ、どうしても気になることがある

Dark appearance最高なんです
最高なんですけど、これアプリケーション毎に切り替えるGUIがないんです
アプリケーションによってDarkは見づらかったり、Safariは通常のブラウザとプライベートブラウザの目視区別がしづらい...

f:id:yutailang0119:20181012145237p:plain
左: 通常、右: プライベート

そんなあなたに朗報です

github.com

ポチポチするだけで、アプリケーション毎にAppearanceが切り替わります

SafariだけLightにしたりできる

f:id:yutailang0119:20181012145511p:plain
左: 通常、右: プライベート

インストール

https://github.com/zenangst/Gray#gray の下のリンクを押すと、ビルド済みのアプリがダウンロードできます
コードを読むと、アップデート確認も実装されてた

内部でやっていること

READMEに書いてあります https://github.com/zenangst/Gray#how-it-works
macOSにはアプリケーション毎の設定ファイルがあって、これを defaults というコマンドで書き換えることができます

$ defaults write com.apple.dt.Xcode NSRequiresAquaSystemAppearance -bool YES

その設定ファイルの NSRequiresAquaSystemAppearance をポチポチtoggleするだけ

一度設定すれば、再起動しても、Grayを削除してしまっても大丈夫
でも、できれば消さないでねとのこと

So when you are done configuring, you can toss Gray in the trash if you like (I hope you don't :) )

注意点

1. Grayで一度Appearance変更をすると、Systemに揃える設定に戻すことが、GUI上からはできなくなります

そんな時は、ターミナルで、

$ defaults read 

と入力して、タブを押しながら、戻したいアプリを探します
アプリが見つかったら、

$ defaults read com.apple.SafariTechnologyPreview(ここがアプリ名) NSRequiresAquaSystemAppearance

とかとすると 0 or 1 と表示されるかと思います
表示されたら、再度ターミナルで、

$ defaults delete com.apple.SafariTechnologyPreview(ここがアプリ名) NSRequiresAquaSystemAppearance

確認すると

$ defaults read com.apple.SafariTechnologyPreview(ここがアプリ名) NSRequiresAquaSystemAppearance
The domain/default pair of (/Users/yutailang0119/Library/Containers/com.apple.SafariTechnologyPreview/Data/Library/Preferences/com.apple.SafariTechnologyPreview, NSRequiresAquaSystemAppearance) does not exist

とエラーになっていれば、成功です
もう一度Grayを開き直すと、Systemになっているはず

2. Mail、Messages、Safari、Homeのようなアプリは、Full Disk Accessパーミッションが必要

ボクは許可していません
「最初のSafariのプライベートブラウザの話どこいった」と思われるかと思いますが、普段 SafariのTechnology Preview版を使っていて、これはFull Disk Accessを要求しません
便利ですね

@_monoさんのツイートで知りました

活発に開発されていそうなので、watchしていきたいですね

ProgressSpinnerKitというSwift CLI用ライブラリを作った

github.com

発端

yutailang0119.hatenablog.com

というエントリで xcopen というCLIツールを作っている話をしたが、Swift製CLI向けのライブラリに、いわゆるSpinnerがなく、困っていた

swift-package-manager/Utilityには ProgressBarは存在するが、パーセンテージ表示で、開始時点で終了状態がわからないタスクには使えない。

無いなら作ろうということで作った。

使い方

READMEを読んでもらえればわかると思うが、

  • ProgressSpinnerKit.createProgressSpinner(forStream: _, header: _) で初期化
  • start()
  • stop()

という、極めてシンプルな作りにした。

Demoも用意したので、ぜひ手元でも実行してみて頂きたい。

f:id:yutailang0119:20180917022559g:plain
Demo

まとめ

少し前に完成していたのだが、iOSDCの登壇タイミングで公開にしようと思い、温めていた。
そのかいあって、すでに25starついていて、自分としては嬉しい限りである。

自分のようにSwiftでCLIツールを作りたいというような奇特な方向けだが、ぜひ使ってみてフィードバックがほしい。

ということで、あまり言わないが、スターください。

github.com

niwatakoがはてなを旅立つことに寄せて #niwatako追悼式典

niwatako.hatenablog.jp

取り留めのない文章。
いつか自分で思い返す時、何かの折に懐かしめるように書き留めておくこととする。
特に自分や id:niwatako、2人を知らない人に読んでもらおうと思った文章ではないことを、前置きしておく。

本当は彼が東京勤務になった時に、このエントリの草稿は書いていたのだけど、公開するタイミングを逃し、他人の目に触れることはなかったので、改めて書き直した。

発端

はてなに入社して3ヶ月ほど経ったある日、 id:niwatako が東京オフィスに異動となると周知された。
いつかは東京勤務にしたいと聞いていたし、なんとなくその内そうなるだろうと思っていた。
そして、7月中旬の夜中のDMで、退職の運びとなったことを聞いた。
彼がすぐにでもブロックチェーンをやりたいと常々聞いていたので、この退職が会社に対するネガティブなものではないことは理解できた。

思うところ

社内外で、「(自分を誘ってきた) id:niwatakoさんの退職、 id:yutailang0119さんは、どう思ってるの?」と聞かれることがある。
「京都で金が回らなくなり、実家に帰ってきた29歳になる息子をどう思っているのか気になる。」と返答している。
半分は本音だが、実際には思うところは多くある。

  • 彼が楽しそうに働くはてなに、少なからず魅力を感じたから入社した
  • 自分は関西に友達が少ないのに、さらに減る
  • もっと一緒に仕事をしたかったとも思う
    • 実際、一緒に作ったジャンプルーキー!は、今できうる最高の実装になったと思う
  • そりゃ、寂しいですよ

彼と初めて対面したのは、たぶんtry! Swift Tokyo 2017のハッカソンday後の有志打ち上げだったと思う。
仙禽 (🍶) を10合 (=1升) 注文し始めようとしたことが、記憶にある。
まさか、一緒に働くことになるとは思わなかったし、京都に住むことのハードルを下げたのは、 id:niwatako がいたからに他ならない。
自分の社会人人生の中でも、何度も2人で飲みに行ったり、泊めてもらったりしたのは、 id:niwatako だけだ。
あっちがどう思っているかはわからないが、親友と言っていいレベルだと思う。

会社には悪いが、自分は「転職が悪いことをしているような空気」がとても嫌いだ。

さいごに

いろいろ言ってきたが、id:niwatako にはこの挑戦をがんばってほしい。

直接、面と向かって言うのは憚れるので、こういう形にした。
思っていたよりも早くはあるが、また飲みに行きましょう。

id:yutailang0119 < 達者でな

iOSDC Japan 2018に登壇します #iosdc

f:id:yutailang0119:20180816015426p:plain

会社のdeveloperブログに書いた通りですが、登壇します。

developer.hatenastaff.com

weak vs unowned (LT)

  • id:yutailang0119
  • 2018/09/02 16:25〜 Track A(5分)
  • Swiftを扱う上で度々議論となるweakとunownedによるキャプチャ。「確実にクラッシュを防げるweakの方がよい」、「unownedの方がパフォーマンスが優位である」よく聞く意見ではありますが、それは本当なのでしょうか。なぜメモリリークが起こるのかを復習して、両者のメリット/デメリットを再整理し、実コードにおける使い分け方を考え直してみようと思います。

この時期、いろいろと思うところはあったものの、CfP出して、採択されたので、まずは1山超えた感じ。

ありがたいことに2年連続で、採択されました。

去年は「iOSDCだけではもったいない!iOSアプリケーションエンジニアの他言語コミュニティ生存戦略」と、直接的な技術ネタじゃなかったので、大人数の前で技術ネタ話すのは初めてです。

まだ準備を始めた段階ですが、5分間でいい感じにまとめたいと思います。

P.S.

その次の週はbuilderscon tokyo 2018 ということで、10日間ほど東京にいます。
忙しくはありますが、ぜひお誘いください。

株式会社はてなに入ってからの半年を振り返る

早いもので、先日の8/10で株式会社はてなに入社して半年が経った。
会社としても期の変わり目で、振り返りがあったので、それも踏まえて残しておく。
そして、忘れていたが、去年は突然にお盆休みが発生して、8/16にはてなの東京オフィスにお昼を食べに来てたらしい。

いろいろな縁が重なって入社した、はてなでの半年を振り返る。

入る時のエントリはこちら

yutailang0119.hatenablog.com

はてなでやってきたこと

ジャンプルーキー!

オファーをもらった段階で、マンガチームということは決まっていた。
平たく言うなら、受託サービスで、とても葛藤があったことを覚えている。
蓋を開けてみると、このチームでの経験は大きかった。

ここには id:niwatako くんがすでに属していることも知っていたし、入社する頃には id:ikesyo さんもいることがわかり、念願のという感じだった。
社内のスマートフォンアプリケーションエンジニアが集結したチームでの開発は、自分の基礎レベルをかなり上げた。
また、自分のSwift力が可視化されて、とてもよかった。*1

実際のところ、開発はかなりタイトで、リリース直前は労働時間で量をまかなうという感じではあったが、初めて業務でRxSwiftを使えたり、DIKitを導入できたり、デザイナーとHangoutで会話しながら画面構成考えたり、3年ぶりにAndroidやってみたりもできて、辛いとは感じなかった。
一方で、振り返りの時にも感じたが、自分は軽度のワーカホリック的な部分があるなと感じていて、

  • 仕事が片付いて、手が空くとそわそわする
  • 夜中まで働いた時はハイになってたけど、効率が良いわけではなかった

と思ったので、労働集約型の働き方はよくないし、マインドも矯正して行かなきゃだなと、痛感した。

はてなブックマーク

直近は、はてなブックマークを担当している。
このチームではiOSAndroidに担当の区別がなく、両プラットフォームの開発をしてる。
まだまだKotlinやGradleのことわからんなーという状態。
自分よりも何倍もiOSに携わっている id:nakiwo さんと対等 *2 に議論させてもらいながら、開発を行っている。

昔から使っていたサービスの開発を担当することになるとは、まさか大学生の自分は思わなかっただろうな。
自分は今の状態が最上ではないと思っているので、コードもUIも改革したい。

それ以外

はてなには多くのサービスがあって、特別な制約があるサービスを除くリポジトリには、基本的にアクセスできる。
はてなの歴史が見れるし、自分が担当していないサービスにふらっと立ち寄ってPRを出したりもした。
それだけでなく、CTOの id:motemen さんと一緒にコード書いたり、コードレビューしたりと超豪華

会社としても、QOLが高い。
有名な話だけど、飲み物、お菓子、昼食は準備されている。
エンジニアは本当の意味で裁量労働なので、早めに帰るというのも結構できている。

エンジニアだから特別扱いというわけではないと認識していて、それぞれの職種やポジションの中で、必要とされる/許容される範囲で、最高の状態にしたいねという空気はある。
思ったこと、問題意識、アラートを上げやすい環境だと感じている。

design.hatenastaff.com

自分は心からいい会社だなと思っていて、人を誘える。
「xxxさんだけずるい」みたいな声があがる世の中は生きづらいと思っているので、そんな状況で疲弊している、はてなで働くことに興味がある人がいれば、ぜひランチに招待します!!!

WWDC

ありがたいことに、念願のWWDCに行った。
来年も行きたいなぁとは思うけど、どうだろう。

yutailang0119.hatenablog.com

OSS活動

自分もOSS活動をちゃんとやっていきたい

空が青いので転職しました - がんばってなんか書く

自分でもそれなりできたと思うし、習慣化された。

今はサマーインターン期間で、インターン用の課題も合間でやってみている。
今年はGo!!!

京都

京都に住み始めても半年。
通勤のストレスがなくなったことは、最高にQOLを上げた。

  • 小学校 徒歩15分
  • 中学校 徒歩10分
  • 高校 自転車25分
  • 大学 徒歩10分
  • 社会人1社目 電車20分
  • 社会人2社目
    • 前半 電車10分 + 徒歩10分
    • 後半 電車 20分 + 徒歩10分
  • 現在 徒歩7分

と生きてきたので、幼少期から通勤通学に時間をかける生活は向いていないのだと思う。

いい意味で繁華街が集中しているので、徒歩圏内で大体生活できる。
徒歩圏内にLOFTもROUND1もあるのすごい、映画館がすぐ近くなのにまだ行ってないので、通いたい。

反面、デメリットは確かにある。
東京にいた頃に比べて、休日に集まってもくもくしようとなる友人は減ったし、勉強会も減った。
こっちにも友人増えるといいなと思っているので、これから解決したい。
解決案も広く募集しています。

以上、直近の半年をまとめてみた。
半年後の1周年でも、どう変化があるか経過観察していきたい。

*1:低くはないはず

*2:🙇‍♂️

WWDC 2018の写真を眺める会

会社の朝会で使ったやつ。

出発前

このエントリーの影響で、ステッカーくださいと結構言われた
f:id:yutailang0119:20180802142126j:plain

developer.hatenastaff.com

WWDC会場

駅もWWDC仕様
f:id:yutailang0119:20180802142440j:plain

会場
f:id:yutailang0119:20180802142605j:plain

Keynoteにみんな並ぶ、開始9時なのに5時くらいから並んだ
f:id:yutailang0119:20180802142633j:plain

結構、前の方に座れた f:id:yutailang0119:20180816003527j:plain

セッションだけじゃなくて、Appleのエンジニアに質問できるLabもある
f:id:yutailang0119:20180802142839j:plain

人気なものはめっちゃ並ぶ、これはSwift
f:id:yutailang0119:20180802142925j:plain

ランチも出るけど、クッキーが超甘い
f:id:yutailang0119:20180802143027j:plain

サーモンが1番おいしかった
f:id:yutailang0119:20180802143207j:plain

自分で見ても楽しそうですね
f:id:yutailang0119:20180802143313j:plain

会場周辺

おしゃれ〜〜〜
f:id:yutailang0119:20180802143400j:plain f:id:yutailang0119:20180802143436j:plain

空が青い
f:id:yutailang0119:20180802143525j:plain f:id:yutailang0119:20180802143553j:plain

海外あるあるの謎日本もあった
f:id:yutailang0119:20180802144242j:plain

シェア電動スクーターがいっぱいある
f:id:yutailang0119:20180802144428j:plain

Apple Park

こちらが聖地です f:id:yutailang0119:20180802145712j:plain

オリジナルARコンテンツでApple Parkの内部構造を見れる f:id:yutailang0119:20180802145747j:plain

Bash

カンファレンス会場すぐ近くの公園、全体がモノポリーになってるらしい

ライブが始まると、前の方の集団は踊り狂っていた
f:id:yutailang0119:20180802143647j:plain

何度も言うが、ここは本来公園
f:id:yutailang0119:20180802143832j:plain

サンフランシスコ

1日サンフランシスコ観光ができた。

作画崩壊したような坂
f:id:yutailang0119:20180802144623j:plain

🌉

フィッシャーマンズワーフ
f:id:yutailang0119:20180802144938j:plain

🦀
f:id:yutailang0119:20180802144754j:plain

我々のホーム

🐙🐈
f:id:yutailang0119:20180802145335j:plain

行かせてくれてありがとうございました ✈️

おまけ

id:ikesyo さんの奥様と事前に顔合わせを行い、渡米中の出来事は逐一報告しました。

xccache-sweeperというgolang製CLIを作ってる

github.com

f:id:yutailang0119:20180727175550p:plain

Swiftで作ってるxcopenよりも前に作っていた。 yutailang0119.hatenablog.com

DeviceSupportが溜まってきてて、不便を感じてきたので、アップデートした。

READMEから引用

READMEに書いてるけど、一応説明

Instllation

$ go get github.com/yutailang0119/xccache-sweeper

こっちはgolang製なので、go get だけで使い始めることができて、golangの恩恵という感じ *1

Usage

NAME:
   xccache-sweeper - Sweep Xcode caches

USAGE:
   xccache-sweeper [global options] command [command options] [arguments...]

VERSION:
   0.1.0

COMMANDS:
     archives       Sweep Archives. Defaults is /Users/user/Library/Developer/Xcode/Archives
     deriveddata    Sweep DerivedData. Defaults is /Users/user/Library/Developer/Xcode/DerivedData
     caches         Sweep Archives and DerivedData.
     devicesupport  Sweep Device Support. ~/Library/Developer/Xcode/*DeviceSupport
     help, h        Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h     show help
   --version, -v  print the version

Xcodeのデフォルトの設定だと ~/Library/Developer/Xcode/ に追加されていくデータ郡の掃除用のCLIだと思ってもらうとよい。 *2

所感

前に xccache-sweeper というCLIも作ったが、これはgolangで作った。 この時はSwift PM Package.swiftでかなり疲弊して、Swiftで作るのを断念したので、今回はSwiftで作るぞ!とやった。 ツール自体のロジックは、普段使い慣れているSwiftなので、非常に書きやすかった。

xcopenというSwift製CLIを作った - がんばってなんか書く

環境構築やMakefileの書き方、CLIのarguments perserは圧倒的にgolangの方が楽。
golang製のCLIツールはいっぱいあるので、参考にできるものが多いし、SwiftPM Utilityは癖が強い。

一方で、やはりgolangは書き慣れてなくて、お作法がわかってないことも多いし、やっぱりSwift好きだなと思った。
でも、golangももうちょっとマシに書けるようになりたい。
APIサーバーくらいは書いて、もっと手になじませたい。

xccache-sweeperもアップデート続けます。

*1:xcopenはMintで簡単に入れれるので、ぜひ使ってほしい (コントリビュート続けてる)

*2:今気づいたけど、pathの部分の書き方がバラバラだし、バージョン番号もミスってるので直したい...