터미널용 유틸리티를 개발하다 보면 출력 메시지에 색상을 부여하여 가독성을 높이고 싶을 때가 있다.

예를 들어 오류가 발생했다면 빨간색 텍스트로 표시한다거나 경고 문구는 노란색 텍스트로 표시하는 것이다.

파이썬으로 유틸리티를 개발할 경우 ColorConsole 모듈을 사용하면 된다.

https://code.google.com/p/colorconsole/

물론 이 외에도 다양한 모듈들이 존재하지만, 윈도우와 유닉스를 모두 지원하는 모듈을 찾지 못했다.

터미널에서 색상 문자열을 출력하는 방법은 플랫폼마다 다르다.

POSIX시스템에서는 아주아주 쉽다. 그냥 ANSI코드를 사용하면 된다.(예: "\x1b[30m".. 이야기에서 안시코드가지고 놀던 기억이....새록새록.)

그러나 윈도우 command prompt의 경우 별도 WINAPI를 호출해야 한다.(쩝..MS Command Prompt는 안시코드를 지원하지 않는다. 마치 디렉토리 구분자를 '\'로 만든 것과 동일하다. 이로 인한 클로스플랫폼 개발이 얼마나 사소하게 어그러졌는지원...쩝. 아니면 ANSI출력을 지원하는 command prompt 대체 프로그램을 사용해야 한다.)


colorconsole 모듈에서 제공하는 예제도 깔끔하고, 특정 위치 출력같은 부가기능도 사용할 수 있으므로, 다음 문서 페이지를 참고하자.

https://code.google.com/p/colorconsole/wiki/PageName?tm=6


자세한 설명을 생략한다. 다만 해당 모듈의 소스코드에서 배울 만한 스타일에 대해서만 살짝 살펴보자.



Source: https://flic.kr/p/7ucxPT


일단 terminal.py의 get_terminal() 함수부터 보자. 이 함수는 os.name에 따라 필요한 모듈을 import한 다음, 터미널 인스턴스를 생성하여 반환한다. 즉, import module을 반드시 스크립트 시작부분에서만 사용할 수 있는 것은 아니다.

def get_terminal():
    if os.name == "nt":
        import colorconsole.win        
        return colorconsole.win.Terminal()
    if os.name == "posix":
        import colorconsole.ansi       
        return colorconsole.ansi.Terminal()
    else:
        return None # Should raise exception!


win.py모듈에서 눈에 띄는 코드 부분은 WIN32API를 호출하는 방식이다.


# Window에서 런타임이 지원하는 API 호출시 필요.
import msvcrt  
# DLL 함수 및 구조체.
from ctypes import windll, Structure 

# C처럼 구조체를 사용하기.
class COORD(Structure): 
  """struct in wincon.h."""
  _fields_ = [
    ("X", SHORT),
    ("Y", SHORT)]

# 구조체를 사용하는 방법도 C와 비슷하다.
# pt = COORD(1, 2)
# pt.x = 2

# kernel32.dll의 함수를 호출할 때 그냥 짧은 함수이름으로 alias시켜준다.
# 콘솔과 관련된 함수는 다음 웹사이트를 참고하자.
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms682073(v=vs.85).aspx
SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute

class Terminal:
    # 클래스내에서 사용하는 상수는 다음과 같이 정의한다.
    STD_INPUT_HANDLE = -10
    STD_OUTPUT_HANDLE = -11

    def __init__(self):
        # 표준 입출력의 핸들은 다음과 같이 구할 수 있다.
        # 예상대로 표준 오류 핸들은 -12이다. 
        # http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231(v=vs.85).aspx
        self.stdout_handle = windll.kernel32.GetStdHandle(Terminal.STD_OUTPUT_HANDLE)
        self.stdin_handle = windll.kernel32.GetStdHandle(Terminal.STD_INPUT_HANDLE)

참고로 만약 파이프로 리다이렉션되었는지를 감지하는 방법은 있을까?

sys.stdout.isatty()를 호출하여 True인지 False인지를 보고 실제 콘솔 출력인지 파이프로의 출력인지를 알 수 있다.



Understanding Your Language Choices for Developing Modern Apps.(MSDN 2013/09) 요약


윈도우 스토어 앱을 개발하기 위한 언어 묶음.

  • HTML + JavaScript + CSS
  • XAML + C# or VB
  • XAML + C++ 
  • DirectX + C++

언어 선택시 고려사항
  • 학습 용이성
  • 데이터 이용 방식
  • 크로스 플랫폼 지원 여부
  • 기존 레거시 코드 이식
  • 앱의 성격 : 엔터프라이즈용? 개인소매용?


언어 학습에 있어서 가장 저항이 적은 방법이 취할 수 있는 최선의 방법이자, 가장 빠른 방법이기도 함.

만약 다른 플랫폼을 고려할 경우 기존에 알고 있는 언어와 비슷한 언어는 학습이 용이.(대표적으로 ML언어들)


다양한 데이터 이용 방식 : REST, XHR, JSON, XML, SQLite

WinJS

기타 도구들.
  • Xamarin : 크로스 플랫폼을 지원하는 네이티브 코드 생성기. C#으로 코드 작성. 안드로이드, iOS, Mac OS, 윈도우 지원.
  • Apache Cordova이전 폰갭

여전히 게임같은 하이엔드 사용자 경험을 제공하려면 C++가 답임.
F#은 아직 정식으로 주요 개발 언어는 아니지만, 주목할만함.

내 생각.
  • 결국 언어를 여러개 알아둔 상태에서 자신이 개발하고자 하는 앱의 특성과 플랫폼 등에 적절한 언어를 선택할 수 있는 개발자가 되어야 한다는!! ㅡ.ㅡ;
  • 그러나 경험상 서로 다른 컨셉과 문법의 언어사이의  free Context-switching은 불가능한데, 경험을 누적하다 보면 그 시간을 줄일 수 있을 듯. 여전히 많은 연습이 필요...


영어 표현 
  • greenfield app : 새로 또는 재작성된 앱
  • brownfield app : 레거시 앱




+ Recent posts