Plymouth テーマのカスタマイズ

Plymouth は、RedHat が開発して Fedora 10 から導入され始めたグラフィカルブート機能を提供するプログラム。

Ubuntu にも 10.04 LTS Lucid Lynx で採用されることになったため、そのテーマを変更するのに役立つ情報をちょっと集めることに。

https://wiki.ubuntu.com/Artwork/Documentation/Plymouth

Plymouth のテーマと格闘するスレッド @ Ubuntu 本家公式フォーラム:

Plymouth theming?

以下は上のフォーラムのスレッドなどで紹介されていた Plymouth 解説ウェブサイトページの翻訳。内容を理解してないまま翻訳してる部分が多々あり、誤訳があるかもしれないので要注意。^^;

Plymouth の開発に携わってる(?)らしき人が自身のブログで Plymouth のテーマのカスタマイズの仕方を伝授。

Plymouth で使用するスクリプト言語の文法などについて説明した freedesktop.org の公式 wiki ページ。

また、「その他」と題して、Plymouth 全般についてまとめています。


Plymouth テーマ作成ガイド

原文:http://brej.org/blog/?cat=16

訳注:このガイドの原文は4回のブログ投稿に分けられた4部構成になっています。翻訳では、その第1部をほとんど削って、自分が Ubuntu 10.04 で試した部分だけを「テーマのテスト」と題して残し、ガイド全体を3部構成に改変しています。原文は Fedora をベースにしているようなので、Ubuntu のために注釈を加えた箇所もあります。また、ガイドで使用しているテーマのテンプレートも Fedora での利用が前提で、Ubuntu 上でそのまま使用すると起動時の FSCK のメッセージの表示などに影響が出る可能性があるかもしれません。したがって、ガイドのテンプレートの利用は確認程度にとどめ、本格的に利用するテーマのカスタマイズは、Ubuntu 標準の ubuntu-logo テーマをコピーしたものに手を入れていくようにした方が無難と思われます。

テーマのテスト

* Ubuntu では、plymouth の他に plymouth-x11 パッケージがインストールされていることを前提。

端末から以下を実行。

Plymouth デーモンの起動 :

plymouthd (* Ubuntusudo plymouthd )

Plymouth のスプラッシュの表示 :

plymouth --show-splash (* Ubuntusudo plymouth --show-splash )

Plymouth の終了 :

plymouth --quit (* ubuntusudo plymouth --quit )

以上を試すと Plymouth のプログレスが遅い可能性がありますが、それは、進行の見積りにイベントを利用していて、前回ブートのイベント開始時間が元になっているからです。

スプラッシュを 10 秒間表示させプログレスの動きを見たい場合は以下を実行します。 :

plymouthd; plymouth --show-splash ; for ((I=0; I<10; I++)); do plymouth --update=test$I ; sleep 1; done; plymouth --quit

Ubuntu の場合は、

sudo plymouthd ; sudo plymouth --show-splash ; for ((I=0;I<10;I++)); do sleep 1 ; plymouth --update=event$I ; done ; sudo plymouth --quit

システムには複数のテーマがインストール済みです。テーマのリストを表示するには以下を実行します。(* Ubuntu では、プリインストールされたグラフィカルなテーマはデフォルトの ubuntu-logo テーマだけです。公式リポジトリに他テーマのパッケージがいくつか用意されていて、Synaptic パッケージマネージャを利用してインストールできます。) :

plymouth-set-default-theme --list

Ubuntu では update-alternatives --display default.plymouth

テストするテーマを変更するには、–list をリスト中のテーマ名に置き換えます。 :

plymouth-set-default-theme spinfinity

Ubuntu では sudo update-alternatives --config default.plymouth を実行して表示される選択肢からテストするテーマを選びます。デフォルトの ubuntu-logo に戻すには同コマンドを実行して選択肢から ubuntu-logo.plymouth を選択するか、または sudo update-alternatives --auto default.plymouth を実行します。

テーマの編集

テーマとプラグインの違いは重要です。 テーマはプラグインを使用し、プラグインが使用するパラメータのいくつかを指定します。この情報は、/usr/share/plymouth/themes/ (* Ubuntu の場合は /lib/plymouth/themes/ )に保存されています。各ディレクトリには、当該テーマが使用するプラグインとそのプラグインのパラメータの指定を記述した .plymouth ファイルがあります。テーマを新規作成するには、ディレクトリを新しい名前で丸ごと単純にコピーし、.plymouth ファイルもその新しい名前に変更してその内容を更新します。加えて、新しいカスタムテーマに使用する画像に置き換えることもできます。

既存のプラグインの1つを再利用したい場合は以上で十分です。さらなるカスタマイズのために、自分だけのプラグインを C 言語で書くこともできますが、それは率直に言って難しいことです。より簡単な別の方法は、Script プラグインを使用して、テーマを記述するスクリプトを書くことであり、その方法をこれから説明していきます。

まず、ちょっとした参考例的なスプラッシュの作成手順を紹介します。このパートは非常に易しいので、プログラミング経験がない人でも問題ないでしょう。始めに、テンプレートとなるテーマをダウンロードしてインストールします。:

wget -O /tmp/mytheme.tar.gz http://brej.org/blog/wp-content/uploads/2009/12/mytheme.tar.gz
cd /usr/share/plymouth/themes/
tar xzf /tmp/mytheme.tar.gz

テーマがこれでインストールされます。

Ubuntu では、さらに次のコマンドの実行がインストールに必要。

sudo update-alternatives --install /lib/plymouth/themes/default.plymouth default.plymouth /lib/plymouth/themes/mytheme/mytheme.plymouth 10

このテーマに切り替えるには、 :

plymouth-set-default-theme mytheme

Ubuntu の場合、
sudo update-alternatives --config default.plymouth で mytheme.plymouth を選択。

そして、テスト実行 :

plymouthd --debug --debug-file=/tmp/plymouth-debug-out ; plymouth --show-splash ; for ((I=0;I<10;I++)); do sleep 1 ; plymouth --update=event$I ; done ; plymouth --quit

Ubuntu では、

sudo plymouthd --debug --debug-file=/tmp/plymouth-debug-out ; sudo plymouth --show-splash ; for ((I=0;I<10;I++)); do sleep 1 ; plymouth --update=event$I ; done ; sudo plymouth --quit

今回の場合はデバグ情報が生成され、/tmp/plymouth-debug-out ファイルにより多くの内容が含まれることに気づきます。この情報は、作成したスクリプトに存在する文法エラーを発見するのに役立ちます。このファイルをテキストエディタで開いたままにしておき、毎回のエラー確認のための実行後に元の保存状態に戻せるようにしておくと良いでしょう。以下のように、文法エラーには、エラー原因の式が記述されている行(L)と列(C)の番号が含まれます。 :

Parser error “/usr/share/plymouth/themes/mytheme/mytheme.script” L:8 C:42 : Expected ‘;’ after an expression

mytheme ディレクトリには、mytheme.script という名前のファイルが存在します。これを任意のテキストエディタで開いて見てみると、スクリプトの一番上には、このテーマを形成するための数行の記述があり、その下には、パスワードのダイアログ(Dialogue)やプログレスバー(Progress Bar)などを制御するセクションがあります。 今のところ、Dialogue より下はそのままにしておきましょう。

# 記号で始まる行はコメントなので、実行される最初の2行の方まで飛びます。

flower_image = Image(“flower.png”);
flower_sprite = Sprite(flower_image);

mytheme ディレクトリに画像がいくつか存在するのに気づきますが、そのうちの1つが flower.png (Nicu から引用、クリエイティブ・コモンズの表示-継承ライセンス CC-BY-SA)であり、最初の行によって読み込まれます。この読み込まれた画像は flower_image に割り当てられて、スプライトによって利用されます。スプライトとは、画面上の配置位置情報をともなった画像のことです。2番目の行は flower_image を使用してスプライトを作成します。デフォルトでは画面の左上 X=0, Y=0 に配置されます。スプライトの位置を変更するには、SetX と SetY 関数を当該スプライトに使用します。以下の行を追加すると、スプライトが右方向に 100 ピクセル移動した配置になります。

flower_sprite.SetX(100);

同様に Y 位置を設定すると、画像の配置は画面の下方向に移動します。

flower_sprite.SetY(400);

スプライトが画面の境界をまたがってしまっても特に問題がないことがわかります。また、プログレスバーが flower スプライトの手前に表示される様子もわかります。スプライトには、どちらを手前に表示されるか指定する既定の並び順があります。これを実地で検分するために、別のスプライトを追加してみましょう。flower_image を再び使用して元々の flower スプライトに重なるように配置します。

other_flower_sprite = Sprite(flower_image);
other_flower_sprite.SetX(-100);
other_flower_sprite.SetY(200);

負の座標値は利用できます。新しいスプライトが最初のスプライトの手前に配置されます。これを変更するには、各スプライトが持つ Z 軸値を変更します。Z 軸値が高いほど、そのスプライトは手前に配置されます。元々の flower スプライトを一番手前にするには、その Z 軸値を高くしてやります。デフォルトの Z 軸値は 0 なので、それを SetZ を使用して変更します。

flower_sprite.SetZ(10);

元々のスプライトは、他のスプライトやプログレスバーよりも手前に来ます。プログレスバーも Z 軸値のデフォルトは 0 に設定されています。 一般的に、壁紙画像については Z 軸値を高い負の値にして強制的に一番後ろになるようにし、パスワードのダイアログについては Z 軸値を 10000 にしてテーマの構成部品のどれよりも一番手前に配置します。したがって、10000 より高い位置にスプライトを配置しないようにしてください。そうしないと、パスワードの入力が困難な状態に遭遇してしまう可能性があります。

では、元々のスプライトを背景の方に戻して再配置しましょう。X,Y と Z を一度に同時にセットしたいと思うことがよくあるでしょうが、これは SetPosition 関数を使用すれば可能です。

flower_sprite.SetPosition(0, 0, -10000);

X, Y,  Z 軸値の他、スプライトには不透明度の設定もできます。デフォルトの設定では 1 になっていて、スプライトは完全に不透過になっています。0 から 1 の間の数値で、スプライトを割合的に透過させます。これは、SetOpacity を使用して設定します。

other_flower_sprite.SetOpacity(0.3);

これを 0 に設定すると、スプライトは完全に見えなくなります。こうすると、元々のスプライトの方が画面に表示されます。

other_flower_sprite.SetOpacity(0);

flower の画像はとても素晴らしいのですが、形状と大きさが間違っています。利用が想定されるあらゆる画面解像度ごとに画像を用意して配布することも可能かもしれませんが、それでは非常に容量を消費してしまいます。そうする代わりに、必要に合わせて画像の大きさを変更することができます。大きさを変更した新しい画像は Scale を使って作成でき、スプライトが表示する画像の変更には SetImage を使用します。

resized_flower_image = flower_image.Scale(640, 480);
flower_sprite.SetImage(resized_flower_image);

mytheme_scale

これで画像は 640×480 に大きさが変更されますが、これは画面の解像度と等しくありません。今の段階では、モニタを1つだけ接続していることを仮定します(後ほど、より詳しく説明します)。画面の幅と高さの情報を取得するには、Window.GetWidth() と Window.GetHeight() を使用します。これらを利用すると、画像の大きさを画面と同じ大きさに変更できます。

screen_width = Window.GetWidth();
screen_height = Window.GetHeight();
resized_flower_image = flower_image.Scale(screen_width, screen_height);
flower_sprite.SetImage(resized_flower_image);

これで画像の大きさは画面全体を覆うように変更されますが、縦横比は間違ったままです(この参考例の画像ではそれが分かり難いですが)。これを修正するにはプログラミングがいくらか必要となり、それを次のパートで紹介していきます。

Plymouth テーマ作成ガイド 第2部

このパートは、初心者から中級者向けです。プログラミング経験がまったくない人にとっては大雑把な紹介となってしまうので、分からない事について助けを求める必要が出てくるかもしれません。

今までの参考例はすべて単純な引数を扱っていて、「プログラミング」と呼べる部分がそれほどありませんでした。前パートの最後では、縦横比をおかしくしないようにしつつ背景画像の大きさを変更する必要性が生じました。もしこの画像の幅が画面よりも広い場合、画像を画面の高さに合うように拡大させて、両サイドが画面の境界にまたがるようにする必要があります。また、画像の高さが画面よりも大きい場合は、画面の幅に合わせて画像を拡大させて、画面の上と下の境界に画像がまたがるようにします。

スケール率

前パートで紹介した Window.GetWidth と Window.GetHeight 関数を使用すると、画面の縦横比を取得できます。縦横比は、幅に対する高さで表わされます。数値が高くなるほど、形状の高さは大きくなります。

screen_ratio = Window.GetHeight() / Window.GetWidth();

GetWidth と GetHeight 関数は、画像に対しても有効です。

flower_image_ratio = flower_image.GetHeight() / flower_image.GetWidth();

大きさを変更した画像を作成するには、スケール率を決定する必要があります。画面の高さが大きい場合、画像の横方向は画面からはみだしても高さは同じになるようなスケール率にします。ワイド画面に対しては、画像の上下方向は画面からはみだしても幅はその画面と同じになるようにします。これで、そのスケール率を画像の高さと幅の変更に利用できます。

if (screen_ratio > flower_image_ratio)
{  # 画面の縦横比が画像の縦横比より大きく縦方向に長い場合、画面の高さの方に合わせる
scale_factor =  Window.GetHeight() / flower_image.GetHeight();
}
else
{  # 画面の縦横比が画像の縦横比より小さく横方向に長い場合、画面の幅の方に合わせる
scale_factor =  Window.GetWidth() / flower_image.GetWidth();
}
scaled_flower_image = flower_image.Scale(flower_image.GetWidth()  * scale_factor,
flower_image.GetHeight() * scale_factor);
flower_sprite = Sprite(scaled_flower_image); # 大きさ変更した画像を利用してスプライトを作成

これで画像の大きさは正しい縦横比になったので、今度は画面の中央への配置が必要になります。

flower_sprite.SetX(Window.GetWidth()  / 2 – scaled_flower_image.GetWidth()  / 2); # 中央に配置
flower_sprite.SetY(Window.GetHeight() / 2 – scaled_flower_image.GetHeight() / 2);
flower_sprite.SetZ(-10000); # 一番後ろに配置

テーマの配置

これまで説明してきた通りであれば、手元のコードはこの様になっているはずです。:

flower_image = Image(“flower.png”);

screen_ratio = Window.GetHeight() / Window.GetWidth();
flower_image_ratio = flower_image.GetHeight() / flower_image.GetWidth();

if (screen_ratio > flower_image_ratio)
{  # 画面の縦横比が画像の縦横比より大きく縦方向に長い場合、画面の高さの方に合わせる
scale_factor =  Window.GetHeight() / flower_image.GetHeight();
}
else
{  # 画面の縦横比が画像の縦横比より小さく横方向に長い場合、画面の幅の方に合わせる
scale_factor =  Window.GetWidth() / flower_image.GetWidth();
}

scaled_flower_image = flower_image.Scale(flower_image.GetWidth()  * scale_factor,
flower_image.GetHeight() * scale_factor);
flower_sprite = Sprite(scaled_flower_image); # 大きさ変更した画像を利用してスプライトを作成

flower_sprite.SetX(Window.GetWidth()  / 2 – scaled_flower_image.GetWidth () / 2); # 中央に配置
flower_sprite.SetY(Window.GetHeight() / 2 – scaled_flower_image.GetHeight() / 2);
flower_sprite.SetZ(-10000); # 一番後ろに配置

背景画像をデスクトップに使用しているものと合うようにしたい場合は、テーマのディレクトリにそれをコピーして、そのファイル名の画像を読み込むようにスクリプトを編集します。PNG 形式の画像ファイルのみ利用可能です。

最後に、作成したテーマを Ramdisk にインストールしてコンピュータの起動時に読み込まれるようにするには、plymouth-set-default-theme コマンドに –rebuild-initrd を付け足します。起動を行き詰まらせるようなテーマをインストールしないよう気をつけてください。問題が起きた場合に備えて、カーネルのバックアップまたは initrd イメージを用意するようにしてください。

plymouth-set-default-theme mytheme –rebuild-initrd

Ubuntu の場合、上のコマンドの代わりに sudo update-alternatives --install /lib/plymouth/themes/default.plymouth default.plymouth /lib/plymouth/themes/mytheme/mytheme.plymouth 10 および sudo update-initramfs -u を実行。

アニメーション

手始めに蝶の画像で新しいスプライトを作成します。

butterfly_image = Image(“butterfly0.png”);
butterfly_sprite = Sprite(butterfly_image);

アニメーション・ステップ1

今編集している手元のコードのブロックの下に、refresh_callback と言う名前の関数があります。この関数は、画面が更新される直前に 1 秒間当たり 50 回(システムがビジーでない限り)呼び出されます。この関数内において、スプライトを動かすことができ、その動きは画面上で更新されます。具体例を見てください。:

progress = 0;
fun refresh_callback ()
{
progress++;
butterfly_sprite.SetX(progress);
}

アニメーション・ステップ2

1回の更新ごとに butterfly が右に 1 ピクセル移動しますが、butterfly の羽をはばたかせるには数フレーム必要です。これには、1つの画像だけの読み込みの代わりに、複数の画像から成る配列の読み込みが必要になります。butterfly 画像を読み込んでスプライトを作成する元々の2行の記述を以下に置き換えます。:

for (i = 0; i < 4; i++)
butterfly_images[i] = Image(“butterfly” + i + “.png”);
butterfly_sprite = Sprite();

4つのファイル名を作成するために、文字列を数値と結合させることができます。その次の行では、スプライトが画像と結びつけられていない場合、セットされるまでは単純に空のままにします。以下の1行を refresh_callback 関数内に加えると、4つの butterfly フレーム間でローテーションします。6回の更新当たり1フレームにまでアニメーションの速度を落とすために progress を6で除算するので、数値を整数に丸めるための数学ライブラリ関数を使用します。

butterfly_sprite.SetImage(butterfly_images[Math.Int(progress / 6) % 4]);

アニメーション・ステップ3

sin や cos など、数学関数が他にも用意されています。

SetX 行を以下のように編集すると、butterfly が画面中央で円を描くように動きます。

theta = progress / 100;
butterfly_sprite.SetX(Window.GetWidth() / 2 + Math.Sin(theta) * 200);
butterfly_sprite.SetY(Window.GetHeight() / 2 – Math.Cos(theta) * 200);

アニメーション・ステップ4

円を描いて動くようになると、butterfly が違う方向に頭を向けていて、少し奇妙に見えます。進行方向に頭を向けて飛ぶようにするため、butterfly 画像を回転させる必要があります。画像をスプライトにセットする際に .Rotate(theta) を画像に追加するようにします。これで、シータ(theta)の角度で回転させた新しい画像が作成されます。

butterfly_sprite.SetImage(butterfly_images[Math.Int(progress / 6) % 4].Rotate(theta));

アニメーション・ステップ5

この段階まで到達したならば、自分だけのテーマを作成し始めるのに必要なすべての知識を持っていることになります。利用可能な関数の完全なリストやスクリプトの文法については、freedesktop.org の Plymouth script wiki を参照してください。がんばって、楽しんで、素晴らしいスプラッシュ画面を作ってください。

Plymouth テーマ作成ガイド 第3部

これはテーマ作成ガイドの最後のパートです。前パートの最後で述べたように、テーマを書くのに必要なことすべてはもう既に知っている状態です。このパートでは、自作の2つのテーマを紹介しながら、システムやスクリプト言語の持つ幾分洒落た上級レベルの面を巡ります。これらは知る必要のない事柄であって、便利に思う人がいるかもしれない、単なる気の利いた問題解決策にすぎません。

テーマ

以下のテーマをインストールするには、/usr/share/plymouth/themes (* Ubuntu の場合は、/lib/plymouth/themes )に展開して、適切な plymouth-set-default-theme コマンドラインを実行します(* Ubuntu では、sudo update-alternatives --install /lib/plymouth/themes/default.plymouth default.plymouth /lib/plymouth/themes/テーマフォルダ名/テーマ名.plymouth 優先度の数値(例えば 10,100,150 等のいずれか)

Vizta : http://brej.org/blog/wp-content/uploads/2009/12/vizta.tar.gz

Vista テーマ風の非常にシンプルなテーマ。たった 30 行のカスタムなコードです。

Dandelion : http://brej.org/blog/wp-content/uploads/2009/12/dandelion.tar.gz

このテーマは、システムに負荷をかけることが目的です。2ヶ月前はおよそ 3 fps で動きましたが、現在自分のマシンは 30 fps を叩き出して、いくらかアイドル時間もある状態です。

継承

スクリプト・システムの構築を最初に提案したとき、「もしやるなら、すごくシンプルに保った方がいいんじゃないかな。」と Ray は言いました。私はそれに同意だったので、最小限のスペースですべての機能を実装することを目標としました。思い付いた解決策は、一石二鳥を狙うことです。そして、その石となるのが継承システムです。

継承のための重要な操作は、継承操作子である1本のバー(“|”)です。これは、非常に遅延的な OR 関数として考えてください。具体例として以下の宣言を挙げます。:

A = B | C;

これは、B と C を継承する新しいオブジェクト(A)を作成します。これで A は B に加え予備として C のすべての内容を得ることになります。継承オブジェクトの使用には三通りの方法があります。

ダイレクト

以下の宣言について考えます。:

A = “Seven” | 7;
B = String(A).CharAt(2);
C = 80 + A;

A は、文字列 “image.png” と数値の 7 の継承です。つまり、文字列が選好される状況のときは文字列として振る舞い、数値が選好される状況では数値として振る舞うことを意味します。したがって、B の値は文字列の3番目の文字(”v”)になり、C の値は数値の 87 になります。

こうした種類の継承のおかげで、呼び出す適切な関数を見つけるためのハッシュとして、ネイティブな C オブジェクト(画像やスプライト等)を利用することができるようになります。ネイティブオブジェクトとオブジェクトのテンプレートハッシュ(すべての関数を内包)を継承するオブジェクトが作成されます。コンストラクタ関数も継承を使用してテンプレートに結びつけられます。したがって、それを1つの関数として扱ったり、または関数群の1つのハッシュとして扱うことができ、状況に応じた適切な振る舞いが採用されます。

text_image = Image.Text(“string”); # Image をハッシュとして扱う
png_image = Image(“filename.png”); # Image を関数として扱う

ハッシュ

ハッシュは、システムにおけるメインのコンテナです。オブジェクトが2つのハッシュを継承したとき、内部の要素へのアクセスは、その要素のすべてのハッシュを辿るトリガーになります。

A.a = “a”;
A.b = “b”;   # A: a=”a”, b=”b”
B.b = “B”;
B.c = “C”;   # B: b=”B”, c=”c”
C = A | B;   # C: a=”a”, b=”b”, c=”c”

C に含まれる要素にアクセスするとき、システムは A の内容を見てから B を見ます(その際、それらが継承するすべてのオブジェクトの内容も見ます)。B に含まれる要素は A でオーバーライドされ得ます。これはちょうど Mozilla JavaScript の __proto__ と同様です。

関数

ハッシュと同様、関数が継承されたときは、それら関数を見て回ります。その際、関数は1つづつ実行され、fail の場合に次の関数に移ります。

Fib = fun (v) {if (v <= 2) return 1; else fail;}
| fun (v) {if (FibCache[v]) return FibCache[v]; else fail;}
| fun (v) {return FibCache[v] = Fib(v-1) + Fib(v-2);};

ML言語でプログラムしたことがあるなら、すでにこうしたことを幾分知っていることになります。そうした言語では、関数における変数宣言に定数を置くことができ、与えられたパラメータとその定数がマッチしない関数は fail になります。一方、このスクリプト言語では、関数のどの点でも fail を選択できます。システムはその後、継承に含まれている次の関数の実行を試みます。


Plymouth スクリプト

原文:http://www.freedesktop.org/wiki/Software/Plymouth/Scripts

これは、Plymouth スクリプト言語の簡単な紹介です。
この言語は Javascript や C と共通する点が多いため、そうした言語の知識が既にあるならば、驚くようなことはほとんどありません。

基本

コメント行の記述としてサポートしているのは以下の3種類です。:

# スクリプト形式のコメント行
// C++ 形式のコメント行
/* C 形式のコメント・ブロック、/* は */ */ でネスト可能

基本的なオブジェクト:数値、文字列、ハッシュ、関数、NULL

単純な演算式などの類は、セミコロンで終わらせる必要がありま す。

a = b;

演算式が複数の場合は、{} 括弧を使用してグループ化できます。

{
a = b;
c = a + 8;
}

数値は +, – ,*, /, % を使用して演算できます。複合演算子(+=, /= 等)や、前置または後置のインクリメントおよびデクリメント演算子も利用できます。

a *= ++b;

文字列は + を使用して連結可能です(数値に対しても)。

a = “A” + 7 + “B”;  # 文字列 “A7B” を与える

比較不可能なオペランドの演算は、NULL を返します。

a = “eight” / 2;  # NULL を与える

比較は、真の場合に数値 1 を返し、偽の場合に 0 を返します。

a = (7 >= 6); # a には 1 をセット
b = (“Cat” == “Dog”); # b には 0 をセット

“if/else”、”while”、”for” などの条件制御をサポートしています。

if (a > 0)
{
a–;
b = 0;
}
else
a = 0

条件式において、0 や “”(空の文字列)は偽と評価され、それ以外はすべて真と評価されます。

while (a–)
b *= a;

OR演算は遅延評価されて、最初に真と評価された方の値を返します。(AND演算は最初に偽と評価 された方の値を返します。)

value = cached || (cached = do_lookup (index)); # キャッシュが既にセットされている場合はそれを使用、そうでない場合は loogkup を実行
if (value > 0 && value < 10) valid == 1;

ハッシュは、 ドットや [] 括弧を使用してその内容にアクセスするだけで作成できます。

a.size = 1;
b = a[“size”]; # b イコール 1 に

ハッシュのインデックスは、たとえ数値を使用している ときでも、文字列を使用してすべて行う事が可能です。

a[1] = 1;
a[“1”] = 2; # これで a[1] がイコール 2 に

[] 括弧で囲ったセットを定義すると、0 からインデックスが始まり1づつ増分するハッシュが自動で構築されます。

a = [1, “c”, [3, 2]]; # a[0] イコール 1、 a[1] イコール “C”、 a[2][0] イコール 3、 a[2][1] イコール 2 に

関数の定義にはキーワード “fun” を使用します。

fun functionname (index, par1, par2)
{
if (index == 1)
return par1;
else
return par2;
}

関数はローカル変数を持ちますが、グローバル変数が存在する場合はそ れが代わりに使用されます。

“local” や “global” ハッシュを使用すると、例えば、グローバル変数が既存の場合にローカル変数の強制使用することなどができます。

val = 1;             #グローバル val = 1
fun functionname ()
{
val = 2;           #グローバル val = 2 (グローバル変数が存在。したがって、それを使用。)
local.val = 3;     #ローカル  val = 3(ローカル変数を明示的に使用。)
val = 4;           #ローカル  val = 4(ローカル変数が存在。したがって、それを使用。)
mval = 5;          #ローカル mval = 5   (グローバル変数にもローカル変数にも存在せず。したがって、ローカル変数を作成。)
}

Plymouth インタラクション

Plymouth の基本的なオブジェクトには、Image と Sprite があります。

Plymouth 画像

新しい画像を作成するには、テーマ画像ディレクトリ内にある画像のファイル名を Image に対して与える必要があります。

box_image = Image (“box.png”);
logo_image = Image (“special://logo”);   # “special://logo” は、ロゴ画像を検索する特別キーワード

テキストを元に画像を作成することも可能で、文字メッセージを表示するのに有用です。

warning_image = Image.Text (“システムは FSCK を実行中です。しばらく時間がかかる可能性があります。”);

画像の幅と高さは、GetWidth と GetHeight を使用して指定できます。

logo_area = logo_image.GetWidth() * logo_image.GetHeight();

Rotate と Scale を使用すれば、画像の回転や大きさの変更が可能です。

upside_down_logo_image = logo_image.Rotate (3.1415); # 2番目のパラメータはラジアン単位の角度
fat_logo_image = logo_image.Scale (logo_image.GetWidth() * 2 , logo_image.GetHeight ()) # 画像を2倍の幅に

Plymouth スプライト

上の方法で作成した画像を画面に配置す るには、Sprite を使用します。
新しいスプライトを作成するには、Sprite を呼び出してから SetImage を使用して画像を指定します。

my_sprite = Sprite ();
my_sprite.SetImage (fat_logo_image);

コンストラクタに画像を与える と、スプライトの作成と同時に画像の指定も行えます。

my_sprite = Sprite (fat_logo_image);

新しいスプライトのデフォルトの配置位置は、画面の左上角(0,0)に なっています。配置位置を変更するには、SetX と SetY を呼び出します。

my_sprite.SetX (100);
my_sprite.SetY (200);

スプライトが複数ある場合、どのスプラ イトを手前に表示するか決められれば便利です。これについては、Z 軸を使用して操作します。
より高い Z 数値のスプライトが手前に描画されます。

background_sprite.SetZ (-10);
foreground_sprite.SetZ (10);

SetPosition を使用すると、X、Y、Z を一度にセット可能です。

logo_sprite.SetPosition(100, 100, 0); # X=100, Y=100, Z=0 に配置

SetOpacity でスプライトを半透明にすることができ(不透明度の初期値は 1)、0 にセットした場合は完全に透明になります。

faded_sprite.SetOpacity (0.5);
invisible_sprite.SetOpacity (0);

スプライトの X/Y/Z/Opacity/Image プロパティを取得することも可能です。

sprite.SetOpacity(sprite.GetOpacity()/2);
sprite.SetPosition(sprite.GetX()+1, sprite.Gety()+1, sprite.GetZ());
sprite.SetImage(sprite.GetImage().Rotate(0.1));

ウィンドウの大 きさを知ることは、スプライトの配置に有用です。これは、Window.GetWidth と Window.GetHeight で可能です。

centred_sprite.SetX (Window.GetWidth ()  / 2 – centred_sprite.GetImage().GetWidth()  / 2);
centred_sprite.SetY (Window.GetHeight () / 2 – centred_sprite.GetImage().GetHeight() / 2);

スプライトでウィンドウ全体を完全に覆わない場合、スプライトの背景がいくらか露出することになります。
背景の色を指定するには、Window.SetBackgroud{Top,Botom}Color を使用します。
これらは、0 から 1 の間の RGB 値を取ります。

Window.SetBackgroundTopColor (0, 0, 1);           # 画面の一番上が青色になり、
Window.SetBackgroundBottomColor (0.8, 0.2, 0.1);  # 画面の一番下に向かって徐々に茶色になっていく

Plymouth コールバック

Plymouth.SetRefreshFunction を関数とともに呼び出すと、その関数を1秒間に50回まで呼び出す設定となります。

fun refresh_callback ()
{
time++;
}
Plymouth.SetRefreshFunction (refresh_callback);

その他 のコールバック

具体例

fun progress_callback (time, progress)
{
progress_status = “すでに” + time + “秒間経過しましたが、現在の進行度は”+ (progress * 100) + “% です。”;

}
Plymouth.SetBootProgressFunction (progress_callback);

Plymouth がどの操作モードで開始されたかを判定するには、”boot” や “shutdown”、”suspend”、”resume”、または “unknown” の文字列のうちの1つを返す Plynouth.GetMode を使用します。

if (Plymouth.GetMode () == “suspend”)
{
ShowSuspendBackground();
}

数学関数

基本的な数学関数が用意されています。


その他

Ubuntu 10.04 の /usr/share/doc/plymouth ディレクトリにある README.Debian ファイルには Plymouth の基本的説明が一通り書いてあるので、まず目を通しておくべきだと思います。

Plymouth のスプラッシュ画面の表示具合は、使用しているグラフィックカードのドライバ(ビデオドライバ)に大きく左右されるとともに、カーネル・モード設定(KMS)という仕組みも関係しています。

特に Nvidiaのプロプライエタリ・ドライバ使用時に Plymouth のスプラッシュ画面が16色の低解像度で表示される理由などに関しては、こちらの投稿「Ubuntu 10.04 lucid のグラフィックドライバ(と Plymouth)」が多少参考になるかもしれません。

また、スプラッシュ画面を長く表示させたい、起動画面の変遷をスムースにしたい、といった場合、次のコマンドを実行して FRAMEBUFFER=y と記述された splash という名前のファイルを /etc/initramfs-tools/conf.d ディレクトリに作成すると良いようです。ただし、起動時間が若干長くなる可能性があります。

echo FRAMEBUFFER=y | sudo tee /etc/initramfs-tools/conf.d/splash
sudo update-initramfs -u

先ほどの Readme ファイルによると、Nvidia のプロプライエタリ・ドライバを使用していて、どうしても Plymouth の画面を高解像度で表示させたい場合、サスペンドからの復帰などで問題が発生する可能性があることを覚悟するならば、カーネル起動コマンドに video=vesafb を追加する、つまり /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTvideo=vesafb を追記して、 sudo update-grub を実行、さらに先ほどの echo FRAMEBUFFER=y | sudo tee /etc/initramfs-tools/conf.d/splash と sudo update-initramfs -u を実行する、とあります。

しかし、自分の環境では video=vesafb ではダメ( Plymouth の text テーマに落ちてしまう)で、 vga=795 ならば大丈夫でした。ワイド画面のモニタの場合、スプラッシュ画面のアスペクト比が若干合いませんが。

ちなみに、Plymouth の画面をまったく表示させないようにするには、plymouty-theme-* パッケージをすべてアンインストールするか、先ほどの /etc/default/grub の GRUB_CMDLINE_LINUX_DEFAULT から splash という記述部分だけ削除すればいいようです。

Plymouth テーマ

Andre “Osku” Schmidt という方が製作した space-sunrise テーマ

ダウンロード:

http://gitorious.org/oskude-plymouth-themes/space-sunrise/archive-tarball/master

追記:Ubuntu 用 http://gitorious.org/oskude-plymouth-themes/space-sunrise/archive-tarball/ubuntu

書庫を展開後、同梱の build.sh スクリプト・ファイルを実行してテーマの画像を生成。(事前に Inkscape のインストールが必要。)

space-sunrise.plymouth ファイルの /usr/share/plymouth/themes/space-sunrise となっている記述箇所を Ubuntu では /lib/plymouth/themes/space-surise に変更。(追記で掲示した Ubuntu 用 tar.gz 書庫のリンクを利用した場合、.plymouth ファイルを編集する必要なし。)

注意: Ubuntu 標準のテーマとは違うので、ファイルシステムチェックなどのメッセージが表示されなくなる可能性があります。

16件のコメント »

  1. TOY said

    はじめまして、
    moebuntuというのをやっているTOYといいます。
    ubuntu 10.04から起動画面が変わるということで、
    ひじょうにタイムリーな情報ありがとうございます。
    参考にさせていただきます。
    ブログ上でリンク張らせていただきました。

  2. kawaji said

    本格的なプロジェクトをされてる方からお言葉を頂き、大変恐縮です。
    自分はというと、手始めにガイドにサンプルとして紹介されているテーマの画像素材を置き換えてみようかと Gimp を立ち上げてみたものの、どうしていいか途方にくれてるレベルであったりします。
    蝶の画像を動かすスクリプトを見て、初めて三角関数の実用性を感じたり…
    だもんで、放置状態の Wacom タブレットを Lucid に繋ぎ Gimp 入門&数学やり直しが今年の自分のテーマです。^^

  3. プヨヨネットワークの管理者、オワタです^^ said

    テスト表示は、
    sudo plymouth -show-splash
    じゃなくて、
    sudo plymouth show-splash
    だと思います。
    それと、リストへのインストールは
    sudo update-alternatives –install /lib/plymouth/themes/default.plymouth default.plymouth /lib/plymouth/themes/テーマのフォルダ名/テーマのファイル名.plymouth 優先度(たとえば、100、150など)
    です。
    (set…ってコマンドはもう使えなくなったのは、知っておられるでしょうけど、
     インストール方法は知っておられないかと思いまして。知っていたら、すいません。)

  4. kawaji said

    ご指摘ありがとうございます。
    取り急ぎ目に付いたところを修正しました。
    連続したハイフンが含まれるコマンド ” --install ” など code タグを入れないとこの様に ” –install ” 一つのハイフンのように見えてしまいますね…
    少なくとも、自分の Ubuntu firefox 上では。
    追記:うーん、1つに見えるのではなくて、code タグ使わないと WordPress は連続ハイフンを1つのハイフンに自動変換して表示してしまうようで…
    不便なんで WordPress.com の FAQ などちょっと調べてみます。

  5. kawaji said

    Freedesktop.org のPlymouthスクリプトの説明に関して、「15と16のリビジョン間の差分」を反映させました。
    http://www.freedesktop.org/wiki/Software/Plymouth/Scripts?action=diff

  6. プヨヨネットワークの管理者、オワタです^^ said

    今、思いつきでやってみたところ↓でもできるようです。(10秒テスト表示)
    sudo plymouthd; sudo plymouth show-splash; sleep 10s; sudo plymouth quit
    あと、よければPlymouth設定スクリプトを作成してので使ってください。
    広告と間違われたくないので、http://を省いています。
    pc944.up.seesaa.net/image/plymouth-setting.sh
    ※echo “”が大量にあるのは、見た目を考えてです・・・消していただいても結構です。
    ここにコピーを置いてもらっても結構ですよ^^
    使っていただけたら光栄です。(ホームフォルダに配置してくださいね。)
    ちなみに、私はメニューに
    gnome-terminal –command=’sh ./plymouth-setting.sh’ –hide-menubar –title=’Plymouth設定ツール’
    このようなコマンドとして登録しています。

  7. kawaji said

    連続ハイフンまたはハイフンなし、どちらもオーケーのようですね。
    ハイフン1つだと問題が出るので、ブログでのコマンドの記述に注意したいと思います。
    あと、Plymouth設定スクリプトのご紹介ありがとうございます。
    実は自分も似たようなスクリプトを作ってテーマをとっかえひっかえ試すのに使用しています。
    Ubuntu の利用者は世界中ですから Lucid が正式リリースされたら GUI の Plymouth 用ツールが発表されるんじゃないかなと思ってます。

  8. Plymouthで、4秒ほど待ってからプログレスを表示するには
    どうしたらよいですか?

    あと、(本当に別にしていただかなくてもいいのですが、)Windows7風の
    テーマを作っていただけませんか?

  9. kawaji said

    返信が非常に遅くなって申し訳ありません。
    最近まとまった時間がなく、Ubuntu自体にあまり触れられていません。
    一応、自分の方でもPlymouthの方をちょっといじってみたんですが、これがなかなかうまくいきません。
    きっかり4秒に直接時間設定するのはたぶんできないと思うんで、progress の値を条件にプログレスバーの表示をするように書き換えればいいと思うんですが。

  10. すいません。2日の間、DellPCをいじってまして。
    えっと別にきっかりでなくていいので、(別に5秒でもなんでもいいんで、)
    どうすればよいかアドバイスをもらえないでしょうか?
    私が考えたこととしては、元画像の上に黒の画像をかぶせて、
    一定時間後にサイズを変えて1×1に、みえなくするのがよさそうな感じです。
    プログレスバーとこの処理は分離するべきだと考えたので。
    fun progress_callback (progress, count)
    if (count == 4)
    {
    fat_logo_image = black_image.Scale (black_image.GetWidth() / 1024 , lack_image.GetHeight () / 768)
    }
    Plymouth.SetBootProgressFunction (progress_callback);
    ・・・?
    こんな感じですかね・・・ちょっと今、ある関係で9.10なんでテストできません。
    明日ぐらいに10.04を自宅でインストールさせとくつもりなんで、
    明後日ぐらいにまた報告します・・・。
    いろいろすいません。(_ _)¥

  11. Plymouthの前のものですが、やはりできませんでした。
    結構いい線行ってたきがしたのですが・・・

    それと、
    https://wiki.ubuntu.com/LucidLynx/ReleaseNotes/ja#暗号化パーティションは/etc/fstabに記述しておく必要があります
    releasnoteで見つけた部分なのですが、
    つまり暗号化パーティションから起動する際に
    Plymouthのパスワードプロントが出るということでしょうか?

    違うのであれば、どの場面でパスワードプロントが出るのか教えていただきたいです。

  12. kawaji said

    暗号化パーティションから起動の場合、Plymouthのスプラッシュ画面でパスワードプロンプトが出るようです。
    lucidリリース前の3月時点、低解像度の画面でプロンプトのメッセージと入力ボックスがかぶるというバグ報告がありました。
    https://bugs.launchpad.net/ubuntu/+source/plymouth/+bug/539723
    この報告に関する動画を見ると、プロンプトが表示されています。
    http://launchpadlibrarian.net/41256521/video-2010-03-18-14-42-23.3gp
    /lib/plymouth/themes/ubuntu-logo/ubuntu-logo.script を見ると、このバグの修正として以下のような記述が追加されてるみたいです。
    # if the user has a 640×480 or 800×600 display, we can’t quite fit everything
    # (including passphrase prompts) with the target spacing, so scoot the text up
    # a bit if needed.
    top_of_the_text = TextYOffset();

  13. kawaji said

    Freedesktop.org のPlymouthスクリプト説明原文の16と17、および 17と18 のリビジョン間の差分を翻訳に反映させました。
    http://www.freedesktop.org/wiki/Software/Plymouth/Scripts?action=diff&rev1=16&rev2=17
    http://www.freedesktop.org/wiki/Software/Plymouth/Scripts?action=diff&rev1=17&rev2=18

  14. 私には理解しずらいです。
    でもなんかすごいことは分かるのですが。
    つまり通訳部分を補正されたということでしょうか。
    私にはそんなことできません〜。

    ・・・それ以前に英語力から見直さないと。

  15. kawaji said

    Freedesktop.org のPlymouthスクリプト説明原文の18と19 のリビジョン間の差分を翻訳に反映させました。
    http://www.freedesktop.org/wiki/Software/Plymouth/Scripts?action=diff&rev1=18&rev2=19

  16. Hey Amazing guide! really taught me alot about using the php admin tools, When you say upload your old wordpress files to the new site, did this mean you had to install a empty wordpress instance onto the new site and overwrite it with the old files
    cartier love bracelet gold weight http://www.myjewelery.net/

RSS feed for comments on this post · TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。