2016年6月15日水曜日

Excelの未使用ユーザースタイルを簡単に削除する

Excel のユーザースタイルは 「XLStylesTool」 を使用することで削除可能ですが、ユーザースタイルを削除するたびに毎回外部ツールを使用しなければならないのはちょっと不便でした。

この投稿では外部ツールやマクロを使用しないで、未使用のユーザースタイルを削除する方法を紹介します。 (動作環境は Windows 10 Pro 64bit, Excel 2013 32 bit です。)



手順は 3 ステップ

  1. すべてのシートを選択。

  2. 移動またはコピーを選択。

  3. 移動先ブック名に「新しいブック」を選択し、「コピーを作成する」をチェック。

このようにすると「新しいブック」には使用中の「ユーザースタイル」のみが引き継がれることになり、結果として未使用のユーザースタイルを削除することができます。



実際に未使用のユーザースタイルを削除する例を紹介します。

対象ファイルのワークブック中に存在するユーザースタイルを、マクロを使って数えたところ 41778 個のユーザースタイルが登録されていることがわかります。

セルのスタイルメニューを開くと、このように多くのユーザースタイルが表示されています。

このワークブックの中で使用しているユーザースタイルを、先日作成した 「Excel のユーザースタイルの使用状況を調べるマクロ」 で調査したところ 41778 個のユーザースタイルの内、実際に使用しているスタイルは標準22のひとつだけで、残り 41777 個のユーザースタイルは全て未使用であることを確認しました。

ここで前述の手順どおり 「新しいブック」 にすべてのシートをコピーして、未使用のユーザースタイルを削除します。ユーザースタイルの削除後 「新しいブック」 のセルのスタイルメニューを開くと、ユーザースタイルの項目は標準22だけが残り、未使用のユーザースタイルが全て削除されたことがわかります。

改めてマクロで確認しても、使用中のユーザースタイルが一つだけであることがわかります。



マクロの処理速度の違い

大量のユーザースタイルはマクロの処理速度に大きく影響を与える場合があります。たとえばユーザースタイル (4,000 個以上) が登録されているブックの中で罫線のLineStyleを標準の太さ以外に変更しようとしたとき、マクロの処理速度が大きく低下する経験をしました。 このような場合、未使用のユーザースタイルを削除することによってマクロの処理速度が向上することがあります。

次の動画は、上記のユーザースタイルの削除前と削除後におけるマクロの処理速度を比較しています。

テスト環境:
CPU: Intel Core i5-2540M 2.60 GHz, RAM: 16 GB,
Windows 10 Pro 64 bit, Excel 2013, Excel 2003 SP3


ユーザースタイルの削除前

(描画処理完了まで約 35 秒要しています)




ユーザースタイルの削除後

(描画処理は約 12 秒で完了) 削除前と比較して 3 倍速くなりました。




Excel 2003 の場合

参考までに、同じアドインを使用した Excel 2003 の処理速度はさらに高速でした。 (描画処理は約 6 秒で完了)削除前と比較して 6 倍速いです。これを今まで使用していました。

注: Excel 2003 のスタイル数は最大 4,000 までのため、事前に XLStylesTool を使用してユーザースタイルを削除しています。



おわりに

Excel 2007 以前のセルスタイルは 4,000 まで使用できましたが、Excel 2007 で 拡張されて最大 64,000 まで使用できるようになりました。 それに伴い 「Excel 2007 で、使用されていないスタイルが、あるブックから別のブックへコピーされます。 - KB2553085」 のような、意図しないスタイルの増加のトラブルなどでユーザースタイルが 4,000 を超えてしまうと 「Word/Excel/PowerPoint 用 Microsoft Office 互換機能パック」 を使用して Excel 2000 や 2003 で xlsx 形式のファイルを開くことができないトラブルが起こりましたが、このような場合は「XLStylesTool」を使用することでユーザースタイルを削除することが可能でした。

そのため、これまでの作業の流れは次のようになっていました。

  1. 作業対象ファイル.xlsx を取得
  2. XLStylesTool でスタイル削除
  3. Office 互換機能パックで変換後 Excel 2003 で開きマクロを実行

既に 2 年前の事ですが、Excel 2003 の延長サポートの終了が残り 1 年となったこともあり Excel 2013 へ移行しようとしました。ところが Excel 2013 ではマクロの処理速度が余りにも遅く、移行をためらうことになりました。結局 Excel 2003 を使い続けることに。

今年になって Windows 10 へ移行したこともあって改めて Excel 2013 に切り替えるべく試行錯誤しているなかで今回の解決方法が見つかりました。 これで安心して Excel 2013 に移行することができます。



関連する過去の投稿

Excelワークブックに登録されたスタイルを数えるマクロ。

2016年6月14日火曜日

メモ:特定の範囲をMathJaxにレンダリングさせない方法

ブログで MathJax を使用できるように設定していると数式表示がとても便利になるのですが、ちょっと具合の悪い場合もあります。それは、数式に解釈できる文字列を含んだ Gist のコードを貼り付けた場合です。

例えばこのように、数式の部分が自動的に変換されて表示されます。

これを回避するには、MathJax の ignoreClass を使用します。

以下のように MathJax.Hub.Config の設定にignoreClass: "tex2jax_ignore"を追加すると。MathJax にレンダリングさせないクラスを設定することができます。

MathJax.Hub.Config({
    
    ...
    
    tex2jax: {

        ...

        ignoreClass: "tex2jax_ignore"
    }
});

コードのスクリプトを張り付ける際は、下記のようにclass="tex2jax_ignore"のブロックで囲みます。

<div class="tex2jax_ignore">
<script src="https://gist.github.com/icm7216/8409c6e4e7332a03ef5747f7f030fd58.js"></script>
</div>

これで MathJax にレンダリングされず、そのまま表示できるようになります。

2016年6月10日金曜日

Excelのユーザースタイルの使用状況を調べるマクロ

Excel のユーザースタイルの使用状況を調べるマクロを作りました。ユーザースタイルを適用している、ワークシートやセルアドレスを知ることができます。以前に作った「スタイル設定をシートに出力する VBAマクロ」の兄弟ツールになります。

結果は新しいシートに表示されます。この一覧ではユーザースタイルが適用されているシート名、セルアドレス、セルの内容、ユーザースタイル名、ユーザースタイルの設定内容などを表示します。


2016年4月9日土曜日

メモ: ワンライナーで計算

コマンドラインの途中で計算結果をコマンド置換して引数の値に使うときの、ワンライナーで(float 値を含む)計算する方法のメモ。


bc コマンドのワンライナーで計算

小数点以下の桁数を指定するには scale 値を設定する。

  • scale 値とは、式の小数部以下の桁数。
  • -lオプションで起動すると数学ライブラリが読み込まれ、 scale 値が 20 に設定される。

 $ echo '(10+90)/3.0' | bc
33
 $ echo "scale=15; (10+90)/3" | bc
33.333333333333333
 $ echo '(10+90)/3' | bc -l
33.33333333333333333333



awk のワンライナーで計算

小数点以下の桁数は書式で指定可能。フォーマット指定子を使い printf で出力するか、 print 出力の OFMT 値を指定する。 OFMT のデフォルト値は"%.6g"

printf で出力


 $ awk 'BEGIN { printf "%.15f\n", (10 + 90) / 3}'
33.333333333333336

print で出力


 $ awk 'BEGIN { print (10 + 90) / 3}'
33.3333
 $ awk 'BEGIN {OFMT="%.15f"; print (10 + 90) / 3}'
33.333333333333336



perl のワンライナーで計算

print で出力

  • print で出力する場合は、関数に続く括弧は計算の優先順位の括弧とはならない。この場合、関数の引数を指定する括弧と解釈されるようだ。回避するには少しばかりの記述の工夫が必要。

 $ perl -le 'print (10+90)/3.0'
100
 $ perl -le 'print ((10+90)/3)'
33.3333333333333
 $ perl -le 'print +(10+90)/3'
33.3333333333333

printf で出力

  • printf で出力する場合、小数点以下の桁数をフォーマット指定子を使って指定可能。また、引数の計算式も正しく解釈してくれるようだ。

 $ perl -le 'printf "%.15f\n", (10+90)/3'
33.333333333333336



python のワンライナーで計算

Python の float 型は内部で 53bit の精度を持っているそうだ。

式の中に float 値を含めると、計算結果は float 値で返される。


 $ python -c 'print (10+90)/3'                                  
33
 $ python -c 'print (10+90)/3.0'
33.3333333333

float() メソッドで float 値に変換


 $ python -c 'print float (10+90)/3'
33.3333333333
 $ python -c 'print float(10+90)/3'
33.3333333333

書式で桁数を指定

%演算子を使う場合(非推奨)


 $ python -c 'print "%.15f" % ((10+90)/3.0)'
33.333333333333336

format() メソッドを使う場合(推奨)


 $ python -c 'print "{:.15f}".format((10+90)/3.0)'
33.333333333333336



ruby のワンライナーで計算

式の中に float 値を含めると、計算結果は float 値で返される。


 $ ruby -e 'p (10+90)/3'
33
 $ ruby -e 'p (10+90)/3.0'
33.333333333333336

組み込み関数Floatto_fメソッドで float 値に変換して計算

  • Float 直後の空白の有無で結果が違うことに注意。

 $ ruby -e 'p (10+90)/3.to_f'
33.333333333333336
 $ ruby -e 'p Float (10+90)/3'
33.0
 $ ruby -e 'p Float(10+90)/3'
33.333333333333336

組み込み関数 sprintf (または format )を使う

  • 小数点以下の桁数をフォーマット指示子を使って指定可能。
  • String#%メソッドでも可能。

 $ ruby -e 'puts sprintf( "%.10f", (10+90)/3.0)'
33.3333333333
 $ ruby -e 'puts format( "%.15f", (10+90)/3.0)'
33.333333333333336
 $ ruby -e 'puts "%.15f" % ((10+90)/3.0)'
33.333333333333336



まとめ

計算式の記述で気を付ける箇所は括弧が先に来る場合。それが式の括弧なのか、引数の括弧なのか、コマンドによって微妙に違うところに注意。

2015年5月15日金曜日

PandocとLuaLaTeXを使ったPDF出力でコードブロックをきれいに表示する

ドキュメント変換ツール Pandoc の LaTeX を使った PDF 出力。

この投稿では前回の HTML 変換に引き続いて、Pandoc を使って Markdown テキストを PDF へ変換する方法を書いています。

使用環境:Windows7 64bit, pandoc 1.13.2, TeXLive 2014



LuaLaTeX

Pandoc の PDF 出力の場合、標準では pdfLaTeX が使われます。本家の Web サイトでは pdfLaTeX をサポートした MiKTeX を薦めていますが、日本語テキストを扱う場合は LuaLaTeX がお薦めです。この LuaLaTeX では日本語組版に対応した LuaTeX-ja パッケージがサポートされています。

Windows 環境への LuaLaTeX のインストールは TeX Live を使います。専用のインストーラが用意されているので簡単にインストールできます。


TeX Liveとは

TeX Live は TeX のディストリビューションのひとつで TeX 環境がこのディストリビューションパッケージにまとめられています。現在では日本語組版に必要な要素のほとんどすべてがまるっと取り込まれているので、TeX Live をインストールするだけで日本語文書を扱うことができます。


TeX Live 2014をインストール

今回は TeX Live 2014 インストール用 DVD を作成してインストールしました。 出来上がった DVD の中の install-tl-windows.bat を実行するとインストールを開始できます。インストールに要した時間は DVD インストールでは約 1 時間でした。また別件で DVD の内容全てを HDD 上にコピー後(ISO ファイルがマウントできるならコピー不要)インストールした場合では約 30 分でした。HDD 上でインストール作業が可能な場合は後者がお勧めです。

TeX Live の最新版 TeX Live 2014 の ISO イメージファイル

TeX Live をインストールすると TeX の総合環境 TeXworks が付いてきます。LaTeX ファイルの動作確認など便利に使えます。

参考: インストール後の TeXworks の日本語環境の設定等が分かりやすく書かれています。



PDF出力を試してみる

はじめに Markdown テキストを PDF ファイルに変換してみましょう。

  1. コマンドプロンプトからpandoc -o hello.pdfを入力
  2. #Hello Pandocを入力
  3. Crtl + Zキーを押してEOFを入力
>pandoc -o hello.pdf
#Hello Pandoc
^Z

問題が無ければカレントフォルダにhello.pdfが出力されているはずです。

このように TeX Live を使えば Pandoc から簡単に PDF 出力できるようになります。



日本語を含んだMarkdownファイルをPDFに変換する場合

日本語文章を PDF 出力する場合は、日本語に対応したLaTeX エンジンとドキュメントクラスを Pandoc に指定して変換します。

たとえば LaTeXエンジンに LuaLaTeX を指定、ドキュメントクラスに ltjarticle を指定する場合は、コマンドにこのオプションを追加します。

--latex-engine=lualatex -V documentclass=ltjarticle

Pandoc のデフォルトエンコーディングは UTF-8 になっています。そのため、コマンドプロンプトから入力した日本語テキストを標準入力から Pandoc に入力すると、内部エンコードの違いでうまくいきません。ここでは入力用の Markdown ファイルを作成して試すことにします。

はじめに任意の Markdown テキストを記述したファイルを作成して UTF-8 でファイルを保存します。 この例ではファイル名input.mdで保存します。

input.md
#こんにちはPandoc

次のコマンドを実行して PDF へ変換します。

pandoc -f markdown input.md -s -o output.pdf ^
--latex-engine=lualatex ^
-V documentclass=ltjarticle

カレントフォルダにoutput.pdfが出力されているはずです。

この例で Pandoc は、入力されたファイルを LaTeX 形式に変換後 LuaLaTeX を経由して PDF を出力しています。このとき-sオプションによって LaTeX 用のテンプレートが適用されています。

ここで、入力した Markdown 形式の内容が、どのように LaTeX 形式に変換されたのかを知るには、出力ファイルを LaTeX 形式に指定することで確認できます。

pandoc -f markdown input.md -s -o output.tex ^
--latex-engine=lualatex ^
-V documentclass=ltjarticle

出力されたファイルoutput.texを TeXworks で開き、LuaLaTeX でタイプセットすると PDF 出力と同じ内容のプレビューを TeXworks で確認することができます。

用紙サイズやマージンの指定は-V geometry:を使うと便利です。

A4用紙に設定する

-V geometry:a4paper

マージンを1cmに設定する

-V geometry:margin=1cm


文書クラス(ドキュメントクラス)

文書クラスは LaTeX の文章の体裁や論理構造を決める情報ファイルです。LaTeX でよく使われる文書クラスは article, book, report などがあります。 (ファイルの拡張子は .cls )

日本語に対応した標準的な文書クラスはjsclassesです。接頭辞のjsは(Japanese Standard)の意味を含んでいるそうです。このファイルは新しい標準的な文書クラスとして 2000 年に公開されました。

  • jsarticle.cls (標準的な横書き論文・レポート)
  • jsbook.cls (標準的な横書き書籍)


LuaLaTeX用の文書クラス

LuaLaTeX で使用する文書クラスは jsclasses を LuaTeX-ja 用に調整されたものがあります。 LuaLaTeX では接頭辞にltが付いた文書クラスltjsclassesなどを使用します。

インストールフォルダを調べると下記のクラスファイルが見つかりました。Pandoc での動作確認結果と合わせて一覧に示します。

デフォルトインストールではこのフォルダに入っています。
C:\texlive\2014\texmf-dist\tex\luatex\luatexja

クラスファイル名 Pandocで使用の可否
ltjarticle.cls OK
ltjreport.cls OK
ltjbook.cls OK
ltjltxdoc.cls OK
ltjsarticle.cls OK (ただし要パッチ)
ltjsbook.cls NG (エラー発生)
ltjskiyou.cls NG (エラー発生)
ltjspf.cls NG (エラー発生)

LuaLaTeX で ltjsarticle を指定するとエラーが発生しましたが、この情報を参考にパッチを当てると使えるようになりました。



PDFのコードブロックをきれいに表示する。

実際に Markdown を PDF 変換してみると分かるのですが、Pandoc で出力したコードブロックはシンプルすぎて本文とコードブロックの違いが分かり難かったり、コードブロックの行の折り返しが行われず行が長くなると右側にはみ出た部分が途切れてしまい良くありません。

この場合 Pandoc の--listingsオプションを使うと、コードブロックの表示を良い感じに設定できます。



Pandoc: --listingsオプション

--listingsオプションの有無の違いをコマンドラインで確認してみましょう。

Pandoc 標準のコードブロック

>pandoc -t latex
```
puts "Hello Pandoc"
```
^Z
\begin{verbatim}
puts "Hello Pandoc"
\end{verbatim}

標準の PDF 出力のコードブロックは LaTeX の verbatim 環境に変換されるようです。これは入力どおりの内容をそのまま出力するもので、改行以外の文字で折り返すことなくそのまま表示されます。

つぎは、Pandoc --listingsオプション付きのコードブロック

>pandoc -t latex --listings
```
puts "Hello Pandoc"
```
^Z
\begin{lstlisting}
puts "Hello Pandoc"
\end{lstlisting}

このように、--listingsオプションを付けるとコードブロックが verbatim 環境から lstlisting 環境に変わります。この例では文字が入れ替わっただけの違いしか有りませんが、lstlisting 環境では行の折り返しは勿論のこと、シンタックスハイライトや行番号表示などが可能になります。

lstlisting 環境の設定はコマンドラインで指定すると冗長になるので、あらかじめ別ファイルlistings-setup.texに設定を書いておきます。

コードの先頭 4 行は lstlisting 環境の設定とは関係ありません。ここではフォント埋め込みや用紙サイズ、数式のためのパッケージの設定等を合わせて設定しています。

listings-setup.tex

コードブロックに listings 設定ファイルを適用するには、-H xxx.texオプションで指定します。その場合次のコマンドを実行します。

pandoc -f markdown input.md ^
-V documentclass=ltjsarticle ^
--latex-engine=lualatex ^
--listings -H listings-setup.tex ^
-o output.pdf

GFM の場合

pandoc -f markdown_github+fenced_code_attributes ^
input.md ^
-V documentclass=ltjsarticle ^
--latex-engine=lualatex ^
--listings -H listings-setup.tex ^
-o output.pdf


コードブロックの書き方



LaTeX の lstlisting 属性の記述方法も可能のようです。

この例ではコードブロックの左に行番号を表示、開始番号を 10 に指定、コードブロックのキャプションを設定しています。

```{language=Ruby numbers=left startFrom=10 caption="\{This is caption of code block\}"}
require 'sinatra'
#こんにちはPandoc

get '/' do
  'Hello Pandoc!'
end
```

PDF 出力の結果



Pandoc の属性記述方法の場合

この例では言語をRuby、行番号を表示、開始番号を 1 に指定しています。

```{ .ruby .numberLines startFrom="1"}
require 'sinatra'
#こんにちはPandoc

get '/' do
  'Hello Pandoc!'
end
```

PDF 出力の結果



Pandoc の属性記述方法(言語名のみ)

```ruby
require 'sinatra'
#こんにちはPandoc

get '/' do
  'Hello Pandoc!'
end
```

PDF 出力の結果



LaTeXコマンドを使う

Markdown の PDF 化では、HTML 出力したファイルをブラウザの PDF プリンタを経由して PDF ファイルに保存することができますが、改ページの位置を PDF プリンタに委ねなければなりません。Pandoc を使って Markdown から PDF を出力する場合は、テキスト内に LaTeX コマンドを記述して改ページをコントロールすることができます。あわせて、拡張書式tex_math_dollarsを有効にしておくと、数式にインライン数式の$...$が使えるので便利です。

Markdown テキストの中に LaTeX コマンドを記述する場合、記述方法で注意することがあります。 というのも、HTML 出力で MathJax を使う場合では数式と LaTeX コマンドの両方を$...$の中に記述できます。いっぽうで、PDF 出力の場合では LaTeX を経由するため$...$は数式モードを表します。そのため数式モードで使えないコマンドを$...$の中に記述するとエラーになる場合があります。

LaTeX コマンドを使って改ページする場合は、テキスト内の改ページしたい位置にnewpageコマンドをそのまま記述します。

\newpage

コマンドラインでは、拡張書式raw_textex_math_dollarsを追加して実行します。 GFM の場合このようなコマンドになります

pandoc -f markdown_github-hard_line_breaks^
+raw_tex+tex_math_dollars^
+fenced_code_attributes ^
input.md ^
-V documentclass=ltjsarticle ^
--latex-engine=lualatex ^
--listings -H listings-setup.tex ^
-o output.pdf


まとめ

Markdown テキストから簡単に PDF 出力できる Pandoc の便利さを改めて感じました。また、これまでは MathJax の数式でしか LaTeX 環境に触れたことが無かったのですが、今回の TeX Live のインストールを期に、ほんの少しですが LaTeX の世界について知ることができました。もっと LaTeX コマンドを使いこなせるようになれば活用方法が広がりそうです。

参考:

Pandocの紹介記事

TeX Liveの解説

Pandocの--listingsオプション設定ファイルの使い方

lstlisting 環境の詳細は The Listings Package listings.pdf に書かれています。

Pandoc には他にも多くの機能があります、興味を持った方はユーザーズガイドを読んでみてください。

本家ユーザーズガイド

日本語ユーザーズガイド

2015年5月9日土曜日

PandocのHTML出力でGFMとカスタムテンプレートを使う

PandocでMarkdownをHTMLへ変換

ドキュメント変換ツール Pandoc は様々な入出力形式に対応したコマンドラインツールです。多くの派生版 Markdown への対応や Pandoc による拡張 Markdown などの機能があり、柔軟な Markdown 変換ツールとして興味深いツールです。また、LaTeX を使った PDF 出力機能もそのひとつです。

この投稿では Pandoc を使って Markdown テキストを HTML へ変換する方法を簡単に紹介しています。

使用環境:Windows7 64bit, pandoc 1.13.2, Firefox 37.0.2



Pandocをインストール

Windows 用をダウンロード

最新版 pandoc-1.13.2-windows.msi をインストール。



Pandocを使ってみる

インストールが完了したら手始めに Pandoc の動作確認を兼ねて、Markdown テキストを HTML に変換してみましょう。ここではファイルを使わずに標準入出力を使って試します。

  1. コマンドプロンプトでpandocと入力
  2. #Hello Pandocを入力
  3. Crtl + Zキーを押して EOF を入力
  4. HTML に変換された結果が画面に表示されます。

      >pandoc
      #Hello Pandoc
      ^Z
      <h1 id="hello-pandoc">Hello Pandoc</h1>
      

このように入出力ファイルを指定しない場合 Pandoc は入力に標準入力を、出力に標準出力を使用します。また、入出力フォーマットを明示しない場合は入力フォーマットに Markdown を、出力フォーマットに HTML が選ばれます。

実際の Markdown テキストを HTML へ変換する場合は入出力ファイルやフォーマット、テンプレートなどを指定して使います。

pandoc -f markdown input.md -t html5 -s -o output.html

コマンドラインの-sオプションで標準テンプレートを指定すると、出力フォーマットに合わせた標準テンプレートが選択されます。この例の場合、適用されるのは HTML 出力用のhtml5テンプレートです。

html5テンプレートの内容は次のコマンドで確認できます。

pandoc -D html5

また css や MathJax の設定(後述)を含んだカスタムテンプレート(後述)を使用することも可能です。



MarkdownファイルをHTMLファイルへ変換する例

Pandoc では標準の Markdown のほか "GitHub flavored Markdown" もサポートされています。このフォーマットを使用する場合は入力フォーマットにmarkdown_githubを指定します。

  • markdown_github オプションを使って HTML に変換

    pandoc -f markdown_github input.md -t html5 -s -o output.html
    
  • markdown_github オプションで CSS を含んだ HTML に変換。

    pandoc -f markdown_github input.md -c github.css -t html5 -s -o output.html
    

    この例ではカレントフォルダのgithub.cssが HTML 内にリンクされます。このファイルは、はじめから Pandoc に同梱されているわけではないので自分で用意する必要があります。例えば"Github Markdown CSS - for Markdown Editor Preview"などを参考にして作成します。



「段落内の強制改行」を無効化する

Pandoc の拡張 Markdown では、フォーマット名と拡張文字列を使って機能をコントロールします。フォーマット名に拡張文字列を+で結合するとその機能を有効に、-で結合するとその機能が無効化されます。

この例では-hard_line_breaksを結合して「段落内の強制改行」を無効化しています。

pandoc -f markdown_github-hard_line_breaks ^
input.md -c github.css -t html5 -s -o output.html


Markdownテキストに生HTMLを記述

標準の Markdown では、テキスト内に記述した生の HTML はそのまま出力されます。Pandoc でこの機能を有効にするには+raw_htmlオプションを使います。これで Markdown テキスト内に生の HTML を記述できるようになります。

pandoc -f markdown_github+raw_html ^
input.md -c github.css -t html5 -s -o output.html


コードブロックの行番号表示とシンタックスハイライト

GFM の"Fenced code blocks"は、コードブロックを貼り付ける時のインデントが不要なのでとても便利です。

さらに Pandoc は行番号表示やシンタックスハイライトまでサポートしています。この機能を有効にするには+fenced_code_attributesオプションを使います。

pandoc -f markdown_github+fenced_code_attributes ^
input.md -c github.css -t html5 -s -o output.html

例えば、言語に"Ruby"を指定、行番号を表示、開始行を 100 に指定する場合は、コードブロックの属性値をこのように記述します。開始行のstartFrom="100"を省略すると 1 から始まります。

```{.ruby .numberLines startFrom="100"}
puts 'Hello Pandoc!'
```

生成される HTML はこのようになります。.ruby.numberLinesの記述からわかるように、この値はクラスに設定されます。もちろん#fooなら ID に設定されます。

<table class="sourceCode ruby numberLines" startFrom="100">
  <tr class="sourceCode">
    <td class="lineNumbers">
      <pre>100</pre>
    </td>
    <td class="sourceCode">
      <pre>
        <code class="sourceCode ruby">
          puts <span class="st">&#39;Hello Pandoc!&#39;</span>
        </code>
      </pre>
    </td>
  </tr>
</table>

コードブロックのシンプルな記述方法は言語名だけを記述します。この場合はシンタックスハイライトのみ行われます。

```ruby
puts 'Hello Pandoc!'
```

生成される HTML では言語名がクラスに設定されています。

<pre class="sourceCode ruby">
  <code class="sourceCode ruby">
    puts <span class="st">&#39;Hello Pandoc!&#39;</span>
  </code>
</pre>


数式を含んだHTMLを出力する

HTML で数式を扱う場合 MathJax を使うと便利です。MathJax は、数式や LaTeX コマンドを解釈してブラウザで表示できるように変換してくれます。

Markdown の記述に GFM の書式を使い css を追加、MathJax で数式を表示する場合はこのようなコマンドを実行します。

pandoc -f markdown_github-hard_line_breaks ^
input.md -c github.css -t html5 -s ^
--mathjax=https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML ^
-o output.html


カスタムテンプレートを使う

カスタムテンプレートを作っておくと、あらかじめ MathJax のオプション設定や css ファイル等を追加することができます。カスタムテンプレートを簡単に作るには、標準のテンプレート雛形として利用します。

はじめに、次のコマンドを実行してカスタムテンプレートmytemplate.htmlを作成します。

pandoc -D html5 > mytemplate.html

このテンプレートを使用する場合は、コマンドに--mytemplate=mytemplate.htmlオプションを追加します。

pandoc -f markdown input.md -t html5 ^
--template=mytemplate.html -o output.html

カスタムテンプレートの例

次のコードをカスタムテンプレートの</head> の直前に追加すれば、css ファイルと MathJax オプションの設定ができます。

この例ではカレントフォルダの github.css をリンクしています。また、MathJax のオプション設定では日本語の数式メニューやエラーメッセージの表示、数式のズーム設定。インライン数式のデリミタに$...$を使用できるようにしています。

<link rel="stylesheet" href="github.css">
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    menuSettings: {locale: "ja"},
    extensions: ["tex2jax.js", "MathMenu.js", "MathZoom.js"],
    TeX: {
      extensions: ["AMSmath.js", "AMSsymbols.js", "noErrors.js", "noUndefined.js"],
      noErrors: {disabled: true},
      noUndefined: {disabled: true}
    },
    jax: ["input/TeX", "output/HTML-CSS"],
    tex2jax: {
      inlineMath: [["$$","$$"], ["\\(","\\)"]],
      displayMath: [["$$$$","$$$$"], ["\\[","\\]"]],
      processEscapes: true
    }
  });
</script>
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML" type="text/javascript"></script>

インライン数式のデリミタ$...$について

インライン数式のデリミタは、他にもう一つの設定方法があります。それは、Pandoc の Markdown 拡張書式に、tex_math_dollarsを追加して--mathjaxオプションを指定します。この場合入力テキスト中の$...$\(...\)に、$$...$$\[...\]に変換して出力されます。

2つの設定方法の違い

  • MathJaxのオプションで設定する場合

    テンプレートファイルにtex2jax: { ... }を記述してインライン数式の$...$を有効にする場合は、単独の$記号を表示するときにエスケープしなければなりません。例えばPrice: $100を表示するにはPrice: \$100と記述します。

  • Pandocのオプションで設定する場合

    Pandoc の Markdown 拡張書式tex_math_dollarsの追加と--mathjaxオプションを指定する場合は、Pandoc が$で囲まれた範囲を認識して、数式か数式でないかを判断してくれます。そのためPrice: $100の表示では$記号のエスケープが不要になります。

記述の容易さでは後者の Pandoc オプションで設定するほうが便利かもしれません。その場合は上記コードのtex2jax: { ... }の部分を削除することで、デリミタ以外の MathJax オプションをテンプレートファイルで設定することができます。

後者の Pandoc オプションで設定する場合は次のようなコマンドを実行します。

pandoc -f markdown_github-hard_line_breaks+tex_math_dollars ^
input.md -t html5 --mathjax ^
--template=mytemplate.html ^
-o output.html

テンプレート内に MathJax スクリプトを記述している場合コマンドラインの--mathjaxオプションの指定は不要に思えますが、MathJax が受け取る TeX 形式で数式を出力するためにこのオプションが必要です。なぜなら Pandoc のデフォルトの数式出力では可能な限り Unicode 文字で数式を出力しようとします。



YAMLメタデータブロック

テンプレート内のプレースホルダ($記号で囲まれた変数)を使うと、テンプレートにメタデータを流し込むことができます。Pandoc ではメタデータの流しこみ用にいくつかの方法が用意されていますが、 YAML メタデータブロックを使うと汎用性が高まります。

Pandoc のテンプレートに YAML メタデータブロックを流し込む場合はあらかじめメタデータブロックを別ファイルまたは Markdown テキストの中に作成しておきます。 YAML メタデータブロックは---で始まり、---または...で終ります。

  • テキスト中に記述する場合の注意点は、YAML メタデータブロックの直前に空行を入れることです。ただし、テキストの先頭に記述する場合に限り、この空行は不要です。

  • 別ファイルに作成した YAML メタデータブロックを使用する場合はコマンドラインでファイル名を指定します。例えば YAML メタデータブロックを記述したファイルtest.yamlを指定する場合、次のようなコマンドを実行します。

pandoc -f markdown input.md test.yaml ^
-s -c github.css -t html5 ^
-o output.html

GFM の場合は+yaml_metadata_blockオプションを使います。

pandoc -f markdown_github+yaml_metadata_block ^
input.md test.yaml -s -c github.css -t html5 ^
-o output.html

複数の入力ファイルを指定した場合 Pandoc は、処理を開始する前にファイルとファイルの間に空行を追加してそれぞれのファイルを結合します。前述の YAML メタデータブロックの直前に空行を入れる理由はこのためです。



YAMLを使ったテンプレートの使用例

デフォルトテンプレートには、いくつかのプレースホルダが既に用意されています。実際に YAML メタデータの流し込みを試してみましょう。次の例では入力ファイルinput.mdのテキストの先頭に YAML メタデータブロックを記述しています。

input.md

---
pagetitle: YAMLテスト
title: YAML メタデータテスト
subtitle: サブタイトル
author:
- foo
- bar
date: May 5, 2015
---

#こんにちはPandoc

デフォルトテンプレートを使用するため-sオプションでコマンドを実行します。

pandoc -f markdown input.md ^
-s -c github.css -t html5 -o output.html

GFM の場合は+yaml_metadata_blockオプションを使います。

pandoc -f markdown_github+yaml_metadata_block ^
input.md -s -c github.css -t html5 ^
-o output.html

実行すると YAML メタデータが流し込まれた HTML ファイルが出力されます。プレースホルダの記述方法は、テンプレートと出力されたHTMLファイルを見比べると分かりやすいです。テンプレートの内容はpandoc -D html5で確認できます。



Pandoc変数

テンプレート内のプレースホルダは Pandoc 変数を使って制御することができます。それではテンプレートと出力されたHTMLファイルを見比べてみましょう。

条件分岐

例えば変数$subtitle$では条件分岐が使われています。

この場合、変数$subtitle$に値がセットされていれば
<h1 class="subtitle">$subtitle$</h1>を適用します。

$if(subtitle)$
  <h1 class="subtitle">$subtitle$</h1>
$endif$

出力結果を見ると、このようになっています。

<h1 class="subtitle">これはサブタイトル</h1>

同様に変数$title$では、変数の値がセットされていない場合
<header>...</header>の行全体が適用されません。

$if(title)$
  <header>
  <h1 class="title">$title$</h1>
  $if(subtitle)$
    <h1 class="subtitle">$subtitle$</h1>
  $endif$
  $for(author)$
    <h2 class="author">$author$</h2>
  $endfor$
  $if(date)$
    <h3 class="date">$date$</h3>
  $endif$
  </header>
$endif$

繰り返し

例えば変数$author$ではリスト形式で複数の値がセットされています。このように変数の値が複数ある場合は$for$キーワードを使って値を取得できます。

この場合変数$author$に値がセットされていれば、
値毎に<h2 class="author">$author$</h2>を適用します。

$for(author)$
  <h2 class="author">$author$</h2>
$endfor$

出力結果を見ると、このようになっています。

<h2 class="author">foo</h2>
<h2 class="author">bar</h2>

このようにテンプレートと YAML メタデータブロックを使えば、柔軟なメタデータの流しこみが可能になります。



まとめ

簡単ですが Pandoc の HTML 変換を紹介しました。Pandoc には他にも多くの機能があります、興味を持った方はユーザーズガイドを読んでみてください。

本家ユーザーズガイド

日本語ユーザーズガイド

参考までに、今回使用したオプションを全てコマンドラインに適用すると こうなります。

pandoc -f markdown_github-hard_line_breaks^
+raw_html+fenced_code_attributes^
+tex_math_dollars+yaml_metadata_block ^
input.md -t html5 ^
--mathjax --template=mytemplate.html ^
-o output.html

付録

この投稿で使用したカスタムテンプレートと css を載せておきます。

mytemplate.html


github.css

2014年12月6日土曜日

iPod nano 6th 押せなくなったスリープボタンを修理

iPodのボタンのクリック感が無くなった

「あれっ?クリック感が無い」、ことのはじまりはスリープボタンを押したときの感触の変化でした。

数日後「ボタンがへこんだまま戻らない」、まだこのときはボタンを強く押せば動作していました。

ところが次の日「ボタンを押しても反応しなくなった」「こまった! 修理せねば」となりました。

iPodの修理情報を収集

作業開始

先人の皆さんの情報を元に、分解していきます。

スリープボタン部分を分解すると、「黒い小さなポッチ」の位置がずれていました。見たところ、この「黒い小さなポッチ」がタクタイルスイッチのプランジャーの役割をしているようです。

タクタイルスイッチはプランジャーが円形板バネの中央部を押すと円形板バネが反転し、クリック感と接点の導通が確保される構造と思われます。そのため、プランジャーの押す位置が円形板バネの中央からずれてしまうと、円形板バネがうまく反転しなくなり接点が導通できなくなると考えられます。

一般的なタクタイルスイッチでは、スイッチの筐体が位置ガイドになってプランジャの位置がずれない構造になっているのですが、このiPodの場合は小さな本体に収めるための苦肉の策なのでしょうか、かなり強引な構造設計のように感じます。

スイッチの動作を回復するべく「黒い小さなポッチ」を両面テープで貼り付けてみました。ところが組み立てるときに位置がずれてしまうようでうまくいきませんでした。下の写真は両面テープが「ずれたり」「丸まったり」の試行錯誤中のときのものです。

数回の試行錯誤の結果、接着剤を使って「黒い小さなポッチ」を円形板バネの中央に固定する方法でうまくいきました。

使用した接着剤は「ロックタイトDPL-030」、ほんの少し粘度があるものです。接着剤が円形板バネの接点の中に入ると手の施しようが無くなってしまうので注意してください。スイッチの接点部では粘度の低いさらさらの瞬間接着剤の使用は避けましょう。

修理完了

スリープボタンの動作とクリック感が戻りました。先人の皆さんに感謝!

2014年11月26日水曜日

iPhone用ステレオマイク TASCAM iM2 をUSBマイクに改造

ドックコネクタ接続のマイクを改造してUSBマイクにする方法

ステレオマイク TASCAM iM2 は、iPhone や iPad、iPod touch 専用の製品なので接続インターフェースはドックコネクタ接続になっています。このドックコネクタ経由でやり取りされる信号線には アナログオーディオ、ビデオ、シリアル、FireWire、USB、電源などがあります。

TASCAM iM2 の場合

  • 製品内部では USB デバイスとして動作しているのではないだろうか?
  • さらに、TASCAM iM2 には充電用の USB コネクタが付いています。これを使えばドックコネクタ経由の USB 信号線を外部に引き出すことなく間単に USB 接続できそうだ!
この二つが改造アイデアに繋がっています。

この改造の元アイデアは TT@北海道 さんです。


はじめに接続ヶ所を確認

それぞれの資料から、USB データポートのピン番号を調査します。


USBデータポートのピンを確認

  • D+ : MCU 16 ピン、Dock connector 4 ピン、USB コネクタ 3 ピン
  • D- : MCU 17 ピン、Dock connector 6 ピン、USB コネクタ 2 ピン

電源ラインのピンを確認

USB コネクタのUSB 5Vは iPhone 充電用に使われており、TASCAM iM2 の動作電源は Dock connector 経由の3.3Vのようです。そのため、TASCAM iM2 を PC に USB 接続して動作させるには、この電源供給方法を Dock connector から USB に変更する必要があります。

  • 5V : USB コネクタ 1 ピン
  • 3.3V: Dock connector 13 ピン
  • GND : Dock connector 1 ピン

配線作業

それぞれの信号線の接続ポイントを確認後、配線作業を開始します。

  • USB コネクタ部 :USB 充電モード用の抵抗(D+,D-間の抵抗)を除去。
  • 電源部 :ツェナーダイオードと抵抗を取り付け。
  • USB データポート :D+,D-を UEW でバイパス。

今回の改造では、TASCAM iM2 の電源(3.3V)にツェナーダイオードHZ3C2 3.3Vを使用しました。iM2 の消費電力が90 mW、ツェナー電流5 mAから

抵抗Rは、$R=\frac{5V-3.3V}{5mA+27mA} = 53.125 \fallingdotseq 51\Omega$

改造完了後の実測では 3.4 Vになりました。

D+,D-の接続点は、TT@北海道 さんが改造されたのと同じように USB のダンピング抵抗に接続するのがいちばん作業しやすいです。


改造完了

TASCAM iM2 を Windows PC に接続して確認

使用環境:Windows7 64bit

USB 接続した iM2 を自動認識して、デバイスドライバがインストールされました。

デバイスマネージャで確認すると。USB オーディオデバイスとして認識されています。

実際にオーディオ入力として使ってみると USB マイクとして働いてくれています。

おまけに MIDI やスピーカが一緒についてきましたが、この機能は使うことができません。元々これらの入出力回路が iM2 に備わって無いので、追加回路無しでは使用できないと思われます。もしかすると他の製品ラインナップに同じ MCU を使った機種があるのかもしれませんね。

これで改造成功です、TT@北海道 さん、情報ありがとうございます。

2014年9月30日火曜日

MP3をiTunes Podcastに変換

広島大学外国語教育研究センターでは、英語学習のためのPodcast「 Hiroshima University's English Podcast」を配信しています。このPodcastでは「やさしい英語会話」をはじめ「アメリカ探究の旅」や「ドラマで英語を学ぼう」「異文化ディスカッション」など趣向を凝らした番組内容を楽しむことができます。

PodcastをiTunesに登録すると、最新タイトルを含めて最近配信された数十タイトルがiTunesにダウンロードされて聴取可能になります。また、ウェブサイトでは最新タイトルから過去タイトルまで、全てのタイトルの聴取やダウンロード( MP3 )が可能です。

さらにウェブサイトではPodcastの解説やスクリプトが記載されており、番組内容のチェックやPodcastで聞き取りにくい単語などを文字で確認することができるため、とても便利です。

iTunesの場合は、歌詞表示用のエリアを利用して番組スクリプトが書き込まれています。その場合はPodcastファイルのプロパティを開き、歌詞のタブをクリックします。

追記:Feb 09, 2015
新しいiTunesでは、プロパティダイアログの表示が変更になりました。

  • 新しいタイトルの場合:
    タイトル右横の「さらに見る」をクリック、あるいは右クリックメニューの「説明を表示」をクリックでスクリプトを表示できます。
  • 古いタイトルの場合:
    新しいプロパティダイアログには歌詞タブがありません。以前のプロパティダイアログを呼び出すには、SHIFTを押したままで右クリックメニューの「プロパティ」をクリックします。すると、以前のプロパティダイアログが表示されるので歌詞タブを表示できます。



現在のPodcastに過去タイトルを加えたい

Podcastの登録時に配信されるタイトル数は、最新タイトルを含めて最近配信された数十タイトルです(約50タイトル)。これ以外の過去タイトルをPodcastに加えたい場合は、ダウンロードしたMP3ファイルをiTunesに登録することになります。

ダウンロードしたMP3ファイルをiTunesに登録すると、通常の「ミュージック」ファイルとして登録されます。このファイルをPodcastに変換するには、ファイルのプロパティの「オプション」タブを開き、「メディアの種類」をミュージックからPodcastに変更します。

ただし、この方法で変換した場合は別の番組エピソードとしてPodcastに登録されてしまいます。



過去タイトルを同じ番組エピソードに加えたい

過去タイトルのMP3ファイルを現在のPodcastと同じ番組エピソードに加えるには、他にも設定しなければならない項目があります。しかし、この項目はiTunesのファイルのプロパティで設定することができません。なぜなら、その項目は購読登録したPodcastからiTunesが自動的に設定する項目だからです。

どうすればいいの?

ここで「Mp3tag」の出番です。Mp3tagは多くのメディアファイル形式に対応したメタデータ(タグ)編集ツールで、多くのGUIツールの中でもiTunes Podcastのメタデータの編集に対応しているのが特徴です。

このMp3tagを使うと「MP3ファイルをPodcastに変換」を行うことができます。以下に手順を説明します。



Mp3tagオプション設定

MP3ファイルのメタデータの中でPodcastに最低限必要な項目は、ID3v2フレームのPCSTWFEDです。

今回は登録済みのPodcastに合わせるためTDRL,PCST,TGID,WFED,TCATを追加します。

タグパネルにフィールドを追加

「ツール」-「オプション」を開き「フィールドを追加」ボタンをクリック。「フィールドを編集」ウインドウでタグパネルに項目を追加します。

つぎの表は追加する項目の一覧です。ドロップダウンリストから「フィールド」を選択して「名前」を入力します。

フィールド 名前 ID3
RELEASETIME リリース日 TDRL
PODCAST メディアの種類 PCST
PODCASTID PODCASTID TGID
PODCASTURL PODCASTURL WFED
PODCASTCATEGORY PODCASTCATEGORY TCAT

入力が完了するとこのようになります。並び順は上下ボタンで変更できます。

カラムの表示項目を追加

「表示」-「カラムのカスタマイズ」を開き、「新規作成」ボタンをクリック。「カラムの表示を設定」ウインドウで項目を追加します。

つぎの表は追加する項目の一覧です。「名前」「値」「フィールド」の各項目を入力します。

名前 フィールド
リリース日 %releasetime% %releasetime%
メディアの種類 %podcast% %podcast%
podcastid %podcastid% %podcastid%
podcasturl %podcasturl% %podcasturl%
podcastcategory %podcastcategory% %podcastcategory%

上表の「値」の項目を次のようにしておくと、「フィールド値」を一括入力することができます。
**注意** この「値」の項目は、今回の作業終了後に上表の内容に戻しておきましょう。そうしないと他のファイルを開いたときに、実際と違う値が表示されてしまいます。

  • リリース日
    20$mid(%_filename%,1,2)-$mid(%_filename%,3,2)-$mid(%_filename%,5,2)
  • メディアの種類
    1
  • podcastid
    http://pod.flare.hiroshima-u.ac.jp/cms/media/1/%_filename_ext%
  • podcasturl
    http://pod.flare.hiroshima-u.ac.jp/cms/xml-rss2.php
  • podcastcategory
    Podcast (Dialogue)

入力が完了するとこのようになります。並び順は「上に移動」「下に移動」ボタンで変更できます。



メタデータを書き込む

予めPodcastに変更したいMP3ファイルを、「 Hiroshima University's English Podcast」のウェブサイトからダウンロードしてフォルダにまとめておきます。このとき、ファイル名はオリジナルのまま変更せずに保存します。

Mp3tagの「ファイル」-「ディレクトリの追加」でフォルダを指定して開きます。

カラムのカスタマイズ設定で「値」を一括設定できるようにしていれば、「リリース日」や「podcastid」がファイル名から自動的に計算されて表示されます。ただし、この状態の値は表示のみで、入力値はまだ確定していないので注意してください。

フィールド値の確定は、該当セルをクリックして編集モードに入り、つぎにenterキーを押すと表示値が確定します。この操作を先頭行から開始してenterキーを押し続けると、全ての行の値を確定することができます。

最後に、全て選択Ctrl+Aキーで保存対象のファイルを選択して、タグの保存Ctrl+Sキーでメタデータをファイルに書き込めば完了です。

Mp3tagオプション設定の「カラムのカスタマイズ設定」を元に戻すのを忘れないでください。



Podcastに変更したMP3ファイルをiTunesに登録

iTunesで「ファイル」-「フォルダをライブラリに追加」を選択し、上記でPodcastに変更したMP3ファイルフォルダを追加します。

これで、同じ番組エピソードの中に登録できました。リリース日順に並べると、古いものから順に聴取することができます。



最後に、広島大学外国語教育研究センターのスタッフの皆さんに感謝! 素敵なPodcastをありがとうございます。

2014年7月30日水曜日

DVD-RAMのVROファイル分割ツール

DVDレコーダとDVD-RAM

アナログ放送時代の DVD レコーダは既に現役引退ですが、映像ソースの保存や FM チューナのタイマー録音等まだ活躍の場が残っています。

DVD レコーダの HDD に記録したファイルを編集する場合、操作性の悪いレコーダ本体の編集機能よりも PC で編集したいところです。その場合は面倒ですが DVD-RAM に書き出して PC で編集することになります。(ただし CPRM で保護された動画は不可です。)


DVD-RAMのファイル構成

DVD-RAM のファイルは、DVD_RTAV フォルダの中に 3 個のファイルで構成されています。

  • VR_MANGR.BUP
  • VR_MANGR.IFO
  • VR_MOVIE.VRO
複数タイトルを DVD-RAM に書き出した場合でもこのファイル数は変わりません。書き出された各タイトルは、ひとつのファイルに纏められて VR_MOVIE.VRO に保存されています。また、このファイルのコーデックは mpeg2 なので、拡張子をmpgに書き換えれば動画ファイルとして再生することもできます。

各タイトルの情報はひとつに纏められて VR_MANGR.IFO に保存されています。 DVD-RAM の再生はこのファイルの情報を元に VR_MOVIE.VRO から読み出されます。


DVD-VRユーティリティ

このツールは VR_MANGR.IFO や VIDEO_TS.IFO からタイトルなどの情報を読み出します。そして IFO ファイルの情報を元にタイトルごとにファイルを分割します。動作環境は Linux と Mac OS X です。 Windows の場合はcygwin環境で実行可能です。また、実行ファイルは配布されておらずソースのみの公開のため、各自でビルドする必要があります。


cygwinでビルド

cygwin のインストール時にビルドに必要なライブラリを入れておきます。

  • libiconv
  • gcc-core: C compiler
  • make: The GNU version of the 'make' utirity

make install でビルドが完了すれば、実行時に cygwin 環境が無くてもOKです。その場合、実行に必要なファイルcygwin1.dllcygiconv-2.dllC:\cygwin\binから、dvd-vr.exeと同じフォルダにコピーしておく必要があります。


コマンドオプション

コマンド一覧は--helpで確認できます。

dvd-vr --help

>dvd-vr --help
Usage: dvd-vr [OPTION]... VR_MANGR.IFO [VR_MOVIE.VRO]
Print info about and optionally extract vob data from DVD-VR files.

If the VRO file is specified, the component programs are
extracted to the current directory or to stdout.

-p, --program=NUM  
Only process program NUM rather than all programs.

-n, --name=NAME    
Specify a basename to use for extracted vob files rather than 
using one based on the timestamp.
If you pass - the vob files will be written to stdout.
If you pass [label] the names will be based on a sanitized 
version of the title or label.

--help         Display this help and exit.
--version      Output version information and exit.

IFOファイルから情報を読み出す

コマンド引数に IFO ファイルを渡すと、ファイル内の各タイトル情報が表示されます。

dvd-vr VR_MANGR.IFO

>dvd-vr VR_MANGR.IFO
format: DVD-VR V1.1
Encryption: CPRM supported

tv_system   : NTSC
resolution  : 704x480
aspect_ratio: 4:3
video_format: MPEG2
audio_channs: 2
audio_coding: Dolby AC-3

Number of programs: 2

num  : 1
title: TEST1
date : 2014-06-16 08:15:00
size : 806522880

num  : 2
title: TEST2
date : 2014-06-16 13:00:00
size : 810696704

VROファイルを分割する

コマンド引数に IFO ファイルと VRO ファイルを渡すと、ファイル内の各タイトルを分割します。

dvd-vr VR_MANGR.IFO VR_MOVIE.VRO

>dvd-vr VR_MANGR.IFO VR_MOVIE.VRO
format: DVD-VR V1.1
Encryption: CPRM supported

tv_system   : NTSC
resolution  : 704x480
aspect_ratio: 4:3
video_format: MPEG2
audio_channs: 2
audio_coding: Dolby AC-3

Number of programs: 2

num  : 1
title: TEST1
date : 2014-06-16 08:15:00
size : 806522880
Warning: program is partially encrypted

num  : 2
title: TEST2
date : 2014-06-16 13:00:00
size : 810696704
Warning: program is partially encrypted

上の例では VR_MOVIE.VRO を分割したファイルが 2 つ出力されています。分割したファイル名はタイムスタンプを元に設定されます。

2014-06-16_08-15-00.vob
2014-06-16_13-00-00.vob

ベースネームを指定する

ベースネームを指定すると、出力ファイル名は連番になります。例えば、ベースネームにDVDを指定する場合--name=DVDと書きます。

dvd-vr --name=DVD VR_MANGR.IFO VR_MOVIE.VRO

>dvd-vr --name=DVD VR_MANGR.IFO VR_MOVIE.VRO


DVD#001.vob
DVD#002.vob

分割後のファイルをFFmpegで確認

元ファイルの情報

>ffmpeg -i VR_MOVIE.VRO
Input #0, mpeg, from 'VR_MOVIE.VRO':
Duration: 00:45:01.18, start: 0.225367, bitrate: 4789 kb/s
    
Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p, 704x480 
[SAR 10:11 DAR 4:3], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    
Stream #0:1[0x80]: Audio: ac3, 48000 Hz, stereo, fltp, 256 kb/s 
At least one output file must be specified

分割ファイル TEST1

>ffmpeg -i DVD#001.vob
Input #0, mpeg, from 'DVD#001.vob':
Duration: 00:45:01.18, start: 0.225367, bitrate: 2388 kb/s

Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p, 704x480 
[SAR 10:11 DAR 4:3], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc

Stream #0:1[0x80]: Audio: ac3, 48000 Hz, stereo, fltp, 256 kb/s 
At least one output file must be specified

分割ファイル TEST2

>ffmpeg -i DVD#002.vob
Input #0, mpeg, from 'DVD#002.vob':
Duration: 00:45:01.18, start: 0.225367, bitrate: 2401 kb/s

Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p, 704x480 
[SAR 10:11 DAR 4:3], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    
Stream #0:1[0x80]: Audio: ac3, 48000 Hz, stereo, fltp, 256 kb/s 
At least one output file must be specified

2014年4月2日水曜日

WSMLアンテナ:ループの受信信号レベルを比較する

これまで何回かに分けて、WSMLアンテナについての実験や考察を行ってきました。その中で興味深い点は「ループアンテナの誘起電流」を増やすことが感度向上に繋がるということでした。

このテーマは昨年の3月頃から取り組んでいて早いものでもう1年になります。前回の記事を書いたのは昨年の9月、気が付けばもう半年の時間が経ってしまいました。その間は実験データの整理などをしながら思いついたことをTiddlyWikiに書き溜めていましたが、一先ずここで纏めておこうと思います。


はじめに


WSMLアンテナ

このアンテナは LZ1AQ Chavdar さんが開発された広帯域受信用アンテナで、正式名称は Wideband Active Small Magnetic Loop Antenna と言います。長い名称なので略して(日本国内では) WSMLアンテナ と呼ばれています。

WSMLアンテナは、ループに誘起した非常に小さな電流をアンテナ・アンプで増幅する方式のアクティブ・アンテナです。このアンプの特徴のひとつとして非常に低い入力インピーダンスであることが挙げられます。このことから、ループの誘起電流ができるだけ多く流れるような工夫が、このアンテナの感度の向上に繋がると考えられます。


これまでの経過を簡単におさらいしておきます。

以前の考察では、コイルに流れる電流の大きさはこのような式で表されました。

\[ \begin{multline} I= \frac{{\mu}NHS}{L} \\ \begin{array}{ll} {I} &: \text{電流 [ I ] } \\ {\mu} &: \text{透磁率 [ H/m ] } \\ {N} &: \text{コイルの巻き数} \\ {H} &: \text{磁界の強さ [ A/m ] } \\ {S} &: \text{コイルの面積 [ }m^2\text{ ] } \\ {L} &: \text{インダクタンス [ H ] } \end{array} \\ \quad \end{multline} \]

さて、ここでループアンテナをコイルの世界から眺めてみると。「コイルに流れる電流」の大きさが「ループアンテナの誘起電流」の大きさに。そして、コイルの「面積S」と「インダクタンスL」の関係が、ループアンテナの「S/L比」の関係に繋がります。つまり、コイルの世界で「ループアンテナの誘起電流」を増やすには、「面積」が大きく「インダクタンス」が小さいコイル(ループ)を作れば良いことになります。

つづいて、空芯コイルのインダクタンスの値は、このような式で求めることができました。

\[ \begin{multline} \begin{array}{ll} L &=& \frac{\mu_0 NS}{I} \cdot \frac{NI}{b} \cdot k \\ &=& \frac{\mu_0 {N^2}\pi{a^2}}{b} \cdot k \quad[ H ] \\ \end{array} \\ \begin{array}{ll} {N} &: \text{コイルの巻き数} \\ {a} &: \text{コイルの半径 [ m ]} \\ {b} &: \text{コイルの長さ [ m ]} \\ {\mu_0} &: \text{真空の透磁率 [ H/m ]} \\ &: \mu_0 = 4 \pi \cdot 10^{-7} \\ {k} &: \text{長岡係数} \end{array} \\ \quad \end{multline} \]

前項の式では、コイルの電流は巻き数に比例して大きくなりましたが、この式からインダクタンスは巻き数の二乗に比例して大きくなることがわかります。これでは巻き数を増やすほどインダクタンスの増加量が大きくなるので、その結果ループの「S/L比」が悪くなって電流が減少してしまいます。

ここから、コイルの性質でお互いにトレードオフの関係にある、「面積」が大きく「インダクタンス」が小さいコイルを実現する工夫に移っていきます。この工夫では、ループの面積を増やすよりも、インダクタンスを低減する工夫のほうが効率が良いことが分かり、「インダクタンス」を低減する工夫に焦点を当てて進んでいきました。その結果、ループのインダクタンスを低減するには、銅やアルミニウム製の太いパイプ、若しくは幅広の平板を使うのが効果的だということがわかりました。もちろん、その場合のループの巻き数は「1回巻き」です。

つづいて前回の実験では、コイルの世界からヒントを貰いながら、ループの「面積」を生かしつつ「インダクタンス」を低減する工夫へと進んでいきました。この工夫の中では、2つのループを使うことで生じる「相互インダクタンス」と、「ループの並列接続」によって合成される「誘起電流の方向」が大きな役割を果たしています。

このときの実験では、測定した2つのループの合成インダクタンスを元にして。誘起電流の大きさを相対的に比較するための「電流比」を計算しました。この計算では「基準」のループに対してそれぞれ得られる電流比を求めています。たとえば「直径1m」ループを基準に電流比を計算すると。2つの「直径0.58m」ループを組み合わせた「8の字配置ークロス接続」の場合で1.4倍の電流比、「平行配置ー平行接続」の場合の電流比は1.2~1.3倍でした。

この計算によって、2つの「直径0.58m」のループの総面積が「直径1m」のループの僅か0.67倍にも拘らず、この2つのループを並列接続することで得られる誘起電流の大きさが「直径1m」のループと同等以上であることがわかりました。

また、これらの結果から「平行配置ー平行接続」は、原典の「パラレル・クロスド・ループ」の組み合わせである「8の字配置ークロス接続」と同じように誘起電流が増える組み合わせであることがわかりました。

さて今回は、これまでの考察を踏まえながら実際に受信した信号レベルの大きさと、計算で求めた電流比の関係を見ていこうと思います。実際の実験は昨年の6月に行ったものです、今回はこのときの実験メモや記録集計した測定データを元にして比較検証していこうと思います。


受信地点と送信所の位置関係

この実験では、次の二つの放送の受信信号レベルを測定しています。

  • 1143kHz:KBS京都 20kW
  • 9595kHz:ラジオNIKKEI 50kW

実験を行った受信地は京都市内です。受信地と各送信所の位置関係については、KBS京都の久御山送信所(京都府久世郡久御山町)は受信地のほぼ南方向、ラジオNIKKEIの長柄送信所(千葉県長生郡長柄町)は受信地からほぼ東方向に位置しています。


アンテナ方向

受信信号レベルの測定と併せて、ループアンテナの null 特性を調べました。受信地点から見た2つの送信所の方向が90度異なることが今回の実験に好都合でした。

アンテナ方向は次のように設定しています。

  • 「方向A」(下図左側):

    1143kHZが最大信号レベルの方向、9595kHzがほぼ最小信号レベル(null)の方向。

  • 「方向B」(下図右側):

    1143kHZが最小信号レベル(null)の方向、9595kHzがほぼ最大信号レベルの方向。


実験に使用するループについて


実験には前回と同じループを使用しています。

  • ループの大きさ:直径0.58m
  • ループの材料:アルミフラットバー(長さ1820mm、幅20mm、厚さ2mm)


比較用ループは現用中のWSMLシングルループです。

  • ループの大きさ:直径1.0m
  • ループの材料:アルミフラットバー(長さ3140mm、幅20mm、厚さ3mm)


実験は下記の組み合わせで進めました。ループ配置や接続方法の詳細は前の記事を参照してください。

  • シングルループと8の字配置
    • シングルループ 直径 0.58m
    • シングルループ 直径 1m
    • 「8の字配置ークロス接続」
    • 「8の字配置ー平行接続」

  • 平行配置
    • 「平行配置ー平行接続」
    • 「平行配置ークロス接続」


実験の様子

下の写真は実験の様子です。ループアンテナをベランダの手すりの高さより上の位置にするために、ステンレス製物干しハンガーの上に載せています。右側奥に見えているのが比較用の1mシングルループです。これらのアンテナを南向きベランダに設置して実験を行いました。


全体の接続

全体の接続はこのようになっています。図の一部は、関連する過去記事へのリンクになっています。

[ ループエレメント ] || [ WSMLアンテナアンプ ] || || 同軸ケーブル || [ DC重畳ユニット ]==[ DC電源 ] || || 同軸ケーブル || [ APB-1 ]==USB==[ PC ]

サンプル数

受信信号レベルはフェージング等の影響を受けて変化しています。また、伝搬状態は時間とともに変化しています。そこでこの実験では、信号レベルの変化を考慮して複数のサンプルを取って比較することにしました。

  • 実験日を2回に分ける

    採取するデータは「方向A」と「方向B」それぞれ36項目あります。そこで、実験日を「方向A」と「方向B」の2日に分け、それぞれ同じ時間帯で行うことにしました。と言うのも、全てのデータを同時に一括取得できれば良いのですが、そう簡単ではありません。実際の作業ではループの設置や接続の切り替え、データ記録、PC操作等を繰り返す必要があり、どうしても時間がかかってしまいます。

  • サンプル数は5個

    36項目のデータを"出来るだけ短時間"(伝搬状態の変化を考慮して1時間程度)で採取することを目標にしたのでサンプル数を5個に設定しました。

実際の実験は頭の中で描いたように段取り良く進まないもので、段取り時間を含めると所要時間は約1時間半でした。その後日、記録データのチェックで「方向B」の「シングル1m」のデータ採り忘れに気づき、後日改めてデータを採り直すことになりました。そのため今回の実験では、20日間に3回の実験を行ったことになります。その結果として「方向B」では、「シングル1m」とその他の組み合わせで日付が違うデータを使って比較することになってしまい、これは如何なものかと考えましたが、先ずは結果を見てみようということで、このまま進めることにしました。


平均値の計算

受信信号レベルの比較では、直径1mのシングルループを比較の基準にしました。比較時のデシベル値の平均値の計算では、デシベル値を真数値に変換して平均計算を行い、その後デシベル値に戻しています。うっかりするとデシベル値のままで平均してしまいそうですがそれは間違いです。なぜならデシベル値の和は真数の積になるからです。

と、エラそうに書いている本人も、データの集計作業に取り掛かった時点では、デシベル値をそのまま平均していました。その後、式を再確認しているときに、ようやくこの事に気づき修正することができました。デシベル値の平均計算には注意しましょう!



「シングルループ」と「8の字ループ」

スペアナ画面で比較

ここでは、APB-1のスペクトラム・アナライザで測定時した画像を使って「シングル1m」ループと比較しています。 この画像は、それぞれのスペアナ画像をGIFアニメーションで連続表示していますので、全体を俯瞰しながら見比べられると思います。画像をクリックすると拡大して見ることができます。



「シングルループ」

下の画像は、方向Aの「シングル1m」「シングル0.58m」を繰り返して表示しています。「シングル1m」に対してループ面積が小さい「シングル0.58m」は、全体的に受信信号レベルが低くなっているように見えます。このことから、ループの面積と受信信号レベルは相関関係にあることがわかります。

方向Aの「シングル1m」、「シングル0.58m」の繰り返し画像

下の画像は、方向Bの「シングル1m」「シングル0.58m」を繰り返して表示しています。この方向Bでは1143kHzがnull方向になります。画像からは「シングル0.58m」のnullの深さは、「シングル1m」よりも少し浅いように見えます。また「シングル0.58m」は10MHz付近の受信信号レベルが少し高くなっているように見えます。

方向Bの「シングル1m」「シングル0.58m」の繰り返し画像。



「8の字ループ」

下の画像は、方向Aの「シングル1m」に続いて「8の字ークロス」「8の字ー平行」を繰り返して表示しています。これまでの考察で「8の字ークロス」は誘起電流が増える組み合わせであることがわかっています。この画像からも「8の字ークロス」の受信信号レベルは「シングル1m」の受信信号レベルと同じように大きくみえます。それに対して、誘起電流が減少する組み合わせの「8の字ー平行」は、受信信号レベルが全体的に小さくみえます。

方向Aの「シングル1m」「8の字ークロス」「8の字ー平行」の繰り返し画像

下の画像は、方向Bの「シングル1m」に続いて「8の字ークロス」「8の字ー平行」を繰り返して表示しています。null方向である1143kHzでは、「8の字ークロス」はnullが深く「8の字ー平行」はnullが浅くみえます。また「8の字ー平行」は受信信号レベルが全体に低いですが、6~10MHz付近の信号レベルとノイズフロアが上昇しているのが目立ちます。

方向Bの「シングル1m」「8の字ークロス」「8の字ー平行」の繰り返し画像



グラフで比較

スペアナ画面でおおまかな違いがわかったので、もう少し細かく見ていきます。

次の表は上記の「8の字ループ」と「シングルループ」を、それぞれ二つの周波数で測定したときの受信信号レベルの大きさです。 左から「8の字配置ー平行接続」「8の字配置ークロス接続」「シングルループ 直径 0.58m」「シングルループ 直径 1m」の順に並んでいます。


方向Aの受信信号レベル(測定値)


方向Bの受信信号レベル(測定値)

上の表をグラフに表したものが次の図です。縦軸は信号レベルです。


方向Aの受信信号レベル

上のグラフから方向Aの1143kHzの受信信号レベルを見ると、「8の字ークロス」と「シングル1m」は同じくらいの大きさです。1143kHzは地元ローカル局なので「シングル0.58m」でも大きな差はありません。いっぽう「8の字ー平行」は誘起電流が減少する組み合わせでした。このグラフからも「8の字ー平行」は「シングル1m」に比べて、受信信号レベルが20dBほど減少していることがわかります。

9595kHzの「シングル1m」の受信信号レベルを見ると、方向Aと方向Bを見比べてもほとんど同じに見えます。平均値で比較すると、null方向になるはずの方向Aのほうが4dBほど大きな値になりました。

フェージングによる信号レベルの変化は、地元放送局の1143kHzでは僅かですが、null方向になる9595kHzでは、それぞれのループで変化の幅に違いがあるように見えます。チョット考えすぎかもしれませんが、これをループの面積で見ると、面積が大きいと変化の幅が少なく、面積が小さいと変化の幅が大きいことになります。この例外になるのは、誘起電流が減少する組み合わせの「8の字ー平行」です。


方向Bの受信信号レベル

上のグラフからnull方向の1143kHzの信号レベルを見ると、「8の字ークロス」は「シングル1m」より信号レベルが小さい(nullが深い)ことがわかります。さらに、9595kHzの信号レベルの大きさは、「8の字ークロス」が「シングル1m」並みの大きさであることがわかります。

いっぽう「8の字ー平行」と「シングル0.58m」は、1143kHzのnullの浅さが目立ちますが、9595kHzでは「シングル1m」を少し超える大きさがあります。

この9595kHzでは、誘起電流が減少する組み合わせの「8の字ー平行」への影響は少ないようです。もしかするとこの影響は、受信信号レベルが小さい場合にはあまり考えなくても良いのかも知れません。



数値で比較

次の表は基準の「シングルループ 直径 1m」と、それぞれの受信信号レベルの平均値の差を計算したものです。


方向Aの受信信号レベル

上の表から1143kHzの受信信号レベルが大きい順に選び出すと、「8の字ークロス」>「シングル1m」>「シングル0.58m」>「8の字ー平行」になります。また、この表から方向Aの1143kHzでは、「シングル1m」より「8の字ークロス」のほうが0.6dB(1.07倍)信号レベルが大きいことがわかります。

この結果は「8の字ークロス」の電流比を計算した値の1.4倍には及びませんが、直径0.58mのループを組み合わせたこの「8の字ークロス」は、1143kHzにおいて「シングル1m」と同等の感度を持つことが確認できました。


方向Bの受信信号レベル

上の表から9595kHzの受信信号レベルが大きい順に選び出すと、「シングル0.58m」>「8の字ー平行」>「シングル1m」>「8の字ークロス」になります。このときの「8の字ークロス」の信号レベルは-1.7dBです。これは「シングル1m」の約0.8倍の大きさになります。このことから方向Bの「8の字ークロス」は、9595kHzにおいて「シングル1m」と「ほぼ同等」の感度を持つことが確認できました。



nullの深さ

それぞれの周波数の信号レベルの平均値でnullの深さ(最大信号レベルとnull方向の信号レベルの差)を比較しました。

1143kHzのnullの深さを比較すると、「8の字ークロス」>「シングル1m」>「シングル0.58m」>「8の字ー平行」の順になります。nullの深さが最大の「8の字ークロス」では-46.3dB、最小の「8の字ー平行」は-11.4dB、その差は約35dBです。

9595kHzのnullの深さを比較すると、「8の字ー平行」>「8の字ークロス」>「シングル0.58m」>「シングル1m」の順になります。nullの深さが最大の「8の字ー平行」では-19.2dB、最小の「シングル1m」は+4dB、その差は約23dBです。

この結果から、どちらの場合でも「8の字ークロス」は「シングル1m」より深いnullが得られることがわかりました。特に低い周波数のほうでは深いnullが得られています。

また「シングル1m」は、低い周波数側では深いnullが得られますが、周波数が高い側ではnullの値ではなくなっています。そのいっぽう「シングル0.58m」や「シングル0.58m」の8の字配置では、高い周波数側でもnullが得られています。この違いは少し気になります。



「平行配置ー平行接続ループ」

この平行配置では、ループの間隔と信号レベルの変化を調べるためにループ間隔を変えて測定しました。ループ間隔は前回の実験と同じ値の0.05m, 0.1m, 0.2m, 0.3m, 0.4m, 0.5m, 0.6mの7パターンです。



スペアナ画面で比較

それでは、測定時のスペアナ画面で「シングル1m」ループと比較してみましょう。

下の画像は、方向Aの「シングル1m」に続き「平行配置ー平行接続ループ」のループ間隔「0.05m」「0.1m」「0.2m」「0.3m」「0.4m」「0.5m」「0.6m」の繰り返し画像です。

下の画像は、方向Bの「シングル1m」に続き「平行配置ー平行接続ループ」のループ間隔「0.05m」「0.1m」「0.2m」「0.3m」「0.4m」「0.5m」「0.6m」の繰り返し画像です。

これまでの考察で「平行配置ー平行接続ループ」は誘起電流が増える組み合わせでした。この画像からも「平行配置ー平行接続ループ」の受信信号レベルが「シングル1m」と同じくらいの大きさにみえます。とはいえ、ループ間隔による受信信号レベルの違いを、これらの画像だけで判断するのは難しいです。



グラフで比較

次の表は上記の「平行配置ー平行接続ループ」を、それぞれ二つの周波数で測定したときの受信信号レベルの大きさです。 左からループ間隔: 0.05m, 0.1m, 0.2m, 0.3m, 0.4m, 0.5m, 0.6mの順に並んでいます。


方向Aの「平行配置ー平行接続ループ」の受信信号レベル(測定値)


方向Bの「平行配置ー平行接続ループ」の受信信号レベル(測定値)

上の表をグラフに表したのが次の図です。縦軸は信号レベルです。


方向Aの「平行配置ー平行接続ループ」の受信信号レベル

上のグラフの1143kHzでは、ループ間隔の変化による信号レベルの変化は僅かです。いっぽう、null方向の9595kHzでは信号レベルに大きな変化がみられます。この変化は以前の実験で電流比を計算した時の「ループ間隔と電流比」の変化の関係に似ているようにも見えます。

ループ間隔0.1mと0.5m,0.6mでは、受信信号レベルの変化の幅が20dB以上と大きいことが目立ちます。


方向Bの「平行配置ー平行接続ループ」の受信信号レベル

上のグラフのnull方向の1143kHzでは、ループ間隔0.2mを中心として、nullの浅い部分のピークになっているように見えます。

同様に9595kHzでも、ループ間隔0.2mを中心として、信号レベルが大きい部分のピークになっているように見えます。



数値で比較

次の表は基準の「シングルループ 直径 1m」と、それぞれの受信信号レベルの平均値の差を計算したものです。

方向Aの「平行配置ー平行接続ループ」の受信信号レベル

方向Aの1143kHzでは、ループ間隔0.2mが最大の信号レベルになっています。これは前回の実験結果の電流比が最大になる間隔と一致しています。このときの計算値では、ループ間隔が0.2mのとき電流比が最大になり、その大きさは1.3倍でした。このことから方向Aの1143kHzでは、ループ間隔の変化による電流比と信号レベルの大きさには相関関係があることがわかります。

この「平行配置ー平行接続ループ」の方向Aの1143kHzの信号レベルは、ループ間隔0.2mで「シングル1m」の -0.1dB(1.0倍)の大きさです。

この結果は「平行配置ー平行接続ループ」の電流比を計算した値の1.3倍には及びませんが、ループ間隔0.2mの「平行配置ー平行接続ループ」は、1143kHzにおいて「シングル1m」と同等の受信感度を持つことが確認できました。


方向Bの「平行配置ー平行接続ループ」の受信信号レベル

ここでも、前項の方向Aの1143kHzにおける、電流比と信号レベルの変化と同じような相関関係がみられます。

方向Bの9595kHzでは、ループ間隔の0.2mに信号レベルのピーク点があります。このループ間隔は、前回の実験結果の電流比が最大になる点と同じ0.2mです。今回の実験では、この点の受信信号レベルの大きさは12.8dB(4.4倍)と大きな値が得られています。

これらの結果から、「平行配置ー平行接続」は「シングル1m」とほぼ同等の受信感度を持つことが確認できました。特に周波数が高い側の9595kHzでは、「平行配置ー平行接続」は「シングル1m」よりも大きな受信感度が得られることがわかりました。



nullの深さ

つぎに、それぞれの周波数の信号レベルの平均値でnullの深さ(最大信号レベルとnull方向の信号レベルの差)を比較しました。

1143kHzのnullの深さを比較すると、ループ間隔が「0.6m」>「0.4m」>「0.1m」>「0.05m」>「0.5m」>「0.3m」>「0.2m」の順になりますが、nullの深さが最大の「0.6m」では-33.5dB、最少の「0.2m」では-27.1dB、その差は僅か6dB程度です。

この1143kHzでは、ループ間隔の変化によるnullの深さの差はあまり大きくなく、いずれのループ間隔でもnullの深さは「シングル0.58m」と同じ程度でした。これは「シングル1m」よりnullが少し浅い程度で、「8の字ークロス」のnullの深さには及びません。

9595kHzのnullの深さを比較すると、「0.6m」>「0.05m」>「0.2m」>「0.1m」>「0.3m」>「0.4m」>「0.5m」の順になりました。こちらではnullの深さが最大の「0.6m」では-27.0dB、最少の「0.5m」では-2.3dB、その差は大きく約24dBあります。

この9595kHzでは、どのループ間隔においても「シングル1m」よりnullが深く、特にループ間隔の0.05mと0.6mではかなり深いnullが得られています。さらに、このループ間隔の値の両端では、間隔が0.1m変わるだけで受信信号レベルに大きな差があります。

受信信号レベルが大きいループ間隔0.2mでnullの深さを見ると。

  • 1143kHzでは、nullの深さは-27.1dB、これは「シングル0.58m」と同じ程度。
  • 9595kHzでは、nullの深さは-18.4dB、これは「8の字ー平行」と同じ程度。こちらのほうは「8の字ークロス」よりも12dBほど深いnullが得られています。



「平行配置ークロス接続ループ」

これまでの考察では、この「平行配置ークロス接続ループ」は「8の字配置ー平行接続」と同じように誘起電流が減少する組み合わせでした。それでは、この「平行配置ークロス接続ループ」の受信信号レベルは、「8の字配置ー平行接続」と同じように小さくなるのでしょうか。

ループ間隔を「平行配置ー平行接続ループ」と同じように0.05m, 0.1m, 0.2m, 0.3m, 0.4m, 0.5m, 0.6mと変えて測定しました。



スペアナ画面で比較

測定時のスペアナ画面を使って、比較用のシングル1mループとの違いを見てみましょう。

下の画像は方向Aの「シングル1m」に続き「平行配置ークロス接続ループ」のループ間隔「0.05m」「0.1m」「0.2m」「0.3m」「0.4m」「0.5m」「0.6m」の繰り返し画像です。

下の画像は方向Bの「シングル1m」に続き「平行配置ークロス接続ループ」のループ間隔「0.05m」「0.1m」「0.2m」「0.3m」「0.4m」「0.5m」「0.6m」の繰り返し画像です。

スペアナ画面の比較画像では、この組み合わせの受信信号レベルは考察どおり全体的に低くなっています。このことから、合成される「誘起電流の方向」が受信信号レベルの大きさに影響を与える要因となることがわかります。とはいえ、ループ間隔が広い側の10MHz付近ではこの影響が少ないようにみえます。



グラフで比較

次の表は上記の「平行配置ークロス接続ループ」を、それぞれ二つの周波数で測定したときの受信信号レベルの大きさです。 左からループ間隔: 0.05m, 0.1m, 0.2m, 0.3m, 0.4m, 0.5m, 0.6mの順に並んでいます。


方向Aの「平行配置ークロス接続ループ」の受信信号レベル(測定値)


方向Bの「平行配置ークロス接続ループ」の受信信号レベル(測定値)

上の表をグラフに表したのが次の図です。縦軸は信号レベルです。


方向Aの受信信号レベル


方向Bの受信信号レベル

前回の考察の計算では、この「平行配置ークロス接続ループ」はループ間隔が狭い側で電流比が大きく、ループ間隔が広い側で電流比が小さくなっていました。この電流比が大きいとはS/L比が大きいことを意味します。つまりループ間隔が狭い側ではループの誘起電流が増加して受信信号レベルが大きくなる筈ですが、この「平行配置ークロス接続ループ」の場合はそうではありません。

同じ「平行配置」でも、接続方法が「平行接続」から「クロス接続」へ変わることで、合成される電流の方向が変わってしまいます。この「平行配置ークロス接続ループ」の場合、それは、合成される誘起電流の方向が互いに打ち消し合って減少する関係になると考えられます。このことが、この「平行配置ークロス接続ループ」が「平行配置ー平行接続ループ」よりも受信信号レベルが減少する要因だと言えます。

上のグラフではループ間隔が狭くなるほど信号レベルが小さくなっているようにみえます。ここでは電流比の大きさと受信信号レベルの大きさは、ちょうど正反対の関係です。この傾向は方向Bの信号レベルの変化では、さらに強く現れています。



数値で比較

次の表は基準の「シングルループ 直径 1m」と、それぞれの受信信号レベルの平均値の差を計算したものです。


方向Aの受信信号レベル


方向Bの受信信号レベル

方向Aの1143kHzの信号レベルを見ると、どのループ間隔でも「シングル1m」に対して-10dB以下と低い値です。さらに、この1143kHzの方向Bのループ間隔が広い側では、null方向にもかかわらず信号レベルが増加しています。

方向Bの9595kHzでは信号レベルの減少が少ないようです。受信信号レベルの大きさは、ループ間隔の狭い側では「シングル1m」より小さく、ループ間隔の広い側では「シングル1m」より信号レベルが大きな値になっています。null方向の方向Aでも同じ傾向が出ています。

ここで、合成される「誘起電流の方向」が受信信号レベルの大きさに影響を与えている傾向は、ループ間隔が狭い側で大きく、ループ間隔が広い側では小さく見えます。2つのループのそれぞれに誘起する電流の大きさが同じなら、その受信信号レベルの大きさはループ間隔に関係なく同じように減少するはずですが、この結果はそうではありませんでした。

その要因を考えてみるとループ間の接続線が挙げられます。この実験では、片側のループの開口部(円弧の始点と終点の部分)を給電点にしました。そこから接続線を経由して、もう一方のループへ接続しています。この場合ループ間隔0.3m以上では、ループ間を往復する接続線の長さはループ周長以上になってしまいます。

このループ間隔の広い側で信号レベルが大きな値になるのは、接続線の長さによって2つのループの誘起電流の大きさに違いが生じ、打ち消し合う度合が減少したとも考えられます。今回の実験では作業の都合でこのような接続方法になりましたが、合成される誘起電流のバランスを考えると、給電点は接続線の長さの中間位置のほうが良いのかもしれません。



nullの深さ

つぎに、それぞれの周波数の信号レベルの平均値でnullの深さ(最大信号レベルとnull方向の信号レベルの差)を比較しました。

1143kHzのnullの深さを比較すると、ループ間隔が「0.05m」>「0.3m」>「0.1m」>「0.4m」>「0.6m」>「0.5m」>「0.2m」の順でした。nullの深さが最大の「0.05m」では-37.1dB、最少の「0.2m」では-17.8dB、その差は約19dBです。

この1143kHzでは、ループ間隔の変化によるnullの深さの差は大きく、ループ間隔の0.05mでは「シングル1m」並みの深いnullが得られています。とはいえ、1143kHzの受信信号レベルは「8の字-平行」並みに小さいので、この深いnullの活躍の場はあまり無さそうです。

9595kHzのnullの深さを比較すると、「0.1m」>「0.5m」>「0.3m」>「0.2m」>「0.4m」>「0.6m」>「0.05m」の順でした。nullの深さが最大の「0.1m」では-16.5dB、最少の「0.05m」では-3.3dB、その差は約13dBです。

この9595kHzでは、ループ間隔0.1mを除いてnullの深さは一桁台の小さい値です。



今回のまとめ

今回は実際の受信信号レベルの大きさと、計算で求めた電流比との関係をみてきました。


今回の実験でわかったことは

  • ループの面積の大きさは、受信信号レベルの大きさに影響を与える。
  • 合成する誘起電流の方向は、受信信号レベルの大きさに影響を与える。
  • 誘起電流が増える組み合わせはでは、電流比の大きさと受信信号レベルの大きさには相関関係がある。
  • 誘起電流が減少する組み合わせでも、信号レベルが小さい場合は減少する影響が少ない。
  • 平行配置のループ間隔は、高い周波数側では受信信号レベルに大きく影響を与える。
  • nullの深さは、ループの配置や接続方法で大きく変わる
  • 多ループ化は、インダクタンスを低減して誘起電流を増加させる。
ということです。

また、WSMLアンテナはインダクタンスの変化に敏感なアンテナだとも言えます。WSMLアンテナをベランダに設置する場合は、インダクタンスが増加するような周囲の影響を出来るだけ少なくすることも大切だと思われます。

一般にループアンテナがスモールループとして動作する周波数は、ループ周長の長さが受信周波数の波長λの1/10以下だといわれています。今回の実験に使用したループでは、それぞれのループ周長がλ/10になる上限周波数は「シングル1m」では9.55MHz、「シングル0.58m」では16.4MHzです。

WSMLアンテナの原典Wideband Active Small Magnetic Loop Antennaに書かれていますように、小径ループの並列化は、この上限周波数を上げると共に大きなループ面積を作り出し、ループのインダクタンスを低減して誘起電流を増やすと考えられています。今回の実験でもその効果が確認できました。

今回のきっかけになった「平行配置-平行接続」は、原典と同じ「8の字配置-クロス接続」に加えて、効果的なループの組み合わせだと言えると思います。


誘起電流が増える組み合わせの結果は

  • 「シングル0.58m」を2つ組み合わせた「8の字配置-クロス接続」は、「シングル1m」とほぼ同等の受信感度を持つことが確認できました。1143kHzでは0.6dB(1.07倍)、9595kHzでは-1.7dB(0.8倍)でした。

  • 「シングル0.58m」をループ間隔0.2mで組み合わせた「平行配置-平行接続」は、1143kHzでは「シングル1m」と同等-0.1dB(1.0倍)の受信感度が、9595kHzでは「シングル1m」の12.8dB(4.4倍)の受信感度を持つことが確認できました。

今回の実験場所は広く開けた空間では無く、ベランダという限定された空間で行いました。そのため測定条件としてはいろいろと不都合があったかもしれません。そのなかで「シングル0.58m」を2つ組み合わせた「平行配置-平行接続」は、直径1mループの面積に対して僅か0.67倍の面積ですが、ベランダ設置でも良い結果が得られました。

また、誘起電流が減少する組み合わせの「8の字配置-平行接続」や「平行配置-クロス接続」も、全く役に立たないことは無いのかもしれません。強力な地元中波局の受信信号レベルの低さと、10MHz付近の受信信号レベルがあまり低下しないことを利用すると。例えば、地元中波局をnull方向に向けて低減してやり、アンテナアンプの過入力を抑える。そして信号レベルがあまり低下しない10MHz付近を受信する等です。このような使い方が役立つ場合があるかもしれません。


気になるところ

方向Bの「シングル0.58m」の結果です。というのも、この「シングル0.58m」と「シングル1m」の比較すると、

  • 1143kHzでは「シングル1m」より「シングル0.58m」のほうが、受信信号レベルが小さくnullが浅い。

  • 9595kHzでは「シングル1m」より「シングル0.58m」のほうが、受信信号レベルが大きくnullが深い。

このようにふたつの周波数で正反対の結果が得られました。さらに方向Bの9595kHzでは、面積が大きな「シングル1m」や「8の字ークロス」よりも、「シングル0.58m」のほうが受信信号レベルが大きいという結果でした。

この要因としては、つぎのようなことが考えられます。

  • 方向Bの「シングル1m」が別の日に測定したデータだから

    (それぞれの測定日で、伝搬状態に違いがあった?)

  • 「シングル1m」は周波数が高い側で感度が下がる

    \( X_L = 2{\pi}fL [\Omega] \) なので\(L\)が大きいぶん高域で誘起電流が減少する。

  • ループに近接した周囲の建物の影響を受けている

    面積の大きな「シングル1m」や縦方向に大きな面積を占有する「8の字ークロス」は、ベランダ内の空間だけでは、ループ全体の面積を有効に使って電波を捕らえることが十分でないのかもしれません。さらに、ループの周囲には、ループ固定用のステンレス製物干しハンガーや建築構造物などがあります。これらの影響を受けている可能性も考えられます。

  • λ/10ルール

    前述のように、「シングル1m」の上限周波数が「シングル0.58m」よりも低いことから、高域ではスモールループの動作では無くなり、受信信号レベルの低下や指向特性の変化が表れた?


おわりに

これまでの考察を通してループアンテナをコイルの世界から眺めてみることで、WSMLアンテナのループ部分の特徴や工夫が少しずつ見えてきたように感じました。まだまだ疑問や興味は尽きないのですが、ミイラ取りがミイラになりそうなので一先ずここまで。