검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Groping through big data with grep

1. 숫자 4개로 시작하는 줄 뽑아내기
grep ^[0-9][0-9][0-9][0-9] textfile
grep -E "^[0-9]{4}" textfile
  하지만 이 조건만으로는 4자리로 시작하기만 하면 무조건 걸려나옵니다. } 문자 뒤에 공백을 하나 넣어서 처리할 수 있지만 좀 더   좋은 방법은 "단어 단위" 기능(<와 >)을 사용하는 것입니다.
$ grep '\<[0-9]\{4\}\>' textfile
2010
2013 is turning out to be a better year
  다만 이 방법을 사용할 때 주의할 점이 있습니다. 아래를 보시죠.
$ grep '\<[0-9]\{3,5\}\>' textfile
2010
2013 is turning out to be a better year
12345 Taylor Avenue
127.0.0.1
  다른 건 괜찮았는데 마지막에 IP 주소가 걸려 나왔습니다. 숫자 뒤에 문자가 나오는 경우도 "단어의 끝"으로 취급하기 때문입니다. 단어 단위로 걸러낼 때는 이런 사항도 고려해야 합니다.

2. IP 주소 뽑아내기
  IP 주소를 검출하는 게 은근히 생각보다 까다롭습니다. 먼저 특정 IP를 찾는 것부터 시작하겠습니다. 생각없이 그냥 지르면 이런 모습이 나옵니다.
$ grep 12.45.78.0 text
1234567890
12.45.78.0
  정규 표현식에서 점(.)은 하나의 문자를 뜻하니까요. 이럴 땐 -F 옵션(fixed string)을 사용하거나, fgrep 명령어를 사용하거나, 이스케이프 문자를 사용해야 합니다. 처음 두 방법은 사실상 같은 거나 다름없습니다.
$ grep -F 12.45.78.0 text
12.45.78.0
$ fgrep 12.45.78.0 text
12.45.78.0
$ grep "10\.20\.30\.40" textfile
Don't use the 10.20.30.40 address unless you first talk to Pete.
  이제 IPv4 주소 형식을 띈 문자열을 잡아내는 패턴의 예를 보겠습니다.
$ grep -w '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' textfile
127.0.0.1
Don't use the 10.20.30.40 address unless you first talk to Pete.
Refer to Section 11.2.3.4.20 for the process guidelines.
  마지막에 엉뚱한 게 나왔듯이 위의 방법도 완벽하진 않습니다만 여기서 더 발전시켰다간 필요 이상으로 복잡해지기 때문에 이 정도로 끝내는 게 적절할 것 같습니다.

2013/07/17 16:33 2013/07/17 16:33
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : 20 interesting and extremely helpful Linux command line tricks

1. 두 디렉토리 사이를 효율적으로 반복해서 이동하는 방법
  A 디렉토리에서 B 디렉토리로 이동한 후 다시 A 디렉토리로 이동할 때 A 디렉토리의 경로를 쓰는 대신 'cd -'를 사용하여 같은 효과를 볼 수 있습니다.
/home$ cd /var/log
/var/log$ cd -
/home
/home$

2. 콤마(,) 연산자
  첫 번째 글자나 문자열 전체를 소문자로 변환 방법
$ string="Example of comma OPERATOR"

$ echo ${string,}
example of comma OPERATOR

$ echo ${string,,}
example of comma operator
  파일명 확장(extension)에 사용
$ touch new_file{1,2,3}
$ ls new_file*
new_file1  new_file2  new_file3

파일명을 my_filename.old에서 my_filename.new로 변경
$ mv my_filename.{old,new}

3. 파일명에 공백이 있을 때 제어하는 방법
  파일명 전체를 큰 따옴표로 감싸거나 공백 앞에 역슬래쉬(\)를 넣습니다.
$ rm "temp File"
$ rm temp\ File

4. 하이픈(-)으로 시작하는 파일명 삭제 또는 생성 방법
$ rm -1mpFile.out
rm: invalid option -- '1'
Try `rm ./-1mpFile.out' to remove the file `-1mpFile.out'.
Try `rm --help' for more information.

$ rm -- -1mpFile.out
$ touch -- -1mpFile.out

5. 디렉토리 안에 있는 파일 중 특정 확장자가 아닌 모든 파일 삭제 방법
$ rm !(*.c|*.py)

6. touch와 find를 이용해 특정 시간 사이에 생성되거나 수정된 파일 복사
  어떤 디렉토리 안에 있고 09~17시 사이에 생성되거나 수정된 파일만 골라 복사하고 싶다고 가정했을 때 먼저 원하는 두 시간에 맞춰 타임스탬프 값을 가진 두 파일을 생성합니다.
$ touch -d "9am" temp1
$ touch -d "5pm" temp2
  이제 대상 파일이 있는 디렉토리로 이동해서 아래 명령어를 사용합니다.(또는 find에서 대상 디렉토리를 지정)
$ find . -newer ../temp1 ! -newer ../temp2 -exec cp '{}' ./target/ ';'
  실행하면 대상 파일이 target이라는 하위 디렉토리 안에 복사됩니다. 물론 target 디렉토리를 먼저 만들어야 합니다.

7. 대상 파일이 너무 많아서 삭제가 안 될 때
  디렉토리 안에 파일이 너무 많을 때 삭제를 시도하면 아래의 에러 메시지와 함께 삭제가 안 될 수 있습니다.
-bash: /bin/rm: Argument list too long
  이럴 땐 아래의 방법을 사용합니다. 사용하기 전에 현재 디렉토리를 다시 한 번 확인하는 것이 좋습니다.
find * -xdev -exec rm -f '{}' ';'

8. 특정 문자열을 포함한 파일 찾는 방법
$ grep -l "printf" *.c
  하위 디렉토리에 있는 파일들까지 포함하여 문자열이 포함된 파일과 그 문자열이 있는 줄을 보고 싶다면 find, xargs, grep 명령어를 활용합니다.
$ find . -name "*.c" | xargs grep -H "buff"
./bfrovrflw.c:    char buff[15];
./bfrovrflw.c:    gets(buff);
./bfrovrflw.c:    if(strcmp(buff, "MyLinuxBook"))

9. 파일 안의 내용을 모두 지우는 방법
$ > ./logfile

10. man 페이지에서 특정 문자열 검색 방법
$ man -k login
access.conf (5)      - the login access control table file
add-shell (8)        - add shells to the list of valid login shells
chsh (1)             - change login shell
faillog (5)          - login failure logging file
faillog (8)          - display faillog records or set login failure limits
getlogin (3)         - get username
getlogin_r (3)       - get username
gnome-session-properties (1) - Configure applications to start on login
hotot (7)            - lightweight & opensource microbloging client
issue (5)            - prelogin message and identification file
lastlog (8)          - reports the most recent login of all users or of a given user
login (1)            - begin session on the system
login (3)            - write utmp and wtmp entries
login.defs (5)       - shadow password suite configuration
login_tty (3)        - tty utility functions
logname (1)          - print user's login name
...
...
...

11. 표준 에러 출력 메시지를 파일로 리다이렉트시키는 방법
  일반 리다이렉트로는 표준 에러로 출력되는 메시지를 담을 수 없습니다.
$ touch new > /home/himanshu/practice/logfile
touch: cannot touch `new': Permission denied
$ cat /home/himanshu/practice/logfile
$
$ touch new > /home/himanshu/practice/logfile 2>&1
$ cat /home/himanshu/practice/logfile
touch: cannot touch `new': Permission denied
  2>&1은 표준 에러도 표준 출력으로 보내라는 뜻입니다.

12. history에 남기지 않고 명령어 사용
  앞에 공백을 넣고 명령어를 사용합니다.
$ a
a: command not found
$  vi
$ b
b: command not found
$ history | tail -3
 1055  a
 1056  b
 1057  history | tail -3

13. 영화처럼 같은 속도로 텍스트 출력
$ echo "You can simulate on-screen typing just like in the movies" | pv -qL 10

14. alias와 같은 이름을 가진 명령어가 있을 때 alias가 아닌 그 명령어 실행
  앞에 역슬래쉬(\)를 넣고 명령어를 사용합니다.
mirashi@mirashi-virtual-machine:~/test$ alias ls='ls -al'

mirashi@mirashi-virtual-machine:~/test$ ls
합계 8
drwxrwxr-x  2 mirashi mirashi 4096  7월 17 14:33 .
drwxr-xr-x 34 mirashi mirashi 4096  7월 17 14:33 ..
-rw-rw-r--  1 mirashi mirashi    0  7월 17 14:33 test

mirashi@mirashi-virtual-machine:~/test$ \ls
test

15. 특정 파일을 사용하고 있는 프로세스 찾아내기
  파일을 지우려고 하는데 어떤 프로세스가 그 파일을 사용 중이라 지울 수 없을 때가 있습니다. 이럴 땐 fuser 명령어로 그 파일을 사용하고 있는 프로세스들의 PID를 알아낼 수 있습니다.
# fuser /var/log/httpd/access_log
/var/log/httpd/access_log: 24273 24277 24278 24279 24280 24281 24282 24283 24284 24305 24306 24307 34994 35370 35371 35372 35373 35374 35375 35376
  또한 -k 옵션을 사용하면 해당 프로세스들을 죽일 수 있습니다.

16. 복사와 붙여넣기 단축키
  먼저 복사하고 싶은 부분을 마우스로 드래그해서 선택한 후 Ctrl+Shift+C를 누르면 복사가 되고 Ctrl+Shift+V를 누르면 붙여넣기가 됩니다.





2013/07/17 14:47 2013/07/17 14:47
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Linux shell: understanding Umask with examples

  umask(user mask)는 POSIX 환경에서 사용할 수 있는 명령어이자 함수로서 현재 프로세스가 생성할 파일과 디렉토리의 퍼미션을 정합니다. 이 값은 자신의 자식 프로세스에게도 계승됩니다.

  이 명령어에서는 퍼미션과 마찬가지로 8진수를 사용합니다. 파일일 경우 666, 디렉토리일 경우 777에서 umask를 뺀 값이 현재 프로세스가 생성하는 파일과 디렉토리의 퍼미션이 됩니다. 예를 들어 파일을 생성할 때 기본으로 적용되는 퍼미션을 664(rw-rw-r--)으로 하고 싶다면 umask 명령어의 인자로 002를 사용해야 합니다.

1. 퍼미션 확인
  /tmp로 가서 파일을 만들고 확인해봅니다.
# cd /tmp
# touch firstfile
# ls -l firstfile
-rw-rw-r-- 1 mirashi mirashi 0  7월  5 11:05 firstfile
  인자 없이 umask 명령어를 사용하면 현재 umask를 볼 수 있습니다.
# umask
0002

2. umask 변경
  아래는 umask를 022로 변경하고 확인하는 모습입니다.
# umask 022
# touch secondfile
# ls -al secondfile
-rw-r--r-- 1 mirashi mirashi 0  7월  5 11:08 secondfile

3. 프로세스와 데몬에 umask 설정
  기본적으로 이를 이루는 방법은 데몬을 시작하는 스크립트 파일이나 시작에 포함된 파일에 umask 명령어를 집어넣는 것입니다. 예를 들어 아파치의 경우 /etc/init.d/apache2(데비안)이나 그보다 더 권장되는 /etc/apache2/envvars(데비안) 안에 넣어 해결할 수 있습니다.

4. 시스템 전체의 디폴트 umask 설정
  단일 계정의 umask를 변경하는 가장 쉬운 방법은 umask 명령어를 해당 계정의 홈디렉토리에 있는 .bashrc 파일이나 그와 같은 역할을 하는 파일(세션을 시작할 때 쉘이 읽는 파일)에 넣는 것입니다.

  모든 계정의 umask를 변경하려면 시스템 설정을 변경해야 하며 그 방법은 배포판에 따라 다릅니다.

데비안 계열
  pam_umask라는 이름의 PAM 모듈을 사용합니다. /etc/pam.d/common-session 파일과 /etc/pam.d/common-session-noninteractive 파일을 생성/수정하여 아래 줄을 추가합니다.
session    optional     pam_umask.so umask=0002

레드햇 계열
  /etc/bashrc 파일에서 정의합니다.
    # By default, we want umask to get set. This sets it for non-login shell.
    # Current threshold for system reserved uid/gids is 200
    # You could check uidgid reservation validity in
    # /usr/share/doc/setup-*/uidgid file
    if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
       umask 002
    else
       umask 022
    fi
  UID가 199를 넘고 그룹명이 계정명과 같은 계정은 002, 그 외에는 022가 디폴트입니다.

2013/07/05 12:23 2013/07/05 12:23
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Useful commands for Linux normal users and administrators

리눅스/유닉스 관리자용 명려어들
1. 원격 디렉토리와 로컬 디렉토리 비교
$ diff -y <(ssh user@host find /boot|sort) <(find /boot|sort)

2. 대상 호스트가 살아있으면 "ONLINE", 죽어있으면 "OFFLINE"으로 출력(스크립트용)
ping -c 1 -q 머신의_IP나_이름 >/dev/null 2>&1 && echo ONLINE || echo OFFLINE

3. 특정 포트를 사용하고 있는 프로세스 죽이기
fuser -k 포트_번호/tcp
fuser -k 포트_번호/udp

4. 당신의 데스크탑에서 원격 서버에 있는 파일을 vim으로 수정
vim scp://sriram@server1/etc/http/httpd.conf

5. 현재 컴퓨터의 모델명
sudo dmidecode | grep Product

일반 사용자 및 관리자용 명령어들
6. 플래시 비디오 파일(*.flv)의 오디오를 mp3 파일로 추출
ffmpeg -i video.flv -vn -ar 44100 -ac 2 -ab 192k -f mp3 audio.mp3

7. 하이브리드 iso 이미지 파일을 USB에 기록하면서 진행률과 남은 시간 표시
time (pv file.iso | dd bs=1M oflag=sync of=/dev/sdX 2>/dev/null)






2013/07/01 15:02 2013/07/01 15:02
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : http://www.ubuntubuzz.com/2012/01/10-useful-commands-for-linux-users.html

1. man 페이지를 PDF 파일로 저장
  아래는 APT의 맨페이지를 PDF 파일로 저장하는 예.
man -t apt | ps2pdf - apt.pdf

2. 한 머신에 설치된 패키지들을 다른 머신에도 설치(RPM 기반 시스템)
ssh root@remote.host "rpm -qa" | xargs yum -y install

3. PDF 페이지들의 맨 위에 텍스트 라인 새김
echo "This text gets stamped on the top of the pdf pages." | enscript -B -f Courier-Bold16 -o- | ps2pdf - | pdftk input.pdf stamp - output output.pdf

4. MySQL 데이터베이스의 현재 접속 수 출력
mysql -u root -p -BNe "select host,count(host) from processlist group by host;" information_schema

5. 원격 호스트 디렉토리를 압축(tarball 사용)하여 로컬에 저장
ssh user@host "tar -zcf - /path/to/dir" > dir.tar.gz

6. SSH를 통해 로그 감시
ssh -t remotebox "tail -f /var/log/remote.log"

7. 유저나 그룹의 다이어그램 출력(그래픽 환경 필요. 경우에 따라 아래 8번처럼 display를 dot -Tpng | display - 로 변경해야 할 수도 있음)
awk 'BEGIN{FS=":"; print "digraph{"}{split($4, a, ","); for (i in a) printf "\"%s\" [shape=box]\n\"%s\" -> \"%s\"\n", $1, a[i], $1}END{print "}"}' /etc/group|display

8. 커널 모듈 의존성 그래프 출력
lsmod | perl -e 'print "digraph \"lsmod\" {";<>;while(<>){@_=split/\s+/; print "\"$_[0]\" -> \"$_\"\n" for split/,/,$_[3]}print "}"' | dot -Tpng | display -

9. 보안성 뛰어난 패스워드 생성(팁: pwgen이란 프로그램은 보안성 좋고 기억하기 쉬운 패스워드를 생성해줌)
read -s pass; echo $pass | md5sum | base64 | cut -c -16

10. 500M보단 크고 1GB보단 작은 파일 검색
find / -type f -size +500M -size -1G

11. 특정 프로세스의 CPU 사용률 제한하기(cpulimit이란 프로그램 필요)
sudo cpulimit -p pid -l 50

12. 칼럼을 표 형태로 출력(아래 예는 mount 명령어에 적용 시)
mount | column -t









2013/06/27 13:28 2013/06/27 13:28
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : The proper use of redirection with sudo

  sudo 중 리다이렉션을 하면 리다이렉션부터 루트 권한을 벗어납니다.
sudo command > outputfile
     <>-root—<>—--user-—<>
  아래는 실제 결과입니다.
[mirashi@localhost ~]$ sudo date > output
[mirashi@localhost ~]$ ls -al output
-rw-rw-r-- 1 mirashi mirashi 29 Jun 21 13:08 output
  분명 실행은 sudo로 했지만 리다이렉션으로 생성된 결과물의 소유자는 root가 아닌 sudo를 실행한 유저 계정인 것을 볼 수 있습니다. 이에 대한 해결책은 > 대신 'sudo tee'를, >> 대신 'sudo tee -a'를 사용하는 것입니다. 아래처럼 말이죠.
[mirashi@localhost ~]$ sudo date | sudo tee output
Fri Jun 21 13:14:25 KST 2013
[mirashi@localhost ~]$ ls -al output
-rw-r--r-- 1 root root 29 Jun 21 13:14 output








2013/06/21 13:18 2013/06/21 13:18
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Whip Up Regular Expressions With Txt2regex

  txt2regex는 몇 가지 질문에 답하는 것으로 정규식을 생성해주는 bash 스크립트입니다. 2004년을 마지막으로 업데이트가 없어서 아쉽긴 하지만 정규식이 자주 바뀌진 않기에 그럭저럭 쓸 수는 있습니다. bash 스크립트기 때문에 별도의 설치가 필요없는 것도 장점이라 할 수 있겠군요.

  사용법은 간단합니다. 실행해서 물어보는 것에 원하는 만큼 답하여 정규식을 완성한 후 .을 눌러 종료하면 됩니다. 실행하면 기본적으로 요청한 내용에 대한 perl, php, postgres, python, sed, vim의 정규식만 보여주지만 / 를 눌러 다른 여러 프로그램에 대응하는 정규식을 볼 수도 있습니다. 아니면 아예 처음부터 txt2regex--prog 프로그램명 형식으로 실행하여 해당 프로그램의 정규식을 처음부터 볼 수도 있습니다.



2013/06/20 14:21 2013/06/20 14:21
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Tips for Using Vim as an IDE

  Vim은 커스터마이징과 확장성이 매우 뛰어나기 때문에 그냥 에디터가 아닌 IDE(Integrated Development Environment=통합개발환경)로 활용할 수 있습니다.

1. 자동 들여쓰기 및 문법 하일라이팅
  본인 홈 디렉토리의 .vimrc 파일에 아래를 추가합니다.
filetype indent on
syntax on
  첫 번째 줄은 파일타입을 보고 그에 알맞는 들여쓰기를 해주며, 두 번째 줄은 문법 하일라이팅을 해줍니다. 그리고 들여쓰기의 기본 공백 길이는 8칸이지만 아래처럼 값을 바꿀 수 있습니다.
set shiftwidth=2

2. 탭 관련
  탭을 누를 때 탭 문자 대신 공백을 넣으려면 본인 홈 디렉토리의 .vimrc 파일에 아래를 추가합니다. 이 옵션을 사용할 때 탭 문자를 넣고 싶다면 Ctrl+v<tab>을 누르면 됩니다.
set expandtab
  단, 이미 있는 탭 문자는 변하지 않는데 이것들을 현재 탭 세팅에 맞게 바꿔주려면 아래 명령어를 에디터에서 사용합니다.
:retab
  탭을 누를 때마다 입력될 공백 칸의 개수는 아래를 통해 설정할 수 있습니다.
set tabstop=4

3. 실시간 검색(Incremental Searching)
  Vim은 기본적으로 검색을 할 때 /를 누른 후 검색할 단어를 입력하고 엔터를 눌러 검색합니다. 여기에는 2가지 단점이 있는데 첫 째로 검색대상을 짧게 입력하면 원치 않는 결과가 많이 걸려 나온다는 겁니다. 두 번째로 앞의 단점을 이유로 길게 치자니 너무 많은 글자를 쳐야 하고 이 경우 들이는 수고는 물론이고 오타가 발생할 확률이 늘어난다는 겁니다. 이를 해결하기 위해 한 글자를 누를 때마다 매칭되는 곳으로 이동하려면 본인 홈 디렉토리의 .vimrc 파일에 아래의 내용을 추가합니다.
set incsearch
  그러면 검색을 위해 키를 누를 때마다 그때까지 입력한 것과 일치하는 곳으로 즉시 커서가 이동합니다. 덤으로 위 세팅과 상관 없이 *를 누르면 현재 커서에 있는 단어를 대상으로 검색을 합니다.

4. Ctags
  Ctags는 소스 트리에서 함수, 변수, 클래스 멤버, 클래스 메소드 등의 이름을 인덱스 파일로 생성해주는 기능으로서 작성하고 있는 언어를 기준으로 작동하여 높은 정확성을 갖습니다.

  별도의 설치가 필요하며 리눅스의 경우 데비안 계열은 'exuberant-ctags'란 이름으로, 레드햇 계열의 경우 'ctags'라는 이름으로 다운받아 설치할 수 있습니다.

  설치가 끝나면 코드 프로젝트의 최상단 디렉토리에서 ctags -R 명령어로 태그파일을 생성합니다. 그 후 소스 파일 중 하나를 Vim으로 열어서 커서를 메소드 이름이나 오브젝트 타입에 둔 후 Ctrl+]을 눌르면 그 본체가 있는 곳으로 갈 수 있으며 Ctrl+t를 통해 이전으로 돌아갈 수 있습니다.

  Vim의 플러그인인 를 설치하면 이 기능을 더 유용하게 사용할 수 있습니다. 다운받아 압축을 해제한 후 taglist.vim 파일을 ~/.vim/plugins 디렉토리에, taglist.txt 파일은 ~/.vim/doc 디렉토리에 옮깁니다. taglist에 대한(그리고 ~/.vim/doc에 있는 다른 플러그인의 문서) 도움말 파일을 생성하기 위해 ~/.vim/doc 디렉토리에서 Vim을 실행하고 :helptags . 를 실행합니다.

  태그리스트를 사용하려면 Ctags를 실행 후 그 프로젝트의 소스 파일들 중 하나를 열어 :TlistToggle 를 실행하여 태그 윈도우를 오픈합니다. 태그를 더블 클릭하거나 엔터를 치면 소스 코드 윈도우에 있는 그 태그로 이동합니다. 새로운 파일을 열면 그 파일의 태그가 리스트 윈도우에 추가됩니다. 또한 태그를 클릭한 후 t를 눌러 새로운 Vim 탭에 그 태그를 열 수 있습니다. 파일을 수정한 후 저장했다면 :TlistUpdate를 통해 태그리스트를 업데이트하여 새로운 태그를 추가할 수 있습니다.

5. 자동완성
  본인 홈 디렉토리의 .vimrc 파일에 아래를 추가합니다.
filetype plugin on
set ofu=syntaxcomplete#Complete
  이제 단어나 메소드명을 입력 중 Ctrl+n을 눌러 추천 완성 목록을 볼 수 있습니다. Ctrl+n을 계속 눌러 목록의 다음 항목을 선택할 수 있으며 Ctrl+p로 이전 항목을 선택할 수 있습니다. 완벽한 메소드명 완성을 이용하려면 먼저 ctags를 실행해야 하며 그렇지 않으면 현재 파일 내에 있는 것만 인식할 수 있습니다.

  그 외에도 Ctrl+x->Ctrl+f로 파일명 완성, Ctrl+x->Ctrl+l로 전체 줄 완성 기능을 사용할 수도 있습니다.(더 자세한 내용은 :help ins-completion을 참조.) Vim 스크립트인 을 사용하면 탭으로 자동 완성 기능을 사용할 수도 있습니다.



2013/06/20 13:36 2013/06/20 13:36