A Day In The Boy's Life -143ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

技能がないのに資格だけとる人って意味がないよね、って話を聞いたりしたことがありますけど、最近そういう知識だけっていうのも場合によっては有効だな、と感じることがあります。


技能と知識という軸で見たとき、確かに知識が5でも技能が1であれば、実践では使えないエンジニアになってしまいますが、 仕事をする上では広い分野で知識があって困ることはありません。

その知識だけしか持たない人を実践の場に出したときは、確かに戦力になるかどうかというのは疑問なときもありますけど、広い分野で話が通じる人というのは結構重宝されたりします。


例えば、私はプログラマーだからアプリケーションレイヤーしかわかりませんとか、ネットワークエンジニアなんでネットワーク以外のことを聞かれても困りますとか、みんなばらばらで個々の領域だけの話しかしないとまとまるものもまとまりませんし、そんな特定分野だけで完結すエンジニアの仕事というのはほとんどありません。

システムを作るにあたっては、業務レイヤーの上位層からアプリケーションやハードウェア、ネットワークなど沢山の専門領域を横断して作り上げていかなければなりません。


なので、上や横の領域に足を伸ばして話ができたほうが都合がいいわけです。

ネットワークといってもその上で動くアプリケーションの要件がわかってないと作り上げることはできませんし、プログラマーだってハードウェアの性能や構成をわかっていないとまともに動かないものが出来上がったりします。


エンジニアもいつまでも下流工程だけをこなすということが、会社の中では難しくなってきたりもするので、無理にでも上流工程へと押し上げられていくことがあります。

そういったときに、特定の分野だけの知識だけでは纏め上げることが難しくなりますし、ベテランのエンジニアと呼ばれる年代で、特定の分野だけしか知識を持たなかったら、使いどころが難しい人となってしまいます。

(よっぽどその分野に特化したスペシャリストであれば話は別かもしれませんけど)


ゼネラリストというのは脆くもあるので、個人的には特定の分野でスペシャリストを目指して、ただそれだけにとどまらず横展開していく人というのが強いのではないかと思ったりします。

全ての分野でスペシャリストを目指すというのは、まず無理ですから何か1つだけでもいいと思っています。

通信簿の5段階評価で、何か1つが5であれば、後は一般的な知識を持っている3を多く持っていると、色々な分野に割って入って話ができ、仕事をする上では重宝されると思います。


そういう位置に立つ人は、知識を身に付ける一つの目標として実戦経験はないものの資格だけとってみるとかそういうことをしてもよいのではないかなと。

ただ、少なくとも資格を取ったということが社会的な地位を得たということと勘違いして、それだけでふんぞり返って口出ししてたら現場のエンジニアからは不評でしょうけど。


まぁ、これは知識だけの話でもなくて、例えば資料をまとめるのがうまいとか、喋るのがうまいとか、そういったまったく他の分野の技能でもいいと思います。

口ばっかりで、というのもある種才能だったりもしますからね。

何れにせよ、自分が専門としている分野以外でも、一般的な話ができる程度の知識を身につけておくことで、特定の分野だけに頼らない仕事というものができるようになると思います。





PHP5における変数の参照渡しについて改めて調べてみると、結構間違った記述をしているサイトが見受けられます。
(PHP5に関するリリース情報のアナウンスの仕方が悪いという意見が多いですけど)


PHP5とPHP4における変数の参照渡しによる挙動の違い


変数の参照渡しとコピーの違いは、下記のスクリプトを実行してみれば明らかです。


<?php

$a = "hoge";

// ここの受け渡しがポイント
$b = $a;

$a = "foo";

echo "\$a is " . $a . "\n";
echo "\$b is " . $b . "\n";

?>

$ php non-reference.php
$a is foo
$b is hoge

<?php

$a = "hoge";

// ここの受け渡しがポイント
$b = & $a;

$a = "foo";

echo "\$a is " . $a . "\n";
echo "\$b is " . $b . "\n";

?>

$ php reference.php
$a is foo
$b is foo


要は、参照渡しは変数のアドレスが渡されるので、元の変数($a)が書き換わると、参照渡しされた変数($b)の値も変わってしまいます。


この辺りの挙動の違いを、昔は良くわからずにいて苦労したのですが、イメージとしてはWindowsにおけるショートカット、Linuxにおけるエイリアスのようなものでしょうか。
例えばショートカット先のWordファイルの中身が書き換わったら、ショートカットも書き換わったWordファイルをきちんと参照してくれます。

同じ内容のWordファイルをコピーしてしまったら、一方を書き換えたら他方は書き換わっていません。

参照を使うの際は、そういう動きをさせたいかどうかさせたいかどうかも選択肢の一つになってきます。

他にも、データをコピーしてしまうと2倍のメモリ空間が使われること意なるので容量の無駄になったり、データをコピーするというのは、コストがかかる動きなので多用するとパフォーマンスに影響がでるといったこともあります。


上記のプログラムはいづれもPHP5で実行してみた結果です。
PHP4での参照渡しがデフォルトで組み込まれているのであれば、この2つのスクリプトは同じ結果となるはずなのにそうではありません。


PHP5における参照が変わったというのが何を意味するかについては、下記のサイトに詳しく書かれています。


はじめに-PHP変数管理解説(1)-参照と値渡しの明確な理解のために @ CPA-LABテクニカル


あと、PHPのマニュアルのオブジェクトと参照 の章も読んでおいたほうが良いでしょう。


PHP5で値のコピー($a = $bのような受け渡し)をした場合、最初はアドレス空間を共有して使っているけど、一方に別の値が代入されたときに別のアドレス空間に分離させる、という動きをするようになっています。
この仕組みをコピーオンライト(Copy On Write)といいます。


データをコピーするという動作は時間がかかる処理になるので、なるべくその動作を少なくするために、必要になるまでは同じ値なら同じデータを「参照」させるようにしよう、というのがPHP5の参照の正体です。
(PHP4の参照とは違う動きです)



オブジェクトの参照渡し


ただし、オブジェクトに関してはデフォルトで参照渡しになっています。


<?php

class hoge {

    var $var = NULL;

    function foo() {
        return $this->var;
    }
}

$obj1 = new hoge();
$obj2 = $obj1;

$obj1->var = "bar";

echo "\$obj1->var is " . $obj1->foo() . "\n";
echo "\$obj2->var is " . $obj2->foo() . "\n";

?>

上記のスクリプトを実行してみると


$ php reference-class.php
$obj1->var is bar
$obj2->var is bar

のようにお互いのオブジェクトのメンバ変数が書き換わっています。
var_dumpで内容を見てみても同じオブジェクトを参照していることがわかります。


object(hoge)#1 (1) {
  ["var"]=>
  string(3) "bar"
}
object(hoge)#1 (1) {
  ["var"]=>
  string(3) "bar"
}

このように、変数をコピー($obj2 = $obj1)しているのに、その後の$obj1のメンバ変数varの値を書き換えると$obj2のメンバ変数まで書き換わっていることから、オブジェクトは参照渡しされていることがわかります。
これを、PHP4で実行させると動作が異なります。


$ php -v
PHP 4.3.9 (cgi) (built: Jul 15 2008 10:14:59)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

$ php reference-class.php
$obj1->var is bar
$obj2->var is

var_dumpで中身を見ると、$obj2のメンバ変数varは初期値のNULLのままです。


object(hoge)(1) {
  ["var"]=>
  string(3) "bar"
}
object(hoge)(1) {
  ["var"]=>
  NULL
}

PHP4のようにオブジェクトをコピーしたい場合は、cloneを付けてオブジェクトをコピーさせます。


<?php

class hoge {

    var $var = NULL;

    function foo() {
        return $this->var;
    }
}

$obj1 = new hoge();
// cloneを付けてオブジェクトをコピーする
$obj2 = clone $obj1;

$obj1->var = "bar";

echo "\$obj1->var is " . $obj1->foo() . "\n";
echo "\$obj2->var is " . $obj2->foo() . "\n";

?>

$ php copy-class.php
$obj1->var is bar
$obj2->var is


規模が大きくなってくると、このような参照渡しを使ってパフォーマンスを改善することができるメリットもある一方で、挙動をしっかりと把握しておかないと、思わぬバグを作ることになってしまいます。
特にPHPの場合、バージョンによって挙動が違うものが多いので、気をつけておきたい書き方の1つになります。





Lunascapeの最新バージョン5.0が正式リリースになったようなので、早速使ってみた。


Lunascape4.0では、Internet ExplorerのエンジンであるTridentと、FireFoxのエンジンであるGeckoを搭載したダブルエンジンが売りでしたが、このバージョン5.0からはもう1つ増えて、SafariやGoogle Chromeで採用されているWebKitも搭載され、トリプルエンジンとなっています。


※ あくまでエンジンが使えるというだけで、IEやFireFoxがLunascapeの中で使えるわけではありません。


Lunascape5.0をインストールしてみる


Lunascapeのサイトからインストーラーをダウンロードし、実行するだけで特に問題ありません。

今、Lunascape4を使っている場合でも、インストールの最後に設定を引き継いでくれる上に、アンインストールまでしてくれるので、そのまま実行させてしまいましょう。


標準では、IEのエンジンであるTridentがインストールされますので、その他のエンジンを使いたい場合は、インストール時にカスタムを選択しておきます。


A Day In The Boy’s Life-Lunascape-1


カスタムでインストールすると、途中でインストールするエンジンの種類が選べます。


A Day In The Boy’s Life-Lunascape-2


以前のLunascapeをインストールしている場合、インストール完了後にアンインストールすることもできます。


A Day In The Boy’s Life-Lunascape-3


以前のバージョンを使っていた場合、Lunascape5を起動した際に設定を引き継ぐか質問されます。

引き継ぐと、Lunascapeの設定やお気に入りなどを引き継いでくれます。

ただ、以前のバージョンで開いていたタブは引き継がれませんので、きちんとお気に入りに入れておくなど対処が必要になります。


A Day In The Boy’s Life-Lunascape-4



Lunascapeの機能


Lunascapeには単独でも色々な機能が用意されています。


- 画面を分割表示


A Day In The Boy’s Life-Lunascape-5

- 表示しているページをそのままキャプチャして保存


A Day In The Boy’s Life-Lunascape-6



- User Agentの切り替え


A Day In The Boy’s Life-Lunascape-7


このほかにもクールなデザインのスキン も多数用意されています。