라벨이 app layer인 게시물 표시

aligned malloc free 예제 코드

이미지
 원하는 단위로 정렬된 메모리를 할당하는 예제 코드이다. aligned malloc void * aligned_malloc(size_t size, size_t align) {      void *ptr = NULL;      void *aligned_ptr = NULL;      if (size == 0 || align & (align-1))      {           return (void*)0;      }      ptr = malloc(size+align);      if (!ptr)      {           return (void*)0;      }      memset(ptr,0,size+align);      aligned_ptr = (void*)(((size_t)ptr+align) & ~(align-1));      ((void **)aligned_ptr)[-1] = ptr;      return aligned_ptr; } aligned free void aligned_free(void *aligned_ptr) {      if (...

ARM NEON asm memcpy 코드

이미지
ARM NEON 어셈블리 코드를 이용한 memcpy 이다. D0~D7 레지스터를 사용하여 src 포인터의 데이터를 dest 포인터로 복사한다.  ARM NEON 레지스터 < 출처 :  https://developer.arm.com/documentation/dht0002/a/Introducing-NEON/NEON-architecture-overview/NEON-registers > memcpy  코드 void __attribute__ ((noninline)) memcpy_neon(void *dest, const void *src, size_t n) {    // r0 : dest    // r1 : src    // r2 : n    asm(    "_copy_inner_loop:\n"    " pld [r1,#0xC00]\n" // cache preload    " vldm r1!,{d0-d7}\n" // load r1 point data do d0-d7 neno register, size is 64*8 bits = 64 bytes. and increase r1 pointer.    " vstm r0!,{d0-d7}\n" // store d0-d7 register to r0(dest) pointer, and increase r0 pointer    " subs r2,r2,#0x40\n" // decrease size of remains to copy    " bgt _copy_inner_loop\n" // continue loop until complete    ); } 빌드 옵션에 -mfpu=neon 을 ...

OpenSSL인증서 시간 에러 해결 방법

OpenSSL을 사용하여 서버 연결시 인증서 유효 기간 체크 중 발생하는 에러의 해결 방법에 요약. #define X509_V_ERR_CERT_NOT_YET_VALID                   9 #define X509_V_ERR_CERT_HAS_EXPIRED                     10 1. 시스템 시간이 실 세계의 시간과 맞지 않아 발생할 수 있다.   인터넷 시간서버에서 시간 정보를 읽어와 시스템 시간을 동기화 한다.  2. 시스템 시간을 변경할 수 없는 경우 옵션 파라미터를 설정하여 해결할 수 있다. #define X509_V_FLAG_USE_CHECK_TIME              0x2 #define X509_V_FLAG_NO_CHECK_TIME               0x200000 void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t); int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags); X509_VERIFY_PARAM_set_time를 사용하여 원하는 시간을 설정하여, 인증서 검사 때 설정된 시간을 사용할 수 있다. X509_VERIFY_PARAM_set_flags 함수로 X509_V_FLAG_NO_CHECK_TIME flag를 설정하면 인증서 시간 검사를 수행하지 않게 된다....

linux 개발 및 디버깅에 유용한 hexdump 로그 c 소스 코드

이미지
 로그 메시지만으로 개발 및 디버깅을 하는 경우 메모리 버퍼 내에 어떤 데이터가 들어있는지 눈으로 확인하면 편한 경우가 많다. 이럴 때 사용하면 좋은 예제 코드이다. #include <stdio.h> #include <ctype.h> #include <string.h> void hexdump(unsigned char *data, int len) {   int i = 0;   int str_i = 0;   char *hexdigits = "0123456789abcdef";   unsigned char str[67] = { 0, };   if (!data || len <= 0)   {   return;   }   memset(str, ' ', sizeof(str));   for (i = 0; i < len; i++)   {   str[str_i * 3] = hexdigits[data[i] >> 4];   str[str_i * 3 + 1] = hexdigits[data[i] & 0xf];           str[str_i * 3 + 2] = ' ';   str[50 + str_i] = isprint((int)data[i]) ? (char)data[i] : '.';           str_i++;           if (str_i == 16) ...

python input timeout 설정

 Python에서 키 입력을 받을때 timeout을 주어 주어진 시간만 입력을 기다리게 하는 방법이다. 이 방법은 windows 환경에서 테스트하고 사용되었다. 다른 환경에서는 사용해보지 못했다. pip install inputimeout 사용 예는 아래와 같다. timeout인자로 timeout을 원하는 시간(초)를 설정하면 된다. from inputimeout import inputimeout, TimeoutOccurred try:     key= inputimeout(' >> ', timeout=10) except TimeoutOccurred:     key='input timeout'      print(key)

linux shell script (.sh)에서 파라미터 인자(argument) 간단 처리 방법

이미지
리눅스 쉘 스크립트(.sh)에서 인자(argument)을 입력 받아 처리하는 방법의 예는 다음과 같다. build.sh  #!/bin/bash if [ "$1" = "boot" ] ; then ./build_boot.sh exit 0 fi if [ "$1" = "kernel" ] ; then ./build_kernel.sh exit 0 fi build.sh에서 인자로 boot를 받으면 build_boot.sh을 수행하고, kernel을 인자로 받으면 build_kernel.sh를 수행한다. 스크립트 내에서 인자의 개수는 $#, 첫번째 인자는 $1, 모든 인자는 $@으로 표현된다. #!/bin/bash echo $# echo $1 echo $2 echo $@

리눅스에서 clock_gettime을 사용하여 gettickcount만들기

임베디드 리눅스에서 GetTickCount같은 함수를 만들 때 clock_gettime 을 사용하면 쉽게 만들 수 있다. #include <time.h> unsigned long GetTickCount() {      struct timespec tp;      clock_gettime(CLOCK_MONOTONIC,&tp);      return (unsigned long)(tp.tv_sec *1000 + tp.tv_nsec / 1000000); } clock_gettime을 사용하면 좀더 세밀한 시간 해상도를 가진 GetTickCount를 만들 수 있다. clock id는 CLOCK_REALTIME , CLOCK_MONOTONIC 등이 있다. 시스템 마다 clock id에 차이가 있을 수 있으니 사용전에 테스트해보고 사용하는 것이 좋다. clock의 해상도는 아래 코드를 사용하여 받아올 수 있다. struct timespec tp; clock_getres(CLOCK_MONOTONIC,&tp);

리눅스 소켓 등의 IO 시그널 sigio 처리

이미지
IO 시그널 처리  소켓, uart등의 io 시그널 처리방법은 아래와 같다.  #include <sys/signal.h> void sigio_handler(int status) { } struct sigaction saio; saio.sa_handler = sigio_handler; sigemptyset(&saio.sa_mask); saio.sa_flags = 0; saio.sa_restorer = NULL; sigaction(SIGIO,&saio,NULL); 1. 위 코드를 사용하여 IO 시그널이 발생할 때 호출될 함수를 등록한다. 2. IO 시그널이 발생하여 핸들러 함수가 호출되면 이벤트를 처리한다. Note: sigio처리는 thread가 아는 process에서 처리하도록 하자. [관련 포스트] 리눅스 Ctrl+C  및 종료 시그널 처리

리눅스 Ctrl+c 및 종료 시그널 처리

이미지
인터럽트 종료 시그널 처리  Linux application에서 인터럽트 종료 시그널 처리 예는 아래와 같다. #include <sys/signal.h> void sigint_handler( int signo) {     // } int main(int argc, char *argv[]) {     signal(SIGINT, sigint_handler);     signal(SIGTERM, sigint_handler);     ...     return 0; } 1. signal 함수를 통해 시그널 핸들러 함수를 등록한다. 2. 인터럽트가 발생하면 핸들러 함수가 호출된다. 3. 핸들러 함수에서 해당 인터럽트를 처리한다. 기타 종료 시그널 닫혀 있는 소켓에 데이터를 쓰면,SIGPIPE 시그널이 발생해 application이 종료된다. 이때 application이 종료되지 않도록 하려면 아래와 같은 코드를 추가하면 된다. signal(SIGPIPE, SIG_IGN);

간단한 makefile 만들기 예제

리눅스에서 make를 사용하여 빌드할 때 makefile에 정의된 컴파일/링크 규칙을 사용한다. 본 포스트에서는 간단하게 만들 수 있는 makefile 예제를 싣고 있다. 실행파일 만들기용 makefile .SUFFIXES : .c .o CC=gcc LIBS = -lm -lrt -lpthread -L./libpath INC = -I./include CFLAGS = -g -Wall $(INC) SRCS = main.c OBJS=$(SRCS:.c=.o) TARGET = test all : $(TARGET) $(TARGET) : $(OBJS)                          $(CC) -o $@ $(CFLAGS) $(OBJS) $(LIBS) clean :                     rm -rf $(OBJS) $(TARGET) core new :                      $(MAKE) clean                      $(MAKE)  CC= 컴파일에 사용할 컴파일러를 넣어준다. LIBS= 사용하는 lib를 넣어준다. INC= include 위치를 넣어준다. CFLAGS= 컴파일에 사용할 플래그를 넣어준다. SRCS= 컴파일할 소스를 넣어준다. TARGET= 실행파일 이름을 넣어준다. 정적 라이브러리 만들기용 m...

python OpenCV UI 마우스 이벤트 예제

 폰 포스트는 python에서 OpenCV.setMouseCallback를 사용하여 마우스 이벤트를 사용하는 예제코드를 싣고 있다.  OpenCV.setMouseCallback는 지정된 윈도우에 마우스 이벤트 콜백 함수를 등록하는데 사용된다. https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga89e7806b0a616f6f1d502bd8c183ad3e 콜백 함수는 다음과 같은 형식을 가진다. typedef void(* cv::MouseCallback) (int event, int x, int y, int flags, void *userdata) 마우스의 이벤트는 클릭, 더블클릭, 휠 및 마우스 이동 등을 지원한다.  cv.EVENT_MOUSEMOVE cv.EVENT_LBUTTONDOWN cv.EVENT_RBUTTONDOWN cv.EVENT_MBUTTONDOWN cv.EVENT_LBUTTONUP cv.EVENT_RBUTTONUP cv.EVENT_MBUTTONUP cv.EVENT_LBUTTONDBLCLK cv.EVENT_RBUTTONDBLCLK cv.EVENT_MBUTTONDBLCLK cv.EVENT_MOUSEWHEEL cv.EVENT_MOUSEHWHEEL https://docs.opencv.org/master/d0/d90/group__highgui__window__flags.html#ga927593befdddc7e7013602bca9b079b0 마우스 이벤트 처리 예제 코드는 아래와 같다. 특정 폴더내의 이미지 파일 리스트를 생성하고, 마우스 클릭하면 다음 이미지로 넘어가며 화면에 출력하는 예제이다. import cv2 as cv import os class show_imgs(object):   ...

numpy.einsum을 이용한 빠른 2d convolution 연산 (conv2d)예제 코드

이미지
 본 포스트는 numpy.einsum을 사용하여 2차원 합성곱 연산을 수행하는 예제 코드를 싣고 있다. 단순 연산을 사용한 2차원 합성곱 단순히 for loop를 사용하여 아래처럼 2차원 합성곱 연산을 수행할 수 있다. import numpy as np def conv2d(image, kernel):     kernel = np.flipud(np.fliplr(kernel)) #XCorrel     output = np.zeros(np.subtract(image.shape, kernel.shape))          for y in range(output.shape[1]):         for x in range(output.shape[0]):             output[x, y] = (kernel * image[x: x + kernel.shape[0], y: y + kernel.shape[1]]).sum()     return output 하지만, 위 경우 image의 크기가 커지면 연산양이 많아져 수행 속도가 느려지게 된다.  numpy.einsum을 사용한 2차원 합성곱  빠른 속도의 합성곱 연산을 원한다면, numpy.lib.stride_tricks.as_strided와 numpy.einsum을 사용하면 빠른 속도로 2차원 함성곱 연산을 수행할 수 있다. import numpy as np def conv2d_np(image, kernel):     kernel = np.flipud(np.fliplr(kernel)) #XCorrel        ...

python으로 만든 간단한 srt 자막 싱크 조절 코드

srt 파일의 싱크 조절이 필요해 간단하게 python으로 코드를 만들어 봤다. 테스트를 많이 해보진 못했지만, 싱크 조절하려 했던 파일들은 잘 동작하는 것을 확인했다.  코드는 다음과 같다. import os def srt_gettimems(line,offset):     while(line[offset].isdecimal() == False):         offset += 1         if line[offset] == '\r' or line[offset] == '\n':             return 0     hh = int(line[offset:offset+2])     mm = int(line[offset+3:offset+5])     sec = int(line[offset+6:offset+8])     ms = int(line[offset+9:offset+12])     return (hh*360+mm*60+sec)*1000+ms def srt_conv2timestr(time_ms):     ms = time_ms%1000     time_sec = int(time_ms/1000)     sec = time_sec%60     mm = int(time_sec/60)     hh = int(mm/60)     mm = mm%60     return '%02d:%02d:%02d,%03d'%(hh,mm,sec,ms) def srt_modi...

python으로 만든 wav 파일 parser 예제 코드

wav 파일 포맷에 대해 알아보면서 python으로 wave file parser를 만들었다. wave파일에 들어있는 chunk의 내용을 알아보기 위함이다. wav 파일 포맷에 대해 알아보자 python code는 아래 링크에서 받을 수 있다. wave_parser.py wave 파일은 아래 사이트에서 다운받아 테스트했다. https://en.wikipedia.org/wiki/WAV http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html 다만 표준 문서에 있는 chunk이 다 들어있는 wave 파일은 찾을 수 없어 테스트해보지 못했다.  아래는 테스트해본 sample 파일 중 stereofl.wav을 분석한 결과다. wave file path : wav/stereofl.wav chunkID: RIFF  cksize: 234270   format: WAVE hunkID: fmt   cksize: 18   wFormatTag : 3   wChannels : 2   dwSamplePerSec : 22050   dwAvgBytesPerSec : 176400   wBlockAlign : 8   wBitsPerSample : 32   cbsize : 0 chunkID: fact  cksize: 4   dwSampleLength : 7254 chunkID: PEAK  cksize: 24   version : 1   timestamp : 926175195   value : 0.5   position : 282   value : 0.44161987304687...

python winsound를 이용한 윈도우 환경에서 소리 재생 예제

 본 포스트에는 윈도우 환경에서 python의 winsound라이브러리를 이용한 사운드 재생의 예제를 싣고 있다. import winsound 특정 주파수 톤 재생 Beep를 사용하여 특정 주파수의 소리를 정해진 시간동안 재생할 수 있다. winsound.Beep(frequency, duration) 파라미터 frequency : Hz 단위며, 범위는 37Hz~32,767Hz duration : milliseconds 단위이다. example code import winsoind winsound.Beep(370,2000) wave 재생 지정된 파일, 윈도우 레지스트리에 등록된 사운드 혹은 오디오 데이터(bytes-like object)를 재생한다. 만약 sound 리소스가 없는 경우 시스템 디폴트 사운드를 재생한다.  winsound.PlaySound(sound, flags) 파라미터 sound : 파일 이름, 시스템 사운드 별명, 오디오 데이터 flags : winsound.SND_FILENAME : sound 파라미터는 wave file 이름 이며, SND_ALIAS와 함께 사용하면 안된다.  winsound.SND_ALIAS : sound 파라미터는 시스템 사운드 별명이며, SND_FILENAME와 함께 사용하면 안된다. ex) 'SystemAsterisk', 'SystemExclamation', 'SystemExit', 'SystemHand', 'SystemQuestion' winsound.SND_LOOP : 반복 재생한다. 테스트해보니 SND_ASY...

python에서 파일 읽고 쓰기 예제

이미지
python에서 파일을 읽고 쓰는 간단한 예제다. 파일 open & close open(filename, mode) 지원하는 mode는 다음과 같다. 'r' : 읽기 모드 'w' : 쓰기 모드 'x' : 파일 독점 모드로 생성, 만약 같은 이름의 파일이 있으면 'FileExistsError'에러 발생 'a' : 쓰기 모드, 파일 존재 시 새로운 쓰기는 파일 맨 끝에 추가  'b' : 바이너리 모드 't' : 텍스트 모드 '+' : 업데이트 모드 (읽기/쓰기) 파일이 없을 때 'FileNotFoundError' exception이 발생한다. 파일 열기를 성공하면, file object 를 반환한다.  파일 open은 다음과 같이 사용할 수 있다.  try:     f = open('hello.txt','r')     f.close() except FileNotFoundError:     print('FileNotFound') open에서 반환되는 file object를 사용하고 마지막 파일을 닫을 때 close()를 사용하여 파일을 닫는다. with 구문을 사용하여 파일을 open할수 있으며, with 구문을 사용할 경우 별도의 close를 수행할 필요는 없다.  with open('hello.txt','r') as f:     print(f.read()) 파일 쓰기 파일에 데이터를 쓰기위해서는 file object의 write(string)를 사용하면 된다. write(string) 파일 open시 텍스트 모드로 설정한 경우는 문자열을 입력 파라메터로 사용하고, 바이너리 모드로 설정한 경우 ...

JSON 과 python JSON encoder decoder 예제

이미지
1. What is JSON?  JSON (JavaScript Object Notation)은 경량의 DATA-교환 형식이다. 이 형식은 사람이 읽고 쓰기에 용이하며, 기계가 분석하고 생성함에도 용이하다. https://www.json.org/json-ko.html 언어에 독립적인 포멧이라 인터넷에서 자료를 주고받을 때 그 자료를 표현하는 방법으로 알려져 있다고 한다. https://ko.wikipedia.org/wiki/JSON JSON의 형식은 요약하면 다음과 같다. object  -> { "name" : value , ... } array -> [ value or array or object , ... ] value -> number, string, true, false, null, object, array JSON은 알게 모르게 많이 사용되고 있다.  예를 들어 StarCraft의 설정파일도 JSON으로 되어 있고, {     "General settings": {         "Starcraft-Active Hotkey Profile": "$device",         "Starcraft-Custom Type": "Melee"     },     "selectedSkins": "",     "selectedConsole": "",     "ShowTurnRate": false,     "MatureLanguageFilter": true,     "GameTimer": false,     "apm_Showing": false,   ...

python crc32와 polynomial과 c로 구현한 crc32

python crc32 파이썬의 standard library에서 crc32를 지원한다. zlib.crc32와 binascii.crc32 두가지가 있다.  import binascii import zlib print('binascii.crc32(\'123456789\') = ',hex(binascii.crc32('123456789'.encode('UTF-8'))&0xffffffff)) print('zlib.crc32(\'123456789\') = ',hex(zlib.crc32('123456789'.encode('UTF-8'))&0xffffffff)) 입력데이터는 bytes-like object를 사용해야 하며, 위 코드의 결과는 아래와 같다.  binascii.crc32('123456789') =  0xcbf43926 zlib.crc32('123456789') =  0xcbf43926 온라인 사이트에서 crc32 계산 결과와 같다. https://www.lammertbies.nl/comm/info/crc-calculation

python html.parser example URL에서 이미지 크롤링

이미지
 python에서 html parser가 필요해 자료를 찾아보다. 테스트를 겸해 URL에서 이미지 파일을 크롤링하는 코드를 만들어 봤다.  python에서 url의 html 가져오기  python의 urllib.request를 사용하면 특정 URL의 html을 쉽게 받아올 수 있다. https://docs.python.org/3.7/library/urllib.request.html#urllib.request.Request import urllib.request with urllib.request.urlopen('https://ryanclaire.blogspot.com') as f:         print(f.read(100).decode('utf-8')) python의 html.parser  html.parser.HTMLParser는 HTML 및 XHTML 형식의 구문을 분석하기 위해 만들어진 class이다.  https://docs.python.org/3.7/library/html.parser.html from html.parser import HTMLParser class MyHTMLParser(HTMLParser):     def handle_starttag(self, tag, attrs):         print("Encountered a start tag:", tag)     def handle_endtag(self, tag):         print("Encountered an end tag :", tag)     def handle_data(self, data):       ...

python gui wxPython을 사용한 사용자 입력 다이얼로그(Dialog) 만들기

이미지
python의 gui 툴킷인 wxPython은 mfc와 유사하게 일반 wx.Frame 윈도우와 wx.Dialog 윈도우 두 종류의 윈도우를 생성할 수 있다. 본 포스트는 wx.Dialog를 기반으로 사용자 입력을 받기 위한 다이얼로그 박스를 만드는 예제를 싣고 있다. wxPython의 설치 방법은 아래 포스트를 참조하자. python gui wxPython 설치 common Dialogs - TextEntryDialog wxPython에는 몇 가지 일반적으로 필요한 다이얼로그 박스들을 제공한다. 색상 선택, 파일 선택, 메시지 다이얼로그 등이 있다. [ https://docs.wxpython.org/common_dialogs_overview.html ] 그 중 TextEntryDialog을 사용하면 간단하 사용자의 text 입력을 받을 수 있다. import wx def get_text():     data = None     dlg = wx.TextEntryDialog(parent=None,message='input text')     try:         if dlg.ShowModal() == wx.ID_OK:             data = dlg.GetValue()             print(data)     finally:         dlg.Destroy()          return data if __name__ == '__main__':     app = wx.App()   ...