SwiftUI.AsyncImageのBackportを作っている

github.com

iOS 15/macOS 12/tvOS 15/watchOS 8から使えるようになる予定の SwiftUI.AsyncImage が便利で早く使いたいので、SwiftUIが使えるプラットフォーム全てで使えるように、Backportライブラリを作ってみています。

はてなの同僚たちに協力してもらって、AsyncImageのインターフェースと動作をトレースできるようになってきました。
Xcode 13 RCがリリースされるまでに変更はあるかもしれないけれど、対応していくので、ぜひ使ってみて、フィードバック、スターをもらえるとうれしいです💪

PixelaUI 1.0.0 リリースのお知らせ #pixela #PixelaUI

本日、すばらしい発表をみなさんにできることを、大変嬉しく思っています。

v1.0.0

本日、PixelaUI 1.0.0 をリリースしました!
主なアップデートは以下です。

  • アイコンをPixelaUIオリジナルに
  • iOS/iPadOS 14からのWidgetをサポート
  • ログイン情報の取り扱いを調整

ログイン情報に関わる改修をしたため、ファーストリリース時にもお知らせしていた 非互換の変更 を行なっています。 アップデート後、初回は再ログインが必要になるため、ご注意ください。

PixelaUI

PixelaUI

  • Yutaro Muta
  • ユーティリティ
  • 無料
apps.apple.com

ファーストリリースが 2020/01/22 なので、1年半かかりましたが、ついに v1 を迎えることができました。
Pixela本体のAdminである id:a-know さんの協力なしには、実現できませんでした。
改めて、感謝です。

アイコンのリニューアルについて

Appleレビューで、サードパーティアプリとしてアプリ名、アイコンが相応しくないとのリジェクトとなりました。
アプリ名は PixelaUI を変更せずにいたいですが、バージョンを 1 とするいいタイミングなので、アイコンをオリジナルのものに変更することにしました。

PixelaUIの新アイコン
新アイコン

このすばらしいアイコンは、はてなで同僚の id:mazco さんにお願いしました。
Pixelaのオウムを意識しつつ、他の鳥類がいいなと思っていました。
自分のカメラロールを見返して、ペンギンの写真多いと気づいたので、 結構ペンギンが好きみたいです。*1
その中でも、かっこいい感じがいいなと思ったので、イワトビペンギンをモデルにしてもらいました。

yutailang0119が描いた構想
yutailang0119が描いた構想

ちなみに

アプリ名やPixelaの素材利用について、現在はPixelaに利用規約ガイドラインがなく、個別に許諾をもらっています。
DroidKaigi 2018 iOS appのApple審査が通るまで - Konifar's WIP の事例を記憶していたので、 id:konifar さんに相談し、協力していただきました。
ありがとうございました!

有料化について

メジャーバージョンを 1 とする時に、アプリを有料にするかは悩んでいました。
広く使ってもらいたいという気持ちが勝ったので、少なくとも v1 の間は無料アプリとして提供します。

もし、個別にサポートしたいという方がいましたら、以下から支援いただけると、とてもありがたいです。

One more thing...

PixelaUI 1.0.0では、ついに macOS Big Surをサポート しました!
これまで、PixelaUIはAppleSoCマシン向けに、iOS/iPadOS互換アプリとしての配信をしていました。*2
v1 からはmacOS App Storeにも配信を開始したことで、AppleSoCマシン以外 *3 でも、PixelaUIをご利用いただけます。
もちろん、今回のアップデートに含まれるWidgetも、macOSで利用可能です。

ただし、現在はMac CatalystによるiPadOS互換の仕組みを利用したものとなっています。
最適なmacOS UIとはできていません。
今後のアップデートにご期待ください。

今回のお知らせは以上です。
今後しばらくは細かい修正になる気もしますが、引き続きよろしくお願いします!

*1:関係ないけど、南極にいるから寒い場所のイメージのあるペンギンだけど、実はほぼ南半球にしかいないの意外じゃないですか?

*2:betaの位置付けとして告知なし

*3:いわゆるIntel Mac

WEB+DB PRESS Vol.121 特集2 「iOS 14最前線」に寄稿しました #wdpress

宣伝

2021/02/22 (月) に発売予定WEB+DB PRESS Vol.121 *1 に寄稿しました!
担当は、特集2「iOS 14最前線」で、はてなで同僚の id:cockscomb id:kouki_dan との共著です。
その中で、自分は2章「UIKit」と5章「ウィジェット」の2つを担当しています。

一部の大手書店様では、2/15 (月) から、先行販売もあるようです。
もし見かけたら、お手にとってご覧ください!
また、電子書籍版の販売もありますので、合わせてよろしくお願いします!

f:id:yutailang0119:20210204171843j:plain:w300
表紙
WEB+DB PRESS|gihyo.jp … 技術評論社

経緯

昨年の10月に編集長の 稲尾さん に別件にて連絡をした流れで、「iOS 14の特集記事どうですか?」と声をかけていただきました。
今回はiOSにフォーカスした特集だったので、はてな社内でやりたいなと思って話を持っていき、同僚のid:cockscomb id:kouki_dan と一緒に共著とすることにしました。

前回 から1年を待たずしての再登場となりました。

余談

1

リポジトリに紐づくまとまった文章を書く時にはVisual Studio Codeを使っていましたが、 M1 Macにはインストールしていない ので、GitHubCodespaces を使って作業を進めました。
サンプルコードはXcodeで動かす必要があるけれど、日本語を書くだけの時はどこからでも同じ環境を使うことができて便利でした。
Gitnpm をブラウザ上でも使えるので、ちょっとした変更にはiPadで楽に作業ができてよかったです。

2

前回の執筆時には、textlint/textlint が途中で導入され、これが便利だったので、今回は特集リポジトリを作った段階で、初手で導入しました。
せっかくなので、もっと進んだ使い方にしたいなと思って、GitHub Actions用の yutailang0119/action-textlint を作りました。

3

今回の執筆では、2回目にしてかなり正確に分量を調整できて、我ながら驚きました。
しかも、これは担当した2章分両方でのことです。

もちろん、この後にはレビューや校正を経て、リライトや分量調整は再度行っています。

謝辞

一緒に書いてくれた id:cockscomb id:kouki_dan のお二方、ありがとうございました!

編集長の 稲尾さん を始めとした編集部の皆様、今回もありがとうございました!

最後に

2021/2/22 (月) 発売 WEB+DB PRESS Vol.121 を、よろしくお願いします!

*1:URLはまだ404だけど、たぶんこれのはず

2021/01/19

大きな病気などなく、本日1月19日で28歳を迎えました。
もう若手とは言えなくなって参りました。

昨年は世界が大きく変わり、自分自身にも良いこと悪いこと、いろいろとありました。

28歳の抱負は「地道」にしました。
飛躍などの大きな目標からは一旦離れて、これからを考える時間に充てようと思います。

去年全く会わなかった方も多いですが、今年も1年よろしくお願いいたします。

恒例のWishlist です。
よろしければ、お待ちしております。

Apple SoC Mac (M1) に合わせて大掃除 🦜 #はてなエンジニアアドベントカレンダー

これは はてなエンジニア Advent Calendar 2020 25日のエントリーです。
昨日は id:hitode909 さんで、Perlアプリケーションの依存モジュールの更新についてWEB+DB PRESS vol.120のPerl Hackers Hubに寄稿しましたでした。
誕生日おめでとうございます🎉
最終日を担当するのは、アプリケーションエンジニアの id:yutailang0119 です、こんにちは。
クリスマスなど関係なく、掃除の話をします。

2020年は、Apple Silicon (以下、Apple SoC) Macが発売された歴史的な年になりました。
記念品なので、もちろん買いました。
10年ぶりにMacBook Airです。

f:id:yutailang0119:20201224230615j:plain

プログラミングを始めていない期間も含めると、MacがメインPCになってからの時間がWindowsよりも長くなっています。
プログラミングでの用途がメインになってからも、構成は変遷してきましたが、M1 Macでまた環境が変わったので、大掃除の状況をまとめようと思います。

ちなみに自分はMaciPhoneすべてで、前の端末からデータ移行せずに、更地からのセットアップする派です。

環境

掃除したもの

iTerm2

最初にRosetta 2の挙動確認のためにTerminal.appを使っていたところ、これでいいかという気持ちになって、Terminal.appで暮らしています。
iTerm 2の機能を使いこなせていたわけではなかった。
今の所の不満点は、開いたタブの縦配置ができない点くらい。
そのうち、他のマシンとの違いが気になってiTerm 2に揃えるかもしれません。

Rosetta 2で起動するかは、アプリ起動時のみ切り替わるので、 arm64x86_64 環境の切り替えのために、iTerm 2もインストールして使い分けるのはありかも。
↓はTerminal.appをちょっとハックして、2つを同時利用する例。

fish

はてなに入社したタイミングの環境見直しで、それまで使っていたzshからfishに移行しました。
正直なんとなくで、カラフルでオシャレだし使ってみよう、くらいの感覚でした。
fishには十分に満足しているのですが、みなさんご存知の通り、macOS Catalinaからデフォルトシェルがzshになったので、どこかで戻ろうかなと思っていました。
ちょうど、今秋に業務PCの変更もした *1 タイミングで、zshに戻ってみています。
Apple SoC関係なしにzshでいいやと思っているけど、見た目のカスタマイズが滞っていて、Intel Macではfishもたまに起動しています。

Karabiner-Elements

キーボード配列はUSを使っていて、左右の⌘キーにen/ja切り替えを割り当てていました。
(capas lockのオフも有効になっているが、こちらはついで)
今回のM1モデルのキーボードでは、左下のfnキーにグローバル記号も印字され、入力切り替えが割り当ててられているので、Karabiner-Elementsが不要になりました。
微妙なラグやたまにトグルが効かなくなって再起動してたりの不便さはあります...*2
iOS/iPadOSのソフトウェアキーボードやiPad用のMagic Keyboardでも、左下に入力切り替えが配置されているので、これに慣れたい。

これまでのIntel Macキーボードにはこの設定はないのかと思っていましたが、このエントリー書いている際に、キーボード設定の Press Fn key to に指定できることに気づきました。
Karabiner-Elementsから卒業できそうです。

Google IME (Google日本語入力)

いい機会なので、ついに卒業しました。
Appleのライブ変換に慣れなかったけど、流石に1ヶ月もすると慣れてきた。

Visual Studio Code (VS Code)

VS Codeをインストールせずに暮らせています。
これまでのVS Codeの用途の中で、小さい修正などはVimで完結できるので、まずは .vimrc を再整理しました。

プロジェクト全域を扱うために使っていたVS Code用途は、GitHubCodespaces でやってみています。
Codespcasesは、GitHubがホストするクラウド上でVS Codeの環境が使えるもので、ブラウザから利用できます。
たまに反応が悪いなと思うことはあったりするけれど、npm とか普通に動いているし、便利。
ここからローカルホスト立ち上げたりはできないだろうけど、TypeScriptでツール作ったり、日本語書く環境にしたりは問題ないです。

iPadからでも同じ環境が使えるので、かなりおすすめです。  

新たに入れたもの

iOSアプリを使えるようになって、いくつかのアプリを入れてみたけど、正直まだ使いこなせていないです。
自分が作ったアプリが動くのは感動しました

まとめ

年末とApple SoC Macということで、大掃除と称して、環境の整理をしました。
M2以降のMacBook Proをメイン機にするつもりでストレージは256GBのままにしたで、できるだけ最小構成にしているので、ストレージは増やしておけばよかった。
Apple SoCにおすすめのアプリやツールがあれば、ぜひ教えてください。

今年もお疲れさまでした。

*1:業務はまだ Intel CPU

*2:再現ケースが作れていないので、何が原因かわからない

2020年Mackerel作ったものまとめ #mackerelio #アドベントカレンダー

これは Mackerel Advent Calendar 202019日目のエントリーです。
昨日は id:yasunori-k さんで、 2020年のオンラインセミナーを振り返る(共催セミナー編) - Mackerel ブログ #mackerelio でした。

こんにちは、id:yutailang0119 です。
Mackerelアドベントカレンダーには初参戦
アドベントカレンダーのテーマであるMackerelを提供する株式会社はてなで、普段からアプリケーションエンジニアを自称している訳ですが、主戦場はモバイルアプリのため、Mackerelのメインターゲットからは少し外れる気がします。
サーバー監視は主業務ではないのですが、今年はいくつかのアイディアの実現とそのためのツールを作成したので、まとめようと思います。

fastlane-plugin-mackerel-api

github.com

fastlaneは、iOS/Androidプロジェクト向けのビルド、テスト、リリースなどの自動化ツールです。
日本でも、多くの企業、組織で利用されていることでしょう。
fastlaneのようなタスクランナー使ったCI実行を考えると、継続的に状態を記録したくなるのではないでしょうか?
その記録先としてMackerelを使うために、fastlaneのPluginを作りました。
作った時の心境などは、こちら

fastlaneには、Coreの組み込みActionとして github_api があり、このインターフェースを模して、mackerel_api として Mackerel APIを実行するようにしています。

作ってから半年強、以下のような情報を継続して記録しています。

  • プロジェクトのビルト、テスト、リリースの実行時間
  • プロジェクトのモジュール毎のテストカバレッジ

上記の2つの利用方法は、 以下のActionをまとめたPluginとして公開しています。
ご利用、フィードバック、お待ちしています!!!

github.com

action-mackerel-api

github.com

こちらは、GitHub Actionsなので、モバイルアプリに限らずに利用可能です。

リポジトリに含まれるコード量/比率をMackerelに記録する with GitHub Actions & action-mackerel-api - がんばってなんか書く で紹介している言語比率の記録は、プロジェクトで使っています。
そのほかに聞いた利用方法では、GitHubBilling APIと組み合わせて、GitHub ActionsやGitHub Packagesの利用状況をMackerelに記録しているそうです。

そのほかにも、利用方法はいろいろありそうですね。
何かおもしろい使い方があれば、教えてください。

まとめ

このように、Mackerelはサーバー監視以外にも、アイディア次第でモバイルアプリ開発でも有用な活用方法があります。

ということで、今年のおさらいでした。
来年も何かできたらいいですね。

明日はryosmsさんです。

金沢に立ち寄って、一人旅をしてきた

SPAJAM 2020最優秀賞副賞で、軽井沢でワーケーション体験をして来た #SPAJAM #サードオフィス - がんばってなんか書く の帰りに、12/13 (日) - 14 (月) で金沢に一泊して来ました。

1日目

SPAJAMワーケーションは昼に解散予定だったので、夕方から夜にかけて移動する予定でスタート。

移動

軽井沢のアウトレットでみんなでお昼を食べた後に、あさま615号 -> はくたか567号と乗り継いで、金沢に移動。

f:id:yutailang0119:20201216021308j:plain f:id:yutailang0119:20201216023823j:plain

金沢駅

17時半ごろに到着しましたが、疲れていて、この日は晩ごはんを食べずにホテルで寝て、夜に駅の周りを散策するだけにしました。

f:id:yutailang0119:20201216021649j:plain
イメージ通りの金沢駅
f:id:yutailang0119:20201216021659j:plain
内側もかっこよかった

2日目

天気が悪く、気温も真冬の予報で心配してましたが、なんとか周りきれた。

金沢カレー

近江町店 | 金沢カレーの元祖!カレーのチャンピオン【チャンピオンカレー】

f:id:yutailang0119:20201216022015j:plain
金沢カレー発祥らしい

近江町市場

近江町市場 – 金沢市民の台所としてもうすぐ300年の小売市場

f:id:yutailang0119:20201216022328j:plain
鮭カーテン

金沢城公園

金沢城公園

f:id:yutailang0119:20201216022513j:plain f:id:yutailang0119:20201216022523j:plain f:id:yutailang0119:20201216022536j:plain

兼六園

文化財指定庭園 特別名勝 兼六園

f:id:yutailang0119:20201216022809j:plain f:id:yutailang0119:20201216022821j:plain f:id:yutailang0119:20201216022832j:plain

ここら辺から、1人なのが辛くなってきた。

内灘海岸

記憶上で、日本海を見たことない *1 のではということで、天気が悪くなければ、海を見たいと思っていました。
ということで、 北陸鉄道浅野川線に乗って、内灘海岸に行きました。

f:id:yutailang0119:20201216023326j:plain
ICカード使えなくて、久しぶりに切符買った
f:id:yutailang0119:20201216023336j:plain
f:id:yutailang0119:20201216023345j:plain
始発/終点駅以外、無人駅らしい
f:id:yutailang0119:20201216023356j:plain
初めての日本海
f:id:yutailang0119:20201216023405j:plain
日本海記念

海を見た瞬間に「日本海だー!!!」テンション上がったけど、寒すぎて滞在時間は10分でした。
往復で2時間近くかかったけど、旅とはこういうもの...

海鮮丼

海鮮丼を食べ

f:id:yutailang0119:20201216024229j:plain

サンダーバード

初のサンダーバードで帰路に着きました。

f:id:yutailang0119:20201216024330j:plain

f:id:yutailang0119:20201216024341j:plain
どこがサンダーで、どこがバードかはわからなかった

*1:福岡は日本海ではないとします