'Program Lang.'에 해당되는 글 72건

  1. 2017.01.09 [json-c] simple parsing example
  2. 2017.01.02 std::function 정리
  3. 2016.12.30 unique_ptr, shared_ptr 읽히기
  4. 2016.12.30 c++ pair 읽히기
  5. 2016.07.22 full version (pat, pmt, sdt) 2
  6. 2016.07.22 sdt version 브라우저에 출력
  7. 2016.07.22 sdt json version
  8. 2016.07.22 pmt_json.txt 브라우져에 출력
  9. 2016.07.22 pmt json version
  10. 2016.07.21 pat_json.txt 파일을 이용한 pat 정보 webbrowser로 출력

[json-c] simple parsing example

Program Lang./C++ 2017. 1. 9. 14:45

1. 개요 

c언어로 되어 있는 json library이다. 나는 관련 일을 하지 않고 단순히 이용만 하는 입장이라서 자세히는 모르지만 제 기억에 어떤 전문가께서 세미나 하는 것을 들었는데 json-c는 주의를 기울이지 않으면 memory leak에 취약하다고 들었던 것 기억이 있다. 일단 난 사용법 익히는데 집중한다. 


2. json-c를 위한 cmake 수정 사항 

할 때마다 매번 찾아봐야 해서 여기에 정리해 놓는다. 다른 방법이 있겠지만 나는 단순히 pkg-config로 cflags 값과 libs 위치확인하고 강제로 cmake에 막았다.



수정사항은 cflags (헤더파일 위치)를 위한 include_directories(/usr/local/include/json-c)

libs 관련 정보 : link_directories(/usr/local/lib), json-c (-l 플래그 관련 수정 사항)


3. json 기본 Type 테스트

json의 기본 타입은 아래와 같다.

  • null
  • boolean
  • double
  • int
  • object
  • array
  • string
타입에 대한 정의 및 각 타입을 읽어들이는 방법은 아래 코드에 자세하게 나와 있다.


char형의 string을 json_tokener_parse() 함수를 통해서 json object로 변경한다. object내에 있는 각 값을 타입에 따라 parsing하는 예제이다. 입력 string은 하나의 큰 object에 string, boolean, integer, float, array, object로 구성되어 있다. 앞의 name, student, age, height, interestings, author-details는 key를 의미하고 각각 key와 오른쪽은 value이다.

여기서 array와 object는 추가적인 parsing이 더 들어가야 한다.


4. 실행결과


'Program Lang. > C++' 카테고리의 다른 글

enable_shared_from_this 정리  (0) 2017.01.12
[json-c] simple generator json ojbect  (0) 2017.01.09
std::function 정리  (0) 2017.01.02
unique_ptr, shared_ptr 읽히기  (0) 2016.12.30
c++ pair 읽히기  (0) 2016.12.30
:

std::function 정리

Program Lang./C++ 2017. 1. 2. 11:15

1. std::function 개요


기존 함수포인터의 개념을 확장한 것이다. c++11이후부터는 callable target이 아래와 같이 다양해졌다.

따라서 기존 함수포인터만으로는 이를 cover할 수 없고, 보다 일반화된 개념이 필요해지면서

std::function이 새롭게 나온 것이다.


std::function이 처리할 수 있는 callable target은 아래와 같다.

  • function (일반함수)
  • lambda expression
  • bind expression
  • function object (함수 객체)
  • class 내의 맴버함수 및 맴버 변수

2. usage


선언하고 사용하는 방법에 대해서 아래와 같이 정리한다.


#include <functional>

 

std::function<리턴타입(입력 파라미터들)> 변수


void print(int a, int b);

ex) std::function<void(int, int)> fp = print;

 

3. 테스트 코드


각 callable target에 대한 사용법을 예제를 통해서 알아본다.



4. 결론

c++11 이후에서 class를 설계할 때, 기존에 함수포인터를 이용했다면 이제 std::function으로 모두

통일하는 것이 c++ 철학에 맞는 구현 방식이다.

'Program Lang. > C++' 카테고리의 다른 글

[json-c] simple generator json ojbect  (0) 2017.01.09
[json-c] simple parsing example  (0) 2017.01.09
unique_ptr, shared_ptr 읽히기  (0) 2016.12.30
c++ pair 읽히기  (0) 2016.12.30
full version (pat, pmt, sdt)  (2) 2016.07.22
:

unique_ptr, shared_ptr 읽히기

Program Lang./C++ 2016. 12. 30. 14:45

1. 목적

c++ unique_ptr, shared_ptr 개인적인 정리


2. shared_ptr

C++98 표준안까지 사용되던 auto_ptr은 이제 더 이상 사용하지 않는 것이 권고 사항이다. C++11부터 지원하는 share_ptr을 간단히 말하면 객체의 자동 파괴를 수행하기 위해서 도입된 smart pointer 이다. 하지만 몇 가지 제약 사항은 여전히 존재한다. 제약 사항은 아래에서 하나씩 살펴보도록 하자.

일반적인 사용법은 테스트 코드에 주석으로 표기하였다. 자세한 사항은 standard 생성자 overriding을 참조하면 된다.

다만 주의해야 할 사항은 대입 연산은 explicit으로 처리되어 있기 때문에 암시적 대입연산은 동작하지 않는다.

또한 make_shared<> utility를 사용하는 것이 성능면에서 좋다.


2.1. shared_ptr 예제 (제약 사항 예제)

The C++ Standard Library 책의 예제는 너무 복잡하고 딱히 와 닿지도 않아서 어떤 블로그 소스 참조

하나의 객체에 대해서 서로 다른 shared_ptr로 참조하게 되면 소멸된 객체에 다시 소멸자를 호출하게 되어서 알 수 없는 동작을 수행하게 된다.



<실행결과>

Start
Person, 14
delete : heesoon.kim
~Person, 18
delete : heesoon.kim
Segmentation fault
Finish


순환 참조의 문제점을 보여주는 예제로 weak_ptr<Person> 주석을 막고 shared_ptr<Person>을 사용하면 소멸자가 호출되지 않는다. 결론적으로 객체가 정상적으로 파괴되지 않는 문제가 발생한다.



2.3. shared_ptr 예제 (제약 사항 예제)

smart pointer라고는 하지만 여전히 주의를 기울여야 할 것이 남아 있다. weak_ptr은 shared_ptr의 reference_count를 늘리지 않지만 shared_ptr이 관리하는 객체를 공유한다. 객체의 자원 관리는 shared_ptr로 하되 객체에 접근하여 필요한 동작을 수행 시에는 weak_ptr로 하는 것이 바람직해 보인다.

'Program Lang. > C++' 카테고리의 다른 글

[json-c] simple parsing example  (0) 2017.01.09
std::function 정리  (0) 2017.01.02
c++ pair 읽히기  (0) 2016.12.30
full version (pat, pmt, sdt)  (2) 2016.07.22
sdt json version  (0) 2016.07.22
:

c++ pair 읽히기

Program Lang./C++ 2016. 12. 30. 09:59

1. 목적

c++ map을 for_each 구문에서 쓰려고 하니까 pair 관련된 내용이 나와서 예제 짜보고 읽히기로 함.


2. 테스트 코드

std:pair을 사용하기 위해서는 두 개의 입력 요소를 하나의 요소로 만들어 주는 make_pair 구문과 같이

봐서 사용법을 읽히는 것이 좋을 것 같다.


아래 코드에서 for_each 문 안에 함수 포인터로 등록된 함수를 실행하기 위해서 item.second이 아닌

item.second()로 호출해야 하는 문법적인 근거를 모르겠다. 이래 저래 삽질하다가 함수 객채 호출 시에

사용하는 문법처럼 해 봤는데 동작은 하는데 모르겠네.

아시는 분은 댓글 부탁 드립니다.



3. 테스트 코드 실행

단순히 vector에 등록된 두 개의 debug 메뉴를 실행한다. 따라서 Hellow World와 내 이름을 차례되로 찍는다.


'Program Lang. > C++' 카테고리의 다른 글

std::function 정리  (0) 2017.01.02
unique_ptr, shared_ptr 읽히기  (0) 2016.12.30
full version (pat, pmt, sdt)  (2) 2016.07.22
sdt json version  (0) 2016.07.22
pmt json version  (0) 2016.07.22
:

full version (pat, pmt, sdt)

Program Lang./C++ 2016. 7. 22. 12:43

처음 해보려고 한 목적은 개발 중에 필드에서 Stream 이상한 것이 많다.

이런 것들 항상 자기 컴에 복사해서 분석기로 돌려서 보고, 분석하지만 분석기가 동작이 제 각각이고 내가 보고 싶은 부분만

빨리 보고 싶은데 그러기도 힘들고 분석 후에 파일의 사후 관리도 안된다. 

따라서 중앙 서버에 모든 파일을 두고 여기서 돌리고 브라우져로 결과를 보면 스트림 관리가 편하지 않을까 생각해서

해보려고 했다. 하지만 현실의 벽이 높다.


지금까지 작업을 수행했던 Section, PAT, PMT, SDT parser의 full version 정리

여기에 CAT, TDT, TOT, NIT, EIT 까지 붙이면 좋을텐데 시간이 되면 해야 할 것 같다.

올해 처음 생긴 5년마다의 안식년 휴가 3주 동안 이 모든 것을 하기에는 시간이 부족하다.


같이 공부하고 연구하는 사람이 있으면 좋을텐데, 회사의 개발자들은 별로 자기 개발에 의지가 없는듯.

혼자 하는 수 밖에. 난 오늘도 도서관 꼭대기 에어콘도 들어오지 않는 곳에서 열심히 열공 중이다. ㅠ.ㅠ


1. 소스 트리

지금까지 작업한 모든 소스 한 곳에 모았다. javascript folder는 실행결과를 web browser에서

확인하기 위해서 APM 설치 후에 기본 서비스 폴더에 복사해 넣으면 된다.

.

├── CMakeLists.txt

├── javascript

│   ├── css

│   │   ├── images

│   │   │   ├── ajax-loader.gif

│   │   │   ├── file.gif

│   │   │   ├── folder-closed.gif

│   │   │   ├── folder.gif

│   │   │   ├── minus.gif

│   │   │   ├── plus.gif

│   │   │   ├── treeview-black-line.gif

│   │   │   ├── treeview-black.gif

│   │   │   ├── treeview-default-line.gif

│   │   │   ├── treeview-default.gif

│   │   │   ├── treeview-famfamfam-line.gif

│   │   │   ├── treeview-famfamfam.gif

│   │   │   ├── treeview-gray-line.gif

│   │   │   ├── treeview-gray.gif

│   │   │   ├── treeview-red-line.gif

│   │   │   └── treeview-red.gif

│   │   ├── jquery.treeview.css

│   │   └── screen.css

│   ├── index.html

│   ├── lib

│   │   ├── jquery.cookie.js

│   │   ├── jquery.js

│   │   └── jquery.treeview.js

│   ├── pat_json.txt

│   ├── pmt_json.txt

│   └── sdt_json.txt

├── json_spirit

│   ├── CMakeFiles

│   │   ├── CMakeDirectoryInformation.cmake

│   │   ├── json_spirit.dir

│   │   │   ├── CXX.includecache

│   │   │   ├── DependInfo.cmake

│   │   │   ├── build.make

│   │   │   ├── cmake_clean.cmake

│   │   │   ├── cmake_clean_target.cmake

│   │   │   ├── depend.internal

│   │   │   ├── depend.make

│   │   │   ├── flags.make

│   │   │   ├── json_spirit_reader.cpp.o

│   │   │   ├── json_spirit_value.cpp.o

│   │   │   ├── json_spirit_writer.cpp.o

│   │   │   ├── link.txt

│   │   │   └── progress.make

│   │   └── progress.marks

│   ├── CMakeLists.txt

│   ├── Makefile

│   ├── cmake_install.cmake

│   ├── json_spirit.h

│   ├── json_spirit.vcproj

│   ├── json_spirit_error_position.h

│   ├── json_spirit_reader.cpp

│   ├── json_spirit_reader.h

│   ├── json_spirit_reader_template.h

│   ├── json_spirit_stream_reader.h

│   ├── json_spirit_utils.h

│   ├── json_spirit_value.cpp

│   ├── json_spirit_value.h

│   ├── json_spirit_writer.cpp

│   ├── json_spirit_writer.h

│   ├── json_spirit_writer_options.h

│   ├── json_spirit_writer_template.h

│   └── libjson_spirit.a

├── pat.cpp

├── pat.h

├── pmt.cpp

├── pmt.h

├── psi_glob.h

├── remove.sh

├── sdt.cpp

├── sdt.h

├── section.cpp

├── section.h

├── test.cpp

└── types.h


2. 헤더 파일

너무 많아서 github link 내의 소스 참조


3. 클래스 본체

너무 많아서 github link 내의 소스 참조.


4. 테스트 코드

실제 TS 파일을 사용자로부터 받아서 처리해야 하는데, 귀찮으니까 그냥 SGP.ts로 고정.

차후 IP Multicast Stream 받을 수 있도록 붙이면 고려해 볼 생각.


처음에는 Message Queue로 Section에서는 던지고 Parser쪽에서는 받아서 처리하려고 했는데

의미 없어 보여서 생략. Message Queue 동작은 github test folder에 정리했다. 



5. 전체 소스 (github link)


https://github.com/heesoon/mpeg/tree/master/full_version

'Program Lang. > C++' 카테고리의 다른 글

unique_ptr, shared_ptr 읽히기  (0) 2016.12.30
c++ pair 읽히기  (0) 2016.12.30
sdt json version  (0) 2016.07.22
pmt json version  (0) 2016.07.22
pat 정보를 json 파일로 저장 후 webbrowser에서 확인  (0) 2016.07.21
:

sdt version 브라우저에 출력

Program Lang./javascript 2016. 7. 22. 11:57

PAT/PMT와 동작은 동일하다. 


1. 소스 코드


2. 테스트 결과



:

sdt json version

Program Lang./C++ 2016. 7. 22. 11:52

SDT 정보를 브라우져에 출력하기 위한 예제


웹브라우져에서 확인 테스트는 자바스크립트 탭에 정리한다.


1. 소스 트리

자세한 내용은 PAT에 정리되어 있다. 여기서 핵심은 boost spirit을 이용한 json 라이블러리의 사용이다.

PAT쪽에 정리되어 있으므로 여기서 생략하기로 하자. 


2. 헤더 파일

json 파일로 저장하는 함수 하나 추가해서 일단 생략하고 전체 소스 링크 참조


3. 클래스 본체

json 포멧은 PAT과 동일하다. 일단 저장은 PAT과 동일한 형태로 저장하고 브라우져에 출력 시에

좀 더 분석기와 유사한 UI와 맞추기 위해서 조정을 할 필요는 있다.



4. 테스트 코드


5. 실행 결과


6. 전체 소스 (github link, javascript는 없음.)

자사스크립트는 자바스크립트 탭에 정리


https://github.com/heesoon/mpeg/tree/master/test/sdt_json

'Program Lang. > C++' 카테고리의 다른 글

c++ pair 읽히기  (0) 2016.12.30
full version (pat, pmt, sdt)  (2) 2016.07.22
pmt json version  (0) 2016.07.22
pat 정보를 json 파일로 저장 후 webbrowser에서 확인  (0) 2016.07.21
5. sdt (service description table) class  (0) 2016.07.20
:

pmt_json.txt 브라우져에 출력

Program Lang./javascript 2016. 7. 22. 10:34

방송정보 PMT Section에서 정보를 추출하고 json 파일 포멧으로 뽑아내서 Apache WebServer 디렉토리에 복사하는 것 까지

수행하는 c++ native code는 "pmt json version" c++ 블로그 턉에 정리해 놓았다. 


여기서는 순수하게 PMT json 파일을 브라우져에 출력하는 부분만 정리한다.

모든 내용은 PAT에 정리했던 부분과 동일하다.

내가 자바스크립트 수준이 초보자라 정말 어렵게 동작시키고 있는데 전문가들은 정말 우수은 코드라고 보면된다.


1. 소스 코드

XMLHttpRequest()함수로 PAT/PMT 보다 Json 파일을 요청해야 해서 앞장에서 PAT 처리부분을 수정하였다.

구글링으로 비슷한 코드 찾아서 쑤셔 넣었는데 다행히 잘 동작한다.

자바스크립트 공부가 아니고 c++ native 결과를 브라우져에 출력하는 것을 보기위함이라 완성도는 낮다.



2. 테스트 결과

PMT 트리구조 깨졌다. 아무리 용을 써도 잘되지 않아서 일단 이 정도 수준에서 마무리한다.

:

pmt json version

Program Lang./C++ 2016. 7. 22. 10:16

PAT 정보를 Json 파일 포멧으로 저장 후에 웹브라우져에서 확인하는 것의 연장선으로 PMT 정보도 출력했다.

결국 json 형식으로 출력 및 자바스크립트에서 막히는 문제로 삽질을 했다.


웹브라우져에서 확인 테스트는 자바스크립트 탭에 정리한다.


1. 소스 트리

자세한 내용은 PAT에 정리되어 있다. 여기서 핵심은 boost spirit을 이용한 json 라이블러리의 사용이다.

PAT쪽에 정리되어 있으므로 여기서 생략하기로 하자. 


2. 헤더 파일

json 파일로 저장하는 함수 하나 추가해서 일단 생략하고 전체 소스 링크 참조


3. 클래스 본체

json 포멧이 PAT보다 복잡해졌다.

전체 PMT정보를 감싸는 pmtArr라는 Object Array가 선언되어 있고 이 배열 안에

다시 Object + Array 형태로 저장이 되어 있는 구조이다.

이 구조가 맞는 것인지는 모르겠다. 인터넷 상에 찾아보고 동작은 잘되서 맞는 것 같은데

시간이 되면 좀 더 자세히 봐봐야겠다 



4. 테스트 코드


5. 실행 결과


6. 전체 소스 (github link, javascript는 없음.)

자사스크립트는 자바스크립트 탭에 정리


https://github.com/heesoon/mpeg/tree/master/test/pmt_json

'Program Lang. > C++' 카테고리의 다른 글

full version (pat, pmt, sdt)  (2) 2016.07.22
sdt json version  (0) 2016.07.22
pat 정보를 json 파일로 저장 후 webbrowser에서 확인  (0) 2016.07.21
5. sdt (service description table) class  (0) 2016.07.20
4. pmt class  (0) 2016.07.19
:

pat_json.txt 파일을 이용한 pat 정보 webbrowser로 출력

Program Lang./javascript 2016. 7. 21. 19:27

MPEG-TS Analyzer들 처럼 treeview로 보여주고 싶어서 인터넷을 뒤지다. 좋은 참고 사이트가 있어서 활용하였다.

상세 정보는 아래 참고 사이트 블로그 참조.


1. 소스 트리

아래 위치는  apache2 root directory인 /Users/hskim/Sites/mpeg/ 아래 소스 트리이다.

pat_json.txt 파일은 c++ native application이 pat을 parsing한 후에 만들어서 저장한 json 파일이다.

이 파일을 웹브라우져에서 읽어본다.

.

├── css

│   ├── images

│   │   ├── ajax-loader.gif

│   │   ├── file.gif

│   │   ├── folder-closed.gif

│   │   ├── folder.gif

│   │   ├── minus.gif

│   │   ├── plus.gif

│   │   ├── treeview-black-line.gif

│   │   ├── treeview-black.gif

│   │   ├── treeview-default-line.gif

│   │   ├── treeview-default.gif

│   │   ├── treeview-famfamfam-line.gif

│   │   ├── treeview-famfamfam.gif

│   │   ├── treeview-gray-line.gif

│   │   ├── treeview-gray.gif

│   │   ├── treeview-red-line.gif

│   │   └── treeview-red.gif

│   ├── jquery.treeview.css

│   └── screen.css

├── index.html

├── lib

│   ├── jquery.cookie.js

│   ├── jquery.js

│   └── jquery.treeview.js

└── pat_json.txt


2. 선수 작업

일단 json 파일을 javascript에서 읽어 드리면 방법은 여러가지가 있지만 javascript공부가 주 목적이 아니므로로

일단 돌아가면 그냥 냅둔다.

treeview.html 파일을 index.html로 바꾸고 거기에 json http parsing 부분만 추가하였다.


3. index.html 


4. 테스트 결과


5. 참고 사이트


[javascript treeview] - 공유해주셔서 감사. 네가 javascript를 뜸성뜸성 알아서 잘 활용했는지 의문임.

http://yangyag.tistory.com/65

'Program Lang. > javascript' 카테고리의 다른 글

sdt version 브라우저에 출력  (0) 2016.07.22
pmt_json.txt 브라우져에 출력  (0) 2016.07.22
:
◀ PREV : [1] : [2] : [3] : [4] : [5] : [6] : [7] : [8] : NEXT ▶