Tips about Zsh on macOS

macOS가 Catalina로 버전업이 되면서, 터미널의 기본 shell이 Zsh가 기본값으로 변경되었습니다. 이에 따른 몇가지 팁들 정리.


  • 환경설정 파일은 .zshrc

기존 bash shell의 경우, .bashrc 파일을 사용했다면, Zsh의 경우 .zshrc 파일을 사용함


  • 터미널에서 색상 지원

기본 설정이 색상지원이 안되도록 되어 있어, 밋밋한 흰색만 나옴. 색상 지원이 가능하게 하려면, .zshrc 파일 내에 다음의 문구 추가하면 됩니다.

autoload -U colors && colors
export CLICOLOR=1

  • 프롬프트 변경

Shell의 프롬프트는 PS1이라는 환경변수를 통해 설정 가능, 기본 값은 색상값 없이 정보만 표시하도록 되어 있어 다음과 같이 보이는데,

이를 색상과 같이 좀 이쁘게 설정하려면, .zshrc 내에 PS1 값을 다음과 같이 설정하면 됩니다.

export PS1="%{%F{green}%}%n@%m%f: %{%F{blue}%}%1~ %f%# "

다시 쉘을 실행해보면,

Zsh의 경우 다양한 플러그인을 통해 다양한 정보를 프롬프트에 표시할 수 있습니다만, 전 복잡한건 딱 질색인 타입이라, 위 상태만으로도 만족합니다..^^


  • root shell 변경

root의 shell은 또 bash가 기본값으로 설정되어 있습니다. macOS에선 root shell을 사용할 일이 거의 없는지라 상관없지만, 변경하고자 한다면,

$ sudo dscl . -change /Users/root UserShell /bin/sh /bin/zsh

와 같이 입력하면 root에서도 zsh를 기본값으로 사용할 수 있습니다.

iCloud Drive 강제 동기화 하기

맥북, 아이패드, 아이폰 등에서 파일 및 데이터를 공유하여 사용하기 위해서 iCloud Drive를 사용 중입니다. 요 근래 맥북에 업데이트되는 과정에서 iCloud Drive의 데이터가 동기화되지 않거나, 특정 프로그램에서 링크가 깨지는 등의 증상이 나타나서 해결책을 찾아보았습니다.

에러증상 #1

“documents” can’t be opened because the original item can’t be found

에러증상 #2

맥북의 iCloud Drive의 파일과 다른 기기와의 파일 리스트가 서로 다름

이를 해결하기 위해선,

먼저 ~/Library/Application Support/CloudDocs 폴더를 지운다. 그리고, bird, cloudd 프로세스를 중지한다.

$ rm -rf ~/Library/Application Support/CloudDocs
$ killall bird
$ killall cloudd

이렇게 되면, iCloud Drive의 리스트가 업데이트 되고, 다시 재동기화하는 과정을 진행한다.

끝.

Python으로 macOS Text to Speech 엔진 (NSSpeechSynthesizer) 사용해보기

로봇이든 다른 분야에서든 TTS (Text To Speech) 엔진이 필요할 때가 있는데, 보통은 오픈 소스로 공개된 저품질의 엔진이나, 클라우드 엔진을 사용하곤 한다. 물론 요즘 딥러닝 기술이 많이 발전하여 학습 후 실제 목소리와 비슷한 소리를 내는 것도 가능하다곤 하지만, 그건 논외로 하고….

macOS에는 NSSpeechSynthesizer라는 훌륭한 품질의 TTS 엔진 – 그것도 거의 모든 나라의 목소리가 포함되어 있는 – 이 내장되어 있다. 이를 사용하기 위해선 Swift나 ObjectC를 사용할 수도 있지만, 사용하기 쉬운 Python을 이용해서 사용도 가능하다.

먼저 필요한 패키지를 설치한다. 이를 위해 Python3, pip3가 설치되어 있어야 한다. Homebrew (https://docs.brew.sh/Installation)를 이용하면 쉽게 설치 가능하다.

$ pip3 install -U pyobjc

pyobjc 모듈은 Python과 ObjC 간 연결을 위한 것이다. pyobjc는 메타모듈로 이를 설치하면 사용에 필요한 거의 모든 모듈을 다 설치한다.

이제 Python3를 이용하여 다음의 스크립트를 실행해본다.

from AppKit import NSSpeechSynthesizer

speech = NSSpeechSynthesizer.alloc().initWithVoice_("com.apple.speech.synthesis.voice.yuna.premium")
speech.startSpeakingString_(u'안녕? 만나서 반가워요.')

한국어 유나의 목소리로 맑은 음성을 들려줄 것이다. 이외에도 제어를 위한 다양한 함수들이 존재한다.

speech.isSpeaking()
speech.stopSpeaking()

사용 가능한 목소리 리스트를 확인하려면 다음과 같이 입력한다.

>> NSSpeechSynthesizer.availableVoices()

고품질의 목소리를 미리 다운로드 받아야 한다. System Preferences > Accessibility > Speech 에서 System Voice를 선택, Customize 항목으로 들어가면 각 나라별 목소리 리스트와 다운로드 받을 수 있는 체크박스가 존재한다.

끝.

Refresh hosts on macOS

많은 이유로 /etc/hosts 파일에 아이피 및 호스트 이름을 추가하여 사용할 경우가 많은데, Ubuntu에선 hosts 파일을 수정하기만해도 반영이 되는 반면, macOS에선 반영이 되지 않는다. (아마 이번 Catalina에서부터 그런듯..)

구글링을 해본 결과 hosts 파일을 수정하고, 터미널을 열어 다음과 같이 실행 해줘야 업데이트 되는듯 하다.

$ sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

끝.

Setup MicroPython on ESP32 (for macOS)

CP210x 드라이버 설치 (https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)

esptool 설치 (pip3가 없는 경우, homebrew를 이용해 설치한다)

$ pip3 install esptool

보드를 연결하고, 기존 flash 모두 초기화

$ esptool.py --chip esp32 -p /dev/tty.SLAB_USBtoUART erase_flash

esptool.py v2.6
Serial port /dev/tty.SLAB_USBtoUART
Connecting........__
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: 84:0d:8e:0c:c9:f0
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 2.9s
Hard resetting via RTS pin...

펌웨어 다운로드 (https://micropython.org/download/#esp32)

펌웨어를 보드에 Flash 한다.

$ esptool.py --chip esp32 -p /dev/tty.SLAB_USBtoUART write_flash -z 0x1000 esp32-bluetooth.bin

esptool.py v2.6
Serial port /dev/tty.SLAB_USBtoUART
Connecting.....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: 84:0d:8e:0c:c9:f0
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1549888 bytes to 970594...
Wrote 1549888 bytes (970594 compressed) at 0x00001000 in 85.5 seconds (effective 145.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

보드의 전원을 껐다가 다시 인가하고, 터미널에서 다음과 같이 입력하여 REPL 환경으로 진입.

$ screen /dev/tty.SLAB_USBtoUART 115200

처음엔 아무런 내용이 나타나지 않지만, 명령어를 입력하면 됨. 평소 사용한 REPL 환경와 동일.

>>> print("hello")
hello
>>> 

REPL 환경에서 나오려면, ctrl + a, ctrl + \ 키를 순서대로 누르고, 화면 밑 프롬프트가 나오면 y를 눌러 종료 가능.

Adafruit에서 제공하는 Micro Python Tool을 이용해 보드 내부의 파일 시스템에 파일을 넣거나 스크립트를 실행할 수 있음.

$ pip3 install adafruit-ampy

보드 내부 파일 시스템에 있는 파일들 표시

$ ampy -p /dev/tty.SLAB_USBtoUART ls

/boot.py

다음의 명령어를 이용해 파일들 조작 가능.

ampy
Usage: ampy [OPTIONS] COMMAND [ARGS]...

  ampy - Adafruit MicroPython Tool

  Ampy is a tool to control MicroPython boards over a serial connection.
  Using ampy you can manipulate files on the board's internal filesystem and
  even run scripts.

Options:
  -p, --port PORT    Name of serial port for connected board.  Can optionally
                     specify with AMPY_PORT environment variable.  [required]
  -b, --baud BAUD    Baud rate for the serial connection (default 115200).
                     Can optionally specify with AMPY_BAUD environment
                     variable.
  -d, --delay DELAY  Delay in seconds before entering RAW MODE (default 0).
                     Can optionally specify with AMPY_DELAY environment
                     variable.
  --version          Show the version and exit.
  --help             Show this message and exit.

Commands:
  get    Retrieve a file from the board.
  ls     List contents of a directory on the board.
  mkdir  Create a directory on the board.
  put    Put a file or folder and its contents on the board.
  reset  Perform soft reset/reboot of the board.
  rm     Remove a file from the board.
  rmdir  Forcefully remove a folder and all its children from the board.
  run    Run a script and print its output.

보드에 있는 LED로 GPIO 테스트. 13번 핀에 연결되어 있음.

>>> import machine
>>> led = machine.Pin(13, machine.Pin.OUT)
>>> led.value(1)
>>> led.value(0)

일단은 여기까지.

참고링크: https://github.com/pvanallen/esp32-getstarted

Launchpad에 아이콘 수 조정 & 초기화

macOS를 처음 설치하고 나면 런치패드(Launchpad)의 아이콘이 상당히 크게 보여진다. 한 화면에 7×5로 나타내다보니 그런 것인데, 터미널에서 간단한 입력을 통해 이 숫자를 조정할 수 있다.

터미널을 열고 다음과 같이 입력한다.

$ defaults write com.apple.dock springboard-rows -int <세로로 보여질 숫자>
$ defaults write com.apple.dock springboard-cols -int <가로로 보여질 숫자>
$ killall Dock

와 같이 하면 다음과 같이 바로 적용된다.

추후 다시 기본 크기로 돌아가려면 위 옵션에서 크기를 다시 입력하면 된다. 기본 크기는 7×5이다.

더불어 Dock과 Launchpad를 초기화 할 수 있는 명령어도 존재하는데,

$ defaults delete com.apple.dock
$ killall Dock
$ defaults write com.apple.dock ResetLaunchPad -bool true
$ killall Dock

와 같이 실행하면, 처음 설치했을때와 같이 설정되고, 사용자 프로그램들은 2페이지에 자동으로 추가된다.