日記緑ログ

2005/07/01 ~ 2005/07/30

目次

戻る

Blog

SDLで直線描画その一

[Create: 2005/07/01 05:06] [LastUpdate: 2005/07/01 05:28]

私はSDLはつかったことがなかったのですが後学のためと思い少し手を出してみました。

まず思いつくのが点の表示、直線の表示です。

SDL では画像をロードして張り付ける動作は簡単にできる(Bitmapファイルをロードできる)のですが、直線や円などを描画する関数等は用意されていないの ですね。とはいっても現在では通常、ゲーム等で直線や円をゴリゴリ描画するということはあまり考えられない気もします。しかしながら、基本的動作として点 をうったり線を描いたりするのは割に良くある話だと思います。

画面へのピクセル描画は、 公式にあるので、とりあえず直線だと思います(四角形塗りつぶしはSDL_FillRectというものが用意されている)。直線なんてものはブレゼンハム のアルゴリズムでびびっと引けばいいのですが、曲者というか問題は上記のピクセル描画でswitchを使ってピクセルフォーマットごとに分岐している点で す。

何が問題かといえば1ピクセルごとにswitchすると間違いなく遅いだろうということです。かといってswitchしたあとで描画用の操作 を書けばずらずらと長くなるし、同じようなものが並ぶ。下手に関数に切り分けると遅くなりそうだし、マクロを使えば短くそこそこにかけそうだけれどずらり ずらりと怪しげで、読む人が投げそうなマクロができそうです。

どうしようかなぁと思いつつおしまい。

SDLで直線描画その二

[Create: 2005/07/01 08:05] [LastUpdate: 2005/07/01 17:09]

早速やっつけ仕事をしてみました。

あんまり遅いのはやっぱり嫌なのでマクロにしてみました。

#define PUTPIXEL8(screen,x,y,c) \

((Uint8 *)(screen)->pixels)[(x) + (y) * ((screen)->pitch)] = (c)

#define PUTPIXEL16(screen,x,y,c) \

((Uint16 *)(screen)->pixels)[(x) + (y) * ((screen)->pitch / 2)] = (c)

#if SDL_BYTEORDER == SDL_LIL_ENDIAN

#define PUTPIXEL24(screen,x,y,c) \

do{ \

Uint8 *p = &((Uint8 *)(screen)->pixels)[(x) * 3 + (y) * ((screen)->pitch)]; \

Uint32 c = (color); \

p[0] = (Uint8)(c); \

p[1] = (Uint8)(c >> 8); \

p[2] = (Uint8)(c >> 16); \

} while(0)

#else

#define PUTPIXEL24(screen,x,y,c) \

do{ \

Uint8 *p = &((Uint8 *)(screen)->pixels)[(x) * 3 + (y) * ((screen)->pitch)]; \

Uint32 c = (color); \

p[0] = (Uint8)(c >> 16); \

p[1] = (Uint8)(c >> 8); \

p[2] = (Uint8)(c); \

} while(0)

#endif

#define PUTPIXEL32(screen,x,y,c) \

((Uint32 *)(screen)->pixels)[(x) + (y) * ((screen)->pitch / 4)] = (c)

#define SWAP(TYPE,a,b) \

do{ \

TYPE tmp = (a); \

(a) = (b); \

(b) = tmp; \

} while(0)

#define DRAWLINE_AXIS_DIR(bitcnt,v1,v2) \

do{ \

if((v1) > (v2)){ \

SWAP(int,(v1),(v2)); \

} \

for(;(v1) <= (v2);(v1)++){ \

PUTPIXEL##bitcnt (screen, x1, y1, color); \

} \

} while(0)

#define DRAWLINE_BRESENHAM(bitcnt,screen,x1,y1,x2,y2,color,a,b) \

do{ \

int dx = abs((x2 - x1) * 2), dy = abs((y2 - y1) * 2); \

int sx = x2 - x1 > 0 ? 1 : -1, sy = y2 - y1 > 0 ? 1 : -1; \

int e = -(d##a / 2); \

int i; \

int l = (d##a / 2 + 1) / 2; \

for(i = 0;i < l;i++){ \

PUTPIXEL##bitcnt (screen, x1, y1, color); \

PUTPIXEL##bitcnt (screen, x2, y2, color); \

a##1 += s##a; \

a##2 -= s##a; \

e += d##b; \

if(e >= 0){ \

b##1 += s##b; \

b##2 -= s##b; \

e -= d##a; \

} \

} \

if(d##a % 2 == 0) \

PUTPIXEL##bitcnt (screen, (x1 + x2) / 2, (y1 + y2) / 2, color); \

} while(0)

#define DRAWLINE(bitcnt,screen,x1,y1,x2,y2,color) \

do{ \

if(x2 - x1 == 0){ \

DRAWLINE_AXIS_DIR(bitcnt,y1,y2); \

} \

else if(y2 - y1 == 0){ \

DRAWLINE_AXIS_DIR(bitcnt,x1,x2); \

} \

else if(abs(x2 - x1) <= abs(y2 - y1)){ \

DRAWLINE_BRESENHAM(bitcnt,screen,x1,y1,x2,y2,color,y,x); \

} \

else{ \

DRAWLINE_BRESENHAM(bitcnt,screen,x1,y1,x2,y2,color,x,y); \

} \

} while(0)

void SDL_DrawLine(SDL_Surface *screen, int x1, int y1, int x2, int y2,

Uint8 R, Uint8 G, Uint8 B){

Uint32 color = SDL_MapRGB(screen->format, R, G, B);

if( (x1 < 0) | (screen->w <= x1) |

(x2 < 0) | (screen->w <= x2) |

(y1 < 0) | (screen->h <= y1) |

(y2 < 0) | (screen->h <= y2))

return;

if(SDL_MUSTLOCK(screen)){

if(SDL_LockSurface(screen) < 0){

return;

}

}

switch(screen->format->BytesPerPixel){

case 1:

DRAWLINE(8,screen,x1,y1,x2,y2,color);

break;

case 2:

DRAWLINE(16,screen,x1,y1,x2,y2,color);

break;

case 3:

DRAWLINE(24,screen,x1,y1,x2,y2,color);

break;

case 4:

DRAWLINE(32,screen,x1,y1,x2,y2,color);

break;

}

if(SDL_MUSTLOCK(screen)){

SDL_UnlockSurface(screen);

}

/* SDL_UpdateRect(screen, x1, y1, x2 - x1, y2 - y1); */

}

いかにもやっつけで、無駄な部分やら危険な部分やら怪しい部分がありますが、べた書きよりは短いので読みにくさなどはご勘弁願います。

まったくもってこんな風に書くぐらいならべた書きしたほうが起こられないですむ気がします。

SDLで円描画

[Create: 2005/07/04 07:33] [LastUpdate: 2005/07/04 07:45]

性懲りもなくやっつけ仕事でSDL嬢…じゃなくて上で円を描画する関数をでっち上げました。

ミッチェナーのアルゴリズムをごにょごにょしてごにょごにょしています。

いまさらながら1ピクセルごとにbppで分岐してもそれほど問題にならない気もします…

#define DRAWCIRCLE_SUB(bitcnt,screen,x1,y1,x2,y2,color,A,B,X,Y) \

do{ \

r = d##A / 2; \

A##a = r; \

B##a = 0; \

f = 3 - 2 * r; \

x1 += dx / 2; \

y1 += dy / 2; \

x2 = x1 + dx % 2; \

y2 = y1 + dy % 2; \

while(A##a >= B##a){ \

xb = (xa * d##B) / d##A; \

yb = (ya * d##B) / d##A; \

PUTPIXEL##bitcnt (screen, x##X + x2,-y##Y + y1, color); /*A*/ \

PUTPIXEL##bitcnt (screen, y##X + x2,-x##Y + y1, color); /*B*/ \

PUTPIXEL##bitcnt (screen,-y##X + x1,-x##Y + y1, color); /*C*/ \

PUTPIXEL##bitcnt (screen,-x##X + x1,-y##Y + y1, color); /*D*/ \

PUTPIXEL##bitcnt (screen,-x##X + x1, y##Y + y2, color); /*E*/ \

PUTPIXEL##bitcnt (screen,-y##X + x1, x##Y + y2, color); /*F*/ \

PUTPIXEL##bitcnt (screen, y##X + x2, x##Y + y2, color); /*G*/ \

PUTPIXEL##bitcnt (screen, x##X + x2, y##Y + y2, color); /*H*/ \

if(f >= 0){ \

A##a--; \

f -= 4 * A##a; \

} \

B##a++; \

f += 4 * B##a + 2; \

}\

} while(0)

#define DRAWCIRCLE(bitcnt,screen,x1,y1,x2,y2,color) \

do{ \

int r; \

int dx, dy; \

int xa, ya, xb, yb; \

int f; \

dx = abs(x2 - x1); \

dy = abs(y2 - y1); \

if(dx >= dy){ \

DRAWCIRCLE_SUB(bitcnt,screen,x1,y1,x2,y2,color,x,y,a,b); \

} \

else{ \

DRAWCIRCLE_SUB(bitcnt,screen,x1,y1,x2,y2,color,y,x,b,a); \

} \

} while(0)

void SDL_DrawCircle(SDL_Surface *screen, int x1, int y1, int x2, int y2,

Uint8 R, Uint8 G, Uint8 B){

Uint32 color = SDL_MapRGB(screen->format, R, G, B);

if( (x1 < 0) | (screen->w <= x1) |

(x2 < 0) | (screen->w <= x2) |

(y1 < 0) | (screen->h <= y1) |

(y2 < 0) | (screen->h <= y2))

return;

if(x1 == x2 && y1 == y2)

return;

if(SDL_MUSTLOCK(screen)){

if(SDL_LockSurface(screen) < 0){

return;

}

}

switch(screen->format->BytesPerPixel){

case 1:

DRAWCIRCLE(8,screen,x1,y1,x2,y2,color);

break;

case 2:

DRAWCIRCLE(16,screen,x1,y1,x2,y2,color);

break;

case 3:

DRAWCIRCLE(24,screen,x1,y1,x2,y2,color);

break;

case 4:

DRAWCIRCLE(32,screen,x1,y1,x2,y2,color);

break;

}

if(SDL_MUSTLOCK(screen)){

SDL_UnlockSurface(screen);

}

}

LINEで使用したPUTPIXELを流用していますのでそれはそちらを参照していただきたいと思います。

さておき、塗りつぶしが必要ならPUTPIXELのところを横にべったり走査すればOKですので改造も簡単でしょう。

相変わらず読みにくく、しかもデバッグもあまりしやすくありません。こういうマクロを使った怪しげなブツをデバッグするには相変わらずprintfデバッグが有効ですが、デバッガを使いたい場合もあると思います。

こういうときは一度プリプロセッサにかけてマクロを展開した状態にしてあげるとデバッガも動作できて万歳ですね。

SDLの描画

[Create: 2005/07/09 08:01] [LastUpdate: 2005/07/09 08:08]

さて、直線と円の描画をマクロをぐりぐり使って載せたわけですが、PUTPIXELを関数化し、その中で色深度によって分岐したうえで色をおく処理をするようにして、どのぐらい早いのか計測してみました。

結果:

マクロ使用

PSET 1000000回 407

LINE 100000回 4316

CIRCLE 10000回 1133

関数化

PSET 1000000回 417

LINE 100000回 4526

CIRCLE 10000回 1219

(最後の数値はミリ秒)

(32bpp-Celelon 900MHz)

えっと…マクロはやめます。

若干ながらも早いんですけどね。

SDLで塗りつぶし

[Create: 2005/07/10 20:54] [LastUpdate: 2005/07/10 21:09]

数年前に書いたものがあったのでそのまま使いました。

かなり遅いと思います。

高速化のために考えている事はないではないのですがかなり複雑化して、逆に遅くなる可能性もあるので試していません。

一応メモしておくと、Yについては一発で探せるからいいとして(場合によってはハッシュか、ピクセル数の分だけ配列にする)、Xについては何度も何度も同じ部分をチェックする可能性が高いのでそこをなんとかする必要があります。

裏にフラグでも

bool screenflags[HEIGHT][WIDTH];

とでも用意すれば簡単な話ですが、芸がないので、二分木を使ってleft、rightの範囲(塗りつぶす範囲)を持ち、かつキーはleftとする。探すときにleftとrightの間であればすでにキューに積んであるということが分かるわけです。

しかし、メモリは食うし、検索量はそれほど多くはないけれどポインタ計算の嵐になりそうだし、malloc、freeとかやりすぎて遅くなりそうな気配がぷんぷんします。

このまま使っては遅くなる場合はそれこそフラグを用意したほうが早くて(メモリー消費量も)経済的かもしれません。

まあただのメモですからそれ以上の意味はありませんが。

typedef struct point_st{

int x, y;

} point_t;

static void SDL_PutPixel(SDL_Surface *screen,

int x, int y,

Uint32 color){

switch(screen->format->BytesPerPixel){

case 1:{

Uint8 *bufp;

bufp = (Uint8 *)screen->pixels + y * screen->pitch + x;

*bufp = color;

break;

}

case 2:{

Uint16 *bufp;

bufp = (Uint16 *)screen->pixels + y * screen->pitch / 2 + x;

*bufp = color;

break;

}

case 3:{

Uint8 *bufp;

bufp = (Uint8 *)screen->pixels + y * screen->pitch + x * 3;

#if SDL_BYTEORDER == SDL_LIL_ENDIAN

bufp[0] = color;

bufp[1] = color >> 8;

bufp[2] = color >> 16;

#else

bufp[2] = color;

bufp[1] = color >> 8;

bufp[0] = color >> 16;

#endif

break;

}

case 4:{

Uint32 *bufp;

bufp = (Uint32 *)screen->pixels + y * screen->pitch / 4 + x;

*bufp = color;

break;

}

}

}

static Uint32 SDL_GetPixel(SDL_Surface *screen,

int x, int y){

Uint32 color = 0;

switch(screen->format->BytesPerPixel){

case 1:{

Uint8 *bufp;

bufp = (Uint8 *)screen->pixels + y * screen->pitch + x;

color = *bufp;

break;

}

case 2:{

Uint16 *bufp;

bufp = (Uint16 *)screen->pixels + y * screen->pitch / 2 + x;

color = *bufp;

break;

}

case 3:{

Uint8 *bufp;

bufp = (Uint8 *)screen->pixels + y * screen->pitch + x * 3;

#if SDL_BYTEORDER == SDL_LIL_ENDIAN

color = bufp[0] | (bufp[1] << 8) | (bufp[2] << 16);

#else

color = bufp[2] | (bufp[1] << 8) | (bufp[0] << 16);

#endif

break;

}

case 4:{

Uint32 *bufp;

bufp = (Uint32 *)screen->pixels + y * screen->pitch / 4 + x;

color = *bufp;

break;

}

}

return color;

}

void SDL_DrawPaint(SDL_Surface *screen,

int x, int y,

Uint8 R, Uint8 G, Uint8 B){

Uint32 color = SDL_MapRGB(screen->format, R, G, B);

point_t *buffer;

int pbuf;

Uint32 bcol;

int i;

int bx1,bx2,by;

if( (x < 0) | (screen->w <= x) |

(y < 0) | (screen->h <= y))

return;

buffer = malloc(sizeof(point_t) * (screen->w + 1));

if(buffer == NULL)

return;

if(SDL_MUSTLOCK(screen)){

if(SDL_LockSurface(screen) < 0){

free(buffer);

return;

}

}

bcol = SDL_GetPixel(screen, x, y);

if(bcol == color){

if(SDL_MUSTLOCK(screen)){

SDL_UnlockSurface(screen);

}

free(buffer);

return;

}

buffer[0].x = x;

buffer[0].y = y;

pbuf = 1;

while(pbuf){

pbuf--;

bx1 = bx2 = buffer[pbuf].x;

by = buffer[pbuf].y;

while(bx1 >= 0 && SDL_GetPixel(screen, bx1, by) == bcol)

bx1--;

while(bx2 < screen->w && SDL_GetPixel(screen, bx2, by) == bcol)

bx2++;

bx1++;

bx2--;

for(i = bx1;i <= bx2;i++)

SDL_PutPixel(screen, i, by, color);

if(by > 0){

i = bx1;

by--;

if(SDL_GetPixel(screen, i, by) == bcol){

while(i >= 0 && SDL_GetPixel(screen, i, by) == bcol)

i--;

i++;

}

else

while(i <= bx2 && SDL_GetPixel(screen, i, by) != bcol)

i++;

while(i <= bx2){

buffer[pbuf].x = i;

buffer[pbuf].y = by;

pbuf++;

while(i < screen->w && SDL_GetPixel(screen, i, by) == bcol)

i++;

while(i <= bx2 && SDL_GetPixel(screen, i, by) != bcol)

i++;

}

}

else

by--;

if(by + 2 < screen->h){

i = bx1;

by += 2;

if(SDL_GetPixel(screen, i, by) == bcol){

while(i >= 0 && SDL_GetPixel(screen, i, by) == bcol)

i--;

i++;

}

else

while(i <= bx2 && SDL_GetPixel(screen, i, by) != bcol)

i++;

while(i <= bx2){

buffer[pbuf].x = i;

buffer[pbuf].y = by;

pbuf++;

while(i < screen->w && SDL_GetPixel(screen, i, by) == bcol)

i++;

while( i <= bx2 && SDL_GetPixel(screen, i, by) != bcol)

i++;

}

}

}

if(SDL_MUSTLOCK(screen)){

SDL_UnlockSurface(screen);

}

free(buffer);

}

FONT.BMPを使って文字表示

[Create: 2005/07/12 20:58] [LastUpdate: 2005/07/12 21:12]

FONT.BMPについては調べてもらって作成するツールをどこからか取得していただくとして、今回はそれをさらっと表示させてみるという話です。

といっても形式は難しくなく、一番上にASCIIの範囲の文字が、下のほうにJISコード順に並んだ文字が並んでいるだけです。

ビットマップのフォーマットは普通1bppのモノクロで2048×2048のサイズになっていると思います。

国際化にはまったく不向きで汎用性はありませんので実用には向かないかもしれませんが。

1バイト文字の場合は

// cは表示する文字

x = c * 8;

y = 0;

width = 8;

height = 16;

として転送すればOKです。

2バイト文字の場合はまずJISコードにする必要があります。

// sは表示するSHIFT-JIS文字

Uint16 c = sjis2jis(s[0] << 8 | s[1]);

あるいは

// sは表示するEUC-JP文字

Uint16 c = euc2jis(s[0] << 8 | s[1]);

とでもしておき、

x = ((c >> 8) - 0x20) * 16;

y = (c & 0xff) * 16;

width = 16;

height = 16;

で転送すればOKです。

今回はこれだけです。

じゃが芋

[Create: 2005/07/20 21:32] [LastUpdate: 2005/07/20 21:37]

欧米ではじゃが芋が多く食べられています。

という話は今回は関係ありません。

じゃが芋を収穫しました。今年は量はそれほどではありませんでしたが、芋が大きく、中には一キロものもありました。

それだけです。

GDI+

[Create: 2005/07/22 05:38] [LastUpdate: 2005/07/22 06:06]

GDI+は、Windowsの新しい(従来のGDIに代わる)グラフィック用のAPI群で64ビット時代にもお勧め。.NETでも標準で使えます。

.NETでもということは従来のアンマネージドコードでも使えるということです。

C++で、GDI+を使うという話はよく聞くのですが、実はCでもGDI+ Flat APIを使えば、GDI+が使えます。

と は言っても、GDI+はクラスの形で使用するからこそ便利なわけで、Flat APIを直に叩くぐらいなら従来のGDIを使ったほうが高速ですし(GDI+はつまるところ従来のGDIのラッパーであってオーバーヘッドがある)、現在 のWindows上ではどこでも動くわけですからCでGDI+を使うようなことはないとは思います(SelectObject等の煩雑な呼び出しはGDI +では見ないで済むのでまったく利点がないかというとそうでもない気もするけれど)。

加えて、GDI+は従来のGDIでの CreateCompatibleBitmapとCreateCompatibleDCを使った速度は出ません(今のところはですが今後も変わらないとは 思います)。基本的にGDI+はDIBを使用していて、DDBを使っていないからです。DDBを使っていればDirectDrawなんていらなかったので すが、やっぱり餅は餅屋ということで高速描画にはDirectXを使ってくださいということなんだと思います。もちろんGDI+程度の速度でも一般的なア プリケーションレベルであればまったく問題のない速度と言えますので神経質になる必要はありません。

そもそもDIBを使ったゲームというのはWinGのころからわんさかあるわけでDDBが使えないからゲームが作れないわけでは無いと思いますがそれは別の話でしょう。

GDI+その二

[Create: 2005/07/26 20:30] [LastUpdate: 2005/07/26 20:54]

ネタが無くて更新できないという言い訳はさておき、GDI+の続きです。

GDI+はラスタベースの低解像度グラフィックスを、ベクタベースの高解像度グラフィックスに転換することを促す働きもあります。

どういうことかといえばそういうことなのでさておき、GDI+のリファレンスはMSDNにあります。ただし、英語なので日本語で読みたい人はとりあえず.NET FrameworkのリファレンスからGDI+の機能に該当する部分を拾って読むといいでしょう。

さて、これだけではネタとして不足だと思いますのでさらりとした例を一つ。

次のようなコードがあるとします。

// 前置きとして、定義部分。

Graphics g = どこかのグラフィックオブジェクト。

Pen* p = new Pen(Color.Red, 10);

// ここが問題とする部分。

g.DrawRectangle(p, 30, 20, 100, 50);

これはGDIで似たようなクラスが簡単に作れますね。つまり、

Graphics::DrawRectangle(Pen* p, int Left, int Top, int Right, int Bottom)

{

 HPEN hPen = p->GetHandle();

 HPEN hOldPen = (HPEN)::SelectObject(m_hdc, hPen);

 ::Rectangle(m_hdc, Left, Top, Right, Bottom);

 ::SelectObject(m_hdc, hOldPen);

}

これだけです。Penについては示しませんが、簡単に想像がつきますね。もちろんGDI+はもっと多機能で、旧来のGDIでは持ち合わせていないスタイルのPenなども作成できます。このあたり、なかなか面白いのですが割愛します。

Penオブジェクトや、Brushオブジェクトを直接指定して呼び出せる関数はSelectObjectを省けて便利なんですが、その分オーバーヘッドもあることになります。

というか、Brushを指定して呼び出せるGDI関数もありますよね。FillRectとか。なんでその辺が統一されていないかは不思議ではあります。

徒然書く文章なんてこんなもの。

Windows Vistaの漢字

[Create: 2005/07/29 21:39] [LastUpdate: 2005/07/29 22:01]

JIS X0213では人名用などの漢字が追加されています。それでも人名、地名などのほか、過去の文書類で使われている文字をすべて網羅しているわけではないの ですが、今までよりは確実によくなります。いや、実はJIS X0212というものがあって、そちらではとっくの昔にあったわけですが。

ただ、英断というか、JIS X0208までとは同じコードポイントで、字体の違うものが含まれています。異なるコードポイントに異字体を入れればいい話だったと思うのですが、JISは強行してしまったようです。

と はいうものの、現在はUNICODE環境が結構整っていますので、もしかすると(マッピングテーブルが古かったり、違うものを使ってはどうしようもないけ れど、UNICODEで書いてUNICODEで保存して、UNICODEで表示するのであれば)もしかすると問題ないのかもしれません。

余談です が、UNICODEは当初のすべての文字を16ビットにおさめる計画をあきらめてから貪欲に漢字を取り込んでいます。それはいい傾向なんですが、過去の過 ちがいつまでも尾を引いていて、日本語と中国語をいっしょに表示させようとすると、困ったことに(読む分には問題ないだろうが、どちらかの国で一般的でな い字体が含まれたりする)なってしまいますので、今度は初めから32ビットで綺麗にまとめてもらいたいところです。というか、30年ぐらいの内には出ると 思うんですが。早ければ10年しないで来ると思っています。中国と、韓国がもりもり、パワーアップしてきたら、極東アジアはOKですし、西ヨーロッパは MSとIBMあたりの今のUNICODEチームに任せて問題は、東ヨーロッパと西アジアとアフリカ、南アメリカあたり。あとの二つは植民地支配が激しすぎ て事情が違うかもしれませんが…。

スペースシャトルの耐熱タイル

[Create: 2005/07/30 21:06] [LastUpdate: 2005/07/30 21:20]

最近になって耐熱タイルがはがれたはがれた騒いでいますが、そんなことは20年前に分かっていたことで、タイルの貼り付け構造は打ち上げ時の衝撃に耐え切れるものではないわけです。

現在のタイル構造を続けるとすれば、宇宙空間でも修繕可能な状態にすることが肝要です。まあ技術的にも難しいところだとは思いますが。

そもそも、タイル構造になっているのは戻ってきたら張り替えるためなわけで、つまりはがせるわけですよね。

打ち上げの時にタイルが傷つかず、かつ、はがれなかったことなんて一度も無いんではないでしょうか。まあそのあたりはそのうち誰かが色々考えてくれるでしょう。今回言いたかったことはマスコミが煩過ぎるということです。