あまり多用すべきではないかも知れませんが,関数内部で宣言したローカルなオブジェクトを外部に持ち出したい場合もあります。下のコードは C++ 標準ライブラリ string 型の実装例の一つ,文字列を連結する演算子です。
template<typename charT>
sequence<charT>
operator + (const sequence<charT> &L,
const sequence<charT> &R )
{
sequence<charT> str (L);
str.append(R);
return str;
}
「このオブジェクト str はいつ破棄されるのか?」「破棄が起こる前にちゃんと値が返されて,外部のオブジェクトにコピーされるのか?」ということを確認するために,こんなコードを書いてみました。これはまだコピーの状況を確かめられませんが,少なくとも関数内部のオブジェクトの寿命を確かめるための第一歩には充分だと思っていました。これが失敗だったわけですが・・・。
#include <stdio.h>
class C{
public:
C(){ puts("construct."); }
~C(){ puts("destruct."); }
};
C func(){
C c;
return c;
}
int main(){
func();
return 0;
}
実行結果:
construct. destruct. destruct.
なるほどっ。
typedef sequence<char> string; とかヤられてます。なぜかデストラクタが 2 回も呼ばれています。無論,こうすれば・・・
class C{
public:
char *ptr;
C(){
ptr = (char *)malloc(100);
}
~C(){
for(int i=0; i<100; ++i)
ptr[i] = 0;
free(ptr);
}
};
実行結果:
Segmentation fault (core dumped)
なぜこんな単純なコードで Segmentation fault がっ? Segmentation fault を「意図的に」起こすのは簡単ですが,まさか「意図せぬ Segmentation fault」が起こるとは。こんな危なっかしい仕組みで,どうやって安全にオブジェクトをコピーすれば・・・あっ
コピーコンストラクタっ
やっと自分が何をしているのかを思い出しました。重要なのは「関数がオブジェクトを返す時は一時的に仮のオブジェクトが作られる」ということ。関数からオブジェクトが返る際の動作は,次のコードで確かめられます。
#include <stdio.h>
class C{
const char *name;
public:
C(const char *n)
{ name=n; printf("constructing %s.\n", name); }
C(const C &c)
{ name = c.name; printf("duplicating %s.\n", name); }
~C()
{ printf("destructing %s.\n", name); name=NULL; }
void operator = (const C &c)
{ printf("copy %s to %s.\n", c.name, name); }
};
C func(){
C c("B");
return c;
}
int main(){
C c("A");
c = func();
return 0;
}
実行結果: ( "#" 以降は注釈です )
constructing A. constructing B. duplicating B. # func() 内のオブジェクトから仮のオブジェクトが生成される destructing B. # 元のオブジェクト自身は消滅 copy B to A. # この B は仮のオブジェクト destructing B. # 仮のオブジェクトも消滅 destructing A.
しかしちょっと心配ごとも。( この挙動は gcc でも VC++ でも確かめたんだけど ) これってまさか実装依存じゃないっすよね? というのも私は未だにロクな C++ の本を読んでいないのです。C マガだけじゃ限界があるですなー。。。
理解度:50
いいっすねー。"ウィンドウザー" がちょっとトラブルに見舞われた時にぜひ知っておきたい情報の宝庫です。実は本家 Microsoft さんのサイトよりも情報を見つけ出しやすかったりして。
どうでもいいけど,みんなが頻繁に遭遇する FAQ 中の FAQ 「最大化,最小化ボタンが数字に!!!1ぬ」,私は全然遭遇した事がありません。もう 1 年半ほど WinMe ユーザーを続けてるんだけどな。運がよいというか,退屈な日々というか,うーん,なぜっ???
その代わりそんな不可解な安定性に負けないほど不可解な現象も起きます。とりあえずこのネタはまた今度。。。
疲労度:30
シンプルなタイトルですが,中身もシンプル。海外サイトを巡回して報告したり,音楽ネタだったりね。お気楽に覗けるサイトです。
うーん,なんていうのかな,なんとなく /. みたいな雰囲気もあるんだけど,全然反対のベクトルなような気もするし。きっとサイトを作ってる方は “/. のみんなと似た思考ルーチンを持ってるんだけど /. の事は知らない”もしくは“アレゲな技術者ではない”て感じですか。勝手にプロファイリングしてごめんなさい。
雰囲気を楽しめるサイトも珍しいなーと思い紹介してみました。どうよ?
あえてここで書くこともないんだけど,ついに Mozilla 1.0 ですよ。プロジェクトに携わった皆様,本当にご苦労様でした。
とりあえずダウソは後にしてまずメールの返信から・・と思いきや,なぜか突然の Mozilla メーラーの不調。むはは,タイミング良過ぎです。早速 Mozilla 1.0 をダウソしたですとも。
さすがに安定しています。もしかしたらこれから流行するかもしれない新種のブラクラも効きません。あとは Prefbar のような拡張機能をインストローリングすれば,私的にはとりあえず大満足な web ブラウザになります。マンセー。
結局,私はな〜んにも参加しなかったんですけどね。残念。
「ふっかつ の じゅもん」とかそんな感じですか。あちこちに謎のカタカナが散りばめられています。ていうか何のつもりだ BBC。ていうかこれを作ったのは誰ですか。ていうか,こういうの,大好きです。
ちなみに kuri は ノナスニ と変換されます。笑い
いや,今日はなんかヘンな事件があったんスけど。というのも,化粧品会社の DHC が 2ch のひろゆきさんに 6 億円を請求していたんですよね。それをひろゆきさんがメールマガジンで発表しちゃったよ,と・・・。
あまりにも法外な金額っていうか,非常識すぎるんですよね。現状のひろゆきさんを考えれば,一生を懸けたって払いきることはできないでしょう。大会社の社長をやってるわけでもないし。
聞いたところでは,弁護士費用っていうのは請求額に比例するっぽいじゃないスか。仮にひろゆきさんが裁判に負けたとしても DHC は事実上 6 億円を手に入れることは不可能。しかし弁護士さんにはそれなりのお金を支払う必要があるわけで,うーん,DHC の非理論的な挙動の説明ができないんですよね。。。
この事象をうまく説明できる唯一のストーリーはこんなの:つまり,これはひろゆきさんが仕組んだ壮大なネタなんです。
ひろゆきさんの狙いはズバリ DHC イジメ。今回の一連の事件でひろゆきさんは 2 度も 2ch ユーザーから DHC 製品に対する意見を募集しなければならなかったのです。些細とは言えない手間です。このままでは意見を寄せてくれた人に申し訳がたちません。そこでひろゆきさんは一計を案じました。人々は「正義 vs 悪」の構図が大好き。そこに自分と DHC のスタンスを重ねてちょっとしたドラマを演出しよう,てな感じですか。
んなワケあるかいっ!
あー,この事件をどうやってまとめようかと仕事中にずっと考えてたんですが,うまくまとまりませんでした。こりゃしばらく様子見ですな。
不快指数:99(k|m 調べ)
「区民への痛みの押し付けは許しません」ていうビラが頼んでもないのに郵便受けの中に入ってたんだけど,なんていうか,見よこの名文の数々っ。
教室には冷房がなく,暑いときは38.5度Cにもなります。子どもたちがどんな環境にいるか,知ってほしい。現場に足を運んで,1 日体験してほしい。<小学校の先生>
強烈に意味不明な名文です。まさか教室にも冷暖房を完備しろと? それに最初の 1 文は敬体,あとは常体というアンバランスさもナイス。「小学校の先生」というのはウソです。明らかに。
区は,28 ある児童館のうち 12 館の職員配置をなくそうとしている。月 2 回,日曜日に地元の児童館を NPO で自主管理解放しているが,たいへん。子どもの居場所をなくさないで。<地域の子育て支援 NPO のメンバー>
子どもはかわいいが,面倒を見るのは面倒くさいとのこと。典型的なドキュソ発見っ。"NPO" が一体何の略なのかすっかり考えさせられてしまう名文です。
あー,もっともっといっぱい香ばしい名文を紹介したいんだけど,この場はあくまでも日々の雑記なんですよね。とても時間やスペースや気力がありません。というか脱力してしまいます。はあ・・なんだかとんでもない区に住んでるなあ・・。
脱力度:98
職場で気付いたことをメモ。
ポインティングデバイスの現在の主流はマウスです。他に絵描きさんがよく使うのはペン&タブレット,ノートパソコンにはキーボードの間に挟まって取れなくなった消しゴムのようなもの,指でパネルをなぞって操作するスライドパッド,あとはトラックボールが付いたものもありますね。ちなみに大学院の友人はなんとなくタッチパネルのユーザインターフェースを研究しています。
アプリケーションを作成する時にはユーザインターフェースにも気を使うべきで,特に「どのアクションに対してどのような機能が実行されるか」もしっかり考える必要があります。「右クリックでメニューを出す」と設計書に書かれてあっても,WM_RBUTTONDOWN ではなく WM_CONTEXTMENU を捕捉するべきです。WM_CONTEXTMENU は「右クリックという概念はないけど,その代わりに前面に付いているボタンをちょっと長めに押すことでコンテキストメニューを出したい」ってなデバイスのためにあるような感じっすよね。
今日気付いたのは「左クリックも右クリックも別々に存在するんだけど,両方同時にはクリックできないマウス」に関連する事。一体どういうマウスかというと,ちょっと左に傾けると「左クリック」となり,右に傾けると「右クリック」となるのです。マウスの底のあたりにボタンが付いてるのかな? まさに私の目の前に座っている人がそんな奇妙なデバイスを使っているんだけど,今度見せてもらおうっと。
ってわけで,アプリケーションを設計する時には気をつけなければ。"マウスの左右同時クリックで云々"って機能を付けてはいけません。だって上で紹介したようなマウス,左右同時クリックできないもん。
・・ええ,誰もそんな機能なんか付けないことに気付きました。本日の勉強はこれまで。
今日の労働時間:8 時間くらい
本日の k|m の生態は Mozilla に関するちょっとしたメモ。意外に知らなかった機能がいっぱいついていたりして,思わずニヤリです。
Mozilla 付属のメーラーには,ある種の文字を特別な記号やグラフィックで置き換える機能がついています。例えば行の先頭の ">" 記号は引用マークと見なしてその行の左端に縦線を表示させたり,フェイスマークは独特のグラフィックに置き換えたりね。
英文では強調を行うのに *Important!* などとアスタリスクで囲む方法がよく用いられるようです。それを受けた Mozilla のメーラー,なんとアスタリスクの組を見つけると*太字にしてくれます*。なかなか気が利いてます。
この強調表現は知りませんでした。_LOOK!_ て感じでアンダーラインで挟んでやるのも強調を意味する表現の一つ。メールの文中でしか見たことがないんだけど,やっぱりメール内でのみ用いるべきもの? Mozilla のメーラーでは_アンダーラインが引かれます_。
もう 6 月に入ったんで,Mozilla 1.0 も間近ですよ奥さん。そういえば <blink> タグが復活していたのには笑いました。
5月30日だったっけ? 復活した模様。以前までは CGI に負荷がかかりすぎてたらしいっすね。このサイトは何かというと,例えば私のような三流の“業界”人の苦労話や知恵話を集めたサイト・・・に見えます。そうなんですよね?
総じて彼らは金と睡眠時間に困っているのです。それからまれに愛にも飢えているのかも? しかしそこは流石に“お業界”を志した キ ツワモノども。こんな境遇をなんとかやりくりして楽しんでいます。明らかに。
考えてみれば,「独身時代」とは本能のまま,自分に素直になれる唯一の時間なのでは? 他の時間は常に家族と一緒に暮らしているため ( 当然だけど ),そこには多少なりとも常にパーソナル・スペースの摩擦によるストレスが発生しているはず。私が暑いのを我慢せずにスッポンポンでいられるのは,独身であるおかげなのです。
秋にリニューアルオープンってことで,注目です。っていうか私はこの酷暑を乗り切ることができるのか!? とりあえず扇風機買いました・・・。
扇風機:1000円
今さらながら,Perl 5.6.0 の新機能にちょっとだけ触れてみました。今まではあんまし必要に迫られなかったのと,ラクダ本には載ってないという理由で無視してたんスけどね。
そんな中で,前々からよりエレガントな解法がないかどうか模索している「パッケージを越えた sort 関数」に関連して,なんとなく面白そうなモノを見つけました。
キーワードは our。レキシカルでグローバルな変数を生成しますって,どないやねん。よく分からないんだけど,つまり C の extern と static のあいの子みたいなものかと理解した上でこんなコードを書いてみました。
package MyArr1;
require 5.6.0;
use strict;
our ($a, $b);
sub new {
bless [ map {int rand 100} (0..9) ]
}
sub sort {
my($self, $method) = @_;
@$self = sort $method @$self;
}
package main;
require 5.6.0;
use strict;
my $obj1 = new MyArr1;
$obj1->sort('main::cmp_method');
$, = ' '; # print @array の区切り文字を設定
print @$obj1, "\n";
sub cmp_method {
$a <=> $b
}
いつの間にかルーズなコードの書き方をしている自分に気づきましたが,この際気にしません。このコードは上手く動きます。注目すべきなのは MyArr1 パッケージ内で記述された our ($a, $b) と main パッケージ内の cmp_method サブルーチン。our のおかげで,main に記述した変数 $a,$b もきちんと MyArr1 のものとして扱ってくれます。
ただし注意。これはつまり変数のスコープがとんでもなく大きくなってしまうわけで,ヘタをすると他のパッケージとの衝突もあり得ます。次のようなコードは私の意図した通りには動きません ( 私が意図したものとは,コードを見れば分かってくれるでしょう ) 。
package MyArr1;
require 5.6.0;
use strict;
our ($a, $b);
sub new {
bless [ map {int rand 100} (0..9) ]
}
sub sort {
my($self, $method) = @_;
@$self = sort $method @$self;
}
package MyArr2;
require 5.6.0;
use strict;
our ($a, $b);
sub new {
bless [ map {int rand 100} (0..9) ]
}
sub sort {
my($self, $method) = @_;
@$self = sort $method @$self;
}
package main;
require 5.6.0;
use strict;
our ($a, $b);
my $obj1 = new MyArr1;
my $obj2 = new MyArr2;
$obj1->sort('main::cmp_method');
$obj2->sort('main::cmp_method');
$, = ' '; # print @array の区切り文字を設定
print @$obj1, "\n";
print @$obj2, "\n";
print sort cmp_method map{int rand 100} (0..9);
sub cmp_method {
$a <=> $b
}
このあたりの問題について Perl7 では何か特別な機能を用意して・・くれないだろうなー。
概してプログラマの精神年齢はかなり低く,欧米の企業の中には子供用の遊戯施設まであったりするとか。いくらなんでも私はそこまで子供ではありませんが,しかし心当たりもいくつかあるかも・・・。ともかく日本のプログラマも例外でなく,子供っぽさの抜けていない人間は多いのです。むしろそれが「良いプログラマ」の必要条件だったりして。
Linux 萌え萌え大作戦ホームページ -> ランゲージ娘\0
・・うわぁ・・
私は 2002-05-27 の雑記で Mozilla に萌え,ある種の勝利を感じたのですが・・・上には上がいるですな。なんと彼らは言語に萌えています。一見,仮想的なキャラを構築してそれに萌えているように見えますが,違います。彼らは明らかに言語に萌えています。私には分かります。
なんかリアクションに困ったなあ。とりあえず,C++ 萌え。
今週の残業時間:0
この日記だか雑記だかよくわからない文書もそろそろマンネリを打破しなければならないと思いました。まだ1ヶ月しか経ってないんだけど,飽きっぽい性格なもんで。
アレゲなニュースと雑談サイトとして昨年春にオープンしたスラッシュドット ジャパンが,いよいよ 1 周年を迎えることとぁぃなりました。パチパチパチ。・・・と言っても私が /.J を読み始めたのは去年の秋だったんスけどね。完全なる newbie。
んで今,過去の ./J の記事を眺めているわけですが,なんだか非常に懐かしい感じがします。「密告型のワーム」とか「フリーソフトは後で金を稼ぐため」とか,ああ,「L モード」ってのもありましたね。当時はわりと世間で騒がれていましたが,その後どうなったのかが気になる話ばかりです。いえ,いい意味で。
正式オープンは昨年の 5 月 28 日。へぇ,当時は 0 comments ってのも珍しくなかったようです。ベータ版の始動は 5 月 9 日。そして記念すべき最初のストーリーは 4 月 5 日「Wind River Systems が BSDi を手中に!」。この頃になると,雑談スレッドというよりはテストスレッドですね。当たり前か。
あ,私はなんだかこのストーリーが気に入りました。「日本版Geek(技術ヲタク)な食べ物はなんだ!?」。うーん,やっぱしチョコかなあ。ねえ? ・・・え,「オーザックは紫外線を当てると光る」?