[Linux] shell 에서 메일 보내기

이용 가능한 SMTP가 있는 경우 shell 에서도 메일을 보낼 수 있다. 쉘 스크립트 상에서 메일을 보내거나 할 때 유용하다. 가장 편한 방법이 sendemail 을 이용하는 것 같다.
다음과 같이 하면 된다. 아래 예제는 무인증 SMTP를 이용할 경우의 예제이다.

$ sendEmail -f “보내는이@메일” -s <SMTP 서버 주소> -t “받는이@메일” -u “메일 제목” -m “메일 내용”

Perl script 를 이용해서도 간편히 보낼 수 있는데, 예제는 다음과 같다.

#!/usr/bin/perl -w
use Net::SMTP;
$smtp = Net::SMTP->new(‘<SMTP 서버 주소>’);
$smtp->mail(‘보내는이@메일’);
$smtp->to(‘받는이@메일’);
$smtp->data();
$smtp->datasend(“To: dasomoli\n”);
$smtp->datasend(“Subject: A simple test mail subject\n”);
$smtp->datasend(“\n”);
$smtp->datasend(“A simple test message\n”);
$smtp->datasend(“A simple test message 2\n”);
$smtp->dataend();
$smtp->quit;

한글 메일을 보내고 싶으면 perl 스크립트로 아래와 같이 MIME::Lite 를 사용하면 된다.

$ sudo apt-get install libmime-lite-perl

#!/usr/bin/perl -w
use MIME::Lite;
### Create a new multipart message:
$msg = MIME::Lite->new(
                From    => ‘보내는이@메일’,
                To      => ‘받는이@메일’,
                Subject => ‘Hangul test’,
                Data    => ‘한글’,
                );
$msg->attr(‘content-type.charset’ => ‘UTF-8’);
### Add parts (each “attach” has same arguments as “new”):
### use Net:SMTP to do the sending
$msg->send(‘smtp’, ‘<SMTP 서버 주소>’, Debug=>1 );

참고 : 
http://nixcraft.com/shell-scripting/11895-shell-script-send-email-via-smtp-username-password.html
http://caspian.dotconf.net/menu/Software/SendEmail/
http://perldoc.perl.org/Net/SMTP.html
http://search.cpan.org/~rjbs/MIME-Lite-3.028/lib/MIME/Lite.pm

[Linux] ioctl을 대체하는 unlocked_ioctl

기존 device driver를 제어하기 위한 방법 중 하나였던 ioctl이 2.6.36 커널부터 unlocked_ioctl 로 대체되었다.
ioctl과 unlocked_ioctl의 차이점은 ioctl이 BKL(Big Kernel Lock)로 보호되었다면, unlocked_ioctl은 BKL이 없다. 따라서 Preemptible 하게 되었으므로, ioctl의 동시성에 대해서 driver 스스로 보호하여야 한다.
driver의 제어를 위해서 ioctl보다는 sysfs를 이용하는 방향으로 가고 있는 듯 하다(http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-May/001852.html).

compat_ioctl은 64비트 시스템에서 32비트 프로세스가 ioctl을 부를 때를 위해서 만들어졌다.

참고 : http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-May/001851.html

한미 FTA 비준동의안 찬성 명단

대한민국과 미합중국 간의 자유무역협정 및 대한민국과 미합중국 간의 자유무역협정에 관한 서한교환 비준동의안 처리 의원 명단 – 투표에 참고하도록 한다.

[한나라당]

찬성(140명)

강길부(울산 울주군)
강명순(비례대표)
강석호(경북 영양군·영덕군·봉화군·울진군)
강성천(비례대표)
강승규(서울 마포구 갑)
고승덕(서울 서초구 을)
고흥길(경기 성남시 분당구 갑)
구상찬(서울 강서구 갑)
권경석(경남 창원시 갑)
권영세(서울 영등포구 을)
권성동 (강원도 강릉시)
권택기(서울 광진구 갑)
김기현(울산 남구 을)
김동성(서울 성동구 을)
김무성(부산 남구 을)
김선동(서울 도봉구 을)
김성동 (비례대표)
김성수(경기 양주시·동두천시)
김성조(경북 구미시 갑)
김성회(경기 화성시 갑)
김세연 (부산광역시 금정구)
김소남(비례대표)
김영선(경기 고양시 일산서구)
김영우(경기 포천시·연천군)
김옥이(비례대표)
김장수(비례대표)
김정권 (경상남도 김해시갑)
김정훈(부산 남구 갑)
김태원(경기 고양시 덕양구 을)
김태호(경남 김해시 을)
김태환(경북 구미시 을)
김학송(경남 진해시)
김학용(경기 안성시)
김형오(부산 영도구)
김호연(충남 천안시 을)

나성린(비례대표)
남경필(경기 수원시 팔달구)
박근혜(대구 달성군)
박대해(부산 연제구)
박민식(부산 북구·강서구 갑)
박보환(경기 화성시 을)
박상은(인천 중구·동구·옹진군)
박순자(경기 안산시 단원구 을)
박준선 (경기도 용인시 기흥구)
박영아(서울특별시 송파구 갑)
박종근(대구광역시 달서구 갑)
박진(서울 종로구)
백성운(경기 고양시 일산동구)
배영식(대구 중구·남구)
배은희(비례대표)
서병수(부산 해운대구·기장군 갑)
서상기(대구 북구 을)
손범규(경기 고양시 덕양구 갑)
손숙미(비례대표)
송광호(충북 제천시·단양군)
신영수(경기 성남시 수정구)
신상진(경기 성남시 중원구)
신지호(서울 도봉구 갑)
심재철(경기 안양시 동안구 을)

안경률 (부산광역시 해운대구 기장군 을)
안상수(경기 의왕시·과천시)
안홍준(경남 마산시 을)
안효대(울산 동구)
원유철(경기 평택시 갑)
원희목(비례대표)
유기준(부산 서구)
유승민(대구 동구 을)
유일호(서울특별시 송파구 을)
유재중 (부산광역시 수영구)
유정복(경기 김포시)
유정현(서울 중랑구 갑)
윤상현(인천 남구 을)
윤석용(서울 강동구 을)
윤영(경남 거제시)
윤진식(충북 충주시)
이두아(비례대표)
이명규(대구 북구 갑)
이범관(경기 이천시·여주군)
이범래(서울 구로구 갑)
이병석(경북 포항시 북구)
이사철(경기 부천시 원미구 을)
이상권(인천 계양구 을)
이상득(경북 포항시 남구·울릉군)
이성헌(서울 서대문구 갑)
이윤성(인천 남동구 갑)
이애주(비례대표)
이영애(비례대표)
이은재(비례대표)
이인기(경북 고령군·성주군·칠곡군)
이정선(비례대표)
이정현(비례대표)
이종구(서울 강남구 갑)
이종혁(부산 부산진구 을)
이주영(경남 마산시 갑)
이진복(부산 동래구)
이철우(경북 김천시)
이춘식(비례대표)
이학재(인천 서구·강화군 갑)
이한구(대구 수성구 갑)
이한성(경북 문경시·예천군)
이해봉(대구 달서구 을)
이혜훈(서울 서초구 갑)
이화수(경기 안산시 상록구 갑)
임동규(비례대표)

장윤석(경북 영주시)
장제원(부산 사상구)
전여옥(서울 영등포구 갑)
전재희(경기 광명시 을)
정갑윤(울산 중구)
정두언(서울 서대문구 을)
정몽준(서울 동작구 을)
정미경(경기 수원시 권선구)
정수성 (경상북도 경주시)
정양석(서울 강북구 갑)
정옥임(비례대표)
정진섭(경기 광주시)
조문환(비례대표)
조원진(대구 달서구 병)
조윤선(비례대표)
조전혁(인천 남동구 을)
조진래(경남 의령군·함안군·합천군)
조해진(경남 밀양시·창녕군)
주광덕(경기 구리시)
주성영(대구 동구 갑)
주호영(대구 수성구 을)
진성호(서울 중랑구 을)
진수희(서울 성동구 갑)
차명진(경기 부천시 소사구)
최경환(경북 경산시·청도군)
최경희(비례대표)
최구식(경남 진주 갑)
최병국(울산 남구 갑)
한기호(강원 철원군·화천군·양구군·인제군)
한선교(경기 용인시 수지구)
허원제(부산 부산진구 갑)
허천(강원 춘천시)
홍일표(인천 남구 갑)
홍준표(서울 동대문구 을)
황우여(인천 연수구)
황진하(경기 파주시)

반대(1명)

황영철(강원도 홍천군 횡성군)

기권(11명)

김광림(경북 안동시)
김성식(서울 관악구 갑)
김성태(서울 강서구 을)
김재경(경상남도 진주시 을)
성윤환(경북 상주시)
신성범(경남 산청군·함양군·거창군)
여상규(경상남도 남해군 하동군)
임해규(경기 부천시 원미구 갑)
정태근(서울 성북구 갑)
정해걸(경상북도 군위군 의성군 청송군)
현기환(부산광역시 사하구 갑)

불참(16명)

권영진(서울 노원구 을)
김용태(서울 양천구 을)
김충환(서울 강동구 갑)
안형환(서울 금천구)
원희룡(서울 양천구 갑)
이군현(경남 통영시, 고성군)
이경재(인천 서구, 강화군 을)
이재오(서울 은평구 을)
장광근(서울 동대문 갑)
정병국(경기 양평군, 가평군)
정의화(부산 중구, 동구)
정희수(경북 영천)
조진형(인천 부평구 갑)
진영(서울 용산구)
홍사덕
홍정욱(서울 노원구 병)

[자유선진당]

찬성(5명)

김용구(비례대표)
이영애(비례대표)
이인제(충청남도 논산시 계룡시 금산군)
이회창(충청남도 홍성군 예산군)
조순형(비례대표)

반대(6명)

권선택(대전광역시 중구)
김낙성(충청남도 당진군)
심대평(충청남도 공주시 연기군)
류근찬(충청남도 보령시 서천군)
이진삼(충청남도 부여군 청양군)
임영호(대전광역시 동구)

불참(7명)

김창수
박선영
변웅전
이명수
이상민
이용희
이재선

[기타]

찬성(6명)

김정 미래희망연대 (비례대표)
김혜성 미래희망연대 (비례대표)
노철래 미래희망연대 (비례대표)
송영선 미래희망연대 (비례대표)
윤상일 미래희망연대 (비례대표)
최연희 무소속 (강원도 동해시 삼척시)

기권(1명)

이용경 창조한국당 (비례대표)

불참

김을동 미래희망연대(비례대표)
정영희 미래희망연대(비례대표)
정하균 미래희망연대(비례대표)

[민주당·민주노동당]

전원 불참

gerrit 프로젝트 Mirroring 하기

gerrit을 사용하면 자기가 access 권한이 있는 프로젝트의 리스트를 ssh를 이용하여 ls-projects 라는 명령을 이용해서 얻어올 수 있다. http://gerrit-documentation.googlecode.com/svn/Documentation/2.2.0/cmd-ls-projects.html 를 참고하면 되는데, 해당 도움말을 보면 이 명령을 이용해서 접근 가능한 모든 Project 를 clone 할 수 있는 쉘 스크립트가 있다.

for p in `ssh -p 29418 review.example.com gerrit ls-projects`
do
  mkdir -p `dirname "$p"`
  git clone --bare "ssh://review.example.com:29418/$p.git" "$p.git" 

done 

이것과 crontab, shell script를 조금 응용하면 계속적으로 업데이트 함으로써 Mirroring 을 할 수 있다.

#!/bin/sh
PLATFORM_HOME=`readlink -e .`
PROJECT_LIST=`ssh -p 29418 review.example.com gerrit ls-projects`
ROOT=”ssh://review.example.com”
DIRNAME=”/usr/bin/dirname”
BASENAME=”/usr/bin/basename”
for PROJECT in $PROJECT_LIST
do
        cd $PLATFORM_HOME;
        echo “——————————————————–“
        echo ” $PROJECT.git”
        if [ -d $PROJECT.git ]; then
                echo “Entering $PROJECT.git”;
                cd $PROJECT.git;
                git remote update
        else
                echo “Cloning $ROOT/$PROJECT.git”;
                PROJECT_DIR=`$DIRNAME $PROJECT`
                mkdir -p $PROJECT_DIR
                git clone –mirror “$ROOT/$PROJECT.git” “$PROJECT.git”
        fi
done

 미러링 사용시에는 받아오기 전에 다음 명령과 같이 설정하여 사용하면 된다.

 git config –global url.”git://<IP>”.insteadOf “git://codeaurora.org”

Linux kernel, ramdisk 사용 및 Android 빌드 시스템에서의 설정

Linux 커널의 경우 램디스크를 여러 종류를 사용하는데 이 중 initramfs/initrd 를 사용하는 경우
CONFIG_BLK_DEV_INITRD 를 설정하고, CONFIG_INITRAMFS_SOURCE 에 root 파일템이 만들어져 있는 디렉토리 경로를 써준다.
Android 빌드 시스템에서는 커널 및 램디스크를 합쳐서 boot.img 를 만들어 사용하는데,
이 때, 사용될 Kernel Command line 을 지정할 수 있다. 이 때 TARGET_NO_KERNEL은 false 여야 한다.
이는 build/core/Makefile 에서 확인할 수 있다. 

BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE))
ifdef BOARD_KERNEL_CMDLINE
  INTERNAL_BOOTIMAGE_ARGS += –cmdline “$(BOARD_KERNEL_CMDLINE)”
endif

이 외에도 Kernel Base address, Page Size 등도 지정할 수 있다.

BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE))
ifdef BOARD_KERNEL_BASE
  INTERNAL_BOOTIMAGE_ARGS += –base $(BOARD_KERNEL_BASE)
endif
BOARD_KERNEL_PAGESIZE := $(strip $(BOARD_KERNEL_PAGESIZE))
ifdef BOARD_KERNEL_PAGESIZE
  INTERNAL_BOOTIMAGE_ARGS += –pagesize $(BOARD_KERNEL_PAGESIZE)
endif

TARGET_BOOTIMAGE_USE_EXT2 를 true로 하면 ext2 파일시스템의 boot image를 만드는 것 같다.

ifeq ($(TARGET_BOOTIMAGE_USE_EXT2),true)
tmp_dir_for_image := $(call intermediates-dir-for,EXECUTABLES,boot_img)/bootimg
INTERNAL_BOOTIMAGE_ARGS += –tmpdir $(tmp_dir_for_image)
INTERNAL_BOOTIMAGE_ARGS += –genext2fs $(MKEXT2IMG)
$(INSTALLED_BOOTIMAGE_TARGET): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES)
    $(call pretty,”Target boot image: $@”)
    $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) –output $@
else # TARGET_BOOTIMAGE_USE_EXT2 != true
$(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
    $(call pretty,”Target boot image: $@”)
    $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) –output $@
    $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE),raw)
endif # TARGET_BOOTIMAGE_USE_EXT2

예제)

TARGET_NO_KERNEL := false
BOARD_KERNEL_BASE := 0x30000000
BOARD_KERNEL_PAGESIZE := 4096
BOARD_KERNEL_CMDLINE := console=ttyFIQ0 no_console_suspend

lxr 설치하기

http://lifeseed.tistory.com/tag/glimpse 에 있는대로만 하면 된다. 글쓴이에게 감사를..

정리하자면,
1. glimpse 설치
1.1. wget http://webglimpse.net/trial/glimpse-latest.tar.gz
1.2. tar xvfz glimpse-latest.tar.gz
1.3. ./configure && make && sudo make install

2. lxr 설치
2.1. sudo apt-get install lxr
 기본 설치는 /usr/share/lxr 에 된다.
2.2. sudo vi /etc/apache2/sites-available/default 후 다음 내용 추가

    Alias /lxr “/usr/share/lxr”
    <Directory “/usr/share/lxr”>
        Options All
        AllowOverride All
    </Directory>

2.3. sudo cp /usr/share/lxr/blurb.html /usr/share/lxr/index.html

3. lxr 환경 설정
3.1. sudo vi /usr/share/lxr/lxr.conf
3.1.1. 나의 경우 대부분 archtechture로 arm 을 쓰므로 다음처럼 고친다.

# Define typed variable “a”.  First value is default.
variable: a, Architecture, (arm, i386, alpha, m68k, mips, ppc, sparc, sparc64)

3.1.2. base url 도 localhost 대신 ip 를 사용하자.

# Define the base url for the LXR files.

baseurl: http://<IP ADDRESS>/lxr/http/

3.1.3. version 명으로 된 디렉토리 아래 바로 소스를 둘 것이므로 다음처럼 고친다.

# The source is here.
sourceroot: /usr/share/lxr/source/$v/
srcrootname: Linux

3.1.4. glimpse 를 위처럼 설치했다면 경로가 다르므로 이것도 고치자.

# Glimpse can be found here.
glimpsebin: /usr/local/bin/glimpse
 

4. 소스 코드 복사 및 DB 구축
4.1. sudo mkdir /usr/share/lxr/source/<VERSION>
4.2. sudo cp 소스 /usr/share/lxr/source/<VERSION>
4.3. cd  /usr/share/lxr/source
4.4. sudo echo ‘<VERSION>’ >> ./versions
4.5. sudo echo ‘<VERSION>’ >> ./defversion
4.6. cd <VERSION>
4.7. sudo genxref ./
4.8. sudo glimpseindex -H ./ fileidx xref
4.9. sudo chmod 644 .glimpse_*
4.10. sudo chmod 644 fileidx
4.11 sudo chmod 644 xref

5. http://<IP ADDRESS>/lxr/http 접속.

 

git/gerrit 사용시 알아야 할 것

git과 gerrit 을 사용할 때 최소한 알아야 하는 것을 정리한 것으로 회사 내의 git 교육 담당자에게 교육 시 필요한 내용을 정리해서 보낸 내용이다. 이거 다 알면 git 잘 쓴다^^
이것을 차례로 삼아 세부 내용을 하나씩 문서로 만들어 정리하자.

추가1: 이미 http://namhyung.springnote.com/pages/3132772 에 git 사용자 설명서가 있다. 저 namhyung님이 내가 아는 우분투 쪽 김남형 님일까 ㅎㅎ

추가2: http://git-scm.com/book/ko 번역자에게 축복을…

* git
1. Git의 Repository 개념과 clone 의 개념, clone

2. Git의 remote branch와 local branch 간 차이, fetch
3. Remote 브랜치로부터 local branch 를 최신으로 업데이트 하는 방법, pull/rebase의 이해
4. 수정 반영 방법, Git의 Staging area 개념과 작업 방법, add/commit 의 이해, commit -s 옵션
5. Commit 을 수정하는 방법, commit –amend 의 이해
6. Push 방법 – Gerrit의 refs/for/* 개념 이해, push의 이해, push 시의 refs spec 이해
7. Log를 확인하는 방법, log
8. Commit 간 차이(diff)를 확인하는 방법, diff
9. 특정 시점의 소스로 돌아가는 방법, reset
10. 특정 소스 파일을 특정 시점으로 되돌리는 방법, checkout
11. Backout 방법, revert
12. local 브랜치를 만드는 방법, branch
13. remote 브랜치나 local 브랜치로 local 소스를 만드는 방법, checkout
14. cherry-pick 의 이해, cherry-pick
15. patch 파일 만들기와 패치 적용 방법, , format-patch/am
16. merge 방법 및 merge commit이 무엇인지, merge
17. rebase 나 merge 시의 conflict 해결 방법

* gerrit
1. 그룹의 정의 및 권한 이해
2. Verify 방법 – Verify 의 의미 이해
3. Review 방법 – Inline comments 작성 및 cover message 작성(+ 한글 작성 가능 알림)
4. Gerrit 에서 cherry-pick 하기
5. Gerrit 에서 checkout 하기
6. Gerrit 에서 같은 Change의 Patch set 업데이트 하기
7. Submit 시의 동작 이해

crontab 일반 사용자로 쓰기

0. crontab 허용 사용자 추가
$ sudo vi /etc/cron.allow
사용자 이름 적고 저장 후 crontab 서비스 재시작 – sudo service crontab restart

1. crontab 사용자 파일 수정
$ crontab -e

*/10 * * * * /home/dasomoli/update.sh 식으로 적고 저장