【Unity】Unity初心者が学ぶべきこと①【Blender編】

2月1日から、社内でVR/ARチームが発足した。

そこで私は、ぬくぬくとPHPだけをやっているわけにはいかなくなった…
なので、Unityを学ぶことにした。

そろそろ学び初めて1ヶ月。
Unityの世界から、 デジタルサイネージの世界 色々な世界を目にするようになった。
全く知らない環境からUnityマスターになりたいと思う。

Unityを行う上で、知っておいたほうが良い技術。


1.Blender
これがBlenderの画面。

なぜ、Blenderが知ったほうが良いか?
ということなのだが、これは3DCGを作成するソフトだ。
しかし、Unityで動かせるオブジェクトも作成可能なのだ。
Unityで動かす人間などの「骨格」を作成するソフトっていう認識で良いと思う。
基礎の操作方法さえ知っていれば、自分でカスタマイズすることも可能。
プログラマとして知る必要のないことも、Unityでは知る必要なのかと実感。

f:id:chipomote:20150223142008p:plain

うむ。
固いプログラマとしては、全くなれない画面にすごく戸惑いを覚える。

Blenderはキー操作で視点切り替えが結構出来る。
しかし、悲しいことに、
マウスを使用しないmacユーザとの相性は悪い
わたしは拡大・縮小のためにマウスを導入した。

以下がキーボード操作だ。

キー操作操作したとき
【TAB】キー エディットモードとオブジェクトモードの切り替え
【h】キー オブジェクトを非表示にする/td>
【Alt】+【h】キー hキーで隠したものを表示する。
【z】キー ワイヤーフレームモード、ソリッドモードの切り替え
右クリック オブジェクトの選択
左クリック オブジェクトを動かしたり
【a】キー 全選択/選択解除
【b】キー 選択範囲を作成
【c】キー スクロールしたオブジェクトの選択

上記の操作方法がわかれば、Blenderのカメラワークは使いこなせるそうだ。

【Apache】deflateを設定して高速化

知らなかった知識が増えることはいいことだと思う。

どんどん吸収していけたら、いいのにな。

最近会社に新しく入社した人が、けっこう知識マンなので非常にためになる話がきけて良い。

 

今までずっとApacheつかってPHP書いていたくせに、高速化とか気にしたことなかったから、目からウロコちゃんだったのが、このdeflateの設定だ。

deflate を設定すると、コンテンツを圧縮して転送量を減らすことができるらしい…

設定はとても簡単だった。今まで知らなかったことが悔しいくらい。

 

以下、Apacheのdeflateの設定方法

①「/etc/httpd/conf.d/deflate.conf」ファイルを生成する。

②生成した deflate.conf ファイルに以下の文を書く。

<IfModule mod_deflate>
     SetOutputFilter DEFLATE
 
     # Mozilla4系などの古いブラウザで無効、しかしMSIEは除外
     BrowserMatch ^Mozilla/4\.0[678] no-gzip
     BrowserMatch ^Mozilla/4 gzip-only-text/html
     BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
 
     # gifやjpgなど圧縮済みのコンテンツは再圧縮しない
     SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
     SetEnvIfNoCase Request_URI _\.utxt$ no-gzip
 
     # htmlやcssなどは圧縮
     AddOutputFilterByType DEFLATE text/plain
     AddOutputFilterByType DEFLATE text/html
     AddOutputFilterByType DEFLATE text/xml
     AddOutputFilterByType DEFLATE text/css
     AddOutputFilterByType DEFLATE application/xhtml+xml
     AddOutputFilterByType DEFLATE application/xml
     AddOutputFilterByType DEFLATE application/rss+xml
     AddOutputFilterByType DEFLATE application/atom_xml
     AddOutputFilterByType DEFLATE application/x-javascript
     AddOutputFilterByType DEFLATE application/x-httpd-php
</IfModule>

③最後にApacheを再起動

service httpd restart

 

たったこれだけで、高速化が望めるなんてすごい。

 

ただし、転送量がヘル反面、CPUの処理は増えるらしい。

ボトルネックとなっているものがCPUの処理の場合には逆にレスポンスが低下する。

回線が遅く、処理に時間がかかる場合は有効だ。

【PHP】指定したディレクトリ下のファイル一覧を取得【ディレクトリ】

指定したディレクトリ下のファイル名を配列で取得する関数を作成してみた。

    public function createFileName($dirHome){

        // 初期化
        $fileName = array();

        // ディレクトリ名を作成
        $dir = opendir($dirHome) or exit('NG');
        while( $fname = readdir($dir)){

            // ファイル名を作成する
            $name = $dirHome.DS.$fname;

            // 存在するファイル名の存在を確認する
            if(is_file($name)){
                array_push($fileName, $name);
            }
        }
        closedir($dir);

        return $fileName;
    }

第一引数にディレクトリ名を渡すと、戻り値としてファイル名一覧が配列で取得できる。

意外と簡単にできるが、opendir とか普段しようしないので、
何も考えずにこの関数を使用して、取得したほうが簡単だと思う。

以下、使用関数。

1.ディレクトリハンドルをオープンする

resource opendir ( string $path [, resource $context ] )

2.ディレクトリハンドルからエントリを読み込む

string readdir ([ resource $dir_handle ] )

3.通常ファイルかどうかを調べる

bool is_file ( string $filename )

4.一つ以上の要素を配列の最後に追加する

int array_push ( array &$array , mixed $value1 [, mixed $... ] )

5.ディレクトリハンドルをクローズする

void closedir ([ resource $dir_handle ] )

【PHP】macで csv 変換した csvファイルを読み込む【CSV】

普通 CSV ファイルを読み込むとき、
windows なら fgetcsv を使用すれば
無事に読み込むとができる。

 

しかし、macOS で作成した CSV ファイルは
改行コードが違うため、正常に読むこむことができない。

 

そこで、CSVファイルを読み込むための関数を作ってみた。

 

    public function csvFileRead($fileName){
        // 一度バッファに読み込む
        $data = file_get_contents($fileName);

        // mac で作成したcsv は改行コードが違うため、変更を行う
        $data = ereg_replace("\r\n|\r|\n", "\n", $data);

        // 文字コードSJIS から UTF-8 に変換する
        $data = mb_convert_encoding($data, 'UTF-8', 'SJIS');
        $temp = tmpfile();

        // 一時ファイルを作成
        $csvData = array();
        fwrite($temp, $data);
        rewind($temp);

        // CSV ファイルの読み込みを行う
        $csvData = array();
        while($data = fgetcsv($temp, 10000)){
            $csvData[] = $data;
        }
        fclose($temp);

        return $csvData;
    }


第一引数にファイル名を渡せば、
戻り値に配列で返す関数である。

【jQueryとCakephp】動的にTableを追加したり削除したりしてみた

わぁ。とってもいろいろやてみたよ。わぁ。
今回は、CakephpjQuery で動的に Table の追加削除をしてみんよ。ってお話。
今回は、長くなりそうだ。
所詮メモ書きなので…

何がやりたいのかというと、
1.セレクトボックスをチェンジすると、PHP にデータを送信する。
2.PHPでデータを受け取り、DBから多次元配列で取得を行う。んでjson
3.動的にTableを削除したり追加したりしたい。

まずいってみよー!
の前に、HTMLね。

<table class="table table-striped table-bordered table-condensed">
    <thead style="background-color:#eeeeee;">
        <tr>
            <th><nobr>テスト1行目</nobr></th>
            <th><nobr>スト2行目</nobr></th>
        </tr>
    </thead>
    <tbody id="targetTable">
    </tbody>
</table>

 

上記のHTML の id = "targetTable"に動的にtd と tr を追加していくよ。

 

1.セレクトボックスをチェンジしたときに発生するイベントを作成。

// 基本的な処理
$(document).ready( function(){
    $('#select').bind(
        "keyup keypress change",
        function(event){
            set_ajax($('#select'));
        }
    );
});

ここで、set_ajaxっていう function に飛ばすよね。

 

次に、set_ajax 関数の中身.

function set_ajax(select){
    var id = {selectId:select.val()};
    $.ajax({
        async:true,
        data:id,
        dataType:"json",
        success:function(data, textStatus){
            $('#targetTable').empty();
            jsonParser(data);
        },
        error:function(data, textStatus){
        },
        type:"POST",
        url:"\/caketest\/test\/changeSelect",
    });
    return;
}

 

おっと、empty() で、なんと、追加した削除が出来てしまうのですよ。
要は、削除して新しく毎回 table を更新するわけ。へぇ。
2.PHPからデータを取り出す
Cakephp なので、カンタンよ。

<?php
App::uses('AppController', 'Controller');
class TestsController extends AppController {
    // cakephp で db から値を取得
    public function changeSelect(){
        // ajax で受け取り
        if($this->request->is('ajax')){
            $this->autoLayout = false;
            $this->autoRender = false;

            if(isset($this->request->data['selectId'])){
                if($this->request->data['selectId'] !== ''){
                    // 取得
                    $getList = $this->Test->getTestIdName($this->request->data['seletId']);

                    // 取得
                    $list = array();
                    foreach($getList as $item){
                        $wk['name'] = $item['name'];
                        $wk['name2'] = $item['name2'];
                    
                        array_push($list, $wk);
                    }

                    // json 形式でわたす
                    echo json_encode($list);
                    exit;
                }
            }
        }
    }
}
?>

 

json形式で多次元配列になるよね! 次は、サクセスで帰って行きた時に受け取る関数を作るよ!

// json データを tbody に設定する
function jsonParser(data){
    if(data == ""){
        return;
    }

    // tbody の中身を作成する
    for(key in data){
        $('#targetTable').append('<tr>');
        for(key2 in data[key]){
            setMsg = '<td>' + data[key][key2] + '</td>';
    $('#targetTable').append(setMsg);
        }
        $('#targetTable').append('</tr>');
    }
    return;
}

 

これでいけるよ!きっと大丈夫よ!

【Cakephp】phpExcelをcakeで使ってみた

PHPExcel という素晴らしい機能がこの世には存在する。
その素晴らしい機能を使ってみた。

 

今回は、Excelをサーバ内に保存し、その後ダウンロードを行うという形式にする。

下準備として、Cake 上に保存するフォルダを作成しておく。
今回は、app/tmp/excelの下に保存したいと思う。

PHPExcelはテンプレート方式で形成されるらしい。
なので、同じ形式のExcelをダウンロードしたいときは、
先にExcelを準備しておく必要がある。

 

今回はテンプレートありの方式にする。
テンプレートは app/tmp/excel/tmp.xls として準備しておく。

それでは、いってみよー!!

 

1.PHPExcel をダウンロードするとこから始める。めんどい。
PHPExcel
2.zip を展開し必要なフォルダ・ファイルを取得する。
Classes の下にある PHPExcel フォルダと PHPExcel.php のみが必要になる。
そのほかは、いらない!!

PHPExcelフォルダとPHPExcel.php を Cake フォルダの app/Vender/のしたにコピー。

これでPHPExcel が使用可能になる!

3.Controller側の設定を行う! ボタンなどイベントを起こす先の関数に、設定を行う。

public function exportExcel(){
    // レイアウトは使わない
    $this->layout = false;

    // ファイル名を作成
    $fileName = date('YmdHis').'.xls';

    // 保存ファイルパス
    $upload = relpath(TMP);
    $upload .= '/excel/';
    $downloadPath = $upload.$fileName;

    $this->set(compact('fileName', 'downloadPath'));
}


4.View の設定を行う!(export_excel.ctp)
ここが肝心の内容だ…

まず、各ライブラリを呼ぶ。

<?php
// // エクセル出力用ライブラリ
App::import('Vendor', 'PHPExcel', array('file' => 'phpexcel' . DS . 'PHPExcel.php'));
App::import('Vendor', 'PHPExcel_IOFactory', array('file'=>'phpexcel'. DS .'PHPExcel'. DS .'IOFactory.php'));
App::import('Vendor', 'PHPExcel_Cell_AdvancedValueBinder', array('file'=>'phpexcel'. DS .'PHPExcel'. DS .'Cell'. DS .'AdvancedValueBinder.php'));

// Excel95用ライブラリ
App::import('Vendor', 'PHPExcel_Writer_Excel5', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'Writer' . DS . 'Excel5.php'));
App::import('Vendor', 'PHPExcel_Reader_Excel5', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'Reader' . DS . 'Excel5.php'));


次に、テンプレートを呼び出す

// エクセルシート
$objRender = PHPExcel_IOFactory::createReader("Excel5");

// テンプレートファイルフルパス
$template = realpath(TMP);
$template .= '/excel/';
$templatePath = $template."tmp.xls";

$PHPExcel = $objRender->load($templatePath);


次は、シートの設定を行う

// 表紙への出力
$PHPExcel->setActiveSheetIndex(0);  // 一番左のシート(0はSheet1)
$sheet = $PHPExcel->getActiveSheet();



そしてそして、内容を書き出す。
これはセルを指定して、書くことが可能。

    $sheet->setCellValue( 'A1', 'めんどくせ');


内容を書き出したら、保存じゃ!保存!

// 保存
$objWrite = new PHPExcel_Writer_Excel5($PHPExcel);
$objWrite->save($downloadPath);


保存したら、ダウンロードじゃ!ダウンロード!

// エクセルファイルをクライアントに出力
$convertFileName = mb_convert_encoding($fileName, 'sjis', 'utf-8');

//保存をしてから出力
Configure::write('debug', 0);  // debugコードを非表示
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment;filename="' . $convertFileName . '"');
readfile($downloadPath);


Excelは基本敵に sjis なので変換しないとダメだ。
これで、ダウンロードができたはず…!

 

基本、コピペで完成なので、難しいことは無いと思う。

【Cakephp】404NotFound どうしよう?

404 の NotFound ページをおしゃれにしたい。
と思うことがある。
そんなときの対処法だ。

 

app/View/Errors/error400.ctp ファイルを開き、以下の文を先頭に貼り付ける。

<?php $this->layout = "error"; ?>


こうすることによって、404ページが選択された時、
/app/View/Layouts/error.ctp ファイルに飛ぶように設定ができる。

error.ctpは最初は cakephp のデフォルト設定がしてあるので、
オリジナルに書き換える必要性が出てきてめんどくさい。

そのときは、 bttosnipp

codepenを使用して、簡単に画面を作成すればいいと思う。

ただ、一つ注意点がある
routes.php を設定していないと、 '/' に戻ってきた時さえ、
NOTFOUND ページが出力されてしまう。

なので、予め rotes.php を設定しておく必要性がある。