프로그래밍 언어2022. 9. 14. 01:59

Posted by 세월의돌
프로그래밍 언어2018. 10. 4. 08:38

Spring Tool Suite을 사용하고 있는데, 뭐 이게 Eclipse 이다.

이클립스는 안드로이드 개발할 때 많이 사용 해 봤는데, 보통 자바 소스에 에러가 있으면, 패키지 탐색기(Package Explorer)의 해당 파일에 빨간색 엑스자가 표시되곤 했다.

당연히 그렇게 될거라 생각하고 있었고, 외부에서 파일들을 수정하고 STS를 열었는데, 패키지 탐색기에 에러 표시가 없었다. 그래서 에러가 없구나 생각하고, commit을 push 했는데... 왠걸;; 에러가 있었다. (이것땜에 졸 삽질;;)


암튼 그래서 이래저래 검색을 하다 보니, 역시나 구글신이 답했다.

외국(미국)에서는 빨간색 엑스 표시를 red-x icon 이라고 하더라.

결국, 이게 표시되지 않는 문제는, CDT를 추가로 설치하면 해결 된다.

이것이 문제인 것인지, CDT의 부가기능인 것인지는 확실하지 않다.


내가 참고했던 포스트는 아래 경로임.

https://www.mkyong.com/eclipse/eclipse-red-x-icon-didnt-display-on-project-explorer/


Posted by 세월의돌
프로그래밍 언어2018. 6. 25. 14:10
프로그래밍 언어2018. 6. 18. 08:51
* Adds include and library path to the all projects by default
Open and edit the file %UserProfile%/AppData/Local/Microsoft/MSBuild/v4.0/Microsoft.Cpp.x64.user.props and add the red lines in the following (Also needs to refer to https://github.com/qPCR4vir/nana-docs/wiki/Installation)

<?xml version="1.0" encoding="utf-8"?>

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup>
    <IncludePath>C:\nana\include;$(IncludePath)</IncludePath>
    <LibraryPath>C:\nana\extrlib\vc2017;C:\nana\build\bin\vc2017;$(LibraryPath)</LibraryPath>
  </PropertyGroup>
  <ItemDefinitionGroup />
  <ItemGroup />
</Project>



* Changes the options to use static libraries
Open the project property page and change the options as follows for the property, C/C++ > Code Generation > Runtime Library.


Multi-threaded Debug (/MTd) for the Debug Configuration

Multi-threaded (/MT) for the Release Configuration



* (Optional) Adds the 3rd party libraries to make linker working properly

(Do this if you decide to use the 3rd party libraries. Refer to https://github.com/cnjinhao/nana/wiki/Configuration-of-Third-Party-Libraries-for-Nana)

Open the project property page and add the following line to the property, Linker > Input > Additional Dependeicies.

nana_$(DefaultPlatformToolset)_$(Configuration)_$(PlatformTarget).lib;libjpeg.MT.$(PlatformTarget).lib;libpng.MT.$(PlatformTarget).lib;libzlib.MT.$(PlatformTarget).lib;



* (Optional) Gets rid of the console window

  1. Open the project property page.
  2. Change the options as follows for the property, Linker > System > SubSystem.
    Windows (/SUBSYSTEM:WINDOWS)
  3. Add the following keyword to the property, Linker > Advanced > Entry Point.
    mainCRTStartup


Posted by 세월의돌
프로그래밍 언어2018. 6. 4. 19:45

Microsoft(이하 MS)를 별로 좋아하지 않는 사람들도 있지만, 개인적으로 MS의 개발도구를 선호하기도 하고, Linux에서도 사용할 수 있기 때문에, Visual Studio Code(이하 vscode)와 extension인 Rust(rls)의 사용을 기준으로 정리한다. (즉, vscode가 설치되어 있다는 전제로 설명한다. 개취라고 생각하므로 Jetbrains tool이 더 좋다는 태클은 사양)


  1. Install LLVM that script is enabled.
    LLVM을 설치한다. vscode에서 debug를 하려면 script(python)가 활성화 된 LLVM(lldb)이 필요하다. 그런데 llvm.org에서 최신버전(6.0.0)을 설치하고 vscode에서 debug 명령을 실행하면, script를 지원하지 않는다는 메시지가 출력된다. 직접 빌드를 해서 사용해도 되겠지만, 빌드 되어 있는 버전이 있으므로, 아래 경로에 있는 파일을 설치하면 되겠다. https://github.com/vadimcn/llvm/releases/tag/r308926 (direct link)

  2. Install python 3.5.x that is required by lldb scripting.
    Python 3.5.x를 설치한다. vscode에서 lldb를 이용한 debug를 사용하려면, 시스템에 python35.dll이 필요하다. 현재 시점에 python.org에서 최신버전은 3.6.5이고, 3.5.x의 최신 릴리즈는 2018-02-05에 릴리즈 된 3.5.5인데, 소스로만 릴리즈 된다. 귀찮으므로, 2017-08-08에 릴리즈된 3.5.4의 바이너리를 받아서 설치한다.(direct link)

  3. Install rust.
    Rust를 설치한다. https://www.rust-lang.org/en-US/install.html 에서 rustup-init.exe를 다운로드하여 설치하면 된다. curl을 사용할 수 있다면, curl을 이용할 수도 있다. 설치 실행파일(스크립트)을 실행하면, 아래와 같은 text UI가 보이는데, Rust(rls)는 nightly build를 사용하기 때문에, default toolchain을 nightly로 변경해 주어야 한다.

    Default toolchain을 제외한 나머지 물음은 default 설정을 그대로 사용하면 되겠다. 이후 1번을 선택 해 설치를 진행하면 된다.

  4. Install vscode extension, Rust(rls).
    Rust(rls)를 설치한다. Install -> Reload 하면 된다.


  5. Generate sample rust project and build it. Refer to https://doc.rust-lang.org/1.4.0/book/hello-cargo.html#a-new-project
    제목의 경로를 참고해서 프로젝트를 생성하고, vscode에서 해당 폴더를 열어보면 아래와 같은 alert이 발생한다.

    Yes를 선택해서 설치하면 된다. 만약 나타나지 않는다면, vscode를 종료 후 다시 시작 하면 된다.

  6. Build and execute sample project.
    설치 후, CTRL+SHIFT+B를 누르면 아래와 같은 목록이 보이고, Rust: cargo build를 선택하면, 빌드가 진행되고 완료된다.


    task.json 파일을 아래와 같이 수정하면, 위의 목록 없이 바로 빌드가 되도록 만들 수 있다.


    CTRL+SHIFT+P를 누르고, run을 입력하면 Tasks: Run Task가 보인다. 선택하자.

    이제 아래와 같은 목록이 보이며, Rust: cargo run을 선택하면, 실행 결과를 terminal에서 볼 수 있다.


  7. Install vscode extension, CoreLLDB.
    디버깅을 위해 CodeLLDB를 설치한다. (Native Debug를 설치해도 된다고 하는데, 아이콘이 맘에 들므로 CodeLLDB를 설치했다)


  8. Let's do debug.
    F5를 누르고 LLDB를 선택하면, 처음에는 launch.json 파일이 생성되고, 다시 동일한 동작을 수행하면...


    아래와 같은 에러가 발생한다... 이건 아직 해결 못함 :-(


    해결 하고나면 업데이트 하는걸로...

여기까지 하고 나면(사실 6번까지...) 빌드하고 실행할 수 있다 lol


Posted by 세월의돌
프로그래밍 언어2018. 5. 29. 13:36

C++11 이후부터는 local static variable에 대한 생성은 thread safe하다.


아래 표준 제안 문서에서 제안이 되었고, C++11에 포함되었다.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2660.htm


Visual Studio는 2015부터 구현이 되었으므로, 사용에 주의 해야 한다.

https://msdn.microsoft.com/en-us/library/hh567368.aspx


이전의 DCLP (Double Checked Locking Pattern)은 이제 사용하지 않아도 된다.

https://en.wikipedia.org/wiki/Double-checked_locking


Posted by 세월의돌
프로그래밍 언어2017. 9. 14. 10:11

오래전에 JAVA의 DataInputStream, DataOutputStream을 이용해 object serialization 비스무레한걸 구현 했었다.

그 때는 Android에서 동작하기만 하면 되었기 때문에, 아무 생각없이 구현을 했었는데,

오랜 시간이 지나 C++에서 그 때 저장되었던 파일을 읽으려고 하니, 간단한 문제가 아니더라. ㅠㅠ


암튼, 그래서 C++로 DataInputStream 비스무레하게 구현을 해 보려고 했는데, 기본타입에 대해서는 문제가 없는데,

문자열이나 특수한 타입에 대해서는 별도로 구현을 해 주어야 했다.

함수 인터페이스를 동일하게 만들기 위해서 function template으로 구현을 하는데,

이게 function template은 partial specialization이 불가능 하기 때문에 함수 인터페이스가 예쁘게(?) 나오지 않았다.

고민하다가, 오랜만에 Effective C++을 다시 꺼내서 훑다 보니, 역시 힌트가 있었다. Thanks Scott!




함수 반환을 성공/실패로 하고, 결과를 참조로 반환하면 타입 추론이 되니,

template argument를 명시적으로 안 줘도 될텐데... 디자인의 문제이니, 좀더 고민 해 보자.

Posted by 세월의돌
프로그래밍 언어2016. 8. 25. 15:46

뭔가 복잡하고 완벽하게 만들려면 좀더 까다롭겠지만,

range-based for loop 또는 std:find 등의 STL algorithm을 이용할 수 있도록 간단하게 만든다면, 아래와 같이 하면 되겠다.

(물론 검증된 것은 아니고, 정말 연습용으로 해 보고 정리하는 것임. 따라서 오류가 있을수도...;;)




template <typename T> class slist는 이미 정의가 되어 있고,

template <typename T> class slist_iterator가 friend로 지정되어 있다.

(또는 slist의 nested class로 구현하여도 되겠다)


처음에는 아래와 같은 type을 노출하지 않았었다.


그 상태로 range-based for loop은 문제가 없었지만, std::find를 호출 했더니, iterator_category를 지정해야 한다는 에러 메시지가 나와서 추가 해 주었다.


그랬더니 std::iterator_traits 뭐라뭐라 에러가 나는데, 뭐라 하는지 전혀 모르겠더라;;


그래서 혹시나 하는 마음에 value_type, reference를 추가 해 보았으나 동일ㅠㅠ


결국, stackoverflow에서 해답을 찾았다. (오늘 알게 된 사실인데, 해당 글의 const_iterator 구현 부분에서 operator*, operator->의 반환값이 그냥 reference, pointer로 되어 있어, 값을 할당하여도 에러가 발생하지 않는다. 이 부분은 수정이 필요함. 맨 아래 전체 소스 참고.)


위의 네 개의 타입과 iterator_category는 반드시 노출되어야 하고,

iterator_category에 따라 필요한 멤버함수들을 구현 해 주면 된다.


정말 간단하게 구현하는 방법은 std::iterator를 상속하여 구현하는 것인데,

이놈이 C++17에서 없어질 예정이므로, 이후 어떻게 해야 할지는 알아봐야 할듯.


아래는, 허접하지만 const_iterator까지 구현한 전체 소스 (__)

Posted by 세월의돌
프로그래밍 언어2016. 7. 25. 16:47

Boost libarary를 공부하고 있는데,

Chapter 10: Concurrency with Boost 부분을 마치고, reference에 Herb Sutter의 강연 동영상 링크가 있길래 호기심에 찾았다가, 좋은 내용인것 같아서 이틀에 걸쳐 시청을 완료했다.

Lock-free programming에 대해 친절하게 설명해 주고 있어, 나중에 다시 참고할 필요가 있을 것 같아 갈무리 해 둔다. (시간이 지나면 또 잊어 버릴 수 있으니... oTL)


Multi-threaded programming을 많이 하지 않다보니, 취약한 부분인데 많은 도움이 되었던 것 같고, 중요(?) 키워드는 다음과 같다.

  • std::atomic 또는 std::atomic_xxx()
  • ABA problem - 첫 번째 thread가 최초 참조한 object가, 두 번째 thread에 의해 변경(삭제 후 다시 생성하였지만, 동일한 주소 또는 위치를 유지)되었지만, 실제로는 다른 object로 변경된 경우 발생하는 문제
  • Linearizability - concurrent programming에서, 두 operation이 겹쳐진 경우(overlapped)에도, 결과적으로는 순차적으로 실행된 것처럼 동작하는 성질(?)
  • Constructor와 destructor는 concurrency관련 이슈가 없다. (instance의 lifetime은 destructor가 호출 되는 순간 끝난다)


다음에 짬 내서, "Herb Sutter - atomic<> Weapons"도 봐야겠다.









Posted by 세월의돌
프로그래밍 언어2016. 7. 11. 15:57

Boost Spirit framework이 boost로 부터 독립을 했다가 다시 들어간건지...

홈페이지에 보면, 2013년에 boost로 부터 독립을 했다고 되어 있는데,

C++Now 2015에서 발표를 하면서 (혹은 그 사이에) boost에 다시 편입된건지, 된 것 같다.

(boost/spirit/home/x3.hpp & boost/spirit/home/x3/)

아니면 boost repository를 그대로 이용을 하는건지 모르겠지만, 소스가 boost github에 올라가 있는것 같다.


암튼, 갈무리 용도...


Posted by 세월의돌