#TIL #elixir 리스트에서 마지막 원소만 제외 혹은 마지막 원소만 가져오기

iex> Enum.drop([1, 2, 3], -1)
[1, 2]

iex> Enum.take([1, 2, 3], -1)
[3]

C++이 고향이라서 음수 인덱스는 아직도 어색하다.

참고

#TIL #docker 종료하지 않고 계속 exec로 명령을 할 수 있게 하려면

docker를 tpass 프로그램을 테스트하는 데 사용했다. 간단한 테스트다. 다음과 같은 순서로 진행한다. docker exec 명령을 내린다. 결과값을 검사한다. 다만 이렇게 하려면 컨테이너가 입력을 받을 수 있는 상태여야 한다. 즉, 실행 상태여야 한다. 종료하면 안 된다.

$ docker run -di --rm --name user_a test-add-user bash

bash를 실행해놓고 detach를 하면 되지 않을까? 아니다. 그냥 실행만 하면 안 되고 --interactive , -i 옵션을 써서 STDIN 유지를 해야 한다. 그럼 종료되지 않는다. 입력을 기다리는 상태가 되기 때문이다.

참고 - Why docker container exits immediately - stackoverflow.com

#TIL #bash cut과 dirname으로 path 조작

$ echo a/b/c/d | cut -d/ -f 2
b

$ echo a/b/c/d | cut -d/ -f -2
a/b

$ echo a/b/c/d | cut -d/ -f 2-
b/c/d

-d 옵션으로 자를 구분 문자(delimiter)를 정의한다. index는 1부터 시작한다. -f 옵션으로 남길 index를 입력한다.

$ dirname a/b/c/d
a/b/c

마지막 디렉터리만 없애고 싶을 때는 dirname 명령어를 사용한다.

참고

#TIL #bash 확장자 일괄 변경

$ for file in *.jpeg; do mv "$file" "$(basename "$file" .jpeg).jpg"; done

*.jpeg 파일 이름 확장(expansion)은 패턴에 일치하는 파일 이름 리스트로 대체된다. basename 프로그램으로 .jpeg 확장자를 제거한다. 거기에 .jpg 확장자를 붙여서 mv 프로그램 호출.

참고 - How do I rename the extension for a batch of files? - stackoverflow.com

#TIL #unity 씬 로드 전에 함수 호출

씬 로드 전에 함수를 호출할 방법이 있을까?

class MyClass
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void OnBeforeSceneLoadRuntimeMethod()
    {
        Debug.Log("Before first scene loaded");
    }

RuntimeInitializeOnLoadMethod 어트리뷰트를 사용하면 된다. 먼저 찾은 <Best way to initialize static class not attached to a GameObject> 글에선 에디터와 독립(standalone) 실행을 분리해서 구현했던데, 하나로만 해도 잘 된다.

#TIL #batch #unity 프로젝트를 바로 여는 배치 스크립트

C:\> type open_project.cmd
start "" "C:\Program Files\Unity\Editor\Unity.exe" -projectPath "C:\my_project"

매일 여는 unity 프로젝트. 배치파일 하나 만들어 두었다.

참고

#TIL #bash 디폴트 파라미터 값

${parameter:-word}

parameter가 null 이거나 unset이면 word로 대체된다.

user=$1
pass_directory=${2:-password_store}

활용하면 optional parameter로 사용할 수 있다. 2번째 인자가 있으면 그걸 pass_directory 변수에 할당하고 없다면 password_store를 할당한다.

#TIL vagrant로 docker 세팅

<#TIL vagrant로 centos, docker 세팅> 글처럼만 해도 편했는데, 더 편하게 할 수 있다.

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.provision "docker"
end

provision을 docker로 설정하면 다 알아서 해준다.

#TIL #linux 랜덤 엔트로피가 모자랄 때

Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy! (Need xxx more bytes)

gpg key 생성 실패 메시지. 별일 다 있네. 엔트로피가 모잘린다니 linux virtual machine에서 docker 컨테이너를 실행하면 몰라도 엔간해선 이런 메시지를 보기 힘들다.

$ cat /proc/sys/kernel/random/entropy_avail
137

이런 엔트로피론 택도 없다.

$ sudo apt-get install haveged
$ haveged
$ cat /proc/sys/kernel/random/entropy_avail
2430

이럴 땐, haveged 프로그램을 사용하면 된다.

참고 - How to use GnuPG inside Docker containers, as it is missing entropy? - stackoverflow.com

#TIL #git remote 브랜치 제거

$ git push origin :feature-1

refspec에 src 부분을 없애서 리모트 브랜치를 삭제한다. 난 이 명령만 있는 줄 알았는데.

$ git push origin --delete feature-1

delete 옵션을 사용하면 된다. 1.7 버전부터 추가됐다니 생각보다 오래됐다.

참고 - How do I delete a Git branch both locally and remotely? - stackoverflow.com

#TIL #macOS 그림자 없이 윈도우 스크린샷 찍는 방법

Command(⌘)-Shift-4, 스페이스 바, 클릭

메뉴 막대 혹은 윈도우를 깔끔하게 찍는 방법을 알아내긴 했는데, 그림자까지 예쁘게 그려주는 바람에 찍은 윈도우가 작게 나와 잘 안 보일 때가 있다.

Command(⌘)-Shift-4, 스페이스 바, Option 키 누른채 클릭

option 키를 누르고 클릭하면 윈도우만 찍힌다.

참고 - OS X에서 화면을 캡쳐하는 방법 총정리 - 그리고 잘 알려져 있지 않는 숨은 기능 소개 - macnews.tistory.com

#TIL #git origin 리모트 저장소 변경

$ cd existing_repo
$ git remote rename origin old-origin
$ git remote add origin new_repo_url
$ git push -u origin --all
$ git push -u origin --tags
$ git remote remove old-origin

저장소를 만드니 gitlab이 안내해줬다.

$ git remote remove origin

이름 변경 없이 지운 후에 진행해도 된다.

u 옵션을 붙여서 upstream 설정도 같이해준다. 로컬 브랜치가 tracking 하는 리모트 브랜치다. 이 정보가 없으면 push를 할 때, 매번 로컬 브랜치와 리모트 브랜치를 적어줘야 한다.

#TIL #batch 5초 sleep

C:\> ping 127.0.0.1 -n 6 > nul

ping 사이에 1초 delay라서 5가 아닌 6을 넘긴다.

C:\> timeout /t 5

timeout 명령어를 사용해도 된다.

참고 - Sleeping in a batch file - stackoverflow.com

#TIL #elixir require as

require MyMacros
alias MyMacros, as: My

alias를 따로 안 써도 된다.

require MyMacros, as: My

requireas 옵션을 사용해 한 줄로 끝.

#TIL #bash 스크립트에서 실패 커맨드를 성공으로 처리하고 싶다면

#!/usr/bin/env bash

set -e

docker kill some_container 2>/dev/null || true

에러 스노우볼링을 막으려고 제일 먼저 set -e 명령어를 실행한다. 깐깐하게 모든 리턴 값을 검사해서 0이 아니면 종료하는 건 좋다. 기조는 이렇게 가지고 가더라도 봐줄 건 봐주자. 대충 넘어가고 싶은 명령어에 쓸 수 있는 트릭이다.

앞에 명령이 실패하면 true 커맨드가 실행된다. 항상 0을 리턴하는 true를 사용해서 실패하지 않는 명령어로 만들었다.

참고 - stop and delete docker container if its running - stackoverflow.com

#TIL #csharp 객체 이니셜라이저 (object initializers)

Cat cat = new Cat()
cat.Age = 10;
cat.Name = "Fluffy";

unity가 아무리 옛날 .NET Framework 3.5를 지원한다고 해도 그렇지. 이건 이상하다. 이렇게 불편할 리가 없는데.

Cat cat = new Cat { Age = 10, Name = "Fluffy" };

그래. 최소한 이거지. 객체 이니셜라이저를 사용할 수 있다. unity에서도 사용할 수 있다. 객체 이니셜라이저는 C# 3.0에 추가됐고 .NET Framework 3.5에 포함됐다.

참고 - 객체 및 컬렉션 이니셜라이저(C# 프로그래밍 가이드) - docs.microsoft.com

#TIL #linux CR LF를 LF로 바꿔야 할 때는 dos2unix

standard_init_linux.go:175: exec user process caused "no such file or directory"

docker for windows에서 본 에러 메시지. 뭐가 문제인 거지?

root@bbfb0023c2df:/usr/local/bin# ./entrypoint.sh
bash: ./entrypoint.sh: /bin/bash^M: bad interpreter: No such file or directory

조물딱 거리다 보니 다른 에러 메시지가 나왔다. 아~ 라인엔딩 때문이다. windows 환경에서 작성한 entrypoint.sh 파일을 docker 컨테이너에서 실행한다. LF만 쓰는 리눅스에서 CR LF를 사용한 파일을 실행하다 문제가 생긴 거.

RUN apt-get update && apt-get install -y dos2unix
COPY entrypoint.sh /entrypoint.sh
RUN dos2unix /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

복사 후 dos2unix 프로그램으로 라인엔딩을 바꿔주면 된다.

참고 - Docker for Windows: Dealing With Windows Line Endings - willi.am/blog

#TIL #bash #batch 스크립트 파일이 있는 부모 디렉터리로 cd

cd "$(dirname "$0")/.."

bash에서는 $0 스페셜 파라미터를 사용한다.

$ cat script_path_test
echo "$(dirname "$0")/.."

이런 스크립트 파일이 있을 때, 어디에서 실행하느냐에 따라 출력 결과가 달라진다.

$ pwd
/c/Users/ohyecloudy/test

$ ./script_path_test
./..

스크립트 파일이 있는 디렉터리에서 실행한 결과.

$ pwd
/c/Users/ohyecloudy

$ test/script_path_test
test/..

부모 디렉터리에서 실행한 결과.

다른 디렉터리에서 실행할 수 있기 때문에 그냥 cd .. 명령을 쓰면 안 된다. 대신 $0 스페셜 파라미터를 사용하면 된다. 위 예에선 각각 ./script_path_test, test/script_path_test로 확장한다. dirname을 사용해 디렉터리를 추출하고 부모 디렉터리로 cd를 하면 스크립트 파일이 있는 부모 디렉터리로 작업 디렉터리를 바꿀 수 있다.

pushd %cd%
cd %~dp0..
popd

batch 스크립트에서는 %~dp0 스페셜 파라미터를 사용하면 된다. 스크립트 환경 분리가 안 돼서 현재 디렉터리를 push, pop 해줘야 스크립트 실행 후 작업 디렉터리가 바뀌지 않는다.

참고

#TIL #batch #bash redirection 연산자를 앞으로 당겨도 되잖아

 >result.txt echo first line
>>result.txt echo second line
>>result.txt echo third line

이렇게 써도 되다니. 칼각에 마음이 평온해진다. batch, bash 모두 된다. 자연스럽게 공백 방지도 된다.

참고 - The redirection can come anywhere on the line, and you can use that to get rid of the spaces - The Old New Thing

#TIL #vim b 키와 방향은 같지만 도착지는 다른 ge 키

| ge | Backward to the end of word |
| gE | Backward to the end of WORD |

몰라도 불편한 건 없다. 낮은 사용 빈도 때문인지 키도 두 개 눌러야 한다. 몰라서 나쁠 건 없다. 특히 매크로 정의할 때, 몰라도 어찌 할 수 있지만 번거로운 건 사실이다.

evil backward-word en|d

ge

evil backward-wor|d end

ge

evil backward|-word end

이전 위치에서 gE

evi|l backward-word end

참고