2010年10月31日日曜日

SQL の相関サブクエリ (2) – EXISTS 述語

SQL の相関サブクエリ – filter 関数から考える」 のつづき

前回、IN 述語と共に使われた相関サブクエリを、関数のネストとの比較を通して動作のイメージを考えた。今回はIN 述語以外の述語で相関サブクエリを使ってみる。

 

EXISTS 述語

まずは代表的な EXISTS 述語。

4894714809プログラマのためのSQL 第2版 の第15章 EXISTS 述語 (p189) によると、

EXISTS 述語の意味はごく自然です。これは、空でない集合の検査です。もし、そのサブクエリーが何らかの行を返せば、結果は TRUE です。そして、さもなければ FALSE になります。 UNKNOWN が結果として返ることはありません。…

(太字は引用者による)

 

対象のデータベース

前回と同じ以下のテーブルで試す。

CropperCapture[7]

データの内容は少し変更した。

オブジェクト図で示すと、

CropperCapture[1]

 

サブクエリが必ず行を返す場合

初めに確認しておくことは、サブクエリがダミーのテーブルを参照し、必ずクエリが行を返す場合。

select *
from persons 
where exists (select 0 as hoge from dual)

サブクエリの結果が必ず存在するので、各要素で exists 述語が True となり、全ての 「人」 が抽出される。

 

相関サブクエリを利用する場合

次に、

「グループ」 に 「割当て」 られた 「人」

を EXISTS 述語を使って抽出してみる。

オブジェクト図で見た場合、「人」 から 「割当て」 へのリンクが存在する人を選び出す。

210-31-2010CropperCapture[2]

SQL を書くときに意識することは、

  1. 抽出したいのは、とある 「人」 なんだけれど、
  2. その人は、「グループ」 に 「割当て」 られている。

という順序。

前回と同じように WHERE 句は集合の要素に対する述語であることを思い出しながら書く。

select * 
from persons as p
where exists (select *
              from assignments as a
              where p.id = a.p_id)

結果は、

+----+--------+--------+-----+
| id | name   | gender | age |
+----+--------+--------+-----+
|  1 | Tarou  |      1 |  10 |
|  2 | Hanako |      2 |  20 |
|  3 | Jirou  |      1 |  30 |
+----+--------+--------+-----+
3 rows in set (0.00 sec)

4894714809上記のサブクエリにおける SELECT 句で `*’ が書かれているのは、

SQL-89 の規則では、サブクエリーは 1 つのカラムか、 * を使った SELECT 句であるとなっています。もし、 SELECT * オプションが使われると、データベースエンジンは、 1 つのカラムを選択し、(理論上は) それを使います。

(プログラマのためのSQL 第2版 の第15章 EXISTS 述語, p189 より)

 

相関サブクエリを利用しない場合

ちなみに相関サブクエリを使わない場合は、

  1. 先に 「割当て」 に注目し、
  2. 「割当て」 に結合する 「人」が
  3. 重複しないように抽出

すればいいので、

select distinct p.*
from assignments as a 
     join persons as p on a.p_id = p.id

 

Haskell で類似したコードを考える

上記に類似したコードを Haskell で考える。

予め SQL の exists 述語に相当する exists 関数を定義しておき、

exists = not . null

これを利用して次のように書く。

filter (\p -> exists
        (filter (\a -> a_p_id a == p_id p)
                assignments))
       persons

( cf. gist: 645292 - GitHub )

リスト内包表記なら、

[p | p <- persons
   , exists [a | a <- assignments
               , a_p_id a == p_id p]]

( cf. gist: 645292 - GitHub )

SQL の相関サブクエリ (3) - 量化された比較述語 ALL, ANY」につづく

2010年10月30日土曜日

コマンドプロンプトから現在のフォルダをエクスプローラで開く

1. コマンドプロンプトから、エクスプローラを開く

コマンドプロンプトで、カレントディレクトリをエクスプローラで開きたい。

そのためには、マンドライン上で以下のコマンドを入力する。

explorer .

explorer の代わりに start でもいい。

 

2. エクスプローラから、コマンドプロンプトを開く

逆に、エクスプローラからコマンドラインを開く場合は、以下を参考に。

一番楽なのは Open Command Prompt Shell Extension をインストールすることかな。

Vista ではエクスプローラ上で、Shift キー押しながら右クリックすると、コマンドプロンプトを開けること知らなかった。。 (+_+)

 

3. Meadow でエクスプローラを開く

Meadow の dired でエクスプローラを開きたい場合の設定はこちら

MySQL でデータベースのエクスポートとインポート

1. データをコピーしたい

MySQL のデータを別の PC 上にコピーしたい。ただし、データベース名は変更する。

例えば、データベース hoge を piyo にインポートする。

 

2. データのエクスポート

コマンドラインより、データをファイル dump_hoge.sql へエクスポート。

mysqldump -u root hoge > dump_hoge.sql

生成されたファイルの中身を見ると、スキーマ名で修飾されていない SQL 文が記述されている。

 

3. データのインポート

インポート先で MySQL に接続。

mysql -u root

スキーマ piyo を作成。

create schema piyo;

エクスポートした dump_hoge.sql をインポート。

mysql -u root piyo < dump_hoge.sql

 

参考サイト

ガラケーで Google 検索したら、携帯対応YY-BOARD(改) に入室できない

ガラケーで表示できない

知り合いのサイトで、携帯対応YY-BOARD(改) の Rev2.52M をパスワード付け、閲覧制限をして運用している。この掲示板に、ガラケーを使って Google モバイル で検索して辿り着いたら、パスワードを入力するフィールドが表示されなかった。そのため、掲示板を閲覧することができず。

ただし、ページの下部に表示されている、

Googleによって携帯電話用に変換されています
ページを直接表示する

のリンクにより、ページを直接表示させたら問題なく表示された。

 

PC 上でサイトを確認

PC 上で確認したら、 サイトビューワ - goo モバイル を使って見た場合は問題なく、Google の携帯のための変換サービスを利用するとだめ。

 

Google Wireless Transcoder で表示されないようにする

Google Wireless Transcoder 【グーグルの携帯電話用ページ変換】 によると、

携帯電話、PDAなどのモバイル端末から、検索エンジンGoogleのモバイル検索を利用した場合に、検索結果で「PCサイト」として表示されたページ、あるいは「パソコン」の絵文字が付いたページに対して、この「Google Wireless Transcoder」がオリジナルのHTMLデータを取得してきて、携帯用に変換したものを表示するシロモノです。

これにより、携帯で見た場合の表示が崩れることがあるようだ。

対策としては、表示しているページの head 要素に以下を加えればいいとのこと。

<link rel="alternate" media="handheld" href="(モバイル向けURLアドレス)" />

( 同上より )

 

コードに追加

とりあえず、掲示板の

  • ルートディレクトリ/lib/lib_ini.pl

における HTMLヘッダ を生成するサブルーチン header に以下の記述を加えた。

新しく変数を宣言。

my $url4mobile = "http://" . $ENV{'HTTP_HOST'} . $ENV{'REQUEST_URI'};

既存の変数 $out の内容の文字列中の `<head>’ 以降に以下を追加。

<link rel="alternate" media="handheld" href="$url4mobile" />

これで直接掲示板を表示してくれるようになった。

 

参考サイト

関連記事

2010年10月23日土曜日

Skype の音質が悪いのでダウングレード

1. Skype 5.0 は音質が悪い

Skype 5.0 にアップデートしたら、ビデオ通話の音質が悪くなった。バリバリと音がしたり、音声が途切れて会話にならず。 (+_+)

ビデオ画面を、独立したウィンドウにした場合の表示も変わってしまい、全般的に使い勝手が悪くなった。

 

2. 安定した古いバージョンを使う

仕方がないので、FileHippo.com より、一つ前のバージョンである

をダウンロード。

Skype 5 をアンインストールした後にインストール。やはり、こちらの方が安定していて音質が良い。

4.1 系列の最終バージョンである Skype 4.1.0.179 も音質が良かったけれど、自分の環境ではビデオ表示がすぐに固まってしまう。

改良が加えられている、マイナーバージョンの最後のバージョンを使っておくのが穏当。(右の一覧を参照)

 

3. 他の音質改善方法

Skypeヘルプ – 音質が悪い場合はどうすればよいですか?」 を参考に、

音質が向上しない場合は、shared.xmlファイルを削除してみてください。

を試してみたら、少し音質が改善。

最後に、QoS(Quality of Service)のパケットスケジュール機能を無効にすることもできます。

は、あまり変化がなかった。

2010年10月21日木曜日

SQL の相関サブクエリ – filter 関数から考える

SQL 嫌い

4873112753SQL は昔から嫌い。そのため、C.J.Date の 「データベース実践講義」 でバッサリと斬り捨てている様はあまりにも心地良く、SQL 批判を全部箇条書きに抜き出そうと考えたけれど、あまりの量に断念した。

複雑で長い SQL は読みにくいし、保守しずらい。パフォーマンスに問題がない限り SQL はできるだけシンプルに保ち、やっかいなことは直感的な理解が可能なアプリケーション層で対応したい。

しかし、自分が苦手だったのは、集合的で宣言的なものの考え方であり、C.J.Date が SQL に対して批判しているタプルの重複や NULL の問題とは無関係だったことに気がついたのは後のこと。

 

相関サブクエリとは

特に理解しずらかったのが 「相関サブクエリ」 。「相関」と言えば 「相関係数」 をすぐに連想してしまうので余計に「何のこっちゃ?」と感じた。

相関サブクエリとは、Correlated subquery – Wikipedia によると、

It is a sub-query (a query nested inside another query) that uses values from the outer query in its WHERE clause. The sub-query is evaluated once for each row processed by the outer query.

つまり、どんなクエリかと言えば、

  • WHERE 句の中で、外側のクエリの値を利用するサブクエリ。
  • 外側のクエリの各行ごとにサブクエリが評価される。

この動作を、クエリの対象として表をイメージし、各々の行ごとに順にサブクエリが実行される様をループとして頭の中に描くと、それは手続き的な見方であり、宣言的な理解からかけ離れてしまう。

以前これを誤解し、「何だかんだ言っても、実行の順序を考えなくてはいけないのか…」 と思っていた。しかし、概念的に言えば、各行のサブクエリが実行される順序に意味はなく、集合の要素として同時に計算が行われる。いや、そもそも同時であるかないか考えること自体お角違い。実際の具体的な計算の過程は実装が考えることであって、リレーショナル代数を利用する側が関心を持つことではない。

 

データベースのサンプル

例えば、「人」 を 「グループ」 に 「割当て」 るモデルを仮定する。

CropperCapture[3]

ERD では下図の通り。 ( MySQL Workbench を利用。 )

CropperCapture[7]

各々のテーブルの値を以下の表に示す。

( cf. ODBC 経由でデータベースにデータを挿入 )

表だと見にくいのでオブジェクト図を示しておく。

CropperCapture[2] 

 

相関サブクエリの例

上記のデータベースに対して、以下の問合せをしたい。

2010 年に 「グループ」 に 「割当て」 られた 「人」 は?

 

相関サブクエリを使わない場合

ここで最初に頭の中に思い浮かんだのは、

  1. 「割当て」 の日付を見て、2010 年のタプルを抽出
  2. 上記 1 のタプルに 「人」 を結合。
  3. ただし、同じ 「人」 が重複しないように気をつける。

という方法。

具体的なクエリは、

select distinct p.*
from (select *
      from assignments
      where year(date) = 2010) as a
     inner join persons as p on p.id = a.p_id

実行すると結果は、

+----+-------+--------+-----+
| id | name  | gender | age |
+----+-------+--------+-----+
|  1 | Tarou |      1 |  10 |
|  3 | Jirou |      1 |  30 |
+----+-------+--------+-----+
2 rows in set (0.04 sec)

このクエリは、 where 句の中で外側のクエリの値を利用していないので、相関サブクエリではない。

 

相関サブクエリを使う場合

相関サブクエリを利用してクエリを書くなら、

select *
from persons as p
where 2010 in (select year(a.date)   
               from assignments as a  
               where p.id = a.p_id)

この書き方は、

  1. 抽出したいのは、とある 「人」 なんだけれど、
  2. その人は、 2010 年に 「グループ」 に 「割当て」 られている。

ということを意識している。

先に 「割当て」 に目を付けるのではなく、 各々の「人」 を中心に考えているところが先ほどと違う点。しかし、当初この書き方がしっくり来なかった。というか where 句の部分をどのようにイメージすればいいのかわからなかった。

 

WHERE 句は集合の要素に対して条件を指定している

ところで、

性別が男性である 「人」

を抽出する SQL はシンプルでわかりやすい。

select * 
from persons
where gender = 1

where 句は 「男性である」 という条件を素直に表現していると感じる。

where gender = 1

これに対し、先ほどの where 句はシンプルとは言い難い。

where 2010 in (select year(a.date)
               from assignments as a
               where p.id = a.p_id)

特に相関サブクエリにおける where 句の p, a をどのように考えればいいのだろう?

 

Haskell で類似したコードを書くと …

まずは、

性別が男性である 「人」

を抽出する SQL と類似したコードを Haskell で考えてみる。

data Person = P { p_id :: Int
                , name :: String
                , gender :: Int
                , age :: Int
                } deriving Show

persons = [ P 1 "Tarou" 1 10
          , P 2 "Hanako" 2 20
          , P 3 "Jirou" 1 30
          , P 4 "Saburou" 1 40]

main = print $ filter (\p -> gender p == 1) persons

特定の 「人」 を抽出するための filter 関数の第1引数の述語が、 SQL の where 句の 「条件」 に相当する。言うまでもなく、この述語の引数 p は各々の 「人」 を表わし、それぞれの人ごとに検査が行われる。

比較すると、SQL ではこの p に相当するものが関数の引数の如く明示されていない。

where gender = 1

これにより、where 句が要素を抽出するための述語であることをつい忘れてしまう。

 

相関サブクエリに類似したものを Haskell で …

次に、

2010年に 「グループ」 に 「割当て」 られた 「人」 は?

の問い合わせを実装することを考える。

全体の形としては、 persons の中から条件に合った人を抽出すればいいので、

filter (\p -> ... ) persons

各々の 「人」 については、SQL の相関サブクエリで書いたコードよろしく、 値 2010 がある集合の要素に含まれるかどうかを調べれば良さげなので、

filter (\p -> 2010 `elem` ... ) persons

ここで上記 ... の中に注目。 各々の  「人」 に対して 「グループ」 への 「割当て」 を調べたいので、その中身は以下のようになるはず。

filter (\a -> ... ) assignments 

「割当て」 の抽出条件は、外側の filter で指定されている 「人」 になるので、外側の変数 p を参照する。

filter (\a -> p_id p == a_p_id a) assignments   

後は値 2010 と比較できるように要素を変換。

全体を示すと以下の通り 。

filter (\p -> 2010 `elem` 
               map (\a -> case toGregorian (date a) of 
                            (y,_,_) -> y)
                   (filter (\a -> p_id p == a_p_id a) 
                           assignments))   
       persons

( cf. gist: 637741 - GitHub )

上記をいきなり見たらわかりやすいとは言い難いけれど、少なくとも変数 p と a が指し示しているものが何であるのかはっきりとする。SQL の where 句は集合の要素に対する述語。要素を参照する変数が明示的に述べられていないが、上記のコードと比較すると相関サブクエリでなぜあのように書くのかイメージしやすくなった。

 

リスト内包表記

ついでなので、上記をリスト内包表記で書くなら、

main = print [p | p <- persons 
                ,  2010 `elem` [case toGregorian (date a) of 
                                  (y,_,_) -> y | a <- assignments
                                               , p_id p == a_p_id a]]       

( cf. gist: 637741 - GitHub )

 

モナド

余談ながら、モナドの bind で書くにはどうすればいいのかな?

直積を作って、後で重複を取り除くという方法で考えるなら、

main = print $ nub $ 
       persons     >>= \p ->
       assignments >>= \a ->
       guard (p_id p == a_p_id a && 
              case toGregorian (date a) of 
                (y,_,_) -> y == 2010) >>
       return p

( cf. gist: 637741 – GitHub )

上記を do 式で書き直すと、

main = print $ nub $ do 
         p <- persons
         a <- assignments
         guard (p_id p == a_p_id a && 
                case toGregorian (date a) of 
                  (y,_,_) -> y == 2010)
         return p

( cf. gist: 637741 – GitHub )

SQL の相関サブクエリ (2) – EXISTS 述語」 につづく。

2010年10月19日火曜日

コマンドラインで mysql を操作

コマンドラインを起動。XAMPP を利用している場合、XAMPP がインストールされているディレクトリ/mysql/bin に移動して

mysql -u root

により MySQL に接続。

次の操作を行う。

  1. スキーマ (データベース) の作成
  2. テーブルの定義
  3. テーブルの変更
  4. テーブルのカラムの確認

12.1.10 CREATE DATABASE Syntax によりスキーマの作成。

create schema hoge;

12.1.17 CREATE TABLE Syntax によりテーブルの定義。

create table hoge.persons (id int primary key);

12.1.7 ALTER TABLE Syntax によりテーブルの変更。

alter table hoge.persons add column (name varchar(45) not null, age int not null);

12.4.5.6 SHOW COLUMNS Syntax により、定義したテーブルのカラム情報を表示。

show columns from hoge.persons

実行すると以下の結果が表示される。

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |  
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |  
| name  | varchar(45) | NO   |     | NULL    |       |
| age   | int(11)     | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

MySQL のテーブル定義とデータを SQL 文で出力 - MySQL Workbench と A5:SQL Mk-2 を使って

MySQL で構築したデータベースのテーブル定義とデータを SQL 文として出力したい。

 

MySQL Workbench で CREATE TABLE 文を生成

CropperCapture[5] - 2

  1. MySQL Workbench の Home より、 Data Modeling > Create EER Model From Existing Database で ERD を生成。
  2. メニューより、File > Export > Forward Engineer SQL CREATE Script... により生成。

または、 SQL Development の SQL Editor を開き、左ペインの Object Browser に表示されている データベースの Tables を右クリック > Send to SQL Editor > Create Statement 。 

 

INSERT 文の生成

A5:SQL Mk-2
  1. A5:SQL Mk-2 でテーブルを開く。
  2. メニューより、テーブル > insert文エクスポート

CropperCapture[3] 

 

MySQL Workbench
  1. MySQL Workbench の Home より、SQL Development 。対象のテーブルのデータを表示させる。 (テーブルを右クリック > Edit Table Data)
  2. メニューより、Query > Export Results ...

CropperCapture[4] 

表示されたダイアログの File Format フィールドで `SQL INSERT statements' を選択。

しかし、テーブル名がだめだった。 (@_@; なんでだろう?

 

関連記事

MySQL Workbench で外部キーの設定

1. テーブル定義

MySQL Workbench で外部キーの設定をしたい。

例えば、「人」 を 「グループ」 に 「割当て」 るモデルで考える。

「人」 (persons) 「グループ」 (groups) に対応したテーブルが定義済みだとする。これに対して、「割当て」 (assignments) に対応したテーブルを作成し、外部キーを設定したい。

 

2. SQL Development で外部キーを設定する場合

MySQL Workbench の Home において SQL Development を選択し、connection でデータベースに接続。

CropperCapture[5]

SQL Editor が開いたら、左ペインの Object Browser に表示されている

  • データベースの Tables で右クリック > Create Table

MySQL には基盤となるデータベースエンジンが複数あり、この中で外部キーをサポートしているのが InnoDB

InnoDB - Wikipedia によると、

InnoDB(イノデービー)はMySQLのためのデータベースエンジンであり、MySQL ABが配布している全てのバイナリに標準搭載されている。MySQLと使用できる他のデータベースエンジンに対する改良点として、PostgreSQLに似たACID互換のトランザクションに対応していることがある。また、外部キーもサポートしている。(これを宣言的参照整合性という)

よって、「Table タブ」 における Engine の選択で InnoDB を選択。

CropperCapture[6]

「Columns タブ」 でカラムの設定をしたら、「Foreign Keys タブ」 で外部キーの設定は行わなわず、Apply ボタンを押して一旦テーブルを作成。

テーブルを作成した後、テーブルを変更する。

  • 右クリック > Alter Table

「Foreign Keys タブ」 で外部キーを設定する。

  1. Foreign Key Name は適当に付ける。
  2. Referenced Table は スキーマ名.テーブル名 で指定。
  3. Column で外部キーを参照するためのカラムを指定。
  4. 参照先のテーブルのカラムを設定。

 

3. Data Modeling を使う場合

既にテーブルを定義している場合、MySQL Workbench の Home より

  • Data Modeling > Create EER Model From Existing Database

により、ERD を生成できる。

CropperCapture[5] - 2

テーブルのカラム定義が済んでいる場合は、Diagram の左下アイコン

  • Place a Relashinship Existing Columns

を選択し、参照するカラムを選択してから、参照先のカラムを選択する。これにより、外部キーを設定できる。

CropperCapture[2]

データベースに変更を反映するには、

  • メニューより Database > Synchronize Model ...

を選択。

 

4. リレーションシップの点線と実線

外部キーを設定するときの線の種類には、点線と実線がある。

点線が Non-Identifying Relationship で、実線が Identifying Relationship 。

この違いは、(7.7.2.1 Adding Foreign Key Relationships Using an EER Diagram によると、

An identifying relationship is one where the child table cannot be uniquely identified without its parent.

Identifying Relationship の方は、参照する側 (子) が存在するには、参照される側 (親) が存在する必要がある場合に使うようだ。

テーブルの定義としては、点線の方は、カラムに外部キーの制約付けられる。実線は、参照する側のカラムが主キーの一部となることが加わる。

ps ファイルを pdf へ変換 - PDFCreator

たまに ps ファイルを読みたいことがある。これを PDF に変換したい。

お手軽なのは PDFCreator を使うこと。インストール時のオプションで

  • Associate PDFCreator with the .ps file extention

のチェックを付けておく。

img10-19-20101

インストール後に Firefox で ps ファイルを開こうとすると、以下のダイアログが表示されるので 「PDFCreator で開く」を選択。

img10-19-20102

PDFCreator で PDF を生成したら、PDF-XChange Viewer 等で PDF ファイルを開く。

 

参考記事

2010年10月15日金曜日

Windows Vista を軽くする基本的な設定の落し所

1. スリープ復帰後の反応が悪い

Vista を使っていて一番イライラするときのは、レスポンスが悪いこと。

特に、ファイルやフォルダを右クリックした後、クルクルと回る光る青い輪のアイコンを眺めると、やる気が削がれる。

また、スリープを繰り返すと、どんどん反応が悪くなり、スリープからの復帰時間もかかるようになること。 (+_+)

 

2. レスポンスを良くするユーティリティ

  1. Comfortable PC を使って動作を軽くしたり、
  2. Soluto で起動時間を短縮させたり、
  3. 特定のアプリの優先度を ProcessTamer 調整することにより、

体感速度の向上を試みた。

しかし、自分の環境が悪いのためか、どうしても 2,3 日に一度は再起動が必要になる。

 

3. OS におけるパフォーマンスの設定

Windows Vista には、パフォーマンスを調整する機能がある。

  • コントロール パネル > システムとメンテナンス > システム のシステムの詳細設定 の「詳細設定」タブにおける「パフォーマンス」

において、「パフォーマンスを優先する」を選択。

ただし、この設定を使用すると、外観が Vista らしくなくなる。そこで、

  • コントロール パネル > デスクトップのカスタマイズ > 個人設定 の「ウィンドウの色とデザイン」

において、配色を 「Windows Vista ベーシック」にした。

同設定画面における「効果」ボタンを押し、

  • 次の方法でスクリーン フォントの縁を滑らかにする

で「ClearType」を選択。

「ドラッグ中にウィンドウの内容を表示する」もチェック。

 

パフォーマンスオプションをカスタマイズ

パフォーマンス オプション」を「カスタム」に変更し、以下の 4箇所チェックした。

CropperCapture[2]

この設定により、まぁまぁ外観が Vista らしくなると同時に、レスポンスも良くなった。一番改善された点は、スリープからの復旧が早くなったこと。再起動をする必要も大分なくなった。

ユーティリティにはじめから頼らず、OS で用意されている設定を試せばよかったと反省。(@_@; これならデスクトップ PC をVista から XP にダウングレードしなくても良かったかも。

てゆうか早く Windows 7 の 64bit に移行したい。。

Firefox の表示領域を広げるアドオン - Hide Menubar, autoHideStatusbar, Hide Navigation Bar

1. Firefox の表示領域を広げたい

デスクトップの大きな画面に慣れてしまうと、ノート PC でブラウズするのが苦痛でしょうがない。特にワイド画面のノートは縦方向が狭いので、文書を見渡せる範囲が少なく、全体を俯瞰して内容を把握することが難しい。

コンピュータの画面と紙媒体を比較したとき、紙に軍配が上がる点は、

  1. 全体を一望できる視認性と、
  2. 本の厚みから内容の位置情報を直感的に捉えられること。

デスクトップ PC は画面が広いからこそ、このアナログな情報に多少なりとも対抗できる。

Google Chrome は、「タブ」がウィンドウの上辺ぎりぎりに配置され、下部のステータスバーは必要なときにリンクが表示される工夫がされており、表示領域が広くて快適。 Firefox でも Chrome と同じように下図のような外観にカスタマイズしたい。

img [2]

 

2. メニューバーを隠す

Hide Menubar はメニューバーを隠すためのアドオン。

設定画面で Show Menu Bar Automaticaly をチェックしておけば、メニューバーが表示されていた近くにポインタを移動させると、メニューバーが表示されるようになる。

img10-14-20101反応する位置を調整したい場合は、When mouse is below Title Bar in の値を適当に大きくする。

cf. Tumblr で公式が用意している使い方をできるだけ利用する - Hide Menubar で alt キーの動作を抑制

 

3. ステータスバーを隠す

autoHideStatusbar はステータスバーを隠すためのアドオン。

こちらも設定画面の Preferences > 「感度」と「Delay」の値を適当にを変更することによって反応を調整できる。

img10-14-20106

セキュリティのことを考えると良くないのかもしれないが、「ページのロード中」にステータスバーが表示されると邪魔なので、このチェックをはずした。

Google Chrome では、ページのロード中、リンクのみが画面下部に小さく表示される。これも工夫して表示してたんだなぁと気づかされた。

 

4. ナビゲーションバーを隠す

Hide Navigation Bar は、`F2 キー’ を押すことで、ナビゲーションバーの表示/非表示を切り替えることができるアドオン。

設定に自動的に隠すための Auto-Hide があるが、上記 Hide Menubar と併用すると、お互いに表示するタイミングを調整しないと上手く操作できないため、自動的に隠す設定はしなかった。

img10-14-20102

表示/非表示のキーは F2 から自由に変更できる。

追記(2014/8/6): Hide Caption Titlebar Plus に乗り換えた。

 

5. その他

a. タブを上部に表示

タブをナビゲーションバーの上に表示させるには Tabs on Top を利用している。

b. ブックマークツールバーを隠す

ブックマークツールバーを隠したい場合は、Mozilla Re-Mix: Firefoxのブックマークツールバーを自動的に隠すアドオン「Bookmark Autohider」 を参考に。ただし、自分の場合は頻繁にアクセスするものをブックマークツールバーに配置しているので、これを利用していない。

c. FlexBar アドオン
上記をオールインワンで設定できる FlexBar は思うように動作しなかったので、今回は使うのを見送ることにした。