레이블이 Tech인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Tech인 게시물을 표시합니다. 모든 게시물 표시

2011년 1월 5일 수요일

[WEB] WEB 서비스 3분짜리 개념잡기 - Applet, Servlet, JSP

 

WEB 서비스 3분짜리 개념잡기

 

JAVA 웹 어플리케이션엔 3 종류가 있다.

Applet: 위젯같이 독립적으로 Client에서 실행되는 자바 어플리케이션, Applet은 보통 웹페이지에 껴서 넣거나 실행파일처럼 따로 돌릴수도 있다. 보통 그래픽, GUI등을 요구하는 앱에 사용된다.

Servlet: Applet이 클라이언트에서 수행되는 자바 앱이면 서블릿은 서버에서 실행되는 앱이다. 보통 서버에서 요구하는 기능 = DB 관련 작업, 기타 작업 등을 수행한다. 

JSP: Java로 구성된 웹 페이지로서 서버에서 수행되고 그 결과는 HTML로 클라이언트에 다운되어 보이게 된다. 보통 MVC 모델의 View 등으로 사용되며, 서블릿과 HTTP로 통신한다.

 

PHP는 보통 JSP와 비교되는데 JSP는 HOTSPOT기술등으로 네이티브로 컴파일되어 수행되므로 PHP보다 빠르지만 PHP는 스크립트이기 때문에 컴파일이 필요하지 않는 편의성이 있다. 

 

화면에 뭘 보여주는 일을 하는 View에 해당하는 JSP, 중간에서 로직을 처리하는 Controller에 해당하는 Servlet 그리고 데이터를 공급하는 Model인 DB 로 보통의 WEB 서비스는 구성된다. 이를 Model2 라고 부르기도 하고 MVC 패턴 방식이라고도 부르기도 하고 3-Tier라고 부르기도 한다.... JSP와 Servlet은 일반적으로 HTTP Request 를 통하여 통신을 수행한다. 통신하는 프로토콜은 여러가지를 사용할수 있는데 보통 XML 로 보내고 JSON등으로 받거나 JSON으로 모두 처리한다. JSON은 객체를 스트링 스트림으로 보내기 위한 전송 규약인데 매우 쉽고 간편하고 XML을 사용하는 SOAP등에 비해 가벼워서 종종 사용된다. (구글 맵, 페이스북 등등의 서비스가 JSON을 지원한다.)

 

Servlet은 JSP에서 들어온 요청을 적절히 서버에서 처리하여 결과를 반환하는데 이 과정은 성능을 위해 모두 멀티쓰레드로 병렬적으로 이루어진다. 따라서 서버로 요청이 들어오면 쓰레드가 만들어져 이 안에서 서블릿이 초기화 되고 실행된다. 서블릿 객체는 소스가 재 컴파일 되지 않는한 성능을 위해서 서버에 캐싱되어 있다. 따라서블릿을 한번 실행해두면 초기화를 다시 하지 않아도 된다. 하지만 서버가 꺼지거나 소스가 바뀌면 파괴되었다가 처음부터 다시 수행된다. http://blog.naver.com/dhc9902?Redirect=Log&logNo=40118027312

 

서블릿의 실제 코드와 생명주기에 대한 이해는 아래 글을 참고한다. http://yellowvirus.tistory.com/53

 

Servlet과 DB의 통신은 일반 SQL을 사용하는데 어느 DB를 사용하느냐에 따라 성능이나 다른 목적을 위해 그 DB를 위한 전용 SQL문을 사용할수도 있다. 이러한 이유로 ORACLE등의 엔터프라이즈 DBMS는 SQL표준과 다른 전용 명령어 셋이 있다. 

 

서블릿은 서버 내에 컴파일된 자바 파일로 여러개 존재한다. (이들을 보관하는 Container 엔진을 Catalina 라고 부른다.) 서블릿의 호출은 POST/GET 요청시 들어가는 URL의 패턴에 따라 호출되는데 이의 지정은 서블릿과 같이 있는 web.xml 파일에 정의할수 있다. 이 설정파일의 내용에 따라 서블릿을 실행하는 웹서버인 WAS = 톰캣, 아파치 등은 요청이 들어올때 적절한 서블릿을 호출하여 작업을 처리한다. 

 

서블릿은 여러 Server OS에서 수행 가능하지만, 보통 기본적인 서블릿 서버는 리눅스 + 아파치 + 톰캣 의 조합으로 구성한다. 그리고 서블릿은 J2EE로 만드는데 일반 이클립스가 아닌 J2EE용 이클립스를 깔아서 IDE 환경에서 개발 가능하다. 

 

 


이 글은 스프링노트에서 작성되었습니다.

2010년 11월 16일 화요일

닷넷 코드 엑세스 보안과 WPF 성능

 

http://msdn.microsoft.com/ko-kr/library/930b76w0(v=VS.90).aspx

악의적인 이식 가능한 코드로부터 시스템을 보호하고, 알 수 없는 출처에서 가져온 코드를 안전하게 실행하고, 신뢰된 코드가 실수 또는 의도적으로 보안을 손상시키지 않도록 .NET Framework에서는 코드 액세스 보안이라는 보안 메커니즘을 사용합니다. 코드 액세스 보안은 코드 발생 위치 및 코드 ID의 다른 측면에 따라 다양한 수준으로 코드를 신뢰할 수 있습니다. 또한, 코드 액세스 보안은 코드에 다양한 신뢰 수준을 적용하여, 실행하기 위해 완전히 신뢰되어야 하는 코드 분량을 최소화합니다. 코드 액세스 보안을 사용하면 악의적이거나 오류가 많은 코드에 의해 사용자 코드가 오용될 가능성이 적습니다. 사용자는 코드가 수행할 수 있는 작업 집합과 수행할 수 없는 작업 집합을 지정할 수 있으므로 위험 부담을 줄일 수 있습니다. 또한 코드 액세스 보안은 코드의 보안상 약점으로 인해 생길 수 있는 손상을 최소화합니다.

 

공용 언어 런타임 기능이 있는 모든 관리 코드는 코드 액세스 보안을 전혀 호출하지 않아도 코드 액세스 보안의 장점을 활용할 수 있습니다. 그러나, 모든 응용 프로그램은 코드 액세스 보안 기본 사항에서 설명하는 것처럼 코드 액세스 요청을 해야 합니다.


위와 같은 보안 매커니즘 때문에 닷넷 어플에서 로드한 어셈블리는 보안 인증을 먼저 거치게 됩니다. 그러나 인증 과정은 네트워크를 거치게 되므로 이때 부하가 생깁니다.

하지만 이 과정이 꼭 필요하지 않은 경우도 있습니다. 예를들어, ClickOnce로 배포할 경우, 인증과정 및 게시자 증명 과정을 필수적으로 거치게 됩니다. 하지만 이를 사용하지 않으면 굳이 증명을 할 필요가 없습니다.


http://msdn.microsoft.com/ko-kr/library/cc656914.aspx

Authenticode 확인도 시작 시간이 길어지는 원인이 될 수 있습니다.Authenticode 서명된 어셈블리는 CA(인증 기관)를 통해 확인되어야 합니다.이 확인 작업을 수행하려면 최신 인증서 해지 목록을 다운로드하기 위해 네트워크에 여러 번 연결해야 하므로 시간이 오래 걸릴 수 있습니다.또한 이 과정에서 신뢰할 수 있는 루트로 연결되는 경로에 대한 유효한 인증서가 모두 있는지도 확인합니다.이로 인해 어셈블리가 로드되는 동안 몇 초 정도 작업이 지연될 수 있습니다.
클라이언트 컴퓨터에 CA 인증서를 설치하거나, 가능하면 Authenticode를 사용하지 않는 것이 좋습니다.응용 프로그램에서 게시자 증명 정보를 필요로 하지 않는 경우 서명 확인에 리소스를 낭비할 필요가 없습니다.

 

http://msdn.microsoft.com/ko-kr/library/bb629393.aspx

CLR(공용 언어 런타임)은 어셈블리에 대한 Publisher 증명 정보를 만들기 위해 로드 시 Authenticode 서명을 확인합니다.그러나 기본적으로 대부분의 응용 프로그램에는 Publisher 증명 정보가 필요하지 않습니다.표준 CAS 정책은 PublisherMembershipCondition을 사용하지 않습니다.사용자 응용 프로그램이 사용자 지정 CAS 정책을 사용하는 컴퓨터에서 실행되지 않거나 부분 신뢰 환경에서 PublisherIdentityPermission에 대한 요청을 충족시키기 위한 것이 아닐 경우 게시자 서명 확인과 관련된 불필요한 시작 작업을 수행하지 않아야 합니다.전체 신뢰 환경에서는 ID 권한 요청이 항상 성공합니다.

 

따라서 예외적인 시나리오의 경우엔 보안 인증 과정을 생략하여 성능을 올릴수 있습니다. (있다고 합니다.)


http://msdn.microsoft.com/ko-kr/library/cc656914.aspx

 

.NET Framework 3.5부터는 Authenticode 확인을 건너뛸 수 있는 구성 옵션을 사용할 수 있습니다. 이렇게 하려면 app.exe.config 파일에 다음 설정을 추가하십시오.

 <configuration>
<runtime>
<generatePublisherEvidence enabled="false"/>
</runtime>
</configuration>

 

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

2010년 10월 30일 토요일

.NET TPL 개론

 .NET Framework 4 의 Parallel Task Library는 .NET 에서 기존 코드를 크게 바꾸지 않아도 멀티코어/멀티쓰레드에 맞게 프로그램을 고칠수 있게 해줍니다.  멀티코어 시대가 이미 일반화된 현재로서 멀티 프로세싱/프로그래밍 하여 퍼포먼스를 향상시키는 스킬은 개발자에게 매우 중요한 스킬인데, 이걸 네이티브로 구현하려면 정말 많이 힘이 듭니다. 많은것을 알아야 하고 고민해야되죠... (CPU 명령, CPU 전용 컴파일러, 그리고 스펙...) 그리고 해본분은 알겠지만 디버깅은 정말 죽음입니다. 그래서 닷넷에서는 많은 부분을 추상화 해서 개발자 입장에서 몇가지 자료 구조와 API로 이 문제를 해결할수 있도록 돕고 있습니다.

 

현재 프로그래밍 언어로서는 완벽하게 멀티 프로세싱을 지원하지 않습니다. 일부 언어가 멀티코어 환경에 맞게 문법을 지원해준다고는 하나, 현업에서는 거의 쓰이지 않고 학술적인 목적으로 제한적으로 사용되고 있습니다. 따라서 개발자 니즈로서는 기존 언어가 쉽게 멀티코어로 포팅될수 있기를 바라죠. MS는 이 니즈를 파악하고 니즈에 맞는 라이브러리를 만들었는데 이게 TPL 입니다. 니즈에 대해서 말이 나왔으니, 기존 닷넷에 대해서 약간만 이야기를 하죠... 닷넷이 멀티프로세싱을 처음부터 지원 안한건 아닙니다. 기존 닷넷의 비동기 처리와 쓰레드 풀링 처리는 1.0 때부터 지원하던 것이었습니다. 하지만 간단한 비동기 작업 코드를 짜 보아도 같은 기능의 동기화 코드와는 많은 부분에서 차이가 납니다. 동기를 비동기로 옮기는 것도 어렵고 옮긴다 해도 뻑안나는 같은 동작을 보장하는 것은 정말 어려운 일이었습니다.

 

그래서 MS는 이를 프레임웍 레벨에서 지원해줄수 있는 방법은 없나 고민하게 됩니다. 그럼 MS가 고민하던 때로 돌아가 같이 고민해 볼까요?

 

1) 어차피 모든 부분을 멀티코어로 만들수는 없습니다. 왜냐면 보통 프로그래밍 언어들은 1프로세스 1쓰레드 기준으로 가장 잘 동작하게 만들어져 있죠 (완벽한 멀티코어용 언어로 동작하게 하려면 lock 이나 모니터, 세마포어를 별도로 선언할 필요가 없어야 하지 않을까요? 이러한 동기화 구조들은 현재의 프로그래밍 언어가 멀티코어를 지원하지 않아서 생기는 것입니다.)

2) 그렇다면 멀티코어로 만들면 좋은 부분만을 확실히 멀티코어 동작하게 해주면 됩니다.

3) 어떠한 부분이 멀티코어스러울수 있을까요?


 

멀티코어의 효과가 최대한 있을수 있는 부분들은 대개 상당한 부하가 걸리는 작업들을 수반한 영역들입니다. 그리고 프로그램에서 가장 부하가 많이 걸리는 부분들은 대개 반복작업 - 루프 등에 몰려 있습니다. (중요한 성능개선 포인트인 LRU가 많이 발생하는 곳이기도 합니다.)

(비동기 작업이 꼭 멀티코어스러워야 하는건 아닙니다.  부하가 많이 걸려서 비동기가 필요한 곳은 멀티코어로 바꿀 필요가 있지만, 그렇지 않고 타이밍 때문에 기다려야 하는 상황에서는 멀티코어를 적용하는건 바보같은 짓입니다.)

그리고 이러한 반복작업에서 많이 사용되는 자료구조는 배열-콜렉션과 배열에서 파생된 자료구조들입니다. 이들 자료구조는 멀티프로세싱하게 되면 여러 쓰레드가 동시에 접근하게 되므로, 동기화를 반드시 신경써야 하겠죠.

 

따라서 멀티코어에 대해서 MS는 2가지 전략을 세울수 있습니다.

 


1) 반복작업내 수행되는 작업이 오래 걸리면 이를 멀티쓰레드로 쉽게 옮길수 있도록 해주자

2) 멀티쓰레드에서 사용되는 콜렉션에 대해서는 동기화가 될수 있도록 해주자.

 
그래서 Task Parallel Library가 등장하게 됩니다. 첨부한 PDF에는 이러한 부분에 대해서 대략적인 설명과 함께 실제 적용사례가 나와 있습니다.

1) 의 해결책으로 Task라는 멀티프로세싱을 관리하는 객체에 여러 Task를 만들수 있는 Factory를  두었고, 여기에 람다식으로 태스크를 넣을수 있습니다.
2) 의 해결책으로  System.Collections.Concurrent 네임스페이스 아래의 자료구조들을 예로 들수 있습니다.
 
이 두가지를 조합하여 기존 코드를 멀티코어와 할수 있습니다.
하지만 이것도 어렵다는 개발자의 니즈를 만족시키기 위해서 MS에서는 함수 단위의 비동기화를 아예 언어 단위에서 지원하도록 만들었습니다. : 이것이 최근에 나온 VisualStudio Parallel 으로 보입니다.
 

자세한 이야기는 좀더 나중에...

 

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

2010년 10월 28일 목요일

yield 키워드를 이용한 루프-데이터 반환 최적화

.NET 2.0 부터 있던 키워드이나, 사실상 잘 이용 안되고 있었던 키워드가 있었으니 바로 yield 이다.
yield는 원래 Ruby 에 있던 개념이었는데 제한적으로 C#에서 언어용으로 차용하게 되었다.
하지만 MSIL 수준에서의 지원은 아니고  컴파일시 C# 컴파일러가 자동으로 Code를 생성해준다.
 
 
yield는 return, break 과 같이 사용하며,  yield를 쓰면 루프에서 원하는 조건에 맞는 데이터들의 리스트를 IEnumerable 형태로 얻어올수 있다.
그러니까, 만일 루프를 돌면서 어떤 목록에서 특정 아이템들을 뽑아 따로 리스트를 만들고 싶다면 루프 이전에 컬렉션을 하나 만들고 이 컬렉션에 값을 넣는 코드를 삽입해야 한다.
하지만 yield는 이를 단 한줄로 해결해 준다.

[code csharp]
public class List
{
        //using System.Collections;
        public static IEnumerable Power(int number, int exponent)
        {
                int counter = 0;
                int result = 1;
                while (counter++ < exponent)
                {
                        result = result * number;
                        yield return result;
                 }
        }
        
        static void Main()
        {
                // Display powers of 2 up to the exponent 8:
                foreach (int i in Power(2, 8))
               {
                        Console.Write("{0} ", i);
               }
        }
}
[/code]


 Yield의 구현은 다음 아티클을 참조 : 내부적으로 루프 코드를 State 머신 형태로 변경하여 데이터를 뽑아낸다.
 
Yield는 동일한 기능을 구현하는 코드보다 성능이 더 좋은편이다.
 
 
 
이 글은 스프링노트에서 작성되었습니다.

윈7폰에서 SQLLite쓰기

모바일에서 자주 사용했었던 SQLLite가 윈7폰에는 빠져 있지요
안드로이드는 내부 DB가 있는데 윈7폰은 빠져서 여기에 불만인 사람들이 많습니다.
MS에서는 자사의 클라우드 서비스를 사용하라고 이야기 합니다만 개발자들이 꼭 시키는대로 따르지는 않죠.

그래서 SQLLite 소스를 C#으로 완전 포팅하여 IsolatedStorage를 사용할수 있게 한게 나왔습니다. (혹 뒷북인가요?;;)
프로젝트에 DLL을 추가하고 약간 잡다한 설정하나 해주면 끝납니다. 단 주의할것은

1) 에뮬레이터 재부팅 하면 DB가 날아갑니다. 에뮬에서는 IsolatedStorage를 리부팅 할때마다 날려버리는듯..
2) IsolatedStorage가 일반 파일 IO보다 매우 느리기 때문에 성능을 기대하긴 어렵습니다.

간단한 DB 트랜잭션이 꼭 필요하다면 사용할만 합니다. 다운로드는 아래에...

WP7 Sqlite

2010년 10월 12일 화요일

어제출시된 따끈한 윈7폰 테스트 (삼성,LG)

출시된 폰들 비됴입니다.

보신분은 패스

 

안보신 분은 함 대충 느껴보세요

손이랑 크기를 비교해보시면 대략 감이 오실것 같습니다.

 

급하신 분들위한 종합버전 ->

 

 

 

 

 

 

 

 

 


 

 

1) 슬쩍 버벅? 대는 옴니아 7폰...

 

 

2) 옵티머스 7

 

3) 포커스 .. 요건 좀 성실히 테스트 해줬네요

 

2010년 10월 7일 목요일

[100903] 시작하기

 http://msdn.microsoft.com/en-us/library/ff402531(v=VS.92).aspx

 

윈폰 개론

  • 윈도우 7 폰은 MS의 3 Screen 전략의 일환이다. MS 플랫폼을 사용하는 것끼리는 모두 통할수 있다. (정말?)

Ff402531.916128b2-5c36-44c1-8f57-9a5600f2ffd4(en-us,VS.92).jpg

  • 윈도우 7 폰은 사용자보다 좀더 개발자를 위해 신경쓰여 개발되었다.
  • 윈도우 7 폰은 클라우드를 지원하도록 만들어졌다. (PUSH)
  • 결국 MS 정책은 윈도우 + 닷넷 플랫폼 기반의 제품으로 천하통일 하겠다는 거임.
  • 잘?만든 플랫폼 열 자식 안부럽다.


아키텍쳐

  • W7P 을 지원하기 위해서 4종류의 아키텍쳐가 사용된다.

 

Ff402531.0793c2c3-bb8a-45cc-88cc-a3e0475d1f2b(en-us,VS.92).jpg

 

Runtime on Screen
  •  Runtime on Screen은 폰에 들어가는 아키텍쳐다. 폰에 필요한건 여기 다있다.
    •     특이점 - Framework가 2개 : 실버라이트는 보통 UI를 위한 것이고 XNA는 게임에 특화된 프레임웍이다.
    •     공통점 : 두 프레임웍 다 공통 베이스 라이브러리를 사용한다. (요 아랜 바로 OS 커널과 드라이버들이다. - 나중에 다루겠음)

       

Ff402531.67ce14d9-11ed-40cc-a4ac-b0807bfb59e0(en-us,VS.92).jpg

 

 Tools
  • 툴은 개발툴이다 그냥 VS2010으로 개발하면 된다.
  • 하지만 에뮬레이터가 Vista SP3 이상에서만 돌아가기 때문에 XP에서는 개발 못한다.  그냥 Win7에서 개발하라.

    • WDF 드라이버 모델을 XP에서 지원 못하기 때문인 것으로 사료됨

 

클라우드

 

 포털 (윈폰 마켓플레이스)
  • 포털은 그냥 앱을 배포하고 판매하고 마케팅 정보를 얻거나 이용하기 위한 수단이다.
  • 안드로이드와 다르게, 앱 인증과 검증을 거쳐야 한다. (엑티브 엑스의 과오를 범하지 않기 위해서라나...)
  • CRM을 제공한다고 한다. (요점 사업아이템으로 주목할 만함)
  • 돈 받는게 제일 까다롭다... 법적인 문제가 해결되었는지 모르겠음 (2010-09-03)
  • 우리나라에는 왜 안들어올까요?

 

앱 개발 라이프사이클

  • (SE에서 항상 이야기 하지만) 대다수의 App은 계획->개발->테스트 및 디버깅->배포->유지보수의 과정을 거치게 된다.
  • 아래는 윈폰의 라이프 사이클임

    • 대다수의 타 플랫폼 앱 시장과 동일하다.

Ff402531.0292c3ea-b3c8-4546-9554-6118066c06b0(en-us,VS.92).jpg 

 

라이프사이클

1) Windows Live ID를 만든다. 이걸로 개발자 포털에 가입하고 개발자 인증을 받는다.

2) 인증 툴킷을 다운받고 개발에 이용할 폰을 등록한다.

3) 개발->디버깅

4) 배포는 마켓 플레이스에 XAP 파일을 업로드 하여 진행한다. (빌드하면 .XAP이 생성된다.)

   개발자 포탈에 가입하여 앱을 올린다. - 사이트의 인증 및 테스트 과정을 통과해야만 앱을 올릴수 있다.

5) 마켓 플레이스에서는 유지보수 및 마케팅에 필요한 자료를 제공한다.

 

 

 

이 글은 스프링노트에서 작성되었습니다.

2010년 9월 17일 금요일

Lenovo thinkpad synaptics utilities

Lenovo Thinkpad의 Touchpad 회사인 Synaptics에서 만든 터치패드를 이용한 유틸리티 입니다.

 

1. SynZMetr

 

lenovo 드라이버와 기타 유틸리티 설치 시 C:\Program Files\Synaptics\SynTP 경로에 설치 됩니다. 터치패드를 누르는 강도에 따라 빨간 그래프가 그려집니다.

 

간단한 실험을 해봤는데, 역시 실제 압력 값은 아니군요. 전도성 고무로도 해봤는데요, 아무리 세게 눌러도 오른쪽 그래프가 한계네요. (왼쪽 두개는 손으로 한 것.) 전기가 흐르는 양에 따라 표시되는 것 같습니다.

 

 

 

2. Synaptics Drum Pad

 

 터치 패드를 누르는 위치에 따라, 위 4개 사각형 중 하나에 표시가 되고 동시에 소리가 나오네요. 귀여운 어플리케이션입니다. 그런데 생각보다 인식이 잘 안되네요. 터치패드는 그 위에서 이동하는 손을 인식하기에는 적합하지만, tap을 인식하기에는 적당하지 않은가 봅니다.

 

 

3. Theremin

 터치패드에서 터치되는 위치에 따라 소리가 나는 유틸리티입니다. 너무 높은 소리도 나서 듣기 힘드네요. ㅎㅎ

 

 

4. Touch Pad Says

 2번과 같은 UI지만, 터치패드가 내는 소리를 따라서 치는 간단한 게임입니다.

 

 

 

위 2~4번 유틸리티는 Synaptics 홈페이지에서 다운로드 할 수 있습니다.

http://www.synaptics.com/support/utilities

 

lenovo 사용자라면 한번 시도해 보세요~ ^^

 

 

 

+ 친절하게 라이브러리도 제공하네요.

http://www.synaptics.com/developers/archive 에서 "MepLib Porting Guide" 란을 참고해보세요. 터치패드를 응용한 프로그램도 재미있을 것 같네요. ^^

2010년 9월 13일 월요일

WPF Study -- Data Binding and Style

Data Binding
 - 컨트롤과 엘리먼트를 데이터에 연결시키는 기술

Style
 - 엘리먼트에 적용되는 프로퍼티의 집합.


2010년 9월 10일 금요일

오토마우스 오토키보드 소스

푸 요청으로 올립니다.

옛날에 짠 소스인데... 아래 SendInput  이라는 API 로 마우스/키보드 흉내를 낼수 있습니다.

오토 마우스/ 키보드가 가능하다는 것이지요...

굳이 복잡한 후킹기술 안써도 아래 소스로 충분합니다.

 

 

[code csharp] using System; using System.Runtime.InteropServices; namespace AutoKeyMouseExample { internal class Win32APIs { [DllImport("user32.dll", SetLastError = true)] public static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize); [DllImport("user32.dll")] public static extern IntPtr GetMessageExtraInfo(); [StructLayout(LayoutKind.Sequential)] public struct MOUSEINPUT { public int dx; public int dy; public uint mouseData; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct HARDWAREINPUT { public uint uMsg; public ushort wParamL; public ushort wParamH; } [StructLayout(LayoutKind.Explicit)] public struct INPUT { [FieldOffset(0)] public int type; [FieldOffset(4)] //* public MOUSEINPUT mi; [FieldOffset(4)] //* public KEYBDINPUT ki; [FieldOffset(4)] //* public HARDWAREINPUT hi; } /***************************** * EVENT CONSTANTS * *****************************/ public const int INPUT_MOUSE = 0; public const int INPUT_KEYBOARD = 1; public const int INPUT_HARDWARE = 2; public const uint KEYEVENTF_EXTENDEDKEY = 0x0001; public const uint KEYEVENTF_KEYUP = 0x0002; public const uint KEYEVENTF_UNICODE = 0x0004; public const uint KEYEVENTF_SCANCODE = 0x0008; public const uint XBUTTON1 = 0x0001; public const uint XBUTTON2 = 0x0002; public const uint MOUSEEVENTF_MOVE = 0x0001; public const uint MOUSEEVENTF_LEFTDOWN = 0x0002; public const uint MOUSEEVENTF_LEFTUP = 0x0004; public const uint MOUSEEVENTF_RIGHTDOWN = 0x0008; public const uint MOUSEEVENTF_RIGHTUP = 0x0010; public const uint MOUSEEVENTF_MIDDLEDOWN = 0x0020; public const uint MOUSEEVENTF_MIDDLEUP = 0x0040; public const uint MOUSEEVENTF_XDOWN = 0x0080; public const uint MOUSEEVENTF_XUP = 0x0100; public const uint MOUSEEVENTF_WHEEL = 0x0800; public const uint MOUSEEVENTF_VIRTUALDESK = 0x4000; public const uint MOUSEEVENTF_ABSOLUTE = 0x8000; /***************************** * VIRTUAL KEYS * *****************************/ public enum VK : ushort { /* * Virtual Keys, Standard Set */ VK_LBUTTON = 0x01, VK_RBUTTON = 0x02, VK_CANCEL = 0x03, VK_MBUTTON = 0x04, /* NOT contiguous with L & RBUTTON */ VK_XBUTTON1 = 0x05, /* NOT contiguous with L & RBUTTON */ VK_XBUTTON2 = 0x06, /* NOT contiguous with L & RBUTTON */ /* * 0x07 : unassigned */ VK_BACK = 0x08, VK_TAB = 0x09, /* * 0x0A - 0x0B : reserved */ VK_CLEAR = 0x0C, VK_RETURN = 0x0D, VK_SHIFT = 0x10, VK_CONTROL = 0x11, VK_MENU = 0x12, VK_PAUSE = 0x13, VK_CAPITAL = 0x14, VK_KANA = 0x15, VK_HANGEUL = 0x15, /* old name - should be here for compatibility */ VK_HANGUL = 0x15, VK_JUNJA = 0x17, VK_FINAL = 0x18, VK_HANJA = 0x19, VK_KANJI = 0x19, VK_ESCAPE = 0x1B, VK_CONVERT = 0x1C, VK_NONCONVERT = 0x1D, VK_ACCEPT = 0x1E, VK_MODECHANGE = 0x1F, VK_SPACE = 0x20, VK_PRIOR = 0x21, VK_NEXT = 0x22, VK_END = 0x23, VK_HOME = 0x24, VK_LEFT = 0x25, VK_UP = 0x26, VK_RIGHT = 0x27, VK_DOWN = 0x28, VK_SELECT = 0x29, VK_PRINT = 0x2A, VK_EXECUTE = 0x2B, VK_SNAPSHOT = 0x2C, VK_INSERT = 0x2D, VK_DELETE = 0x2E, VK_HELP = 0x2F, /* * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39) * 0x40 : unassigned * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A) */ VK_LWIN = 0x5B, VK_RWIN = 0x5C, VK_APPS = 0x5D, /* * 0x5E : reserved */ VK_SLEEP = 0x5F, VK_NUMPAD0 = 0x60, VK_NUMPAD1 = 0x61, VK_NUMPAD2 = 0x62, VK_NUMPAD3 = 0x63, VK_NUMPAD4 = 0x64, VK_NUMPAD5 = 0x65, VK_NUMPAD6 = 0x66, VK_NUMPAD7 = 0x67, VK_NUMPAD8 = 0x68, VK_NUMPAD9 = 0x69, VK_MULTIPLY = 0x6A, VK_ADD = 0x6B, VK_SEPARATOR = 0x6C, VK_SUBTRACT = 0x6D, VK_DECIMAL = 0x6E, VK_DIVIDE = 0x6F, VK_F1 = 0x70, VK_F2 = 0x71, VK_F3 = 0x72, VK_F4 = 0x73, VK_F5 = 0x74, VK_F6 = 0x75, VK_F7 = 0x76, VK_F8 = 0x77, VK_F9 = 0x78, VK_F10 = 0x79, VK_F11 = 0x7A, VK_F12 = 0x7B, VK_F13 = 0x7C, VK_F14 = 0x7D, VK_F15 = 0x7E, VK_F16 = 0x7F, VK_F17 = 0x80, VK_F18 = 0x81, VK_F19 = 0x82, VK_F20 = 0x83, VK_F21 = 0x84, VK_F22 = 0x85, VK_F23 = 0x86, VK_F24 = 0x87, /* * 0x88 - 0x8F : unassigned */ VK_NUMLOCK = 0x90, VK_SCROLL = 0x91, /* * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys. * Used only as parameters to GetAsyncKeyState() and GetKeyState(). * No other API or message will distinguish left and right keys in this way. */ VK_LSHIFT = 0xA0, VK_RSHIFT = 0xA1, VK_LCONTROL = 0xA2, VK_RCONTROL = 0xA3, VK_LMENU = 0xA4, VK_RMENU = 0xA5, VK_BROWSER_BACK = 0xA6, VK_BROWSER_FORWARD = 0xA7, VK_BROWSER_REFRESH = 0xA8, VK_BROWSER_STOP = 0xA9, VK_BROWSER_SEARCH = 0xAA, VK_BROWSER_FAVORITES = 0xAB, VK_BROWSER_HOME = 0xAC, VK_VOLUME_MUTE = 0xAD, VK_VOLUME_DOWN = 0xAE, VK_VOLUME_UP = 0xAF, VK_MEDIA_NEXT_TRACK = 0xB0, VK_MEDIA_PREV_TRACK = 0xB1, VK_MEDIA_STOP = 0xB2, VK_MEDIA_PLAY_PAUSE = 0xB3, VK_LAUNCH_MAIL = 0xB4, VK_LAUNCH_MEDIA_SELECT = 0xB5, VK_LAUNCH_APP1 = 0xB6, VK_LAUNCH_APP2 = 0xB7, /* * 0xB8 - 0xB9 : reserved */ VK_OEM_1 = 0xBA, // ';:' for US VK_OEM_PLUS = 0xBB, // '+' any country VK_OEM_COMMA = 0xBC, // ',' any country VK_OEM_MINUS = 0xBD, // '-' any country VK_OEM_PERIOD = 0xBE, // '.' any country VK_OEM_2 = 0xBF, // '/?' for US VK_OEM_3 = 0xC0, // '`~' for US /* * 0xC1 - 0xD7 : reserved */ /* * 0xD8 - 0xDA : unassigned */ VK_OEM_4 = 0xDB, // '[{' for US VK_OEM_5 = 0xDC, // '\|' for US VK_OEM_6 = 0xDD, // ']}' for US VK_OEM_7 = 0xDE, // ''"' for US VK_OEM_8 = 0xDF /* * 0xE0 : reserved */ } } } [/code]

2010년 7월 17일 토요일

윈모데브 Win7폰 스터디 2일차 정리

Windows 7 phone WinMoDev 세미나 2일차


스터디용 까페 트위터로 조별 회의 진행

과제: Hello world 한번씩 찍어볼 것

자기 조원들을 기준으로 해서 조 정보들을 에뮬레이터에 띄워보기 (List App으로 만들어 볼 것!)

조원: 모다, 불곰, 휘파람, 수야 (4)

-      8 14, 24일 스터디 예정 (이번달은 1주일에 1회 스터디)

-      오후 2시로 Study 고정

Windows Marketplace

-      99불 등록비

-      DreamSpark 에서 지원 예정

-      Hoff test를 통과해야만 업로드 가능

-      Market place requirements 문서 참고할 필요가 있음

Namespace Study

-      모바일 위치 정보 관련: System.Device.Location

-     패턴 카드놀이 식으로 네임스페이스를 학습하자.

-     제안: 초시계를 두고 스피드 게임을 하자

-     추가 창의적 제안 (커뮤니티 올릴것) : 가족 오락관 처럼 스무고개, 스피드게임, 귓속말 전달

-     게임으로 공부하는데 필요한 것들 : 벌칙, 규칙, 준비물 - 장점 : 좀더 재밌게 빨리 배울수 있다.
단점 : 오래못하고 피곤하다.

 

2010년 6월 21일 월요일

3D Webbrowser

프로그램 안에 웹 브라우저 기능을 넣어야 하는 일이 있습니다. 근데 다음의 기존 웹 브라우져들의 기능이 영 시원치 않아서 다른걸 찾아보았습니다.

 

  •  System.Windows.Forms.Control.WebBrowser
    닷넷에서 웹브라우저를 사용하기 위해서 사용할수 있는 브라우져 입니다. IE를 호스트 하여 만들어져 있습니다.
  •  System.Windows.Control.WebBrowser
    위 윈폼 브라우저를 WPF에서 사용하기 쉽게 하기 위해서 3.5 부터 지원하는 브라우져라 합니다.
    하지만 위 브라우저를 WPF용으로 만든것 이상도 이하도 아닙니다.

위 2개는 비주얼 캡쳐도, 위치 변형도 안되는 그런 컨트롤이라

 

그래서 발견한것이 아래 링크의 컨트롤입니다.

http://chriscavanagh.wordpress.com/2009/08/25/a-real-wpf-webbrowser/

 

그냥 집어넣고 크기 변경하고 회전시키고 변형시키는거 모두 다 되네요 ㅋㅋ



게다가 3D 효과도 ㅋㅋ


 

배경 투명도 ㅋㅋㅋ


 

 

터치가 될런지 모르겠지만;;; 조금 손보면 괜찮을지도?

 

 

 

 

 

 


이 글은 스프링노트에서 작성되었습니다.

2010년 6월 19일 토요일

VisualBrush와 RenderTargetBitmap

 

WPF에서 쓰이는 화면에 보이는 UIElement들은 제 각각 Visual 이라는 객체를 상속받아 만들어지는데 이들은 스스로 자신을 화면에 그릴수 있는 기능이 있다. 따라서 Visual의 이 기능을 이용하여 다음과 같이 재밌는 일을 할수 있다. (미리보기등을 이러한 방법으로 만들수 있다.)

 

Clone 화면 만들기

VisualBrush를 이용하면 Visual의 화면 이미지를 실시간으로 복제하여 Brush를 필요로 하는 위치에 그려주게 된다. 내부적으로 브러시의 원본 객체의 surface 를 복제함으로서 이루어진다.

 

 

  1. VisualBrush brush = new VisualBrush(this.DrawingCanvas);
  2. Rectangle rect = new Rectangle();
  3.  
  4. rect.Width = this.DrawingCanvas.ActualWidth;
  5. rect.Height = this.DrawingCanvas.ActualHeight;
  6. rect.Fill = brush;

    Window wd = new Window();
  7. wd.Content = rect;

 

 

마치 클론 화면을 쓰는 것처럼 쉽게 복제된 화면을 여러개 만들수 있다. 원본 화면에서 뭔가 일어나면 다른 화면에서도 똑같이 발생한다.



화면의 특정부위 스샷찍기

화면을 복제하는 것보다, 그때 스샷을 찍고 싶을때가 있다. 특히 원하는 컨트롤 또는 부위에 대해서. 이런때엔 RenderTargetBitmap을 이용하면 간단히 해결된다. 이때엔 별도의 Bitmap이미지를 생성한후 객체의 Visual 화면을 BitBlt 하여 복제한다. 단, 이때엔 새로만들어지는 비트맵의 색상 또는 dpi를 지정해 줄수 있는데 이를 이용하여 성능을 조절할 수 있다.

 

 

  1. RenderTargetBitmap rtb = new RenderTargetBitmap((int)this.DrawingCanvas.ActualWidth, (int)this.DrawingCanvas.ActualHeight, 100, 100, PixelFormats.Default);
    rtb.Render(this.DrawingCanvas);

    Window testWin = new Window();
    testWin.Width = this.DrawingCanvas.ActualWidth;
    testWin.Height = this.DrawingCanvas.ActualHeight;
    (testWin.Content as Image).Source = rtb;

    testWin.Show();

 

 

현재 화면을 복제하고, 원본 화면이 바뀌더라도 현재 화면을 유지한다.

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

2010년 5월 20일 목요일

HTC의 Windows 7 Phone ROM 유출?

HTC에서 유출된 Phone ROM에 windows 7 Phone OS로 보이는 데이터가 담겨 있었답니다. 이걸로 봐서 올 하반기엔 HTC에서 Mondrian 등의 차기 단말로 Windows 7 Phone이 등장할 확률이 높아졌군요. 다른 제조사의 행보가 주목됩니다. (LG에서 해외를 대상으로 Windows 7 Phone을 샘플로 선보였다고 하는데... 자세한건 두고봐야겠죠?)

 

http://www.engadget.com/2010/05/17/htc-mondrian-with-1-3ghz-snapdragon-detailed-in-leaked-windows-p/

 

 

Blend & Windows 7 Phone 동영상 한점.

 

Microsoft Blend로 App을 만드는 방법에 대한 90초 짜리 동영상입니다.

간단해보이는군요... 시간나는대로 바로 해서 포스팅 해보겠습니다.

개인적으로 이제부터 화면전환이용이 가능하다는게 좋군요.

 

Get Microsoft Silverlight

2010년 5월 10일 월요일

Windows 7 Phone Design 관련 동영상 2점


Windows 7 Phone의 디자인에 관한 동영상이 2개 있어요
흥미있는 분들 보시라고 링크~


Get Microsoft Silverlight

아래는 위 동영상의 독어 버전? 인데 좀더 7 Phone의 디자인 테마에 대해서 이야기하고 있는듯....


Get Microsoft Silverlight


2010년 5월 6일 목요일

Advanced silverlight graphics

 

항상 바닥부터 이해하는것이 필요하고, 중요하지만...

WPF/Sliverlight 기술의 애니메이션, 렌더링 과정이 하부에서 어떻게 이루어지는지 항상 궁금했는데

관련된 좋은 자료가 있네요, 조사해서 관련 자료를 정리해 포스팅 하겠습니다. (좀 걸릴지도 모르지만;;)

특히 윈도폰7에서의 그래픽 최적화 이야기는 주목할만하군요.

 

예제와 PPT 내용은 다 보고 참고 링크는 다 조사해 봅시다!

 http://gongdosoft.com/485

 

 

이 글은 스프링노트에서 작성되었습니다.

2010년 4월 28일 수요일

놀고먹으면서 일 잘하는 방법 - 우리의 Agile 실험

 

"놀고먹으면서 일 잘하는 방법은 없을까?"

 

제가 입사한 후 근 9개월동안 알게 된 IT 현실은 다음과 같습니다.

 

1) 개발자는 노동강도가 세다. 그들에겐 밤도, 주말도 존재하지 않는다. 왜냐면...

2) 대부분의 개발자들의 업무가 과중하고 업무를 처리하는 방식이 비 효율적이기 때문이다.

    (주 업무의 70% 이상이 유지보수 = 버그잡기 이고 신규개발에 의한 과중은 얼마 안되었습니다.)

3) 개발자들도 이 사실을 알고있다.

4) 하지만 여러가지 이유를 들어 섣불리 개선하지 못하고 있다.

5) 그리고 타인과 조직이 잘못되어 있다고 한탄한다.

 

약간 다른 이야기지만, 저는 몇년전부터 "효율적으로 일하는방법 = 놀면서 일하는 방법"을 고민해 왔습니다.

 

사실 이러한 저의 고민은 저의 학창시절의 고민에서 시작되었습니다.

저의 학창시절 소원은 1등을 해보는 것이었습니다. 저는 5시간만 자고 공부만 했지만 항상 8시간 이상 자고 친구들과 자주 스타크래프트를 하는 1등이 항상 부러웠습니다. 시험에서의 퍼포먼스와 삶에서의 퍼포먼스 양쪽을 다 잡고있는 그가 매우 부럽고 시기했었습니다. 그리고 저는 "천재"가 아니기 때문에 그러한 것이 불가능할 것이다라고 단정지었었죠.

 

 하지만 대학들어와도 바로 옆 친구가 시험기간동안 게임을 즐기면서도 항상 평점은 4.0 이상 이었던것에 비해, 저는 딱히 노는것도 없이 밤새는데 3.5를 간신히 넘는 상황이 발생하자 그동안 제가 해온 공부 = 일의 방식이 매우 비 합리적이고 아둔하지 않았나 생각하게 되었습니다.

 

 무엇에 차이가 있나 저는 그때부터 잘하는 녀석들을 붙잡고 물어보고 저와 비교하는 일을 시작했습니다.  그 과정은 매우 괴로웠습니다. "나도 이렇게 진작 했다면 좀더 나았을텐데" 라는 생각과 "내가 멍청했다." 라는 자괴감 때문에 많이 괴로웠거든요. 무조건 시간을 오래 쏟는다고 성능이 나아지지 않는것인데 저는 그저 인내하고 파기만 하면 모든게 해결될줄 알았던 것입니다.

 

아래의 링크는 유명인사들이 왜 다른 평범한 사람들과 같은 시간을 보내면서도 탁월한 성과를 올릴수 있는가에 대한 이야기입니다.

http://lifedev.net/2008/03/10-ways-historys-finest-kept-focused-at-work/

 

정리하자면, 그들은 자신이 일하는 방식에 대한 그들만의 원칙이 있고. 결코 오래 엉덩이를 붙이고 있는것이 능사가 아니라는 것을 알고 있었으며 짧은시간동안 최대한 문제에 집중하고 나머지 시간은 몸과 뇌를 놀리는데 썼다는 것입니다.

 

 역시 학창시절에 저보다 우월한 녀석들은 "모든 일을 줄기차게 많이 하는것" 보다 "중요한 일에 단시간 집중하여 탁월한 성과를 내는것"을 선호하고, 각자 그렇게 하는 자기만의 최적화된 방법을 연구하고 체득하고 있었다는 겁니다.

 

결국, "놀면서 일 잘하는 방법에 대한 패턴"은 존재했다고 생각합니다.

 

 그래서 저는 저만의 방법을 찾아 연구했고 이를 간단히 실험해 보았습니다. 공부의 원칙과 시간을 세우고 제가 잘하는 "그림/동영상 기억법"을 이용해서 "숲에서 나무로 훓어 내려가는"공부를 해 보았습니다. 그리고 공부시간 외의 시간은 음악을 듣고 군것질을 하고 잡담을 하고 만화책을 보며 게임을 했습니다. 이전에 시험기간동안 공부에만 투자한 시간이 하루 10시간 이라면 이를 5시간까지 줄였습니다.

 

 그 결과는 생각 외였습니다. 저는 이전보다 많은 시간을 공부에 할애하지 않아도 많은 양을 기억할수 있었고 (일부는 지금도 기억합니다.) 성적도 0.3포인트 이상 더 잘 나왔던 것입니다.

 

다시 회사 이야기로 돌아가서, 수많은 개발자들이 오늘도 죽음의 행진을 하고 있습니다. 아직 초년때에 이 죽음의 대열에 막 발을 담그고 "정말 대한민국에서의 회사생활과 IT엔 답이 없는가?" 하며 괴로워 하고 있을때 한 상사분께서 다음과 같은 조언을 몇가지 해주었었습니다.

 

1) 주요이슈(issue)는 정리되어야 한다. (잠재적인것도 포함)

2) 문제는 잘게 쪼개어야 한다.

3) 히스토리는 기록되어야 한다.

4) (상사가 보기에)중요한 몇가지에 우선 집중하라.

5) 문서와 코딩은 같이 가야한다.

6) 설계와 코드는 자주 리뷰되어야 한다.

7) 설계는 절대 폼잡지 말고 실용적이어야 한다.

8) 프로세스를 세우고 이에 맞추어 일하라.

9) 일 할땐 하되, 자주 쉬어라.

10) 개선할것은 시간을 들여서라도 자주 개선하고

11) 위 모든것은 보고하여 실적화가 가능한 형태로 준비하라.

 

저는 이러한 조언이 그분의 직장생활 10년동안에 나온 귀중한 경험이자 하나의 패턴이라고 생각했습니다. 하지만 그 상사분도 이러한 것들을 제대로 실천하고 계시지는 못하고 계셨습니다. 그래서 저는 여기에 아래와 같은 약간의 변형을 가하고 이를 구체적으로 패턴화 하고 실천하는 작업에 들어갔습니다.

 

12) 모든 업무는 파이프라인처럼 병렬적으로 진행하도록 한다.

     (신속한 태스크 스위칭을 통해서)

 

 저는 스프레드쉬트로 각 업무에 맞는 문서를 만들었고, 오늘의 프로세스를 세워 이를 적어두고 하나씩 실천했습니다. 처음에는 상당히 귀찮을 뿐더러, 번거롭기 그지 없었지만. 이것이 몇달이상 쌓이게 되자 위 11가지 사실을 어느정도 만족시킬수 있는 자료가 되고, 그 자료를 근거로 RISK를 예측하고, 문제에 당황하지 않으며, 한번 해결한 문제가 두번 열리지 않게 하고 남는시간에 중요한 문제에 포커스 하며, 결국 단위시간동안 이전보다 좀더 많은 일을 해결할 수 있음을 알게 되었습니다.

 

통계를 내본결과. 적용전에 하루 3개 정도의 업무를 해결했었으나 이후 5개 이상 최대 하루 10개까지 완료했다는 사실을 발견했기 때문입니다. (이를 가능하게 해준 Franklyn Planner에게 감사~:) )

 

 결국 개발자들이 겪는 수많은 문제들이 정말 IT란 것이 일이 단순히 많아서가 아니라, 과거에 처리한 Bug가 다시 reopen되거나 대충한 설계와 구현때문에 요구사항이 바뀔때 대응을 못하고, 정작 이러한 모든 일에 대한 전체적인 정리된 문서나 설계서가 없기 때문에 문제원인 파악과 대책마련에 시간이 걸린다는 것을 깨닭게 되었습니다. (결국 인간의 기억력에는 한계가 있는데, 많이들 이를 간과합니다.)

 

 문제가 생기지 않는다는 것은, 그 문제를 끊임없이 관리하기 때문이라는 사실도요.

 

 저는 주로 유지보수일을 하고 있었기 때문에, 신규개발만 하는 분들에게 있어서는 별로 공감이 안갈수도 있겠습니다. 그래서 저는 신규개발에도 이러한 "패턴"을 발견하고 여기서 프로세스를 만들어 이를 실천함으로서 현재와 미래의 퍼포먼스와 RISK 안전성을 높이는 작업 이 가능한지 실험해 보기로 하였습니다. 그래서 몇가지 프로세스를 만들었고 이를 실험하여 "우리의 Agile 실험" 이라는 태그를 붙여 블로그에 포스팅 하려 합니다.

 

그리고 저 뿐만 아니라 저 주변의 사람들도 이러한 실험을 통해서 개발에 대한 새로운 눈을 뜰수 있게 되길 소망합니다.