ごんれのラボ

iOS、Android、Adobe系ソフトの自動化スクリプトのことを書き連ねています。

2022年12月-Vivliostyle開発者会議 で登壇しました

概要

Vivliostyleの小形さんからお声がけいただいて、2022年12月-Vivliostyle開発者会議で『Vivliostyleの公式テーマをカスタマイズして、ゆめみ大技林 '22のテーマを作った』というテーマで登壇しました。

vivliostyle.connpass.com

資料

speakerdeck.com

登壇した感想

直接開発者の方に意見が言えたり、困りごとの解決方法を聞けたり、知らなかった技術の話を聞けたりして、とても有意義でした。

さいごに

次回制作する技術同人誌では今回仕入れた情報をもとに、よりよい本を作りたいと思います!

iOSDC JAPAN 2022に初プロポーザルを提出しました #iosdc

概要

毎年楽しみにしているiOSDCに今年は初めてのプロポーザルを提出してみました。

fortee.jp

提出したプロポーザル

20分版

fortee.jp

LT版

fortee.jp

思い的なもの

元DTPオペレーターからiOSアプリエンジニアになった自分ならではのテーマがないかと考えた結果、他の人とかぶらないようなテーマのプロポーザルが出せました。
数年前に私が実際に依頼された内容をベースに、Illustratorの実例を交えたお話ができたらいいなと思っています。
まだ採択されてないけど。

さいごに

文章考えるの、難しいね

2022/02/17開催の【技育CAMP】株式会社ゆめみのiOSエンジニアによるiOSアプリ アーキテクチャ入門で登壇しました

概要

株式会社サポーターズ様の学生向けの勉強会で、ゆめみのiOSエンジニア3人が設計やアーキテクチャについて発表しました。 私は「設計を知るための第一歩を踏み出そう」というタイトルで発表しました。

talent.supporterz.jp

資料

speakerdeck.com

感想

発表資料を作りながら設計とはなにかを再度勉強し直す機会となり、私自身にとっても得るものが多かったです。 また社内でなにをテーマとして発表するか決めたり、発表者3人がどういう構成で話すか決めたり、私が聞きたいことを盛り込んでもらったり、事前準備含めて勉強になりました。 設計は一家言ある方が多いテーマですが、発表を聞いてくださった方になにかしら実りがあったらうれしいです。

最後に

株式会社サポーターズ様、ご参加いただいた皆様、発表してくださった皆様、ゆめみの運営サポートメンバーの皆様、ありがとうございました!

2022/04/22開催のYUMEMI.自動化 feat. note tech meetupで登壇しました

概要

2022/04/22開催のYUMEMI.自動化 feat. note tech meetupで登壇しました。

yumemi.connpass.com

noteさんとの共同開催の勉強会で、YUMEMI枠、note枠、公募者枠に応募した登壇者が自動化について発表しました。 私はYUMEMI枠のうちの一人として、「AutomatorでFFmpegを呼び出して動画ファイルをGIFに変換するフォルダアクションを作った」というタイトルで、動画ファイルをGIFに変換する作業をAutomatorを経由することで自動化する方法について発表しました。

資料

speakerdeck.com

Qiita記事

qiita.com

感想

いろいろな分野の自動化のお話が聞けて、参加者としても楽しかったです。 だっしーさんのAmazon Aurora Serverlessの話を聞いてDBのオートスケールってすごい時代だなって思ったり、noteさんのZapierの活用っぷりすごいなって思ったり、shirailyの発表を聞いて改めて住所入力フォームって統一してほしいよねって思ったりしました。 fromkkさんからMacのショートカットアプリでなんか自動化できそうですよねって宿題を投げられたので、今後はその路線でもなにか自動化できるネタがないか探してみようと思います。

最後に

ご参加いただいた皆様、発表してくださった皆様、ゆめみの運営メンバーの皆様、ありがとうございました!

Adobe の ExtendScript が Apple Silicon 環境で動作するか簡単に検証した

概要

フォロワーさんから「Adobe の ExtendScript が Apple Silicon 環境で動かないという話を聞いたが、実際どうなの?」と質問されたので、簡単に調べてみた

調べたこと

  • targetengine の指定があると ExtendScript が起動しないという話は本当か
  • BridgeTalk の指定があると ExtendScript が起動しないという話は本当か
  • VS Code の ExtendScript Debugger が Apple Silicon 環境で動かないという話は本当か

結論

  • InDesign 2021、InDesign 2022 では targetengine の指定があっても ExtendScript は起動した
  • Illustrator 2021 では、Apple Silicon 環境で ScriptUI + BridgeTalk + ExtendScript は起動せず、Illustrator 2021 を Rosetta 環境で起動したら起動する
  • VS Code の ExtendScript Debugger は Apple Silicon 環境では起動せず(正確には読み込まれていない?)、Intel 版をインストールして Intel 版を起動すると ExtendScript Debugger が使用できる

調査メモ

targetengine の指定があると ExtendScript が起動しないという話は本当か

これは特にソースは見つからなかったけど、おそらく BridgeTalk の話と一緒くたになってそう。
手元で試したところ、特になにもせずスクリプトを起動できてしまった。
試したコードは以下。

//@targetengine "hoge"

var progressBar = makeProgressBar('プログレス');
progressBar.show();

function makeProgressBar(title) {
    var palette = new Window("palette");
    palette.text = title;
    palette.preferredSize.width = 700;
    palette.preferredSize.height = 60;
    palette.alignChildren = ["center","center"];
    palette.spacing = 10;
    palette.margins = 16;

    palette.myProgressBar = palette.add("progressbar", undefined, undefined, 
                            {name: "myProgressBar"});
    palette.myProgressBar.maxvalue = 100;
    palette.myProgressBar.value = 0;
    palette.myProgressBar.preferredSize.width = 450;
    palette.myProgressBar.preferredSize.height = 20;
    palette.myProgressBar.alignment = ["center","center"];

    var button = palette.add("button", undefined, undefined, {name: "OK"});
    button.onClick = function () {
        alert('Button clicked!');
    }

    return palette;
}

BridgeTalk の指定があると ExtendScript が起動しないという話は本当か

私が販売しているスクリプトが動かないという報告を受けて、その際に「BridgeTalk を利用しているとだめっぽい」と教えていただいた。
ググったところ、UserVoice にもあがっていた。 https://indesign.uservoice.com/forums/601180-adobe-indesign-bugs/suggestions/43993263-scripts-using-bridgetalk-do-not-work-on-m1-macs-r

これ、Vote 数少なくないけど、困っている人そんなにいないんですかね。
Illustrator で ScriptUI + BridgeTalk + ExtendScript という構成で作成していると、詰むはずなんだけど。
根本原因は Adobe に解決してもらうしかないので、当座の対策として Rosetta 環境で Illustrator を起動するしかなさそう。
なんのための Apple Silicon なのか。
ちなみに Rosetta 環境で起動させる手順は以下のとおり。 1. Finder で 該当アプリケーションを選択する 2. 情報を見る 3. 開いたダイアログ内の「Rosetta を使用して開く」にチェックを入れる 4. アプリケーションを起動する

VS Code の ExtendScript Debugger が Apple Silicon 環境で動かないという話は本当か

これは人づてに聞いた話がもとで調べた。
ググったら Adobe のコミュニティで解決策が提示されていた。
https://community.adobe.com/t5/indesign-discussions/vscode-extendscript-debugger-on-m1-doesn-t-ask-to-select-target-and-selectactivetarget-not-found/td-p/12006537

要約すると 公式サイト の Intel Chip をダウンロードしてインストールし、ExtendScript Debugger をインストールすればよい。
Universal、Apple Silicon も試してみたが、だめだった。
すでに ExtendScript Debugger がインストール済の場合は、VS Code を起動した時点で読み込まれるっぽい。
複数バージョンの VS Code が存在することになるので、ちょっと鬱陶しいけど、解決するまではこうするしかなさそう。

補足

  • 手頃なスクリプトが手元になかったので、InDesign で ScriptUI + BridgeTalk + ExtendScript は試していない。動かないかもしれない
  • Photoshop も滅多にスクリプトを書かないので試していない

まとめ

Apple も Adobe も 環境的に DTP に向いていない気がする。
正直だいぶやる気を削がれている。
UXP になったら少しは改善するんですかね。

『ラクマ x STORES LTイベント ~ iOS開発の裏側 ~』に参加しました

概要

お昼休みを利用して久しぶりに社外の勉強会に参加しました。
自分の備忘録代わりにブログに残しておきます。

参加した勉強会

『ラクマ x STORES LTイベント ~ iOS開発の裏側 ~』 https://hey.connpass.com/event/236189/

発表内容

「SwiftLintをもっと活用する (仮)」by @natsumi_oishi

.swiftlint.ymlを使い分ける

  • テストが書きにくい
  • force unwrapとかでエラーになる
  • Tests配下に.swiftlint.ymlを配置するとディレクトリ配下で適用される
    • 親子で設定が競合した場合、子で上書きできる
    • Build Pharesではswiftlinのコマンドだけでよいが、CLIはconfigオプションで複数指定する(そのときは親→子の順にする)

swiftlintの実行時間を短くする

  • 処理対象のファイルを絞り込んで実行すると短くなる
  • Issueに書いてあったスクリプトを書換えて使っている

analyzeを使う

  • メモに必死で聞き逃した
  • ドキュメントにanalyzer: Yesのものがanalyzeで使える
    • ただし、全体で4つしか指定されていないので、必要なものが使えない
  • Unused importを採用してみたが、必要なときに消されてしまったり、不要なものが追加されたりするので、うまく使えなかった

「ラクマでのSwiftUI導入方針とTips」by @darquro

SwiftUI導入方針

  • 2021/2ぁら徐々に導入
  • 画面全体もあれば一部導入もある
  • MVPをベースにしていて、ViewModel Protocolパターンを導入した

困ったこと

  • iOS13/iPadOS 13のサポートを切ろう!
    • テキストフィールドのキーボード入力まわりの挙動がおかしい
  • Previewがエラーになって時間ばかりかかる
    • 諦めてシミュレータ起動したほうが早いこともある
  • if statementを多用しない
    • Xcodeのコード補完が壊れて無限にローディングする
  • if #available をViewModifierで使用しない
    • リリースビルドしたアプリでcrashする
    • 該当の画面をひらいたときにcrashする
    • Crashlyticsでどう見えるか→リリースしてないからログにでていない
      • STORESも困っている

Tips

  • ViewDidLoadModifierを作る
  • AlertBinding
    • iOS14と15でAlert周りが変わったので、互換をもたせて使いたい

「SwiftUIっぽくした話」by @chocoyama

  • STORESレジアプリの話
  • フルSwiftUIで実装している
  • 今日はレシート印刷の話をする
  • XMLをCALayerにパースしてレイアウトしている
  • XMLベタ書きをSwiftUIっぽくした!
  • XMLは宣言的→SwiftUIも宣言的→SwiftUIから宣言的にXMLにできるのでは
  • XMLっぽさ2ではFlutterっぽいIFのフレームワーク
    • だいぶ書きやすくなった
    • 型で指定できるのでコード補完も効いて書きやすくなった
  • 課題
    • 要素を配列に渡す→制御構文をかけない
  • XMLっぽさ3ではresultBuilderを使う
    • 内部DSLを生成できる

「SwiftUIで STORES 予約 をフルリニューアルした話 」by @yoshikei

  • STORES 予約をSwiftUIでフルリニューアルした
  • SwiftUIを採用した経緯
    • リソースが限られていたので、宣言的にUIを実装して効率をあげたかった
    • Flutterはほかアプリとの親和性を考慮して見送った
    • 新しい技術に対応できるタイミングだった
    • iOS13を気にしなくてよかった
    • アプリの内容がシンプルだった
    • フルリニューアル=フルスクラッチだったので、デザインなどの問題があってもデザインチームに相談できるので、挑戦できた
  • アーキテクチャはSwiftUI+Combine+MVVM
  • APIはREST(すでにあるAPIの関係)
  • パッケージ管理はSPM
  • 強み
    • コンポーネント単位でUIを作れる
    • コードベースが比較的シンプル
    • UIの変更に強くレビューしやすい
  • 弱み
    • OS間で実装をわけないといけないことがあった
      • 14と15の差異を吸収するため
    • ベストプラクティス&挙動が安定していない

まとめ

  • お昼時間の勉強会、初めて参加したけどいい体験でした
  • レシート用のXMLをSwiftUIの宣言的レイアウトから効率よく生成するというアプローチが面白かったです
    • DTPのころにXML自動組版という夢を見た身としては、XML懐かしいなーって思いました
  • SwiftUIの導入実績を耳にすることが多いけど、各社だいたい似たようなところでハマっている印象を受けました
    • そして各社乗り切っているところもすごいですね

2021 年の振り返り

はじめに

2021 年の振り返り記事です。

本業

Android アプリチームに異動

2 月から 11 月まで Android チームに異動して、Android エンジニアに転向していました。
Android アプリ開発自体は浅く関わってきていたんですが、今年は本腰いれて開発してみたいと思って、チームを異動しました。
担当したタスクで思い入れがあるものを、いくつか具体例として挙げます。

とある画面のボトムシート化と付随する新機能開発

ドラッグで画面を閉じれないようにするという仕様があったのですが、ライブラリのバージョンの関係で isDraggable が使えない(バージョンをあげると他の影響が大きすぎて断念)ので、state を細かく制御して強引に実現しました。
だいぶ時間をかけてしまったけど、満足のいく機能になったかと思います。
isDraggable を使ったボトムシート制御もそのうち実装してみたいですね。

ListAdapter を導入

新画面で RecycleView を追加する必要があったので、プロジェクトに初めて ListAdapter を導入してみました。
iOS の CompositionalLayout と同じように差分更新を OS がいい感じにやってくれるのと、コードの記述量が少なく読みやすくもなるので、以降私が RecycleView + ListAdapter で実装するようになりました。
クリックイベントを ViewModel でハンドリングするように試みたりもして、RecycleView + ListAdapter + DataBinding の組み合わせはめっちゃ好きですね。

Java から Kotlin への置き換え

新機能の開発時に Java から Kotlin に置き換え、ついでにモダンな構造に置き換えました。
2 つの言語の違いがわかる作業で、好きな作業でした。

MVP から MVVM に置き換え

MVP の構造がコードを追いづらいよねっていう話がチーム内で定期的にあがるので、シンプルな画面を MVVM に置き換え、ついでに Coroutine を使ったり、LiveData に置き換えました。
Flow を使ってみたいなと思ったのですが、怒涛のタスクラッシュに見舞われて調査時間が取れず、誰でも理解できる LiveData で妥協しました。
この作業も楽しかったです。

Bitrise のワークフローの見直し

長年理由がわからず動いていなかった Bitrise 上の UITest を動くように直しました。
やったことは単純で、公式ドキュメントの Device testing for Android を参考にして、ワークフローを作り直しただけです。
iOS チームにいたときにも Bitrise のお守りをしていたので、CI/CD のお守りも結構好きな作業かもしれないです。

Arctic Fox にしたらビルドできなくなった UnitTest の見直し

Arctic Fox にしたらなぜか UnitTest のビルドができなくなってしまった問題が発生したので、直しました。
stackoverflow を参考に対応しただけ。

未経験で入社した方との 1on1 やメンター的なこと

実装ではないですが、未経験で入社した方との 1on1 やメンター的なことをやりました。

実装タスクだけじゃなくて、地ならしやチームマネジメントみたいなことまで、いろいろやりましたね。
なかなか満足のいく成果がだせたと思っています。

Kotlin の書き心地がいいのと、JetPack Compose が気になっているので、Android のキャッチアップは来年も続けていきたいです。

iOS エンジニアに戻った

12 月に転職して、iOS エンジニアに戻りました。
今後も Android エンジニアとしてキャリアを積んでいく道も考えたけど、やっぱ iOS の世界観が好きだなーって気づいて iOS エンジニアに戻ることにしました。
関係ないけど、Findy、Lapras のオファー的なのは Android のほうが多かった印象がありますね。
まだまだ Android エンジニア不足は続くのかしら。
そのうち転職エントリ的なものを書くかもしれないし、書かないかもしれない。

副業

DTP スクリプト開発の技術顧問

DTP スクリプト開発の技術顧問的なお仕事をしています。
大阪 DTP の勉強部屋で登壇したときの 資料 がきっかけで声をかけていただきました。
業務内容は、クライアントが実装したスクリプトのレビュー、ワークフローやスクリプトの困りごとの相談、スクリプトの実装です。
実装だけでなく、クライアントのコードレビューやワークフローの相談を受けることで、私も勉強になっています。
来年も引き続きお力添えしていきたいです。

カタログ系の自動化ツール開発

今年もカタログ系の自動化ツール開発を受注しました。
データの作りがしっかりしているのと、過去に受注したスクリプトでいろんなパターンをスクリプトに落とし込めているので、短期間で満足いただけるものを納品できてよかったです。
来年も受注できたらいいな。

もくもく会

DTPerのスクリプトもくもく会 を主催して、来年の 5 月で 5 周年になります。
今年もオンライン開催しかできなかったですが、6 回開催できました。
ご参加いただいた方、またいつも準備に余念がないメイン主催 id:uske_S 、ありがとうございました。

DTPerのスクリプトもくもく会 #21 - オンライン
DTPerのスクリプトもくもく会 #22 - オンライン
DTPerのスクリプトもくもく会 #23 - オンライン
DTPerのスクリプトもくもく会 #24 - オンライン
DTPerのスクリプトもくもく会 #25 - オンライン
DTPerのスクリプトもくもく会 #26 - オンライン

来年も引き続き開催していきたいので、ご参加お待ちしています。

作って公開したもの

作りかけのものはここに挙げたもの以外にもいくつかあるのですが、公開に至ったものだけ挙げています。
4 リポジトリしか公開に至らなかったので、来年は作りかけのものを完成させたり、別になにかを作ってもっと公開していきたいです。

レノ

体重が一時期8キロを超えてしまい、獣医と相談してダイエットフードに切り替えました。
原因は日々隙をみて虎次郎のご飯を盗み食いしているからです…。
切り替えたご飯は 猫用 pHコントロール+満腹感サポート ドライ です。
レノくんはストルバイトが原因で下部尿路疾患になったことがあるので、pH コントロールのご飯を食べる必要があって、ちょうどロイヤルカナンから新しいご飯が発売されたので、それに切り替えました。
最初はあんまり食べてくれなかったけど、最近は諦めたのか食べてくれるようになりました。
獣医に相談して、猫用鰹節をふりかけているからかもしれない。

虎次郎

幼少期からたまに発生していた発作が特発性てんかんと診断されました。
二ヶ月ぐらい各種検査(血液検査とか)をするために週末に通院する日々が続き、MRI もうけました。
毎日薬を飲ませる必要があって、日々試行錯誤の日々です。
医療用ちゅーるに乗せてみたり、ちゅーるに乗せてみたり、投薬用のおやつにくるんでみたり。
結果的にすべて見破られてしまい、結局保定して口の中に薬をいれてごっくんさせるという昔ながらの方法で落ち着きました。
薬を飲んだあとはちゅーるを袋半分だけあげるルールが定着しているので、最近は虎次郎も前ほど暴れずに受け入れてくれるようになりました。
焼きがつおちゅーるが約束されたおいしいものと認定されているので、もう我が家は焼きがつおちゅーるを欠かせなくなりました。

そのほか

正月に PUBLIC TOKYO で買った緑色のコートがお気に入りなので、来年はいろんなところに着ていけたらいいなと思っています。
また、M1 Mac が発売されてしばらく経ち、そろそろ手元にほしいなと思っていたところに、M1 Max MacBook Pro が発表されたので、二週間くらい悩んで買いました。
M1 Proで十分だった可能性が高いですが、まぁ大は小を兼ねると思って。
謎のスリープ中のバッテリー消費問題があるものの、大満足です。
Intel Mac は Adobe アプリのスクリプト開発で使うことがありそうなので、手元に残しています。
それ以外の開発環境を削除して容量をあけて、妻にレンタルする予定。

最後に

オフライン、オンラインでお会いした方々、また SNS で遊んでくれた方々、今年もお世話になりました。
来年はリアルで飲み会とかしたいですねぇ。
おいしい日本酒やウィスキーを好きな人とただただ飲む時間をすごしたい…。

また、個人開発でなにか作りたい欲もあるので、それもがんばりたい。
SwiftUI か Flutter かなやんでいるけど、どっちにしようかな。

せっかく M1 Max にしたので、Blender や Houdini などの 3DCG もやってみたい。

来年もいろいろやりたいことがありますね!
それではみなさん、よいお年を!