1. 효과적인 Backend System 구현 
  - IE + ActiveX 환경에서의 진화 

2. Prototype.js vs jQuery
  - Prototype.js를 쓰고 있는데 도통 jQuery 인기다. 
  - Prototype.js을 열심히 쓸것이냐? 아니면 jQuery 로의 전환을 시도 할것인가 
  - 팔랑팔랑 ㅎㅎ

3. 모바일 서비스 
  - 예약/예매 시스템의 모바일 서비스 최적화 

4. UX (User eXperience)
  - 기술집약 혹은 복잡한 서비스들의 UX 개선 방향 
  - 기획 단계에서의 UX 적용 방법 

5. designed, specified, implemented, tested, documented and shipped

6. 업무프로세스 + 개발프로세스를 쉽게 작성, 표현 할 수 있는 툴, 방법 찾기 

7. Visual Studio 2005 에서 2008 버전으로 넘어갈 시기

8. 아이폰

9. 트위터에서의 예약/예매 서비스




계속 생각만하고 있음.........


'일상' 카테고리의 다른 글

twitter 잡담  (0) 2009.08.15
근황, 단상 - 2009.08.08  (0) 2009.08.08
생각의 정리..  (0) 2008.12.17
회의를 좋아하는 매니저의 특징  (0) 2008.09.17
팀장 딜레마..  (0) 2007.07.02
1.
티맥스 OS 사태(?)를 계기로 트위터를 시작했다.
여기저기 돌아 댕기면서 부담없이 Follow를 하고 의견, 정보를 공유하는 것이 왠지 메신저의 내용을 rss 구독 하는 느낌이 든다
비슷한 서비스인 미투데이 경우는 몇번이고 시도 해봤지만 어디서 부터 시작해야 될지 모른다는 느낌에 손이 가질 않는다.


2.
좀 더 편하게 사용할 요량으로 클라이언트를 몇개 사용해 봤는데, 왠지 딱 이거다 하는 툴은 없어보인다.
대부분은 Adobe AIR 플랫폼을 개발이 되어 있고 몇몇은 .NET 환경도 있는듯 하다.

Adobe AIR의 경우 트위터 어플을 통해서 사람들한테 가장 많이 사용되어 지지 않았나 생각이 든다.


지금까지 사용해본 몇개의 어플의 개인적인 불편한 점은..

TweetDeck 은 가장 많이 사용하는 어플이긴한데, 화면의 크기 조정이 안된고 글이 약간 긴 경우 마우스를 긁어서 내려 봐야하는 수고스러움이 있다.

Twhirl 는 그나마 맘에 든 어플이지만, 한글입력시에 백스페이스 키로 지우다 보면 초성이 잘려서 커서 뒤로 가는 경우가 생긴다.
한글 입력의 경우는 Twhirl 뿐만 아니라 AIR 플랫폼으로 개발된 어플들은 대부분 그러한듯 하다.

Seesmic 이나 DestroyTwitter 기능상 불편한 부분이 있어서 설치하고 얼마 못가 지워 버렸다.

Firefox 의 부가기능인 TwiterFox의 경우 간단하게 보기엔 깔끔한 인터페이스지만,
역시 Follow 수가 많아 지고 글이 넘치기 시작하면 관리가 불가능 해진다.

그리고 그리즈몽키로 스크립트를 이용해서 사이트를 보기 편하게 만드는 pbtweet 이란것도 있다


3.
클라이언트를 한번 만들어 볼까 생각을 해봤는데 역시 어플의 경우는 UI 의 표현 부분 때문에 많은 시간이 들어 갈것 같다.
AIR 나 WFP 같은 플랫폼을 만드는 이유도 그 이유 때문 일것이고..

그래서 pbtweet 과 같이 html + javascript 로 개발하는것이 좋을것 같고, 추가적으로 읽음 표시, 마지막 읽은 시간 관리 등이 추가 되면 좋지 않을까 생각한다..


언제 시간이 되면 한번 해봐야지.. 라고 생각하지만 그때쯤 되면 더 좋은 어플이 나오지 않을까?? 흐흐..

'일상' 카테고리의 다른 글

요즘 IT 관심사 - 2009.09.02  (0) 2009.09.02
근황, 단상 - 2009.08.08  (0) 2009.08.08
생각의 정리..  (0) 2008.12.17
회의를 좋아하는 매니저의 특징  (0) 2008.09.17
팀장 딜레마..  (0) 2007.07.02

- 기존에 TextWriter 객체에 Serialize 하니 XML Declaration 부분에 UTF-16으로 고정 되어서 MemoryStream 로 교체
- MemoryStream는 XML Declaration 부분을 표시 하지 않음


using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

// 구현
protected string SerializeToXML<T>(T t)
{
    string strXml = "";
    XmlSerializer xs = new XmlSerializer(typeof(T));

    try
    {
        using (MemoryStream ms = new MemoryStream())
        {
            xs.Serialize(ms, t);
            strXml = Encoding.UTF8.GetString(ms.ToArray());
        }

    }
    catch (Exception) { }

    return strXml;
}

'Dev > .NET' 카테고리의 다른 글

LUCENE.NET 검색엔진  (0) 2013.01.02
C# Web Service -> REST  (0) 2009.08.09
Integrating WCF Services with COM+  (0) 2008.09.03
Interop 응용 프로그램 배포  (0) 2007.10.05
RCW, CCW  (0) 2007.10.04
Web Service(WSDL), REST 어떤 방식으로 서비스를 만들면 좋을것인가 고민을 한적이있다.

그런데 왜 난 꼭 REST 방식을 웹페이지로 따로 만들어야 된다고 생각을 했을까?
그냥 아래와 같이 Web Service에 대해서 GET, POST 방식을 같이 노출하면 같이 사용할 수 있는데..


Web Service 의 인터페이스 메쏘드의 Input 파라미터에 대해서 Complex Type을 쓰지 않고 기본 타입을 쓰고,
web.config 에 아래와 같이 GET, POST 방식을 노출 해주면 끝.
<configuration>
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
</configuration>
하지만 Basic Type 을 쓰면 Strong한 타입 체킹을 할 수 없다는 단점이 있긴하다..

'Dev > .NET' 카테고리의 다른 글

LUCENE.NET 검색엔진  (0) 2013.01.02
SerializeToXML - C#  (0) 2009.08.10
Integrating WCF Services with COM+  (0) 2008.09.03
Interop 응용 프로그램 배포  (0) 2007.10.05
RCW, CCW  (0) 2007.10.04

1. 서버의 "예약된 작업" 을 웹으로 모니터링 하기 위한  페이지를 만들기

우선 관련 API 를 조사하던 도중 아래의 것이 나왔다.

http://msdn.microsoft.com/en-us/library/aa383614%28VS.85%29.aspx

Developer Audience

The Task Scheduler provides APIs for the following developers:

  • Task Scheduler 1.0: Interfaces are provided for C++ development.
  • Task Scheduler 2.0: Interfaces and objects are provided for C++ and scripting development respectively.

Run-Time Requirements

The Task Scheduler requires the following operating systems.

  • Task Scheduler 1.0: Client requires Windows Vista, Windows XP, Windows 2000 Professional, Windows Me, or Windows 98. Server requires Windows Server 2008, Windows Server 2003 or Windows 2000 Server.
  • Task Scheduler 2.0: Client requires Windows Vista. Server requires Windows Server 2008.

그런데 웹페이지에서 사용할 것이라 컴포넌트 형태의 API가 필요 했는데 위에 나와있듯이,
Task Scheduler 2.0 인터페이스 에서만 "scripting development" 환경이 제공되는데 OS 지원이 Vista, Windows Server 2008 이다.

2003 서버에 적용할 것이라 이것은 사용못할 것이고..

그렇다고 C++ 인터페이스로 제공된것을 다시 COM으로 만들어서 등록하고 사용하자니 여간 귀찮은게 아니다.
그런던중 .NET 의 라이브러리 형태로 Task Scheduler 를 래핑한 모듈을 발견 !!

http://www.codeproject.com/KB/cs/tsnewlib.aspx?fid=4062&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=226&select=1917304

멋지다.. ^^b

콘솔 어플리케이션으로 테스트 해보니 잘 되어 웹어플리케이션으로 실행하니 권한에러 발생..
어짜피 관리용이니 관리자용 계정으로 IIS App Pool 을 만들어 세팅하고 실행하니 잘된다.

데이터를 List<> 에 넣고 XML Serialize 해서 클라이언트에서 AJAX 로 호출해서 화면 완성



2. C++0x 의 기능들을 이것저것 테스트 해보는데, 아직까지 어느정도 구현되어 있는 컴파일러는 없는듯..
g++은 Lambda expressions and closures 가 안되고 vc++ 2010은 Initializer Lists 안되고..

그나저다 C++에 Lambda가 추가가 됬으니 boost::Lambda 는 이제 계륵이 되는것인가??



3. twitter 시작.. 언제까지 할지는 모르겠지만.. ;;
 
http://twitter.com/cdecl
http://twitterfox.net/


'일상' 카테고리의 다른 글

요즘 IT 관심사 - 2009.09.02  (0) 2009.09.02
twitter 잡담  (0) 2009.08.15
생각의 정리..  (0) 2008.12.17
회의를 좋아하는 매니저의 특징  (0) 2008.09.17
팀장 딜레마..  (0) 2007.07.02
C++0x RValue Reference 라는것이 추가 되었다.


RValue Reference는  Move semantics와 Perfect forwarding 이라는 두가지 기능을 가진다.


1. Move semantics

기존 부터 있던 Reference는 LValue Reference 라고 불린다.

int n = 10;
int &r = n;  // LValue Reference
int *p = &n;  // 포인터 참조 방식
cout << r << " " << *p << endl;

C++의 참조는 내부적으로 포인터를 사용하여 참조를 하게 되지만 사용함에 있어 보다 우아하게(?) 사용을 할 수 있다는 장점이 있다.


반면 RValue Reference는 아래와 같이 사용한다.

int n = 10;
int &&r =n; // 그런데 기존 참조랑 머가 틀리냐??

int, long 등의 기본 타입과 기존 클래스의 복사생성자, 대입연산자에 대해서는 RValue Reference 참조는 기존 Value Reference와 똑같이 동작을 한다.

하지만 RValue Reference는 객체(변수)의 주소를 참조하는 기존의 LValue Reference와 틀리게,
RValue Reference 로 겹지정한 복사생성자 및 대입연산자를 따로 구현, 그리고 그것을 의도적으로 호출하게 할 수 있다.

그리고 그 RValue Reference 로 겹지정한 복사생성자 및 대입연산자에는,
임시객체애 대해서 복사가 아닌  메모리를 이동 (Move) 하는 방법으로 임시 객체의 생성및 소멸에 대한 비용을 줄이는 구현이가능해 진것이다.

소유권 이전 기법을 사용하는 auto_ptr 처럼..



class Item
{
  public:
    Item() : p(new char[100]) {}
    Item(const Item &t) : p(new char[100]) {  memcpy(p, t.p);  } // 복사생성자
    Item(Item &&t) : p(t.p) { t.p = NULL;  } // Move 생성자

    // Item& operator=(const Item &t) { return *this; } // 대입연산자
    // Item& operator=(Item &&t) { return *this; } // Move 대입 연산자
    // ...
   ~Item() { if (p) delete p; }
  
  private:
    char *p;
};

Item&& foo()
{
  Item item;
  // ...
  return item;
}

int main()
{
  Item item;
  Item t = item; // 복사생성자 호출
  Item &r = item; // 참조

  Item &&rr = Item; // 참조
  Item &&mv = std::move(item);  // Move 생성자
  Item &&mvt = foo(); // // Move 생성자
}

위의 코드와 같이 foo() 함수에서 RValue Reference로 리턴을 하게 되면,
Item 객체의 RValue Reference 버전의 Move 생성자가 호출되고
Move 생성자에서 내부 멤버인 포인터의 소유권을 이전하여 임시객체에 대해서 필요 없는 생성-소멸의 과정을 거치지 않게끔 할 수 있는것이다.

그리고 강제로 Move 생성자, Move 대입 연산자를 호출 하기 위해서 std::move() 함수를  이용 할 수도 있다.


C++0x 의 STL에는 RValue Reference 의 코드가 적용 되어 있어 사용하는 것 만으로도 성능 효과를 볼 수가 있다고 한다.
대략 다음과 같은 코드..

std::string s = "s";
std::string str;
str = s + "t" + "r" + "i" + "g";  // 임시객체 (RValue Reference) 사용



2. Perfect forwarding

template 의 내부 함수가 참조 및 상수의 값을 파라미터로 받을 경우 관련되서 여러 개의 버전 구현을 해야하는 문제를,
RValue Reference의 문법으로 하나로 처리 하는 내용.
(자세한 내용은 아래링크 -_-; )



참고 : http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx


'Dev > C++' 카테고리의 다른 글

boost::asio 클라이언트 소켓 (timeout 기능)  (0) 2010.10.14
이미지 변환 모듈 (모바일용, GDI+)  (0) 2010.06.22
C++0x Lambda  (0) 2009.05.20
C++0x 지원 컴파일러 목록  (0) 2009.05.20
C++ Refactoring  (0) 2009.04.14
아래 링크의 글 중 Herb Sutter 의 Lambda 예제 및 설명에 관한 리플..
http://herbsutter.wordpress.com/2008/03/29/trip-report-februarymarch-2008-iso-c-standards-meeting/

[]와 []안에 들어가는 내용에 대해서 명쾌하게 설명을..




Herb Sutter

Re binders: Okay, I give! I’ll use a better example next time.

(no name) asked: "How are local variables captured?" You have to specify whether it’s by copy or by reference. So this example is illegal because it tries to use a local variable:

    int numWidgets = 0;
    for_each( v.begin(), v.end(), []( Widget& w )
    {
        ++numWidgets;  // error, numWidgets is not in scope
    } );

If you want to update numWidgets directly, capture it by reference:

    for_each( v.begin(), v.end(), [&numWidgets]( Widget& w )
    {
        ++numWidgets;  // increments original numWidgets
    } );
    // numWidgets == v.size() here

Or use the shorthand [&] to take all captured variables implicitly by reference:

    for_each( v.begin(), v.end(), [&]( Widget& w )
    {
        ++numWidgets;  // increments original numWidgets
    } );
    // numWidgets == v.size() here

What if you want a local copy? You say to pass it by value, but for safety reasons the current proposal says you get a read-only copy that you can’t modify:

    for_each( v.begin(), v.end(), [numWidgets]( Widget& w )
    {
        int i = numWidgets; // ok
        ++i;
        // "++numWidgets;" would be an error
    } );
    // numWidgets == 0 here

Or use the shorthand [=] to take all captured variables implicitly by copy:

    for_each( v.begin(), v.end(), [=]( Widget& w )
    {
        int i = numWidgets; // ok
        ++i;
        // "++numWidgets;" would be an error
    } );
    // numWidgets == 0 here

Similarly, for the question: "What will happen in the following case:"

    int flag = 0;
    mypool.run( [] { flag = 1; } );
    cout << flag << endl;

The answer is that the code is illegal, you have to say whether you capture flag by value or by reference, which can be as simple as replacing [] with [=] or [&]. And if you capture by value, you get a read-only copy so you couldn’t assign to it.


'Dev > C++' 카테고리의 다른 글

이미지 변환 모듈 (모바일용, GDI+)  (0) 2010.06.22
C++0x, RValue Reference  (0) 2009.05.27
C++0x 지원 컴파일러 목록  (0) 2009.05.20
C++ Refactoring  (0) 2009.04.14
An Overview of the Coming C++ (C++0x) Standard  (0) 2008.12.29

'Dev > C++' 카테고리의 다른 글

C++0x, RValue Reference  (0) 2009.05.27
C++0x Lambda  (0) 2009.05.20
C++ Refactoring  (0) 2009.04.14
An Overview of the Coming C++ (C++0x) Standard  (0) 2008.12.29
asio C++ library  (0) 2008.08.22
기 작성되어 있던 C++ 컴포넌트에서 한개의 함수에 너무 많은 코드로 인해,
컴파일러 내부 오류를 경험하고 해당 코드에 대해서 리팩토링을 결심!!

관련된 작업은 Extract Method 이며 자동으로 해당 부분을 추출하여 Method를 만들어 주는 툴을 중심으로 알아 보았다.

이것 저것 알아보던 중 2개의 후보가 눈에 띠었다.
대상은 "Refactor! For Visual C++ 2005"와 "Visual Assist X" 에서 지원하는 Refactoring 에 관련된 기능이다.

결론부터 얘기하면 "Refactor! For Visual C++ 2005"의 기능이 쓸만 하였고 Visual Assist X 의 리팩토링 기능은 간단한 기능을 제외하고는 그다지 유용하지 못하였다.


Visual Assist X
Visual Assist X 는 Visual Studio 에서 코딩에 도움을 주는 유용한 기능이 있는 Add-in 툴로서 최신 버전에는 리팩토링 기능까지 추가가 되었다.

예상했던 대로 속도는 무난히 빨랐으며 간단한 목적으로 사용하기에는 문제가 없으나 몇가지 사항에 대해서는 조심히 사용 해야 될듯하다.

1. Extract Method 의 경우 10개 까지의 파라미터 까지 밖에 지원 하지 않는다.
  - Extract Method의 대상 코드의 파라미터의 지원이 10개까지 밖에 지원하지 않는다
  - 나머지에 대해서는 수작업 신공..

2. Extract Method 의 구문 중 return 이 포함되어 있는 구문에 대해서 별 다른 코드를 넣어주지 않는다.
  - 이것도 나머지는 수작업 신공 -_-;

// 원본코드
bool Run()
{
    int a = 0;
    if (a == -1) {
        return false;
    }

    cout << "next process " << endl;

    a = 10;
    return true;
}

// Extrace Method 후의 코드
bool MyMethod( int a )
{
    if (a == -1) {
        return false;
    }

    cout << "next process " << endl;
}



bool Run()
{
    int a = 0;
    return MyMethod(a);

    a = 10;
    return true;
}


3. Rename 의 경우 바꾸지 못하는 경우 발생
  - 특수한 경우에 구문 분석으로 발견하지 못하여 변경을 못해주는 경우 발생

4. VC++6, VC++2005 버전등 여러 버전 사용 가능
  - 단 VC++6 의 경우 코드 "실행 취소"로 되 돌릴 경우 리팩토링 액션 단위가 아닌 한줄 한줄의 단위로 되 돌리기가 된다.
  - 머 이것도 VC++6 을 안쓰면 되지 머..




Refactor! For Visual C++ 2005

1. 모든 기능적인 부분에서 합격점이지만 속도가 많이 느린 경우 발생
  - 특히 많은 코드에 대해서 리팩토링의 경우 IDE가 뻣었나! 라는 생각이 들 정도로 행이 걸려 있는 상태가 지속
  - 아마도 아래와 같은 UI 부분의 지원 때문에 느리지 않나 생각이 들며 IDE를 처음 로딩할때도 DxCore 라는 모듈을 로딩할때 시간이 좀 걸린다.

refactor1.jpg



2. Visual Assist X 에서 문제였던 코드 중간의 return 부분을 별도의 return 여부를 판단하는 파라미터를 이용하여 처리 해주고 있다.

// 원본코드
bool Run()
{
    int a = 0;
    if (a == -1) {
        return false;
    }

    cout << "next process " << endl;

    a = 10;
    return true;
}


bool RunExtracted(int a, bool &pShouldReturn)
{
    pShouldReturn = false;
    if (a == -1) {
        pShouldReturn = true;
        return false;
    }

    cout << "next process " << endl;
    return false;
}

bool Run()
{
    int a = 0;
    bool lShouldReturn;
    bool lResult = RunExtracted(a, lShouldReturn);
    if (lShouldReturn)
        return lResult;

    a = 10;
    return true;
}


3. Rename 등의 작업을 할때 링크 라는 개념의 함수의 정의, 구현, 호출 부분을 연결된 데이터를 관리하며 UI도 비슷하게 동작을 하는것 같다
  - 허나 UI때문인지 속도 부분에서도 약간 더딘 면이 없지 않아 있다.


4. 무엇보다도 장점인 무료.. 허나 현재는 VC++ 2005만 무난히 적용 되는 것으로 보이며, 
추후에는 더 발전 되어있는 모습으로 더욱 쓸만한 툴이 되지 않을까 생각한다.



결론.

위의 두개의 툴은 그 외에도 많은 리팩토링 기법의 도구를 제공을 하며,
C++의 문법 복잡성에 의해 다른 언어에 비해서 많이 더뎠던 리팩토링 자동화 부분에서 어느정도 해소가 되지 않았나 생각이 든다.

아  이제 C++에서도 리팩토링을 툴로 제공을 하는구나... 흐흐..

앞으로 좀 더 발전을 하면 VC++ 에서도 C#처럼 내장 IDE에서 리팩토링을 제공을 하는 날이 있지 않을까 생각을 한다.



이상 허접한 리팩토링 툴 비교기..

'Dev > C++' 카테고리의 다른 글

C++0x Lambda  (0) 2009.05.20
C++0x 지원 컴파일러 목록  (0) 2009.05.20
An Overview of the Coming C++ (C++0x) Standard  (0) 2008.12.29
asio C++ library  (0) 2008.08.22
C++ 0x - Herb Sutter의 블로그 글  (0) 2008.07.29
VC++ 6 에서 ATL Com Project 만들어진 프로젝트를 VC++ 8 로 업그레이드를 할 경우 몇가지의 문제가 발견 되었다.


1. LINK : fatal error LNK1104: 'mtxguid.lib' 파일을 열 수 없습니다.

확인 해보니 더 이상 VC++ 8 버전에서는 'mtxguid.lib'가 존재 하지 않는다.
다른 lib 로 바이너리들이 통합 된것으로 보이며 링커 옵션에 추가 되어 있는 'mtxguid.lib' 를 지우면 된다.

추가적으로 main을 못찾는다는 링크 에러가 발생하면 "ATL에서 CRT 사용 최소화" 옵션을 사용 하지 않는다.


2. GetObjectContext 링크 에러

링크 옵션에 "comsvcs.lib" 를 추가 하면 된다.



3. def 파일의 심볼에 서수 지정 경고

아래와 같이 def 파일의 함수 이름에 서수가 지정 되어 있으면 아래와 같이 경고가 표시 된다
warning LNK4222: 내보낸 'DllCanUnloadNow' 기호를 서수로 지정하면 안 됩니다.
warning LNK4222: 내보낸 'DllGetClassObject' 기호를 서수로 지정하면 안 됩니다.
warning LNK4222: 내보낸 'DllRegisterServer' 기호를 서수로 지정하면 안 됩니다.
warning LNK4222: 내보낸 'DllUnregisterServer' 기호를 서수로 지정하면 안 됩니다


그런 경우 def 파일을 열어서 아래와 같이 서수에 해당하는 부분을 지워 준다.
EXPORTS
    DllCanUnloadNow     PRIVATE
    DllGetClassObject   PRIVATE
    DllRegisterServer   PRIVATE
    DllUnregisterServer    PRIVATE


그 외에 deprecation 되어 있는 CRT 함수들의 경고들은 무시해 주거나 새로운 버전의 CRT 함수를 사용 하면 된다.

ex) sprintf -> sprintf_s



참고 : http://social.microsoft.com/Forums/en-US/vcgeneral/thread/1b44c27b-db1c-4879-9eb9-4bf2a128b88f

'Dev > Windows' 카테고리의 다른 글

COM+ 패키지 활성화별 세션 상태 정리  (0) 2009.09.22
Redmine 세팅  (0) 2009.09.12
유니코드(UNICODE), C++  (0) 2008.10.16
VARIANT 에서 객체 추출하기  (0) 2008.09.09
ffmpeg  (0) 2008.04.09

+ Recent posts