링크 좋은 자료에 감사합니다.
gcc의 기능으로 주어진 형식이나 lvalue의 정렬을 위해 필요한 byte 수를 알려줍니다. 이를테면 아래와 같은 코드를 통해서 구조체가 몇 byte로 align되어 있는지 확인 할 수 있습니다. printf(" align : %u \n",__alignof__(struct test)); 32bit Kernel의 경우 기본 4byte, 64bit Kernel의 경우 8byte align되었을을 확인하도록 합니다. 또한 유사한 명령으로 구조체의 align을 변경할 수 도 있습니다. 아래 코드를 참조하도록 합시다. struct compat_group_req { __u32 gr_interface; struct __kernel_sockaddr_storage gr_group __attribute__ ((align..
ip6tables롸 64bit kernel 호환성을 맞추며 공부하다 보니 이렇게 포스팅을 하게 되었습니다. ip6tables에서 사용되는 getsockopt와 setsockopt는 kerenl 내에 nf_sockopt_ops 구조체로 받아지는데, 구조체 형태는 아래와 같습니다. (linux-3.0.4 기준) static struct nf_sockopt_ops ip6t_sockopts = { .pf = PF_INET6, .set_optmin = IP6T_BASE_CTL, .set_optmax = IP6T_SO_SET_MAX+1, .set = do_ip6t_set_ctl, #ifdef CONFIG_COMPAT .compat_set = compat_do_ip6t_set_ctl, #endif .get_optmi..
inet_aton() 인터넷 주소를 네트워크 주소로 변경 mysql> select inet_aton('192.168.0.1'); +-----------------------------------+ | inet_aton('192.168.0.1') | +-----------------------------------+ | 3232235521 | +-----------------------------------+ 1 row in set (0.00 sec) inet_ntoa() 네트워크 주소를 인터넷 주소로 변경 mysql> select inet_ntoa('3232235521'); +-----------------------------------+ | inet_ntoa('3232235521') | +------..
어찌보면 좀 쌩뚱 맞을 수도 있는 64bit로 compile된 kernel과 32bit로 compile된 iptables 조합입니다. 일단 iptables쪽에는 기본적인 명령이나 동작에는 지장이 없는데, 문제는 바로 ip6tables 요놈입니다. 문제는 ip6tables --list 명령에서부터 시작되었습니다. $ ip6tables -nL ip6tc_init: valiget_entries: 1980 != 1984 d_hooks=0x0000000e, num_entries=4, size=1944 modprobe: cannot parse modules.dep ip6tables v1.3.7: can't initialize ip6tables table `filter': Invalid argument Perhaps..
대출 (貸出) [대ː출] 다른 뜻(3건) [명사] 돈이나 물건 따위를 빌려 주거나 빌림. ‘빌림’으로 순화. 집 때문에 대출을 조금 알아보고 있다. 종류는 많지만 선택 폭은 그리 크지 못하다. 이 나라가 문제인지 정부가 문제인지... 나 자신이 문제인지.. 여하튼, 결론부터 말하면 집을 구하기 위한 목적의 대출로 아래와 같은 항목이 있다. 1) 생애 첫 주택자금 대출 2) 신혼부부 전세자금 대출 3) 신용대출 현실적으로 3번은 피하고 싶은게 실정.. 기왕이면 집을 구매하고 싶지만.. 이제 결혼을 준비하는 입장에서 꽤 부담되긴 한다. 뭐 몇 십년 쭈-욱 산다면 무리도 아니겠지만.. 조금 고생하고 나중에 조금 더 좋은 집을 구할때 이용해야될 대출인것 같다. 이유는 1번 항목은 주택을 매입한 이력이 없어야 가..
find 명령 하나만 잘 사용해도 원하는 코드 원하는 위치를 찾을 수 있음은 누구나 아는 사실입니다. 임베디드 개발자라면 자신만의 alias는 갖고 있을텐데, (bashrc) 제 경우에는 아래와 같이 사용합니다. 기본적으로 c의 경우에 finds를 정의해 놓습니다. $ alias finds='find . -name "*.[cChH]" -print | xargs grep -n --color=auto ' 이렇게 사용할 경우 .c와 .h를 모두 뒤져서 auto color로 결과가 출력되어 원하는 문자열 검색에 용이합니다. 출력결과 $ finds debug_locks ./lib/debug_locks.c:2: * lib/debug_locks.c ./lib/debug_locks.c:15:#include ./lib/..
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문이라든지 반복문을 통해 값을 채워야 하는 .. 그런 비생산적인 코드를 막을 수 있습니다.
올해 최고 보안이슈로 떠올랐던 APT 공격, Advanced Persistent threat 라는 뜻으로 특정 타겟을 공격한다는 의미다. 여기서 의미를 두고 의견이 분분한데, 타겟을 수차례 공격한다는 의미로 사용 될 수도있고, 타겟을 공격하기 위해 오랜 시간을 투자한다는 의미로 사용되기도 한다. 실제 보안 사건사고 사례를 살펴보면, 짧게는 6개월에서 수년간 타겟을 공격하기 위해 준비 기간을 가지기도 한다. 여튼 각설하고 갑자기 왠 APT공격인고 하니, 최근 A 제품 발표 세미나를 다녀 왔는데 99.9% 자신들은 그간의 노하우와 악성코드 DB를 통한 방어가 가능하다며..주절주절.. 가만히 듣고 있으면 끄덕끄덕 그럴수도 있겠구나 싶지만, 세상에 작정하고 공격할때 뚤리지 않는 방패가 있을까.. 뭔가 너무 과장..
임베디드 개발자라면 메모리는 곧 돈입니다. 그러므로 가능한 코드에서 메모리를 효율 적으로 사용하고 가능한 최적화된 코드를 작성해야 합니다. (물론 가독성이 현저히 떨어진다면 고려해 보아야겠지만..) 여기 비용 선택에 따른 연산자 분류가 있습니다. 첫번째로 흔히 나머지를 구할때 사용하는 % 연산자. 그리고 몫을 구하는 / 연산자. 예를 들어 아래와 같은 코드가 있다고 보면 x %= 10 이는 역어셈 결과 mov, cdq, mov, idiv, mov 다섯 과정을 거칩니다. 반면 아래의 코드는 같은 결과를 얻지만, mov, and, mov 세가지 과정으로 결과를 산출합니다. x &= 10 그럼 몫을 구하는 연산자를 살펴봅시다. x /= 10 위와 같은 코드는 나머지를 구하는 연산 보다 더 많은 연산을 합니다...
직무상 평소 Low Data, 혹은 Log Data를 다루다보니, 사용자나 관리자(기업 담당자나, 상사)에게 보여주는 부분은 고작해야 debug message 정도가 전부다. (아이러니하게도 debug msg는 어디까지나 개발자를 위한 부분, 즉 나를 위한 부분이기 때문에 누구에게나 직관적이지는 않다. "나만 이해할 수 있는" 그런 메시지니까) 내가 쌓아 놓거나, 적당하게 parsing해 놓은 Data를 가져 가는 팀은 Web UI 개발팀. 남겨진 정보를 포장해서 출력하는 직무를 맡고 있는 Team이다. 아무리 많은 정보를 남겨도 관리자에게 직관적으로 보여지지 않으면 그건 dummy data일 뿐이다. 갑자기 이런 글을 왜 쓰는고 하니, 오늘 문득 일전에 개발한 Packet Distribution Cha..
코드가 방대해지기 시작하면, 배열이 커지기 마련이고, 특히나 php의 경우 사기언어(?) 이므로... 최초 의도했던 용도와는 다르게 배열의 차수가 달라지기도 합니다. 이를테면 1차원 배열로 사용을 하는게 목적이었으나... 급히 2차원 배열로 변경한다든가.. (이는 목적에 따라 최초1차원 배열로 사용을 하였지만, 요구사항에 따라 2차원 배열로 행해지는 경우) 그렇게 되면 나중에 특정 배열 변수를 놓고 값을 체크하는게 난감한 경우가 있습니다. 보통의 1차원 배열이나, 그 이상의 배열의 경우 목적이 분명하고 차원이 분명하다면, for문 돌려서 echo로 충분히 배열 내용을 알수 있다. 하지만 배열의 키(index)값이 default(0부터 증가하는 숫자)가 아니라면, 정확히 그 배열에 어떤 키와 값이 있는지 ..
게시판의 next 페이지와 prev 페이지 여부 확인... 방화벽 장비의 Log Data를 보여주는 게시판을 만들면서(사실 난 내부 함수와 쿼리만 담당하고 UI 작업은 다른 팀에서 지원 해주었지만), 참 난해한 부분이었다. 출력 개수 지정은 있지만 next버튼을 두는 시점에 대해서 말이다. 페이지 출력 개수 지정이 500개일때 limit절을 이용해서 query하는데, next 페이지의 경우 limit 500,500 과 같이 query하고, 그 다음페이지는 1000,500 하는 루틴이다. 그러다가 query 결과가 500개 미만인 경우 마지막 페이지로 인식하고 next 버튼을 비활성화 시키려 했지만..(참 단순..) 문제는 바로 발생했다. 만약 query에 대한 결과가 딱 500개이고, 501번째 데이터가..
임베디드 프로그래밍 C코드 최적화저자김유진 지음출판사한빛미디어 | 2008-02-29 출간카테고리컴퓨터/IT책소개최적화는 프로세서, 컴파일러, 사용할 수 있는 시스템 자원과 같... 팀의 고참으로부터 추천을 받고 구매하게 된 책, 얇고 작은 책이라 가볍게 읽을 수 있지만, 내용이 그리 가볍지만은 않습니다. 물론, 많은 경험과 지식이 있다면 화장실 책(?) 처럼 쉽게 읽을 수 있지만... 여튼, 책 내용은 두 사람의 대화로 흘러가고, 쉽게 할 수 있는 실수를 고치고, 코드를 어셈블로 비교해서 최적화 루틴을 일깨워 줍니다. 뭐랄까.. 한층 더 성능에 관련된 코드를 작성할 수 있는 팁이라고 해야되나.. 가벼운 책이지만, 배울것이 많은 책입니다. 추천 도서로 올려 봅니다^^
간단한 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 ..
- Total
- Today
- Yesterday