飴屋

開発日記/2019年の日記

2019/12/12

暇を見て久しぶりにAndroidアプリを更新しました。入院していたのと関係して血圧を測ってこいと医者に言われるので、そういう機能を追加しつつ、不便なところを直したり、ちょこちょこアプリのアップデートを促されていたのを一気に解決したりしたのでした。先ほどリリース申請を終えたので、現在待機中です。Google Playのストアも最近はチェックをしっかりやるようになったらしいので、前より時間がかかるのかもしれないですね~。お風呂にでも入ってこようかな。

2019/10/15

全然考えたこともなかったのですが、突然のことで長期間入院してました。とりあえず退院したものの、以前のようにはいかないようです。人生いろいろあるみたいです。

インラインSVGを使ったお仕事で、jQueryでSVGのpathを動的に追加したのですが、追加(append)した要素が表示されないので、いろいろ調べて解決したメモです。そもそもSVGのタグはHTMLの要素ではないので、SVGの要素として追加してあげる必要がありました。おそらくjQueryのappendメソッドはdocument.createElementで要素を生成してからDOMに加えているのだと思いますが、この生成の時にSVG要素であることを明示してあげる必要がありそうです。

document.createElementNS('http://www.w3.org/2000/svg', 'path');

document.createElementNSは名前空間を指定して要素を作ることができ、SVGの名前空間を指定すればいいみたいです。

なお、path要素のd属性はjQueryのattrメソッドで普通に変更できました。svg要素事態も普通に追加(そのときはprepend)できました。

2019/3/17

PhotoshopをAdobe CCにして、いつの頃からかたまに問題が起こるようになったので、修正方法をメモしておこうと思います。

Photoshopに何か作業をやらせる場合、単調な作業はアクションにまとめてボタン一つで実行できるようにしますが、もうちょっと複雑なことをやろうとすると外部のアプリケーションからPhotoshopを操作したくなります。幸いPhotoshopはCOM経由でPhotoshop内のオブジェクトを操作できるようになっているので、それを使わせてもらっています。しかし、ある日、突然この外部からの操作がうまく実行されなくなったことがありました。(ついさっきまた発生しました。一年位前にも多分発生しました。)どうも直前にPhotoshopのバージョンアップが行われていたので、これが原因だと思われます。Adobe CCでは古いバージョンのアプリケーションが併存できるので、試しに古い方のPhotoshopを立ち上げてみて、そちらを外部から操作しようとしたらうまくいきました。

これは何が原因だったかというと、COMでオブジェクトを呼び出すときのオブジェクトの名前を指定するのですが、その名前と新しいバージョンのPhotoshopが結びついてなかったのが悪かったのでした。

$$app = Win32::OLE->GetActiveObject('Photoshop.Application') || Win32::OLE->new('Photoshop.Application')
or die "Cannot find Photoshop";

↑これはPerlでWin32::OLEモジュールを使ってPhotoshopを操作しようとしているときの問題の箇所です。「Photoshop.Application」という名前でPhotoshopのアプリケーションオブジェクトを取得しようとしているところですね。しかし、「Photoshop.Application」という名前は古い方のPhotoshopと紐づいているのでした。この紐づけはどこで行われているのか調べてみると、レジストリ上で設定されているそうです。(ちなみにWindowsでの話です。)

\HKEY_CLASSES_ROOT\Photoshop.Application

↑この中でCLSIDとCurVerが設定できるのですが、CurVerの値は古いPhotoshopを指しているようです。この辺をいじって新しいPhotoshopに値を設定するとうまくいくようです。今回はPhotoshopが2018年版から2019年版に変わったことが原因だと思われますので、該当するアプリを探してみると、先ほどのレジストリパスの隣に

  • Photoshop.Application.120
  • Photoshop.Application.120.1
  • Photoshop.Application.130
  • Photoshop.Application.130.1

↑こんなのが並んでいました。120が2018年版の方で、130が2019年版の方だと推測されます。それに加えてマイナーバージョン「.1」みたいな表記がついたのもそれぞれ存在していました。それぞれ中にはCLSIDの値が入っていました。「レジストリをいじるときは自己責任で、下手するとOSがおかしくなる」という先人の言葉がありますが、まぁ、試しにこの情報を元にレジストリを編集してみることにします。

先のPhotoshop.ApplicationのCurVerは2019年版の名前「Photoshop.Application.130」で書き換え、同じくCLSIDは「Photoshop.Application.130」の中のCLSIDと同じ値に設定してあげました。(「Photoshop.Application.130.1」の方が最新バージョンっぽい感じがしますが、結論から言うとこれは関係ありませんでした。(試してみました。))

その結果、外部のプログラムから前と同じように呼び出せるようになりました。それはまぁ、よかったのですが、来年くらいにまたPhotoshopのバージョンが上がった時に同じことをしなくちゃならないのでしょうかね。
Adobe CCの管理ソフトはその辺のレジストリ操作まではやってくれないのかな。それとも、外部プログラムの方の呼び出し箇所で「Photoshop.Application.130」みたいにバージョン番号付きで呼び出す方がいいのかな。複数バージョンを併存できるが故の問題なのかもしれません。

開発日記