コンパイラ定義済みマクロの確認方法

時々、確認しておくことがあるコンパイラの定義済みマクロを知る方法のメモ。

コマンドラインにて、以下コマンドを実行。

cpp -dM /dev/null

2014-06-01現在、Mac OS X 10.9.3 で確認したら以下だった。

#define OBJC_NEW_PROPERTIES 1
#define _LP64 1
#define __APPLE_CC__ 6000
#define __APPLE__ 1
#define __ATOMIC_ACQUIRE 2
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_CONSUME 1
#define __ATOMIC_RELAXED 0
#define __ATOMIC_RELEASE 3
#define __ATOMIC_SEQ_CST 5
#define __BLOCKS__ 1
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __CHAR16_TYPE__ unsigned short
#define __CHAR32_TYPE__ unsigned int
#define __CHAR_BIT__ 8
#define __CONSTANT_CFSTRINGS__ 1
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
#define __DBL_DIG__ 15
#define __DBL_EPSILON__ 2.2204460492503131e-16
#define __DBL_HAS_DENORM__ 1
#define __DBL_HAS_INFINITY__ 1
#define __DBL_HAS_QUIET_NAN__ 1
#define __DBL_MANT_DIG__ 53
#define __DBL_MAX_10_EXP__ 308
#define __DBL_MAX_EXP__ 1024
#define __DBL_MAX__ 1.7976931348623157e+308
#define __DBL_MIN_10_EXP__ (-307)
#define __DBL_MIN_EXP__ (-1021)
#define __DBL_MIN__ 2.2250738585072014e-308
#define __DECIMAL_DIG__ 21
#define __DYNAMIC__ 1
#define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ 1090
#define __FINITE_MATH_ONLY__ 0
#define __FLT_DENORM_MIN__ 1.40129846e-45F
#define __FLT_DIG__ 6
#define __FLT_EPSILON__ 1.19209290e-7F
#define __FLT_EVAL_METHOD__ 0
#define __FLT_HAS_DENORM__ 1
#define __FLT_HAS_INFINITY__ 1
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MANT_DIG__ 24
#define __FLT_MAX_10_EXP__ 38
#define __FLT_MAX_EXP__ 128
#define __FLT_MAX__ 3.40282347e+38F
#define __FLT_MIN_10_EXP__ (-37)
#define __FLT_MIN_EXP__ (-125)
#define __FLT_MIN__ 1.17549435e-38F
#define __FLT_RADIX__ 2
#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_ATOMIC_INT_LOCK_FREE 2
#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
#define __GCC_ATOMIC_LONG_LOCK_FREE 2
#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __GNUC_MINOR__ 2
#define __GNUC_PATCHLEVEL__ 1
#define __GNUC_STDC_INLINE__ 1
#define __GNUC__ 4
#define __GXX_ABI_VERSION 1002
#define __GXX_RTTI 1
#define __INT16_TYPE__ short
#define __INT32_TYPE__ int
#define __INT64_C_SUFFIX__ LL
#define __INT64_TYPE__ long long int
#define __INT8_TYPE__ char
#define __INTMAX_MAX__ 9223372036854775807L
#define __INTMAX_TYPE__ long int
#define __INTMAX_WIDTH__ 64
#define __INTPTR_TYPE__ long int
#define __INTPTR_WIDTH__ 64
#define __INT_MAX__ 2147483647
#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
#define __LDBL_DIG__ 18
#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
#define __LDBL_HAS_DENORM__ 1
#define __LDBL_HAS_INFINITY__ 1
#define __LDBL_HAS_QUIET_NAN__ 1
#define __LDBL_MANT_DIG__ 64
#define __LDBL_MAX_10_EXP__ 4932
#define __LDBL_MAX_EXP__ 16384
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __LDBL_MIN_10_EXP__ (-4931)
#define __LDBL_MIN_EXP__ (-16381)
#define __LDBL_MIN__ 3.36210314311209350626e-4932L
#define __LITTLE_ENDIAN__ 1
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __LONG_MAX__ 9223372036854775807L
#define __LP64__ 1
#define __MACH__ 1
#define __MMX__ 1
#define __NO_INLINE__ 1
#define __NO_MATH_INLINES 1
#define __ORDER_BIG_ENDIAN__ 4321
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __ORDER_PDP_ENDIAN__ 3412
#define __PIC__ 2
#define __POINTER_WIDTH__ 64
#define __PRAGMA_REDEFINE_EXTNAME 1
#define __PTRDIFF_TYPE__ long int
#define __PTRDIFF_WIDTH__ 64
#define __REGISTER_PREFIX__ 
#define __SCHAR_MAX__ 127
#define __SHRT_MAX__ 32767
#define __SIG_ATOMIC_WIDTH__ 32
#define __SIZEOF_DOUBLE__ 8
#define __SIZEOF_FLOAT__ 4
#define __SIZEOF_INT128__ 16
#define __SIZEOF_INT__ 4
#define __SIZEOF_LONG_DOUBLE__ 16
#define __SIZEOF_LONG_LONG__ 8
#define __SIZEOF_LONG__ 8
#define __SIZEOF_POINTER__ 8
#define __SIZEOF_PTRDIFF_T__ 8
#define __SIZEOF_SHORT__ 2
#define __SIZEOF_SIZE_T__ 8
#define __SIZEOF_WCHAR_T__ 4
#define __SIZEOF_WINT_T__ 4
#define __SIZE_MAX__ 18446744073709551615UL
#define __SIZE_TYPE__ long unsigned int
#define __SIZE_WIDTH__ 64
#define __SSE2_MATH__ 1
#define __SSE2__ 1
#define __SSE3__ 1
#define __SSE_MATH__ 1
#define __SSE__ 1
#define __SSP__ 1
#define __SSSE3__ 1
#define __STDC_HOSTED__ 1
#define __STDC_UTF_16__ 1
#define __STDC_UTF_32__ 1
#define __STDC_VERSION__ 199901L
#define __UINTMAX_TYPE__ long unsigned int
#define __USER_LABEL_PREFIX__ _
#define __VERSION__ "4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)"
#define __WCHAR_MAX__ 2147483647
#define __WCHAR_TYPE__ int
#define __WCHAR_WIDTH__ 32
#define __WINT_TYPE__ int
#define __WINT_WIDTH__ 32
#define __amd64 1
#define __amd64__ 1
#define __apple_build_version__ 5030040
#define __block __attribute__((__blocks__(byref)))
#define __clang__ 1
#define __clang_major__ 5
#define __clang_minor__ 1
#define __clang_patchlevel__ 0
#define __clang_version__ "5.1 (clang-503.0.40)"
#define __core2 1
#define __core2__ 1
#define __llvm__ 1
#define __pic__ 2
#define __strong 
#define __tune_core2__ 1
#define __unsafe_unretained 
#define __weak __attribute__((objc_gc(weak)))
#define __x86_64 1
#define __x86_64__ 1

Flock of Horror 買いました

かねてから Timbuk2 クラシックメッセンジャーの XS を買おうと思っていたのですが、なかなか気に入った配色が出なかったのでずっとどうしようか迷ってました。 もう、本家サイトでカスタマイズしてやろうかとさえ思ってました。 そうするとお値段が結構かかっちゃうんですよね〜。もうちょっと安ければ良かったのですが・・・。

そうこうしているうちに、AppleStore で限定カラーで好みの色のバッグ
Crumpler 13インチ Flock of Horror Bag - Apple Store (Japan) 」 が出てたので、速攻で注文しちゃいました。

f:id:marchon:20140531023831j:plain

写真が暗いので分かりづらくてすみません。

Crumpler はメッセンジャーやカメラバッグなどを製作してるブランドなんですが、 「バーニー・ラッスル・ブランケット」が気に入って今でも使ってます。 なにせ、ほとんど街で持ってる人に出会ったことがないところがいいです。www
現在のデザインはこんなのです。

一応、AppleStoreのサイトでは13インチと書いてありMacBookが入っている感じで、サイズ的には大丈夫そうなので、33cmのVAIOはどうかな〜と思いつつ入れてみたらギリ収まりました。(MacBookでないところが少し悲しい)
残念ながら、インナーのコンパートメントには収まりませんでした。

f:id:marchon:20140531025256j:plain

一応、メーカー的にはラップトップメッセンジャーバッグと分類で一般的なメッセンジャーバッグというわけではなく、少し特殊な形状バッグで収納口を折り畳む形となってます。

Emacs カスタマイズ

最近また開発環境について考える機会があったので、少しメモ。 コーディングのためのガイドラインとしてよくあるインデントの扱いについて設定するための elisp を作成したので、インデントがらみの設定とともに掲載しておきます。

タブストップ位置の自動作成

Emacs のタブストップ位置は tab-stop-list 変数で設定可能で通常は以下のように設定します。

(setq tab-stop-list '(8 16 24 32 40 48 56 64 72 80 88 96 104 112 120))

上記はデフォルト値なんですが、タブ幅4にする場合は

(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60))

のように設定します。
見ての通り、少々面倒です。
なので、次のものを用意しました。

;; tab-stop-list を指定幅で作成する
(defun make-tab-stop-list (stride)
  "Make tab-stop-list"
  (interactive "nTabStride: ")      ; 'n' で数値として読み込む
  (setq tab-stop-list ())
  (let ((num stride))
    (while (< num 256)
    (setq tab-stop-list `(,@tab-stop-list ,num))
    (setq num (+ num stride)))))

使用方法は以下。

(make-tab-stop-list 8)  ; タブ幅8設定
(make-tab-stop-list 4)  ; タブ幅4設定

バックタブ

逆インデントのためのバックタブです。タブストップに合わせて逆インデントします。

;; backtab
(defun backtab-to-tab-stop ()
  "Do back to previous tab-stop"
  (interactive)
  (let ((tabs tab-stop-list)
    (col (current-column))
    (tab-last 0))
    (back-to-indentation)           ; 現在行の白文字でない最初の文字へポイントを移動
    (if (= col (current-column))        ; 当初のカーソル位置が白文字でない最初の文字位置と一致しているかどうかで期待する位置を調整
    (while (and tabs (> col (car tabs)))
      (setq tab-last (car tabs))
      (setq tabs (cdr tabs)))
      (while (and tabs (>= col (car tabs)))
      (setq tab-last (car tabs))
      (setq tabs (cdr tabs))))
    ; 期待するタブ位置にくるまで1文字ずつ削除
    (while (> (current-column) tab-last)
      (delete-backward-char 1))))

下記のような設定で「SHIFT + Tab」にキーバインドしておくと良いかと思います。

(global-set-key [S-tab] 'backtab-to-tab-stop)

その他

タブコードの幅は tab-width で設定可能です。

(set tab-width 8)

タブコードを使わず空白を使用するには以下で設定可能です。

(setq indent-tabs-mode nil)

PT2によるTV録画視聴環境#4

さて、その後大分流行遅れでしたが価格もこなれてきた頃、遂にPS3を入手しました。 ご存知の方も多いとは思いますが、PS3はメディアプレイヤーの側面も強く、ゲームだけでなく便利なマシンだと私は思います。 SONYからtorneやnasneを出しているところからも、方向性が分かると思います。 PS3についているDLNAクライアント機能を使わねばということで、DLNA再生の環境も準備をはじめることにしました。

DLNAにより動画を視聴するためにはDLNAサーバをどこかでたてておく必要があります。そこでいくつか探した結果使えそうなソフトを導入してみました。

こちらはTSファイルをエンコードしながら再生できるので、非常に良い感じです。 Windows にインストール後、動画ファイルをおいてあるフォルダを指定するだけです。ログイン時に自動起動しておけば以降特にすることはありません。 現在はバージョンアップされライセンスキーが必要になったのですが、フリーのときの旧バージョン(v1.9.7)でも十分なので今でもそちらを使い続けています。

f:id:marchon:20140528005848p:plain

こちらはPS3に特化したDLNAサーバです。 こちらもTSファイルはエンコードしながらの再生ができます。 Java が必要ですが、動画ファイルのフォルダを指定するだけの設定で視聴できます。 PS3とリンクするとPS3のアイコンが表示されます。

f:id:marchon:20140528010835p:plain

とりあえず、フリーで使用できそうなDLNAサーバは以上の2つを選択しましたが、それぞれエンコードなどの設定はいろいろとできるようですし、どちらも良さはあるかと思いますが、とりあえずはほとんど何もしなくても利用できるかと思うので、好みでOKかと思います。 私は、TVirsity を使っています。 しかしながら、TSファイルによってはうまく再生できないものもあるようです。



番外編

実は Windows Media Player はDNLAサーバ機能もついています。 こちらはTSファイルが再生できないので候補から外しましたが、OS標準のソフトでできるとありがたいとは思います。 別途対応したフォーマットのものであれば、こちらを使用するのもありかと思います。
設定も動画ファイルのフォルダを登録するだけですので楽チンです。 最近は自動でエンコードしていたりするので、こちらも問題なく使えていたりします。


PT2によるTV録画視聴環境#4

PT2によるTV録画視聴環境#3

PT2によるTV録画視聴環境#2

PT2によるTV録画視聴環境


PT2によるTV録画視聴環境#3

続きです。

前回は録画したPC(Windows)で動画を視聴した方法をいくつかお話しました。

実は自宅でのPC作業はMacを中心にしています。 Windows機は基本的にTV録画用としての位置づけです。

Macからの視聴については特筆することはありません。 Windows側でディスクやフォルダの共有設定を行うだけで、Macからの動画ファイルのアクセスに困ることはありません。

Windows側は 右クリック > プロパティ > 共有 > 共有開始 ですね。
Mac側は 移動 > サーバーへ接続... で、サーバーアドレスに

smb://<PC名もしくはIPアドレス>

を入力し接続すれば、共有先一覧が表示されるので選ぶだけです。 共有設定によってはパスワード入力を求められる場合もありますが、Keychainに保存しておけば、以降はあまり気にする必要はありません。

動画ファイルさえ見えてしまえば、後は再生ソフトだけです。 しかし残念ながらMacではそれほど種類は多くありません。 私が中心に使用しているのは以下です。

昔はフリーだったのですが、いつの間にか AppStore で有料になっています。 フリーの旧バージョンは今でもここでダウンロードできます。 操作も快適でなかなかオススメです。

言わずと知れた超有名動画プレイヤ。一応ほとんどのフォーマットが再生でき、TSもほとんど問題ありません。

mplayer のフロントエンド。以前は AppStore にも並んでましたが、いつからかリジェクトされたようです。 こちらも多くのフォーマットが再生できるので良いのですが、TSファイルだとシークバーが機能しないのが残念なので、 TS用としてはほぼ使用していません。

実際は、MacWindowsはモニタを並べているので、どちらかで作業している際はもう一方のモニタで視聴するようにしていつでも見られるようにしていたりします。



PCでの視聴自体はこれらで良いのですが、これだとノートPCを除いてPCの前だけでの視聴となってしまいます。 私の場合、当時はDLNAに対応した機器を持っていなかったので、次のアプローチとしてiPadで見られると家中どこでも見ることができるので、そちらでの視聴を考えようとなりました。 まあ、当然ですね。

当時はTSファイルのままネットワーク越しに再生できるアプリがほとんどなかったので、これ一択でした。 TSファイルについてはエンコードしながらの再生なんですが、たいていのTSファイルは再生できますがTSファイルに問題がある場合などは再生できないこともあります。 有料ソフトですが、フリー版もありそちらで動作確認してから判断でき、持っていて損はないと思います。 これを使用するためには、動画を保存しているPC側でサーバーソフトを起動しておく必要がありますが、 そちらは、ここから無料でダウンロードできます。
実は、新しいバージョンのものがリリースされているのですが、未だに旧バージョンを使用してたりします。 MP4などエンコードの必要がないものはそのままストリーミングできるので、シーク操作が高速にできます。 エンコードを済ませておけるならしておいた方が便利です。

iPadで動画を視聴できるようにすることで、格段に利便性が上がりました。 先のAirVideoではインターネット越しの接続も出来るので、自宅のルーターの設定が必要になりますが外出先からもストリーミング再生出来たりします。 一度試しましたが、解像度は落ちますが案外スムーズに視聴することができました。 ただ、シークバーの操作はリアルタイムエンコード時は激しく操作性が下がります。 この場合は、通信料と自宅ののセキュリティには注意が必要です。

PT2によるTV録画視聴環境#4

PT2によるTV録画視聴環境#3

PT2によるTV録画視聴環境#2

PT2によるTV録画視聴環境

PT2によるTV録画視聴環境#2

続きです。
さて、PCで録画したデータをどのように視聴するかという課題ですが、当然ながら一番単純な方法として録画したPCにて動画プレイヤで再生視聴するというものです。 録画してできる動画ファイルはTSフォーマットなので再生できるプレイヤが限られます。

また、機能として以下の操作ができるものを探しました。

  • 再生速度を変更できる。
    基本的に常に 1.5 倍とかで再生したいので。
  • 10秒送りなどの操作が簡単にできること。
    CMなどはすっ飛ばしたいので。

主に使用した再生ソフトは以下です。(情報はネット上にゴロゴロしてますが・・・)

  • TvTest
    言わずと知れたDTV御用達のソフトです。 デフォルトではファイル読み込みができないので、別途「BonDriver_File」を組み込みました。
    ほぼ100%再生できるので、困った時はコレです。
    ただ再生速度を変えられない(一応方法はあるのですが面倒)など再生に関しては満点とは言えません。
    TvTest はいろいろあれなので自力で探してください。 f:id:marchon:20140522022044p:plain

  • GOM Player
    お隣の国のソフトですが、コーディックが多く入っているので結構便利でした。 スキを見せると変なソフトをインストールされそうになるのは注意です。 個人的には好きでしたが、現在はあまり使っていません。 f:id:marchon:20140522023246p:plain

  • SMPlayer
    MPlayerWindowsフロントエンドの一つです。 こちらも多くのフォーマットを再生できるので便利なのですが、TSファイルだとほぼ必ずシークバーが正しく表示されないのが玉にキズです。 ですが、最近はこちらを使うことが多いです。 f:id:marchon:20140522023737p:plain

  • Media Player Classic Home Cinema (mpc-hc)
    軽量なプレイヤで、こちらも多くのフォーマットが再生可能です。
    しかしながらもう少し操作性が良かったらいいのですが・・・。 f:id:marchon:20140522024911p:plain

  • Windows Media Player
    Windows純正のプレイヤです。
    こちらもTSファイルは普通に再生されるので使えるのですが、実際のところそれほど使っていません。 f:id:marchon:20140522030029p:plain

以上、使用する動画プレイヤでした。

PT2によるTV録画視聴環境#3

PT2によるTV録画視聴環境#2

PT2によるTV録画視聴環境

PT2によるTV録画視聴環境

私の最近のTV録画環境はほぼPCメインになってきました。 導入は4、5年前でしたが、少しずつ録画データの取扱いや視聴環境の方法などを試行錯誤しながら、ようやく形になり最近は安定して運用できるようになりました。

現在、それぞれPT2を2枚挿ししたPCを2台体制で運用しています。

問題は録画したデータをどのようにして視聴するかなのですが、なかなか「コレだ!」という 方法を見つけられずにいろいろと試してきました。 その結果分かったことはたった一つの方法で全てを賄うのはムリ。 一つでダメなら状況に応じていろいろと使い分けようと言う風に落ち着きました。

その環境をこれから少しずつ紹介したいと思います。

PT2によるTV録画視聴環境#2