デジタルちんぶろぐ

デジタルな話題

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  238  : 記事  0  : コメント  805  : トラックバック  77

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

2010年8月20日 #

30代になるまで刺身が食べられませんでした。しかし最近では一人で寿司を食べに行くようになってます。

35になるまで牡蠣が食べられませんでした。しかし最近では一人で牡蠣を食べに行くようになってます。

子供の頃はバナナも生玉子も大丈夫だったのに今はどちらもダメです。

 

さて、以前こんなエントリを上げました

今日買ったCD やっぱりミクは…

そのエントリを上げた頃は

「やっぱり初音ミクは受け付けないなぁ~」

と思っていたのですが、どうしたものか最近はそこで紹介しているCDに収録されているミクの歌は

1日に1回は自分で選曲して聴く

ようになってます。

いや、嗜好って変わりますね。ホント

でもそのCDでは1曲目のZipperが一番好き、今のところ^^

posted @ 2:28 | Feedback (0)

2010年8月4日 #

一人で飲みに行く事が多いです。

友達がいないというのも理由の一つですが、時間と金額を気にする必要が無い、店員さんとゆっくり話が出来るという理由もあります。
僕は幸いなことに飲み屋の店員さんと仲良くなることが多く、今までに結構オイシイ思いもしています(酒をタダで試飲とかね)。

さて、いいことばかりではありません。時には辛い事も起こります。

rejectされて感情がoverloadしてしまった客と遭遇すること。外人にoverrideされてinjectionされてしまった女性の話を聞くこと、財布の中身がunderflowしている客と遭遇すること、極稀にですが、catchする人もいないのに店の物をthrowする人もいますね。

しかし、どんなことよりも酔っ払いのDoS攻撃が一番辛い。表情のfirewallなんて効きやしない。listenもacceptもしてないportへ勝手にconnectしてpollingで何度も氏名年齢職業をqueryしてくる。あんたのDBはinsertが常にfailかい?と聞きたくなる事もしばしばあります。
ある意味同じmessageの飛んでくるmessage-loopです。でも決してWM_CLOSEは飛んできません。

 

業界人同士だと上記のような会話になってしまうのが常ですね(それはそれで面白いけど)。

だから頭を休める為に一人で飲む。そしてDoS攻撃を喰らう。

posted @ 22:40 | Feedback (4)

関数ポインタ。

いつもtypedefしているから関数ポインタを返す関数を書くことで悩むことが無かった。
否、悩みたくないから関数ポインタをtypedefしていたという方が正しいでしょう。

ではtypedefを使わずに関数ポインタを返す関数を書く、且つその関数へのポインタの型を書くことは出来るのか(言語としてではなく自分の知識としてです)

以下のようなプログラムを書いて段階的に難しくなるようにしてみました。基本的にCでもC++でも変わりませんが、C++ではtypeidがあるので型名を取得できます。
折角なのでその機能を利用し、C++環境ではよりわかりやすい出力結果が出るように してみました。

※このプログラムはCでもC++でもどちらでもコンパイルできるようにしてあります。ここに載せている実行結果はVC2008のものです。

#ifdef __cplusplus
#include <cstdio>
#include <typeinfo>
using namespace std;
#else
#include <stdio.h>
#endif

#ifdef __cplusplus
#define SHOW_TYPE(func, var) func; printf("%-30s %s\n", #func, typeid(var).name())
#else
#define SHOW_TYPE(func, var) func;
#endif

/* 関数ポインタで呼び出される関数本体 */
void foo(int i) { printf("foo(%d);\n", i); }
void bar(void (*f)(int), int i) { printf("bar(%p, %d); ", f, i); f(i); }
void (*foo_getter(void))(int) { printf("foo_getter(); "); return foo; }
void (*foo_returner(void (*f)(int)))(int) { printf("foo_returner(%p);", f); return f; }

/* 関数ポインタ */
void (*foo_v)(int) = foo;
void (*foo_vs[1])(int) = { foo };

/* 関数ポインタを引数としてとる関数へのポインタ */
void (*bar_v)(void (*)(int), int) = bar;
void (*bar_vs[1])(void (*)(int), int) = { bar };

/* 関数ポインタを戻り値とする関数へのポインタ */
void (*(*foo_getter_v)(void))(int) = foo_getter;
void (*(*foo_getter_vs[1])(void))(int) = { foo_getter };

/* 関数ポインタを引数として取り関数ポインタを戻り値とする関数へのポインタ */
void (*(*foo_returner_v)(void (*)(int)))(int) = foo_returner;
void (*(*foo_returner_vs[1])(void (*)(int)))(int) = { foo_returner };
int main()
{
    SHOW_TYPE(foo_v(1), foo_v);
    SHOW_TYPE(foo_vs[0](2), foo_vs);
    SHOW_TYPE(bar_v(foo, 3), bar_v);
    SHOW_TYPE(bar_vs[0](foo, 4), bar_vs);
    SHOW_TYPE(foo_getter_v()(5), foo_getter_v());
    SHOW_TYPE(foo_getter_vs[0]()(6), foo_getter_vs[0]());
    SHOW_TYPE(foo_returner_v(foo)(7), foo_returner_v(foo));
    SHOW_TYPE(foo_returner_vs[0](foo)(8), foo_returner_vs[0](foo));

    return 0;
}

Cでの実行結果
foo(1);
foo(2);
bar(00401000, 3); foo(3);
bar(00401000, 4); foo(4);
foo_getter(); foo(5);
foo_getter(); foo(6);
foo_returner(00401000);foo(7);
foo_returner(00401000);foo(8);

C++での実行結果
foo(1);
foo_v(1)                       void (__cdecl*)(int)
foo(2);
foo_vs[0](2)                   void (__cdecl*[1])(int)
bar(00401000, 3); foo(3);
bar_v(foo, 3)                  void (__cdecl*)(void (__cdecl*)(int),int)
bar(00401000, 4); foo(4);
bar_vs[0](foo, 4)              void (__cdecl*[1])(void (__cdecl*)(int),int)
foo_getter(); foo(5);
foo_getter_v()(5)              void (__cdecl*)(int)
foo_getter(); foo(6);
foo_getter_vs[0]()(6)          void (__cdecl*)(int)
foo_returner(00401000);foo(7);
foo_returner_v(foo)(7)         void (__cdecl*)(int)
foo_returner(00401000);foo(8);
foo_returner_vs[0](foo)(8)     void (__cdecl*)(int)

尚、gcc/g++でのプログラムと実行結果は以下のリンク先にあります
(g++でマングリングされた型をわかりやすくするためソースに手が入れてあるので)

gcc
http://ideone.com/lpOfq

g++
http://ideone.com/AC4il

posted @ 2:07 | Feedback (0)

今週末までの予約ですね。買い忘れていた方はお早めに

http://www.longgate.co.jp/products.html

# 今更宣伝とかどうかと思うんですが^^;

posted @ 2:07 | Feedback (0)

2010年8月3日 #

ふと思ったのですが、昔のテレビより今の地デジ対応テレビ。黒電話より携帯電話。どちらも後者の方が便利になっているはずです。

昔のテレビは番組情報を見ることなんてできませんし、テレビ単体で録画など出来ませんでした。

黒電話は電話帳を覚えてくれることも無ければ短縮ダイヤルなどもありません。

しかし、前者の方がわかりやすい、後者はわかりにくいと言う人が特に高齢者に多く見受けられます。僕の母もそうです。

携帯電話では登録してある電話帳や着信・発信履歴を見て電話をかけることが出来るので入力ミスを防げます。なにより電話番号を全て入力する必要がありません。しかし、電話帳を見ながら黒電話で電話した方がわかりやすいのです。確か以前のらくらくホンには手書きの電話帳が格納できるようになっていましたね

地デジ対応テレビでは、テレビ画面に番組表を出して番組を選択すれば新聞を見て番組を探してから選局する手間が省けます。しかしテレビ番組欄を見て選局ボタンを押す方がわかりやすいのです(というより既に経験している作業)

理解できる人には何故難しいのかわかりませんが、恐らく新しいことを覚えることに抵抗があるのではないか?と思います。例えそれがボタンを1つ押すだけのことでもです。

 

そこで思いついたのですが、テレビのリモコンを「番組表」と「決定」だけにしてしまい、「番組表」ボタンで現在時刻を中心とした番組表を表示し(これは今のテレビでもやっていますが)リモコンを番組に向けて選局するようにしたらわかりやすくなるのではないか?と思いました。

理想はレーザーポインターですが、リモコンが向いている番組をハイライトし、他の番組を暗く表示するといった方法でもいいと思います。

これだと、カーソルキーを使わないし、「番組表」ボタンを押すのは「新聞を取り番組表を開く」に相当し、そのまま選局できるので昔のテレビ以上に簡単に選局できるのではないでしょうか?

こういうテレビは僕の記憶ではまだ出ていないと思います。どこかのメーカーの方がこのエントリを見て作ってくれることを期待します。

そしてそれ以上に、そういうテレビを作る際にはお仕事の発注を…組込屋ですから

テレビ単体だとすぐ出てこないかもしれませんが、PS3+torneのようなゲーム機との組み合わせだとすぐに実現できそうな気がします

posted @ 2:07 | Feedback (19)

2010年7月30日 #

発端は

OpenMPにおける変数の扱いと並列リダクション

の記事の中ほど、lastprimitive指示句の使い方を示すサンプルのプログラムと実行結果。

0~9の合計なのに35と出力されているんですよ。

※彼とその他の人の間で色々あることは知っていますが、僕はそこに関わるつもりは一切ありませんので念のため

 

僕の手元の環境で試してみたら

cl /openmp [filename]

でコンパイルすると実行結果は45でした。しかし、/Oxを付けると17になりました。OpenMPを使って最適化をかけた時になんかあるんでしょうね。

でも僕はそっち方面には疎いし、生憎興味もありませんので、この件はここにて中断。

 

そんなわけでOpenMPの指定pragmaは取っ払って最適化をかけたソースを見てみました。こういう最適化は前からあったんだけど、最近見てなかったので忘れてました。

例えばこんなループと結果出力があった場合

    for ( i = 0; i < 10; i++ ) {
        x += i;
        y += i;
    }
    printf( "%d,%d\n", x, y );

VCにて最適化指定/Oxだと(VS2008で確認・OFFSET $SG2581はprintfに渡している書式文字列です)

    push    45                    ; 0000002dH
    push    45                    ; 0000002dH
    push    OFFSET $SG2581
    call    _printf

g++で最適化指定-O3だと(gcc 4.3.4で確認・$LC0はprintfに渡している書式文字列です)

    movl    $45, 8(%esp)
    movl    $45, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf

どちらもループなんて消えて計算結果のみがそのままprintfの引数として渡されています

何が言いたいかと言うと

並列化とかテンプレートメタプログラミングとかイラネ

勿論結論は冗談ですよ^^;

posted @ 1:36 | Feedback (4)

2010年7月27日 #

なんとなく何かを間違えているような気がものすごくしてますが…

7/21に発売されたSMAPの新譜を買ってきたのでWMPでリッピングしようと思ったんですが…タイトルが出てこない。

CDは前日にフライング発売されることが多く、前日に買ってきたCDのタイトルが出ないということはよくありますが、発売から数日過ぎている、しかも超メジャーアーティストのCDが出てこないというのはちょっとあり得ないような気がする。

多分何かの設定をヘンな風にしてしまったんだろうけど、何をどうしたのか覚えていない^^;

posted @ 1:29 | Feedback (5)

定期的(?)に話題になること。

電車の中の携帯電話使用について2点

  1. 電車内での通話の是非
    電車内で会話をすることが許されるのであれば何故電話をしては駄目なのか?
    これは一理あると思います。1つの問題は電話だとどうしても声が大きくなってしまいがちです。そのため会話している人より目立ってしまうということが1点。
    しかし周囲を気にして小声で喋っている人でさえ普通に会話している人よりも目立つような気がします。これは、会話の片方しか聞こえない為聞いている(聞こえてしまっている)人の脳がより活性的に働くからじゃないか?というのが僕の考えです。
    「他人の話を聞くなんて言う出歯亀根性!」と思われるかもしれませんが、聞くつもりが無くても耳に入ってきて理解できる言語で喋られると嫌でも脳が反応してしまいます。そして双方の会話が聞こえる訳ではない為相手が何を言っているのかを考えてしまう。そのため電車内で会話をしている人より気になってしまうのではないでしょうか?
    大きい声じゃなくても独り言をぶつぶつ言っている人の声って気になりますから。
  2. 優先席付近での携帯電話の使用
    僕は調べていないので聞いたことを書くだけになってしまいますが、携帯電話の電波がペースメーカーへ影響を及ぼすことは無いそうです。つまり、優先席付近に書かれていること。車内放送で言われているような影響はないとのことです。
    それが事実であるとしても優先席に書いてあり、放送をされてしまうと例え携帯電話の電波が何の影響を及ぼさないとしても当事者は不安になってしまうでしょう。正しい知識を持った人が「無害です」と言ったところでそう簡単信用できるものではありません。当事者にとっては担当医から「実は問題無いんですよ」と言われても不安感を完全に取ることは出来ないと思います。

上記2点に関する意見、

「会話が問題ないなら携帯で話しててもいいじゃないか」

「携帯の電波がペースメーカーへ影響を及ぼすことは無いのだから優先席付近で使用してもいいじゃないか」

どちらも理にかなったものだと思います。

僕も聞けば頭ではわかります。

でも心情的に納得できないんだな~^^;

後者に関してはきちんと検証した結果を医療機器メーカー並びに携帯電話メーカーに出していただきたいと思います。そしてテレビCMなどで携帯電話の電波がペースメーカーに対して無害であることを理解が得られるまで啓蒙すべきでしょう。
ペースメーカーを使用している人で、電波に対する恐怖感から自身では携帯電話を持たないようにしている人もいると思います。しかし、体の不自由な人こそ、いつ何があっても迅速に連絡を取ることが出来るように携帯電話を持っておいた方が良いでしょう。

前者に関しては…僕は納得できるけどやっぱり抵抗があります。それは自分が不愉快な思いをしたことがあるから。勿論僕が不愉快に思っただけで、同じ車両にいた他のお客さんは気にもしていなかったかもしれません。
しかし、新幹線のグリーン車で後ろの座席のおっさんに大声で喋られるとそんなことの為に余分に金払ってんじゃない!って言いたくなりますよ。デッキへ行けと…

それがマナーとされているものは理屈じゃすぐに納得できないんですよね。

posted @ 1:19 | Feedback (4)

2010年7月23日 #

0から1000までの0の数を数える

昨日のエントリはちょっとだけ祭りっぽくなったみたい。

# でも炎上とまではいかない。やはり炎上させるには「残念な0~1000」とか「0~1000まで数えるお作法(常識)」みたいなエントリにすべきだった。

今日は、昨日の拡張で、今度は0~1000までの数に含まれる0~9それぞれを数えてみる。

int n,c,i,j;main(){for(;j<10;printf("%d:%d\n",j,c),j++)for(c=i=n=0;i<1001;n=++i)while(c+=(n%10==j),n/=10);}

まだ140字以内。

出力結果

0:193
1:301
2:300
3:300
4:300
5:300
6:300
7:300
8:300
9:300

まだ140字以内。

出力結果

16進数だとこんな感じ

int n,c,i,j;main(){for(;j<16;printf("%x:%d\n",j,c),j++)for(c=i=n=0;i<0x1001;n=++i)while(c+=(n%16==j),n/=16);}

出力結果

0:499
1:769
2:768
3:768
4:768
5:768
6:768
7:768
8:768
9:768
a:768
b:768
c:768
d:768
e:768
f:768
※自分で数えて確認してないから間違っているかもしれません。
昨日のエントリにコメントをいただいて、プログラムも見てみたのですが、やはり数値を文字列化して、その中の”0”の数を数える方法が多いですね。
その方法も1つの値ごとに文字列化して数える方法と、全数値の文字列を連結してから0を数える方法がありました。後者の方が簡潔になるでしょう。
僕が使っている方法は
  1. 値の10の余りを計算し、その余りがカウントする数値と一致していたらインクリメント
  2. 値を10で割る
  3. 値が0でなければ1へ、0になったら終了

これを0~1000までに対して行っています。
while(c+=(n%10==j),n/=10);
この部分のnが値、cがカウンタです。

posted @ 1:58 | Feedback (0)

2010年7月22日 #

そんなお題を見つけたのでやってみる。相変わらず目標はtwitterで呟くことが出来る140文字以内。

int n,c,i;main(){for(;i<1001;n=++i)while(c+=!(n%10),n/=10);printf("%d\n",c);}

出来た。77文字。

なんかパターンがマンネリ化している^^;

 

今回書いていて今更過ぎる発見をした。

do;while(0);

これは合法みたいだ。doの後ろは{}で括るという先入観が有ったから気付かなかった。

posted @ 1:04 | Feedback (15)