Outer join 은 LEFT , RIGHT , FULL 로 나뉜다.



를 Table1 로 정하고 (as T1)



를 Table2 로 정하면 (as T2)


1. LEFT OUTER JOIN

SELECT T1.이름, T1.나이, T2.직업 
FROM T1 LEFT OUTER JOIN T2 ON T1.이름 = T2.이름


결과가 위와 같이 왼쪽 테이블에 맞춰서 나오고 


2. RIGHT OUTER JOIN

SELECT T1.이름, T1.나이, T2.직업 
FROM T1 RIGHT OUTER JOIN T2 ON T1.이름 = T2.이름

결과가 위와 같이 오른쪽 테이블에 맞춰서 나온다.


3. FULL OUTER JOIN

SELECT T1.이름, T1.나이, T2.직업 
FROM T1 FULL OUTER JOIN T2 ON T1.이름 = T2.이름

1 + 2 의 기능을 한다.




A 라는 브랜치에서 B 의 브랜치를 merge 하는 경우라고 치면

$ git checkout A 
$ git merge B

로 A 에다가 B 내용을 merge 하는 명령입니다.

<<<<<<< HEAD
머지 (merge) 가 될 대상 브랜치 이다. 대부분의 경우에는 내가 작업하기 위해서 체크 아웃한 브랜치다. (즉 내꺼, HEAD) 

|||||||

=======
합쳐질 브랜치이다. 

>>>>>>>

즉 위쪽에 있는 것이 (보통 git 에서는 HEAD 라고 붙어 있습니다.) 현재 내가 작업하던 브랜치 , 아래쪽이 다른 브랜치 (pull 명령중이면 리모트 브랜치)의 내용이니 비교해서 적용하면 됨

클로져(Closure)에 대한 말들은 많다. 최근 핫하다고는 하지만 전산의 태동기부터 존재하던 문법이다. 1급 객체(First class Object)를 지원하는 언어는 자연스럽게 지원하지만 개념 자체를 이해 못하는 경우가 많다.

파이선과 연계해서 클로져(Closure)를 설명하는 좋은 설명이 있어서 소개하고자 한다.

Objects are data with methods attached, closures are functions with data attached.

객체는 메서드가 달라붙어 있는 데이타라면, 클로져는 데이타가 달라붙은 함수이다.

예제는

def make_counter():
  i = 0
  def counter(): # counter() is a closure
    nonlocal i
    i += 1
    return i
  return counter

c1 = make_counter()
c2 = make_counter()

print (c1(), c1(), c2(), c2())
# -> 1 2 1 2

위에서 보면 counter 라는 함수가 i 라는 데이타를 포함하고 있는 클로져(closure)다.

http://stackoverflow.com/questions/13857/can-you-explain-closures-as-they-relate-to-python

OSX 에서 사용하는 ls 는 FreeBSD 에서 사용하는 다른 버젼의 ls 입니다. 그래서 GNU 버젼의 ls 를 사용하고 싶으면 따로 설치해줘야 합니다.

$ brew install coreutils

이렇게 하면 GNU의 유틸들이 설치됩니다. 그리고 이제부터 –color=auto 라는 명령이 먹습니다. (OSX 버젼은 'ls -G' 를 사용해서 색을 출력했었습니다.) 게다가 다양한 유틸에서 화려한 색을 표출할 수 있게 만들어 줄 수가 있습니다.

coreutils 는 위에서 설치했다고 가정하고

$ git clone https://github.com/seebi/dircolors-solarized.git ~/.dircolors-solarized

와 같이 컬러 테마를 받아줍니다.

그리고 ~/.bash_profile 에 다음과 같이 적어줍니다.

alias ls='gls --color=auto'
alias dir='gdir --color=auto'
alias grep='grep --color=auto'

eval $(gdircolors ~/.dircolors-solarized/dircolors.ansi-dark)




이제부터 위 처럼 각각 확장자별로 색이 입혀서 출력됩니다.

여기부터는 Emacs 사용자만 해당됩니다

Emacs 를 떠나기 싫은 개발자들은 자주 shell-mode 를 사용합니다. 그런데 그 안에서 출력되는 ls 는 70년대 스타일 그 자체입니다. 색이 없기 때문!! 이걸 고치기 위해서는 ~/.emacs.d/init_bash.sh 파일을 엽니다. (없으면 만들어 주세요) 그리고 그 안에

alias ls='gls -G --color=auto'
alias dir='gdir --color=auto'
alias grep='grep --color=auto'

eval $(gdircolors ~/.dircolors-solarized/dircolors.ansi-dark)

를 추가해주고 shell-mode 를 실행시켜주면 역시 아무 변화가 없습니다. 여기부터가 어려웠는데, 이는 emacs shell-mode 가 Terminal 이 dumb 타입이기 때문. ~/.dircolors-solarized/dircolors.ansi-dark 파일을 열어서

TERM dumb

를 TERM 이 잔뜩 쓰여져 있는 곳에다 추가해주면 된다.


osx 에서 docker container 로 mysql 을 띄웠을 때, DB container 에 접속이 안되는 문제

$ docker run --name db -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

입력하면 mysql container 가 db 라는 이름으로 만들어져서 동작한다.

$ docker exec -it db bash

명령으로 들어가 보면 root prompt 가 떠서 여러가지 동작을 할 수 있게 된다.

# mysql -uroot -p

접속해서 테이블이나 데이타베이스도 만들 수 있다.

그 뒤에 'OSX 터미널'에서 다음과 같이 명령을 치면

$ mysql -uroot -h192.168.99.100 -p

(192.18.99.100 은 osx 에 깔린 docker-machine 의 ip 다. 보통 상황마다 다르니 꼭 확인하자)

ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.99.100' (61)

위와 같은 에러가 발생한다. OSX 에서는 docker-machine 에서 도커를 띄우기 때문에 포트를 연결시켜서 띄워줘야 한다. 즉

$ docker run --name db -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 -d mysql

포트 연결시켜주는 커맨드를 필수로 띄워줘야 한다.

flake8 [2.5.4] 를 OSX El Capitan (10.11.3) 에 pip 이용해서 설치시 flake8 실행파일이 설치 안되는 문제가 있다.

https://pypi.python.org/pypi/flake8#downloads

에서 수동으로 다운로드 받고 압축 풀린 디렉토리로 이동후에

$ python setup.py install

해주면 pyenv 관련 실행 파일 디렉토리에 저장된다.

$ ln -s /Users/crazia/.pyenv/versions/3.4.3/bin/flake8 /usr/local/bin/flake8

해주면 제대로 동작하기 시작한다.

먼저 이건 철저하게 배포용을 위해서 만든 기술이 아니라 개인 소장용이라는 점을 명백하게 말하겠다.

어떤 사이트를 가 봤는데 맘에 드는 사진이나 그림들이 연달아 나열된 경우가 많다. 로딩도 해야하고 일일이 클릭도 하는게 귀찮아서 그 사진들을 다 다운받아서 만화책 보는 프로그램으로 쭉 보고 싶을때가 있다.

그렇다! 귀찮은 것이다. 귀찮으면 DRY (Don't Repeat Yourself:같은 일을 반복하지 말고 반복하는 일은 전부 컴퓨터에게 맡겨라) 원칙에 따라서 개발자 본능이 꿈틀거린다.

개발자의 종특중 하나는 일일이 눌러서 다운받는게 3시간 걸리는 작업이라도, 개발로 편하게 스크립트 짜는게 6시간이 걸려도 후자를 택하는 종족이기 때문이다. (다만 한번 한 작업은 다음에 할 때 무지하게 빨라진다는 장점이 있다)

이제 부터는 철저하게 시나리오다. 내가 이런다는 것이 절대 아니다.

어느 사이트에 갔더니 만화가 올려져 있다. '엇! 이런 횡재를!!' 게다가 사이트를 보니 소스를 볼 수가 있는 것이다. 1화를 누르고 소스보기를 통해서 그 소스를 happy01.html 로 저장했다. 이제 이걸

$ get-picture.sh happy01.html 1

하면 내가 원하는 그림 파일들이 01-01.png 나 01-01.jpg 이런 형식으로 쭈욱 저장된다. 앞에 01, 02 이런식으로 저장하는건 나중에 만화책 뷰어가 파일 순서를 헷갈리기 때문에 저런 형식으로 저장해줘야 한다.

개별 설명을 하자면 먼저 스크립트다.

#!/bin/bash argc=$# HTML=$1 PART=$2 NUM="1" FILENAME="" if [ $argc -eq 2 ] then cat "${HTML}" | sed -E -f newline.sed | grep -E 'https://www.avsnoop' | \ awk '{print $1}' |while read url ; \ do FILENAME=$(printf "%02d-%02d.%s" "$PART" "$NUM" "`echo "${url}" | sed -E 's/^.*(png|jpg)/\1/'`");\ echo "downloading.. ${url}" ; curl -o "${FILENAME}" "${url}" ;NUM=$[$NUM +1] ;done else echo "Usage: get-picture.sh [HTML name] [Part Number]" fi

위 내용을 긁어서 쓸때는 \개행문자 콤보를 지우고 한줄로 만들어서 쓰는게 좋다. (보기 안좋아서 이리 처리함)

매개변수가 2개가 안되면 사용법을 출력하고 종료하고 매개 변수가 첫번째 html 파일 이름 과 몇 화로 저장할것인지를 지정해주면 동작한다.

cat "${HTML}" 을 통해서 HTML 의 내용을 가지고 오고 그 내용을 sed 에게 넘겨줍니다.

sed 는 스트림 에디터 라고 하는데 보통 넘겨 받은 데이타에서 특정 패턴을 찾아서 지운다던가 패턴을 치환하는 용도로 많이 쓰인다. -E 옵션은 정규표현식을 처리한다는 것이고 -f 는 파일을 읽어서 처리한다는 뜻이다. 보통은 파일 처리를 안하지만 's/A/B/g' 와 같이 치환한다는 가정을 할 때 B 에 개행문자를 포함시켜서 치환이 command line 에서는 적용이 안된다.

newline.sed 를 보면

s/(https:\/\/www\.avsnoop\.com\/files\/2015\/09\/04\/[^/]*\.)(png|jpg)/\
\1\2\
/g

와 같은 식으로 특정 패턴을 찾으면 그 패턴 앞뒤로 \n 개행문자를 넣어주는 치환을 가한다. 이렇게 하는 이유는 sed 명령어 다음에 이어지는 grep 명령이 라인단위로 동작하기 때문에 정해진 패턴을 줄단위로 출력하게 만들기 위해서다.

다만 위의 내용대로 하다가 안받아져서 확인해 봤더니 /2015/09/05 날짜로 바뀐게 발견되었다. 그렇다면 그 부분까지 정규표현식으로 바꿔주면 된다.

s/(https:\/\/www\.avsnoop\.com\/files\/2015\/09\/[0-9]+\/[^/]*\.)(png|jpg)/\
\1\2\
/g

awk 명령어는 굳이 안써도 될꺼 같은데 습관처럼 썼다. white space 을 구별지어서 조작하는 명령을 줄 수있다. '{print $1}' 이면 첫번째 컬럼을 출력하라는 구문이다.

while 문은 전에 구별된 (여기 예제에서는 www.avsnoop 으로 구분된 이미지 주소) 를 url 로 받아온다. 그리고 printf 문을 이용해서 저장될 파일이름을 FILENAME 에 저장시키고 sed 문을 또 이용해서 확장자를 지정해준다.

downloading.. ${url} 로 현재 어떤 이미지를 다운 받는지 알려주고 정해진 파일 이름으로 curl 을 이용해서 다운받는다.

curl 을 사용하는 이유는 wget 으로 안받아지는 것들이 받아지기 때문이다. 즉 curl 이 wget 의 상위 호환이라고 보면됨. 최근 curl 을 사용하는게 이유가 있어서 이다. 이제 wget 을 보낼때가 됐다.


SQLite 관련 라이브러리가 컴파일이 안된다. 찾아봐도 자료가 쉽게 안나오는 걸 보면 El Capitan 의 문제로 생각된다.

컴파일을 방해하는 가장 큰 요소는 루트리스(Rootless) 라고 생각이 된다. 일단 그 기능을 끈다. 솔직히 개발자에게는 필요 없는 옵션이라고 생각된다. 저번에도 언급했지만 끄는 방법은

재부팅시에 Command + R 을 눌러서 복구모드로 들어가서 , Terminal 을 실행해서 다음과 같이 입력한다.

$ csrutil disable

그리고 다시 재 부팅 하고 나서 Terminal 을 실행하고 Xcode 가 설치되어 있다면 (안되어 있다면 설치하고)

$ xcode-select --install

하면 설치하라고 팝업창이 뜨고 설치해준다 하면 완성입니다. 여기까지 하고 나면 Python3.4 에서 sqlite3 가 포함되서 컴파일 됨

Homebrew 는 설치가 되어 있다는 가정하에 시작합니다. 그리고 OSX 10.11 El Capitan 에서 Homebrew 를 쓸 수 있다는 것은 이미 SIP (System Integrity Protection) 을 꺼둔 상태라는 것을 의미합니다.

혹시 몰라서 SIP 를 끄는 방법은 처음 부팅될 때 '사과 마크'가 나오기 전에 'Command + R' 을 누르고 있으면 Recovery Mode (복구 모드)에 들어갑니다. 거기에서 Terminal 을 실행시키고

$ csrutil disable

을 하고 다시 재부팅하면 됩니다. 이제 준비가 끝났으면 차례로 시작하면 됩니다.

1 osxfuse 인스톨

$ brew install Caskroom/cask/osxfuse

2 ntfs-3g 인스톨

$ brew install homebrew/fuse/ntfs-3g

3 mount_ntfs 버젼을 새로 받은 파일로 교체해줌

기존에 존재하는 mount_ntfs 파일을 백업하고

$ sudo mv /sbin/mount_ntfs /sbin/mount_ntfs.orig

새로운 파일을 링크 걸어줍니다.

$ sudo ln -s /usr/local/Cellar/ntfs-3g/2015.3.14/sbin/mount_ntfs /sbin/mount_ntfs



그리고 외장형 드라이브를 뽑았다가 다시 꼽으면 쓸 수 있게 바뀝니다. 단 자동으로 마운트가 안될 수도 있으니 그 때는 DiskUtility 를 실행시키고 파티션에서 오른쪽 마우스 클릭으로 'Finder에서 보기..'를 실행시켜서 사용하면 됩니다.


Android Studio를 OSX(내 경우에는 Yosemite 나 El Capitan 버젼) 에 설치하다 보면 발생하는 에러가 다음과 같다.



종종 발생하는데 해결하는 방법은 쉽다.

$ export STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.7.0_xx.jdk
$ open /Applications/Android\ Studio.app

위에서 xx 는 자신의 버젼에 맞게 쓰여져야 한다. 참고로 내꺼는 25 ("jdk1.7.0_25.jdk")이다. 안전하게 .bash_profile 에 STUDIO_JDK 값을 지정해주는 것이 좋다.


+ Recent posts