프로그래밍 언어2016. 1. 7. 17:56

무식하게 EXCEL로 로그 분석을 하다 보니, 제일 눈에 들어오게 만드는 방법이 셀(cell)의 색상을 바꾸는 것이라고 생각했는데,

VBA를 잘 모르니 문법을 겁나 구글링을 해서 간단하게 만들어 봤다.


요즘은 MS에서 지원을 접은건지 (아니면 내가 잘 못 찾아서 그런건지) 뭔지 잘 모르겠지만, MSDN에서만 찾아서는

VB 문법들이 주로 나오고, 그 문법들은 VBA와는 다른지 제대로 동작하지 않는 것들이 많았다.


이런건 StackOverflow에도 글들이 많지 않고, 그냥 구글링이 최고더라!!!ㅎㅎ



색상은 key value 별로 랜덤하게 설정하도록 되어 있고(Function GetColor), UpdateClassColor()에서

컬럼(Column)을 선택하는 "B2" 부분을 적절하게 변경해서 사용하면 될 듯.

(입력으로 받도록 만들 수도 있겠으나... 허접-0-)

Posted by 세월의돌
프로그래밍 언어2015. 9. 4. 11:09
Posted by 세월의돌
프로그래밍 언어2015. 9. 4. 10:04

회사에서 VS2015를 사용하고 있는데, 이걸 이용해서 윈도우 실행 바이너리를 하나 만들어서 전달했다.


그런데, 받아서 실행하는 사람이 msvcp140.dll 이 없어서 실행을 해도 안된다는 것이었다.


무슨 소리지? 내 PC에서는 잘 되는데...;;


그랬는데, 옆에 있는 PC에서 실행을 해보니 정말 그러하더라...



찾아보니 Visual C++ Runtime 이었고, 단순히 이 파일만 복사한다고 되는게 아니더라;;


좀더 알아봐야 하겠지만, 지금은 중요한 일이 아니라서 그냥 static link해서 전달했다.


참고로 static link 설정하는 방법은 다음과 같다.


Project >> Properties >> Configuration Properties >> C/C++ >> Code Generation >> Runtime Library


위 항목의 값이 기본적으로 Multi-threaded Debug DLL(/MDd)로 되어 있고, 이 값을 Mutil-threaded (/MT)

변경하면 실행파일에 runtime을 포함할 수 있다.


Posted by 세월의돌
프로그래밍 언어2015. 9. 3. 23:52

팀장님이 개인적으로 필요하다며, 만들어 줄 수 있냐고 하셔서 급하게 만들어본 코드.

string instance를 substr을 통해 계속 생성해 사용하도록 되어있어, 개선의 여지가 있을 것 같다.

하지만, 이런 소소한 문제 해결에 행복감을 느끼게 되다니, 개인적으로도 내 자신이 안타깝다... oTL

다른 사람이 리뷰 좀 해 주면 좋겠다.


(Aug. 10 2016) 시간 복잡도 분석을 해 봤는데, M^(N-1)이 된다.


만약 10진수(M=10)에 대해, N = 1인 경우 1ms가 걸린다고 하면, N = 4 인경우 1초에 불과하지만, N = 9에 대한 모든 경우의 수를 만들려면 꼬박 하루가 지나고도 3시간 정도가 더 필요하며, N = 10인 경우에는 대략 11일이 걸린다. (만약 결과를 얻기 전에 stack overflow가 발생하지 않는다면 말이다...) -_-;


무시 무시한 구현인데, 모든 조합을 만들어 내려면 이것밖에 없는거 아닌가?@.@


N - 입력 문자열 가운데 x의 개수

      ex) 010-7x0x-00xx의 경우 N = 4

M - 조합에 사용할 문자 집합의 크기(개수)

      ex) 10진수 인 경우 M = 10, 알파벳 대문자의 경우 M = 26




Posted by 세월의돌
프로그래밍 언어2015. 8. 28. 08:15

Additional C/C++ Tooling

  • Build Tools - CMake

  • Code Formatter - ClangFormat

  • Linters - Flint / Flint++

  • Static Analyzer - Scan-build

  • Runtime Sanitizer - ASan and UBSan

  • Header Analysis - Include What You Use

  • Rapid Recompiles - ccache / distcc

  • Memory Leak Detectors - Valgrind / leaks

  • Profiler - Perf / DTrace

  • Debuggers - lldb

  • Fuzzers - American Fuzzy Lop

  • Disassemblers - gobjdump


휴... 많기도 하다. 다른 더 많은게 있겠지?-0-

위 링크의 블로그에는 간단한 설명도 있다!

Posted by 세월의돌
프로그래밍 언어2015. 8. 27. 15:10

윈도우에서 gcc를 사용하고 싶을 때가 있다. 그렇게 하려면 가장 쉬운 방법은 MinGW를 설치하는 것이다.

기본적인 MinGW를 설치하면, bash와 gcc(4.8.x)를 바로 사용할 수 있다.


그런데, 현재 최신 gcc는 5.2.x 이고, C++11/14을 사용하려면 최신 버전의 컴파일러가 필요한데, 최강의 IDE인 Visual Studio 2015에서 C++11/14을 지원하기 때문에 아쉬움이 덜 하기는 하지만, 그래도 gcc(g++)를 사용해야 할 필요가 발생하기도 한다.


이러한 요구사항이 있던 상태에서, 그냥 저냥 지내다가, 트위터를 통해 conemu(오픈소스 프로젝트)라는 것이 있다는 것을 알게 되었고, 간단하게 (하지만 필요한 내용이 포함된) 소개된 블로그를 통해 잘 설치할 수 있었다.

위 블로그에 링크되어 있는 "Consolas + 맑은 고딕" 폰트는 링크가 깨져 있지만, 구글링 하면 간단하게 찾아서 추가할 수 있다.


이렇게 강력한 console emulator를 설치한 김에, 그럼 gcc 최신 버전도 사용을 해 보자는 생각으로 구글링을 좀 했더니, MSYS2라는 것을 알게 되었다.

이게 참 잘 만들어 놓은게, 우분투의 apt-get 처럼 pacman이란 명령으로 각종 binary package를 최신버전으로 업데이트/설치 할 수 가 있다!

그런데, 이게 conemu와 함께 사용하려면 몇 가지 문제가 있는 것 같다. 이래저래 conemu와 MSYS2를 연결 했지만, clear 명령을 실행하면, 화면이 제대로 지워지지 않아 구글링 해 봤더니, TERM이라는 환경변수를 cygwin으로 설정해 주면 된다고 되어 있었다.


[conemu와 MSYS2를 연결하는 명령어]

C:\msys64\usr\bin\mintty -i /msys2.ico /usr/bin/bash --login

>> 처음에는 이렇게 연결 했었는데, conemu를 다시 실행하니, 목록에 자동으로 MSYS2가 추가 되더라...


정말 해결이 되긴 되었는데, 그 다음엔 vim이 문제가 되더라. vim 화면이 보이지 않는 현상...;;

이것도 어떻게 해결을 해 보려고 하다가, 너무 많은 시간을 소비 하는 듯 하여, 우선은 git bash를 사용하고, 컴파일러만 연결해서 사용하기로 함;;


기본적인 업데이트는 MSYS2 설치가이드를 참고하면 될 것 같고, 간단하게 gcc를 설치하는 벙법만 정리해 보면 다음과 같다.


[package 검색]

$ pacman -Ss gcc
mingw32/mingw-w64-i686-gcc 5.2.0-3 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
mingw32/mingw-w64-i686-gcc-ada 5.2.0-3 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (Ada) for MinGW-w64
mingw32/mingw-w64-i686-gcc-fortran 5.2.0-3 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (Fortran) for MinGW-w64
mingw32/mingw-w64-i686-gcc-libgfortran 5.2.0-3 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (libgfortran) for MinGW-w64
mingw32/mingw-w64-i686-gcc-libs 5.2.0-3 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (libraries) for MinGW-w64
mingw32/mingw-w64-i686-gcc-objc 5.2.0-3 (mingw-w64-i686-toolchain)
    GNU Compiler Collection (ObjC,Obj-C++) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc 5.2.0-3 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64

mingw64/mingw-w64-x86_64-gcc-ada 5.2.0-3 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (Ada) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-fortran 5.2.0-3 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (Fortran) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-libgfortran 5.2.0-3 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (libgfortran) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-libs 5.2.0-3 (mingw-w64-x86_64-toolchain) [installed]
    GNU Compiler Collection (libraries) for MinGW-w64
mingw64/mingw-w64-x86_64-gcc-objc 5.2.0-3 (mingw-w64-x86_64-toolchain)
    GNU Compiler Collection (ObjC,Obj-C++) for MinGW-w64
msys/gcc 4.9.2-5 (msys2-devel)
    The GNU Compiler Collection - C and C++ frontends
msys/gcc-fortran 4.9.2-5 (msys2-devel)
    Fortran front-end for GCC
msys/gcc-libs 4.9.2-5 (base) [installed]
    Runtime libraries shipped by GCC
msys/mingw-w64-cross-gcc 4.9.2-3 (mingw-w64-cross-toolchain mingw-w64-cross)
    Cross GCC for the MinGW-w64


[package 설치]

$ pacman -S mingw-w64-x86_64-gcc
resolving dependencies...
looking for conflicting packages...

Packages (1) mingw-w64-x86_64-gcc-5.2.0-3

Total Installed Size:  100.20 MiB
Net Upgrade Size:        0.00 MiB

:: Proceed with installation? [Y/n] Y


현재 64bit 윈도우를 사용하고 있어서, MSYS2 64bit 버전을 설치 해 봤는데,

MSYS2를 conemu와 연결하지 않고 단독으로 사용한다면, 정말 linux shell interface와 거의 유사하게 사용할 수 가 있다.


참고로, conemu와 연결을 하려니, 앞서 얘기한 문제들이 발생했고, 그래서 git bash(32bit)를 conemu와 연결해서 사용하는데, MSYS2 64bit에 포함된 ls등의 명령어를 git bash에서 실행하면 많이 느린 느낌이 든다.


아무튼 좋은 환경을 만들 수 있어 좋다. 세상엔 훌륭하고 똑똑한 사람들이 너무 많다-0-

나도 세상에 도움이 되는 사람이 되어야 할 텐데 말이지...;; (이 나이 먹고도 이런 고민을 하고 있다 oTL)

Posted by 세월의돌
프로그래밍 언어2015. 8. 26. 10:36

리눅스 서버에서 std::thread, std::async를 사용하는 간단한 테스트를 하는데, 컴파일을 마치고 실행을 하니 아래와 같은 에러가 발생했다.


terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted
Aborted (core dumped)


역시나 구글링 + 스택오버플로우에서 해답을 찾았다.

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3를 사용하고 있는데, 컴파일 버전이 낮아서 그런건지 확실하지 않으나, std::thread를 제대로 지원하지 못하고 있는 듯.


암튼 해결 방법은 컴파일 옵션에 -pthread 를 추가 해 주면 된다.

std::thread가 pthread로 동작을 해야 하는데, 내부적으로 처리를 하지 못 하는 건지...


내가 서버 관리자도 아니고, 내 맘대로 컴파일러 버전 올렸다가 뭐래도 안되면 곤란하니,

최신 컴파일러 소스 받아서 빌드하고 테스트 해 봐야겠다.


(Visual Studio 2015는 윈도우 플랫폼에 딱 맞춰서 개발을 할테니, 이런 수고가 필요 없다. VS2015 짱!!!!)

Posted by 세월의돌
프로그래밍 언어2015. 7. 31. 09:52

MEC++ 공부하면서, errata를 발견해서 Scott Meyers 옹의 홈페이지를 방문 해 봤더니, 지난 5월에 report가 되었더라. : )

http://www.aristeia.com/BookErrata/emc++-errata.html



Item 34에 lambda 대신 bind를책에 있는 코드를 그대로 작성했는데 컴파일 에러가 발생했다.


그런데, 옷갖 template의 향연으로인해 에러 메시지는 거의 암호 수준;;


그래서 장인정신으로 STL의 해당 template들을 한 줄 한 줄 따라가다 보니 std::plus functor의 template parameter가 하나의 타입만 받도록 되어 있는데, 실제로 더하려고 하는 object는 std::chrono::steady_clock::time_point와 std::chrono::duration이었기 때문에 발생한 에러 였음.

실제로 std::plus 내부에서 호출하는 operator+는 function template으로 time_point와 duration을 더할 수 있도록 overload 되어 있지만, std::plus는 template이기 때문에 암시적인 형 변환을 할 수 없고, 따라서 operator+까지 도달하지도 못함.



즉, operator+는 연산을 지원하나, binding 시점이 아닌, 호출 시점에 evaluation이 되어야 하기 때문에 사용하는 std::plus가 두 개의 타입을 지원하지 않기 때문에, C++14에서 지원하는 std::plus<void>를 이용(type deducing을 하여 알아서 처리해 줌)하거나, 아니면 직접 가능하도록 구현을 해 주어야 함!


Posted by 세월의돌
프로그래밍 언어2015. 7. 9. 17:49

이렇게 공부하면 된다는데..

http://stackoverflow.com/a/388282


후아...

나는 어디쯤 와 있는가?-_-;

외국인 블로그의 글들을 보면, 글을 쓰는 사람들이나 comment 하는 사람들이나, 모두모두 template을 자유자재로 사용하면서,  level of indirection/proxy등도 마구마구 활용하더라...

그렇게 복잡하게 코드를 작성해서 사용자가 편하게 만들어 줘야 하는가 싶기도 하고, 더 복잡해 지는건 아닌가 싶기도 하고....

뭐가 맞는지는 모르겠으나, 알면서 자제하는 것과 몰라서 못하는 것은 차이가 크니;;

알면 알수록, 공부하면 할 수록 깜깜해 진다;;

Posted by 세월의돌
프로그래밍 언어2015. 3. 22. 17:22

이 글은 1999년 2월호 Embedded Systems Programming 이라는 잡지(?)에 실린 것으로 보이는 다음 링크의 글을 참고 한 것임. http://www.dansaks.com/articles/1999-02%20const%20T%20vs%20T%20const.pdf


요즘 C++로 코딩을 할 일이 좀 있어서, 이왕이면 C++11/14을 활용할 수 있으면 활용 해보자는 생각으로 노력하고 있는데, 사실 C++11/14에 대해서 잘 아는것도 아니고, Effective Modern C++을 공부하면서 알게 되는 것들이 대부분이다.


어쨌든 이 글은 C++11/14와는 전혀 관계가 없고, template programming을 하다가 발생한 문제를 해결하는 과정에서 발견한 문서를 보고, 깊은 감명(개탄과 좌절)을 받고 정리 해 두어야 할 것 같아서 작성하는 글이다.


역시나, 내가 많이많이 모르고 있었다는 사실을 느끼게 해 준 글이라는 것과 동시에, 학부시절(언제 였던가...;;) C++을 독학했던 나로서는, 어디에서도 이러한 설명은 들어본 적이 없다. 심지어 학부 C언어 수업에서 조차도...


사실 이 글의 내용은 C언어에 대한 설명이다. 정말 기본 중에 기본이라고 생각되는데, 어디에서도 제대로 가르쳐 준 곳이 없었다. 물론 이미 경험 해 보았거나, 정통한 분들은 다 잘 알고 있을 내용이지만... oTL



사족은 그만 두기로 하고, 원래의 문제를 설명 해 보자면 다음과 같다.

위의 코드에서 (1)과 같이 구현을 하면 아무런 문제가 없는데, (2)와 같이 구현을 하면 interface의 순수가상함수가 구현되지 않았다고 컴파일 에러가 발생하는 것이다.


나로서는 도대체 이해가 되지 않았다. 전혀 엉뚱한 template type deduction 문제가 아닌가 짐작했을 뿐...



그러다 이전에 수강했던 강사님께 문의를 해서 얻은 답은 const가 문제였던 것이다.


결론부터 말하자면, (2)와 같이 typedef를 이용하지 않고 구현하려면, 아래와 같이 정의/구현 해야 한다.

결론을 알고 나서도 멍 했다. 도대체 뭐지? C++ Template Complete Guide에서도 초반에 표기법에 대한 설명에서 나오긴 했었지만, 망각한지 오래이기도 하고 근본 개념(?)에 대해서는 설명이 없었다. (아마도 당연히 알고 있는 내용이라고 생각 했을지도...)



이제부터는 그 원리에 대해서, 참고자료를 이용하여 이해 해 볼 시간!


Posted by 세월의돌