とある技術者の備忘録

~開発の記録~

プロジェクトを作ってみる

さて、
開発環境の構築が完了し、仮想デバイスを作成できたところで・・・

いよいよプロジェクトを作ってみようかと思います!

まずは簡単な「Hellow World」を出力するところまで。
手順は↓コチラです。

f:id:koichi210:20140611001900p:plain

f:id:koichi210:20140611001907p:plain

f:id:koichi210:20140611001945p:plain

f:id:koichi210:20140611001949p:plain

f:id:koichi210:20140611001954p:plain

f:id:koichi210:20140611001958p:plain

f:id:koichi210:20140611002002p:plain

f:id:koichi210:20140611002258p:plain



こんな感じで、プロジェクトが作成できます♪

仮想デバイスを追加する

前回はAndroidの開発環境を構築しました。

Androidアプリ開発はWindowsアプリ開発と違って、
動かす場所を用意してあげないといけません。
WindowsアプリはWindows上で開発するため、動かす場所を用意する必要がありません。

さて、動かす場所ですが。。
ずばり「仮想デバイス」というものを用意してあげる必要があります。

仮想デバイスとは、その名の通り。
実際にはデバイスが無いけど、仮想的にデバイスがあるようにエミュレートしてあげるわけです。


仮想デバイスは以下のような感じで作ります。

f:id:koichi210:20140610223329p:plain

f:id:koichi210:20140610223337p:plain

f:id:koichi210:20140610223344p:plain

f:id:koichi210:20140610223354p:plain

f:id:koichi210:20140610223359p:plain

f:id:koichi210:20140610223404p:plain

f:id:koichi210:20140610223411p:plain

f:id:koichi210:20140610231720p:plain

以上です!

Android開発環境構築

久々の更新です(^-^;

今回はAndroidアプリ開発の環境を構築してみます!
手順は↓こんな感じです。

JDK(Java Development Kit)をインストール
 下記URLからJDKをダウンロード&インストールします。
 ・Java SE Development Kit 7 Downloads
  http://www.oracle.com/technetwork/jp/java/javase/downloads/jdk7-downloads-1880260.html

f:id:koichi210:20140610213706p:plain


②統合環境構築
 下記必要なKitをADT Bundleでまとめてダウンロード&インストールします。
 ・Eclipse
 ・SDK(Software Development Kit)
 ・ADT(Android Development Tools)
  http://developer.android.com/sdk/index.html

f:id:koichi210:20140610213943p:plain
f:id:koichi210:20140610213948p:plain


Eclipseの日本語化
 (1) 下記よりEclipseの日本語化プラグインをダウンロードします。
   http://mergedoc.sourceforge.jp/

f:id:koichi210:20140610214633p:plain

 (2)ダウンロードしたzipファイルを解凍し、ADTがインストールされているフォルダに下記をコピーします。
   ・features
   ・plugins

f:id:koichi210:20140610215555p:plain


 (3)ADTがインストールされているフォルダにあるeclipse.iniファイルを更新します。
  iniファイルの最後尾に以下を追記。

-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar=default.splash -Dfile.encoding=utf-8 

f:id:koichi210:20140610220042p:plain
f:id:koichi210:20140610220048p:plain


④環境構築完了。
 以上でAndroidの開発環境ができました♪

f:id:koichi210:20140610220628p:plain

ポート開放

自宅にRedmineを立ち上げました(u_u*)

さっそく使ってみると・・・
同一LAN上の別PCからアクセスできなかったε=ε=ε=ε=\(;´□`)/

まぁどうせファイヤーウォールだろうと思い、
80番ポートを開放してみることに( ̄ー ̄)

って・・・・
WindowsServer2008R2のポート開放って、どこでやるんだ(゚д゚)クワッ

Linuxとかなら定義ファイルを書き換えるだけだけど、
Windowsって違うよね;;;

とりあえずググってみると、↓こんなものがw
http://symfoware.blog68.fc2.com/blog-entry-500.html

いあー
助かりました(*´ェ`*)ポョ


80番ポートを開放してみると、
期待通り、同一LAN上の別PCからアクセスできるようになりましたw


めでたし、めでたし(u_u*)

多次元配列の作り方

いまの仕事現場がネット使えない環境で苦戦中(´・ェ・`)ショボーン
オンラインの環境だと遊んじゃうヒトがいるからって理由で、ネット使えないのです。。
おかげさまで仕事の効率がかなりDOWN!!
なんのための制限なのやら・・・・と思ってみたり(^-^;


さて、今回のお題は多次元配列です。

ファイルから読み込んだ n個の項目に対して、それぞれy個のデータをもっているので、
可変配列の中に可変配列を持たなきゃいけない処理を作ってます。

動的に確保するとしたら、こんな感じに書いたら良いかと思いきや・・・NG

 DWORD **dwDat = new DWORD[numX][numY];

どうやら new では、1次元配列しか確保できないみたいで、
こんな感じ(実用的な例)に書けば良いらしいです。

ヘッダ

class CMyClass
{
public :
	int m_numX;
	int	m_numY;
	DWORD **m_dwDat;
};

ソース(確保)

// alloc
CMyClass::CMyAlloc()
{
	m_dwDat = new DWORD*[m_numX];
	for( int i=0; i < m_numX; i++ )
	{
		m_dwDat[i] = new DWORD[m_numY];
	}
}

ソース(解放)

// free
CMyClass::CMyFree()
{
	for( int i=0; i < m_numX; i++ )
	{
		delete[] m_dwDat[i];
	}
	delete[] m_dwDat;
}


closed環境だと何も調べられず・・・
こんな簡単なことにもかなりの工数を使用してしまった( ゚∀゚)・∵. ケバァッ

基本的なことは、アタマに叩き込んどけ!ってことですかね(^-^;;

新規プロジェクト作成

VisualStudioで新規プロジェクトを作る場合、
毎度毎度お約束のように設定する項目があります。

ヒトそれぞれ好みはあるでしょうけど、
私としては以下のようなものを設定してます。。


新規プロジェクト作成
f:id:koichi210:20131210134328p:plain


アプリケーションの種類
 ・Unicodeライブラリを使用する = UnCheck
   ⇒文字列を扱うときにTEXTを付けるのがメンドクサイ
 ・MFCの使用方法 = スタティックライブラリ
   ⇒共有DLLだと環境依存のアプリになってしまう
f:id:koichi210:20131210134341p:plain


ユーザーーインターフェイス機能
 ・サイズ変更可能 = Check
 ・最小化可能 = Check
 ・最大化可能 = Check
f:id:koichi210:20131210134350p:plain



すでにプロジェクト作成済みであれば、
rcファイルのダイアログ属性に以下を付加すれば良いです。

・WS_THICKFRAME(サイズ変更可能)
・WS_MINIMIZEBOX(最小化可能)
・WS_MAXIMIZEBOX(最大化可能)


rcファイル定義のご参考

IDD_NEW_PROJECT_DIALOG DIALOGEX  0, 0, 320, 200
STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION
 | WS_THICKFRAME
 | WS_SYSMENU
 | WS_MINIMIZEBOX
 | WS_MAXIMIZEBOX


ちなみに、ダイアログをリサイズされたくない場合は以下です。
※WS_THICKFRAMEとは排他して使うイメージですかね。

・DS_MODALFRAME

可変長引数

C言語を習い立ての頃は“そういうものなのか”と、
あまり気にしていなかったのではないでしょうか。

しかしながら、自分で独自のAPIなんか作り出すと
疑問が生じてきたりします。



printf()のように、関数に渡す引数が可変なAPIって
どうやってるんだ?!



実は何も不思議なことはなくて、可変長引数として定義してあげれば良いのです♪


[固定引数の場合]
 プロトタイプ宣言:
  void DebugKotei(int idx, const char *str);

 呼び出し側:
  DebugKotei(10, "mojiretsu");


[可変引数の場合]
 プロトタイプ宣言:
  void DebugKahen(const char* format, ...);

 呼び出し側:
  DebugKahen("number=%d string=%s", 10, "mojiretsu");
  DebugKahen("number=%d,%d,%d string=%s,%s", 1, 2, 3, "moji", "retsu");
  等々。自由に引数を変えられる。



可変引数をもつ関数の実装

void DebugKahen( const char* format, ... )
{
  char str[MAX_PATH];				// 作成後の文字列格納先
  va_list args;					// 引数の取り出し先

  va_start( args, format );		// 可変引数にアクセス
  _vstprintf( str, format, args );// 書式付き出力を書き込む
  Output(str);					// 作成した文字列を出力する
}


作成モジュールによって、出力するログの形が変わる場合には重宝します。
同一環境でのみ開発している場合には、あまり恩恵ないかも(^-^;

業務でよく使われる聞きなれない用語

コリメーター
 ⇒小さなスリットに光を入れて、平行光線を作るためのもの。らしい。。
  んー。よく分からん;;


コンダクションクール
 ⇒熱伝導で冷やすヒートシンクのようなもの。


スパイクノイズ
 ⇒スイッチをON/OFFするときに、切り替えのタイミングで電気信号が突出した部分のこと。
  グラフで見るとヒゲみたいなのがでているのが分かる。


ハンダブリッジ
 ⇒ハンダが多すぎて、電気回路がショートしている状態。
  ハンダでブリッジってことでしょうかね。


ヒステリシス
 ⇒チカラを加えることで物体が変形し、チカラを抜いた状態でも元の形に戻らない現象。
  バネを少し引っ張って、すぐに手を放すと元に戻る。(ヒステリシスではない)
  バネをいっぱいいっぱいまで引っ張って手を放すと、バネが伸びた状態で維持される(ヒステリシス)


レティクル
 ⇒照準器の+のこと。
  狙撃銃などで望遠レンズを覗き込むと、中央に+マークがありますよね。
  

GOMプレイヤの罠

結構いろんなフォーマットにも対応していて、
コーデックもほとんど心配無いGOMプレイヤ。

また、フレームごとに動画を再生することができるプレイヤというのも希少だったりして
とても重宝しています。
しかしながら、この“フレームごとに再生する”機能には罠がありました・・・


60fpsの動画を1フレームごとにキャプチャするときの話。
以下をマクロ化して自動的にフレームごとの静止画を取り込もうと思ったんです。
 ①GOMプレイヤの静止画をキャプチャ
f:id:koichi210:20131209130410p:plain

 ②アプリで画像保存

 ③GOMプレイヤで次のフレームを表示
f:id:koichi210:20131209130421p:plain

しかしながら、うまくいきませんでした。
10秒の画像を取り込むので、600枚の画像になるとはずなんですが、
なぜか150枚の画像になってしまうんです。
何度やっても同じ。。

手動で1フレームごと見てみると、確かに60fpsあるんです。。


マクロを少し変えて、①を削ってみました。
②→③だけを繰り返してみると、なんと10秒間で600枚になりました。

少しいじって調べてみたところ、
どうやら①を実施すると、静止画のキャプチャと共に“3フレーム先にスキップする”動作が入っていました;;;

GOMプレイヤの仕様なのか不具合なのか分かりませんが。。
”静止画をキャプチャしただけ”のつもりが、実は“フレームも移動していた”ようです。


GOMプレイヤの未知なる能力に、少しだけ無駄な時間を過ごしてしまったのだ。。。

vxWorks ログ出力

C言語では、標準出力に以下を使うのが一般的です。
printf("n = %d", n);

vxWorksでは、こんな感じ(↓)で書いても同じように標準出力されます。
logMsg("n = %d", n, 0, 0, 0, 0, 0);


違いとしては以下のようなところでしょうか。
◆printf
  ・可変長引数
  ・直接出力するため割り込み時には期待しない動作となる(出力されない?)

◆logMsg
  ・固定長引数(引数は6個)
  ・メッセージキューに入れるため、割り込み時でも出力される。


割り込みが発生しなければ、あまり差は感じられないかもしれませんね(^-^;