2016/10/09(日)Unity開発環境のセットアップ

Windows + Androidでのお話

Unity

最新版を落としてインストール

visual studio 2015 communityがインストールされます
C#のコードはこれで書く模様
ディスク食うのでヤダって場合、インストール後に消すこともできる?
Unity起動して、[Edit] - [Prederences] - [External Tools]にエディタの設定がある
mono develop(buit-in)を選べば、VSではなく標準エディタが立ち上がる

VSは初回起動にログインするか聞かれるけど、そっちは後でとか、しない選べば次回以降聞かれない
あと、VSの起動があまりにも遅いと、バックグラウンドでmono developも並行して立ちあがるっぽい
内部でタイムアウト処理とかしてるのかもしれない

  • 注意
    • アカウントの登録必須
      今後、このアカウントで開発環境にログインする
    • ライセンス
      会社等でやる場合、収入金額によってはライセンスを買う必要がある
      個人の場合、Unityアプリでの収入が少ない場合(10万アメリカドル...1000万円くらいまで)は必要なし
    • テンプレートの文字コード
      VS開くたびに、改行コードがCR+LFじゃないってうるさいので直す
      参考:http://blog.kanotype.net/?p=29
      C:\Program Files\Unity\Editor\Data\Resources\ScriptTemplates
      上記パスにテンプレートがあるので開いて直す
      ちなみに、BOMつきテキストファイルなので対応したエディタが必要かもしれない

Java

JDKの最新版を落としてインストール

こっちは開発環境(Development Kit)ではなく、実行環境(Runtime Environment)なので注意

Android

Android Studioの最新版を落としてインストール
今は、eclipseいらない模様

ダウンロードサイズが1600Mを越えてる上に、android SDKを展開すると4000M超える
あと、google らしく、SDKが個人のフォルダに入る
SDK Folder: C:\Users\xxxxx\AppData\Local\Android\Sdk
1台を、複数のアカウントで使い分けるときは注意

展開し、初回起動時に、以前の設定のインポートと、追加ダウンロード(更新)が始まる
以前に使った環境があって、設定取り込みたければimportを選択
あとは、標準環境(standard)でいれる

関連付け

UnityにAndroid SDKとJDKのパスを設定

Unity起動して、[Edit] - [Prederences] - [Esternal Tools]

[Android]の
[SDK]に[C:/Users/xxxxx/AppData/Local/Android/sdk]を設定
AppDataフォルダは隠しフォルダなので、Browseから選ぼうとしても非表示になってるかも?
[JDK]に[C:/Program Files/Java/jdk1.8.0_102]を設定
バージョンで変わるけど、こっちはBrowse選べば、そのままJavaのパスが選択されてるはず

2014/11/19(水)postgresqlへの問い合わせが化けてた

データベース学習用のajaxを組んでいたのだけど、日本語が文字化けしてどうしようもなかったのだけど、ようやく解決策が判明

データベースへの問い合わせ結果も、外部入力と同様にdecodeすべきだった模様
すべてUFT8で統一していたので気づかなかった

メモ

use Encode 'encode';
$sth = $dbh->prepare($q);
$row = $sth->execute();

#適当にフェッチ

$value = decode('UTF-8', $value); # 結果の値をデコード

#最後にエンコードして返す
return encode('UTF-8', $result);

2012/08/29(水)指定したファイルだけcgiで実行する

フォルダ中にある特定のファイルだけcgiで実行する方法のメモ

普通にadd-handlerだと、拡張子でしか指定できない。
かといって、set-handerだと、余計なファイルまでcgi扱いになる。
そんなときは、filesディレクティブでファイルを指定して、forcetypeでcgi指定するといいっぽい

testというファイル(拡張子無し)をcgiとして実行する場合

<Files test>
ForceType cgi-script
</Files>

をhtaccessに書いておく

当然、htaccessのoverrideの権限必要あり

検索用

[htaccess] [cgi-script] [pathinfo]

2011/11/21(月)自動改ページ

ある列の値が変わるタイミングで改ページを入れるマクロ

Sub 自動改ページ()
' 1番目の名前を選択(今回はB2)
' activecellから始めるならコメントアウト
Cells(2, 2).Activate

lastdata = ActiveCell.Value
ActiveSheet.ResetAllPageBreaks

Do
If lastdata <> ActiveCell.Value Then
ActiveSheet.HPageBreaks.Add Before:=ActiveCell
lastdata = ActiveCell.Value
End If
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell.Value <> ""
End Sub

検索用

[excel] [エクセル] [macro] [マクロ] [vba] [改ページ]

2011/03/27(日)insideなページ構築中 (pdfの作成)

注意
最終的にroot権限がないとこにインスコする必要があるため、PREFIX付けてます
ライブラリの更新だけはrootでやってますが(汗

PDF::API2のインスコ

準備

ExtUtils::MakeMakerの6.31以上が必要らしいので
rootでcpan使ってinstall ExtUtils::MakeMakerしておく

あと、Font::TTFも必要っぽいので落として入れておく

$ tar xvzf Font-TTF-0.48.tar.gz
$ cd Font-TTF-0.48
$ perl Makefile PREFIX=~/lib
$ make; make test;
$ make install

PDF::API2

$ tar xvzf PDF-API2-2.019.tar.gz
$ perl Makefile.PL PREFIX=~/public_html/inside/lib
$ make; make test
$ make install

make testでFont::TTFが無いと怒られるけど、標準パスに置いてないので当然
気にしないでinstall

使う

use PDF::API2;を忘れずに

基本

# 1. PDFを作る or 開く
$pdf = PDF::API2->new(); 
#$pdf = PDF::API2->open('my.pdf');

# 2. ページを開く or 作る
#$page = $pdf->openpage(1); # 1ページ目
#$page = $pdf->openpage(-1); # 最後のページ
$page = $pdf->page(); # 新期ページ

# 3. いろいろする
# サンプル参考に

# 4. 保存する or 名前を付けて保存する or 更新する or textではき出す
#$pdf->save();
$pdf->saveas('new.pdf'); 
#$pdf->update();
#$pdf->stringify();

# 5. pdfを閉じる
$pdf->end();

サンプル

文字を書く

use PDF::API2;

	my $pdf;
	my $page;
	my $font;
	my $text;
	$pdf = PDF::API2->new();
	$page = $pdf->page();
	$page->mediabox('A4');

	$font = $pdf->corefont('Times-Roman');
	$text = $page->text();
	$text->font($font, 16);
	$text->translate(10,300); # 左下が基準っぽい
	$text->text("sample pdf");

	$font = $pdf->cjkfont('KozMin');
	$text = $page->text();
	$text->font($font, 16);
	$text->translate(10,275);
	$text->text("サンプル②");

# ttf使うと、fontが埋め込まれます
# その分ファイルサイズが大きくなるので注意
	$font = $pdf->ttfont('./font/ipaexg.ttf', -encode=>'euc-jp');
	$text = $page->text();
	$text->font($font, 16);
	$text->translate(10,250);
	$text->text("サンプルⅢ");

	$pdf->safeas('test.pdf');
	$pdf->end();
	exit();

座標 1

ポイント単位なので

sub mm2pt(){
	return $_[0] / 25.4 * 72;
}

とか用意しておくと、幸せになれるかもしれない

座標 2

用紙のサイズ(ポイント)は$page->get_mediaboxで取得できるので、

(undef, undef, $x, $y) = $page->get_mediabox;

でとれるので上からの10mmの座標は

	($page->get_mediabox)[4] - &mm2pt(10)

になる

参考サイト

    • http://search.cpan.org/~ssimms/PDF-API2/
  • 基本的な使い方
    • http://pdfapi2.sourceforge.net/pdfapi2_for_fun_and_profit_APW2005.pdf
    • http://search.cpan.org/~ssimms/PDF-API2/lib/PDF/API2.pm
    • http://d.hatena.ne.jp/end0tknr/20090531/1243757247
  • $textとかコンテンツ回り
    • http://search.cpan.org/~ssimms/PDF-API2/lib/PDF/API2/Content.pm
  • corefont
    • http://search.cpan.org/~ssimms/PDF-API2/lib/PDF/API2/Resource/Font/CoreFont.pm

2011/03/07(月)insideなページ構築中 その2

ユーザ情報取得が必要で、結局LDAPの問い合わせが入るので、ケルベロス認証はやめました

ajaxでid, pw送って、それでLDAPに問い合わせてbindできればOKで、そのまま個人情報の取得
bindできなければそのままエラーで済ませることにした

Net::LDAPのインスコ

適当にググったサイトを参考にインスコ
手元の環境はネットにまともにつながらないのでCPANからインスコできなかった
というか、FTPくらい通して欲しい

なので、perl-ldap-0.4001.tar.gzを落としてperl Makefile.PL; make; make install
依存関係の都合で、これの前にConvert-ASN1も落として入れておく
途中ladpsとか入れるか聞かれるけど、optionalなので、全部 n

LDAPサーバを調べる

というか、直感で
server: xxx.xxx.xxx.xxx
domain: sample.ac.jp
かな

domainからbaseを作る
dc=sample,dc=ac,dc=jp
になる

スクリプト書く

use Net::LDAP;

my $user   = 'serika';
my $pass   = 'password';
my $domain = '@sample.ac.jp';
my $base   = 'dc=sample,dc=ac,dc=jp';

my $ldap;
my $res;

# サーバに接続
$ldap = Net::LDAP->new('xxx.xxx.xxx.xxx'); 
$res = $ldap->bind($user.$domain, password=>$pass);
if($res->code){ # 認証失敗
    exit();
}

# 問い合わせ
$res = Net::LDAP->search(base=>$base, filter=>"(sAMAccountName=$user)");
if($res->code){ # 問い合わせ失敗
    $ldap->unbind;
    exit();
}

# 必要なデータの取得
# 今回は表示名の取得
# foreachのまま使ってるけど、AccountNameが重複してない限り2回回らないので、[0]もあり
my $info;
foreach my $entry ($res->entries){
    $info = $entry->get_value('displayName');
}

# 解放
$ldap->unbind;

最後、解放忘れるとinternal server errorでるので注意

検索用

[Linux][Windows Server][Active Directory][LDAP][perl][認証]

2010/05/07(金)配列

javascriptとかperlになれてしまうと使いにくくてしかたがない

やってられないので、テンプレート使ってarrayクラスを自作
素直に、テンプレートのarrayとかlistつかえって話もあるんだろうけど、使い勝手の都合上作成

使い方メモ

#include "array.h"

CArray<double> array(10); // 一度に確保するメモリサイズ

array = 1;
array = 2;
array[5] = 5;
array = 6;

array[104] = 104;

これで

[0] = 1
[1] = 2
// 間は不定(コンストラクタ次第)
[5] = 5
[6] = 6
// 間は不定(コンストラクタ次第)
[104] = 104

になる

確保されるメモリ

[0]-[9]
[100]-[109]
の20ブロック分
アクセスがあるとその部分のメモリが確保される

そのため、順次アクセス

for(int i = 0; i < array.Count(); ++i)
   [i];

なんてことをすると普通にすべて確保されてしまうので注意
isAlloacted(i)を使うと、メモリが確保されているか確認できる
ただし、確保されている = 定義済み、ではない

2010/05/05(水)Direct 3Dの初期化とか

適当に作ったformのpicturebox内部に描画するように作成
背景を適当に塗りつぶして、四角形(三角形×2)の描画

四角形の描画のため、頂点4つ分だけメモリ確保してます
もっと大きなものを書きたければそれだけメモリ確保する必要あり

namespace書いてないとか、this->を書いてあるとか丁寧に書いてます。
適当に省略してください。
あと、ブログに載せるとき一部編集してます(変数名とか)
直し忘れとかあったらごめんなさい

プロジェクトの設定

[プロジェクト] - [xxxのプロパティ Alt+F7]の共通プロパティの参照に

  • Microsoft.DirectX
  • Microsoft.DirectX.Direct3D

を追加

使う変数の定義

public ref class Form1 : public System::Windows::Forms::Form
{
private:
    Microsoft::DirectX::Direct3D::Device^ dxDevice;
    Microsoft::DirectX::Direct3D::PresentParameters^ dxPresentParameters;
    array<Microsoft::DirectX::Direct3D::CustomVertex::TransformedColoredTextured, 1>^ dxVertexs;
    Microsoft::DirectX::Direct3D::VertexBuffer^ dxVertexBuffer;
    System::Timers::Timer^ dxRefreshTimer;
}

上から、描画のためのデバイス、そのパラメータ、描画のための頂点座標配列、ビデオメモリ上のメモリバッファ、再描画のためのタイマー

コンストラクタ

Form1(void)
{
    InitializeComponent();
    InitializeDirectX(); // 追加
}

DirextXのための初期化ルーチンを呼び出すように追加。初期化ルーチンの内容は次。

初期化ルーチン

void InitializeDirectX(void)
{
    // パラメータ
    this->dxPresentParameters = gcnew Microsoft::DirectX::Direct3D::PresentParameters();
    this->dxPresentParameters->Windowed = true;
    this->dxPresentParameters->SwapEffect = Microsoft::DirectX::Direct3D::SwapEffect::Discard;
    this->dxPresentParameters->PresentationInterval = Microsoft::DirectX::Direct3D::PresentInterval::Immediate;

    // デバイスの作成
    this->dxDevice = gcnew Microsoft::DirectX::Direct3D::Device(0,
                     Microsoft::DirectX::Direct3D::DeviceType::Hardware, 
                     this->pictureBox1,  // 表示するコントロールまたはウィンドウを渡す
                     Microsoft::DirectX::Direct3D::CreateFlags::SoftwareVertexProcessing,
                     this->dxPresentParameters);
    this->dxDevice->RenderState->Lighting = false; // 光源なし

    // 描画用の頂点配列のメモリ確保
    this->dxVertexs= gcnew array<Microsoft::DirectX::Direct3D::CustomVertex::TransformedColoredTextured, 1>(4);
    this->dxVertexBuffer= gcnew Microsoft::DirectX::Direct3D::VertexBuffer(this->dxVertexs[0].GetType(), 
                       4,
                       this->dxDevice, 
                       Microsoft::DirectX::Direct3D::Usage::None, 
                       Microsoft::DirectX::Direct3D::VertexFormats::Normal,
                       Microsoft::DirectX::Direct3D::Pool::Managed);

    // 再描画用のタイマー設定
    this->dxRefreshTimer= gcnew System::Timers::Timer();
    this->dxRefreshTimer->Elapsed += gcnew System::Timers::ElapsedEventHandler(this, &Form1::RefreshTimer_Event);
    this->dxRefreshTimer->Interval = 1000.0 / 30.0; // 30[fps]
    this->dxRefreshTimer->Enabled = true;
}

強制的に再描画させるためにタイマーを設定

描画のためのルーチン

タイマーイベント用

System::Void RefreshTimer_Event(System::Object^ sender, System::Timers::ElapsedEventArgs^ e){
    this->pictureBox1_RePaint();
}

実際の再描画

System::Void pictureBox1_RePaint() {
    this->dxDevice->BeginScene(); // 描画開始
    this->dxDevice->Clear(Microsoft::DirectX::Direct3D::ClearFlags::Target,
                          System::Drawing::SystemColors::ActiveCaption, 1.0f, 0); // 一度画面を指定色でクリア
    this->drawBox(10.0, 10.0, 30.0+i, 30.0+i); // 四角形の描画
    this->dxDevice->EndScene();   // 描画終了

    try{
        this->dxDevice->Present(); // 画面に反映
    }catch(Microsoft::DirectX::Direct3D::DeviceLostException^ e){
        // 失敗 = デバイスが使えない状態
        // 今回は5秒後に再チャレンジ
        this->dxRefreshTimer->Interval = 5000; // 5[sec]

        // デバイスがリセットできる状態になったらリセット
        int result;
        if(!this->dxDevice->CheckCooperativeLevel(result)){
            if(result == (int)Microsoft::DirectX::Direct3D::ResultCode::DeviceNotReset){
                this->dxDevice->Reset(this->dxPresentParameters);
                this->dxRefreshTimer->Interval = 1000.0 / 15.0; // 15fpsに戻す
            }
        }
    }
}

描画補助(四角形の描画)

System::Void drawBox(float x, float y, float w, float h){

    // 頂点を指定する順番に注意(左上、右上、左下、右下)
    this->dxVertexs[0].X  = x;    this->dxVertexs[0].Y  = y;
    this->dxVertexs[0].Tu = 0;    this->dxVertexs[0].Tv = 0;
    this->dxVertexs[0].Z  = 0;    this->dxVertexs[0].Color = Color::Pink.ToArgb();
    this->dxVertexs[1].X  = x+w;  this->dxVertexs[1].Y  = y;
    this->dxVertexs[1].Tu = 1;    this->dxVertexs[1].Tv = 0;
    this->dxVertexs[1].Z  = 0;    this->dxVertexs[1].Color = Color::Pink.ToArgb();
    this->dxVertexs[2].X  = x;    this->dxVertexs[2].Y  = y+h;
    this->dxVertexs[2].Tu = 1;    this->dxVertexs[2].Tv = 1;
    this->dxVertexs[2].Z  = 0;    this->dxVertexs[2].Color = Color::AliceBlue.ToArgb();
    this->dxVertexs[3].X  = x+w;  this->dxVertexs[3].Y  = y+h;
    this->dxVertexs[3].Tu = 0;    this->dxVertexs[3].Tv = 1;
    this->dxVertexs[3].Z  = 0;    this->dxVertexs[3].Color = Color::AliceBlue.ToArgb();

    Microsoft::DirectX::GraphicsStream^ dxGraphicsStream = this->dxVertexBuffer->Lock(0, 0, Microsoft::DirectX::Direct3D::LockFlags::None);
    dxGraphicsStream->Write(this->dxVertexs); // 頂点座標をバッファに書き込み
    this->dxVertexBuffer->Unlock();

    this->dxDevice->SetStreamSource(0, this->dxVertexBuffer, 0);
    this->dxDevice->VertexFormat = Microsoft::DirectX::Direct3D::CustomVertex::TransformedColoredTextured::Format;
    this->dxDevice->DrawPrimitives(Microsoft::DirectX::Direct3D::PrimitiveType::TriangleStrip, 0, 2); // 描画
}

TriangleStripで三角形の描画を指定、それを2個描画することで四角形になる

参考

検索用

[DirectX] [Direct3D] [Visual Studio 2008] [.net] [cpp/cli] [c++]

OK キャンセル 確認 その他