コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2016年1月10日 >>> 2015年12月28日
link もっと後

2016年1月10日

録画大国日本

4K/8K無料放送は「録画禁止」に?NexTV-F発表の規定が大きな波紋 - Phile-Webを読んで。

ご存知の通り日本は録画大国でして、NetflixやHuluといったネット映像配信サービスがあまり流行らず、代わりにレコーダがガンガン売れる、不思議の国です。

参考: 2014年民生用電子機器国内出荷統計 - JEITA
(2014年: テレビ549万台、BDレコーダ247万台)

テレビ局にしてみれば、録画されCMを飛ばされるのが面白くないのはわかるんですが、録画禁止規定を強めたら、テレビ放送をリアルタイムで見るようになるか?と言ったら絶対見ないでしょう。

レコーダが不人気の北米や欧州でテレビ放送が復権した話は聞いたことがありません。代わりに聞こえるのはNetflixやHuluのようなネット映像配信の躍進だけです。

参考: 示したかったのですが、世界の出荷台数が見つからず…

日本からレコーダを滅ぼしたところで、テレビ局の滅びは止まりません。止まらないどころか、ネット映像配信サービスへの移行を加速してしまう可能性すらあるんじゃないでしょうか?

テレビ局の歴々がこんなことに気づかないとは、到底思えないのですが。テレビは栄光の時代が長すぎて、頭がおかしくなってるのかなあ…。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2016/01/10 14:54)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2016年1月9日

Chromeで見ると文字が異常に小さい

スマホで見たときに、コードとか実行結果の表示に使っている <pre> タグと <code> タグの中の文字が異常に小さく表示されることに気づきました。

コード表示に使っているのは <pre> と <code> の組み合わせです。

Hello World

#include <stdio.h>

int main(int main, char *argv[])
{
    printf("Hello, World!\n");
    return 0;
}

実行結果の表示に使っているのは <pre> だけですが、これも小さく表示されていました。

Hello Worldの実行結果
$ gcc -Wall hello_world.c

$ ./a.out
Hello, World!

スマホだけおかしいのか?と思ってPCのChromeで見ても、多少はマシであるもののやはり字が小さいです。

ググって見つけた、このサイト「等幅フォントが使われる要素の扱いがブラウザー間でまちまちな問題」のおかげでかなりマシになりましたが、完全に同じ見た目にはならないようです。

普段はSeaMonkeyでしか確認していなかったので、気づきませんでした。たまにはIEやChromeでも見てみるべきですね。

編集者:すずき(2016/01/09 18:34)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2016年1月8日

C, C++ の可変引数マクロ

C99, C++11の可変引数マクロでは、


#define AAA(a, ...)

のように省略記号の前にパラメータがあるマクロを定義したとき、


AAA(hoge, fuga);

という呼び出しはマクロのパラメータ数より、引数の数が多いのでwell-formedつまり正しいけれども、


AAA(hoge);

という呼び出しはマクロのパラメータ数と引数の数が同じなのでill-formed つまり不正になるようです。

なので、C99, C++11に準拠して書こうと思うと、可変引数なしのマクロと、可変引数ありのマクロを準備して、呼び分けなければなりません。非常に面倒くさいです…。


#define AAA(a)
#define BBB(a, ...)

AAA(hoge);
//AAA(hoge, fuga); //ill-formed

//BBB(hoge); //ill-formed
BBB(hoge, fuga);

具体的に規格のどこに違反するのかよくわかりませんが、下記の文章ですかね?私の翻訳はあやしいので、原文も併せて載せます。

N3337 Working Draft, Standard for Programming Language C++

16.3 Macro replacement [cpp.replace]
...
12. If there is a ... in the identifier-list in the macro definition, then the trailing arguments, including any separating comma preprocessing tokens, are merged to form a single item: the variable arguments. The number of arguments so combined is such that, following merger, the number of arguments is one more than the number of parameters in the macro definition (excluding the ...).

(参考訳)
もし省略記号(...)がマクロ定義内のidentifier-listに存在する場合、後続の引数(カンマで区切られた全てのpreprocessing-token)は一つの項目としてまとめられる。これが可変引数である。
このようにまとめられた後の引数の数は、マクロ定義内の省略記号(...)を除いたパラメータ数より一つ多くなる。

何言ってんだお前?と思わなくもない文章ですが…、定義が #define AAA(a, b, ...) のマクロをAAA(i1, i2, i3, i4) と4つの引数でマクロを呼ぶと、省略記号の部分がまとめられi1, i2, (残り全部) の3つになるから、マクロ定義内のパラメータa, bの数である2つに比べて1個多くなる、くらいの意味でしょうか。

しかし、可変引数を空にしてマクロを呼ぶと、引数の数が同じになってしまって項目12の既定に反するので、文法違反とせざるを得ない、という解釈なのでしょう。

あとidentifier-listは16 Preprocessing directives [cpp] に、preprocessing-tokenは2.5 Preprocessing Tokens [lex.pptoken] に規定されている構文要素を指していると思われるので、訳していません。

GNU拡張構文 その1

ただし、GCCはAAA(hoge); と書いても何も警告してきません。これは「可変引数が空っぽのマクロ呼び出しを許す」つまりAAA(hoge); という呼び出しを許すGCCの拡張構文らしいです。

ちなみにgcc -pedantic-errorsとすると拡張構文の使用箇所をエラー扱いするようになりますので、

error: ISO C99 requires rest arguments to be used
AAA("hoge");

と怒ってきます。

GNU拡張構文 その2

可変引数マクロを使ってオレオレprintfマクロを作れますが、その時に必ずぶつかる問題があって、

可変引数マクロでオレオレprintfを作る(問題あり版)

#include <cstdio>

#define DEBUG_LOG(fmt, ...) std::printf(fmt, __VA_ARGS__)

int main(int argc, char *argv[])
{
    DEBUG_LOG("Hello World.\n");
    DEBUG_LOG("Hello World %d.\n", 2);

    return 0;
}

せっかくGNU拡張構文を使って、最初の呼び出し(引数が1つだけ)を可能にしたのに、いざコンパイルしてみると、引数が無いよ?と怒られてしまう問題です。

オレオレprintfの引数が1つだと怒られる
$ g++ -Wall --std=c++0x variadic_macros.cpp
variadic_macros.cpp: In function ‘int main(int, char**)’:
variadic_macros.cpp:3:57: error: expected primary-expression before ‘)’ token
 #define DEBUG_LOG(fmt, ...) std::printf(fmt, __VA_ARGS__)
                                                         ^
variadic_macros.cpp:7:5: note: in expansion of macro ‘DEBUG_LOG’
     DEBUG_LOG("Hello World.
");

もちろんこの問題はGNUの人たちはわかっていて、解決策もあります。そうですGNU拡張構文です。先ほどのマクロ定義を下記のように変えます。

可変引数マクロでオレオレprintfを作る(解決版)

#include <cstdio>

#define DEBUG_LOG(fmt, ...) std::printf(fmt, ##__VA_ARGS__)

int main(int argc, char *argv[])
{
    DEBUG_LOG("Hello World.\n");
    DEBUG_LOG("Hello World %d.\n", 2);

    return 0;
}

違いは、__VA_ARGS__ の前に ## が付いていることです。## はトークン連結演算子といって、プリプロセッサ時点で、## の前後を結合して一つのトークンにする演算子です。

オレオレprintfの引数が1つでも怒られなくなった
$ g++ -Wall --std=c++0x variadic_macros.cpp

$ ./a.out
Hello World.
Hello World 2.

この拡張構文の仕様を正確に説明できませんが、カンマと __VA_ARGS__ をトークン連結する際に、可変引数が空(つまり __VA_ARGS__ が空)ならカンマを消し去る、という動作をしているようです。

これら2つのGNU拡張構文「可変引数が空っぽのマクロ呼び出しを許す」と「カンマと __VA_ARGS__ をトークン連結する」のおかげで、printf風のマクロが自然に書けるようになります。

安心してください、clangでも使えます

GNU独自の拡張構文とは言いますが、実はclangやVisual Studioでも使えます。そのためPC向けのコードであれば移植性をあまり気にせず使える機能となっています。

皆さん同じ問題に困っていたのでしょう。もうC, C++ 規格側を変えた方が良い気がするんですけど…、何か互換性の問題があるのでしょうか。

(追記)省略記号のみではダメな理由

コメントでも指摘いただきましたが、上記の例だと具体的に何が問題か伝わらないので追記します。

下記のように書けば、引数が1個でも文法的にOKで、先頭に固定されたヘッダ名を足すこともできます。

可変引数マクロでオレオレprintfを作る(解決版?)

#include <cstdio>

#define DEBUG_LOG(...) std::printf("debug: " __VA_ARGS__)

int main(int argc, char *argv[])
{
    DEBUG_LOG("Hello World.\n"); //well-formed
    DEBUG_LOG("Hello World %d.\n", 2); //well-formed

    return 0;
}
$ g++ -Wall --std=c++0x variadic_macros.cpp -pedantic-errors

$ ./a.out
debug: Hello World.
debug: Hello World 2.

ところがもう少し凝ったこと、例えばヘッダの文字列を場合によってError: に変えたい、関数名を出したいなど、何かしら引数を渡さなければならない場合は、上記の定義では実現できません。

省略記号のみでは記述できない例

#include <cstdio>

//やりたいこと: 
//  この呼び出しを…
//    DEBUG_LOG("Hello World.\n");
//  このように展開したい
//    printf("%s: " "Hello World.\n", __func__);

//このマクロ定義なら記述可能
#define DEBUG_LOG(fmt, ...)    printf("%s: " fmt, __func__, ##__VAR_ARGS__)

//このマクロ定義では記述不可能、__func__ を書ける場所が無いため
//#define DEBUG_LOG(...)    printf("%s: " __VA_ARGS__ ...?

int main(int argc, char *argv[])
{
    DEBUG_LOG("Hello World.\n");
    DEBUG_LOG("Hello World %d.\n", 2);

    return 0;
}
$ g++ -Wall --std=c++0x variadic_macros.cpp

$ ./a.out
main: Hello World.
main: Hello World 2.

GNU拡張構文のありがたみが身に沁みますね。

編集者:すずき(2016/01/10 02:46)

コメント一覧

  • hdkさん(2016/01/10 01:22)
    #define DEBUG_LOG(...) std::printf(__VA_ARGS__)
    ですべて解決、かと思いましたが、第一引数の先頭に "%s:" とかをつけて __func__ を追加する、というような使い方の時に困るんですね。なるほど。
  • すずきさん(2016/01/10 02:13)
    >hdk さん

    はい。そうなんです。コードの例が悪くて伝わらないですね…。
    例を追記しておきます。
open/close この記事にコメントする



2015年12月29日

モノクロからカラーへ

自作ARMエミュレータememu(リンク)の仮想ターミナルが白黒で寂しいので、色が出るようにしてみました。ECMA-048のSGR (Select Graphic Rendition) の一部に対応しています。


仮想ターミナルが色付きに対応

ところで、今回作るまで存在すら知らなかった機能に、ネガ・ポジ機能(※)があります。

規格見たときは「何これ?誰が使うんだ?」って思ってたんですが、実はtopコマンドのPID PPID USER PR ... という見出し(背景が白い部分)部分で、しれっと使われています。


実はtopが使っているネガ・ポジ機能

いつも目にしている画面なのに、案外知らないものです…。

(※)普通の「ネガ」は色相反転を指しますが、ememuでは前景色と背景色の入れ替えで実現しました。他のターミナルも入れ替えで対応しているようです。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/12/29 00:41)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2015年12月28日

GNU autotools入門 その3

GNU autotoolsの話を書いていて思い出したのですが、autotools + libtoolで動的ライブラリをビルドしたとき、生成されたlibxxxx.soを見失ったのは、きっと俺だけじゃないはず。

正解はMakefile.amの有るディレクトリに .libsという隠しディレクトリが出来て、その中にlibxxxx.soが置かれます(※)。

おそらくMakefile.amと同じディレクトリに置くと、不都合なことがあったからだと思われますが、何がダメだったのかサッパリ想像付きません…。

(※)生成物を .libsに置くのはGNU libtoolの仕様らしいので、正確にはGNU autotoolsは関係ありません。

libtoolと .libsディレクトリ

調べてみたら、意味不明な .libsディレクトリの件、libtoolのマニュアル(マニュアルへのリンク)に、はっきりと書いてありました。

Note how libtool creates extra files in the .libs subdirectory, rather than the current directory. This feature is to make it easier to clean up the build directory, and to help ensure that other programs fail horribly if you accidentally forget to use libtool when you should.

だそうで、

  • .libsを消せばlibtoolの影響は元に戻せる
  • libtoolを使い忘れたら、他がコケるから(なんで?.libsが無いから??)確実にわかる

というお気遣いのようです。

でも今はバージョン管理システムがあるから、クリーンナップのお気遣いは不要ですし、libtoolは大抵autotoolsと組み合わせるので、libtoolのせいで失敗したかどうか容易にわかりません。

優しい気遣いのはずが、今となっては壮絶な空振りで、見ていて悲しくなります…。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/12/28 17:10)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2016年1月10日 >>> 2015年12月28日
link もっと後

管理用メニュー

link 記事を新規作成

<2016>
<<<01>>>
-----12
3456789
10111213141516
17181920212223
24252627282930
31------

最近のコメント5件

  • link 21年9月20日
    すずきさん (11/19 01:04)
    「It was my pleasure.」
  • link 21年9月20日
    whtさん (11/17 23:41)
    「This blog solves my ...」
  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」

最近の記事3件

  • link 23年4月10日
    すずき (11/15 23:48)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年11月6日
    すずき (11/15 23:47)
    「[Ubuntu 24.04 LTS on ThinkPad X1 Carbon Gen 12] 目次: Linux会社ではTh...」
  • link 24年11月11日
    すずき (11/15 23:26)
    「[Pythonのテストフレームワーク] 目次: Python最近Pythonを触ることが増えたのでテストについて調べようと思い...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 11/19 01:04