2014년 1월 27일 월요일

Concept git rebase and example

오전 6:47 Posted by jonnung 1 comment
git으로 코드의 버전관리를 하면서 브랜치 작업을 많이 하게 되는데 사실 난 브랜치 생성을 좀 즉흥적으로 하는 감이 없지 않아 있다.

무언가 작은 것이라도 개발을 할 때는 브랜치 계획을 어느정도 수립해 놓게 되면 느닷없는 브랜칭으로 커밋 로그가 복잡해지는 일은 없을 것 같는 생각이 든다.

브랜치를 사용하면서 개발을 하다 보면 어느 순간에는 머지(merge)를 하기 마련이다.
그런데 예전에 Git 브랜치 배우기을 해보면서 git에 merge와 결과는 같지만 동작 방식이 다른 리베이스(rebase)라는 기능이 있다는 사실을 알게 되었다.
그때 rebase 예제를 풀어보면서 개념 부족으로 상당히 오랜 삽질을 했던 기억이 난다. 윽..

아무튼 일단 rebase와 merge의 차이에 대한 결론부터 정리하자면 아래와 같다.


Merge는 결과를 합치고

Rebase는 과정을 비교하여 결과와 같이 합친다.

rebase와 merge의 차이를 간략하게 알았다면, 언제 rebase를 써야하는 지가 가장 중요하다.

위에서 말 했듯이 브랜치를 merge 하게 되다보면 히스토리가 복잡해지기 마련이다.
rebase를 사용하면 이런 히스토리를 깔끔하게 정리할 수 있는 효과가 있다고 보면 된다.

간단한 예제를 직접 해보면서 rebase와 merge의 차이와 명령어를 좀 더 자세히 알아보겠다.


Base History


일단 merge와 rebase를 비교하기 위해 적당한 히스토리를 만들어 보겠다.
number.txt 라는 새로운 파일을 하나 만든다.
적당히 내용을 입력하고, master 브랜치의 stage영역에 추가(add) 후 커밋(commit)을 했다.
그리고 또 한번 number.txt 파일의 2번 줄의 문장을 변경 하고, 다시 한번 commit을 한다.

123456789
Number content.

이제 2명의 개발자가 각각 브랜치를 만들어 내용을 수정하는 과정을 진행 하겠다.
첫번째 개발자의 브랜치명은 dev-1, 두번째 개발자의 브랜치명은 dev-2로 정했다.

일단 dev-1 개발자가 먼저 파일을 2번 수정하고 각각 2번 commit 했다.

0123456789
Number content!!!

아직까지 dev-2 개발자는 파일을 수정하지 않았다. 그런데 이번에는 master 브랜치에서 파일의 수정이 한번 더 발생 했다. (파일 내용은 생략)

그리고 이제 dev-2 개발자가 자신의 브랜치에서 파일을 수정한다

0123456789
9876543210
10 Numbers contents.

그리고 마지막으로 다시 master 브랜치로 돌아와 새로운 내용을 한번만 더 추가 했다.

123456789
987654321
192837465
Number content.

자 이제 모든 수정이 완료 되었다. 횟수는 적지만 약간 복잡하게 파일 수정이 발생했고, 중간 중간에 master 브랜치의 내용도 수정이 되면서 상황은 점점 악화 되고 있다.

벌써부터 conflict의 그림자가 발밑까지 와있는 느낌이다.

제가 이렇게 히스토리를 만든 이유는 히스토리 그래프를 이해하기 쉽게 만들기 위함과 conflict 발생시 해결하는 과정 그리고 merge와 rebase의 차이점 모두를 담기 위함이 였습니다. 돌 던지지는 마세요. ㅠ_ㅠ)a

현재 상태에서 merge와 rebase를 각각 진행 해보겠다.


Merge


일단 현재 브랜치가 master 인지 확인하고, dev-1 브랜치를 merge 한다.

$ git branch
  dev-1
  dev-2
* master


Cap 2014-01-25 13-27-29-679



$ git merge dev-1

위와 같이 master와 dev-1브랜치 사이에 conflict가 발생했다고 알려준다. 그렇다면 에디터를 열고 number.txt 파일을 원하는 형태로 직접 수정을 해주고 계속 진행을 해야 한다.

<<<<<<<< HEAD
123456789
987654321
192837465
Number content.
=======
0123456789
Number content!!!
>>>>>>> dev-1

'======='을 중심으로 위쪽은 master 브랜치쪽 내용, 아래쪽은 dev-1 브랜치쪽 내용 이다.
123456789
987654321
192837465
Number content!!!

위 결과처럼 dev-1 브랜치의 내용 중 마지막 'Number content!!!'만 병합 하도록 수정 했다.
conflict를 해결하고 머지를 마무리하는 머지 커밋(Merge commit)을 한다.

$ git add number.txt
$ git commit
[master bc64d16] Merge branch 'dev-1'

Cap 2014-01-25 13-58-35-547

그리고 dev-2 브랜치도 위와 동일한 방법으로 master브랜치에 merge 한다.

$ git merge dev-2 
# 에디터에서 Conflict를 해결하고 다시 커밋!

$ git add number.txt
$ git commit
[master 2195143] Merge branch 'dev-2'

Cap 2014-01-25 14-09-07-136


Rebase


이제 rebase를 해보겠다.

이번에는 merge때와 위치하는 브랜치가 다르다는 것을 주의 해야 한다. 아래와 같이 rebase가 되는 토픽 브랜치(Topic)로 checkout 하고 master 브랜치로 rebase를 하도록 명령어를 실행 시킨다.

$ git branch
  dev-1
  dev-2
* master

$ git checkout dev-1
$ git rebase master

Cap 2014-01-25 14-21-04-841



여기서 rebase의 특징이 나오게 된다. Git은 변경 이력을 모두 비교하면서 병합을 시도 하기 때문에 위와 같이 conflict가 발생하는 것을 알려주고 처리 방법을 제안 한다.

123456789
<<<<<<< HEAD
987654321
192837465
Number content.
=======
Number content!!!
>>>>>>> 마침표를 느낌표 3개로 변경

저는 아래와 같이 수정하여 conflict를 해결하고 stage 영역에 올려놓고(add) 다음 rebase를 진행 한다.

123456789
987654321
192837465
Number content!!!


$ git add number.txt
$ git rebase --continue

다음 리비전에서의 conflict도 위와 동일한 방법으로 해결하고 계속 rebase를 진행 한다.

$ git add number.txt
$ git rebase --continue


$ git rebase --skip

Cap 2014-01-25 14-32-27-288
$ git checkout master
$ git merge dev-1

Cap 2014-01-25 14-32-56-525



dev-2 브랜치에 대해서도 위와 동일한 방법으로 master 브랜치에 rebase 한다.

$ git checkout dev-2
Switched to branch 'dev-2'

$ git rebase master


$ git add number.txt

$ git rebase --continue


$ git add number.txt
$ git rebase --continue
Applying: 더 자세한 내용 정의 문장으로 수정


$ git checkout master
Switched to branch 'master'


$ git merge dev-2
Updating bad6d94..258c855
Fast-forward
number.txt | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

Cap 2014-01-25 14-39-35-832

이제 필요 없어진 dev-1과 dev-2 브랜치는 삭제 한다.

$ git branch -d dev-1 dev-2
Deleted branch dev-1 (was bad6d94).
Deleted branch dev-2 (was 258c855).

Cap 2014-01-25 14-40-00-703

위에서 각각 해 본 rebase와 merge는 결과는 같지만 보여지는 커밋 트리들의 차이가 있는 것을 알 수 있다.

2014년 1월 12일 일요일

Git 기본 명령어 정리와 참고하면 좋은 링크 정보

오후 5:01 Posted by jonnung No comments
 작년에 처음 Github를 알게 되면서 Git을 배워볼 기회가 있었다.
개인적으로 진행하는 스터디에 활용을 해보기는 했으나, 당시 회사에서 사용하는 버전관리 프로그램으로 SVN에서 머큐리얼(Mercurial)로 전환하는 시기였다.
그러다 보니 머큐리얼도 학습하게 되었고, 사용하게 되면서 당연히 Git보다는 머큐리얼을 사용하는 비중이 높아졌다.

 하지만 시간이 흐르면서 Github에서 소스 코드를 검색하고, 참고하는 빈도가 증가하는 것을 느끼게 되었다.
 그러면서 드는 생각이 올해는 내가 만든 소스 코드들을 Github에 올려서 전세계 개발자들과 공유하고, 평가 받으며(관심을 끌 수만 있다면..) 핵심적으로는 내가 열정을 갖고 진행하는 것들에 대한 증거를 남기고 싶다는 목표가 생기게 되었다.
 그래서 올 한해 계획을 세우면서 가장 먼저 배우고 능숙하게 다뤄야 하는 기술로 Git을 선정했고, 이번 포스트에서는 Git을 사용하기 위한 기본적인 명령어를 정리해 보았다.

 기본적인 명령어에 대한 구성은 웹 상에서 Git의 기본적인 명령어를 직접 실행해보고, 사용 방법을 배울 수 있는 Code School의 Try Git의 각 단계를 참고 하였다.

 각 명령어에 대한 설명은 Try Git에서 나오는 설명들을 기초로 하였고, 나름 번역을 해보았다.
 Git을 처음 접하는 사람들은 이 포스트를 보는 것 만으로 Git을 사용하기에는 많이 부족할 것이지만 Try Git을 단계별로 학습하면서 참고하면 좋을 것 같다.

Git의 고급 테크닉을 조금 더 능숙하게 다루기 위한 정보를 하나 더 추가 하자면 Git 브랜치 배우기를 추천한다.
Try Git에서 다루지 않지만 Git에서 좋다고 소문난 Rebase와 Cherry pick에 대한 학습에 많은 도움이 되었다.




tryGit

Initializing


Initialize a Git repository

Git 저장소를 생성 한다.

git init


Checking the status


To see what the current state of our project

현재 상태를 확인 한다.

git status


Adding Changes


Notice how Git says 'untracked?' That means Git sees that this is a new file.
추적 되지 않은 새로운 파일이 있다는 의미 한다.

To tell Git to start tracking chang
es made to this file. we first need to add it to the staging area by using git add
파일의 변경 내역을 추적하기 위해 Git의 준비 영역으로 파일을 추가 할 필요가 있다.

git add octocat.txt
git add '*.txt'

Committing All Changes

Notice how Git says 'changes to be committed?' The file listed here are in the Staging Area, and they are not in our repository yet. We could add or remove files from the stage before we store them in the repository.
 git status 명령어로 현재 상태를 확인하면 'changes to be committed'라는 부분을 볼 수 있다.

 여기에 해당하는 파일 리스트는 아직 Git 저장소의 준비 영역에 있는 파일들의 목록이고, 저장소로 보내기 전에 준비 영역에서 추가 하거나 삭제 할 수 있다.

To store our staged changes we run the commit command with a message describing what we've chaged.
준비 영역에서 변경 내역을 저장소로 저장하기 위해서는 남길 메세지와 함께 commit 명령어를 사용한다.

git commit -m "Add cute octocat story"

History

Git's log as a journal that remembers all the changes we've committed so far, in the order we commited them.
Git 로그는 커밋 된 모든 변경 사항에 대한 기록 이다.

git log

Remote Repositories

To push our local repo to the GitHub server we'll need to add a remote repository.
로컬 저장소의 변경 내역을 Github 서버에 push 하기 위해서는 원격 저장소(중앙 저장소)를 추가 해야 한다.

git remote add origin https://github.com/try-git/try_git.git

Pushing Remotely

The push command our local changes to our origin repo (on Github)
push 명령어는 로컬 변경 내역을 origin 이라고 지정한 중앙 저장소로 보낸다.

The name of our remote is origin and the default local branch name is master.
origin은 원격(중앙) 저장소의 이름(닉네임 정도)이고, 기본 로컬 브랜치의 이름은 master 이다.

The '-u' thel Git to remember the parameters, so that next time we can simply run git push and Git will know what to do.
'-u' 파라미터를 추가하면 다음 push 명령어 실행부터는 중앙 저장소와 로컬 브랜치의 이름을 입력하지 않고도 push 할 수 있다.

git push -u origin master

Pulling Remotely

We can check for changes on our Github repository and pull down any new changes.
Github 서버의 변경 내역이 있는지 확인하기 위해서 pull 명령어를 사용해 새로운 변경 사항을 가져온다.

git pull origin master

Differences

Let's take a look at what is different from our last commit by using the git diff command.
로컬 저장소의 최종 커밋 로그와 차이점을 살펴보기 위해서 diff 명령어를 사용 한다.

In this case we want the diff of our most recent commit, which we can refer to using the HEAD pointer
가장 최근의 변경 내역을 비교하려면 HEAD 포인터를 사용해서 조회 할 수 있다.
git diff HEAD

Staged Differences

Another great use for diff is looking at changes within files that have already been staged.
diff는 이미 준비 영역에 있는 변경 내역과의 비교하기에도 좋다.

Staged files are files we have told git that are ready to committed.
준비 영역의 파일은 커밋 되기를 전의 파일을 말한다.

git diff --staged

Resetting the Stage

Unstage files by using the git reset command.
준비 영역의 파일을 삭제하려면 reset 명령어를 사용한다.

git reset octofamily/octodog.txt


브랜치로 하여금 예전의 커밋을 가리키도록 이동시키는 방식으로 변경 내용을 되돌린다. 이러한 관점에서 '히스토리를 고쳐쓴다.'라고 할 수 있다. 이것은 마치 애초에 커밋을 하지 않은 것처럼 예전 커밋으로 브랜치를 옮기는 것과 같다.

git reset HEAD~1

Undo

Files can be changed back to how they were at the last commit by using the command: git checkout -- <target>
마지막 커밋 된 파일로 교체하기 위해서 checkout 명령어를 사용한다.

git checkout -- octocat.txt


위 명령은 로컬의 변경 내용을 변경 전 상태(HEAD)로 돌려놓는다. 하지만 이미 준비 영역에 추가된 변경 내용과 새로 생성한 파일은 그대로 남는다.

Branching out

Code make separate commits to. Then when they're done they can merge this branch back into their main master branch.
새로운 코드는 새로운 브랜치에 커밋을 할 수 있다. 브랜치는 특정 커밋에 대한 참조(Reference)이며, 그 코드가 완료가 되면 다시 master 브랜치와 병합 할 수 있다.

Create a branch call.
branch는 새로운 브랜치를 만들기 위한 명령어 이다.

git branch clean_up

Delete a branch

branch를 삭제하려면 -d 파라미터를 추가하고 브랜치명을 입력 한다.

git branch -d clean_up

Switching Branches

다른 브랜치로 변경 하려면 checkout 명령어와 브랜치명을 같이 입력한다.

git checkout clean_up
git checkout -b clean_up

Removing all the things

Not only remove the actual files from disk, but will also stage the removal of the files for us.
rm은 준비 영역의 파일을 삭제 할 뿐만 아니라 실제 개발자 컴퓨터에 있는 파일도 삭제 된다.

removed all files you'll need to commit your changes.
파일을 삭제한 변경 내역도 커밋해야 한다.

git rm octodog.txt
git rm '*.txt'

Preparing to Merge

The moment has come when you have to merge your changes from the clean_up branch into the master branch.
별도 브랜치의 변경 내역으로부터 master 브랜치로 병합할 때가 오면 merge 명령어를 사용한다.

git merge clean_up

Rebase

브랜치끼리 작업을 접목하는 방법으로 rebase가 있다. 리베이는 기본적으로 커밋들을 모아서 복사한 뒤, 다른 곳으로 떨궈 놓는 것이다.

리베이스를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있다.

git rebase master

Revert

각자의 컴퓨터에서 작업하는 로컬 브랜치의 경우 reset을 잘 쓸 수 있지만, '히스토리를 고쳐쓴다'는 점 때문에 다른 사람이 작업하는 원격 브랜치에는 쓸 수 없다.

변경 내역을 되돌리고, 되돌린 내용을 다른 사람들과 공유하기 위해서는 revert를 사용해야 한다.

git revert HEAD

Push

All that's left to do is to push everything you've been working on to your remote repository.
모든 것이 완료 되면 원격(중앙) 저장소로 push 한다.

git push




참고하면 좋은 정보

http://rogerdudler.github.io/git-guide/index.ko.html
http://git-scm.com/book/ko
http://marklodato.github.io/visual-git-guide/index-ko.html

2013년 11월 7일 목요일

php XDebug를 사용하여 원격 디버깅 하기 (xampp 환경)

오후 4:58 Posted by jonnung 1 comment

XDebug를 적극 활용하여 그동안 echo, print_r, var_dump를 이용해서 출력값을 확인하던 디버깅 습관을 바꿔보자!

일단 php xdebug의 동작 원리를 이해하기 위해서 '생활코딩' 이고잉님이 만드신 강좌를 참고 하도록 한다.
( Remote Xdebug 메커니즘 : http://opentutorials.org/course/692/3758 )

나도 생활코딩 강좌를 보고 생각을 정리할겸 간단하게 그려보았다.

phpXdebug
php에서 xdebug를 사용하기 위해서는 크게 3가지 단계가 필요하다.
  1. 서버측 php.ini에서 xdebug 사용 설정
  2. 개발 IDE XDebug 사용 설정(플러그인 같은)
  3. 브라우저 XDebug 확장 프로그램 설치

1. php.ini 수정

 php.ini 파일을 열어 아래의 부분을 찾고, 문장 첫줄에 있는 주석(;)을 제거하고, 저장 후 아파치를 재시작 한다.

[XDebug]
zend_extension = "D:\zSever\xampp\php\ext\php_xdebug.dll"
xdebug.profiler_append = 0
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir = "D:\zSever\xampp\tmp"
xdebug.profiler_output_name = "cachegrind.out.%t-%s"
xdebug.remote_enable = On
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "127.0.0.1"
xdebug.remote_port = 9000
xdebug.trace_output_dir = "D:\zSever\xampp\tmp"


2. 개발 IDE 플러그인

 현재 Sublime Text2를 사용하고 있기 때문에 pci(Package Controll Installer)를 이용하여 'SublimeXdebug' 플러그인을 설치 한다.

https://github.com/Kindari/SublimeXdebug


3. 브라우저 XDebug 확장 프로그램 설치

 파이어폭스를 기준으로 'easy Xdebug' 확장 기능을 설치 한다. (크롬은 xdebug helper)
설치 후 에 파이어폭스 상단 탭 근처에서 마우스 우클릭 후 '부가기능모음' 버튼을 활성화 하면, 브라우저 우측 하단에 벌레가 나타난다.ㅋㅋㅋㅋ

 이제 모든 구성은 끝났고 실제로 사용하는 일만 남았다. ㅎㅎ
글로 설명하는 것보다 실제로 사용하는 모습을 남기고 싶지만 유투브에 딱 알맞는 영상을 있어서 그걸루 대체하기로~

http://www.youtube.com/watch?v=9bV0_gk0fkk

2013년 9월 8일 일요일

라즈베리 파이(Raspberry pi) - XBMC 설치 (Openelec)

오전 6:50 Posted by jonnung No comments

 HTPC 라는 용어도 XBMC라는 프로그램도 사실 이번에 라즈베리파이를 때문에 알게 되었다.

HTPC는 홈시어터 PC (home theater PC)라는 의미이고, XBMC는 HTPC에 최적화 된 프로그램이라고 생각하면 되겠다.

XBMC에 대한 소개는 'XBMC 사용자 모임'의 소개글을 참고.

사전 준비 단계

sd 카드 포맷

SD Formatter 4.0 for SD/SDHC/SDXC
https://www.sdcard.org/downloads/formatter_4/

win32diskimager 다운로드 설치

http://sourceforge.net/projects/win32diskimager/

openelec 다운로드

http://openelec.thestateofme.com/official_images/

Openelec 설치 단계

준비 단계만 완료 되면 설치는 너무 간단하기 때문에 아래의 링크를 참고하여 그대로 쭉 따라하면 된다.
(주의 깊게 따라할 정도도 아님..)
http://www.rasplay.org/?p=206
http://squirrelhosting.co.uk/hosting-blog/hosting-blog-info.php?id=9

XBMC 설정

 편의를 위해 변경해야 하는 설정들이 있나 찾아 봤으나, 언어와 폰트 이외에는 특별하게 꼭 변경해야 하는 설정 항목은 없는 듯 하다.
Openelec을 기준으로 언어를 변경하는 방법은 아래의 순서를 따라하면 된다.

* 스샷 출처 : http://blog.naver.com/PostView.nhn?blogId=kyb016&logNo=60171977936

폰트 변경

System > Setting > Appearance > Skin >> Fonts >>> Arial based

언어 변경

System > Setting > Appearance > International >> Language > Korean

xbmc1

외장 하드 연결

 라즈베리에 USB 외장하드를 연결하면 XBMC에서 바로 인식하고 내부 컨텐츠를 읽어 올 수 있다.

XBMC 원격 컨트롤 앱(아이폰)

 XBMC 정말 편리하고, 강력한 미디어 프로그램이지만 거실에서 영화 한편 보겠다고 마우스랑 키보드까지 대동하는건 여간 불편한게 아니다.

 XBMC 아이폰 공식앱을 다운 받아 사용해 보았는데 정말 괜찮다!! 생각보다 반응 속도가 빨라서 앞으로 많이 사용 할 것 같다.

https://itunes.apple.com/us/app/unofficial-official-xbmc-remote/id520480364?ls=1&mt=8



xbmc_remote_iphone1



xbmc_remote_iphone2

2013년 5월 20일 월요일

소켓(Soket) 통신이란?

오전 8:24 Posted by jonnung 1 comment

Node.js를 공부하면서 Soket.io 사용하는 부분을 배우기 전에 간단하게 소켓 통신에 대한 개념에 대해 조사를 해 보았다.

잘 맞는 것인지는 모르겠지만 조사를 하는 과정에서 추상적이지만 개념정도는 정립이 된 것 같다.

UDP는 예전에 친구들과 PC방에서 편먹고 스타크래프트1 할 때 들어가던 메뉴 였던 것으로 기억하는데 이제야 뭔지 알게 되었다.ㅋㅋ

소켓 통신

네트워크를 통하여 서로 다른 컴퓨터에서 수행되는 프로세스간의 통신 채널이다.

소켓통신에는 신뢰성 프로토콜인 TCP(Transfer Control Protocol)와 비신뢰성 프로토콜인 UDP(User Datagram Protocol)가 있다.

TCP 통신의 개념

TCP 통신은 쉽게 전화 통화하는 방식으로 동작한다. 상대방의 전화번호를 알고 있어야 전화를 걸 수 있듯이 상대방의 IP 주소와 포트를 알고 있어야 연결을 할 수 있다. 

서버가 응답을 받아주지 않으면 계속적으로 요청을 하게 된다. 어느 시점에서 요청을 포기하게 될 수도 있다.

이처럼 TCP 통신은 계속적으로 소켓을 통해 데이터를 주고 받을 수 있는 양방향 통신이 가능하다. 또한 데이터를 받지 못했을 때 다시 요청하는 메커니즘을 가지고 있다.

UDP 통신의 개념

상대방과 연결되어 있는 개념이 아니다. 소켓을 개설하고 그냥 데이터를 보내는 개념이다. 

이는 편지를 보내는 방식과 유사하다. 편지를 보냈더라도 편지를 받는 사람은 편지함을 열어보기 전에는 편지가 왔는지 안왔는지 알 수 없다. 

따라서 UDP 통신은 UDP 소켓을 통해서 자신의 포트를 열어보기 전에는 데이터가 왔는지 오지 않았는지 알 수 없다.

TCP와 UDP의 비교

TCP 통신은 데이터를 주고 받을 때 데이터가 도착했는지 여부를 내부적으로 확인한다.

만약 데이터가 오지 않았다면 재요청을 하는 메커니즘을 가지고 있어 양방향으로 연결 되어 있지만 이러한 확인 절차로 인해 속도면에서 느리다. 

하지만 UDP는 이러한 확인 절차를 거치지 않고 계속적으로 데이터를 전송하기만 하기 때문에 속도면에서 훨씬 빠르다.

속도면에서는 UDP가 빠르지만 UDP는 데이터가 도착했는지 알 수 었는 비신뢰성 프로토콜이다.

2013년 3월 20일 수요일

PHP의 파일 용량 제한 설정 (php.ini)

오전 4:56 Posted by jonnung No comments

php.ini


POST 데이터가 허용하는 최대 사이즈는 파일 업로드에도 관여하며 큰 파일을 업로드 하기 위해서는 이 값이 upload_max_filesize보다 커야한다.
환경 설정 스크립트에서 메모리 제한을 활성화하였으면, memory_limit도 파일 업로드에 관여한다.

;파일 업로드 사용여부
file_uploads = On 

;업로드 파일의 최대 크기
upload_max_filesize = 10M

;PHP가 허용하는 POST 데이터의 최대 크기
post_max_size = 11M

일반적으로, memory_limit는 post_max_size보다 커야만 한다.

;스크립트가 사용할 수 있는 최대 메모리 크기

memory_limit = 20M

스크립트가 사용할 수 있는 최대 메모리 양을 바이트로 설정하고, 서버의 많은 메모리를 차지하는 것을 방지하도록 한다.
PHP 4.3.2부터, memory_limit를 활성화 했을때, PHP 함수 memory_get_usage()가 사용 가능하다.


크기 설정시 아래와 같은 순서로 설정하는 것을 추천한다.

memory_limit > post_max_size > upload_max_filesize


php.conf

LimitRequestBody 524288 # 524288 이 초기값이다.. 원하는 크기를 설정하면 된다.
아파치 웹서버를 이용하여 업/다운로드 하는 모든 파일의 사이즈를 제한한다.
아래는 download 디렉토리를 10M로 업/다운로드 크기를 제한한 예제이다.

LimitRequestBody 10240000

2013년 3월 17일 일요일

리눅스의 데몬(Daemon)

오후 5:50 Posted by jonnung No comments
데몬(Daemon)

 데몬이란 시스템에 관련된 작업을 백그라운드에서 수행하는 프로세스를 말한다.

 이벤트를 기다리거나 주기적으로 주어진 작업을 수행하기 위하여 대기하고 있는 프로세스를 의미한다.
일반적으로 데몬 프로세스는 이름끝에 'd'자가 붙는다.

 기본적으로 리눅스에는 여러 기능과 서비스를 제공하기 위한 다양한 데몬 프로세스들이 시스템에서 돌아가고 있다.
서비스 데몬들의 실행여부는 레드햇 리눅스 계열에서 ntsysv 커맨드로 조정하면 된다.
리눅스상에서 현재 실행되고 있는 데몬의 현황을 보려면 pstree 커맨드를 쓴다. 


데몬의 실행 방식

(1) Stand-alone 방식
 이 방식의 데몬들은 데몬이 시작되면 말 그대로 자기 스스로 시스템에서 상주하며 클라이언트 요청에 응답을 보내주는 방식으로 보통 아파치 데몬처럼 클라이언트의 요청이 잦은 데몬들이 이런 방식으로 실행된다.

 스탠드 얼론방식의 데몬을 확인하려면 쉘상에서 pstree 명령을 내리면 데몬들을 트리형식으로 보여준다.

 스탠드 얼론 방식의 데몬들은 xinetd방식보다는 클라이언트 요청에 신속하게 대응한다는 장점은 있으나 이런 스탠드 얼론 데몬들이 시스템에서 많이 생성되게되면 시스템의 자원낭비가 심해지게 되고 퍼포먼스도 떨어지게 된다.


(2) xinetd 방식
 Stand-alone 처럼 자기 스스로 독립적으로 시스템에 실행되는게아니라 xinetd라는 수퍼데몬이 시스템에서 대기하고 있다고 클라이언트 요청이 들어오면 xinetd데몬에 의해 해당 서비스를 제공해줄 데몬을 실행시키는 방식이다.

 telnet이나 ftp같이 비교적 클라이언트 요청의 빈도가 낮은 서비스들은 이런 xinetd데몬이 시스템 활용측면에서는 유리하다.

 또한 tcp wrapper를 써서 보안을 손쉽게 설정할 수 있는 것도 장점이다. 그러나 전술한 아파치 데몬같이 클라이언트의 자잘한 요청이 많은 서비스에 대해서는 inetd방식이 시스템효율을 도리어 떨어드리게된다.

 xinetd데몬은 스탠드 얼론방식으로 실행되는 슈퍼데몬이며 서비스 요청시 xinetd데몬의 차일드 프로세스로 다른 데몬이 실행된다.

 이를 확인하려면 pstree로 xinetd데몬을 확인하고 다른 한텀창에서 telnet이나 ftp로 자신의 호스트에 접속해보라. 그럼 xinetd데몬에서 차일드 프로세스로 해당 데몬이 실행되는 것을 확인할 수 있다.


슈퍼 데몬

 데몬 중에는 xinetd(커널 2.4버전 이전은 inetd, xinetd는 eXtended Internet Services daemon의 약자이다) 이라는 인터넷 수퍼 데몬(Internet Super Daemon)이 있다.

SENDMAIL, HTTPD 등과 같이 리눅스 시스템에서 실행되는 데몬의 일종이다.

 그런데 이를 다른 데몬들과 달리 슈퍼 데몬이라고 부르는데에는 특별한 이유가 있다. 이 슈퍼 데몬은 리눅스 서버에서 서비스되는 다른 여러가지 데몬들 을 제어하면서 각각의 서비스들의 연결을 담당하고 있기 때문이다.

 예를 들어 xinetd 슈퍼 데몬에 의해 제어되는 서비스중에 telnet(하나의 데몬)이라는 서비스가 있다고 하자. 누군가가 telnet서비스에 접속을 시도하면 바로 telnet으로 연결이 되는 것이 아니라 슈퍼데몬인 xinetd에 의해 허가된 사용자인가를 검사받은 후에 xinetd의 telnet설정파일(/etc/xinetd.d/telnet)에 정의되어 있는 telnet서비스 데몬과 연결되어 비로소 사용자는 telnet을 이용하게 되는 것이다.

 이처럼 리눅스의 데몬중에는 슈퍼데몬에 의해 제어가 되는 데몬에는 telnet 이외에 ftp, finger, login, shell 등이 있다.


참고

2013년 3월 14일 목요일

html 문서에서 php 코드를 실행 시키기 - php 은닉(hiding php)

오후 8:54 Posted by jonnung No comments

두가지 상황을 생각해 볼 수 있지만 사실은 같은 말이다. ㅋㅋ

  1. html 문서에서 php 코드를 실행 
  2. php 코드만으로 작성 되었지만 확장자를 php로 하지 않고 html로 저장
Apache 웹서버가 php를 다른 파일 타입으로 인식하도록 httpd.conf 파일에서 아래와 같은 부분을 찾아 수정하면 가능하다.

<IfModule mime_module>
AddType application/x-httpd-php .html .htm 
</IfModule>

위 설정 변경의 의미는 .html / .htm 을 확장자로 갖는 문서에 대해 php가 실행 되도록 하는 역할을 한다.

하지만 php엔진에 의해 모든 html 구문에 대한 분석이 발생하기 때문에 성능면에서 다소 좋지 않을 수 있다.

참고 : http://php.net/manual/en/security.hiding.php



2013년 2월 26일 화요일

이클립스 머큐리얼 플러그인(MercurialEclipse) 지원하지 않는 hg 버전(version) 오류

오전 2:17 Posted by jonnung No comments

이클립스(Eclipse)에 머큐리얼(Mercurial) 플러그인(Plugin)을 설치해서 머큐리얼을 사용하려 했다.

javaforge사이트 (http://javaforge.com/project/HGE)에서 이클립스 머큐리얼 플러그인에 대한 정보를 확인 하고, 이클립스에 플러그인을 추가했다.

현재까지 릴리즈 된 버전은 1.9.1
설치는 순조롭게 진행 되었지만 이후 이클립스는 바로 오류를 토해냈다.



Unsupported hg version:1.9.3. Expected is at least2.0.0

hg의 1.9.3 버전을 지원하지 않는다는 말이지만 솔찍히 이해가 가지 않았다. 

난 방금 최신의 머큐리얼 플러그인을 설치했고, 그 플러그인의 버전은 1.9.1이기 때문이다. 1.9.3 과는 전혀 연관성이 없었다.

곧바로 구글링을 통해서 얻은 정보는 적었지만, 위에 오류 메세지를 그대로 긁어다가 검색한 것 치고는 명확한 해답을 얻기에는 충분했다.

Uncheck the option labelled Use default (built-in) Mercurial executable; then in the text box labelled Mercurial executable below, you can enter the full path to the hg.exe under your TortoiseHg 2.5 installation.
( http://stackoverflow.com/questions/12604897/mercurial-not-configured-correctly/12605331#12605331 )


위 질문자의 상황은 나와 거의 똑같다. 별도로 TortoiseHg도 설치를 했고, 머큐리얼 플러그인을 사용하기 위해 설치를 했으나 오류를 토해냈고...;;;
완벽한 번역은 불가능하지만 결국 하고자 하는 말은 TortoiseHg가 설치 된 경로의 hg.exe의 경로를 대신 입력하라는 것!

이제  머큐리얼 플러그인이 어떤 버전을 지원 못하겠다고 말했는지 감이 오기 시작했다.

내 컴퓨터의 Program Files을 확인해 보니 'Mercurial'이 당당하게 설치 되어 있었다.
그리고 커맨드 창을 띄워 아래와 같이 명령어를 실행했더니 결국 모든 미스테리가 밝혀졌다.ㅎㅎ



이제 원인을 알아냈고, 해결하는 방법은 총 2가지가 있을 것 같다.

  1. TortoisHg가 설치 된 디렉토리의 hg.exe파일 경로를 이클립스 머큐리얼 플러그인 설정에 입력한다. 
  2. Mercurial 버전 업데이트
쉽게 첫번째 방법을 선택할 수도 있지만, 그렇기에는 오래 된 버전이 내 PC에 설치되어 있는 꼴은 못 보니 머큐리얼을 업데이트 하기로 결정!

아래의 사이트에서 최신버전의 머큐리얼을 다운 받고 설치하면 된다! 끝!
http://mercurial.selenic.com/wiki/Download



2013년 1월 22일 화요일

이클립스(Eclipse) 테마 변경 플러그인 설치

오전 12:08 Posted by jonnung No comments

흰 바탕에 소스를 보려하니 눈이 너무 피곤하다. (づ_ど) 이클립스의 테마를 변경하는 방법 이다.

  1. 아래 페이지 에서 플러그인 직접 다운로드 가능 
  2. Eclipse Marketplace에서 'Eclipse Color Theme' 검색 
  3. Window > Install New Software에서 'Work with'에 아래 URL 입력 
  4. 설치 후 아래 메뉴에서 테마 변경 가능 Window > Preferences > General > Appereance > Color Theme