-
Notifications
You must be signed in to change notification settings - Fork 1
ash Instruction Korean version
아이폰을 시작으로 본격적으로 시작된 스마트 기기 시장의 확대에 따라 스마트폰, 태블릿 PC 등의 다양한 기기로 사람들의 편의성이 증가되고 있다. 비단 스마트폰 기기만이 아니다. 세상은 새로운 기술과 기기의 개발로 점차 편리해져 왔고, 편리해져 가고 있다. 하지만, 많은 사람들이 새로운 기기의 익숙하지 못하고 기존에 사용 중이던 기기와의 연동이 불편한 인터페이스에 어려움과 불편함을 겪고는 한다. 예를 들어 키보드 / 마우스에 익숙한 사람은 터치 인터페이스가 불편할 수 있고, 반대의 경우도 있으며, 특히 두개의 인터페이스가 모두 가능하지만 호환이 되지 않아 별도의 인터페이스를 불편하게 사용해야 하는 경우( 예: 컴퓨터에 앞에 앉아서 익숙한 키보드와 마우스를 두고 스마트폰을 두손으로 들고 터치 ) 가 있다. 일반인의 기호와 능숙도에 따른 가벼운 문제라고도 생각할 수 있지만, 기기 접근성 문제를 겪는 장애인 등을 생각하면 이 문제의 중요성을 알 수 있다.
본 프로젝트(ash)는 PC 또는 android 등의 기기를 하나의 기기에서 다른 기기들을 제어할 수 있게 해, 자신에게 더 익숙하고 편리한 기기의 인터페이스로 덜 익숙하고 불편한 기기를 제어할 수 있게 하는 기능을 제공해 앞서 제시한 문제를 해결하는 설계와, 이의 레퍼런스 구현을 개발, 공개한다.
ash의 가장 기본적인 사용 시나리오는 다음과 같다: ash는 다양한 기기 위에 설치되며, ash가 설치된 기기 끼리는 어떤 기기에서든 어떤 기기들이든(심지어 자기 자신도) 제어가 가능하다.
그러나, 단순히 PC와 android 두개의 기기만을 연결해주는 하나의 닫힌 어플리케이션이 아니라, 간단한 문법의 표현문과 해석기로 이루어져 스크립트 / 프로그램 작성이 가능하고 주요 구성 요소를 쉽게 제어 / 대체 / 조립 가능해 다양한 형태의 응용과 변형이 가능한 형태로 설계 되었다. 또한, 명령어 문법과 구현시 충족되어야 할 요구 사항 표준 스펙을 reference 구현을 통해 제공하므로 이를 활용한 3rd party 개발자, 폭넓은 사용자의 생태계 / 비즈니스 모델이 가능하다.
본 문서에서는 ash의 설계와 ash 문법의 특징을 설명하고, 이 구조를 활용한 외부 3rd party 개발자, 일반 사용자를 포함한 echo system을 제안한다.
ash 프로젝트는 저자(박성재) 개인의 취미 활동으로 시작되어 GPLv3 라이센스 하에 오픈소스 개발 방식으로 진행되고 있으며, 올해 11월 17일 ~ 18일 양일간 구글에서 주최한 Google Hackfair 2012 행사에 전시 작품으로 선정되어 전시된 바 있다.
ash는 기본적으로 리눅스나 DOS의 커맨드 프롬프트처럼 텍스트 기반 명령어를 입력받아 동작하는 구조로 설계되었다. 사용자의 의도는 ash가 지정한 매우 간단한 문법을 따라 ash가 이해 가능한 언어, 즉 표현식으로 표현되며(expression), ash는 이를 해석, 기기를 제어함으로써 사용자의 의도를 수행(evaluation) 한다.
즉, ash는 하나의 닫힌 응용 프로그램이 아니라, ash의 문법에 따라 작성된 스크립트 / 프로그램을 실행 가능한 하나의 인터프리터와 같은 실행 환경이다.
이에 따라 ash는 아래 그림과 같이 사용자가 키보드 / 마우스 또는 무언가로 내린 입력을 받아 ash 문법에 유효한 표현식을 만들어 해석기(evaluator)에 전달하는 User Interface 계층, ash 문법의 명령어를 받아 이를 해석하고 처리하는 Evaluator 계층, 그리고 해석된 사용자 의도에 따라 기기를 제어하거나 내부 데이터를 처리하는 Controller 계층으로 구성되어 동작한다.
User interface 계층은 사용자의 입력을 단순 키보드/마우스/조이패드 등의 기기만이 아니라 파일 시스템이나 네트워크로부터 받는 것도 가능하다. 따라서 ash 문법에 기초한 간단한 스크립트 / 프로그램을 작성하거나 ash 끼리 맺은 네트워크를 통해 다른 기기를 제어하는 것이 가능한 것이다.
간단한 프로토콜을 통해 파일시스템 또는 네트워크 연결 등의 연결로부터 입력을 받을 수 있는 User Interface 계층의 개방성을 이용해 마이크나 뇌파 탐지기, 또는 자신이 직접 고안한 컨트롤러등의 기상천외한 입력도구를 이용하는, 자신만을 위한, 또는 다른 사람들을 위한 참신하고 편리한 User Interface 계층의 wrapper application을 쉽게 만들어 기존의 ash 위에 동작하는 응용 프로그램을 만들 수 있다.
ash는 기본적으로 ashdi 라는 PC용 기본 인터페이스 wrapper application을 제공해 키보드, 마우스로 기기들을 편리하게 제어할 수 있는 기능을 제공하며, AshFa(ash for Android)라는 안드로이드용 ash를 이용해 터치스크린 인터페이스를 제공하고 있다. 사용자나 다른 개발자도 ash 문법과 구조를 이용해 다양한 인터페이스를 지원하는 ash 기반 application을 개발해서 사용하거나 배포, 판매 할 수 있다.
따라서 일반 사용자들은 ash 문법을 이해할 필요 없이 자신에게 유용한 Interface를 제공하는 ash 기반 응용 프로그램을 사용함으로써, 키보드, 마우스 등의 자신에게 익숙하고 편리한 인터페이스로 원하는 기기를 제어할 수 있다.
결국 ash가 설치된 모든 기기들은 어떤 기기에서도 어떤 기기든 제어할 수 있는 기본 원리는 모두 ash 문법과 구현상의 필요 사항들을 지키기 때문인데, 이런 문법과 구현상의 필요 사항들은 추후 문서화 되어 제공될 예정이며, 현재로써도 공개된 레퍼런스 구현의 소스 코드를 이용해 이를 알 수 있으므로, 현재 ash 레퍼런스 구현의 성능이나 지원하는 기기 목록이 만족스럽지 못한 사용자나 외부 개발자는 해당 표준을 지키며 자신의 필요 기능을 제공하는 자신만의 ash 구현을 개발/사용/배포 할 수 있다. AshFa는 조금 특수한 경우지만 그러한 또다른 ash 구현의 한 예이다. ash Language
ash의 문법은 ash의 핵심으로 Lisp과 python 등의 언어에서 영감을 얻어 설계되었으며, 지극히 간단하여 쉽게 배우고 사용할 수 있다. 여기선 자세한 내용은 생략하고, 그 특징 중 몇가지만 설명한다.
ash의 문법으로 만들어지는 모든 문장은 표현식(expression)으로 간주되고, 해석기는 단순히 이 표현식을 평가(evaluation), 그 평가된 결과값을 반환한다.
모든 표현식은 리스트로 평가된다. 리스트는 하나 이상의, 더이상 해석되지 않는 단순 문자열인 atom 또는 또다른 리스트를 원소로 가지며, 원소들의 순서를 갖는 집합을 의미하는 자료 구조이다. atom은 operator 와 data로 나뉘는데, operator는 ash의 기본 내장(built-in) 또는 사용자 정의 alias 타입 callback(callback 에 대해서는 뒤에서 설명)의 trigger event value이며, data는 각 operation 에서 operation의 필요에 따라 숫자 또는 문자열 등의 적절한 type으로 해석된다.
리스트의 첫번째 원소가 오퍼레이터인 리스트는 함수 호출문이라는 특수한 형태로 해석되어, 두번째부터 나머지 원소들을 인자로 받아 오퍼레이터가 가리키는 명령어 리스트를 해석한 결과를 해석 결과로 내놓게 된다. 그렇지 않은 경우 단순한 데이터 리스트로 해석된다.
따라서 ash language 에서는 함수 호출문의 리스트가 곧 코드이자 함수로, 평범한 데이터 리스트와 똑같은 형태로 취급된다. 때문에 보다 유연하고 간편한 코드 실행 / 작성이 가능하며, 인자로 코드를 넘기고 받는 것도 가능하다.
예를 들어 다음의 코드는 click 이라는 이름의 alias callback을 정의하는데, callback이 실제 수행할 코드는 단순히 하나의 코드이자 데이터인 형태를 가지고 인자로 전달된다.
ash$ add_callback [default alias click] [ \
[touch DOWN [arg 1] [arg 2]] \
[touch UP [arg 1] [arg 2]] \
]
사용자의 이벤트를 자유롭게 정의 가능하며, 해당 이벤트 시에 호출될 operator를 callback 이라는 이름으로 지정 가능하다. callback은 자신이 호출될 이벤트와, 자신이 호출되었을 때 evaluate 될 명령어의 리스트(코드)로 구성된다. 사용자의 이벤트는 이벤트 모드 / 이벤트 타입 / 이벤트 값의 세가지 데이터 atom으로 구성되는 리스트이다.
User Interface 계층에서 하는 대부분의 일은 키보드/마우스 등의 입력장치로부터 이 형식의 이벤트를 만들어 주는 것이다. 이벤트 모드 / 타입 / 값은 문자열 데이터 atom 이므로, callback 등록 시 어떤 내용으로든 자유롭게 줄 수 있다.
ash 에서는 함수 정의/구현 기능을 따로 제공하지 않고, callback 등록만을 제공한다. 앞서 이야기 했듯 ash의 오퍼레이터는 built-in 또는 사용자 정의 alias type 이벤트에 대한 callback 일 뿐이다. 물론 일부 built-in 콜백은 ash language가 아닌 다른 programming language로 구현되어 있다.
이러한 유연하고 일관된 구조의 callback 덕분에 다양한 인터페이스를 큰 복잡함 없이 구현 가능하고 다양한 기능을 유연하게 추가할 수 있다.
ash를 이용하면 다양한 기기를 편리하게 제어할 수 있다. 한걸음 더 나가서, 반복적인 제어를 쉽게 자동화 할 수 있다면 좋을 것이다. ash는 ash를 이용해 사용자가 기기를 제어하는 일련의 동작을 그대로 녹화, 손쉽게 재생 가능한 event recording built-in operator를 제공한다. 이를 이용해 손쉽게 매크로 작성 등이 가능하며, 안드로이드 / PC 소프트웨어를 막론한 사용자 레벨 테스트 자동화를 간단하게 만들고 적용하는데 사용 할 수 있다.
앞서 설명했듯 ash는 단순히 PC와 android 두개의 기기만을 연결해주는 하나의 닫힌 어플리케이션이 아니라, bash 등의 shell 처럼 간단한 문법의 표현문으로 이루어지는 CLI 커맨드 기반의 인터프리팅 실행 환경으로, 이 문법을 이용한 스크립트 / 프로그램 작성이 가능하며, 프로그램의 아키텍쳐를 쉽게 대체 / 조립 가능한 형태로 설계되어 있다. 따라서 이 문법과 구현시 반드시 충족되어야 할 요구 사항(built-in operator interface 목록과 그 specification) 표준을 구현한 레퍼런스 구현을 제공한다.
이를 바탕으로 앞서 설명한 바와 같이 독자적 인터페이스 / 기능 제공 어플리케이션 또는 ash의 또다른 구현이 가능하다. 이렇게 또다른 개발자에 의해 만들어진 또다른 ash 구현은 사용자에게 또다른 기기를 또다른 성능 등의 요구사항을 만족하는 기능과 편의를 제공함과 동시에, ash 표준을 만족하므로 기존에 다른 기기 위에 구현된 ash와 손쉽게 상호 작용해 ash로 제어 가능한 전체 기기 pool을 지속적으로 넓혀 나간다는 장점이 있다. 또한, ash 기반 어플리케이션도 ash 표준 문법/기능 위에 만들어지므로, 어떤 ash 구현 위에서 한번 작성되었고 사용자에게 좋은 사용자 경험을 줬던 인터페이스는 그대로 사용할 수 있다는 장점이 있다.
이런 특성을 바탕으로 다음과 같이 ash를 중심으로 개발자, 사용자들을 아우르는 새로운 생태계 모델을 제시한다.
- 개발자는 ash 기반의, 새로운 사용자 기능 / 인터페이스를 지원하는 응용 프로그램 또는 보다 특화된 성능과 또다른 기기를 지원하는 새로운 구현을 개발, 배포
- 사용자는 자신의 기기에 걸맞는 ash 구현과 자신의 취향과 사용자 경험을 극대화 시켜줄 수 있는 ash 기반 응용 프로그램을 선택
ash 기반 생태계 내에서 가능한 사용자 시나리오는 생태계의 구성원의 상상력에 따라 무궁무진 하겠지만, 다음과 같이 예상해 볼 수 있으며, 이 중 대부분의 기능들은 현재 레퍼런스 구현에서도 가능하다.
- 카카오톡, 문자 앱과 같이 좁은 터치스크린을 이용해야 하는 안드로이드 폰의 어플리케이션을 컴퓨터의 키보드와 마우스로 제어
- 손안의 안드로이드 폰을 이용해 컴퓨터의 볼륨을 높이고 줄이거나 프리젠테이션 도구, 또는 터치패드로 사용
- 다수의 컴퓨터와 안드로이드 폰 / 타블렛 등의 기기를 하나의 키보드와 마우스 또는 터치스크린으로 제어
- 프로그래밍 지식 없이 손쉽게 PC 또는 안드로이드용 어플리케이션의 자동화 테스트를 만들고 버튼 하나로, 또는 정해진 시간마다 자동으로 실행
- 이 외에 제 3의 개발자의 상상에 달린 수많은 일들
ash는 여전히 진행 중인 프로젝트이며, 계속해서 개선되고 진화할 것이다. 현재 단계에서 계획 중인 미래 계획은 다음과 같다.
- 레퍼런스 구현에 보다 편리한 기본 interface 제공
- ash 표준의 문서화 정립 및 배포
- 매뉴얼 / 문서 작성
- MacOSX / MS Windows 지원
ash는 github의 호스팅을 통해 간단한 소개와 레퍼런스 구현, 데모 비디오 등을 제공하는 공식 홈페이지를 제공하며, URL은 다음과 같다. http://sjp38.github.com/ash/
지금까지 이야기한 바와 같이 ash는 보다 많은 사람들이 보다 많은 기기를 더 편리하게 제어할 수 있게 도와주는 프로젝트로 이를 위한 소프트웨어 설계구조와 그 레퍼런스 구현을 개발하고 있으며, 이를 활용한 생태계를 제안하고 있다.
expression과 evaluation이라는 간단한 메커니즘을 바탕으로 하는 커맨드 기반 이터레이팅 실행 환경으로 설계되었으며, 그 문법과 설계 구조의 유연함이 특징이다.
이런 유연성과 이식하기 쉬운 표준 덕분에 제 3의 어플리케이션/코어 개발자, 사용자와의 호환성 높은 echo system 구축이 가능하며, 이를 통해 더 많은 사람들이 더 많은 기기를 더 편리하게 제어하게 도울 수 있을 것이다.
- GPL v3 라이센스: http://www.gnu.org/licenses/gpl-3.0.html
- Google Hackfair 2012: http://googledevkr.blogspot.kr/2012/12/google-hackfair-summary.html
- Google developer official blog ash 소개 포스트: http://googledevkr.blogspot.kr/2012/12/ghackfair-winners-ash.html
- Android input system: http://s.android.com/tech/input/index.html
- ash 공식 홈페이지: http://sjp38.github.com/ash/
- AshFa(ash For Android) 구글 플레이 스토어 배포처: https://play.google.com/store/apps/details?id=org.drykiss.android.app.ashfa&feature=search_result#?t=W251bGwsMSwxLDEsIm9yZy5kcnlraXNzLmFuZHJvaWQuYXBwLmFzaGZhIl0.