제목이 뭔가 거창한데, 그냥 소스파일을 그대로 원하는 웹서버에 배포하는 내용입니다. java 개발인 경우에는 뭐 필요없지만, php인 경우에는 컴파일이 필요없이 웹서버에 복사만 하면 되는 경우라 이 방법을 택했습니다.
개인별로 개발하고 푸쉬타임에 해당 웹서버에 배포하게 되어서 서버에서 테스트해볼 수 있는 구조를 만드려고 했습니다.

환경은 gitolite + gitlab으로 설치되어 있는 환경입니다.

구조는 간단합니다.
배포하려는 서버에 git을 clone을 합니다. 그리고, 서버훅을 이용해서 push 후에 스크립트를 실행할 수 있는 스크립트를 실행해서 그 서버에서 pull을 하거나 reset을 하면 됩니다.
이 구조는 git서버, 배포서버, 로컬 이렇게 다 나눠진 경우입니다.

1. 배포할 서버에 git서버 공개키 추가
이걸 하는 이유가 서버와 git서버가 틀린 경우에 하는 겁니다. git서버에서 해당 배포서버에 비번없이 접속하려고 하다보니 ssh키가 필요합니다.
git서버로 접속해서 ssh키를 생성합니다.

sudo su git
ssh-keygen -t rsa
cd ~/.ssh
cat id_rsa.pub

id_rsa.pub 파일을 복사해서 배포할 서버의 ~/.ssh 디렉토리 안에 authorized_keys 파일을 생성해서 붙여넣습니다. 그럼 이제, git -> 배포서버에서 ssh접속 시 비밀번호 없이 접속할 수 있습니다.

2. 해당 서버에 공개키를 git서버에 추가
이걸 하는 이유는 해당 서버에서 git서버에서 clone을 받아야 하기 때문입니다. 즉 서로 등록이 필요한 것이죠. 으핫. 위와 동일한 방법으로 ssh-keygen으로 생성합니다. 그리고 id_rsa.pub파일을 복사해서 authorized_keys파일에 추가합니다. gitlab을 사용하고 있다면 사용자 ssh키 등록만 해주면 되겠죠?


3. 해당 배포 디렉토리에 git clone하기
소스가 있는 git repository를 해당 배포할 디렉토리에 clone을 합니다. 저는 일단 아파치 기본 폴더에 했습니다. 일단 clone 시에는 다 지워야해서... 다 지우고 clone!

cd /var/www
rm -rf *
cd ..
git clone 해당git주소(ex:git@domain:mudchobo.git) www

이렇게 하면 /var/www가 해당 repository가 되어버립니다. 루트가 되어버리는 것이죠.

4. hooks 설정
일단 해당 서버에 pull을 하는 스크립트를 작성해서 스크립트가 실행될 수 있게 합니다.

vi /var/www/pull.sh
cd /var/www/
git pull origin
:wq
chmod +x pull.sh

gitolite로 설치를 해서 해당 서버훅을 사용하려면 git계정으로 접속하면 repositories 디렉토리에 hooks 관련 스크립트 디렉토리가 있습니다. 여기서 post-update 스크립트에 넣으면 client에서 push를 할 때 실행되게 됩니다.

cd /home/git/repositories/mudchobo.git/hooks
vi post-update
ssh mudchobo@서버주소 "/var/www/pull.sh"
:wq

여기서 post-update를 한 번 실행을 해줘서 신뢰할 수 있는 사이트에 등록을 해줘야합니다. 스크립트 실행 시 한번에 다 실행이 되야해서 yes/no 물음이 없어야 하거든요. 그래서 한번 실행해서 신뢰할 수 있는 사이트에 등록합니다.

5. 클라이언트에서 push하기
이제 다른 pc에서 push하면 바로 해당 서버에서 자동으로 pull이 되게 됩니다. 그래서 push타임에 서버에 배포되는 것처럼 되는 것이지요.

vi index.php
<?php
    phpinfo();
?>
:wq
git add .
git commit -m "index add"
git push origin
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 282 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: From localhost:mudchobo
remote:    3455f24..308e01a  master     -> origin/master
remote: Updating 3455f24..308e01a
remote: Fast-forward
remote:  index.php |    1 +
remote:  1 file changed, 1 insertion(+)
To git@192.168.198.130:mudchobo.git
   3455f24..308e01a  master -> master

저희는 일단 이렇게 쓰려고 지금 셋팅을 하고 있는데.....제대로 된 것이 맞는지 의문이네요. 하다가 잘 안되면 다시 방법이 바뀔지도......ㅠㅠ

 
Posted by 머드초보
,
 

회사에서 git를 도입하려고 하는데, 그래서 막 조사하다보니 github enterprise같은 게 있더라구요. 근데, 이건 한 달에 $20 금액을 내야해서 너무 비쌌습니다. 그래서 오픈소스로 github같은 UI의 툴이 있더라구요. 그게 GITLAB입니다.

이거 근데 설치하는데 너무 힘들어서.......설치하다가 빡칠 뻔했습니다. 근데, 회사에선 오래 걸렸는데, 집에서 다시 와서 차근차근 해보니 금방 설치했네요. 뭔가 좀 이해를 하고 설치를 하니까 금방 설치한 것 같네요.

아 우분투는 최신버전인 12.04 버전을 사용했습니다.

gitlab 사이트입니다.
http://gitlabhq.com/
보면 사이트에서 Try It을 하면 체험할 수 있어요.

아래 문서는 gitlab 공식 설치 페이지입니다.
https://github.com/gitlabhq/gitlabhq/blob/master/doc/installation.md

이 문서대로 보고 하면 잘 되야는데, 저 같은 경우에는 뭔가 삑사리가 몇 번 났습니다. 뭔가 설치가 안되어있다고 자주 떴는데, 그래서 이것저것 모아보니 apt-get install로 이것저것 많이 설치해줘야 하더라구요.
제가 설치한 히스토리를 정리합니다.

요거 아래 것처럼 이렇게 많이 설치합니다.

sudo apt-get install build-essential git-core wget curl gcc checkinstall libxml2-dev libxslt-dev sqlite3 libsqlite3-dev libcurl4-openssl-dev libreadline-dev libc6-dev libssl-dev libmysql++-dev make build-essential zlib1g-dev libicu-dev redis-server openssh-server python-dev python-pip libyaml-dev

그 다음 공식사이트에서 제공하는 루비 + gitolite를 한번에 설치해주는 스크립트를 실행합니다.

curl https://raw.github.com/gitlabhq/gitlabhq/master/doc/debian_ubuntu.sh | sh

근데, 저 같은 경우에는 마지막에 뭔가 퍼미션 에러랑 패스에러가 같이 나면서 설치가 잘 안된 것 같았습니다. 그래서 이 부분을 다시 했습니다. 이런 에러가 떴었어요.

 ***** WARNING *****
gl-setup is not in your $PATH.

Since gl-setup MUST be run from the PATH (and not as src/gl-setup or such),
you must fix this before running gl-setup.  The simplest way is to add

    PATH=/home/git/bin:$PATH

to the end of your bashrc or similar file.  You can even simply run that
command manually each time you log in and want to run a gitolite command.

그래서 패스잡아주는 게 잘 안된 것 같아 .profile만드는 부분 부터 다시 했습니다.

sudo -u git sh -c 'echo "PATH=\$PATH:/home/git/bin\nexport PATH" > /home/git/.profile'
sudo -u git -i -H /home/git/gitolite/src/gl-system-install
sudo cp /home/gitlab/.ssh/id_rsa.pub /home/git/gitlab.pub
sudo chmod 777 /home/git/gitlab.pub

sudo -u git -H sed -i 's/0077/0007/g' /home/git/share/gitolite/conf/example.gitolite.rc
sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gl-setup -q /home/git/gitlab.pub"

sudo chmod -R g+rwX /home/git/repositories/
sudo chown -R git:git /home/git/repositories/


sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin
sudo rm -rf /tmp/gitolite-admin

해보니 테스트로 잘 받아지고, 잘 삭제가 되었습니다.
그 다음 문서에 4단계부터 하는 것은 그대로 진행하면 잘 됩니다.

sudo gem install charlock_holmes
sudo pip install pygments
sudo gem install bundler
cd /home/gitlab
sudo -H -u gitlab git clone git://github.com/gitlabhq/gitlabhq.git gitlab
cd gitlab
sudo -u gitlab cp config/gitlab.yml.example config/gitlab.yml
sudo -u gitlab cp config/database.yml.sqlite config/database.yml
sudo -u gitlab -H bundle install --without development test --deployment
sudo -u gitlab bundle exec rake gitlab:app:setup RAILS_ENV=production

이렇게 하면 설치가 잘 됩니다. 또 저 같은 경우에는 pygments 설치하다가 잠시 다운로드 에러가 나서 안된 경우도 있었는데, 에러가 났는지 잘 확인하시고, 에러나면 다시 시도해서 하면 될 것 같습니다.

그 다음 서버를 시작하면 끝입니다.

sudo -u gitlab bundle exec rails s -e production -d


http://서버ip:3000/ 하면 로그인 하라고 뜨고, 로그인 아이디와 비번은 db셋팅할 때 나오는 것처럼
admin@local.host
5iveL!fe
하면 됩니다.

PS. 블로그를 보니 5월 22일에 3.0릴리즈를 준비중인 것 같은데, 코드를 최적화해서 할 것 같은데, 설치도 간편하게 만드는 게 더 중요할 듯?ㅠㅠ

 
Posted by 머드초보
,
 
최근 자바스크립트가 급부상하면서 자바스크립트 관련된 책을 여러 개 읽고 있습니다. 진짜 보면서 느끼는 게 내가 지금까지 병신같이 개발해왔구나 라는 생각이 많이 드네요.

   
JavaScript자바스크립트성능최적화
카테고리 컴퓨터/IT > 프로그래밍/언어
지은이 니콜라스 자카스 (한빛미디어, 2011년)
상세보기

보니까 야후에서 YUI라는 라이브러리가 있는데, 그걸 만든 사람이 쓴 것 같아요. 그걸 만든 사람 시리즈 중에 자바스크립트 패턴이라고 있는데, 그것도 같이 보고 있어요.

일단, 다 읽어보면 매우 기본적인 내용을 바탕으로 하고 있습니다. 이렇게 쓰면 더 빠르다는 것을 주로 강조를 하며 빠르게 사용할 수 있는 여러 방법을 제시합니다. 보면 대부분 매우 간단하거나 쉽게 적용할 수 있는 내용이 많습니다. 이런 것들을 하나하나 모으면 사이트가 정말 최적화가 잘 되겠죠. 좋은 책인 것 같습니다. 그래서 우리가 만든 사이트들이 너무 느리다는 것을 이 책을 읽고 깨닫게 되었죠ㅠㅠ

1. 로딩과 실행
첫번째 장에서는 스크립트 위치와 로딩하는 순서에 대해서 간단히 얘기합니다. 보면 동적으로도 로딩하는 방법이 나옵니다. 이런 식으로도 스크립트를 삽입할 수 있는지 몰랐네요. 뭐 결론은 스크립트 태그를 포함하는 파일을 최소화하고 UI표시에 영향을 주지 않게 하는 것이 가장 큰 목적이겠네요.

2. 데이터접근
Javascript 코딩할 때 this가 짜증나서 전역변수를 선언해서 그냥 쓰거나 매번 document에 접근해서 쓰거나 뭐 이런 식의 코딩을 많이 했는데, 이런 전역변수를 계속 쓰게 되면 엔진이 스코프를 뒤지면서 계속 찾아야하니 느려진다는 것입니다. 그래서 지역변수를 주로 쓰는 것을 말하고 있고, 객체멤버 깊이도 줄여서 선언 및 사용해야 한다는 것을 설명하고 있네요.

3. DOM 스크립팅
DOM을 컨트롤하기 위해서는 DOM을 객체에서 찾거나 생성해야 해요. 찾으려면 selector를 통해 찾아야하고, 생성하려면 createElement를 통해 생성해야 해요. 그래서 이 책이 얘기하는 것은 비표준이더라도 innerHTML이나 querySelectorAll같은 함수를 활용하여 처리하는 게 빠르게 해결할 수 있는 것이라고 하네요. 그 외에 리페인트와 리플로우 개념에 대해서는 꼭 이해를 하고 가야 더욱 빠르게 dom을 추가하고 수정할 수 있다는 걸 설명하네요.

4. 알고리즘과 흐름 제어
루프는 뭐 다 비슷한데, 반복문이라면 length값 캐쉬하는 게 가장 중요합니다. 그 외에 반복횟수 줄이거나 그런 것들은 여러 프로그래밍 개발 언어에서도 충분히 적용될만한 내용이네요. 재귀함수(전 재귀가 싫어요.....-_-)에 대해서 캐쉬를 하는 메모이제이션 내용도 뭐 다른 프로그래밍 개발에도 잘 쓰이는 내용이네요.

5. 문자열과 정규 표현식
정규식은.......좀 더 공부를 해봐야겠습니다......

6. 응답성좋은 인터페이스
클릭과 동시에 반응하는 웹이야 말로 제대로 된 웹이겠지요. 뭐 html5의 내용인 웹워커 내용이 있는데, 이건 뭐 적용할 수 없죠. IE에서 지원을 안하니... 내용은 타이머를 통해 오래걸리는 처리는 처리에 맡기고 반응은 타이머콜백을 통해 빨리빨리 보이겠다는 것입니다. 근데 내용을 좀 이해할 수 없군요....-_- 좀 더 읽어봐야겠네요...

7. Ajax
일반적인 ajax내용이고, 비콘이라는 Image태그를 이용해서 서버에 보내는 재미있는 내용이 있네요. 그냥 단순히 쏘기만 할 때 좋은 듯. 그 외에 데이터포맷은 뭐가 빠른지에 대해서 설명이 되어있네요. json이 역시 짱이죠 ㅇㅇ

8. 프로그래밍 사례
eval, function 뭐 이런거 앵간해서는 쓰지말고, 객체 배열 리터럴 쓰고, 작업을 반복하지 말고, 뭐 읽어보면 매우 간단한 내용들이 있는데, 우리들이 개발하다보면 빨리 개발하다가 지나칠 수 있는 내용들이 많이 있습니다. 그리 어렵지 않으니 잘 읽고 잘 적용하면 좋을 듯 합니다.

9. 고성능 자바스크립트 애플리케이션 빌드와 배포
js 압축에 대해서 다룹니다. 뭐 압축하면 용량도 줄어들고, 변수명도 바뀌니 빨라지겠죠

10. 도구
여러 도구를 소개하고 있습니다. YUI 개발자들이라고 YUIProfiler도 소개하고... 도구는.....파이어버그, 크롬개발자 도구 이런 게 짱이죠.


PS. 크롬은 정말 성능이 좋은 것 같습니다. 그래서 제가 그지같이 개념없이 JS개발을 해도 크롬은 그걸 다 받아주며 빠르게(?) 동작시켜줘서 너무 고마웠네요. 근데, 확실히 IE에서는 느려요ㅠ 이 책을 교훈삼아 IE에서도 빠르게 동작하는 자바스크립트 개발을 해야겠네요.
 
Posted by 머드초보
,
 
주말에 이렇게 헛되이 보내지 않고, 이런 행사를 다녀와서 너무 좋네요~ 개발자들을 위한 행사가 점점 더 많아졌으면 좋겠네요. 혼자서 최신 기술이나 동향에 대해서 조사하는 것은 너무 힘들거든요~ 여기오면 매번 좋은 정보를 많이 얻고 가서 좋은 것 같습니다.

그러나, 요즘 제가 공부를 너무 게을리한 탓에... 여러 세션 제목들이 무엇을 말하려는지 감이 잘 안오더라구요. 여러 편리한 툴들과 새로운 프레임워크 등을 많이 알고 간 것 같습니다. 그리고 제가 들은 세션은 대용량관련된 세션이라 캐쉬관련된 내용도 많이 들었던 것 같네요. 얼른 공부를 시작해야겠네요 핫핫~ 못들은 세션에 대해서 PT자료를 공유하겠죠? 얼른 PT자료를 받았으면 좋겠네요^^

제가 들은 세션은 대략 이런 내용이였습니다.


1. 아키텍트가 알아야할 12/97가지

97가지가 있었던 것 같은데, 12가지만 얘기를 하신 것 같네요. 주로 정말 당연한 얘기지만, 잘 지켜지지 않은 것들에 대해서 말씀을 잘해주셨어요.
Vasa호 얘기는 우리 소프트웨어구조에 정말 잘 맞는 비유였던 것 같아요. 물론 소프트웨어는 배와 달라서 모든 것을 잘 만족시키게 만들 수는 있지만, 우선순위를 중요시하고 이 프로젝트의 목표에 대해서 정확하게 이해를 해야 좀 더 나은 프로젝트가 탄생할 것 같습니다.
그리고 가장 공감이 갔던 것이 걸어다니는 해골인데, 확실히 어느정도 돌아가는 구현체를 보여줘야 거기에 대한 피드백이 나오면서 좀 더 완전체로 다가가는 것 같습니다.
그리고 아키텍트는 너무 멀리도 가까이도 보지말고 적당히 봐야한다는 1000피트의 뷰도 공감이 갔던 것 같고... 그리고 아키텍트입장에서 좋은 툴을 하나 소개해줬는데, STAN 인가.. 대략찾아보니 이거 같네요.
http://stan4j.com/
이걸로 해당 프로젝트의 구조를 분석하고 잘못된 것을 알려주는 툴 같습니다.
그 외에 가장 중요한 것은 사람중심의 관한 것이기에... 사람들관의 커뮤니케이션, 대화가 참 중요하다는 것을 강조한 것 같습니다.
앞으로 저도 레베루가 올라가면서 아키텍트로 다가가게될텐데 저에게 참 도움이 되는 내용이였네요.


2. JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링

JBoss는 어디서 많이 듣긴했는데 무슨 제품인 줄 알았는데, 그게 아니더군요. JBoss는 자바를 기반으로 하는 오픈소스 미들웨어의 총칭이라고 하네요.
http://ko.wikipedia.org/wiki/%EC%A0%9C%EC%9D%B4%EB%B3%B4%EC%8A%A4
JBoss에는 여러 미들웨어가 있더군요. 그 중 Hibernate도 있네요. 원래 여기였는지 여기로 옮긴건지 모르겠지만, WAS도 있고....
이 중에 RHQ와 Byteman이라는 것을 소개했는데, RHQ는 운영서비스모니터링툴이였고, Byteman은 JVM을 bytecode로 들여다보는 것이라고 했습니다.
RHQ는 뭐 흔한 웹서버의 모니터링 툴인 것 같은데, Byteman이라는 것에 대해서 좀 신기했습니다. 애플리케이션을 개발하게 되면 그 애플리케이션을 실행하는 JVM을 통해서 메소드의 시작과 끝을 캐치를 한다던가 하는 룰을 입력하면 그것대로 모니터링을 할 수 있는 툴인 것 같습니다. 제 설명이 뭐 이상하지만 나중에 PT를 보시면 쉽게 이해가 갈 겁니다ㅠ
RHQ의 모니터링UI는 참으로 이뻤으며, Byteman의 동작원리는 놀라웠다는 느낌을 받은 발표였네요.


3. 초보자를 위한 분산 캐시 활용 전략

음......이때부터 좀 졸리더니....내용이 잘 생각이 안나네요ㅠ 분명 Memcached얘기가 좀 나온 것 같은데... 변화하는 데이터와 변화하지 않는 데이터를 잘 나눠라는 것과 디비의 저장할 때 해쉬얘기도 좀 나온 것 같은데, 기억이 잘 안나네요. Radis라는 것도 나온 것 같은데, 이건 뭔지 모르겠네요. DB인가...역시 아직 대용량과 캐쉬에 대해서 너무 모르는 부분이 많네요ㅠㅠ


4. 대용량 고가용성 분산 캐쉬서버(infinispan)를 활용한 웹서비스

이건 분산캐쉬서버인 inifinispan이라는 것을 소개하는 시간이였는데요. 이것도 JBoss에서 크고 있는 오픈소스네요^^ JBoss에는 참 훌륭한 제품들이 많은 듯!
실제로 구현체로 예를 들어 보여주시니 더욱 이해가 잘 되었던 것 같네요. 실제로 많은 요청에 의해서 매번 db를 접속해서 가져오다가, 실제로 해당 제품을 이용해서 캐시를 이용하는 것을 보여주었어요. 게다가 세션유지되는 것도 보여주었고...
해당 소스를 github에 올리셨다던데 주소가 어딘지 모르겠네요. 나중에 PT나오면 보고 해봐야겠네요ㅠ


5. 스타트업을 위한 Rapid Development

Play! Framework를 소개하는 것 같네요. php나 Ruby On Rails만큼 쉽게 개발할 수 있다는 것을 말씀하셨네요. 작년에 JCO를 통해서 처음 들었던 프레임워크인데, 요즘 많이 뜨고 있나봐요. 여기저기 몇 번 들은 기억이 나네요. 어떤 것인지 한 번 봐야겠네요.
http://www.playframework.org/
뭐 그냥 play framework를 소개하는 자리였습니다. 음......그래도 전 php로 게시판 만드는 게 가장 빠른 것 같습니다-_-

끝나고 경품 추첨! 역시...되지는 않습니다! 하지만! 이번에 사전 이벤트인 블로그 트랙백 이벤트에서 당당히 당첨되었습니다! 그래서 리얼포스키보드를 받게 되었어요!ㅠ 관계자분들 감사합니다~

그런데, 부스에서 기념품을 주는 곳이 많이 줄어든 느낌입니다ㅠ

ps. 저는 오라클에서 준 스마트폰 거치대 목걸이가 가장 맘에 드네요. 스마트폰을 거치하고 목에 걸수도 있다니...-_-

 
Posted by 머드초보
,
 
이거 제가 쓰려고 만들었었는데, 이어 받기도 되고, 더 좋은 파일서버가 많아서 만들다가 포기했던.....
최근에 Adobe AIR로 개발할 일이 생겼는데, HTML + Javascript 구조로 가져가면 유지보수도 편하게 할 수 있고, Javascript공부에 더 좋을 것 같아서 일단 기록해둡니다.... 

html+js로 Adobe AIR는 개발을 안해봤는데, 해보니까 그리 어렵지도 않고, 기존 ActionScript3 클래스를 그대로 포팅이 되어서 그걸 air.클래스명 해서 그대로 쓰면 돼서 어렵진 않았네요. 다만 디버깅할 도구가 조금 부족하다는 것이 좀 아쉽습니다.
이걸 이용한 툴이 그나마 드림위버인데, 드림위버는 저랑 맞지 않는 것 같습니다. 그래서 그냥 Aptana3로 개발을 하고, AIR에서 제공하는 AIRIntrospector.js를 이용해서 하니까 디버깅도 그리 불편하진 않네요.

<html>
    <head>
        <title>Simple File Server</title>
        <link rel="stylesheet" type="text/css" href="/css/main.css" />
        <script type="text/javascript" src="/js/lib/AIRAliases.js"></script>
        <script type="text/javascript" src="/js/lib/AIRIntrospector.js"></script>
        <script type="text/javascript" src="/js/lib/jquery-1.7.1.min.js"></script>
        <script type="text/javascript">
       
            // 기본값 지정
            var port = 50000;
            var shareFolder = air.File.documentsDirectory;
            var serverSocket;
            var isStart = false;
            $(document).ready(function(){
                $("#inputPort").val(port);
                $("#inputShareFolder").val(shareFolder.nativePath);
                shareFolder.addEventListener(air.Event.SELECT, selectShareFolderHandler);
                $("#btnStart").click(function(){
                    if (!isStart){
                        try{
                            serverSocket = new air.ServerSocket();
                            serverSocket.addEventListener(air.Event.CONNECT, connectSocketHandler);
                            serverSocket.bind($("#inputPort").val());
                            serverSocket.listen();
                            isStart = true;
                            $(this).attr("value", "중지");
                        } catch(e){
                            alert("에러! = " + e.message);
                        }
                    } else {
                        serverSocket.removeEventListener(air.Event.CONNECT, connectSocketHandler);
                        serverSocket.close();
                        isStart = false;
                        $(this).attr("value", "시작");
                    }
                });
                $("#btnBrowser").click(function(){
                    shareFolder.browseForDirectory("폴더를 선택하세요.");
                });
            });
           
            function selectShareFolderHandler(e){
                $("#inputShareFolder").val(shareFolder.nativePath);
            }
           
            function connectSocketHandler(e){
                var socket = e.socket;
                socket.addEventListener(air.ProgressEvent.SOCKET_DATA, proressSocketHandler);
            }
           
            function proressSocketHandler(e){
                var socket = e.target;
                var bytes = new air.ByteArray();
                socket.readBytes(bytes);
                var request = "" +bytes;
                air.Introspector.Console.log("request = " + bytes);
                var path = request.substring(5, request.indexOf("HTTP/") - 1);
                air.Introspector.Console.log("path = " + path);
                var file = shareFolder.resolvePath(path);
                air.Introspector.Console.log(file.nativePath);
                air.Introspector.Console.log(file.exists);
                if (file.isDirectory){
                    socket.writeUTFBytes("HTTP/1.1 200 OK\n");
                    socket.writeUTFBytes("<html><body><ul></ul></body></html>");
                }
                else if (file.exists && !file.isDirectory){
                    var stream = new air.FileStream();
                    stream.open(file, air.FileMode.READ);
                    var content = new air.ByteArray();
                    stream.readBytes(content);
                    stream.close();
                    socket.writeUTFBytes("HTTP/1.1 200 OK\n");
                    socket.writeUTFBytes("Content-Disposition: attachment;filename=" + path + "\n");
                    socket.writeUTFBytes("Content-Length: " + file.size + "\n");
                    socket.writeUTFBytes("\n");
                    socket.writeBytes(content);
                } else {
                    socket.writeUTFBytes("HTTP/1.1 404 Not Found\n");
                    socket.writeUTFBytes("Content-Type: text/html\n\n");
                    socket.writeUTFBytes("<html><body><h2>Page Not Found</h2></body></html>");
                }
                socket.flush();
                socket.close();
                log(file.nativePath);
            }
           
            function log(s){
                $(".divStatus").prepend("<div>" + s + "</div>");
            }
        </script>
    </head>
    <body>
        포트 : <input type="text" id="inputPort" /><br />
        공유폴더 : <input type="text" id="inputShareFolder" disabled="true"/>
        <input type="button" id="btnBrowser" value="폴더선택"/><br />
        <input type="button" id="btnStart" value="시작"/>
        <div class="divStatus">
        </div>
    </body>
</html>

 각종 air에서 제공하는 js파일들은 여기에 다 있습니다.
AdobeAIRSDK\frameworks\libs\air 

개발관련된 문서는 여기에!
http://www.adobe.com/devnet/air/articles/getting_started_air_js.html 
 
풀소스는 여기에!
https://github.com/mudchobo/SimpleFileServer  

 
 
Posted by 머드초보
,