Thunderbirdアドオンの作り方(その1:概要とinstall.rdf)

January 30,2018 12:03 AM
Category:[開発]
Tag:[Thunderbird]
Permalink

Thunderbirdアドオンの作り方について解説します。その1は概要とinstall.rdfです。

このシリーズでは次のような「テスト」というボタンを表示します。

Thunderbirdアドオン

このボタンをクリックすると、JavaScriptのアラートを表示します。

Thunderbirdアドオン

サンプルは下記のリンクをクリックしてダウンロードしてください。

test@hoge.zip

1.概要

Thunderbirdアドオンは、Thunderbirdに新たな機能を追加するものですが、Thunderbird自体がDOM構造となっており、それらをJavaScriptで制御するイメージです。

またThunderbirdに追加するボタン類などはHTML、見栄えもCSSで作るのでウェブ系のスキルがあれば作ることは可能と思います。

ただ、HTML/CSS/JavaScriptの連携やローカライズのための独特なお作法があります。

それらを実現するため、Thunderbirdアドオンは下記のようなファイル構造になっています。

test@hoge.com
├chrome
│ ├ content
│ │ ├ test.xul
│ │ └ test.js
│ ├ locale
│ │ ├ en
│ │ │ └ menu.dtd
│ │ └ ja
│ │ └ menu.dtd
│ ├ skin
│ │ ├ test.css
│ │ └ test.png
│ └ test.manifest
├ chrome.manifest
└ install.rdf

Windowsの場合、このファイルを

C:\Users\[user]\AppData\Roaming\Thunderbird\Profiles\[profile]\extensions

配下に配置することで、アドオンとして認識してくれます。

各ファイルについて一度にすべてを解説するとわからなくなると思うので、1つずつ解説していきます。

まず最初に、アドオンのインストール時に読み込まれるinstall.rdfについて解説します。

ちなみに、現在のFirefoxやThunderbirdのアドオンを公開している公式サイトに登録するには、ここで紹介するファイル構造では承認されないようですが、キモとなる部分は変わらないと思うので、

2.install.rdf

install.rdfを設定することで、Thunderbirdを起動したときにインストール対象と認識してくれます。

インストール対象

install.rdfのサンプルは次の通りです。

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
 
    <em:id>test@hoge.com</em:id>
    <em:version>1.0.0</em:version>
    <em:type>2</em:type>
 
    <em:targetApplication>
      <Description>
        <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
        <em:minVersion>3.0</em:minVersion>
        <em:maxVersion>24.*</em:maxVersion>
      </Description>
    </em:targetApplication>
 
    <em:name>Test Addon</em:name>
    <em:description>This is the test addon for Thunderbird</em:description>
    <em:creator>Yujiro Araki</em:creator>
    <em:homepageURL>http://www.koikikukan.com/</em:homepageURL>
 
    <em:localized>
        <Description>
            <em:locale>ja</em:locale>
            <em:name>テスト</em:name>
            <em:description>テストアドオン</em:description>
            <em:creator>荒木勇次郎</em:creator>
        </Description>
    </em:localized>
 
  </Description>
</RDF>

3行目までは固定です。5行目以降の各項目の意味は次のとおりです。

  • id:アドオンのid。フォーマットは"myextension@mysite.com"になります
  • version:アドオンのバージョン
  • type:"2(拡張機能)"を指定
  • targetApplication:ターゲットのアプリケーション。ここではThunderbirdがターゲットアプリケーションになるので、そのための設定が必要
    • id:"{3550f703-e582-4d05-9a08-453d09bdfdc6}"を固定で設定
    • minVersion:最小バージョン
    • maxVersion:最大バージョン
  • name:アドオンの名称
  • description:アドオンの説明
  • creator:開発者名
  • homepageURL:アドオンのサイト
  • localized:ローカライズ用のデータを指定
    • locale:ロケール。ここではjaを指定
    • 以下省略

他にも設定項目があります。詳細を知りたい方は下記のページをご覧ください。

Install Manifests | MDN

Comments [0] | Trackbacks [0]

リンカスクリプトでシンボル単位にアドレスを指定する方法

January 26,2018 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

リンカスクリプトでシンボル単位にアドレスを指定する方法を紹介します。

1.問題点

C/C++で下記の簡単なサンプルを作りました。

#include <stdio.h>
 
int a;
int b[10];
char c[10];
 
int main(void) {
    printf("&a:%p\n", &a);
    printf("&b:%p\n", &b);
    printf("&c:%p\n", &c);
 
    a = 100;
    b[0] = 1;
    c[0] = 'x';
 
    printf("a=%d\n", a);
    printf("b[0]=%d\n", b[0]);
    printf("c[0]=%c\n", c[0]);
    return 0;
}

実行結果

% ./a.out
&a:0x10020180
&b:0x10020184
&c:0x10020318
a=100
b[0]=1
c[0]=x

この実行ファイルのマップは次のようになっています(マップを出力するにはgccまたはg++に"-Wl,-M"を設定)。

 .bss           0x0000000010020180      0x1fc /tmp/ccuc7H46.o
                0x0000000010020180                a
                0x0000000010020184                b
                0x0000000010020318                c

このa,b,cの3つのシンボル(変数)について個別にアドレスを指定したいのですが、方法がわかりません。

ということで、リンカスクリプトでシンボル単位にアドレスを指定する方法を紹介します。

2.シンボル単位にアドレスを指定する

シンボル単位にアドレスを指定するには、下記赤色(リンカスクリプト抜粋)の部分を追加します。

  .bss :
  {
   *(.bss)
     a = ABSOLUTE(0);
     b = ABSOLUTE(4);
     c = ABSOLUTE(100);
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
   /* Align here to ensure that the .bss section occupies space up to
      _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections.
      FIXME: Why do we need it? When there is no .bss section, we don't
      pad the .data section.  */
   . = ALIGN(. != 0 ? 64 / 8 : 1);
  }

シンボルにアドレスを指定するフォーマットは次のとおりです。

SECTIONS
{
  <section> :
  { *(<section>)
    <symbol> = ABSOLUTE(<address>);
  }
}

アドレスにはセクション内の相対アドレスを設定します。

今回の設定では、

SECTIONS
{
 :
  .bss :
  {
   *(.bss)
     a = ABSOLUTE(0);
     b = ABSOLUTE(4);
     c = ABSOLUTE(100);
 :
  }
 :
}

という風に、ABSOLUTEに.bssセクションからの相対アドレスを設定することで期待する動作になりました。

aの"0"は、.bssセクションから+0番地、bの"4"は、.bssセクションから+4番地、cの"100"は、.bssセクションから+100番地になります。

実行結果

% ./a.out
&a:0x10020178
&b:0x1002017c
&c:0x100201dc
a=100
b[0]=1
c[0]=x

アドレスはうまく設定されているようですが、マップ上のアドレスは相対指定した値がそのまま入っています。

 .bss           0x000000001002037c        0x0 /usr/lib/gcc/ppc64-redhat-linux/4.8.5/../../../../lib64/crtn.o
                0x0000000000000000                a = 0x0
                0x0000000000000004                b = 0x4
                0x0000000000000064                c = 0x64

nmコマンドではアドレスが割り当てられています。

% nm ./a.out
 :
0000000010020178 B a
000000001002017c B b
0000000010020178 b completed.8008
0000000010020000 W data_start
0000000010020038 d deregister_tm_clones
0000000010020068 d frame_dummy
0000000010020078 D main
                 U printf@@GLIBC_2.4
0000000010020048 d register_tm_clones
00000000100201dc B c
 :

ちなみに下記のように絶対アドレスを設定すると、

SECTIONS
{
 :
  .bss :
  {
   *(.bss)
     a = ABSOLUTE(0x10020178);
     b = ABSOLUTE(0x1002017c);
     c = ABSOLUTE(0x100201dc);
 :
  }
 :
}

ビルドはOKですが、Segmentation faultになります。設定アドレスが.bssセクションのアドレスに加算されてしまうためです。

実行結果

% ./a.out
&a:0x200402f0
&b:0x200402f4
&c:0x20040354
Segmentation fault (コアダンプ)

ということで、シンボルにアドレスを指定する場合は現在のアドレスからの相対アドレスになります。

3.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]

position:relativeを設定すると他の要素がずれる場合の対処

January 25,2018 12:03 AM
Category:[CSS]
Tag:[CSS]
Permalink

position:relativeを設定すると他の要素がずれる場合の対処方法を紹介します。

1.問題点

下記のサンプルを作りました。

<style>
.body {
    width: 300px;
    height: 200px;
    border: 1px solid #000;
    text-align: center;
}
.box {
    width: 100px;
    height: 50px;
    background: #ccc;
    line-height: 50px;
}
.foo {
    text-align: center;
}
</style>
<div class="body">
    <div class="foo box">test1</div>
</div>

このサンプルで、test1を基準にposition:relativeで移動したtest3を追加します。

<style>
 :
.bar {
    position: relative;
    top: 20px;
    left: 150px;
}
</style>
<div class="body">
    <div class="foo box">test1</div>
    <div class="bar box">test3</div>
</div>

上記の例では期待通りの動作になりますが、下記のようにtest2というボックスが存在するものとします。

<div class="body">
    <div class="foo box">test1</div>
    <div class="foo box">test2</div>
</div>

ここにtest3を挿入します。

<div class="body">
    <div class="foo box">test1</div>
    <div class="bar box">test3</div>
    <div class="foo box">test2</div>
</div>

test1とtest2はくっついたままにしたいのですが、test3分の高さがtest1とtest2の間に挿入されてしまいます。

2.対処方法

test3のマークアップ位置を最後に移動し、test2を基準にしたtest3にします。

<div class="body">
    <div class="foo box">test1</div>
    <div class="foo box">test2</div>
    <div class="bar box">test3</div>
</div>

あとはCSSのtopプロパティを変更すればOKです。

.bar {
    position: relative;
    top: -30px;
    left: 150px;
}

3.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages