[Ubuntu] Ubuntu Memo widget
Install Ubuntu memo widget
sudo add-apt-repository ppa:umang/indicator-stickynotes
sudo apt-get update
sudo apt-get install indicator-stickynotes
Install Ubuntu memo widget
sudo add-apt-repository ppa:umang/indicator-stickynotes
sudo apt-get update
sudo apt-get install indicator-stickynotes
std::map은 Key와 value를 갖는 데이터 구조이다. std::map의 경우 key값에 따라서 정렬이 되지만, std::unordered_map은 hash_map과 동일하게 내부적으로 key 값에 의해 정렬되지 않는다. std::unordered_map은 c++11에서 STL 표준으로 추가되었다.
std::unordered_map의 장점은 빠른 탐색속도이다. N개의 데이터 쌍을 갖는 std::map의 경우에는 O(logN)의 탐색속도를 갖는 반면, std::unordered_map은 O(1)의 탐색속도를 갖는다.
map은 기본적으로 red-black tree 기반으로 되어 있다. 따라서 모든 데이터는 key 값을 기준으로 정렬되어 저장되어 진다. map의 경우 입력되는 key 값의 분포가 고르지 못할 경우 balancing에 대한 비용이 계속 들어가기 때문에 성능이 저하된다. (탐색속도 O(logN)은 보장된다)
unordered_map은 hash_table 기반의 hash_container이다.
node들을 정렬할 필요가 없기 때문에 탐색에서 꾸준한 성능 (O(1))의 성능을 보장한다.
다음과 같은 알고리즘 문제에서 탐색을 위해 unordered map을 사용하면 빠르게 탐색이 가능하다
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map;
vector<int> result;
for(int i = 0 ; i < nums.size() ; ++i){
int complement = target - nums[i];
if(map.find(complement)!= map.end() && map[complement] != i){
result.push_back(i);
result.push_back(map[complement]);
return result;
}else{
map[nums[i]] = i;
}
}
return result;
}
};
우분투에서 Clion 과 같은 프로그램을 설치하면 프로그램을 시작하기 위해서는 shell로 구동을 시작해야 한다. 이런 경우 터미널을 열고 실행을 해야하기 때문에 실수로 터미널을 끄게 되면 프로그램이 꺼지게 된다. 상당히 불편하다. 이런경우 프로그램을 실행하는 shell파일을 desktop 프로그램으로 등록하고, 윈도우키를 누르고 실행하면, 터미널 실행없이 바로 실행시킬 수 있다.
sudo gedit /usr/share/applications/clion.desktop
만약 위의 경로에 설정을 하면 모든 사용자에게 적용되며, local 사용자에게만 적용시키고 싶은 경우 다음의 경로에 추가한다.
sudo gedit /home/user/.local/share/applications/clion.desktop
/usr/share/applications
폴더에는 다양한 desktop application들이 등록되어 있다. 위의 파일을 생성 후 다음과 같이 작성해 준다.
[Desktop Entry]
Type=Application
Terminal=false
Name=clion
Icon=/path/to/icon/icon.svg
Exec=/home/jjy0923/CLion-2020.1.2/clion-2020.1.2/bin/clion.sh
Terminal
은 프로그램 실행 시 terminal을 열지 말지를 설정할 수 있다. Exec=
는 실행시키고자 하는 shell 파일을 지정해 주면 된다. Icon=
에는 프로그램의 icon을 설정해 주면 되는데 따로 지정하고 싶지 않은 경우는 삭제해버리면 된다. Nam=
은 프로그램을 시작하기 위한 application 이름이다.
여기까지는 일반적인 등록 방법이다. 하지만 만약 clion에서 ROS를 사용한다면 조금 달라진다. 터미널을 열고 clion을 실행시킬 때는 .bashrc
에 등록되어 있는대로 source /opt/ros/melodic/setup.bash
가 실행되기 때문에 문제가 없지만, desktop으로 실행시키게 되면 ros 환경이 불러와지지 않는다. 따라서 ROS를 사용하는 환경이라면 다음과 같이 Exec
를 수정해 준다.
[Desktop Entry]
Type=Application
Terminal=false
Name=clion
Icon=/path/to/icon/icon.svg
Exec=bash -c "source /opt/ros/melodic/setup.bash && /home/jjy0923/CLion-2020.1.2/clion-2020.1.2/bin/clion.sh"
당연히 source /opt/ros/melodic/setup.bash
에서 melodic
은 본인이 사용하고 있는 ROS 버전으로 변경해줘야 한다.
위와 같이 desktop application을 등록하게 되면 윈도우키를 누르고 다음과 같이 프로그램을 검색해서 실행할 수 있다.
Ubuntu 에서 Realsense 카메라 설치하기
# server's public key 등록:
sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE || sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
# 서버 추가
# ubuntu 16.04
sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main" -u
# ubuntu 18.04
sudo add-apt-repository "deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo bionic main" -u
# 라이브러리 설치
sudo apt-get install librealsense2-dkms
sudo apt-get install librealsense2-utils
# developer, debug package 설치 (optional)
sudo apt-get install librealsense2-dev
sudo apt-get install librealsense2-dbg
realsense driver 설치 후 realsense-viewer
를 terminal에 입력하면 뷰어가 실행된다.
# 기본 ROS package 설치
sudo apt-get install ros-$$ROS_VER-realsense2-camera
Ros camera node르 실행하기 위해서는 터미널에서 다음 명령 실행
roslaunch realsense2_camera rs_camera.launch
Git을 사용하다 보면 파일명에 한글이 들어가있는 경우 여러가지 문제가 발생한다.
이럴 때 core.quotepath를 끄면 정상적으로 돌아온다.
git config --global core.quotepath false