2008 . 08 . 07

BlueFeedとスキンファイル軽量化のヒント

BlueFeed RSSフィードを表示するRainmeterスキンをリリースしました。
表示件数やスキンの幅、概要表示有無など数タイプを用意し、ヘッドラインのチェックに実用性とデザインを重視した造りにしました。

今回のスキンは、一年程前に制作し、結局公開しなかった「TabFeed」というスキンが元になっています。このスキンはデスクトップ上端に配置して、タブ部分をクリックすると、RSSのヘッドラインが表示されるというようなスキンでした。 プレビュー画像まで作った段階で、RSSのヘッドラインだけでなく天気情報や画像なども表示できるものをセットにしたらどうかという考えに変わります。
そして、デザインは据え置きでこれを具体化したのが「WEBTAB」というスキン。
これもご覧のようなプレビュー画像まで作った段階で、妙にデザインが気に入らなくなり公開を見送りますが、その後、方向路線を大幅に変更して、日の目を見るに至ったのが「2TONE」というわけです。

今回は当初の「TabFeed」コンセプトであった、必要な時だけスキンをクリックして表示させるというスキンの趣旨に立ち返り、デザインもあらたにこれを作り直したものになっています。

このような開閉式のスキンには次のようなメリットが挙げられます。
  • デスクトップスペースを圧迫しない
  • CPUリソースの消費軽減
特に後者は、大きなスキンでも未使用時の際には閉じて置けば、最小限のリソース消費に抑えることができ、実用という点で考えると、非常にメリットが大きいと思います。

さて、今回最も苦労した点というのが、対応フィードの多様化でしたが、結局はある程度で妥協するという結果になりました。
RSSの構文はHTMLよりは厳密とはいっても、各要素の並び順までは規定していなかったり、省略可能な要素もあったりと、このようなあいまいさを吸収できるパターンで、尚かつ、RSS1.0、RSS2.0、Atom1.0、のすべてに対応するパターンを一つの正規表現にすることは、かなり無理があるからです。
(フォーマットを限定すれば、ある程度はいけるかもしれませんが・・)
そしてもうひとつ、早々に見切りをつけたのが、「概要」の表示です。RSS2.0やAtom1.0ではこの概要の要素にHTMLタグを挿入できますが、最近の多様なコンテンツの多いRSSでは、概要要素内にHTMLページが存在するといってもいいような状態になっています。
このような状態から、概要要素内のテキストだけを抽出するのは、やはり難しいものがあります。
逆にタグを検索してそれを空に置き換える(削除する)ことで、不要部分を取り除き、必要部分を抽出するというのが一般的な手法といえますが、Rainmeterでそういうアプローチができるわけではなく、純粋に一つの正規表現のパターンだけで解決しなければならないからです。
(Substituteに正規表現が使えればなぁ・・)。

このようなこともあり、表示能力というか脆弱性というのは「2TONE」のニューススキンのそれからほとんど向上してません。
この反動もあって、質的にダメなら量でという発想で、サイズや表示件数のバリエーションをいろいろと揃えてみたわけです。

2TONE」では、ヘッドラインの表示件数を増やせないかという質問メールを多くいただいたこともあって、今回は思い切って最高40件表示まで増やしてみました。
そうなると当然、スキンの大きさも半端でなくなるわけですが、前述のように見ない時には閉じておけば(というより、チェックする時だけ開けば)邪魔にはならないし、リソースも食いません。
問題は読み込み時間で、タイトルと概要40件表示に至っては、かなりヘビーなものになってしまいました。
この原因の一つは開閉の際に各パーツを再配置していることです。単に、HideMeter/ShowMeterでパーツを表示/非表示にするだけでは、スキンのウィンドウサイズが追従しない、つまり閉じた状態でもウィンドウサイズは大きいまま。
そこでHideMeter/ShowMeterと同時にMoveMeterで配置座標をいちいち変えているわけ。なので単純に考えて、倍のコマンドが必要ということになります。
(実は、こんなことしなくても使用上問題ないんで、無用な配慮と突っ込まれるとアレですが・・)

そんなんで、今回は少しでもコードをタイトにしようと、徹底的にコードの軽量化を図っています。
不要なコメントや空行はもちろん、長いコマンド名や正規表現、繰り返し使われる文字列はすべて変数化にして、Measure/Meter名も極力短くすることで、183KBあったファイルサイズを61KBまで軽量化することに成功しています。
もちろんファイルサイズが小さくなれば読み込み時間も短縮できるわけで、コードが長ければ長いほどその違いは歴然に現われます。 例えば、繰り返し使用される「!RainmeterShowMeter」などのコマンドも「#!SW#」などと変数にしてしまえば、全体的に短く抑えることができます。コマンド名だけでなく、2回以上の出現する文字列で3文字以上の文字列なら、すべてその対象と考えてよいです。
さらに、正規表現のパターンの一部を変数にするのも有効ですし、「Plugin=Plugins\WebParser.dll」などを「Plugin=#DLL#」に縮めるだけでも、繰り返しが多ければそれだけ効果は大きいです。

さて、このような手法の軽量化も注意点がいくつかあります。
  • 改行は外せない
    各セクションの設定は一行単位で行われ、改行コードが各設定の区切りとなっているので、JavaScriptのように改行を全部取り除いて圧縮するということはできません。
  • 変数をさらに変数化できない
    例えば、!RainmeterShowMeterというコマンドをSHOWと変数にして、同じく!RainmeterHideMeterをHIDEと変数に、これをさらに、ALL = [SHOW][HIDE]などとしても、ALL = [!RainmeterShowMeter][!RainmeterHideMeter]にはならない
  • 各定義名は変数化できない
    変数にできるのは各定義のパラメータ、つまり「=」の右側のみで、たとえば「MeasureName」という定義名自体を変数にはできない。
上のようなことができれば、とんでもない軽量化が実現できるはずですが、まぁ、それでなくても、今回、1/3ぐらいなら楽に縮めることができることが分かりました。
今回のスキンでは、さらに、インデントのタブを削れば2%、さらに各パラメータを徹底的に短い変数にして極限まで縮めれば、もう10%ぐらい小さくなるはずです。
でも、今回はそこまではやっていません。
なぜなら、そこまでやってしまうと、作った本人さえ何が何だか分からなくなってしまうからです(笑)。
、ということで、今回は辛うじて、どの部分は何だかが自分で判断できる範囲に止めておきました。
よって、おそらく他のユーザーがカスタマイズしようとして開いてみても、理解に苦しむ部分が多いと思います。ほとんど、セッテイング項目として用意した部分以外は弄れないスキンと思ってもらってよいでしょう。

今回のスキン制作は、機能面やデザイン面よりも、むしろこのような、如何に無駄のないスマートなコードを書くかということに面白さを感じることとなりました。
おそらく、こういう地味なことにはあまり神経を使われない方もいるかと思いますが、少し工夫するだけで立ち上がりや更新の速度を早めることができるので、もし長いコード(スキン)を作成することがあるのなら、試してみてください。


#1
2008 . 08 . 15  06 : 53 PM
774

BlueなのかBlerなのかはっきりしてください。

#2
2008 . 08 . 16  07 : 13 PM
kenz0

BlueFeed が BleuFeed になってましたね ^^;