2019年2月17日日曜日

コンソールアプリケーションの呼び出し(Reflection)

コンソールアプリケーションをリフレクションで呼び出す場合、どう書けばいいでしょうか?

コンソールアプリケーションはこんな感じですね


namespace SimpleApp01
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}


クラスが非公開で、メイン関数が引数ありのstaticメソッドになっています。
つい、こんな風に書きたくなりませんか?


var asm = Assembly.Load("SimpleApp01");
var t = asm.GetType("SimpleApp01.Program");

var method = t.GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic);

// コンソールからの引数を設定
string[] args = new string[] { "aaa", "bbb" };
method.Invoke(null, args);

コンソールアプリケーションの引数は、string[] args なので、それを引数に渡したら動くような気がしちゃいます。
でも、実際にはこれではmethod.invokeでエラーとなり、
System.Reflection.TargetParameterCountException: 'パラメーター カウントが一致しません。'(parameter count mismatch)
が発生します。

Invokeの第2引数には、実際のメソッドの引数を指定する必要があります。
上記のargsを指定するということは

static void Main (string paramA, string paramB)

のようなメソッドの呼び出しをすることになってしまいます。
なので、実際は以下のようになります。

var asm = Assembly.Load("SimpleApp01");
var t = asm.GetType("SimpleApp01.Program");

var method = t.GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic);

// コンソールからの引数を設定
string[] args = new string[] { "aaa", "bbb" };
var p = new object[] { args };
method.Invoke(null, p);


VisualStudioの単体テストプロジェクトの場合PrivateTypeを使用することもできます。
その場合も同様にこんな感じになります。

var asm = Assembly.Load("SimpleApp01");
var t = asm.GetType("SimpleApp01.Program");

// PrivateTypeによる呼び出し
string[] args = new string[] { "aaa", "bbb" };
var p = new object[] { args };
PrivateType pt = new PrivateType(t);
pt.InvokeStatic("Main", p);



2019年2月9日土曜日

一眼レフ用防水ケース dicapacα WP-S5

DICAPAC デジタル一眼カメラ専用防水ケース ディカパック WP-S5を購入しました。

もともと、 dicapac WP-S10を持っていたのですが、経年劣化のため買い換えました。
簡単な海水浴のときの防水対策として使ったり、タイのソンクランという水掛祭りのようなイベントに参加するときに使用していました。

今回はWP-S5を購入しました。



現在のラインナップを見ると、WP-S10より一回り小さい、WP-S5でも使えそうな雰囲気です。
でも対応表を確認すると、現在使用しているメインカメラのEOS6DはWP-S5では非対応らしいのです。
でも、サブ機のEOS6DはWP-S5でも使用可能だとか・・・
「あまりサイズが変わらないので使えそうな気がする!」
ってことで、WP-S5を購入してみました。

購入したのでサイズ比較。
左がWP-S5、右がWP-S10です。
たしかにWP-S5は小さいです。

公式では非対応のEOS6DをWP-S5に入れてみました。
レンズを装着したままでは入らなかったので、レンズを外して本体を入れています。

その後にレンズを装着します。
とくに問題なくレンズも取り付けられました。
簡単に操作も試してみましたが、問題なさそうです。
サイズ的にもピッタリなので、WP-S5でも良いかなと思います。

※公式では非対応なので何か問題が出るのかも?
購入する人は自己責任でお願いします。



2019年2月5日火曜日

Blogger画面に変な通知が出てきました

Bloggerの編集画面に変な通知が表示されるようになりました。

どうやら、2019年3月に廃止になるGoogle+がBloggerに与える影響についてみたいです。
といっても、ほとんど影響は無さそうです。


ブログに表示されていた「G+」みたいなボタンが使えなくなるみたいです。
個人的にはブログ投稿をGoogle+に連動していたのでガッカリですが、特に廃止に伴う設定は要らなさそうです。

ただし、もしBloggerのテンプレートをカスタマイズしているひとは修正が必要になるようですね。



以下、原文です。

Following the announcement of Google+ API deprecation scheduled for March 2019, a number of changes will be made to Blogger’s Google+ integration on 4 February 2019.
Google+ widgets: Support for the “+1 Button”, “Google+ Followers” and “Google+ Badge” widgets in Layout will no longer be available. All instances of these widgets will be removed from your blog.
+1 buttons: The +1/G+ buttons and Google+ share links below blog posts and in the navigation bar will be removed.
Please note that if you have a custom template that includes Google+ features, you may need to update your template. Please contact your template supplier for advice.
Google+ Comments: Support for Google+ comments will be turned down, and all blogs using Google+ comments will be reverted back to using Blogger comments. Unfortunately, comments posted as Google+ comments cannot be migrated to Blogger and will no longer appear on your blog. 

そのまま訳すと、以下の文章になります。

2019年3月に予定されているGoogle+ APIの廃止の発表に続いて、2019年2月4日にBloggerのGoogle+統合にいくつかの変更が加えられます。
Google+ウィジェット:Layoutでの「+ 1ボタン」、「Google+フォロワー」、および「Google+バッジ」ウィジェットのサポートは利用できなくなります。 これらのウィジェットのすべてのインスタンスはあなたのブログから削除されます。
+ 1ボタン:+ 1 / G +ボタンとGoogle+はブログ記事の下およびナビゲーションバーにあるリンクを共有しません。
Google+機能を含むカスタムテンプレートがある場合は、テンプレートを更新する必要があります。 テンプレートの供給元に連絡してください。
Google+のコメント:Google+のコメントのサポートは無効になり、Google+のコメントを使用しているすべてのブログはBloggerのコメントの使用に戻ります。 残念ながら、Google+コメントとして投稿されたコメントはBloggerに移行できず、ブログに表示されなくなります。

2019年2月4日月曜日

漆風のコスプレお面を量産したい

量産できるお面、というかフェイスマスクを作る必要があったのですが、手間取りました。

今回の要件は
・形状は単純なもの
・手作り感が出てほしくない
・ダンス用で1年は壊れないくらい丈夫
・耐水性
・20~30個欲しいけど予算はない

要するにコスプレ用ではなく、よさこいで使えるマスクが必要ってことです。

紙のお面はニスなど塗っても、雨や汗で壊れていくので、耐水性とは言えないと思います。
また、1点ものなら時間も手間もかけられると思いますが、量産する場合はそこまで時間かけられません。

これは、今回作成したマスクです。

左がライオンボード(EVAボード)にカシュー塗装
右はシリコンで型取りしたものです。

1.バキューム成形

一般的なお面の複製ではヒートプレスバキューム成形を使うのが良いようなのですが、私の場合、うまく複製できませんでした。
・・・というか、この方法、今まで成功したことないんですよね(泣

2.シリコン複製

次に試したのは、シリコンによる複製です
が、両面から型を作成すると、型が重くなってしまい、シリコンが自重で歪んでしまうようです。
お面のような大きくて薄いものの作成には不向きなように感じました。

次に昔のアイスキャンディのようにした型を作ってみました。
イメージ伝わるかな?

実際の写真はこんな感じ。
作成した型をシリコンで型取りします。
最終的にバケツから取り出して、ひっくり返したのが、上のイラストの状態です。

複製にはMrシリコーンを使用しました。というか他に選択肢なかったのですが。
あとから考えたら、シリコン高いので重要度の低い部分は、安価なシリコンシーラント使えば良かった。。。

こちらは無事に型からマスク作成できました。

が、型を引っ張り出すのが大変で、すぐに型が壊れていまいます。
シリコンは型が高いので、困ったものです。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]
Mr.半透明シリコーン 1kg【VM013】 GSIクレオス
価格:5800円(税込、送料無料) (2019/2/4時点)


3.ライオンボード+カシュー

やっと本題です。

今回、必要なマスクはとても単純な形状です。
ライオンボードへの塗装は何度か試しましたが、G17ボンドで下地処理をして、アクリルスプレーを塗装しても、どうしても表面の材質に手作り感が出てしまいました。

作りたてのときはそれなりに見えても、コスプレようではなくてダンス用となると、だんだん劣化していくものです。
そこで、今回はカシューでの塗装を試してみます。


カシューってのは、漆みたいなものです。きれいな光沢と耐水性が特徴なのではないでしょうか。
心配なのは、カシューはプラスチックが溶けるというような噂を聞いたことがあるので。。。
ためしに、ライオンボードの破片にカシューを塗装します。

カシューは、通常は少し薄めたものを刷毛で塗装します。でも、筆の手入れも大変なので、塗装には使い捨てできるライオンボード筆を使いました。
2~3回、重ね塗りした状態です。
良い感じに光沢が出ています。
試しに思いきり曲げてみたら、まんまと塗装が割れてしまいました。
とはいえ、今回のマスクではここまで強烈な負荷は想定していないのでなんとかなりそうな予感。

シリコンの型に使用したライオンボードにカシューを塗装してみました。
 
ライオンボードは柔らかいので、そのまま塗るのは大変、、、ということで下敷きになるように粘土を用意しました。
写真左のものは粘土をスーパーの袋でくるんだものです。

カシュー塗装したものです。
3度塗りしたあと、400番のサンドペーパーで磨き、さらにタンポで磨いて塗装してみました。(これが正解かは怪しい。。。)

裏は未塗装の状態です。
冬場の塗装ということもあったので塗装は24時間以上の間隔をあけて行いました。

塗装自体は可能なようです。
ただし、ライオンボード自体が柔らかいので、塗装するときは下敷きの用意が必要ですね
塗装の乾燥には時間がかかるものの、ベースとなる素材がライオンボードなので、簡単にベースを作れます。大量生産にはそれなりに時間かかるけど、なんとかなるかな・・・?

角度変えて再度撮影してみました。

4.螺鈿風の作品は作れるのか?

ついでに、螺鈿細工風にできないかなと思い、こんなのも作ってみました。
花びらの部分は、100均で買った「オーロラカラー」のフィルムを白い紙に貼ったものを貼り付けました。
下の良くわからない三角形は100均で見つけたキラキラのマスキングテープです。
先ほどの試し塗りに使用したライオンボードに、カシューの「ネオクリアー」を糊代わりに塗装しました。
貼り付けたときはソレっぽく見えたんだけど、本物の螺鈿を見るとぜんぜん違う・・・

※螺鈿風はこれは塗装の方法に迷走しながらヤッツケで作ったので、クオリティ低すぎです・・・
後日、また検証してみようと思います。




2019年2月2日土曜日

早送りのスムーズな動画を作りたい(ffmpeg)

撮影した動画を変換するときに、Windowsムービーメーカーを愛用していました。

PanasonicのビデオカメラのMTS形式の動画を、mp4形式に変換していたのですが、一括での変換が出来ないんです。。。
なので、まずはffmpegを使用してWindowsムービーメーカーと同等の動画を作ってみます。

1.ほしい動画の要件

ほしい動画は
・サイズは小さくなってOK
・音ズレはしてほしくない
GOMPlayerで再生できる
・再生位置の移動(早送り)が早い
です。

2.ffmpegの利用

変換のベースとしてffmpegを使用しました。
ffmpegは細かな設定が可能な動画編集アプリです。
一般的なWindowsフォームアプリではなく、コンソール(コマンドプロンプト)で動くアプリなので、とっつきにくい印象派あるかと思いますが、自作のプログラムからの呼び出しも可能なのでとても便利です♪
FFmpegについてはWindowsで使用しています。

3.mp4形式へ変換する

変換するためのコマンドはこれだけでOKです。

  ffmpeg -i 変換した動画名.MTS 変換後の動画名.mp4  

でも、ただ変換しただけだと、なんだか再生したときの感じが違っていました。
なので、理想の動画にするために、動画の情報を比較してみました。


4.動画の形式を調べる

まずは、現状のWindowsムービーメーカーで作成した動画の情報を調べました。

コマンドプロンプトで

  ffmpeg -i 情報を確認したい動画名.mp4  

のように入力することで、動画の情報が表示されます。

私の場合、ムービーメーカーで変換した動画では、以下のような情報が表示されました。
(必要な部分を抜粋しています)

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Movie.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp41isom
  Duration: 00:00:21.61,
  start: 0.000000,
  bitrate: 2690 kb/s
  Stream #0:0(und):
    Video: h264 (Constrained Baseline) (avc1 / 0x31637661),
    yuv420p,
    854x480,
    2484 kb/s,
    29.97 fps,
    29.97 tbr,
    29970 tbn,
    59940 tbc (default)

  Metadata:
    handler_name: VideoHandler
    encoder         : AVC Coding
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D),
  48000 Hz,
  stereo, fltp, 197 kb/s (default)
  Metadata:
    handler_name    : SoundHandler
At least one output file must be specified


同様に、ffmpegで変換した動画についても、情報を取得し異なっている部分について、設定を入れていきます。

「Stream #0:0」と「Stream #0:1」という部分があり、「Stream #0:0」が動画で「Stream #0:1」が音声についての情報です。
今回は音声は気にしていないので、動画部分の情報だけ調べていきます。

また「Metadata」部分は関係ないので無視します。

5.動画の情報を比較する

今回の比較対象は以下の部分です

ムービーメーカーで変換した動画の情報

 Duration: 00:00:21.61,
  start: 0.000000,
  bitrate: 2690 kb/s
  Stream #0:0(und):
    Video: h264 (Constrained Baseline) (avc1 / 0x31637661),
    yuv420p,
    854x480,
    2484 kb/s,
    29.97 fps,
    29.97 tbr,
    29970 tbn,
    59940 tbc (default)


ffmpegで単純に変換した動画

  Duration: 00:00:21.61,
  start: 0.000000,
  bitrate: 5197 kb/s
  Stream #0:0(und):
    Video: h264 (High) (avc1 / 0x31637661), yuv420p,
    1920x1080 [SAR 1:1 DAR 16:9],
    5067 kb/s,
    29.97 fps,
    29.97 tbr,
    30k tbn,
    59.94 tbc (default)


たとえば、サイズを指定する場合、

  ffmpeg -i 変換した動画名.MTS -s 854x480  変換後の動画名.mp4  

プロファルを指定する場合

  ffmpeg -i 変換した動画名.MTS -profile:v baseline  変換後の動画名.mp4  

の赤字のように設定を追記していきます。

両方を指定するなら、続けて書けばOKです。

  ffmpeg -i 変換した動画名.MTS -s 854x480  -profile:v baseline 変換後の動画名.mp4  

6.GOPを指定する

私の場合、設定を合わせていっても、望んだ動画になりませんでした。。。
先に書いた要件は満たしているのですが、
動画を早送りしたときに遅い
という問題がありました。一瞬、移動先で固まるんです・・・

ちなみに、動画の早送りはシークと言います。
シークで調べると、GOPを指定することで対応が出来るようです。

  ffmpeg -i 変換した動画名.MTS -g 1  変換後の動画名.mp4  

上記の例では1秒ごとにキーフレームを設定しています
「1」の部分が小さいほど、早送りがスムーズになりますが、動画のファイルサイズは大きくなります。

7.一括変換する

プログラムの作りによりますが、ドラッグ&ドロップされた動画について変換するようなプログラムを書くことになるのかなと思います。
シェルなどでも書けそうですが、C#を使う場合、以下のように記述することでffmpegを呼び出すことが出来ます。



System.Diagnostics.Process p = new System.Diagnostics.Process();

p.StartInfo.FileName = ffmpegのパス;

p.StartInfo.Arguments = "ffmpegで指定したいプロパティ";

p.StartInfo.UseShellExecute = false;

p.Start();

p.WaitForExit();



ちなみに、一括処理としてはHandbrake も使用できます。
設定が多いので、細かい設定を狙い通りに出来るのかは試せていないのですが・・・