#TIL #linux 왜 cannot set LC_CTYPE locale?

svn: warning: cannot set LC_CTYPE locale
svn: warning: environment variable LANG is KOR
svn: warning: please check that your locale name is correct

msys2에서 svn 명령어를 입력하니 이런 warning이 나온다. 왜?

$ locale
LANG=KOR
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

locale 이름이 이상해서 발생한 것 같다. 한글 메시지는 폰트 때문에 너무 작게 나오니 영문으로 변경.

$ export LANG=en_US.UTF-8
$ export LC_ALL=en_US.UTF-8

.bashrc 파일에 추가.

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=en_US.UTF-8

끝.

#TIL #windows #powershell utf-8로 파일 인코딩 변경

C:\> PowerShell -Command "(Get-Content input.txt) | Set-Content -Encoding utf8 output.txt"

powershell을 쓰는 게 가장 간단하다. 괄호로 감싸야지 다 읽고 파일 핸들을 release 하므로 같은 파일 encoding을 바로 변경할 수 있다.

참고 - Converting text file to UTF-8 on Windows command prompt - superuser.com

#TIL pacman 패키지 매니저 기본 명령어

$ pacman -Sy

로컬 패키지 DB와 원격 리포지토리 동기화.

$ pacman -Su

설치된 모든 패키지 업데이트.

$ pacman -Ss ${package_name}

패키지 검색.

$ pacman -S ${package_name}

설치 또는 업데이트

참고 - pacman(한글) - wiki.archlinux.org

#TIL #batch 확장자 bat, cmd는 어떤 차이가 있는 걸까?

cmd가 최신. 호환성을 끊고 새로운 기능을 추가하려고 bat가 아닌 새로운 확장자를 추가한 것 같다. %ERRORLEVEL% 변수 세팅 정책이 다른 건 주의해야 한다.

@ECHO off
dir __ghost__ 1>2 2>NUL
ECHO error level #1 = %errorlevel%
SET a=10
ECHO error level #2 = %errorlevel%
C:\>test.bat
error level #1 = 1
error level #2 = 1
C:\>test.cmd
error level #1 = 1
error level #2 = 0

bat 확장자 스크립트는 에러일 때만 %ERRORLEVEL% 변수에 값을 할당한다. 반면 cmd 확장자 스크립트는 에러가 아니라도 %ERRORLEVEL% 변수에 값을 할당한다.

cmd 확장자 방식이 맞는 것 같다. 바로 전 명령어 에러값을 반영하기 때문. 하지만 bash처럼 에러 발생 시 바로 리턴해버리는 set -e 명령어가 없다. 그래서 %ERRORLEVEL% 값을 처리 안 하면 계속 남아있는 bat 확장자 방식이 에러 스노우볼링 방지에 유리하다. 특히 jenkins에서 batch script 빌드 스텝을 사용한 경우.

지금은 bat 확장자 스크립트로도 아무런 불편함이 없지만, 추가 기능이 필요한 때가 올 것이다. 그때 cmd로 가느니 지금 cmd로 통일해서 간다. 주의할 점을 알았으니 가도 괜찮다.

참고 - Windows batch files: .bat vs .cmd? - stackoverflow.com

#TIL #css pre 태그에 자동 줄바꿈을 제거하고 x축 스크롤 바 추가

 pre {
+    white-space: pre;
-    white-space: pre-wrap;
-    word-wrap: break-word;
+    word-wrap: normal;
+    overflow-x: auto;
 }

모바일에서 소스 코드 보기가 힘들다. 더 편하게 읽으라고 줄 바꿈을 자동으로 해주는데, 오히려 읽기가 더 힘들다. 자동 줄 바꿈을 없애고 x축 스크롤 바를 추가했다.

word-warp 프로퍼티 수정을 안 했었다. 사파리로 열어보기 전까지는. normal 값으로 바꾸니 사파리에서도 잘 보인다. 파이어폭스도 알아서 잘 보여주겠지. 크롬과 사파리만 테스트했다. 브라우저마다 다르게 보이면 어떤 짜증이 나는지 짧게나마 체험했다.

참고

#TIL #git 센스 돋는 stash aliases

$ git config --global alias.stsh 'stash --keep-index'
$ git config --global alias.staash 'stash --include-untracked'

Git Aliases of the Gods! - Git Merge 2017’ 발표보고 추가했다. 네이밍 센스 부럽다. --include-untracked 옵션 생각이 왜 그리 안 나는지. 이제 git staash 명령어로 해결

#TIL #jenkins build summary에 정보를 보여주려면 groovy postbuild

/ddiary/assets/2017-06-28-til-jenkins-groovy-postbuild-plugin.gif

build summary에 error 문자열을 보여주고 싶다. console output을 눌러서 보면 되지만 버튼 클릭을 하나 없애고 싶다. 분명 있을법한 플러그인인데, 못 찾겠다.

groovy postbuild 6번째 사용 예제를 보니 딱 원하는 게 있다. 결국 groovy를 쓰게 되는구나. 클릭 한번 줄이기가 이렇게 힘드네.

#TIL #git remote 저장소에서 지워진 브랜치를 로컬에 반영

$ git fetch --prune
$ git pull --prune

--prune 옵션을 사용하면 된다.

$ git config --global fetch.prune true

리모트 저장소에서 지워진 branch를 로컬에 유지할 필요가 없다. 쌓여서 문제지. 이제 git fetch, git pull 명령을 입력할 때, 옵션을 안 붙여도 된다.

--prune

Before fetching, remove any remote-tracking references that no longer exist on the remote. [.]

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

branch는 ‘나뭇가지’란 뜻도 있으니 ‘가지 치다’란 뜻을 가진 prune을 사용했나 보다. 네이밍 센스 좋다.

참고

#TIL #git 알아서 upstream을 설정해주는 push alias

[alias]
  pu = "!f() { \
         [[ $(git config \"branch.$(git symbolic-ref --short HEAD).merge\") = '' ]] && \
         git push -u origin $(git symbolic-ref --short HEAD) $@ || \
         git push $@; \
       }; f"

.gitconfig 파일에 추가한다. 커맨드라인 명령어로 추가하려고 했다. 에러 메시지가 뜨는데, 뭐가 문제인지 모르겠다. 에라이. 그냥 config 파일을 직접 수정했다.

두가지 전제 조건이 있다. remote는 origin 고정이다. remote와 local 브랜치 이름이 같다.

$ git checkout feature-1
$ git pu

feature-1 브랜치 upstream 저장소 설정 여부에 따라 둘 중 하나로 실행된다.

$ git push -u origin feature-1

또는

$ git push

참고

#TIL #bash #git prompt 적용하기

ohyecloudy@air5  ~/project/ddiary (master)
$

그냥 맘 편히 git-for-windows에서 제공하는 프롬프트를 쓰고 싶다. 단순해서 마음에 든다. 체크아웃 브랜치 정보만 보여줘도 충분하다.

Emacs에서 shell을 띄우니 프롬프트가 이상해진다. 그래서 프롬프트를 직접 bashrc에 정의하기로 했다. 복사해서 정의하고 문제가 되는 부분에서 분기를 타려고.

git-prompt.shgit-completion.bash 파일이 필요하다. 둘다 github/git 리파지토리에 있다.

git-for-windows에서 사용 중인 prompt에서 원하는 부분을 복사해서 붙였다.

적용한 스크립트는 d323c60 커밋에서 볼 수 있다.

#TIL #ExifTool 찍은 날짜 디렉터리로 자동 분류

지오태깅 프로그램을 찾다가 ExifTool을 알게 됐다. 기능 많네. 지오태깅 뿐만 아니라 rename, move도 지원한다.

$ exiftool -d %Y-%m-%d "-directory<datetimeoriginal" image_dir

찍은 날짜로 디렉터리를 만들고 이미지를 옮긴다.

#TIL #ExifTool 이미지에 지오태깅

지오태깅이 안 되는 옛날 카메라를 사용하고 있다. GPS 로그는 Moves 앱을 사용해서 기록하고 Moves Export를 사용해서 GPX 포맷으로 저장한다.

GPX 포맷으로 저장된 GPS 로그 데이터를 바탕으로 찍은 사진에 GPS 태그를 추가해 줘야 한다. 프로그램을 찾아보다가 ExifTool을 발견했다.

$ exiftool -geotag "c:\gps logs\track.log" c:\images

잘 된다.

#TIL #bash find 명령어 결과에서 permission denied 에러 메시지 숨기기

$ find / -name 'to_be_searched.file'

permission denied 메시지 작렬. 뭘 보지를 못하겠네. 이 메시지만 걸러내는 방법은 없을까?

$ find / -name 'to_be_searched.file' 2>/dev/null

간단하다. stderr(standard error)널 디바이스(null device)로 리다이렉션하면 된다.

에러 메시지 출력에 std::cerr 안 쓰고 std::cout 썼다면 망. linux 커맨드라인 유틸리티 바닥은 칼같이 지켜서 stderr를 리다이렉션만 하면 된다.

참고

#TIL MSYS2? MinGW?

MSYS2 refers to the libraries and programs that use the POSIX emulation layer (“msys2 runtime”, derived from Cygwin’s cygwin1.dll). It is very easy to port libraries and programs from Unix/Linux because most of the POSIX semantics is emulated reasonably well, for example the fork() function. Bash and Perl are examples of MSYS2 programs.

MinGW refers to libraries and programs that are compiled using GNU tools but do not require any POSIX semantics, instead relying on the standard Win32 API and the C runtime library. MinGW stands for “Minimal GNU for Windows”. Examples: cURL (a library to talk to remote servers via HTTP(S), (S)FTP, etc), emacs, Inkscape, etc

The POSIX emulation layer of MSYS2 binaries is convenient, but comes at a cost: Typically, MSYS2 programs are noticably slower than their MinGW counterparts (if there are such counterparts). As a consequence, the Git for Windows project tries to provide as many components as possible as MinGW binaries.

- The difference between MSYS2 and MinGW / git-for-windows

POSIX 에뮬레이션 레이어가 기반이냐 아니냐가 가장 큰 차이다. POSIX 에뮬레이션 레이어를 거치면 속도가 현저하게 느려진다. Win32 API와 C runtime library에 의존하는 MinGW는 MSYS2보다 빠르다. 그래서 Git For Windows는 가능한 많은 MinGW 바이너리를 제공하려고 노력한다.

어떻게 잘 버무려 쓸까? 나는 이런 고민 안 하고 잘 버무려진 Git for Windows SDK 쓴다.

#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