c++ 에서 find_first_of, find_last_of 를 사용할 때 유의할 점이 있다.
두 함수가 모양만 봤을 때 처음으로, 마지막으로 사용된 위치를 찾는 기능을 하는 것은
쉽게 알 수 있다.
하지만 함수의 파라메터로 받은 search string의 경우
잘못 생각하면 큰 실수를 범할 수 있다.
최근 message header에서 사용되는 encoded-word를 파싱할 때
실수를 했던 부분이다.
std::string strEncodedSubject = "=?EUC-KR?B?x9Gx2yDA3yC1ybHuPw==?=";
// encoded-word는 =?[character set]?[encoding type]?[encoded string]?= 로 구성된다.
// 앞뒤 "=?", "?=" 위치 파악을 위해..
size_t tIdx = strText.find_first_of("=?");
std::cout << tIdx << std::endl;
tIdx = strText.find_last_of("?=");
std::cout << tIdx << std::endl;
=> 결과는 0, 32 이다.
무엇이 문제인가..
아시는 분들은 "그건 당연히 그렇게 사용하는 거지.." 하겠지만
find_first_of, find_last_of는 파라메터로 받는 search string을
string 전체로 search하는 것이 아니라,
해당 string의 구성하는 char 중 어떤 것이라도 먼저 혹은 마지막에 발견된 위치를
찾는 함수이다.
(차라리.. token 함수와 유사함)
그렇다. 내가 원하는 위치를 찾기 위해서는
find, rfind를 사용하는 것이 맞다.
size_t tIdx = strText.find("=?");
std::cout << tIdx << std::endl;
tIdx = strText.rfind("?=");
std::cout << tIdx << std::endl;
=> 결과는 0, 31 이다.
이렇게 간단한 실수지만 잘못하면 정말 찾기힘든
치명적인 버그를 만들게 된다.
분명 예전에도 한번 실수 해서 조심해야 겠다하고.. 생각한적 있는데..
또 이런 기본적인 실수를..
전자제품이건.. API건 사용 설명서를 꼼꼼히 읽고 사용하도록 하자.
2017년 11월 28일 화요일
2012년 7월 5일 목요일
cpio 사용법..
CPIO 옵션
i 압축해제하라는 옵션
o 압축 생성 옵션
p 표준입력에서 파일명을 읽는다.
B 5120 bytes블럭단위로 입출력한다.
c 아스키 형식으로 헤더정보를 읽고 쓴다.
d 없는디렉토리는 생성한다.
u 기존파일과 겹치면 덮어쓰지 않는다.
m 파일의 변경시간을 그대로 유지한다.
v 파일명 목록을 출력한다.
h 헤더의 형식을 tar와 같이 읽고 쓴다.
x 장치파일도 읽고 쓴다.
o 압축 생성 옵션
p 표준입력에서 파일명을 읽는다.
B 5120 bytes블럭단위로 입출력한다.
c 아스키 형식으로 헤더정보를 읽고 쓴다.
d 없는디렉토리는 생성한다.
u 기존파일과 겹치면 덮어쓰지 않는다.
m 파일의 변경시간을 그대로 유지한다.
v 파일명 목록을 출력한다.
h 헤더의 형식을 tar와 같이 읽고 쓴다.
x 장치파일도 읽고 쓴다.
CPIO 파일 만들기
cpio 를 이용한 특정 확장자 파일만 압축하기.
# find . -name '*.c' -print | cpio -o > data.cpio
# ls | cpio -o > ../test.cpio
CPIO 파일 풀기
-i cpio로 백업한 data를 restore 한다
-o 출력 - 묶을때
-p 통과모드
-p 통과모드
-d restore중 필요한 디렉토리를 자동으로 생성시킨다
-m 백업 되있는 data들의 날짜, 시간을 그대로 유지한다
-v verbose
# cpio -idmv < test.cpio
# cpio -i < data.cpio
# cpio -dmvi < example.cpio
# cpio -dmvi < /root/test.cpio
gz으로 압축되어 있는것을 풀기
예1:
# gunzip targetfile.cpio.gz
# cpio -idmv < targetfile.cpio
# cpio -idmv < targetfile.cpio
예 2:
# zcat targetfile.cpio.gz | cpio -idmv
압축 하여 CPIO 만들기
tar 를 이용한 특정 확장자 파일 압축하기 (리눅스)
find . -name "*.c" | xargs tar -cvf soure.tar
xargs 를 파라미터 수가 제한적이어서, 파일수가 많으면 불가능함.
cpio로 파일 옮기기
한 디렉토리 또는 파일시스템에서 다른 디렉토리 또는 파일시스템으로 옮겨야 할 대량의 파일이 있을 경우 다음의 명령을 이용
한 디렉토리 또는 파일시스템에서 다른 디렉토리 또는 파일시스템으로 옮겨야 할 대량의 파일이 있을 경우 다음의 명령을 이용
# find /old_directory -depth | cpio -pdmv /new_directory
이 명령은 소유자와 권한, 디렉토리 구조를 유지하면서 지정한 old_directory 밑의 모든 파일을 new_directory로 옮긴다.
# cd src_dir_name
# find . -depth -print | cpio -pudm target_dir_name
펌..http://blog.naver.com/dolicom/10041713501
2012년 6월 20일 수요일
[Tip] SVN rollback 하기..
그전에.. 난 그전 revision파일 찾아가며.. 비교해서 다시 커밋했는데..
정말.. 미련한 짓이었다..
아래와 같이 하면.. 된다.
svn merge -r [REV_from]:[REV_to] [Source URL]
|
SVN 경로가 [Source URL] 인 경우 revision을 [REV_from]에서 [REV_to]로 되돌리라는 명령이다.
해당 명령 수행 후 commit을 해주면 된다.
일반적으로 아래와 같은 형태가 될것 같다.
$ svn merge -r 100:99 test.c
$ svn ci -m "Rollback to revision 99" test.c
|
이렇게 하면.. revision이 100인 test.c 가 revision이 99로.. Rollback 완료..
아래는 최종 버전을 특정 revision으로 되돌리는 방법..
$ svn merge -r HEAD:5 test.c
|
'{' DATE '}' 리비전이 시작하는 시각
'HEAD' 저장소의 마지막 리비전
'BASE' 작업 사본을 꺼내온 리비전
'COMMITTED' BASE 이전에 마지막 커밋된 리비전
'PREV' COMMITTED 의 직전 리비전
|
[Tip] Git Proxy 설정하기
1. corkscrew 설치
GIT PROXY를 설정하기 위해서는 corkscrew가 필요하다.
Ubuntu는.. 그냥 apt-get install corkscrew 라고 하면 됨..
corkscrew는.. http://www.agroman.net/scrkscrew 에서 받는다.
|
# tar xvfz corkscrew-2.0.tar.gz
# ./configure
# make
# make install
|
위와 같이 설치하면 /usr/local/bin/corkscrew 가 설치된다.
2. git proxy 설정
gitproxy.sh 생성 (파일명은 자유)
# vi /usr/local/bin/gitproxy.sh
파일 생성
#!/bin/sh
/usr/local/bin/corkscrew [PROXY_ID] [PROXY_PORT]
권한 부여
# chmod +x /usr/local/bin/corkscrew
|
$ git config --global core.gitproxy '/usr/local/bin/gitproxy.sh
|
Git를 사용 준비 완료!!
[Tip] Linux 시간 설정
# date [MMDDhhmm[[CC]YY][.ss]
맞추려는 시간이 2004년 07월 15일 오후 4시 15분 50초라면
# date 071516152004.50
타임서버
time.bora.net
time.kriss.re.kr -- 주로 refuse .
타임서버 시간 보기
# rdate -p time.bora.net
타임서버 시간을 로컬 시간으로
# rdate -s time.bora.net
or
# ntpdate time.bora.net
확인
# date
crontab 등을 사용하여 주기적으로 시간 설정해 가능..
0 3 * * * /usr/bin/rdate -s time.bora.net
or
0 3 * * * /usr/sbin/ntpdate -s time.bora.net
시간대 변경 (한국)
# ln -sf /usr/share/zoneinfo/ROK /etc/localtime
2012년 6월 19일 화요일
[Hadoop] 설치 및 간단한 실행 예제
1. Hadoop 다운 받기 & 설치
아래 경로에서 Hadoop 최신 버전의 release 정보를 구할 수 있다.
http://hadoop.apache.org/common/releases.html
아래 경로에서 Hadoop의 버전별 설치본을 받을 수 있다.
http://ftp.daum.net/apache/hadoop/common/
이번에는 stable 버전인 1.0.3 버전을 받는다.
http://ftp.daum.net/apache/hadoop/common/hadoop-1.0.3/hadoop-1.0.3-bin.tar.gz
원하는 경로에서 압축 해제
$ tar xvfz hadoop-1.0.3-bin.tar.gz
2. ssh / rsync 설치
ssh와 rsync는 이미 Linux 설치 시 설치되었을 가능성이 크지만..
없다면.. 아래와 같이 설치한다.
Redhat :
# yum install ssh rsync
Ubuntu :
# apt-get install ssh rsync
3. Pseudo-Distributed Operation을 위한 설정
conf/core-site.xml:
conf/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
conf/mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
4. SSH Passphraseless 설정
ssh로 password 입력 없이 접근 가능해야 한다.
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/authorized_keys
(간혹 authorized_key에 쓰기 권한이 있을 경우 인증키 목록이 정상동작 하지 않는다)
아래와 같이 입력 시 바로 접속되면 성공
$ ssh localhost
생성한 rsa 공개키를 인증 키 목록에 추가하면 password 입력 없이 바로
ssh 접근이 가능하다.
5. Hadoop 구동 및 테스트
- DFS 포멧하기 & 구동하기
$ bin/hadoop namenode -format
$ bin/start-all.sh
- 아래 URL로 접속해보면 정상 구동 여부 확인 가능
NameNode - http://localhost:50070/
JobTracker - http://localhost:50030/
- Example MapReduce 실행하기
DFS에 파일 올리기 (conf 디랙터리를 input이란 이름으로 업로드)
$ bin/hadoop dfs -put conf input
$ bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+'
$ bin/hadoop dfs -cat output
or
$ bin/hadoop dfs -get output output (결과 output을 내려 받는다)
$ cat output/* or
아래 경로에서 Hadoop 최신 버전의 release 정보를 구할 수 있다.
http://hadoop.apache.org/common/releases.html
아래 경로에서 Hadoop의 버전별 설치본을 받을 수 있다.
http://ftp.daum.net/apache/hadoop/common/
이번에는 stable 버전인 1.0.3 버전을 받는다.
http://ftp.daum.net/apache/hadoop/common/hadoop-1.0.3/hadoop-1.0.3-bin.tar.gz
원하는 경로에서 압축 해제
$ tar xvfz hadoop-1.0.3-bin.tar.gz
2. ssh / rsync 설치
ssh와 rsync는 이미 Linux 설치 시 설치되었을 가능성이 크지만..
없다면.. 아래와 같이 설치한다.
Redhat :
# yum install ssh rsync
Ubuntu :
# apt-get install ssh rsync
3. Pseudo-Distributed Operation을 위한 설정
conf/core-site.xml:
| <configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> </configuration> |
conf/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
conf/mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
ssh로 password 입력 없이 접근 가능해야 한다.
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/authorized_keys
(간혹 authorized_key에 쓰기 권한이 있을 경우 인증키 목록이 정상동작 하지 않는다)
아래와 같이 입력 시 바로 접속되면 성공
$ ssh localhost
생성한 rsa 공개키를 인증 키 목록에 추가하면 password 입력 없이 바로
ssh 접근이 가능하다.
5. Hadoop 구동 및 테스트
- DFS 포멧하기 & 구동하기
$ bin/hadoop namenode -format
$ bin/start-all.sh
- 아래 URL로 접속해보면 정상 구동 여부 확인 가능
NameNode - http://localhost:50070/
JobTracker - http://localhost:50030/
- Example MapReduce 실행하기
DFS에 파일 올리기 (conf 디랙터리를 input이란 이름으로 업로드)
$ bin/hadoop dfs -put conf input
$ bin/hadoop jar hadoop-examples-1.0.3.jar grep input output 'dfs[a-z.]+'
$ bin/hadoop dfs -cat output
or
$ bin/hadoop dfs -get output output (결과 output을 내려 받는다)
$ cat output/* or
피드 구독하기:
글 (Atom)
스프린트 정리
스프린트 : 스프린트는 프로토타입을 제작하고 고객과 함께 아이디어를 테스트하여 중요한 문제들에 대한 답을 찾는 독특한 5일 짜리 과정이다. 스트린트는 업무 전략, 혁신 행동과학, 디자인 그 외 여러 분야의 최고 히트작을 어떤 팀에서라도 사용할 수 있...
-
그전에.. 난 그전 revision파일 찾아가며.. 비교해서 다시 커밋했는데.. 정말.. 미련한 짓이었다.. 아래와 같이 하면.. 된다. svn merge -r [REV_from]:[REV_to] [Source URL] ...
-
Dictionary Harvest Attack.. 사전 수확 공격?? 임의의 글짜, 단어, 사전, 성씨 등을 조합하여 특정 메일 서버에 메일을 보내고, 메일이 성공적으로 전송이 되서 해당 메일 주소가 유효한 것으로 판단하고 수확한다. ...
-
linux에서 cifs, nfs 등 네트워크 공유 경로 등을 마운트 사용할 때, 경우에 따라 마운트를 해제하지 않고 마운트된 디랙터리 내용이 아닌 실제 로컬 경로의 내용 확인이 필요한 경우가 있다. 로컬 경로를 직접 마운트하면 되는데, 마...