글 목록 보기

Lyn
조회 수 2901 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

https://www.jetbrains.com/resharper-cpp/

구매 해서 사용해보고 후기 한번 올려 보겠습니다.

 

과연 Visual Assist 를 대체할수 있을까?

?

Lyn
조회 수 10045 추천 수 0 댓글 0
Atachment
첨부 '10'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

nuget이 뭔가 하니... 

java의 maven, ruby의 gem, node.js 의 npm 같은 패키지 저장소입니다. ms가 만든거죠


필요한 라이브러리를 매번 찾아서 세팅하려면 귀찮으니 인터넷에서 받아서 자동설치 하자... 의 개념입니다.
저도 C#으로 개발할 때는 매우 잘 이용하고 있었는데... 멍청하게도 이게 C++을 지원한다는걸 모르고있었습니다.

얼마전 알게된 김에 한번 테스트 해 보았습니다.


모든 스크린샷은 최근에 무료 배포되는 VS2013 Community Edition입니다.


그럼 새 Console 프로젝트를 하나 만들고, 

Project -> Manage Nuget Packages... 를 클릭합니다


1.png



그리고 Serch Online 텍스트박스에 설치하고자 하는 패키지명을 넣습니다.
전 흔히 쓰는 boost로 해 보겠습니다


2.png


VC++ 2013 는 버전으로는 12.0 이므로 boost-vc120 을 선택하여 설치합니다

3.png


install을 누르면 설치되는데 속도는 꽤 빠릅니다.
boost가 5분정도만에 설치 되더군요


4.png


설치가 끝나면 프로젝트에 패키지 파일하나만 달랑 추가됩니다. 깔끔하네요

5.png


그럼 정말 잘 되는지 테스트를 해야겟죠?

boost::shared_array 를 사용한 후 빌드를 해 봤습니다


6.png


깔끔하게 잘 진행 되네요.


그럼 패키지 파일들은 어디에 저장 되는지 궁금해 지는데,

솔루션 폴더(프로젝트가 아님!) 내의 package 폴더에 저장됩니다


7.png



그런데 이상한점이 있는데, 프로젝트 옵션 어디에도 저 Path에서 lib나 include 를 하고 있지 않습니다.
그럼 대체 어떻게 include 와 링크가 성공하는걸까요?

9.png


해답은 프로젝트파일에 있습니다.

ExtensionTargets 을 추가해서 빌드 targets 파일을 추가 해 주는거죠

10.png


그래서 프로젝트에 파일이 등록되어 있지 않아도 정상적으로 include 와 link 가 가능해 집니다.


PS. 다른 라이브러리는 몰라도 boost는 nuget 안쓰는게 좋을지도...

5G 가 프로젝트 생성될때마다 추가되면 (.....)


#본격_SSD_용량_줄어드는_파일.jpg

8.png


TAG •
?

Lyn
조회 수 3885 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

Devpia 에 질문 올라온김에 정리 해 두는데


크게 특별한 것이 아니라 ... 

http://www.jiniya.net/tt/788 여기 있는 내용 그대로다.
혹시 링크 깨졋으면 http://lunapiece.net/Article/27343 여길 봐라


하면안되는짓이 같은 이유는 InitInstance / ExitInstance  는 결국 DllMain 의 Reason 에 따라 분기하는 함수이기 때문


관련 자료는 아래 링크에서 찾을 수 있다 
https://msdn.microsoft.com/ko-kr/library/66f127e5.aspx


"MFC에서 제공하는 DllMain 함수는 DLL이 로드될 때 InitInstance를 호출하고, DLL이 언로드되기 전에 ExitInstance를 호출합니다"

TAG •
?

Lyn
조회 수 5541 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

업데이트 하다가 설정 꼬여서 오밤중에 쇼를 했구나 (...)


왜이리 웹서버 설정이 어려운거야...





근데 하고 나니 뭔가 좀 빨라진 느낌이 든...다?

?

Lyn
조회 수 2233 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

오오 멋지다...

안드로이드 허니콤 이후로는 블록킹 되는 네트워크 함수를 UI Thread에서 호출하면 android.os.NetworkOnMainThreadException 가 발생한다.

병신같은 코드를 양산하는 개발자들을 막기위해 플랫폼 차원에서 강제한것.



테스트 코드를 만들 때 조차 완전한 형태의 코드를 만들어야 해서 귀찮지만, 평균적인 App의 퀄리티를 올리기 위한 아주 좋은 선택이었다고 생각한다.
MS도 이런걸 해 줫으면 좋았을텐데.
TAG •
?

?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

여러가지 jar을 가져다 쓰다 보면 안에 있는 License 관련 파일이 겹쳐서 충돌 나는 경우가 있다.

이 경우 Gradle 스크립트의 android 섹션에 


packagingOptions {

        exclude 'META-INF/DEPENDENCIES.txt'

        exclude 'META-INF/LICENSE.txt'

        exclude 'META-INF/NOTICE.txt'

        exclude 'META-INF/NOTICE'

        exclude 'META-INF/LICENSE'

        exclude 'META-INF/DEPENDENCIES'

        exclude 'META-INF/notice.txt'

        exclude 'META-INF/license.txt'

        exclude 'META-INF/dependencies.txt'

        exclude 'META-INF/LGPL2.1'

    }


를 추가해서 패키지에서 빼 주면 해결이 가능하다

TAG •
?

Lyn
조회 수 4682 추천 수 0 댓글 0
Atachment
첨부 '3'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

상당히 많은 언어가 예외 처리기를 가지고 있는데, 각각의 언어별로 특성이 있습니다.
try - catch - finally 를 모두 가지고 있는 언어(C#, Java 등) 도 있고

try - except (C 계열의 try - catch 에 대응) 와 try - finally 를 가지고 있지만 try - except 뒤에 finally 가 붙을 수 없어서 아래와 같이 중첩을 해야 하는 Pascal 계열의 언어(주로 Delphi 겠지만..) 도 있습니다


try

  try 

    //do something

  except

    //do something

finally

  //do something 


네 그리고 대망의 C++은.. finally 그런거 없습니다 (...)
C++ 표준협회에서는 stack 에 생성된 객체의 소멸자를 이용하라고 하는데 다른 언어의 코드를 C++로 옮기다가 보면 해제할것 하나하나마다 객체 만들어 주기도 보통 일이 아닙니다. 하지만 의외로 타 언어의 샘플을 C++로 옮기는게 자주 발생 하는 일이기도 하지요.


그래서 전 람다를 이용한 꼼수를 이용해서 코드를 옮길때 자주 써먹고 있습니다.
바로 아래와 같은 객체를 사용 해서요


class Finalizer
{
public:
    Finalizer()
    {

    }
    Finalizer(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
    ~Finalizer()
    {
        if (fPtr != nullptr) fPtr();
    }
    void SetFunction(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
private:    
    std::function<void(void)> fPtr;
};


소멸자에서 function 을 호출해 주느 매우 단순한 구조입니다.
이걸 어떻게 쓰냐면 


void test1()
{
    char* arr = new char[100];
    Finalizer final([&]
    {
        delete[] arr;
        wcout << L"Test1 : Delete Arr" << endl;
    });

    //do Something
    wcout << L"Test1 Code End" << endl;
    
    return;
}


이렇게 씁니다.

저 Finalizer 의 생성자로 lambda 를 넘겨서 finally 블록으로 삼는거죠.
그럼 포커스를 잃는순간 호출 되면서 실행 되게 됩니다.

final1.png


그럼 exception 이 발생 했을때는 어떨까요?
간단하게 아래와 같은 코드를 생각해 볼 수 있습니다


void test2()
{
    try
    {
        char* arr = new char[100];
        Finalizer final([&]
        {
            delete[] arr;
            wcout << L"Test2 : Delete Arr" << endl;
        });
        //do Something
        wcout << L"Test2 : Code End" << endl;
        
        throw L"Exception";
        
        return;        
    }
    catch (...)
    {
        wcout << L"Test2 : Exception" << endl;
    }    
}


하지만 이 코드는 문제가 하나 있는데, 코드 흐름이 다르다는겁니다

final2.png


블록을 빠져나오는것이 catch 로 넘어가는것보다 우선이기 때문에 finally 로 사용하려 했던 코드가 예외처리 코드보다 먼저 실행되어 버립니다.

이걸 해결하는건, C++은 블럭을 자유롭게 구성할 수 있다는걸 이용해서.. 바깥에 블록을 하나 더 만들어서 해결합니다




void test3()
{
    {
        Finalizer final;
        try
        {
            char* arr = new char[100];
            final.SetFunction([&]
            {
                delete[] arr;
                wcout << L"Test3 : Delete Arr" << endl;
            });
            //do Something
            wcout << L"Test3 : Code End" << endl;

            throw L"Exception";

            return;
        }
        catch (...)
        {
            wcout << L"Test3 : Exception" << endl;
        }
    }
}


위 코드는 어차피 저 코드밖에 없기 때문에 추가적인 블록이 필요 없긴 하지만... 일반적으론 그런 코드는 많지 않겠지요


final3.png


실행결과는 다음과 같습니다.
finally 블록이 다른 언어에서의 코드와 다르게 맨 뒤가 아닌 중간에 와야 하는게 맘에 들진 않는데...
대신 다른 언어에서 try 블록 내부에 선언된 변수를 finally 에서 쓸 수 없어 변수만 위쪽으로 옮기거나 하는 단점이 사라져 좋아진 것도 있습니다.


뭐 어차피 급하게 쓸때 쓰는 "꼼수" 라서요


PS. 테스트는 메모리 해제 코드로 했는데..... 메모리는 그냥 unique_ptr 이나 shared_ptr 계열 쓰세요 (...)

PS2. 더 좋은 방법 있으시면 좀 알려주세요.


아래는 전체 테스트 코드입니다

#include <iostream>
#include <functional>

using namespace std;

class Finalizer
{
public:
    Finalizer()
    {

    }
    Finalizer(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
    ~Finalizer()
    {
        if (fPtr != nullptr) fPtr();
    }
    void SetFunction(std::function<void(void)> fPtr)
    {
        this->fPtr = fPtr;
    }
private:    
    std::function<void(void)> fPtr;
};


void test1()
{
    char* arr = new char[100];
    Finalizer final([&]
    {
        delete[] arr;
        wcout << L"Test1 : Delete Arr" << endl;
    });

    //do Something
    wcout << L"Test1 Code End" << endl;
    
    return;
}

void test2()
{
    try
    {
        char* arr = new char[100];
        Finalizer final([&]
        {
            delete[] arr;
            wcout << L"Test2 : Delete Arr" << endl;
        });
        //do Something
        wcout << L"Test2 : Code End" << endl;
        
        throw L"Exception";
        
        return;        
    }
    catch (...)
    {
        wcout << L"Test2 : Exception" << endl;
    }    
}

void test3()
{
    {
        Finalizer final;
        try
        {
            char* arr = new char[100];
            final.SetFunction([&]
            {
                delete[] arr;
                wcout << L"Test3 : Delete Arr" << endl;
            });
            //do Something
            wcout << L"Test3 : Code End" << endl;

            throw L"Exception";

            return;
        }
        catch (...)
        {
            wcout << L"Test3 : Exception" << endl;
        }
    }
}

void wmain()
{
    test1();
    wcout << endl;
    test2();
    wcout << endl;
    test3();
}
TAG •
?

Lyn
조회 수 3297 추천 수 0 댓글 0
Atachment
첨부 '4'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

네. 요즘 고해상도 디스플레이(맥북 프로 레티나 라거나, 4K 모니터 라거나, 아니면 Razer Blade나 Aorus X3 Plus 같은) 디바이스가 꽤 늘어 났습니다.

이런놈들 말이죠


dpi3.png


dpi4.png






하지만 윈도는 고해상도 지원 꽤 느린편이어서 Vista 부터 일단 지원은 햇지만 거의 쓰이지 않았고 본격적인 지원은 역시 8 부터라고 보이는데요. 뭐 사실 윈도 7이 나온 2009년보다도 한참 지난 2012년 맥북 프로 레티나 부터 PC/랩탑용 고해상도 디스플레이가 등장 했으니 그러려니 합니다.


어쨋든 중요한건 이제 저런 장비를 쓰는 사람들도 있고 하니 고 DPI 지원을 해야 한다는거겠지요.
그러려면 DPI 를 가져와야 하는데 그 방법중 하나인 Direct2D 를 이용한 방법을 간단히 정리 해 둡니다.


개발자 답게 코드부터 보자면 

#include <iostream>
#include <D2d1.h>

using namespace std;

#pragma comment(lib, "D2d1.lib")

void wmain()
{
    ID2D1Factory* pD2DFactory = nullptr;
    if (SUCCEEDED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory)))
    {
        float dpix, dpiy;
        pD2DFactory->ReloadSystemMetrics();
        pD2DFactory->GetDesktopDpi(&dpix, &dpiy);
        pD2DFactory->Release();

        wcout << L"X : " << dpix << endl << L"Y : " << dpiy << endl;
    }
    else
    {
        wcout << L"Direct 2D Create Error";
    }    
}

라는 대단히 심플 한 코드로 가져올 수 있습니다.

D2D 팩토리를 생성후 ReloadSystemMetrics 호출 후 GetDesktopDpi 를 통해서 가져오는 매우 심플한 방식인데, ReloadSystemMetrics  를 하지 않으면 팩토리 생성 후 변화된 Dpi 설정을 가져오지 못합니다(내부에서 캐시하는듯)


dpi1.png




위와 같은 실행 결과가 나옵니다. 윈도우의 기본 DPI(100%) 값은 96 으로서 이는 23인치 FullHD에 맞도록 세팅 된 값입니다(사실 "현재까지 쓰인 일반적인" 모니터의 크기와 해상도라면 대부분 매칭 됩니다. 17인치 1280*1024 도 96DPI 입니다)

그럼 125%로 바꿔서 한번 테스트 해 보겠습니다.

dpi2.png


 

네. 96 * 1.25 = 120 이니까 정확히 나오네요.

 

당연하겠지만 Direct2D 를 사용 한 방식이므로 Windows Vista Sp2 or Higher 를 요구합니다.

TAG •
?

Lyn
조회 수 52077 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

윈도우즈 정기 업데이트 날이죠 (...)


이번엔 꽤 중요한 보안 이슈(원격 실행 취약점)가 해결되었다고 하니 꼭 패치하세요


https://technet.microsoft.com/library/security/ms14-dec

?

Lyn
조회 수 12986 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

이게 정말 좋은 소식이지요 : )


http://www.visualstudio.com/en-us/products/visual-studio-community-vs


Pro급에 해당하는 에디션이며 사용 조건은 아래와 같습니다


Q: Who can use Visual Studio Community? 

A: Here’s how individual developers can use Visual Studio Community:

Any individual developer can use Visual Studio Community to create their own free or paid apps.

Here’s how Visual Studio Community can be used in organizations:

An unlimited number of users within an organization can use Visual Studio Community for the following scenarios: in a classroom learning environment, for academic research, or for contributing to open source projects.

For all other usage scenarios: In non-enterprise organizations, up to 5 users can use Visual Studio Community. In enterprise organizations (meaning those with >250 PCs or > $1MM in annual revenue), no use is permitted beyond the open source, academic research, and classroom learning environment scenarios described above.

?

Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 13 Next
/ 13