2014년 12월 18일 목요일

[OSX] OSX에서 sshfs/s3fs등 fs으로 마운트 하려했을때 에러에 대한 대처

증상

fuse4x kernel extension was not loaded. Please check /var/log/{system|kernel|debug}.log for more information.

대처

# 현재 포커싱이 맞춰진 fuse4x를 찾아봄 (없다면 패스문제)
which fuse4x 

# 퓨즈를 찾아봄
sudo find / -name "fuse4x.kext" 

#개인적인 환경에서는 아래가 검색됨(없다면 brew등을 통해 도입할 것)
/System/Library/Extensions/fuse4x.kext

#단순하게 심볼릭 링크를 연결해줌.
ln -s /System/Library/Extensions/fuse4x.kext /Library/Extensions

#이후에 다시 동작확인.

2014년 12월 16일 화요일

[Node.js] WebStorm에서 nodejs디버깅 환경 구축

개요

WebStorm을 이용해 node.js앱(여기선 sails.js) 디버깅

제약

https://www.jetbrains.com/webstorm/help/running-and-debugging-node-js.html
로컬에 있는 nodejs소스거나, 원격지에 있는 경우는 이미 구동중인 앱에 대한 어태칭을 실시할 수 있는 것을 전제로 한다고 한다.

전제

우선 원격지에 관한 앱 구동 자체가 불가능한것은 아니다. 다만 공식적으로 서포트가 안되고있는 점과, 원격에 소스를 두고 작업을 하기에는 Webstorm의 원격 파일 조작부분은 미약한 부분이 많다. sshfs등을 이용해 원격 디스크를 마운트해 작업을 하기에도 가능은 하나 역시 물리적으로 느려지는 부분은 어쩔수 없는듯 하다.

개인적으로 작업환경을 구축함에 있어서. 인프라를 따로 세우지 않고 작업을 진행하는 현 시점에서는 물리적으로 로컬 머신에 모든 데이터베이스 서버등을 준비해, 로컬에서 작업을 하다, 실제 인프라를 전제로 하는 환경에서는 작업환경 자체를 AWS의 VPC에 하나의 app-server로서 VPN을 통해 접속해 소스 개발은 로컬에서 해결을 보는 구성을 전제로 생각하고자 한다.

개인 개발 단계에서는 VPN의 이용은 비용이 발생하는 부분이라 나중 작업이 될듯 하지만, 어느쪽이든 로컬에 파일을 두고 작업을 진행하는 환경을 전제하고자 한다.

따라서 여기서의 웹스톰 디버깅은 본래 제공되고 있는 로컬앱 디버깅까지만 체크하고자 한다.

수순

1. version control된 소스를 전개한 프로젝트를 작성

2. 하기 위치에서 실행 구성을 설정


3. 앱 실행 설정의 예시
    처음엔 디폴트 설정뿐이므로, 
    왼쪽위 + 버튼을 눌러 Node.js타입의 실행구성을 추가한다.



--silly는 sailsjs의 디버깅레벨의 최하단에 위치하는 디버깅 모드이다.
필요에 따라서만 지정. 지정하지 않은 경우는 config에 설정된 내용대로 동작한다.

4. 브라우저 런처 추가


5. 작성한 실행구성을 선택후


아래 버튼을 통해서 



일반 실행이나, 디버깅모드로 실행

6. 소스상의 실행가능한 구역에 breakpoint를 설정한 후, 브라우저에서 breakpoint구간을 통과하는 endpoint에 접근. 아래처럼 디버거뷰에서 break가 걸리는 것이 확인 가능하다.

2014년 12월 14일 일요일

AWS EC2에 mongodb를 인스톨

개요

AWS EC2인스턴스의 yum을 통한 mongodb의 인스톨
기본 yum-repository에는 mongodb가 존재하지 않는다.
추가적인 mongodb를 위한 repository를 추가한 후, mongodb를 인스톨.

참고자료

http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/

수순

1. mongodb repos의 추가


/etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
상기 내용을 추가함. 64bit 시스템 기준이므로 이와 다를경우 상기 참고자료에서 32비트용 설정값을 가져올 것

2. yum installation

이후에

sudo yum install mongodb-org

로 최신버전을 인스톨 가능.

service mongod start
chkconfig mongod on


3. GUI Administration

http://robomongo.org/

비인증 상태로 접근시 Authentication skipped by you라고 뜨며 x마크가 쳐지는데,
인증을 따로 설정을 안했다면 x라 떠도 정상상태로 접근이 가능하다.

4. CLI Administration

mongo

5. 처음 기동시에 접근권한

인증없는 상태로 기동하려면 일시적으로 mongod --noauth로 서버를 기동한후 클라이언트로 접근하면 비인증 상태에서 접근이 가능하다. 이 상태에서 유저를 추가하는 작업을 실시

trusted환경하에 인증없이 데이터를 주고받는게 좋을거라 생각되나, 인증이 필요한 경우에는 --auth모드로 서버를 기동하여 접근권한을 제어할것.

sails.js 도입 수순

개요

rails-like인 sails.js개발과정을 간략하게 정리

전제
nodejs가 인스톨 된 환경

수순

sails.js의 인스톨
npm install sails -g

sails.js로 새 프로젝트 만들기
쉘에서 특정 폴더 이하에

sails new {project name}

새로운 컨트롤러 추가 (모델도 추가됨)

sails generate api {controller name}

DB 커넥션 설정

connections.js에서 DB 접속등의 설정을 실시함.
sails는 waterline이라고 하는 ORM환경에서의 데이터베이스 접근환경을 제공하고 있으며
DB별로 구현된 ORM이 존재한다.

우선적으로 mysql, mongodb, redis를 이용해보고자 하므로로 아래와 같이 설치를 진행

app에 대해 한정적으로 인스톨을 진행하고자 하므로 -g옵션을 붙이지 않음
sails project folder에서 아래를 실행

npm install sails-mysql
npm install sails-mongo
npm install sails-redis

이후에 connections.js에서 나온 설정등을 참고로하여 접속정보를 설정.

Redis의 설정

Load balancer를 이용하는 환경 등에서는 세션정보나 Socket.IO정보 등을 Redis등을 통해 필요 메모리를 공유할 필요가 있음.

./config/sockets.js에서 socket.io에 대한 redis를 설정.

adapter: 'redis',
host: '127.0.0.1',
port: 6379,
db: 'sails',
pass: '<redis auth password>'

./config/session.js에서 세션에 대한 redis를 설정

adapter: 'redis',
host: '127.0.0.1',
port: 6379,
db: 'sails',
pass: '<redis auth password>'

Sails app의 기동

sails lift

추기

설치 초기에 RESTful API가 설정된 상태임
기본 설정 DB에 대한 CRUD이용이 가능해져버리는 상태이니
필요에 따라

./config/blueprints.js

에서 RESTful API에 대한 설정을 off로 하는 설정이 있음을 기억해두자.

Amazon Linux에서 nodejs / sails.js / meteor.js 도입

개요

한동안 맥에서 서버개발을 진행하다 막상 Amazon Linux에서 작업하려니 yum패키지에 포함되어있지 않은 것을 확인. 소스빌드로 설치하는 수순을 메모

참고자료

http://iconof.com/blog/how-to-install-setup-node-js-on-amazon-aws-ec2-complete-guide/#installNode


수순

cd /usr/local/src
git clone git://github.com/joyent/node.git

git checkout v0.10.33 #현 시점에서 최신 stable release

cd node
./configure
make && make install


#--------

npm install forever -g
npm install sails -g
npm install meteor -g

2014년 12월 12일 금요일

Jenkins + Unity3D

개요

Jenkins의 플러그인중, 유니티빌드를 지원하는 플러그인이 존재한다.
OSX Local에 Jenkins를 도입한후, Unity3DBuilder plugin을 이용해 빌드를 자동화한다.

전제
OSX를 이용하는 Unity Pro(Basic은 무리. 하기 기록을 참고)개발환경

참고자료

https://wiki.jenkins-ci.org/display/JENKINS/Unity3dBuilder+Plugin

도입수순

Jenkins OSX Installer를 통한 인스톨

인스톨이 완료된후 http://localhost:8080/ 로 접근하여 대쉬보드를 확인

필요한 플러그인을 인스톨

플러그인의 인스톨은 Jenkins 대쉬보드에서

Jenkins > UpdateCenter > Manage Plugins > Available

에서 선택후 인스톨 할 수 있음(GUI상만으로 가능)

Jenkins > Configure System > Unity3D

에서 유니티 앱을 추가.
(이름(임의)와 유니티 에디터 앱의 로컬 패스를 지정해야함. 이 부분 때문에 Linux상에서의 구성은 힘든가...?)

사용수순

유니티 프로젝트를 Jenkins로 빌드함에 앞서, 아래의 사전준비가 필요하다.

https://wiki.jenkins-ci.org/display/JENKINS/Unity3dBuilder+Plugin#Unity3dBuilderPlugin-Prerequisites

아래의 스크립트가 프로젝트상에 존재할 필요가 있다.
같은 패스에 스크립트를 작성해 입력.


Assets/Editor/MyEditorScript.cs
using UnityEngine;
using UnityEditor;
using System;
using System.Collections;
using System.Collections.Generic;

class MyEditorScript {
        static string[] SCENES = FindEnabledEditorScenes();

        static string APP_NAME = "YourProject";
        static string TARGET_DIR = "target";

        [MenuItem ("Custom/CI/Build Mac OS X")]
        static void PerformMacOSXBuild ()
        {
                 string target_dir = APP_NAME + ".app";
                 GenericBuild(SCENES, TARGET_DIR + "/" + target_dir, BuildTarget.StandaloneOSXIntel,BuildOptions.None);
        }

 private static string[] FindEnabledEditorScenes() {
  List<string> EditorScenes = new List<string>();
  foreach(EditorBuildSettingsScene scene in EditorBuildSettings.scenes) {
   if (!scene.enabled) continue;
   EditorScenes.Add(scene.path);
  }
  return EditorScenes.ToArray();
 }

        static void GenericBuild(string[] scenes, string target_dir, BuildTarget build_target, BuildOptions build_options)
        {
                EditorUserBuildSettings.SwitchActiveBuildTarget(build_target);
                string res = BuildPipeline.BuildPlayer(scenes,target_dir,build_target,build_options);
                if (res.Length > 0) {
                        throw new Exception("BuildPlayer failure: " + res);
                }
        }
}
---

[Jenkins상의 특정 프로젝트] > Configure > Build
에서 위에서 정의한 유니티앱의 종류(이름으로 선택)를 지정후, 빌드옵션을 지정. 빌드 옵션에는 하기 옵션을 추가.

-quit -batchmode -executeMethod MyEditorScript.PerformMacOSXBuild 

상기옵션은 unity3dbuilder에서 기본적으로 제공하는 옵션이다.
구체적으론 아래의 공식문서를 참고하는게 좋을듯.

http://docs.unity3d.com/Manual/CommandLineArguments.html

-executeMethod가 내부에 작성된 코드를 호출할 수 있는 부분인듯 하다.
이 기능을 응용하면 이전부터 불편하게 느꼈던 AssetBundle의 일괄작성과 같은 부분의 기능도 커맨드라인 상으로만 구축이 가능할거 같이도 보인다.

또한 OSX를 기준으로 했을때는 권한에 관련된 문제가 발생함.

_RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL. 2014-12-12 00:01:53.560 Unity[88456:d07] NSDocumentController Info.plist warning: The values of CFBundleTypeRole entries must be 'Editor', 'Viewer', 'None', or 'Shell'.

위 문제에 관해서는

 http://la-stranger.tistory.com/entry/unity-jenkins-autobuild2

상기 투고의 Jenkins Slave Agent작성부분을 참고.
Jenkins Slave Agent로 빌드를 실시하는 경우 Java Slave가 빌드를 수행하게끔 해줄 필요가 있음. master node agent로 빌드를 지속할 경우에는 여전히 문제가 발생.

http://serverfault.com/questions/359793/tell-jenkins-to-run-a-specific-project-on-a-particular-slave-node 

따라서 위의 답변내용을 참고로 하여 NodeLabel Parameter 플러그인을 인스톨한후, 특정 슬레이브 노드가 접속중일때만 빌드를 실시하게끔 할 필요가 있음.

또한...
대부분의 현장의 개발환경이라면 UnityPro가 당연한 환경일거라 생각되지만
현재 basic으로 테스트하고 있는 환경에서는 아래와 같은 문제가 확인되었다.

Exception: BuildPlayer failure: Building Player from editor scripts requires Unity PRO 

적어도 Jenkins를 이용하려면 프로 라이센스가 요구되는듯.

http://docs.unity3d.com/ScriptReference/BuildPipeline.BuildPlayer.html

위 url에서 문제가 되는 기능을 확인할 수 있다.

-----------

우선 상기 상태에서 유니티를 일시적으로 30일 체험판모드로 구동후, 빌드를 시험해보았고 NGUI 3.6버전이 들어간 샘플을 하나 빌드씬에 추가한 상태에서 빌드해본 결과, 빌드가 가능했다.

단, 아래의 메세지로부터 동일 프로젝트를 열어둔 상태에서의 CI빌드는 불가능해보인다.

Multiple Unity instances cannot open the same project.

빌드 노드 머신을 따로 분리하던지 할 필요성이 있는듯.

-----------

추가적으로 코드품질 관리를 위한 코드복잡도계산 관련의 플러그인을 살펴보았다.

우선 될거같아 보였던 CCM Analysis Plugin

https://wiki.jenkins-ci.org/display/JENKINS/CCM+Plugin

결론부터 말하자면 Unity에선 못쓸거같다.

.NET을 위한 코드복잡도 리포트 기능이고,
using UnityEngine;
이라는곳에서부터 걸리는듯

Cleanup mono
debugger-agent: Unable to listen on 6
Exiting batchmode successfully now!
[CCM] Collecting CCM analysis files...
[CCM] Finding all files that match the pattern **/*.cs
[CCM] Parsing 219 files in /Users/ruel/Jenkins/slave/workspace/ngui_samples
[CCM] Parsing of file /Users/ruel/Jenkins/slave/workspace/ngui_samples/Assets/Editor/MyEditorScript.cs failed due to an exception:

org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 1; Content is not allowed in prolog.
 at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
 at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
 at org.apache.commons.digester.Digester.parse(Digester.java:1916)
 at hudson.plugins.ccm.parser.CcmParser.parse(CcmParser.java:90)
 at hudson.plugins.analysis.core.AbstractAnnotationParser.parse(AbstractAnnotationParser.java:53)
 at hudson.plugins.analysis.core.FilesParser.parseFile(FilesParser.java:323)
 at hudson.plugins.analysis.core.FilesParser.parseFiles(FilesParser.java:281)
 at hudson.plugins.analysis.core.FilesParser.parserCollectionOfFiles(FilesParser.java:232)
 at hudson.plugins.analysis.core.FilesParser.invoke(FilesParser.java:201)
 at hudson.plugins.analysis.core.FilesParser.invoke(FilesParser.java:31)
 at hudson.FilePath$FileCallableWrapper.call(FilePath.java:2677)
 at hudson.remoting.UserRequest.perform(UserRequest.java:121)
 at hudson.remoting.UserRequest.perform(UserRequest.java:49)
 at hudson.remoting.Request$2.run(Request.java:324)
 at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:68)
 at java.util.concurrent.FutureTask.run(FutureTask.java:266)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 at hudson.remoting.Engine$1$1.run(Engine.java:63)
 at java.lang.Thread.run(Thread.java:745)

-----

2014년 12월 11일 목요일

Apache 2.4 + Gitweb

개요
http/https protocol넘어로 git환경을 제공하기 위해 gitweb을 설정함.
기본적으로 push에 관해서는 http에서는 실시하지 않는 것으로, 어디까지나 외부의 공개나 부분적으로 key를 배포하고 싶지 않은 환경하에서 ip제약적으로 clone시키고 싶을 경우를 위한 http도입.

전제
apache 2.4

참고자료

https://wiki.archlinux.org/index.php/gitweb#Apache_2.4
http://git-scm.com/book/ko/v1/Git-%EC%84%9C%EB%B2%84-GitWeb

각 패스에 대한 설명

/gitweb : symbolic link collections to make public repository
/git : all the git repositories

수순

yum install gitweb

설정 파일 구성


/etc/gitweb.conf 
our $projectroot="/gitweb";

/etc/httpd/conf.d/git.conf 
<VirtualHost *:80>

ServerName git.???????.com

SetENV GIT_PROJECT_ROOT /gitweb
SetENV GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER

ScriptAliasMatch \
        "(?x)^/git/(.*/(HEAD | \
                        info/refs | \
                        objects/(info/[^/]+ | \
                                 [0-9a-f]{2}/[0-9a-f]{38} | \
                                 pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
                        git-(upload|receive)-pack))$" \
        /usr/libexec/git-core/git-http-backend/$1

Alias /git /var/www/git

#grant pull
<LocationMatch "^/git/.*$">
  AllowOverride All
  Require all granted
</LocationMatch>

#block push
<LocationMatch "^/.*/git-receive-pack$">
  AllowOverride All
  Require all denied
</LocationMatch>

<Directory /var/www/git>

  Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch

  AllowOverride All
  Require all granted

  AddHandler cgi-script .cgi
  DirectoryIndex gitweb.cgi

</Directory>



</VirtualHost>




----