한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
HackFair 출품작 소개 3탄!~ ash로 다양한 기기를 하나의 디바이스로 제어해 보세요!
2012년 12월 6일 목요일
세상에는 우리가 편리한 삶을 누릴 수 있게 도와주는 다양한 기기가 있습니다. 하지만, 몇몇 기기는 익숙치 못하고 누군가에겐 불편한 조작방법으로 인해 다루기가 쉽지 않습니다.
더 많은 사람들이 더 많은 기기를 편리하게 다룰 수 있게 된다면
세상은 더 편리해 질 수 있지 않을까요?
그런 생각에 이 프로젝트를 시작했습니다.
ash는 자신에게 더 익숙한 기기를 이용해 자신에게는 덜 익숙한 기기를 편하게 다룰 수 있게 도와주는 소프트웨어이자, 이를 개발하는 프로젝트의 이름입니다.
2012년 4월 GDG Suwon 에서 개최한
Hackathon
에 참가, ash의 전신인 MonkeyPySon을 개발해 아이디어 우수상을 받았고, 2012년 Google Hackfair 를 맞아 다듬고 개선해 ash라는 이름으로 전시된 것을 계기로, 이렇게 구글 디벨로퍼 블로그에 소개되게 되었습니다.
ash 로 할 수 있는 것
카카오톡, 문자 앱과 같이 좁은 터치스크린을 이용해야 하는
안드로이드 폰의 어플리케이션을 컴퓨터의 키보드와 마우스로 제어
할 수 있습니다.
손안의
안드로이드 폰을 이용해 컴퓨터의 볼륨을 높이고 줄이거나 프리젠테이션 도구, 또는 터치패드로 사용
할 수 있습니다.
다수의 컴퓨터와 안드로이드 폰 / 타블렛 등의 기기를
하나의 키보드와 마우스
또는 터치스크린으로 제어할 수 있습니다.
프로그래밍 지식 없이 손쉽게
PC 또는 안드로이드용
어플리케이션의
자동화 테스트
를 만들고 버튼 하나로, 또는 정해진 시간마다 자동으로 실행시킬 수 있습니다.
이 외에도 제가 상상치 못한 일들을 하실 수 있습니다.
ash 란 무엇인가?
ash는 PC, 안드로이드 등의 다양한 기기를 하나의 기기에서 편리하게 제어할 수 있는 기능을 제공하는 커맨드 기반 실행 환경입니다.
ash는 PC, 안드로이드 등의 다양한 기기에 설치될 수 있으며, ash가 설치된 기기는 다른 ash가 설치된 기기의 마우스를 움직이거나 키보드를 누르고 화면을 터치하는 등의 제어가 가능합니다. 이를 이용해 사용자는 PC의 키보드/마우스로 안드로이드 기기의 카카오톡이나 문자 앱 등을 조작하고, 거꾸로 안드로이드 기기를 이용해 PC의 볼륨을 높이고 줄이거나 프리젠테이션 도구, 리모콘으로 활용할 수 있습니다.
물론, PC로 PC를, 안드로이드 기기로 안드로이드 기기를 제어하는 것도 가능합니다.
ash의 구조와 설계
ash는 기본적으로 리눅스나 DOS의 커맨드 프롬프트처럼 텍스트 기반 명령어를 입력받아 동작하는 구조로 설계되었습니다. 사용자의 의도는 ash가 지정한 매우 간단한 문법을 따라 ash가 이해 가능한 언어로 표현되며(expression), ash는 이를 해석, 기기를 제어함으로써 사용자의 의도를 수행(evaluation) 합니다.
이에 따라 ash는 아래 그림과 같이 사용자로부터 키보드 / 마우스 등으로 입력을 받아 ash 문법에 유효한 명령어로 만들어 해석기에 전달하는 User Interface 계층, ash 문법의 명령어를 받아 이를 해석하고 처리하는 Evaluator 계층, 그리고 해석된 사용자 의도에 따라 기기를 제어하거나 내부 데이터를 처리하는 Controller 계층으로 구성되어 동작합니다.
User interface 계층은 사용자의 입력을 단순 키보드/마우스 등의 기기만이 아니라 파일이나 네트워크로부터 받는 것도 가능합니다. 따라서 ash 문법에 기초한 간단한 스크립트/프로그램을 작성하거나 ash 끼리 맺은 네트워크를 통해 통해 다른 기기를 제어하는 것이 가능합니다.
제 3의 개발자 또는 사용자는 자신에게 익숙하고 편리한 개발환경을 사용해 ash 문법을 지원하여 다른 기기의 ash와 상호 동작 가능한 자신만의 ash를 구현할 수 있습니다.
또한, User Interface 계층은 사실상 ash 환경 위에서 동작하는 하나의 응용 프로그램이기에, 가속도 센서나 자신이 직접 만든 컨트롤러를 이용하는, 자신만을 위한, 또는 다른 사람들을 위한 참신한 User Interface 계층의 wrapper를 쉽게 만들어 기존의 ash 위에 동작하는 응용 프로그램을 만들 수 있습니다.
즉, ash는 하나의 완결된 응용 프로그램이 아니라, ash의 문법에 따라 작성된 프로그램을 실행 가능하고 다른 개발 환경에서 만들어진 프로그램과도 쉽게 결합 가능한 하나의 실행 환경입니다.
따라서 일반 사용자들은 ash 문법을 이해할 필요 없이 자신에게 유용한 Interface를 제공하는 ash 기반 응용 프로그램을 사용함으로써, 키보드, 마우스 등의 자신에게 익숙하고 편리한 인터페이스로 원하는 기기를 제어할 수 있습니다.
ash는 ashdi 라는 PC용 기본 인터페이스를 제공해 키보드, 마우스로 기기들을 편리하게 제어할 수 있는 기능을 제공하며, AshFa라는 안드로이드용 ash를 이용해 터치스크린 인터페이스를 제공하고 있습니다. 다른 개발자 / 사용자 분들도 ash 문법을 이용하며 다양한 인터페이스를 개발해서 사용하거나 공개, 판매 할 수 있습니다.
ash 문법
ash의 문법은 ash의 핵심으로 Lisp과 python 등의 언어에서 영감을 얻어 설계되었으며, 지극히 간단하여 쉽게 배우고 사용할 수 있습니다. 자세한 내용은 생략하고, 여기서는 그 특징 몇가지만 설명합니다.
모든 표현식은 리스트
ash의 문법으로 만들어지는 모든 문장은 표현식(expression)으로 간주되고, 해석기는 단순히 이 표현식을 recursive 하게 계산/평가(evaluation)하고 그 결과를 내놓습니다.
모든 표현식은 리스트입니다. 리스트는 하나 이상의, 더이상 해석되지 않는 단순 문자인 atom 또는 또다른 리스트를 원소로 가지는 자료 구조입니다. atom은 함수와 유사한 operator 와 data로 나뉘어, 각 data는 각 operation 에서 숫자 또는 문자열 등의 적절한 type으로 해석됩니다.
리스트의 첫번째 원소가 오퍼레이터인 리스트는 함수 호출문이라 불리어, 두번째부터 나머지 원소들을 인자로 받아 오퍼레이터가 가리키는 명령어 리스트를 해석한 결과를 해석 결과로 내놓게 됩니다.
그렇지 않은 경우 단순한 리스트로 해석됩니다.
코드 == 데이터
따라서 ash language 에서는 함수 호출문의 리스트가 곧 코드이자 함수로, 평범한 데이터 리스트와 똑같은 형태로 취급됩니다. 때문에 보다 유연하고 간편한 코드 실행 / 작성이 가능합니다.
콜백
사용자의 이벤트를 자유롭게 정의 가능하며, 해당 이벤트 시에 호출될 operator를 callback 이라는 이름으로 지정 가능합니다. callback은 자신이 호출될 이벤트와, 자신이 호출되었을 때 evaluate 될 명령어의 리스트(코드)로 구성됩니다.
사용자의 이벤트는 이벤트 모드 / 이벤트 타입 / 이벤트 값의 세가지 데이터 atom으로 구성되는 리스트입니다.
User Interface 계층에서 하는 대부분의 일은 키보드/마우스 등의 입력장치로부터 이 형식의 이벤트를 만들어 주는 것입니다. 이벤트 모드 / 타입 / 값은 문자열 데이터 atom 이므로, callback 등록 시 어떤 내용으로든 자유롭게 줄 수 있습니다.
ash 에서는 함수 정의/구현과 같은 기능을 제공하지 않고, callback 등록만을 제공합니다. 사실 ash의 많은 오퍼레이터가 alias type 이벤트에 대한 callback 입니다. 이러한 유연하고 일관된 구조의 callback 덕분에 다양한 인터페이스를 큰 복잡함 없이 구현 가능하고 다양한 기능을 유연하게 추가할 수 있습니다.
이벤트 녹화 기능
ash를 이용하면 다양한 기기를 편리하게 제어할 수 있습니다. 한걸음 더 나가서, 반복적인 제어를 쉽게 자동화 할 수 있다면 좋을 것입니다.
ash는 ash를 이용해 사용자가 기기를 제어하는 일련의 동작을 그대로 녹화, 손쉽게 재생 가능한 event recording 기능을 제공합니다.
이를 이용해 손쉽게 매크로 작성 등이 가능하며, 안드로이드 / PC 소프트웨어를 막론한
사용자 레벨 테스트 자동화
를 간단하게 적용 가능합니다.
데모 영상
지난 구글 핵페어에서 촬영된 ash의 데모 영상입니다.
http://youtu.be/XaA7UHmpJsU
사용된 기술
PC용 ash 의 구현은 python과 Java Swing을 이용해 이루어졌으며, 안드로이드 기기 제어를 위해 android에서 제공하는 monkeyrunner가 사용되었습니다.
Android용 ash인 AshFa의 구현은 여타 안드로이드 어플리케이션과 동일하게 Android SDK와 Java를 이용해 이루어졌습니다.
실행 환경
현재까지(2.0.0.0 버전) ash는 Ubuntu와 Android FroYo 이상 버전만을 정식 지원하고 있으며, Java Runtime과 Android SDK tools의 설치를 필요로 합니다.
앞으로 가야할 길
아직 갈길이 멉니다. 속도가 더딜 수 있겠지만 꾸준히 개선해 나갈 예정입니다.
앞으로 지속적으로 다양하고 편리한 기능을 추가 구현하고 Mac OSX과 MS Windows 를 지원할 계획이며, 추후 Chrome 위에 ash를 올릴 계획을 검토 중입니다.
라이센스
ash는 GPL v3(
http://www.gnu.org/licenses/gpl-3.0.html
)를 라이센스로 사용하는 오픈 소스 소프트웨어입니다.
누구나 소스코드를 열람하고 사용할 수 있습니다만, GPL v3의 제약 사항을 지켜 주셔야 합니다. 대표적인 GPL v3의 제약사항은, 소스코드를 수정하시고 재배포 하신다면, 수정하신 소스코드도 공개하셔야 한다는 것입니다. 자세한 사항은 GPL v3의
링크
를 따라가 확인해 주시기 바랍니다.
ash 의 문법, 구조를 기반으로 다른 ash와 호환 가능하게 처음부터 다시 구현하신 경우라면 GPL v3를 따르지 않고 각 개발자의 라이센스를 따를 수 있습니다. 기존 소스 코드를 사용하지 않고 기존 ash 위에서 동작 가능하게 만든 ash 기반 응용 프로그램들 또한 마찬가지입니다.
공식 홈페이지와 배포처
공식 홈페이지(ash 관련 정보와 소스코드 제공)
AshFa(Android용 ash) Google Play 다운로드 / 설치 페이지
AshFa 소스 코드 저장소
팀 구성 및 문의처
현재 ash는 박성재 1인 팀 구조로 진행되고 있습니다.
ash와 관련해 질문이나 의견 등이 있으신 경우 언제든
sj38.park@gmail.com
으로 연락주시면 감사하겠습니다.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed