![]()
WPF does not provide any function to remove the icon of a window. But we can use Win32 API to remove the icon.
WPF Tutorial site provide IconHelper class to remove icon of a window. You can find the source code in link below
Prior to .NET Framework 4, we can’t make in-process shell extension using managed code because of the CLR limitation allowing only one .NET runtime per process.
Jesse Kaplan, one of the CLR programmer, explains…
Unfortunately unmanaged C++ is really the only way to go here.
Writing in-process \shell extensions in managed code is actually a very dangerous thing to do because it has the effect of injecting your managed code (and the .NET Framework) into every application on the machine that has a file open dialog.
The problems occur because only one version of the .NET Framework can be loaded in a process at any given time (other shared components such as java and msxml have the same property and thus the same restriction).
If you write your shell extension using the 2.0 .NET Framework and an application built with the 1.1 .NET Framework uses a file open dialog, your shell extension will fail because it can not run on an earlier version. Things can get even worse if your shell-extension manages to get loaded in a process before another applications managed code does: your extension may force an existing application onto a different runtime version than the one it was expecting and cause it to fail.
Because of these problems we strongly recomend against using any single-instance-per-process runtime or library (such as the .NET Framework, java, or msxml) in an in-process shell extension.
But in .NET Framework 4 has got the ability to have multiple runtimes with any other runtime, we can make a shell extensions using managed code.
All-In-One Windows Shell Code Samples
Because of this new feature, I can make a new plan of my Zemna Shell Extensions..
1. ImageMagick, ImageMagick-devel 설치
2. TrueType 폰트 설치
wget http://www.osresources.com/files/centos-windows-fonts/msfonts.tbz
mkdir/usr/share/fonts/default/TrueType
tar xvjpf msfonts.tbz -C /usr/share/fonts/default/TrueType/
3. rmagick 설치
이번에 Redmine을 구축하면서 나타난 에러 현상으로 고치는데 상당한 시간을 투자했다..
일단, 기본적인 설치과정은 아래의 문서를 따라하면 별다른 문제없이 진행이 가능하다.
모든 설치를 마치고나서, 웹 브라우저에서 화면을 띄우니 아래와 같은 에러 화면이 나타난다…
에러 메세지를 확인하기 위해 로그 파일을 열어보니 아파치 웹서버 로그에서 아래와 같은 에러메세지가 발생한 것을 확인하였다.
현재, 서버에 설치된 루비의 경로와 Passenger에서 사용하는 루비의 경로가 틀려서 나타난 현상이였다.
다른 좋은 방법이 분명히 있을 것으로 생각되나, 그냥 간단히 심볼릭 링크를 이용하여 /usr/bin/ruby 경로를 통해 Ruby를 실행하능하도록 하였다.
이렇게 하니 Redmine이 정상적으로 출력되는 것을 확인하였다.
이번에 워드프레스가 3.2.1 버전으로 업데이트 되면서 PHP 5.2.4 이상의 버전을 요구하게 되었다.
기본 패키지에는 PHP 5.1 버전이 들어 있으므로 PHP 5.3 으로 업그레이드를 위해서는 다음과 같은 과정을 거치면 된다.
1. Repository를 갱신한다.
| # wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-realease-5-4.noarch.rpm # wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm # rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm |
2. 이전 버전의 PHP를 제거한다
| # yum erase php php-pear php-mysql php-cli php-common |
3. 신규 버전의 PHP를 설치한다
| # yum –enablerepo=remi install php53 php-pear php53-mysql |
4. 아파치 서버를 재가동 한다
| # service httpd restart |
이렇게 하게되면 PHP 버전을 업데이트 할 수 있게 된다.
참고
이번에 안드로이드에 올린 어플 중에, 광고를 제거한 버전을 올려달라는 요청을 받게 되었다.
이렇게 무료/유료 버전의 앱을 개발하여 마켓에 올릴 경우에 어떻게 해야 코딩의 중복을 제거하고 효과적인 코딩이 가능한지 하는 부분에 대해 확실히 공부하며 정리하는 차원에서 글을 써보고자 한다.
무료/유료 버전의 앱을 동시에 개발하는데는 몇가지 방법이 있다고 한다.
가장 손쉽게 분리가 가능한 방법으로, 이클립스에서 별도로 2개의 프로젝트를 생성하여 따로 개발하는 방법이다. 이 방법은 가장 손쉬운 방법이기는 하나, 개발자의 입장에서 동일한 코드를 2개의 프로젝트에서 관리해야 하기 때문에 상당히 신경을 써야하는 부분이 존재하게 된다.
위에서 언급한 코드가 중복되는 문제를 해결하기 위해, 하나의 프로젝트에 모든 기능을 구현한다. 그리고 유료 버전으로 등록할 별도의 프로젝트를 생성한다. 유료 프로젝트는 별다른 기능을 구현할 필요는 없지만 빈 껍데기나 마찬가지 이므로 런처에서 보이지는 않도록 설정을 하고, 보안을 위해 앞에서 생성한 프로젝트와 동일한 키로 서명하여 마켓에 등록시키면 된다. 만일, 키부분에 대한 처리를 동일하게 가져가지 않는다면 나중에 유료 키 앱의 설치여부를 판단하는 과정이 까다로워진다.
앱의 전체적인 사용 형태는, 사용자는 최초에 무료버전의 앱을 다운로드 받아야 하고, 유료버전으로 사용하고 싶다면 마켓에서 유료인증 키 앱을 구매하고 설치하면, 무료버전이 유료버전으로 바뀌는 방식이다.
이와 같이 구현하게 되면, 기능이 구현된 프로젝트에서는 특정한 기능을 유료버전에서만 제공하거나 할 때, 유료인증 앱의 설치여부와 해당 앱의 시그너처가 동일한지를 판별하여 동일할 경우에만 기능을 제공하도록 프로그래밍하면 된다. 코딩에 대한 샘플을 여기를 클릭하여 확인하자.
이 방식의 문제점은 역시 사용자의 불편함이라고 볼 수 있다. 사용자가 유료 앱을 구매한 이후에도 마켓에서 설치를 하려면 무료/유료 버전을 전부 다운로드 해야 하기 때문이다.
현재 이클립스에서 앱을 개발할 때, 안드로이드 프로젝트를 라이브러리로 설정하여 다른 안드로이드 프로젝트에서 참조하는 방식을 사용할 수 있다. 이 라이브러리 참조를 이용하면 1.1에서 언급한 소스코드의 중복 문제를 해결하고, 1.2에서 언급한 불편함 문제도 어느정도 커버가 된다. 좀 더 상세히 알아보도록 하자.
일단, 기존에 개발하는 것처럼 한개의 안드로이드 프로젝트를 생성한다. 생성된 프로젝트에 어플의 기능을 개발한다. 개발이 완료되어서 유료와 무료버전으로 분리할 시점이 되었다면, 일단 생성한 프로젝트를 안드로이드 라이브러리 프로젝트로 변경한다.
[Figure 1. 안드로이드 라이브러리 프로젝트 설정]
이제는 실질적으로 마켓에 배포할 무료/유료버전의 안드로이드 프로젝트를 생성한다. 그리고 생성된 프로젝트에 이전에 생성한 라이브러리 프로젝트를 참조로 설정한다.
[Figure 2. 안드로이드 라이브러리 참조 설정]
여기까지 되었다면, 무료/유료 프로젝트에서는 라이브러리 프로젝트의 모든 소스를 사용할 수 있게 된다. 그리고 참고로 얘기하자면, 만일 동일 이름의 리소스가 라이브러리에도 존재하고 하위 프로젝트에도 존재한다면, 실제 런타임에서는 하위 프로젝트의 리소스가 사용된다. 즉, 각 버전별로 아이콘이나 리소스는 각 버전에 맞게 수정이 가능하다는 뜻이다.
라이브러리 프로젝트에는 앱의 모든 기능이 구현되어야 한다. 현재 설치된 어플이 유료인지 무료인지 판별하기 위해서는 위에서 언급한 리소르를 사용할 수 있다. 간단히 Boolean 형식의 리소스를 추가하고 해당 기능을 유료에서만 제공해 주고 싶으면 코드상에서 해당 리소스의 값을 체크하여 기능을 나타내거나 숨기거나 할 수가 있게 된다.
이상, 무료/유료 앱을 동시에 만드는 방법이 크게 3자리 정도 존재하는 것으로 보인다. 이 중에서, 각 앱의 버전별 개발 구성에 따라 차이는 존재하겠지만, 보통의 경우에는 마지막 경우인 라이브러리를 이용하는 방법이 제일 무난한 것으로 생각된다.
안드로이드 마켓에 마인드맵 앱중에 Thinking Space 라는 막강한 앱이 있다. 이 어플은 무료버전(광고삽입 및 기능제약)과 유료버전(Thinking Space Pro)이 존재한다. 예전에 이 앱이 위에서 언급한 3가지 방법 중에서 2번째 방법인 키 프로젝트를 생성하는 방법이였던 것으로 추측된다. 현재는 3번째 방법으로 변경된 것으로 추측된다. 결국, 이 앱을 만드는 사람들도 세번째 방법이 최선이다라고 생각하지 않았을까 하는게 내 생각이다. ^^;;
그렇다면 다음번에는 세번째 방식을 이용하여 개발할 경우에 대해 좀 더 세부적으로 파고 들어가 봐야 겠다.

리눅스에서 openssl 명령어를 이용하여 키를 생성하는 과정에서 아래와 같은 메시지가 출력되는 경우가 있다.
unable to write ‘random state’
위 에러 메시지에 대한 openssl.org 사이트의 설명은 아래와 같다.
2. Why do I get an “unable to write ‘random state’” error message?
Sometimes the openssl command line utility does not abort with a “PRNG not seeded” error message, but complains that it is “unable to write ‘random state’”. This message refers to the default seeding file (.rnd). A possible reason is that no default filename is known because neither RANDFILE nor HOME is set. (Versions up to 0.9.6 used file “.rnd” in the current directory in this case, but this has changed with 0.9.6a.)
즉, 시딩 파일(.rnd) 이라는게 사용자의 홈계정에 존재하는데, 이 파일의 소유주가 루트나 기타 다른 계정일 경우에 발생할 여지가 있다고 한다. 아래의 명령어를 통해 소유를 변경하고 다시 시도하면 된다.
sudo chown user:user ~/.rnd

2008년 부터 시작된 구글의 개발자 컨퍼런스인 ‘Google I/O 2011′ 의 막이 올랐다.
먼저, 키노트를 통해서 안드로이드의 현황과 나아갈 방향에 대해 알아보자.
현재 안드로이드는 다양한 휴대폰 제조업체, 통신사, 개발자의 지원으로 2011년 1억개 개통을 돌파 했으며, 하루 40만대 이상의 새로운 기기가 활성화 되고 있는 상황이다.
또한, 안드로이드 마켓에는 현재 20만개 이상의 안드로이드 어플리케이션이 등록되어 있으며, 누적 다운로드 횟수는 45억 이상이라고 한다.
Google에서 새로 발표한 Honeycomb 버전의 후속작인 Ice Cream Sandwith OS가 소개되었다. 기존에 Honeycomb 3.0 버전이 테블릿용으로 출시되면서 많은 사람들이 스마트폰과 테블릿의 OS가 앞으로 구분되어 가는건지 궁금해 있는데, 통합된 OS가 소개되면서 궁금증이 해소된듯 하다.
Ice Cream Sandwich의 새로운 기능은 대충 아래와 같다.
- 멀티태스킹 기술 확장
- 위젯의 사이즈가 변경가능하도록 됨
- Xbox 360 컨트롤러 같은 USB 장치가 지원됨
- 카메라 안면 추적 기능 제공
- 카메라 목소리 추적 기능 제공
영화 대여 서비스는 안드로이드 마켓, 테블릿, 안드로이드폰 등의 안드로이드 계열 시스템에서 $1.99 ~ $3.99 사이의 가격으로 영화를 대여하여 볼 수 있는 서비스이다.
한번 빌린 영화는 30일 동안 대여되며, 대여 기간동안 감상하는데 총 24시간이 주어지는 방식으로 서비스 되는것 같다.
영화 자체는 구글의 클라우드를 이용하여 서비스 되기 때문에 연계된 모든 안드로이드 장비에서 감상이 가능한 것이 특징이다. 또한, 실시간 스트리밍이 불가능한 경우를 위해 ‘Pin’ 이라고 하여 영화를 로컬에 저장하여 보는 기능도 지원한다고 한다.
현재, 국내에서는 이용이 불가능 하며 언제쯤 이용이 가능할지 궁금하다.
구글에서 새롭게 선보인 클라우드를 이용한 음악 스트리밍 서비스이다.
데스크탑 프로그램을 통해 구글의 서버로 음악을 전송해 놓으면, 보유하고 있는 모든 안드로이드계열 장치에서 실시간 스트리밍으로 재생이 가능하게 된다. 음악을 듣기위해 구지 USB 케이블을 연결할 필요가 없게 되는 것이다.
현재는 미국에서만 서비스 이용이 가능하다. 국내에도 잘 상륙하기를 바란다.
구글 안드로이드는 최초 설계부터 모바일에 국한되지 않도록 설계되었다. 이를 위해 구글에서는 모든 종류의 안드로이드 기기에 사용이 가능한 하드웨어 악세서리를 만들 수 있도록 안드로이드 오픈 악세서리(Android Open Accessory)를 개발 했다고 한다.
이제 구글이 점점 안드로이드의 범위를 무한대로 확장해 가는 듯한 느낌이다. ‘Android @ Home’ 은 집 내부의 모든 장치(전등, 세탁기, 시계, 스피커, 온도계, 등등…)들을 안드로이드를 이용하여 통합 및 제어하기 위한 프레임워크(Framework)라고 보면 될듯 하다.
이제 테블릿이나 스마트폰 하나만 들고 다니면, 집안의 모든 기기들을 제어할 수 있는 때가 올지도 모르겠다… ㅋㅋ

최근에 책을 보다가 엘리베이터 피치(Elevator pitch)라는 단어를 발견하게 되었다. 경영학에서 나온 용어라는데, 잘 이해해두면 좋을 것 같아 한번 정리하고자 한다.
단어 자체의 뜻을 보면, 엘리베이터에서 (말을) 던지는 것이라고 해석할 수 있을듯 하다. 즉, 건물의 엘리베이터 속에서 만난 고객에게 원하는 층에 도달하기 전까지의 30초에서 2분가량의 짧은 시간동안 자신의 제품이나 제안의 핵심을 전달하는 것이라고 정의 할 수 있다.

위키피디아의 정의는 아래와 같다.
A variety of people, including project managers, salespeople, evangelists, and policy-makers commonly use elevator pitches to get their point across quickly. An elevator pitch may be presented in oral, written, and video formats.
An elevator pitch is often used by an entrepreneur pitching an idea to a venture capitalist or angel investor to receive funding. Venture capitalists often judge the quality of an idea by the quality of its elevator pitch and will ask entrepreneurs for their elevator pitches in order to quickly weed out bad ideas and weak teams. Elevator pitches are also used in many other situations. Personal uses include job interviewing, dating, and summarizing professional services.
엘리베이터 피치를 위해서는 핵심적인 내용을 가지는 짧은 문장을 정의해야 한다. 짧지만 모든 내용을 함축적으로 담고 있는 문장이라고 할 수 있다. 내 생각에는, 이런 문장을 완성해 내는 것이야 말로 실력인것 같다…
엘리베이터 피치를 소프트웨어 개발적인 측면에서 생각해 보도록 하자.
나도 그동안 많이 느낀거지만, 소프트웨어 개발전에 가장 필요한 점이 내가 만들려고 하는게 무엇이고, 어떤 기능이 필요한지에 대한 정의 인것 같다. 머리속에 추상적인 그림만 그려놓고 진행하던 프로그램중에 제대로 진행이 된건 아무것도 없었다.. ㅠ_ㅠ
이때, 개발하려고 하는 소프트웨어에 대한 핵심적인 정의를 미리 해놓게 된다면 프로젝트의 진행에 많은 도움이 될 것이다.
내가 개발한 ‘Zemna AppList Backup’ 어플의 엘리베이터 피치는 어떻게 될까?
이 정도가 되지 않을까 싶다… ^^;