ユリウス暦運用初期の混乱に関するメモ

グレゴリオ暦開始時の混乱に関する記述は時々見かけるのですが、ユリウス暦開始時の数十年に及ぶ混乱に関する記述はあまり見かけません。

せっかくなので色々集めた情報をまとめてみました。

※追記 : 「歴」と「暦」の字を混用していた箇所を直しました。(2015-09-12)

=== 予備知識:暦制度あれこれ

☆ ローマ暦

ユリウス暦の直前まで古代ローマで使われていた暦。
政治や宗教の都合でその都度恣意的に1年の始まりや長さが決められていた。
少なくとも北半球に訪れた夏至の回数はきちんと数えていたものと思われる。

☆ ローマ建国紀元

古代ローマで使われていた紀年法。略称はA.U.C.
ユリウス暦運用初期や西暦0年をまたぐ期間の古代ローマ領土でのあれこれを外側から語るのに都合の良い紀年法。

AUC 1 BC 753 西暦 -752
AUC 709 BC 45 西暦 -44
AUC 753 BC 1 西暦 0
AUC 754 AD 1 西暦 1

☆ 西暦

かつてイエスの誕生年と信じられていたAUC 753の翌年をAD 1として年の数を数える紀年法。
西暦が西欧社会に根付くようになったのは千年以上も後の中世以降のこと。
閏年を西暦で表すと4の倍数になるのは便利だが、これはおそらく偶然。

☆ 先発ユリウス暦

ユリウス暦が永遠の過去からずっと安定して使われていたと仮定して年を数え、閏年と元日を識別する方法。ユリウス暦安定期として通説とされるAD 8年前後を原点として年を遡るのが一般的。

=== 予備知識:人物

☆ ガイウス・ユリウス・カエサル

生没 AUC 654 – AUC 710 (BC 100 – BC 44)
共和制ローマ最後の独裁官。
英語読みはジュリアス・シーザー。

☆ アウグストゥス

生没 AUC 691 – AUC 767 (BC 63 – AD 14)
AUC 727(BC 27)から死ぬまでローマ帝国を治めていた初代ローマ皇帝。
皇帝になる前はオクタウィアヌスと名乗っていた。

☆ レピドゥス

カエサル亡き後の古代ローマを巡ってアウグストゥスと対立した政治上のライバル。

☆ ナザレのイエス

アウグストゥス皇帝在位中に地中海東岸で生まれたとされる宗教家。
宗教活動を通じて頭角を現すのは、ユリウス暦の運用が安定してからずっと後のこと。
AUC 753年が生誕年と信じられ西暦の根拠とされてきたが、実際はもう数年前の生まれなのではとの説が現在では有力。

=== ユリウス暦開始にまつわる長く信じられていたストーリー

5世紀の文献学者 マクロビウス(Macrobius) の記した「Saturnalia」などを基に、16世紀の人文主義者 スカリゲル(Joseph Justus Scaliger) が記したユリウス暦開始時のストーリー。

  • BC63(AUC691)年、カエサルが神官(最高神祇官)に選出され、暦の運用を取り仕切る立場になる。
    当時の古代ローマの暦はローマ暦。
  • BC46(AUC708)年 カエサルが独裁官になる。
    ユリウス暦の準備のため、ローマ暦最後の年となるAUC708年を445日間も続ける。
  • BC45(AUC709)年 冬至に近いとある日、カエサルが「今日は元日である」と宣言すると同時にユリウス暦開始。
    カエサルは最初の閏年にBC41(AUC713)を指定し、以降4年ごとの閏年を計画。
  • BC44(AUC710) カエサル暗殺。
    カエサルの死によって空席となった神官職はレピドゥスが引き継ぐことになる。
  • BC42(AUC712) なぜかユリウス暦開始3年後に神官によって閏年が執り行われる。
    以降3年ごとに閏年が行われる。
  • 3度目の閏年のBC36(AUC718)年、レピドゥスが失脚するも神官職はそのまま。
    閏年に関してはレピドゥスの運用を踏襲。
  • 6度目の閏年のBC27(AUC727)年、カエサル亡き後の権力闘争に勝ち抜いたオクタウィアヌスがローマ皇帝アウグストゥスになる。
    依然としてレピドゥス時代の閏年運用を踏襲。
  • BC42(AUC712)以降、BC9(AUC745)年まで3年ごとに閏年が発生し、その回数は12回。カエサルの計画ではBC41(AUC713)年からBC9(AUC745)年までの間に4年ごとの閏年が9回行われるはずだった。
    BC13(AUC741)に死去したレピドゥスから神官職を引き継いでいたアウグストゥスがようやく事態の収拾に乗り出す。
  • BC9(AUC745)年3月の時点で3日進んでいるので、これを消化するためBC5(AUC749)、BC1(AUC753)、AD4(AUC757)年の閏年の処理を行わないこととした。
  • AD4(AUC757)年3月の時点で、カエサルが当初意図していた暦に戻ったはず。
  • AD8(AUC761)年2月に16年ぶりに閏年が行われ、以降1000年以上に渡って閏年は規則正しく4年ごとに運用される。

カエサルの意図した計画からのずれがアウグストゥスの政策により 解消されたにもかかわらず、カエサルがBC45(AUC709)年元日と定めた日は先発ユリウス暦のBC45(AUC709)年1月2日である。(カエサルはAUC709年を閏年としなかったが先発ユリウス暦では閏年のため)

=== スカリゲル説への感想

暦担当のレピドゥスが悪いと言えば悪いのですが。アウグストゥスがもたもたしていたのはレピドゥスへの義理だったりするのでしょうか。かといって失脚後地方に飛ばされた名ばかり神官職のレピドゥスに事態を解決できるわけもなく。

カエサルにも混乱の責任があるのでは。BC45(AUC709)を閏年にしたくないなら、せめてBC42(AUC712)以前に最初の閏年を持ってこないと…。だけどカエサルの死後になってBC42(AUC712)を閏年にしたら「閏年は3年毎になったんだ」と周りに誤解されるのも想像できるんです。うーむ。

=== スカリゲル説への反論・争点

  • BC45(AUC709)が閏年でないのは本当なのか?
  • 3年ごとの閏年が始まったのがBC42(AUC712)なのは本当なのか?
  • 3年ごとの閏年が12回行われた回数は正しいのか?
  • キャンセルされた閏年は4年毎でなく3年毎だったのでは?
  • 閏年が再開されたのはAD8年よりも前ではないのか?
  • アウグストゥスは結局カエサルの理想に回帰できたのか?

と、ヨハネス・ケプラーらも巻き込んで昔からいろいろな反論が繰り返されてきました。

クレオパトラ7世が倒された後のエジプトではローマ帝国と同じ閏年を運用していたはずなのですが、近年になってBC26(AUC728)年のエジプトが閏年だった有力な証拠となるパピルスが発掘されたりして、面白いことになっています。(※ スカリゲル説ではBC27(AUC727)が閏年のはず)

=== その他リンク集

Netbeans Javaコードスタイル概説 その04

対象IDE:Netbeans 7.3.1

目次

  • その01
    • 序文
  • その02
    • タブとインデント
    • 位置揃え
    • 中括弧
  • その03
    • 折り返し
    • 空行
    • スペース
  • その04
    • コメント
    • インポート
    • コード生成

コメント (Comments)

comment

・コメントの書式設定を有効にする (Enable Comments Formatting)

コメント部が再フォーマット処理の対象になるか指定する。
オンにすると、再フォーマット処理によりコメント文中の連続するHTMLスペースが一つにまとめられる。
※ オフにしても自動生成されるコード内のコメント部の清書は行われる。オフにすると後続チェックボックス操作ができなくなるUIはもしかして不適切かも。
デフォルトでは「オン」。

  • ブロック・コメントの書式設定 (Format Block Comments)
    開始「/*」と終了「*/」が同じ行にあるコメントを再フォーマット処理の対象とする。
    /*」「*/」の内側にスペースがなければ入れる。ただし先頭が「/**」なら二番目の*の後に入れる。
    連続するHTMLスペースは一つにまとめられる。
    「//」で始まるコメントは対象外。
    デフォルトでは「オフ」。

※ 行数にかかわらず「/*」で始まるコメントは全て「ブロックコメント」なのでは?

・一般 (General)

  • 先頭に星を追加 (Add Leading Star)
    複数行にわたるコメントで各行先頭にインデントされた「*」を配置する。
    文はスペースを一つ挟んでから始まる。
    デフォルトではオン。
  • 右マージンでテキストを折り返す (Wrap Text At Right Margin)
    コメント文内の単語の切れ目(各種HTMLスペース?)に改行を入れることで、右マージン指定桁数内にコメント行を納めようとする。
    デフォルトではオン。
  • 1行のコメントを折り返す (Wrap One Line Comments)
    /*…*/」による1行コメントを「/*」、コメント本文、「*/」の3行に展開する。
    1行コメントと同じ行にあるステートメントは引きずられる。
    //」によるコメントは対象外。
    デフォルトではオン。
  • 改行を保持する (Preserve new Lines)
    コメント文内の既存の改行を単語間スペースに変えることで、より多くの文字を1行に詰め込もうとする機能を抑止する。
    ※ 折り返し機能オフの時は無効かも?
    デフォルトではオフ。

・Javadoc

Javadoc用ドキュメント記述部の自動生成処理を操作する。

  • 説明の後に空行を追加する (Add Blank Line After Description)
    コメント本文と各種@タグセクションの間に空行を入れる。
    @タグ群がなければ何もしない。
    デフォルトではオン。
  • パラメータの説明の後に空行を追加する (Add Blank Line After Parameter Descriptions)
    @paramセクションの後に空行を入れる。
    デフォルトではオフ。
  • 改行タグの後に空行を追加する (Add Blank Line After Return Tag)
    @return部の後に空行を入れる。
    ※ 「改行」訳は「戻り値」の間違いでは?
    デフォルトではオフ。
  • 空行に”<p/>”を生成する (Generate “<p/>” On Blank Lines)
    空行の代わりに<p/>を使う。<p>ではない。
    連続する複数の空行には複数の<p/>が入る。
    デフォルトではオフ。
  • パラメータの説明を位置揃え (Align Parameter Descriptions)
    個々の@param説明文の頭と後続行を揃える。
    デフォルトではオフ。
  • 戻り値の説明を位置揃え (Align Return Value Descriptions)
    複数行にまたがる@return説明文の頭を揃える。
    デフォルトではオフ。
  • 例外の説明を位置揃え (Align Exception Descriptions)
    個々の@throws説明文の頭と後続行を揃える。
    デフォルトではオフ。

インポート (Imports)

import

自動生成されるimport文に関する各種設定。
メニュー「ソース」内の「インポートを修正」や「インポートの編成」の結果に影響する。

※ 「スター・インポート」とは、「.*;」で終わるオンデマンドのimport文の事

  • 単一クラスのインポートの使用 (Use Single Class Imports)
    import文に「*」無しの正準名を書くことでソース内の各名前を解決させる。
  • パッケージのインポートの使用 (Use Package Imports)
    import文に「*」付きパッケージ名もしくは型名を書くことで、ソース内の各名前をオンデマンドに解決させる。
  • 完全限定名の使用 (Use Fully Qualified Names)
    import文を使わずにソース内の各名前を完全限定名(FQN)で解決させる。
    ソース内で定義されるクラスも完全限定名で表現される。

デフォルトでは「単一クラスのインポートの使用」が選択される。

「単一クラスのインポートの使用」が選択された場合、さらに下記の細かな指定が可能。

  • 内部クラスをインポート (Import Inner Classes)
    java.util.Map.Entry」のような、トップレベルでない型名をimport文に記述しようとする。
    この例の場合、ソースコード中には囲みクラス「Map」を省略して「Entry」と書くことが出来る。
    内部クラスのみならず、staticメンバ型も対象となる。
    デフォルトはオフ。
  • スター・インポートを使用するクラス数 (Class Count To Use Star Import)
    同じパッケージに属するクラスが記述されたimport文の数が閾値を超えたら、「*」付きスター・インポートを使い一つのimport文にまとめる。
    デフォルトはオフだがあらかじめ閾値5クラスの設定になっている。
  • 静的スター・インポートを使用するメンバー数 (Members Count To Use Static Star Import)
    同じクラスに属するメンバが記述された静的import文の数が閾値を超えたら、「*」付き静的スター・インポートを使い一つのimport文にまとめる。
    デフォルトはオフだがあらかじめ閾値3メンバの設定になっている。
  • スター・インポートを使用するパッケージ (Packages To Use Star Import)
    無条件にスターインポートを使うパッケージ名をリストで指定する。
    *欄にチェックが付くと、再帰的な下位サブパッケージも指定対象となる。

・レイアウトをインポート (Import Layout)

import文の出現順に関する各種設定。基本は辞書順。
(※ ここでimportを動詞(…をインポート)として訳すのはたぶん不適切。)

  • 静的インポートを分割 (Separate Static Imports)
    静的import文とそうでないimport文を別グループに分ける。順序並びは、それぞれのグループの中での辞書順となる。
    オンにした場合のみ、リストボックスでグループ間の出現順の設定が可能。チェックボックスは静的(static)か否かの区別。
    任意のパッケージ名を独立したグループとして追加することも可能。
    デフォルトではオフ。
  • グループを分割 (Separate Groups)
    上記指定で分割したインポートグループ間に空行を入れるか指定する。
    デフォルトではオン。

※ 「静的import文 (static import文)」はJDK5からの新言語仕様。JUnitでテストコードを書くときなどには欠かせないほど便利。


コード生成 (Code Generation)

cgen1

クラス内の各メンバの出現順を指定する。

メニュー「ソース」→「メンバの編成」実行時に反映される。

・メンバーのソートの順序 (Members Sort Order)

各メンバの属するカテゴリを用いてソート順を指定する。各メンバはカテゴリ毎にまとめられる。

デフォルトのカテゴリ順は以下の通り。

  • 静的フィールド (Static Fields)
    ※ クラス変数のこと
  • 静的初期化子 (Static Initializers)
  • 静的メソッド (Static Methods)
    ※ クラス・メソッドのこと
  • フィールド (Fields)
    ※ インスタンス変数のこと
  • インスタンス初期化子 (Instance Initializers)
  • コンストラクタ (Constructors)
  • メソッド (Methods)
    ※ インスタンス・メソッドのこと
  • 静的クラス (Static Classes)
    ※ staticメンバ型のこと
  • クラス (Classes)
    ※ 内部クラスのこと

・メンバーを可視性でソート (Sort Members By Visibility)

各カテゴリ内でのメンバ順にアクセス可能性修飾子を反映させる。
デフォルトはオフ。

デフォルトのソート順は以下の通り。リスト操作でソート順を変更させることも可能。

  • public
  • private
  • protected
  • デフォルト

・挿入ポイント (Insertion Point)

メニュー「ソース」→「コードを挿入」などで挿入されるフィールドやメソッドを、ソース内のどこに挿入するか指定する。

デフォルトは「キャレットの場所」。

  • カテゴリの最後 (Last In Category)
    挿入コードが属すべきカテゴリの一番後に挿入する。
  • カテゴリの最初 (First In Category)
    挿入コードが属すべきカテゴリの一番前に挿入する。
  • キャレットの場所 (Caret Location)
    カーソル以降でカーソル位置に一番近い場所に挿入する。各種ソート指定は無視される。

Netbeans Javaコードスタイル概説 その03

対象IDE:Netbeans 7.3.1

目次

  • その01
    • 序文
  • その02
    • タブとインデント
    • 位置揃え
    • 中括弧
  • その03
    • 折り返し
    • 空行
    • スペース
  • その04
    • コメント
    • インポート
    • コード生成

折り返し (Wrapping)

cr

改行の自動挿入に関する各種設定。

・設定項目

  • キーワードの拡張/実装 (Extends/Implements Keyword)
    extends および implements の前に挿入される改行。
    ※ “extends”, “implements” は無理に和訳しない方がよいかも。
    デフォルトは「なし」。
  • 一覧の拡張/実装 (Extends/Implements List)
    implements句の各interface名間コンマ「,」の直後に挿入される改行。
    「implementsリストを位置揃えする」設定になっている場合は、implementsの後に改行が挿入されることもある。
    ※ やはり “extends”, “implements” は訳さない方がよい。
    デフォルトは「なし」。
  • メソッド・パラメータ (Method Parameters)
    メソッド仮引数間コンマ「,」の直後に挿入される改行。
    デフォルトは「なし」。
  • メソッドの呼び出し引数 (Method Call Argumants)
    メソッド呼び出し引数間コンマ「,」の直後に挿入される改行。
    デフォルトは「なし」。
  • 注釈の引数 (Annotation Arguments)
    アノテーション引数間コンマ「,」の直後に挿入される改行。
    デフォルトは「なし」。
  • 連鎖されたメソッド呼び出し (Chained method Calls)
    ドット「.」を挟む連鎖したメソッド呼び出し間に挿入される改行。
    ドットの前後どちらに改行が入るのかは後述の詳細チェックボックスで設定する。
    連鎖フィールド参照は対象外。
    デフォルトは「なし」。
  • キーワードをスロー (Throws Keyword)
    メソッド定義部「throws」の前に挿入される改行。
    ※ throws は動詞として訳さない方がよいような。
    デフォルトは「なし」。
  • スロー・リスト (Throws List)
    throws節の各例外名間コンマ「,」後に挿入される改行。
    デフォルトは「なし」。
  • 配列初期化子 (Array Initializer)
    配列初期化子の「{」直後および各「,」の後に挿入される改行。
    デフォルトは「なし」。
  • tryリソース (Try Resources)
    try文の複数リソース定義間「;」の直後に挿入される改行。
    デフォルトは「なし」。
  • 分離catchタイプ (Disjunctive Catch Types)
    複数catch節間「|」の直後に挿入される改行。
    デフォルトは「なし」。
  • for (For)
    for()内2カ所の「;」の後に挿入される改行。
    デフォルトは「なし」。
  • for文 (For Statement)
    for文と制御対象ステートメントの間に挿入される改行。
    中括弧が自動生成される場合は無効となる。
    デフォルトは「常時」。
  • if文 (If Statement)
    if文と制御対象ステートメントの間に挿入される改行。
    中括弧が自動生成される場合は無効となる。
    デフォルトは「常時」。
  • while文 (While Statement)
    while文と制御対象ステートメントの間に挿入される改行。
    中括弧が自動生成される場合は無効となる。
    デフォルトは「常時」。
  • do … while文 (Do … While Statement)
    do文と制御対象ステートメントの間に挿入される改行。
    中括弧が自動生成される場合は無効となる。
    whileの前は常時改行が入る。
    デフォルトは「常時」。
  • 表明 (Assert)
    assert文のオプショナルな「:」の後に挿入される改行。
    デフォルトは「なし」。
  • enum定数 (Enum Constants)
    enum定数名の各定義間コンマ「,」直後に挿入される改行。
    デフォルトは「なし」。
  • 注釈 (Annotations)
    アノテーション指定と後続する各種宣言文の間に挿入される改行。
    複数連続する各種アノテーション間の改行も含まれる。
    デフォルトは「常時」。
  • 二項演算子 (Binary Operators)
    二項演算子を挟む二つの式間に挿入される改行。
    二項演算子の前後どちらに改行が入るのかは後述の詳細チェックボックスで設定する。
    デフォルトは「なし」。
  • 三項演算子 (Ternary Operators)
    三項演算子式に2カ所挿入される改行。三項演算子式に改行を二つ挿入して3行にわけようとする。
    二つある三項演算子記号「?」「:」の前後どちらに改行が入るのかは後述の詳細チェックボックスで設定する。
    デフォルトは「なし」。
  • 代入演算子 (Assignment Operators)
    代入演算子の直後に挿入される改行。「+=」のような複合代入演算子も対象。
    デフォルトは「なし」。

※ tryリソースと分離catchはJDK7からの新言語仕様。

・選択肢

上記の各項目は次の選択肢を持つ。

  • 常時 (Always)
    積極的に改行を挿入する。
  • 長い場合 (If Long)
    行が長くて右マージン指定内に収まらないと判断したときのみ改行を挿入する。
    あまり正確に桁数を計算しているわけではなさそう…。
  • なし (Never)
    改行を挿入しない。しかし、既に分割された行がまとめられることはない。

・細項目

さらに細かなチェックボックスを有する設定項目も若干ある。いずれのチェックボックスも、上記設定で折り返しが発生しない場合は無効。

  • 連鎖したメソッド呼び出し内のドットの後で折り返し(Wrap After Dot In Chained Method Call)
    オンにすると連鎖メソッド呼び出し間のドット「.」の後に、オフだと前に改行を挿入しようとする。
    デフォルトでオン。
  • 二項演算子の後で折り返し (Wrap After Binary Operators)
    オンにすると二項演算子の後に、オフだと前に改行を挿入する。
    デフォルトでオフ。
  • 三項演算子の後で折り返し (Wrap After Ternary Operators)
    オンにすると「?」および「:」の後に、オフだと前に改行を挿入する。
    デフォルトでオフ。

空行 (Blank Lines)

blank

ソース中の各セクション間に自動挿入される空行の数を設定する。

先行セクション後部の空行数と後続セクション前部の空行数を比較し、空行数の多い方の設定がセクション間の空行数に反映される。空行数の足し算は行われない。

※ クラスヘッダ後部などで若干の例外あり。

・設定項目

  • パッケージ化前 (Before Package)
    package文の前の空行数。
    デフォルトは0行。
  • パッケージ化後 (After Package)
    package文の後の空行数。
    デフォルトは1行。
  • インポート前 (Before Imports)
    import文セクションの前の空行数。
    デフォルトは1行。
  • インポート後 (After Imports)
    import文セクションの後の空行数。
    デフォルトは1行。
  • クラスの前 (Before Class)
    各種型定義部の前の空行数。
    デフォルトは1行。
  • クラスの後 (After Class)
    各種型定義部の後の空行数。
    ※ 想定される後続は、別クラス定義や囲みクラスの別メンバ定義など。
    デフォルトは0行。
  • クラス・ヘッダーの後 (After Class Header)
    クラス本体開始記号「{」の後の空行数。
    後続セクションの前部空行数は無視される。
    クラス本体が0行の場合は無視される。
    デフォルトは1行。
  • 匿名クラスのヘッダーの後 (After Anonymous Class Header)
    匿名クラス本体開始記号「{」の後の空行数。
    後続セクションの前部空行数は無視される。
    匿名クラス本体が0行の場合は無視される。
    デフォルトは0行。
  • クラスの閉じ括弧の前 (Before Class Closing Brace)
    クラス定義終了記号「}」の前の空行数。
    デフォルトは0行。
  • 匿名クラスの閉じ括弧の前 (Before Anonymous Class Closing brace)
    匿名クラス定義終了記号「}」の前の空行数。
    デフォルトは0行。
  • フィールドの前 (Before Field)
    各々のフィールド定義の前の空行数。
    デフォルトは0行。
  • フィールドの後 (After Field)
    各々のフィールド定義の後の空行数。
    デフォルトは0行。
  • メソッドの前 (Before Method)
    メソッド定義部の前の空行数。
    デフォルトは1行。
  • メソッドの後 (After Method)
    メソッド定義部の後の空行数。
    デフォルトは0行。

スペース (Spaces)

sp

各所に自動挿入されるスペースに関する設定。

・キーワードの前 (Before Keywords)

  • ”while”
    }」とそれに続く「while」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “else”
    }」とそれに続く「else」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “catch”
    }」とそれに続く「catch」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “finally”
    }」とそれに続く「finally」との間に挿入されるスペース。
    デフォルトは「オン」。

・丸括弧の前 (Before Parentheses)

  • メソッド宣言 (Method Declaration)
    メソッド宣言におけるメソッド名と後続の「(」の間に挿入されるスペース。
    デフォルトは「オフ」。
  • メソッド呼び出し (Method Call)
    メソッド呼び出しにおけるメソッド名と後続の「(」の間に挿入されるスペース。
    デフォルトは「オフ」。
  • “if”
    「if」と後続の「(」の間に挿入されるスペース。
    デフォルトは「オン」。
  • “for”
    「for」と後続の「(」の間に挿入されるスペース。
    デフォルトは「オン」。
  • “while”
    「while」と後続の「(」の間に挿入されるスペース。
    デフォルトは「オン」。
  • “try”
    「try」と後続の「(」の間に挿入されるスペース。
    デフォルトは「オン」。
  • “catch”
    「catch」と後続の「(」の間に挿入されるスペース。
    デフォルトは「オン」。
  • “switch”
    「switch」と後続の「(」の間に挿入されるスペース。
    デフォルトは「オン」。
  • “synchronized”
    「synchronized」と後続の「(」の間に挿入されるスペース。
    デフォルトは「オン」。
  • 注釈パラメータ (Annotations Parameter)
    アノテーション名と後続の「(」の間に挿入されるスペース。
    デフォルトは「オフ」。

※ 「メソッド」にはコンストラクタ一般も含まれる。

・演算子の周囲 (Around Operators)

  • 単項演算子 (Unary Operators)
    単項演算子の前後に挿入されるスペース。
    ただし数値リテラル直前の「-」は特別扱いとなり無視される。
    式の最後が「++」や「--」の後置演算子の場合、演算子の前にのみスペースが入る。(※ 厳密にはこれらは単項演算子ではない)
    デフォルトは「オフ」。
  • 二項演算子 (Binary Operators)
    二項演算子の前後に挿入されるスペース。
    ただしinstanceof演算子の前後は常にスペースが入る。
    デフォルトは「オン」。
  • 三項演算子 (Ternary Operators)
    ?」および「:」の前後に挿入されるスペース。
    デフォルトは「オン」。
  • 代入演算子 (Assignment Operators)
    =」、「==」、その他「+=」のような復号代入演算子の前後に挿入されるスペース。
    デフォルトは「オン」。
  • 注釈値代入演算子 (Annotation Value Assignment)
    アノテーション引数の「=」の前後に挿入されるスペース。
    デフォルトは「オン」。

※ 演算子が連続するところは2個以上の連続するスペースが挿入される場合がある。

・左中括弧の前 (Before Left Braces)

  • クラス宣言 (Class Declaration)
    クラス本体定義部先頭の「{」の前に挿入されるスペース。
    デフォルトは「オン」。
  • メソッド宣言 (Method Declaration)
    メソッド本体定義部先頭の「{」の前に挿入されるスペース。
    デフォルトは「オン」。
  • “if”
    「if()」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “else”
    「else」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “while”
    「while()」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “for”
    「for()」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “do”
    「do」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “switch”
    「switch()」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “try”
    「try」もしくは「try()」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “catch”
    「catch()」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “finally”
    「finally」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • “synchronized”
    「synchronized()」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • 静的初期化子 (Static Initializer)
    「static」と後に続く「{」との間に挿入されるスペース。
    デフォルトは「オン」。
  • 配列初期化子 (Array Initializer)
    配列初期化子の「{」の前に挿入されるスペース。
    new int[] {1, 2, 3}」のような式に影響する。
    int[] x={1, 2, 3}」のような式には影響しない。
    デフォルトは「オフ」。

・丸括弧の内側 (Within Parentheses)

(」の直後および「)」の直前にスペースを入れる。

※ 丸括弧でない括弧の設定もあり。

  • 丸括弧 (Parentheses)
    一次式の括弧式「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • メソッド宣言 (Method Declaration)
    メソッド宣言で仮引数を囲む「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • メソッド呼び出し (Method Call)
    メソッド呼び出しで引数を囲む「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • “if”
    if文「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • “for”
    for文「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • “while”
    while文「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • “switch”
    switch文「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • “try”
    try文「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • “catch”
    catch文「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • “synchronized”
    synchronized文「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • 型キャスト (Type Cast)
    型キャスト演算子「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • 注釈 (Annotation)
    アノテーション引数を囲む「()」の内側に挿入されるスペース。
    デフォルトではオフ。
  • 中括弧 (Braces)
    配列初期化子を囲む「{}」の内側に挿入されるスペース。
    デフォルトではオフ。
  • 配列初期化子の角括弧 (Array Initializer Brackets)
    配列サイズ/添字指定を囲む「[]」の内側に挿入されるスペース。
    デフォルトではオフ。

・その他 (Other)

  • カンマの前 (Before Comma)
    カンマ「,」の前に挿入されるスペース。
    デフォルトではオフ。
  • カンマの後 (After Comma)
    カンマ「,」の後に挿入されるスペース。
    デフォルトではオン。
  • セミコロンの前 (Before Semicolon)
    セミコロン「;」の前に挿入されるスペース。
    デフォルトではオフ。
  • セミコロンの後 (After Semicolon)
    セミコロン「;」の後に挿入されるスペース。
    デフォルトではオン。
  • コロンの前 (Before Colon)
    コロン「:」の前に挿入されるスペース。
    デフォルトではオン。
  • コロンの後 (After Colon)
    コロン「:」の後に挿入されるスペース。
    デフォルトではオン。
  • 型キャストの後 (After Type Cast)
    型キャスト「)」の直後に挿入されるスペース。
    デフォルトではオン。

※ 「セミコロン」(;)はtryリソースの「()」およびfor文「()」内部のセミコロンを指す物である。ステートメント末尾のセミコロンは対象外。

※ 「コロン」(:)はfor-each文「()」内部およびassert文のコロンを指すものである。ラベル、case句、三項演算子のコロンは対象外。

※ 7.3.1 版ではfor-each内部のコロン周囲のスペース挿入処理にバグ?

Netbeans Javaコードスタイル概説 その02

対象IDE:Netbeans 7.3.1

目次

  • その01
    • 序文
  • その02
    • タブとインデント
    • 位置揃え
    • 中括弧
  • その03
    • 折り返し
    • 空行
    • スペース
  • その04
    • コメント
    • インポート
    • コード生成

タブとインデント (Tabs And Indents)

indent

※ 「行折返し」までの項目は、各言語用エディタ間で設定を共有することが可能。

・タブをスペースに展開 (Expand Tabs to Spaces)

この設定はTABキー押下によるインデント指示、および自動生成されるコードのインデント等に影響する。ファイル読み込み時の水平タブはこの設定の影響を受けずに水平タブのまま読み込まれる。
このチェックボックスをオンにすると、TABキー押下時に何個かのスペース(U+0020)をテキストに挿入することでインデント字下げを実現しようとする。
オフにするとTABキー押下時に水平タブ(U+0009)をテキストに挿入してインデント字下げを実現しようとする。水平タブのみでインデントを実現できない場合はスペースも混ぜて補おうとする。
インデントが画面上何桁になるかは、インデントの各種設定やTABキーを押した箇所の前後の状況によって決まる。
デフォルトでは「オン」

・インデントのスペース数 (Number of Spaces per Indent)

インデント1単位あたりの字下げ幅をスペース数換算で指定する。
ハーフインデントという操作が出てきたりするので、おそらく偶数が望ましい。
デフォルトは4スペース。

・タブのサイズ (Tab Size)

水平タブ(U+0009)により実現されるタブストップの単位をスペース数換算で指定する。
デフォルトは8桁。

・右マージン (Right Margin)

テキストエディタの右側で指定桁数到達を示す赤い線の位置を指定する。後述の各種折り返し機能に影響する。
プロポーショナルフォントや全角和文が交じる行ではあまり正確に機能しない。
※ 余白を意味する「マージン」とは実はなんの関係もないかも?
デフォルトは80桁。

・行折り返し (Line wrap)

1行がウィンドウサイズに収まらない場合に、収まらない文字列をどう表示するか指定する。

  • オフ (Off)
    表示を切る。水平スクロールバーを使えば切れた箇所を確認することが可能。
  • 単語の後 (After words)
    単語の切れ目で折り返し、次の行として表示する。単語の並びによってはウィンドウ枠より若干手前で折り返すことになる。
  • 任意の場所 (Anywhere)
    文字の切れ目で次の行に折り返す。先行する行はウィンドウ幅を目一杯使うよう表示される。

デフォルトは「オフ」

・継続インデント・サイズ (Continuation Indentation Size)

1ステートメントの途中で改行した時の、分割される後続行のインデント量。
ステートメント行本来のインデント位置が起点となる。
デフォルトは8桁。

・ラベルのインデント (Label Indentation)

ラベル付きステートメント(Labeled Statement) 内部のインデント量。ラベル名に後続するステートメント部の開始位置に影響を及ぼす。
ラベル付きステートメント行本来のインデント位置が起点となる。
(※ 必ずしもラベル名先頭が基準では無い)
ラベル付きステートメント以降のステートメントにはインデント量は持ち越されない。
ラベル名とステートメント部が干渉しない限り、ラベル付きステートメントを1行に収めようとする。
デフォルトは0桁。

・ラベル絶対インデント (Absolute Label Indentation)

ラベル付きステートメントのラベル名開始位置を行頭に固定する。
ラベル名後続ステートメントのインデント量には影響しない。
この設定がオンの場合、ラベル付きステートメントのラベル名とステートメント部を強制的に別行に分離する方法は無い模様。
デフォルトは「オフ」。

・最上位クラスのメンバーをインデント (Indent Top Level Class Members)

クラスその他の各種型宣言に対し、その子要素宣言がインデントされる。
※ 最上位クラスでない各種型宣言の内部にもインデントは働くので、現時点でこの項目名は若干おかしい。
デフォルトは「オン」。

・switch文でcase文をインデント (Indent Case Statements in Switch)

switch文の先頭に対しcase句がインデントされるか否かを設定する。
デフォルトは「オン」。


位置揃え (Alignment)

pos

・改行 (New Lines)

  • else
  • finally
  • while
  • 修飾子の後 (After Modifiers)
  • catch

各種キーワードの前に「}」がある場合、改行を挿入してインデントを合わせる。

宣言中の各種修飾子並び (public, private, protected, static, abstract, final, native, synchronized, transient, volatile, strictfp, etc.) の後に改行を挿入し、後続部は継続行としてインデントされる。

while”はdo-while文の設定であり、ただのwhile文は無関係。

デフォルトでは全て「オフ」

・複数行の位置揃え (Multiline Alignment)

既に改行された継続行のインデント量を、各種文脈に従った物に揃える。
継続行でないものには影響しない。

  • メソッド・パラメータ (Method Parameters)
    メソッド定義一番目の仮引数の定義開始位置に合わせる。
  • メソッド呼び出しの引数 (Method Call Arguments)
    メソッド呼び出し一番目の引数の登場位置に合わせる。
  • 注釈の引数 (Annotation Arguments)
    アノテーションの一番目の引数の登場位置に合わせる。
  • implementsリスト (Implements List)
    implements節で一番目のinterface名登場位置に合わせる。
  • throwsリスト (Throws List)
    throws節で一番目の例外名登場位置に合わせる。
  • tryリソース (Try Resources)
    try節で一番目のリソース定義登場位置に合わせる。
  • 分離catchタイプ (Disjunctive Catch Types)
    一番目のcatch節引数登場位置に合わせる。
  • 配列初期化子 (Array Initializer)
    一番目の配列データ登場位置に合わせる。
  • 二項演算子 (Binary Operators)
    左辺の登場位置に合わせる。
  • 三項演算子 (Ternary Operators)
    条件部(?の前部)の登場位置に合わせる。
  • 代入 (Assignment)
    被代入変数の登場位置に合わせる。
  • for (For)
    for変数宣言の登場位置に合わせる。
  • 括弧付け (Parenthesized)
    最も内側の開き括弧直後に合わせる。

※ 「tryリソース」や「分離catch」はJDK7からの新しい言語仕様。

デフォルトでは全て「オフ」。


中括弧 (Braces)

brace

・中括弧の配置 (Braces Placement)

開き中括弧「{」の配置を設定する。

  • クラス宣言 (Class Declaration)
  • メソッド宣言 (Method Declaration)
  • その他 (Other)
    各種制御文や初期化子に伴う中括弧「{」など。

それぞれが以下の選択肢を持つ。

  • 同じ行 (Same Line)
    {」の前に改行を入れない。
  • 改行 (New Line)
    {」の前に改行を挿入し、先行行とインデントを合わせる。
  • 半分インデントされた改行 (New Line Half Indented)
    {」の前に改行を挿入し、基本インデント量の半分だけインデントする。
  • インデントされた改行 (New Line Indented)
    {」の前に改行を挿入し、インデントする。

デフォルトは全て「同じ行」。

・特殊な”else if”の処理 (Special “else if” Treatment)

Javaに「else if」というキーワードは存在せず、言語仕様の構文木を素直に解釈するのならば「else」の後に改行してネストを一つ下げてから「if」を書くべき。(という主張はおそらくかなりの少数派…)
設定をオンにすると、このような「else if」を1行にまとめてくれる。ただし、既にelse-if間に「{」が入っていると無効。
設定がオフの場合、「else」と「if」の間に強制的に「{」が挿入され、改行とインデントが行われる。

デフォルトは「オン」。

・中括弧の生成 (Braces Generation)

省略可能な箇所の中括弧「{}」に関する設定を行う。

  • if
  • for
  • while
  • do ... while

これらの項目はそれぞれ以下の選択肢を持つ。

  • 生成 (Generate)
    中括弧と改行を積極的に付けようとする。
  • そのまま残す (Leave Alone)
    既存ソースの清書処理に際して、中括弧を足そうとも削ろうともしない。
  • 削除 (Eliminate)
    単一ステートメントのみで構成されるブロックなど、中括弧を消せる場所は積極的に削ろうとする。
    中括弧前後で分離していた行はそのまま分離が保持される。

デフォルトは全て「生成」。

Netbeans Javaコードスタイル概説 その01

対象IDE:Netbeans 7.3.1

序文

統合開発環境 Netbeans は、オプション設定でJava用ソースコードエディタのフォーマット整形機能を細かく設定することができます。
(オプション設定画面からタブ「エディタ」→タブ「フォーマット」)

ここであなた好みのコーディングスタイルおよび規約を設定することにより、Netbeansが自動生成する各種ソースコードにそのスタイルを反映させることができます。
また、メニュー「ソース」内の「フォーマット」「インポートを修正」「インポートの編成」「メンバーの編成」といった、既存のソースコードを清書する機能にも、スタイルが反映されます。
リアルタイムにソースコードを監視しエディタ利用者に色でサジェストガイドする「ヒント機能」にも、スタイルは反映されます。

さてこのスタイル設定、プレビューウィンドウが確認しづらかったり、サンプルプログラムが古いままだったり、インストール時のデフォルト設定に戻す機能が無かったり、和訳が微妙な箇所があったりで、色々と試行錯誤しながらスタイルを固めていく作業がとても面倒な仕様になっています。そのようなわけで、Netbeans 7.3.1 のJava用コードスタイル設定各項目の内容をざっと解説してみました。

ちなみに Netbeans は、全テキストエディタ共通、各言語用エディタ、個別のプロジェクト、と階層的にスタイルを設定できるようになっています。

目次

  • その01
    • 序文
  • その02
    • タブとインデント
    • 位置揃え
    • 中括弧
  • その03
    • 折り返し
    • 空行
    • スペース
  • その04
    • コメント
    • インポート
    • コード生成

Jindolf 3.301.4 リリース

Jindolf 3.301.4版がリリースされました。

G国1000村以降に対応するまとめサイト内の村ページを表示しようとするときのURLがおかしい問題を直しました。
キャスト表生成時のテンプレートにkuroink氏のアイコンセットが選択できるようになりました。

リリース情報

Vmd2XML 2.101.4 リリース

Vmd2XML の 2.101.4 版がリリースされました。

Vmd2XML は、MikuMikuDance(MMD)のモーションデータ(VMDファイル)をほぼ無劣化でXML形式と交換するためのアプリケーションです。

→ リリース情報

MikuMikuDance Ver7.40から採用された、新仕様VMDモーションファイルの読み書きに対応しています。

VMDの仕様追加に伴い、XMLファイルでも新たなスキーマが追加されました。
→ 新XMLスキーマ

TogaGem 3.101.4 リリース

TogaGem の 3.101.4 版がリリースされました。

TogaGem は MMDで用いられる各種データファイル(PMD,VMD)の読み込みをJavaで行うためのライブラリです。

リリース情報

MikuMikuDance 7.39×64 でわずかに変更のあったVMDモーションファイルのベジェ補間パラメータ冗長部や、Ver7.40から採用された新仕様VMDモーションファイルの読み込みに対応しています。

クォータニオンからオイラー角に変換する際の精度が向上しています。

VMDモーションファイルの仕様変更について

x64版の MikuMikuDance.exe、「Ver7.39.x64」のリリースと同時に、VMD モーションファイルの出力フォーマットに変更があったようなので、いまさらですが現時点での調査結果をさくっと報告。

→(2013-06-01追記) MikuMikuDance Ver7.39m もx64版と同様、出力するVMDモーションファイル仕様に変更があることを確認しました。
→(2013-06-09追記) MikuMikuDance Ver7.40 のリリースと共に、モデル表示とIK追従のオンオフを記録する仕様が新たにVMDに追加されました。(参考URL: 「とある工房」http://kkhk22.seesaa.net/article/365566628.html)

調査対象:

MMD配布元:VPVP http://www.geocities.jp/higuchuu4/

  • MikuMikuDance Ver7.39dot (配布ZIPのサイズ:5,367,048)
  • MikuMikuDance Ver7.39.x64 (配布ZIPのサイズ:5,423,541)

過去に配布されていたx64版バイナリ(2012年11月頃)

  • MikuMikuDance Ver7.39.x64 (配布ZIPのサイズ:5,443,071)

旧仕様

Ver7.39dot までの MikuMikuDance.exe では、VMD モーションファイルの出力に際して、ボーンモーションのベジェ補間パラメータ16byte が格納された後、先頭数バイトが欠損したベジェ補間パラメータのコピーが3回繰り返され(16×3byte)、欠損した箇所と反対側末尾には 0x01, 0x0100, 0x010000 が詰めパッドとして埋められていました。

参考資料:

新仕様

Ver7.39.×64 では、各所に埋められる詰めパッドの先頭が 0x01 でなく 0x00 になった模様です。

サンプル

Ver7.39.×64を 用いて、ダミーボーンモデル読み込み直後にボーン01を初期状態のままフレーム10でフレーム登録したデータをモーション保存。

アドレス 0x00000065 の 0x14 で始まる 64byte が、ベジェ補間パラメータ格納部です。Ver7.39dot までは赤字の箇所が 0x01 でした。

(↓クリックで拡大)

mmdbin

提言:

VMD モーションファイルを読み込むツールは、ボーンモーションの補間パラメータ 64byte を読む際、先頭 16Byte だけ読み込み、後の 48Byte は無条件に読み飛ばしてしまっていいんじゃないでしょうか。

Vmd2XML 1.101.2 はまだ対応できていませんね、はい、神経質な実装ですみません。

VMD モーションファイルを書き出すツールは、もうしばらくの間、旧仕様通りに欠損パラメータのコピーと 0x01 で始まる詰めパッドを出力しておいたほうがよいのではと思います。が、どうなんでしょう、各モーションツールでの読み込み時の対応具合は。


XSLTで学ぶ初音ミクの改造作業

はじめに

Pmd2XML を使ってMMDモデルをXML化したのはいいけど、「それのどこが便利なの?」と思われるモデラーさんもいると思います。

今回は、XML化したMMDモデルのデータ活用の可能性の一つとして、XSLTによるモデル改造をしてみたいと思います。

XSLTとは?

XSLTプロセッサにXMLデータと変換ルールを入力すると、ルールに従い変換されたXMLやテキストデータが出力されます。

XMLを読み書き変換する仕事の多くは、専用プログラムをその都度毎回開発するよりも、XSLTを使った方がひょっとして効率よいんじゃないの、と期待されています。
XSLTは、XMLで渡された帳票データをHTML化する時などにも使われており、既に活用しているWebプログラマも多いと思います。

手順

今回は、MikuMikuDanceの配布物に同梱されている「初音ミクver1.3」モデル(あにまさ氏モデリング)を、XSLTを用いて少しふくよかな体型に改造してみたいと思います。

vanillamiku
まずはPmd2XMLで「初音ミク.pmd」をXML化します。

java -jar pmd2xml-1.201.2.jar -i 初音ミク.pmd -o miku.xml

XML化したモデルファイル、miku.xmlが生成されました。

次に、XMLファイル中のpositionタグのx属性値のみ1.2倍に書き換えるよう指示するXSLTファイルを用意します。

[ fat.xslt ]

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:pmd="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/130128"
  version="1.0"
>

  <xsl:template match="pmd:position">
    <xsl:element
      name="position"
      namespace="http://mikutoga.sourceforge.jp/xml/ns/pmdxml/130128"
    >
      <xsl:attribute name="x">
        <xsl:value-of select="@x * 1.2" />
      </xsl:attribute>
      <xsl:attribute name="y">
        <xsl:value-of select="@y" />
      </xsl:attribute>
      <xsl:attribute name="z">
        <xsl:value-of select="@z" />
      </xsl:attribute>
    </xsl:element>
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy>
      <xsl:for-each select="@*">
        <xsl:copy />
      </xsl:for-each>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

それでは変換定義 fat.xslt に従って miku.xml を XSLT プロセッサに変換させてみましょう。私はJavaプログラマなので、今回は Apache Xalan-J を使ってみます。みなさん各自好みのXSLTプロセッサを使ってください。

java org.apache.xalan.xslt.Process -in miku.xml -xsl fat.xslt -out fat.xml

ミクさんが横に1.2倍太ったモデルファイル、fat.xmlが生成されました。
MikuMikuDance.exe で読めるよう、Pmd2XMLを使ってPMDファイルにします。

java -jar pmd2xml-1.201.2.jar -i fat.xml -o fat.pmd

PMDファイル「fat.pmd」ができましたのでMikuMikuDance.exeに読み込ませてみましょう。

fatmiku

頂点座標とボーン座標はちゃんとふくよかになっているようですね。本当はモーフや剛体を変換するためのタグと属性もきちんと指定しないといけないのですが、今回は割愛。

XSLTでは、ループや条件分岐、各種演算子などを伴う複雑な変換ルールを記述することが可能ですので、MMDモデルの一括処理に適用可能な事例はまだまだいろいろあるのではと考えています。

.NET Framework による PMDEditor のプラグイン開発以外にも、モデルデータ一括処理の手段は用意されていると言うことで、どうぞよろしくー。


%d人のブロガーが「いいね」をつけました。