php 는 "Array To String"이나, "String To Array" 가 지원됩니다, implode가 그 전자이고, explode가 후자. 일단 형식은 implode ( string glue, array pieces) glue를 구분자로 배열 pieces를 string으로 만듭니다. ""와 같은 형태로 구분자 없이 string으로 만들수도 있습니다. 아래는 간단한 예제 explode의 형식은 explode ( string separator, string string [, int limit] ) 위와 같은 형태가 되겠습니다. 아래는 간단한 예제
array_fill ( int start_index, int num, mixed value ) start_index 부터 num 까지의 값을 value로 채웁니다. 배열 초기화를 위해 c언어의 memset 같은 함수를 찾다가 발견, 나름 유용할때가 있습니다, 이를테면, size 200인 배열에 특정 index만큼만 값을 세팅해야 하는 경우가 있는데, 나머지는 default로 채워야 한다거나, 특정 값으로 채워야 할때 불필요하게 for문이라든지 반복문을 통해 값을 채워야 하는 .. 그런 비생산적인 코드를 막을 수 있습니다.
임베디드 개발자라면 메모리는 곧 돈입니다. 그러므로 가능한 코드에서 메모리를 효율 적으로 사용하고 가능한 최적화된 코드를 작성해야 합니다. (물론 가독성이 현저히 떨어진다면 고려해 보아야겠지만..) 여기 비용 선택에 따른 연산자 분류가 있습니다. 첫번째로 흔히 나머지를 구할때 사용하는 % 연산자. 그리고 몫을 구하는 / 연산자. 예를 들어 아래와 같은 코드가 있다고 보면 x %= 10 이는 역어셈 결과 mov, cdq, mov, idiv, mov 다섯 과정을 거칩니다. 반면 아래의 코드는 같은 결과를 얻지만, mov, and, mov 세가지 과정으로 결과를 산출합니다. x &= 10 그럼 몫을 구하는 연산자를 살펴봅시다. x /= 10 위와 같은 코드는 나머지를 구하는 연산 보다 더 많은 연산을 합니다...
코드가 방대해지기 시작하면, 배열이 커지기 마련이고, 특히나 php의 경우 사기언어(?) 이므로... 최초 의도했던 용도와는 다르게 배열의 차수가 달라지기도 합니다. 이를테면 1차원 배열로 사용을 하는게 목적이었으나... 급히 2차원 배열로 변경한다든가.. (이는 목적에 따라 최초1차원 배열로 사용을 하였지만, 요구사항에 따라 2차원 배열로 행해지는 경우) 그렇게 되면 나중에 특정 배열 변수를 놓고 값을 체크하는게 난감한 경우가 있습니다. 보통의 1차원 배열이나, 그 이상의 배열의 경우 목적이 분명하고 차원이 분명하다면, for문 돌려서 echo로 충분히 배열 내용을 알수 있다. 하지만 배열의 키(index)값이 default(0부터 증가하는 숫자)가 아니라면, 정확히 그 배열에 어떤 키와 값이 있는지 ..
간단한 php Warning, 우선 코드상에 아래와 같은 구문을 찾아냅니다, $a = 5; $a[0] = 3 당연히 말도 안되게 쉬운 예로 들었지만, 코드가 길어지고 변수를 global 하게 사용하다 보면 종종 발생하는 실수입니다. (어쩌면 php 이기 때문에 발생하는 버그라는 생각도 듭니다, 왜냐하면 php는 왠지 모르게 뭐든 될것같은 .. 그런 느낌이 강해서일까..) scalar 와 array를 정확하게 구분지어 사용하는 버릇을 들이도록 합시다 :) 모든 코딩의 기본이고, 우리의 코드는 소중하니까요~
이름 그대로 pages를 Mbyte 단위로 return 하는 함수입니다. 일단 무식하게 산술 연산을 통해 pages를 Mbyte로 나타내봅시다, 예를 들어 pages가 4096이라 하면, 1 PAGE의 사이즈인 4096에 4096(bytes)를 곱하게 되면 byte 단위의 결과가 나오게 됩니다, 이를 Mbyte로 나타내려면, 결과에 /1024, /1024 두번을 통해 byte --> Kbyte --> Mbyte 연산을 해야될텐데 수식으로 나타내면 아래와 같습니다. (4096 * 4096)/1024/1024 = 16 MB 뭔가 연산이 많은데요, 그렇다면 오늘 알아보는 pages_to_mb는 내부적으로 어떤 동작을 보일까요? 함수 내용은 아래와 같습니다. static inline unsigned long p..
for_each_possible_cpu() 는 CPU(NR_CPUS)의 갯수만큼 루프를 도는 커널 매크로. (kernel 2.6 기준) #define for_each_possible_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map) NR_CPUS는 Command-line option으로 제어가 가능하니 참고하도록 합시다. for_each_cpu_mask 내부는 아래와 같습니다. #if NR_CPUS > 1 #define for_each_cpu_mask(cpu, mask) \ for ((cpu) = first_cpu(mask); \ (cpu) < NR_CPUS; \ (cpu) = next_cpu((cpu), (mask))) #else /* NR_CPUS == 1 ..
dmesg는 커널에서 출력되는 메시지를 일정 수준 기록하는 버퍼입니다. 오늘은 이놈에 대해 조금 공부해봅시다, 특별한 기능 없어도, 아는것이 힘이니까. man page를 보면 아래와 같이 상당히 간략합니다. NAME dmesg - print or control the kernel ring buffer SYNOPSIS dmesg [ -c ] [ -n level ] [ -s bufsize ] DESCRIPTION dmesg is used to examine or control the kernel ring buffer. The program helps users to print out their bootup messages. Instead of copying the messages by hand, the us..
연속적이지 않은 메모리 공간을 사용할 수 있고, 물리 메모리의 크기와 관계없이 큰 주소 공간을 제공 받는 가상 메모리, vmalloc은 메모리의 어떤 영역을 차지하는지에 대한 궁금증이 생겼습니다. 우선 x86 System의 메모리 공간은 아래와 같이 나뉩니다 (절대적인 것은 아닙니다) ZONE_DMA 0~16M ZONE_NORMAL 16~896M ZONE_HIGHMEM 896 ~ end ZONE_NORMAL 영역이 896M까지인 이유는 vmalloc이 default 로 128M (상위 메모리 페이지 프레임을 매핑하기 위한 전용) 잡고 있기 때문, vmalloc을 kbyte단위로 너무 작게 설정할 경우 application영역의 메모리 size가 상대적으로 줄어 정상적인 kernel 부팅이 되지 않을수 있..
기본적으로 mysql 유저 관리 Table은 "mysql" database에 user에서 관리됩니다. 자 그럼 일단 패스워드 변경을 위해 mysqld 데몬은 잠시 죽여(?)두고 mysql 을 접속합니다. 그리고 mysql DB를 선택하도록 합시다. mysql> use mysql; DB를 선택했으면 user Table을 잠깐 살펴봅니다 (뭐 대충 어떻게 생겼는지는 알아야 수정해도 개운할테니까) mysql> select user,password from user; 다른 필드는 지금 중요한것이 아니니, 당장 필요한것만 확인하도록 하고, 이제 변경할 user name을 확인했다면 변경하도록 합니다. (공백 입력은 no password 상태로 만듬) mysql> update user set password=pas..
max select max(column_name) as max from tables_name min select min(column_name) as min from tables_name sum select sum(column_name) as sum from tables_name avg select avg(column_name) as avg from tables_name as 구문이 없는 경우 결과를 나타내는 Column name은 default로 입력 받은 내용이 들어갑니다. 대략 아래와 같이.. +-------------------------+ | max(column_name) | +-------------------------+ | 4815716 | +-------------------------+ ..
의미 : 백과사전 ================================================================ 원격 프로시저 호출(Remote procedure call, RPC)은 컴퓨터 프로그램이 다른 주소 공간에서 원격 제어를 위한 프로그래머의 세세한 코딩 없이 함수나 프로시저의 실행을 허용하는 기술이다. 다시 말해, 프로그래머는 함수가 실행 프로그램에 로컬 위치에 있든 원격 위치에 있든 간에 반드시 동일한 코드를 짜게 된다. 어떠한 소프트웨어가 객체 지향의 원칙을 사용하여 프로그래밍 때, RPC는 원격 호출(remote invocation) 또는 원격 메소드 호출(remote method invocation)이라고 일컫는다. 가끔 ONC RPC와 DCE/RPC와 같은 비호환..
kernel 코딩을 하다보면 특정 process를 재워야(?)할 때가 반드시 있습니다. 반대로 재워 놓은 process를 깨워야 할 시점이 있을텐데, 이와 관련된 함수가 바로 sleep_on()과 wake_up() 입니다. 함수 형태를 살펴보면 아래와 같습니다. sleep_on void sleep_on(wait_queue_head_t *q) { wait_queue_t wait; init_waitqueue_entry(&wait, current); current->state = TASK_UNINTERRUPTIBLE; add_wait_queue(wq, &wait); /* wq는 대기 큐 머리를 가리킴 */ schedule(); remove_wait_queue(wq, &wait); } wake_up void w..
ssl 을 사용하는 Web Daemon, 요녀석에 대한 재미난 사실을 포스팅합니다. lighttpd Daemon이 사용하는 config file 를 살펴보면, 사용 가능한 cipher-list 부분이 있는데, 이를 살펴보면 아래와 같습니다, ( lighttpd version에 따라 다를 수 있습니다.) ssl.cipher-list = "DES-CBC3-SHA AES256-SHA" cipher-list는 lighttpd Daemon이 설치되어 있는 site에 Web 접속 시에 사용되는 cipher인데, 이것은 explorer version에 따라 유동적입니다. cipher-list를 없애거나, explorer에서 지원하지 않는 cipher로 설정할 경우 Web 접속이 되지 않는것을 확인 할 수 있습니다. ..
hash_hmac을 이용한 암호화, hash의 성격대로 복호화는 사실상 불가능입니다. 함수 설명을 간단히 살펴보면 "Generate a keyed hash value using the HMAC method" 자, 예를 들어봅시다. test라는 FILE에는 "1"만 기록되어 있고 이 파일을 hash_hmac_file()하면 87a7fa188c5f20be866a6de2eaba1ce71a6cf50 요런 값을 얻을 수 있습니다, 그렇다면 test라는 FILE에 2를 기록하고 hash_hmac_file()하게 되면? 26ae63ad577ee2071c66b09aab72f9247e76c743 전혀 다른 결과를 얻게 됩니다, hash_hmac_file()은 파일의 무결성을 검증하는데 사용되고.... 특정 문자열은 hm..
crontab 을 사용하여 특정 시간에 특정 명령어를 수행하도록 도와주는 Daemon 파일을 열어서 보면 위와 같은 형태이다, 탭이나 공백을 기준으로 총 6개의 필드가 존재하고, "분 | 시간 | 일 | 월 | 요일(0-6 0과7은 일요일, 1부터 월요일) | 명령" 형식으로 지정할 수 있습니다. */2 * * * * 명령 : 2분마다 명령을 실행한다는 의미 0 22 1-15 * * 명령 : 매월 1일부터 15일 동안 22시에 명령을 실행한다는 의미 0 22 */5 * * 명령 : 매월 5일 간격으로 실행한다는 의미 설정을 했다면 service restart를 실행하고 process number가 바뀌는것을 확인합니다. vim 등을 이용하지 않고 crontab -e 옵션으로 수정하게 되면 굳이 재시작 할..
일반적인 프로그램의 표준출력은 현재 자신의 sh에 해당됩니다, sh은 리눅스 프로그램에 로그인 할때마다 새로운 PID를 갖고 시작되기 때문에, 현재의 sh이 아닌 곳에서 실행되는 결과는 출력이 되지 않습니다. 예를 들어, 아래와 같이 ping을 background 로 동작 시켰다고 보면, $ ping 168.126.63.1 &이 상태에서 계정을 로그아웃 하고 다시 콘솔에 접속하게 되면 ping에 대한 출력은 더 이상 보이지 않게 됩니다. 위에서 언급한대로 새로운 PID를 갖는 sh로 접속이 되었고 ping의 출력은 이전 PID의 sh에 출력을 하고 있기 때문인데요. 다른 예를 살펴봅시다. process내에서 실행되는 system 함수는 새로운 sh에 출력을 합니다. 무슨말인고 하니, 특정 프로그램에서 s..
shell(#mode)에서 간단하게 명령어를 통해 테스트를 진행하면서 "/dev/null 2>&1"의 의미를 알아봅니다.아래 명령어는 표준 출력을 /dev/null로 redirection 하라는 의미로 표준출력을 버리라는 의미입니다. $ rm test > /dev/null 하지만, test라는 file이 존재하지 않는 경우 아래와 같은 표준에러가 출력됩니다. $ rm test > /dev/null rm: cannot remove 'test': No such file or directory 방금 언급했지만, 이것은 "표준출력"이 아닌 "표준에러"이기 때문에 화면에 출력이 된것입니다. 다시 강조하면 위에 예제는 /dev/null 로 redirection 을 통해 화면 출력을 하지 않는것은 표준출력에 한해서 ..
- Total
- Today
- Yesterday