기본 콘텐츠로 건너뛰기

9월, 2015의 게시물 표시

Cascadia Code 글꼴

C++ type demangling

C++에 타입을 실행시간에 얻어내는 것은 typeid라는 연산자가 해주긴 하는데, type_info::name() 메소드로 찍어보면 영... 사람이 볼만한 내용이 아니다. C++의 오버로딩(같은 메소드에 입력인자만 달리 하여 정의하는 것) 덕에 실제 바이너리에 기록할 때는 몇가지 규칙을 가지고 이름(symbol)을 변형하여 기록한다. 이것을 mangling이라고 한다. 이런 이름을 사람이 알아볼 수 있는 것으로 변환하는 표준은 없다. orz OTL 다만, GCC에서 만든 ABI(Application Binary Interface)를 통해 사람이 보기 편한 형태로 변환해주는 API를 제공한다. std::string demangle(const char* mangled) {   using result_type = std::unique_ptr<char[], void (*) (void*)>;   int status(0);   result_type result(abi::__cxa_demangle(mangled, nullptr, nullptr, &status), std::free);   return status == 0 ? result.get() : ""; } 참조: https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html 참조: http://stackoverflow.com/questions/281818/unmangling-the-result-of-stdtype-infoname

C++11 auto string types

auto key1 = "Hello, world!"; // char* char key2[] = "Hello, world!"; // char array included null-terminate auto key3[] = "Hello, world!"; // ERROR! auto key4 = {"Hello, world!"}; // std::initialize_list<char const* const> auto key5 = {'H','e','l','l','o',',',' ','w','o','r','l','d','!'}; // std::initialize_list<char const> char key6[] = {'H','e','l','l','o',',',' ','w','o','r','l','d','!'}; // std::initialize_list<char const> 오랜만에 쓰면 헷갈리니까 기록하는 차원에서, C++11에서 스트링을 auto로 받았을 때 어떤 형태로 되는지 테스트 해봤다. key1은 char[]를 예상했지만, char*로 받더라. sizeof(key1)하면 8 (64bit)을 뱉는다. key2는 당연히 char[]이지만, "Hello, world!\0"까지 계산해서, sizeof(key2)하면 14 를 뱉는다. key3는 아쉽게도 GCC 5.0에서 컴파일 에러를 뿜어낸다. key4는 initialize_list<>객체를 받는데, 내부에

Ubuntu Bash에서 Powerline 적용하기

쉘에 예쁘장하게 보여주는 Powerline 이라는 프로젝트가 있다. <그림> Powerline Vim Screenshot 하악하악 아름다워! ... 하지만 설치는 쉽지 않다. 글꼴도 패치해야하고, 파이썬 모듈도 깔아야하고... RPM/DEB 패키지로 한 방에 설정까지 똑 떨어지지 않으면, 아무래도 차후 OS 업그래이드할 때, 귀찮아진다. 결국 OS 재설치로 이어지겠지만... # Bash에 적용하기!! 먼저 Ubuntu 15.04에 패키지를 살펴보았다. 엇! powerline이 있잖아!! 낼름 apt-get으로 설치해보자. $ sudo apt-get -y install powerline 헤헷... 쉽잖아!...면 블로깅 하지 않았겠지. orz OTL 적당히 계정 홈 디렉토리에 .bash_aliases 파일을 생성하고, 몇가지 명령을 때려 넣어주자. .bash_aliases 파일은 .bashrc를 통해 존재하면, 자동으로 실행하는 쉘 스크립트인데, Ubuntu에만 있으니까, Redhat계열은 적당히 .bashrc 등에 만들어주자. $ vi ~/.bash_aliases powerline-daemon -q POWERLINE_BASH_CONTINUATION=1  POWERLINE_BASH_SELECT=1 . /usr/share/powerline/bindings/bash/powerline.sh 거창하게 powerline-daemon도 띄우고, 스크립트도 실행해야한다. Redhat 계열은 맨 아래 스크립트 위치를 적당히 고쳐주자. 그리고 새 터미널 열면 끝~ # Vim에 적용하기! 많은 길을 걸어왔지만, 결국 vim-addon-manager에게 시키면 간단하다. $ sudo apt-get -y install vim-addon-manager $ sudo vim-addon-manager -w install powerline 다 하고 나서, 상태줄이 표시되지 않으면, ~/.vi

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&