'땡초'에 해당되는 글 152건

  1. 2013.09.11 [Objective-C] 아름다움을 추구하는 오브젝티브-C 언어 1/ 2- 언어적 특성
  2. 2013.08.15 SharePoint 데이터베이스로 부터 모든 문서를 백업 및 추출하기 (2)
  3. 2013.08.05 [MonoDevelop] MonoDevelop 한글 버전 Github 병합 완료 (8)
  4. 2013.07.25 [MonoDevelop] MonoDevelop 통합 개발 도구를 한글화 진행 중입니다. (7)
  5. 2013.07.22 [JavaScript] JS-Lambda 자바스크립트 라이브러리를 공개합니다.
  6. 2013.07.17 [VS2013] VSGesture for Visual Studio 2013 Preview 배포 완료 (1)
  7. 2013.07.08 [퀴즈] 프로그래머를 위한 문제 #3 - 미로 찾기
  8. 2013.07.02 [퀴즈] 프로그래머를 위한 문제 #1 - 1부터 8만까지 8의 개수 (9)
  9. 2013.06.17 [JavaScript] Javascript Array Extensions 소스코드 오픈 (웹브라우저, Node.js 사용 가능) (2)
  10. 2013.06.03 [Javascript] 자바스크립트(Javascript) 개발 팁과 가이드 (Tips & Guide) (6)
  11. 2013.05.31 [ALM] 13. 불완전한 통합, 팀 파운데이션 서버(Team Foundation Server)
  12. 2013.03.18 [페이스북 알리미] Facebook Tray v0.1
  13. 2013.02.20 [ALM] 11. 부하테스트 이야기, 테스트 데이터 분석 문제 풀어보세요. (1)
  14. 2012.10.30 윈도우 8, 반토막짜리 WinRT와 WinRT SDK (1)
  15. 2012.09.11 Windows 8 스타일 앱 개발에 대한 고찰
  16. 2012.06.06 Windows 8 SDK 에는 이것이 빠져있다? (2)
  17. 2012.05.06 크로스 플랫폼 개발 환경 만들기 - (8/11) Mono 개발 환경 만들기 (4)
  18. 2012.05.06 크로스 플랫폼 개발 환경 만들기 - (7/11) 우분투 OS를 개발자 스타일로 최적화
  19. 2012.05.04 크로스 플랫폼 개발 환경 만들기 - (6/11) 윈도우 Active Directory 가입
  20. 2012.05.03 크로스 플랫폼 개발 환경 만들기 - (5/11) 한글 입력 문제
  21. 2012.05.03 크로스 플랫폼 개발 환경 만들기 - (4/11) 한글 업데이트
  22. 2012.05.03 크로스 플랫폼 개발 환경 만들기 - (3/11) 기본 구성
  23. 2012.05.03 크로스 플랫폼 개발 환경 만들기 - (2/11) 우분투 12 설치 (4)
  24. 2012.05.03 크로스 플랫폼 개발 환경 만들기 - (1/11) 도전하라 개발자여 (2)
  25. 2012.03.25 TFS2010, MSDN Virtual Lab: Team Foundation Server 2010, 가상에 환경의 실습해 보자
  26. 2012.03.15 Visual Studio 11, SOLUTION EXPLORER 스마트하게 사용하기 (1)
  27. 2012.03.05 Visual Studio 11, 릴리즈 VSGesture for Visual Studio 11, 2010
  28. 2012.03.04 [HowTo] Visual Studio 11, VSX 업그레이드
  29. 2012.03.04 Visual Studio 11, 더욱 똑똑해진 코드 에디터 (1)
  30. 2012.03.04 Visual Studio 11, 검색 기능 강화

아름답고 자연스러운 오브젝티브-C

필자가 오브젝티브-C(Objective-C)를 접한 것은 올해 초, 갑갑한 문법적인 표현(Syntax)을 보니 코드를 보기가 싫어졌었다. 하지만 많은 iOS 개발자가 생겨나고 맥킨토시(Macintosh)를 쓰면서 자연스럽게 맥용 응용 프로그램에 관심이 생기기 시작했다. 처음에는 리눅스와 대부분의 운영체제를 지원하는 Qt(큐티) 프레임워크를 봐오다가, 코코아(Cocoa) 를 알게 되면서 맥킨토시에 가장 아름다운 UI 프레임워크인 것을 느끼게 되었다고 할까.

오브젝티브-C는 매우 깊은 역사가 있다. 이 역사에 대해서는 다음의 위키피디아(Wikipedia) 를 참고하기 바란다. 필자도 이 언어에 대한 깊은 역사를 이렇다 할 만큼 자신 있게 설명해 주기 힘들 것 같다.

.. 생략 .. [1]
오브젝티브-C는 스텝스톤(Stepstone)이라는 회사에서 일하고 있던 브래드 콕스(Brad Cox)와 톰 러브(Tom Love)라는 두 연구원이 만들었다. 역시 1980년대 초의 일이다. 이 두 사람은 1981년 ITT의 프로그래밍 기술 센터(Programming Technology Center)에서 일하던 시절 스몰토크를 처음 접했다. 콕스는 소프트웨어 설계와 프로그래밍에 있어서 재사용성의 문제에 흥미를 느끼게 되었고, 스몰토크같은 프로그래밍 언어가 ITT 시스템 개발자들이 개발을 진행할 강력한 환경을 만드는 데 필요불가결한 요소임을 깨닫게 되었다. 콕스는 C 컴파일러를 고쳐 스몰토크의 기능 일부를 추가하기 시작했고, 곧 그 스스로 OOPC라고 불렀던 C의 객체지향 버전을 내놓게 되었다. 한편 러브는 1982년에 Schlumberger Research에 채용되었고, Smalltalk-80의 최초 상업적 버전을 써 볼 기회를 가지게 되었다. Smalltalk-80은 이후 그들이 낳은 정신적 자식의 성장에 큰 영향을 끼쳤다.
.. 생략 ..

필자가 오브젝티브-C를 접하면서 ‘빙고!’를 외쳤다. 현대적인 언어의 대부분이 C언어, 그리고 바로 이 오브젝티브-C 언어의 영감을 받았다고 해도 무리는 아니다. (단, 현대적인 언어의 정의는 스스로 정의를 내리기 바란다.)

그렇다면 왜 오브젝티브-C 언어가 아름다운지 보자.

아름다움을 만들어 준 메시지 기반 언어

오브젝티브-C의 가장 기초적인 문법을 일반적인 객체 지향 언어의 문법과 비교해 보자.

// 일반적인 객체지향 언어들의 표현
void* obj = data->get_data(); // 또는
void* obj = data.get_data(); // 또는
Object obj = data.get_data();

// 오브젝티브-C 언어
NSObject* obj = [data get_data];

위의 일반적인 객체지향 언어와 오브젝티브-C 언어는 표현하는 방법에 있어 다른 점이 보인다. 자, 무엇이 다른지 한번 살펴보자.

  1. 문법 표현 방법 : 가장 차이가 나는 점은 식의 표현을 대괄호([ ])로 묶여 있다. (메서드 호출 시)
  2. 메서드 호출 방법 : 포인터(->) 또는 참조(.)를 통해 호출하지 않고 공백(a space)으로 메서드를 가리켜 호출한다.

위 코드가 컴파일 된다면 더욱 명확하게 차이점을 볼 수 있다.

일반적인 객체지향 언어의 경우 컴파일 된 어셈블리(기계어) 코드는 메서드가 메모리 상에 상주하고 있는 주소를 통해 직접 메모리를 엑세스하여 메서드를 실행한다.
오브젝티브-C의 경우 바로 이것이 오브젝티브-C 언어의 특징인 메시지를 통해 메서드를 호출하는 방법이다. data 객체는 get_data() 메서드를 직접 호출하지 않고 다른 대리자(위임)를 통해 메서드를 실행한다.

그렇다면 오브젝티브-C는 대리자를 통해 메서드의 실행을 위임함으로서 장점은 뭘까?

  1. NullPoint 예외(오브젝티브-C의 nil 또는 NULL)나 기타 치명적인 오류를 언어적인 레벨에서 차단한다.
  2. 관리언어(Managed Languages)인 자바, C# 등에서 즐겨 쓰는 Code Interception 등의 기법과 유사한 것들을 쉽게 확장할 수 있는 포인트를 제공한다.
  3. LLVM과 같은 가상 머신(Virtual Machine) 매커니즘을 손쉽게 적용할 수 있다. (clang)
딱히 바로 생각나는 것은 몇 안되지만, 더 많은 장점이 있음은 분명하다. 그리고 오브젝티브-C의 메시지 기반으로 작동하는 언어적인 특성을 분석해보자

오브젝티브-C 메시지 기반 메서드 호출

1. objc_msgSend 함수의 메커니즘

오브젝티브-C는 objc_msgSend() 함수를 이용하여 메시지를 보낸다. 이것은 함수만 해당되는 사항은 아니다. 위에서 살펴본 것과 같이 식의 표현을 대괄호([ ... ]) 안에 코드로 표현하는데 이 대괄호 안에 들어가는 모든 객체건 뭐건 간에 메시지를 통해 값을 가져오거나 메서드를 호출하게 된다.

아래 보이는 어셈블리 코드는 필자가 오브젝티브-C로 작성한 맥용 데스크탑 응용 프로그램 중 일부를 어셈블리 레벨에서 디버깅 하는 스크린샷이다. 다음에 사용된 코드의 일부는 다음과 같다.

[self.sidebar setTarget:self];

sidebar는 인스턴스화 된 객체(Object)이다. 오브젝티브-C는 메서드 호출에서만 메시지를 보내는 것이 아니라는 것이다. 그리고 objc_retainAutoreleasedReturnValue() 함수는 매우 긴 이름이지만, 맨 앞 글자의 retain만 주목해서 보면 된다. sidebar 인스턴스는 현재 컨텍스트(Context)에서 참조하므로 참조 카운터(References Count)를 1 증가 시킨다.


2. objc_msgSend 함수 내부에서 전달받은 메시지

아래의 스크린샷은 objc_msgSend() 함수의 내부에서 RIP 레지스터가 가리키는 메모리 주소의 HEX 이다. '73 69 64 65 62 61 72 00'(sidebar) 문자열은 objc_msgSend() 함수에 의해 RTTI(Run-time Type Information) 정보로 객체를 가져오기 위한 메시지라고 보면 된다. lldb의 're r' 명령을 통해 레지스터의 값들을 확인할 수 있다.

얼핏 보아도 아래의 스크린샷의 메모리 공간은 인스턴스 객체의 메시지와 메서드의 메시지들을 몰아서 외부에서 참조할 수 있도록 나열한 것임을 알 수 있다.


3. objc_msgSend() 메서드의 시그너처가 선언된 곳에서 objc_msgSend 호출

lldb 디버거를 통해 ni 명령으로 objc_msgSend() 함수에 진입하면 메시지 전달 함수가 메모리 상에 상주해 있는 곳으로 이동 시킨다.


4. 컨텍스트(Context)에서 전달된 메시지를 순회하여 검색/실행

전달되는 메시지를 통해 인스턴스의 메타데이터를 사용하여 실제로 객체를 가져오게 된다. 아래의 네모난 상자의 명령들이 바로 객체를 찾아오기 위한 루프(Loop)이다. 


5. 메시지에 의해 처리된 객체는 일부 캐싱하여 성능 향상을 꾀함

재미있는 점은 매번 메시지의 정보를 순회하면서 찾지 않고, 한번 찾은 정보는 별도로 캐싱 하고 있는 공간에서 검색하게 된다.


지금까지는 sidebar 인스턴스를 가져오기 위한 과정이었다. 이제 이 인스턴스 객체의 메서드를 호출하는 과정인데, objc_sendMsg()를 통해 메시지를 전달하여 찾은 메서드를 실행하게 된다.



Posted by 땡초 POWERUMC

댓글을 달아 주세요

SharePoint 데이터베이스로 부터 모든 문서를 백업 및 추출하기

개요

필자는 SharePoint 서버 제품을 이용해서 문서를 관리해 왔다. SharePoint를 이용하면 수 천개의 문서를 종류별로 분류하고 데이터베이스화할 수 있다. 문서의 종류와 문서의 내용도 인덱싱(indexing)되므로 문서 내용과 다양한 메타 데이터로 문서를 검색할 수 있다는 점 때문에 많은 문서를 쉽게 관리하고 검색할 수 있다는 장점이 있다.

SharePoint의 장점을 나열하지면 많겠지만, 모바일 트랜드 시대에서는 에버노트가 최고이지 쉽다. 필자의 에버노트와 DropBox는 땡전 한푼 안들이고 프리미엄 서비스를 받고 있는데, 필자가 문서를 사용하고 관리하는 패턴에선 SharePoint 보다는 에버노트DropBox 조합이 더 접근성이 좋고 사용하기도 편하다. 데스크탑은 물론이고 브라우저, 다양한 모바일 기기에서 에버노트 클리핑과 DropBox 동기화 등을 지원하기 때문이다.

그래서 이번에 필자가 가지고 있는 수 천개의 모든 문서를 이전하고자 SharePoint의 모든 파일을 추출해야 했다. 여기에서 여러 Site Collections/Sites/Doc Libs의 각각의 문서를 한 번에 추출하는 작업을 진행했다.

1. WSS_Content 데이터베이스 연결

원하는 툴을 이용해서 SharePoint가 사용하는 데이터베이스에 연결한다. SharePoint에 저장된 문서가 많을 수록 데이터베이스에 연결해야 하는 시간이 늘어난다. 그러므로 Timeout이 발생하지 않도록 주의해야 한다. 필자는 여기에서 SSMS(Sql Server Management Studio) 2012 버전을 사용했다.

2. 파일 추출하기

2.1. 데이터베이스 구성 변경 쿼리 실행

sp_configure 'show advanced options', 1;  
GO

RECONFIGURE;  
GO

sp_configure 'Ole Automation Procedures', 1;  
GO

RECONFIGURE;  
GO

2.2. 데이터베이스 추출 쿼리 실행

아래의 쿼리는 이 사이트의 링크[1]를 참고하였으나, 일부 오류가 발생하여 필자가 수정한 부분이 있으니 이점 참고하기 바란다.

그리고 SharePoint에 저장되는 파일들은 다양한 타입이 존재한다. 가령, 메타데이터의 Binary 파일, _private 폴더, *.aspx, 시스템에 필요한 파일 등 필자가 저장한 문서와 상관 없는 찌꺼기 들도 함께 저장이 된다.

파일의 다양한 플래그 값은 MSDN의 Document Store Type, Doc Flags 문서[2]를 참고 하면 된다.


  
[그림1] WSS_Content 데이터베이스의 모든 문서를 파일 시스템으로 추출한 결과 화면


USE WSS_CONTENT;  

DECLARE @PATH_PREFIX  NVARCHAR(1024);  
SET @PATH_PREFIX = 'C:\BACKUP\';  -- 이곳에 백업할 경로를 입력, 반드시 뒤에 '\' 문자 추가하셈'


--DECLARING THE CURSOR, THIS IS THE ITEMS YOU WANT TO RUN THE EXTRACTING ON  
DECLARE CURSOR_Images CURSOR FOR (SELECT Id FROM [dbo].[AllDocs])  

--DECLARE THE TYPE OF THE COLUMN YOU SELECTED ABOVE  
DECLARE @ImageID uniqueidentifier;  

--START THE CURSOR AND RUN THROUGH ALL THE ITEMS IN CURSOR_Images  
OPEN CURSOR_Images  
FETCH NEXT FROM CURSOR_Images INTO @ImageID  
WHILE (@@FETCH_STATUS <> -1)  
BEGIN  
  --DECLARE THE VARIABLE THAT WILL KEEP THE BINARY DATA  
  DECLARE @ImageData varbinary(MAX);  
  --SELECT THE BINARY DATA AND SET IT TO @ImageData.  THE BINARY DATA FOR ALLDOCS ARE LOCATED IN ALLDOCSTREAMS  
  --AND THE ID IS THE SAME AS IN ALLDOCS  
  SELECT @ImageData = (SELECT TOP 1 CONVERT(varbinary(MAX), Content, 1) FROM [dbo].[AllDocStreams] WHERE Id = @ImageID ORDER BY InternalVersion ASC);

  --GET THE LOCATION OF THE DIRECTORY THE FILES WAS SAVED IN AND CHANGE REPLACE THE / WITH \ TO BE USED IN FILESYSTEM  
  DECLARE @DIRPATH NVARCHAR(MAX);  
  SET @DIRPATH = REPLACE((SELECT  DirName FROM [dbo].[AllDocs]  WHERE Id = @ImageID),'/','\');

  --SET THE PATH  
  DECLARE @Path nvarchar(1024);  
  --SELECT @Path = 'C:\Export\' + @DIRPATH + '\';  
  SELECT @Path = @PATH_PREFIX + @DIRPATH + '\';
-- '\

  --CREATE THE DIRECTORIES  
  EXEC master.dbo.xp_create_subdir @Path;

  --GET THE FILE NAME OF THE FILE FROM LEAFNAME  
  DECLARE @Filename NVARCHAR(1024);  
  DECLARE @DocFlags INT;  
  DECLARE @Type     TINYINT;  
  SELECT @Filename = (SELECT LeafName FROM [dbo].[AllDocs] WHERE id = @ImageID);  
  SELECT @DocFlags = (SELECT DocFlags FROM [dbo].[AllDocs] WHERE id = @ImageID);  
  SELECT @Type     = (SELECT [Type]    FROM [dbo].[AllDocs] WHERE id = @ImageID);

  -- 폴더를 0바이트 파일로 생성하므로 파일이 아닌 경우 파일 저장 루틴 진입 금지  
  IF (@Type = 1 AND @DocFlags = 0) OR (@DocFlags & 0x100) <> 0x100 BEGIN  
CONTINUE;  
  END   
  ELSE BEGIN

  --SET THE FULL PATH FOR WHERE THE FILES WILL BE STORED  
  DECLARE @FullPathToOutputFile NVARCHAR(2048);  
  SELECT @FullPathToOutputFile = @Path + '\' + @Filename;

  --SAVE THE FILE TO THE FILE SYSTEM  -'
  DECLARE @ObjectToken INT  
  EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT;  
  EXEC sp_OASetProperty @ObjectToken, 'TYPE', 1;  
  EXEC sp_OAMethod @ObjectToken, 'OPEN';  
  EXEC sp_OAMethod @ObjectToken, 'WRITE', NULL, @ImageData;  
  EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FullPathToOutputFile, 2;  
  EXEC sp_OAMethod @ObjectToken, 'Close';  
  EXEC sp_OADestroy @ObjectToken;

  END

  --LOOP TO THE NEXT ENTRY IN THE CURSOR  
  FETCH NEXT FROM CURSOR_Images INTO @ImageID  
END  
CLOSE CURSOR_Images  
DEALLOCATE CURSOR_Images  

2.3. 참고 사항

위의 쿼리는 다양한 메타데이터와 시스템 파일(*.aspx, _private 등..)을 모두 저장한다. 이런 쓰레기 데이터를 파일로 저장하지 않길 원한다면 아래의 쿼리를 이용해서 조건절을 추가해 주면 된다.

각각의 플래그 값의 의미는 Document Store Type 문서를 참고하면 된다. 그러면 여러분이 원하는 데이터만 파일 시스템으로 추출하여 저장하도록 커스터마이징이 될 것이다.

SELECT LeafName, DocFlags  
  FROM [dbo].[AllDocs]  
 WHERE (DocFlags & 0x100) = 0x100
   AND (DocFlags & 0xFFFF0000) <> 0xFFFF0000
   AND (DocFlags & 0x80) <> 0x80
   AND (DocFlags & 0x10) <> 0x10
   AND (DocFlags & 0x8) <> 0x8  

결론

만약 SharePoint에 저장되었던 많은 파일 또는 데이터를 전혀 다른 솔루션으로 이전하고 싶은 경우가 있다. SharePoint는 Microsft SQL Server 데이터베이스에 바이너리를 저장하는데 파일 시스템을 단일 데이터베이스에 저장한다는 것이 좀 아이러니 한 구조이다.

많은 기업내 담당자들의 SharePoint에 대한 피드백을 물어보면 빠지지 않는 것은 ‘느리다’ 라는 것인데, 기하급수적으로 늘어나는 데이터베이스 용량과 웹 응용 프로그램의 SPSites/DocLibs 등이 생성되면서 시간이 지날 수록 점점 느려지는 것은 어쩔 수 없는 구조인 듯 하다. 더불어 SharePoint는 과거의 아키텍처가 현재까지도 트랜드의 변화에 대응되지 못하고 전반적으로 과거와 동일한 아키텍처에 새로운 기능만 계속 붙여나가다 보니 솔루션 자체의 구조적인 면에서 악순환이 되풀이 되는 형세이다.

하지만, 이 아티클을 통해 SharePoint 데이터베이스에서 직접 파일을 추출하여 파일 시스템으로 저장할 수 있다. 이 방법을 통해 추출된 다량의 파일을 다른 솔루션으로 옮기거나 업로드하면 끝이다.


Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 억사마 2014.02.03 18:00 신고 Address Modify/Delete Reply

    안녕하세요~ 연락처가 어디 없으셔서 이렇게 댓글 남깁니다. SharePoint를 파일시스템에 백업을 받아야하는 급박한 회사업무가 생겼습니다. 좀 도움을 얻을수 있을까요? 부탁드리겠습니다. 혹시 몰라 제 이메일 주소를 남깁니다. e.joe@samsung.com 연락 부탁드리겠습니다. 감사합니다.

  2. 2014.02.03 18:14 Address Modify/Delete Reply

    비밀댓글입니다

MonoDevelop 한글판이 곧 업데이트 됩니다.

다운로드 : http://monodevelop.co.kr

MonoDevelop 통합 개발툴의 한글화를 위해 Github에 Pull Request로 게시하였고, 몇 일 후 특별한 문제 없이 MonoDevelop Master 브랜치에 병합이 완료 되었습니다.

[Ide] Translate to Korean language

차후 공식적인 배포에 의해 Xamarin Studio, MonoDevelop, MonoDevelop for Unity 와 같은 개발툴에서 한글 버전을 만나뵐 수 있을 것 같네요.

GitHub MonoDevelop Korean Repository

오탈자 및 버그 신고

Xamarin의 공식적인 버그 신고는 https://bugzilla.xamarin.com/ 에서 신고할 수 있습니다. 다만, 한글 번역과 관련된 버그를 처리해 줄지 모르겠네요.

  1. http://monodevelop.co.kr/ 에서 신고해 주시거나

    또는

  2. GitHub MonoDevelop Korean Repository 에 신고해 주시거나

    또는

  3. 직접 MonoDevelop Repository 에서 Fork 하셔서 작업하시면 됩니다.


Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 컴포지트 2013.08.05 09:09 Address Modify/Delete Reply

    군말없이 merge 시켜주다니..ㅋㅋ
    노고에 감사드립니다.

  2. hellojin 2014.02.11 17:33 Address Modify/Delete Reply

    맥용 xamarin studio 를 사용하려하는데. 한글을 입력하면. 그냥 죽어버리는 군요.. 그래서. 한글화 된걸 사용해보고 싶은데.. 어떻게 해야되는지 통 감이 안오네요.. 어떻게 해야되는지 좀 알려주세요..~ 부탁드립니다.

    • 땡초 POWERUMC 2014.02.12 09:23 신고 Address Modify/Delete

      오 그래요?
      저는 같은 맥에서 죽지 않고 잘 써지는데요...

      기본 내장 외 한글 입력기를 쓴다거나 다른 이유가 있을 것 같은데,
      덤프를 떠주시면 제가 한번 봐 드리겠습니다.

  3. oiziee 2014.03.07 18:07 Address Modify/Delete Reply

    안녕하세요 위에 링크가 죽어있네요
    한글버전을 꼭 구하고 싶은데
    한글버전을 보내주실수 있으신가요?
    부탁드립니다
    pijunyel@naver.com

    • 땡초 POWERUMC 2014.03.07 18:24 신고 Address Modify/Delete

      한글버전은 Xamarin Studio에 함께 배포 되고 있습니다.
      아래의 링크에서 받으시고,
      환경 설정의 Language에 'Korean' 으로 변경해 주시면 됩니다.

      http://xamarin.com/download

  4. 지나가던이 2014.08.05 10:24 Address Modify/Delete Reply

    한글 버전 주석은 너무나도 감사드립니다.
    하지만, 버그가 있더군요... 조금 아쉽습니다.

    '아'를 입력할경우 '아'를 입력한 후에도 한번 더 무언가를 입력해주어야만 해결되는 현상이 있습니다.

    더 좋은 버전 기대하겠습니다.

  5. TeemoSoft 2015.01.07 01:37 신고 Address Modify/Delete Reply

    안녕하세요 맥에서 유니티 모노디벨롭 을 사용중인데 http://monodevelop.co.kr에서 받아서 사용해보니
    Assembly-UnityScript 로드 실패
    Assembly-UnityScript-firstpass 로드 실패

    이렇게 뜨네요 작업하는데는 큰 문제는 없지만 어딜 고치면 될까요?

MonoDevelop for Korean version..!

MonoDevelop은 ECMA 표준을 가장 완벽하게 구현한 Mono 플랫폼을 개발하기 위한 통합 개발 도구 입니다.

2011년경, Xamarin 기업에 인수합병 되면서 모바일에 강력하게 대응되는 플랫폼으로 한 단계 진화하였습니다. iOS, Android 외에 콘솔 게임 개발도 지원하게 되었습니다.

https://github.com/powerumc/monodevelop_korean

현재 진행 사항입니다.

  • POSIX에서 재정한 Gettext API에 대응되는 .po 한글화 작업이 거의 완료가 되었습니다.
  • 한글을 지원하기 위해 MonoDevelop 내부 코드가 변경되었습니다.
  • 한글화에 따른 알 수 없는 크래시가 발생하여 디버깅 중입니다.
  • 다음 주 중으로 안정성 테스트 및 한글화 품질 테스트를 진행할 예정입니다.
  • 테스트 이후 공식적인 배포 사이트를 개설할 예정이며,
  • Mono Community 에 제출될 예정입니다.

많은 응원과 기대 부탁 합니다.

진행중인 MonoDevelop (Xamarin Studio) 스크린 샷




Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 김영환 2013.07.25 14:54 Address Modify/Delete Reply

    앗!!!!

    감사합니다.
    화이팅!!!

  2. 컴포지트 2013.07.25 17:01 Address Modify/Delete Reply

    일본어와 중국어 번역은 이미 끝났는데 오늘 한글화 소식을 들으니 이런 꿀같은 소식이!
    정말 감사합니다.

    근데 이툴이 한글 깨져요. 맥이나 리눅스나 둘다 한글 깨져요..
    이건 어떻게 해결 됐나요?

  3. 컴포지트 2013.07.26 18:19 Address Modify/Delete Reply

    인코딩 어떻게 지정하던 한글 입력이 안됩니다. 출력도 문제고 입력조차 어려운 실정입니다. 아예 이스케이프 해야지 됩니다..

    • 엄준일 2013.07.27 00:24 Address Modify/Delete

      한글 입력이 깨진다는게
      입력할 때 'ㅎㅏㄴㄱㅡㄹ' 이렇게 입력 되는 것을 말씀하시는 거죠?

  4. kmshts 2013.07.31 01:06 Address Modify/Delete Reply

    저도 이파일을 받아봤음좋겠는데 어디서 받아볼수있습니까? po파일만

    • 엄준일 2013.07.31 04:19 Address Modify/Delete

      Github에서 monodevelop_korean 브랜치에 있습니다.
      https://github.com/powerumc/monodevelop_korean/tree/monodevelop_korean

      위의 링크 파일 4개 중에 하나예요.

JS-Lambda 자바스크립트 라이브러리를 공개합니다.


JavaScript Array Extensions 자바스크립트 오픈 소스를 개발한 데 이어 JS-LambdaLGPL 라이센스로 공개합니다.

JavaScript 에서 람다 표현식(Lambda Expression)을 사용할 수 있도록 만든 라이브러리 입니다. 자세한 내용은 아래의 소스 코드를 참고 하시면 됩니다.

Github: https://github.com/powerumc/js-lambda

JS Lambda

  • It is possible lambda expression that can be used JavaScript.
  • you just got a function F();

Simple Examples

// Before  
function func(a,b) {
    return a + b;
}  
console.info( func(4,6) );


// ** After with JS-Lambda **  
var func = F("a,b => a + b");  
console.info( func(4,6) );  

// Result  
10

Or you can invoke directly

// Before  
function anonymousMethod(a,b) {
    return a + b;
}  
console.info( anonymousMethod(4,6) );  

// ** After with JS-Lambda **  
console.info( F("a,b => a + b")(4,6) );  

// Result  
10

Callback Examples

// Before  
function callback( func ) {
    if( func ) func();
}  

callback( function() { console.info('My name is Junil Um'); } );  

// ** After with JS-Lambda **  
callback(  F("() => console.info('My name is Junil Um');")  );  

// Result  
My name is Junil Um  

With jQuery

// Before  
var li = $("item li");  

li.each( function(i, o) {
    $(o).addClass("some");
} );


// ** After with JS-Lambda **  
var li = $("item li");  

li.each( F("(i, o) => $(o).addClass('some');") );  


Posted by 땡초 POWERUMC

댓글을 달아 주세요

VSGesture for Visual Studio 2013 Preview 배포 완료

Visual Studio 2013 Preview 버전 배포 완료

기능적으로 향상된 것은 없습니다. 이번 버전의 Visual Studio 2013의 Extension Schema가 골때리게 바껴서 ;;

Visual Studio 2013의 Tools -> Extension Manager 에서 다운로드 받으실 수 있습니다. (검색: vsgesture)

Download : http://visualstudiogallery.msdn.microsoft.com/e03c91ff-e20d–4dcc–822b–172a68c40f5b

  • Version 12.0 [2013/07/17]
    Support Visual Studio 2013 Preview

  • Version 11.11 [2012/03/01]
    Modified wrong display texts.

  • Version 11.1
    Resolved compativility bug between VS2012 and VS2010.

  • Version 11.0
    Support Visual Studio 2012, 2010

VSGesture shipped for Github. https://github.com/powerumc/vsgesture
VSGesture for VS2012, VS2010 is now available for download.
http://blog.powerumc.kr/305

VSGesture can execute command via mouse gestures within Visual Studio.
If you have any feedback, please send me an email to powerumc at gmail.com.

Visual Studio 2005, 2008 version : http://visualstudiogallery.msdn.microsoft.com/en-us/F5007932–0720–492B–8A51–631D5265F6B7




Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 설치가 안됩니다 2013.09.04 22:37 Address Modify/Delete Reply

    안녕하세요
    확장 관리자를 통해서 다운 받을려고 하는데,
    종속성 경고 - 다음 참조가 있어야 설치를 계속 할 수 있습니다. - Visual studio MPF 라는 팝업창이 뜨면서 설치가 안됩니다. 이거 어떻게 해야 하나요?

    참고로 윈도우7 64bit, visual studio 2010사용하고 있습니다.

[퀴즈] 프로그래머를 위한 문제 #3

요즘 퀴즈를 풀다보니 재미가 들렸나, 필자가 문제를 하나 내보려고 한다. 어려울 수도, 그렇지 않을 수도 있는 문제이며, 효율적인 코드를 작성하는 것 보다 최대한 짧게 짜는 것이 목적이다.

문제의 유형과 정답의 유형은 지난 문제를 참고하면 된다.

미로 찾기 게임

문제는 미로 찾기 게임이다.

  1. 10 x 6 (가로, 세로) 크기에 * 문자가 채워진 직사각형
  2. 미로의 크기가 변해도 실행 가능해야 한다.
  3. 문자 S 는 입구 위치, 문자 E는 출구 위치이다.
  4. S 문자와 E 문자 사이에는 공백으로 연결된 길이 있고, 길은 여러 갈래일 수 있다.
  5. 길(공백)은 2x2(가로, 세로) 이상의 공간을 가질 수 없다.
  6. 미로 찾기를 시작하는 함수가 호출되기 이전의 초기화를 위한 코드는 코드 길이에서 제외된다.
  7. 코드 길이는 최대한 짧게 작성한다. (알고리즘 효율성은 측정 안함)
  8. 개발 언어는 무관, 언어별로 가장 짧게 작성한 코드가 우승(?)



미로 찾기 게임 예제 코드

// 아래의 변수의 초기화는 코드 길이에서 제외된다.  
map = """  
**********  
** **    E
*   * ****
* * * *  *
* *    * *
S ****   *  
**********"""

y = map.indexof("S") / maxX
x = map.indexof("S") % maxX  

// 아래 코드 부터 코드 길이를 잰다. 개행 문제는 코드 길이에서 제외  
void explore(x,y)
{
    // ...생략...
}  

정답

아래는 필자가 작성한 코드이다. 짧게 작성하는 방법은 여러 가지이므로 혹시 여러분들께서 C++ 또는 자바스크립트, C# 등으로 작성하신 코드는 댓글로 달아주세요.

Python( 파이썬 )

아래 주석의 begin code/end code 사이의 문자는 총 273 문자. 방향에 대한 가중치를 주면 훨씬 빠르게 길을 찾을 수 있지만, 여기에선 구현을 제외했다.

#123456789
m = """  
**********  
** **    E
*   * ****
* * * *  *
* *    * *
S ****   *  
**********"""

X = m.index("\n", 1) - 1
Y = m.count("\n") - 1
m = m.replace("\n", "")  

(y, x) = divmod(m.index("S"), X)  

### 총 273 바이트 ###  
########### begin code ############  
def E(x,y,a):  
 n=m[x+(y*10)]  
 if n=="*"or x<0 or x>X or y<0 or y>Y:return None

 # print "%d, %d" % (x, y)  
 if n=="E": print("END");quit()

 while a!=2 and E(x+1,y,1)!=None:pass  
 while a!=1 and E(x-1,y,2)!=None:pass  
 while a!=8 and E(x,y+1,4)!=None:pass  
 while a!=4 and E(x,y-1,8)!=None:pass  

E(x,y,0)  
############# end code ##############


## 실행 결과 ##  
0, 5  
1, 5  
1, 4  
1, 3  
1, 2  
2, 2  
3, 2  
3, 3  
3, 4  
4, 4  
5, 4  
6, 4  
6, 5  
7, 5  
8, 5  
8, 4  
8, 3  
7, 3  
5, 3  
5, 2  
5, 1  
6, 1  
7, 1  
8, 1  
9, 1  
END  


Posted by 땡초 POWERUMC

댓글을 달아 주세요

프로그래머를 위한 문제

프로그래머라면 알쏭달쏭한 논리적인 문제를 좋아하는 편인 것 같다. 답이 팍~ 나오는 문제보다 역량에 따라 코드의 아름다움이 달라지는 것을 추구하는 프로그래머라면 더욱 그렇다.

문제: 1부터 1만까지 8은 모두 몇 개가 나오나?

문제는 쉽다. 1부터 1만까지 8이라는 문자 개수만 카운팅하면 된다. 그런데 이렇게 간단한 문제를 코딩해 놓고 보면 맘에 안든다. 더 짧게…. 아래의 문제를 각 언어별로 풀어보았는데, 바이트 수는 캐러지 리턴(carriage return) 문자를 모두 제거한 바이트 수이다.

참고로, 이 문제는 ‘닷넷(.NET) 프로그래머 모임’ 에서 처음 본 문제인데, 오래 전의 일이라 게시글의 링크를 도저히 찾기가 힘들어서 링크를 남기지 못했다.

여러분 중 문제를 풀어보려고 한다면, 바로 아래에 답이 있으니 브라우저를 먼저 종료하길 바란다.

파이썬(python)

파이썬을 배운지 얼마 안되던 때에 이 문제를 만나서 파이썬으로 풀어보았다. 누가 짜도 최종적으로 아래의 코드가 될거다. 처음에는 이렇게 짧게 가능한 파이썬이 맘에 안들었지만, 이제는 맘에 든다. ㅋ;

더 이상은 짧게 안되지 싶다.

# 총 38 바이트   
(str(list(range(1,10001))).count('8'))  

C#

C# 코드로 짜면 아래처럼 된다. 아래의 코드는 확장 메서드와 람다 표현식이 전부다.

혹시나 요걸 비트 연산으로 풀어봤는데, 아래 코드보다 길어지더라. 뭐 내가 짠 코드라 길어질 수도 있겠다.

// 총 84 바이트  
Console.WriteLine(Enumerable.Range(1,10000).Sum(o=>o.ToString().Count(n=>n=='8')));   

Java

Java 8 정식이 나오면 Lambda 지원. 다만 C#의 확장 메서드를 언어상 지원하지 않으므로 Where, Select, Take, Skip 과 같은 확장 메서드는 사용하지 못할 것 같다. 어쨋든 Java 로 이 문제를 짧게 풀수 있는 경쟁력이 없으므로 패스!

C++ Update - 2013-07-04

C++에 대해 조예가 깊지 않아서 내 머리로는 더 짧게 안된다. 이 코드는 위의 파이썬과 C#과는 알고리즘(?)이 좀 틀리다. 어쩔 수 없다. 짧게 하려면…

// 총 146 바이트  
vector<int> v(10000);  
auto n=1,s=0;  
generate(v.begin(),v.end(),[&n, &s](){  
auto m=to_string(n);  
s+=count(m.begin(),m.end(),'8');  
return n++;});  
cout<<s;

아래 댓글에 더 짧은 C++ 코드를 올려주신 HATENA [링크] 님께서 올려주신 코드 입니다. Update - 2013-07-04

// 총 94 바이트
int c=0;
for(int i=1;i<10001;i++){
auto s=to_string(i);
c+=count(s.begin(),s.end();'8');}
cout<<c;

JavaScript - Update 2013-07-03

본 코드는 아래 댓글의 ddd 님께서 작성하신 자바스크립트 코드 입니다.

// 총 94 바이트  
var a=[];
for (var i=1;i<10001;i++)
a[i]=i;
console.info(a.join("").replace(/[^8]/gi,"").length);
Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 황정현 2013.07.02 09:33 Address Modify/Delete Reply

    예전에 자바스크립트로 한번 풀어봤었네요... 근데 너무 길어요...
    for(var i = 0, len = 10000, count = 0, tmp = ""; i < len; i++){
    var arr = [];
    tmp = (""+i);
    for (var j = 1, len2 = tmp.length; j <= len2; j++)
    {
    arr[j] = tmp.substring((j - 1), j);
    if(arr[j].indexOf("8";) > -1) count++;
    }
    }
    console.log(count);

  2. ddd 2013.07.03 17:53 Address Modify/Delete Reply

    javascript 는 이정도 면 될듯한데
    var a = [];
    for (var i = 1; i < 10001; i++)
    a[i] = i;
    alert(a.join("";).replace(/[^8]/gi, "";).length);

    javascript 는 반복문 안쓸수 없나요 ㄷㄷ

    • 엄준일 2013.07.04 10:28 Address Modify/Delete

      댓글로 적어주신 소스 코드를 제 포스트에 업데이트 했습니다.
      ddd 님 사이트 링크를 남기고 싶었는데,
      링크가 없어서 아쉽네요 ㅠ

  3. HATENA 2013.07.04 11:27 Address Modify/Delete Reply

    항상 블로그 잘 보고 갑니다.
    C++은 vector, generate 안써도 쉽게 풀릴거같은데요 ㅎㅎ.

    int c=0;
    for(int i=1;i<10001;i++){
    auto s=to_string(i);
    c+=count(s.begin(),s.end();'8');}
    cout<<c;

    요거면 100byte 이내로 끝날거같습니다.
    파이선 코드길이 ㅎㄷㄷ하내요 ㄷㄷㄷ

  4. java론 2014.01.07 15:46 Address Modify/Delete Reply

    자바로는 아래처럼....
    int a=0;
    for(int i=0;i<10001;i++) {
    a+=(""+i).replaceAll("[^8]","";).length();
    }

  5. 김인혜 2014.04.06 03:56 Address Modify/Delete Reply

    마이너한 스크립트 언어입니다.
    AutoHotkey

    Loop 10000
    _ .= A_Index
    Msgbox % RegExReplace( _, "8", "", @ ) ? @ :

  6. 지나가다 2015.12.15 15:03 Address Modify/Delete Reply

    만들고 나니 위분거랑 같네요 ㅡㅡ;
    int result = 0;
    for (int i=0; i<=10001; i++) {
    result += String.valueOf(i).replaceAll("[^8]", "";).length();
    }
    return result;

  7. 행인 2016.11.20 15:28 Address Modify/Delete Reply

    Acm 문제에서 간간히 등장하는 유형이네요.
    그 당시 풀때 속도 문제 때문에 reject떠서 수학적으로
    규칙을 찾아서 accept 받았던 기억이 나네요

  8. 재밌네요 2016.11.29 16:02 Address Modify/Delete Reply

    Javascript 좀더 짧게~
    --------------------------------------
    var i,s,r; for (i = 1; i < 10001; i++) s += '' + i; r = s.split('8').length-1;
    console.log(r);

Javascript Array Extensions

Array Extensions는 Node.js 와 브라우저에서 사용할 수 있는 배열 라이브러리이다.

요즘 자바스크립트(JavaScript) 를 만지는 날이 많아져서 JavaScript 로 뭘 만들 수 있을까 하는 생각에 기억을 더듬어 보니 JavaScript 에서 배열을 다루는 일이 많았다. jQuery의 selector 등으로 DOM을 다루는데 효과적이지만, 배열을 다룰 때는 모라는 점이 많았다.

인터넷에 찾아보면 자바스크립트(JavaScript)로 배열을 다루는 오픈 소스를 발견하였다. 그 중 가장 호감이 가는 자바스크립트(JavaScript) 오픈 소스를 발견하였다. 자바스크립트로 C#과 가장 비슷하게 Enumerable과 LINQ를 구현한 자바스크립트다.

사실, 필자가 만들고 싶었던 디자인이 linq.js와 비슷했지만, 역시나 이미 나와있으므로 좀 더 Lightweight 하게 쓰도록 만들어 보았다. 요 몇일 3~4일 동안 틈틈히 만들었고, 더 큰 디자인으로 갈 생각은 없다.

완성도를 좀 더 높이면 npm, nuget 등에서 패키지로 배포할 예정이다.

설치하기

Nuget

PM> Install-Package JS.Array.Extensions

Node.JS

$ npm install js-array-extensions

required('js-array-extensions');

from Github

Array Extensions는 Github를 통해 배포하고 있다.

https://github.com/powerumc/array-extensions

git 를 이용하여 다음과 같이 소스 코드를 받을 수 있다. 소스 코드를 받을 디렉토리로 이동한 후 다음의 명령을 실행하면 된다.

git init  
git clone https://github.com/powerumc/array-extensions.git  

사용 방법은 매우 간단하다. README.md 에 포함한 예제 하나만 보면 쉽게 이해할 수 있을 거라 생각한다.

var arr = Array.range(1, 10)
               .select(function(i) { return { number:i, name:"POWERUMC " + i } })
               .where(function(o) { return o.number >= 5 })
               .take(3);  

// results var arr  
POWERUMC 5  
POWERUMC 6  
POWERUMC 7  

현재까지 지원하는 Array Methods 는 십여가지가 넘지만 부족한 것 같아서 좀 더 보강할 계획이다. 함께 코드를 개선하실 분은 Fork 하셔서 작업 후에 저에게 알려주시면 됩니다.

  • any
  • first
  • firstOrDefault
  • firstOrNew
  • last
  • lastOrDefault
  • lastOrNew
  • where
  • select
  • foreach
  • orderBy
  • take
  • skip
  • sum
  • average
  • range and Array.range
  • union
  • clone

image-1

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 황정현 2013.06.17 17:51 Address Modify/Delete Reply

    자바스크립트 학습용으로도 좋네요. ^^


필자는 최근 자바스크립트(Javascript)를 자주 만지게 되면서 몇 가지 팁 또는 가이드 정보를 공유하고자 한다. 자바스크립트(Javascript)를 좋아하지만 잘 하지는 못한다. 그래서 먼저 개념적으로 잘못된 부분이 있으면 정중하게 미리 양해를 구하고자 한다.

1. 익명의 즉시 실행 함수로 스크립트를 시작하자

익명(Anonymous)의 즉시 실행 함수(Immediately Invoked Function Expression)는 다음의 코드와 같이 정의된다.

(function() {
       // ... 코드 생략 ...  
}());  

익명 함수(Anonymous Function)는 자바스크립트(Javascript)가 런타임(Runtime)에 구문을 해석하여 실행한다. 이는 외부의 접근을 제한함을 의미한다. 그러므로 외부 코드에서 익명 함수의 내부 코드를 임의적이나 악의적으로 수정할 수 없다.

즉시 실행 함수(Immediately Invoked Function Expression)는 선언과 동시에 실행이 된다. 익명 함수가 런타임에 사용될 준비가 되면 즉시 함수의 초기화 코드를 실행할 수 있기 때문이다. 예를 들어, 아래와 같은 코드는 악의적으로 전역 변수의 영향을 받지 않도록 함수(Function) 을 보호할 수 있다.

만약 익명 함수에 정의된 undefined 매개 변수에 진짜 undefined 가 전달되기를 기대하는 경우가 있는데, 즉시 실행 함수(Immediately Invoked Function Expression) 중간에 undefined = true 에 의해 원하는 결과를 얻을 수 없게 된다.

var undefined = true;  

(function(undefined) {
   console.info(undefined);
   console.info(undefined === true);  
})(undefined)  

// 실행 결과  
true  
true  

만약, 외부 코드에 의해 undefined 가 완벽하게 변경되길 바라지 않는 경우 다음과 같이 undefined 가 반환되는 결과를 매개변수로 사용하여 외부 코드에 의한 원치 않는 결과의 충격에서 보호할 수 있게 된다.

var undefined = true;  

(function(undefined) {  

console.info(undefined);  
console.info(undefined === true);  

})( function() {}() );  

// 실행 결과  
undefined  
false  

2. 모듈화 패턴은 한 가지만 사용하라

Javascript 를 모듈화하기 위한 패턴은 여러 가지 방법이 있다. 그런데 여러 패턴을 섞어 사용하다 보면 코드를 보기가 더 난해해 진다. 때문에 필자는 private과 public 접근 제한 방법을 제공하는 모듈 패턴(Module Pattern)을 주로 사용한다. [1]

이 외에도 효과적인 패턴들이 많이 존재하므로 적당한 패턴을 선정하여 모두가 함께 같은 패턴으로 사용하는 것이 현명할 것 같다.

var umc = umc || (function() {

    var privateFunction1 = function() {
        // ... 생략 ...
        return true;
    };

    return {
      "version"   : "3.0.0.0",
      "name"      : "Umc.Core Frameworks",
      "getObject" : function() {
          var result = (privateFunction1() ? "POWERUMC" : "HTTP://BLOG.POWERUMC.KR");
          return result;
      }  
};
})();  

console.info( umc.version );    // 결과 : 3.0.0.0  
console.info( umc.name );      // 결과 : Umc.Core Frameworks  
console.info( umc.getObject() );    // 결과 : POWERUMC     
console.info( umc.privateFunction1() );    // 오류  

[코드1] Self-Contained 모듈화 패턴

var umc = umc || (function() {  

   var _version = "3.0.0.0";
   var _name = "POWERUMC";
   var _getObject = function() { /* 코드 생략 };

   return {
      "version"   : _version,
      "name"      : _name,
      "getObject" : _getObject
   }  
})();  

[코드2] Imports 모듈화 패턴

var umc = umc || (function() {  

   var module = { };

   var _version = "3.0.0.0";
   var _name = "POWERUMC";
   var _getObject = function() { /* 코드 생략 };

   module.version = _version;
   module.name = _name;
   module.getObject = _getObject;

   return module;  
})();  

[코드3] Exports 모듈화 패턴

모듈 패턴(Module Pattern)을 정의하는 방법은 몇 가지가 있다.

  1. Self-Contained
    바로 위의 예시로 제시한 코드가 바로 Self-Contained 인데, public 함수를 직접 구현하는 방법이다.

  2. Imports-mixin
    아래와 같은 코드가 Imports 하는 방법으로 정의하는 모듈 패턴(Module) 패턴이다. 코드는 return 코드 부분만 보면 된다.

    1번과 2번의 경우는 함수가 익명(Anonymous) 함수로 정의 된다.

  3. Exports
    아래와 같은 코드는 module 을 외부로 공개하여 쉽게 확장이 가능하도록 한다.

3. 함수의 매개변수는 맨 먼저 초기화 하라

자바스크립트(Javascript)는 매우 관대하다. ‘오래 꽥꽥(Duck Typing)’은 동적 언어(Dynamic Languages)의 가장 큰 매력이라고 할 수 있다. 혹시라도 강아지가 ‘꽥꽥’ 거리면 자바스크립트는 강아지를 오리로 취급한다.

정의되지 않은 변수나 매개변수(Arguments), 아래의 코드 처럼 write("ERROR"); 와 같이 매개 변수의 개수가 맞지 않아도 너그럽게 실행이 된다. 하지만 코드에 정의되지 않은 undefined에 의해 실행은 얼마든지 오동작이 가능하므로, 가능하면 매개변수는 항상 올바르게 넘겨주지 않는다는 가정하에 작성하는 것이 좋다.

만약, message = message || "-";과 같이 초기화 또는 방어 코드가 없다면 로그는 ''Sun Jun 02 2013 13:05:38 GMT+0900 (KST) : ERROR / undefined 와 같은 결과를 보여준다.

var write = function(category, message) {

    category = category || "INFO";
    message  = message  || "-";

    var date = new Date();;

    console.info( date + " : " + category + " / " + message );  
};

write("INFO", "시작 메시지");  
write("WARN", "경고 메시지");  
write("ERROR");  

// 실행 결과  
Sun Jun 02 2013 13:05:38 GMT+0900 (KST) : INFO / 시작 메시지  
Sun Jun 02 2013 13:05:38 GMT+0900 (KST) : WARN / 경고 메시지  
Sun Jun 02 2013 13:05:38 GMT+0900 (KST) : ERROR / -  

4. 매개변수가 있지만 없어도 동작하도록 해라

함수의 매개변수는 맨 먼저 초기화 하라’ 에서 본 write("ERROR"); 와 같이 매개 변수가 맞지 않아도 잘 동작하도록 방어적인 초기화 코드를 작성하였다.

하지만, write(); 의도적으로 호출을 할 경우 다음의 코드처럼 올바르게 로그 기록이 남지 않게 된다.

write("실행 종료");  

// 실행 결과  
Sun Jun 02 2013 13:14:01 GMT+0900 (KST) : 실행 종료 / -  

category 에 로그 형식이 전달되어야 하는데, 로그 메시지 ‘실행 종료’가 category 항목으로 초기화되어 엉뚱한 결과가 나오게 된다.

이런 경우는 좀 더 매개 변수가 전달되는 가능성을 좀 더 열어두어, 매개 변수의 개수에 따라 매개 변수를 직접 할당하도록 하는 아래의 코드와 같은 방법을 사용하면 된다.

var write = function(category, message) {

    category = category || "INFO";
    message  = message  || "-";

    if( arguments.length === 1 ) {
        message = category;
        category = "INFO";
    }

    var date = new Date();;
    console.info( date + " : " + category + " / " + message );
}  

write("INFO", "실행 시작");  
write("WARN", "실행 중 경고");  
write("실행 종료");  
write();  

// 실행 결과  
Sun Jun 02 2013 23:20:44 GMT+0900 (KST) : INFO / 실행 시작  
Sun Jun 02 2013 23:20:44 GMT+0900 (KST) : WARN / 실행 중 경고  
Sun Jun 02 2013 23:20:44 GMT+0900 (KST) : INFO / 실행 종료  
Sun Jun 02 2013 23:20:44 GMT+0900 (KST) : INFO / -  

5. 띄어쓰기 스타일(Intent Style)은 반드시 K&R Style 을 사용하자.

K&R 스타일은 전세계의 커뮤니티에 따라 다르지만, C, C++, C#, Java 등의 언어에서 사용된다고 한다. 참고로, 마이크로소프트(Microsoft)가 추천하는 띄어쓰기 스타일은 ‘Allman Style’ 이라고 부른다.

위키피디아(Wikipedia)에 따르면 K&R 스타일은 다음과 같은 유래가 있다고 한다.

The K&R style, so named because it was used in Kernighan and Ritchie’s book The C Programming Language, is commonly used in C. It is also used for C++, C#, and other curly brace programming languages.

K&R 스타일의 이름의 유래는 Kernighan씨와 Ritchie씨의 저술서 The C Programming Language의 C 코드에서 일반적으로 사용했다. 또한 C++, C#, 그리고 중괄호(curly brace)를 사용하는 프로그래밍 언어에서도 K&R 스타일을 사용한다.

자바스크립트(Javascript)는 K&R 스타일의 띄어쓰기 스타일을 사용한다.

필자는 자바스크립트에서 K&R 스타일을 추천하는 것이 아닌, 반드시 K&R 을 쓰는 것이 좋다고 믿는다. 다음의 코드를 보면 왜 K&R 스타일을 사용하는지 알 수 있다.

// K&R 띄어쓰기 스타일  
function getdata\_1() {  
return {
    name: "POWERUMC"  
};
}  

// Allman 뜨어쓰기 스타일  
function getdata\_2()
{  
return
{
    name: "POWERUMC";
}
}  

console.info("getdata_1() - " + getdata_1());  
console.info("getdata_2() - " + getdata_2());  

// 실행 결과  
getdata_1() - [object Object]     // 올바른 결과  
getdata_2() - undefined     // 올바르게 return 되지 않은 결과  

결론

이 외에도 몇 가지 더 있지만, 자바스크립트(Javascript) 내공을 좀 더 쌓은 후에 더 정확하게 쓰는 것이 낫겠다고 생각하여 5개의 팁 정도를 공유했다. 하지만, 예제로 제시한 코드에 대해 성능적인 면이나 익명 함수 또는 즉시 실행 함수 등의 메모리 누수 등에 대해서는 언급하지 않을 예정이다.

내용면으로 부족한 부분이 있겠지만, 이 정도의 팁과 가이드면 바로 현업에서 깔끔하고 잘 동작하는 자바스크립트(Javascript) 코드를 작성하기에는 전혀 문제가 없다고 생각한다.

디자인 패턴(Design Pattern) 부분에서 더 많은 정보를 얻길 원한다면, 필자의 언급한 ‘Learning JavaScript Design Patterns A book by Addy Osmani Volume 1.5.2’ 를 참고하기 바란다.


  1. Module Pattern 참고 : Learning JavaScript Design Patterns
    http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript  ↩


Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 2013.06.24 11:41 Address Modify/Delete Reply

    비밀댓글입니다

  2. 2015.05.22 23:56 Address Modify/Delete Reply

    비밀댓글입니다

    • 땡초 POWERUMC 2015.06.13 21:38 신고 Address Modify/Delete

      함수 안에 매개변수를 선언하는 것이 아닙니다.
      변수에 대입(assign) 하는 것이죠 ^^
      변수는 이미 함수 매개변수에 선언이 되어있으니까요.

  3. 2015.08.07 14:27 Address Modify/Delete Reply

    비밀댓글입니다

  4. 나그네 2017.09.15 13:13 Address Modify/Delete Reply

    [코드3] Exports 모듈화 패턴 에 name 오타가 있네요. 감사합니다

불완전한 통합, 모든 것을 만족할 수 있지만, 어느 것도 만족시킬 수 없다.

팀 파운데이션 서버(Team Foundation Server)는 모든 것을 통합한 마이크로소프트(Microsoft)의 ALM(Application Lifecycle Management) 솔루션이다.

통합… 모든 것을 만족할 수 있지만, 어느 것도 만족시킬 수 없다.이 통합이라는 것은 이 시대엔 단점으로 작용될 수도 있다는 생각이 든다. 지난 2005년부터 2010년까지 ‘통합’ 이라는 것이 장점이라고 생각했었다. 모든 것을 올인원(All in One) 해 놓았다는 것만으로 주목을 끌 수 있었지만, 2013년 최근에는 이제 더 이상 ‘통합’이 장점이 될 수 없다는 결론을 내렸다.


[이미지] 통합... 현실적인 통합과 이상적인 통합


(현실적인 통합?)
출처 : 이미지 링크

(이상적인 통합?)
출처 : 이미지 링크


필자는 비주얼 스튜디오 팀 시스템(Visual Studio Team System) 2005 버전부터 팀 파운데이션 서버(Team Foundation Server)를 사용해왔다. 필드에서는 이와 관련된 다수의 기업 컨설팅과 강의를 진행하였고, 그 외 레거시 개발 환경과 소스 컨트롤(Source Control)을 커스터마이징한 소프트웨어를 납품하는 등 대략 8년을 넘게 비주얼 스튜디오(Visual Studio)와 팀 파운데이션 서버(Team Foundation Server)와 동거동락하며 지냈다. 물론, 8년을 넘게 사용하면서 좋은 점도 많지만 그렇지 않은 점도 확실히 있다.

그 동안 한 가지 ALM 솔루션만 사용할 때는 미처 몰랐던 것들이 많았지만, 여러 가지 ALM 제품을 접하면서 ALM 솔루션 간에 장/단점을 필자의 기준에 좀 더 객관적으로 판단할 수 있는 계기가 되었다.

과거 ALM은 오픈 소스 진영을 중심으로 조금씩 발전해 왔다. SVN 소스 제어 컨트롤을 중심으로 각각 독립적인 유닛(Unit)으로 배포가 되고 플러그인 등을 활용하여 조금씩 연동을 할 수 있었다. 그런 와중에 마이크로소프트(Microsoft)는 개발툴과 ALM을 통합한 ‘팀 시스템(Team System)’ 발표하였고, 그 당시 여러 오픈 소스가 가진 것들을 한 곳에 통합하여 사용할 수 있었다. 이 때까지는 ‘통합’ 이라는 것 자체가 장점이던 시대이다.

하지만, 최근 ALM은 조직의 성숙도에 맞는 전문적인 ALM 툴을 사용하는 추세이다.

아쉽게도 팀 파운데이션 서버(Team Foundation Server)는 각각의 모든 기능들이 전문성을 갖추기에는 매우 부족한 것도 사실이다. ‘이슈 관리, 빌드, 소스 제어’, 아마도 딱 떠오르는 대표적인 벤더 및 오픈 소스들이 있을 것이다. 이슈 관리(Issue Managements), 빌드(Builds), 소스 제어(Source Control) 등, 타 벤더의 전문적인 툴과 비교하면 각각의 기능은 타 벤더에 비해 열악하다.

대표적인 ALM 벤더들과 차이가 나는 것은 마이크로소프트(Microsoft)의 팀 파운데이션 서버(Team Foundation Server)는 범용성을 추구하고, 전문적인 것들은 SDK(Software Development Kit)를 사용하여 커스터마이징을 하거나, 3rd party 벤더의 몫으로 남긴다. 대인배적인 모습이긴 하지만, 현재까지도 여전히 팀 파운데이션 서버(Team Foundation Server)를 중심으로 한 생태계가 형성되지 않았다는 것 또한 단점으로 작용한다.

필자는 최근 아틀라시안(Atlassian)의 ALM 제품에 매력을 느끼고 있다. 각각의 기능들이 매우 뛰어나고, 필요하다면 언제든지 필요한 기능의 소프트웨어와 통합이 가능하다. 설치부터 통합까지 매우 간단하다. 그리고 어떤 운영체제에서도 설치와 운영이 가능한 ‘크로스 플랫폼(Cross-Platform)’ 이라는 점은 팀이나 조직에서 선택의 폭이 넓고, 또 하나, 데이터베이스, 웹 서버 등 선택의 폭도 넓다. (반면, 팀 파운데이션 서버(Team Foundation Server)는 설치는 쉽지만 구성(Configuration)이 복잡하고 운영(Operation)에 더 많은 리소스가 필요하다)

그리하여 앞으로 필자는 여러 ALM 솔루션을 벤치 마킹하면서 ALM 솔루션들 간에 장단점 등을 비교/분석하여 함께 공유할 예정이다.

Posted by 땡초 POWERUMC

댓글을 달아 주세요

TV 프로에서 어떤 조사를 통해 재미있는 사실이 밝혀졌습니다.

페이스북 오래 하는 직원, 업무성과 더 높아

회사에서 페이스북... 대놓고 하기에도 그렇고, 숨어서 하기에도 그렇고...



맥에서 즐겨 사용하는 페이스북 알리미 프로그램이 Shareware로 자꾸 돈내라고 팝업이 뜬다.
$2.99 짜리 맥OS 앱인데, 결제를 하려다가 주말을 이용해 그냥 만들어 보기로 했습니다.

 

아직 초라한 0.1 버전이므로 감안하고 사용하길 바랄뿐입니다. ^^;
차후 업그레이드를 해야 하는 사명감이 좀 더 생기면 버전업을 할 예정입니다.

(Mac OS, Linux 배포 패키지가 완성되면 다운로드 링크에 추가하겠슴돠)


 

 

  Facebook Tray v0.1 

 

다운로드 링크 (SkyDrive)

https://skydrive.live.com/redir?resid=8B8DDD0D9FFC25E1!5800&authkey=!APgYk8Dtt5YV3r4

 

스크린 샷

 

 

지원 운영체제

  • Windows
  • Mac OS
  • Linux

 

특징

  • 트레이 아이콘에서 페이스북의 새로운 알람 개수 표시
  • 네트워크를 통한 페이스북 API 없이 실시간 알람
  • 모바일 화면의 페이스북 윈도우 제공
  • 외부 링크는 데스크탑 브라우저와 연결
  • 내부 링크는 FacebookTray 내부 브라우저와 연결
  • 여러 운영체제 지원


실행 방법

  • 윈도우
    기본 설치 경로인 윈도우 데스크탑에 FacebookTray 폴더의 FacebookTray.exe 를 실행
  • 맥 OS
    기본 설치 경로인 /Applications (응용프로그램)에서 FacebookTray.app 을 실행
  • 리눅스


설치되는 컴포넌트

  • 실행 파일
  • Qt Runtime (Qt Core/OpenGL/WebKit)
  • C++ 10.0 재배포(Redistributable) 패키지 (설치 안됨)
  • OpenSSL (설치 안됨)


Posted by 땡초 POWERUMC

댓글을 달아 주세요

부하테스트 이야기, 테스트 데이터 분석 문제 풀어보세요.

부하테스트 이야기

부하 테스트는 테스트 분류 상 '비기능 테스트'에 속하는 매우 정교한 테스트 중의 하나다. 부하 테스트는 수치화된 데이터를 통해 성능 지표를 도출한다. 대부분 부하 테스트는 클라이언트 응용 프로그램보다 서버 응용 프로그램에 주로 사용한다. 웹 서버나 통신과 관련된 서버, 그리고 데이터베이스가 대표적이다.

일반적으로 테스트라고 하면 '성공/실패'가 매우 명확하다. 그리고 '성공/실패'라는 결과에 대해 객관적으로 판단할 수 있고, 특별한 경우가 아니고서 '성공/실패'를 재연할 수 있는 시나리오를 가지고 있다.

반면 부하 테스트는 '성공/실패'는 경험적으로 판단해야 하며, 성공인지 실패인지에 대해 다른 사람과 의견이 일치하지 않는 경우가 대부분이다. 그래서 경험적으로 성공과 실패의 기준점을 정하곤 한다. 하지만 매번 성공/실패가 같은 결과를 내지 않으며, 환경적인 요건에 따라 얼마든지 결과가 뒤바뀔 수 있다. 실패한 테스트를 다시 수행 했을 때, 재연할 수도, 못할 수도 있는 있다. 결과적으로 테스트 대상의 환경적인 요건과 더불어 누가, 어떻게 테스트를 수행하였는지도 테스트 결과에 반영이 될 수 있다.

필자는 4년이 넘도록 현장에서 수많은 부하 테스트를 수행해왔다. 매우 재미있는 것은 어떤 서버 응용 프로그램도 성능 요건을 통과한 적이 단 한번도 없었다. 수 년 동안 문제 없이 잘 써왔다는 서버 응용 프로그램도 부하테스트를 통해 문제를 발견하고 더 나은 성능을 낼 수 있도록 개선된 사례들도 매우 많다.

숨겨진 많은 버그나 이슈들이 부하 테스트를 통해 여실히 드러난 것이다. 그로 인해 이전에 다니던 N모 게임사의 인프라는 부하테 스트로 성능 요건을 반드시 통과해야 라이브로 서비스할 수 있는 엄격한 규칙도 생겼다. 물론, 이 때에는 필자가 전담하여 테스트를 수행했었을 때였다.

부하 테스트라는 주제 하나 만으로도 책 한 권 정도의 분량이 넘을 것 같다. 그 만큼 현장에서 부하 테스트에 대한 오해도 많았으며, 개발자와 실무진 간의 성공/실패에 대한 이해관계, 테스트 데이터 분석, 또 이를 보고서화 및 시각화 하는 과정의 자동화 등 많은 재미있는 경험이다.

왜 부하 테스트가 중요할까? 그 이유는 아무것도 눈에 보이지 않기 때문이다. 문제가 있어도 금전적/물질적으로 어떠한 손해를 입었는지 조차 알 수 없다. 테스트를 통해 문제를 발견하지 않는 이상 아무런 문제가 되지 않는다. 그러므로 '비기능 테스트'인 부하 테스트 자체의 필요성 조차 느끼지 못할 것이라 생각한다. 하지만 전문적인 '비기능 테스트' 활동을 시작함과 동시에 많은 문제들을 발견할 수 있을 것이다.

재미로 풀어보는 부하테스트 분석 문제

부하 테스트는 테스트 활동 자체에 큰 의미를 부여할 수 있지만, 부하 테스트 데이터를 분석하는 것도 테스트를 수행하는 것 만큼이나 중요하다. 아니, 이 분석 과정이 더 중요한 경우도 많았다.

이 데이터들은 테스트 툴이 보여주는 성능 지표 뿐만 아니라, 디스크 IO와 네트워크 대역폭과 같은 하드웨어적인 측면과 쓰레드(Thread), 프로세스(Process) 등과 같은 운영체제와 소프트웨어적인 측면 모든 것을 분석해야 한다. 놓칠 수 있는 많은 데이터들이 문제나 이슈의 원인과 직결되는 경우도 있기 때문이다.

가령, 데이터베이스 서버의 병목의 원인을 규명하고자 할 때 대부분 많은 트랜잭션과 락(Lock)이 걸리는 이유일 것이다. 하지만 간혹 디스크 IO가 권장하는 임계치를 벗어난다면 병목의 원인을 구진 디스크로 밝혀질 수도 있기 때문이다.

필자가 재미있는 문제 하나 준비했다!

아래의 그림은 .NET WCF(Windows Communication Foundation)의 부하 테스트 결과이다. 딱 보고 '무엇이 문제인지' 원인을 안다면 당신은 충분히 멋진 개발자이다. 하지만 뚫어져라 쳐다봐도 문제점이 보이지 않는다면 기본기가 부족한 개발자인 스스로를 자책하기 바란다.

이 테스트 결과의 분석 결과는 무엇이 문제인지는 다음 아티클을 기대하기 바란다.

  • Smoke 테스트 결과

  • Stress 테스트 결과

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. shunman 2013.04.03 13:29 Address Modify/Delete Reply

    결과가 어떻게 나오는지 궁금하네요. 어서 다음 아티클 부탁드립니다 ㅋ

윈도우 8, 요즘 인기가 많다. 일반 사용자들의 후기도 많이 보이고, 더불어 개발자들에게도 기존의 개발 경험을 살려 그래도 개발이 가능해서 인기가 많다. 더불어 C++/CX와 HTML5로 개발이 가능하다.

   

WinRT와 WinMD

그 중에서 C#/XAML을 이용하여 앱을 개발할 경우 Windows 8 Runtime(WinRT)의 라이브러리를 이용하여 개발하게 되는데, 마이크로소프트에서는 이 WinRT를 관리 언어가(Managed 플랫폼 환경) 아닌 C++로 만들어진 네이티브(Native)로 컴파일 되어 있다. 확장된 COM 기반이기 때문에 C#과 HTML5에서 모두 이 라이브러리 APIs 집합을 사용할 수 있다. 이것은 매우 큰 장점이 분명하다.

그런데 말이다. 이 WinRT 자체가 매우 성급하게 만들어진 라이브러리라는 것이 여럿 보인다. 그 중 네이티브로 컴파일된 환경에서 C#과 유사하게 런타임상의 객체나 타입 정보를 알아내기 위해 RTTI(RunTime Type Identification)을 C++/CX 컴파일 시에 자동으로 구현이 된다. 그리고 RTTI를 위해 사용되는 WinRT의 API 정보의 일부는 .WinMD 파일로 저장이 된다. 이를 윈도우 런타임 라이브러리(Windows Runtime Library)라고 하며, 이 라이브러리는 윈도우 8 앱을 개발하는 환경 모두에서 사용할 수 있다.

   

   

   

   

윈도우8 WinRT, XAML의 미완성을 의미하는 IXamlMetadataProvider와 IXamlType 인터페이스

여기에서 문제가 발생한다. 모든 객체들은 C++/CX과 C#에서 XAML(eXtensible Application Markup Language)에서 다룰 수 있다. 그리고 Windows.UI.Xaml 네임스페이스에 XAML과 관련된 APIs 집합이 있다. 그런데 WinRT는 XAML을 핸들링 할 수 있는 라이브러리를 완벽하게 구현해 놓지 못했다.

그래서 WinRT의 IXamlMetadataProviderIXamlType 인터페이스가 생겼다. 이 인터페이스가 WinRT가 XAML을 (꽁수로) 핸들링하기 위해 만들어진 인터페이스로 보인다.

코드에서 새로운 객체를 생성해서 사용하고 싶으면 var obj = new LoginView(); 와 같이 새로운 객체를 생성하는 new 키워드를 사용하면 된다.

객체지향을 완벽하게 표현하는 XAML에서도 마찬가지다. XAML에서 다음처럼 LoginView 객체를 생성할 수 있다.

   

   

여기에서 IXamlMetadataProvider가 미완성 XAML임을 증명해 준다. 윈도우8 모던 앱(Modern App)에서 XAML에서 객체가 생성되는 경우 컴파일 시에 자동으로 생성되는 XamlMetadataProvider.g.cs 파일에서 객체를 생성해 준다. (g는 Generated를 의미한다). 자동으로 생성되는 이 코드는 다음과 같은 코드가 포함이 되어있다.   

   

XAML에서 LoginView 객체 생성을 요청할 경우 IXamlMetadataProvider를 구현한 코드를 통해 객체를 대신 생성한다. 다시 말해, 하드 코딩이 되어있다.   

이는 매우 유감이다. 이는 즉, 런타임상에 동적으로 생성되는 객체나 앱 컴파일 시에 해당 클래스가 포함이 되어 있지 않다면, XAML은 객체를 생성하지 못하게 된다. 동적인 무언가에 의해 생성되는 객체는 XAML에서 명시적으로 객체를 생성할 수 있는 방법이 없어진 것이다. (단, 명시적인 호출)

   

   

사용자가 구현하는 IXamlMetadataProvider

일단 WinRT가 이렇게 구현되어 있으니, 어쩔 수 없다. 동적으로 생성되는 객체에 대해서 XAML에서 명시적으로 객체를 생성하기 위해서는 Custom IXamlMetadataProvider를 구현해 주어야 한다.   

아래는 필자가 개발 중인 Umc.Core.WinRT.dll 에 포함된 Custom IXamlMetadataProvider이다. 윈도우8 모던 앱을 컴파일할 때 MSBuild는 참조되는 어셈블리의 메타데이터를 검색하여 IXamlMetadataProvider 인터페이스를 구현한 객체를 XamlMetadataProvider.g.cs 코드에 자동으로 추가를 해준다. 그리고 컴파일이 된다.

   

   

   

IXamlMetadataProvider가 필요한 경우의 예시

아마 일반적으로 윈도우8 앱을 개발할 때 이 인터페이스를 구현할 필요는 없다. 하지만, 앱을 캡슐화하려고 하고, IoC(Inversion of Control) Container 등을 활용하고자 하고, 동적인 객체가 필요한 경우라면 이 인터페이스를 구현해야 할 필요가 있을 것이다.   


C#이 지원하는 System.Dynamic.ExpandoObject 객체를 생성한다면 이 객체는 XAML에서 명시적으로 호출을 할 수 없다.   

또, System.Dynamic.DynamicObject 를 구현하는 객체도 마찬가지이다. 아래는 Umc.Core.WinRT에 포함된 코드의 일부이다.

   

위와 같은 코드를 이용하여 동적인 객체를 생성하였다면, 명시적으로 구현한 클래스가 없으므로 당연히 XAML에서도 이 객체를 생성할 수 없다.   

이와 같은 경우에 IXamlMetadataProvider를 구현하면 된다.

   


그 밖에 필요한 것들

아마 WinRT는 윈도우폰7 의 API 보다 더 작다. 작은 만큼 없는 것이 많고, 포기해야 하는 것이 많다. 아래에 나열되는 구현체는 http://umcore.codeplex.com 의 필자가 만든 코드를 WinRT용으로 마이그레이션한 것들이다. 조만간 Umc.Core.WinRT도 공개할 것을 약속한다.   

1. WinRT 설계 자체가 IoC Container를 활용하기 매우 너그럽지 못한 구조이다. 그래서 기본적인 WinRT 구조를 많이 벗어난 구조를 직접 구현해야 했다.      


2. MarkupExtension등을 지원하지 않아 Markup 확장이 불가능하여 다른 형태의 XAML답지 못한 요소나 속성들을 따로 만들어야 한다. MarkupExtension등으로 IoC Container 등과 통합을 쉽게 할 수 있으나, 어쩔 수 없이 필자는 Attached Property로 아래와 같이 구현해야 했다.

또는 아래와 같이 LambdaExpression을 이용하여 동적 Compile() 하여 사용하는 형태로 다음과 같이 사용이 가능토록 할 것이다. 이 경우, 위의 방법보다 더 나은 성능을 보여줄 것이다.

 

3. Frame.Navigation은 객체의 Type으로 뷰를 이동한다. 하지만, 하나의 타입에 두 개의 뷰를 만들 수 있는 APIs 를 제공해 주지 않는다 따라서 INavigationService와 NavigationServiceFrame을 직접 구현하여 다음과 같이 하나의 Type 으로 생성되는 뷰는 여러 개의 뷰 객체를 생성할 수 있도록 했다.

다음과 같이 인터페이스를 정의하였고, 기존의 Windows.UI.Xaml.Controls.Frame은 Umc.Core.ModernApp.NavigationServiceFrame으로 대체하도록 하였고, UniquqKey로 구분하여 하나의 Type에 여러 뷰를 생성하여 네비게이션 할 수 있도록 했다.

   

4. IoC Container와 통합된 EventAggregator

뷰에 이벤트를 전달하거나 전역 이벤트를 전달하기 위해서 좀 쉬운 구조로 가기 위해 IoC Container에 EventAggregator를 함께 넣어보았다. Message 방식을 통해 뷰의 이벤트나 전역 이벤트를 구독할 수 있다.

   

그리고 구독을 뷰에서 제어할 수 있도록 하였다.

   

5. IoC Container와 통합된 인젝션. 객체의 인젝션(Injection-주입)은 다음과 같이 이루어진다.

   

6. IoC Container의 Configuration File 구성

이건 이전에 http://umccore.codeplex.com 에 구현해 놓은 것을 WinRT 용으로 마이그레이션 하였다. patterns & practices - Unity의 경우 Configuration을 지원하지 않지만, UmC Core의 IoC는 이를 한번 더 Wrapping 하였기 때문에 구성 파일로 만드는 것이 가능하다.

   

7. IoC Container에서 지원하는 AOP

이는 WinRT 구조상 이를 구현하기가 그리 쉽지는 않다. WinRT에서는 직접 MSIL(MS Intermediate Language)을 이용하여 런타임에 Instructions을 생성할 수 없다. 다만, APIs 가 모자란 만큼 모자란 대로 구현을 할 수 밖에 없다.

예를 들면, C#의 dynamic 을 이용하여 다음과 같이 구현 가능하겠다.

   

   

다음 버전의 윈도우8 앱 SDK 구조는 또 얼마나 바뀔까 걱정!

실버라이트의 일부와 윈도우 폰7에서도 그러하듯 이번 WinRT도 초기 버전이라는 생각이 든다. 생각해보라. 실버라이트 1,2까지 얼마나 개발자의 Needs를 만족해주지 못하였는지. 앞으로 등장할 윈도우 폰8 개발 SDK도 하위 호환성을 일부 포기한다고 알고 있다.   

현재까지 윈도우8 앱 개발 SDK 환경을 본다면, 기존에 가능하던 것들이 WinRT 환경에서 매우 많은 제약이 따른다는 것이 불편하다. 현재 WinRT와 윈도우8 앱 개발 플랫폼의 구조를 본다면, 차기 개발 SDK에서는 WinRT를 얼마나 개선할 수 있을지 알 수는 없다. 아마 WinRT/SDK를 만드신 분들도 참 많이 고민을 했을 것이다.   

다만 WinRT/SDK를 사용하는 개발자에게 그 동안 밟아왔던 원망스러웠던 수순을 밟지 않기를 바랄 뿐이다. 

어쨌든, 윈도우8 WinRT/SDK의 불합리하거나 불편했던 부분을 필자가 구현한 이전에 공개했던 http://umccore.codeplex.com 에 추가로 공개할 예정이다.

'O/S > Windows 8' 카테고리의 다른 글

윈도우 8, 무서운 드라이버와 궁합  (0) 2013.06.05
윈도우 8, 반토막짜리 WinRT와 WinRT SDK  (1) 2012.10.30
Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 김종남 2016.05.15 21:03 Address Modify/Delete Reply

    글 잘 보았습니다.

Windows 8 스타일 개발이 한창 유행이다. 물론 모바일 생태계 전반전인 유행은 아니더라도 Microsoft 기술을 하는 사람들에게는 관심 대상이다. Windows 8 운영체제가 탑재되는 테블릿도 출시가 되고, New iPad 보다 하드웨어 스팩이 좋은 테블릿 출시도 준비중인 곳이 많다고 들었다. 새로운 마켓이 열리는 만큼 테블릿 사용자에게는 새로운 재미를 선사해줄 것은 분명한 사실일 것이다.

Windows 8 스타일 ! 개발을 위해 가지 알아야 구조적인 개념이나 유의사항 정도만 언급하기 위해 글을 나간다. C++/CX, C#,VB XAML(eXtensible Application Markup Language) 이용하여 WPF 데스크탑 응용 프로그램처럼 프로그래밍을 있다. 그리고 HTML/JavaScript 조합으로 개발 환경과 유사하게 개발을 있다. 아마 대부분의 Windows 8 스타일 개발자라면 알고 있는 내용일 것이다. 그리나 포스팅에서는 C++/CX C# 개발 언어를 기준으로 아티클 내용을 채울 것이다.

 

Windows 8 스타일 런타임 관점의 구조

[이미지 링크]

   

WinRT(Windows Runtime) 플랫폼의 구조적 아키텍처 이미지이다. 기존 Windows Desktop 응용 프로그램 환경과 다른점은 WinRT APIs 중간에 끼어있다. WinRT Windows 8 스타일 앱의 핵심이며, Windows 시작하는 Namespace 모두 WinRT 이다.

C#,VB 개발 환경은 그나마 편리한 Library Subset 제공한다. .NET Framework 최소화 버전이라고 보면 된다. 이를 .NET for Windows Store apps 이라고 부르며, 위의 이미지에는 내용이 빠져있다.

C++/CX 잘라 .NET for Windows Stores apps 제공되지 않는다. .NET 개발자라면 System(mscorlib.dll) 으로 시작하는 Namespace 얼마만큼 편한지 알텐데, Library Subset 제공되지 않으니 다른 방법을 사용해야 한다. 쉬운 예로 HttpClient 같은 클래스도 C++/CX MsXml COM 컴포넌트를 이용하는 편이 낫다. 그렇다고 모든 C++ 라이브러리를 사용할 있는 것도 아니다. 이 부분에서 특히 라이브러리의 제한이 있으므로 C:\Program Files (x86)\Windows Kits\8.0\Include\shared 폴더에서 사용가능한 Header 파일을 확인해보도록 하자.

만약 Header 파일의 pragma 선언이 Dektop Family 라면 Windows 8 스타일 앱에서는 사용할 없는 라이브러리이며, 상당한 Header들이 Desktop Family 속하여, 당장 .NET for Windows Stores apps 만큼 쓸만한 클래스들이 없다는 것이 조금 슬프다. 다만, 좋은 소식이라면 C++ boost Library 등이 C++/CX 용으로 컨버전을 시도하는 분들이 많으므로, 조금만 기다려보면 쓸만한 라이브러리들이 대거 출연할 것으로 보인다.

   

더불어 C#, C++ 개발자들도 알고 있어야 하는 중에 하나가 WinRT COM 컴포넌트 기반의 라이브러리라는 것쯤은 들어보았을 것이다. 그래서 Windows 8 스타일 개발자들은 COM 대한 개념과 나아가 이를 구현할 있다면 좋다. 특히 C#, VB 에서 WinRT 컴포넌트를 만드는 것은 가지 지켜야할 제약이 있으므로 다음의 링크를 참고하는 것이 좋다.

C# Visual Basic으로 Windows Runtime 구성 요소 만들기 http://msdn.microsoft.com/ko-kr/library/windows/apps/br230301.aspx

   

대신 C++/CX WinRT 컴포넌트를 만드는 것이 오히려 간단하다. 앞서 말했다시피 WinRT COM 컴포넌트 기반이지만, 기존 C++ 에서 COM 컴포넌트를 만드는 만큼 어렵지가 않다. C++ COM 구현의 첫번째는 IUnknown 인터페이스를 구현하는 것이지만, WinRT 에서는 Iunknown을 상속하는 IInspectable 인터페이스가 더 중요하다. IInspectable 인터페이스는 C++/CX 개발된 응용 프로그램이 런타임 해당 클래스의 정보를 제공하기 위한 인터페이스이다. 물론 기존 C++ 에서도 런타임상 클래스 정보가 필요하여 이를 직접 구현하는 방법도 있다. 하지만 C++/CX IInspectable 인터페이스는 C++/CX 컴파일 과정에서 자동으로 구현을 해준다. 이는 IUnknown 인터페이스까지 자동으로 구현해준다고 보면 된다. 그렇기 때문에 Iunknown 인터페이스의 AddRef, Release 메서드에 대한 객체 수명주기를 WeakReference 클래스를 통해 위임할 있다. WeakReference 통해 금방 해제될 있는 컴포넌트를 가비지 컬렉터 대상이 되도록 지정한다. 그러므로 사용 빈도가 매우 많고, 매번 자원 해제에 대한 비용이 반복되는 것은 WeakReference 효과적으로 객체 수명 주기를 다룰 있게 한다. 이러한 C++/CX 특별히 제공되는 라이브러리는 Microsoft.WRL Namespace 포함되어 있다.

아직 이러한 개념적인 부분이 어렵게 느껴진다면 월간 마이크로소프트 5월호 특집 기사로 기고한 필자의 다음의 글부터 참고 바란다.

[월간 마이크로소프트 5월호 특집기사] C++ 매트로 개발을 위한 C++/CX 언어 http://blog.powerumc.kr/378

   

   

Windows 8 스타일 응용 프로그램 관점

짧게 말해 Windows 8 스타일 개발은 쉽다. Visual Studio 2012에서 훌륭하게 대부분이 구현된 템플릿을 제공하기 때문에, 메서드 중간 중간 원하는 기능을 추가하고, 클래스나 XAML 만들면 된다. 다만, 이는 만든다는 것이 쉽다는 것이지 응용 프로그램 구조적인 측면에서는 전혀 쉽지 않다.

먼저 알아야 것이, Windows 8 스타일 페이지를 상태 관리 것인지, 것인지부터 결정해야 한다. 상태 관리를 유지할 필요가 없다는 것은 개발(ASP.NET/ASP/PHP/JSP) 같은 서버 사이드 개발 환경과 유사하다. 특히 IIS에서부터 ASP.NET까지 연결되는 Application Pipeline 매번의 Request마다 Pooling Thread 활성화되어 서버 랜더링을 통해 사용자에게 HTML Response 전달이 된다.

   

1. 상태 관리를 개별적으로 유지하고 싶다면

다음의 가지 메서드를 재정의하면 된다. ASP.NET Custom Control 구현해 보았다면 VIEWSTATE 상태 유지를 위해 이런 유사한 코드를 구현해야 하는 것을 것이다.

   

Frame.Navigate 메서드는 Page Type 인자로 받고, 매번 새로운 인스턴스를 생성한다. (구현을 다르게 한다면 인스턴스를 이용하도록 수도 있다.) 페이지의 상태 유지야 위의 메서드를 재정의하는 정도로 끝낼 있지만, 페이지에 포함된 UserControl 있다면 상황은 달라진다. 독자마다 구현하는 방법은 다르겠지만, 효과적으로 상태를 관리하기 위해 UserControl 조금 귀찮아지는 존재이다. 인스턴스의 재사용을 위해 자주 사용하는 UserControl 대한 상태 관리를 고민해야 하다니… (현재 아티클은 내용이 대해 오픈 소스 제공으로 효과적인 방법을 제안하도록 필자는 약속 하겠다.)

   

2. 상태 관리를 자동으로 캐싱하고 싶다면

상태 관리를 자동으로 캐싱하는 방법도 매우 쉽다. Page.NavigationCacheMode 프로퍼티를 Enabled 해주면 된다. 물론 XAML 코드에 속성을 추가해도 된다. 하지만 아쉽게도 Frame.Navigate 메서드를 통해 자동으로 상태 관리를 하도록 Page 새로운 인스턴스가 생성이 된다. 상태 관리 캐싱에 대한 조건은 GoBack(), GoFoward() 같은 Frame 이동에 대해서만 유효하다. 조금 이해할 없는 부분은 Page 포함된 UserControl 상태 관리 캐싱 대상에서 제외된다. (물론, 가능하도록 있지만 개념적으로 깊게 이해하고 구현해야 한다.)

   

3. 남발되는 async/await 의한 동기화 문제

Windows 8 스타일 앱을 사용하다가 자주 멈짓 멈짓 한다면 분명 사용자는 짜증날 것이다. 때문에 async / await 키워드를 더욱 자주 사용하는 편이다. 그렇기 때문에 UI 상태에 대한 비동기와 컴포넌트나 인스턴스 메서드 호출에 대한 비동기, 모두 정확하게 Threading 대한 지식이 필요하고, 자유 자재로 Threading 다룰 있다면 더욱 좋다. Windows 8 스타일 앱에서 가장 많이 발생하는 Threading 문제는 Thread 실행 인스턴스 해제에 대한 동기화와 Thread Cancel 대한 동기화다.

문제를 피하기 위해서는 클래스나 라이브러리를 만들때 부터 async / await 대한 고려가 필요하다. 쉽게 이야기하자면 자주 쓰지 않는 편이 좋고, 써야 곳에 써야 한다.

   

이를 판단하려면 Thread 동기화에 대해 적어도 가지는 반드시 익히는 것이 좋다. MSDN 아래의 글들을 번정도 필독하기 바란다.

관리되는 스레딩 기본 사항 http://msdn.microsoft.com/ko-kr/library/hyz69czz
스레딩(C# Visual Basic) http://msdn.microsoft.com/ko-kr/library/ms173178(v=vs.110)

   

      

Windows 8 스타일 배포와 라이브러리 배포 문제

부분은 매우 민감한 부분이고 조심스럽다. 실제 Windows App Store에서 테스트할 없을 뿐더러 개발 환경에서 발생하는 문제이므로, 실제 Windows App Store 통해 발생할 수도 있을 가능성이 있을 같다. COM 기반 라이브러리나 DLL 구성 요소 등은 공유 메모리에 로드가 된다는 것을 것이다. 특히 부분은 COM 컴포넌트에서 민감하게 다루는 IUnknown 인터페이스의 의미와 일맥 상통한다. , COM 객체의 참조 카운트(Reference Cout) 0 되지 않으면, 자원은 해제되지 않는다. 여기에서 COM 가장 고질적인 문제가 발생한다. 바로 DLL 지옥이다. Windows 8 스타일 앱의 메모리 위치는 메모리 영역이 아닌 공유되는 메모리 영역에 위치하고 있고, DLL Verserning 자유롭지 못하다. .NET 처럼 GAC(Global Assembly Cache)에서 DLL 버전별로 관리되지 않는다.

따라서, WinRT 런타임 라이브러리를 개발하여 배포된 Windows 8 앱이 활성화 상태일 새로운 앱에서 버전업 WinRT 런타임 라이브러리 배포시에 다른 프로세스가 점유하고 있다는 오류가 발생한다. 이는 앱이 초절전 유휴 상태에 진입되어도 마찬가지이다.

이찌되었든 개발 환경에서는 충분히 발생된 문제이니, 차후 Windows App Store에서도 발생할지는 지켜보아야 것이다.

   

Windows 8 Windows Runtime 재배포 정책 업데이트

런타임 라이브러리인 만큼 라이브러리 코드가 완벽하지는 않을 것이다. .NET Framework 1.0부터 4.5까지 버전업이 되어왔는데 과연 Windows 8 Windows Runtime 어떻게 버전업이 될까? 사용자의 동의 없이 업데이트나 패치는 불가능하다.

   

Windows 8 Features Pack 1,2,3… 시리즈로 업데이트가 될까?
Windows 8 Service Pack 1,2,3… 시리즈로 업데이트가 될까?

   

만약 이렇게 되면, Windows 8 스타일 간에 호환성 문제가 발생할 것이 분명하다. Apple iPhone 모바일 폰의 운영체제 업데이트가 실시간으로, 온라인으로 이루어진다. Windows 8 iPhone 업데이트와 차원이 달라진다. WinRT 지원하는 ARM 버전과 기존의 Windows 8 Desktop 지원하는 x86 버전 가지의 에디션이 있다.

혹시 부분에 대해서 알고 있는 정보가 있으면 공유 부탁 드립니다.

Posted by 땡초 POWERUMC

댓글을 달아 주세요

협정 세계시(UTC) 시간으로 2012/06/01, Windows 8 Release Preview와 Visual Studio 2012 Release Candidate 버전이 MSDN Subscription을 통해 공개가 되었다. 이번 버전에는 Windows 8 Consumer Preview(CP) 버전과 Visual Studio 11 Beta 버전에 비해 잔존하는 버그가 상당히 줄어들었다. Windows 8 CP 버전을 쓰면서 가장 사용하기 불편했던 점은 데스크톱 응용 프로그램들이 이유 없이 멈추고, Visual Studio 11 Beta 의 IDE가 자주 뻗어 버리는 현상이 눈에 띄게 사라졌다. 더불어 이 두 가지 Release의 성능도 눈에 띄게 향상되었다. 마이크로소프트의 많은 노고에 박수를 보내고 싶다.

   

Windows 8 Release Preview와 Visual Studio 2012 Release Candidate 피드백

Windows 8 Release Preview에서 조금 변화를 원한다면, Metro 시작화면에는 Metro 응용 프로그램만 나열되었으면 한다. 그리고 폴더 기능이나 같은 카테고리 앱끼리 정렬할 수 있으면 더 좋겠다. 데스크톱 응용 프로그램과 Metro 앱이 마구 섞여 있으니 검색 기능 없이 찾기가 힘들다.

   

Visual Studio 2012 Release Candidate 버전에서는 아이콘의 컬러를 흑백에서 컬러로 바꾸었다고는 하지만, 필자 개인적으로는 솔루션 탐색기부터 산만해진 것은 변함이 없다. 컬러를 넣으려면 넣고 빼려면 빼지 말이다. 아이콘 컬러를 넣어달라는 수많은 사용자 피드백에도 불구하고 또 이렇게 산만해진 컬러링은 정말 최악이다.

결론은 둘 중 하나인 것 같다 사용자 피드백을 씹는다거나, 사용자 피드백이 좀 약했다던가...

   

   

Windows 8 SDK, 이빨 빠진 호랑이 격!

자! 이제 본론으로 들어가서 Windows 8 SDK(Software Development Kit)과 Visual Studio 2012에 매우 중요한 것이 변경되었다. 이미 pcworld.com 에서 Release 제품이 나오기 이전에 예고를 했다. Windows 8 SDK 에는 Command-Line 과 관련된 대부분의 실행 파일들이 포함되지 않는다. Windows 8 SDK는 이 링크에서 다운로드 받을 수 있다.

   

위의 Windows 8 SDK 링크를 참고하면 다음과 같은 문구를 찾을 수 있다. 이번 SDK가 DirectX SDK와 통합된 것은 그다지 관심이 없다. 다만, 빌드와 관련된 모든 Command-Line(명령줄)을 제거했다는 것이 중요하다.

   

Windows 8 SDK를 이용하여 단독으로 아무것도 할 수 없다. 일반적으로 마이크로소프트에서 제공하는 Software Development Kit(SDK)에는 개발에 필요한 대부분의 기능들이 포함되어 있다. 가장 중요한 것이 SDK 에 포함되어 있는 Compiler(컴파일러)이다. Visual C++, Visual C#, Visual Basic.NET 으로 작성된 소스 코드를 컴파일하기 위해서는 Compiler가 필요한데, Windows 8 SDK 에서는 제공해 주지 않는다. 그리고, 복잡한 워크플로우로 빌드되는 최근의 개발 환경에서 MSBuild.exe가 필요하다. MSBuild.exe는 인증 작업, 링크 작업, 리소스 병합 등 복잡한 작업을 순차적으로 처리해주는 매우 훌륭한 도구이다. Windows 8 SDK 에서는 이것도 빠져있다.

   

이제 좀 현실감이 올 것이다. 가장 먼저 타격을 받는 것이 바로 통합 빌드 시스템이다. 빌드 서버에 Visual Studio 2012를 설치하지 않으면 Windows 8 Metro App이나 .NET Framework 4.5, 그리고 최신 버전의 Visual C++ 소스 코드를 컴파일하거나 배포할 수 없다. 이는 좀 더 복잡해지는 라이선스 정책과도 교묘해진다. 일반적으로 Visual Studio의 라이선스는 개발자당 1 Copy의 Per User 라이선스이다. 그렇다면 빌드 서버에서 빌드를 하기 위해 Visual Studio를 설치했다면, 이는 Per User 라이선스를 적용 받는 것일까?

   

물론, 무료로 사용할 수 있는 Visual Studio 2012 Express 버전이 있다. 무료이고 상용으로 사용해도 제약이 없는 버전이지만, 제품 자체가 매우 최소한의 기능만 제공한다. Visual Studio Gallery 웹 사이트와 Visual Studio Extension Manager(확장 관리자)에서 제공하는 확장 기능을 사용할 수 없다. (단, Templates(템플릿), ToolBox(툴박스)와 관련된 것들만 수동으로 설치가 가능하다). 협업이나 형상 관리를 위해 SVN Source Control Provider(SVN 소스 제어 기능)나 Team Explorer(팀 탐색기)도 설치되지 않는다. 교육용으로는 적합할 지 모르겠으나, 실제로 기업 현장의 필드에서 사용하기엔 있으나 마나...

   

다시 원점으로 돌아가서 Visual Studio 2012과 .NET Framework 4.5의 새로운 기능을 살펴보자.

   

필자가 어림 잡아 새롭다거나 눈에 띄는 Features를 아래와 같이 아주 간단하게 정리해보았고, 나름대로 간략한 소감을 적어본다.

  • Visual Studio 2012
    • 매트로 앱 개발 - Visual Studio 2012는 매트로 앱 개발을 위한 툴 그 이상 이하도 아니다.
    • C++ Editor 개선 - 개선이 되었더라도 3rd-party 제품인 Visual Assist 를 $99 에 사서 쓰는 것이 더 좋다.
    • Graphics Tools - AutoDesk, Pixel Shader를 만들고 수정하기 편리해졌다. 그런데 이런 기능은 사용하기 늘 부족하기 때문에 NVIDIA Parallel Nsight 2.1 같은걸 쓰는 것이 이로울 것이다. 항상 느끼는 것이지만, 만들다가 만 Features가 Visual Studio에는 너무 많다.
  • .NET Framework 4.5
    • Portable Class Libraries - 마이크로소프트 BCL Team이 Visual Studio 2010 버전으로 공개했다. 그다지 새롭지 않다.
    • Parallel Computing - 가려웠던 부분을 상당부분 긁어줄 것 같다. Parallel 라이브러리에는 찬사를 보내고 싶다.

   

이 외에는 대부분이 성능적인 개선과 기능적으로 보강한 것들이 대부분이다.

   

   

이제 대략적인 결론이 나온다. 매트로 앱만 개발하기 위해서 굳이 Visual Studio 2012를 사용하는 것은 비용적으로 비효율적일지도 모른다. 매트로 앱은 Visual Studio 2012 Express for Windows 8 을 쓰고, 그 외의 시스템적으로 변경사항을 최소화하기 위해 Visual Studio 2010이나 Visual Studio 2008을 사용하고, 더불어 Windows 7 SDK and .NET Framework 4 또는 Windows 7 SDK and .NET Framework 3.5 SP1 을 사용하는 것이 좋겠다. 그리고 필자는 이번 SDK 에 Compiler 배포를 모두 제거한 것을 이해하기 힘들다. 사실상 .NET 환경의 개발자 또는 기업을 대상으로 돈 내놓으라는 것과 다를 바 없다. 그리고 마이크로소프트의 기술은 점점 발전하는데, 기술 이외의 것들은 퇴보적인 경향을 보인다.

   

참고로 다시 한번 상기하자면, 아래는 Windows 7 SDK for .NET Framework 4의 설치 화면이다. 이번 Windows 8 SDK 에는 아래의 대부분이 빠진다.

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 네모 2012.06.07 00:19 Address Modify/Delete Reply

    컬러부분은. 계속 수정중이라 하니 좀더 지켜봐야 할 듯 합니다.
    기본테마는 더 밝아졌으면 좋겠고 다크는 괜찮더군요. 하지만 사용하는 시간이 줄어드니 무료로 버텨보고 그 돈으로 맥이나 알아봐야 겠네요.

  2. 네모 2012.06.07 00:20 Address Modify/Delete Reply

    컬러부분은. 계속 수정중이라 하니 좀더 지켜봐야 할 듯 합니다.
    기본테마는 더 밝아졌으면 좋겠고 다크는 괜찮더군요. 하지만 사용하는 시간이 줄어드니 무료로 버텨보고 그 돈으로 맥이나 알아봐야 겠네요.

이제 이 정도면 우분투에서 개발하기 위한 환경으로 쓰기에 큰 부족함은 없을 겁니다. 단지 부족한 면이 있다만 LibreOffice로 오피스 작업은 어느 정도 가능하지만, OutLook과 같은 강력한 오피스 소프트웨어가 없는 것이 아쉽네요.

이제 Mono개발 도구인 MonoDevelop과 몇 가지 유용한 소프트웨어를 찾아서 설치해 봅시다. 이번에는 우분투의 "우분투 소프트웨어 센터"를 통해 설치하려고 합니다. 지금까지 터미널로 작업했던 소프트웨어 설치 작업은 이 우분투 소프트웨어 센터를 통해 가능합니다만, 터미널은 리눅스 사용에 있어서 꼭 익숙해져야 하기에 좀 고생해서 터미널로 작업을 한 것이니, 이 전의 터미널 작업들은 꼭 반복해서 외우시기 바래요.

   

먼저 아래와 같이 프로그램에서 우분투 소프트웨어 센터를 실행합니다.

   

우분투 소프트웨어 센터의 검색에서 "mono"라고 검색해 보세요. 많은 Mono와 관련된 소프트웨어가 검색이 됩니다.

   

오호! 저 아래에 MonoDevelop이 보이는군요. 자자! 잠시 바로 설치를 누르시 마시고, "더 많은 정보" 버튼을 클릭해 보세요.

   

설치 작업은 관리자의 권한이 필요하므로 암호를 입력해 줍시다.

   

그럼 아래와 같이 "확장 기능"이 보이는데요. 걍 모두 선택해서 설치하세요. 모두 피가 되고 살이 되거나, 어쩌다가 한번씩 필요한 기능들입니다.

   

그리고 "우분투 소프트웨어 센터에서" 아래의 몇 가지 추가적인 소프트웨어도 설치해 줍시다.

  • Mono IL Contract
  • Mono Runtime
  • Mono Documentation
  • Mono Runtime (Terminal)
  • gsharp
  • Monodoc (Http)

   

이쁘게 Mono Develop이 설치가 되었네요.

   

실행시켜보시면 아래와 같이 MonoDevelop이 실행이 됩니다. 깔쌈한 화면이 금방이라고 코드를 짜고 싶어지네요. 이것 저것 한번씩 만져보시고 Visual Studio와 비교해 보시면서 좋은 점, 나쁜점을 찾아보시면 더 재미있겠죠?

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. helpme 2013.04.17 17:48 Address Modify/Delete Reply

    안녕하세요 강좌 잘 읽어보았고

    전부 설치하였습니다.

    감사합니다.

    그런데...

    다음 강좌는 없나요..

    우분투에서 mono로 개발하는 방법을 더 알고 싶고 크로스 플랫폼을 어떻게 지원하는지도 알고 싶네요

    강좌 좀 부탁드리겠습니다.

    • 땡초 POWERUMC 2013.04.18 10:05 신고 Address Modify/Delete

      관심 갖어 주셔서 감사합니다.

      원래는 완결판을 작성해 놓긴 했지만,
      MS MVP가 리눅스+Mono 한다고 눈총을 받은 적이 있어서
      올리다가 말았습니다.

      이제 쩝.. MVP가 아니니 천천히 준비해서 올릴께요 ^^*

  2. 김찬무 2013.07.02 19:57 Address Modify/Delete Reply

    안녕하세요~ 최근에 모바일앱을 개발하기 위해 크로스플랫폼을 연구하고 있습니다.

    올려주신 강좌가 정말 많이 도움이 되었네요 ^^ 우선 감사의 말씀을..

    몇가지만 질문드리고 싶은게 있어서 글남겨 봅니다.

    1. mono는 리눅스 환경이 최선인 건가요?

    2. 제가 모바일앱을 개발준비중인데 ios와 안드로이드 모두 개발하려면 mono로 개발을 하는게 맞는지 발을 잘못 들여놓고있는건 아닌지 궁금하네요

    마지막으로 강좌 계속 연재해주세요!! 항상 도움이 많이 되고 있습니다. ^^

    • 땡초 POWERUMC 2013.07.03 01:33 신고 Address Modify/Delete

      안녕하세요.
      저도 질문주신 내용에 많은 고민을 했었고 아직도 확실한 답을 내리지는 못했습니다.

      다만, 모든 것이 현재 진행형임을 가정하여 답변을 드리겠습니다.

      1. Mono는 크로스플랫폼을 지원하므로, 리눅스 뿐만 아니라 맥과 윈도우에서도 잘 돌아갑니다.
      다만, 퍼포먼스와 같은 얘민한 것들이 검증이 되었느냐 안되었느냐 호불호가 갈리기도 합니다.
      미션 크리티컬한 프로젝트가 아니라면 MONO는 충분히 가치가 있을 것입니다.

      2. MonoTouch/MonoDroid 처럼 Mono 기반으로 iOS/Android 앱을 개발할 수 있긴 합니다. (소위 Xamarin )
      다만, Xamarin 사이트를 가시면 아직 해결해야할 난관과 특히 버그가 매우 많습니다.
      그리고 iOS/Android SDK들을 랩핑한 수준이므로, 결국은 따로 따로 개발하셔야 하고요.
      마지막으로, 기존에 나와있는 iOS/Android 오픈소스나 라이브러리를 재활용할 수 없다는 점. 이 문제가 Xamarin을 선택하기에 걸림돌입니다.

여기까지 따라오시면서 우분투의 사용자 인터페이스와 몇 가지 명령어가 어느 정도 자연스러워 지셨는지요? 몇 번 우분투를 사용해 보시면 알겠지만, "우분투 소프트웨어 센터"에서 필요하신 소프트웨어를 편하게 모두 다운로드 받으실 수 있답니다. 급하신 분들은 먼저 개발 도구와 툴 들을 설치하셔도 됩니다. ^^*

어제 오늘 할 것은 우분투의 테마를 좀 바꾸어볼까 합니다. 기본 테마가 나쁘지는 않지만, 제가 주로 사용하는 개발 툴은 아이콘을 크기를 줄이고, 더 넓은 화면으로 쓰고 싶습니다. 이럴 때 유용한 소프트웨어가 있으니, 다음의 링크를 참고하시기 바랍니다.

   

Gnaom Classic 테마입니다. 다음의 링크에 자세한 내용을 소개하고 있습니다.

http://ioriy2k.pe.kr/archives/4357

   

   

자! 그럼 설치 후 재 부팅을 하면 로그인 화면이 나타납니다. 여기에서 아래의 그림과 같이 사용자 이름 오른쪽의 아이콘을 클릭해 보세요.

   

Gnome Classic 테마를 선택하시고 로그인을 합니다.

   

   

호호~! 아래와 같이 예쁘게 테마가 바뀌었습니다. 약간 MAC OS와 같은 스타일 비슷하네요.

좌측 상단의 영역은 윈도우의 "시작" 과 비슷한 기능으로 소프트웨어의 목록을 볼 수 있습니다.

오른쪽 상단은 뭐 그 전과 지금과 마찬가지고요.

좌측 하단에 아이콘을 DRAG&DROP 하시면 빠른 아이콘으로 등록하실 수 있습니다. 아이콘을 우측 하단쪽으로 등록하시면 좌측/우측으로 정렬하여 빠른 아이콘을 등록할 수 있답니다.

그리고 마지막으로 오른쪽 하단은 4개의 네모 상자가 보이는데요. 이것은 가상 윈도우로 윈도우 화면을 너 넓게 쓸 수 있답니다. 단축키를 쓰는게 더 빠르겠죠? CTRL+ALT+상/하/좌/우 로 빠르게 쓸 수 있습니다.

Posted by 땡초 POWERUMC

댓글을 달아 주세요

윈도우 서버의 Active Directory로 전사적인 리소스를 관리하는 회사가 많이 있을 겁니다. 그래서 로그인을 도메인 계정으로 로그인을 해야 할 필요가 있는데, 우분투에서는 likewise 로 도메인 서비스에 가입하여 로그인을 할 수 있답니다.

도메인 계정으로 로그인해야 하는 환경이 아니라면 패스!!

   

도메인 가입

우선 도메인을 가입하기 위해 필요한 likewise-open 패키지를 다운로드 받아 설치합시다.

다음과 같이 입력하세요. sudo apt-get install likewise-open

   

이제 도메인에 가입할 도메인 주소와 도메인 계정을 알고 있으면 됩니다. 저는 저희 집에 Active Directory가 POWERUMC.KR 주소로 되어있습니다. FQDN 은 대소문자를 구분하니 정확히 입력하셔야 합니다.

   

다음과 같이 입력합니다. sudo domainjoin-cli join POWERUMC.KR umc

=> sudo domainjoin-cli join 도메인주소 도메인계정

   

그리고 도메인 계정의 비밀번호를 입력하면 도메인 가입이 완료가 됩니다.

다음과 같이 입력합니다. sudo /etc/init.d/likewise start

   

   

관리자 권한으로 변경

일단 현재 머신으로 도메인에 가입하였고, 현재 머신에 해당 도메인 계정을 관리자 계정으로 줍시다. 이건 뭐 윈도우에서도 마찬가지죠? ^^

   

다음과 같이 입력합니다. sudo adduser POWERUMC.KR\\umc admin 또는 administrator

 

   

SUDO 권한 주기

말씀 드렸던 최고 관리자 권한으로 명령을 실행하기 위해 sudo 라는 명령을 쓴다고 말씀 드린바 있습니다. 이 sudo 도 이를 사용할 수 있는 계정을 구분해 주는데, 도메인 계정으로 sudo 를 사용할 수 있게 해야 합니다.

먼저 root 권한으로 로그인을 해볼까요? 굳이 로그 오프하지 마시고, su 명령으로 다른 계정의 권한으로 변경할 수 있습니다.

   

다음과 같이 입력하세요. sudo su root

   

sudo 명령을 사용할 수 있는 권한들은 sudoers 라는 파일에 텍스트로 기록이 됩니다. 이 파일을 편집할 수 있는 사람은 최고 관리자 권한인 root 밖에 없답니다.

다음과 같이 입력합니다. sudo gedit /etc/sudoers


여기까지 오시는데 조금 지치지는 않으셨나요? 그래도 리눅스의 몇 가지 시스템에 대해서 알아가는 과정이니 빠득 빠득 따라오시기 바랍니다. 뭐 윈도우에서도 개발 환경 세팅 하려면 어느 정도 시간을 투자해야 하니까용~

 

   

자 이제 다 되었습니다. sudo clear를 입력하여 오류가 나지 않으면 설정이 올바르게 된 겁니다. clear 명령은 화면을 깨끗하게 지우고 커서를 최상위로 옮기는 명령인데, 윈도우에서는 cls 랑 맘먹는 놈입니다.

다음과 같이 입력하세요. sudo clear

   

   

   

   

Posted by 땡초 POWERUMC

댓글을 달아 주세요

이 부분은 우분투의 한글 드라이버인 ibus가 좀 오동작을 합니다. 쩝.. (한글 입력기라고 부르는군요.).

안 불편하시면 걍 쓰시고, 전 불편해서 다른 한글 입력기로 바꿀겁니다.

   

다음과 같이 입력해서 앱 스토어에서 nabi 한글 입력기를 다운로드 받습니다. (앱 스토어는 그냥 친숙한 의미로 부르는 것이니, 또 이런 문장 문장 하나에 죽자고 덤비지 마시길)

   

다음과 같이 입력하여 nabi를 설치합니다. sudo apt-get install nabi

   

   

    


혹시 노트북을 쓰신다면,

한글 키보드 101/104 가 ALT L과 한/영 키를 구분 못하는 경우가 있습니다. 그래서 ALT L 단축키를 다른 키로 변경할겁니다. 그래야 한/영 키가 올바로 먹습니다.

   

   

윈도우 키 + Space 로 변경

Posted by 땡초 POWERUMC

댓글을 달아 주세요

영어 울렁증이 있으시다면 한글 우분투로 변신시켜 봅시다. 영어 버전도 충분하시면 패스!!

   

   

   

   

   

   

   

   

   

   

재 부팅 후

   

Posted by 땡초 POWERUMC

댓글을 달아 주세요

이제 우분투에 로그인이 되셨습니까? 그럼 우분투에서 매우 자주 쓰는 몇 가지 명령어를 터미널을 이용해서 작업을 할겁니다. 우분투는 X-Windows 환경도 좋지만, 리눅스답게 터미널을 못쓰면 리눅스답게 쓰기가 힘들 수 있습니다.

터미널 작업은 매우 강력하고, GUI 기반+마우스 작업으로 하는 것보다 훨씬 빨라서 터미널이 점점 재미있어질 겁니다. 윈도우의 커맨드 라인 작업은 왠지 지루한 감이 있지만, 리눅스의 터미널 작업은 왠지 즐기게 되는… 음… 그 기분… 아마 써보지 않은 분들은 못 느끼실 겁니다.

   

   

터미널 실행하기

아래의 마우스 위치가 바로 "Dash Home" 아이콘 입니다. 그곳을 클릭해서 terminal을 검색하시면 됩니다. 근데 CTRL+ALT+T 키를 누르면 바로 터미널 뜬답니다.

   

   

ROOT 계정 비밀번호 설정

   

우선 root 계정의 비밀번호부터 변경해 봅시다. root 계정은 윈도우의 administrator(관리자), 우분투의 admin 보다 더 계급이 높은 계정입니다. 원래 우분투에서는 root 계정은 사용하지 않는 것이 관례인데, 필자가 뭔가 작업을 잘못해서 이를 되돌리려니 root 권한을 얻지 못해서 큰 코 다친 적이 있습니다. 그래서 그 후 부터는 root 계정을 살려놓죠 ^^; 우분투를 써보신 분들은 아실만한 내용인데, sudoers 파일에 오타를 넣어 저장을 해버려서, sudo 를 실행하지 못해 완죵 고생했었죠.



sudo, 수도 꼭지의 수도가 아닙니다. sudo 는 우분투를 쓰면서 가장 많이 쓸 명령어인데, 이 명령어는 보안과 관련된 부분에서 최고 관리자 권한(root)의 을 얻는 명령입니다. 이와 비슷한 윈도우의 명령어는 runas.exe 가 있지요.

   

리눅스 : sudo cp * /usr/local/umc <--- 최고 권한으로 모든 파일을 umc 디렉토리로 복사하라!

   

이 명령어를 윈도우와 유사하게 사용하면 이렇게 됩니다.
윈도우 : runas /user:administrator copy * C:\user\umc\documents

   

다음과 같이 입력하세요. sudo passwd root

   

   

RPM 과 APT-GET

RPM! 이건 또 머꼬! RPM(Redhat Package Manager) 로 레드헷(유형의 회사나 단체)에서 만든 리눅스인데, 좀 먹어주는 리눅스 버전입니다. 레드헷 계열은 대부분 상용적인 서비스를 목표로 만든다고 하네요. 이 RPM으로 뭔가의 패키지를 자동으로 설치해 줍니다. 윈도우에 비교하자면 MSIEXEC 와 비슷하지만, GUI 기반이 아니라는 점이 다르지요.

그리고 apt-get 이 있습니다. apt-get(Advanced Packaging Tool)은 인터넷을 기반으로 패키지를 설치하는 방법입니다.

   

자! 정리하면 RPM은 로컬 실행용 패키지! APT-GET은 인터넷 앱 스토어(?)에서 다운받아 설치하는 방식!

이 apt-get 은 먼저 update 를 해주어야 합니다. apt-get 은 소스 서버에 있는 소프트웨어 목록 등을 인덱싱하여 캐싱합니다.

다음과 같이 입력합니다. sudo apt-get update

   

그리고 RPM 을 설치합니다. 다음과 같이 입력합니다. sudo apt-get install rpm

   

   

   

apt-get 소스 서버 변경

이건 해도 되고 안해도 됩니다. 다만 소스 서버를 좀 더 빠른 곳으로 바꾸면 apt-get 설치가 좀더 빨라지겠죠.

   

   

   

역시 우리나라의 소프트웨어 회사인 다음 서버군요. 멋집니다. 다음!

   

소스 서버가 변경되었습니다. 다시 캐시를 업데이트 해야겠지요?

다음과 같이 입력합니다. sudo apt-get update

Posted by 땡초 POWERUMC

댓글을 달아 주세요

첫 회부터 너무 쌘건가? 독자 분들도 제목에서 볼 수 있듯이 "크로스 플랫폼 개발 환경 만들기"라는 주제인데, 혹여 뭔가 대단한 것을 만들려고 하는 것은 아니니 너무 큰 기대는 하지 않길 바랍니다. 이 글은 필자가 크로스 플랫폼 개발 환경을 만들면서 여러 번 수행 착오를 겪은 부분을 공유하기 위함입니다.  

일단, 크로스 플랫폼 개발 환경을 만들기 위해 필자가 선택한 운영체제는 우분투 12 LTS 버전입니다. 맥OS는 리눅스 기반이면서 맥에서만 100% 설치 성공 가능한 운영체제입니다. 뭐 해적판도 있겠지만, 그런 고생은 불법적인 방법이므로 피하는게 좋겟지요.  

우분투12를 선택한 김에 우분투 운영체제에 대한 소개 좀 해봅니다. 우분투는 리눅스라고 하는 수 십 년 전 멀티 테스킹(멀티 쓰레딩)을 지원하는 운영체제 입니다.

   

필자가 리눅스를 접했던 때는 초등학교 때였는데, 그 때는 플로피디스크 4장으로 설치를 하던 까만 바탕화면의 그런 운영체제 였습니다. 초롱불 같은 좀 허접한 사설 BBS를 날로 뚫었던, 난 "크래커야!" 라는 뿌듯한 자부심으로 사용하던 것이 바로 리눅스였습니다. 더불어 리눅스는 소스 코드가 공개가 되어 있어서 상당한 보안 취약점이 존재했습니다. 그 중에서도 vi 와 같은 것들은 해커들이 가장 좋아하던 공격 대상이었지요. 그러면서 리눅스에 X-Windows 라고 하는 GUI 그래픽 인터페이스이 탑재가 되었고, 쭉쭉 발전해서 현재와 같은 모습이 되었습니다.

   

우분투데비안 계열에서 파생된 운영체제 입니다. 또 데비안은 머꼬?? 이 데비안 리눅스는 굉장히 많은 CPU의 아키텍처를 지원하기 때문에, 서버 용도로 안성맞춤이었죠. 심지어 ARM 코어도 지원하고, 듣도 보지도 못했던 아키텍처들도 지원을 하네요.  

데비안에서 파생된 우분투는 이러 저러 잡다한 것들 다 빼고, 사용자가 친숙하게 사용하기 위한 용도로 설계가 되었고, 데스크 탑 용도로는 안성 맞춤이지요. 이 우분투는 서버와 데스크 탑 용이 별도로 존재하는데, 그 중 데스크 탑 우분투는 가장 널리 사용되는 X86과 AMD64 아키텍처를 지원합니다. 쩝.. 그러니까 여러 분이 가진 PC나 노트북에서는 다 돌아 가겠고요. ARM 코어 컴퓨터가 있으면 당장이라도 ARM 코어를 지원하는 우분투 서버 버전을 이용하시면 되겠습니다. 아무튼 쥑이는군요.

   

  

사설은 여기서 마치고, 일단 설치부터 해보아야겠지요? 우분투는 2가지 방식의 설치를 지원합니다. 매우 중요한 부분이지요.

   

첫 번째, 설치 방식은 별도 파티션을 나누지 않고도 멀티 부팅이 가능한 우비(wubi) 버전입니다. 우비는 NTFS 파일 시스템(일반적으로 윈도우에서 쓰는)을 마치 물리적인 파티션으로 인식하도록 하여, 설치를 합니다. 가령, C:\ubuntu 폴더가 하나의 파티션이 되는 것이지요. 그냥 짬짬히 쓸 생각이라면 우비 버전으로 설치하시면 되겠습니다.

두 번째, 가장 일반적인 파티션을 분할하여 설치하는 방법입니다.

   

아참… 여기서 아마 VirtualBox나 HYPER-V에 설치하려고 하는 분 계실 겁니다. 제가 정말 장담하건데 개인용 컴퓨터에서 가상화하여 설치하면 얼마 못가서 지울 겁니다. 그리고 제 성능도 안나옵니다. 영화를 아이폰으로 보는 것과 iMAX 로 보는 것과의 차이입니다. 꼭 한번쯤은 우비나 파티션을 나누어서 설치해 보세요. 후회하지 않을 겁니다.

   

   

   

   

첫 번째, 우비(wubi) 버전으로 설치해 봅시다. (구경만 해보실 분)

먼저 http://www.ubuntu.com/download 링크로 가봅시다. 아래에 우분투 데스크탑 버전으로 클릭합니다.

   

그리고 화면 스크롤은 반 쯤 내려보세요. 그럼 "Windows Installer" 설치 다운로드가 보입니다. 요거 그냥 따블 클릭해서 실행 파일을 실행하면 됩니다. 아까 얘기한대로 이것을 설치하면 가상 파티션이 생성되어 멀티 부팅이 가능합니다. 그리고 "소프트웨어 설치/제거"에서 wubi 를 삭제하시면 우분투도 금방 삭제가 됩니다. 정말 획기적입니다.

   

아래와 같이 설치할 드라이브와 적당한 가상 파티션의 크기를 지정해 주세요. 왠만하면 30GB 선택해 주시면 되겠습니다. 그리고 설치하기를 선택하시고 그 이후의 일은 여러분에게 맡기겠습니다….

   

   

   

   

두 번째, 진정한 리눅스의 성능을 느끼시려면, 파티션을 나누어 설치를 해야겠지요.

먼저 http://www.ubuntu.com/download 링크로 가서 설치하고자 하는 우분투 버전을 선택하면 됩니다. (32bit, 64bit 택일). 32bit 가 추천으로 되어있지만, 필자는 추천 항목은 안씁니다^^. 그래서 저는 64bit 버전을 선택해서 ISO 파일을 다운로드 받았답니다.

   

   

이 ISO 를 USB나 CD로 구우시면 되겠습니다만, USB로 구우실 거면 이 http://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/ 링크에서 USB로 금방 구워주는 소프트웨어를 사용해 봅시다. 이 소프트웨어는 아래처럼 생긴 물건입니다.

   

그리고 설치할 파티션을 미리 확보하시기 바랍니다. 용량이 모자라시면 파티션 축소하셔서 남은 용량을 짜 내시면 됩니다. 물론 파티션은 "주 파티션"으로 만들어야겠지요?

그리고 아래의 스크린 샷을 쭉쭉 보시면서 설치하시면 됩니다. 쭉쭉 보시다가 중요한 부분에서 다시 말씀 드리겠습니다.

   

   

   

   

   

   

자 여기에서 당황하지 마시고, 아래와 같이 멀티 부팅이 가능하도록 첫 번째 항목을 유지한 채 다음으로 넘어가면 됩니다.

   

그러면 아래와 같이 칸막이 조절 막대가 있는데, 참 애매해 보이네요. 파티션 이름이나 파티션 주체에 대한 내용이 나오지 않아 혼란스럽습니다. 아래에 "고급 파티션 도구" 보이시죠? 그냥 고급 파티션 도구를 써서 설치해 봅시다.

   

설치를 시작하기 전에 파티션을 마련해 놓으라고 했는데, 여기에서 그 파티션을 선택하면 되겠군요. "주 파티션"으로 설치하면 멀티 부팅이 됩니다. 그리고 리눅스에서 즐겨 쓰는 EXT4 파일 시스템을 선택하고, 마운트 위치를 / 로 잡아줍니다.

   

여기서 잠깐 파일 시스템에 대해서 얘기하자면, 윈도우에서는 NTFS 파일 시스템을 사용하죠. 과거 FAT 파일 시스템은 최대 디스크 용량과 파일 길이에 제한이 있었고, 점점 파일들의 크기가 증가하면서 파일당 할당되는 블록이 점점 높아졌습니다. FAT16, FAT32가 대표적이죠. 쉽게 말해 MS-DOS 에서 주로 기반한 파일 시스템이었죠. FAT16 시절에는 파일명 최대 8, 확장자 최대 3… 8.3 법칙이랍니다.

이후 윈도우에서 NTFS 파일 시스템이 나왔습니다. NTFS 파일 시스템으로 암호화를 한다던가, 복구를 한다던가 하는 작업이 가능합니다.

반면, 우분투에서는 EXT 파일 시스템을 주로 사용하는데, EXT4 파일 시스템으로 포멧하시고 설치하시면 됩니다. 혹시 구형 하드 디스크인 경우 EXT2 를 선택하시면 되겠고요.

아참… 중요한 마운트라는게 있는데, 이는 디렉토리 단위로 관리되는 디바이스라고 보시면 됩니다. 윈도우에서는 C드라이브, D드라이브로 구분이 됩니다. 하지만 리눅스에서는 마운트라고 하여 물리적인 디바이스 단위를 논리적으로 트리 형태의 디렉토리로 관리됩니다. 쉬운 예를 들면, / 는 첫 번째 하드 디스크이고요, /dev/NewDrive 는 새로 산 하드 디스크를 붙였습니다. CD-ROM 도 붙여 볼까요? /dev/cdrom 위치에 놓을 수 있습니다. 원하는 위치에 마운트 시킬 수 있다는 것이죠.

   

   

자 그럼 이제 설치합시다. 그 전에 아래의 붉은 동그라미에 설치가 되므로, 올바르게 멀티 부팅이 되기 위해서 주 파티션을 제대로 선택했는지 재차 확인 합시다.

   

   

키보드는 별탈 없으면 101/104로 선택하세요. 차후에 정신건강에 이롭습니다.

   

사용자 이름과 컴퓨터 이름은 원하는대로 입력하고 후닥 넘어가시죠.

   

   

   

   

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. ky 2014.10.10 16:49 Address Modify/Delete Reply

    왜케 뻥을 치세요..
    맥OS는 LINUX기반이 아니라 BSD기반이고...
    나이가 어떻게 되는지 모르겠지만...
    슬렉웨어 초기버전도 플로피디스켓 4장으로는 설치불가였습니다.
    그 이전에 SLS는 용량이 적었지만 그것도 플로피 4장으로 설치하기에는
    역부족이었을꺼 같은데요????

    • 땡초 POWERUMC 2014.10.10 23:23 신고 Address Modify/Delete

      이 글을 쓴 당시에는 제가 무식해서 이렇게 썼습니다만... ^^;
      뻥 치려고 한 것은 아니랍니다.

      그리고 플로피디스켓으로 XT 컴퓨터에 설치해서 사용했었는데...
      이것도 뻥인가요?

      그런데 뉘신지 이렇게 성의없이 댓글을...?

  2. ky 2014.10.12 09:31 Address Modify/Delete Reply

    리눅스는 첫버전부터 386머신에서 돌아가는 운영체제였고,
    1.x버전이 확산되던시기에 쓸모없는 XT머신을 라우터로 활용해보고자 하는 취지에서
    XT용 리눅스 프로젝트가 있었던 적은 있었지만 공식으로 XT를 지원한 적은 없는데요...??
    도스랑 리눅스랑 헷갈리는게 아닌지...@.@

    • 땡초 POWERUMC 2014.10.12 21:31 신고 Address Modify/Delete

      이렇게 친절히 설명해 주시면 좋았을텐데요.
      제 기억이 틀리지 않았다면 8086 프로세서를 지원하는 리눅스가 있었네요.
      그리고 지적을 해 주시려면 정확한 정보를 제시해서 해 주세요.

      나이 운운하면서 무시하는 댓글 뉘양스를 보아하니
      초딩인 것 같은데...

 2012년 4월 26일, 고대하던 우분투 12 LTS 가 릴리즈 되었습니다. 우분투는 데비안 계열에서 파생된 사용자에게 친숙한 데스크탑 운영체제입니다. (더 자세한 내용은 이 링크를 참고하세요) 왜 갑자기 쌩뚱맞게 우분투 얘기가 나오는 것인가라고 의아할 수 있을 겁니다. 이유는 우분투에서 Mono를 이용하여 크로스 플랫폼을 지원하는 소프트웨어를 만들자는 것에 의미가 있습니다.

 

  

 

 

그 중, Mono는 .NET 플랫폼과 .NET Framework를 충실하게 구현한 오픈 소스이며, 크로스플랫폼을 위한 내부적인 기술 및 지원은 오히려 .NET 보다 앞섭니다. .NET의 복제품이 아닌, .NET의 확장판으로 보시기 바랍니다. .NET 플랫폼이라는 어떤 무형/유형의 구현체는 ECMA라는 비영리 표준화 기구와 ISO인 국제 표준화 기구에서 표준으로 정의되고 있습니다. 즉, Mono는 표준화 기구에서 인정한 표준을 구현한 것일 뿐이며, Microsoft 와는 어떠한 라이선스 관계도 맺지 않는 자유 소프트웨어 진영입니다.
(정확히 비표준 및 표준에 등재된 것들은 언어 스팩과 CIL 스팩입니다. 그 외적인 CLR 부분은 Mono가 크로스 플랫폼을 위해 자체적으로 구현한 레벨이 되겠지요. 전반적인 내용의 의도만 이해하시기 바랍니다.)


   

자체적으로 .NET Framework과 CLR(Common Language Runtime), CIL(Common Immutable Langauge), JIT(Just in Time) 등을 크로스 플랫폼에서 동작하도록 매우 심혈을 기울여 탄생한 독자적인 플랫폼입니다.

더불어 Mono가 혼자서 모든 것을 한 것이 아닙니다. 자유 소프트웨어 진영의 GTK(그래픽 툴 킷)을 이용하여 데스크탑 응용 프로그램을 리눅스, 윈도우, 맥, 모바일에서 돌릴 수 있습니다. 또한, ASP.NET 웹 응용 프로그램을 Apache Tomcat, FastCGI, 또 최근에 높은 성능으로 주목을 받고 있는 Nginx 와 같은 WAS(Web Application Server)에서 돌릴 수 있습니다.

 

  자유 소프트웨어 진영의 훌륭한 운영체제와 어디에서나 돌아가는 개발 환경 및 서버 운영 환경의 크로스 플랫폼 인프라.. 그 동안 Microsoft가 제공하는 편안한 윈도우 운영체제와 IIS(Internet Information Service) 이 두 가지에 의존하며 개발하던 우물안의 개구리에서 이제는 더 큰 곳을 바라보아야 할 때인 것 같습니다. 그것을 시작하는 첫 걸음이 바로 Mono 입니다.

 

이 쯤에서 Mono 플랫폼과 그 인프라의 장점을 한번 살펴봅시다.

1. Mono 플랫폼 전체가 오픈 소스이며, 그 구현체는 매우 수준이 높고 확장 가능합니다. (.NET 플랫폼과 비교하여)

2. MonoDevelop라는 통합 개발툴(IDE)은 무료이며, 리눅스, 윈도우, 맥 등에서 설치하여 쓸 수 있습니다.

3. 운영체제 구매 비용이 없고, 웹 서버 구매 비용이 없습니다. 4. 호스팅 업체에서 우분투와 같은 리눅스(Linux) 호스팅 vs 윈도우 호스팅의 가격 = 1개월당 각각 1,000원 : 20,000원입니다. Linux는 쓸수록 금전절약입니다.

5. 가볍습니다. 운영체제 용량과 개발 환경 구성을 모두 다 해서 7.4GB 입니다.
(현재 설치된 것들이 우분투 12 LTS, Gnome시리즈 유틸, Mono Runtime, MonoDevelop, JDK6, JDK7, OpenJDK6, OpenJDK7, Eclipse, STS(SpringSource Tool Suite), IntelliJ, NetBeans, KDevelop, Qdevelop 등등 )

6. 윈도우 기반의 .NET 응용 프로그램은 체감적으로 모든 것이 느립니다. 하지만 리눅스에서는 체감 실행 속도가 더 빠른 것 같습니다. (윈도우용 MonoDevelop보다 리눅스용 MonoDevelop 실행 속도가 나은 것 같습니다.-컴파일, 실행속도 등등)

   

 

이쯤에서 한 가지 알기 힘든 궁금증이 생깁니다. "왜 마이크로소프트는 충분히 기술력이 있음에도 크로스 플랫폼을 포기할까?". 정말 왜일까요? 언뜻 생각해보면 당연히 자사 운영체제에 특화되어야 혁신적인 기능이나 기술이 빠르게 추가될 수 있습니다. .NET Framework만 보아도 WINAPIs와 COM로 도배되어 있고, WCF만 보아도 IIS나 윈도우 서비스에서 편하게 쓸 수 있도록 하였으며, 알 수 없는 NetTcp, NetNamed, NetMsmq, MsmqIntegration 비표준 웹서비스 프로토콜을 사용하지요. 물론 이런 것들이 필요에 의해서 나오긴 했지만, 윈도우라는 족쇄에 묶어둘 수 있는 좋은 기술이기도 합니다.

   

   

그리고 오픈 소스 진영의 라이선스 정책이 마이크로소프트가 크로스 플랫폼을 지원하지 못하게 되는 장벽이 될 수도 있습니다. GPL이냐 LGPL이냐, 또는 정적 링크냐 동적 링크냐, 무료 배포이냐 상용 배포이냐에 따라 마이크로소프트의 제품의 상표권이 문제가 될 수도 있고, PDB 심볼에 원작자의 요구 문건이 포함될 수 있고, 최악의 경우에는 상용 소프트웨어의 소스 코드를 공개해야 할 수도 있을 겁니다. 물론 잘 알아보고 써야겠지만, 언젠가는 라이선스 정책은 변경이 될 수 있지요. 그런 오픈 소스 진영의 라이선스 정책 등으로 휘말리지 않는 방법이 독자 플랫폼으로만 살아가는 것일 겁니다.

하지만, 이제는 세상이 변해가고 있습니다. 초기에 아이폰의 iOS와 안드로이드 앱을 서로 다른 기술로 구현을 해야 했지만, 이제는 그런 개고생은 하지 않아도 되었습니다. C#이라는 언어만 알고 있으면, Mono for Android로 안드로이드 앱을 만들고, 이 코드를 재사용하여 MonoTouch for iOS로 아이폰 앱도 만들 수 있겠지요. 이 코드를 재사용하여 Windows Phone 앱도 만들 수 있겠죠.

   

필자는 BASIC, QBASIC, Turbo BASIC을 죽도록 해 본적이 있습니다. 그리고 Turbo C를 죽도록 해 본적이 있습니다. 그리고 Turbo Pascal을 죽도록 해 본적이 있습니다. 그리고 거의 7년 동안 .NET과 C#, ALM, Testing을 죽도록 한적이 있습니다. 그리고 최근에는 JAVA, Python, C++ COM 을 죽을 만큼은 아니고 적당히 공부하고 있습니다. 그 전에는 즐겨 사용하던 C#이라는 언어의 철학을 이해한다고 했지만, 이해하지 못했습니다. 다만, 이제서야 조금은 이해가 갑니다.

   

아주 작은 예를 들면,

왜 C# 언어의 람다식이 JAVA 언어의 람다식보다 좋은가?
왜 C# 언어의 Attribute이 JAVA 언어의 Annotation보다 좋은가?
왜 C# 언어의 익명 메소드가 JAVA 언어의 익명 메소드보다 좋은가?
왜 .NET의 보안 모델이 JAVA의 보안 모델보다 좋은가?

물론 JAVA가 더 좋은 것도 많답니다. 오해 마시길…

   

가장 큰 주제의 질문으로써, 왜 윈도우보다 크로스 플랫폼이 좋은가?

   

우리가 사용하는 .NET 플랫폼이 생산성이 좋고, 성능이 좋고…를 우물 안에서 외치며 섣불리 판단하는 노예 아닌 노예가 되지 맙시다. 이제야 저도 느끼는 것이지만, 그런 바보 같은 사람이 되지 않기를 바랍니다. 자신의 종교만이 유일한 신이니까, 다른 종교를 무시하면 그 사람만큼 불쌍해 보이는 사람도 없습니다. 진정 과학이 발달하여 "신 같은 것은 없어!! 우리는 외계인의 후예!!" 라면… 완전 반전이죠^^; (과학적으로는 이런 얘기들의 이론이 뒷받침 되고 있습니다.)

   

현재 스스로 개발자라면 스스로에게 무언가의 질문을 던져볼 시기인 것 같습니다.

저와 함께 우분투 운영체제에 MonoDevelop을 써보느냐!! 아니면 윈도우에 Visual Studio를 쭉 쓰느냐!!

   

앞으로 총 11회의 연재를 통해 당신을 우분투와 MonoDevelop를 주무르는 멋진 개발자로 만들어 드리겠습니다.

기대해 주세요….

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 산소나무 2012.05.03 06:25 Address Modify/Delete Reply

    우분투 다운로드 하는중 !!
    어제의 경험이 정말로 충격 !!

  2. 산소나무 2012.05.03 06:25 Address Modify/Delete Reply

    우분투 다운로드 하는중 !!
    어제의 경험이 정말로 충격 !!

MSDN Virtual Lab에서는 Microsoft Team Foundation Server 2010 제품을 온라인으로 트레이닝 받을 수 있는 서비스가 있습니다. Team Foundation Server 2010 을 설치할 여력이 되지 않거나, 제품을 직접 시연하고 싶은 사용자에게 가상 환경을 제공해 주고, 가상 환경에서 여러 시나리오를 따라해 볼 수 있습니다.

이 MSDN Virtual Lab 환경은 Internet Explorer 만 있으면 곧바로 서비스를 체험할 수 있습니다. 다만, 이 서비스는 가상의 환경으로 제공이 되기 때문에 가상 환경에서 실습이 끝난 이후에는 생성된 팀 프로젝트와 데이터는 모두 삭제가 됩니다.

실습은 모두 3가지의 모듈로 제공이 됩니다.

   

먼저 실습을 하고자 하는 모듈의 주소를 Internet Explorer 를 통해 접속을 합니다.

   

Launch Virtual Lab을 선택하면 아래와 같은 팝업이 뜨는데, 실습 환경의 가상 환경을 제공하기 위한 준비를 합니다. 아마도 실습을 하기 위한 스냅샷으로 돌아가고 있겠지요..?

   

이 가상 환경 실습은 원격 데스크톱 연결을 이용하는데, Connect 버튼을 클릭하면 곧바로 가상 환경을 원격 데스크톱 세션을 통해 접속이 됩니다.

   

접속이 되면 가상 환경 접속에 접속할 수 있는데, 마치 Hyper-V 관리 콘솔과 같은 화면이 나타납니다. 물론 단 하나의 VS2010CTP 라는 가상환경에만 접근할 수 있습니다.

   

아래오 같이 가상 환경이 접속이 되면, 텅 빈 윈도우 바탕 화면이 나타나는데, Start 버튼을 클릭하면 우리가 실습에 필요한 모든 소프트웨어가 설치가 되어 있습니다. 우측의 패널에는 실습 단계를 차례대로 진행할 수 있고, 상단에 HTML과 PDF 문서를 다운로드 받을 수 있습니다.

   

사실 Team Foundation Server 2010의 MSDN Virtual Lab 서비스가 나온지는 좀 되었지만, 아직 많이 알려지지는 않은 듯 합니다. 소프트웨어 패키지를 구매하고 설치하고 MSDN을 통해 기능을 익힐 수 있지만, 이렇게 가상화 서비스를 이용해 부담 없이 하드웨어나 환경적인 제약 없이 실습 공간을 제공해 주는 것을 보면 Before Services 가 짱 이네요.

(BE란 ? 고객들이 제품 구매에 앞서 제품을 직접 써보거나 충분히 경험해 본 다음 구매를 결정할 수 있도록 하는 다양한 체험 프로그램 서비스를 말한다. 기존 서비스 방식인 애프터서비스(AS)는 고객들이 제품을 구매한 후 제품에 대한 차후 서비스를 받을 수 있다. )

Posted by 땡초 POWERUMC

댓글을 달아 주세요

Visual Studio 11의 솔루션 탐색기는 이전 버전에 비해 매우 독특한 구조를 가지게 되었습니다. 그 중에서 Visual Studio 11에서 솔루션 탐색기 기능을 최대한 활용하는 방법을 살펴볼텐데요, 그냥 가볍게 보시면 될 것 같습니다.

1. 다중 인스턴스로 사용하기

다중 인스턴스는 솔루션 탐색기를 하나가 아닌 여러 개로 띄울 수 있는데요. 단, 현재 로드된 솔루션의 솔루션 탐색기 인스턴스를 생성할 수 있습니다. 만약, Visual Studio 11에서 여러 솔루션을 하나의 Visual Studio 11 인스턴스에서 실행할 수 있다면 다중 인스턴스의 솔루션 탐색기가 더욱 편리할 거라는 아쉬움이 있네요.

아래의 그림과 같이 우측 끝에 있는 아이콘을 클릭하면 똑같은 인스턴스를 생성한답니다.

여러 솔루션 탐색기의 인스턴스를 사용하여 프로그래을 작성하는 프로젝트에 스크롤을 위치시키고, 또 하나는 단위 테스트 프로젝트에… 또 하나는 전체 솔루션이 훤히 보이도록 띄어놓았습니다.

이제 하나의 솔루션 탐색기에서 마우스 스크롤 쫙쫙~ 올리고 내리고 할 필요가 없어졌네요. 더불어 멀티 모니터를 사용한다면 효과가 금상첨화겠지요?

   

2. 코드 파일 미리보기

중간에 보이는 아이콘의 이름 "Preview Selected Items"은 말 그대로 코드 파일을 미리 보는 기능이랍니다. 이 옵션은 Visual Studio 11을 설치하면 기본적으로 선택되는 옵션입니다.

이 기능은 솔루션 탐색기에 파일을 한 번 클릭할 때마다 에디터 창이 열립니다. 좌측의 빨간색 탭은 솔루션 탐색기에서 코드 파일을 더블 클릭하거나 F7을 누를 때 일반적으로 좌측부터 정렬되는 에디터입니다.

오른쪽의 노란색의 탭 하나가 바로 한 번 클릭할 때마다 열리는 미리 보기 탭입니다. (필자는 개인적으로 이 옵션을 껐답니다 ^^;)

   

3. 솔루션 탐색기를 격리시키기

솔루션 탐색기를 격리시키는 방법(용어는 필자가 나름대로 칭하였습니다)입니다. 이 방법이 꽤나 쓸만한 기능인데, 솔루션 탐색기의 선택된 항목이 솔루션 탐색기의 최상위 루트가 되는 기능입니다. 예를 들어, 아래와 같이 Core 프로젝트를 펼치면 굉장히 길어지는데요, 단위 테스트도 같이 하려면 Core.Tests 프로젝트도 펼쳐져 있어야 합니다. 이러다가 대부분 솔루션 탐색기가 위아래 정신 없이 스크롤하게 됩니다.

   

그럼 솔루션 탐색기 다중 인스턴스를 이용해서 좀 더 스마트하게 사용해 볼까요? 바로 "Scope to This" 기능입니다.

   

이 기능을 이용해서 아래와 같이 스마트하게 솔루션 탐색기를 배치할 수 있습니다. 자주 코딩하는 Core 프로젝트랑 Core.Tests 프로젝트랑 각각 최상위 루트에 배치해서 귀찮은 스크롤도 없어지고 하위 여러 자식의 트리구조를 없애서 보기에 깔끔해 졌네요.

   

이런 경우는 인터페이스 프로그래밍을 할 때도 매우 유용합니다. 인터페이스를 선언하고 이를 구현하면 서로간에 왔다 갔다 하는 경우가 매우 많거든요. "Scope to This" 기능으로 좌측에 인터페이스 파일 하나만 배치시키고, 우측에서는 인터페이스를 구현하고 파생되는 구현 클래스가 뭉쳐있는 폴더만 격리시켰습니다.

 

어때요? 이제 솔루션 탐색기를 스마트하게 사용할 수 있겠지요?

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 희정 2012.03.26 17:31 Address Modify/Delete Reply

    아. Scope to This 기능은 정말 좋네요. :D

Visual Studio 2005버전부터 만들어온 VSGesture 확장 도구가 Visual Studio 2008, Visual Studio 2010, 그리고 Visual Studio 11버전까지 나왔습니다. VSGesture는 Visual Studio에서 마우스 오른쪽 버튼을 이용하여 제스쳐를 하면 여러 가지 동작을 하는 확장 도구 입니다.

   

   

   

현재 이 확장 도구는 이미 오픈 소스로 공개를 하였답니다.

http://vsgesture.codeplex.com

   

그 밖에 오픈 소스로 공개한 다른 것들도 구경해 보시고요.

Umc.Core Framework http://umccore.codeplex.com/

jQuery DateTimePicker http://umcdatetimepicker.codeplex.com/

MEFGeneric http://mefgeneric.codeplex.com/

vutpp for VS2010 http://vutpp.codeplex.com/

   

기타 무료 확장 도구 및 Visual Studio 백서

http://www.powerumc.kr/ko-kr/products.aspx

   

   

웹을 통해 이 버전을 다운로드 받으려면 다음의 링크를 참고하세요.

Visual Studio 11, 2010 - http://visualstudiogallery.msdn.microsoft.com/e03c91ff-e20d-4dcc-822b-172a68c40f5b

Visual Studio 2005, 2008 - http://visualstudiogallery.msdn.microsoft.com/F5007932-0720-492B-8A51-631D5265F6B7

   

   

Visual Studio 2010, 11 에서는 Tools(도구) -> Extension Manager(확장 관리자)를 이용하여 바로 설치할 수 있습니다.

   



Posted by 땡초 POWERUMC

댓글을 달아 주세요

Visual Studio Extensibility 라고 부르는 VSX를 Visual Studio 2010에서 Visual Studio 11로 업그레이드를 해야 하는데, Visual Studio 11버전부터 그리 어려운 작업이 아닙니다.

과거 VSX 프로젝트를 Visual Studio 2008에서 Visual Studio 2010으로 업그레이드하려면 좀 골치가 아팠습니다. 기존에는 코드 에디터 제어를 Visual Studio Native에서 제공하는 Interface를 사용했지만, Visual Studio 2010부터 코드 에디터가 WPF로 바뀌면서 이 부분은 모조리 변경해야 했거든요.

  

  

아시다시피 Visual Studio Gallery에 공개한 VSGesture for VS2008버전과 VSGesture for VS2010의 구현이 완전 달라졌을 정도니까요. 물론 이 확장 기능은 필자가 VSGESTURE.CODEPLEX.COM에 공개해 놓았으니 소스 코드도 받으실 수 있습니다.

  

Visual Studio 11로 VSX 업그레이드에 대한 더 자세한 내용은 다음의 문서를 참고하시기 바랍니다.

http://msdn.microsoft.com/en-us/library/hh567449(v=vs.110).aspx

  

일단 Visual Studio 11에서 프로젝트를 엽니다.

Visual Studio 11에서 프로젝트를 열어보니, 알아서 몇몇 파일들은 알아서 체크아웃이 되네요. 아마도 Resources 파일과 관련해서 뭔가가 바뀌었나 봅니다.

  

Source.Extension.VsixManifest 파일을 엽니다.

이 메니페스트 파일은 배포에 필요한 정보를 담고 있습니다. 확장 기능의 고유 GUID와 확장 기능 이름, 버전, 컨텐트 정보 등이 담겨져 있습니다.

그런데 그냥 XML 파일이 열리네요. Visual Studio 2010 SDK를 설치하면 그나마 GUI가 제공이 되었는데, 아직 Visual Studio 11 Beta SDK 라서 제공이 안되나 봅니다.

  

[Visual Studio 2010 SDK 의 GUI Manifest 구성 에디터]

  

어쨌든 XML 파일이 열리더라도 그리 어려운 작업은 아닙니다. 그냥 몇 가지 구성만 추가해 주면 됩니다.

  

SupportedProducts 구성 추가

XML 내용의 SupportedProducts 섹션에 다음과 같이 Visual Studio 11버전과 지원할 Edition 목록을 추가하면 됩니다.

  

  

어셈블리 참조를 추가해 줍니다.

이 어셈블리들은 Visual Studio 11 SDK 를 설치하시고, 다음의 경로에서 찾을 수 있습니다.

%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\VSSDK\VisualStudioIntegration\Common\Assemblies\v4.0

  

  • Microsoft.VisualStudio.Editor.dll
  • Microsoft.VisualStudio.Language.Intellisense.dll
  • Microsoft.VisualStudio.Shell.10.0.immutable.dll
  • Microsoft.VisualStudio.Shell.11.0.immutable.dll
  • Microsoft.VisualStudio.Shell.11.0.dll

  

  

그 외에…

실제로 VSX의 기능에 따라 변경해 주어야 할 부분이 더 많더군요. 그 부분은 VSX 개발하시는 분들이 알아서 하시리라 믿습니다.^^

Posted by 땡초 POWERUMC

댓글을 달아 주세요

개발자에게 Visual Studio 11의 가장 큰 장점 중에 하나가 될 바로 코드 에디터 입니다. 특히 C++ 개발자에게 원성을 샀던 부실했던 C++ 코드 에디터는 기존의 C,#, VB.NET 과 동등할 정도로 코드 에디터의 구현에 충실해 다른 확장 도구의 도움 없이도 충분히 사용이 가능합니다. (Visual C++ 의 코드 에디터는 그 흔한 코드 컬러링도 기대 이하의 수준이었거든요)

   

C++ 코드 에디터

C++ 개발자에게는 C++ 코드 편집기의 컬러링과 인텔리센스는 정말 희소식일 것 같습니다. C++ 개발자는 기본적인 코드 작성에 Visual Assist 툴에 많이 의존하였었지만, 이제 외부 도구의 도움이 없이도 코드 작성에 어려움은 없을 것 같습니다. 

아래의 Visual Studio 2010과 Visual Studio 11의 C++ 코드 에디터를 그냥 눈으로 쓱 훑어보시기 바랍니다.

   

Visual Studio 2010의 C++ 코드 에디터

   

Visual Studio 11의 C++ 코드 에디터

   

   

   

C++/CLI 코드 에디터

특히 C++/CLI 를 자주 쓰는 분들에게는 더욱 특별할 수 있을 겁니다. C++/CLI 는 이전버전까지 예쁜 컬러링은 물론이거니와 인텔리센스도 작동하지 않는 암울한 환경에서 코드를 작성해야 했었습니다. 특히 C++/CLI 를 이용하여 C++ 코드를 단위 테스트할 때 무척 유용하였는데, 이번 컬러링과 인텔리센스 기능으로 더욱 활용도가 높아질 것 같습니다.

마찬가지로 Visual Studio 2010의 C++/CLI와 Visual Studio 11의 C++/CLI의 코드 에디터를 한번 보시죠.

   

Visual Studio 2010 C++/CLI 코드 에디터

   

Visual studio 11 C++/CLI 코드 에디터

C#, VB.NET 과 동급한 레벨로 인텔리센스와 코드 컬러링을 제공합니다. 그리고 Code Snippet도 제공되니 코딩이 한껏 즐거워지겠네요.

   

   

   

JavaScript 코드 에디터

JavaScript 는 웹 개발 환경에서 필수 언어로써, 개발 툴에서 JavaScript 인텔리센스 지원이 점점 좋아지고 있네요. Visual Studio 11 Beta 에서는 JavaScript 인텔리센스의 성능이 향상이 되거나 HTML5 등을 지원하는데요.

그 중, Lazy Initialize와 Lazy Loading 부분에서 상당히 만족할만한 수준으로 인텔리센스 기능이 좋아졌습니다.

   

JavaScript 코드 에디터에 대한 더 자세한 내용은 다음의 링크를 참고하십시오.

http://msdn.microsoft.com/en-us/library/bb385682(v=vs.110).aspx

   

JavaScript 코드 에디터의 인텔리센스가 얼마나 똑똑해 졌는지 아래의 예시를 보면서 비교해 보시기 바랍니다.

   

Visual Studio 2010 JavaScript 인텔리센스

인텔리센스가 C#, VB.NET 과 다르게 인텔리센스의 범위가 축소가 되지 않고 그냥 다~~~ 보여주지요.

   

   

Visual Studio 11 JavaScript 인텔리센스

JavaScript 인텔리센스가 C#, VB.NET 에서 사용하는 것과 똑같이 입력하는 문자에 따라 점점 인텔리센스 범위가 축소가 됩니다. 그리고 인텔리센스 상자 오른쪽에 시그너처도 함께 표시해 주네요.

   

   

JavaScript OOP 프로그래밍 인텔리센스

특히 JavaScript OOP 프로그래밍을 할 때는 인텔리센스의 도움을 많이 받게 되지요. Visual Studio 11 의 JavaScript 구문을 제대로 분석하여 인텔리센스를 제공해 주는 것 또한 막강한 Visual Studio 11 기능이라고 할 수 있습니다.

특히 Visual Studio 2010을 사용할 때 필자는 JavaScript OOP 프로그래밍을 절대 Visual Studio 2010에서 하지 않았답니다. 왜냐하면 제대로 인텔리센스를 보여주지 못하거나 올바른 인텔리센스 목록이 제공이 되지 않으면, 아차 하는 순간 코드가 동작을 안하거든요.

   

마찬가지로 Visual Studio 2010과 Visual Studio 11의 JavaScript OOP 인텔리센스를 비교해보시죠.

   

Visual Studio 2010 JavaScript OOP 인텔리센스

아주 간단한 JavaScript Initialize 패턴과 Simple Factory 패턴의 New() 메서드를 인식하지 못합니다. 물론 아래의 코드는 잘못된 코드가 아니겠지요.

   

Visual Studio 11 Beta JavaScript OOP 인텔리센스

Visual Studio 2010 JavaScript 인텔리센스에 비해 Visual Studio 11 Beta 는 Lazy Initialize 패턴과 Simple Factory 패턴 구문을 정확하게 분석하여 인텔리센스 목록에 New() 메서드를 깔끔하게 보여주고 있습니다.

   

   

Posted by 땡초 POWERUMC

댓글을 달아 주세요

  1. 미냉이 2012.03.14 15:45 Address Modify/Delete Reply

    와우 정말 희소식입니다 ㅡㅠ

솔루션 탐색기의 코드 미리 보기

솔루션 탐색기에서 코드 파일의 클래스나 메서드, 필드 정보를 TreeView에서 확장하여 바로 볼 수 있게 되었군요. 물론 하위 정보들을 더블 클릭하면 바로 코드의 위치로 이동하겠죠.

   

설마 다른 개발 도구를 사용하는 분들이 보시면 여태 그런 기능도 제공이 안되었냐고 오해할 수 있을 수 있겠군요. 아래의 모든 기능들은 Microsoft에서 개발하여 배포한 Visual Studio 확장 도구를 통해 사용이 가능했었고, Visual Studio 11에 와서 Product Features로 들어가게 된 것들입니다.

   

이전 버전인 Visual Studio 2010에서 필수 앱이었죠.

PowerCommands for Visual Studio 2010, Productivity Power Tools

   

   

   

코드 윈도우 고정 핀

자주 사용하는 코드 파일을 아예 핀을 이용하여 좌측으로 고정할 수 있습니다. 필자는 구현 클래스나 참조 클래스들의 탭 위치가 뒤죽박죽이 되면 열 받아서 'Close All Windows' 를 해버리고 다시 정리하는 습관이 있었는데, 이 고정 핀 덕분에 효과를 톡톡히 보고 있습니다.

   

솔루션 탐색기 창의 다중 인스턴스

이번 Visual Studio 11에서는 솔루션 탐색기를 다중 인스턴스로 열어서 사용이 가능합니다. 아래의 그림과 같이 솔루션 탐색기가 여러 개가 열려 있지요.

필자도 이런 기능이 꼭 필요했답니다. 왜냐하면 솔루션의 폴더 구조가 복잡하거나 프로젝트 양이 많아지게 되면 솔루션 탐색기에서 마우스 휠을 올렸다 내렸다 하면서 파일을 찾느라 정신이 없거든요. 솔루션 탐색기를 한 두어개 열어놓고 미리 자주 탐색하는 위치에 스크롤을 해놓으면 훨씬 편리하겠지요…?

   

   

   

여러 툴 윈도우에 검색 기능 제공

여러 툴 윈도우에 검색 기능이 강화가 되었습니다. 자칫 "모두 똑같은 검색 아니야?" 라고 하실 수 있겠지만, 각각 검색의 기능은 다르게 작동합니다. 예를 들면, TEAM EXPLORER인 경우 원하는 Work Item을 찾거나 SharePoint 문서를 찾는데 활용할 수 있고, SOLUTION EXPLORER에서는 파일의 내용이나 파일 이름으로 검색을 할 수 있겠지요.

다음은 툴 윈도우에서 제공하는 검색 기능들 입니다.

   

솔루션 탐색기 검색

   

단위 테스트 검색

   

팀 탐색기 검색

   

도구 상자 검색

Posted by 땡초 POWERUMC

댓글을 달아 주세요