PHP/Example2013.06.04 10:29


가끔가다 php단에서 POST요청을 보내주어야 하는 상황이 생긴다.

그럴 때 소켓통신을 이용해서 POST요청을 만들어 보내는 코드


<?php
    //보낼 데이터
    $data = array(
        'im' =--> 'bunkering',
        'kong' => 222,    
        'tak' => 'heater'
    );
    
    //POST요청을 위하여 im=bunkering&kong=2&... 형태로 변경
    while(list($n,$v) = each($data)){
        $send_data[] = "$n=$v";
    }    
    $send_data = implode('&', $send_data);
    
    //url 파싱    
    $url = "http://yourDomain/test.php";
    $url = parse_url($url);
    
    $host = $url['host'];
    $path = $url['path'];
    
    //소켓 오픈
    $fp = fsockopen($host, 80, $errno, $errstr, 10.0);
    if (!is_resource($fp)) {
        echo "not connect host : errno=$errno,errstr=$errstr";
        exit;
    } 
 
    fputs($fp, "POST $path HTTP/1.1\r\n");
    fputs($fp, "Host: $host\r\n");
    fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
    fputs($fp, "Content-length: " . strlen($send_data) . "\r\n");
    fputs($fp, "Connection:close" . "\r\n\r\n");
    fputs($fp, $send_data);
 
    //반환값 받기
    $result = ''; 
    while(!feof($fp)) {
        $result .= fgets($fp, 128);
    }    
    fclose($fp);
    
    //헤더와 컨텐츠(웹페이지에 표시되는 내용) 구분
    $result = explode("\r\n\r\n", $result, 2);
 
    $header = isset($result[0]) ? $result[0] : '';
    $content = isset($result[1]) ? $result[1] : '';
    
    //결과 출력
    echo $header;
    echo $content;

?>

$header를 출력하면 response  헤더의 내용이 나오고

$content를 출력하면 POST요청을 보낸 페이지(http://yourDomain/test.php)의 응답이 출력된다.



Posted by 하품 - yawn 하품 - yawn
iOS2013.05.20 18:27


ARC 환경에서의 설정값들

- atomic

멀티 쓰레드 환경에서 여러 쓰레드가 경쟁적으로 접근하는 프로퍼티를 사용할때 설정하는 값이다.

한 쓰레드가 사용중이면 다른 쓰레드가 접근하지 못하도록 lock을 걸어 값의 변경을 막기위해 사용한다. 

즉 Thread Safe 를 위한 설정값


- nonatomic

위의 atomic을 사용해야 하는 경우가 아닐때 사용한다.


-strong

강한 참조

retain과 동일하다고 보면 된다.


-weak

약한 참조

assign 과 비슷하다고 한다.

weak의 경우 객체가 없을시 자동으로 포인터에 nil이 대입된다.

여러군데에서 사용되는 객체의 경우 strong으로 해야 한다. weak으로 하면 어디서든 포인터가 nil이 될 수 있기 때문.




* 밑의 설정값들은 ARC를 사용할땐 사용해선 안된다.


-retain

말그대로 메모리를 할당

release로 해제를 시켜줘야 한다.


-assign

단순한 값의 대입

int, float, BOOL등의 타입에 사용하기 적합하다.


-copy

도저히 뭔지 모르겠다 Orz



Posted by 하품 - yawn 하품 - yawn
javascript/jQuery2013.05.15 18:22


live()는 jQuery 1.9.x 부터 deprecated 되었고...

이전부터 bind(), delegate(), live() 메소드를 on()으로 대체하여 사용하는걸 계속 권장해 왔으니 on()으로 어떻게 세 함수를 대체 하는지 간단하게 알아본다


// Bind
$( "#members li a" ).on( "click", function( e ) {} );
$( "#members li a" ).bind( "click", function( e ) {} );
 
// Live
$( document ).on( "click", "#members li a", function( e ) {} );
$( "#members li a" ).live( "click", function( e ) {} );
 
// Delegate
$( "#members" ).on( "click", "li a", function( e ) {} );
$( "#members" ).delegate( "li a", "click", function( e ) {} );



코드 출처 : http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html

Posted by 하품 - yawn 하품 - yawn
javascript/Learn2013.05.15 17:58


이벤트 버블링 이란

이벤트가 발생한 엘리먼트에 핸들러가 할당되었는지 확인하고 할당되었다면 핸들러를 호출한다.

그 이후 해당 엘리먼트의 부모부터 시작하여 DOM 트리의 루트까지 하나하나 올라가며 동일한 이벤트 타입의 핸들러가 할당되어 있는지 확인하고, 할당되어 있다면 이를 실행한다.

이 이벤트 핸들링이 마치 샴페일 플루투의 거품처럼 위로 퍼진다 하여 이벤트 버블링(Bubbling)이라 한다.



이 이벤트 버블링을 명확하게 이해하는데엔 DOM 레벨 2의 이벤트 흐름을 살펴보는 것이 도움이 된다.

그 흐름을 그려보면 다음과 같다.

<출처 : 자바스크립트 객체지향 프로그래밍>


위 그림에서 <td>(회색상자)에서 이벤트가 발생하면 그 이벤트는 우선 브라우저의 Document 객체로 전달되어 이벤트가 발생된 <td>객체로 전달된다. 이때 <td> 부모 객체까지 전달되는 것을 캡처링(capturing)이라고 한다.

이벤트를 발생시킨 DOM 객체 타겟 객체라 하며, 타겟 객체에 이벤트를 발생시킨 이후 이벤트가 타겟 객체(현재의 <td>)의 부모로 전달되고 또 그부모의 부모객체를 이어가며 다시 최상위 Document까지 이벤트가 전달되는 것이 버블링(bubbling)이다.



캡쳐링시 이벤트 할당은 거의 사용하지 않는다고 한다. 그렇기에 여기서는 버블링 예제만을 보겠다.


*CSS 코드는 생략

*사용된 함수중 say() 함수는 jQuery in Action 에서 제공하는 소스코드중 jqia2.support.js라는 스크립트에 들어있는 함수로 console.log() 와 사실상 동일한 기능이라 생각하면 됨.


javascript 코드

      $(function(){       

$("*").click(function(e){

var current = this;

                var target = e.target;

          say('For ' + current.tagName + '#'+ current.id +  ' target is ' +

                target.tagName + '#' + target.id);

});

      });


html 코드

<div id="div1">

<div id="div2">

<img id="example" src="example.jpg">

</div>

</div>


화면



모든 엘레먼트에 클릭 이벤트가 할당되어 있는 상황이다.

이때 정 중앙의 그림을 클릭하면 어떻게 될까?


바로 다음과 같다


우선 이벤트가 발생한 타겟 객체인 이미지에서 이벤트가 처리되어 노란 박스 밑 바로 첫째줄이 쓰여진다.

그 후 부모객체인 DIV(녹색박스)로 이벤트가 버블링 되고, 동일한 클릭 이벤트가 할당되어 있기에 이벤트가 처리되어 두번째 줄이 쓰여진다.

이후에도 똑같이 하나씩 버블링 되며 동일한 이벤트면 이벤트를 처리한다.(순서대로 노란박스, BODY, HTML)


이벤트 버블링을 잘 이용한다면 동일한 코드의 반복을 피할 수 있다.

하지만 이벤트 버블링으로 인하여 엉뚱한 곳에서 이벤트가 발생할 수도 있는데 jQuery에서는 이를 방지하는 메소드를 제공한다.


위 자바스크립트 코드를 다음과 같이 고쳐보자

 $(function(){       

$("*").click(function(e){

e.stopPropagation();

var current = this;

                var target = e.target;

          say('For ' + current.tagName + '#'+ current.id +  ' target is ' +

                target.tagName + '#' + target.id);

});

      });


결과화면


e.stopPropagation() 이라는 메소드를 추가하여 이벤트 버블링을 방지 할 수 있다.

이벤트 버블링이 발생한다면 녹색 박스를 클릭 시 노란박스와 BODY, HTML 도 이벤트가 처리되어야 하나 버블링을 방지하는 메소드로 인하여 타겟객체(녹색박스)의 이벤트만 발생하고 모든 처리가 완료되었다.




참고자료

자바스크립트 객체지향 프로그래밍 - 위키북스

jQuery in Action - 인사이트


Posted by 하품 - yawn 하품 - yawn
PHP2013.05.13 19:16

PHP 를 시작한지 얼마안되었을때. substr()로 문자열을 잘라보니 문자열이 자주 깨졌다.

알고보니 substr()은 2byte로 문자열을 자르기 때문에 UTF-8 인코딩을 쓸 경우 3byte라 함수가 제대로 동작을 한했던 것.


방법이 없나 구글링을 해보니

UTF-8 한글 자르기

같은 사람들이 직접 만든 함수들이 검색되었다.


'대체 왜 php는 2byte 문자밖에 지원을 안하는거지?' 라고 생각하며 저런 함수들을 쓰던중

우연히 레퍼런스를 뒤지다 찾게 되었는데...


PHP 4.0.6 부터 Multibyte String Functions 해서 이미 지원하고 있었다 -_-;;;;

(레퍼런스를 꼼꼼히 살펴보지 않은 실수)


substr과 사용법은 사실상 다를바 없고

다음 과 같이

mb_substr($str, 0, [1], ["UTF-8"]

앞에 mb_가 붙으며 length 뒤에 인코딩 타입을 지정하는 옵션인수가 하나 더 늘어났다.


인코딩 타입은 생략이 가능하지만 가급적 명시해 주는게 좋고, 아니라면

mb_internal_encoding("UTF-8") 을 이용하여 확실하게 적용할 인코딩 타입을 정하고 사용하는게 좋다.

(이런거 없이 그냥 사용하면 서버환경이나, 문서 설정에 따라 인코딩이 꼬일 수 있다)



덧.

php 레퍼런스 밑 댓글중에 제대로 동작 안하는 것처럼 보이는 리플이 있는데

<?php

function substr_unicode($str, $s, $l = null) {

    return join("", array_slice(

        preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $s, $l));

}


$str = "Büyük";

$s = 0; // start from "0" (nth) char

$l = 3; // get "3" chars

echo substr($str, $s, $l) ."\n";    // Bü

echo mb_substr($str, $s, $l) ."\n"; // Bü

echo substr_unicode($str, $s, $l);  // Büy

?>

위 코드에서

echo mb_substr($str, $s, $l) ."\n";   -> echo mb_substr($str, $s, $l, "UTF-8") ."\n";

해주면 원하는 결과값인 Büy 가 제대로 나온다.

즉, 잘 동작한다.

'PHP' 카테고리의 다른 글

[PHP] UTF-8 문자열 자르기 (멀티바이트 문자열 자르기)  (0) 2013.05.13
Posted by 하품 - yawn 하품 - yawn
PHP/Learn2013.05.13 18:25

include()

해당 문장에 도달해야만 읽어오며,

해당 문장을 만날 때 마다 지정한 파일을 포함, 매번 재평가 되어 재실행된다.

조건문 등으로 필요한 경우에만 파일을 포함되도록 할 수 있다.


require()

C의 #include 나 JSP include 지시어 처럼 무조건 파일을 포함한다.

(하나의 파일과 같다)


include_once(), require_once()

한번만 해당 파일을 포함한다.

중복되어 include 및 require 되는것을 방지하는 문.

 


조건문 안에서의 include, require 차이 예제Example

if (조건)

  require(...)

if 문의 참 거짓 여부와 상관없이 무조건 포함.


if (조건)

  include(..)

if 문이 참일때만 포함.

단, include()는 특별한 구조이므로, 만약 이것이 조건절 안에 놓여있다면 반드시 {}(statement block)으로 둘러싸야 한다. 

'PHP > Learn' 카테고리의 다른 글

[PHP] include, require, include_once, require_once 의 차이  (0) 2013.05.13
Posted by 하품 - yawn 하품 - yawn
개발 단상2013.04.29 18:28


책을 보건, 다른사람에게 이야기를 듣던 용어를 명확히 이해해야 뭔 말을 하는지 빠르게 알 수 있으니 개발이 편하단 생각이 듭니다.

그런고로 자꾸 헛갈리는 용어들에 대한 '내 나름대로'의 정의를 정리하는 포스팅.



덧글로 제안해주시면 매우 감사합니다.






커널 - 프로그램과 장치간의 인터페이스, 프로세스 스케줄링, 시스템의 여러가지를 제어하는 코드. 시스템상에서 동작하는 프로세스가 아님. 메모리에 상주하면서 모든 프로세스가 접근하는 루틴의 집합.





드라이빙(driving) 테이블(outer table) - 조인시 기준이 되는 테이블

드리븐(driven) 테이블(inner table) - 조인시 비교대상 테이블


ㅇㅇ

Posted by 하품 - yawn 하품 - yawn
OS/Linux2013.04.23 16:11


*Ubuntu 12.04 LTS 서버 사용


1. 오라클에 들어가서 jdk-xxxx-linux-x64.tar.gz 다운


2. 원하는 폴더에 압축을 푼다 (여기서는 /usr/java)

tar -xvf jdk-xxxx-linux-x64.tar.gz


3. alternative 업데이트

$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/java/jdkx.x.x_xx/bin/java" 1

$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/java/jdkx.x.x_xx/bin/javac" 1

$ sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/java/jdkx.x.x_xx/bin/javaws" 1


$ sudo update-alternatives --set java /usr/java/jdkx.x.x_xx/bin/java

$ sudo update-alternatives --set javac /usr/java/jdkx.x.x_xx/bin/javac

$ sudo update-alternatives --set javaws /usr/java/jdkx.x.x_xx/bin/javaws


4. 환경변수 등록

/etc/profile 편집

export JAVA_HOME=/usr/java/jdkx.x.x_xx

export PATH=${PATH}:${JAVA_HOME}/bin


5. 톰캣 다운로드


6. 역시 원하는 폴더에 압축을 푼다

tar -xvf  apache-tomcat-7.0.xx.tar.gz


7. 환경변수 등록

 export JAVA_HOME=/opt/java/jdk1.7.0_21

 export CATALINA_HOME=/opt/java/apache-tomcat-7.0.39

 export PATH=${PATH}:${JAVA_HOME}/bin:${CATALINA_HOME}/bin


${CATALINA_HOME}/bin

아래에 있는 startup.sh 를 실행하면 톰캣서버가 구동된다.

Posted by 하품 - yawn 하품 - yawn
미분류2013.04.23 15:54

왠 노래가사를 의미없이 덧글 다는 인간들이 있어서

덧글을 로그인사용자로 제한을 두었습니다.


이 블로그에 그런인간들이 나타날 줄이야;;;


나름 글이 많이 읽히나? -_-;;;

'미분류' 카테고리의 다른 글

이상한 덧글이 막 달리네;;;  (0) 2013.04.23
Posted by 하품 - yawn 하품 - yawn
OS/Linux2013.04.19 16:41


* Ubuntu 12.04 LTS 서버를 기준으로 작성되었습니다.


cron이란 리눅스에서 특정한 시간에 반복된 작업을 하기위한 것 이다.

cron은 crontab 이란 명령어를 통해서 등록, 삭제를 하게 되는데

콘솔창에서


$ crontab -e


을 치면 다음과 같은 화면을 볼 수 있다.

# 위에 써있는 설명 생략

# m h dom mon dow  command

화면이 뜨기전에 보통은 어떤 에디터로 편집할것인지 묻는게 나오기도 하는데 본인은 그냥 vi에디터를 선택하였다.

위 화면에서 이제 주기적으로 실행할명령을 둘재줄에 보이는 형태대로 추가 해주면 된다.

m은 분, h는 시간, dom 은일, mon은 월 dow는 주 를 뜻한다. command는 실행할 명령.

01 04 * * * /usr/bin/somedirectory/somecommand

위의 형태로 추가를 하게 된다.


위 명령의 의미는 '매일 오전 4시 1분에 어떠한 명령을 실행하라' 가 된다.

*은 순서대로 매분, 매시간, 매일, 매달, 매 주를 의미한다.

혼동하면 안되는 것이 0 4 * * * 로 하면 4시간 마다가 아닌 매일 오전 4시이고 4 * * * * 는 4분마다가 아닌 매시간 4분을 가리킨다.


1 4* * * : 매일 오전 4시 1분에 실행하라

1 * * * * : 매시 1분에 실행하라.(1시간 간격)

* * * * * : 1분에 한 번씩 실행하라

1 4 2 * * : 매달 2일 오전 4시 1분에 실행하라.


만약 매분마다, 혹은 매 시간마다 실행하는 형태로 하고 싶다면? '/'를 이용하여 구분 할 수 있다


*/1 * * * * : 1분 마다 실행하라

0 */3 * * * : 3시간 마다 실행하라


또한 ',' 를 이용하여 실행되는 시간을 여러면 지정할 수 있다.


1 4,22 * * * : 오전 4시 1분, 오후 10시 1분에 실행하라

1 4 * * 0,2 : 매주 일요일과 화요일 4시 1분에 실행하라


EX> 위 사항을 가지고 apache의 htdocs를 백업 하는 예


1. 백업 스크립트 작성

#!/bin/sh

today=$(date +%Y%m%d)


tar cvf /usr/backup/bakcup-docs-$today.tar /opt/lamp/apache2/htdocs


파일 명 /usr/bin/reserve/backup.sh


2. crontab 등록

$ crontab -e



#매일 오후 10시에 백업

0 22 * * * /usr/bin/reserve/backup.sh 

crontab: installing new crontab

이란 메세지가 뜨면서 예약 작업이 동작을 한다.


다른 방법으로는

/etc/폴더 아래에 있는 crontab 파일을 직접 편집해 주는 방법도 있다.

등록방법은 동일하며 한가지 주(dow)와 명령어를 입력하는 부분 사이에 해당 명령을 실행시킬 user 를 명시해 주어야 한다.

crontab -e 를 이용해 등록한 예약작업은 기본적으로 해당 유저가 명령어를 실행하는 것으로 등록되기에 user를 명시해 주는 부분이 빠진것.


또한

/etc/cron.allow

/etc/cron.deny

파일을 만들어 cron을 사용할수 있는 유저와  사용이 불가능한 유저를 구분할 수 있다. 각각의 파일에 user의 ID를 넣어주면 된다.

우분투에서는 기본적으로 저 두파일이 존재하지 않기에 필요할때 만들어서 사용해야 한다.

우분투는 두 파일이 존재하지 않을 시 모든 유저에게 cron사용이 허용된다.


그리고 매월, 매주, 매일, 매시 마다 실행되는 예약작업을 지정하는 폴더가 기본적으로 존재 하는데

/etc/ 폴더 아래에 각각

cron.daily

cron.hourly

cron.monthly

cron.weekly

의 폴더가 있다. 이 폴더 밑에 스크립트 파일을 두면 각각의 주기에 맞춰 자동으로 폴더 밑의 스크립트들이 실행된다.


마지막으로 크론탭의 옵션은

-e : 크론탭 수정

-r : 등록된 작업 모두 삭제

-l : 등록된 작업 리스트 보여주기

-i : 위 명령에 붙여서 (ex -ir)사용하며 동작 전에 질문하기

가 있다.


Posted by 하품 - yawn 하품 - yawn
OS/Linux2013.04.16 18:19

$ ls [옵션] <대상 파일 또는 디렉토리>

현재 디렉토리 또는 대상 디렉토리의 파일과 디렉토리의 목록을 출력하는 명령

-a    hidden파일 포함해 모든 파일 출력

-d    디렉토리만 출력

-h    읽기 편한 형태로 출력

-i     파일명 왼쪽에 inode 번호를 함께 출력

-l     디렉토리, 파일에 대한 자세한 정보를 출력

-r     정렬 순서를 역순으로

-t     최근 수정된 파일부터 출력

-F    파일의 유형에 따라 구분기호를 함께 출력 (*:실행파일, @:심볼릭 링크, |:FIFO, =:소켓 /:디렉토리)

-S    크기가 큰 파일부터 출력

-R    지정된 디렉토리와 하위 디렉토리까지 출력


$ ls -l 에 대한 화면 설명

① 파일유형

② 파일 소유자 퍼미션

③ 파일 소유 그룹 퍼미션

④ 나머지 사용자 퍼미션

⑤ 하드링크 수

⑥ 파일 소유자

⑦ 파일 소유 그룹

⑧ 파일 크기

⑨ 파일 생성 및 변경 시간

⑨ 파일 이름


$ cp(copy) [옵션] <복사원본> <복사대상>

파일이나 디렉토리를 복사하는 명령

-a    복사 원본의 속성과 링크정보를 유지하며 복사

-b    복사 대상이 존재하는 경우 '~'문자를 갖는 백업 파일 생성

-d    복사 원본이 심볼릭 파일일 경우 그 심볼릭 파일 자체를 심볼릭 정보와 함께 복사

-f     복사 대상이 존재하는 경우 강제로 지우고 복사

-i     복사 대상이 존재하는 경우 질문

-p    복사 원본의 속성을 그대로 유지하며 복사

-r     복사 원본이 파일인경우 해당 파일 복사, 디렉토리인 경우 포함된 하위 디렉토리와 파일을 함께 복사

-R    복사 원본이 디렉토리면 포함된 하위 디렉토리와 파일을 함께 복사

-u    복사 대상이 존재하는 경우 복사 원본의 변경시간이 최근인 경우만 복사


$ ln [옵션] <원본 파일명> <링크 파일명>

링크를 생성

무옵션 하드링크를 생성

-s       심볼릭 링크를 생성


$ useradd <계정이름> [옵션] 

계정생성

-u UID           사용자 ID 지정

-g GID           사용자의 초기 그룹 ID 지정

-G GID          사용를 지정한 그룹의 구성원으로 추가

-d 디렉토리명 사용자의 홈 디렉토리를 직접 지정

-s 쉘이름        사용할 쉘을 지정

-c 코멘트        사용자 계정에 대한 설명

-m                 홈 디렉토리를 생성


Ex> $ sudo useradd -G mygroup -m -s /bin/bash seconduser

-G mygroup : 새 사용자를 mygroup에 추가

-m  : /home/seconduser 라는 홈 디렉토리가 만들어진다

-s /bin/bash : bash 쉘을 사용

seconduser : 새 계정 이름


$ deluser <계정이름> [옵션]

사용자 계정을 삭제한다

--remove-home          메일스풀과 사용자의 처음디렉토리를 제거

--remove-all-files       사용자의 모든 파일을 제거

--backup                   삭제하기 전에 백업

--backup-to <DIR>     백업할 대상 디렉토리 /기본값 현재 디렉토리./

--system                    시스템사용자만 제거


--group <그룹>            시스템에서 그룹 삭제.

--system                     시스템그룹만 삭제

--only-if-empty 일원이   아닌것만 제거

deluser <사용자> <그룹>          그룹의 사용자 제거


$ usermod [옵션] <계정이름>

사용자 계정정보를 수정한다.

-u UID              새로운 UID 를 지정합니다. -o 옵션과 같이 사용하면 강제설정이 가능합니다.(root로 가능)

-g GID              새로운 GID 를 지정합니다.

-G group          새로운 보조그룹을 지정합니다.

-d 디렉토리명    새로운 홈디렉토리를 지정합니다. -m 옵션과 같이 사용해서 새로 생성도 가능합니다.

-s 쉘                새로운 쉘 을 지정합니다.

-c 코멘트          새로운 주석을 지정합니다.

-l ID                  로그인 ID를 바꾸는 옵션 입니다. 새로운 계정명으로 변경합니다.


$passwd [옵션] <계정이름>

해당 계정에 대한 비밀번호를 변경


$ groupadd [옵션] <그룹명>

그룹을 생성한다.

-g GID     그룹에 gid를 지정 합니다.

-r             시스템에 사용되는 GID를 부여 합니다. 500번 이하의 가장 빠른 GID를 생성


# groupmod [옵션] <그룹명>

그룹의 정보를 수정한다.

-g GID             gid 를 변경합니다.

-n 새그룹명      그룹명을 변경할때 사용합니다


$groupdel <그룹명>

해당 그룹을 삭제한다.


$ chown [옵션]... <소유자>[:<그룹>] <파일 혹은 디렉토리>

EX>

  chown root /u           /u의 소유자를 "root"로 바꿈

  chown root:staff /u    똑같으나, 그룹은 "staff"로 바꿈

  chown -hR root /u     /u와 하위 파일의 소유자를 "root"로 바꿈


$ chgrp [옵션] <그룹> <디렉토리 혹은 파일명>

EX>

  chgrp staff /u /u의 그룹을 "staff"로 변경

  chgrp -hR staff /u /u와 하위 파일들의 그룹을 "staff"로 변경


$ chmod

해당 디렉토리나 파일의 퍼미션을 변경

심볼릭 모드

$ chmod [a, u, g, o] [+ / -] [r, w, x] [해당 파일 또는 디렉토리]

a : 모든 사용자

u : 소유자

g : 소유 그룹

o : 나머지 사용자


+ : 퍼미션 추가

- : 퍼미션 삭제


r : 읽기

w : 쓰기

x : 실행


EX> file1 이란 이름의 파일에서 나머지 사용자의 읽기 퍼미션을제거 

$ chmod o-r file1


8진수 모드

$ chmod [8진수] [해당 파일 또는 디렉토리]

8진수 모드에서 4 = 읽기, 2 = 쓰기, 1 = 실행을 의미 하며 퍼미션은 허용된 각 숫자의 총합으로 표시.

읽기와 실행이 허용되었다면 5, 모두 허용되었다면 7 등의 형식.

<소유자> <소유그룹> <나머지사용자> 순서대로 한자리씩 총 3자리의 숫자로 표시.


EX> file1에 소유자에겐 모든권한, 소유 그룹엔 읽기와 실행, 나머지 사용자에게는 읽기만은 허가

$ chmod 754 file1

7 : 소유자에게 모든 권한

5 : 소유 그룹에게 읽기와 실행

4 : 나머지 사용자에게는 읽기만



setuid, setgid

setuid는 심볼릭 모드로 's'로 표현되고 8진수 모드로는 4000 으로 표현

setuid 퍼미션이 설정되어 있는 실행 파일은 실행되는 동안에는 그 파일의 소유자 권한을 가지게 된다.


setgids도 심볼릭 모드로 's' 하지만  8진수 모드는 2000 이다.

setgid 퍼미션이 포함되어 있는 실행 파일은 실행되는 동안은 그 파일의 소유 그룹의 권한을 가지는 것 빼고는 setuid와 같다. 


EX>

setuid : 

-rwsr-xr-x    1 root     root        14112  1월 16  2001 /bin/su 


setgid :

-rwxr-sr-x    1 root     root        14112  2월 5  2001 /usr/bin/man 


file1 이라는 실행 파일에 setuid 퍼미션을 설정할 때

$ chmod 4755 file1


 file1 이라는 실행 파일에 setgid 퍼미션을 설정할 때

$ chmod 2755 file1


sticky bit

나머지 사용자의 쓰기 권한에 대한 특별한 퍼미션

/tmp 디렉토리와 /var/tmp 디렉토리에의 퍼미션이 stickbit가 포함되어 있다. 

sticky bit는 8진수 모드로는 1000으로 설정되고 심볼릭 모드로는 't' 또는 'T' 로 설정된다.

이 sticky bit가 포함되어 있는 디렉토리에 나머지 사용자가 쓰기 권한이 있을 경우 나머지 사용자들은 디렉토리 안에 파일을 만들 수는 있어도 디렉토리 삭제는 할 수 없다. 


sticky bit를 적용할려면 당연히 쓰기 권한도 주어야 되다.


EX>

sticky bit가 포함되어 있는 디렉토리의 ls -al 결과

drwxrwxrwt   14 root     root         4096 Aug 30 02:05 /tmp


dir1 이라는 디렉토리에 sticky bit를 설정할 때

$ chmod 1707 dir1   또는 $ chmod 1777 dir1


$ mv [옵션] <이동 원본> <이동 대상>

파일이나 디렉토리를 이동

$ rm [옵션] <삭제 대상>

파일을 삭제

$ pwd(present working directory)

현재 위치하고 있는 작업 디렉토리 출력하는 명령

$ mkdir 

디렉토리 생성

$ mrdir

디렉토리 삭제

$ gpasswd

그룹에 유저 추가 삭제 등등

Posted by 하품 - yawn 하품 - yawn
OS/Linux2013.04.16 12:42


1. 리눅스 RunLevel?

간단하게 윈도우의 기본 부팅, 안전모드로 부팅 등등과 동일한 개념이라 생각하면 된다.


RunLevel 0 : 시스템 종료(halt)

RunLevel 1 : 단일 사용자, 싱글 모드

RunLevel 2 : NFS(Network File System)를 지원하지 않는 다중 사용자 모드

RunLevel 3 : 모든 기능을 포함한 다중 사용자 모드(X윈도우 지원안함)

RunLevel 4 : 사용되지 않는 실행모드(사용자가 직접정의하여 사용)

RunLevel 5 : X윈도우 부팅, GUI환경

RunLevel 6 : 시스템 재부팅


런 레벨 전환

$  init 3


기본 런 레벨 설정

/etc/inittab 를 열어서

# Default runlevel. The runlevels used by RHS are:

#   0 - halt (Do NOT set initdefault to this)

#   1 - Single user mode

#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)

#   3 - Full multiuser mode

#   4 - unused

#   5 - X11

#   6 - reboot (Do NOT set initdefault to this)

#

id:5:initdefault:     # 이부분을 변경한다. 보통 3이나 5.



Ubuntu / Debian 계열의 리눅스는 런레벨이 조금 다르다.

RunLevel 0 - Halt

RunLevel 1 - Single

RunLevel 2 - Full multi-user with display manager (GUI) 현재 기본

RunLevel 3 - Full multi-user with display manager (GUI)

RunLevel 4 - Full multi-user with display manager (GUI)

RunLevel 5 - Full multi-user with display manager (GUI)

RunLevel 6 - Reboot


런 레벨 전환

$ telinit N (N 에 숫자)


기본 런 레벨 설정

/etc/init/rc-sysinit.conf 열어서

# Default runlevel, this may be overriden on the kernel command-line

# or by faking an old /etc/inittab entry

env DEFAULT_RUNLEVEL=2  #이부분의 숫자를 바꿔준다.



2. 자동실행에 관해

리눅스는 부팅시 init 프로세스가 RunLevel에 따라 각 데몬을 자동 실행시키는데 이 자동실행 스크립트들이 등록된 곳이 /etc/rc0.d/ ~ /etc/rc6.d/ (rc{숫자 0  ~ 6 }.d) 이다.

ex> 런레벨 3으로 부팅시 /etc/rc3.d/ 에 등록된 스크립트들을 자동실행.


자동실행 스크립트 등록 순서

/etc/init.d/ 안에 자동실행 스크립트 작성

각각의 런 레벨에 따라 /etc/rcN.d/ 에 심볼릭 링크 생성

ex> 3레벨과 5레벨시 자동실행을 시키고자 하면 /etc/rc3.d/ 와 /etc/rc5.d/ 에 심볼링 링크를 생성한다.


3. 자동실행 스크립트 등록 예시

이전 포스팅에서 설치한 BitNami LAMPstacks의 실행 스크립트 (ctlscript.sh)를 리눅스 부팅시 자동으로 시작 되도록 등록해 보겠다.

리눅스 버전 : 우분투 서버 12.04 LTS


1. /etc/init.d/에 스크립트 작성. 파일명은 lampstacks

#vi /etc/init.d/lampstacks

#!/bin/bash

#lampstacks


export LAMP_HOME=/opt/lamp


case "$1" in

start) #on booting

echo -n "Starting LampStacks : \n"

$LAMP_HOME/ctlscript.sh start

echo

;;

stop) #on shutdown

echo -n "Shutting Down Lampstacks : \n"

$LAMP_HOME/ctlscript.sh stop

echo

;;

restart) #on restarting

echo -n "Restarting LampStacks : \n"

$LAMP_HOME/ctlscript.sh restart

echo

;;

*)

echo "Usage : $0 {start|stop|restart}"

exit 1

esac

exit 0


2. 파일 권한 주기

$ chmod 755 /etc/init.d/lampstacks


3. 실행시킬 런 레벨에 심볼릭링크 등록

예시로 2레벨과 3레벨 부팅시 자동 실행 되도록 등록 한다.

각각 /etc/rc2.d/ 와 /etc/rc3.d/ 폴더 아래에서

ln -s /etc/init.d/lampstacks S90lampstacks

심볼릭 링크들은 이름이 [S 혹은 K](숫자){이름} 형태로 등록이 되어 있는데

S는 스크립트의 실행을(start) K는 스크립트의 종료(kill)를 의미하며, 숫자는 해당 스크립트의 실행 순서이다.

폴더내에 그 숫자가 작은 스크립트부터 먼저 실행된다.


리눅스 종료시 해당 스크립트가 종료되도록

/etc/rc0.d/에도 심볼릭 링크를 등록하자

ln -s /etc/init.d/lampstacks K19lampstacks


Posted by 하품 - yawn 하품 - yawn
TroubleShooting2013.04.15 17:46

Q : 상황

사용 버전 : Ubuntu 12.04.2 LTS 서버

윈도우 상에서 VMPlayer를 이용하여 우분투를 설치하였고 네트워크는 NAT

외부접속을 위한 NAT Setting을 마친 상태이다.

apt-get install을 통한 ssh 등은 잘 설치되고, APM설치로 외부에서 서버 접속시 웹 페이지도 잘 뜨는 상황.

즉 인터넷 연결은 문제가 없다고 보여지는 상황.


그러나 apt-get update를 할경우 서버 연결에 실패한다. 

업데이트 서버의 주소를 찾지 못하는 에러가 계속 발생.

Ex> 다음과 같은 형태의 에러메세지가 계속 출력 됨

Err http://security.ubuntu.com precise-security InRelease


Err http://kr.archive.ubuntu.com precise-backports InRelease


Err http://security.ubuntu.com precise-security Release.gpg

Temporary failure resolving 'security.ubuntu.com'

Err http://kr.archive.ubuntu.com precise Release.gpg

Temporary failure resolving 'kr.archive.ubuntu.com'

Reading package lists... Done

W: Failed to fetch http://kr.archive.ubuntu.com/ubuntu/dis ... /InRelease 


W: Failed to fetch http://security.ubuntu.com/ubuntu/dists ... /InRelease 


W: Failed to fetch http://kr.archive.ubuntu.com/ubuntu/dis ... elease.gpg Temporary failure resolving 'kr.archive.ubuntu.com'


W: Failed to fetch http://security.ubuntu.com/ubuntu/dists ... elease.gpg Temporary failure resolving 'security.ubuntu.com'


kr.archive.ubuntu.com 을 us.archive.ubuntu.com 이나 ftp.daum.net 등으로 바꾸어도 동일한 에러가 지속 된다.



A : 해법


계속 구글링을 해본결과 DNS주소를 바꿔주면 된다는 의견을 접함.


$ vi /etc/network/interfaces 를 열고


dns-nameservers 8.8.8.8 8.8.4.4 를 추가.


$ vi /ect/resolv.conf 를 열고


nameserver 8.8.8.8

nameserver 8.8.4.4

를 추가


이후 apt-get update 정상적으로 작동한다.


Posted by 하품 - yawn 하품 - yawn
OS/Linux2013.04.15 11:18


APM, apahce, php, mysql을 한번에 설치해주는 툴은 굉장히 많습니다. 그중에서 bitnami에서 제공하는 툴을 이용하여 설치하는 방법입니다.

사실 방법이랄 것도 딱히 없고 굉장히 쉽습니다.


리눅스는 Ubuntu Server를 사용한다고 가정 하겠습니다.


1. www.bitnami.com 사이트에서 LAMP stack 파일을 다운 받습니다.

LAMP 는 linux, apache, mysql, php 의 앞글자

http://bitnami.com/stack/lamp 


2. 설치 합니다. 

bitnami-lampstack-xxxxxxx.run 파일이 있는 폴더로 이동합니다.

프롬프트에서 다음과 같이 파일의 권한을 주고, 바로 실행합니다.


$ chmod 755 bitnami-lampstack-xxxxx.run

$ ./bitnami-lampstack-xxxxxxxx


3. 해당 툴이 포함한 프레임워크를 함께 설치할 것인지 묻는 화면이 나타납니다.

zend, codeigniter, symphony 등등 여러가지가 있는데요?

필요하면 y를 필요 없다면 n을 입력하시면 됩니다.

(phpmyadmin은 무조건 포함됩니다)


이후 설치할 폴더를 입력하는 화면이 나타나면 설치할 폴더를 입력하고 엔터.

(mysql 비밀번호를 묻는 질문도 나옵니다)


4. 다 설정하고 마지막으로 설정확인을 묻는 질문에 y를 눌러주시면 설치가 다 완료 됩니다.


설치는 여기서 끝입니다.

간단하죠?



서버의 실행은?


설치폴더/ctlscript.sh start


를 하시면 구동 상황을 알려주며 아파치 서버가 실행됩니다.

정지 하실땐 ./ctlscript.sh stop 재시작은 ./ctlscript.sh restart 입니다.


서버를 구동하고, 서버의ip를 웹브라우저에 입력하시면 bitnami에 관해 갈략하게 써 있는 기본 페이지가 로드가 됩니다.



기타 설정

<아래의 내용은 본인이 사용하는 설정입니다. 어디서 설정을 하는지를 알기위해 적는 것이기에 똑같이 할 필요는 없습니다>


php.ini 

위치 : 설치폴더/php/etc/php.ini


옵션 설정

date.timezone = “Asia/Seoul”

short_open_tags = On 


phpmyadmin 

위치 : 설치폴더/php/apps/phpmyadmin/


phpmyadmin의 기본 계정 : root

암호 : LAMP stack 설치시 입력한 암호


계정추가는 로그인 후 mysql Database의 user Table 에 추가


codeigniter 사용 설정

설치폴더/apache2/conf/httpd.conf 열어서

맨 아래의 include 중

Include "/opt/lamp/frameworks/codeigniter/conf/codeigniter.conf"

주석 해제

서버ip/codeigniter 를 인터넷주소창에 입력하면 코드이그나이터 프레임워크 기본 페이지가 열립니다.


위 기본페이지를 서버의 default 페이지로 설정하기

설치폴더/frameworks/codeigniter/conf/codeiginiter.conf 열어서

상단 alias 어쩌구 부분을


DocumentRoot "설치폴더/frameworks/codeigniter/htdocs"

# Alias "installdir/frameworks/codeigniter/htdocs"

# Alias /codeigniter/ "installdir/frameworks/codeigniter/htdocs/"


형태로 변경



Posted by 하품 - yawn 하품 - yawn
OS/Linux2013.04.11 16:54


* VM플레이어에 Ubuntu 가 설치되어 있음을 가정한다.

* VM플레이어 버전은 4.x 이하여야 한다. 5.x이상부터는 현 방법으로는 불가능 하다고 보여진다.(중요한 파일인 vmnetcfg.exe를 못찾겠음)


1. sudo apt-get install ssh 로 ssh 설치


2. VM플레이서 설치파일을 찾는다.

찾아서 다음의 명령어를 이용하여 압축을 푼다.

VMware-player-4.x.x-어쩌구.exe /e C://\압축풀폴더


3. 압축을 푼 폴더에서 network.cap 를 찾아 이를 다시 압축을 풀고 그 안에서 vmnetcfg.exe 를 찾아서 이 파일을 VM플레이어가 설치된 폴더로 옮긴다(헉헉)


4. vmnetcfg.exe 실행.


5. 나타난 목록중에 Type이 NAT인 걸 선택 (보통 이름이 vmnet8) 후 NAT Settings를 눌러

subnetmask① 와 gateway IP②를 기억 한다.


6. 좀 더 밑의 DHCP Settings 를 눌러 start ip address 와 end ip address 사이의 맘에 드는 ip를 기억한다.③


7. 터미널에서 sudo vi /etc/network/interfaces 실행하여

다음 형태로 수정한다.


auto eth0

iface eth0 inet static

address ③의 주소

netmask ①의 주소

gateway ②의 주소


수정 후, sudo /etc/init.d/networking restart  혹은 리눅스 재부팅으로 설정을 적용한다.


8. 5.번의 NAT Settings에서 보면 Port Forwarding 이 있다. 여기에 이미 추가된게 있을 수 있고 없을 수도 있는데

없다면 ADD를 눌러 추가하고, 있다면 삭제하고 ADD하던, 수정을 하던 하자


보통

HOST prot :22

type :TCP

virtual machine Ip Address : ③의 ip 주소

virtual machine port : 22

description : 마음대로

로 한다.


9. 여기서 Vm플레이어가 설치된 PC가 아니라 외부 PC에서 우분투로 SSH 접속을 하려면 한가지 더 해주어야 하는데

그건 윈도우 방화벽에서 예외 조건으로 방화벽을 풀어주는 것이다.


설치한 OS가 윈도우 7이라 가정하면

제어판 -> windows 방화벽 -> 고급설정 -> 인바운드 규칙 -> 새 규칙

을 하여 22번 포트에 대한 예외를 만들어 방화벽을 열어주어야 한다.


10. 이제 putty 등 터미널 접속프로그램을 이용하여 원격접속을 하면 된다.




참조 : http://greenfishblog.tistory.com/34

Posted by 하품 - yawn 하품 - yawn