PocketBeagle の Rev A2 は印刷されたGPIO番号が1箇所間違っている

小ネタですが、知らない人(=未来の俺)がドハマりするかもしれないので。

PocketBeagleに限ったことですが、リビジョン番号が「A2」と印刷されたロットだと、GPIOの44番が「48番」と間違って印刷されています。

ちなみに私の所有するPocketBeagleはといいますと、

PocketBeagle Revision A2

大当たりー。
で、問題のGPIO44はこの裏側、P2ヘッダ側の「+3.3V」と対になっている箇所にシルク印刷されています。

PocketBeagle GPIO44 incorrectly labelled as 48

まあ、分かってはいたんですが、実際見るとちょっと凹みますね。。。

ちなみにこの問題は次ロットでは修正されるということですが、PocketBeagleそんなに売れていないと思うので(笑)、次のロットが市場に出てくるのはもう少し先になるんじゃないかなと。

言い換えると、現在日本国内で入手できるPocketBeagleはほぼ確実に「A2」リビジョンになると思われるので、欲しい方は諦めて「A2」を購入
しましょう。大丈夫、きっといつかプレミアつきますから。

地味なエラーですけど、シルク印刷見ながら製作してる人は「信号が出ない!」と思っちゃいますよね。実際バグチケットもいくつか切られてますし。

https://github.com/beagleboard/pocketbeagle/issues/4

個人的には、サプライヤー大手のMouserのデータシートや、 Digi-keyのデータシートに未だに間違った情報が載っているのが混乱に拍車をかけている気もするんですが。

さすがに公式のデータシートはちゃんと修正されています。何かあればまず公式で確認、ということでしょうね。

共有ライブラリへの依存関係を確認する

BeagleBone と直接関係しませんが、知らなかったのでメモ。

コンパイル時、ダイナミックリンクで実行ファイルを作成した場合に、どの共有ライブラリに依存しているか ldd コマンドを使用して調べることができる。

例えば、以下のような bbb という実行ファイル(中身はただの helloworld プログラム)に対して、

debian@beaglebone:/tmp/tmp.wUMMEnbj8v/cmake-build-debug-bbb$ ll
total 88
drwxr-xr-x 3 debian debian  4096 Feb 23 12:54 .
drwxr-xr-x 5 debian debian  4096 Feb 23 12:53 ..
-rwxr-xr-x 1 debian debian 11100 Feb 23 12:54 bbb ← これ
-rw-r--r-- 1 debian debian  5166 Feb 23 12:53 bbb.cbp
-rw-r--r-- 1 debian debian 41700 Feb 23 12:53 CMakeCache.txt
drwxr-xr-x 5 debian debian  4096 Feb 23 12:54 CMakeFiles
-rw-r--r-- 1 debian debian  1376 Feb 23 12:53 cmake_install.cmake
-rw-r--r-- 1 debian debian  4725 Feb 23 12:53 Makefile

ldd コマンドで依存関係を確認することができる。

debian@beaglebone:/tmp/tmp.wUMMEnbj8v/cmake-build-debug-bbb$ ldd bbb
	linux-vdso.so.1 (0xbed75000)
	libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0xb6e1e000)
	libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6da6000)
	libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6d7d000)
	libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6c8f000)
	/lib/ld-linux-armhf.so.3 (0xb6f3c000)

自作プログラムに限らず、実行形式ファイルであれば何でも確認できるので、例えば普段使っているコマンドが突然動かなくなった場合などに、依存している共有ライブラリの存在チェックに使えそう。

(以下は ls コマンドの依存関係を調べた例)

debian@beaglebone:~$ ldd /bin/ls
	linux-vdso.so.1 (0xbed48000)
	libselinux.so.1 => /lib/arm-linux-gnueabihf/libselinux.so.1 (0xb6ee6000)
	libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6df8000)
	/lib/ld-linux-armhf.so.3 (0xb6f37000)
	libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0xb6d99000)
	libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6d86000)
	libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6d62000)

指定できるパラメータは以下の通り

debian@beaglebone:~$ ldd --help
Usage: ldd [OPTION]... FILE...
      --help              print this help and exit
      --version           print version information and exit
  -d, --data-relocs       process data relocations
  -r, --function-relocs   process data and function relocations
  -u, --unused            print unused direct dependencies
  -v, --verbose           print all information


PocketBeagle の動作速度をカスタマイズする

まず現在の動作速度および動作モード(ガバナーというらしい)を cpufreq-info コマンドで確認する。

debian@beaglebone:~$ cpufreq-info 
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
  driver: cpufreq-dt
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 300 us.
  hardware limits: 300 MHz - 1000 MHz
  available frequency steps: 300 MHz, 600 MHz, 720 MHz, 800 MHz, 1000 MHz
  available cpufreq governors: conservative, ondemand, userspace, powersave, performance
  current policy: frequency should be within 300 MHz and 1000 MHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency is 1000 MHz.
  cpufreq stats: 300 MHz:0.00%, 600 MHz:0.00%, 720 MHz:0.00%, 800 MHz:0.00%, 1000 MHz:100.00%

PocketBeagle は 300MHz, 600Mz, 720MHz, 800MHz, 1000MHz で動作可能。 (デフォルトは 1000MHz)

The governor "performance"... とあるので、現在 performance ガバナーで動作している事がわかる。

PocketBeagle でサポートしているガバナーはconservative, ondemand, userspace, powersave, performance の5つ。

debian@beaglebone:~$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
conservative ondemand userspace powersave performance

Archlinuxスケーリング governor のページと比較すると、PocketBeagle ではschedutil 以外のガバナーを全てサポートしている。

Exploring BeagleBone: Tools and Techniques for Building with Embedded Linux では、ondemand ガバナーでCPU負荷にしきい値を設定して、しきい値を超えたタイミングでCPUの動作速度を変更する例が記載されていたが、自分の用途では遠隔から手動で動作を切り替える、という手段が望ましい。

試しに動作速度を最低の 300MHz まで落としてみる。

debian@beaglebone:~$ sudo cpufreq-set -f 300MHz
debian@beaglebone:~$ cpufreq-info 
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
  driver: cpufreq-dt
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 300 us.
  hardware limits: 300 MHz - 1000 MHz
  available frequency steps: 300 MHz, 600 MHz, 720 MHz, 800 MHz, 1000 MHz
  available cpufreq governors: conservative, ondemand, userspace, powersave, performance
  current policy: frequency should be within 300 MHz and 1000 MHz.
                  The governor "userspace" may decide which speed to use
                  within this range.
  current CPU frequency is 300 MHz.
  cpufreq stats: 300 MHz:2.43%, 600 MHz:9.19%, 720 MHz:0.00%, 800 MHz:0.00%, 1000 MHz:88.38%  (26)

簡単に動作速度を変更できた。
組み込み用途でスタンバイ中に消費電力を抑えるのに使えそうだ。

なお、起動時にデフォルトで選択されるガバナーはperformance
これを変更したい場合は、起動スクリプトを直接編集するしかないようだ。

debian@beaglebone:~$ sudo grep -B20 -A2 -e "^GOVERNOR=" /etc/init.d/cpufrequtils 

# Which governor to use. Must be one of the governors listed in:
#   cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
#
# and which limits to set. Both MIN_SPEED and MAX_SPEED must be values
# listed in:
#   cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
# a value of 0 for any of the two variables will disabling the use of 
# that limit variable.
#
# WARNING: the correct kernel module must already be loaded or compiled in.
# 
# Set ENABLE to "true" to let the script run at boot time.
# 
# eg:	ENABLE="true"
#	GOVERNOR="performance"
#	MAX_SPEED=1000
#	MIN_SPEED=500

ENABLE="true"
GOVERNOR="performance"
MAX_SPEED="0"
MIN_SPEED="0"

ガバナーの考え方は、Redhat のドキュメントが分かりやすかった。

※ もし cpufreq-info コマンドがインストールされていない場合は apt install で取ってくる。 (自分の環境では既にインストールされていた)

debian@beaglebone:~$ sudo apt install cpufrequtils
[sudo] password for debian: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
cpufrequtils is already the newest version (008-1+b1).
0 upgraded, 0 newly installed, 0 to remove and 15 not upgraded.

BeagleBone Black (BBB) と PocketBeagle の比較

色々先走って書き出してしまいましたが BeagleBone Black (BBB) と PocketBeagle の比較表ぐらいは必要だろうと作成してみました。

表レイアウトが微妙なのは筆者のスキル不足です。

モデルBeagleBone Black (BBB)PocketBeagle
価格
$55$25
プロセッサ1GHz AM335x x 1
32bit RPUs x 2
1GHz AM335x x 1
32bit RPUs x 2
メモリ
512MB DDR3512MB DDR3
ストレージ4GB eMMC

MicroSD スロット
MicroSD スロット
映像出力micro-HDMIなし
デバッグJTAGJTAG
インターフェース
46pin GPIO x 236pin GPIO x 2
ネットワーク10/100 Ethernetなし
無線LANなしなし
電源USB経由 または DCジャック (5.5mm)USB経由またはGPIOヘッダ

ご覧のとおり、インターフェースには明確な差異があるものの、プロセッサとメモリ構成は、実は BBB と PocketBeagle で同じなんですね。

小さい=非力ではないので、アプリケーションの構成によってはPocketBeagleでも BBB と同等の性能を発揮できそうです。これは嬉しい。

ですので、BBB と PocketBeagle どちらを選ぶかは、性能ではなくユーザの利用目的で選べばいいと思います。Raspberry Pi 的な使い方をしたい人は BBB、Arudino や mbed マイコン的な組み込みに近い用途で開発をしたい人は PocketBeagle という感じでしょうか。

でも、ラズパイ的な使い方したい人はラズパイ買っちゃうだろうから、結局 BBB の認知度はちっとも上がらないんですよね。。。

オチがついたところで今日はここまで。

BeagleBoneのGPIO最大電流は4-6mA

タイトルそのまんまなんですが。結構少ないなという印象です。

GPIO 接続で電流を消費するデバイスと言われて思い浮かぶのは LED なんですが、よくある感じの LED でも標準電流 20mA なので、定格オーバーしないように注意が必要です。(BeagleBone に限った話ではないですが)

ちなみに少し調べてみると、マイコン別の最大電流は Arduino Uno で 10-20 mA、mbed リファレンス機である LPC1768 で45-50mA でした。Raspberry Pi でも 17mA なので、他家と比べても控えめですね。

BeagleBone のデータシートはこちらからどうぞ。

cordova プロジェクトで platform が依存する cordova バージョンを確認する方法

cordova プロジェクトにおいて、個々のプラットフォームがビルドに必要とする cordova のバージョン番号を確認するには、CordovaLib 以下にある VERSION ファイルの中身を参照すれば OK です。

具体的な例として、例えば ios プラットフォームの場合、プロジェクト直下で以下のコマンドを実行すればバージョン番号が確認できます。

$ cat ./platforms/ios/CordovaLib/VERSION 
3.5.0

ちなみに、このバージョン番号は CORDOVA_VERSION_MIN_REQUIRED として CDVAvailability.h 内でも定義されているとおり、特定のプラットフォームにおいてビルドを実行するのに必要となる「最小のバージョン番号」になります。

CORDOVA_VERSION_MAX_REQUIRED という定数は定義されていないため、感覚的にはこれよりも大きい cordova バージョンを使えば問題なさそうですが、実際には cordova バージョンが大きすぎる場合ビルドに失敗することがあります。

もし cordova build が失敗する場合は、このファイルで定義されているバージョン番号と同じか、少しだけ大きいバージョン番号で試すと良いでしょう。

$ grep "CORDOVA_VERSION_MIN_REQUIRED __CORDOVA" ./platforms/ios/CordovaLib/Classes/CDVAvailability.h
    #define CORDOVA_VERSION_MIN_REQUIRED __CORDOVA_3_5_0

このプロジェクトの例では、cordova 3.5.0-0.2.0 〜 3.6.3-0.2.13 では問題ありませんでしたが、cordova 4.0.0 〜 ではビルド NG でした。

バグが出たからと数年前に納品済みのアプリのソース一式を渡されて、ビルドすらできずに戸惑った自分への戒めを含めたメモでした。

kindle 無印と kindle paperwhite の割引セール 8/21まで

ずっと気になってた kindle ですが、最近リニューアルされた無印(一番安いグレード)が、かなりコストパフォーマンスが良いと知人から聞いてますます欲しくなってしまいました。

ガラケー、スマホ、タブレット、ノートPCをそれぞれ所有し、しかも仕事で毎日それら全てを運んでいるという、便利なのかバカなのかわからない状態の作者。ここで kindle 購入したらある意味コンプリート。完全なバカ。

バカは別にいいんですが、これ買っちゃったらもう欲しいガジェットなくなっちゃうんだろうなぁ…と、目的とは若干ずれた視点でも悩んでたりもします。好きなものは最後にとっておくタイプなので。

で、結論から言うと、買っちゃいました。(ポチっただけですが)

いつ何かに背中を押されてもおかしくない状態だったのですが、決め手となったのは、離れて暮らす父親の誕生日に贈ろうかな…と。

kindle は本をギフトとして贈ることもできるらしいので、kindle 本体を贈った後も、父親が好きな歴史ものの本を見つけるたびに贈る、といった事もできそうです。父親とは最近すっかり疎遠になってしまっているので(主に自分が悪いんですが)、「kindle+本」を通じたコミュニケーションなんてのも面白いかなあと。

本当は直接会って本の感想とか言い合いながら酒を酌み交わすなんてのが理想なんですけど、遠距離と仕事と子育てに奮闘していると、なかなかそんな機会にも恵まれないです。職人だった父親は用がないと連絡してこない人タイプの人なので、引退してからはますます音沙汰がなくなってしまい、何かきっかけが欲しいと思っていたところなので、今回のキャンペーンに乗じて kindle 試してみる事にしました。

あ、そもそも使ってくれるかという疑問は、確かにありますけどね。老眼だし。
いやむしろ文字サイズを変えられる kindle なら読みやすい?
まあ出たとこ勝負ですね(笑

Firefox OS Bluetooth API の翻訳(と試行錯誤)

このエントリは MDNやFirefox OSのドキュメントをみんなで翻訳! Advent Calendar 2015 の 21 日目 です。

Bluetoothマネージャと設定操作に必要な Setting API あたりを翻訳してみました。
初めての翻訳作業でしたが、初日のUemmra3さんの投稿などを参考にさせていただきながら、色々悩みつつも楽しんで作業しました。

訳したのはこのあたり↓です。
BluetoothManager (Firefox OS)
デバイス設定の利用

基本自分は締め切りに終われないと動かない(動けない)人なので、ウィキペディアとか自主的に書いてる人本当にすごいなあと思います。

今回もそうなんですが、作業開始からある地点を超えると、どんどん作業速度が増してくるんですよ。で、そのスピードに乗れると、今度は作業そのものが楽しくなってきて、気がつくと時間を忘れて没頭してたりするんです。
(ただしその地点をいつ越えられるかが分からないので、それまでは終わりの見えない悶絶タイムが続くわけですが)

今回 Firefox OS の bluetooth まわりを翻訳してみようと思ったきっかけは、Firefox OSで bluetooth がらみのアプリを作りたいなとのほほんと思いついたからなんですが、名乗りを上げてからよくよく調べてみると、bluetooth 関連のAPIは認定アプリ(内部アプリとか公認アプリとか呼ばれていたりもします)に属するAPIで、セキュリティの観点から通信事業者やOEM事業者、つまりプリインストールされるアプリにのみその利用を限定されてたんですね。

どおりでテストプログラム書いて BluetoothManager オブジェクトとか取得しても null 返ってくるわけですよ・・・

ドキュメントちゃんと読めって感じです。訳して下さった方ごめんなさい。というか翻訳作業者が何やってるんだって感じですが。

で、そもそも触れないAPI翻訳したって仕方ないじゃないの、とやさぐれてたんですが、久しぶりに引っ張り出してきた Firefox Flame の開発者メニューを眺めてたらこんな項目を見つけて釘付けに。

flame_unlock_privilages

何この危険そうな感じの素敵なスイッチ。押してみよう。

2015-12-22-02-37-14

セキュリティを解除した上にデータまで削除。
たぶんよい子は押しちゃいけないやつです。でも押す。

2015-12-22-02-37-23

この画面のあとボタンを10回押すとFASTBOOTの画面が表示され、本当に真っ新な状態でデバイスが起動しました。

期待をこめて、Bluetooth Managerを取得してコンソールに出力するだけの簡単なコードを実行してみます。

// Bluetooth Manager 取得
bluetooth = window.navigator.mozBluetooth;
console.info("mozBluetooth", bluetooth);
console.info("BluetoothManager.enabled", bluetooth.enabled);

すると・・・

console_log

ちゃんとオブジェクト返ってきてます!成功です!!

・・・と、思ったんですが、よく見るとたった一つしかない .enabled プロパティが取れていません。(涙)
.getAdapters() メソッドも叩いて見たのですが、やはりこちらも空っぽの配列が返ってくるだけ。
つまりオブジェクトが取れただけで、あとは何もできないんです。

Firefox WebIDE は認定アプリのデバッグは正式にサポートしていないし、そもそもコンソールのデバッグにも限界を感じ始めました。そこでない知恵を絞って色々考えてながら調べてゆくと、Android SDK にバンドルされている Android Monitor が使えそうだということに。

Android Monitor | Android Developers

ええもう翻訳時間よりデバッグ時間の方が長くなってます。

実は BluetoothManager は、マネージャーと言いつつも Bluetooth アダプタの取得と bluetooth の有効/無効の監視くらいしかできなかったりします。割と守備範囲の狭い子なんです。

そこで Settings API を使って Bluetooth の状態変更を任意に発生させ、イベント発生を拾えないかテストしてみました。

新たに追記した Setting API はこれだけです。

// Setting API の取得と lock オブジェクト作成
var settings = window.navigator.mozSettings;
var lock    = settings.createLock();

// 設定取得
var setting = lock.get('bluetooth.enabled');
setting.onsuccess = function () {
    console.log('setting.result', setting.result);
};
setting.onerror = function () {
    console.warn('setting.error', setting.error);
};
// 設定変更
var result = lock.set({
    'bluetooth.enabled': true
});
result.onsuccess = function () {
    console.log("bluetooth settings has been changed");
};
result.onerror = function () {
    console.log("An error occure, the bluetooth settings remain unchanged");
};
console.info("result", result);

その実行結果がこちら。
(読みにくくてすみません)

12-22 00:17:01.346: I/BlueToothTest(5221): Content JS INFO: mozBluetooth [object BluetoothManager] 
12-22 00:17:01.356: I/BlueToothTest(5221): Content JS INFO: BluetoothManager.enabled  
12-22 00:17:01.676: I/BlueToothTest(5221): Content JS LOG: bluetooth settings has been changed 
12-22 00:17:01.746: I/GeckoDump(2449): [system] [SettingsCore][2851.691] observing settings bluetooth.enabled changed to true
12-22 00:17:01.746: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.694] observing bluetooth.enabled : true
12-22 00:17:01.746: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.695] observer for bluetooth.enabled found, invoking.
12-22 00:17:01.746: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.696] unsuspending: bluetooth.suspended
12-22 00:17:01.746: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.696] writing {"bluetooth.suspended":false} to settings db
12-22 00:17:01.746: I/GeckoDump(2449): [system] [SettingsCore][2851.697] writing {"bluetooth.suspended":false} to settings db.
12-22 00:17:01.796: I/GeckoDump(2449): [system] [SettingsCore][2851.741] observing settings bluetooth.suspended changed to false
12-22 00:17:01.796: I/GeckoDump(2449): [system] [AirplaneModeServiceHelper][2851.741] observing bluetooth.suspended : false

ログを見る限りでは Setting API で Bluetooth の有効に成功しているし、実際 Setting API の .onsuccess() コールバック関数では設定変更のイベントも取得できているんですが、肝心の BluetoothManager が設定の変更を検知してくれないんです。

そもそも .enabled プロパティは相変わらず null だし、そもそもあるはずの Bluetooth アダプタが返ってこないのもおかしい。

もはやソースコードを確認するしかない。
他のプラットフォームなら多分諦めてますが、こんな時ソースコードがJavascriptで書かれているのが有難いです。

githubを彷徨って、多分これが BluetoothManager のソースコードだと思われる箇所を発見。

gaia/apps/bluetooth/js/modules/bluetooth/bluetooth_adapter_manager.js

しかし .enable プロパティが定義されていない。あれ?間違えた?
ここで初期化された後どこかで追加されるとか。いや、そんな追いにくいコード書くかなぁ。
システム構造の基本知識がないから判断に迷うところです。こんな事なら Firefox OSのコードリーディングに参加しておくんだった・・・

gaia/apps/system/js/bluetooth_v2.js

あれ、bluetooth_v2.js なんてソースコードがあるぞ?
こっちには .enabled が定義されてる。ひょっとして flame に入れた OS のバージョンが古い?いやいや Latest master builds なんですけど・・・。

と、色々試行錯誤しているうちに時間切れになってしまいました。
ここまで読んで下さった人、本当に申し訳ない。でもありがとうございます。

今回の経験を通じて問題解決のための手数が増えたので、一応得るものはあったのですが、やっぱり解決にたどり着けなかったのは悔しいです・・・というか気になって仕方がないです。

あと後半は脱線気味でしたが、自分はやはり bluetooth まわりを習得したいです。
でも頑張って作っても自分の開発端末でしか動かせない、配布できないというのは寂しいです。

なのでもし将来的にはマーケットのレビュープロセスで配布可能になったり、カメラAPIのように低い権限レベルでも利用可能になると嬉しいです。Mozillaの偉いひと、お願いします。そんな未来がやってくるならデバッグにも身が入ります(笑)

OSX MavericksでApache使うときの覚え書き

とりあえず以下の3つ覚えておけば何とかなるかと。

$ sudo apachectl start
$ sudo apachectl stop
$ sudo apachectl restart

というかマニュアル見た方が早い?

$ sudo apachectl -man
Usage: /usr/sbin/httpd [-D name] [-d directory] [-f file]
                       [-C "directive"] [-c "directive"]
                       [-k start|restart|graceful|graceful-stop|stop]
                       [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number
  -V                 : show compile settings
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed settings (currently only vhost settings)
  -S                 : a synonym for -t -D DUMP_VHOSTS
  -t -D DUMP_MODULES : show all loaded modules 
  -M                 : a synonym for -t -D DUMP_MODULES
  -t                 : run syntax check for config files
  -T                 : start without DocumentRoot(s) check

上記マニュアルには載ってないけれどconfigtestも使えるみたいです。

$ sudo apachectl configtest
Syntax OK