#TIL #jenkins 메일에 많은 정보를 담자

${BUILD_LOG_MULTILINE_REGEX, regex=".*error [A-Z]+[0-9]+:.*"}

Email-ext plugin을 사용하면 콘솔 로그 메시지를 정규식(regular expression)으로 찾을 수 있다. MSVC 경고, 에러 메시지를 이메일 내용 가장 앞에 넣을 수 있다. 실패하면 이게 가장 궁금하니깐.

${BUILD_LOG_MULTILINE_REGEX} 이런 콘텐츠 토큰 종류와 설명은 Content Token Reference 옆 ? 아이콘을 클릭하면 나온다. 한참 찾았네.

#TIL #git 코드가 삭제된 커밋 찾기

$ git log -SText

Text 문자열이 삭제된 커밋을 찾는다.

-S<string> Look for differences that change the number of occurrences of the specified string (i.e. addition/deletion) in a file. Intended for the scripter’s use.

It is useful when you’re looking for an exact block of code (like a struct), and want to know the history of that block since it first came into being: use the feature iteratively to feed the interesting block in the preimage back into -S, and keep going until you get the very first version of the block.

사실 삭제만 찾는 게 아니라 추가와 삭제를 모두 찾는다.

정규식을 사용하려면 -G 옵션을 사용. 대소문자 무시하고 찾으려면 -i 옵션을 사용하면 된다.

참고

#TIL #batch backslash를 slash로 바꾸기

set TEST_VAR=C:\test\data\test.txt
set TEST_VAR=%TEST_VAR:\=/%
echo %TEST_VAR%

변수 replace를 사용해서 \ 문자를 / 문자로 변경한다.

SET _no_spaces=%_some_var: =%

공백도 쉽게 없앨 수 있다.

참고

#TIL #jenkins 스크립트로 환경 변수를 설정하고 싶다면

echo ENV_1=%ENV_1%>propsfile
echo ENV_2=%ENV_2%>>propsfile

- Create an Inject environment variables build step and set "Properties File Path" to propsfile.

젠킨스 빌드 스텝에서 고정된 환경 변수를 사용한다면 Properties Content를 사용하면 된다. 빌드 파라미터에 영향을 받는다면 다른 방법을 찾아야 한다. 환경 변수를 세팅하는 빌드 스텝에서 파일을 만들고 Properties File Path에 만든 파일 경로를 입력한다.

EnvInject 플러그인이 필요함.

참고

#TIL #batch path를 디렉토리와 파일로 분리하기

C:\>FOR %A in ("C:\Users\ohyecloudy\test folder\test.txt") DO @ECHO %~dpA
C:\Users\ohyecloudy\test folder\
C:\>FOR %A in ("C:\Users\ohyecloudy\test folder\test.txt") DO @ECHO %~nxA
test.txt

배치 스크립트(batch script) 안에서는 % 문자를 두 개 사용.

%~dp1 Expand %1 to a drive letter and path only
%~nx2 Expand %2 to a file name and extension only

parameter extensions로 지원한다.

참고

#TIL #batch 왜 echo로 파일에 리다이렉션할 때, 뒤에 공백이 생기는걸까?

C:\>ECHO abcd > test.txt

이렇게 하니깐 test.txt에 abcd 다음에 trailing whitespace가 붙는다. 어떻게 없애지?

C:\>ECHO abcd>test.txt

이렇게 > 리다이렉션 연산자(redirection operator) 앞에 공백을 안 주면 된다. ㅋㅋㅋ 이거 너무 간단하잖아. 표현식에 space를 무시하는 cpp에 길들어서 이렇게 됐다.

참고: echo / batch redirect to file automatically appends space? - stackoverflow

#TIL #batch 파일을 읽어 변수에 할당

set /p VERSION=<version.txt

set /p 명령어를 사용하면 된다. for /f 명령어를 사용해도 된다. set /p 명령어는 파일이 여러 줄일 때, 첫 줄이 적용되는 데 반해 for /f 명령어는 마지막 줄이 적용된다.

참고 - How to read file contents into a variable in a batch file? - stackoverflow

#TIL #vim 찾기 이후 찾은 단 강조를 지우고 싶을 때

* 키로 찾던가 아님 / 커맨드로 찾던가하면 일치하는 단어가 강조된다. 다음 찾기를 할 때까지 강조가 유지된다. 지우고 싶을 때면 /adfafddsaf 처럼 일치하는 단어가 없게 마구잡이로 넣어서 강조를 지웠다.

:noh

:nohlsearch 커맨드를 입력하면 된다. 그럼 현재 단어 강조가 사라짐.

nnoremap <silent> <C-L> :nohlsearch<CR><C-L>

매번 :noh 치기가 귀찮아서 How can I clear word highlighting in the current document (e.g. such as after searching for a word)? 글을 참고해 C-L 키 바인딩을 만들었다.

#TIL #vim 알만(Allman) 스타일 들여쓰기라면 대괄호(Square brackets, [ ]) 키로 뛰어넘자

]] sections forward or to the next ‘{’ in the first column.

][ sections forward or to the next ‘}’ in the first column.

[[ sections backward or to the previous ‘{’ in the first column.

[] sections backward or to the previous ‘}’ in the first column.

- Vim documentation: motion

첫 번째 컬럼에 있는 { 또는 } 문자 단위로 움직인다. c++ 같은 언어에서 Allman style로 들여 쓴다면 class, function, enum, … 단위로 움직일 수 있다.

#TIL #MacOS KeyCastr 키스트로크를 화면에 출력하고 싶다면?

/ddiary/assets/2016-12-13-til-macos-keycastr.gif

$ which cask || brew tap caskroom/cask
$ brew cask install keycastr

맥 소프트웨어는 예쁘다. windows에서는 마음에 드는 거 못 찾았다.

github - https://github.com/keycastr/keycastr

#TIL #unix 파일 크기가 알고 싶을 때

$ du -h ~/.emacs.d/init.el
8.0K    /Users/ohyecloudy/.emacs.d/init.el

$ du -h ~/.emacs.d/init.el | cut -f1
8.0K

du(disk usage) 명령어를 사용하면 된다. 파일 크기와 path를 같이 보여주는데, cut 명령어로 파일 크기만 볼 수도 있다.

참고 - How can I get the size of a file in a bash script? - unix.stackexchange.com

#TIL #xcode #vim 지원 플러그인 xvim

Since Apple decided not to load 3rd party plugins, we have to make change to it. What we have to do overall is to re-codesign Xcode. This allows us to load 3rd party plugins. Here’s the steps to do.

- Install XVim for Xcode 8

플러그인 좀 쓰게 해주지. xcode 8에서는 그냥 못 쓴다.

$ time sudo codesign -f -s ohyecloudy /Applications/Xcode.app
Password:
/Applications/Xcode.app: replacing existing signature

real    9m18.128s
user    3m9.576s
sys    2m46.899s

그냥 못 쓰고 코드 사인을 다시 해야 한다. 배포에는 문제가 생기지 않을까? 몰라. 시간이 지나면 해결되겠지. 아니면 배포용 빌드를 만들 때, xcode를 한 벌 더 설치해야 한다.

망했어. vim 키바인딩이 없으면 아무것도 못 하겠다.

링크

#TIL #macos #unix 명령어로 맥 모델 식별하기

$ curl -s http://support-sp.apple.com/sp/product?cc=`system_profiler SPHardwareDataType | awk '/Serial/ {print $4}' | cut -c 9-` | sed 's|.*<configCode>\(.*\)</configCode>.*|\1|'
MacBook Air (13-inch, Late 2010)

AWK 명령어로 Serial로 시작하는 줄에서 시리얼 번호를 추출. cut 명령어로 마지막 문자 4개만 남기고 잘라낸다. 응답으로 받은 문자열에서 <configCode> 태그 내용을 sed로 치환.

모델명 출력하고 나니 따끈따끈한 신상 맥북 사고 싶다.

참고

#TIL #git hunk에서 원하는 부분만 stage 하기

$ git add -p <pathspec>

hunk를 stage 하려면 s 키를 누르면 되고 e 키를 누르면 에디터로 hunk에서 stage 할 코드를 수정할 수 있다.

참고

#TIL #git 이전 commit 쪼개기

  • Start an interactive rebase with git rebase -i <commit>^, where <commit> is the commit you want to split. In fact, any commit range will do, as long as it contains that commit.
  • Mark the commit you want to split with the action “edit”.
  • When it comes to editing that commit, execute git reset HEAD^. The effect is that the HEAD is rewound by one, and the index follows suit. However, the working tree stays the same.
  • Now add the changes to the index that you want to have in the first commit. You can use git add (possibly interactively) or git gui (or both) to do that.
  • Commit the now-current index with whatever commit message is appropriate now.
  • Repeat the last two steps until your working tree is clean.
  • Continue the rebase with git rebase --continue.

- https://git-scm.com/docs/git-rebase

인터렉티브 리베이스(interactive rebase)로 쪼개고 싶은 커밋에 edit 액션을 표시한다. git reset HEAD~1 실행이 핵심. working directory는 그대로 놔두고 HEAD, Index 만 이전 커밋으로 돌린다. 작업 다 하고 이제 커밋해야지~ 이 상태로 된다. 이제 git add . 하지 말고 골라서 stage하고 커밋을 여러 개 만들면 된다.

참고 - #git HEAD, index, working directory 이해하기 - A Tale of Three Trees 발표자료를 보고

#TIL #unix #bash exec builtin command

#!/bin/sh
...
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"
exec node_modules/.bin/hubot --name “hubot" "$@"

hubot 실행 스크립트에서 발견했다.

이 셸 내부 명령은 현재의 프로세스를 주어진 명령어로 대치시킵니다. 보통은 셸이 어떤 명령어를 만나면 그 명령어를 실행하기 위해서 자식 프로세스를 포크 시킵니다. 하지만 exec 내장 명령은 포크를 하지 않고 exec 된 그 명령어로 셸 자체를 대치시킵니다. 그러므로 스크립트에서 이 명령어가 쓰이면 exec 된 명령어가 종료할 때 스크립트가 강제로 종료됩니다. 이런 이유로, exec을 스크립트에서 쓰려면 아마도 제일 마지막 명령어로 써야 할 겁니다.

- 11장. 내부 명령어(Internal Commands and Builtins) - exec

stackoverflow에 올라온 What are the uses of the exec command in shell scripts? 글을 보면 생각보다 여러 시나리오로 사용하는 것 같다. hubot 스크립트에서는 자식 프로세스 포크(fork)를 안 해서 리소스를 절약하려는 의도로 사용한 것 같다.

참고

#TIL #vim 일치하지 않는 문자열 제거할 때

:v/warning/d

로그에서 warning이 안 들어간 문자열을 삭제한다.

:[range]v[global]/{pattern}/[cmd]

:v 명령어는 :g! 명령어와 같으며 {pattern}에 맞지 않을 때 [cmd]를 실행한다. cmd로 d를 사용하면 해당 라인을 지운다.

참고

#TIL #vim 공백을 추가하지 않고 라인을 합치고 싶을 때

* item1
* item2

J 키를 입력하면

* item1 * item2

gJ 키를 입력하면

* item1* item2

뒤에 공백이 없더라도 J 키는 라인을 합칠 때, 공백을 추가한다. 공백을 추가하지 않고 라인을 합치려면 gJ 키를 사용하면 된다.

vimgolf 문제 Collect List를 풀면서 알게 됐다.

참고

#TIL #unix #windows zip으로 하위 폴더별 압축

batch script

C:\> for /d %X in (*) do "c:\Program Files\7-Zip\7z.exe" a "%X.zip" "%X\"

batch script 파일 안에서는 %%X 변수를 정의해야 하고 커맨드 라인에서는 %X 변수를 정의해야 한다. /d 옵션은 디렉터리 순회.

bash script

$ for i in */; do zip -r "${i%/}.zip" "$i"; done

*/ range를 사용해 자식 디렉터리만 순회한다. 그래서 ${i%/} expansion을 사용해 마지막에 붙은 / 문자를 제거한다.

참고

#TIL #npm install --save는 뭐고 --save-dev는 뭔가?

$ npm install hubot-test-helper --save-dev

testing hubot scripts를 읽던 중 발견. --save를 쓰기도 하던데 둘 차이는 뭘까?

그냥 install 하면 ./node_modules 디렉터리에 패키지 설치를 하고 끝. --save, --save-dev 옵션은 ./package.json 업데이트를 같이해준다. 어디에 패키지 정보를 추가하느냐가 다른데, --save 옵션은 dependencies object에 추가하고 --save-dev 옵션은 devDepenencies object에 추가한다.

dependencies와 devDepenencies 차이는 npm install을 할 때 나타난다. dependencies는 항상 설치되고 devDepenencies는 --production 옵션을 붙이면 빠진다. npm install “$package” 명령어로 설치할 때는 --dev 옵션을 붙여야지만 설치된다.

참고