カテゴリー別アーカイブ: 環境

[Unity3d]スクリプトファイルのデフォルト文字コードの指定

前回のポストで述べた方法ではWindows版のデフォルトの文字コードは変更されない。
変更してもUnityで生成する限りは元に戻るとのこと。

[wp_ad_camp_1]

解決策は次のリンクの通り。
DEBUG.LOG::スクリプトファイルのutf-8変換

開発ツール徹底攻略 (WEB+DB PRESS plus)

[Unity3d]プロジェクトを開始時する前にしておきたいソースファイルの文字コードの設定

プロジェクトの途中、いろんな環境で作業しているスタッフが混在していたり、スタッフが途中で増員すると環境が一人だけ違っていたりする事がある。特にコミットされたファイルの文字コードが違っていたりすると後で変更することは可能だが、svnのdiffが効かなくなったりblameで変遷を追えなくなる。

とはいえ、Unityで生成されるファイルはデフォルトでUtf-8なので、これ以外を使おうとする場合はコミット前に毎度確認しなければならなくなる。

そういった事態を回避する為に、予め特定の文字コードでファイルが生成されるように設定しておくと後々の不幸な出来事が無くなるのでメモしておく。

[wp_ad_camp_1]

親ファイル

新規に生成されるファイルは特定のファイルをコピーしただけになるので、親ファイルを特定して変更すればすべて解決する。

Environment3XMac

  • /Applications/Unity/Unity.app/Content/Resources/NewBehaviourScript.boo
  • /Applications/Unity/Unity.app/Content/Resources/NewBehaviourScript.cs
  • /Applications/Unity/Unity.app/Content/Resources/NewBehaviourScript.js
  • /Applications/Unity/Unity.app/Content/Resources/NewShader.shader

NewBehaviourScript.csとかjsとかbooとかshaderとかのファイルがあるのでこれを書き換えておく。
生成時にこれがまるっとコピペされるので署名等も入れておくと便利。

ちなみにこれらは3.xの場合。

4.x以降の場合

Environment4XMac

ファイルは.txtとして完全にテキストファイル化している。さらに、環境変数っぽいものも使えるようで、これを駆使して様々な記述ができそうではある。

Sublime Text 2 ならFileから変更が可能。
EnvironmentEncodeMac

Windows版の場合

3.xについては以下の通り。
EnvironmentFileDir_mac

  • Unity/Data/Editor/Resources/NewBehaviourScript.boo
  • Unity/Data/Editor/Resources/NewBehaviourScript.cs
  • Unity/Data/Editor/Resources/NewBehaviourScript.js
  • Unity/Data/Editor/Resources/NewShader.shader

4.xについては様々な問題により調査してません。が、多分Mac版同様の構成になってると思われるので次の単語で検索すると出てきそう。
– 80-Javascript-NewBehaviourScript.js.txt
– 81-C# Script-NewBehaviourScript.cs.txt
– 82-Boo Script-NewBehaviourScript.boo.txt
– 83-Shader-NewShader.shader.txt
– 84-Compute Shader-NewComputeShader.compute.txt

※最後のファイルは何なんでしょう…。はやく4.x環境に完全以降したい!

注意

UnityのTextAssetはiOSむけにコンパイル後、UTF-16withBOMのファイルを読み込ませてパースしようとすると、BEだろうがLEだろうがパースエラーになって落ちる。

Microsoft Windows 8 (DSP版) 64bit 日本語(新規インストール用)

SVN or Git + Unity でやっておくこと

save prefabのショートカットキーを作成

prefabはApplyしてもファイルシステムへの保存が即時なされるわけではない。
変更後にすぐに git や Subversion にコミットしても変化が無かったり、空のプレファブをコミットしてしまったりで混乱を招くことがある。
これを回避するにはコミット前にUnityを終了する必要がある。
終了時に未保存のPrefabはちゃんとOS側のファイルシステムへ書き込まれる。

しかしそんなことを毎度操作してたら効率が悪いので特定のコマンドを実行するショートカットを用意する。

サンプル

      using UnityEngine;
      using UnityEditor;

      public class Util : Editor
      {
      #if UNITY_EDITOR
           [UnityEditor.MenuItem("Edit/SavePrefab %&s")]
           static void SavePrefab(){
                AssetDatabase.SaveAssets();
           }
      #endif
      }

gist

Menu Item のショートカットキー

ショートカットキーとして次の文字を特殊なキーの代わりに設定できる。
%#s で Command + Shift + s といった具合。

  • % : Command or Windows key
  • # : Shift key
  • &: Alt key

Unity Scripting Reference MenuItem

metaファイルの生成とPrefabデータのテキスト化

通常、Library下にUnityプロジェクト用ファイルが生成されるが、AssetServerを使うのでないのであれば、各Prefabに何がアタッチされているのかとか、インスペクタ上ではどんんあ値が入力されているか、とかはmetaファイルに格納される。このmetaファイルは各リソースファイルと同じところに置く必要がある。

これをしないとコミットしたプレファブのインスペクタが初期値(コードで指定した値)になる。

metaファイルの生成方法は次の通り。

Edit -> Project Settings -> EditorでInspector上にEditor Settingsが表示される。
この VersionControl の項目を MetaFiles にし、AssetSerializationForce Text にする。

これでprefabもTextベースになるのでDiffツール等で変更箇所が目視できるようになる。

Unityライブラリ辞典 ランタイム編

Mountain Lion + Redmine

[wp_ad_camp_1]

Mac OSX Mountain Lion にインストーラからインストールするだけで動作ができた。
該当マシンにはJenkinsが入っているのでポートを8081にする程度の変更は加えたもののDB等も含めたインストールが完了した。

ローカルエリア内からipを直接打ち込むことで別マシンからでもアクセスできるので、遠隔地のスタッフと共同等でないかぎりはこの環境でも十分やれそうだ。

しかし、Redmineからメールが送れなかったりSubversionとの連携が上手く行ってないので調べようと思ったら、Logを吐く設定をしていないことが発覚したので通常運行にはまだまだ事足らない。

Redmineのインストーラ
http://redmine.jp/download/
ここのAll-in-one

MacのApacheを機能させる
http://d.hatena.ne.jp/sakura_bird1/20120804/1344055999
http://d.aoikujira.com/blog/index.php?Mac%E3%81%AEMountain%20Lion%E3%81%A7Apache%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B

ログの場所
http://d.hatena.ne.jp/shigemk2/20120824/1345795386
ここを見なくてもConsoleを立ち上げればApache2の項目からLogを参照できる。

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)
鶴長 鎮一
技術評論社
売り上げランキング: 38,992

Photoshop CS6のScript機能を使ってGradient(グラデーション)を描画する。

Photoshopでメタリックなテクスチャの制作方法を知りました。
が、キャンパスサイズによって感じがだいぶ変わってしまうので調度良いサイズを得るために何度か作り直していました。
これが徐々に面倒になりスクリプト化しようと思い立ち、何とか完成に。

テクスチャ製作手順

この本に載ってます。本をみなくても下に記述したスクリプトに記述してます。

ほめられデザイン事典 グラフィック・ワークス Photoshop & Illustrator
東 和毅 マスモリタロウ(MINIMUM)、 大西 真平 長場 雄
翔泳社
売り上げランキング: 44876

スクリプト製作でやったこと

  1. Photoshop上の操作をスクリプトに出力
  2. スクリプトを解析
  3. なんとなく抽象化

Photoshop上の操作をスクリプトに出力

Photoshopに”ScriptingListener.plugin”というプラグインを入れます。(Mac)
プラグイン(adobe)
インストール方法も日本語で提供されてます。

このプラグインを入れている間は、デスクトップ上に”ScriptingListenerJS.log”というログファイルが出力されます。
開くとConsoleが立ち上がり中身を表示してくれます。

ただし、プラグインが入っている間はずっとログを出力しつづけるのでファイルが肥大化します。
気づかない間に容量を圧迫しているなんてことがないように、不要な時はプラグインを削除します。

スクリプトを解析

やりた処理がわからない時はPhotoshop上で操作をし、それをLog上から解析することでスクリプトの記述方法がわかります。

解析には次の公式ドキュメントが助けになりました。
ADOBE PHOTOSHOP CS6 JAVASCRIPT SCRIPTING REFERENCE

ポイントになるのは以下の2点です。

ActionDescriptor

何をするにも登場します。
このオブジェクトに色々な情報を付加し、特定の操作を定義します。
形式はDictionaryで、keyとValueで格納します。

特徴は、情報をKeyと値セットで保持します。
保持の際にデータ型をメソッド名を以て指定します。

function addBlur(angle,pix)
{
var idMtnB = charIDToTypeID( "MtnB" );
    var desc170 = new ActionDescriptor();
    var idAngl = charIDToTypeID( "Angl" );
    desc170.putInteger( idAngl, angle );
    var idDstn = charIDToTypeID( "Dstn" );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc170.putUnitDouble( idDstn, idPxl, pix );
executeAction( idMtnB, desc170, DialogModes.NO );
}

こんな感じで入れ子になって各操作や数値が定義されます。
また、”MtnB”等の4文字KeyはAdobe側で定義されているのですが、先のドキュメントに載ってないものばかり吐出されるので、どうにかして欲しいところです。
ここは気合いで。

ActionList

このオブジェクトはデータが時系列的に平行して存在する場合にまとめて定義します。
グラデーションの色データ等を格納するのに使います。

なんとなく抽象化

ログを解析すると似た様な箇所がけっこう出て来るので抽象化すると、構造の理解が深まって幸せになれます。
次に出来上がったものを示します。

サンプル

以下のスクリプトをUTF8形式のテキストファイルに貼付けて、”xxx.jsx”という名前で保存します。
Photoshop上からFile > Script > Browse…で保存したファイルを指定すると実行されます。


//create metalic texture

//Gradient
var width = activeDocument.width;
var height = activeDocument.height;
var startP = new pos(width,0);
var endP = new pos(0,height);
gradient(startP,endP);

//Noise
addNoise(15.0, true, true);

//Blur
//これくらいが調度良かった。
addBlur(0,width/20);

//Mono
hueAndSaturation(0,-100,0);

//data boj
function pos(arg_x,arg_y){
	this.x = arg_x;
	this.y = arg_y;
}

function hueAndSaturation(hue,saturation,lightness)
{
	//hue / saturation
var idHStr = charIDToTypeID( "HStr" );
    var desc = new ActionDescriptor();
	
    var idpresetKind = stringIDToTypeID( "presetKind" );
    var idpresetKindType = stringIDToTypeID( "presetKindType" );
    var idpresetKindCustom = stringIDToTypeID( "presetKindCustom" );
    desc.putEnumerated( idpresetKind, idpresetKindType, idpresetKindCustom );
	
    var idClrz = charIDToTypeID( "Clrz" );
	//Colorize (色彩の統一)
    desc.putBoolean( idClrz, false );
	
    var idAdjs = charIDToTypeID( "Adjs" );
        var list10 = new ActionList();
            var desc175 = new ActionDescriptor();
            var idH = charIDToTypeID( "H   " );
            desc175.putInteger( idH, hue );
            var idStrt = charIDToTypeID( "Strt" );
            desc175.putInteger( idStrt, saturation );
            var idLght = charIDToTypeID( "Lght" );
            desc175.putInteger( idLght, lightness );
        var idHsttwo = charIDToTypeID( "Hst2" );
        list10.putObject( idHsttwo, desc175 );
    desc.putList( idAdjs, list10 );
executeAction( idHStr, desc, DialogModes.NO );	
}
function addBlur(angle,pix)
{
var idMtnB = charIDToTypeID( "MtnB" );
    var desc170 = new ActionDescriptor();
    var idAngl = charIDToTypeID( "Angl" );
    desc170.putInteger( idAngl, angle );
    var idDstn = charIDToTypeID( "Dstn" );
    var idPxl = charIDToTypeID( "#Pxl" );
    desc170.putUnitDouble( idDstn, idPxl, pix );
executeAction( idMtnB, desc170, DialogModes.NO );
}

function addNoise( p,isGsn,isMono )
{
	var idAdNs = charIDToTypeID( "AdNs" );
		var noisDesc = new ActionDescriptor();
		var gaussId;
		if(isGsn)
		{
			gaussId = charIDToTypeID( "Gsn " );
		}else{
			gaussId = charIDToTypeID( "Unfr" );
		}
		var idDstr = charIDToTypeID( "Dstr" );
		noisDesc.putEnumerated( idDstr, idDstr, gaussId );

		var idNose = charIDToTypeID( "Nose" );
		var idPrc = charIDToTypeID( "#Prc" );

		//15% 
		noisDesc.putUnitDouble( idNose, idPrc, p );

		var idMnch = charIDToTypeID( "Mnch" );
		noisDesc.putBoolean( idMnch, isMono );

		var idFlRs = charIDToTypeID( "FlRs" );
		noisDesc.putInteger( idFlRs, 5450347 );
	executeAction( idAdNs, noisDesc, DialogModes.NO );	
	
}

function gradient(stratP,endP)
{
	 //各種情報入れとく場所
	var master = new ActionDescriptor();
	 putStartPosition (master, startP.x, startP.y);
	 putEndPosition (master, endP.x, endP.y);
	 //終点
	 //Enumerated
	var idType = charIDToTypeID( "Type" );
	var idGrdT = charIDToTypeID( "GrdT" );
	var idLnr = charIDToTypeID( "Lnr " );
	master.putEnumerated( idType, idGrdT, idLnr );

	 //Dthr
	var idDthr = charIDToTypeID( "Dthr" );
	master.putBoolean( idDthr, true );

	var idUsMs = charIDToTypeID( "UsMs" );
	master.putBoolean( idUsMs, true );

	var idGrad = charIDToTypeID( "Grad" );
	
	var idNm = charIDToTypeID( "Nm  " );
	var desc12 = new ActionDescriptor();
	  //Asset gradient
	desc12.putString( idNm, """$$$/DefaultGradient/Copper=Copper""" );
	
	var idGrdF = charIDToTypeID( "GrdF" );
	var idCstS = charIDToTypeID( "CstS" );
	desc12.putEnumerated( idGrdF, idGrdF, idCstS );
	
	var idIntr = charIDToTypeID( "Intr" );
	desc12.putDouble( idIntr, 4096.000000 );

	var idClrs = charIDToTypeID( "Clrs" );
	  //最初の色データオブジェクト

		var list2 = new ActionList();
			//RGBColorオブジェクト
			var colorObj1 = createRGBColorObj (151.000006, 70.000003, 26.000000);
			var desc13 = createRGBColorData(colorObj1,0,50);
			var idClrt = charIDToTypeID( "Clrt" );
		list2.putObject( idClrt, desc13 );

		//HSBColorオブジェクト
			/**/
			var colorObj2 = createHSBColorObj(21.115723,21.568627,98.431373);
			var desc15 = createHSBColorData(colorObj2, 1229, 50);
		list2.putObject( idClrt, desc15 );

		//色オブジェクト
			var colorObj3 = createRGBColorObj(108,46,22);
			var desc17 = createRGBColorData(colorObj3,3400,50);
		list2.putObject( idClrt, desc17 );
		   
		//色オブジェクト
			var colorObj4 = createRGBColorObj(239,219,205);
			var desc19 = createRGBColorData(colorObj4,4096,50);
		list2.putObject( idClrt, desc19 );
	desc12.putList( idClrs, list2 );
	
	//終了用リスト
		var list3 = new ActionList();
			var desc21 = new ActionDescriptor();
			putOpt (desc21, 100);
			putLctn (desc21, 0);
			putMdpn (desc21, 50)

			var idTrnS = charIDToTypeID( "TrnS" );
		list3.putObject( idTrnS, desc21 );

			var desc22 = new ActionDescriptor();
			putOpt(desc22,100.0);
			putLctn (desc22, 4096);
			putMdpn (desc22, 50);

			var idTrnS = charIDToTypeID( "TrnS" );
		list3.putObject( idTrnS, desc22 );
	
		var idTrns = charIDToTypeID( "Trns" );
	desc12.putList( idTrns, list3 );

	var idGrdn = charIDToTypeID( "Grdn" );
	master.putObject( idGrad, idGrdn, desc12 );
	
	//実行
	executeAction( idGrdn, master, DialogModes.NO );
}

function putOpt(targetObj,Double)
{
	var idOpct = charIDToTypeID( "Opct" );
	var idPrc = charIDToTypeID( "#Prc" );
	targetObj.putUnitDouble( idOpct ,idPrc ,Double );

}
function putLctn(targetObj,Integer)
{
	var idLctn = charIDToTypeID( "Lctn" );
	targetObj.putInteger( idLctn, Integer );
}
function putMdpn(targetObj,Integer)
{
	var idMdpn = charIDToTypeID( "Mdpn" );
	targetObj.putInteger( idMdpn, Integer  );
}

function createPositionDescriptor(x,y)
{
	var desc	= new ActionDescriptor();
	var idHrzn = charIDToTypeID( "Hrzn" );
	var idRlt = charIDToTypeID( "#Rlt" );
	desc.putUnitDouble( idHrzn, idRlt, x );//key, unitID, value
	var idVrtc = charIDToTypeID( "Vrtc" );
	var idRlt = charIDToTypeID( "#Rlt" );
	desc.putUnitDouble( idVrtc, idRlt, y);
	return desc;
}

function putStartPosition(obj,x,y)
{
	var pos = createPositionDescriptor(x,y);
	//開始位置のKey
	var idFrom = charIDToTypeID( "From" );
	//開始位置のunitID
	var idPnt = charIDToTypeID( "Pnt " );
	//開始位置オブジェクトをグラデーション実行オブジェクトに代入
obj.putObject( idFrom, idPnt, pos );	
}
function putEndPosition(obj,x,y)
{
	var pos = createPositionDescriptor(x,y);
	//開始位置のKey
	var idFrom = charIDToTypeID( "T   " );
	//開始位置のunitID
	var idPnt = charIDToTypeID( "Pnt " );
	//開始位置オブジェクトをグラデーション実行オブジェクトに代入
obj.putObject( idFrom, idPnt, pos );	
}

function createDescriptorWithGradientString(gradient)
{
	if(gradient == null)
	{
		//文字列型のデータを追加。"で囲ったプリセットのグラデーション
		gradient = """$$$/DefaultGradient/BlackWhite=Black, White""";
		gradient = """$$$/DefaultGradient/Copper=Copper""";
	}
	var desc= new ActionDescriptor();
	var idNm = charIDToTypeID( "Nm  " );
	desc.putString( idNm, gradient );
	return desc;
}


function createCMYKColorObj(c,m,y,k)
{
	var desc = new ActionDescriptor();
		var idCyn = charIDToTypeID( "Cyn " );
	desc.putDouble( idCyn, c);
	
		var idMgnt = charIDToTypeID( "Mgnt" );
	desc.putDouble( idMgnt, m );
	
		var idYlw = charIDToTypeID( "Ylw " );
	desc.putDouble( idYlw, y);
	
		var idBlck = charIDToTypeID( "Blck" );
	desc.putDouble( idBlck, k);
	return desc;
}

function createCMYKColorData( colorObj, Lctn)
{
	var  targetObj = new ActionDescriptor();
	var idClr = charIDToTypeID( "Clr " );
	var idCMYC = charIDToTypeID( "CMYC" );
	targetObj.putObject( idClr, idCMYC, colorObj );
	   
		var idType = charIDToTypeID( "Type" );
		var idClry = charIDToTypeID( "Clry" );
		var idUsrS = charIDToTypeID( "UsrS" );
	targetObj.putEnumerated( idType, idClry, idUsrS );
	   
		var idLctn = charIDToTypeID( "Lctn" );
	targetObj.putInteger( idLctn, Lctn );
	   
		var idMdpn = charIDToTypeID( "Mdpn" );
	targetObj.putInteger( idMdpn, 50 );
	return targetObj;
}
function createRGBColorObj(r,g,b)
{
	var desc = new ActionDescriptor();
	var idRd = charIDToTypeID( "Rd  " );
	desc.putDouble( idRd, r );
	var idGrn = charIDToTypeID( "Grn " );
	desc.putDouble( idGrn, g);
	var idBl = charIDToTypeID( "Bl  " );
	desc.putDouble( idBl, b);
	return desc;
}
function createRGBColorData(colorObj,Lctn,Mdpn)
{
	var desc = new ActionDescriptor();
	var idClr = charIDToTypeID( "Clr " );
	var idRGBC = charIDToTypeID( "RGBC" );
	desc.putObject( idClr, idRGBC, colorObj );
	var idType = charIDToTypeID( "Type" );
	var idClry = charIDToTypeID( "Clry" );
	var idUsrS = charIDToTypeID( "UsrS" );
	desc.putEnumerated( idType, idClry, idUsrS );
	putLctn (desc, Lctn);
	putMdpn (desc, Mdpn);
	return desc;
}


function createHSBColorObj(h,s,b)
{
	var desc = new ActionDescriptor();
	
	var idH = charIDToTypeID( "H   " );
	var idAng = charIDToTypeID( "#Ang" );
	desc.putUnitDouble( idH, idAng, h);

	var idStrt = charIDToTypeID( "Strt" );
	desc.putDouble( idStrt, s );

	var idBrgh = charIDToTypeID( "Brgh" );
	desc.putDouble( idBrgh, b);
	
	return desc;
}

function createHSBColorData(HSBObj,Lctn,Mdpn)
{
	var desc = new ActionDescriptor();
	
	var idClr = charIDToTypeID( "Clr " );
	var idHSBC = charIDToTypeID( "HSBC" );
	desc.putObject( idClr, idHSBC, HSBObj );

	var idType = charIDToTypeID( "Type" );
	var idClry = charIDToTypeID( "Clry" );
	var idUsrS = charIDToTypeID( "UsrS" );
	desc.putEnumerated( idType, idClry, idUsrS );
	
	putLctn(desc,Lctn);
	putMdpn (desc, Mdpn);
	return desc;
}

function blackGradient()
{
	
	//グラデーションを実行するオブジェクトを生成
var master = new ActionDescriptor();
	
	putStartPosition(master,0.0,0.0);
	putEndPosition (master, 600, 0.0);

		var idType = charIDToTypeID( "Type" );
		var idGrdT = charIDToTypeID( "GrdT" );
		var idLnr = charIDToTypeID( "Lnr " );
master.putEnumerated( idType, idGrdT, idLnr );
	
		var idDthr = charIDToTypeID( "Dthr" );
master.putBoolean( idDthr, true );
	
		var idUsMs = charIDToTypeID( "UsMs" );
master.putBoolean( idUsMs, true );//bool 型のデータを追加
	
		//ここからGradient Data
		var gradientData =  createDescriptorWithGradientString(); //new ActionDescriptor();
		
			var idIntr = charIDToTypeID( "Intr" );
gradientData.putDouble( idIntr, 4096.000000 );
//gradientData.putDouble( idIntr, 0.000000 );
		
		//
		var colorList = new ActionList();
			//black color obj
			var black = createCMYKColorObj(75.02,68.01,67,90.19);	
			var colorData1 =  createCMYKColorData(black,0);

			var idClrt = charIDToTypeID( "Clrt" );
			colorList.putObject( idClrt, colorData1 );

			var white = createCMYKColorObj(0,0,0,0);
			var colorData2 = createCMYKColorData(white,4096);
			colorList.putObject( idClrt, colorData2 );

		var idClrs = charIDToTypeID( "Clrs" );
		gradientData.putList( idClrs, colorList );

		var list5 = new ActionList();

			var desc34 = new ActionDescriptor();
			putOpt(desc34,100.0);
			putLctn(desc34,0);
			putMdpn(desc34,50);

			var idTrnS = charIDToTypeID( "TrnS" );
		list5.putObject( idTrnS, desc34 );
		
			var desc35 = new ActionDescriptor();
			putOpt(desc35,100.0);
			putLctn (desc35, 4096);
			putMdpn (desc35, 50);
				
			var idTrnS = charIDToTypeID( "TrnS" );
		list5.putObject( idTrnS, desc35 );

			var idTrns = charIDToTypeID( "Trns" );
		gradientData.putList( idTrns, list5 );

	var idGrad = charIDToTypeID( "Grad" );//key
	var idGrdn = charIDToTypeID( "Grdn" );//unitID
	master.putObject( idGrad, idGrdn, gradientData );
executeAction( idGrdn, master, DialogModes.NO );
}

応用

色オブジェクト(次のサンプル部分)をgradient()に追加して複雑なグラデーションを作成してみると面白いかもしれません。

//色オブジェクト
	var colorObj3 = createRGBColorObj(108,46,22);//createRGBColorObj(r,g,b);
	var desc17 = createRGBColorData(colorObj3,3400,50);
	list2.putObject( idClrt, desc17 );

JavaScript 第6版

MacOS Lion + XAMPP + OpenPNE

インストール

各種インストーラDLして入れておく
現在ではOpenPNE-3.6.4が最新?

※3.8.Xがリリースされてます。

セキュリティ

同じ様なテーマで作業ログ残してるブログを参考にすすめてみる。

参考:http://d.hatena.ne.jp/s_kaneda/20090603/1244016722

上述の参考URI上にあるリンクのXAMPPのインストールから設定まわりは古過ぎて参考にならず。

MacOS LionにはUtilityにDirectory なんちゃらってのが無い。

ターミナルからsudoでセキュリティの設定を行う。

参考:http://www.youtube.com/watch?v=BPjpRzdrug8

XAMPPのファイルをターミナルからいじる

作業はすべてsudoで行う

sudo vim /Applications/XAMPP/etc/httpd.conf

ファイルを開いたらset numberで行数を表示。
可能な限り何行目にどんな設定があるのかを把握しておく。

最後尾のコメントアウトを削除。vim は Ctrl + d でページ送り

vhostで設定したのディレクトリがちゃんとhtdocs下で一致している事を確認してからxamppのapacheを再起動。

エラーがあるとxamppがalert投げて知らせてくれる。

openPneのデータベースをインストール

データベースは予め作成しておかなければならない。でないとCreatingTableでこける。

phpmyadminからDBを作成。

DB名はopenpne。

照合順序もutf8_unicode_ci

参考:http://technology.rey-net.com/?eid=1155855

ターミナルから以下を入力する。

sudo php /Applications/XAMPP/htdocs/OpenPNE-3.6.4/symfony openpne:install

require_onceでエラーが出たら、次の事をやってない可能性が高い。OpenPNE-3.6.4/config/ProjectConfiguration.class.php.sampleをコピーしてファイル名から.sampleを抜いたものを用意しておく。

インストールが開始されると青い箱で質問攻め。質問内容は参考URLを参考に。

あれ?インストール中どうしても
PDO Connection Error: SQLSTATE[HY000] [2002] No such file or directory
で止まる。

PDO Connection Error: SQLSTATE[HY000] [2002] No such file or directoryの対策

php.iniの最終行に”pdo_mysql.default_socket=/var/mysql/mysql.sock”を追加してインストール処理を試す。

sudo vim でphp.iniを開く。参考URLではpdo_mysql.default_socketの項目があるようだけど俺のところには無かった。無かった!

結果・・・失敗。

参考:http://yasuwagon.blogspot.jp/2010/12/openpne3-pdo-connection-error.html

mysql.sockを探してそれをインストール時に聞かれるdatabase socket pathに入れる方法

まずソケットの場所を探す。

find / -name "*sock"

ずらずらっと出て来るはずなのでそこからそれっぽいものを採択。

/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

これをインストール時に聞かれるType database socket path (optional)に入力。

結果・・・成功。

参考:http://weble.org/2011/05/07/openpne-mac-hemtel

成功すると
http://localhost/OpenPNE-3.6.4/web/
からアクセスできるようになる。

途中、手を付けたもの

/config/OpenPNE.yml.sample -> /config/OpenPNE.yml
/config/ProjectConfiguration.class.php.sample -> /config/ProjectConfiguration.class.php

ここまででインストール完了と管理画面へのログインはできたものの、ユーザー側のフロントエンドにはいけず。

なので色々見直したところ、OpenPNE.ymlのベースURLが間違っているっぽい事が分かったのでそこを修正してみる。

OpenPNE.ymlのbase_urlまわりを修正

6行目

base_url: "http://example.com"
->
base_url: "http://localhost/OpenPNE-3.6.4/web/"
  pc_frontend: "https://example.com"
  mobile_frontend: "https://example.com"
  pc_backend: "https://example.com"
->
  pc_frontend: "http://localhost/OpenPNE-3.6.4/web"
  mobile_frontend: "http://localhost/OpenPNE-3.6.4/web"
  pc_backend: "http://localhost/OpenPNE-3.6.4/web"

結果・・・以下のエラーがでてAdmin側もアクセス不可能に…。

現在、サーバが混み合っているか、メンテナンス中です。
ご迷惑をおかけいたしますが、しばらく時間を空けて再度アクセスしてください。

Currently, our service is too busy or is under maintenance.
We're sorry and please retry accessing later.

ここからbase_urlの最後のスラッシュだけ排除してもう一度インストール

結果・・・アクセス可能に!

しかし、相変わらずログインはできない。

テーブルのPrefixも変更

table_prefix: ""
->
table_prefix: "op_"

これは推奨、ということなのでやらなくてもいいっぽいけどやっとく。

最有力の.htaccessを修正する

参考:http://redmine.openpne.jp/issues/201

XAMPPにmcryptを入れる。

mcrypt:暗号化用関数。なぜかxamppのmac版には入ってない。

http://www.weblio.jp/content/Mcrypt+%E6%9A%97%E5%8F%B7%E5%8C%96%E9%96%A2%E6%95%B0

入ってるか確認。

http://forum.tsukaeru.net/viewtopic.php?p=24183

mcryptはhomebrew経由でinstallした。

同様にAPC拡張モジュールを入れる

APC拡張モジュールって何?

apcはhomebrew経由でのinstall方法が良くわからず…。

その後、発見するもhomebrewからだとダメらしい。

http://d.hatena.ne.jp/ken-ton/20111108/1320732105

そしてAPCをinstallするためにのphpizeが機能しない。

これはphp-develをインストールする必要があるらしい…。

日を跨いでるので一度整理。

現在の現象の種類

  • ログイン後のページが404
  • 管理側は閲覧可能

解決策、原因と思われるものの種類

  • APCとmcryptを入れれば解決するかも!
    • http://blog.bmoon.jp/diary/tips/server/openpne-3.php
    • mcryptはbrew経由でインストール済み
  • .htaccessを編集すれば解決するかも!

公式の手順を読み返したら実際はなにも編集しなくても
http://example.com/pc_frontend_dev.php
でアクセス出来た。

やっとできた…。
でも相変わらずdev抜きURLではアクセスできないけれどもPluginを製作するにあたっては問題無いね。きっと。

OpenPNE