UXP Script ではモダンなJavaScript(ES6) に対応したので、既存のJavaScriptライブラリを利用できるようになりました。
今回は SheetJS を使って MSエクセルデータを扱う方法を試しました。
完成したスクリプトの配布時にそれを一つにまとめたいので rollup.js を使います。 この手のバンドルツールといえば webpack が定番ですが、 今回試した範囲では webpack と UXP InDesign Script の組み合わせはうまくいかなったので webpack の代わりに rollup.js を使います。
完成したスクリプトの作動デモはこちらを https://youtu.be/SnpH6Ui7nOs ご覧ください。
» Read More「Node.js による InDesign ExtendScript モダン開発入門」というキンドル書籍を一年前くらいに書いたのですが、 とうとう、InDesign が最新バージョン(18.0)から UXP に対応しました。 つまり、小細工しなくても普通にいわゆるモダンなJavaScript (ES6) で InDesign 用の Script を書くことができるようになった。
なお、InDesign の UXP は Plugin にはまだ対応していないそうです。 UXP Scripting と呼ばれるスクリプト実行だけ対応した段階。 そのうち Plugin に対応するようです。 https://developer.adobe.com/indesign/uxp/plugins/ に Comming Soon って書いてあります。
ExtendScript で面倒だったことの一つに https の外部リソースを取得できなかったことがあります。 UXP ではこの問題が解決されているのか関心があったので調べました。 fetch が使える、と書いてあったので、いけるか!と思って調べたところ問題なく使えたので、UXPのスクリプトとともに得たことを簡単にシェアします。
なお、このエントリーでは InDesign 2023 (version 18.1)と UDT version 1.7.0.13 を使用しています。
» Read MoreKotlin/JS 経由で JavaScript から DateTime を扱う場合 java.time.* を使うことができない。 その代わり kotlinx-datetime を使えばよいとのことでこれを試す。
例として、2つの期間 a, b を比較して、その状況を返すライブラリを考えることにする。 たとえば...
本当は、2つの期間のとりうる関係の全てのケースを考慮した判定器を考えたいのだが、 話が込み入りすぎるので、ここでは2つの期間に重なりが あるか or ないか の 2つのケースだけを判定する isOverlapped 関数を実装することにする。
» Read More前回は、ごく簡単な json データを扱っただけなので、 今回は、もう少し複雑かつ実践的な json データを kotlinx serialization を使ってパースしてみます。
» Read MoreKotlinでJSONに対する処理する場合 JavaVM上で実行するコード用であれば、たとえば org.json とか Gson などいろいろなライブラリがありますが、 Kotlin/JS を使って JavaScript に変換して作動させたい場合は、それらのライブラリは(たぶん)使えません。 でも、Kotlin Serialization を使えば、Kotlin で書いたコードもJavaScriptに変換できるので、それを試します。
Kotlin Serialization についてはこの辺からたどっていくと情報が得られます。
» Read MoreHaskellでポケモン組み合わせ問題を解く というエントリーを書いたのですが、 よく見てみると結果のポケモンペアのリストに (Pikachu(electric),Squirtle(water)) と (Squirtle(water),Pikachu(electric)) が両方含まれていました。 これは、ポケモンの前後が入れ替わっただけでペアとして実質同じ内容なので同じペアとして扱いたい。 つまり、これらの一方のペアは結果のリストから除外したい。
» Read Moreポケモンリストから二匹のポケモンを一組とした組み合わせをつくりたい。 ただし、同じポケモン同士やタイプが同じポケモン同士は除外する(つまり、ペアとするポケモン同士は別のタイプを持つようにする)、という問題を考える。
» Read Moredanfo.js 空のセルが存在するエクセルファイルを読み込み失敗するなど で SheetJSからセルの値を読み取るときに、セルアドレスを生成するためのコードで、行列を二重にループしていた。 これをもっと簡単に書きたい。
» Read Moredanfo.js でエクセルデータを扱う場合に、空欄のセルがあるとうまくいかない場合があるようです。単純に読み込みに失敗してくれれば、ある意味問題ないのですが、 読み込み失敗はしないが データが意図通り読み込めていない という場合、 特にエクセルファイルが巨大だったりして、そのまま気付かず進行して後行程で事故るという恐怖。 本当に意図通り読み込みできているか、注意しましょう。
そこで、読み込みには SheetJS を使用し、データ処理自体は danfo.js を使うという方法を使います。 danfo.js のモジュールの中身を見てみると、内部では SheetJS(xlsx) を使用しているみたいなのですが...
» Read Moreこのように、タイプとポケモン名が列挙されているデータがあるとする。 これをA列をキーにして同じタイプを持つポケモンをまとめたい(グループにしたい)という場合。 エクセルで対処するには、どうすればいいか。 および、Kotlin での計算方法。
複数のアイテムがあり、それぞれのアイテムは非選択/選択状態を持つことができる、そういうUIを HTMLとReactを使ってつくります。
Node.js は使わないで、index.html に直接 JavaScript を書いていく方法でつくります。
昨日、Kotlin/JS Hello, World! Kotlin のコードを Node.js で使う を書いたのですが、 もっと簡単に扱う方法がわかったので再挑戦します。
なお、ここでは Kotlin で書いたコードを HTMLに埋め込んだJavaScriptで使いたい、というライトユースを想定しています。 たとえば、Node.js + React で使いたいなどというヘビーな使い方は想定していません。
» Read More型を明示的に指定してコードがかけるので、最近は Kotlin を使うことが多い。 JSでも TypeScript で書けばよいのかもしれないが、もう一旦書いたコードを TypeScript で書き直すとか面倒すぎる。 そこで、Kotlin には Kotlin/JS があるので、これを使ってみた。
» Read Morepandas の代わりに使える danfo.js というツールがあることを知る。 pandas は Pythonのツールなので、JavaScript の方が慣れている人にとって danfo.js はありがたい。
こんなエクセルデータがあったとして、これを danfo.js で操作していく覚え書き。
» Read More最終的には クライアント側は React で実装、サーバ側は Spring Boot で実装して JSON データをやり取りしようという算段です。 まずは、Spring Boot で JSON を返すエンドポイントをつくるところまでの覚え書き。
» Read More支給されたデータのうち特定の列だけを抜き出して使いたい、という場合に pandas を使ったのでその備忘録です。
こんなエクセルデータがあったとして、これを pandas で処理する。
» Read MoreReact でサーバとデータ連携する方法を調査中。 取り急ぎ、前回はサーバから json を取得したので、今度はPOSTで送信してみます。 送信する内容はフォームに入れた文字列とします。 React でフォーム処理する部分はこのドキュメントを参照のこと。
» Read MoreReact でサーバとデータ連携する方法を調査中。 取り急ぎ、サーバから json を取得してそれを React でレンダリングするところまでのメモ。 ポイントは、React のFAQ に書いてあります。
» Read Moreサラサナノにのりかえた 的な話から9ヶ月経過、 相変わらずサラサナノを使っています。 ただし、中身はエナージェルインフリーの替芯です。
一方で、実は一ヶ月ほど前に uni-ball ONE(ユニボール ワン)F を入手してテスト的に使いはじめたのです。 中身は 無印の「替芯 ゲルインキボールペン」 です。
そもそもの動機はエナージェルインフリーの書き味が良き!となって、しかし、あの純正軸はほんとに嫌(個人の感想です)なので、 それ用の気に入った軸を購入しようと文具店を散策していたところ、uni-ball ONE F を見つけた次第。
» Read More「初めての TensorFlow.js」の8章にニューロン一個を使って一次関数を導く例が出ていた。
任意の一次関数の x,y のセットを機械学習させることで、 y = a*x +b の a(傾き)と b(切片)を機械的に見つけることができる、という話。 そこで、これ相当の機能を自前のコードで実装することを試みた。
» Read Moreテンソルの操作になれるために、TensorFlow.js を使って画像を操作する練習。
» Read Moreポケモン名のリストから最も出現頻度の高いポケモンをみつける というエントリーを書きましたが、その内容を Haskell へ移植しました。
あとで、備忘録として移植手順を書き残すつもりですが、今はまずは結果だけメモします。
» Read More決定木のプログラミングをしているときに必要になった関数。 これを備忘録としてメモしておきます。
» Read MoreXMLデータをいい感じに javascript のオブジェクトに変換してくれる・・・という fast-xml-parser。
実際に使ってみた結果躓いた点を書き留めます。
» Read More以前にも同じようなことしていた。 Node.js で XML文書をパース
このときは XMLのパースに xmldom を使っていた。 完全に覚えていない。
HashMapを生成して、その中のエントリーの種類に応じて別々の HashMap を生成するためのコード(備忘録)。
» Read MoreAndroid Studio を使わない ライブラリプロジェクトで Robolectric テストをする一番簡単なプロジェクト例 というエントリーを2年ほど前に書いたのですが、いろいろバージョンアップされて古くなってしまった。このテストプロジェクトをそこそこ最近のAndroid開発環境で動くようにしたので、その備忘録です。 作動確認はしていますが、Robolectric よくわかっていないのでその点はご了承ください。
» Read Moreたとえば、0,1,2 という index を生み出す場合、いくつかの書き方がある。
» Read More先日、Windows11 22H2 のアップデートがきた。待っていた systemd 対応がきたので、早速更新。 せっかくなので、Windows の回復を利用して、フルリセットに近い形で Windows11 22H2 を入れた。 始める前は Windowsの再インストールは気が重かったのだが、やってみたら簡単だった。以前はもっと大変だったという印象がある。まだまだ ChromeOS ほどではないにしても。 Windows11 22H2 をセットアップしたあと、通常手順で wsl --install してインストールしたところ、インストールされた Ubuntu は systemd に対応していなかった。 ちなみにインストールされたのは Ubuntu 20.04.4 LTS。 上記 microsoft devblogs を読み直してみると、Windows Insiders Build でないと systemd 対応版の WSL はインストールされないらしい。 でもさらによく読んでみたら、github のWSL リリースページから 0.67.6 を入手して手動でインストールすればよいらしい。 果たしてやってみると、systemd対応になった。 Wnn8 をインストールしたらすんなり自動起動できるようになった。 Windowsを再起動して WSL を起動したら、自動で Wnn8 が起動している。 とりあえずは、systemd 対応でうれしいのは(自分にとっては)これだけだけど。 以前に書いたこの Wnn8インストールのエントリーの後半で、 なんやかんや Wnn8 の起動設定をしている部分がいっさい不要になった。
» Read More以前にGroovy / Golang / Node.js, リストを n 個ごとに分割したリストのリスト(サブリスト)をつくりたい というエントリーを書いたのだが、kotlin でそれをつくり出す必要が生じたので備忘録として書き残します。
ここで言うサブリストとは、リストを n 個ごとに分けたい、という場合につくるリストのリストのことです。
» Read Moreまずそもそもの話、 Excel のチェックボックスのチェック状況を特定のセルにリンクして記録する機能(Cell link)があらかじめ備わっているので、それを使うべき。 そうすれば、このエントリーで書いているようなことを行なわなくても普通にPOIとか node.js の xlsx 系ライブラリで難なくその値を読むことができます。
英語レイアウト版 MX Keys Mini がついにリリースされたので入手しました。 7月末、ちょうど amazon.com でUS版を購入しようとしていたそのときに、 日本での発売がアナウンスされてこちらを予約しました。 もう少しで amazon.com で買うところでした。 日本のLogicool版の英語レイアウトキーボードを買っておけば、 今度は、メカニカルキーボードの方も英語レイアウト版も発売してくれるに違いない。
EPS は、 https://xmlgraphics.apache.org/commons/ を使って、 PDF は、 https://pdfbox.apache.org を使って、 それぞれ 画像のタテヨコの大きさを取得します。 使用する言語は kotlin script です。
» Read MoreKotlin の Sealed クラスを使えば、 代数データ型の直和型を表現できる、という情報を得たので、MaybePokemon クラスをつかって試してみた。
» Read Moreしばらく諸事情により遠ざかっていた Android アプリ開発を再開しようと思っている。 そのウォーミングアップとして Kotlin でスクリプトを書いたりしているのだが、 結構いい感じ。 もちろん普通に JavaVM 上で動く Kotlin で開発しているのだが、 それとは別に Kotlin Native というものがあり たとえば Linux X64 ネイティブ実行できる実行ファイルを生成できるらしい。 かっこいい!と思って調べはじめたのだが、思いのほか難しかった。 とりあえず、テキストファイルを読みとって標準出力するところまでたどり着いたので、 その記録を残す。
» Read More前のエントリー MacBook Air M1 に bash と emacs のセットアップ備忘録の補足です。
» Read MoreKotlin をコマンドラインで使う方法は、 以前のエントリー Kotlin Script が便利 Javaのライブラリも使える でも書いたのですが、 何通りかの方法があるので、整理しました。 Kotlin でライブラリ(jar)をつくり、それを Groovy スクリプトから使うこともできます。
» Read Morejq をソースからインストールしたので備忘録を残す。
いつまで耐えられるかわからないが、 とりあえずこの MacBook Air M1 には home brew を入れないと決めている。 そして、 jq を使おうとしたら当然コマンドが存在しない。
jq も簡単にソースからビルドできると思ったがそうはいかなかった。
最初に jq 1.6 を試したが、 oniguruma の部分が解決できなかった。 jq 1.5 はビルドできた。
» Read More先日の Cloud Vision API を使う Python3 編 に続いて Spring Boot Kotlin での Cloud Vision API の OCR のコード覚え書きです。
Python で既に書いたコードを Kotlin に移植しました。 Spring Boot は今まで使う機会がなかったのですが、 今回使って良いと思ったのは gradlew bootJar するだけで executable な単一の jar ファイルを生成してくれることです。
ただ Python のようにスクリプトファイルひとつで処理できるような小さな処理に Spring Boot を使うのは気が重いですね。
» Read MoreGoogle の Cloud Vision APIの機能のひとつにOCRがあり これを業務で使う機会がありました。 実際に使ってみると、対象が印刷物をスキャンした画像データだったなど条件がよかったのだとは思いますが ほぼOCR処理として100%に近い形でテキストに変換されました。 とはいえ、100%ではないので、そこは人間が一度はすべて確認する必要がありますし、 そもそもOCRで読みとったテキストをこちらが使用したい単位に整理する処理については 当然OCRの守備範囲外になります。 そのため、その部分のコードを書くのが相当に大変でした。
もし人間が目視&手作業としてテキスト入力すれば、その整理部分も含めて人間が処理することになる。 それがアウトソーシングとしてページ単価いくらで予算の範囲で収まるのであれば、 どうなんだろう。 自分ががんばって書いたコード部分は結局たいした価値があるのだろうか……という微妙な仕事になってしまった。
» Read Moreそろそろ シリコンマックに移行しないと……と思い立ち先月 MacBook Air M1 を購入した。 それが今年のWWDCの前だったので、それまで待って発表内容を見てから購入すべきか悩んだ。 しかし、刷新された MacBook Air 2022 が出る、という噂があったので、 既存の MacBook Air が廃盤になって購入できなくなると困るという考えがあった。 12inch MacBook のときがそうだったように、入手しようか悩んでいるうちに廃盤になって購入できなくなるのは避けたい。 それに、仮にその新しい MacBook Air 2022 が素晴らしいものだとしても、 ここ最近の円安により相当値段が高くなることが予想されたので、 十分実用的だと感じている MacBook Air M1 が10万円ちょっとで買えるならば、 どのみち、新しい MacBook Air 2022 を買うことはないだろう。 それならもう開催前にオーダーしてしまおう。 最悪のケースでも 2週間以内なら返品できるわけだから、などと悩みつつ購入。
» Read More先日、電子書籍「ExtendScript と Node.js による Markdown to InDesign 開発入門」をリリースしました。 Amazon の Kindle Unlimited の会員の方は無料で読めます。ExtendScript に関心がある方は是非ご覧ください。
これは、 以前リリースした「Node.js による InDesign ExtendScript モダン開発入門」の続編です。
書籍中のソースコードはこちらの Github レポジトリにあります。
» Read Moreたとえば、次のようなポケモンオブジェクトのリストがあったとして:
[
{ name: 'Eevee', type: 'normal' },
{ name: 'Pidgeot', type: 'normal' },
{ name: 'Pikachu', type: 'electric' },
{ name: 'Raichu', type: 'electric' },
{ name: 'Jigglypuff', type: 'normal' },
{ name: 'Squirtle', type: 'water' },
{ name: 'Golduck', type: 'water' },
{ name: 'Voltorb', type: 'electric' }
]
これをタイプ別にグループ化したリストのリストをつくる関数を考えます。
» Read MoremacOSまたは Chromebook のLinux において、Emacs で編集しているときに現在のカーソル行にある URL をブラウザで開く方法を調べた。
» Read Moreサラサナノにのりかえた 的な話から3ヶ月経過、 相変わらずサラサナノばかり使っています。
前回のエントリーでは サラサナノ + 0.3mm のリフィルは使い辛いと書いていたのでしたが、すみません、違いました。 それは、使うノートの方の問題で、ノートの種類によっては 0.3mm のリフィルはとても機能します。
» Read Moreこの問題を解くHaskell による実装を書いたのだが、 結局のところ、対象となる文字列(画像ファイル名)の等価性をカスタマイズするために、 文字列を丸めてそれを使って等価性の比較を行っているだけ。 Haskell では、 Eq 型クラスを自前で用意した Item 型に実装する形で、 言語にもともと備えられている仕組みを 使っているのでコードとしてはわかりやすいのは確かだけれど。
そこでこの問題を Haskell 発想により近い形で JavaScript で実装しなおしてみる。
» Read More前回のエントリー微妙に揺れのある2つの文字列リストに対する積集合(Intersection)と差集合(difference)の計算 の Haskell 編です。
積集合と差集合とか書いて・・・途中で気づいたのですが、2つの集合の差だけを求めれば済む話だった。 Haskell 編では差だけを求めます。
» Read More微妙に揺れのある次のような 二つの文字列リスト(画像ファイル名)があるとする。
const listA = ['grape.pdf', 'apple_v1.pdf', 'apple_v2.pdf', 'lemon_v1.pdf', 'peach_v2.pdf'];
const listB = ['grape.png', 'lemon.png', 'strawberry.png'];
listA の画像から listB の画像をPDFからPNG変換して作成した、という状況。 変換し忘れている画像ファイル(PDF)を知りたい。 そんな場合の計算方法について考える。 なお、世の常として listB に listA には存在しない strawberry が間違って混入されている、という例になっている。
» Read MoreNode.js の xlsx モジュールを使って、データの入っている範囲を計算します。 その他、特定の行のデータを取得したり、列データを取得する方法について覚え書き。
» Read Moreこのエクセルデータのダウンロード: potate.xlsx
今 ExtendScript を使って markdown テキストを InDeisgn 文書に変換する方法を考えている。 その際に画像の大きさの扱い方で悩んでいたのだが、 pandoc で ICML を経由して markdown を InDesign にする場合は、 markdown で次のようにそれを指定できるらしい。
» Read MoreWindows の WSL みたいに MacOS でも軽快に(VirtualBoxやParallelsほどおおげさでなく)Ubuntuを使いたい。 と思っていたら Multipass を使えばよいだけだった。
» Read More以前のエントリー ブラウザテキストエリアで Emacs キーバインド を使いたい で、普通にブラウザで Ctrl + N が使える方法を探していたのだが、 ここしばらくは、 Windows11 で Vivaldi というブラウザを使うことで 回避してきた。
» Read More先日 markdown-to-ast を使って markdown をパースするというエントリーを書いたのですが、 markdown-to-ast は commonmark をラップしたライブラリだとの情報を得た。
それならば、markdown-to-ast を使うのではなく、直接 commonmark を使ってみることにする。
» Read More文字スタイルをスクリプトでつくって適用する方法を調べた。
それを使って Hello, World! を生成して、段落スタイルと文字スタイルを適用するスクリプトを書いたので 備忘録を残します。
» Read Moremarkdown で記述されたテキストをパースしてあれこれしたい場合。 markdown-to-ast が便利そうなので、使ってみた。 これはすごい便利。
» Read More2022-04-04 更新: commonmark 編を書きました。
コーヒーメニューの価格改訂リストの作成で書いた再帰関数をリファクタリングします。
» Read Moreコーヒーメニューの価格改訂リストの作成の後編です。
読み取った新旧のコーヒーメニューリストをコーヒー名をキーにマージして旧価格/新価格を一覧にします。
また、エラーが含まれていたらログも書き出します。
Writer モナドを使ったコーヒーメニューの価格改訂リストの作成 の改善版をつくります。 新旧のアイテムリストから、同じコーヒー名を持つアイテムを組み合わせたタプルをつくる方法を改善します。 →2つのリストの要素を組み合わせたい(リストモナド)
» Read More新旧2つのコーヒーメニューアイテムリストがあり、 そこから同じコーヒー名をもつ新旧アイテムの組み合わせをつくりたい、という問題を考える。
ひとつの方法(方法A)は、ユニークなコーヒー名リストを作成し、 それを使って、新旧2つのリストからそのコーヒー名を持つアイテムを取り出し、新旧アイテムをタプルにする。
もうひとつの方法(方法B)は、新旧2つのコーヒーメニューアイテムリストの各要素ごとの 全ての組み合わせを生成しておき、 その中かから、新旧のアイテムでコーヒー名が一致している組み合わせだけを残す。
方法Aは発想としては分かりやすいけれども、もしひとつのリスト内に同じコーヒー名を持つアイテムが含まれていると困る。 その場合を考慮してコードをかけばよいのだろうけれど、ややこしい気がする。
» Read More