좌충우돌 Alfred Workflow 제작 경험담

파워팩 사놓고 기본 사용자 정도로만 사용하다가, 최근에 간단한 Alfred Workflow 2개를 만들어 봤다.

뭐 경험 후기라고 해봐야 사실 별건 없지만…

  1. API 호출해서 JSON Output 가져다가
  2. Alfred에서 사용하는 Item List로 바꿔준 정도

라고 할 수 있다.

JavaScript를 좋아하는 관계로 JXA(Javascript For Automation)를 사용하게 된 점을 제외하고는..

흔한 경험담 정도일 듯 하다.

API 호출해서 JSON Output 가져오기

CURL로 손쉽게 가져오면 되겠거니 싶었는데.. app.doShellScript() 를 사용해서 만들때 당황했던 점은…

Shell Command의 Output을 Capture 할 수 없다는 점이다. -_-;;
(뭐 사실, Output을 파일로 남기고 파일을 읽어와도 되긴 하지만…)

하지만 Pipe to subprocess stdin for JXA 에 달린 Comment 중 하나를 사용해 손 쉽게 Output을 얻을 수 있었다.

여튼, Output을 얻었으니 JSON.parse()로 손쉽게 사용할 수 있게 되었다.

Alfred에서 사용하는 Item List로 바꿔주기

이건 Alfred에서 제공하는 가이드 문서를 살펴보면 된다.

앞에서 받은 Data를 아래와 같이 XML로 만들어 주면 되겠다.

    <items>
        <item valid="YES" autocomplete="Desktop">
            <title>항목1</title>
            <subtitle>설명1</subtitle>
            <icon>아이콘1Path</icon>
        </item>
        <item valid="YES" autocomplete="Desktop">
            <title>항목2</title>
            <subtitle>설명2</subtitle>
            <icon>아이콘2Path</icon>
        </item>
    </items>

아, Alfred 3이 나오면서 기존에 사용하던 XML 방식이 Legacy가 되버렸다. 이제는 JSON으로!

어쩌지! 한글이 분해가 되버렸어!

한글을 입력하면 query 값에 한글이 분해되어 들어가 있었다.

(╯°□°)╯︵ ┻━┻

어쩌지 하고 있었는데 이미 누군가 원인을 파악 했더라!

Mac에서 alfred workflow를 만들다보면 한글 argument 비교 처리가 안 되는 현상이 있습니다. Mac에서 unicode를 NFD(Normalization Form Decomposition)으로 처리를 해서 생기는 문제입니다. Windows나 python 등에서는 NFC로 처리가 됩니다. (from http://jmjeong.com/unicode-in-alfred-workflow/)

JavaScript용을 찾다보니 unorm 라이브러리를 알게 되었고, 이걸 사용해 다시 변환해서 해결했다.

// Alfred에서 넘겨주는 문자열 q를 NFC로 처리한 다음 Encoding 함
encodeURIComponent(q.normalize('NFC'))

그 밖에…

  1. Workflow 만들다가 Step 간에 데이터 넘겨주는 부분은 어떻게 할까 싶었는데 args를 이용하면 되더라(가이드 문서에 있음)
  2. fn, ctrl, alt 키를 지정했는데 subtitle이 바뀌지 않아서 왜 그러나 싶었는데, 실제로 해당 키로 지정된 Action이 있는 경우에만 바뀌더라(역시 가이드 문서에 있음)

단순한 API 호출 결과를 Workflow에 보여주는 건 이제 단순한(?) 작업이 되어 버렸다.
(아니면 내가 단순한건가…)

p.s. @fallrootJXA 사용 경험담이 무척 큰 도움이 되었다(사실 그 전에는 JXA 존재 자체를 몰랐음). 감사요~

아케이드 케이스 조립기 #2(마무리)

이전 글

완성본

IMG_4269

IMG_4270

마무리

아빠
“아빠 한글이야호 틀어줘”
  • 40만원 미만으로 제작한 것 같다.
    • 하지만 Aliexpress에서 기다리는 시간 + 총알 충전하는 시간 + 셋팅 시간은 40만원을 초과하는 듯.
  • Marquee 위치의 LED는 교체형을 달아야 하는게 맞을듯..
    • 불 나가면 교체 안할꺼임!
  • 스티커 가격만 8만원이 넘었다.
    • 국내에서 해결하는 방법을 찾아야할듯..
      어딘가에서 본 것 같은데.. 루리웹에서 봤던가 … 음..
  • LCD가 19인치가 아니라 17인치로 했어야 했다.
    17인치로 했다면 Bezel에 Artwork을 입힐 수 있었을텐데..

    (못해서 아쉽다 쩝…)
  • T Molding이 없어서 애들이 모서리에 다칠(?) 염려가 좀 있다. 역시 비싼걸 질렀어야 했나.. (다음번에 만들때는 꼭…)
  • XBMC에 몽땅 몰아 넣으려고 했는데 생각보다 조이스틱이 잘 잡히지 않았다. XML에 뭔가 문제가 있는것인가… 조이스틱 신호를 키보드 신호로 바꿔주는걸 NodeJS로 짜다가 (뭔가 우아하지 않은것 같아서) 걍 때려쳤다.

다음에는…

  • 총알 좀 두둑히 장전.
  • Raspberry Pi 2 + AttractMode 조합.
  • 책상에 조그맣게 올려놓을 정도의 크기(1인용)로 도전!

일단 급하게 마무리! 뿅~

Windows 10 Vagrant Box 만들기

이 글은 Creating a Windows 10 Base Box for Vagrant with VirtualBox 가이드를 기반으로 하고, 중간에 안되는 부분은 다른 글을 참고로 작업했다.

나 그냥 쓰면 안되니?

그냥 최종본 쓰고 싶은 분들은… 아래 처럼 하시면 되겠다.

$ vagrant init kyungw00k/windows-10-pro-kn-x64; vagrant up --provider virtualbox
$ vagrant rdp

만들어보고 싶으신 분은 계속 읽어나가면 되겠다.

뭐가 필요한가?

작업하기 전에 설치할 건 설치하고, 다운 받을건 다운 받아놓자.

가상 머신 만들기

이름은 (영어로) 아무렇게 짓되, 몇 가지 수정할 필요가 있다.

  • 불필요한 하드웨어는 Disable 시키자. 예를 들면 사운드 카드!(필요하면 그냥 냅둬도 된다.)
  • 메모리는 1024MB로!(늘리고 싶으면 Vagrantfile에서 변경 할 수 있을테니)

윈도우를 설치하기

Vagrant Box니 ID/PASSWORD를 모두 vagrant로 설정 해 주면 되겠다.

추가 설정

VirtualBox Guest Addition 설치하기

스크린샷 2015-09-09 오후 1.19.23

설치하고 리부팅하자.

사용자 계정 컨트롤 설정을 “알리지 않음”으로 변경

스크린샷 2015-09-09 오후 1.17.04

이후에 레지스트리 작업을 하라는데(EnableLUA=0)이 있는데, 바꾸면 Edge 등 몇몇 앱들이 동작하지 않게 된다. 필요하면 하면 됨.

WinRM 서비스 활성화

관리자 모드로 명령프롬프트를 띄운 다음 아래 항목을 한 행씩 실행하자.

winrm quickconfig -q
winrm set winrm/config/winrs @{MaxMemoryPerShellMB="512"}
winrm set winrm/config @{MaxTimeoutms="1800000"}
winrm set winrm/config/service @{AllowUnencrypted="true"}
winrm set winrm/config/service/auth @{Basic="true"}
sc config WinRM start= auto

방화벽 상태가 게스트 또는 공용 네트워크로 연결된 경우, 첫 행에서 방화벽 관련 이상한 에러가 뜬다.

이 때는 PowerShell을 관리자 모드로 실행한 후, 아래 코드를 넣어보자.

$nlm = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]"{DCB00C01-570F-4A9B-8D69-199FDBA5723B}"))
$connections = $nlm.getnetworkconnections()
$connections |foreach {
    if ($_.getnetwork().getcategory() -eq 0) {
        $_.getnetwork().setcategory(1)
    }
}

위 스크립트를 실행하면 방화벽 상태가 개인 네트워크로 바뀌게 된다.

스크린샷 2015-09-09 오후 1.12.52

PowerShell Execution Policy 변경

스크린샷 2015-09-09 오후 1.08.32

관리자 모드로 PowerShell을 실행시킨 다음 아래 항목을 실행하자.

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

A를 눌러 일괄 승인한다.

원격 데스트톱 연결 허용

연결을 허용하면 vagrant rdp 로 접속할 수 있게 된다.

스크린샷 2015-09-09 오후 1.06.48

(optional) Tweak!

  • 시각 효과를 변경한다든지
  • 가상 메모리 설정을 변경한다든지

기타 등등 해주심 될듯

자, 이제 Box로 Exporting 해보자

디렉토리 하나 만들어 Vagrantfile을 하나 만들자.

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure(2) do |config|
config.vm.guest = :windows
config.vm.communicator = "winrm"
config.vm.boot_timeout = 600
config.vm.graceful_halt_timeout = 600

# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network :forwarded_port, guest: 3389, host: 3389
config.vm.network :forwarded_port, guest: 5985, host: 5985, id: "winrm", auto_correct: true

# config.vm.provider "virtualbox" do |vb|
# # Customize the name of VM in VirtualBox manager UI:
# vb.name = "yourcompany-yourbox"
# end
end

그리고 아래 명령을 수행해 Box를 만든다.

$ vagrant package --base 가상머신이름 --output `pwd`/windows.box --vagrantfile `pwd`/Vagrantfile

사용해보기

앞에서 만들어진 windows.box를 추가해서 사용해보자. 이미지 이름은 windows-10-pro-kn-korean-x64라고 가정한다.

$ vagrant box add /path/to/output/windows.box --name windows-10-pro-kn-korean-x64

이상 없이 박스가 추가 되었다면, 이제 정말 띄워보자.

$ vagrant init windows-10-pro-kn-korean-x64
$ vagrant up

별다른 에러 문구가 없다면, 이제 원격 데스크톱으로 접속해보자.

$ vagrant rdp

패스워드가 틀리다고 나오는데 이때, vagrant 입력해주면 접속 된다.
(패스워드를 plaintext로 줘서 그런거 같은데… 해싱하면 해결된다는듯. 아몰랑~)

배포하기

만든 Vagrant Box를 배포할 수 있는 곳이 있더라.
여기에 계정 파고 지금까지 만든 box를 올려놨다.
(링크 : https://atlas.hashicorp.com/kyungw00k/boxes/windows-10-pro-kn-x64)

마지막으로…

실제 로컬에서 box를 만드는 시간도 그렇고, Provider를 여러개 추가해야 하는 이슈가 있는데, 이런걸 한방에 해결하기 위해서는 Packer를 활용하는게 좋을 듯 하다.

아케이드 케이스 조립기 #1.5

관련 글

스티커 주문!

이미지 파일을 구해서 출력할까 했는데… 걍 질러버렸다.

스크린샷 2015-09-02 오후 4.39.16

스크린샷 2015-09-02 오후 4.53.43

(이번 달 안에는 오겠지… 음…)

xboxdrv를 버리기로 결심함

조이스틱을 xboxdrv로 잡긴 했지만.. 실제로 조이스틱은 하나다.
다시 말해.. 축이 X1, Y1, X2, Y2, 버튼이 16개인 조이스틱인걸로..

게임하다가 간섭도 좀 생기는것 같고…
RetroArch 말고 다른 에뮬은 사용할 수 없는 문제 아닌 문제도 있고…
조이스틱이 두 개 인걸로 만들면 좀 해결되지 않을까 하는 생각에…

mk_arcade_joystick_rpi 프로젝트를 사용하기로 결심!

IMG_4243

일단 이놈은 없에는걸로 결정했다(다신 안쓸꺼야).

기존 조이스틱을 RPI에 연결하기 위해 GPIO Layout을 화면에 띄워놓고,

IMG_4242

LCD 들어내서 배선 작업을 다시…한땀 한땀 연결했다.
mk_arcade_joystick_rpi 설치하고 evtest 했는데 다행히도 잘 됨!

EmulationStation을 버리기로 결심함

어짜피 게임기의 End User는 우리집 큰 아들. 버림받기 전까지는 아마 동영상 뷰어로 활용할 예정인지라… 관련해서 OpenELEC, RetroArch 키워드로 찾아보니 나름 많이들 사용하는 조합 같다.

그렇다고 바로 삽을 들긴 그래서… Mac에서 간단히 테스트를 해보니 잘 됨!
OpenELEC + Rom Collection Browser + RetroArch 조합으로 (또 다시) 결정!

스티커는 9월 중순 쯔음에 올테니… 어찌되었건 마무리는 9월 안에는 되겠지!

아케이드 케이스 조립기 #1

나도 아케이드 게임기 만들고 싶어!

만들까? 귀찮은데, 돈도 없고.. 하지만 만들면 재밌을 것 같아. 그렇겠지 음.. 에라 만들자!!!

재료

제작기간

2015.07 ~2015.08

Enclosure

한줄 요약 : 실제 조립에 들인 물리적인 시간은 3일이 채 안된다.
Evernote Snapshot 20150706 155513
사포질 후 목공본드로 일부 접착. 뒷판은 조립하지 말았어야했…아흑!
Evernote Snapshot 20150707 134302Evernote Snapshot 20150707 134303
상단영역 조립(이제 페인트칠 해야하는데… 페인트가 없….;;) 아몰랑~
Evernote Snapshot 20150715 165256
스틱 완성. 윈도우에서는 장치가 한방에 잡히는데, Linux에서는 그렇지 못했다.
물론 장치 자체는 인식이 가능해 evtest는 되나, js0/js1 형태로는 잡지 못했다.
별별 방법이 다 있지만, Linux에서는 Xbox 360 Virtual Joystick 형태로 사용하는게 심플해보인다.
 Evernote Camera Roll 20150720 171347
대략 경첩까지 붙이고 스피커와 상단 LED 배송 전까지 일단 Holding….
CLxIKqwVAAAarDb
그 사이에 일단 게임 한판 돌려봤다.
Evernote Snapshot 20150817 175916
스피커와 LED 배송와서 배선 작업하고 스피커 붙이고 EVTEST 중 한 컷!

Hardware/Software

케이스 조립은 그렇다 치고, 내부 치장은 중간에 삽질을 좀 했다.

삽 #1

XBOXDRV의 존재를 잘 몰랐을 때, Raspberry Pi 2로 완성해놓고 Joystick이 mouse로 잡히는 부분에서 첫 번째 좌절이 왔었다.
덕분에 평생 쓰지 않을 것 같았던 evtest의 존재를 알게 되고, xboxdrv까지 알게 되었(지만 딱히 달갑진 않았)다.
나름 “Low-Cost Driven Arcade Machine” 이라며 시간과 삽질로 1차로 마무리 했다.
그러다 HyperSpin이 눈에 들어왔다.

삽 #2

윈도우에서는 장치가 한방에 잡히는 장점과 HyperSpin에 매료되었지만, 많은 돈을 투자할 수 없었고, 마침 장터에 중고 Atom 미니PC가 나와서 급 질렀다. 역시 기승전”윈도우” 인가 싶었…
하지만 아래 이유로 다시 Raspberry Pi 2로 돌아왔다.
  1. 요걸로 HyperSpin을 돌려볼까 했는데 너무 느림.
  2. 스위치가 2개 – 모니터 전원도 켜야하고 PC 전원도 켜야했다.
    1. 사실 한 스위치로 몰려면 미니PC 뜯어서 전원부 땜질 해야하는데.. 귀찮았다!
    2. 멀티텝 3구짜리 사는게 아까웠(다고 말하긴 그렇지만 돈을 더 들이기 싫은게 맞다고 볼 수 있)다.
  3. https://www.youtube.com/watch?v=DJC2EB-za3s 보고 다시 Raspberry Pi 2 + RetroPie 조합도 나쁘지 않다는 생각이 들었다.
여튼 나름 완성이라고 했었는데 요거 땜시 내부를 뒤집어 까는 일이 다반사였고, 배선도 다시 했었다.

후기

지금은 게임도 얼추 잘 되고 하는데… 몇 가지 문제 점이 있다.
  1. 오류겐이 잘 안나간다. 스틱이 4방향이라… 음… 아몰랑~
  2. 지나친 배선 작업으로 가끔 버튼이 안눌린다. 선정리 다시 해야하나… 아몰랑(2)~
  3. 케이스가 안 이쁘다.
Side Artwork하고 Marquee 작업해야 마무리가 될 것 같은데…(스틱 Skin은 포기)
두 번째 조립기는 스킨 하고 난 담에 하는걸로… 언제 할 수 있을까?