Mac OS 초기 세팅 (개발용 세팅)

|

Mac OS 초기 세팅 (개발용 세팅)

지극히 개인적인 세팅입니다. 맥 OS 업데이트가 있을 때마다 한 번씩 초기화를 해줬더니 초기화 이후 해줘야 할 일들의 정리가 필요하더군요.


업데이트

모든 OS 공통입니다. 업데이트를 제일 먼저해줍니다. App Store를 실행해서 필요한 업데이트 모두 진행합니다.


시스템 설정

언어 설정

개발 위주로 사용하다보니 OS 언어를 한글보다는 영문으로 사용하는 것이 더 편리합니다. Language & Region 항목으로 가서 선호하는 언어를 English로 변경합니다.


Dock 설정

Dock 아이콘 크기를 조금 작게 수정하고, Magnification은 활성화하고 크기는 중상 정도로 세팅합니다. 또한 Dock에서 불필요한 아이콘들은 미리 정리합니다.


Keyboard 설정

Keyboard 세팅은 건드릴 부분이 좀 많습니다.

  • Keyboard 탭에서 Key RepeatFast로 설정
  • Delay Until RepeatShort 쪽에서 1칸 정도 왼쪽으로 설정
  • Touch Bar showsF1, F2, etc. Keys로 설정(요즘은 가급적 터치바의 기본 상태를 쓰려고 노력중입니다. 어차피 fn 키로 펑션키를 실행할 수 있으니깐요.)

Text 탭에서 다음 항목을 모두 Off로 변경해줍니다.

  • Correct spelling automatically
  • Capitalize words automatically
  • Add period with double-space
  • Touch Bar typing suggestions
  • Use smart quotes and dashes

Shortuts에서

  • Spotlight 항목의 Show Finder search window 키를 Option + E로 수정(최대한 Windows 탐색기와 비슷하게 하기 위해서)
  • Show Spotlight search 단축키는 F12로 변경(Mission Control의 Dashboard와 충돌나면, Dashboard 단축키를 사용안함으로 변경)


Display 해상도 변경

System Preferences 에서 Displays 선택합니다. Resolution 항목을 취향껏 정해주면 되는데, 저는 최고 해상도로 설정했습니다.


Sharing 설정(ssh 서버 on)

다른 PC에서 현재 맥북에 ssh 접속을 할 수 있도록 해줍니다. Sharing에서 Remote LoginOn으로 체크합니다.


Touch ID

Touch ID는 검지와 중지 2개 정도 등록하면 괜찮을 듯 싶네요.


Finder 설정

Preferences에서 다음 항목을 수정합니다.

  • General에서 New Finder windows show: 항목을 Home folder로 설정
  • AdvanceShow all filename extensions 항목을 On으로 설정


Homebrew 설치

이제 본격적인 개발용 세팅입니다. 각종 패키지를 편하게 설치하기 위해서는 Homebrew를 설치해줍니다. 자세한 것은 여기를 참조하면 됩니다.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

설치 후 brew doctor 명령어로 정상 동작하는지 확인할 수 있습니다.


Command Line Tool 설치

개발용으로는 필수적인 단계입니다. git 등 개발용 툴들을 일일이 직접 설치해도 되지만, xcode에서 제공하는 Command Line Tool을 이용하면 더 편리합니다.

xcode-select --install


한글 단축키 변경

기본 한/영 전환은 Caps Lock입니다. 불편하지 않으면 그냥 써도 되지만 저는 우측 Cmd 키가 편해서 바꾸기 위해서 키를 바꿉니다.여기를 참고해서 설치하면 됩니다.


zsh 및 Oh-My-Zsh 설치

리눅스에서도 애용하고 있는 zshOh-My-zsh를 설치해줍니다.


zsh 설치

brew install zsh


Oh-My-Zsh 설치

sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

초기 세팅은 nano .zshrc 실행해서 작성하면 되며, 기존에 Linux에서 사용하던 .zshrc 내용을 거의 그대로 사용할 수 있습니다. 제가 주로 사용하는 plugin 2개는 다음 명령어로 설치할 수 있습니다.

git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

.zshrc 파일에서 테마는 agnoster으로 정합니다.

색상 팔레트는 Preference에서 원하는 조합으로 지정가능합니다.

폰트 때문에 특수 문자 일부가 깨는 현상 발생할 수 있습니다. Powerline 폰트나 D2Coding 폰트를 설치하면 해결됩니다.


git 설정

git config --global user.name "snowdeer"
git config --global user.email "snowdeer0314@gmail.com"
git config --global core.precomposeunicode true
git config --global core.quotepath false


JDK (Java Runtime) 설치

여기에서 dmg 파일을 다운로드해서 설치합니다.


필요한 프로그램 설치


ip 설치

Mac에는 ip 명령어가 없기 때문에 ip addr 같은 명령어를 사용할 수 없습니다. 다음 명령어로 설치해줍니다.

brew install iproute2mac

MAC OS에 ROS2 설치하는 방법

|

MAC OS에 ROS2 설치하는 방법

OS 2.0 설치 방법은 자주 업데이트되거나 변경되기 때문에 아래 방법이 잘 되지 않으면 공식 홈페이지를 참고하는 편이 좋습니다. 2018년 11월 5일 기준 제가 직접 설치하면서 검증한 방법입니다.

먼저 Homebrew나 XCode CLT(Command Line Tool)는 설치가 되어 있어야 합니다. 다음 명령어를 이용해서 각각을 설치할 수 있습니다.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

xcode-select --install


그 이후 아래와 같이 필요한 컴포넌트들을 설치해줍니다.

brew install python3

# install asio and tinyxml2 for Fast-RTPS
brew install asio tinyxml2

# install dependencies for robot state publisher
brew install tinyxml eigen pcre poco

# OpenCV isn't a dependency of ROS 2, but it is used by some demos.
brew install opencv

# install OpenSSL for DDS-Security
brew install openssl

# install Qt for RViz
brew install qt freetype assimp


pip 명령어를 이용해서 다음 컴포넌트들도 설칲해줍니다.

python3 -m pip install catkin_pkg empy pyparsing pyyaml setuptools argcomplete


ROS 2 binary 다운로드

여기서는 그냥 ROS 2.0 바이너리 파일을 다운받아서 압축을 풀고 설치해줍니다. 바이너리 파일은 여기에서 다운받을 수 있습니다.

mkdir -p ~/ros2_install
cd ~/ros2_install
tar xf ~/Downloads/ros2-bouncy-macos-x86_64.tar.bz2


테스트

다음 명령어를 이용해서 잘 동작하는지 확인해봅니다. 터미널 2개를 열어서 각 터미널간 메시지 전송이 잘되는지 확인합니다.

. ~/ros2_install/ros2-osx/setup.bash

ros2 run demo_nodes_cpp talker
. ~/ros2_install/ros2-osx/setup.bash

ros2 run demo_nodes_cpp listener


CSR UTIL disabled

본격적인 ROS 2.0 개발을 하기 위해서는 맥 OS의 기본 설정인 CSR UTIL의 상태를 disable로 변경해주어야 합니다. 그렇지 않으면 터미널 외 다른 IDE 등에서 ROS 2.0 환경 설정을 가져오거나 동적 라이브러리 연동이 어렵습니다. CSR UTILdisable로 변경하는 방법은 다음과 같습니다.

맥 OS를 재시작하면서 Command + R 버튼을 눌러서 리커버리 모드로 진입합니다. 거기서 터미널을 열고 다음 명령어를 수행합니다.

$ csrutil status

$ csrutil disable

그 이후 재부팅을 해야 시스템에 적용됩니다.

Tkinter - 레이아웃에 Weight 적용하기

|

Tkinter - 레이아웃 Row, Column에 Weight 적용하기

root = tk.Tk()
root.title("SnowDeer's Tkinter Example")
root.resizable(False, False)
root.geometry("640x480")

for col in range(0, 4):
    root.grid_columnconfigure(col, weight=1)

Network Interface 우선 순위 변경하기

|

Network Interface 우선 순위 변경하기

Ubuntu에서 랜카드를 여러 개 꽂아서 네트워크 인터페이스(Network Interface)가 여러 개 존재할 경우 우선 순위를 바꾸는 방법입니다.

먼저 ifmetric를 설치합니다.

sudo apt install ifmetric

이후 다음 명령어를 이용해 Routing Table을 확인합니다.

$ route -n

Kernel IP routing table
Destination     Gateway         Genmask     Flags   Metric  Ref     Use     Iface
0.0.0.0         10.51.0.1       0.0.0.0     UG      100     0       0       eth0
0.0.0.0         192.168.0.1     0.0.0.0     UG      600     0       0       wlan0

맨 뒤의 Iface 항목이 각 네트워크 인터페이스 이름이며 Metric 항목이 우선 순위라고 생각하면 됩니다. Metric 값이 낮을 수록 우선 순위가 높습니다.

ifmetric 명령어를 이용해서 다음과 같이 우선 순위를 변경할 수 있습니다.

sudo ifmetric wlan0 50

다시 route -n 명령어로 Routing Table을 확인해봅니다.

$ route -n

Kernel IP routing table
Destination     Gateway         Genmask     Flags   Metric  Ref     Use     Iface
0.0.0.0         192.168.0.1     0.0.0.0     UG      50      0       0       wlan0
0.0.0.0         10.51.0.1       0.0.0.0     UG      100     0       0       eth0

우선 순위가 바뀐 것을 확인할 수 있습니다.

문자열(std_msg)을 수신(Subscribe)하고 전송(Publish)하는 예제 코드(C++)

|

문자열(std_msg)을 수신(Subscribe)하고 전송(Publish)하는 예제 코드(C++)

하나의 프로그램내에서 ROS 2.0 문자열 메시지를 수신하고, 바로 그 내용을 다른 토픽(Topic)으로 전송하는 예제 코드입니다. 메시지 수신부는 람다 함수로 되어 있습니다.

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

#include <iostream>

using namespace std;
using std::placeholders::_1;

const string NODE_NAME = "snowdeer_msg_echo_example";

int main(int argc, char *argv[]) {
  cout << "Hello, ROS2 ECHO Example" << std::endl;

  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared(NODE_NAME);
  auto publisher = node->create_publisher<std_msgs::msg::String>("snowdeer_output");

  auto subscription = node->create_subscription<std_msgs::msg::String>
      ("snowdeer_input", [publisher](std_msgs::msg::String::SharedPtr inMessage) {
        auto outMessage = std::make_shared<std_msgs::msg::String>();
        outMessage->data = inMessage->data;
        publisher->publish(outMessage);
      });

  auto message = std::make_shared<std_msgs::msg::String>();

  rclcpp::spin(node);
  rclcpp::shutdown();

  return 0;
}