CC-BY-SAのメディアをCCでないWebページで使用してもいいのか

もっと法律的に:第三者の作成した著作物を別のWebページに含めた場合、そのWebページは編集著作物であるか?

もし編集著作物であれば、そのWebページはCC-BY-SAと互換性のあるライセンスを適用しなければならない。

CC-BY-SA を適用できないけどCC-BY-SAの画像を含めたいという状況になったので、いくらか事例がないか調べてみた。

日本語版Wikipediaでは、記事は編集著作物ではなく、テキストとメディアファイルの著作関係は完全に分離できる、という見解を示している。(参考:Wikipedia‐ノート:著作権 - Wikipedia

しかし、記事によってはメディアファイルと本文の結びつきが強く、その2つを分離できるという考えは正しくないのではないか、という意見もある。(参考:Wikipedia‐ノート:アップロードされたファイルのライセンス/GFDLとCCの衝突の可能性 - Wikipedia

つまり、CC-BY-SAのメディアをCCでないWebページで使用できるかどうかは、そのWebページとCCのメディアとの結びつきの度合に依存する。その2つがどのくらい結びついていたら駄目なのか、という指標は今のところない、ということらしい。

でも…分離できた方がメディア利用者にとってはいろいろと嬉しいよね。個人的には、Wikipedia程度の画像と記事の結合度なら分離できるという方針でいこう。

メモ:The CERT Oracle Secure Coding Standard for Java

The CERT Oracle Secure Coding Standard for Java - java - CERT Secure Coding Standards
Javaでセキュアなプログラムを書くための基準。とても詳しく書かれている。
 
重大度が大きいものを流し読みしていて気になった部分をメモ。
 
 
SQLインジェクション対策には準備された文を使う
 
文字列比較のときにはUnicode文字を正規化する
 
不要な文字を削除するときは、削除前に検証を行う
XSSを起こすものがないかチェック→アスキー文字以外を削除…という順序だと、"<scrあipt>"という文字列が検証を通ってしまう、という当然なお話。
 
適切にオートボクシングされているかに注意
Set<Short>.remove(short) のようにすると、shortがShortにボクシングされると見せかけてIntegerにボクシングされ、適切に消去ができない。
 
不正なサブクラスは叩き潰す
イミュータブルであることが期待されるクラスorメソッドを継承orオーバーライドして可変にすると、いろいろ悪いことができたり。
不変でないクラスはサニタイズするしかないか。
 
不変を期待するためには防御的コピーせよ
 
重要なクラスはclone()でコピーされてはいけない
clone()を持っていないクラスでも継承されてコピーできてしまうので、clone()をfinalにする。
 
コンストラクタで例外を投げるのは注意して行う
コンストラクタで例外が発生すると、そのオブジェクトは部分的に初期化された状態で生成される。
このオブジェクトはどこからも参照されていないのですぐガベージコレクトされるが、そのオブジェクトのクラスを継承してファイナライザーをオーバーライドするとそのオブジェクトを捕捉することができる。そうなると困る。
 
clone()内でオーバーライドできるメソッドを呼ばない
 
ぬるぽをキャッチしてはいけない
 
多スレッドで共有される値は可視性(値がスレッド間で整合性を保つこと)を保証する
 
多スレッドで共有される値を読んで書くなら可視性だけでなく原子性も保証する
 
排他制御に使うオブジェクトはちゃんとnewで初期化する
intのボクシングの実態はInteger.valueOf()で、これはキャッシュを使いまわすので駄目。
 
static領域を排他するなら排他用オブジェクトもstaticに
 
部分的に初期化されたオブジェクトを見せない
例えば'SomeObj obj = new Someobj();'というコードがあったとき、SomeObjクラスのコンストラクタが実行される前に変数objへの変数割り当てが起こることがある。
このとき複数スレッドが存在するとobjの過度状態を見ることができ、バグのもととなる。

配列のラッパーとしてのBufferで使用する配列は外部に渡さない
Buffer.wrap()とBuffer.put()は全然違うよ。
 
シリアライズメソッドを可視(非private)にしてはならない
readResolve()とwriteReplace()はprotectedなメンバーメソッドに。
 
staticでない内部クラスをシリアライズ可能にしてはならない
staticな内部クラスはシリアライズしてもいいよ。
 
汚染された変数を権限付きで実行してはならない
 
アクセス可視領域を広げてしまうリフレクションを使ってはいけない
publicメソッドで不用意にリフレクションを使うと、privateメンバーにアクセスできてしまう。
Field.setAccessible(true) は基本的にセキュリティマネージャーがはじいてくれるので、そこまで怖くはないはず。
 
決定的な乱数は使ってはいけない
 
パスワードなどを直書きしてはいけない
 
 
重要そうだけどよく意味が分からなかったもの:
SEC2~7

Javaの2重チェックイディオムとhappens-before関係

The "Double-Checked Locking is Broken" Declarationを斜め読みしたところ、Javaで遅延初期化をやるときに2重チェックイディオムが使えるかどうかで悩んだのでメモ。
 
以下のようなクラスがあったとする。
public class AClass {
     private AHugeClass final value; // 状態を持つ巨大なオブジェクト

     public AClass() {
          value = new AHugeClass(); // かなり膨大で副作用のある計算
          /* 他の処理 */
     }

     public AHugeClass getValue() {
          return value;
     }
}
 
基本的にはこのコードに何も問題はないが、value変数の初期化に非常に多くの計算が必要で、かつ場合によってはvalue変数を一切使わないようなとき(計算が無駄になるとき)には、あまり良いコードとは言えない。
 
そこで、遅延初期化を行う。
遅延初期化は、初期化の計算が膨大で、初期化を遅らし、必要なければ初期化を行わないための手法のこと。
 
これをそのまま実装すると、以下のようになる。
public class AClass {
     private AHugeClass value;

     public AClass() {
          /* 他の処理 */
     }
     public AHugeClass getValue() {
          if(value == null) value = new AHugeClass(); // かなり膨大で副作用のある計算
          return value;
     }
}
 
こうするとスレッドが1つのときは正しく遅延初期化されるが、マルチスレッド環境ではdoAHugeCalculation()が複数回呼ばれてしまう。副作用がなければ何度よばれても別に問題ないが、副作用がある場合は以下のような排他制御が必要になる。
public class AClass {
     private AHugeClass value;

     public AClass() {
          /* 他の処理 */
     }
     public synchronized AHugeClass getValue() {
          if(value == null) value = new AHugeClass(); // かなり膨大で副作用のある計算
          return value;
     }
}
 
しかしsynchronizedを使うと、多くのスレッドがアクセスする場合にはメソッドへのアクセス速度が激しく低下してしまう。
そこで、volatile変数で原子性を確保しつつ、2回の判定でなるべく排他しないようにしたものが2重チェックイディオム。
public class AClass {
     private AHugeClass value;

     public AClass() {
          /* 他の処理 */
     }
     public AHugeClass getValue() {
          if(value == null) {
               synchronized(this) {
                    if(value == null) {
                         value = new AHugeClass(); // かなり膨大で副作用のある計算
                    }
               }
          }
          return value;
     }
}
 
これで晴れて遅延初期化を実装できた。
 
しかし、このコードが正しく動作するのはJDK5以降のみ。
JDK1.4以前では、volatile変数にhappens-before関係が存在しないため、2重チェックイディオムをすり抜けてしまう。
※JDK1.4以前のvolatileは、変数がスレッドごとのキャッシュを読まないということのみ保証している。
 
具体的にどう抜けるのかはThe "Double-Checked Locking is Broken" Declarationが詳しいが、根本的な原因はプログラムが書いた順番通りには動かない(逐次一貫性が保証されない)ことである。
上の例では、value = new AHugeClass();でvalueにAHugeClassのインスタンスを代入したにAHugeClassのコンストラクタが呼ばれている。
 
happens-before関係(happened-before、C++流にはsequenced-beforeともいう。日本語では「前に発生」)は、ある命令がプログラムに書かれた順序で実行されるという関係。
普段プログラミングをしているときにはこれは当然のもののように感じるが、内部的には徹底的な最適化が行われているので、プログラムが書いた順に実行されるということはまずない。
happens-before関係を保証するのがC++やJDK5以降のJavaのvolatile修飾子。
 
詳しいことはC++0x Memory Model 第1回 - 1.9 Program execution - Cry’s Diaryを読むとわかるかもしれない。C++の話だし難解だけど。

Androidで縦向き(Portrait)でカメラを使う方法 (主にAndroid2.x向け)

縦向きカメラを使うのは意外に難しい。

要点

  • Androidのカメラは横向きが基本。
  • Android2.1以前では、縦向きカメラが使用できるかどうかは実装依存Camera.Parameters.set("rotation", 90); とすると、一部端末で縦向き表示になる。
  • Android2.2以降では、Camera.setDisplayOrientation(int)を使うことで縦向きにすることができる。
  • 縦向きカメラを使ってもCamera.takePicture()を使って得られた画像は横向きのままなので、手動で変換する必要がある。

カメラを使う

Androidでカメラを使うには、以下のようなコードを書く。詳しくはAPI DemosCameraPreview.javaとかを見よう。
        mCamera = Camera.open(); //カメラを用意
        mCamera.setPreviewDisplay(holder); //カメラ画像を表示先を設定
        mCamera.startPreview(); // カメラ画像の表示を始める
        mCamera.takePicture(listener, listener, listener, listener); //写真を撮る

カメラを縦向きにする

上記のやり方で得られるカメラ画像は、横向きである。これを画面が縦向きのときに表示させることもできるが、アスペクト比が狂った画像が表示されてしまう。
 
これを縦向きにするには、Camera.setDisplayOrientation(int)でカメラプレビューの角度を設定すればいい。
角度は、リファレンスページにあるコード(下記のもの)をコピペすれば得られる。(ただし要API Level 9。API Level 8向けに修正したコードは後述
 public static void setCameraDisplayOrientation(Activity activity,
         int cameraId, android.hardware.Camera camera) {
     android.hardware.Camera.CameraInfo info =
             new android.hardware.Camera.CameraInfo();
     android.hardware.Camera.getCameraInfo(cameraId, info);
     int rotation = activity.getWindowManager().getDefaultDisplay()
             .getRotation();
     int degrees = 0;
     switch (rotation) {
         case Surface.ROTATION_0: degrees = 0; break;
         case Surface.ROTATION_90: degrees = 90; break;
         case Surface.ROTATION_180: degrees = 180; break;
         case Surface.ROTATION_270: degrees = 270; break;
     }

     int result;
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
         result = (info.orientation + degrees) % 360;
         result = (360 - result) % 360;  // compensate the mirror
     } else {  // back-facing
         result = (info.orientation - degrees + 360) % 360;
     }
     camera.setDisplayOrientation(result);
 }
 
Android2.1以前では、setCameraDisplayOrientation()は使えない。パラメーターを取ってきてparameters.set("rotation", 90);とすると一部端末で縦向きになるが、実装依存なので端末によっては動作しない。

撮影した写真を縦向きにする

で、これでカメラのデータを表示する部分は縦向きになったのだが、実際に写真を撮ってみる(Camera.takePicture()を使う)と横長になる。
これを解決するには以下の4つの方法がある。
 
 
下の項目になるほど動作が速いけど、やり方がよくわからないのでここでは上の2つについて説明します。
 
撮った写真を編集する必要がないなら、2番目のイミュータブルなBitmapを作る方法でやる。こちらの方が1番目の方法よりわかりやすい。
     int degrees = getCameraDisplayOrientation(this); // 後述のメソッド
     Matrix m = new Matrix();
     m.postRotate(degrees);
     Bitmap rotatedBitmap = Bitmap.createBitmap(origBitmap, 0, 0, origBitmap.getWidth(), origBitmap.getHeight(), m, false);
 
ここでgetCameraDisplayOrientation()はCameraクラスのリファレンスページにあるsetCameraDisplayOrientation()から抜き出したもの。
以下のようになる。
このコードはAPI level 8向けに修正しているので、インカメラなどを使う場合には間違った数値を返すので注意。
    public static int getCameraDisplayOrientation(Activity activity) {
        int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
        int degrees = 0;
        switch (rotation) {
        case Surface.ROTATION_0:
            degrees = 0;
            break;
        case Surface.ROTATION_90:
            degrees = 90;
            break;
        case Surface.ROTATION_180:
            degrees = 180;
            break;
        case Surface.ROTATION_270:
            degrees = 270;
            break;
        }
        return (90 + 360 - degrees) % 360;
    }
撮った写真に後から他の図形や画像を書き込む場合は、この方法は不適。
イミュータブルなBitmapを生成後にそれをコピーするという方法もあるが、それはメモリ効率が悪い。
そこで1番目の方法を使う。これは動作原理が微妙にわかりにくいし、コードが長い。
     // dataはonPictureTaken(byte, Camera);で定義
     Bitmap origBitmap = BitmapFactory.decodeByteArray(
             data, 0, data.length);
            
     int degrees = getCameraDisplayOrientation(this); // 前述のメソッド
     int rotatedWidth, rotatedHeight;
     if (degrees % 180 == 0) {
          rotatedWidth = origBitmap.getWidth();
          rotatedHeight = origBitmap.getHeight();
     }
     else {
          rotatedWidth = origBitmap.getHeight();
          rotatedHeight = origBitmap.getWidth();
     }
     Bitmap rotatedBitmap = Bitmap.createBitmap(rotatedWidth, rotatedHeight, Bitmap.Config.ARGB_8888);
     Canvas canvas = new Canvas(rotatedBitmap);
     canvas.save();
    
     canvas.rotate(degrees, rotatedWidth / 2, rotatedHeight / 2);
     int offset = (rotatedHeight - rotatedWidth) / 2 * ((degrees - 180) % 180) / 90;
     canvas.translate(offset, -offset);
     canvas.drawBitmap(origBitmap, 0, 0, null);
     canvas.restore();
     origBitmap.recycle();
    
     // ここからrotatedBitmapに何か描き足したり
 
ndkやExifを使う方法はやったことない。。。
ndkでやるには、AndroidBitmapInfoをいじって転置行列を作る要領でピクセルを書き換えればいいはず。

サンプルコード

上記のようにして作った実際のAndroidプロジェクトを以下においています。

3D空間で回転・向きを表す方法

3Dわからない人によるメモ

行列

4x4正方行列で回転と向きを表す。
 
利点
  • 回転を行列の掛け算で表せるので、計算が速い
  • 行列なので平行移動・拡大縮小・傾きも表現できる
  • OpenGLの回転表現法がこれなので、わざわざ変換する必要がない
欠点
  • 向きを表すのに16個の実数値が必要なので、メモリ効率が悪い
    • 3D物体1つだとなんてことはない差だが、何万個も物体があると大差に。
  • 乗算が多いので、誤差がたまりやすい

オイラー角

軸に対する回転3つで向きを表す。
直観的なので3DCGソフトなどでのクライアントに対する回転表示によく使われるが、内部的に使うとなると特定の状況以外では効率がよくない。
 
利点
  • 向きを直観的な形式で表現することができる
  • 各軸に対する回転処理が単純かつ高速
  • 3つの実数値があればいいので、メモリ効率がいい
欠点
  • 単純でない回転を適用する場合、計算が複雑で時間がかかる
  • 特異点が存在する。つまり、2つの等価でないオイラー角が同じ向きを表すことがある
    • このためオイラー角が一意に定まらないことを考慮しないといけないので、他の向き表現からの変換が多少複雑。
  • ジンバルロックが発生する。つまり、特定の向きのときに回転が急激になったり、ほとんど回転しないことがある。
  • 軸の回転順序に自由度があるうえ、状況によって有効な順番が異なるので、統一感がなく紛らわしい
    • いくつか流儀がある(参考:RfLab.Wiki - 数学)。
    • zxy:航空機の姿勢制御(ロールピッチヨー)。
    • yxz:カメラの向き制御
    • zxz:ロボットの姿勢制御。狭義のオイラー角。
    • xyz:あまり使わないが、順序がわかりやすいので他の向き表現形式からの変換過程で使ったり

クォータニオン

クォータニオン四元数)を使って向きを表す。
四元数複素数を拡張した概念で、1つの実数と3つの虚数からなる数のこと。
回転を表す内部表現にはクォータニオンが使われることが多い。
 
利点
  • 回転を四元数の積で表すことができるので、計算が速い
  • 拡大縮小も表現できる
    • 正規化すると拡大情報が消え、正規化しないと回転の誤差がたまるので、あまり使い勝手がよくないが。
  • 2つの向き間の角度を求めるのが高速
  • 高速な球面線形補間(Slerp)が使える
欠点
  • 表現が直観的でない
  • 複数回の回転を表現できない。つまり、60度の右回転・420度の右回転・300度の左回転…が、全て等価に扱われる
    • 1フレームごとならストロボ効果で気にならぬ
    • Slerpとかするときは処理を細かくわけましょう

vim・viを使ってとりあえず文章を編集する方法

vim使ったことがないけど使う必要があったのでメモ。
 
vimを使ったことがないがターミナルは使えるという人が、利便性・効率性を無視してとにかくテキストファイルを編集することを目的に書いています。
`vimtutor ja`と趣旨は近いです。
少しでもvimの操作に慣れている方はこの記事を見る必要はありません。
 
vimを基準に書かれていますが、以下に書いてある全ての操作がviでも使えます。


最初に知っておくべきこと

  • 動作のわからないキー入力をするとたいてい悲惨なことになるので、してはいけない。
    • 特にバックスペースキーはうっかり押して混乱する危険が高い。
  • 状態が混沌としてvimを強制終了させたくなったら、エスケープキー連打した後に「:q!」と入力し、エンターキー押せば大体終了してくれる。
 
起動
  • 起動時に編集するテキストファイル名を指定する。`vim some_text.txt`のような感じで。

モードについて

  • vimには複数のモードがある。
  • モードが違うとキー操作もがらりと変わるので、今どのモードなのかを常に意識しないといけない。
  • テキスト編集に最低限必要なのは「コマンドモード」と「挿入モード」の2つ。
    • 注:コマンドモードを「ノーマルモード」や「編集モード」、挿入モードを「入力モード」や「編集モード」と呼ぶこともある。
  • vim起動直後はコマンドモードになっている。
  • コマンドモードのときにiキーを押すと、挿入モードに移る。
  • 挿入モードのときにエスケープキーを押すと、コマンドモードに移る。
    • 文字以外のキー(例えばカーソルキー)を入力したときもコマンドモードに移動することがあるので注意。
    • どんなモードのときでもエスケープキーを押するとコマンドモードに移れるので、路頭に迷ったらエスケープキーを押そう。
  • モードごとでできること・できないことは次の通り。
    モード名 コマンドモード 挿入モード
    このモードにするためのキー エスケープキー iキー
    できること カーソルの移動(h, j, k, lキー)
    文字の削除(xキー)
    元に戻す(uキー)
    vimの終了(「:q」コマンド)
    その他色んなコマンド
    文字の入力。
    キーボードの文字を大体普通に打つことができる。
    shiftキー押せば通常通り大文字になる。
    日本語はcygwin bash上ではMSのIMEが使えてるけど、その他環境は知らない。
    できないこと 文字の入力
    範囲選択
    文字入力と、カーソル移動以外全部
     (vimなら、.vimrcをいじくれば文字の削除はできるようになる)

コマンドについて

  • コマンドモードでは、コマンドが使える。
    • 以下の説明は全てコマンドモードで行っていることが前提。
  • カーソルを移動するには、h, j ,k, lキーを押す。
    • カーソルキーも多くの場合使えるが、viでは使えないこともある。
    • カーソルの動き方は以下の表の位置のようになる。
        j(↑)  
      h(←)   l(→)
        k(↓)  
  • 文字を削除するには、x, X, dd, Jコマンドを押す。
    • xキーを押すと、カーソルの右側の1文字を消す。改行を削除しないことを除いて、windowsのメモ帳でデリートキーを押したときと同じ効果。
    • Xキー(shift+x)を押すと、カーソルの左側の1文字を消す。改行を削除しないことを除いて、windowsでバックスペースキーを押したのと同じ効果。
    • 「dd」と押すと、カーソルを含む行全体を削除(切り取り)。
    • Jキー(shift+j)を押すと、カーソルを行の末尾に移動しつつ、行末の改行を削除する。
  • vimを終了するには、コマンドモードで「:q」と押す。このときファイルが更新されていて、かつ保存されていないと、失敗する。
    • ファイルを保存せずに終了…「:q!」
    • ファイルを上書き保存して終了…「:wq」
    • ファイルを上書き保存…「:w」

他のコマンド

  • 「dd」コマンドで、一行切り取り。
  • pキーで、貼り付け。
  • あとは「vim コマンド 一覧」とかでぐぐってください・・・・

HTML5+jQueryでテーブルアート生成

HTML5Drag and Drop APIを使えば、ネイティブファイルの情報をドラッグアンドドロップjavascriptに渡すことができる。
HTML5File APIを使えば、ネイティブファイルの情報からbase64形式のデータurlを得ることができる。
JavascriptのImageクラスを使えば、データurlをソースとして画像を生成することができる。
HTML5canvasを使えば、キャンバスに描画された画像の任意のピクセルのrgba値を得られる。
 
ということは、Javascriptだけで任意のローカル画像のテーブルアートを生成できるじゃないか!
そんなわけで、テーブルアートを生成するjQueryプラグインを作ってみました。
実用性皆無。しかもテーブルアートは6年以上前に微妙に流行ったものなので、今や存在すら知らない人がほとんど。まさに誰得。
(万が一HTMLだけで画像表示する必要があるなら、MHTML使いましょう。というか、そんな必要性が発生しないようにしましう)
 
デモとソースコードはGitHubにあります。

Blender 2.58 初心者のメモ

何このソフト 初見殺しすぎる…
 
とりあえず乱雑にメモしておく。
バージョンはBlender2.58です。

2011/11/23】以下の記述は英語版のBlenderを使っているが、Blender2.60では正式に日本語対応となった。
でも、日本語化がちょっと中途半端。翻訳が平易でない用語を中心に英語のまま。
あと、日本語化するとUIの動作が極端に遅くなる。自分の環境では、今まで5秒程度で起動していたのが5分程度かかり、今まで一瞬で開けていたメニューが開くのに5秒程度かかるようになった。
遅さがきついので、結局英語に戻した。
 


Blenderとは

Blenderは3DCG制作ソフト。オープンソースで無料。高機能。

 
日本語のマニュアルはこれ:Doc:JA/2.5/Manual - BlenderWiki 一部未翻訳
 

割とどうでもいいこと
 
Blender初心者がまず知っておくべき3つのこと:
  • よくわからないボタンには安易に触れてはならない。戻せなくなる。
  • よくわからないキー入力を安易にしてはならない。戻せなくなる。
    • Ctrl+U押して次回起動後におかしくなること多々
    • 「元に戻す」がビューごとに対応するので、Ctrl+Zも慣れないうちは難しい
  • 他の3Dグラフィックスソフトの操作法に関する知識や経験は、ほとんど当てにならない。
    • もちろん3DCGの普遍的な知識は有用です
要するにBlenderの操作方法は驚くほど直観的でないってことです。
 
Blenderの解説記事で散見される、説明なしに使われる用語・略語:
  • LMB:左マウス ボタンクリック
  • MMB:中マウスボタンクリック
  • RMB:右マウスボタンクリック
  • Numpad:テンキー


割とどうでもいいこと2

Blenderが使用するpythonのバージョンは次の通り。これ未満でもこれより大きくても認識しない。

Blender2.48a:python2.5
Blender2.48b~2.49:python2.6
Blender2.5x :python3.0

Blender2.5のwin版ではpythonがバンドルされているから、pythonのバージョンを気にする必要はほとんどない。
 

Get Started with Blender ≪ Blender Cookie ここを見ながら慣れる。
 
日本語の解説動画もいくつかいいのがあった(blenderチュートリアル 超基礎編 ‐ ニコニコ動画とか)けど、日本語の初心者向けチュートリアルはほとんどBlender2.49以前の説明だった。Blender2.5とBlender2.4は表面的な部分が色々と違いすぎる…。
 
…と思ってたら2.5の日本語解説あったあああ これ→Blender入門講座|導入編|これは何? - YouTube


Blender: Interface and Navigation ≪ Blender Cookie インターフェースとナビゲーション
 
3Dビューの画面を回転するにはホイールクリック+ドラッグ、平行移動にはShift+ホイールドラッグ、拡大縮小にはホイールスクロールor Ctrl+ホイールドラッグ。
 
画面の向きを軸に合わせるには後述のキーボードショートカットを使う。中段のメニューバーのViewからも選べる。
f:id:dai1741:20120215015309p:image
慣れないうちはメニューバーから使うべきだけど、正面(numpad1)・上面(numpad7)・カメラ(numpad0)の3つは最初からショートカットキーで慣れたほうがはかどる気がする。
 
向き キー Num Lock時に押すもの
正面 numpad 1 j
下回転 numpad 2 k
右側 numpad 3 l
左回転 numpad 4 u
視点を無限遠/有限遠に numpad 5 i
右回転 numpad 6 o
上側 numpad 7 7
上回転 numpad 8 8
後ろ側 ctrl numpad 1 ctrl j
左側 ctrl numpad 3 ctrl l
下側 ctrl numpad 7 ctrl 7
カメラから見る numpad 0 m
これ上の動画見ながら写してるけどどっかにまとまってないのかな?
 
あといくつかよく使うもの
効果 キー Num Lock時に押すもの

選択オブジェクトだけ表示/全て表示
3D View左上に(Local)と書かれていたら選択オブジェクトだけ表示されている。
f:id:dai1741:20120215015244p:image

numpad / /
選択オブジェクトに注目
numpadでないピリオド(.)を押すとPivot Pointが3D Cursorに変わってしばらく悩むので押さないように。
numpad . .

プロパティビューを出す
オブジェクトのxyz座標や回転状態が数値で見れる。
f:id:dai1741:20120215015245p:image

n n
ツール棚(?)を出す
いくつかの機能へのショートカットがある。
f:id:dai1741:20120215015246p:image
t t
ノートPCだと設定変更しないとNumLock幼いといけないのが不便だなあ。Emulate Numpadは使いにくいし、ピリオドとか認識してくれない…。


 
 
効果 やること 中段のメニューバーでの位置
全てのオブジェクトを選択/解除 a Select→Select/Deselect All
オブジェクトの矩形選択 b Select→Border Select
3D manipulator widget
(選択したオブジェクトの移動・回転・拡大縮小をGUIでできるの)
の有効化/無効化
3D Viewの下部にある赤青緑な3本の棒のボタンを押す
f:id:dai1741:20120215015247p:image
 
translate(平行移動)状態にする 3D manipulator widgetボタンの右側の矢印ボタンを押す  
rotate(回転)状態にする 3D manipulator widgetボタンの右側の曲線のようなボタンを押す  
scale(拡大縮小)状態にする 3D manipulator widgetボタンの右側の下の図のボタンを押す
f:id:dai1741:20120215015248p:image
 
移動 右ドラック。もしくはgキーを押す。
平行移動状態(下図の状態)のとき矢印を左ドラッグすれば平行移動。
f:id:dai1741:20120215015249p:image
Object→Transform→Grab/Move
回転 回転状態のとき中心部周辺を左ドラッグ。あるいはrキーを押す。
軸色の曲線をドラッグすれば平行回転。
Object→Transform→Rotate
拡大縮小 拡大縮小状態のとき中心部周辺を左ドラッグ。あるいはsキーを押す。
軸色の直線をドラッグすれば平行スケール。
Object→Transform→Scale
選択したオブジェクトの複製 shift d Object→Duplicate Objects
選択したオブジェクトを消す xかDel Object→Delete...
Edit(編集)モードにする。
編集モードになると頂点・辺・面をオブジェクトと同じように選択できるようになる。
ちなみにここまでの説明ではObjectモードになっていましたはず。

f:id:dai1741:20120215015251p:image
この辺のリストボックスからEdit Modeを選ぶ。
もしくはTabキーを押す。

頂点・辺・面どれを選択するかは下図のボタンで決める。
f:id:dai1741:20120215015252p:image

 
選択した頂点・辺・面を複製して引き延ばす。
ただの箱がこんなの↓になるよ。
f:id:dai1741:20120215015253p:image
eキーを押してドラッグ。 Mesh→Extrude Region
新しいオブジェクトを追加する shift aを押すか、上部メニューバーノAddを押す  
選択した頂点を消す
つながってる辺・面も消える。
Editモードでx押してDelete Vertices Mesh→Delete
選択した辺を消す
つながってる面も消える。
Editモードでx押してDelete Edges Mesh→Delete
選択した面を消す Editモードでx押してDelete Faces Mesh→Delete
選択した頂点からたどれる全てを消す Editモードでx押してDelete All Mesh→Delete
選択した頂点間に面(点3~4個のとき)もしくは辺(点2個のとき)を追加 Editモードでf Mesh→Faces→Make Edge/face
選択した頂点(3つ以上)間に辺を補いつつ面を追加 Editモードでalt f Mesh→Faces→Fill
edge loopの頂点を複製 Editモードでctrl r  
矩形減算選択 b押した後にホイールクリックドラッグ。  
スペシャル
よく使われる機能の一覧的なもの。というかSubdivide(辺や面の分割)メニューバーになくない?
w  
頂点をクリック位置に追加 Editモード 無選択状態でctrl 左クリック  
 
他のソフトに慣れたせいでマウス右ドラッグで選択オブジェクトが移動するのに違和感がある。
 
一部の機能はキーボードショートカットやメニューバーを使うよりも、左側のツール棚を使ったほうが楽?
 

Blender: Intro to Materials ≪ Blender Cookie マテリアル(材質)の基礎
 
 
f:id:dai1741:20120215015254p:image
画面右側、図の赤色で囲った部分がプロパティパネル。矢印のやつがMaterial(マテリアル / 材質)だ。
f:id:dai1741:20120215015255p:image
+ボタンを押すと新しいマテリアルを作る。その左側のテキストボックスでマテリアルの名前を変えられる。
f:id:dai1741:20120215015256p:image
Diffuse(拡散反射)のところで物体の色変えられる。その下のSpecular(鏡面反射)でテカりの色とテカりの強さを決められる。
 
Transparent(透明度)やMirror(反射)などのレンダリングに時間がかかるものは、適用しても3D Viewでは表示されない。
表示を確認するには上部メニューのRender→Render Image (F12)を押す(もしくはプロパティパネルのSceneのRenderのImageを押す)。
レンダリング画面から戻るにはRender→Show/Hide Render View (F11)を押す(プロパティパネルのSceneから来たときはEscapeキーも可)。
 
やたーここまでの知識でこんなんできたよー
f:id:dai1741:20120215015257p:image
 

Blender: Intro to Animation ≪ Blender Cookie アニメーションの基礎
 
画面下の横長のがタイムライン。緑の縦線と丸で囲った数字が現在のフレームを表している。
f:id:dai1741:20120215015258p:image
 
フレームレートはプロパティパネルのシーンのところにある。
f:id:dai1741:20120215015259p:image
緑の縦線をドラッグすれば現在のフレームが変化する。
オブジェクトを選択した状態の3D View上でiキーを押す(もしくは中段メニューバーのObject→Animation→Insert Keyframe...を押す)と、キーフレームの挿入メニューが出る。
LocRotScaleを選択すると、現在選択中のオブジェクトの位置と回転状態と拡大状態を現在のフレームに記録する。キーフレームが存在するフレームはタイムライン上に黄色い縦線が表示される。
f:id:dai1741:20120215015300p:image
 
この状態で対象フレームを変えて、オブジェクトを動かし、再度キーフレームを挿入し、下側にある再生ボタンで再生すると、オブジェクトがアニメーションする。
録画ボタンを押すと自動でオブジェクトを動かすたびにキーフレームが挿入される。
f:id:dai1741:20120215015301p:image
 
これは超基礎のアニメーション解説だけど、ほかにも物理演算とかアーマチュアとかIKとかあるよ。


 
レンダリングはプロパティパネルのSceneから。
f:id:dai1741:20120215015302p:image
一番上のImageをクリックすると実際にレンダリングされる。アニメーションはAnimationから。画面サイズはResolutionで設定。アンチエイリアスはその下ので。
余談だけどアンチエイリアスBlenderが自前で生成しているようなので、グラボでアンチエイリアスが使えない自分のPCとしてはうれしい(笑)
 
画像出力はOutputから。avi出力も可。mpegやH.264エンコードもある。
 

 
ライトは5種類ある。
Point Light:豆電球のような点ライト
Sun Light:太陽光のような無限遠からの平行な光
Spot Light:スポットライト
Hemi Light:天空光。無限の半径を持つ半球から降り注ぐ、乱反射したような光
Area Light:部屋の照明のような大きさのある光
 
 
ライトは色や強さや影響範囲を変えられる。
ライトはAdd→Lampで新しいのが作れる。
 
環境光(Ambient Light)やImage-based LightはプロパティパネルのWorldのEnvironment Lightingで指定できる。
 
 


UVマッピングとTexture paintのやりかた。

UVとは座標系(u,v)のことなのだそうな。

まず3Dのポリゴンを2Dに展開する(Unwrapする)ための準備として、オブジェクトにSeam(切り取り線)を付ける作業をする。(基本図形では不要。その場合は専用の展開方法を選ぶ)
Editモードで辺を適当に選択して、ツールビューのMark Seam(もしくはMesh→Edges→Mark Seam)をクリックする。
すると、下図のようにSeamが赤線で表示される。
f:id:dai1741:20120215015303p:image
(この図ではなぜかギザギザに切ってるけど、面倒なのでEdge Loopできるべき)

SeamをつけたらツールビューのUnwrap(もしくはMesh→UV Unwrap...→Unwrap)をクリック。そしてF11を押してUV/Image Editorを表示する。
そうすると、下図のような2D上に展開されたオブジェクトが表示されるはず。
f:id:dai1741:20120215015304p:image

※もし直前のレンダリング結果が表示されていたら、×を押してそれを消す。
f:id:dai1741:20120215015305p:image

そこからテクスチャペイントしたりUVマッピングしたり。
外部のペイントソフトやドローソフトでUVテクスチャを作成するには、UVs→Export UV LayoutでUVのレイアウトを保存し、それを編集する。
保存時はUVレイアウトは必要ないので非可視化を忘れずに。
f:id:dai1741:20120215015306p:image

作ったUV画像を実際にオブジェクトに適用するには、UV画像をテクスチャに登録して、そのテクスチャを該当オブジェクトの材質に貼り付ければいい。
f:id:dai1741:20120215015307p:image

で、描画するとこうなる。画像が手抜きすぎてわかりにくいな。
f:id:dai1741:20120215015308p:image


 
参考になるページのメモ
 
Object ToolsのShadingをSmoothに変えるとフォンシェーディングができる。
 
平面を軸まわりに一回転させて立体を作る。
 
ブール演算はandとかorとかxorとか。この動画ではandつかてる
 
アーマチュア(骨格)のつけ方。アーマチュアの構成単位パーツのことをボーンという。
 
トゥーンシェーディングのやり方。基本的には材質のDiffuseとSpecularのシェーダーをToonに変えればいい。
 

Eclipse3.7のワークスペースの設定情報をシンボリックリンクで共有する

Eclipseはワークスペース単位で設定を区別している。
このおかげでプロジェクトの種類ごとに違う設定を適用できるので、規約の違う複数のプロジェクト群があるときには重宝するのだと思う。
 
しかし自分にはそういう要求はないので、ユーザーごとに同じ設定を使えるようにしてほしいと思う。が、Eclipseにそれを陽に実現する手段はないようだ。
非公式には何かやり方があるんじゃないかなと思ったけど、意外に見当たらない。


Clone workspace in eclipse - Stack Overflow

このページによると、
  • 設定を保存しているフォルダ「.metadata」はワークスペース直下から移動できない
  • 設定データに絶対パスが多く含まれている
といった問題があるので単純に設定フォルダを共有するだけでは無理みたい。
 
ここの2番目の回答によると、「.metadata/.plugins/org.eclipse.core.runtime/.settings」をコピーすればいいらしい。
さらにそれをDropboxを使ってシンボリックリンクを貼ることも可能。
が、上記のページでも指摘されているように、.settingsフォルダ内の設定ファイルにはところどころに絶対パスの設定が含まれている。設定の共有はローカル内にとどめておいた方がよさげ。
なので自分はDropboxは使わないでシンボリックリンクだけを使う方向でやることにした。
 
 
Eclipseを終了し、設定を共有したいワークスペースの\.plugins\org.eclipse.core.runtimeフォルダで、こんな感じに打てばいい(管理者権限が必要)
> move .settings .org.settings
> mklink /d .settings "共有設定情報があるフォルダ(共有したい.settingsフォルダを別の場所にコピーしたものがよさそう)"
 
バッチファイルはこれ。管理者権限と事前のディレクトリパスの入力が必要。あまり便利じゃないしもしかすると何かのデータを破壊するかもしれない。バッチわからん。。。
 
今のところうまく動いている。パースペクティブの設定は共有されないみたいだけど、まあいいか。
パースペクティブの設定のコピーはFile→Switch Workspace→OtherでCopy SettingsのWorkbench layoutを選択すればいい。symlinkで共有してもいいのかな?

この作業で気づいたけどEclipseCoderってパスワード平文で保存してるんだね…酷いや。 
  

 
後になって気づいたけど、シンボリックリンクを使うよりも安全で簡単そうな設定管理方法があるらしい。
 
Pulseというサービスを使ってEclispeのプラグイン構成と設定をクラウド上で管理。個人なら無償。

プロジェクト管理用ツールとかの簡単なメモ

自分には全然知らない領域の話。とりあえず調べたことをメモ。

開発ツールの用語の一言説明と、代表的なツール(ソフトやサービス)を書いています。

自分はgit以外のほとんどのツールを使ったことがないので、書いてる内容は多分に偏向してると思います。
変なところは突っ込みを入れてもらえるとありがたいです。

バージョン管理システム

プロジェクトのバージョン(差分)を管理する。

  • Git 分散型 ブランチ切るのとマージするのが早い 小規模プロジェクト・OSS向き
  • Subversion 集中型 細かいアクセス制限とか部分的コミット/チェックアウトとかできる 大規模プロジェクト・権限の差が大きなプロジェクト向き
  • CVS 集中型 最近はあまり使わない
  • Mercurial 分散型 gitほどの自由度はないがその分使いやすく、ディレクトリ別管理もできる。バイナリファイルの扱いも高効率
  • Bazaar プロジェクト管理もできるらしい

バージョン管理システムのクライアント

GUIバージョン管理システムを使えるようにするソフト。

プロジェクトホスティングサービス

バージョン管理ソフトが利用するホスト(サーバー)+α(簡易プロジェクト管理システムなど)を提供するサービス

プロジェクト管理ツール(バグ管理システム

プロジェクトの管理ポータル的な物(チケットシステムや工数管理機能など)を提供する。ロードマップとか生成する。

継続的インテグレーションツール(CI)

プロジェクトの定期ビルド・テストを行う。

テスト管理システム

具体的なテスト方法を管理する何か。CIから呼ばれたり、コミット時に呼ばれたりすることも。

CC-BY-ND (表示・改変禁止)なBGMを自作の動画で流すこと

結論:クリエイティブコモンズの改変禁止(CC-BY-ND)は、二次的著作物を作ってはいけないという意味。動画にクリエイティブコモンズ準拠のBGMを付ける行為は、原則的にクリエイティブコモンズでの二次的著作物に当たる。そのため、CC-BY-NDなBGMを動画に付けることはできない。

趣味で作った動画にクリエイティブコモンズのBGM入れたいなと思ったんだけど、使おうと思ったBGMがCC-BY-ND(表示・改変禁止)だった。

こういった曲を動画のBGMにしていいものかと疑問に思った。自分は最初、音声ファイルにエンコード以外の編集を加えず、動画でBGMを丸々流すのであれば、改変には当たらないのではないかと考えた。

「動画 BGM クリエイティブ コモンズ alter」で検索して最初に見たのが、このページ。
CCライセンスでの孫コピー制限の可否と、"改変不可"コンテンツの一部利用。 - あそことは別のはらっぱ。

動画と同期するような形で音楽を使ってはいけないとのことだが、これの意味することがよくわからなかった。

次に見たページ:[ポ] クリエイティブ・コモンズの解釈 - ...My cup of tea...

曲に合わせる形で映像的なエフェクトやなんかを載せて、映像作品に昇華してはいけないという解釈をしていたとのことだ。

よくわからなかったので、原典を見たら、以下のような記述が。

For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.

意訳:「誤解を生まないために書くと、CCを適用した作品が音楽・演技・演奏による作品のとき、その作品に動画を時間的に同期したものは二次的著作物とみなされる。」

んー、音楽の時間と動く画像のフレームを一致させてるのも二次的著作物なら、動画に使うのはダメか。

以下は蛇足だけど、音と画像のフレームが厳密に一致しているのでないのなら問題なさそう。1つのHTMLページで動画と音楽を別のプラグインオブジェクトにするとか。不格好だし面倒だが。

そう考えると、ニコニコ動画@BGMはおそらく上記のsynchingに該当しない。あざといな…!

無料版Unityとバージョン管理システム

Pro版のUnity3Dでは、500ドル追加で払うと「Asset Server」というUnity専用のバージョン管理システムを使うことができるほか、外部のバージョン管理システムを使うこともできる

無料版でも、一見すると外部バージョン管理システムを適用できそうに見える。

実際、適用するだけならできるんだけど、かなり問題が多く本来の使い方(マージやブランチングなど)はできない。

主な問題点は次の3つ。

  • Unityは多くのファイルをバイナリで管理している。バイナリファイルは変更が競合したとき、一般にマージできない。
  • UnityはAssetのメタデータを[Project Root]/Libraryディレクトリで管理している。このディレクトリの内容は頻繁に変わり、変更の追跡が困難。
  • LibraryディレクトリとAssetディレクトリの内容が整合しないとプロジェクト全体が破損する。このため、変更内容が競合しなくてもマージできない。

やるとするなら、プロジェクト全体をバージョン管理下に置いて一切ブランチを切らずマージもしないか、ソースコードとテクスチャだけバージョン管理するかくらいしかない。

自分もUnityプロジェクトを1つGitHubに上げてみたけど、これはソースコードのみを管理している。)

参考:

Windows 7のEclipseのフォントをきれいなものにする

Windows 7のEclipse3.7では、フォントを変更してもフォントリンクが機能しません。
だから、ConsolasMeiryoKe_ConsoleをリンクしてEclipseのフォントをConsolasにしても、Eclipse上では次の画像のように日本語がMS ゴシックで表示されてしまい、とても不釣り合いです。
f:id:dai1741:20120215235148p:image

ConsolasとMeiryoKe_Consoleのフォントリンクのやり方は、Windows7 搭載マシンを買ってきてやったことまとめ - IT戦記をみるととてもわかりやすいです)

そのため、WindowsのEclipseできれいなフォントを使うためには、もう少し違う方法を使う必要があります。
具体的には、次の2つのどちらかになります。

RictyやVLゴシックをgdi++と合わせて使う

RictyVLゴシックを使う方法は、以下で説明するフォント合成よりもいくらか手軽です。
この2つのフォントはWindows以外でも使える(条件付きで)フリーのフォントで、フォントリンクに依存していません。そのため、Eclipseでもきれいに表示されます。

この2つのフォントのインストール方法は上記リンク先のページを参考にしてください。
どちらのフォントも多少インストール方法がやや特殊ですが、検索すれば情報がたくさん出てきます。

ただこの2つのフォントは、ClearTypeありのWindowsと相性が悪く、そのままだときれいに表示できません。
これは、gdi++ Heliumを使うと解決します。使い方は、マニュアルを見てください。
(gdi++にはいくつか種類があって、Herium版でなくても同じように使えるかもしれませんが、自分が試したところFreetype版だとAndroid SDKとの相性が悪いらしくEclipseが頻繁に落ちたので、Helium版をお勧めします。)

FontForgeを使ってConsolasとMeiryoKe_Consoleを合成

ConsolasMeiryoKe_Consoleを合成する方法は、とても面倒です。
フォントを合成するためにはFontForgeを使います。
 
WindowsでFontForgeを使うには、Cygwinを使うのが手っ取り早いです。
ここではCygwinはインストールされているとして、FontForgeを使うには、次のページを参考にFontForgeCygwinにインストールしてください。 

FontForge の cygwin (MS-Windows) へのインストール手順

X11のインストールするソフトは上記ページでは細かく指定されていますが、現在(2011/7/20)の配布物とはあまり一致していないので、X11カテゴリ内のソフトををまとめてインストールしていいと思います。
 
次に、MeiryoKeとttfname3.exeを次のサイトからダウンロードしてください。
ブログ内記事で取りあげたソフト・ファイルのDL情報 『ことば・その周辺』
 
そうしたら、次のページに書いてあることをそのままやってください。これでMeiryoKe_ConsoleとConsolasを合成できます。
MeiryoKe_ConsoleとConsolasの合成方法 - GONE WITH THE MEDICINE
 
生成したフォントをインストールしたら正常に使えるはずです。ちょっと斜体がきついのが気になるけどいい感じになります。
 
また、上記ページの方法で合成する以外に、MeiryoKe_ConsoleにConsolasを貼り付けして、Consolasの斜体を10度のskewで定義してフォントを作るという方法もあります。
このようにするとフォントが厳密には等角にならないんですが、上記の合成方法よりも斜体が多少見やすくなるのが、個人的には好みです。
が、肝心の合成方法を失念してしまいました。これはひどい…orz

比較画像

MairyoKe_Console+Consolas。日本語がやや大きいけどきれい。数字の6がなんか変…?
f:id:dai1741:20120215235150p:image

MairyoKe_Console+Consolas(斜体は10度のskew)。一部の文字が等幅じゃないし、カーニングがおかしい。それ以外は良好。
f:id:dai1741:20120215235151p:image
 
Ricty。きれい。そしてConsolas自前合成よりは手軽。でもgdi++必要なのが個人的には面倒に感じたり。
f:id:dai1741:20120215235154p:image
 
MeiryoUI+Consolas。だいたいいい感じだけど、半角スペースが等角じゃないのはちょっと・・・。
f:id:dai1741:20120215235152p:image
 
Courier New。Eclipseデフォルトのフォント。こうしてみると文字が細いな。
f:id:dai1741:20120215235149p:image