Sunday, August 18, 2019

git : commit 나누기


$ git checkout -b dev
~~ 작업 ~~
$ git commit -m "어떤 많은 분량의 작업"
>> SHA-1 84f5148

PR을 받기에 너무 길다는 가정하에 다음과 같이 commit 을 나눈다.

$ git checkout master
$ git checkout -b pr1
$ git cherry-pick 84f5148
너무 많은 변화가 있으니, 이전 commit으로 돌아간다.

$ git reset HEAD~1
~~ 변화의 일부만 남기는 작업~~
branch pr1 을 PR하는동안 다음 branch 를 더 준비한다.

------
$ git checkout -b PR2
$ git cherry-pick 84f5148
$ git mergetool
------
* mergetool에서 적당히 잘 작업했으면 git reset 명령은 필요 없다.
* 위 작업(branch 생성,  cherry-pick, merge resolve)을 반복하면 하나의 commit을 여러개의 branch의 commit으로 잘게 나눌 수 있다.

Tuesday, July 23, 2019

latex install

$ sudo apt-get install texlive-latex-base
$ tlmgr init-usertree
$ sudo apt-get install xzdec
$ tlmgr option repository ftp://tug.org/historic/systems/texlive/2015/tlnet-final
$ tlmgr update --self
$ tlmgr install IEEEtran

Thursday, March 7, 2019

Del G5 관리 후기

freedos로 제공된 ubuntu 16.04를 삭제하고 다시 설치했는데, 생긴 문제 정리.

서비스 메뉴얼 링크>
https://www.dell.com/support/manuals/kr/ko/krdhs1/g-series-15-5587-laptop/g5-5587-servicemanual/before-working-inside-your-computer?guid=guid-5d3b1051-9384-409a-8d5b-9b53bd496de8&lang=en-us

freezing>
어떻게 해결한건지 정확히 모르겠다.
1) 우선 grub window에서 'E' 키를 누르고, network enable 설정, recovery mode로 부팅한 다음 apt-get install nvidia-384  를 실행한 덕분인지
(sudo service lightdm stop 는 실행안하고도 설치후 재부팅 하니까 잘 적용됬다.)

2) 아니면 다음 링크대로 수정한거 때문인지.
https://askubuntu.com/questions/875173/nmi-watchdog-bug-soft-lockup-cpu2-stuck-for-23s-plymouthd305

TODO : 다음 포맷때에는 1) 안 먼저해서 문제 해결되는지 확인하기.


키캡 관리문제>
https://www.youtube.com/watch?v=kh88cn_rtLo

https://www.computerhope.com/issues/ch001244.htm
아래방향 화살표 키캡을 분해했는데, 적어도 이건, 키캡 상단이 걸쇠(위쪽이 열려있고, 아래쪽이 막힌 ㄴ자 ) 에 걸려있고, 아래쪽이 snap-fit? 방식으로 걸려있음.
따라서 키캡 아래쪽을 먼저 scissor-switch 와 분해해야 걸쇠에 걸린 흰지가 안 부러짐.

Thursday, February 28, 2019

find_package가 지원되는 CMake module 만들기

Reference : https://cmake.org/cmake/help/v3.4/module/CMakePackageConfigHelpers.html#example-generating-package-files

여기서 예시된 cmake 프로젝트의 이름은 Foo 이다.
configure_file을 직접 쓸수도 있으나, 그보다는
include(CMakePackageConfigHelpers) 호출후 사용할 수 있는 명령어
configure_package_config_file 를 권장한다.
아래는 CMakeLists.txt의 예시로, 취소선은 version 선언을 생략한 것이다.

# foo/CMakeLists.txt
project(Foo)

set(INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include/)     # find_package 로 알려줄 header file path
set(LIB_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})    # library 가 생성될 path 

...

add_library(foo src/foo.cpp)
target_link_libraries(foo some_lib_a some_lib_b some_lib_c)
...


include(CMakePackageConfigHelpers)                  # 명령어 추가. 
configure_package_config_file(cmake_modules/FooConfig.cmake.in  # <Input>
  ${PROJECT_NAME}Config.cmake                                   # <Output> 
  INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}               # <Desntination> of output. Both Absolute,relative
  PATH_VARS INCLUDE_DIR LIB_DIR)                                # <PATH_VARS> are the variables which contain install destinations

write_basic_package_version_file(
  ${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake
  VERSION 1.2.3
  COMPATIBILITY SameMajorVersion )

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
              ${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake  # Version information 생략
        DESTINATION lib/${PROJECT_NAME}/cmake ) # /usr/local/lib/Foo/cmake/에 FooConfig.cmake 설치

# foo library 에 dependent한 module이 some_lib_[a/b/c] 를 자동으로 링크할 수 있도록 export.
export(TARGETS foo some_lib_a some_lib_b some_lib_c
 FILE "${CMAKE_BINARY_DIR}/fooTargets.cmake" )
export(PACKAGE ${PROJECT_NAME} ) 


이상의 cmake lists의 명령어가 cmake_modules/FooConfig.cmake.in 파일을 참고하여, FooConfig.cmake를 binary directory (예를 들면 build) 에 생성한다.

추가적으로 필요한 FooConfig.cmake.in 는 다음과 같다.

# foo/cmake_modules/FooConfig.cmake.in
set(FOO_VERSION x.y.z)
@PACKAGE_INIT@ 

# configure_package_config_file 함수가 호출하는 .cmake.in 에서는 set 대신 set_and_check를 권장.
set_and_check(FOO_INCLUDE_DIR "@PACKAGE_INCLUDE_DIR@"
set_and_check(FOO_LIB_DIR "@PACKAGE_LIB_DIR@")
set_and_check(FOO_SRC_DIR "@PROJECT_SOURCE_DIR@") # ${} 대신 @ 연산자로 foo module의 변수를 넘겨줌.

include("@CMAKE_BINARY_DIR@/fooTargets.cmake")  # CMakeLists.txt에서 export한 target들을 포함.
check_required_components(Foo) # component를 선언했을때만 필요


Bar project에서 foo package를 찾아보자.

# bar/CMakeLists.txt
...

find_package(Foo REQUIRED)
include_directories(${FOO_INCLUDE_DIR})  # FooConfig.cmake.in 에서 선언한 경로를 확인할 수 있음

add_executable(bar src/main.cpp)
target_link_libraries(bar foo) # libfoo.so 를 링크



...


TODO
export(PACKAGE ) 의 역할.
https://stackoverflow.com/questions/48661265/what-does-export-package-mean

P.S
cmake 를 실행하고 나면, build directory에 CMakeCache.txt가 생성된다. 다음은 find_package(OpenCV)의 결과, CMakeCache.txt에 추가된 message이다.

//The directory containing a CMake configuration file for OpenCV. OpenCV_DIR:PATH=/~~~~~/OpenCV-3.3.1-dev

이를통해 find_package는 /~~~~ 에 설치된 opencv의 configuration file, "OpenCVConfig.cmake" 를 선택했음을 알 수 있다. 해당 config.cmake

파일을 보면, find_package를 실행함으로써 주어진 정보들에 대해 알 수 있다.



Friday, February 15, 2019

git merge tool

$ sudo apt-get install meld
$ git config -global merge.tool meld
$ git merge [Other branch to merge]
$ git mergetool