zend_parse_parameters 함수를 사용합니다.

아마 매크로겠지만 그런 것 까지 신경쓰진 않습니다. ㅎㅎ


함수 만들기 기본 설명, 상세 파라미터 종류 들은 http://www.php.net/manual/en/internals2.funcs.php 에서 볼 수 있습니다..만 퍼옵니다.

 Spec

 Type

 Locals

 a

 array

 zval*

 A

 array or object

 zval*

 b

 boolean

 zend_bool

 C

 class

 zend_class_entry*

 d

 double

 double

 f

 function

 zend_fcall_info*, zend_fcall_info_cache*

 h

 array

 HashTable*

 H

 array or object

 HashTable*

 l

 long

 long

 L

 long (limits out-of-range LONG_MAX/LONG_MIN)

 long

 o

 object

 zval*

 O

 object (of specified zend_class_entry)

 zval*, zend_class_entry*

 p

 string (a valid path)

 char*, int

 r

 resource

 char*

 s

 string

 char*, int

 z

 mixed

 zval*

 Z

 mixed

 zval**


3번째 파라메터 문자열은 어떤 변수타입들을 받을지, 4번째 이후는 받을 변수들입니다.

zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "받을변수타입들", &변수1, &변수2, ....)


간단히 예시로 정리하면..

// bool : zend_bool
PHP_FUNCTION(test_func1)
{
	zend_bool bool_test;
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &bool_test) == FAILURE) {
		RETURN_NULL();
	}
	
	if(bool_test==1)
	{
		// true
	}
	else
	{
		// false
	}

	RETURN_NULL();
}

// long
PHP_FUNCTION(test_func2)
{
	long long_test;
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &long_test) == FAILURE) {
		RETURN_NULL();
	}
	RETURN_NULL();
}

// string
PHP_FUNCTION(test_func3)
{
	char* str_test;
	int str_test_len;
	// 문자열의 경우 파라메터가 무조건 2개임을 명심..
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str_test, &str_test_len) == FAILURE) {
		RETURN_NULL();
	}
	RETURN_NULL();
}



여러개일 경우는 그냥 타입을 여러개 쓰고 문자열같은 경우는 깊이값도 같이 받아주면 됩니다.


// multiple params
PHP_FUNCTION(test_func4)
{
	long a;
	double b;
	zend_bool c;
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ldb", &a, &b, &c) == FAILURE) {
		RETURN_NULL();
	}
	RETURN_NULL();
}


// multiple params with string
PHP_FUNCTION(test_func5)
{
	long a;
	double b;
	zend_bool c;
	char * d;
	int d_len;
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ldb", &a, &b, &c, &d, &d_len) == FAILURE) {
		RETURN_NULL();
	}
	RETURN_NULL();
}



리턴도 간단합니다.

자세한건 이 링크를 참고하면 되고.. http://docstore.mik.ua/orelly/webprog/php/ch14_08.htm


다른 타입들도 맞춰서 하면 됩니다. 잘 정리되어있네요.

RETURN_RESOURCE(int r);
RETURN_BOOL(int b) ;
RETURN_NULL( );
RETURN_LONG(int l) ;
RETURN_DOUBLE(double d) ;
RETURN_STRING(char *s, int dup) ;
RETURN_STRINGL(char *s, int l, int dup);
RETURN_EMPTY_STRING( );
RETURN_FALSE ;
RETURN_TRUE;
RETVAL_RESOURCE(int r);
RETVAL_BOOL(int b);
RETVAL_NULL( );
RETVAL_LONG(int l);
RETVAL_DOUBLE(double d);
RETVAL_STRING(char *s, int dup);
RETVAL_STRINGL(char *s, int l, int dup);
RETVAL_EMPTY_STRING( );
RETVAL_FALSE;
RETVAL_TRUE;

// return null
PHP_FUNCTION(test_func_ret1)
{
	RETURN_NULL();
}

조금 골치 아픈 건 배열이나 클래스인데 배열만 좀 써보면..

// assoc_array
PHP_FUNCTION(test_func_ret2)
{
	// return_value 는 zval* 타입입니다.
	// 선언은? 글로벌인지 로컬인지 모르겠지만 어딘가에서 해놨나봅니다. 다시 선언하면 오류납니다.
	array_init(return_value);

	add_assoc_long(return_value, "x", 123);
	add_assoc_double(return_value, "y", 456.7);
}

이러면 됩니다.

따로 return 명령을 내리지 않아도 리턴이 됩니다.

PHP에서 받아보면 이런 형태죠

<?php
$ret = test_func_ret2();
var_dump($ret);
?>

array(2) {

["x"]=>

int(123)

["y"]=>

float(456.7)

}


그럼 배열 안의 배열은 ? (subarray)

어떤 함수가 있는지는 PHP 페이지에 있습니다. http://www.php.net/manual/ro/internals2.variables.arrays.php


// sub_array PHP_FUNCTION(test_func_ret3) { zval *subarray; // 요걸 하나 만들어둡니다. int i; array_init(return_value); // 당연히 초기화 하고 for(i=0; i<3; i++) // 3개를 추가해보겠습니다. { MAKE_STD_ZVAL(subarray); // 이름봐선 데이터를 널이나 0으로 채워주는 놈인가봅니다... array_init(subarray); // 추가할 서브배열도 초기화하고 // 값들을 집어넣습니다. add_assoc_long(subarray, "x", 123); add_assoc_double(subarray, "y", 456.7); // 리턴할 값에 서브배열을 추가합니다. add_next_index_zval(return_value, subarray); } }


결과를 찍어보면?

<?php
$ret = test_func_ret3();
var_dump($ret);
?>

요렇게 나오겠죠

array(3) {

[0]=>

array(2) {

["x"]=>

int(123)

["y"]=>

float(456.7)

}

[1]=>

array(2) {

["x"]=>

int(123)

["y"]=>

float(456.7)

}

[2]=>

array(2) {

["x"]=>

int(123)

["y"]=>

float(456.7)

}

  }


Posted by freezn

PHP 모듈 작성 시 다음과 같은 오류 메세지가 나오는 경우가 있다.

error: 'PHP_FE_END' undeclared here (not in a function)


1. 

내 상황은 서버가 centos6.3 으로 php 는 rpm으로 설치되어있다.


php-devel 패키지도 설치해놨지만 ext_skel 은 없었고 구글링하다보니 src.rpm 을 던져주는 링크만 나오더라.

https://www.centos.org/forums/viewtopic.php?t=28478


2.

굳이 src.rpm으로 작업하고 싶은 생각은 없어 그냥 php-5.3.3 의 소스를 찾았지만 나오질 않는다.

그냥 php-5.3.28 을 받아 타르볼을 풀고

ext로 들어가 알려진대로


./ext_skel --extname=test_mod


cd test_mod


vi config.m4

10라인, PHP_ARG_WITH(test_mod, for test_mod support,

12라인, [  --with-test_mod             Include test_mod support])

에서 dnl 주석 해제


phpize

./configure

make


3.

뭐 이런 수순으로 스켈레톤을 빌드 해보는데 정의되지 않았다고 오류가 발생한다.

libtool: compile:  cc -I. -I/ ~~~~ :43: error: 'PHP_FE_END' undeclared here (not in a function)

make: *** [test_mod.lo] Error 1


4.

구글링해보니 PHP_FE_END는 php-5.3.10 부터 등장했단다. https://github.com/sqmk/pecl-jsmin/issues/23

이하버전에 호환되는 모듈을 뒤져보니 

{NULL, NULL, NULL}

다행히도 PHP_FE_END 대신 쓰이는 놈이 있다.

덜 게으르면 버전 확인해서 #if 하겠지만 한두개 뒤져봤을 때 PHP 버전 정의가 잘 안뵌다.

여러버전에서 자주 컴파일 할일이 있을 때 까진 그냥 이리 써야겠다.

test_mod.c :

const zend_function_entry test_mod_functions[] = {

PHP_FE(confirm_test_mod_compiled, NULL) /* For testing, remove later. */

//PHP_FE_END /* Must be the last line in test_mod_functions[] */ // PHP 5.3.10 ~

{NULL, NULL, NULL} /* Must be the last line in test_mod_functions[] */ // PHP 5.3.10 under

};


Posted by freezn

IDC에 넣기전에 초기 인스톨에서만 필요하니 iLO4 트라이얼라이센스를 받아 설치했다.


몇몇작업을 끝내고 다음날 나머지 작업을 하려하니 트라이얼라이센스가 증발해있고 다시 입력하면 이미 사용했다고 나온다.


구글링 결과 이유는 NTP 동기화로 트라이얼라이센스 설치 후 시간이 뒤늦게 갱신된 경우 트라이얼 라이센스 사용기간인 60일 이상이 점프되어 그럴 수 있다는 글이 몇몇 보인다.


iLO를 리셋하면 된다는 말이 있지만 효과가 없다.


트라이얼 같은 기간한정라이센스 설치 시 iLO시간도 확인이 필요해보인다.

Posted by freezn

먼저 간단한 z410 후기를 쓰면


1600*900 이상 해상도,

키보드 배열이 나쁘지 않고 (page up, page down, home, end 증발 혹은 fn 키를 눌러야 하는 놈들 패스),

i5 이상이지만 저전력 모델은 패스,

후 가격 오름차순 정렬 하니 Z410 이 나왔습니다.


직전까지 쓰던 Thinkpad x201i 나 울트라나브 키보드로 너무 익숙해진 빨콩과 키감, 키배열을 너무 원했지만 Thinkpad 후속 모델들은 키보드 배열이 너무 끔찍해졌네요..

e440도 저렴하고 마음에 들지만 안타깝게도 키배열이 너무 싫은 배열이라..

Z410은 내장 그래픽으로 HD4600, 추가 그래픽으로 GT740m 이 달려있다지만 64bit라 그리 큰 성능을 기대하긴 어렵다고 합니다.

디아블로3 확장팩을 돌려보니 해상도를 1366으로 낮추고 조금 낮추니 그럭저럭 돌아갑니다.

액정은 저가 노트북에 들어가는 TN이 다 그렇듯 그저그런 시야각을 보여줍니다.

성능도 괜찮고 소음도 괜찮고

뭐 그럭저럭 저렴하고 마음에 드는 노트북을 산 것 같네요.


Thinkpad edge E440이랑은 거의 사양이 같은 모델인데

E440이랑 비교해서 장점은

- Home, End, Page Up, Page Down 버튼이 오른쪽에 모두 따로 있다는 점 (기존 울트라나브형태였으면 무조금 e440을 샀을거예요ㅠㅠ)

- 우측 Shift키가 작아 쌍욕 방지 (는 농담이고 적응할 필요도 없이 잘 타이핑되네요 ㅎㅎ)

- 흰색에 매끈한 디자인으로 때끼는 게 눈에 띄어서 청소를 열심히 하게 만들어줍니다. (사실 때끼는 재질은 아녜요 ㅎㅎ)

- Thinkpad에만 제공되는 원링크독이 제공되지 않아 원링크독 뽐뿌 방지

- Thinkpad에만 제공되는 하드디스크 및 메모리의 쉬운 교체 구조가 제공되지 않아 하드디스크 및 메모리 뽐뿌 방지

...아...... 증말 새 tp키보드 레이아웃에서 home end 를 fn이랑 같이 누르게 만든 인간은 누구일까요 -_-;


상판 로고 l자의 얼룩 같은건 대인배니까 그냥 넘어갑니다 ㅎㅎㅎㅎㅎ


---


그런데 문제는 디스크.

뭔가 반응이 이상하고 느립니다.

미세하게 끼릭끼릭하는 소리도 나는 것 같았는데 이건 디스크는 아니고 온도가 낮아져 팬이 멈췄을 때 나는 소리였나보네요.

hdtune 정보를 보면 경고도 좀 들어와있습니다. (crc)


내장 디스크가 악명 높은 ST1000LM024.. 삼성 스핀포인트->시게이트로 인수 후 이상하게 굴러가는 그놈입니다.

( 관련 링크 : http://blog.naver.com/yeongjoon890?Redirect=Log&logNo=70157261362 )


아아.. 절대 이 노트북에서도 SSD가 쓰고 싶어서 그런건 아니구요.

어쨌든 ...

usb 2.0 외장하드케이스에 끼우고 복사했더니 무지막지 오래 걸리네요.


아래쪽에 첨부한 혹성 베지터님 글을 먼저 봤으면 좋았겠지만 아쉽게도 하드웨어 메뉴얼만 보고 도전했습니다.

thinkpad 에서 배웠는지 메뉴얼이 잘되어있...(다고 생각했는데....orz) 거든요.


웬만하면 서비스센터로 가시길 권합니다. 분해에 함정이 몇가지 있는데

1. 키보드 빼다가 자칫하면 날아가는 키캡을 볼 수 있어요 ㅜㅜ

2. 베이스커버 뜯기가 어려워요..ㅜㅜ

3. 배터리팩이 내장인데 베이스커버 뜯기전까진 배터리팩을 뺄 수 없어요.. 분해하는 내내 불안해요..


---


46p 에 1050 Hard Disk drive 부분을 보면

먼저

1010 Keyboard (p33)

1020 Optical drive (p37)

1030 Base cover (p39)

1040 Battery Pack (p44)

를 분리하라고 나오는데요. (헐............. X201i 는 디스크만 딱 뺄 수 있었는데............)


준비물은 작은 드라이버, 클립, 안쓰는 카드, 그리고 이왕이면 아이폰 등 분해도구(주걱) 입니다.


1. 키보드 분해

키보드 분해는 아랫면(베이스커버) 나사 3개 를 빼고 나사구멍을 찌르라고 되어있는데,

이때 클립을 펴서 사용하면 됩니다.

푹 찌르면 키보드가 밀려서 빠지게 되는데 절대 중앙 나사구멍은 찌르지마세요. 

(사진은 혹성베지터님 글에서 발췌)


아래쪽 구멍을 쑤시게 되면 이런 상황이 일어날 수 있습니다.

K자 인데요. 왼쪽 위 구멍 보이시나요? 저 자리가 아래쪽 구멍이라 키캡이 가출해버릴 수 있습니다. 끼우느라 생고생.

플랫 케이블은 고정해주는 놈(검은색)을 제껴주면 바로 빠집니다.


2. ODD 분해

간단합니다.

37p 를 보시면 odd를 고정하는 나사는 하나구요.

나사를 빼고 드라이버로 나사 뺀 자리를 살짝 밀고 바깥에서 당기면 쑥 빠집니다.

멀티부스트나 웨이트세이버를 장착하려면 여기까지만 하면 되지요.



3. 베이스 커버(뒷면 커버) 분해

각종 분해 도구들을 동원할 차례입니다.

솔직히 서비스센터에 가시길 권장합니다.


3-1. 나사 빼기야 뭐 쉽죠.

그림 왼쪽에서 2번째.. 쿨러에 있는 나사는 분해 확인용 스티커를 제거해야 뺄 수 있습니다. 스티커를 제거하면 보증이 어떻게 되는지 모르겠네요.


3-2. 뒷면 나사도 쉽습니다.

발받침은 양면테이프로 붙어있는게 아니고 끼워있는거라 1자 드라이버 같은걸로 밀면서 들어올리면 빠지고, 다시 끼우기도 좋습니다.

3-3. 그런데 이거. 베이스커버를 들어올리라는데..

나사를 다 빼도 베이스커버는 빈틈없이 끼워져있습니다.

분해 좀 해보신 분은 능숙하고 손상없이 분해하실테지만 저같은 곰손은 어쩔줄을 모릅니다.

손톱.. 이왕이면 분해도구(주걱)로 벌리고 안쓰는 카드를 끼워넣어 돌리면서 벌려주면 두둑두둑 하면서 빠집니다.

하판과 상판을 고정해주는 약해보이는 플라스틱걸쇠들이 많아요.

평면인 놈도 아니고 군데군데 모양이 들어가있고 얇아서 정말 빼기 무섭습니다.

분해 초보라 여기서는 사진 찍을 생각도 못했어요. 


4. 배터리팩 분리

어렵지 않아요.

커넥터 빼고 나사 2개 빼면 되요.

배터리가 끼워져있다보니 분해하다가 전원을 켜더라도 당황하지 말고 도로 꺼주세요 ㄷㄷㄷㄷ


5. 대망의 하드 디스크 드라이브

어려울건 없는데 스피커 망가뜨리지 않게 조심하세요.


분해 끝..!!

분해할 때 나사들은 순서대로 분류해서 두면 조립은 분해의 역순이니 도움이 되죠!! 

램은 하이닉스가 꽂혀있네요.



X110 256GB인데 용량이 차있어서 그런지 성능은 그냥저냥 나왔습니다.


..램을 더 달고 싶은데 미리 사놓고 분해할 걸 그랬나봐요. orz



관련 자료 :

혹성 베지터 님 리뷰 및 분해기 :

http://bbs.danawa.com/view.php?board=28&site=5&seq=2573715&snb=comm


레노버  z410 하드웨어관리 메뉴얼

http://download.lenovo.com/consumer/mobiles_pub/lenovo_z410z510z510touch_hmm.pdf

링크 끊길 까봐 첨부 :

lenovo_z410z510z510touch_hmm.7z.001

lenovo_z410z510z510touch_hmm.7z.002


Posted by freezn