<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8769064231310706234</id><updated>2011-12-15T03:06:37.697-08:00</updated><category term='이클립스실행에러'/><category term='window xp'/><category term='Naver'/><category term='Bigtable'/><category term='개발문화'/><category term='WINDOW7'/><category term='window crack'/><category term='WEBPLAN'/><category term='javascript'/><category term='JSP'/><category term='JAVA'/><category term='RESTORE'/><category term='아파치'/><category term='google webmaster tool'/><category term='secure'/><category term='AJAX'/><category term='OpenSSL'/><category term='RGB코드'/><category term='Oracle'/><category term='SQL injection'/><category term='mssql2000'/><category term='WEB'/><category term='memcache'/><category term='IDENTITY'/><category term='SEM'/><category term='OCI'/><category term='XML/SOAP'/><category term='Hadoop'/><category term='스트럿츠'/><category term='gamja'/><category term='xss'/><category term='Spring'/><category term='injection'/><category term='cron'/><category term='WINDOW2008'/><category term='mysql connector/j'/><category term='gungho'/><category term='LAST_INSERT_ID()'/><category term='crontab'/><category term='SITE HISTORY'/><category term='linux'/><category term='Mobile'/><category term='LAMP'/><category term='Struts'/><category term='centos'/><category term='MySQL'/><category term='BLOG'/><category term='GOOGLE'/><category term='OpenPNE'/><category term='원도우크랙'/><category term='Subversion'/><category term='windows mui'/><category term='window mui'/><category term='MVC2'/><category term='RDBMS'/><category term='xslt'/><category term='sqldeveloper'/><category term='TOAD'/><category term='sendmail'/><category term='mssql2005'/><category term='C#'/><category term='PHP'/><category term='토드'/><category term='Tomcat'/><category term='소프트웨어'/><category term='개발방법론'/><category term='android'/><category term='모델2'/><category term='SEO'/><category term='Ruby'/><category term='APACHE'/><category term='Neptune'/><category term='SEQUENCE'/><category term='APM'/><category term='Eclipse'/><category term='소프트웨어문화'/><category term='OOP'/><category term='Jennifer'/><category term='KEYWORD'/><category term='젠드실행에러'/><category term='MS-SQL'/><category term='vpn'/><category term='google seo'/><category term='symfony'/><category term='wgatray unlocker'/><category term='원도운 정품인증'/><category term='daum cafe ranking'/><category term='modssl'/><title type='text'>AJAX, WEB 2.0 SEO, by VINS</title><subtitle type='html'>Android, Oracle, MS-SQL, PHP, JAVA, XML, C#</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default?start-index=101&amp;max-results=100'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>412</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-4328299796860952142</id><published>2011-06-22T20:35:00.000-07:00</published><updated>2011-06-22T20:35:03.474-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><title type='text'>심포니 프레임워크 한글 요약본</title><content type='html'>링크 참조~&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-4328299796860952142?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://trac.symfony-project.org/wiki/Documentation/ko_KR/summary/The_Definitive_Guide_to_symfony' title='심포니 프레임워크 한글 요약본'/><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/4328299796860952142/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2011/06/blog-post_22.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4328299796860952142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4328299796860952142'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2011/06/blog-post_22.html' title='심포니 프레임워크 한글 요약본'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-3292720215187453316</id><published>2011-06-22T20:05:00.001-07:00</published><updated>2011-06-22T20:05:50.645-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><title type='text'>심포니 설치시 오류 메세지</title><content type='html'>심포니 설치시 오류 메세지&lt;br /&gt; &lt;br /&gt;[root@localhost root]# pear install symfony/symfony-1.2.5&lt;br /&gt;&lt;br /&gt;Package "symfony" Version "1.2.5" does not have REST xml available&lt;br /&gt;Cannot initialize 'channel://pear.symfony-project.com/symfony-1.2.5', invalid or missing package file&lt;br /&gt;Package "channel://pear.symfony-project.com/symfony-1.2.5" is not valid&lt;br /&gt;install failed  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;위와 같은 오류가 발생할 경우 (심포니 채널 업데이트 할 것)&lt;br /&gt;[root@localhost root]#  pear channel-update symfony&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;크리에이티브 커먼즈 라이선스&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-3292720215187453316?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/3292720215187453316/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2011/06/blog-post.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3292720215187453316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3292720215187453316'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2011/06/blog-post.html' title='심포니 설치시 오류 메세지'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-1368005602226159517</id><published>2010-12-29T11:22:00.000-08:00</published><updated>2010-12-29T11:22:20.390-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WINDOW7'/><category scheme='http://www.blogger.com/atom/ns#' term='window crack'/><category scheme='http://www.blogger.com/atom/ns#' term='wgatray unlocker'/><title type='text'>원도우7 정품인증창 제거</title><content type='html'>원도우7 정품인증 창 제거&lt;br /&gt;Window7 정품인증 창 제거&lt;br /&gt;remove window7 auth window&lt;br /&gt;&lt;br /&gt;목적 : 원도우 정품인증창 제거&lt;br /&gt;&lt;br /&gt;해야할 일 &lt;br /&gt;1. unlocker.exe 다운받기&lt;br /&gt;글 쓰는 시점의 최신 버젼은 아래 링크 클릭&lt;br /&gt;http://www.geardownload.com/system/unlocker--download.html&lt;br /&gt;너무 옛날꺼다 싶으면 검색해서 최신버젼으로 받으시면 됩니다.&lt;br /&gt;&lt;br /&gt;2. c:\windows\system32\wat 폴더 자체를 마우스 우클릭 하면&lt;br /&gt;팝업 메뉴 중간쯤에 unlocker가 보이며 그걸 클릭하면 &lt;br /&gt;다른 메뉴가 나오는데 드롭다운 박스에서 언락 상태를 뭐로 할지 선택한다.&lt;br /&gt;삭제 선택하고 확인 클릭하면 끝&lt;br /&gt;&lt;br /&gt;이 간단한 두가지만 하면 앞으로 인증요구창은 더 안봐도 된다. &lt;br /&gt;&lt;br /&gt;------------------- window xp 정품인증 제거--------------------------&lt;br /&gt;------------원도우 정품 인증 죽이기 (kill WgaTray.exe remove) -----------&lt;br /&gt;&lt;br /&gt;1. 실행창에 regedit 입력한다. (윈도우 버튼 누르면 보이는 실행(R)...을 말하는 겁니다.)&lt;br /&gt;2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify&lt;br /&gt;3. Notify 폴더를 통채로 삭제한다.&lt;br /&gt;4. 다시 실행창에 5번을 입력하고 엔터&lt;br /&gt;5. %windir%\system32\wgatray.exe /u&lt;br /&gt;6. 재부팅 한다.&lt;br /&gt;&lt;br /&gt;----------- 여기까지만 해도 재부팅하면 wgatray (별그림) 은 사라져있습니다.&lt;br /&gt;그래도 혹시 모르니까 ㅎㅎ&lt;br /&gt;&lt;br /&gt;7. 다시 실행창에 regedit 를 입력하고 2번을 실행한다.&lt;br /&gt;8. 3번을 다시 실행한다 (Notify 폴더 삭제, 없는 분은 9번으로...)&lt;br /&gt;9. 실행창에 cmd /c "del %windir%\system32\wgatray.exe" 실행&lt;br /&gt;10.실행창에 cmd /c "del %windir%\system32\WGAlogon.dll" 실행&lt;br /&gt;11.실행창에 cmd /c "rmdir /s /q %windir%\SoftwareDistribution\Download\6c4788c9549d437e76e1773a7639582a" 실행한다&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;참고 주소 &lt;-- 여기서 참조했습니다. &lt;br /&gt;&lt;br /&gt;원래라면 9, 10, 11 번을 통해서 wgatray.exe 가 지워져야합니다.&lt;br /&gt;&lt;br /&gt;하지만 가끔 가다가 분명 레지스터리 안에 파일들을 모두 삭제했지만, 여전히 남아서&lt;br /&gt;어느 순간 다시금 wgatrya.exe 가 실행될때가 있습니다.&lt;br /&gt;&lt;br /&gt;우선 C:\WINDOWS\system32 안에 있는 wgatray.exe 를 제거&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-1368005602226159517?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/1368005602226159517/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/12/7.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1368005602226159517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1368005602226159517'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/12/7.html' title='원도우7 정품인증창 제거'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-5363843627611768463</id><published>2010-04-20T23:37:00.000-07:00</published><updated>2010-04-20T23:37:07.611-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='memcache'/><title type='text'>Memcached 설치 및 설정하고 테스트 하기 by Vins</title><content type='html'>우선 작업하기 전에 &lt;br /&gt;memcached (서버 데몬)&lt;br /&gt;memcache (php-memcache 클라이언트) 이 두개의 버젼을 일치해야 한다&lt;br /&gt;설치 진행은 &lt;br /&gt;먼저 서버 memcached 1.4.5&lt;br /&gt;    클라이언트 memcache 2.2.5를 사용하였다 &lt;br /&gt;버젼이 안 맞으면 테스트가 되지 않는다 &lt;br /&gt;&lt;br /&gt;memcached&lt;br /&gt;•memcached: 基本情報 &lt;br /&gt;•memcacheセットアップ &lt;br /&gt;◦memcacheセットアップ[peclパッケージ編] &lt;br /&gt;■memcacheインストール &lt;br /&gt;■PECL::memcacheパッケージコンパイル &lt;br /&gt;■PHP設定 &lt;br /&gt;•memcachedセットアップ &lt;br /&gt;◦memcachedセットアップ[peclパッケージ編] &lt;br /&gt;■memcached実行ユーザー作成 &lt;br /&gt;■memcachedインストール &lt;br /&gt;■memcachedコンパイル &lt;br /&gt;■memcached動作確認 &lt;br /&gt;■memcachedの設定確認 &lt;br /&gt;■自動起動設定 &lt;br /&gt;■サービスの起動 &lt;br /&gt;◦memcachedインストール[yum編] &lt;br /&gt;■yumのリポジトリ更新 &lt;br /&gt;■memcachedのインストール &lt;br /&gt;■memcachedの起動 &lt;br /&gt;•[資料]セッションセーブハンドラに登録 &lt;br /&gt;◦php.iniの場合 &lt;br /&gt;◦.htaccessの場合 &lt;br /&gt;◦プログラムの場合 &lt;br /&gt; &lt;br /&gt;memcached: 基本情報 †&lt;br /&gt;http://memcached.org/&lt;br /&gt;&lt;br /&gt;特集：memcachedを知り尽くす&lt;br /&gt;http://gihyo.jp/dev/feature/01/memcached&lt;br /&gt;&lt;br /&gt;memcacheはデーモン(deamon):memcached&lt;br /&gt;クライアント(client):memcache&lt;br /&gt;で構成されています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;↑&lt;br /&gt;memcacheセットアップ †&lt;br /&gt;↑&lt;br /&gt;memcacheセットアップ[peclパッケージ編] †&lt;br /&gt;↑&lt;br /&gt;memcacheインストール †&lt;br /&gt;参照PHP インストール手順&lt;br /&gt;memcacheのパッケージをダウンロードする&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# echo "http_proxy=http://192.168.34.2:8080/" &gt;&gt; /etc/wgetrc&lt;br /&gt;# #IDC以外の時は必要ない&lt;br /&gt;# #間違えて作ってしまった場合は&lt;br /&gt;# #rm /etc/wgetrc で消しておく&lt;br /&gt;# cd /usr/local/src&lt;br /&gt;# wget http://pecl.php.net/get/memcache-2.2.5.tgzダウンロードしたパッケージを解凍する&lt;br /&gt;&lt;br /&gt;# tar -zxvf memcache-2.2.5.tgz&lt;br /&gt;# cd memcache-2.2.5↑&lt;br /&gt;PECL::memcacheパッケージコンパイル †&lt;br /&gt;phpizeを使ってPECL::memcacheのパッケージをコンパイル&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# /usr/local/php/bin/phpize &amp;&amp; ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config &amp;&amp; makememcacheのモジュールをphpのモジュールにコピーします。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# cp modules/memcache.so /usr/lib/php/modules/↑&lt;br /&gt;PHP設定 †&lt;br /&gt;php.iniに次の設定を行う。&lt;br /&gt;※phpがrpmもしくyumインストールの場合は&lt;br /&gt;　memcached.iniを追加して設定を書きこみます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# vi /etc/php.d/memcached.ini■設定内容&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[memcache]&lt;br /&gt;extension=memcache.so&lt;br /&gt;memcache.allow_failover = 1&lt;br /&gt;memcache.max_failover_attempts=20&lt;br /&gt;memcache.chunk_size =8192&lt;br /&gt;memcache.default_port = 11211&lt;br /&gt;session.save_handler = memcache&lt;br /&gt;session.save_path = tcp://127.0.0.1:11211&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;↑&lt;br /&gt;memcachedセットアップ †&lt;br /&gt;↑&lt;br /&gt;memcachedセットアップ[peclパッケージ編] †&lt;br /&gt;↑&lt;br /&gt;memcached実行ユーザー作成 †&lt;br /&gt;memcached用のアカウント「memcached」を作成する&lt;br /&gt;# sudo groupadd memcached&lt;br /&gt;# sudo useradd -g memcached -s /sbin/nologin -d /nonexistent memcached↑&lt;br /&gt;memcachedインストール †&lt;br /&gt;memcachedのパッケージをダウンロードする&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# cd /usr/local/src&lt;br /&gt;# wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz&lt;br /&gt;# tar zxvf memcached-1.4.5.tar.gz&lt;br /&gt;# cd memcached-1.4.5↑&lt;br /&gt;memcachedコンパイル †&lt;br /&gt;コンパイルします。&lt;br /&gt;&lt;br /&gt;# ./configure&lt;br /&gt;# make&lt;br /&gt;# make install※パッケージがない場合はyumでインストール&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# yum install -y libevent-devel.i386↑&lt;br /&gt;memcached動作確認 †&lt;br /&gt;# memcached -d -m 64 -p 11211 -l 127.0.0.1 -u memcached↑&lt;br /&gt;memcachedの設定確認 †&lt;br /&gt;/etc/init.dにスクリプトを書く&lt;br /&gt;&lt;br /&gt;# vi /etc/init.d/memcached#!/bin/bash&lt;br /&gt;#&lt;br /&gt;# memcached&lt;br /&gt;#&lt;br /&gt;# chkconfig: - 55 45&lt;br /&gt;# description:  The memcached daemon is a network memory cache service.&lt;br /&gt;# processname: memcached&lt;br /&gt;# config: /etc/sysconfig/memcached&lt;br /&gt;&lt;br /&gt;# Source function library.&lt;br /&gt;. /etc/rc.d/init.d/functions&lt;br /&gt;&lt;br /&gt;#Config&lt;br /&gt;TARGET=memcached&lt;br /&gt;DSN_BIN=/usr/local/bin/${TARGET}&lt;br /&gt;&lt;br /&gt;PORT=11211&lt;br /&gt;USER=memcached&lt;br /&gt;MAXCONN=1024&lt;br /&gt;CACHESIZE=768&lt;br /&gt;OPTIONS="-l 127.0.0.1"&lt;br /&gt;&lt;br /&gt;if [ -f /etc/sysconfig/memcached ]; then&lt;br /&gt;        . /etc/sysconfig/memcached&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;start()&lt;br /&gt;{&lt;br /&gt;  echo -n "Starting ${TARGET}: "&lt;br /&gt;  daemon ${DSN_BIN} -d -p ${PORT} -u ${USER} -m ${CACHESIZE} ${OPTIONS}&lt;br /&gt;  echo&lt;br /&gt;  touch /var/lock/subsys/memcached&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;stop()&lt;br /&gt;{&lt;br /&gt;  echo -n "Shutting down ${TARGET}: "&lt;br /&gt;  killproc ${DSN_BIN}&lt;br /&gt;  echo&lt;br /&gt;  rm -f /var/lock/subsys/memcached&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;  start)&lt;br /&gt;    start&lt;br /&gt;    ;;&lt;br /&gt;  stop)&lt;br /&gt;    stop&lt;br /&gt;    ;;&lt;br /&gt;  status)&lt;br /&gt;    status ${TARGET}&lt;br /&gt;    ;;&lt;br /&gt;  restart|reload)&lt;br /&gt;    stop&lt;br /&gt;    start&lt;br /&gt;    ;;&lt;br /&gt;  *)&lt;br /&gt;    echo "Usage: `basename $0` {start|stop|status|reload|restart}" &gt;&amp;2&lt;br /&gt;    exit 1&lt;br /&gt;esac&lt;br /&gt;exit 0&lt;br /&gt;権限を変更する&lt;br /&gt;&lt;br /&gt;# chmod 777 /etc/init.d/memcached↑&lt;br /&gt;自動起動設定 †&lt;br /&gt;# chkconfig --add memcached&lt;br /&gt;# chkconfig memcached on&lt;br /&gt;# chkconfig --list memcached↑&lt;br /&gt;サービスの起動 †&lt;br /&gt;/etc/init.d/memcached restart↑&lt;br /&gt;memcachedインストール[yum編] †&lt;br /&gt;↑&lt;br /&gt;yumのリポジトリ更新 †&lt;br /&gt;標準ではmemcachedが追加されていないのでのリポジトリを更新する。&lt;br /&gt;&lt;br /&gt;# cd /usr/local/src&lt;br /&gt;# wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm&lt;br /&gt;# rpm -Uhv rpmforge-release-0.3.6-1.el5.rf.i386.rpmこれでリポジトリにmemcachedが追加される&lt;br /&gt;&lt;br /&gt;↑&lt;br /&gt;memcachedのインストール †&lt;br /&gt;yumで必要なパッケージをインストール&lt;br /&gt;&lt;br /&gt;# yum -y install libevent memcached php-pecl-memcache zlib-devel re2cmemcachedの設定は/etc/sysconfig/memcachedを編集する。動かすだけならデフォルトのままでOK。&lt;br /&gt;&lt;br /&gt;↑&lt;br /&gt;memcachedの起動 †&lt;br /&gt;/etc/init.d/memcached startサービスを自動起動にしておく。&lt;br /&gt;&lt;br /&gt;chkconfig memcached on↑&lt;br /&gt;[資料]セッションセーブハンドラに登録 †&lt;br /&gt;↑&lt;br /&gt;php.iniの場合 †&lt;br /&gt;session.save_handler = memcache&lt;br /&gt;session.save_path = tcp://127.0.0.1:11211↑&lt;br /&gt;.htaccessの場合 †&lt;br /&gt;php_value session.save_handler "memcache"&lt;br /&gt;php_value session.save_path  "tcp://127.0.0.1:11211"↑&lt;br /&gt;プログラムの場合 †&lt;br /&gt;ini_set("session.save_handler", "memcache");&lt;br /&gt;ini_set("session.save_path", "tcp://127.0.0.1:11211");&lt;br /&gt;&lt;br /&gt;다 설정 하였다면 ..&lt;br /&gt;&lt;br /&gt;telnet 127.0.0.1 11211 접속하여 &lt;br /&gt;stats &lt;-- 입력해 보라 &lt;br /&gt;응답이 있다면 아래 목록이 출력 될 것이다 .&lt;br /&gt;&lt;br /&gt;이하는 ssh의 까만 화면이라고 생각해자 &lt;br /&gt;&lt;br /&gt;# telnet 127.0.0.1 11211&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;Connected to localhost.localdomain (127.0.0.1).&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;stats&lt;br /&gt;STAT pid 22991&lt;br /&gt;STAT uptime 1612&lt;br /&gt;STAT time 1271830666&lt;br /&gt;STAT version 1.4.5&lt;br /&gt;STAT pointer_size 32&lt;br /&gt;STAT rusage_user 0.000999&lt;br /&gt;STAT rusage_system 0.008998&lt;br /&gt;STAT curr_connections 11&lt;br /&gt;STAT total_connections 16&lt;br /&gt;STAT connection_structures 13&lt;br /&gt;STAT cmd_get 4&lt;br /&gt;STAT cmd_set 4&lt;br /&gt;STAT cmd_flush 0&lt;br /&gt;STAT get_hits 3&lt;br /&gt;STAT get_misses 1&lt;br /&gt;STAT delete_misses 0&lt;br /&gt;STAT delete_hits 0&lt;br /&gt;STAT incr_misses 0&lt;br /&gt;STAT incr_hits 0&lt;br /&gt;STAT decr_misses 0&lt;br /&gt;STAT decr_hits 0&lt;br /&gt;STAT cas_misses 0&lt;br /&gt;STAT cas_hits 0&lt;br /&gt;STAT cas_badval 0&lt;br /&gt;STAT auth_cmds 0&lt;br /&gt;STAT auth_errors 0&lt;br /&gt;STAT bytes_read 3080&lt;br /&gt;STAT bytes_written 2975&lt;br /&gt;STAT limit_maxbytes 67108864&lt;br /&gt;STAT accepting_conns 1&lt;br /&gt;STAT listen_disabled_num 0&lt;br /&gt;STAT threads 4&lt;br /&gt;STAT conn_yields 0&lt;br /&gt;STAT bytes 744&lt;br /&gt;STAT curr_items 1&lt;br /&gt;STAT total_items 4&lt;br /&gt;STAT evictions 0&lt;br /&gt;STAT reclaimed 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;봤으면 quit !!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-5363843627611768463?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/5363843627611768463/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/04/memcached-by-vins.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5363843627611768463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5363843627611768463'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/04/memcached-by-vins.html' title='Memcached 설치 및 설정하고 테스트 하기 by Vins'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-1067321032630804444</id><published>2010-04-20T00:19:00.000-07:00</published><updated>2010-04-20T00:24:03.548-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='memcache'/><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><title type='text'>Memcached 설치 및 설정하기 그리고 주의 사항</title><content type='html'>Memcached 는 데이터를 메모리에 저장하며 분산처리가 가능하고 매우 빠른 성능을 지닌 캐시 입니다. &lt;br /&gt;&lt;br /&gt;- libevent 설치&lt;br /&gt;Memcached 는 libevent 를 필요로 하므로 먼저 설치를 진행하겠습니다.&lt;br /&gt;&lt;br /&gt;http://monkey.org/~provos/libevent/&lt;br /&gt;&lt;br /&gt;[root@yongobk ~]# cd /usr/local/src&lt;br /&gt;[root@yongobk ~]# wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz&lt;br /&gt;[root@yongobk ~]# tar xzvf libevent-1.4.13-stable.tar.gz&lt;br /&gt;[root@yongobk ~]# cd libevent-1.4.13-stable&lt;br /&gt;[root@yongobk ~]# ./configure&lt;br /&gt;[root@yongobk ~]#  make ; make install&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Memcached 설치&lt;br /&gt;아래 주소에서 최신버전을 다운로드 하고 설치를 진행합니다.&lt;br /&gt;&lt;br /&gt;http://code.google.com/p/memcached/downloads/list&lt;br /&gt;&lt;br /&gt;[root@yongobk ~]# cd /usr/local/src&lt;br /&gt;[root@yongbok ~]# wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz &lt;br /&gt;[root@yongbok ~]# tar xzvf memcached-1.4.4.tar.gz &lt;br /&gt;[root@yongbok ~]# cd memcached-1.4.4&lt;br /&gt;[root@yongbok ~]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local&lt;br /&gt;[root@yongbok ~]# make ; make install&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Memcached 실행&lt;br /&gt;&lt;br /&gt;[root@yongbok ~]# /usr/local/memcached/bin/memcached -u nobody &amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Memcached PHP Extension 설치&lt;br /&gt;&lt;br /&gt;http://pecl.php.net/package/memcache&lt;br /&gt;&lt;br /&gt;[root@yongobk ~]# cd /usr/local/src&lt;br /&gt;[root@yongbok ~]# wget http://pecl.php.net/get/memcache-2.2.5.tgz&lt;br /&gt;[root@yongbok ~]# tar xzvf memcache-2.2.5.tgz&lt;br /&gt;[root@yongbok ~]# cd memcache-2.2.5&lt;br /&gt;[root@yongbok ~]# /usr/local/php5/bin/phpize&lt;br /&gt;[root@yongbok ~]# ./configure --with-php-config=/etc/php/bin/php-config&lt;br /&gt;[root@yongbok ~]# make ; make install&lt;br /&gt;&lt;br /&gt;Installing shared extensions:     /usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;php.ini 파일에 아래 내용 추가 합니다.&lt;br /&gt;&lt;br /&gt;[root@yongbok ~]# vi /usr/local/apache2/conf/php.ini&lt;br /&gt;&lt;br /&gt;[memcache]&lt;br /&gt;extension_dir=/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/&lt;br /&gt;extension=memcache.so&lt;br /&gt;memcache.allow_failover=1&lt;br /&gt;memcache.max_failover_attempts=100&lt;br /&gt;memcache.chunk_size=32768&lt;br /&gt;memcache.default_port=11211&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- Apache 재시작&lt;br /&gt;&lt;br /&gt;[root@yongbok ~]# /usr/local/apache2/bin/apachectl restart&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- PHP 에 Memcached 가 적용 되어 있는지 확인&lt;br /&gt;&lt;br /&gt;[root@yongbok ~]# echo '&lt;?php phpinfo(); ?&gt;' &gt; /var/www/phpinfo.php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;참고&lt;br /&gt;http://www.ibm.com/developerworks/kr/library/os-php-fastapps3/&lt;br /&gt;&lt;br /&gt;[세션을 메모리캐싱을 사용할 경우 주의 사항 ]&lt;br /&gt;memcache를 사용하는 중 세션 정보가 유지되지 않아 그것을 해결하는데&lt;br /&gt;많은 시간을 소비하였습니다. 저의 경우 모델자체를 세션에 저장하였었는데 그것의 데이터가 많아지면 저절로 기존 데이터가 사라지는 것이었습니다. 그래서 필요한 데이터만 저장하니까 그러한 문제는 발생되지 않았습니다&lt;br /&gt;&lt;br /&gt;memcached + Session Database&lt;br /&gt;- memcached의 원래 목적이 데이터베이스나 파일 데이터를 캐시하는 것임&lt;br /&gt;&lt;br /&gt;- 세션 데이터를 데이터베이스로 만들어 넣고, session handler 부분에서 memcached를 호출하게 만들면 될 듯.&lt;br /&gt;&lt;br /&gt;- 데이터베이스를 사용하는 안정성 + 세션 공유 문제 해결 + memcached에 의한 성능 향상까지 기대할 수 있지 않을까?&lt;br /&gt;&lt;br /&gt;- 이 부분은, 좀더 생각해보면서, 방법을 찾아봐야 할 듯...&lt;br /&gt;&lt;- 곰곰히 생각해보니, 약간 부정적. 세션 데이터는 read보다는 update가 압도적으로 많음. 따라서, 캐시 효과는 작음.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Memcache &amp; MySQL PHP Session Handler PHP code for session db + memcached &lt;br /&gt;http://www.softwareprojects.com/resources/programming/t-php-sessionsave_handler-and-database-sessions-debu-1797.html &lt;br /&gt;http://www.softwareprojects.com/resources/programming/t-memcached-for-php-sessions-1654.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-1067321032630804444?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/1067321032630804444/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/04/memcached.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1067321032630804444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1067321032630804444'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/04/memcached.html' title='Memcached 설치 및 설정하기 그리고 주의 사항'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-7063200029765392538</id><published>2010-03-15T00:32:00.000-07:00</published><updated>2010-03-15T00:51:37.121-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LAMP'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='APACHE'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSSL'/><category scheme='http://www.blogger.com/atom/ns#' term='modssl'/><title type='text'>OpenSSL + Apache 2.0.X (RPM설치시 예제)</title><content type='html'>&lt;h4&gt;■mod_sslインストール&lt;/H4&gt;&lt;table border="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;&lt;table border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;font color="white"&gt;&lt;pre&gt;[root@centos ~]# yum -y install mod_ssl&lt;span class="explain-font"&gt;　←　mod_sslインストール&lt;/SPAN&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;h4&gt;■WebサーバーSSL設定&lt;/H4&gt;&lt;table border="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;（１）サーバー用秘密鍵・証明書作成 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;table border="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;&lt;table border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;font color="white"&gt;&lt;pre&gt;[root@centos ~]# cd /etc/pki/tls/certs/&lt;font color="#00ff00"&gt;　←　ディレクトリ移動&lt;/FONT&gt;&lt;span style="COLOR: red; FONT-WEIGHT: bold"&gt;※CentOS5の場合&lt;/SPAN&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# cd /usr/share/ssl/certs&lt;font color="#00ff00"&gt;　←　ディレクトリ移動&lt;/FONT&gt;&lt;span style="COLOR: red; FONT-WEIGHT: bold"&gt;※CentOS4の場合&lt;/SPAN&gt;&lt;br /&gt;&lt;br /&gt;[root@centos certs]# sed -i 's/365/3650/g' Makefile&lt;font color="#00ff00"&gt;　←　サーバー用証明書有効期限を1年から10年に変更&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos certs]# make server.crt&lt;font color="#00ff00"&gt;　←　サーバー用秘密鍵・証明書作成&lt;/FONT&gt;&lt;br /&gt;umask 77 ; \&lt;br /&gt;        /usr/bin/openssl genrsa -des3 1024 &amp;gt; server.key&lt;br /&gt;Generating RSA private key, 1024 bit long modulus&lt;br /&gt;.................++++++&lt;br /&gt;............++++++&lt;br /&gt;e is 65537 (0x10001)&lt;br /&gt;Enter pass phrase:&lt;font color="#00ff00"&gt;　←　任意のパスワードを応答※表示はされない&lt;/FONT&gt;&lt;br /&gt;Verifying - Enter pass phrase:&lt;font color="#00ff00"&gt;　←　任意のパスワードを応答(確認)※表示はされない&lt;/FONT&gt;&lt;br /&gt;umask 77 ; \&lt;br /&gt;        /usr/bin/openssl req -utf8 -new -key server.key -x509 -days 3650 -out server.crt -set_serial 0&lt;br /&gt;Enter pass phrase for server.key:&lt;font color="#00ff00"&gt;　←　上記で応答したパスワードを応答※表示はされない&lt;/FONT&gt;&lt;br /&gt;You are about to be asked to enter information that will be incorporated&lt;br /&gt;into your certificate request.&lt;br /&gt;What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;There are quite a few fields but you can leave some blank&lt;br /&gt;For some fields there will be a default value,&lt;br /&gt;If you enter '.', the field will be left blank.&lt;br /&gt;-----&lt;br /&gt;Country Name (2 letter code) [GB]:&lt;font color="#00ff00"&gt;JP　←　国名応答&lt;/FONT&gt;&lt;br /&gt;State or Province Name (full name) [Berkshire]:&lt;font color="#00ff00"&gt;Kanagawa　←　都道府県名応答&lt;/FONT&gt;&lt;br /&gt;Locality Name (eg, city) [Newbury]:&lt;font color="#00ff00"&gt;Kawasaki　←　市区町村名応答&lt;/FONT&gt;&lt;br /&gt;Organization Name (eg, company) [My Company Ltd]:&lt;font color="#00ff00"&gt;centossrv.com　←　サイト名応答(なんでもいい)&lt;/FONT&gt;&lt;br /&gt;Organizational Unit Name (eg, section) []:&lt;font color="#00ff00"&gt;　←　空ENTER&lt;/FONT&gt;&lt;br /&gt;Common Name (eg, your name or your server's hostname) []:&lt;font color="#00ff00"&gt;centossrv.com　←　Webサーバー名応答&lt;/FONT&gt;&lt;br /&gt;Email Address []:&lt;font color="#00ff00"&gt;webmaster@centossrv.com　←　管理者メールアドレス応答&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos certs]# openssl rsa -in server.key -out server.key&lt;font color="#00ff00"&gt;　←　サーバー用秘密鍵からパスワード削除&lt;/FONT&gt;&lt;br /&gt;Enter pass phrase for server.key:&lt;font color="#00ff00"&gt;　←　サーバー用秘密鍵・証明書作成時のパスワード応答※表示はされない&lt;/FONT&gt;&lt;br /&gt;writing RSA key&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;table border="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;span style="COLOR: red; FONT-WEIGHT: bold"&gt;※パスワードを削除するのは、Webサーバー起動時にパスワードを要求されないようにするため&lt;/SPAN&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;table border="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;（２）SSL設定 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;table border="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;&lt;table border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;font color="white"&gt;&lt;pre&gt;[root@centos certs]# vi /etc/httpd/conf.d/ssl.conf&lt;font color="#00ff00"&gt;　←　ApacheSSL設定ファイル編集&lt;/FONT&gt;&lt;br /&gt;&lt;span style="COLOR: red; FONT-WEIGHT: bold"&gt;※CentOS5の場合&lt;/SPAN&gt;&lt;br /&gt;SSLCertificateFile /etc/pki/tls/certs/server.crt&lt;font color="#00ff00"&gt;　←　サーバー用証明書を指定&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;SSLCertificateKeyFile /etc/pki/tls/certs/server.key&lt;font color="#00ff00"&gt;　←　サーバー用秘密鍵を指定&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: red; FONT-WEIGHT: bold"&gt;※CentOS4の場合&lt;/SPAN&gt;&lt;br /&gt;SSLCertificateFile /usr/share/ssl/certs/server.crt&lt;font color="#00ff00"&gt;　←　サーバー用証明書を指定&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;SSLCertificateKeyFile /usr/share/ssl/certs/server.key&lt;font color="#00ff00"&gt;　←　サーバー用秘密鍵を指定&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;#  General setup for the virtual host, inherited from global configuration&lt;br /&gt;&lt;font color="#00ff00"&gt;#&lt;/FONT&gt;DocumentRoot "/var/www/html"&lt;font color="#00ff00"&gt;　←　#を削除(コメント解除)&lt;/FONT&gt;&lt;br /&gt;↓&lt;br /&gt;DocumentRoot "/var/www/html"&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;h4&gt;■Apache設定反映&lt;/H4&gt;&lt;table border="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;（１）Apache設定反映 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;table border="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;&lt;table border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;font color="white"&gt;&lt;pre&gt;[root@centos certs]# /etc/rc.d/init.d/httpd restart&lt;font color="#00ff00"&gt;　←　Apache再起動&lt;/FONT&gt;&lt;br /&gt;httpd を停止中:                                            [  OK  ]&lt;br /&gt;httpd を起動中:                                            [  OK  ]&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;table border="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;br /&gt;（２）ポート443番のOPEN&lt;br /&gt;ルーター側の設定でポート443番をOPENする。&lt;br /&gt;&lt;span style="COLOR: red; FONT-WEIGHT: bold"&gt;※ルーターの設定は各ルーターのマニュアルまたは&lt;a href="http://27bit.com/router.html" target=_blank&gt;メーカー別ルーターポート開放手順&lt;/A&gt;を参照&lt;/SPAN&gt;&lt;br /&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;아파치 소스 설치의 경우가 더 많을 걸로 예상되어서 잠시 정리하면 ...&lt;br /&gt;&lt;br /&gt;1. /usr/local/apache2/conf/httpd.conf 에서 httpd-ssl.conf 찾아서&lt;br /&gt;   include를 해제해 준다&lt;br /&gt;   약 400~450 사이쯤에 아래와 같은 부분이 있다&lt;br /&gt;# Secure (SSL/TLS) connections&lt;br /&gt;# Include conf/extra/httpd-ssl.conf&lt;br /&gt;   ※ 위 # 삭제 아래와 같이&lt;br /&gt;Include conf/extra/httpd-ssl.conf&lt;br /&gt;&lt;br /&gt;2. vi /usr/local/apache2/conf/extra/httpd-ssl.conf  (파일 열고)&lt;br /&gt;&lt;br /&gt;3. 76째 줄부터 몇가지 설정을 해 준다 &lt;br /&gt;#   General setup for the virtual host&lt;br /&gt;DocumentRoot "/html/webroot"                  &lt;-- 알맞게 변경&lt;br /&gt;DirectoryIndex index.php index.html index.htm &lt;-- 이 부분 추가&lt;br /&gt;ServerName www.thenamed.net:443               &lt;-- 해당 도메인으로 변경 &lt;br /&gt;ServerAdmin xxxx@xxxx.jp                      &lt;-- 알맞게 변경&lt;br /&gt;ErrorLog "/usr/local/apache2/logs/error_log"&lt;br /&gt;TransferLog "/usr/local/apache2/logs/access_log"&lt;br /&gt;&lt;br /&gt;4. 약 100번째 줄에서 부터 두가지 변경 &lt;br /&gt;SSLCertificateFile "/usr/local/apache2/conf/server-dsa.crt"&lt;br /&gt;위를 아래와 깉이 변경&lt;br /&gt;SSLCertificateFile "/usr/local/ssl/www.thenamed.net.crt"&lt;br /&gt;&lt;br /&gt;5. 약 110번째 줄에서 부터 &lt;br /&gt;SSLCertificateKeyFile "/usr/local/apache2/conf/server-dsa.key"&lt;br /&gt;아래 처럼 변경&lt;br /&gt;SSLCertificateKeyFile "/usr/local/ssl/www.thenamed.net.key"&lt;br /&gt;&lt;br /&gt;즉 인증서(crt)과 키(key)파일을 저장한 위치를 설정해 주면 된다.&lt;br /&gt;&lt;br /&gt;마지막으로 /usr/local/apache2/bin/apachectl restart&lt;br /&gt;&lt;br /&gt;https://www.example.com 자기도메인으로 접속해 보면 정상적으로 보여야 한다 &lt;br /&gt;하지만 OpenSSL 이기 때문에 인증되자 않은 사용자라고 경고메세지가 뜨는데 &lt;br /&gt;이는 원도우계열이라면 MS에 인증서 비용을 제출해야 MS에서 경고메세지가 &lt;br /&gt;안 뜨도록 인증된 사용자라고 등록해 준다 ..&lt;br /&gt;&lt;br /&gt;녹색방퍠와 빨간방패가 뜬다면 빨간 방패를 눌러 사이트에 접속하도록 하자..&lt;br /&gt;&lt;br /&gt;TIP. VeriSign과 같은 등록대행 업체를 이용한다면 &lt;br /&gt;     중계인증자까지 등록 해야 한다 &lt;br /&gt;     SSLCACertificateFile 부분을 찾아 경로에 맞게 세팅한다.&lt;br /&gt;    확장자는 .ca.crt이다&lt;br /&gt;SSLCACertificateFile /usr/local/ssl/www.verisign.net.ca.crt&lt;br /&gt;(SSLCACertificateFile는 주석 처리 되어 있으니 경로에 맞게 세팅)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-7063200029765392538?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/7063200029765392538/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/openssl-apache-20x-rpm.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/7063200029765392538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/7063200029765392538'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/openssl-apache-20x-rpm.html' title='OpenSSL + Apache 2.0.X (RPM설치시 예제)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-5972245154620765666</id><published>2010-03-12T09:18:00.000-08:00</published><updated>2010-03-12T09:18:07.581-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='sendmail'/><title type='text'>メールサーバー構築(sendmail+Dovecot)</title><content type='html'>&lt;DIV align="right"&gt;&amp;nbsp;&lt;/DIV&gt;&lt;H1&gt;メールサーバー構築(sendmail+Dovecot)&lt;BR&gt;&lt;BR&gt;&lt;FONT size="3"&gt;最終更新日： 2009.12.29 &lt;/FONT&gt;&lt;BR&gt;&lt;/H1&gt;&lt;H4&gt;■概要&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;メールサーバーを構築する場合、送信メールサーバー(SMTPサーバー)と受信メールサーバー(POP/IMAPサーバー)の構築が必要となる。&lt;BR&gt;ここでは、送信メールサーバーにはデフォルトでインストールされている&lt;A href="http://www.sendmail.org/jp/" target=_blank&gt;sendmail&lt;/A&gt;、受信メールサーバーには&lt;A href="http://dovecot.org/" target=_blank&gt;Dovecot&lt;/A&gt;を採用する。&lt;BR&gt;&lt;BR&gt;なお、sendmailは迷惑メールの不正中継に利用されないようにするため、デフォルトでは外部から外部宛(例えば、会社等で自宅サーバーのメールアドレスからプロバイダのメールアドレス宛)に送信できないようになっているが、迷惑メールの不正中継に利用されずに外部から外部宛に送信できるようにするため、SMTP-Auth機能※をもたせる。&lt;BR&gt;また、DovecotはPOP/IMAPサーバーとして構築し、ユーザがPOPまたはIMAPを選択できるようにする。&lt;A href="http://home.impress.co.jp/magazine/dosvpr/q-a/9805/qa9805-3.htm" target=_blank&gt;※POPとIMAPの違い&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="COLOR: red; FONT-WEIGHT: bold"&gt;※SMTP-Auth機能とは、メール送信時にユーザ名とパスワードで認証を行なう機能であり、これにより、迷惑メールの不正中継に利用されないようにする。&lt;/SPAN&gt;&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■sendmail設定&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;（１）sendmail-cfインストール&lt;BR&gt;sendmail.mcからsendmail設定ファイル(sendmail.cf)を作成するのに必要なsendmail-cfをインストールする。&lt;BR&gt;&lt;SPAN style="COLOR: red; FONT-WEIGHT: bold"&gt;※sendmail設定ファイル(sendmail.cf)は難解なため、sendmail.mcを編集してsendmail.cfに変換するのが一般的である&lt;/SPAN&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# yum -y install sendmail-cf&lt;FONT color="#00ff00"&gt;　←　sendmail-cfインストール&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;（２）sendmail設定 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# vi /etc/mail/sendmail.mc&lt;FONT color="#00ff00"&gt;　←　sendmail.mc編集&lt;/FONT&gt;&lt;br /&gt;DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl&lt;br /&gt;↓&lt;br /&gt;DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl&lt;FONT color="#00ff00"&gt;　←　変更(外部からの受信を許可)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;dnl MASQUERADE_AS(`mydomain.com')dnl&lt;br /&gt;MASQUERADE_AS(`centossrv.com')dnl&lt;SPAN class="explain-font"&gt;　←　追加(送信元アドレスの@以降をドメイン名にする)&lt;/SPAN&gt;&lt;br /&gt;&lt;br /&gt;dnl FEATURE(masquerade_envelope)dnl&lt;br /&gt;FEATURE(masquerade_envelope)dnl&lt;SPAN class="explain-font"&gt;　←　追加(エンベロープFromも書き替える)&lt;/SPAN&gt;&lt;br /&gt;&lt;br /&gt;EXPOSED_USER(`root')dnl&lt;br /&gt;↓&lt;br /&gt;dnl EXPOSED_USER(`root')dnl&lt;SPAN class="explain-font"&gt;　←　変更(送信元がrootの場合も書き替える)&lt;/SPAN&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color="#00ff00"&gt;dnl &lt;/FONT&gt;TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl&lt;br /&gt;&lt;FONT color="#00ff00"&gt;dnl &lt;/FONT&gt;define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')&lt;br /&gt;↓&lt;br /&gt;TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl&lt;FONT color="#00ff00"&gt;　←　行頭のdnlを削除(SMTP-Auth有効化)&lt;/FONT&gt;&lt;br /&gt;define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')&lt;FONT color="#00ff00"&gt;　←　行頭のdnlを削除(SMTP-Auth有効化)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;define(`confMAX_MESSAGE_SIZE',`10485760')&lt;FONT color="#00ff00"&gt;　←　最終行へ追加(受信メールサイズを10MB=10*1024*1024に制限)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT color="#00ff00"&gt;以下を最終行へ追加(メールサーバー名&amp;amp;バージョン情報の隠蔽)&lt;/FONT&gt;&lt;br /&gt;define(`confSMTP_LOGIN_MSG',`unknown')dnl&lt;br /&gt;define(`confRECEIVED_HEADER',`$?sfrom $s $.$?_($?s$|from $.$_)&lt;br /&gt;        $.$?{auth_type}(authenticated)&lt;br /&gt;        $.by $j (unknown)$?r with $r$. id $i$?u&lt;br /&gt;        for $u; $|;&lt;br /&gt;        $.$b')dnl&lt;br /&gt;&lt;br /&gt;[root@centos ~]# m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc &amp;gt; /etc/mail/sendmail.cf&lt;FONT color="#00ff00"&gt;　←　sendmail.mcよりsendmail.cf作成&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# echo `hostname -d` &amp;gt;&amp;gt; /etc/mail/local-host-names&lt;FONT color="#00ff00"&gt;　←　xxxx@centossrv.comでメールを受信できるようにする&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;（３）SMTP-Auth設定&lt;BR&gt;SMTP-Auth用ユーザ名、パスワードにシステムのユーザ名、パスワードを使用する場合&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# /etc/rc.d/init.d/saslauthd start&lt;FONT color="#00ff33"&gt;　←　saslauthd起動&lt;/FONT&gt;&lt;br /&gt;saslauthd を起動中:                                        [  OK  ]&lt;br /&gt;&lt;br /&gt;[root@centos ~]# chkconfig saslauthd on&lt;FONT color="#00ff33"&gt;　←　saslauthd自動起動設定&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# chkconfig --list saslauthd&lt;FONT color="#00ff33"&gt;　←　saslauthd自動起動設定確認&lt;/FONT&gt;&lt;br /&gt;saslauthd       0:off   1:off   2:on    3:on    4:on    5:on    6:off&lt;FONT color="#00ff33"&gt;　←　ランレベル2～5のonを確認&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;SMTP-Auth用ユーザ名、パスワードとシステムのユーザ名、パスワードを別々にする場合&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# vi /usr/lib/sasl2/Sendmail.conf&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth認証設定ファイル編集&lt;/FONT&gt;&lt;br /&gt;pwcheck_method:saslauthd&lt;br /&gt;↓&lt;br /&gt;pwcheck_method:auxprop&lt;FONT color="#00ff00"&gt;　←　変更&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;（４）Maildir形式メールボックス作成&lt;BR&gt;sendmailのメール格納形式は共有ディレクトリ形式（｢/var/spool/mail/ユーザ名｣というファイルに全てのメールが蓄積されていく形式）だが、アクセス性能改善及びセキュリティ強化の観点からMaildir形式へ移行する。&lt;BR&gt;&lt;BR&gt;【既存ユーザ対処】&lt;BR&gt;既存ユーザのホームディレクトリにMaildir形式のメールボックスを作成して、蓄積済のメールデータを当該メールボックスへ移行する⇒&lt;A href="http://centossrv.com/migrate_to_maildir.shtml"&gt;メールデータ移行&lt;/A&gt;を参照&lt;BR&gt;&lt;BR&gt;【新規ユーザ対処】&lt;BR&gt;新規ユーザ追加時に自動でホームディレクトリにMaildir形式のメールボックスが作成されるようにする&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# mkdir -p /etc/skel/Maildir/new&lt;FONT color="#00ff00"&gt;　←　新規ユーザ追加時に自動でMaildir形式メールボックス作成(1/4)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# mkdir -p /etc/skel/Maildir/cur&lt;FONT color="#00ff00"&gt;　←　新規ユーザ追加時に自動でMaildir形式メールボックス作成(2/4)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# mkdir -p /etc/skel/Maildir/tmp&lt;FONT color="#00ff00"&gt;　←　新規ユーザ追加時に自動でMaildir形式メールボックス作成(3/4)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# chmod -R 700 /etc/skel/Maildir/&lt;FONT color="#00ff00"&gt;　←　新規ユーザ追加時に自動でMaildir形式メールボックス作成(4/4)&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;（５）Maildir形式メールボックス対応&lt;BR&gt;sendmailはMaildir形式メールボックスに対応していないため、ProcmailでMaildir形式メールボックスへ配送するようにする。 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# vi /etc/procmailrc&lt;FONT color="#00ff33"&gt;　←　procmail設定ファイル作成&lt;/FONT&gt;&lt;br /&gt;SHELL=/bin/bash&lt;br /&gt;PATH=/usr/bin:/bin&lt;br /&gt;DROPPRIVS=yes&lt;br /&gt;MAILDIR=$HOME/Maildir&lt;br /&gt;DEFAULT=$MAILDIR/&lt;br /&gt;#LOGFILE=$MAILDIR/procmail.log # ログ出力先&lt;br /&gt;#VERBOSE=ON # 詳細ログ出力&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;（６）未承諾広告メールの削除&lt;BR&gt;&lt;A href="http://www.soumu.go.jp/s-news/2004/pdf/040416_2_b.pdf" target=_blank&gt;未承諾広告メール&lt;/A&gt;(件名に｢未承諾広告※｣と表示されているメール)は受信せずに削除するようにする。 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# vi /etc/procmailrc&lt;FONT color="#00ff33"&gt;　←　procmail設定ファイル編集&lt;/FONT&gt;&lt;br /&gt;&lt;FONT color="#00ff33"&gt;以下を追加&lt;/FONT&gt;&lt;br /&gt;# 未承諾広告メール削除&lt;SPAN style="COLOR: red; FONT-WEIGHT: bold"&gt;※システムの文字コードがUTF-8(デフォルト)の場合&lt;/SPAN&gt;&lt;br /&gt;:0&lt;br /&gt;* ^Subject:.*iso-2022-jp&lt;br /&gt;* ^Subject:\/.*&lt;br /&gt;* ? echo "$MATCH" | nkf -mwZ2 | sed 's/[[:space:]]//g' | egrep '未承諾広告※'&lt;br /&gt;/dev/null&lt;br /&gt;&lt;br /&gt;# 未承諾広告メール削除&lt;SPAN style="COLOR: red; FONT-WEIGHT: bold"&gt;※システムの文字コードがEUCの場合&lt;/SPAN&gt;&lt;br /&gt;:0&lt;br /&gt;* ^Subject:.*iso-2022-jp&lt;br /&gt;* ^Subject:\/.*&lt;br /&gt;* ? echo "$MATCH" | nkf -meZ2 | sed 's/[[:space:]]//g' | egrep '未承諾広告※'&lt;br /&gt;/dev/null&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■sendmail再起動&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;（１）sendmail再起動 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# /etc/rc.d/init.d/sendmail restart&lt;FONT color="#00ff33"&gt;　←　sendmail再起動&lt;/FONT&gt;&lt;br /&gt;sendmail を停止中:                                         [失敗]&lt;br /&gt;sendmailを起動中:                                          [  OK  ]&lt;br /&gt;sm-clientを起動中:                                         [  OK  ]&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;（２）ポート25番のOPEN&lt;BR&gt;ルーター側の設定でポート25番をOPENする。&lt;BR&gt;&lt;SPAN style="COLOR: red; FONT-WEIGHT: bold"&gt;※ルーターの設定は各ルーターのマニュアルまたは&lt;A href="http://27bit.com/router.html" target=_blank&gt;メーカー別ルーターポート開放手順&lt;/A&gt;を参照&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;A href="http://www.cman.jp/network/support/port.html" target=_blank&gt;ポートチェック【外部からポート開放確認】&lt;/A&gt;で｢host名｣にサーバー名(例:centossrv.com)、｢port番号｣に25と入力して｢ポートチェック｣ボタン押下し、｢ホスト＝centossrv.com　ポート＝25　にアクセスできました。｣と表示されることを確認。 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■OP25B対策&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="http://centossrv.com/op25b.shtml"&gt;OP25B(Outbound Port 25 Blocking)対策&lt;/A&gt;参照 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■Dovecotインストール&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# yum -y install dovecot&lt;FONT color="#00ff33"&gt;　←　Dovecotインストール&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■Dovecot設定&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# vi /etc/dovecot.conf&lt;FONT color="#00ff33"&gt;　←　Dovecot設定ファイル編集&lt;/FONT&gt;&lt;br /&gt;# Protocols we want to be serving:&lt;br /&gt;#  imap imaps pop3 pop3s&lt;br /&gt;#protocols = imap imaps&lt;br /&gt;protocols = imap imaps pop3 pop3s&lt;FONT color="#00ff33"&gt;　←　追加(POPアクセスを追加)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;# Default MAIL environment to use when it's not set. By leaving this empty&lt;br /&gt;# dovecot tries to do some automatic detection as described in&lt;br /&gt;# doc/mail-storages.txt. There's a few special variables you can use:&lt;br /&gt;#&lt;br /&gt;#   %u - username&lt;br /&gt;#   %n - user part in user@domain, same as %u if there's no domain&lt;br /&gt;#   %d - domain part in user@domain, empty if user there's no domain&lt;br /&gt;#   %h - home directory&lt;br /&gt;#&lt;br /&gt;# You can also limit a width of string by giving the number of max. characters&lt;br /&gt;# after the '%' character. For example %1u gives the first character of&lt;br /&gt;# username. Some examples:&lt;br /&gt;#&lt;br /&gt;#   default_mail_env = maildir:/var/mail/%1u/%u/Maildir&lt;br /&gt;#   default_mail_env = mbox:~/mail/:INBOX=/var/mail/%u&lt;br /&gt;#   default_mail_env = mbox:/var/mail/%d/%n/:INDEX=/var/indexes/%d/%n&lt;br /&gt;#&lt;br /&gt;#default_mail_env =&lt;br /&gt;default_mail_env = maildir:~/Maildir&lt;FONT color="#00ff33"&gt;　←　追加(メールボックス形式をMaildir形式とする)&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# ':' separated list of directories under which chrooting is allowed for mail&lt;br /&gt;# processes (ie. /var/mail will allow chrooting to /var/mail/foo/bar too).&lt;br /&gt;# This setting doesn't affect login_chroot or auth_chroot variables.&lt;br /&gt;# WARNING: Never add directories here which local users can modify, that&lt;br /&gt;# may lead to root exploit. Usually this should be done only if you don't&lt;br /&gt;# allow shell access for users. See doc/configuration.txt for more information.&lt;br /&gt;#valid_chroot_dirs =&lt;br /&gt;valid_chroot_dirs = /home&lt;FONT color="#00ff33"&gt;　←　追加※&lt;A href="http://centossrv.com/openssh.shtml"&gt;OpenSSHでChrootを設定している場合&lt;/A&gt;のみ&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■Dovecot起動&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;（１）Dovecot起動 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# /etc/rc.d/init.d/dovecot start&lt;FONT color="#00ff33"&gt;　←　Dovecot起動&lt;/FONT&gt;&lt;br /&gt;Dovecot Imapを起動中:                                      [  OK  ]&lt;br /&gt;&lt;br /&gt;[root@centos ~]# chkconfig dovecot on&lt;FONT color="#00ff33"&gt;　←　Dovecot自動起動設定&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# chkconfig --list dovecot&lt;FONT color="#00ff33"&gt;　←　Dovecot自動起動設定確認&lt;/FONT&gt;&lt;br /&gt;dovecot         0:off   1:off   2:on    3:on    4:on    5:on    6:off&lt;FONT color="#00ff33"&gt;　←　ランレベル2～5のonを確認&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;（２）ポート110番(POPの場合)または143番(IMAPの場合)のOPEN&lt;BR&gt;ルーター側の設定でポート110番(POPの場合)または143番(IMAPの場合)をOPENする。&lt;BR&gt;&lt;SPAN style="COLOR: red; FONT-WEIGHT: bold"&gt;※ルーターの設定は各ルーターのマニュアルまたは&lt;A href="http://27bit.com/router.html" target=_blank&gt;メーカー別ルーターポート開放手順&lt;/A&gt;を参照&lt;/SPAN&gt;&lt;BR&gt;&lt;BR&gt;&lt;A href="http://www.cman.jp/network/support/port.html" target=_blank&gt;ポートチェック【外部からポート開放確認】&lt;/A&gt;で｢host名｣にサーバー名(例:centossrv.com)、｢port番号｣に110(POPの場合)または143(IMAPの場合)と入力して｢ポートチェック｣ボタン押下し、｢ホスト＝centossrv.com　ポート＝110(POPの場合)または143(IMAPの場合)　にアクセスできました。｣と表示されることを確認。 &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■メールユーザ追加&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;（１）メールユーザ追加(SSHによるリモート接続はできないようにする場合)&lt;BR&gt;※例としてユーザ名をcentosとする &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# useradd -s /sbin/nologin centos&lt;FONT color="#00ff33"&gt;　←　ユーザ追加&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# passwd centos&lt;FONT color="#00ff33"&gt;　←　パスワード設定&lt;/FONT&gt;&lt;br /&gt;Changing password for user centos.&lt;br /&gt;New UNIX password: &lt;FONT color="#00ff33"&gt;　←　パスワード応答&lt;/FONT&gt;&lt;br /&gt;Retype new UNIX password: &lt;FONT color="#00ff33"&gt;　←　パスワード応答(確認)&lt;/FONT&gt;&lt;br /&gt;passwd: all authentication tokens updated successfully.&lt;br /&gt;&lt;br /&gt;&lt;FONT color="#00ff33"&gt;以下はSMTP-Auth用ユーザ名、パスワードとシステムのユーザ名、パスワードを別々にする場合のみ&lt;/FONT&gt;&lt;br /&gt;[root@centos ~]# echo "パスワード" | saslpasswd2 -p -u linux.centossrv.com -c centos&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth用ユーザ／パスワード登録&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# sasldblistusers2&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth用ユーザ名、パスワード確認&lt;/FONT&gt;&lt;br /&gt;centos@linux.centossrv.com: userPassword&lt;br /&gt;&lt;br /&gt;&lt;FONT color="red"&gt;※SMTP-Auth用ユーザ名、パスワードを削除する場合&lt;/FONT&gt;&lt;br /&gt;[root@centos ~]# saslpasswd2 -d centos -u linux.centossrv.com&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth用ユーザ名、パスワード削除&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;（２）メールユーザ追加(SSHによるリモート接続もできるようにする場合)&lt;BR&gt;※例としてユーザ名をcentosとする &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;[root@centos ~]# useradd centos&lt;FONT color="#00ff33"&gt;　←　ユーザ追加&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# passwd centos&lt;FONT color="#00ff33"&gt;　←　パスワード設定&lt;/FONT&gt;&lt;br /&gt;Changing password for user centos.&lt;br /&gt;New UNIX password: &lt;FONT color="#00ff33"&gt;　←　パスワード応答&lt;/FONT&gt;&lt;br /&gt;Retype new UNIX password: &lt;FONT color="#00ff33"&gt;　←　パスワード応答(確認)&lt;/FONT&gt;&lt;br /&gt;passwd: all authentication tokens updated successfully.&lt;br /&gt;&lt;br /&gt;&lt;FONT color="#00ff33"&gt;以下はSMTP-Auth用ユーザ名、パスワードとシステムのユーザ名、パスワードを別々にする場合のみ&lt;/FONT&gt;&lt;br /&gt;[root@centos ~]# echo "パスワード" | saslpasswd2 -p -u linux.centossrv.com -c centos&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth用ユーザ／パスワード登録&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# sasldblistusers2&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth用ユーザ名、パスワード確認&lt;/FONT&gt;&lt;br /&gt;centos@linux.centossrv.com: userPassword&lt;br /&gt;&lt;br /&gt;&lt;FONT color="red"&gt;※SMTP-Auth用ユーザ名、パスワードを削除する場合&lt;/FONT&gt;&lt;br /&gt;[root@centos ~]# saslpasswd2 -d centos -u linux.centossrv.com&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth用ユーザ名、パスワード削除&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;BR&gt;（３）既存ユーザをメールユーザとする場合&lt;BR&gt;※例としてユーザ名をcentosとする &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;br /&gt;&lt;TABLE border="1" cellSpacing="0" width="100%" bgColor=black&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;FONT color="white"&gt;&lt;PRE&gt;&lt;FONT color="#00ff33"&gt;以下はSMTP-Auth用ユーザ名、パスワードとシステムのユーザ名、パスワードを別々にする場合のみ&lt;/FONT&gt;&lt;br /&gt;[root@centos ~]# echo "パスワード" | saslpasswd2 -p -u linux.centossrv.com -c centos&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth用ユーザ／パスワード登録&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;[root@centos ~]# sasldblistusers2&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth用ユーザ名、パスワード確認&lt;/FONT&gt;&lt;br /&gt;centos@linux.centossrv.com: userPassword&lt;br /&gt;&lt;br /&gt;&lt;FONT color="red"&gt;※SMTP-Auth用ユーザ名、パスワードを削除する場合&lt;/FONT&gt;&lt;br /&gt;[root@centos ~]# saslpasswd2 -d centos -u linux.centossrv.com&lt;FONT color="#00ff33"&gt;　←　SMTP-Auth用ユーザ名、パスワード削除&lt;/FONT&gt;&lt;br /&gt;&lt;/PRE&gt;&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■メールソフト設定(受信メールサーバーをPOPにする場合)&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;自宅や会社等の複数拠点でメールを使用する場合で、メールボックスを同期しなくてもいい場合(例:会社で受信したメールは自宅で受信できなくてもいい場合)、受信メールサーバーにPOPを使用する。&lt;BR&gt;ここでは、メールソフトとしてOutlook Expressを使用する。&lt;BR&gt;&lt;BR&gt;Outlook Expressを起動し、メニューの｢ツール｣⇒｢アカウント｣⇒｢メール｣タブ⇒｢追加｣ボタン⇒｢メール｣としてメール設定を行う&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-01.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢表示名｣に送信者の名前(任意)を入力して｢次へ｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-02.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢電子メールアドレス｣に送信者のメールアドレス(例:centos@centossrv.com)を入力して｢次へ｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-03.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢受信メールサーバー｣にメールサーバー名(例:mail.centossrv.com)を入力&lt;BR&gt;｢送信メールサーバー｣にメールサーバー名(例:mail.centossrv.com)を入力して｢次へ｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-04.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢パスワード｣にパスワードを入力して｢次へ｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-05.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢完了｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-06.gif"&gt;&lt;BR&gt;&lt;BR&gt;追加したアカウントをダブルクリックしてプロパティを開く&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-07.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢サーバー｣タブの｢このサーバーは認証が必要｣をチェック&lt;BR&gt;SMTP-Auth用ユーザ名、パスワードとシステムのユーザ名、パスワードを別々にする場合のみ｢設定｣ボタンをクリックして次の設定を行う&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-08.gif"&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="COLOR: red; FONT-WEIGHT: bold"&gt;※SMTP-Auth用ユーザ名、パスワードとシステムのユーザ名、パスワードを別々にする場合のみ&lt;/SPAN&gt;&lt;BR&gt;｢次のアカウントとパスワードでログオンする｣をチェック&lt;BR&gt;｢アカウント名｣にSMTP-Auth用ユーザ名を入力&lt;BR&gt;｢パスワード｣にSMTP-Auth用パスワードを入力して｢OK｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-09.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢OK｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■メールソフト設定(受信メールサーバーをIMAPにする場合)&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;自宅や会社等の複数拠点でメールを使用する場合で、メールボックスを同期したい場合(例:会社で受信したメールを自宅でも受信したい場合)、受信メールサーバーにIMAPを使用する。&lt;BR&gt;ここでは、メールソフトとしてOutlook Expressを使用する。&lt;BR&gt;&lt;BR&gt;Outlook Expressを起動し、メニューの｢ツール｣⇒｢アカウント｣⇒｢メール｣タブ⇒｢追加｣ボタン⇒｢メール｣としてメール設定を行う&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-01.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢表示名｣に送信者の名前(任意)を入力して｢次へ｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-02.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢電子メールアドレス｣に送信者のメールアドレス(例:centos@centossrv.com)を入力して｢次へ｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-10.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢受信メールサーバーの種類｣で｢IMAP｣を選択&lt;BR&gt;｢受信メールサーバー｣にメールサーバー名(例:mail.centossrv.com)を入力&lt;BR&gt;｢送信メールサーバー｣にメールサーバー名(例:mail.centossrv.com)を入力して｢次へ｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-04.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢パスワード｣にパスワードを入力して｢次へ｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-05.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢完了｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-06.gif"&gt;&lt;BR&gt;&lt;BR&gt;追加したアカウントをダブルクリックしてプロパティを開く&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-14.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢サーバー｣タブの｢このサーバーは認証が必要｣をチェック&lt;BR&gt;SMTP-Auth用ユーザ名、パスワードとシステムのユーザ名、パスワードを別々にする場合のみ｢設定｣ボタンをクリックして次の設定を行う&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-08.gif"&gt;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="COLOR: red; FONT-WEIGHT: bold"&gt;※SMTP-Auth用ユーザ名、パスワードとシステムのユーザ名、パスワードを別々にする場合のみ&lt;/SPAN&gt;&lt;BR&gt;｢次のアカウントとパスワードでログオンする｣をチェック&lt;BR&gt;｢アカウント名｣にSMTP-Auth用ユーザ名を入力&lt;BR&gt;｢パスワード｣にSMTP-Auth用パスワードを入力して｢OK｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-11.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢IMAP｣タブの｢送信済みアイテムのパス｣に｢Sent｣と入力&lt;BR&gt;｢IMAP｣タブの｢下書きのパス｣に｢Drafts｣と入力して｢OK｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-12.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢はい｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;IMG src="http://centossrv.com/img/oe-13.gif"&gt;&lt;BR&gt;&lt;BR&gt;｢OK｣&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■メールサーバー確認&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;・内部で同一ユーザ同士でメールの送受信&lt;BR&gt;・内部で他ユーザ間でメールの送受信&lt;BR&gt;・内部で外部(プロバイダのメールアドレス等)との送受信&lt;BR&gt;・内部で携帯との送受信※&lt;BR&gt;・外部(会社等)で同一ユーザ同士でメールの送受信&lt;BR&gt;・外部(会社等)で他ユーザ間でメールの送受信&lt;BR&gt;・外部(会社等)で外部(プロバイダのメールアドレス等)との送受信&lt;BR&gt;・外部(会社等)で携帯との送受信※&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="COLOR: red; FONT-WEIGHT: bold"&gt;※携帯はドメイン指定受信等でメールサーバーからのメールが拒否されないようにしておくこと&lt;/SPAN&gt;&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;H4&gt;■メール不正中継拒否テスト&lt;/H4&gt;&lt;TABLE border="0" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;A href="http://www.rbl.jp/svcheck.php" target=_blank&gt;RBL.JP&lt;/A&gt;で｢ホスト名｣に自宅サーバーのホスト名(例:centossrv.com)を入力して｢Check｣ボタンを押下する。&lt;BR&gt;19種類のテストが行われ、ページ最後尾に&lt;FONT color="blue"&gt;&lt;B&gt;no relays accepted.&lt;/B&gt;&lt;/FONT&gt;と表示されればOK。&lt;BR&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;DIV align="center"&gt;&amp;nbsp;&lt;/DIV&gt;&lt;SCRIPT type="text/javascript"&gt;var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));&lt;/SCRIPT&gt;&lt;br /&gt;&lt;br /&gt;&lt;SCRIPT type="text/javascript" src="http://www.google-analytics.com/ga.js"&gt;&lt;/SCRIPT&gt;&lt;br /&gt;&lt;br /&gt;&lt;SCRIPT type="text/javascript"&gt;var pageTracker = _gat._getTracker("UA-6156018-1");pageTracker._trackPageview();&lt;/SCRIPT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-5972245154620765666?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/5972245154620765666/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/sendmaildovecot.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5972245154620765666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5972245154620765666'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/sendmaildovecot.html' title='メールサーバー構築(sendmail+Dovecot)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-6890074164956059679</id><published>2010-03-05T01:00:00.000-08:00</published><updated>2010-03-05T01:13:15.361-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>MySQL5 REPLICATION (MySQL 복제 구현) by Vins</title><content type='html'>아래 항목은 mysql 5-1.43 버젼에서 테스트 되었으며 &lt;br /&gt;mysql 5 이상의 버젼의 문서를 참조하였다&lt;br /&gt;&lt;br /&gt;MySQL&amp;nbsp;복제 구현의 시나리오&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;MASTER-DB : 192.168.34.72 (TDB1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;nbsp; SLAVE-DB : 192.168.34.71 (TDB2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;시나리오 --&lt;br /&gt;Master DB에 이미 운영중인 2년치의 데이터가 들어있고 &lt;br /&gt;최근 서버가 불안정해 짐으로 실시간 복제를 구현해 DB이중화를 함이 목적이다&lt;br /&gt;이에 웹소스에서 기존 서버인 TDB1 이 다운될 경우 TDB2에 Connecting 하도록 &lt;br /&gt;소스로 구현해 놓았다 &lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: red; font-size: x-small;"&gt;(NOTE 설명이나 주의 즉 실행하는 항목이 아님)&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;사실 아래 STEP 1 ~ STEP 3의 test 까지 순서대로 실행만 해도&lt;br /&gt;무리 없이 복제를 구현할 수 있을 것이다 &lt;br /&gt;그럼 STEP 1 Master DB 설정이다&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;STEP 1 [MASTER-DB Configuration]&lt;br /&gt;&lt;br /&gt;1. connect to master db by root&lt;br /&gt;&lt;br /&gt;2. mysql&amp;gt; GRANT REPLICATION SLAVE ON *.* TO 'snsghrepl'@'192.168.34.%' IDENTIFIED BY 'ghrpsns0413';&lt;br /&gt;&lt;br /&gt;3. [/etc/my.cnf configure]&lt;br /&gt;&lt;br /&gt;log-bin=mysql-bin&lt;br /&gt;server-id=1921683472&lt;br /&gt;NOTE&amp;nbsp;:&amp;nbsp;server-id unique in network and bound from 1 to (2^32)-1 number, recommand ip address with dot&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; server-id는 네트워크에서 유일해야 하며 2의32승까지 사용할 수 있다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 점을 뺀 ip address를 사용하면 아마 유일할 것이다&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. mysql restart&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4-1. /usr/local/mysql/bin/mysqladimin -uroot shutdown &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4-2. /usr/local/mysql/bin/mysqld_safe --user=mysql &amp;amp; ##(alter enter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOTE : rpm 설치시엔 /etc/rc.d/init.d/mysql restart&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. confirm master db info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5-1 mysql&amp;gt; FLUSH TABLES WITH READ LOCK;&amp;nbsp; (data full backup 할꺼니 전체 잠금)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;5-2 mysql&amp;gt; SHOW MASTER STATUS;&lt;br /&gt;&lt;br /&gt;+-------------------+----------+---------------+------------------+&lt;br /&gt;&amp;nbsp;File&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Position&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Binlog_Do_DB&amp;nbsp;&amp;nbsp;Binlog_Ignore_DB &lt;br /&gt;+-------------------+----------+---------------+------------------+&lt;br /&gt;&amp;nbsp;| mysql-bin.000001&amp;nbsp;|&amp;nbsp; 106&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;+------------------+----------+---------------+------------------+&lt;br /&gt;&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;6. create tar file (NOTE : 테이블 LOCK걸었으니 안심하고 전체백업)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6-1. cd /usr/local/mysql&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6-2. tar cf /dataCenter/alldb.tar ./usr/local/mysql/data&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NOTE : mysqldump가 아니라 data 폴더를 전부 가져간다 mysql, information_schema 전부)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6-3. copy alldb.tar to slave db server (somewhere.. maybe /usr/local/mysql )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NOTE : alldb.tar 이라는 이름으로 압축하였으니 이를 Slave DB로 Copy)&lt;br /&gt;7. server reboot&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;# reboot (wait a few minutes, 서버 재부팅 할때까지 대기) &lt;br /&gt;&lt;br /&gt;8. /usr/local/mysql/bin/mysqld_safe --user=mysql &amp;amp; ##(alter enter)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOTE : mysql 을 실행 시킨다.&lt;br /&gt;9. unlock tables;&amp;nbsp; (백업이 끝났으니 table lock을 풀어주자)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9-1. # /usr/local/mysql/bin/mysql (access mysql server)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9-2. mysql&amp;gt; unlock tables;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9-3. mysql&amp;gt; show master status;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NOTE : 5-2 와 같으면 됨, 확인작업)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOTE :&amp;nbsp;remember value of File Name and Position Number&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; File 필드와 Position 필드의 값을 외워라 (적든가)&lt;br /&gt;&lt;br /&gt;10. Master DB Config Complete !!&amp;nbsp; (Master DB 설정 끝)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;STEP 2&amp;nbsp; [SLAVE-DB Configuration]&lt;br /&gt;&lt;br /&gt;1. [/etc/my.cnf configure]&amp;nbsp; 파일내 수정(찾아서 주석 풀거나 server-id만 변경해 주면 됨)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [mysqld]&lt;br /&gt;&lt;br /&gt;log-bin=mysql-bin&lt;br /&gt;server-id=1921683471 &lt;br /&gt;&lt;br /&gt;NOTE : server-id unique in network and bound from 1 to (2^32)-1 number&lt;br /&gt;&lt;br /&gt;2. /usr/local/mysql/bin/mysqladmin -uroot shutdown&amp;nbsp;&amp;nbsp; (디비 실행 중지)&lt;br /&gt;&lt;br /&gt;3. copy alldb.tar in /usr/local/mysql from master-db full back file&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NOTE : master full back file 을 소스폴더로 복사)&lt;br /&gt;&lt;br /&gt;4. rm -rf /usr/local/mysql/data&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NOTE : 기존 data폴더를 통채로 지운다 - 완벽한 동기화를 위해서)&lt;br /&gt;&lt;br /&gt;5. tar xvf alldb.tar &lt;br /&gt;&amp;nbsp;&amp;nbsp; (NOTE : recreate /usr/local/mysql/data folder&amp;nbsp;, 압축 풀면 master db의 data폴더가 생성된다)&lt;br /&gt;&lt;br /&gt;6. /usr/local/mysql/bin/mysqld_safe --user=mysql &amp;amp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; (NOTE :&amp;nbsp;Mysql은 서버 재 시작하면 data폴더 이하의 정보를 자동으로 인식한다, database만 제외)&lt;br /&gt;&lt;br /&gt;7. /usr/local/mysql/bin/mysql -uroot&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOTE ; remember filename and position number form STEP1, 9-4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9-4에서 외운 정보를 아래에 &lt;span style="color: red;"&gt;대입&lt;/span&gt;한다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7-1. mysql&amp;gt; CHANGE MASTER TO&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt; MASTER_HOST='192.168.34.72',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;gt; MASTER_USER='snsghrepl',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt; MASTER_PASSWORD='ghrpsns0413',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt; MASTER_PORT=3306,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt; MASTER_LOG_FILE='&lt;span style="color: red;"&gt;mysql-bin.000001&lt;/span&gt;',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt; MASTER_LOG_POS=&lt;span style="color: red;"&gt;106&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Query OK, 0 rows affected (0.01 sec)&lt;br /&gt;&lt;br /&gt;7-2. mysql&amp;gt; START SLAVE;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Query OK, 0 rows affected (0.01 sec)&lt;br /&gt;&lt;br /&gt;8. Slave DB Config Complete !!&amp;nbsp; SLAVE DB도 설정 끝&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;STEP 3. TEST REPLICATION&amp;nbsp; (이제 테스트)&lt;br /&gt;&lt;br /&gt;1. ACCESS MASTER DB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /usr/local/mysql/bin/mysql -uroot&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql&amp;gt; use test;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mysql&amp;gt; create table replTest (id int, name varcher(20));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mysql&amp;gt; insert into replTest (1, 'test001');&lt;br /&gt;&lt;br /&gt;2. ACCESS SLAVE DB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /usr/local/mysql/bin/mysql -uroot&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mysql&amp;gt; use test;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mysql&amp;gt; select * from replTest;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; +------+---------+&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; +------+---------+&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | test001&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; +------+---------+&lt;br /&gt;&lt;br /&gt;NOTE : master db에서 생성하고 insert된 데이터가 slave db에서도 그대로 반영 됨을 알 수 있다&lt;br /&gt;&lt;br /&gt;3. Complete TEST !!&amp;nbsp; (끝)&lt;br /&gt;&lt;br /&gt;referance : &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/replication-howto-masterbaseconfig.html"&gt;http://dev.mysql.com/doc/refman/5.1/en/replication-howto-masterbaseconfig.html&lt;/a&gt;&lt;br /&gt;참조 : mysql 영문 공식 페이지의 메뉴얼을 참조 하였다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (개인 블러그, 카페, 기타 웹 사이트에는 허위 정보들이 너무 많았다..)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-6890074164956059679?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/6890074164956059679/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/mysql5-replication-mysql.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6890074164956059679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6890074164956059679'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/mysql5-replication-mysql.html' title='MySQL5 REPLICATION (MySQL 복제 구현) by Vins'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-3497868392897106622</id><published>2010-03-02T18:15:00.000-08:00</published><updated>2010-03-02T18:15:04.743-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenPNE'/><title type='text'>OpenPNE 3.1 を CentOS 5 にインストールしてみました</title><content type='html'>OpenPNE開発チームの小川です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;前回はレンタルサーバに OpenPNE 3 をインストールする例を紹介しましたが、今回は自分で管理しているサーバへのインストール例として OpenPNE 3.1.0 を最小セットアップ状態の CentOS 5.3 にインストールする手順をご紹介します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OpenPNE 3.1 の一般的なインストール方法は、OpenPNE3.1 セットアップ手順 をご覧ください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;はじめに&lt;br /&gt;&lt;br /&gt;ここで紹介する手順は OpenPNE を動作させる例として最低限の手順しか記載していないので、実際に公開サーバの設定をする際には参考程度にご利用ください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以下の手順では sudo を使用していますが、sudo の設定をしていない環境では「sudo」の付いているコマンドは「sudo」を抜いて root ユーザで実行してください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;また、ホスト名として sns.example.com を、OpenPNE を管理する一般ユーザとして admin を例にしていますが、環境に合わせて適宜読み替えてください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ミドルウェアのインストール&lt;br /&gt;&lt;br /&gt;Apache, MySQL, Postfix のインストール&lt;br /&gt;&lt;br /&gt;yum コマンドを使ってOS標準のパッケージをそのままインストールします。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo yum install httpd mysql-server postfix&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP のインストール&lt;br /&gt;&lt;br /&gt;PHP に関してはバージョン 5.2.3 以降が必要なので、個別にインストールします。ソースコードからコンパイルしてももちろんよいのですが、今回は oss.oracle.com で公開されている rpm パッケージを利用しました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo yum install aspell curl gmp libxslt wget&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ DIST=http://oss.oracle.com/projects/php/dist/files/EL5/i386&lt;br /&gt;&lt;br /&gt;$ wget $DIST/php-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;$ wget $DIST/php-cli-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;$ wget $DIST/php-common-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;$ wget $DIST/php-gd-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;$ wget $DIST/php-mbstring-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;$ wget $DIST/php-mysql-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;$ wget $DIST/php-pdo-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;$ wget $DIST/php-xml-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;$ sudo rpm -ivh php-*.rpm&lt;br /&gt;&lt;br /&gt;準備中... ########################################### [100%]&lt;br /&gt;&lt;br /&gt;1:php-common ########################################### [ 13%]&lt;br /&gt;&lt;br /&gt;2:php-cli ########################################### [ 25%]&lt;br /&gt;&lt;br /&gt;3:php-pdo ########################################### [ 38%]&lt;br /&gt;&lt;br /&gt;4:php ########################################### [ 50%]&lt;br /&gt;&lt;br /&gt;5:php-gd ########################################### [ 63%]&lt;br /&gt;&lt;br /&gt;6:php-mbstring ########################################### [ 75%]&lt;br /&gt;&lt;br /&gt;7:php-mysql ########################################### [ 88%]&lt;br /&gt;&lt;br /&gt;8:php-xml ########################################### [100%]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;APC のインストール（オプション）&lt;br /&gt;&lt;br /&gt;PHP の快適な動作にはアクセラレータの導入が欠かせません。ここではセットアップガイドでも推奨されている APC をインストールしてみます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo yum install autoconf213 automake gcc make httpd-devel&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ wget $DIST/php-devel-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;$ sudo rpm -ivh php-devel-5.2.9-1.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo yum install php-pear&lt;br /&gt;&lt;br /&gt;$ sudo pear channel-update pear.php.net&lt;br /&gt;&lt;br /&gt;$ sudo pear upgrade-all --ignore-errors&lt;br /&gt;&lt;br /&gt;$ sudo pecl install APC&lt;br /&gt;&lt;br /&gt;Use apxs to set compile flags (if using APC with Apache)? [yes] : yes&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;install ok: channel://pecl.php.net/APC-3.0.19&lt;br /&gt;&lt;br /&gt;configuration option "php_ini" is not set to php.ini location&lt;br /&gt;&lt;br /&gt;You should add "extension=apc.so" to php.ini&lt;br /&gt;&lt;br /&gt;$ echo "extension=apc.so" &lt;br /&gt;sudo tee /etc/php.d/apc.ini&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ミドルウェアの設定&lt;br /&gt;&lt;br /&gt;Apache の設定&lt;br /&gt;&lt;br /&gt;VirtualHost の設定を httpd.conf の末尾に追加します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo vi /etc/httpd/conf/httpd.conf&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;&lt;br /&gt;ServerName sns.example.com&lt;br /&gt;&lt;br /&gt;DocumentRoot /var/www/sns/web&lt;br /&gt;&lt;br /&gt;&amp;lt;Directory /var/www/sns/web&amp;gt;&lt;br /&gt;&lt;br /&gt;AllowOverride All&lt;br /&gt;&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OpenPNE を設置するディレクトリを作成します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo mkdir /var/www/sns&lt;br /&gt;&lt;br /&gt;$ sudo chown admin. /var/www/sns&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;設定ファイルが間違っていないかどうかテストします。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo /etc/init.d/httpd configtest&lt;br /&gt;&lt;br /&gt;Warning: DocumentRoot [/var/www/sns/web] does not exist&lt;br /&gt;&lt;br /&gt;Syntax OK&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/var/www/sns/web は後の手順で作成するので、この Warning が出るのはよしとして進めます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;デーモンの起動&lt;br /&gt;&lt;br /&gt;$ sudo /etc/init.d/httpd start&lt;br /&gt;&lt;br /&gt;$ sudo /etc/init.d/mysqld start&lt;br /&gt;&lt;br /&gt;$ sudo /etc/init.d/postfix start&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL のユーザ設定&lt;br /&gt;&lt;br /&gt;まず、root ユーザのパスワードを設定します。new-password の部分は変更してください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ mysql -u root&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD('new-password') WHERE User = 'root';&lt;br /&gt;&lt;br /&gt;Query OK, 3 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;Rows matched: 3 Changed: 3 Warnings: 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OpenPNE 用に openpne というユーザを作成し、openpne3 というデータベースに対するアクセス権限を与えます。pasuwado の部分は変更してください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; GRANT USAGE ON *.* TO 'openpne'@'localhost' IDENTIFIED BY 'pasuwado';&lt;br /&gt;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; GRANT ALL ON openpne3.* TO 'openpne'@'localhost';&lt;br /&gt;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ファイアーウォールの設定&lt;br /&gt;&lt;br /&gt;外部から HTTP でアクセスできるよう設定します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo system-config-securitylevel-tui&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;「カスタマイズ」 → 「WWW (HTTP) 」にチェック → 「OK」 → 「OK」&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OpenPNE 3.1 のインストール&lt;br /&gt;&lt;br /&gt;ソースコードのダウンロード&lt;br /&gt;&lt;br /&gt;SourceForge.net の OpenPNE プロジェクトのページから OpenPNE 3.1.0 の zip アーカイブをダウンロード・展開します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ sudo yum install unzip&lt;br /&gt;&lt;br /&gt;$ cd /var/www/sns&lt;br /&gt;&lt;br /&gt;$ wget http://nchc.dl.sourceforge.net/sourceforge/openpne/OpenPNE-3.1.0.zip&lt;br /&gt;&lt;br /&gt;$ unzip OpenPNE-3.1.0.zip&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;キャッシュファイルの削除&lt;br /&gt;&lt;br /&gt;OpenPNE 3.1.0 の zip アーカイブには誤ったキャッシュファイルが含まれている可能性があるので、念のためキャッシュファイルの削除をしてください。（3.1.0 バージョン固有の問題で、通常のインストールでは必要ありません）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cd OpenPNE-3.1.0&lt;br /&gt;&lt;br /&gt;$ rm cache/*&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;プラグインインストール&lt;br /&gt;&lt;br /&gt;OpenPNE 3.1.0 では初期データの登録処理の関係上、openpne:install タスクを実行する前に opPlugin:sync タスクを実行してあらかじめプラグインをインストールしておく必要があります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;せっかくなので、先日リリースされたばかりの opDiaryPlugin も一緒にインストールしておきましょう。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ php symfony opPlugin:sync&lt;br /&gt;&lt;br /&gt;$ php symfony opPlugin:install --stability=beta opDiaryPlugin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;openpne:install タスクの実行&lt;br /&gt;&lt;br /&gt;$ php symfony openpne:install&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;openpne:install タスクを実行すると DB のセットアップに必要な情報を聞かれるので、サーバ環境に合わせて入力していきます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Choose DBMS (mysql, pgsql or sqlite)&lt;br /&gt;&lt;br /&gt;使用する DBMS の種類を入力します。&lt;br /&gt;&lt;br /&gt;ここでは、「mysql」と入力します。&lt;br /&gt;&lt;br /&gt;Type database username&lt;br /&gt;&lt;br /&gt;データベースのユーザ名を入力します。&lt;br /&gt;&lt;br /&gt;作成した MySQL のユーザ名「openpne」を入力します。&lt;br /&gt;&lt;br /&gt;Type database password (optional)&lt;br /&gt;&lt;br /&gt;データベースのパスワードを入力します。&lt;br /&gt;&lt;br /&gt;作成した MySQL ユーザのパスワード「pasuwado」を入力します。&lt;br /&gt;&lt;br /&gt;Type database hostname&lt;br /&gt;&lt;br /&gt;データベースサーバのホスト名を入力します。&lt;br /&gt;&lt;br /&gt;ここでは「localhost」と入力します。&lt;br /&gt;&lt;br /&gt;Type database port number (optional)&lt;br /&gt;&lt;br /&gt;データベースのポート番号を入力します。未入力の場合は DBMS ごとのデフォルト値が使用されます。&lt;br /&gt;&lt;br /&gt;ここでは未入力のまま Enter を押します。&lt;br /&gt;&lt;br /&gt;Type database name&lt;br /&gt;&lt;br /&gt;データベース名を入力します。&lt;br /&gt;&lt;br /&gt;ここでは例として「openpne3」と入力します。&lt;br /&gt;&lt;br /&gt;Type database socket path (optional)&lt;br /&gt;&lt;br /&gt;データベース接続に使用するソケットのパスを入力します。&lt;br /&gt;&lt;br /&gt;ここでは未入力のまま Enter を押します。&lt;br /&gt;&lt;br /&gt;最後に入力した内容の確認をします。問題なければ「y」を入力します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The DBMS mysql&lt;br /&gt;&lt;br /&gt;The Database Username openpne&lt;br /&gt;&lt;br /&gt;The Database Password ******&lt;br /&gt;&lt;br /&gt;The Database Hostname localhost&lt;br /&gt;&lt;br /&gt;The Database Port Number&lt;br /&gt;&lt;br /&gt;The Database Name openpne3&lt;br /&gt;&lt;br /&gt;The Database Socket&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Is it OK to start this task? (y/n)y&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;公開ディレクトリの設定&lt;br /&gt;&lt;br /&gt;ここまでの手順で OpenPNE 3 が動作する状態になっているので、公開ディレクトリにシンボリックリンクを作成します。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cd /var/www/sns&lt;br /&gt;&lt;br /&gt;$ ln -s OpenPNE-3.1.0/web&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ブラウザからアクセス&lt;br /&gt;&lt;br /&gt;ブラウザから「http://sns.example.com/」にアクセスして OpenPNE 3 のログイン画面が表示されれば OK です。（初期アカウントはセットアップガイドにある通り、sns@example.com / password となっています。変更して使ってください）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;また、管理画面は「http://sns.example.com/pc_backend.php」へアクセスすれば表示されます。（初期アカウントはセットアップガイドにある通り、admin / password となっています。変更して使ってください）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;前のページ 次のページ &lt;br /&gt;&lt;br /&gt;コメント:5&lt;br /&gt;&lt;br /&gt;kawakami 09-06-02 (火) 20:00 すばらしいチュートリアルです。&lt;br /&gt;&lt;br /&gt;私のようなスキルの人間でも、２時間くらいでインストールできました。&lt;br /&gt;&lt;br /&gt;本当に助かりました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;手嶋守 09-08-02 (日) 18:26 20090802現在、パッケージの配置が変更されていました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DIST=http://oss.oracle.com/projects/php/dist/files/EL5/i386&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;wget $DIST/php52-5.2.10-2.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;wget $DIST/php52-cli-5.2.10-2.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;wget $DIST/php52-common-5.2.10-2.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;wget $DIST/php52-gd-5.2.10-2.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;wget $DIST/php52-mbstring-5.2.10-2.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;wget $DIST/php52-mysql-5.2.10-2.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;wget $DIST/php52-pdo-5.2.10-2.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;wget $DIST/php52-xml-5.2.10-2.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ゲン・テイ・チー 09-08-06 (木) 19:01 皆様&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Openpne3.xを使いたいです。&lt;br /&gt;&lt;br /&gt;携帯から画像の投稿などをできるようにしたいです。&lt;br /&gt;&lt;br /&gt;メールサーバの設定がわかりませんでした。&lt;br /&gt;&lt;br /&gt;教えていただけませんか。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;（私はベトナム人ですから、日本語がまだ下手です）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;よろしくお願いいたします。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;John 09-09-10 (木) 17:47 現在はなぜかmbstringが見つからないですね。&lt;br /&gt;&lt;br /&gt;wget $DIST/php52-mbstring-5.2.10-2.el5.i386.rpm&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;匿名 10-02-24 (水) 2:59 ギブアップ。&lt;br /&gt;&lt;br /&gt;XOOPSにトライします。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-3497868392897106622?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/3497868392897106622/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/openpne-31-centos-5.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3497868392897106622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3497868392897106622'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/openpne-31-centos-5.html' title='OpenPNE 3.1 を CentOS 5 にインストールしてみました'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-3293740412542796999</id><published>2010-03-01T19:31:00.000-08:00</published><updated>2010-03-01T19:31:51.396-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Linux IP, PORT 열고 닫기 (iptables)</title><content type='html'>&amp;lt;port 1234 를 udp로 open&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# iptables -A INPUT -p udp --dport 1234 -j ACCEPT&lt;br /&gt;&lt;br /&gt;&amp;lt;port 1234 를 close&amp;gt;&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;iptables -A INPUT -p udp --dport 1234 -j DROP&lt;br /&gt;&lt;br /&gt;ps.2 tcp로 열고 싶은경우 udp -&amp;gt; tcp 로 바꾸어 주면 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;iptables 를 사용하면 IP를 차단할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;# iptables -A INPUT -t filter -s 211.218.150.250 -j DROP&lt;br /&gt;&lt;br /&gt;&amp;nbsp;# iptables -A INPUT -t filter -s 211.218.150.200 -j DROP&lt;br /&gt;&lt;br /&gt;위와 같이 하면 211.218.150.250 , 211.218.150.200 에서 서버에 접근을 할 수 없습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;한개의 IP 대신에 211.218.150.0/24 라고 하면 &lt;br /&gt;&lt;br /&gt;211.218.150.0~255 까지 256개의 IP를 한꺼번에차단합니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;#&amp;nbsp;iptables -A INPUT -t filter -s 211.218.150.0/24 -j DROP&lt;br /&gt;&lt;br /&gt;211.218.0.0/16 이면 65536 개의 IP를 &lt;br /&gt;&lt;br /&gt;211.0.0.0/8 이면 167510016 개의 IP를 차단할 수 있습니다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-3293740412542796999?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/3293740412542796999/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/linux-ip-port-iptables.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3293740412542796999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3293740412542796999'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/03/linux-ip-port-iptables.html' title='Linux IP, PORT 열고 닫기 (iptables)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-1516309569883977794</id><published>2010-02-25T18:16:00.001-08:00</published><updated>2010-02-25T18:16:40.144-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='sendmail'/><title type='text'>리눅스 sendmail 설정 완벽 가이드</title><content type='html'>▷ Sendmail 이란?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;메일서버의 구성을 놓고 얘기하자면 센드메일 서버만으로 이루어 지는것이 아니다.&lt;br /&gt;&lt;br /&gt;정확히 말해 센드메일서버는 보내는 메일서버 즉 메일을 받기위함이 아닌 보내기위한 서버 SMTP(Simple Mail Transfer Protocol) 서버를 얘기 하는것이다.&lt;br /&gt;&lt;br /&gt;메일서버에 대한 이해가 잡혀있지 않는 상태에서는 센드메일 서버를 논하기가 어렵다.&lt;br /&gt;&lt;br /&gt;일반적인 메일서버의 구성을 보자면 메일을 메일을 보내기위한 SMTP 서버와 반대로 메일을 받기위해 존재하는 POP3서버나 IMAP 서버로 나뉜다.&lt;br /&gt;&lt;br /&gt;이중 센드메일은 SMTP 서버에 속하며 받는 메일서버의 경우 위에서 언급한대로 따로 구성된다.&lt;br /&gt;&lt;br /&gt;물론 클라이언트(사용자) 입장에서 보면 이들은 하나로 뭉처진 동일한 시스템으로 인식될수 있다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;예를 들어 인터넷이 보급되면서 이제는 너무도 일반화된 웹메일 서비스(다음메일 혹은 핫메일등) 또한 이 메일서버의 구성을 기본으로 웹상에서 메일의 송수신을 제어할수 있도록 PHP나 ASP등의 서버기반 프로그램 언어를 통해 이루어지는 서비스이다.&lt;br /&gt;&lt;br /&gt;웹 메일의 관점에서 보자면 사용자들은 별도의 설정없이 메일의 보내기와 받기 서비스를 동시에 마치 하나의 시스템 처럼 생각하며 이용할수 있지만 실제의 구성은 앞에서 언급한대로 각각의 나누어진 서비스 들이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;자 이제부터 센드메일 관련된 파일들을 알아보고 하나하나 세팅해나가 보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;▶ 센드메일 서버 주요 설정파일과 관련 파일 및 디렉토리의 쓰임세&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/var/spool/mqueue ------------------ ①&lt;br /&gt;&lt;br /&gt;/var/spool/mail ------------------ ②&lt;br /&gt;&lt;br /&gt;/etc/mail/access ------------------ ③&lt;br /&gt;&lt;br /&gt;/etc/aliases ------------------ ④&lt;br /&gt;&lt;br /&gt;/etc/mail/local-host-names ------------------ ⑤&lt;br /&gt;&lt;br /&gt;/etc/mail/sendmail.mc ------------------ ⑥&lt;br /&gt;&lt;br /&gt;/etc/mail/sendmail.cf ------------------ ⑦&lt;br /&gt;&lt;br /&gt;/etc/mail/virtusertable ------------------ ⑧&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;① mqueue 는 사용자가 메일을 보낼때 사용하는 SMTP 서버에서 메일을 발송하기전 임시적으로 사용자의 메일을 보관하는 곳이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;② mail은 다른사용자에 의해 전송된 메일이 내 내 SMTP 서버에 임시적으로 저장되는곳이며 POP3 서버에 의해 메일이 전달될때까지 보관하게 된다. 즉 어떻게 보면 SMTP서버는 우체통과 우체부의 역활을 모두 수행하면서 한편으로는 POP3라는 메일 전달자가 메일을 가져가기 전까지의 우편함의 역활도 수행하게 되는것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;③ access 파일은 SMTP 서버의 이용을 제한하는 설정파일로서 다음과 같은 설정형식을 보인다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Check the /usr/share/doc/sendmail/README.cf file for a description&lt;br /&gt;&lt;br /&gt;# of the format of this file. (search for access_db in that file)&lt;br /&gt;&lt;br /&gt;# The /usr/share/doc/sendmail/README.cf is part of the sendmail-doc&lt;br /&gt;&lt;br /&gt;# package.&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# by default we allow relaying from localhost...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;localhost.localdomain RELAY&lt;br /&gt;&lt;br /&gt;localhost RELAY&lt;br /&gt;&lt;br /&gt;127.0.0.1 RELAY&lt;br /&gt;&lt;br /&gt;mail.xfeelis.pe.kr RELAY&lt;br /&gt;&lt;br /&gt;xfeelis.pe.kr RELAY&lt;br /&gt;&lt;br /&gt;xfeel@xfeelis.pe.kr RELAY&lt;br /&gt;&lt;br /&gt;211.188.120.198 RELAY&lt;br /&gt;&lt;br /&gt;211.188.120.0 RELAY&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;spam.pe.kr REJECT&lt;br /&gt;&lt;br /&gt;admin@spam.pe.kr REJECT&lt;br /&gt;&lt;br /&gt;spamer@spam.pe.kr DISCARD&lt;br /&gt;&lt;br /&gt;xfeel@spam.pe.kr OK&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;- 보기에서와 같이 RELAY 설정한 부분들은 메일의 수발신을 허용하는 설정이다. 다만 access 파일에서의 RELAY 설정은 우선순위를 정하자면 2순위로 생각해야 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그 이유를 설명하자면 뒤에서 다시 언급할 부분인 sendmail.mc 파일과 sendmail.cf 파일의 설정 내역에 따라 외부 네트워크에서의 접근 즉 내부가 아닌 외부에서 smtp를 이용하고자 자신의 메일계정이나 IP를 RELAY 해두었다고 해도 인증 및 제한에 걸려 접근거부 처리가 되는 경우가 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그 이유는 레드헷 계열 7.1 이상의 배포 버전에 설치된 센드메일의 경우 기본적인 설정이 localhost 127.0.0.1 즉 로컬 네트워크나 로컬서버를 통한 메일의 발신을 제외하고 모두 거부하도록 정하고 있다.&lt;br /&gt;&lt;br /&gt;이유는 샌드메일서버가 외부 스패머에 의해 스팸메일이 뿌려지는 경유지가 되는것을 막고자 하는 스팸 거부/보안정책 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이 제한을 풀어주기 위해서는 다음과 같이 sendmail.mc 파일의 'DAEMON_OPTIONS' 부분을 수정하거나 해당 지시자 자체를 삭제하여야 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# vi /etc/mail/sendmail.mc &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;센드메일의 설치 버전에 따라 약간의 기본 설정값이 다를수 있으나 레드헷 배포판에 포함되어 있는 샌드메일의 경우 위지시자 자체를 삭제하거나 Addr 부분의 IP를 0.0.0.0 으로 수정해주면 된다. 단 절대 #처리는 하지말라. 서버관리자 그룹 슈퍼유저코리아 센드메일 관련 문서를 보면 주석 #처리시 오류가 날수 있음을 알리고 삭제나 변경을 권장하고 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이유는 sendmail.mc 파일의 경우 주석구문 앞에 dnl을 같이 표기하도록 하고 있지만 위의 옵션의 경우 기본값이 활성화인 이유로 행의 첫부분에 dnl 처리가 되지 않아있다. 그렇기에 해당 사항을 잘 모르는 관리자의 경우 그냥 주석처리만 해버리고 설정오류를 찾지못해 애를 먹는 경우가 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이제 본 강좌에서 다루고 있는 Kore 리눅스 배포판에 설치된 센드메일의 sendmail.mc 파일의경우를 보자. 다음과 같은 기본값을 가지고 있을것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이미 기본 설정값이 Addr 부분을 변경해주고 있음으로 당연히 뒷부분의 dnl 부분만 삭제해주면 되는것이다. 역시 릴리즈 버전인 국내 배포판이 좋기는 좋다. 알아서 이런 부분들을 염두해두어 수정해 주고있으니... &amp;gt;_&amp;lt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;자 이제 다시 access 파일의 설정으로 돌아가보자 자세한 sendmail.mc 파일의 설정에 관해서는 뒤에서 다시 다룰것이니 조급해 하지말자 ㅡㅡa&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;RELAY 설정에 해당하는 값은 위에서 보는바와 같이 해당 도메인, 해당 이메일, 해당 IP, 해당 네트워크 등으로 허용할수 있다. 위의 설정을 참조하여 자신만의 릴레이 설정을 해보도록 하자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음은 REJECT 설정이다. REJECT 설정은 RELAY 설정과 반대로 수/발신 거부 설정이다.&lt;br /&gt;&lt;br /&gt;이역시 해당 도메인, 해당 이메일, 해당 IP, 해당 네트워크등으로 나누어 설정할수 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음은 DISCARD 설정이다. 이는 스팸에일을 받되 받은후 POP3 서버가 메일을 가져가지 않도록 바로 폐기해 버리며 메일을 발신한 스패머에게는 폐기통보를 하지않는다 즉 스패머는 메일이 정상적으로 발신된줄 알것이다.. 바보처럼... ㅡ_ㅡ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음 설정은 OK 값이다. OK는 특정 도메인 또는 특정 IP나 네트워크 그룹이 REJECT 처리 되어있다고 하더라고 지정한 이메일주소나 IP등에 관계된 메일은 예외적으로 허용처리를 한다는 뜻이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;예를 들면 이런경우가 있다. 만약 필자가 악명높은 스패머라고 치자. ㅡㅡ;;&lt;br /&gt;&lt;br /&gt;필자는 관련 스패머 그룹에서 관련 스팸기법등을 공유할것이다. 어떤 새로운 스패머가 필자의 스팸기법에 관련한 메일링 리스트에 가입하여 필자의 이메일을 받기위해서는 스패머 그룹의 도메인 자체는 거부되어 있겠지만 필자의 이메일 만은 예외로 처리해야 할것이다.&lt;br /&gt;&lt;br /&gt;이럴때 쓰는것이 OK 설정 값이다.&lt;br /&gt;&lt;br /&gt;물론 OK 설정값을 다른 용도로 활용할수도 있지만 통상적으로 예외처리에 관련된 설정을 주고자 할때 쓰이게 되는것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;④ aliases 파일은 말그대로 별칭 설정파일이다. 즉 root 에게로 온 메일을 다른 사용자 계정으로 돌리고 싶다던가 할때 쓰는 것이다.&lt;br /&gt;&lt;br /&gt;이 기법을 잘 이용하면 소규모의 메일링 리스트도 운용할수 있다.&lt;br /&gt;&lt;br /&gt;자 그 기법을 한번 둘러보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# vi /etc/aliases&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Basic system aliases -- these MUST be present.&lt;br /&gt;&lt;br /&gt;mailer-daemon: postmaster&lt;br /&gt;&lt;br /&gt;postmaster: root&lt;br /&gt;&lt;br /&gt;root: xfeel&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;위 설정을 살펴 보자. 위 설정은 mailer-daemon 이라는 계정 즉 sendmail 데몬의 제어를 위해 만들어진 mailer-daemon 계정으로 오는 관련 로그메일을 최종적으로 xfeel 계정 사용자에게 보내주고 있는것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;즉 mailer-daemon 은 postmaster 로 별칭 설정 되었으며 다시 postmaster 는 root 로 또 다시 root 는 xfeel 사용자에게 별칭 설정 되어진것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;기본적인 설정값에 의한다면 root: xfeel 의 설정은 없기 때문에 sendmail 에 관련된 로그 메일은 root 계정으로 보내어 지겠지만 필자는 이를 다시 xfeel 계정으로 돌려주고 있는것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;뭐 굳이 이렇게 까지 설정할 필요가 있느냐고 반문하는 독자가 있다면 뭐라 할말은 없지만 보안적인 요소를 위해 필자는 이렇게 조치하고 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;메일을 확인하기 위해서라면 서버에 직접 원격접속 혹은 콘솔상에서 확인하지 않는이상 대부분의 사용자가 Outlook Express 등을 이용할것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;만약 root로 보내어진 메일을 Outlook Express등의 메일 확인 프로그램에서 보고자 한다면 해당 프로그램에 root 계정의 패스워드를 사용해야 할것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;일반적으로 root 패스워드의 경우 사전상의 단어나 연속적인 숫자등으로 이루어진 패스워드를 사용하지 않는것이 원칙이기에 매우 길고 복잡하게 설정되는것이 일반적이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;때문에 대부분의 사용자의 경우 계정과 패스워드를 아웃룩에 저장하여 바로 사용하는 경우가 많다. 그럼 root 패스워드를 Outlook Express 따위의 프로그램에 저장하여 사용할것인가?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;만약 이런 발상을 하고있는 리눅서가 있다면 당장에 버려라...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;보안에 매우 취약하다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Outlook Express 프로그램은 MS 에서도 인정한 보안 취약점을 가지고 있는 매우 귀여운 놈이다.. ㅡ_ㅡ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;만약 크래커가 독자들이 사용하는 윈도우PC를 크래킹 하여 Outlook Express 에 저장된 root 계정의 패스워드를 습득한다면?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;혹은 독자들이 사용하는 그밖에 메일확인 프로그램을 크랙킹하여 root 패스워드를 습득한다면?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;생각하기 싫다.. 더설명할 이유가 없을것이라고 보며 다음으로 넘어가자 ㅡㅡa&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;자 이제 소규모 메일링 리스트 운용에 대해서 다뤄 보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;독자들이 운영하는 리눅스 서버에 다음과 같은 계정들이 생성되어 있다고 가정해 보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# vi /etc/passwd&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;root&lt;br /&gt;&lt;br /&gt;admin&lt;br /&gt;&lt;br /&gt;adminuser1 &lt;br /&gt;&lt;br /&gt;adminuser2&lt;br /&gt;&lt;br /&gt;adminuser3&lt;br /&gt;&lt;br /&gt;user1&lt;br /&gt;&lt;br /&gt;user2&lt;br /&gt;&lt;br /&gt;user3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;만약 메일을 보내고자 하는사람이 support@xfeelis.pe.kr 에 메일을 보낼때 각각 admin, amdinuser1,2,3 계정에 모두 메일이 가도록 설정하고 싶다면 어떻게 해야 할것인가?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;물론 보는것과 같이 support 란 계정은 따로 생성되어 있지 않은 상황이다. (뭐 생성되어 있다고 해도 결과에는 차이가 없으나.. 일단 그렇다고 가정하자)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;별칭기능을 활용한 소규모 메일링 리스트 기법이 이것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# vi /etc/aliases&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Person who should get root's mail&lt;br /&gt;&lt;br /&gt;support: admin,adminuser1,adminuser2,adminuser3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;어떤가 대단하지 않은가? 이렇게 간단한 설정으로 메일 그룹을 지정하고 운용할수 있다니..&lt;br /&gt;&lt;br /&gt;잘활용하면 여러모로 쓰임세가 많다. 연구해 보자. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;⑤ local-host-names 파일은 메일의 최종 수신지를 지정하는 곳이다. 즉 쉽게 얘기하자면 이런경우가 있다. 독자들의 샌드메일 서버를 거처가는 메일중 최종 수신지가 독자들의 서버인 메일이 서버에 저장되기 위해서 독자들의 도메인 목록을 등록하는것이다. 만약 독자들이 웹호스팅 을 위한 서버를 운영하고 있다고 가정하면 독자 자신의 도메인 뿐만 아니라 고객의 도메인까지 등록해두어야 메일이 정상적으로 전달되는 것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;설정은 다음과 같다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# vi /etc/mail/local-host-names&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# local-host-names - include all aliases for your machine here.&lt;br /&gt;&lt;br /&gt;xfeelis.pe.kr&lt;br /&gt;&lt;br /&gt;xfeelis.co.kr&lt;br /&gt;&lt;br /&gt;xfeelis.or.kr&lt;br /&gt;&lt;br /&gt;userdomain.pe.kr&lt;br /&gt;&lt;br /&gt;userdomain.co.kr&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그냥 위와 같이 도메인만 설정해 주면 된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;⑥ sendmail.mc 파일은 샌드메일 서버의 주요 설정파일중 하나이며 /etc/mail/sendmail.mc 파일을 바탕으로 M4 유틸을 이용하여 /etc/mail/sendmail.cf 파일을 생성하게 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sedmail.mc 파일중 가장 중요한 지시자는 역시 앞부분에서 언급한 외부네트워크에 대한 smtp 이용 제한을 풀어주는 부분과 지금부터 다뤄가고자 하는 SMTP 인증에 관한 부분이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;앞에 access 부분에서 잠시 거론한대로 외부네트워크에 대한 smtp 이용을 풀어주었다면 샌드메일 서버가 가지고 있는 취약점을 이용하여 스팸메일의 경유지 혹은 스팸서버가 될수 있는 가능성이 존재하는것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이부분을 그냥 넘겨버린다면 심각한 상황이 초래된다. 스팸메일에 의해 샌드메일서버는 과부하가 걸려 시스템의 자원을 모두 고갈시킬것이며 그것마저 다된다면 메일서버는 다운되고 말것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이런것을 막기위한 방법중 하나가 바로 앞에서 언급한 access 파일 운영정책과 지금부터 거론할 SMTP 인증에 대한 부분이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;사용자가 smtp 서버를 이용하여 외부 네트워크로 메일을 발신하고자 할때 인증절차를 거처서 이용하도록 하는것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;실제로 대부분의 메일 호스팅이나 웹호스팅 제공하는 업체에서 이 SMTP 인증 기법을 사용하며 해당 사용자들에게 Outlook Express 등의 메일 송수신 프로그램 옵션에서 SMTP 인증부분을 체크 할것을 공지하고 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;그럼 SMTP 인증부분을 활성화 해보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# vi /etc/mail/sendmail.mc&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;define(`confAUTH_OPTIONS', `A')dnl&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl &amp;lt;- dnl 부분 삭제&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;위 설정에서 define(`confAUTH_OPTIONS', `A') 부분은 dnl 처리를 해줘야 하며 define(`confAUTH_MECHANISMS' 부분은 맨뒤에 dnl을 삭제해야 SMTP 인증기능이 활성화 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;위와 같이 설정해 주었다면 이제 다음과 같이 m4 유틸명령어를 사용하여 sendmail.cf 파일을 생성해 보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# m4 /etc/mail/sendmail.mc &amp;gt; /etc/mail/sendmail.cf &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;⑦ sendmail.cf은 전자에 sendmail.mc 파일을 통하여 생성된 세부 설정파일 정도로 이해하면 될것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sendmail.cf 파일에서 눈여겨 봐야할 지시자들은 다음과 같다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FW 지시자 : FW 지시자는 메일의 최종수신지 설정파일에 경로를 지정하는 곳으로서 sendmail 8.9.x 버전까지는 sendmail.cw 의 값으로 되어있지만 8.10.x 이후 버전부터는 local-host-names 파일로 설정되어 있다. 독자들이 사용하는 배포판에 포함된 센드메일의 버전을 확인후 local-host-names 로 변경해주자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# file containing names of hosts for which we receive email&lt;br /&gt;&lt;br /&gt;Fw/etc/mail/local-host-names&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MaxMessageSize : 첨부파일을 포함한 메일 메시지 최대크기 제한 설정 부분 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# maximum message size&lt;br /&gt;&lt;br /&gt;O MaxMessageSize=20000000&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;메일의 크기가 20M를 넘는다면 메일은 발신되지 못한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MinQueueAge : 임시보관 최소 시간 설정 부분&lt;br /&gt;&lt;br /&gt;뒤에서 언급하게 될 Timeout 설정값 이전에 적용될 우선적인 옵션으로 발송에 실패한 메일이 다시 재발송을 시도하기까지의 대기 시간을 설정 한다.. 기본값은 30분이며 기본적으로 서버부하를 줄이기 위해 # 주석처리 되어있지만 필요로 한다면 사용하여도 무방하다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# minimum time in queue before retry&lt;br /&gt;&lt;br /&gt;O MinQueueAge=30m&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;LogLevel : sendmail 이 가동되면서 발생되는 로그의 기록에 관련한 레벨을 설정&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# log level&lt;br /&gt;&lt;br /&gt;O LogLevel=9&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;각종 TimeOut 값 : 센드메일 서버의 각종 Timeout 값을 설정.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# timeouts (many of these)&lt;br /&gt;&lt;br /&gt;#O Timeout.initial=5m&lt;br /&gt;&lt;br /&gt;O Timeout.connect=1m &lt;br /&gt;&lt;br /&gt;- 사용자가 샌드메일 서버에 접속하여 작업하는 최대시간을 설정것으로 기본값은 1분이다.&lt;br /&gt;&lt;br /&gt;#O Timeout.aconnect=0s&lt;br /&gt;&lt;br /&gt;#O Timeout.iconnect=5m&lt;br /&gt;&lt;br /&gt;#O Timeout.helo=5m&lt;br /&gt;&lt;br /&gt;#O Timeout.mail=10m&lt;br /&gt;&lt;br /&gt;#O Timeout.rcpt=1h&lt;br /&gt;&lt;br /&gt;#O Timeout.datainit=5m&lt;br /&gt;&lt;br /&gt;#O Timeout.datablock=1h&lt;br /&gt;&lt;br /&gt;#O Timeout.datafinal=1h&lt;br /&gt;&lt;br /&gt;#O Timeout.rset=5m&lt;br /&gt;&lt;br /&gt;#O Timeout.quit=2m&lt;br /&gt;&lt;br /&gt;#O Timeout.misc=2m&lt;br /&gt;&lt;br /&gt;#O Timeout.command=1h&lt;br /&gt;&lt;br /&gt;O Timeout.ident=0&lt;br /&gt;&lt;br /&gt;#O Timeout.fileopen=60s&lt;br /&gt;&lt;br /&gt;#O Timeout.control=2m&lt;br /&gt;&lt;br /&gt;O Timeout.queuereturn=5d&lt;br /&gt;&lt;br /&gt;- 특정한 사유로 인해 메일이 전달되지 못하고 mqueue 에보관되고 있을시 보관 기간을 지정하는것으로 기본값은 5일이다. 이기간을 넘길경우 메일은 자동적으로 최초 발신지로 되돌려져 반송처리가 된다.&lt;br /&gt;&lt;br /&gt;#O Timeout.queuereturn.normal=5d&lt;br /&gt;&lt;br /&gt;#O Timeout.queuereturn.urgent=2d&lt;br /&gt;&lt;br /&gt;#O Timeout.queuereturn.non-urgent=7d&lt;br /&gt;&lt;br /&gt;#O Timeout.queuereturn.dsn=5d&lt;br /&gt;&lt;br /&gt;O Timeout.queuewarn=4h&lt;br /&gt;&lt;br /&gt;- 역시 특정한 사유로 인해 메일이 전달되지 못할시 최초 발신자에게 메일이 전달되지 못하고 있음을 경고하는 경고메일이 발송 되기까지의 대기 시간을 지정하며 기본값은 4시간이다.&lt;br /&gt;&lt;br /&gt;#O Timeout.queuewarn.normal=4h&lt;br /&gt;&lt;br /&gt;#O Timeout.queuewarn.urgent=1h&lt;br /&gt;&lt;br /&gt;#O Timeout.queuewarn.non-urgent=12h&lt;br /&gt;&lt;br /&gt;#O Timeout.queuewarn.dsn=4h&lt;br /&gt;&lt;br /&gt;#O Timeout.hoststatus=30m&lt;br /&gt;&lt;br /&gt;#O Timeout.resolver.retrans=5s&lt;br /&gt;&lt;br /&gt;#O Timeout.resolver.retrans.first=5s&lt;br /&gt;&lt;br /&gt;#O Timeout.resolver.retrans.normal=5s&lt;br /&gt;&lt;br /&gt;#O Timeout.resolver.retry=4&lt;br /&gt;&lt;br /&gt;#O Timeout.resolver.retry.first=4&lt;br /&gt;&lt;br /&gt;#O Timeout.resolver.retry.normal=4&lt;br /&gt;&lt;br /&gt;#O Timeout.lhlo=2m&lt;br /&gt;&lt;br /&gt;#O Timeout.auth=10m&lt;br /&gt;&lt;br /&gt;#O Timeout.starttls=1h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;기타 지시자들은 필자또한 사용하지 않으며 또 자세한 그 쓰임을 알고 있지 못하다. 좀더 자세한 사항은 sendmail.org 의 지시자 관련 문서를 참조바라며 실제로 위 3가지 정도의 옵션으로도 충분히 센드메일 서버에 운영에 있어 부하를 최소화 할수 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;⑧ virtusertable 파일은 가상메일 설정파일이라고 부르며 다음과 같은 상황에 사용된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;만약 필자가 웹호스팅 서버를 운영하고 있다고 가정하자.&lt;br /&gt;&lt;br /&gt;admin 이란 계정은 당연히 서버에 하나 밖에 존재 할수 없다.&lt;br /&gt;&lt;br /&gt;하지만 필자의 서버에서 웹호스팅을 받고 있는 사용자들은 자신들의 도메인을 가지고 메일을 운영할때 실계정명은 user1 등이지만 admin@userdomain.pe.kr 이란 도메인으로 메일을 받고자 요청한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;일반적인 생각이라면 admin 이란 계정은 단 하나만 존재하기 때문에 필자의 서버에 매칭된 도메인만이 admin@xfeelis.pe.kr 이란 메일을 사용할수 있다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이를 해결하기 위한 파일이 바로 /etc/mail/virtusertable 파일인 것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음과 같이 /etc/mail/virtusertable 파일을 편집해 보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# vi /etc/mail/virtusertable&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;admin@xfeelis.pe.kr xfeel&lt;br /&gt;&lt;br /&gt;admin@userdomain1.pe.kr user1&lt;br /&gt;&lt;br /&gt;admin@userdomain2.pe.kr user2&lt;br /&gt;&lt;br /&gt;admin@userdomain3.pe.kr user3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# makemap hash /etc/mail/virtusertable &amp;lt; /etc/mail/virtusertable&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;어떤까? 매우 쉽지 않은가? 알고 보면 매우 쉬우며 간단한 설정들이 이런 유용한 기능을 발휘하고 있다. 이것이 오픈소스 진영과 리눅스의 힘인것이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;자 이제 모든 파일의 설정을 마쳤자. 이제 실제로 샌드메일의 가동여부를 테스트 해봐야 할것이다. 우선 샌드메일을 가동 시켜보자.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# /etc/rc.d/init.d/sendmail restart&lt;br /&gt;&lt;br /&gt;Shutting down sendmail: [ OK ]&lt;br /&gt;&lt;br /&gt;Shutting down sm-client: [ OK ]&lt;br /&gt;&lt;br /&gt;Starting sendmail: [ OK ]&lt;br /&gt;&lt;br /&gt;Starting sm-client: [ OK ]&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이제 샌드메일이 정상적으로 가동하는지 확인해 봐야겠다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]# telnet 211.188.120.198 25&lt;br /&gt;&lt;br /&gt;Trying 211.188.120.198...&lt;br /&gt;&lt;br /&gt;Connected to 211.188.120.198.&lt;br /&gt;&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;&lt;br /&gt;220 xfeelis.pe.kr ESMTP Sendmail 8.13.0/8.13.0; Tue, 9 Nov 2004 14:18:10 +0900&lt;br /&gt;&lt;br /&gt;HELP &lt;br /&gt;&lt;br /&gt;214-2.0.0 This is sendmail version 8.13.0&lt;br /&gt;&lt;br /&gt;214-2.0.0 Topics:&lt;br /&gt;&lt;br /&gt;214-2.0.0 HELO EHLO MAIL RCPT DATA&lt;br /&gt;&lt;br /&gt;214-2.0.0 RSET NOOP QUIT HELP VRFY&lt;br /&gt;&lt;br /&gt;214-2.0.0 EXPN VERB ETRN DSN AUTH&lt;br /&gt;&lt;br /&gt;214-2.0.0 STARTTLS&lt;br /&gt;&lt;br /&gt;214-2.0.0 For more info use "HELP &amp;lt;topic&amp;gt;".&lt;br /&gt;&lt;br /&gt;214-2.0.0 To report bugs in the implementation send email to&lt;br /&gt;&lt;br /&gt;214-2.0.0 sendmail-bugs@sendmail.org.&lt;br /&gt;&lt;br /&gt;214-2.0.0 For local information send email to Postmaster at your site.&lt;br /&gt;&lt;br /&gt;214 2.0.0 End of HELP info&lt;br /&gt;&lt;br /&gt;QUIT&lt;br /&gt;&lt;br /&gt;221 2.0.0 xfeelis.pe.kr closing connection&lt;br /&gt;&lt;br /&gt;Connection closed by foreign host.&lt;br /&gt;&lt;br /&gt;[root@xfeelis /]#&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;25번 포트 즉 SMTP 서버인 샌드메일 서버에 이상없이 접속하였음을 통해 샌드메일이 제대로 가동되고 있음을 확인할수 있다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-1516309569883977794?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/1516309569883977794/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/sendmail.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1516309569883977794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1516309569883977794'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/sendmail.html' title='리눅스 sendmail 설정 완벽 가이드'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-5083334585252008307</id><published>2010-02-22T19:18:00.000-08:00</published><updated>2010-02-25T18:03:05.971-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenPNE'/><title type='text'>OpenPNE에서 SendMail 설정하는 방법 (휴대폰에서 파일 업로드)</title><content type='html'>OpenPNE에서 SendMail 설정하는 방법 (휴대폰에서 사진등록 가능하도록)&lt;br /&gt;&lt;br /&gt;DNS설정가능하면、sns.example.com 이런 형태의 OpenPNE용의 서브 도메인을 작성해서 MX레코드를 설정해 두면 사용하기 쉽다&lt;br /&gt;&lt;br /&gt;sns.example.com 을 메일용으로 할 경우&lt;br /&gt;DNS 에서 sns.example.com 가 설정되어 있다는 전체하에 다음과 같이 연결하면 된다&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. config.php &lt;br /&gt;define('MAIL_SERVER_DOMAIN', 'example.com');&lt;br /&gt;&lt;br /&gt;2. vi /etc/mail/local-host-names&lt;br /&gt;sns.example.com&lt;br /&gt;&lt;br /&gt;3. vi /etc/mail/virtusertable&lt;br /&gt;@sns.example.com sns-ktai@example.com&lt;br /&gt;&lt;br /&gt;4. 3번 설정이 완료 되면 반영시키기 위해 아래 명령어 실행&lt;br /&gt;# makemap hash /etc/mail/virtusertable.db &amp;lt; /etc/mail/virtusertable &lt;br /&gt;&lt;br /&gt;5. vi /etc/aliases 파일에 아래 코드 추가&lt;br /&gt;sns-ktai: "| php /path/to/openpne/bin/mail.php" &lt;br /&gt;&lt;br /&gt;6. aliases 설정이 끝나면 아래 명령어 실행 &lt;br /&gt;# newaliases &lt;br /&gt;--&amp;gt; 결과(오류아님) /etc/aliases: 78 aliases, longest 37 bytes, 819 bytes total&lt;br /&gt;&lt;br /&gt;이것으로@sns.example.com쪽으로 오는 메일은 OpenPNE_DIR/bin/mail.php에서 처리하도록 설정했다 하지만 、실제로 실행해 보면 실행되지 않고 메일로그를 보면 아래와 같은 메세지가 출력 된다.&lt;br /&gt;&lt;br /&gt;Nov 19 15:50:44 hoge sendmail smrsh: uid 8:&lt;br /&gt;attempt to use "| php /path/to/openpne/bin/mail.php" (stat failed)&lt;br /&gt;&lt;br /&gt;php 부분을 /usr/bin/php 등 전체경로로 설정해 주어야 하는데&lt;br /&gt;sendmail 이 실행하는 smrsh 라는 것이 sh 보다 엄격해서 에러가 나버린다.&lt;br /&gt;&lt;br /&gt;이것은 /etc/smrsh 아래에 /usr/bin/php 심볼링 링크를 생성하면서 문제를 회피할 수 있다&lt;br /&gt;&lt;br /&gt;7. $ ln -s /usr/bin/php /etc/smrsh/php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;php소스 컴파일을 하였다면 예를 들어 /usr/local/src/php가 루트 폴더일때 &lt;br /&gt;/usr/local/src/php/bin/php로 설정해 주면 이상없이 동작한다&lt;br /&gt;&lt;br /&gt;debug : 서버에서 메일전송 및 php 연동 테스트 하는 방법 (echo 이용)&lt;br /&gt;&lt;br /&gt;echo -e "From: sns-ktai@sns.thenamed.net\nTo: sns-ktai@sns.thenamed.net\n\nThis is TEST." &lt;br /&gt;&lt;br /&gt;/usr/bin/php -d safe_mode=off /html/webroot/thenamed/bin/mail.php&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-5083334585252008307?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/5083334585252008307/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/openpne-sendmail.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5083334585252008307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5083334585252008307'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/openpne-sendmail.html' title='OpenPNE에서 SendMail 설정하는 방법 (휴대폰에서 파일 업로드)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-5582689388982528826</id><published>2010-02-22T07:38:00.001-08:00</published><updated>2010-03-08T01:57:53.511-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>mysql default-character-set 설정하기 (UTF8)</title><content type='html'>목표 환경은 DB를 utf8로 설정하는것임&lt;br /&gt;기본적으로 table 속성은 DataBase 설정을 따라가는데&lt;br /&gt;입력 데이터가 깨지면 아래 3번의 조치를 취한다. (AIX이런 경우를 봤다.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;0. 데이터를 콘솔에서 밀어넣을때는 콘솔 환경이 utf8이어야 함&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# export LC_ALL=KO_KR.UTF-8&lt;br /&gt;# export LANG=KO_KR.UTF-8&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. MySQL 접속 시 status명령으로 문자셋 확인&lt;br /&gt;utf8이 아닐 때 설정하는 방식임&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; status;&lt;br /&gt;Server characterset: utf8&lt;br /&gt;Db characterset: utf8&lt;br /&gt;Client characterset: utf8&lt;br /&gt;Conn. characterset: utf8&lt;br /&gt;&lt;br /&gt;2. my.cnf 환경설정&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[mysqld]&lt;br /&gt;default-character-set=utf8&lt;br /&gt;init_connect=set collation_connection=utf8_general_ciex&lt;br /&gt;init_connect=set names utf8&lt;br /&gt;character-set-server=utf8&lt;br /&gt;collation-server=utf8_general_ci&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[mysqldump]&lt;br /&gt;default-character-set=utf8&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[mysql]&lt;br /&gt;default-character-set=utf8&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. table 생성시 DEFAULT CHARSET설정&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE `TABLE_NAME` (&lt;br /&gt;`seq_user` int(10) unsigned NOT NULL auto_increment,&lt;br /&gt;`userid` varchar(30) NOT NULL default '',&lt;br /&gt;PRIMARY KEY (`seq_user`)&lt;br /&gt;) ENGINE=MyISAM DEFAULT CHARSET=utf8;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-5582689388982528826?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/5582689388982528826/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/mysql-default-character-set-utf8.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5582689388982528826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5582689388982528826'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/mysql-default-character-set-utf8.html' title='mysql default-character-set 설정하기 (UTF8)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-7729856304643915512</id><published>2010-02-20T22:29:00.000-08:00</published><updated>2010-02-20T22:29:14.908-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='sendmail'/><title type='text'>[sendmail] sendmail + dovecot 리눅스 sendmail</title><content type='html'>센드메일의 설정사항&lt;br /&gt;&lt;br /&gt;[sendmail] sendmail + dovecot &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# yum install -y sendmail&lt;br /&gt;# yum install -y sendmail-cf&lt;br /&gt;# yum install -y mailx cyrus-imap&lt;br /&gt;(설치)&lt;br /&gt;&lt;br /&gt;# cd /etc/mail&lt;br /&gt;&lt;br /&gt;# cp sendmail.mc sendmail.mc.default&lt;br /&gt;# cp sendmail.cf sendmail.cf.default&lt;br /&gt;(sendmail.mc &gt; sendmail.mc_default 복사&lt;br /&gt;sendmail.cf &gt; sendmail.cf_default 변경)&lt;br /&gt;&lt;br /&gt;# vi sendmail.mc&lt;br /&gt;(라인 52, 53 수정)&lt;br /&gt;:52 / 53&lt;br /&gt;dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl&lt;br /&gt;dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl&lt;br /&gt;&lt;br /&gt;&gt;&gt;&lt;br /&gt;&lt;br /&gt;TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl&lt;br /&gt;define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl&lt;br /&gt;&lt;br /&gt;(라인 116 수정)&lt;br /&gt;:116&lt;br /&gt;DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl&lt;br /&gt;&lt;br /&gt;(저장)&lt;br /&gt;:wq!&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;#vi sendmail.cf&lt;br /&gt;(라인 95 수정)&lt;br /&gt;:95&lt;br /&gt;#Dj$w.Foo.COM&lt;br /&gt;&gt;&gt;&gt;&lt;br /&gt;Dj도메인 주소&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#vi access&lt;br /&gt;(라인 추가)&lt;br /&gt;connect:도메인주소  relay (추가)&lt;br /&gt;&lt;br /&gt;#vi local-host-names&lt;br /&gt;(내용 추가)&lt;br /&gt;도메인 주소&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#service sendmail restart (메일 서비스 리스타트)&lt;br /&gt;&lt;br /&gt;# telnet localhost 25&lt;br /&gt;(메일 보낼때 사용되는 포트 확인)&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;Connected to localhost.localdomain (127.0.0.1).&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;220 nanuminet.com ESMTP Sendmail 8.13.8/8.13.8; Wed, 6 Jan 2010 11:03:00 +0900&lt;br /&gt;quit&lt;br /&gt;221 2.0.0 gntv.or.kr closing connection&lt;br /&gt;Connection closed by foreign host.&lt;br /&gt;&lt;br /&gt;### 외부에서 25번 포트 열리는 지 확인(cmd 이용)&lt;br /&gt;    (참고 : iptables 에서 해당 포트 개방)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;=======================dovecot 설정(받는 메일)========================================&lt;br /&gt;&lt;br /&gt;#yum install dovecot&lt;br /&gt;&lt;br /&gt;#vi /etc/dovecot.conf&lt;br /&gt;  :21&lt;br /&gt;  protocols = imap imaps pop3 pop3s &lt;br /&gt;  &gt;&gt;&gt;&lt;br /&gt;  protocols = imap pop3&lt;br /&gt;&lt;br /&gt;  :39&lt;br /&gt;   #listen = [::]&lt;br /&gt;   &gt;&gt;&gt;&lt;br /&gt;   listen = *&lt;br /&gt;&lt;br /&gt;  :85&lt;br /&gt;   #ssl_disable = no&lt;br /&gt;   &gt;&gt;&gt;&lt;br /&gt;   ssl_disable = yes&lt;br /&gt;&lt;br /&gt;  :141&lt;br /&gt;   #login_user = dovecot&lt;br /&gt;   &gt;&gt;&gt;&lt;br /&gt;   login_user = dovecot&lt;br /&gt;&lt;br /&gt;  :509&lt;br /&gt;   #login_executable = /usr/libexec/dovecot/imap-login&lt;br /&gt;   &gt;&gt;&gt;&lt;br /&gt;   login_executable = /usr/libexec/dovecot/imap-login&lt;br /&gt;&lt;br /&gt;  :574&lt;br /&gt;   #login_executable = /usr/libexec/dovecot/imap-login&lt;br /&gt;   &gt;&gt;&gt;&lt;br /&gt;   login_executable = /usr/libexec/dovecot/imap-login&lt;br /&gt;&lt;br /&gt;  :680&lt;br /&gt;   #auth_executable = /usr/libexec/dovecot/dovecot-auth&lt;br /&gt;   &gt;&gt;&gt;&lt;br /&gt;   auth_executable = /usr/libexec/dovecot/dovecot-auth&lt;br /&gt;&lt;br /&gt;  :828&lt;br /&gt;   #args = dovecot&lt;br /&gt;   &gt;&gt;&gt;&lt;br /&gt;   args = doveco&lt;br /&gt;(대부분 주석 제거 작업임)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;### /etc/pam.d &gt; dovecot 파일 확인(폴더 내용 확인- 대부분은 &lt;br /&gt;                         정상적으로 설치 되므로 캔슬 해도 무방함)&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;#service dovecot start&lt;br /&gt;&lt;br /&gt;### 방화벽 110 / 143 포트 열기&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;서버 리스타트 시에도 자동 실행 되기 위해&lt;br /&gt;&lt;br /&gt;# chkconfig sendmail on&lt;br /&gt;# chkconfig dovecot on&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;** 여기서 일반적으로 리눅스 서버의 사용자 계정을 만들고 아웃룩에 그 계정으로 설정을 하면&lt;br /&gt;    아웃룩을 통한 메일 주고 받기도 가능하다.&lt;br /&gt;&lt;br /&gt;설치 부분에 관해서는 아래 내용을 참고하면 더 정확할 것이다 &lt;br /&gt;하지만 설정 부분은 크게 자세하지 않다&lt;br /&gt;http://mcpicdtl.blogspot.com/2010/02/centos-5x-sendmail-pop3-imap.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-7729856304643915512?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/7729856304643915512/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/sendmail-sendmail-dovecot-sendmail.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/7729856304643915512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/7729856304643915512'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/sendmail-sendmail-dovecot-sendmail.html' title='[sendmail] sendmail + dovecot 리눅스 sendmail'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-6282330596577660589</id><published>2010-02-20T07:36:00.000-08:00</published><updated>2010-02-20T08:31:59.218-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='sendmail'/><title type='text'>CentOS 5.X sendmail, pop3, imap 설치 및 설정</title><content type='html'>1. sendmail 설정 (센트OS 5.3기준)&lt;br /&gt;- 먼저 &lt;b&gt;rpm -qa |grep sendmail &lt;/b&gt;명령으로 sendmail이 설치되어 있는지 확인, &lt;br /&gt;- 설치할 팩키지 -&gt; &lt;b&gt;yum install sendmail-cf-8.13.8-2.el5&lt;br /&gt;&lt;/b&gt;- Pop3를 사용할려면 imap 팩키지가 설치되어 있어야 함(dovecot) -&gt; 기본 imap에 비해 보안향상&lt;br /&gt;- &lt;b&gt;yum install dovecot-1.0.7-7.el5.i386&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;2. dovecot 설정&lt;br /&gt;**&lt;b&gt;/etc/dovecot.conf&lt;/b&gt; 화일 변경&lt;br /&gt;&lt;br /&gt;&lt;b&gt;20라인 protocal = pop3 pop3s imap imaps 주석제거&lt;br /&gt;39라인 listen = [::] 주석제거&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;[test]# &lt;b&gt;service dovecot start&lt;/b&gt;&lt;br /&gt;Dovecot Imap (을)를 시작 중:                               [  OK  ]&lt;br /&gt;[test]# &lt;b&gt;telnet localhost 110 &lt;/b&gt;=&gt; 110번 pop3 접속확인&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;Connected to localhost.localdomain (127.0.0.1).&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;+OK Dovecot ready.&lt;br /&gt;&lt;br /&gt;3. sendmail 설정파일 위치 &lt;br /&gt;*smtp인증기능 추가위해 &lt;b&gt;/etc/mail/sendmail.mc &lt;/b&gt;52,53라인 주석제거 확인 후&lt;br /&gt;TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl&lt;br /&gt;define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;m4 /etc/mail/sendmail.mc &gt; /etc/mail/sendmail.cf &lt;/b&gt;-&gt;바뀐것을 적용한다.&lt;br /&gt;&lt;br /&gt;*적용한후 &lt;br /&gt;- /etc/mail/sendmail.cf : 센드메일의 가장 기본적인 설치파일 -&gt; 265라인에 addr 제거&lt;br /&gt;(O DaemonPortOptions=Port=smtp, Name=MTA 수정후임)&lt;br /&gt;- 89라인 Cwlocalhost =&gt; 주석처리&lt;br /&gt;- /etc/mail/access : 릴레이 허용파일,기본적으로 로컬만 허용, 허용할 IP,domain추가 한다.&lt;br /&gt;*엑세스 파일 교체되면 makemap hash /etc/mail/access &lt; /etc/mail/access 실행- &lt;b&gt;/etc/mail/local-host-names&lt;/b&gt; : 메일을 수신할 호스트이름 결정 (a.co.kr or mail.a.co.kr)&lt;br /&gt;&lt;br /&gt;* 인증을 위한  SASL 라이브러리가 설치되어 있어야 함 &lt;br /&gt;cyrus-sasl-md5-2.1.19-5.EL4&lt;br /&gt;cyrus-sasl-2.1.19-5.EL4&lt;br /&gt;cyrus-sasl-plain-2.1.19-5.EL4&lt;br /&gt;cyrus-sasl-devel-2.1.19-5.EL4&lt;br /&gt;[root@test]# service saslauthd restart 실행&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. sendmail 데몬 시작 / 확인&lt;br /&gt;- &lt;b&gt;service sendmail start &lt;/b&gt;또는 init/sendmail start&lt;br /&gt;- 마지막으로 telnet localhost 25 로 접속해서 아래와 같은 화면이 나오면 정상적으로 SMTP데몬이 돌고 있다.&lt;br /&gt;&lt;br /&gt;* 인증확인&lt;br /&gt;[test]# &lt;b&gt;telnet localhost 25&lt;/b&gt;&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;Connected to localhost.localdomain (127.0.0.1).&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;220 test ESMTP Sendmail 8.13.8/8.13.8; Sun, 26 Jul 2009 10:03:01 +0900&lt;br /&gt;&lt;b&gt;ehlo localhost&lt;/b&gt;&lt;br /&gt;250-test Hello hong [127.0.0.1], pleased to meet you&lt;br /&gt;250-ENHANCEDSTATUSCODES&lt;br /&gt;250-PIPELINING&lt;br /&gt;250-8BITMIME&lt;br /&gt;250-SIZE&lt;br /&gt;250-DSN&lt;br /&gt;250-ETRN&lt;br /&gt;250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN&lt;br /&gt;250-DELIVERBY&lt;br /&gt;250 HELP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-6282330596577660589?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/6282330596577660589/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/centos-5x-sendmail-pop3-imap.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6282330596577660589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6282330596577660589'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/centos-5x-sendmail-pop3-imap.html' title='CentOS 5.X sendmail, pop3, imap 설치 및 설정'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-1945825436300963622</id><published>2010-02-18T18:06:00.000-08:00</published><updated>2010-02-18T18:06:41.874-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>centOS 5 네임서버 설치 및 운영 (bind server, name server, DNS)</title><content type='html'>centOS 5.2 NameServer 설치 및 운영&lt;br /&gt;1. BIND 설치&lt;br /&gt;환경 파일 경로&lt;br /&gt;2. 기본 환경 설정&lt;br /&gt;(1) named.conf – options&lt;br /&gt;(2) named.conf – logging&lt;br /&gt;(3) named.conf – view&lt;br /&gt;(4) named.conf – int. view&lt;br /&gt;(5) named.conf – ext. view&lt;br /&gt;3. 존 정보(internal/external) 설정&lt;br /&gt;(1) 존 정보(internal) 설정&lt;br /&gt;(2) 존 정보(external) 설정&lt;br /&gt;(3) RNDC (Name Server Control Utility)&lt;br /&gt;4. DNS 운영 명령어&lt;br /&gt;(1) 기본 명령어&lt;br /&gt;(2) 도메인 존 설정 정보 확인&lt;br /&gt;5. BIND 보안설정&lt;br /&gt;(1) TSIG (Transaction Signature)&lt;br /&gt;TSIG Key 생성&lt;br /&gt;(2) 기타 보안 설정 &lt;br /&gt;&lt;br /&gt;•최종 수정일 : 2008년 11월 3일&lt;br /&gt;1. BIND 설치&lt;br /&gt;•설치 환경 : CentOS 5.2 (http://www.centos.org/)&lt;br /&gt;•설치 프로그램 : ISC BIND (http://www.isc.org/) &lt;br /&gt;◦버전 : BIND 9.3.4-P1&lt;br /&gt;•설치 방법 (yum 자동 설치 권장)‏ &lt;br /&gt;◦Bind 관련 모든 패키지 설치&lt;br /&gt;# yum install –y bind-*&lt;br /&gt;# yum install –y bind bind-utils bind-chroot bind-libs bind-devel bind-libbind-devel bind-sdb&lt;br /&gt;•기본으로 chroot 환경으로 설치됨 &lt;br /&gt;◦“/var/named/chroot/” 디렉토리를 “/” 로 인식&lt;br /&gt;◦chroot 상위 디렉토리에 대한 허가권을 가질 수 없음&lt;br /&gt;◦설정 파일은 수동으로 설정해야 함&lt;br /&gt;◦제공되는 샘플 설정 파일 사용 : /usr/share/doc/bind-9.3.4/sample/&lt;br /&gt;환경 파일 경로&lt;br /&gt;•환경 파일 : /var/named/chroot/etc/&lt;br /&gt;•존 정보 파일 : /var/named/chroot/var/named/&lt;br /&gt;•샘플 파일 경로 &lt;br /&gt;◦/usr/share/doc/bind-9.3.4/sample/etc/&lt;br /&gt;◦/usr/share/doc/bind-9.3.4/sample/var/named&lt;br /&gt;•모든 샘플 파일을 기본 경로로 복사&lt;br /&gt;cp -rf /usr/share/doc/bind-9.3.4/sample/etc/ /var/named/chroot/&lt;br /&gt;cp -rf /usr/share/doc/bind-9.3.4/sample/var/named/ /var/named/chroot/var/&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;2. 기본 환경 설정&lt;br /&gt;•Options&lt;br /&gt;•View (internal)‏&lt;br /&gt;•View (external)‏&lt;br /&gt;•Key&lt;br /&gt;(1) named.conf – options&lt;br /&gt;•기본 설정 &lt;br /&gt;◦recursive-clients &lt;br /&gt;■DNS 질의 처리 가능 최대 클라이언트 설정 값&lt;br /&gt;■Cache DNS 설정 시 가용 메모리 용량에 따라 상향 조정 필요&lt;br /&gt;■기본값 : 1000, 클라이언트 당 20kb - 총 19.5Mb&lt;br /&gt;options&lt;br /&gt;{&lt;br /&gt;   directory "/var/named“; // Zone 파일 기본 디렉토리&lt;br /&gt;   dump-file "data/cache_dump.db"; // Dump 파일 생성 경로&lt;br /&gt;   statistics-file "data/named_stats.txt"; // 통계 파일 생성 경로&lt;br /&gt;   memstatistics-file "data/named_mem_stats.txt"; // 메모리 사용 통계&lt;br /&gt;   recursive-clients 10000;&lt;br /&gt;};&lt;br /&gt;(2) named.conf – logging&lt;br /&gt;•기본 로그 옵션 설정&lt;br /&gt;logging&lt;br /&gt;{&lt;br /&gt;channel default_debug {&lt;br /&gt;                file "data/named.run";&lt;br /&gt;                severity dynamic;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;category default { default_syslog; default_debug; }; // 기본 설정&lt;br /&gt;category unmatched { null; }; // 기본 설정 (로그를 남기지 않음)&lt;br /&gt;};&lt;br /&gt;(3) named.conf – view&lt;br /&gt;•View 설정 &lt;br /&gt;◦Cache DNS 전용 서버는 localhost_resolver view만 설정&lt;br /&gt;◦내부 네트워크 클라이언트 전용 internal과 외부 클라이언트 external 로 구분 가능&lt;br /&gt;view "localhost_resolver"&lt;br /&gt;{&lt;br /&gt;    match-clients         { localhost; };&lt;br /&gt;    match-destinations    { localhost; };&lt;br /&gt;    recursion yes;&lt;br /&gt;    include "/etc/named.root.hints"; // 루트 서버 정보 파일&lt;br /&gt;    include "/etc/named.rfc1912.zones"; // RFC1912 권장 localhost 존 정보&lt;br /&gt;};&lt;br /&gt;(4) named.conf – int. view&lt;br /&gt;•내부 네트워크 클라이언트 전용 View&lt;br /&gt;view "internal"&lt;br /&gt;{&lt;br /&gt;    match-clients        { localnets; };&lt;br /&gt;    match-destinations    { localnets; };&lt;br /&gt;    recursion yes; // 내부 네트워크 클라이언트  recursive 질의 허용&lt;br /&gt;    include "/etc/named.root.hints";&lt;br /&gt;&lt;br /&gt;    zone "cslab.kr" { &lt;br /&gt;        type master;&lt;br /&gt;        file “cslab.kr.internal.zone.db";&lt;br /&gt;    };&lt;br /&gt;};&lt;br /&gt;(5) named.conf – ext. view&lt;br /&gt;•외부 네트워크 클라이언트 전용 View&lt;br /&gt;view    "external"&lt;br /&gt;{&lt;br /&gt;    match-clients        { any; };&lt;br /&gt;    match-destinations    { any; };&lt;br /&gt;    recursion no;  // 외부 네트워크 클라이언트  recursive 질의 금지&lt;br /&gt;    include "/etc/named.root.hints";&lt;br /&gt;&lt;br /&gt;    zone “cslab.kr" { &lt;br /&gt;        type master;&lt;br /&gt;        file “cslab.kr.external.zone.db";&lt;br /&gt;    };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;3. 존 정보(internal/external) 설정&lt;br /&gt;•SOA (Start Of Authority) 필드 정보 &lt;br /&gt;◦Serial : 1 ~ 24,294,967,295(10자리) YYYYMMDDNN 권장&lt;br /&gt;◦Refresh : Slave의 업데이트 여부 검사 간격&lt;br /&gt;◦Retry – Slave의 업데이트 여부 검사 실패 시 재시도 간격&lt;br /&gt;◦Expiry – Slave가 Master 서버 접속을 실패하면 존 정보 파기&lt;br /&gt;◦Negative TTL - 존재하지 않는 호스트에 대한 존 정보 보관 기간&lt;br /&gt;(1) 존 정보(internal) 설정&lt;br /&gt;•/etc/named/chroot/var/named/cslab.kr.internal.zone.db&lt;br /&gt;$TTL    86400&lt;br /&gt;@        IN SOA    ns1.cslab.kr domain.cslab.kr (&lt;br /&gt;    2008102601    ; serial - 1 ~ 24,294,967,295(10자리) YYYYMMDDNN&lt;br /&gt;    3H        ; refresh – Slave의 업데이트 여부 검사 간격&lt;br /&gt;    15M        ; retry – Slave의 업데이트 여부 검사 실패 시 재시도 간격&lt;br /&gt;    1W        ; expiry – Slave가 Master 서버 접속을 실패하면 존 정보 파기&lt;br /&gt;    1D )        ; neg. TTL - 존재하지 않는 호스트에 대한 존 정보 보관 기간&lt;br /&gt;        IN    NS    ns1.cslab.kr&lt;br /&gt;        IN    NS    ns2.cslab.kr&lt;br /&gt;        IN    A    127.0.0.1&lt;br /&gt;www    IN    A    127.0.0.1&lt;br /&gt;mail    IN    A    127.0.0.1&lt;br /&gt;mysql    IN    A    192.168.0.2  // 내부 네트워크 전용&lt;br /&gt;oracle    IN    A    192.168.0.3  // 내부 네트워크 전용&lt;br /&gt;(2) 존 정보(external) 설정&lt;br /&gt;•/etc/named/chroot/var/named/cslab.kr.external.zone.db&lt;br /&gt;$TTL    86400&lt;br /&gt;@        IN SOA    ns1.cslab.kr domain.cslab.kr (&lt;br /&gt;    2008102601    ; serial - 1 ~ 24,294,967,295(10자리) YYYYMMDDNN    &lt;br /&gt;    3H        ; refresh – Slave의 업데이트 여부 검사 간격&lt;br /&gt;    15M        ; retry – Slave의 업데이트 여부 검사 실패 시 재시도 간격&lt;br /&gt;    1W        ; expiry – Slave가 Master 서버 접속을 실패하면 존 정보 파기&lt;br /&gt;    1D )        ; neg. TTL - 존재하지 않는 호스트에 대한 존 정보 보관 기간&lt;br /&gt;        IN    NS    ns1.cslab.kr&lt;br /&gt;        IN    NS    ns2.cslab.kr&lt;br /&gt;        IN    A    127.0.0.1&lt;br /&gt;www    IN    A    127.0.0.1&lt;br /&gt;mail    IN    A    127.0.0.1&lt;br /&gt;        IN    MX    10    mail.cslab.kr&lt;br /&gt;        IN    TXT    “v=spf1 a mx ip4:127.0.0.1 ~all”&lt;br /&gt;(3) RNDC (Name Server Control Utility)&lt;br /&gt;•rndc 명령을 통해 DNS 제어가 가능하며, 기본적으로 953번 포트를 사용&lt;br /&gt;•DNS로 제어 메시지를 보내려면 인증 암호키가 필요 &lt;br /&gt;◦rndc-confgen 을 실행하여, 인증 암호키 및 환경 파일 생성&lt;br /&gt;◦/var/named/chroot/etc/rndc.conf 을 생성 후 내용 복사&lt;br /&gt;# /usr/sbin/rndc-confgen&lt;br /&gt;&lt;br /&gt;key "rndckey" {&lt;br /&gt;        algorithm hmac-md5;&lt;br /&gt;        secret "xxxxxxxxxxxx";&lt;br /&gt;};&lt;br /&gt;options {&lt;br /&gt;        default-key "rndckey";&lt;br /&gt;        default-server 127.0.0.1;&lt;br /&gt;        default-port 953;&lt;br /&gt;};&lt;br /&gt;•named.conf 파일에 rndc 설정 추가&lt;br /&gt;key "rndckey" {&lt;br /&gt;    algorithm hmac-md5;&lt;br /&gt;    secret “xxxxxxxxxxxx ";&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;controls {&lt;br /&gt;    inet 127.0.0.1 port 953&lt;br /&gt;    allow { 127.0.0.1; } keys { "rndckey"; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;4. DNS 운영 명령어&lt;br /&gt;(1) 기본 명령어&lt;br /&gt;•설정 파일 이상유무 확인&lt;br /&gt;# named-checkconf named.conf&lt;br /&gt;•서비스 시작&lt;br /&gt;# service named start&lt;br /&gt;•서비스 재시작&lt;br /&gt;# service named restart&lt;br /&gt;•설정 변경 사항 반영&lt;br /&gt;# service named reload&lt;br /&gt;•서비스 종료&lt;br /&gt;# service named stop&lt;br /&gt;•Bind 버전 확인&lt;br /&gt;# named –v&lt;br /&gt;•BIND 로그 모니터링&lt;br /&gt;# tail -f /var/log/messages&lt;br /&gt;(2) 도메인 존 설정 정보 확인&lt;br /&gt;•.kr 도메인 확인&lt;br /&gt;# dig @g.dns.kr. cslab.kr any&lt;br /&gt;•.com/.net 도메인 확인&lt;br /&gt;# dig @a.gtld-servers.net. cslab.net any&lt;br /&gt;•.asia 도메인 확인&lt;br /&gt;# dig @a0.asia.afilias-nst.info. relief.asia any&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;5. BIND 보안설정&lt;br /&gt;(1) TSIG (Transaction Signature)&lt;br /&gt;* TSIG는 shared secret key와 단방향 hash 함수를 이용해 DNS 응답/업데이트 메시지를 인증&lt;br /&gt;* TSIG 설정 시 DNS의 Additional Section에 TSIG 레코드가 추가됨&lt;br /&gt;&lt;br /&gt;TSIG Key 생성&lt;br /&gt;•dnssec-keygen 프로그램으로 키 생성 &lt;br /&gt;◦-a hmac-md5 : 알고리즘 종류&lt;br /&gt;◦-b 128 : 키 길이(128 bit) / 최대값 : 512 bits&lt;br /&gt;◦-n HOST : 키 종류(HOST)&lt;br /&gt;# /usr/sbin/dnssec-keygen –a hmac-md5 –b 128 –n HOST cslab.kr.&lt;br /&gt;•생성 파일 확인 &lt;br /&gt;◦아래 2개의 파일이 생성됨(숫자 157은 DNSSEC 알고리즘(HMAC-MD5) 번호/숫자 XXXXX 키의 지문)&lt;br /&gt;◦K{name}.+157.+{random}.key&lt;br /&gt;Kcslab.kr.+157+XXXXX.key&lt;br /&gt;Kcslab.kr.+157+XXXXX.private&lt;br /&gt;•named.conf 수정&lt;br /&gt;zone “cslab.kr" { &lt;br /&gt;    type master;&lt;br /&gt;    file “cslab.kr.external.zone.db";&lt;br /&gt;    // TSIG Key Based Access Control&lt;br /&gt;    allow-update { key key.cslab.kr.; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;key "key.cslab.kr" {&lt;br /&gt;    algorithm hmac-md5;&lt;br /&gt;    secret "XXXXXXXXXXXXXXXXXXXX";&lt;br /&gt;};&lt;br /&gt;•key 부분은 별도로 /var/named/chroot/etc/dns.keys.conf 로 저장하여, named.conf 에 include 구문으로 삽입 권장&lt;br /&gt;include "/etc/dns.keys.conf";&lt;br /&gt;(2) 기타 보안 설정&lt;br /&gt;•BIND 버전 정보 숨기기&lt;br /&gt;named.conf 설정 추가&lt;br /&gt;&lt;br /&gt;options {    version "DNS";&lt;br /&gt;};&lt;br /&gt;rndc reload 후 dig 명령어로 확인&lt;br /&gt;&lt;br /&gt;# dig version.bind txt chaos&lt;br /&gt;•allow-query : 존 쿼리 제한&lt;br /&gt;•allow-transfer : 존 전송 제한&lt;br /&gt;•allow-update : 존 업데이트 제한&lt;br /&gt;zone “cslab.kr" { &lt;br /&gt;    type master;&lt;br /&gt;    file “cslab.kr.external.zone.db";&lt;br /&gt;    allow-query { 127.0.0.1; 192.168.0.0/24; };&lt;br /&gt;    allow-transfer { 127.0.0.1; 192.168.0.0/24; 164.125.36.31; };&lt;br /&gt;    allow-update { 127.0.0.1; 192.168.0.0/24; 164.125.36.31; };&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;reference : http://bind.cslab.kr/#toc0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-1945825436300963622?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/1945825436300963622/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/centos-5-bind-server-name-server-dns.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1945825436300963622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1945825436300963622'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/centos-5-bind-server-name-server-dns.html' title='centOS 5 네임서버 설치 및 운영 (bind server, name server, DNS)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-5981374090732748751</id><published>2010-02-15T23:48:00.000-08:00</published><updated>2010-02-15T23:51:38.295-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android 소스 빌드시 R.java로 인한 오류</title><content type='html'>외부에서 이미 개발된 Android&amp;nbsp;Source를 취급할 때&lt;br /&gt;&lt;br /&gt;File -&amp;gt; Import -&amp;gt; General - Existing Projects into Workspace 를 선택하고 Next 버튼 클릭&lt;br /&gt;&lt;br /&gt;다음화면에서&amp;nbsp; Select root_directory 라디오박스가 선택된 상황에서 Browse 버튼 클릭&lt;br /&gt;&lt;br /&gt;그리고 나서 불러올 소스 폴더를 선택을 하면 해당 프로젝트가 &lt;br /&gt;Package Explore로 올러오게 된다 (물론 그 전에 WorkSpace에 해당 폴더를 복사해야한다)&lt;br /&gt;&lt;br /&gt;그리고 src 폴더의 소스들을 보게 되면 에러 표시가 많을텐데 &lt;br /&gt;&lt;br /&gt;여기서 의외로 많은 분들이 쉽게 지나치는 부분이 해당 android.jar을 포함시키지 않는 다는 것을 알았다&lt;br /&gt;&lt;br /&gt;그리고 이것 저것 해 보면서 시간을 보내다가 결국 안된다고 포기해 버리는 분들도 있어&lt;br /&gt;간략하게 나마 적는다 &lt;br /&gt;&lt;br /&gt;불러온 프로젝트를 마우스 우클릭하고 난 후 Properties를 클릭한다 &lt;br /&gt;그리고 팝업으로 창이 뜨면 android 라는 왼쪽 메뉴를 선택하고 난 후 &lt;br /&gt;해당 프로젝트의 엔진을 선택하라 &lt;br /&gt;&lt;br /&gt;android 1.1 부터 Goole APIs 2.1 Api 7까지 화면에 보인데 (이글을 적는 시점의 최신 버젼이다)&lt;br /&gt;난 Google APIs를 사용해야 할 프로젝트를 개발할 것이기 때문에 Google APIs 2.1 api 7을 선택하였다 &lt;br /&gt;&lt;br /&gt;그리고 Apply 버튼을 클릭하라 &lt;br /&gt;&lt;br /&gt;혹시 R.java 파일이 프로젝트에서 gen이라는 폴더 이하에 생기면 &lt;br /&gt;src 폴더 하부의 R.java 파일은 그냥 삭제 해도 된다 &lt;br /&gt;&lt;br /&gt;단순한 문제다 &lt;br /&gt;어떤 Android 버젼으로 개발할지 지정해 주지 않으면 &lt;br /&gt;모든 R.java 그리고 모든 Import 항목이 에러가 발생하게 된다. &lt;br /&gt;이것만 해 주면 문제 없을 것이다.&lt;br /&gt;&lt;br /&gt;PS. 이래도 에러가 해결 되지 않는다면 특별히 Import해야 하는 jar 항목이 더 있을수도 있고&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 그것도 아니라면 위 메뉴항목 중 Project -&amp;gt; Build Automatically를 선택하지 않았을 수도 있다&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Build Automatically를 선택하지 않았다면 Build Project를 매번 열심히 눌러주면 된다&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-5981374090732748751?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/5981374090732748751/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/android-rjava.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5981374090732748751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5981374090732748751'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/android-rjava.html' title='Android 소스 빌드시 R.java로 인한 오류'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-4169554885351342267</id><published>2010-02-15T22:08:00.000-08:00</published><updated>2010-02-15T22:08:41.082-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenPNE'/><title type='text'>OpenPNE o_login slavepne 프로세스 분석 by Vins</title><content type='html'>OpenPNE 로그인 구성 (심포니 프레임워크 설명 배제)&lt;br /&gt;&lt;br /&gt;1. 메인화면에서 아이디/패스 입력&lt;br /&gt;2. OpenPNE/webapp/modules/pc/do/o_login.php 의 do_o_login class의 execute 실행&lt;br /&gt;3. get_auth_config() (/webapp/lib/util/util.php) 호출하며 /OpenPNE/config.php에서 설정한 글로벌 변수 인식&lt;br /&gt;4. $auth = new OpenPNE_Auth($config) 호출 (webapp/lib/OpenPNE/Auth.php)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;/OpenPNE/config.php에서 설정한 정보 직렬화&lt;/li&gt;&lt;li&gt;/OpenPNE/lib/include/Auth.php 객체 호출 .. new Auth(....);&lt;/li&gt;&lt;/ul&gt;5. $auth-&amp;gt;logout(); 현재 남아 있을지도 모르는 세션 종료&lt;br /&gt;6. LOGIN_CHECK_ENABLE (세션 유효기간 체크 로직 - 설명 패스)&lt;br /&gt;7. $auth-&amp;gt;login($requests['is_save']) 입력 받은 정보 로그인 실행&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;$this-&amp;gt;auth =&amp;amp; $this-&amp;gt;factory(true);&lt;/li&gt;&lt;li&gt;factory 내부에서 $auth = new Auth($this-&amp;gt;storage, $this-&amp;gt;options, '', false); 실행&lt;/li&gt;&lt;li&gt;/OpenPNE/lib/include/Auth.php의 Auth Class는 1,2,3,4에 걸친 입력을 직렬화하여 하나의 클래스에 저장&lt;/li&gt;&lt;li&gt;이후 1에서 입력 받은 아이디를 소문자로 치환한 후 암호화 실행&lt;/li&gt;&lt;li&gt;$this-&amp;gt;auth-&amp;gt;start() 실행 (/OpenPNE/lib/include/Auth.php)&lt;/li&gt;&lt;li&gt;start()메서드에서는 유니크세션키를 발생시키고 assignDate() 실행&lt;/li&gt;&lt;li&gt;assignDate()에서 유저로 부터 입력 받은 ID/PW의 get_magic_quotes_gpc 후 stripslashse 실행&lt;/li&gt;&lt;li&gt;start()메서드에서 다시 login() 실행&lt;/li&gt;&lt;li&gt;login()메서드에서 Auth_Container_DB() 객체의 fetchDate(userID, userPW, $userChap) 실행&lt;/li&gt;&lt;li&gt;Auth_Container_DB class는 /OpenPNE/lib/include/Auth/Container/DB.php에 있음&lt;/li&gt;&lt;li&gt;생성된 Login Query 실행 (내부적으로 imbeded query 생성)&lt;/li&gt;&lt;li&gt;Auth Class에 리턴받은 데이터 각 항목에 세팅&lt;/li&gt;&lt;/ul&gt;8. $auth-&amp;gt;getUsername() 으로 slavepne ID와 c_member 테이블 ID매칭 검색(c_member_secure테이블))&lt;br /&gt;9. 로그인 인증되면 auth.inc에서 각 페이지의 세션 체크 (getUsername()으로 체크)&lt;br /&gt;&lt;br /&gt;pc와 mobile에서 인증절차가 다를 경우라면 추가적으로 다음 프로세스를 실행해야 한다&lt;br /&gt;&lt;br /&gt;10. 만일 config.php에서 db_fields를 사용하여 다른 데이터로 매칭 시키고 싶을 경우 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8, 9번 항목에서 사용된 $auth-&amp;gt;getUsername() 이 아니라 다른 메서드를 생성해야함&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PC에서와 MOBILE에서 로그인 아이디가 다른 웹 사이트를 작업하고 있는 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 프로젝트라면 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 선략....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'usernamecol' =&amp;gt; 'ktaiID',&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'passwordcol' =&amp;gt; 'ktaiPW',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'db_fields' =&amp;gt; array('cpid'),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'cryptType' =&amp;gt; 'md5',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 후략 .&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db_fields에 세팅된 값들을 Select usernamecol, passwordcol, db_fields[] from slaveAuthInfo ....후략&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 세팅되므로 OpenPNE_Auth에서 Auth Class에 getSessionName을 가져올수 있다록 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 메서드를 하나 더 생성해야 함&lt;br /&gt;11. 나의 경우엔 /OpenPNE/webapp/lib/OpenPNE/Auth.php 즉 OpenPNE_Auth Class에 다음과 같은 메서드를 생성하였다 &lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;&lt;br /&gt;* Auth에서 session값을 반환하도록 메서드 생성&lt;br /&gt;*&lt;br /&gt;* return string (2010/02/16 by yhan@gungho.jp&lt;br /&gt;*/&lt;br /&gt;function getSessionName($sessname) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return $this-&amp;gt;auth-&amp;gt;getAuthData($sessname);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;이를 $auth-&amp;gt;getUsername() 대신 $auth-&amp;gt;getSessionName("cpid") 로 바꾸어주는데 &lt;br /&gt;바꾸여하 할 부분은 &lt;br /&gt;/OpenPNE/webapp/modules/ktai/auth.inc 에서 한군데와 &lt;br /&gt;/OpenPNE/webapp/modules/ktai/do/o_login.php 에서 한군데 씩 바꾸면 된다 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OpenPNE라고 OpenSource를 지향하고 있지만 클래스 내부를 뜯어볼때 &lt;br /&gt;아직 향후 많은 부분이 보완되어야 할 것이다 &lt;br /&gt;하지만 지금 자체만으로도 한국업체가 일본에서 SNS를 하고 싶다면 &lt;br /&gt;꼭 분석해봐야 할 좋은 재료라고 하고 싶다. &lt;br /&gt;한국에서 당연시 여기었던 블로그등 지금까지 익숙해져 있던것에 근거하여 &lt;br /&gt;기획하고 디자인하고 개발한다면 &lt;br /&gt;대부분 한국계열 SNS가 그래 왔던것 처럼 고전을 면치 못할 것이기 때문이다.&lt;br /&gt;&lt;br /&gt;NHN의 쿠루쿠루가 그랫고 싸이월드 재팬이 망했으며 &lt;br /&gt;한국식 블러그 사이트를 들고와서 성공해 보겠다고 저마다 기업들이 아우성치고 있지만&lt;br /&gt;성공하고 있는 업체가 하나도 없듯이 말이다. &lt;br /&gt;&lt;br /&gt;팁을 하나 귓뜸해 주자면 일본의 최대 SNS사이트인 mixi나 gree 등 유저의 접속자 수의 &lt;br /&gt;90% or 99%가 PC도 아닌 스마트폰도 아닌 조그만 화면의 휴대폰에서 이루어진다는 &lt;br /&gt;사실이다 &lt;br /&gt;일본 의류 쇼핑몰의 경우에도 다르지 않다 휴대폰을 통한 매출이 절대적이기 때문이다.&lt;br /&gt;&lt;br /&gt;혹시 일본에서 활동하고 있는 한국에 SNS 또는 게임 사이트를 운영하는 운영자라면 &lt;br /&gt;꼭 한번 생각해봐야 한다 .&lt;br /&gt;&lt;br /&gt;이제 ceolikeproject 를 그만둘때도 되었다 &lt;br /&gt;기획자라면 한국적인 사고방식에서 떠나 일본유저의 눈에 마출수 있는 기획을 (네이버 그만좀 베겨라..)&lt;br /&gt;디자이너라면 절대 자부심을 가지지마라 한국에서 디자인과 일본의 디자인 그 시작부터가 다르다 .&lt;br /&gt;플래쉬 도배해 놓고 "나 좀 하지!!" 하고 자만하지마라 유저는 진정 플래쉬를 원하지 않는다 &lt;br /&gt;마지막으로 개발자 머리속에서 "주민번호" 부터 지워라 &lt;br /&gt;회원가입시 주민번호가 당연한 유니크 체크라고 생각하는 순간 ...&lt;br /&gt;당신은 우물안에 개구리 ....&lt;br /&gt;&lt;br /&gt;By Vins&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-4169554885351342267?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/4169554885351342267/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/openpne-ologin-slavepne-by-vins.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4169554885351342267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4169554885351342267'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/openpne-ologin-slavepne-by-vins.html' title='OpenPNE o_login slavepne 프로세스 분석 by Vins'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-5794814561622386867</id><published>2010-02-02T18:09:00.000-08:00</published><updated>2010-02-02T18:09:18.487-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>[리눅스 시간설정/CentOS] 현재시간설정</title><content type='html'>[root@test ~]# date&lt;br /&gt;2005. 01. 07. (금) 00:18:16 KST&lt;br /&gt;&lt;br /&gt;[root@test ~]# date -s 2008-06-14&lt;br /&gt;2008. 06. 14. (금) 00:00:00 KST&lt;br /&gt;[root@test ~]# date -s 08:38:40&lt;br /&gt;2008. 06. 14. (금) 08:38:40 KST&lt;br /&gt;&lt;br /&gt;또는 rdate -s "time server ip or domain"&lt;br /&gt;&lt;br /&gt;만일 정기적으로 시간을 설정하고 싶은 경우 &lt;br /&gt;/etc/crontab 에 rdate -s "time server ip or domain"을 정기적으로 &lt;br /&gt;실행하도록 설정한다&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-5794814561622386867?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/5794814561622386867/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/centos.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5794814561622386867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5794814561622386867'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/centos.html' title='[리눅스 시간설정/CentOS] 현재시간설정'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-7496933219503286548</id><published>2010-02-01T22:58:00.000-08:00</published><updated>2010-02-01T22:58:43.670-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>root 계정으로 오라클 로 권한 변경</title><content type='html'>root 계정으로 접속 하였을 경우 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;오라클 로 권한 변경 &lt;br /&gt;~]$ su - oracle  &lt;br /&gt;&lt;br /&gt;오라클 폴더로 이동 &lt;br /&gt;~]$ cd /oracle &lt;br /&gt;&lt;br /&gt;sqlplus 로 노로그인 상태로 접속 &lt;br /&gt;~]$ sqlplus /nolog &lt;br /&gt;&lt;br /&gt;sysdba 접속 &lt;br /&gt;SQL&gt; connect /as sysdba &lt;br /&gt;&lt;br /&gt;중지시키기 &lt;br /&gt;SQL&gt; shutdown abort &lt;br /&gt;&lt;br /&gt;시작 &lt;br /&gt;SQL&gt; startup &lt;br /&gt;&lt;br /&gt;종료 &lt;br /&gt;SQL&gt; exit &lt;br /&gt;&lt;br /&gt;리스너 종료 &lt;br /&gt;~]$ lsnrctl stop &lt;br /&gt;&lt;br /&gt;리스너 재시작 &lt;br /&gt;~]$ lsnrctl start&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-7496933219503286548?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/7496933219503286548/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/root.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/7496933219503286548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/7496933219503286548'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/root.html' title='root 계정으로 오라클 로 권한 변경'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-4538409093723074951</id><published>2010-02-01T22:07:00.001-08:00</published><updated>2010-02-01T22:07:41.674-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>MYSQL 최적화 기법 (best튜닝 기법)</title><content type='html'>MySQL을 위한 하드웨어 최적화 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;큰 테이블(2G가 넘는)이 필요하다면, 알파나 스팍 또는 IA64 등의 64bit 하드웨어를 고려해 보는 게 좋다. MySQL은 내부적으로 64bit 정수를 많이 사용하고 있으므로, 64bit CPU를 사용하면 좀더 나은 퍼포먼스를 기대할 수 있다. &lt;br /&gt;&lt;br /&gt;거대한 데이터베이스를 위한 최적화는 보통 램, 빠른 디스크, CPU 순으로 진행된다. &lt;br /&gt;&lt;br /&gt;더 많은 램은 사용되는 대부분의 key 페이지들을 램에 보관함으로써 빠른 key 갱신을 가능하게 한다. &lt;br /&gt;&lt;br /&gt;안전한 트랜잭션을 사용하지 않거나 큰 디스크를 사용하고 파일 검사를 오랫동안 하는 일을 피하고 싶다면 UPS를 사용하여 전원 오류가 발생한 경우에도 시스템을 안전하게 종료시킬 수 있도록 하는 것도 좋은 생각이다. &lt;br /&gt;&lt;br /&gt;하나의 전용 데이터베이스 서버를 가진 시스템이라면 1G 이더넷을 고려해 볼 필요가 있다. 네트워크 지연은 처리능력만큼 중요하다.(Latency is as important as throughput.) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;디스크 최적화 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;시스템, 프로그램, 임시 파일들을 위한 전용 디스크를 갖춰라. (내용이) 자주 변경되는 경우라면 갱신 기록과 트랜잭션 기록 파일을 별도의 디스크에 배치한다. &lt;br /&gt;&lt;br /&gt;데이터베이스 디스크에 있어서는 빠른 탐색 시간(seek time)이 요건이다. 큰 테이블에서 하나의 레코드를 찾기 위해 소요되는 탐색 횟수는 다음과 같이 추정해 볼 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;log(row_count) / log(index_block_length/3*2/(key_length + data_ptr_length))+1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;예를 들어, 500,000개의 레코드를 가지고 있고 medium int 형 필드로 인덱싱하고 있는 테이블의 경우라면 log(500000) / log(1024/3*2/(3+4))+1 = 4 번의 탐색이 필요하다. 여기서 인덱스는 500,000 * 7 * 3/2 = 5.2M 정도의 크기가 될 것이다. 실제로는 대부분의 블록들이 버퍼에 저장되므로 아마도 1~2번 정도의 탐색이 필요하게 된다. &lt;br /&gt;&lt;br /&gt;쓰기의 경우 새로운 키를 넣을 위치를 찾기 위해 위에서처럼 4번의 탐색이 필요하지만, 통상적으로 인덱스를 갱신하기 위해 2번의 탐색이 더 필요하다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;매우 큰 데이터베이스에 경우, 디스크 탐색 속도에의해 성능이 좌우되는데, 탐색 수는 더 많은 데이터를 얻을 때마다 N log N 씩 증가한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;데이터베이스들과 테이블들을 다른 디스크들에 분할해 넣어라. MySQL에서는 이를 위해 심볼릭 링크를 사용할 수 있다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Striping disks(RAID 0와 같은)는 읽기와 쓰기 양면에서 처리능력을 증가시킨다. &lt;br /&gt;&lt;br /&gt;미러링을 동반하는 Striping disk(RAID 0+1)는 읽기/쓰기 성능을 향상시키고 안전성을 제공한다. 쓰기는 약간 느리다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;임시파일 또는 쉽게 갱신될 수도 있는 데이터에 대해서 미러링이나 RAID(RAID 0는 예외)를 사용하지 않는다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Linux를 사용한다면 부팅할 때 hdparm -m16 -d1 명령을 디스크에 적용하여 다중 섹터 읽기/쓰기와 DMA 사용이 가능하도록 한다. 이는 반응 시간을 5~50%까지 증가시킨다. &lt;br /&gt;&lt;br /&gt;Linux를 사용한다면 디스크를 마운트할 때 async(기본값이다)와 noatime 옵션을 부여하여 마운트한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;일부 특정 응용프로그램의 경우 아주 특수한 테이블을 램디스크에 저장하는 것도 한 방법이 된다. 그러나 보통은 필요 없다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;운영체제 최적화 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;스왑을 제거한다. 메모리 문제가 있다면 시스템이 적은 메모리를 사용하도록 설정하기 보다는 메모리를 증설하는 것이 좋다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;데이터에 대해서 NFS 디스크를 사용하지 않는다. (NFS locking 문제에 봉착할 수 있다.) &lt;br /&gt;&lt;br /&gt;시스템과 SQL 서버를 위해 open file 한계 수치를 증가시킨다. (safe_mysql 스크립트에 ulimit -n #을 추가한다.) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;프로세스와 쓰레드의 개수 제한을 늘려준다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;상대적으로 큰 테이블을 사용할 일이 드물다면, 파일시스템이 파일을 여러 실린더에 분산시켜 저장하지 않도록 설정한다.(솔라리스) &lt;br /&gt;&lt;br /&gt;큰 파일을 지원하는 파일시스템을 사용한다.(솔라리스) &lt;br /&gt;&lt;br /&gt;어떤 파일시스템을 사용하는 것이 좋을지 선택한다. 리눅스의 Reiserfs 는 파일 열기, 읽기, 쓰기에 있어서 (ext2보다) 빠르다. 파일 검사도 단지 수 초 밖에 안 걸린다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;API 선택 &lt;br /&gt;&lt;br /&gt;PERL &lt;br /&gt;&lt;br /&gt;OS 와 데이터베이스들간의 이식성 우수하다. &lt;br /&gt;&lt;br /&gt;빠른 프로토타이핑에 적합하다. &lt;br /&gt;&lt;br /&gt;DBI/DBD 인터페이스를 사용하는 것도 한 방법이다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP &lt;br /&gt;&lt;br /&gt;PERL 보다 익히기 쉬운 언어다. &lt;br /&gt;&lt;br /&gt;PERL 보다 자원을 적게 사용. 때문에 웹서버에 내장시키기에 좋다. &lt;br /&gt;&lt;br /&gt;PHP4로 업그레이드하여 더 나은 속도를 얻는 것도 한 방편이다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C &lt;br /&gt;&lt;br /&gt;MySQL 본래의 인터페이스이다. &lt;br /&gt;&lt;br /&gt;더 빠르고 더 많은 제어가 가능하다. &lt;br /&gt;&lt;br /&gt;저 수준. 때문에 (프로그래머가) 더 많은 일을 해야 한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C++ &lt;br /&gt;&lt;br /&gt;고 수준. 코딩에 더 많은 시간이 필요하다. &lt;br /&gt;&lt;br /&gt;(MySQL C++ API는) 여전히 개발 단계에 있다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ODBC &lt;br /&gt;&lt;br /&gt;윈도우즈와 유닉스에서 동작한다. &lt;br /&gt;&lt;br /&gt;거의 대부분의 다른 SQL 서버로 이식 가능하다. &lt;br /&gt;&lt;br /&gt;느리다. MyODBC는 단순한 pass-through 드라이버이지만 본연의 인터페이스에 비해 19% 정도 느리다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;같은 일을 수행하는 많은 다른 도구들이 있다. 작업을 어렵게 하는 한 가지는 많은 ODBC 드라이버들이 제각기 다른 부분에서 상이한 버그들을 가지고 있다는 점이다. &lt;br /&gt;&lt;br /&gt;문제 발생 소지가 많다. 마이크로소프트는 정기적으로 인터페이스를 변경한다. &lt;br /&gt;&lt;br /&gt;미래가 불확실하다.(마이크로소프트는 ODBC보다 OLE 쪽에 더 많은 비중을 두고 있다.) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;JDBC &lt;br /&gt;&lt;br /&gt;이론적으로 OS, 데이터베이스 간의 이식성이 우수하다. &lt;br /&gt;&lt;br /&gt;(브라우저와 같은)웹 클라이언트 상에서 동작할 수 있다. &lt;br /&gt;&lt;br /&gt;Python + others &lt;br /&gt;&lt;br /&gt;좋을 것이다. 그러나 우리는 사용하지 않는다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;응용프로그램 최적화 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;우선은 문제 해결에 집중하는 것이 필요하다. &lt;br /&gt;&lt;br /&gt;응용프로그램을 제작할 때 다음 중 무엇이 가장 중요한지를 결정하는 것이 필요하다: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;속도 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OS 간의 이식성 &lt;br /&gt;&lt;br /&gt;SQL 서버들 간의 이식성 &lt;br /&gt;&lt;br /&gt;persistent connection을 사용한다. &lt;br /&gt;&lt;br /&gt;응용프로그램 측의 캐싱은 SQL 서버의 부하를 감소시킨다. &lt;br /&gt;&lt;br /&gt;응용프로그램 상에서 쓰이지 않는 컬럼은 쿼리하지 않는다. &lt;br /&gt;&lt;br /&gt;SELECT * FROM table_name... 과 같은 쿼리를 사용하지 않는다. &lt;br /&gt;&lt;br /&gt;응용프로그램의 모든 부분에 대하여 벤치마킹을 시도한다. 그러나 대부분의 노력을 부하의 가장 유력한 요인일 것 같은 부분의 응용프로그램들에 집중하는 것이 좋다. 이를 모듈 단위로 수행하면 발견한 병목구간을 빠른 '더미 모듈'로 대체하고 나서 다음 병목구간을 찾는 일로 넘어가는 식으로 일을 진행할 수 있다. &lt;br /&gt;&lt;br /&gt;일련 작업 중에 많은 변경이 이루어진다면 LOCK TABLES을 이용한다. 예를 들면, 여러 개의 UPDATE 또는 DELETES 문장을 집합적으로 수행하는 경우 등. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이식성이 중요한 응용프로그램이라면 &lt;br /&gt;&lt;br /&gt;Perl DBI/DBD &lt;br /&gt;&lt;br /&gt;ODBC &lt;br /&gt;&lt;br /&gt;JDBC &lt;br /&gt;&lt;br /&gt;Python (또는 범용 SQL 인터페이스를 가진 다른 언어들) 등을 사용한다. &lt;br /&gt;&lt;br /&gt;모든 대상 SQL 서버들이 갖추고 있는, 또는 쉽게 다른 구문으로 모사할 수 있는 SQL 구문만 사용한다. www.mysql.com 의 crash-me 페이지를 보면 도움이 될 것이다. &lt;br /&gt;&lt;br /&gt;다른 OS나 SQL서버들에 없는 기능들을 제공하기 위해 wrapper 프로그램을 제작하여 사용한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;보다 빠른 속도가 요구된다면 &lt;br /&gt;&lt;br /&gt;병목구간(bottleneck)을 (CPU, 디스크, 메모리, SQL 서버, OS, API, 또는 응용프로그램에서) 찾아내서 제거하는 일에 집중한다. &lt;br /&gt;&lt;br /&gt;더 빠른 속도와 유연성을 제공하는 MySQL의 확장기능을 사용한다. &lt;br /&gt;&lt;br /&gt;SQL 서버에 관한 지식을 더 많이 습득하여 문제를 해결하기 위한 가장 빠른 SQL 구문을 사용하고 병목요소를 사전에 제거한다. &lt;br /&gt;&lt;br /&gt;테이블 레이아웃과 쿼리들을 최적화한다. &lt;br /&gt;&lt;br /&gt;select 속도를 증가시키기 위해 replication을 사용한다. &lt;br /&gt;&lt;br /&gt;데이터베이스가 느린 네트워크로 연결되어 있다면, 압축된 클라이언트/서버 프로토콜을 사용한다. &lt;br /&gt;&lt;br /&gt;응용프로그램의 초기 버전이 이식성에 있어서 부실하더라도 걱정할 필요 없다. 문제를 먼저 해결하고 나서 나중에 언제든지 최적화할 수 있다.(Don't be afraid to make the first version of your application not perfectly portable; when you have solved your problem, you can always optimize it later.) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 최적화 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;컴파일러와 컴파일 옵션을 충분히 고려하여 선택한다. &lt;br /&gt;&lt;br /&gt;가장 훌륭한 MySQL 시작 옵션을 찾는다. &lt;br /&gt;&lt;br /&gt;MySQL 매뉴얼을 찾아보고 Paul DuBois 의 MySQL 서적을 읽는다. &lt;br /&gt;&lt;br /&gt;EXPLAIN SELECT, SHOW VARIABLES, SHOW STATUS, SHOW PROCESSLIST 명령을 사용한다. &lt;br /&gt;&lt;br /&gt;쿼리 옵티마이저가 동작하는 방식을 공부해 둔다. &lt;br /&gt;&lt;br /&gt;테이블을 관리한다.(myisamchk, CHECK TABLE, OPTIMIZE TABLE) &lt;br /&gt;&lt;br /&gt;MySQL 확장기능을 사용하여 속도를 증진시킨다. &lt;br /&gt;&lt;br /&gt;특정 함수가 많은 곳에서 자주 사용될 것이라면 MySQL 사용자 정의 함수(UDF)로 직접 제작한다. &lt;br /&gt;&lt;br /&gt;정말 필요한 경우가 아니라면, 테이블 수준 또는 컬럼 수준에서 GRANT 를 사용하지 않는다. &lt;br /&gt;&lt;br /&gt;MySQL 고객 지원 서비스에 비용을 지불하고 문제 해결을 위한 도움을 받는다 :) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL의 컴파일 및 설치 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;자신의 시스템에서 사용 가능한 최상의 컴파일러를 선택함으로 보통 10~30% 정도 성능 향상을 기대할 수 있다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Intel 기반의 리눅스 시스템이라면 MySQL을 pgcc(펜티엄급에 최적화된 버전의 gcc)로 컴파일 한다. 그러나, (컴파일된) 바이너리는 인텔 펜티엄 CPU에서만 동장할 것이다. &lt;br /&gt;&lt;br /&gt;MySQL 매뉴얼에서 권하는 플랫폼 별 최적화 옵션을 사용한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;통상적으로 특정 CPU를 위한 본연의 컴파일러(Sparc을 위한 Sun Workshop과 같은)를 사용하면 gcc 보다 더 나은 성능을 기대할 수 있다. 그러나, 항상 그런 것은 아니다. &lt;br /&gt;&lt;br /&gt;MySQL을 사용하려는 한 가지 문자셋만 지정하여 컴파일한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysqld 실행파일을 정적으로 컴파일(--with-mysqld-ldflags=-all-static)하고 strip sql/mysqld 명령으로 최종 실행파일에서 디버그 코드를 제거한다. &lt;br /&gt;&lt;br /&gt;MySQL이 C++ 예외처리를 하지 않으면, 즉 예외처리 지원 옵션을 빼고 컴파일하면 성능이 크게 향상된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;운영체제가 네이티브 쓰레드(native thread)를 지원한다면 mit-pthreads 라이브러리 대신 네이티브 쓰레드를 사용하도록 한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;생성된 실행파일을 MySQL 벤치마크 테스트로 테스트해 본다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;유지 보수 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;가능하면 정기적으로 OPTIMIZE table 을 실행한다. 이는 특히 자주 갱신되는 가변크기 레코드들에 대해 중요하다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;정기적으로 myisamchk -a 명령을 사용하여 테이블들의 key 분산 상태를 갱신한다. 이 작업을 수행하기 전에 반드시 MySQL을 셧다운해야 한다는 점을 잊지 않는다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;파일들이 조각난 상태라면 다른 디스크로 모두 복사하고 기존의 디스크를 깨끗이 한 후 다시 파일을 옮기는 일도 시도해 볼만한 가치가 있다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;문제가 발생한다면, 테이블을 myisamchk나 CHECK table 명령으로 검사한다. &lt;br /&gt;&lt;br /&gt;MySQL의 상태를 mysqladmin -i10 processlist extended-status 명령으로 모니터한다. &lt;br /&gt;&lt;br /&gt;MySQL GUI 클라이언트를 사용하면 프로세스 목록과 상태를 다른 윈도우에서 모니터할 수 있다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysqladmin debug 명령을 사용해서 잠금(lock)과 성능에 관한 정보를 얻는다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL 최적화 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;사용하는 것이 좋은 것에만 SQL을 사용하고 그렇지 않은 곳에서는 다른 것을 사용한다. SQL는 다음과 같은 곳에 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WHERE 절에 의존하여 행을 찾는 경우 &lt;br /&gt;&lt;br /&gt;테이블들을 JOIN 할 경우 &lt;br /&gt;&lt;br /&gt;GROUP BY &lt;br /&gt;&lt;br /&gt;ORDER BY &lt;br /&gt;&lt;br /&gt;DISTINCT &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음과 같은 일에는 사용하지 않는다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;데이터(date 와 같은)의 유효성을 검증하는 경우 &lt;br /&gt;&lt;br /&gt;계산기로 사용 &lt;br /&gt;&lt;br /&gt;Tips&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;key를 폭 넓게 사용한다. &lt;br /&gt;&lt;br /&gt;key는 검색에는 좋지만, key 컬럼에 대해 insert 나 update를 수행하는 데는 좋지 않다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;데이터를 제3의 보통 데이터베이스 형식(in the 3rd normal database form)으로 유지하되, 속도를 중시한다면 정보의 중복이나 요약 테이블(summary tables)을 생성하는 일을 기피할 필요는 없다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;큰 테이블에 대해서 GROUP BY를 남용하는 대신 그 테이블에 대한 요약 테이블을 생성하고 이 테이블에 대해 쿼리하는 것이 낫다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE table set count=count+1 where key_column=constant 와 같은 문장은 매우 빠르다! &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;기록 테이블(log tables)에 관한 한, 정기적으로 요약 테이블을 만드는 것이 요약테이블을 그대로 두는 것 보다 나을 것이다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;INSERT에서 디폴트 값(default values)의 잇점을 십분 활용한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SQL 서버들 간의 속도 차이 (단위:초) &lt;br /&gt;&lt;br /&gt;key 이용 2,000,000 행 읽기 NT Linux &lt;br /&gt;&lt;br /&gt;mysql 367 249 &lt;br /&gt;&lt;br /&gt;mysql_odbc 464 &lt;br /&gt;&lt;br /&gt;db2_odbc 1,206 &lt;br /&gt;&lt;br /&gt;imformix_odbc 121,126 &lt;br /&gt;&lt;br /&gt;ms-sql_odbc 1,634 &lt;br /&gt;&lt;br /&gt;oracle_odbc 20,800 &lt;br /&gt;&lt;br /&gt;solid_odbc 877 &lt;br /&gt;&lt;br /&gt;sybase_odbc 17,614 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;350,768 행 삽입 NT Linux &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql 381 206 &lt;br /&gt;&lt;br /&gt;mysql_odbc 619 &lt;br /&gt;&lt;br /&gt;db2_odbc 3,460 &lt;br /&gt;&lt;br /&gt;informix_odbc 2,692 &lt;br /&gt;&lt;br /&gt;ms-sql_odbc 4,012 &lt;br /&gt;&lt;br /&gt;oracle_odbc 11,291 &lt;br /&gt;&lt;br /&gt;solid_odbc 1,801 &lt;br /&gt;&lt;br /&gt;sybase_odbc 4,802 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;위의 테스트는 MySQL의 경우 8M 캐시를 사용하도록 설정한 것이고 다른 데이터베이스들은 설치 기본값을 이용하였다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;중요한 MySQL 기동 옵션들 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;back_log 접속 수가 많다면 변경한다. &lt;br /&gt;&lt;br /&gt;thread_cache_size 접속 수가 많다면 변경한다. &lt;br /&gt;&lt;br /&gt;key_buffer_size 인덱스 페이지를 위한 풀(pool) 크기. 큰 수치를 지정하는 것도 가능하다. &lt;br /&gt;&lt;br /&gt;bdb_cache_size BDB 테이블들에 의해 사용되는 레코드와 키 캐시 크기. &lt;br /&gt;&lt;br /&gt;table_cache 많은 테이블을 가지고 있거나 동시 접속 수가 많다면 변경한다. &lt;br /&gt;&lt;br /&gt;delay_key_write 모든 키 쓰기 동작을 버퍼링할 필요가 있다면 지정한다. &lt;br /&gt;&lt;br /&gt;log_slow_queries 시간이 많이 걸리는 쿼리를 찾을 때 사용한다. &lt;br /&gt;&lt;br /&gt;max_heap_table_size GROUP BY 절에서 사용된다. &lt;br /&gt;&lt;br /&gt;sort_buffer ORDER BY 와 GROUP BY 절에서 사용된다. &lt;br /&gt;&lt;br /&gt;myisam_sort_buffer_size REPAIR TABLE 문에서 사용된다. &lt;br /&gt;&lt;br /&gt;join_buffer_size 키 없이 join 할 때 사용된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;테이블 최적화 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL은 풍부한 상이한 컬럼 유형(type)들의 집합을 가지고 있다. 각 컬럼에 대해 가장 효과적인 유형을 선택하여 사용하는 것이 필요하다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ANALYSE 프로시저는 테이블을 위한 최적의 컬럼 유형을 찾는데 도움이 될 것이다. SELECT * FROM table_name PROCEDURE ANALYSE() &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;널 값을 저장하지 않을 컬럼은 NOT NULL 로 지정한다. 이는 특별히 인덱스 컬럼의 경우 중요하다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ISAM 테이블들을 MyISAM 으로 변경한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;가능하다면, 테이블을 고정된 테이블 형식으로 만드는 것이 좋다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;사용하지 않을 인덱스는 아예 만들지 않는다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL이 인덱스의 접두부(prefix)에 대해서 검색을 수행할 수 있다는 점을 활용한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;INDEX (a, b) 로 되어 있다면, (a)에 대해 인덱싱할 필요는 없다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;길이가 긴 CHAR 형이나 VARCHAR 형이라면 해당 컬럼에 대해 인덱스를 생성하지 않고 그 컬럼의 접두부에 대해서만 인덱스를 생성하면 공간이 절약된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CREATE TABLE table_name (hostname CHAR(255) not null, index(hostname(10))) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;각 테이블을 위한 가장 효과적인 테이블 유형을 사용한다. &lt;br /&gt;&lt;br /&gt;서로 다른 테이블들 중 동일한 정보를 가지는 컬럼들은 같은 유형, 같은 이름을 가지도록 정의한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL이 데이터를 저장하는 방식 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;데이터베이스는 디렉토리로 저장된다. &lt;br /&gt;&lt;br /&gt;테이블은 파일로 저장된다. &lt;br /&gt;&lt;br /&gt;컬럼은 가변 길이나 고정 길이 유형으로 파일 안에 저장된다. BDB 테이블에서 데이터는 페이지에 저장된다. &lt;br /&gt;&lt;br /&gt;메모리 기반의 테이블도 지원된다. &lt;br /&gt;&lt;br /&gt;데이터베이스와 테이블들은 다른 디스크로부터 심볼릭 링크될 수 있다. &lt;br /&gt;&lt;br /&gt;Windows용 MySQL은 .sym 파일을 이용하여 데이터베이스에 대한 내부적인 심볼릭 링크를 지원한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 테이블 유형들 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HEAP 테이블: 고정된 수의 레코드만 가지는 테이블로서 오직 메모리에만 저장되며 HASH 인덱스로 인덱스된다. &lt;br /&gt;&lt;br /&gt;ISAM 테이블: MySQL 3.22에서 사용된 구식 B-tree 테이블 유형이다. &lt;br /&gt;&lt;br /&gt;MyISAM 테이블: ISAM 테이블의 새 버전으로 많은 확장 기능들을 가지고 있다. &lt;br /&gt;&lt;br /&gt;바이너리 호환성 &lt;br /&gt;&lt;br /&gt;NULL 컬럼에 대한 인덱싱 &lt;br /&gt;&lt;br /&gt;가변 크기 테이블의 파편화(fragmentation)가 ISAM 테이블 보다 적음 &lt;br /&gt;&lt;br /&gt;거대 파일 지원 &lt;br /&gt;&lt;br /&gt;인덱스 압축 향상 &lt;br /&gt;&lt;br /&gt;키 통계 향상 &lt;br /&gt;&lt;br /&gt;더 향상되고 빠른 auto_increment 지원 &lt;br /&gt;&lt;br /&gt;Sleepycat의 Berkeley DB(BDB) 테이블: 안전한 트랜잭션 지원(BEGIN WORK / COMMIT &lt;br /&gt;ROLLBACK) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 레코드 유형(ISAM/MyISAM 테이블과 관련하여서만) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL은 모든 컬럼들이 고정 크기 유형이라면 (VARCHAR, BLOB, TEXT 컬럼이 없다면) 테이블을 고정 크기 테이블로 생성한다. 그렇지 않다면, 가변 크기 유형의 테이블로 만든다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;고정 크기 유형은 동적 크기 유형에 비해 속도가 빠르며 안전하다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;동적 크기 레코드 유형은 대개 보다 적은 공간을 사용하지만 테이블의 갱신이 자주 발생한다면 파편화가 가중되기 마련이다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;어떤 경우에는 주 테이블의 속도를 향상시키기 위해 모든 VARCHAR, BLOB, TEXT 컬럼들을 다른 테이블로 옮기는 것도 유용할 때가 있다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;myisampack(ISAM 테이블에서는 pack_isam)을 사용하면 읽기 전용, 압축된 테이블을 만들 수 있다. &lt;br /&gt;&lt;br /&gt;느린 디스크를 사용할 때는 디스크 사용량을 최소화하는 것이 좋은 한 방법이 된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;압축된 테이블은 더 이상 갱신되지 않는 로그 테이블 등에 사용하면 최상이다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 캐시들 (한 번 적재되어 모든 쓰레드가 공유) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;키 캐시: key_buffer_size, 기본값은 8M &lt;br /&gt;&lt;br /&gt;테이블 캐시: table_cache, 기본값은 64 &lt;br /&gt;&lt;br /&gt;쓰레드 캐시: thread_cache_size, 기본값은 0 &lt;br /&gt;&lt;br /&gt;호스트명 캐시: 컴파일할 때 변경 가능, 기본값은 128 &lt;br /&gt;&lt;br /&gt;메모리에 맵핑된 테이블(Memory mapped tables): 현재는 압축된 테이블을 위해서만 사용된다. &lt;br /&gt;&lt;br /&gt;MySQL은 행(raw) 캐시를 가지고 있지 않다. 그러나, 운영체제에게 이 일을 시킬 수 있다!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 버퍼 변수들 (공유되지 않으며 실행 중 적재됨) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sort_buffer: ORDER BY / GROUP BY 절에서 &lt;br /&gt;&lt;br /&gt;record_buffer: 테이블을 스캔할 때 &lt;br /&gt;&lt;br /&gt;join_buffer_size: 키 없이 join을 수행할 때 &lt;br /&gt;&lt;br /&gt;myisam_sort_buffer_size: REPAIR TABLE에서 &lt;br /&gt;&lt;br /&gt;net_buffer_length: SQL 문장을 읽을 때와 결과 값을 버퍼링할 때 &lt;br /&gt;&lt;br /&gt;tmp_table_size: 임시 결과값을 위한 HEAP-table-size &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 테이블 캐시가 동작하는 방식 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MyISAM 테이블의 열려 있는 각각의 인스턴스는 인덱스 파일과 데이터 파일을 사용한다. 만일 어떤 테이블이 두 개의 쓰레드에 의해 사용되거나 같은 쿼리에서 두 번 사용되면, MyISAM이 인덱스 파일은 공유하지만 데이터 파일은 또 하나의 인스턴스를 위해 추가로 열게 된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;캐시 안의 모든 테이블이 사용 중이라면 그 캐시는 일시적으로 테이블 캐시 크기보다 커진다. 이러한 상황이 발생하면, 그 다음 방면된 테이블이 닫히게 된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysqld 변수 Opend_tables를 검사해 보면 테이블 캐시가 너무 작은지 아닌지를 알 수 있다. 이 값이 높으면 테이블 캐시를 늘려줘야 한다! &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 확장들 / 속도 증진 최적화 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;최적화된 테이블 유형을 사용한다.(HEAP, MyISAM, BDB 테이블) &lt;br /&gt;&lt;br /&gt;데이터를 위한 최적의 컬럼을 사용한다. &lt;br /&gt;&lt;br /&gt;가능한 한 고정 크기 레코드를 사용한다. &lt;br /&gt;&lt;br /&gt;다른 잠금 유형(lock types)를 사용한다.(SELECT HIGH_PRIORITY, INSERT LOW_PRIORITY) &lt;br /&gt;&lt;br /&gt;Auto_increment &lt;br /&gt;&lt;br /&gt;REPLACE (REPLACE INTO table_name VALUES (...)) &lt;br /&gt;&lt;br /&gt;INSERT DELAYED &lt;br /&gt;&lt;br /&gt;LOAD DATA INFILE / LOAD_FILE() &lt;br /&gt;&lt;br /&gt;한번에 많은 레코드를 추가하기 위해서는 다중 레코드 INSERT를 사용한다. &lt;br /&gt;&lt;br /&gt;SELECT INTO OUTFILE &lt;br /&gt;&lt;br /&gt;LEFT JOIN, STRAIGHT JOIN &lt;br /&gt;&lt;br /&gt;IS NULL 과 접목된 LEFT JOIN 사용 &lt;br /&gt;&lt;br /&gt;일부 경우, ORDER BY 는 키를 사용할 수 있다. &lt;br /&gt;&lt;br /&gt;하나의 인덱스에 있는 컬럼들만 쿼리할 경우에는 쿼리를 수행하기 위해 그 인덱스 트리만 사용하게 된다. &lt;br /&gt;&lt;br /&gt;조인은 보통 subselect 보다 빠르다. (대부분의 SQL 서버들에서 그러하다.) &lt;br /&gt;&lt;br /&gt;LIMIT &lt;br /&gt;&lt;br /&gt;SELECT * from table1 WHERE a &amp;gt; 10 LIMIT 10, 20 &lt;br /&gt;&lt;br /&gt;DELETE * from table1 WHERE a &amp;gt; 10 LIMIT 10 &lt;br /&gt;&lt;br /&gt;foo IN (상수 목록) 구문은 매우 최적화되어 있다. &lt;br /&gt;&lt;br /&gt;GET_LOCK() / RELEASE_LOCK() &lt;br /&gt;&lt;br /&gt;LOCK TABLES &lt;br /&gt;&lt;br /&gt;INSERT 와 SELECT 는 동시에 실행 될 수 있다. &lt;br /&gt;&lt;br /&gt;작동하고 있는 서버로 읽어 들일 수 있는 UDF 함수들 &lt;br /&gt;&lt;br /&gt;압축된 읽기 전용 테이블들 &lt;br /&gt;&lt;br /&gt;CREATE TEMPORARY TABLE &lt;br /&gt;&lt;br /&gt;CREATE TABLE .. SELECT &lt;br /&gt;&lt;br /&gt;MyISAM 테이블을 RAID와 사용하면 하나의 파일을 여러개의 파일들로 나누어 일부 파일시스템의 2G 제한을 넘어서는 것이 가능하다. &lt;br /&gt;&lt;br /&gt;Delayed_keys &lt;br /&gt;&lt;br /&gt;리플리케이션(replication) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL이 인덱스를 사용할 경우 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt;, &amp;gt;=, =, &amp;lt;, &amp;lt;=, 키에 대해 IF NULL 과 BETWEEN을 사용할 때&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT * FROM table_name WHERE key_part1=1 and key_part2 &amp;gt; 5; &lt;br /&gt;&lt;br /&gt;SELECT * FROM table_name WHERE key_part1 IS NULL;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;와일드카드 문자로 시작하지 않는 LIKE 절을 사용할 때&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT * FROM table_name WHERE key_part1 LIKE 'jani%'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;조인을 수행하면서 다른 테이블들로부터 레코드를 가져올 때&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT * from t1, t2 where t1.col=t2.key_part; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;특정 인덱스에 대해서 MAX() 나 MIN() 값을 구할 때&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT MIN(key_part2), MAX(key_part2) FROM table_name where key_part1=10; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;키의 접두부에 대해 ORDER BY 나 GROUP BY 절을 수행할 때&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT * FROM foo ORDER BY key_part1, key_part2, key_part3;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;쿼리에 사용되는 모든 컬럼이 한 개의 키의 부분(part)일 경우&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT key_part3 FROM table_name WHERE key_part1=1; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL이 인덱스를 사용하지 않을 경우 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL은 테이블 전체를 스캔하는 더 빠를 것이라고 판단되면 인덱스를 사용하지 않는다. 예를 들어, key_part1이 1과 100사이의 값을 고르게 가지고 있다면, 다음과 같은 쿼리에서 인덱스를 사용하는 것은 좋지 않다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT * FROM table_name where key_part1 &amp;gt; 1 and key_part1 &amp;lt; 90;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HEAP 테이블을 사용하고 있으며, 모든 키 부분들에 대해서 = 로 검색하지 않을 경우 &lt;br /&gt;&lt;br /&gt;HEAP 테이블에 대해 ORDER BY 절로 쿼리할 경우 &lt;br /&gt;&lt;br /&gt;맨 처음의 키 부분을 사용하지 않을 경우&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT * FROM table_name WHERE key_part2 = 1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;와일드카드 문자로 시작하는 LIKE 를 사용할 경우&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT * FROM table_name WHERE key_part1 LIKE '%jani%'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;하나의 인덱스에 대해서 검색하면서 다른 인덱스에 대해서는 ORDER BY 를 적용할 때&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT * FROM table_name WHERE key_part1 = # ORDER BY key2;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;EXPLAIN 사용법 익히기 &lt;br /&gt;&lt;br /&gt;지나치게 느리다고 생각되는 모든 쿼리 문장에 대해 EXPLAIN 을 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; explain select t3.DateOfAction, t1.TransactionID&lt;br /&gt;&lt;br /&gt;-&amp;gt; from t1 join t2 join t3&lt;br /&gt;&lt;br /&gt;-&amp;gt; where t2.ID = t1.TransactionID and t3.ID = t2.GroupID&lt;br /&gt;&lt;br /&gt;-&amp;gt; order by t3.DateOfAction, t1.TransactionID;&lt;br /&gt;&lt;br /&gt;+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;table &lt;br /&gt;type &lt;br /&gt;possible_keys &lt;br /&gt;key &lt;br /&gt;key_len &lt;br /&gt;ref &lt;br /&gt;rows &lt;br /&gt;Extra &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;t1 &lt;br /&gt;ALL &lt;br /&gt;NULL &lt;br /&gt;NULL &lt;br /&gt;NULL &lt;br /&gt;NULL &lt;br /&gt;11 &lt;br /&gt;Using temporary; Using filesort &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;t2 &lt;br /&gt;ref &lt;br /&gt;ID &lt;br /&gt;ID &lt;br /&gt;4 &lt;br /&gt;t1.TransactionID &lt;br /&gt;13 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;t3 &lt;br /&gt;eq_ref &lt;br /&gt;PRIMARY &lt;br /&gt;PRIMARY &lt;br /&gt;4 &lt;br /&gt;t2.GroupID &lt;br /&gt;1 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;유형 ALL과 범위는 잠재적인 문제점을 알리고 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SHOW PROCESSLIST 사용법 익히기 &lt;br /&gt;&lt;br /&gt;현재 진행 상황을 파악하기 위해서는 SHOW processlist 를 사용한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+----+-------+-----------+----+---------+------+--------------+-------------------------------------+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Id &lt;br /&gt;User &lt;br /&gt;Host &lt;br /&gt;db &lt;br /&gt;Command &lt;br /&gt;Time &lt;br /&gt;State &lt;br /&gt;Info &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+----+-------+-----------+----+---------+------+--------------+-------------------------------------+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;6 &lt;br /&gt;monty &lt;br /&gt;localhost &lt;br /&gt;bp &lt;br /&gt;Query &lt;br /&gt;15 &lt;br /&gt;Sending data &lt;br /&gt;select * from station,station as s1 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8 &lt;br /&gt;monty &lt;br /&gt;localhost &lt;br /&gt;&lt;br /&gt;Query &lt;br /&gt;0 &lt;br /&gt;&lt;br /&gt;show processlist &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;+----+-------+-----------+----+---------+------+--------------+-------------------------------------+&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql에서 KILL을 사용하거나 명령행에서 mysqladmin을 사용하여 불필요한(runaway) 쓰레드들을 없앨 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL이 쿼리를 해결하는 방법을 찾는 방법 &lt;br /&gt;&lt;br /&gt;다음 명령들을 실행해서 결과를 이해하도록 노력한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SHOW VARIABLES; &lt;br /&gt;&lt;br /&gt;SHOW COLUMNS FROM ... \G &lt;br /&gt;&lt;br /&gt;EXPLAIN SELECT ... \G &lt;br /&gt;&lt;br /&gt;FLUSH STATUS; &lt;br /&gt;&lt;br /&gt;SELECT ...; &lt;br /&gt;&lt;br /&gt;SHOW STATUS; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL은 이런 경우 극히 우수하다 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;로그 기록시 &lt;br /&gt;&lt;br /&gt;많은 연결이 이루어 질 때, 연결 속도가 매우 빠르다. &lt;br /&gt;&lt;br /&gt;SELECT 와 INSERT 를 동시에 사용하는 곳에서. &lt;br /&gt;&lt;br /&gt;update를 시간이 오래 걸리는 select 문과 결합하지 않을 때 &lt;br /&gt;&lt;br /&gt;대부분의 select/update 문이 고유한 키들을 사용할 때 &lt;br /&gt;&lt;br /&gt;많은 테이블을 장시간 잠금(lock) 충돌 없이 사용할 때 &lt;br /&gt;&lt;br /&gt;크기가 큰 테이블을 가지고 있을 때 (MySQL 은 매우 컴팩트한 테이블 포맷을 사용한다.) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 사용에 있어서 피해야 할 것들 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;테이블을 UPDATE 또는 삭제된 행을 테이블에 대해 INSERT하면서 시간이 오래 걸리는 SELECT 절들과 결합시키는 일 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WHERE 절에 올 수 있는 것들에 대한 HAVING &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;키를 사용하지 않은, 또는 충분히 유니크하지 않은 키를 사용한 JOIN &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;컬럼 유형이 서로 다른 컬럼들에 대해 JOIN 수행 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;온전한 키 전체가 아닌 키의 부분에 대해서만 '=' 로 비교연산할 때 HEAP 테이블을 사용 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL monitor 에서 UPDATE 나 DELETE를 사용하면서 WHERE 절을 생략하는 일. 만약 자신이 이런 경향이 있다면, mysql 클라이언트 프로그램을 실행할 때 --i-am-a-dummy 옵션을 추가하기 바란다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL의 독특한 잠금들(locks) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;내장된 테이블 잠금 &lt;br /&gt;&lt;br /&gt;LOCK TABLES (모든 테이블 유형에 대해 동작함) &lt;br /&gt;&lt;br /&gt;GET_LOCK() / RELEASE_LOCK() &lt;br /&gt;&lt;br /&gt;Page locks (BDB 테이블에 대해서) &lt;br /&gt;&lt;br /&gt;ALTER TABLE 역시 BDB 테이블에 대해 테이블 잠금을 수행함 &lt;br /&gt;&lt;br /&gt;LOCK TABLES 는 다중 읽기 작업 또는 한개의 쓰기 작업을 허용한다. &lt;br /&gt;&lt;br /&gt;보통 WRITE 잠금은 READ 잠금 보다 우선 순위가 높다. 쓰기 작업이 무한정 대기 상태에 놓이게 되는 경우를 피하기 위해서다(to avoid starving the writers). 그리 중요하지 않은 쓰기 작업은 LOW_PRIORITY 키워드를 사용하여 lock handler가 읽기 작업에 먼저 허가를 내어 주도록 하는 것도 한 방법이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE LOW_PRIORITY SET value=10 WHERE id=10; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;문제를 쉽게 해결하기 위해 MySQL로부터 더 많은 정보를 얻는 기법들 &lt;br /&gt;&lt;br /&gt;MySQL 만의 기능들을 항상 주석처리함으로써 쿼리의 이식성 높일 수 있다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT /*! SQL_BUFFER_RESULTS */ ... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT SQL_BUFFER_RESULTS ...&lt;br /&gt;&lt;br /&gt;MySQL이 임시 결과 세트를 만들도록 강제한다. 임시 세트가 만들어지면, 그 테이블들에 대한 모든 잠금이 해제된다. 이는 테이블 잠금으로 인해 문제가 발생했을 때나 쿼리 결과를 클라이언트로 전송하는데 오랜 시간이 소요되는 경우에 도움이 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT SQL_SMAIL_RESULT ... GROUP BY ...&lt;br /&gt;&lt;br /&gt;결과 세트가 적은 수의 레코드만 가지게끔 하도록 옵티마이저에게 지시한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT SQL_BIG_RESULT ... GROUP BY ...&lt;br /&gt;&lt;br /&gt;결과 세트가 많은 수의 레코드를 가지도록 옵티마이저에게 지시한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT STRAIGHT_JOIN ...&lt;br /&gt;&lt;br /&gt;옵티마이저가 FROM 절에 나타난 순서대로 테이블을 join 하도록 강제한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT ... FROM table_name [USE INDEX (index_list) &lt;br /&gt;IGNORE INDEX (index_list)] table_name2&lt;br /&gt;&lt;br /&gt;MySQL이 특정 인덱스들을 사용하거나 무시하도록 강제한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;트랜잭션 사용예 &lt;br /&gt;&lt;br /&gt;MyISAM 테이블에 대해 트랜잭션을 수행하는 방법:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; LOCK TABLES trans READ, customer WRITE;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select sum(value) from trans where customer_id=some_id;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; update customer set total_value=sum_from_previous_statement where customer_id=some_id;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; UNLOCK TABLES;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Berkeley DB 테이블에 대해 트랜잭션을 수행하는 방법:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; BEGIN WORK;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select sum(value) from trans where customer_id=some_id;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; update customer set total_value=sum_from_previous_statement where customer_id=some_id;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; COMMIT;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음과 같이 함으로써 여러 트랜잭션들 간의 간섭을 방지할 수 있다는 점에 주목할 필요가 있다:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;UPDATE customer SET value=value+new_value WHERE customer_id=some_id; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REPLACE 사용예 &lt;br /&gt;&lt;br /&gt;REPLACE는 테이블의 이전 레코드가 새 레코드와 같은 고유 인덱스 값을 가지고 있다면 예전 레코드가 먼저 삭제되고 새 레코드가 추가된다는 점만 제외하면 INSERT와 똑같이 작동한다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음과 같이 하는 대신,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT 1 FROM t1 WHERE key=#&lt;br /&gt;&lt;br /&gt;IF found-row&lt;br /&gt;&lt;br /&gt;LOCK TABLES t1&lt;br /&gt;&lt;br /&gt;DELETE FROM t1 WHERE key1=#&lt;br /&gt;&lt;br /&gt;INSERT INTO t1 VALUES (...)&lt;br /&gt;&lt;br /&gt;UNLOCK TABLES t1;&lt;br /&gt;&lt;br /&gt;ENDIF&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음과 같이 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REPLACE INTO t1 VALUES (...) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;일반적인 팁 &lt;br /&gt;&lt;br /&gt;프라이머리 키는 짧은 것을 사용한다. 테이블 조인할 때는 문자열형 보다는 숫치형을 사용한다. &lt;br /&gt;&lt;br /&gt;여러 부분으로 구성된 키를 사용할 때는 첫 번째 부분이 가장 많이 사용되는 키이어야 한다. &lt;br /&gt;&lt;br /&gt;의심스러울 때는, 앞부분이 더 많이 중복된 컬럼을 사용해서 보다 나은 키 압축 효과를 얻는다. &lt;br /&gt;&lt;br /&gt;클라이언트를 실행 중이고 MySQL 서버가 같은 머신에 있다면, TCP/IP 대신에 유닉스 소켓을 사용하여 서버에 연결하는 것이 좋다.(이렇게 하면 7.5% 정도까지 효율이 증진된다.) MySQL 서버에 접속할 때 호스트이름이나 localhost를 지정하지 않으면 유닉스 소켓으로 접속하게 된다. &lt;br /&gt;&lt;br /&gt;가능하다면 --skip-locking(일부 운영체제에서는 이 것이 기본값이다)을 사용한다. 이는 외부적인 잠금을 사용하지 않게 되고 퍼포먼스가 향상된다. &lt;br /&gt;&lt;br /&gt;긴 키를 사용하기 보다는 응용프로그램 수준에서 해시된 값을 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SELECT * FROM table_name WHERE hash=MD5(concat(col1,col2)) AND col_1='constant' AND col_2='constant';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Store BLOB's that you need to access as files in files. 데이터베이스에는 파일이름만 저장한다. &lt;br /&gt;&lt;br /&gt;레코드들의 큰 부분을 지우는 것 보다 레코드 전체를 지우는 것이 더 빠르다. &lt;br /&gt;&lt;br /&gt;SQL이 충분히 빠르지 않다면, 데이터에 접근하는 더 낮은 수준의 인터페이스를 점검해 본다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MySQL 3.23을 사용할 때 얻을 수 있는 이점 &lt;br /&gt;&lt;br /&gt;MyISAM; 이식이 수월한 거대 테이블 유형 &lt;br /&gt;&lt;br /&gt;HEAP; 메모리 상의 테이블 &lt;br /&gt;&lt;br /&gt;Berkeley DB; Sleepycat에서 제공하는 트랙잰션이 가능한 테이블 &lt;br /&gt;&lt;br /&gt;대폭 확대된(풀린) 제한들 &lt;br /&gt;&lt;br /&gt;동적 문자셋 &lt;br /&gt;&lt;br /&gt;더 많이 제공되는 STATUS 변수들 &lt;br /&gt;&lt;br /&gt;CHECK table, REPAIR table &lt;br /&gt;&lt;br /&gt;더 빠른 GROUP BY 절과 DISTINCT 절 &lt;br /&gt;&lt;br /&gt;최적화된 LEFT JOIN ... IF NULL &lt;br /&gt;&lt;br /&gt;CREATE TABLE ... SELECT &lt;br /&gt;&lt;br /&gt;CREATE TEMPORARY table_name (...) &lt;br /&gt;&lt;br /&gt;임시적인 HEAP에서 MyISAM 테이블로의 자동 변환 &lt;br /&gt;&lt;br /&gt;리플리케이션 &lt;br /&gt;&lt;br /&gt;mysqlhotcopy 스크립트 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;실제 작업에서 중요한 기능들 &lt;br /&gt;&lt;br /&gt;진보된 트랜잭션 &lt;br /&gt;&lt;br /&gt;오류로부터 안전한 리플리케이션 &lt;br /&gt;&lt;br /&gt;텍스트 검색 &lt;br /&gt;&lt;br /&gt;많은 테이블의 삭제 (이 작업 후에 많은 테이블의 갱신이 이루어진다.) &lt;br /&gt;&lt;br /&gt;너 나은 키 캐시 &lt;br /&gt;&lt;br /&gt;원자화된 RENAME (RENAME TABLE foo as foo_old, foo_new as foo) &lt;br /&gt;&lt;br /&gt;쿼리 캐시 &lt;br /&gt;&lt;br /&gt;MERGE TABLES &lt;br /&gt;&lt;br /&gt;향상된 GUI 클라이언트&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-4538409093723074951?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/4538409093723074951/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/mysql-best.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4538409093723074951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4538409093723074951'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/02/mysql-best.html' title='MYSQL 최적화 기법 (best튜닝 기법)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-895240277451956517</id><published>2010-01-27T00:35:00.000-08:00</published><updated>2010-03-17T09:12:33.938-07:00</updated><title type='text'>helloMaps  구글맵 사용하는 초간단 예제</title><content type='html'>글 제작자에 저작권 표기 요청에 의해서 &lt;br /&gt;해당 글을 삭제하기로 하였습니다. &lt;br /&gt;&lt;br /&gt;좋은 예제이니 구글맵을 처음 접해보시는 분들이라면 &lt;br /&gt;맵에 관련한 내용을 참고할만 합니다.&lt;br /&gt;&lt;br /&gt;저작권 요청하신분의 정확한 블로그 주소등을 알기가 힘들어 &lt;br /&gt;검색 가능한 힌트만 남겨 놓도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;"커니의 안드로이드 이야기" OR helloMaps 검색 추천&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ポストの作成者の著作権を要求して削除します。&lt;br /&gt;グーグルマップをはじめに経験する場合は&lt;br /&gt;けっこう、いいソースなんで検索してみてください。&lt;br /&gt;&lt;br /&gt;検索語は　"커니의 안드로이드 이야기"かhelloMapsを検索してみてください。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-895240277451956517?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/895240277451956517/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/hellomaps.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/895240277451956517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/895240277451956517'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/hellomaps.html' title='helloMaps  구글맵 사용하는 초간단 예제'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-5270668521652304546</id><published>2010-01-27T00:24:00.000-08:00</published><updated>2010-01-27T00:24:05.743-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>구글맵을 사용하기 위해서 필요한 API Key를 발급받기</title><content type='html'>&lt;div&gt;MD5 Fingerprint를 얻기 위해서는 keytool이라는 툴을 이용하여야 하는데, 이 keytool은 안드로이드 SDK 내에  있는 것이 아니라 [&lt;b&gt;JDK가 설치된 폴더]/bin&lt;/b&gt; 폴더 내에 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;div class="imageblock center" style="clear: both; text-align: center;"&gt;&lt;a href="http://cfile29.uf.tistory.com/original/195AE3124B46CA7A18C77A" rel="lightbox" target="_blank"&gt;&lt;img alt="" height="483" src="http://cfile29.uf.tistory.com/image/195AE3124B46CA7A18C77A" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;keytool을 이용하려면 명령 프롬프트를 이용하여야 하는데, 이때 JDK의 Path가 설정되어 있지 않으면 매우 불편합니다. JDK의  Path가 등록되어 있는 경우도 있지만, 등록되어 있지 않을 경우 수동으로 등록해주도록 합시다. 내 컴퓨터 - 속성을 선택한 후, 고급 탭의  [환경 변수] 버튼을 누르면 아래와 같은 화면이 표시됩니다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="imageblock center" style="clear: both; text-align: center;"&gt;&lt;a href="http://cfile4.uf.tistory.com/original/125AE3124B46CA7C19E33D" rel="lightbox" target="_blank"&gt;&lt;img alt="" height="400" src="http://cfile4.uf.tistory.com/image/125AE3124B46CA7C19E33D" width="447" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;여기에서, 아래의 시스템 변수 목록 중 Path 항목을 선택한 후, 편집을 눌러 아래와 같이 맨 마지막 항목 각 항목을 구분지어주는  문자인 세미콜론(;)을 입력한 후, JDK의 bin 폴더의 경로를 입력한 후, 확인을 눌러주시면 됩니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="imageblock center" style="clear: both; text-align: center;"&gt;&lt;a href="http://cfile8.uf.tistory.com/original/205AE3124B46CA7C1A885B" rel="lightbox" target="_blank"&gt;&lt;img alt="" height="130" src="http://cfile8.uf.tistory.com/image/205AE3124B46CA7C1A885B" width="403" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Path가 제데로 등록 되었다면, 본격적으로 MD5 Fingerprint를 생성할 차례입니다.&lt;/div&gt;&lt;div&gt;안드로이드 어플리케이션 테스트에 사용되느 디버그용 keystore는 윈도우 XP 기준으로 C:\Documents and  Settings\[사용자 계정명]\.android 폴더 내에 debug.keystore라는 이름으로 저장되어있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="imageblock center" style="clear: both; text-align: center;"&gt;&lt;a href="http://cfile1.uf.tistory.com/original/115AE3124B46CA7C1BF28A" rel="lightbox" target="_blank"&gt;&lt;img alt="" height="419" src="http://cfile1.uf.tistory.com/image/115AE3124B46CA7C1BF28A" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;여기에서 아래와 같이 입력합니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;keytool -list -alias androiddebugkey  -keystore debug.keystore -storepass android -keypass android&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="imageblock center" style="clear: both; text-align: center;"&gt;&lt;a href="http://cfile25.uf.tistory.com/original/145AE3124B46CA7E1CED62" rel="lightbox" target="_blank"&gt;&lt;img alt="" height="419" src="http://cfile25.uf.tistory.com/image/145AE3124B46CA7E1CED62" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;잠시 기다리면 아래와 같이 생성된 MD5 Fingerprint가 표시됩니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="imageblock center" style="clear: both; text-align: center;"&gt;&lt;a href="http://cfile9.uf.tistory.com/original/155AE3124B46CA7E1D5867" rel="lightbox" target="_blank"&gt;&lt;img alt="" height="419" src="http://cfile9.uf.tistory.com/image/155AE3124B46CA7E1D5867" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;잘 복사하시고, 이것을 &lt;a href="http://code.google.com/android/maps-api-signup.html" target="_blank"&gt;http://code.google.com/android/maps-api-signup.html&lt;/a&gt;&amp;nbsp;에 가신 후,  MD5 Fingerprint를 입력하고, 구글 계정으로 로그인하면 API Key가 발급됩니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt; &lt;div class="imageblock center" style="clear: both; text-align: center;"&gt;&lt;a href="http://cfile25.uf.tistory.com/original/151D100949BD72881B2364" rel="lightbox" target="_blank"&gt;&lt;img alt="" height="762" src="http://cfile25.uf.tistory.com/image/151D100949BD72881B2364" style="cursor: pointer;" width="683" /&gt;&lt;/a&gt; &lt;div class="cap1"&gt;동의 찍고 Generate API Key 누르고~~&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;생성된 MD5 Fingerprint를 입력한 후, Generate API Key 버튼을 누르시면 아래와 같이 사용자 키가  발급됩니다.&lt;/div&gt;&lt;div&gt;이 사용자 키는 잃어버리지 않게 유의하셔야 합니다. 앞으로 동일한 개발환경에서는 이 API Key를 사용하여 구글맵 API를 사용할 수  있으며, 만약 개발환경이 바뀐 경우에는 다시 API Key를 발급받아야 정상적으로 구글맵 API를 사용할 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="imageblock center" style="clear: both; text-align: center;"&gt;&lt;a href="http://cfile10.uf.tistory.com/original/165AE3124B46CA801EE723" rel="lightbox" target="_blank"&gt;&lt;img alt="" height="325" src="http://cfile10.uf.tistory.com/image/165AE3124B46CA801EE723" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;이로써 구글맵 API를 이용하기 위한 준비 절차가 모두 끝났습니다. &lt;/div&gt;&lt;div&gt;다음시간부터는 본격적으로 어플리케이션에서 구글맵을 이용하는 방법에 대해 알아보도록 하겠습니다 :)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-5270668521652304546?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/5270668521652304546/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/api-key.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5270668521652304546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5270668521652304546'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/api-key.html' title='구글맵을 사용하기 위해서 필요한 API Key를 발급받기'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-6912787570732163753</id><published>2010-01-26T22:21:00.000-08:00</published><updated>2010-01-27T20:11:06.152-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>MJAndroid 폴더 카피후 에러발생 문제 때문에 고민하는 분들을 위한 By Vins</title><content type='html'>MJAndroid를 패치키 프로젝터에 포함 시키는 순서는 &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. File --&amp;gt; Import --&amp;gt; General --&amp;gt; Existing Projects into WorkSpace 를 선택하고 난 후 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. 새로운 창이 뜨면 Select root directory 옆에 Browse 버튼 클릭하고 폴더 선택한 후 Finish&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. MJAndroid 프로젝트가 보이면 마우스 우클릭후 Build path --&amp;gt; Configire Build path 클릭&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. 새창 뜨면 왼쪽 Java Build Path가 기본적으로 선택되어 있고 2칸위인 Android 선택 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;5. 그러면 Android가 버젼별로 나오는데 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Android 1.1 .....&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Android 1.5 ..... &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Android 1.6 .....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Android&amp;nbsp;2.0 .....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...중략...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Google APIs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Google inc.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Google APIs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Google inc.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Google APIs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Google inc.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Google APIs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Google inc.&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;2.0.1&amp;nbsp;&amp;nbsp;&amp;nbsp;6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Google APIs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Google inc.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;7&lt;br /&gt;&amp;nbsp;&amp;nbsp; 등이 있는데 내 경우엔 Google APIs&amp;nbsp; 2.0.1을 선택했다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (구글 API를 사용해야 할 경우는 Android x.x 버전들을 사용하면 설치는 되지만 에러메세지와 함께 실행은 되지 않을 것이다)&lt;br /&gt;&lt;br /&gt;6. 위 설정에서 Apply를 클릭하고 나오면 gen 폴더가 생기면서 R.java 파일이 생성됨&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;7. 기존 src 밑에 R.java는 삭제해 버림 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;8. 아직 에러표시 x 아이콘이 군대 군대 보인다면 MJAndroid 프로젝트를 우클릭한 후 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 팝업메뉴에서 가장 밑 부분에 Android Tool 이라는게 보일것이고 다시 클릭하면 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fix Project Properties 를 클릭하면 해결된다&lt;br /&gt;&lt;br /&gt;9. 마지막으로 MJAndroid는 SQLite3을 사용하면서 저장할 공간이 필요하게 된다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 즉 sdcard를 AVD에 넣어야 하는데 뭔가 저장하고 불러오는 작업이 없는 단순google Maps의&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;경우는 이런 작업이 필요 없지만 sdcard를 넣는 부분만 살펴보도록 하겠다 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 다음의 그림을 참고하자 &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_MKXTIQWWA9E/S2EMowVIRKI/AAAAAAAAKJo/ayMqwPK5m1Q/s1600-h/MJAndroidAVD201.JPG" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="468" mt="true" src="http://3.bp.blogspot.com/_MKXTIQWWA9E/S2EMowVIRKI/AAAAAAAAKJo/ayMqwPK5m1Q/s640/MJAndroidAVD201.JPG" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;그림을 보면 google APIs 6을 선택하고 난 후 바로 아래부분에 SD card 선택하는 부분이 있을 것이다 &lt;br /&gt;이미 MJAndrod 프로젝트에는 sdcard 이미지가 생성되어 있고 그 파일을 선택하면 된다 &lt;br /&gt;MJAndroid 프로젝트 바로 밑에 확장자가 없는 sdcard 파일이 하나 보일것인데 &lt;br /&gt;이를 선택하자 &lt;br /&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&lt;strong&gt;(sdcard를 선택하지 않은 애뮬레이터에서 돌리면 에러가 발생한다 &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&lt;strong&gt;DDMS에서 Devices의 디버그 모양 아이콘을 클릭하면 뭔가 실행하는 듯 하면서 &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&lt;strong&gt;다음과 같은 에러는 낸다 &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&lt;strong&gt;"dalvikvm&amp;nbsp; Unable to open stack trace file '/data/anr/traces.txt' : Permission denied"&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue; font-size: x-small;"&gt;&lt;strong&gt;이는 sdcard를 AVD에 인식시켜주면 해당 파일이 인지할 수 있게 된다)&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;그러면 다음과 같은 MJAndroid 프로그램의 실행 화면을 보게 될 것이다 &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2ENVRlPOwI/AAAAAAAAKJw/BieYP_cD6e4/s1600-h/MJAndroid-complete.JPG" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="438" mt="true" src="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2ENVRlPOwI/AAAAAAAAKJw/BieYP_cD6e4/s640/MJAndroid-complete.JPG" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이 이후 AVD생성 및 설치는 제 블로그에서 Android 텝을 클릭하시면 또 나와 있습니다. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://mcpicdtl.blogspot.com/2010/01/mjandroid-installfailedmissingsharedlib.html"&gt;http://mcpicdtl.blogspot.com/2010/01/mjandroid-installfailedmissingsharedlib.html&lt;/a&gt;&lt;br /&gt;위 링크는 설치 실폐의 예를 이용하여 가상 어플리케이션 (AVD)를 올바르게 설치하는 방법이 나열되어 있습니다.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;By Vins&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-6912787570732163753?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/6912787570732163753/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/mjandroid.html#comment-form' title='10개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6912787570732163753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6912787570732163753'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/mjandroid.html' title='MJAndroid 폴더 카피후 에러발생 문제 때문에 고민하는 분들을 위한 By Vins'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_MKXTIQWWA9E/S2EMowVIRKI/AAAAAAAAKJo/ayMqwPK5m1Q/s72-c/MJAndroidAVD201.JPG' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-931887669206973717</id><published>2010-01-26T21:42:00.000-08:00</published><updated>2010-01-27T23:39:08.784-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>MJAndroid, [INSTALL_FAILED_MISSING_SHARED_LIBRARY] By Vins</title><content type='html'>오렐리 책을 실습하다가 보면서 MJAndroid의 설치에서 &lt;br /&gt;&lt;div&gt;[INSTALL_FAILED_MISSING_SHARED_LIBRARY] 가 발생했다&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이전 HelloAndroid와 무엇이 다른지 생각해 보다가 구글맵을 사용하는 것이 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;문제라는 것을 발견했다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;우선 MJAndroid를 패키지 익스플로러를 살펴보면 MapKey를 넣는 곳이 있는데 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;먼저 android용 api key를 받아야 한다 아래주소로 이동하면 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sign Up for the Android Maps Key Api 라며 박스안에 녹색 글자들이 나오는데 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="color: #009900;"&gt;$ keytool -list -keystore ~/.android/debug.keystore &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="color: #009900;"&gt;...&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style="color: #009900;"&gt;Certificate fingerprint (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span style="color: red;"&gt;&lt;span class="Apple-style-span" style="background-color: #fff2cc;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span style="color: red;"&gt;&lt;span class="Apple-style-span" style="background-color: #fff2cc;"&gt;&amp;lt;-- 인증키 발급하는 부분은 내용상 따로 준비하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span style="color: red;"&gt;&lt;span class="Apple-style-span" style="background-color: #fff2cc;"&gt;아직 인증키 발급안 하신분은 이쪽으로 새탭으로 바로 아래 링크 부터&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span style="color: red;"&gt;&lt;span class="Apple-style-span" style="background-color: #fff2cc;"&gt;하여 MD5키를 생성하시고 다음으로 이동하시기 바랍니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://mcpicdtl.blogspot.com/2010/01/api-key.html"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span style="color: red;"&gt;&lt;span class="Apple-style-span" style="background-color: #fff2cc;"&gt;http://mcpicdtl.blogspot.com/2010/01/api-key.html&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span style="color: red;"&gt;&lt;span class="Apple-style-span" style="background-color: #fff2cc;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;------------ API Key URL ----------------&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://code.google.com/intl/kr/android/maps-api-signup.html&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;다시 본론으로 돌아가서 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;이클립스를 사용하여 AVD를 생성하였다면 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;MJAndroid 경우는 구글 맵을 사용하는 App이기 때문에 Android+google map을 선택해야 한다&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이클립스에서는 아마 Google APIs 각 버젼으로 나올것이다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;그래서 /android-sdk-window/tools 폴더에 있는 android.bat 를 사용해서 가상머신을 돌리기로 했다&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;근데 자기 PC에 설치된 것들이 뭐뭐가 있는지 잘 모를수 있으니 먼저 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;어떤 것들이 있는지 보자 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;cmd 창을 하나 열어 아래와 같이 tools 폴더로 이동한 후 실행 시켜보자 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C:\vinsPrivate\Android\android-sdk-windows\tools&amp;gt; &lt;b&gt;&lt;span style="color: #3333ff;"&gt;android list targets&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그러고 나면 아래 안드로이드 종류가 10~20가지 정도 나올것이다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;---------------------- 출력 결과 -----------------------------------------------------&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Available Android targets:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 1 or "android-2"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Android 1.1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Platform&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API level: 2&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 2 or "android-3"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Android 1.5&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Platform&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API level: 3&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 3 or "android-4"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Android 1.6&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Platform&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API level: 4&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: HVGA (default), QVGA, WVGA800, WVGA854&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 4 or "android-5"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Android 2.0&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Platform&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API level: 5&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: HVGA (default), QVGA, WQVGA400, WQVGA432, WVGA800, WVGA854&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 5 or "android-6"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Android 2.0.1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Platform&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API level: 6&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: HVGA (default), QVGA, WQVGA400, WQVGA432, WVGA800, WVGA854&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 6 or "android-7"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Android 2.1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Platform&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API level: 7&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: HVGA (default), QVGA, WQVGA400, WQVGA432, WVGA800, WVGA854&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 7 or "Google Inc.:Google APIs:3"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 3&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 1.5 (API level 3)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 8 or "Google Inc.:Google APIs:3"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 3&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 1.5 (API level 3)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 9 or "Google Inc.:Google APIs:3"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 3&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 1.5 (API level 3)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 10 or "Google Inc.:Google APIs:4"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 2&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 1.6 (API level 4)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, HVGA (default), WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 11 or "Google Inc.:Google APIs:4"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 2&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 1.6 (API level 4)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, HVGA (default), WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 12 or "Google Inc.:Google APIs:4"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 2&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 1.6 (API level 4)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, HVGA (default), WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 13 or "Google Inc.:Google APIs:5"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 2.0 (API level 5)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, WQVGA400, HVGA (default), WQVGA432, WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 14 or "Google Inc.:Google APIs:5"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 2.0 (API level 5)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, WQVGA400, HVGA (default), WQVGA432, WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 15 or "Google Inc.:Google APIs:5"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 2.0 (API level 5)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, WQVGA400, HVGA (default), WQVGA432, WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 16 or "Google Inc.:Google APIs:6"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 2.0.1 (API level 6)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, WQVGA400, HVGA (default), WQVGA432, WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 17 or "Google Inc.:Google APIs:6"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 2.0.1 (API level 6)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, WQVGA400, HVGA (default), WQVGA432, WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 18 or "Google Inc.:Google APIs:6"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 2.0.1 (API level 6)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, WQVGA400, HVGA (default), WQVGA432, WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 19 or "Google Inc.:Google APIs:7"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 2.1 (API level 7)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, WQVGA400, HVGA (default), WQVGA432, WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;id: 20 or "Google Inc.:Google APIs:7"&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Name: Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Type: Add-On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Revision: 1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Based on Android 2.1 (API level 7)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Libraries:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;API for Google Maps&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #999999;"&gt;Skins: WVGA854, WQVGA400, HVGA (default), WQVGA432, WVGA800, QVGA&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;id: 21 or "Google Inc.:Google APIs:7"&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;Name: Google APIs&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;Type: Add-On&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;Vendor: Google Inc.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;Revision: 1&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;Description: Android + Google APIs&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;Based on Android 2.1 (API level 7)&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;Libraries:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;* com.google.android.maps (maps.jar)&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;API for Google Maps&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;Skins: WVGA854, WQVGA400, HVGA (default), WQVGA432, WVGA800, QVGA&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C:\vinsPrivate\Android\UTIL\android-sdk\tools&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-------------------- 출력 결과 끝 -------------------------------&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;내 경우엔 위 출력 결과에서 파란색 처리 된 부분..&lt;br /&gt;&lt;/div&gt;&lt;div&gt;즉 android&amp;nbsp;2.1(현재최신버젼) + google Apis 를 사용할 것이었기 때문에 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;ID :&amp;nbsp;21 인 AVD를 사용할 것이다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;(사용자 PC마다 원하는 번호가 다를수 있기 때문에 확인하고 타켓 번호를 사용하자)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;자 그럼 AVD를 실행시켜 보자 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;cmd.exe 창으로 돌아가서 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;C:\vinsPrivate\Android\UTIL\android-sdk\tools&amp;gt; &lt;span style="color: #3333ff;"&gt;android create avd -n vinsAndroid-2.1 -t 21 -c 1000M&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;위에 보면 -n 과 -t 가 있는데 이의 상세한 설명은 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://developer.android.com/guide/developing/tools/avd.html&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;공식 웹 사이트를 참조하면 된다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;뭐 지금은 -n (avd 이름 : 맘대로 정하면 됨)과 -t (타켓번호) 만 알아도 된다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;내 경우엔 AVD이름을 vinsAndroid-.2.1 로 하였지만 이건 자기가 원하는 이름으로 하면 된다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;단 MJAndroid와 같이 데이터를 저장하고 또 불러와야 하는 경우는 &lt;br /&gt;sdcard를 인식시켜 줘야 함으로 이미지가 없다면 -c 옵션으로 sdcard이미지를 생성하든지&lt;br /&gt;이미 sdcard 이미지를 만들었거나 만들어진 파일이 있다면 이를 인식시켜 주도록 한다&lt;br /&gt;위에선 새로 만들는 방법을 사용하였는데 어떤 차이가 있는지 설명하면 다음과 같다 &lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #b6d7a8;"&gt;android create avd -n vinsAndroid-2.1 -t 21 -c 1000M (1기가 sdcard를 자동으로 생성하였을 경우)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;간단하게 정의 내리자면 AVD가 SDcard를 포함한 채로 실행되는 경우를 말한다 &lt;br /&gt;예를 들어 &lt;br /&gt;android create avd -n vinsAndroid-2.1 -t 21 -c 1000M&lt;br /&gt;위 구문을 실행시켜 AVD를 생성하였다면&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\vins\.android\avd\vinsAndroidinSDcard-2.1.avd 폴더 내부는 아래와 같다&lt;br /&gt;2010/01/28 16:07 &amp;lt;DIR&amp;gt; .&lt;br /&gt;2010/01/28 16:07 &amp;lt;DIR&amp;gt; ..&lt;br /&gt;2010/01/28 15:51 16,860 cache.img&lt;br /&gt;2010/01/28 14:54 189 config.ini&lt;br /&gt;2010/01/28 16:07 54 emulator-user.ini&lt;br /&gt;2010/01/28 16:07 1000,485,760 sdcard.img&lt;br /&gt;2010/01/28 16:07 44,996,124 userdata-qemu.img&lt;br /&gt;2010/01/28 14:54 2,401,344 userdata.img&lt;br /&gt;&lt;br /&gt;즉 1기가짜리 sdcard.img 이라는 것이 여기에 생성되고 AVD에 의해서 관리가 된다 &lt;br /&gt;즉 한가지 유의 해야 할 점은 외부 sdcard이기 때문 쓰기, 읽기 등의 권한을 가지고 있어야 한다&lt;br /&gt;AndroidManifest.xml 의 Permission tab을 클릭하고 추가적으로 권한을 주도록 해야 한다 &lt;br /&gt;추가해야 할 권한은 "android.permission.WRITE_EXTERNAL_STORAGE" 을 줘야 한다&lt;br /&gt;해석하면 외부 저장장치에 쓰기 권한을 달라는 말이 된다 &lt;br /&gt;&lt;br /&gt;user-permission 이 한줄 더 추가 되게 된다 &lt;br /&gt;&amp;lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&amp;gt;&lt;br /&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;span style="background-color: #b6d7a8;"&gt;android create avd -n vinsAndroid-2.1 -t 21 -c c:\vinsPrivate\android\workspace\MJAndroid\sdcard (이미 만들어진 sdcard 이미지를 이용할 경우)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;내부 sdcard 이미지의 경우는 프로젝트에 종속되어져서 AVD에서 실행시 &lt;br /&gt;해당 경로를 참조하게 된다 &lt;br /&gt;MJAndroid의 경우엔 &lt;br /&gt;C:\vinsPrivate\Android\workspace\MJAndroid\sdcard 가 될 것이다 &lt;br /&gt;AVD에서 MJAndroid를 실행시켜보고 해당 MJAndroid 폴더 이름을 바꾸려고 하면 &lt;br /&gt;사용중인 리소스가 있어서 디렉토리 명을 변경 할 수 없다고 나온다 &lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;즉 프로젝트를 실행하는데 sdcard 이미지가 프로젝트 폴더 내부에 있는 것은 그리 권장할 만하지 못한것 같다 &lt;br /&gt;배포파일의 크기만 커질뿐이며 유지관리에는 자동으로 AVD가 생성하도록 하는 것이 &lt;br /&gt;좋을 것 같다 &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;자 실행후 몇줄 더 읽는 동안 AVD가 회면에 떠 있을 것이다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;이클립스에서 그냥 안드로이드만 실행했을때와 달라진 점은 메인 화면에 구글맵 아이콘이 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;하나 더 생겼다는 점이다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그리고 Menu위에 어플리케이션 리스트를 출력 버튼을 클릭해 보면 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;"MicroJobs"라는 어플리케이션이 설치되어 있을 것이다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이번에 안드로이드를 새로이 입문하면서 느낀것이지만 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;자바, 리눅스, Struts 등 오픈진형의 소스는 환경 설정 및 Docs를 철저히 파악하지 못하면&lt;br /&gt;&lt;/div&gt;&lt;div&gt;삽질에 시간을 많이 보낼수 있다는 점이다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;최근 OpenPNE라는 일본 오픈SNS로 프로젝트를 하고 있는데 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;이 역시도 설정을 맞추는데 3일이나 잡아 먹었다 (나중에 그 버젼이 beta라는 것을 알게 되었지만 ㅜ.ㅜ)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;by Vins &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ps. 아 오렐리 책에서 보면 $ adb install mjandroid-1.0.0.apk 부분은 신경 쓸 필요 없다 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;전부 빌드 하고 나면 /bin 폴더안에 MJAndroid.apk 가 생기는데 버전관리의 중요성을 &lt;br /&gt;&lt;/div&gt;&lt;div&gt;언급하기 위한 변형일 뿐이다.&lt;br /&gt;버젼관리는 AndroidManifest.xml 파일에 서 Manifest탭을 클릭하면 &lt;br /&gt;android:version을 설정할 수 있고 version code는 1, version name 1.0 이 된다 &lt;br /&gt;사용사가 보게되는 version 숫자는 version name이 되겠다 &lt;br /&gt;&lt;br /&gt;혹시 설치까지는 성공하였으나 실행시 &lt;br /&gt;에라가 뜨는 분들은 Google Maps 부분에서 실수를 하였을 가능성이 높다 &lt;br /&gt;만일 MJAndroid가 아니더라도 구글맵에서 계속해서 에러가 발생한다면 &lt;br /&gt;다음 링크를 꼭 클릭해서 내용을 살펴보도록 하자 &lt;br /&gt;&lt;br /&gt;아마도 컴파일을 버젼을 Android 1.x or 2.x 등 단순 안드로이드를 사용했을 가능성이 높고 &lt;br /&gt;&lt;a href="http://mcpicdtl.blogspot.com/2010/01/mjandroid.html"&gt;http://mcpicdtl.blogspot.com/2010/01/mjandroid.html&lt;/a&gt;&amp;nbsp; &amp;lt;-- 여기에서 모든것을 해결 할 수 있을 것이다&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-931887669206973717?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/931887669206973717/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/mjandroid-installfailedmissingsharedlib.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/931887669206973717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/931887669206973717'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/mjandroid-installfailedmissingsharedlib.html' title='MJAndroid, [INSTALL_FAILED_MISSING_SHARED_LIBRARY] By Vins'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-4073604152884018788</id><published>2010-01-25T19:56:00.000-08:00</published><updated>2010-01-27T18:24:34.795-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>안드로이드 sdk 설치</title><content type='html'>&lt;span style="font-size: 10pt;"&gt;&lt;span style="background-color: #9334d8; color: white;"&gt;안드로이드 개발환경 구축시 필수사항&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;JDK&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&amp;nbsp;JDK는 5와 6을 지원하지만,안드로이드는 JDK 5로 구축되었기 때문에&lt;br /&gt;&amp;nbsp;JDK 6의 모든 기능이 지원되지는 않고 있다.&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Eclipse 통합개발환경&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&amp;nbsp;안드로이드 응용프로그램 개발을 지원하는 버전은 3.3(유로파)와 3.4 (가니메데~,게니미드ㅋㅋ)이다.&lt;br /&gt;&amp;nbsp;Eclipse IDE for Java EE Developers 를 추천한다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&amp;nbsp;※ 기타 IDE (통합개발환경)에서 안드로이드 응용프로그램을 개발하는것도 가능하지만,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 안드로이드&amp;nbsp; SDK와 적절하게 통합되는것은 Eclipse 뿐이다.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 반드시 JDK 5 나 JDK 6을 완전히 지원해야 한다.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;안드로이드 SDK&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&amp;nbsp;안드로이드 SDK에는 안드로이드 jar 파일,문서화,도구,예제코드 등이 들어있다.&lt;br /&gt;&amp;nbsp;&lt;a class="con_link" href="http://developer.android.com/sdk/index.html" target="_blank"&gt;http://developer.android.com/sdk/index.html&lt;/a&gt;&amp;nbsp;를 클릭하면 다운로드 받을 수 있다.&lt;br /&gt;&lt;br /&gt;여기서 윈도우용 SDK파일을 다운받을 수 있는데..퀵스타트 버전이라서 그런지&lt;br /&gt;용량은 22MB 정도이고 압축을 풀어보면 대부분의 폴더가 비어있다.&lt;br /&gt;&lt;br /&gt;걱정은 안해도 된다. 제공되는 매니저를 통해서 업데이트받으면 해당하는 버전의 파일이 들어오게 된다.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;※ 지원하는 운영체제&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 윈도우 XP ,Vista&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mac OS X 10.4.8 이후(x86만)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 리눅스(우분투 6.06 LTS,Dapper Drake)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div dir="ltr"&gt;&lt;span style="background-color: #9334d8; color: white;"&gt;안드로이드 SDK 설치&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul dir="ltr"&gt;&lt;li&gt;&lt;br /&gt;&lt;div style="margin-right: 0px;"&gt;&lt;span style="color: #252525;"&gt;&lt;strong&gt;설치&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&lt;div style="margin-right: 0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;안드로이드 SDK의 설치는 매우 간단하다.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-right: 0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;원하는 경로에 압축만 풀면 된다.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-right: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;ul dir="ltr"&gt;&lt;li&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: #252525;"&gt;&lt;strong&gt;환경변수 등록&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&lt;span style="color: #252525;"&gt;압축해제 후 반드시 안드로이드 tools 디렉토리를 환경변수 PATH에 등록해줘야 한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #252525;"&gt;아래는 윈도우XP에서 설정하는 방법이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #252525;"&gt;1단계 : 내컴퓨터를 우클릭하여 속성을 클릭한다.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #252525;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2Dy3s_HMlI/AAAAAAAAKIY/lQU-yLDc9iQ/s1600-h/n1.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2Dy3s_HMlI/AAAAAAAAKIY/lQU-yLDc9iQ/s320/n1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div dir="ltr"&gt;&lt;span style="color: #252525;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&lt;div dir="ltr"&gt;&lt;span style="color: #252525;"&gt;&lt;span style="font-size: 10pt;"&gt;2단계 : 고급탭에서 환경변수를 클릭한다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote dir="ltr" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin-right: 0px;"&gt;&lt;a href="http://1.bp.blogspot.com/_MKXTIQWWA9E/S2DzLuzs-aI/AAAAAAAAKIg/zHzSPzvUmMA/s1600-h/n2.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://1.bp.blogspot.com/_MKXTIQWWA9E/S2DzLuzs-aI/AAAAAAAAKIg/zHzSPzvUmMA/s320/n2.jpg" /&gt;&lt;/a&gt; &lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&lt;div dir="ltr"&gt;&lt;span style="color: #252525;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div dir="ltr"&gt;&lt;span style="color: #252525;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote dir="ltr" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin-right: 0px;"&gt;&lt;div dir="ltr"&gt;&lt;span style="color: #252525;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style="font-size: 10pt;"&gt;3단계 : 하단의 시스템변수에서 Path변수를 선택하고 편집버튼을 클릭한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;a href="http://3.bp.blogspot.com/_MKXTIQWWA9E/S2DzURILLKI/AAAAAAAAKIo/d55Tj8Z2Syc/s1600-h/n3.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://3.bp.blogspot.com/_MKXTIQWWA9E/S2DzURILLKI/AAAAAAAAKIo/d55Tj8Z2Syc/s320/n3.jpg" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4단계 : 안드로이드 SDK의 tools 디렉토리를 추가한다.&lt;br /&gt;&lt;/div&gt;&lt;blockquote dir="ltr" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin-right: 0px;"&gt;&lt;div dir="ltr"&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;a href="http://1.bp.blogspot.com/_MKXTIQWWA9E/S2DzfrnQucI/AAAAAAAAKIw/L6Cy8k_ZraU/s1600-h/n4.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://1.bp.blogspot.com/_MKXTIQWWA9E/S2DzfrnQucI/AAAAAAAAKIw/L6Cy8k_ZraU/s320/n4.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;span style="background-color: #9334d8; color: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Eclipse 안드로이드 플러그인 설치&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&amp;nbsp; (Eclipse ADT 플러그인 : Android Development Tools)&lt;br /&gt;&lt;/div&gt;&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&lt;div dir="ltr"&gt;안드로이드 플러그인은 여러 안드로이드 개발도구들을 Eclipse 에 적절하게 통합해 준다.&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;플러그인에는 다양한 Wizard 가 포함되어 있어 개발이 편해진다.&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;1. Eclipse를 실행한다.&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. 메뉴에서 Help &amp;gt; software updates를 선택한다.&lt;br /&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2Dz5ckkooI/AAAAAAAAKI4/C-uuZoJlPms/s1600-h/n5.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2Dz5ckkooI/AAAAAAAAKI4/C-uuZoJlPms/s320/n5.jpg" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2Dz5ckkooI/AAAAAAAAKI4/C-uuZoJlPms/s1600/n5.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="41" src="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2Dz5ckkooI/AAAAAAAAKI4/C-uuZoJlPms/s320/n5.jpg" style="filter: alpha(opacity=30); left: 282px; mozopacity: 0.3; opacity: 0.3; position: absolute; top: 2450px; visibility: hidden;" width="96" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote dir="ltr" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin-right: 0px;"&gt;&lt;div dir="ltr"&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;3단계 : Available Software 탭 &amp;amp;gt; Add site 버튼을 클릭한다.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;div class="separator" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2D0LfHwE4I/AAAAAAAAKJA/s6QoVL2b0XY/s1600-h/n6.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2D0LfHwE4I/AAAAAAAAKJA/s6QoVL2b0XY/s320/n6.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote dir="ltr" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin-right: 0px;"&gt;&lt;div dir="ltr"&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;4단계 : 원격사이트 &lt;a class="con_link" href="http://dl-ssl.google.com/android/eclipse/" target="_blank"&gt;http://dl-ssl.google.com/android/eclipse/&lt;/a&gt;를 추가하면 다음과 같이 된다.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2D0gKapupI/AAAAAAAAKJI/BVYUnYZUszU/s1600-h/n7.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2D0gKapupI/AAAAAAAAKJI/BVYUnYZUszU/s320/n7.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote dir="ltr" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin-right: 0px;"&gt;&lt;div dir="ltr"&gt;5단계 : Eclipse를 재시작 한 후 안드로이드 SDK의 경로를 설정한다.&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;메뉴에서 Window &amp;amp;gt;&amp;nbsp;Preference 를 선택하면 나오는 아래와 같은 창에서&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;SDK Location&amp;nbsp;에&amp;nbsp;안드로이드&amp;nbsp;SDK가 설치된 경로를 설정한다.&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;"&gt;&lt;a href="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2D0xH0x4MI/AAAAAAAAKJQ/DJ0Qt19y_zk/s1600-h/n8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://4.bp.blogspot.com/_MKXTIQWWA9E/S2D0xH0x4MI/AAAAAAAAKJQ/DJ0Qt19y_zk/s320/n8.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div dir="ltr"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;span class="Apple-style-span" style="background-color: #9334d8;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 안드로이드 SDK 업데이트 하기&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;처음 안드로이드 SDK 를 설치했을 경우에는 add-ons , platforms 폴더가 텅 비어있다.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;샘플을 돌려보거나 개발을 진행하려면 필요한데 SDK 플랫폼에 따라서 해당 플랫폼을 업데이트 시키면 된다.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="webkit-indent-blockquote" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin: 0px 0px 0px 40px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;1. 매니저 실행시키기 (Android SDK and AVD Manager)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;간단하다 ,위에서 안드로이드 플러그인을 설치가 잘 됐다면,&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 메뉴 아이콘상에 아래 그림같은 핸드폰 모양의 아이콘이 생겼을 것이다..&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_MKXTIQWWA9E/S2D0_2QfrAI/AAAAAAAAKJY/PffVu6sXUXs/s1600-h/n9.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://1.bp.blogspot.com/_MKXTIQWWA9E/S2D0_2QfrAI/AAAAAAAAKJY/PffVu6sXUXs/s320/n9.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #252525;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="webkit-indent-blockquote" style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none; margin: 0px 0px 0px 40px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;2단계 : Available Package 를 클릭한 후 업데이트할 플랫폼을 체크한후 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 우측 아래에 있는 Install Selected 를 클릭한다.&lt;br /&gt;&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_MKXTIQWWA9E/S2D1OdDnc4I/AAAAAAAAKJg/bR-FTp87dBo/s1600-h/n10.jpg" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" mt="true" src="http://3.bp.blogspot.com/_MKXTIQWWA9E/S2D1OdDnc4I/AAAAAAAAKJg/bR-FTp87dBo/s320/n10.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote dir="ltr" style="margin-right: 0px;"&gt;&lt;div dir="ltr"&gt;&amp;nbsp;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-4073604152884018788?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/4073604152884018788/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/sdk.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4073604152884018788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4073604152884018788'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/sdk.html' title='안드로이드 sdk 설치'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MKXTIQWWA9E/S2Dy3s_HMlI/AAAAAAAAKIY/lQU-yLDc9iQ/s72-c/n1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-5789038884455708229</id><published>2010-01-04T21:23:00.000-08:00</published><updated>2010-01-04T21:27:06.800-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='APM'/><title type='text'>[설치/설정] centos 5.0 apm source install</title><content type='html'>centos 5.0 apm source install &lt;br /&gt;&lt;br /&gt;시간 맞추기 &lt;br /&gt;rdate -s time.bora.net &lt;br /&gt;&lt;br /&gt;yum을 이용한 기본 설치 (기타 라이버러리는 알아서 설치하길) &lt;br /&gt;yum install gcc &lt;br /&gt;yum install gcc-c++ &lt;br /&gt;yum install termcap &lt;br /&gt;yum install libtermcap &lt;br /&gt;yum install libtermcap-devel &lt;br /&gt;yum install gdbm-devel &lt;br /&gt;&lt;br /&gt;yum install zlib* &lt;br /&gt;yum install libxml* &lt;br /&gt;yum install freetype* &lt;br /&gt;yum install libpng* &lt;br /&gt;yum install libjpeg* &lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql5.1.22 설치 &lt;br /&gt;./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --enable-assembler --with-thread-safe-client --with-mysqld-user="root" --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --with-readline --without-debug --without-docs --without-bench --with-charset=euckr --sysconfdir=/etc &lt;br /&gt;&lt;br /&gt;make &lt;br /&gt;make install &lt;br /&gt;cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf &lt;br /&gt;/usr/local/mysql/bin/mysql_install_db &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;APACHE2.2.6 설치 &lt;br /&gt;./configure --prefix=/usr/local/apache --enable-modules=so --enable-so --enable-rewrite &lt;br /&gt;make &lt;br /&gt;make install &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PHP5.2.5 설치 &lt;br /&gt;./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache/bin/apxs --enable-sysvshm=yes --enable-sysvsem=yes --enable-debug=no --with-ttf --with-png-dir --with-zlib-dir --with-jpeg-dir --with-gdbm --enable-ftp --enable-mbstring --enable-sockets --enable-wddx --with-freetype-dir --enable-bcmath --enable-mbregex --enable-exif --with-gd --enable-gd-native-ttf --enable-calendar --with-openssl &lt;br /&gt;make test &lt;br /&gt;make install &lt;br /&gt;cp php.ini-dist /usr/local/php/lib/php.ini &lt;br /&gt;&lt;br /&gt;★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ &lt;br /&gt;apache 실행한다. &lt;br /&gt;&lt;br /&gt;httpd.conf 설정 &lt;br /&gt;vi /usr/local/apache/conf/httpd.conf &lt;br /&gt;&lt;br /&gt;있는지 확인후 없으면 추가 &lt;br /&gt;LoadModule php5_module modules/libphp5.so &lt;br /&gt;&lt;br /&gt;/usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/modules/libphp5.so into server: /usr/local/apache/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied &lt;br /&gt;그럼 졸 당황한다. 왜냐 CentOs 3-4버전에선 없던거다..ㅡㅡ; 졸 신기하다.. &lt;br /&gt;이유는 SELinux를 사용하는 일부 Linux 배포판에서는 IDL이나 ENVI를 실행시키려고 할때 다음과 같은 오류를 보이는 경우가 있다. &lt;br /&gt;NSA가 주관하는 SELinux 프로젝트는 커널 보안에 강력한 위력을 발휘하기도 하지만 다른 소프트웨어들이 실행되는 것도 막을 경우가 있으므로 혹시 위와 같은 에러메시지를 만난다면 다음의 두 가지 중 하나를 수행하여 IDL이나 ENVI를 사용할 수 있도록 해 주자. &lt;br /&gt;&lt;br /&gt;1. cat /etc/sysconfig/selinux 변경 &lt;br /&gt;cat /etc/sysconfig/selinux 을 보면 가운데에 SELINUX=enforcing 부분을 disabled 시켜버리고 리붓 &lt;br /&gt;&lt;br /&gt;2. selinux 보안정책을 적용 &lt;br /&gt;/sbin/restorecon -R -v /usr/local/apache/modules/libphp5.so &lt;br /&gt;/usr/bin/chcon -t texrel_shlib_t /usr/local/apache/modules/libphp5.so &lt;br /&gt;★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ZEND3.3.0 설치 &lt;br /&gt;./install.sh  (설치시 php.ini 경로는 /usr/local/php/lib 로 지정) &lt;br /&gt;&lt;br /&gt;APACHE 실행 &lt;br /&gt;/usr/local/apache/bin/apachectl start &lt;br /&gt;&lt;br /&gt;MYSQL 실행 &lt;br /&gt;/usr/local/mysql/bin/mysqld_safe --user=root &amp; &lt;br /&gt;&lt;br /&gt;httpd.conf 설정 &lt;br /&gt;vi /usr/local/apache/conf/httpd.conf &lt;br /&gt;&lt;br /&gt;php파일을 웹서버에서 인식하기 위해 아래두줄 추가 &lt;br /&gt;AddType application/x-httpd-php .php .html .htm .inc &lt;br /&gt;AddType application/x-httpd-php-source .phps &lt;br /&gt;&lt;br /&gt;처음페이지로 인식할 파일명설정 &lt;br /&gt;DirectoryIndex index.html index.htm index.php &lt;br /&gt;&lt;br /&gt;MySQL5 BIN 링크 &lt;br /&gt;ln -s /usr/local/mysql/bin/mysql /usr/bin/ &lt;br /&gt;ln -s /usr/local/mysql/bin/mysqldump /usr/bin/ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;rc.local 설정 &lt;br /&gt;vi /etc/rc.d/rc.local &lt;br /&gt;&lt;br /&gt;/usr/local/apache2/bin/apachectl start &lt;br /&gt;/usr/local/mysql/bin/mysqld_safe --user=root &amp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;==============================================&lt;br /&gt;&lt;br /&gt;#/etc/profile.d/mysql.sh &lt;br /&gt;&lt;br /&gt;MYSQL_HOME=/usr/local/mysql &lt;br /&gt;export PATH=$PATH:$MYSQL_HOME/bin &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;source /etc/profile &lt;br /&gt;&lt;br /&gt;cp /usr/local/mysql/share/mysql/mysql.server /etc/init.d/mysqld &lt;br /&gt;chkconfig --add mysqld &lt;br /&gt;service mysqld start &lt;br /&gt;&lt;br /&gt;==============================================&lt;br /&gt;&lt;br /&gt;php 옵션을 보면 그다지 특별한 것이 없어 보이는듯 하고, &lt;br /&gt;MySQL 은 바이너리 배포자의 각종 튜닝이 모조리 생략된듯 한데, &lt;br /&gt;무슨 기능이 필요해서 소스설치를 하셨나요? &lt;br /&gt;혹시 아직도 rpm 의 아파치 limit 가 256 임&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-5789038884455708229?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/5789038884455708229/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/centos-50-apm-source-install.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5789038884455708229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5789038884455708229'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/centos-50-apm-source-install.html' title='[설치/설정] centos 5.0 apm source install'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-6135813621572548403</id><published>2010-01-03T19:40:00.001-08:00</published><updated>2010-01-03T20:41:08.467-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LAMP'/><title type='text'>RPM 설치 및 설치확인 for Linux</title><content type='html'>확인을 하시려면 (레드햇 리눅스 기준 설명 입니다.)&lt;br /&gt;&lt;br /&gt;# rpm -qi httpd -&gt; apache 가 rpm 으로 설정 되었는지 확인&lt;br /&gt;&lt;br /&gt;# rpm -qi php -&gt; php 가 설치 되었는지 확인&lt;br /&gt;&lt;br /&gt;# rpm -qi mysql -&gt; mysql 이 설치 되었는지 확인&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;위의 명령으로 확인하시면 설치가 되어 있으면 버젼과 몇가지 정보를 보여줍니다.&lt;br /&gt;&lt;br /&gt;설치가 안되어 있으시면 소스를 컴파일 하시는 방법과 RPM 패키지를 설치 하시는 방법이 있습니다.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;RPM 은 설치 CD 에 보시면&lt;br /&gt;&lt;br /&gt;httpd- 로 시작하는 웹서버 가 있습니다.&lt;br /&gt;&lt;br /&gt;# rpm -ivh http-version.rpm 으로 설치&lt;br /&gt;&lt;br /&gt;php- 로 시작하는 php 를 설치 합니다.&lt;br /&gt;&lt;br /&gt;# rpm -ivh php-version.rpm&lt;br /&gt;&lt;br /&gt;mysql- 로 시작하는 mysqler server&lt;br /&gt;&lt;br /&gt;# rpm -ivh mysql-version.rpm&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;설치 완료후&lt;br /&gt;&lt;br /&gt;# /etc/rc.d/init.d/httpd start &lt;br /&gt;&lt;br /&gt;-&gt; 웹서버를 시작 합니다.&lt;br /&gt;&lt;br /&gt;# /etc/rc.d/init.d/mysqld start&lt;br /&gt;&lt;br /&gt;-&gt; mysql 을 시작 합니다.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;http://서버IP 하시서 아파치 안내 화면 나오면 정상 입니다.&lt;br /&gt;&lt;br /&gt;php 확인은 &lt;br /&gt;&lt;br /&gt;# vi test.php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;phpinfo();&lt;br /&gt;&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;를 웹서버의 웹페이지 디렉토리 아래에 만드시고 http://서버ip/test.php 하시면 됩니다.&lt;br /&gt;&lt;br /&gt;(RPM 설치의 웹디렉토리는 /var/www 인것으로 기억합니다.)&lt;br /&gt;&lt;br /&gt;(서버마다 약간 차이가 있을수 있습니다. httpd.conf 에 DocumentRoot 를 확인하시면 정확한 위치를 확인 하실 수 있습니다.)&lt;br /&gt;&lt;br /&gt;## MySQL 설치&lt;br /&gt;&lt;br /&gt;[root@localhost ~]# yum install mysql mysql-* -y&lt;br /&gt;&lt;br /&gt;[root@localhost ~]# /etc/init.d/mysqld start&lt;br /&gt;MySQL 데이타베이스를 초기&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt; * Centos 5.2 설치 &lt;br /&gt;**/ &lt;br /&gt;&lt;br /&gt;package Group.. &lt;br /&gt;- Editors &lt;br /&gt;- Engineering and Scientific &lt;br /&gt;- Development Tools &lt;br /&gt;- Administration Tools &lt;br /&gt;- System Tools &lt;br /&gt;&lt;br /&gt;주의 : selinux 와 iptables 는 모두 꺼둔다. &lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt; * mysql 설치 &lt;br /&gt; * 버젼 : mysql6.0.6 i686 &lt;br /&gt;**/ &lt;br /&gt;&lt;br /&gt;mysql 을 tar xzvf 로 푼다 &lt;br /&gt;압축을 푼 mysql 을 /usr/local/ 로 이동을 하되 디렉토리 명을 mysql 로 변경한다. mv ./mysql-6.~~ /usr/local/mysql &lt;br /&gt;cd /usr/local 로 이동 &lt;br /&gt;chown -R root:root mysql 로 권한 유져 및 그룹을 root 로 준다 &lt;br /&gt;cd mysql &lt;br /&gt;./scripts/mysql_install_db --user=mysql 명령어로 data 를 생성한다. &lt;br /&gt;chown -R mysql:mysql data 로 권한 유져 및 그룹을 mysql 로 바꿔 준다 &lt;br /&gt;cp ./support-files/mysql.server /etc/rc.d/init.d/mysql 복사 &lt;br /&gt;vi /etc/rc.d/init.d/mysql 을 연다 &lt;br /&gt;basedir=/usr/local/mysql 로 기본 설정이 되어 있다. &lt;br /&gt;datadir=/usr/local/mysql/data 로 기본 설정이 되어 있다. &lt;br /&gt;바이너리 설치 경로가 다르다면 변경 해야 한다. &lt;br /&gt;/etc/rc.d/init.d/mysql start 를 한다 &lt;br /&gt;./bin/mysqladmin -uroot password 'slrlal' 로 비밀번호를 설정 해 준다.(난 테스트 섭은 slrlal로 한다) &lt;br /&gt;&lt;br /&gt;위 mysql 바이너리 설치는 6.x대가 아니라도 설치 가능하다. &lt;br /&gt;&lt;br /&gt;./bin/mysql -uroot 엔터로 mysql 에 잘 접속 되는지 확인해 보자..잘되면 오케이~~~ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt; * apache 설치 &lt;br /&gt; * 버젼 : httpd-2.2.9 &lt;br /&gt;**/ &lt;br /&gt;&lt;br /&gt;접속자 수 최대로 올리기 &lt;br /&gt;# vi server/mpm/prefork/prefork.c &lt;br /&gt;[EDITOR]#define DEFAULT_SERVER_LIMIT 256 을 &lt;br /&gt;[EDITOR]#define DEFAULT_SERVER_LIMIT 1280 으로 수정 &lt;br /&gt;저장하고 아웃 &lt;br /&gt;# vi server/mpm/worker/worker.c &lt;br /&gt;[EDITOR]#define DEFAULT_SERVER_LIMIT 16 을 &lt;br /&gt;[EDITOR]#define DEFAULT_SERVER_LIMIT 20 으로 수정 &lt;br /&gt;저장하고 아웃 &lt;br /&gt;./configure --prefix=/usr/local/apache2 --enable-so --enable-modules=so --with-mpm=worker --enable-rewrite &lt;br /&gt;make &amp;&amp; make install &lt;br /&gt;(머야??이건 뭐 다를바가 없네..ㅇ_ㅇ;;) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt; * php 설치 &lt;br /&gt; * 버젼 : php-5.2.6 &lt;br /&gt;**/ &lt;br /&gt;&lt;br /&gt;최초 설치 yum install php&lt;br /&gt;&lt;br /&gt;버전 업데이트는 다음 3줄을 각각 실행&lt;br /&gt;&lt;br /&gt;wget http://dev.centos.org/centos/5/CentOS-Testing.repo&lt;br /&gt;mv CentOS-Testing.repo /etc/yum.repos.d/&lt;br /&gt;yum --enablerepo=c5-testing update php&lt;br /&gt;&lt;br /&gt;서버 운영중 추가 설치&lt;br /&gt;&lt;br /&gt;오류 메세지 : configure: error: xml2-config not found. Please check your libxml2 installation &lt;br /&gt;해결 방법 : yum install libxml2 libxml2-devel -y &lt;br /&gt;&lt;br /&gt;오류 메세지 : configure: error: Cannot find OpenSSL's &lt;evp.h&gt; &lt;br /&gt;해결 방법 : yum -y install openssl-devel &lt;br /&gt;&lt;br /&gt;오류 메세지 : configure: error: Please reinstall the BZip2 distribution &lt;br /&gt;해결 방법 : yum -y install bzip2-devel &lt;br /&gt;&lt;br /&gt;오류 메세지 : configure: error: libjpeg.(a|so) not found. &lt;br /&gt;해결 방법 : yum -y install libjpeg-devel &lt;br /&gt;&lt;br /&gt;오류 메세지 : configure: error: libpng.(a|so) not found. &lt;br /&gt;해결 방법 : yum -y install libpng-devel &lt;br /&gt;&lt;br /&gt;오류 메세지 : configure: error: freetype.h not found. &lt;br /&gt;해결 방법 : yum -y install freetype-devel &lt;br /&gt;&lt;br /&gt;오류 메세지 : configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information. &lt;br /&gt;해결 방법 : yum -y install libc-client-devel &lt;br /&gt;&lt;br /&gt;./configure --enable-bcmath --enable-ftp --enable-filepro --enable-libxml2 --enable-memory-limit --enable-sockets --enable-spl --enable-sysvsem --enable-sysvshm --enable-track-vars --enable-versioning --enable-wddx --disable-cli --disable-debug --disable-dmalloc --disable-posix --disable-rpath --with-apxs2=/usr/local/apache2/bin/apxs --with-bz2 --with-freetype-dir --with-gd --with-gettext --with-imap=shared --with-jpeg-dir --with-kerberos --with-libxml-dir --with-mod-charset --with-mysql=/usr/local/mysql --with-png-dir --with-ttf --with-zlib --with-imap-ssl=/usr/lib --with-openssl &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/** &lt;br /&gt; * httpd.conf 설정 &lt;br /&gt;**/ &lt;br /&gt;&lt;br /&gt;cd /usr/local/apache2/conf/extra/ &lt;br /&gt;vi httpd-default.conf 를 열어 &lt;br /&gt;&lt;br /&gt;KeepAlive On &lt;br /&gt;KeepAliveTimeout 2 &lt;br /&gt;Timeout 30 &lt;br /&gt;수정 &lt;br /&gt;&lt;br /&gt;vi httpd-mpm.conf 를 열어 &lt;br /&gt;&lt;IfModule mpm_worker_module&gt; &lt;br /&gt;    StartServers        20 &lt;br /&gt;    MaxClients          500 &lt;br /&gt;    MinSpareThreads      25 &lt;br /&gt;    MaxSpareThreads    500 &lt;br /&gt;    ThreadsPerChild      25 &lt;br /&gt;    MaxRequestsPerChild  0 &lt;br /&gt;&lt;/IfModule&gt; &lt;br /&gt;수정 &lt;br /&gt;&lt;br /&gt;vi httpd.vhosts.conf 를 열어 &lt;br /&gt;&lt;VirtualHost *:80&gt; &lt;br /&gt;    AddType application/x-httpd-php .php .html .inc .htm &lt;br /&gt;    ServerAdmin 관리자 이메일 &lt;br /&gt;    DocumentRoot 최초 접속할 디렉토리 경로 예)"/home/test" &lt;br /&gt;    ServerName 도메인 또는 IP &lt;br /&gt;#  php_admin_value auto_prepend_file /home/test/move_url/move_page.html &lt;br /&gt;#  RewriteEngine on &lt;br /&gt;#  RewriteRule ^/([a-zA-Z0-9]+)$ /home/test/rewrite.html?rewrite=$i &lt;br /&gt;    php_admin_flag register_globals On &lt;br /&gt;&lt;/VirtualHost&gt; &lt;br /&gt;&lt;br /&gt;cd .. &lt;br /&gt;vi httpd.conf &lt;br /&gt;ServerName *:80 으로 변경 &lt;br /&gt;&lt;IfModule dir_module&gt; &lt;br /&gt;    DirectoryIndex index.html //index.php 추가 &lt;br /&gt;&lt;/IfModule&gt; &lt;br /&gt;Include conf/extra/httpd-mpm.conf 앞에 # 주석 삭제 &lt;br /&gt;Include conf/extra/httpd-vhosts.conf 앞에 # 주석 삭제 &lt;br /&gt;Include conf/extra/httpd-default.conf 앞에 # 주석 삭제 &lt;br /&gt;#Include conf/extra/httpd-userdir.conf 아래쪽에 &lt;br /&gt;&lt;Directory "디렉토리"&gt; &lt;br /&gt;  Order allow,deny &lt;br /&gt;  Allow from all &lt;br /&gt;&lt;/Directory&gt; &lt;br /&gt;추가 &lt;br /&gt;&lt;br /&gt;VirtureHost 에서 지정해 놓은 디렉토리 경로로 이동한 다음 index.html 을 vi 로 만들고 &lt;?phpinfo();?&gt; 명령어로 php 가 잘 설치 되었는지 확인하면 끝입니다. &lt;br /&gt;&lt;br /&gt;vi /etc/sysconfig/i18n 을 열어 모두 삭제한 뒤 &lt;br /&gt;LANG="ko_KR,eucKR" &lt;br /&gt;SUPPORTED="ko_KR,UTF-8:ko_KR:ko" &lt;br /&gt;SYSFONT="latarcyrhed-sun16" &lt;br /&gt;를 입력 하고 &lt;br /&gt;source /etc/sysconfig/i18n 실행 한다. (vi에서 한글이 깨져 보이기 때문에 설정) &lt;br /&gt;&lt;br /&gt;모든 파일 에디터 작업시 vi로 여는거 보단 vim 으로 파일을 열어서 수정&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-6135813621572548403?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/6135813621572548403/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/rpm-for-linux.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6135813621572548403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6135813621572548403'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/rpm-for-linux.html' title='RPM 설치 및 설치확인 for Linux'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-3996155770822677199</id><published>2010-01-03T19:19:00.001-08:00</published><updated>2010-01-03T19:19:51.495-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='APACHE'/><title type='text'>Apache기초명령어</title><content type='html'>Apache Web Server&lt;br /&gt; : 웹서비스를 제공하는 웹서버&lt;br /&gt;&lt;br /&gt;Server Side Script&lt;br /&gt;  - PHP : &lt;br /&gt;  - ASP : IIS 필요&lt;br /&gt;  - JSP : Tomcat 필요&lt;br /&gt;&lt;br /&gt;Client Side Script&lt;br /&gt;  - JavaScript&lt;br /&gt;  - VBScript&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;아파치가 설치 되어 있는지 확인&lt;br /&gt;# rpm -qi htpd&lt;br /&gt;# rpm -qa|grep -i httpd&lt;br /&gt;# rpm -ql httpd&lt;br /&gt;&lt;br /&gt;아파치 실행&lt;br /&gt;# /etc/rc.d/init.d/httpd start&lt;br /&gt;&lt;br /&gt;아파치 멈춤&lt;br /&gt;# /etc/rc.d/init.d/httpd stop&lt;br /&gt;&lt;br /&gt;아파치 상태 보기&lt;br /&gt;# /etc/rc.d/init.d/httpd status&lt;br /&gt;&lt;br /&gt;ntsysv 명령을 이용하여 부팅시 서비스를 동작/정지 하도록 할 수 있다.&lt;br /&gt;&lt;br /&gt;아차피의 환경 설정 파일&lt;br /&gt;# vi /etc/httpd/httpd.conf&lt;br /&gt;&lt;br /&gt;웹서비스 하고자 하는 파일을 위치 하는 디렉토리&lt;br /&gt;#cd /var/www/htm/&lt;br /&gt;기본적으로 index.html 파일을 읽어 서비스를 요청한 곳으로 전송 하여 준다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;유저별 홈페이지 디렉토리 : /home/사용자계정/public_html/ 디렉토리&lt;br /&gt;&lt;br /&gt;/etc/skel 이라는 디렉토리는 사용자 생성시 기본적으로 들어가야 할 파일들이 위치 하고 있다&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-3996155770822677199?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/3996155770822677199/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/apache.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3996155770822677199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3996155770822677199'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2010/01/apache.html' title='Apache기초명령어'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-9097706736225601740</id><published>2009-12-17T01:45:00.000-08:00</published><updated>2009-12-17T02:09:36.487-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LAST_INSERT_ID()'/><category scheme='http://www.blogger.com/atom/ns#' term='SEQUENCE'/><category scheme='http://www.blogger.com/atom/ns#' term='IDENTITY'/><category scheme='http://www.blogger.com/atom/ns#' term='MS-SQL'/><title type='text'>MSSQL [@@IDENTITY, SCOPE_IDENTITY, IDENT_CURRENT] 차이점 바로 알기</title><content type='html'>우선 이 3가지 용법에 대해서 오해들이 많은거 같다 &lt;br /&gt;인터넷의 카패, 블로그 등 자료를 검색해 보면 이 용법을 상당히 &lt;br /&gt;잘못 설명한 곳들이 많아 제대로 개념을 잡고 가고자 한다.&lt;br /&gt;&lt;br /&gt;@@IDENTITY&lt;br /&gt; --&gt; @@의 의미는 세션을 뜻한다 즉 해당 세션에서 테이블에 INSERT된 최종값을 의미한다&lt;br /&gt;      어느 정도의 부하가 있는 시스템에선 사용가능하나 멀티스레팅이 구현된 환경에서는 &lt;br /&gt;      원하는 최종값이 아닌 엉뚱한 값이 들어갈 확률이 높다&lt;br /&gt;      해당 테이블에 대한 여러 접속자가 값을 반영하고 있는 경우 사용하면 안된다. &lt;br /&gt;     싱글 스레드 전용(중규모 사이트 용)&lt;br /&gt;&lt;br /&gt;IDENT_CURRENT('테이블명')&lt;br /&gt; --&gt; 함수에서 알수 있듯이 세션에 상관 없이 해당 테이블에 대한 최종값 또는 들어갈 값을 의미한다&lt;br /&gt;      다른 IDENTITY와 다르게 데이터 입력전에 그 값을 알 수 있다 &lt;br /&gt;      하지만 테이블 전체에 대한 값을 의미 하므로 1인용 시스템에 적합하다.&lt;br /&gt;     VB로 개인용 비디오 관리 시스템 같은거 이왼 쓰면 안된다.&lt;br /&gt;     즉 실시간으로 IDENTITY를 알아야 환경에서는 이런 함수는 없다고 생각하는 편이 낳다.&lt;br /&gt;     하지만 필요할 때가 있는데 실시간 통계등 어떤 고정된 시간을 두고 데이터를 추측해야 하는 시스템&lt;br /&gt;      예를 들면 실시간 광고시스템에서 1분 단위의 디피에 들어온 큐수치를 계산하고 싶을 경우 &lt;br /&gt;      1분에 해당하는 레코드수를 구하기 위해서 COUNT를 하는 것은 매우 비효율적이다 &lt;br /&gt;      즉 현재 테이블의 IDENTITY를 테이블 단위로 정확히 숫자를 가져오고 그 전값에서 &lt;br /&gt;      차감하면 실시간 통계 계산에 편리해 진다.&lt;br /&gt;     바로 이럴때 사용하는 것이 IDENT_CURRENT('테이블') 함수이다.&lt;br /&gt;&lt;br /&gt;SCOPE_IDENTITY()&lt;br /&gt; --&gt; 마지막으로 해당 프로세스 + 해당 세션의 최종 IDENTITY를 가져오고자 할때 필요하다 &lt;br /&gt;      주로 대규모 사이트나 멀티스레드 환경에서 많이 쓰인다 &lt;br /&gt;      예를 들어 이 함수가 실행되는 곳이 SP이거나 FN이거나 TRRIGER일수도 있다 &lt;br /&gt;      그렇다면 해당 프로세스+세션으로 제한을 걸고 IDENTITY를 가져오기 때문에 &lt;br /&gt;      실시간 키코드를 리턴해야 하는 상황에선 가장 신뢰할 수 있는 함수가 된다&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;비교하는 차원에서 오라클과 MYSQL을 보자면 &lt;br /&gt;&lt;br /&gt;오라클에선 IDENTITY라는 개념 보다 시퀀스라는 개념을 사용한다 &lt;br /&gt;일종에 자동증분 전용 테이블이라고 생각하면 되는데 &lt;br /&gt;생성은  CREATE SEQUENCE ..... 로 시작한다 &lt;br /&gt;시작값과 증가값 그리고 마지막 값을 지정할 수 있고 &lt;br /&gt;그 마지막 값에 도달했을때 1부터 다시 발행할지 아닐지 정할 수 있다&lt;br /&gt;이외 자동키값 반환의 ROWID 같은 것들이 있으나 별로 권장하고 싶지는 않다 &lt;br /&gt;오라클의 경우 시퀀스라는 개념에 최적화 되어 있기 때문에 테이블을 생성할때 &lt;br /&gt;자동증분값이 필요하다면 항상 시퀀스고 같이 CREATE해야 한다 &lt;br /&gt;귀찮을 수 있지만 멀티스레드이든 싱글스레드이건 부정확한 값이 담기는 부작용이 없다&lt;br /&gt;시퀀스의 이름이 CREATE SEQUENCE NEWKEY .... 라고 할때 이름은 NEWKEY가 되고 &lt;br /&gt;현제 시퀀스 : NEWKEY.CURRVAL&lt;br /&gt;다음 시퀀스 : NEWKEY.NEXTVAL 이 된다&lt;br /&gt;더 상세한 설명은 검색해 보길 바란다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;마지막으로 MYSQL이다 &lt;br /&gt;&lt;br /&gt;LAST_INSERT_ID() 함수를 제공한다 MSSQL에 비하면 @@IDENTITY 같은 개념이다 &lt;br /&gt;그 이외 추가적인 설명은 필요 하지 않다&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-9097706736225601740?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/9097706736225601740/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/12/mssql-identity-scopeidentity.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/9097706736225601740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/9097706736225601740'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/12/mssql-identity-scopeidentity.html' title='MSSQL [@@IDENTITY, SCOPE_IDENTITY, IDENT_CURRENT] 차이점 바로 알기'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-3886595371335279624</id><published>2009-12-14T01:02:00.000-08:00</published><updated>2009-12-14T01:23:26.486-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mssql2005'/><category scheme='http://www.blogger.com/atom/ns#' term='RESTORE'/><category scheme='http://www.blogger.com/atom/ns#' term='MS-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='mssql2000'/><title type='text'>MSSQL Restore (bak) MSSQL 디비 복원 2000, 2005, 2008 통합 (by Vins)</title><content type='html'>KOREAN -------------&lt;br /&gt;&lt;br /&gt;실행 전 주의 사항 -3. 복원의 DB명은 미리 생성하지 말것(Unique DB Name)&lt;br /&gt;&lt;br /&gt;1. 확인1&lt;br /&gt;RESTORE HEADERONLY FROM DISK = '(A)backup file path and file name'&lt;br /&gt;2. 확인2&lt;br /&gt;RESTORE FILELISTONLY FROM DISK = '(A)backup file path and file name'&lt;br /&gt;&lt;br /&gt;3. 복원&lt;br /&gt;RESTORE DATABASE DB명(확인1에 DatabaseName컬럼)&lt;br /&gt;FROM DISK = '(A)backup file path and file name'&lt;br /&gt;WITH MOVE '(C)논리명(확인2에 logicalname)' TO '(E)D:\DATA파일경로\파일명.MDF',&lt;br /&gt;MOVE '(D)논리명(확인2에 logicalname)' TO '(F)D:\LOG파일경로\파일명.LDF'&lt;br /&gt;&lt;br /&gt;(A)backup file path and file name&lt;br /&gt;   --&gt; 백업 파일의 원본 위치&lt;br /&gt;(B)DBName&lt;br /&gt;   --&gt; 유일한 이름의 디피명 (먼저 복원할 디피명을 생성하지 말것)&lt;br /&gt;(C)logical DATA name&lt;br /&gt;   --&gt; 확인2의 logicalname컬럼(DATA)을 입력하면 됨(복수일시 Move절 수만큼 반복해서 기입)&lt;br /&gt;(D)logical LOG name&lt;br /&gt;   --&gt; 확인2의 logicalname컬럼(LOG)을 입력하면 됨(복수일시 Move절 수만큼 반복해서 기입)&lt;br /&gt;Statement')&lt;br /&gt;(E)D:\DATA Path\DATA File.MDF&lt;br /&gt;   --&gt; 저장하길 원하는 경로및 파일명(자동생성됨)&lt;br /&gt;(F)D:\DATA Path\DATA File.LDF'&lt;br /&gt;   --&gt; 저장하길 원하는 경로및 파일명(자동생성됨)&lt;br /&gt;&lt;br /&gt;English --------------&lt;br /&gt;&lt;br /&gt;1. Confirm Infomation 1 (C1)&lt;br /&gt;RESTORE HEADERONLY FROM DISK = '(A)backup file path and file name'&lt;br /&gt;  sample)  'C:\vinsPrivate\vins\database-backup.bak'&lt;br /&gt;&lt;br /&gt;2. Confirm Infomation 2 (C2)&lt;br /&gt;RESTORE FILELISTONLY FROM DISK = '(A)backup file path and file name'&lt;br /&gt;&lt;br /&gt;3. Restore&lt;br /&gt;RESTORE DATABASE (B)DBName(DatabaseName Column in C1)&lt;br /&gt;FROM DISK = '(A)backup file path and file name'&lt;br /&gt;WITH MOVE '(C)logical DATA name' TO '(E)D:\DATA Path\DATA File.MDF',&lt;br /&gt;MOVE '(D)logical LOG name' TO '(F)D:\DATA Path\DATA File.LDF'&lt;br /&gt;&lt;br /&gt;(A)backup file path and file name&lt;br /&gt;   --&gt; bak file and path&lt;br /&gt;(B)DBName&lt;br /&gt;   --&gt; Unique DATABASE Name (there is not DATABASE NAME Always)&lt;br /&gt;(C)logical DATA name&lt;br /&gt;   --&gt; logicalname in C2 (if Logical DATA was mutiful, you are going to write 'MOVE Statement')&lt;br /&gt;(D)logical LOG name&lt;br /&gt;   --&gt; logicalname in C2 (if Logical LOG was mutiful, you are going to write 'MOVE Statement')&lt;br /&gt;(E)D:\DATA Path\DATA File.MDF&lt;br /&gt;   --&gt; It's saving file and path, you want&lt;br /&gt;(F)D:\DATA Path\DATA File.LDF'&lt;br /&gt;   --&gt; It's saving file and path, you want&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-3886595371335279624?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/3886595371335279624/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/12/mssql-restore-bak-mssql-2000-2005-2008.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3886595371335279624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/3886595371335279624'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/12/mssql-restore-bak-mssql-2000-2005-2008.html' title='MSSQL Restore (bak) MSSQL 디비 복원 2000, 2005, 2008 통합 (by Vins)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-9159939990283799297</id><published>2009-12-03T19:11:00.000-08:00</published><updated>2009-12-03T19:12:59.981-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>c# sealed keyword (block method overriding)</title><content type='html'>메소드나 클래스를 봉인하여 상속 클래스가의 재정의(overriding)를 막을 수 있다.&lt;br /&gt;C#에서는 sealed 키워드, 자바에서는 final 키워드를 사용한다. C#과 C++ 같은 언어는 메소드가 기본적으로 봉인된 것으로 간주한다. virtual 키워드를 부여하여 봉인을 해제한다. 반면, 자바와 같은 언어에서는 기본적으로 메스도가 봉인되지 않다.&lt;br /&gt;&lt;br /&gt;봉인이 바람직한 것인지에 대한 많은 논란이 있다. 지시에 따르는 태도(directing attitude)를 가진 이들은 재정의가 가능한 클래스나 기능(features)에 대해 매우 조심스러워서 안전할 것으로 간주된 것만 확장을 허용 한다. 개발자의 여지를 허용하는 태도(EnablingAttitude)를 가진 이들은 확장이 필요한 메소드와 그렇지 않을 것을 예측할 수 없다는 견해를 갖는다. 프로그래머가 원하면 어떤 메소드라도 재정의를 할 수 있는 대신에 책임감을 갖고 주의해야 한다. 대개 나는 후자의 태도 갖는다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-9159939990283799297?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/9159939990283799297/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/12/c-sealed-keyword-block-method.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/9159939990283799297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/9159939990283799297'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/12/c-sealed-keyword-block-method.html' title='c# sealed keyword (block method overriding)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-4801610371341104972</id><published>2009-10-13T18:51:00.001-07:00</published><updated>2009-10-13T18:51:49.082-07:00</updated><title type='text'>[한용희]개발자의 심리학</title><content type='html'>&lt;DIV class="subject"&gt;[한용희]개발자의 심리학&lt;/DIV&gt;&lt;br /&gt;&lt;DIV id="body[editorcomment]"&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;DIV class="fl w680"&gt;&lt;br /&gt;&lt;DIV class="source"&gt;월간 마이크로소프트웨어 제공 &lt;/DIV&gt;&lt;br /&gt;&lt;DIV class="date"&gt;2009.09.14 / PM 04:00&lt;/DIV&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;DIV class="tags"&gt;&lt;br /&gt;&lt;DIV class="pd_l40"&gt;&lt;A href="javascript:TagsRead('개발자');"&gt;개발자&lt;/A&gt;, &lt;/DIV&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;DIV class="company"&gt;&lt;br /&gt;&lt;DIV class="pd_l64"&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;BR&gt;&lt;!--기사사이의 광고&lt;br /&gt;&lt;div style="float: left; width:650px; height:12px; padding:3px 0 0 0px; display:inline; margin:10px 0 5px 0px;"&gt;&lt;img src="http://opensource.zdnet.co.kr/image/new.gif" align="absmiddle" /&gt; &lt;a href=" http://cloud.zdnet.co.kr/program.aspx?Active=2&amp;a=10" target="_new" style="color:#206b8a; font-weight:bold; font-family:gulim; font-size:12px;"&gt;[컨퍼런스-금일마감] &lt;span style="color:#8f00b8; font-weight:bold;"&gt;한국형 클라우드의 구축 및 서비스 사례 &lt;/span&gt;- 10.13(화)&lt;/a&gt;&lt;/div&gt;                     기사사이의 광고 --&gt;&lt;br /&gt;&lt;DIV id="paper_down_img"&gt;&lt;br /&gt;&lt;DIV id="paper_contents_img"&gt;&lt;br /&gt;&lt;DIV id="body[content]"&gt;&lt;br /&gt;&lt;DIV id="__ePositionContentsArea__"&gt;&lt;br /&gt;&lt;DIV class="snap_shots"&gt;&lt;A href="http://www.zdnet.co.kr/"&gt;[지디넷코리아]&lt;/A&gt;개발자는 어떤 사람일까? 개발자는 과학자에 속한다는 사람도 있고, 엔지니어에 속한다는 사람도 있고, 예술가에 속한다는 사람도 있다. 개발자는 지적인 작업으로 새로운 것을 창조하기 때문에 예술가에 가깝다. 그럼 이러한 예술가들을 어떻게 이해해야만 잘 관리할 수 있을까? 지금부터 그에 대한 내용을 알아보자. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;개발이라는 작업은 고도의 집중력을 필요로 한다. 개발자가 개발하기 위해서는 명명규칙, 공통 API, 디자인 패턴, DB 테이블 구조, 성능, 상호 인터페이스 등등 많은 내용들을 머릿속에 장전하고 개발을 시작해야 한다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;■&lt;STRONG&gt;개발자의 직업병 &lt;/STRONG&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;이러한 내용이 머릿속에 제대로 장전되지 않으면, 오류가 생기거나 개발 속도가 떨어진다. 한 가지 일에 집중해야 하는 직업 특성상 개발자를 주변에서는 내성적인 사람이라고 오해하기도 한다. 하지만 그들 성격이 내성적이기 때문에 그런 것이 아니라, 정신의 에너지를 내부에 집중해야 하기 때문에 다른 사람이 볼 때 그렇게 보이는 것이다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;개발자들은 숲을 보기보다는 나무를 보는 경향이 있으며, 작은 것에 민감하게 반응한다. 또한 자기 관심 분야에는 굉장한 열정을 보이지만 다른 분야에는 관심을 보이지 않는다. 모든 개발자가 그런 것은 아니지만, 외부에서 개발자를 보는 인식은 대체로 위와 같다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;개발자는 자기 자신과 일을 가장 많이 한다. 타인과 같이 일하는 시간보다, 자기 자신과 대화하면서 일하는 시간이 많다. 그러다 보니 다른 사람과의 커뮤니케이션 기술이 부족한 경우가 많아서 함께 일하는 데 원활하지 못한 경우가 있다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;그런데 개발자라고 처음부터 내성적이고, 커뮤니케이션이 부족한 사람은 아니었을 것이다. 직업 특성상 자기 자신과의 싸움을 오랫동안 외롭게 하다 보니 그렇게 된 것이다. 개발자와 함께 일하는 관리자와 이해 관계자들은 이러한 개발자의 특성을 잘 이해해야만 프로젝트를 성공적으로 수행하는 데 유리하다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;■&lt;STRONG&gt;개발자의 무아지경 &lt;/STRONG&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;개발자가 고도의 집중 상태에 빠져드는 것은 마치 ‘무아지경’과도 같다(영어로는 ‘in the zone’ 또는 ‘flow’라고 한다). 한번 이런 상태에 빠지면 굉장한 속도로 개발을 해 나간다. 개발자의 생산성이 최대가 되는 순간이다. 그런데 한 가지 안타까운 것은 이 상태가 너무나도 쉽게 깨져 버린다는 것이다. 한 예를 들어보자. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;개발자가 열심히 무아지경에 빠져서 개발하고 있는데, 갑자기 고객으로부터 전화가 왔다. 개발자는 전화를 받자마자 고객으로부터 짜증 섞인 목소리를 들었다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;고객은 온갖 짜증을 내면서 이따위 시스템 못 써먹겠다고 불평불만을 쏟아낸다. 이 순간 개발자의 무아지경 상태는 깨졌고, 이를 다시 회복하는 데에는 많은 시간이 소요될 것이다. 머릿속에 장전해 놓은 각종 명명규칙, 공통 API, 디자인 패턴, DB 테이블 구조, 성능, 상호 인터페이스 등등 많은 내용이 순식간에 언로드(unload)되고 고객의 짜증섞인 불만 내용이 머릿속에 로딩(loading)된다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;이를 다시 끄집어내고(unload) 다시 무아지경에 빠지기 위해 명명규칙, 공통 API, 디자인 패턴, DB 테이블 구조, 성능, 상호 인터페이스 등의 내용을 다시 장전하기 위해서는 정신 상태부터 치유해야 한다. 갑자기 고객으로부터 온갖 욕을 얻어먹은 개발자는 정신 치유를 위해 담배를 피우던지, 음악을 듣던지 하는 휴식 시간이 필요하다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;그런데 프로젝트 막바지에 다다라서 시간이 촉박하고 깐깐한 관리자를 만났다면 그나마도 못한다. 정신적인 쇼크 상태에서 개발을 지속하다 보면 많은 오류를 양산하게 되고, 향후 고객으로부터 다시 한 번, 이 시스템 못 써먹겠다는 소리를 듣는 악순환이 이어진다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;낮에는 이해 관계자들의 전화에 시달려 일을 하지 못한 개발자는 드디어 모두 퇴근한 밤이 되어서야 자기 자신만의 시간을 가질 수 있었다. 밤새 무아지경에 빠져서 수정사항을 다 고친 후에야 퇴근했다. 그런데 다음날 아침 9시에는 관리자가 프로젝트 진행 상태를 점검하기 위해 이해 관계자와 함께 하는 회의 시간을 잡아 놓았었다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;관리자와 이해 관계자는 아침 9시에 모여서 회의가 시작되기를 기다리는데, 개발자는 아직 출근도 안했다. 관리자는 개발자가 어제 몇 시에 퇴근했는지 모르는 채, 그리고 왜 야근을 해야 하는지도 모르는 채, 매일 지각 출근한다고 이미 불만이 많았다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;고객은 아침 9시부터 불러놓고 회의도 안 한다면서 관리자를 독촉하기 시작했고, 관리자는 연신 휴대폰을 부여잡고 개발자에게 전화를 한다. 드디어 아침 10시가 되어 개발자가 나타나자, 관리자는 그동안 참았던 모든 불만을 다 쏟아냈다. 이를 묵묵히 듣고 있던 개발자는 끊었던 담배를 다시 피워야만 했다. 그렇게 프로젝트는 진행이 되었고, 그래도 끝을 보게 되었다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;드디어 프로젝트 종료보고를 하던 어느 날 그 개발자는 홀연히 사라져 버렸다. 그가 어디로 갔는지 아는 사람은 없었다. 혹자는 그가 머리를 깎고 중이 되었다는 사람도 있고, 그가 공사장에서 트럭 몰고 있는 모습을 봤다는 사람도 있고, 이민을 갔다는 사람도 있고, 다들 추측만 난무했다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;위는 실제 사례는 아니지만, 현장에서 얼마든지 있을 수 있는 사례다. 개발자는 고도의 집중상태에 한번 빠지면 엄청난 생산성을 낼 수 있지만, 아쉽게도 이 상태는 외부의 충격에 의해 쉽게 깨져버린다. 그런데 이 무아지경 상태는 context switching(문맥 변화)이 일어나는 상태에서만 깨진다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;컴퓨터에서 프로세스나 스레드가 바뀔 때 context switching이 일어난다. 하나의 CPU는 한 번에 하나의 작업만 할 수 있기 때문에, 여러 작업을 동시에 하기 위해서는 작업이 바뀔 때마다 context switching을 해서 작업을 진행하기 위한 기본적인 내용을 CPU 레지스터에 로딩해야만 한다. 사람의 두뇌도 이와 유사해 비슷한 일을 계속하는 경우에는 context switching이 일어나지 않는다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;개발자가 개발하는 중간에 지금 무슨 일을 하고 있는지 묻는 질문은 context switching을 일으키지 않는다. 하지만 위의 사례처럼 고객의 전화를 받는 작업은 context switching을 일으킬 수 있는 작업이다. 개발자는 과학자도 엔지니어도 아니다. 자기 자신과의 싸움에서 새로운 것을 창조해 내야 하는 예술가인 것이다. 그런 예술가를 마치 하나의 기계 부속품인 것처럼 고장나면 교환하면 된다고 간주하거나, 통제를 많이 하면 할수록 더 일을 잘 한다고 생각한다면, 개발자의 업무 특성을 잘 이해하지 못한 것이다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;■&lt;STRONG&gt;무아지경에 빠지기 위한 환경 &lt;/STRONG&gt;&lt;STRONG&gt;&lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/STRONG&gt;유명한 개발자 사이트인 DevX(www.devx.com)에 보면 Bryan Dollery가 2003년에 쓴 ‘개발의 심리학 이해’라는 글이 있다(www.devx.com/DevX/Article/11659). 이 글에 보면 개발자가 무아지경에 빠지는 것을 돕는 세 가지 방법이 나와 있다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;- 적절한 정신적 격리 상태를 제공할 것 &lt;BR&gt;- 창의적인 에너지를 재충전할 수 있는 적절한 시간을 제공할 것 &lt;BR&gt;- 이치에 맞는 특별한 요구를 수용해줄 것 &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;개발자가 정신적으로 집중할 수 있도록 방해되는 주변 환경을 차단해야 한다. 한 예로 수정사항이나 요구사항은 개발자가 직접 듣는 것이 아니라 관리자가 일괄 취합해서 우선순위를 정해 개발자에게 전달하는 것이 전체 프로젝트의 생산성을 높이는 데 도움이 된다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;개발자가 개발에 집중할 수 있도록 주변 환경을 조성해 주는 것이 관리자로서 해야할 첫 번째 임무인 것이다. 두 번째는 개발자가 중복된 실수를 하지 않도록 그들에게 적절한 휴식시간을 제공해 주어야 한다는 것이다. 무아지경 상태에 다시 빠질 수 있도록 적절한 휴식이 필요하기 때문이다. 세 번째는 개발자들이 원하는 특별한 요구사항이 있다면 수용해주라는 것이다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;긍정 심리학 분야의 세계적인 대가인 시카고 대학의 칙센미하이(Csikszentmihalyi) 교수는 노벨상 수상자 또는 뛰어난 과학자들의 심리 상태를 연구해 몰입(flow)에 대한 많은 책을 썼다. 특히 우리나라에도 소개된 ‘몰입의 즐거움’, ‘몰입의 경영’ 등을 통해 ‘몰입 이론’으로 세계적인 명성을 얻었다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;그가 인용한 한 유명 컴퓨터 과학자는 자신이 샤워를 할 때 가장 많은 아이디어가 떠올랐다고 한다. 그러던 그가 한 회사에 취직을 했는데, 그 회사는 샤워 부스를 제공하지 않았다. 그 이후 그는 새로운 아이디어가 떠오르지 않아서 그만 두었고 샤워부스를 제공해 주는 다른 회사로 옮겼다. 그랬더니 거기에서는 많은 아이디어가 떠올라서 일을 계속 할 수 있었다고 한다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;여기에서 샤워부스는 개발자의 특별한 요구사항에 속하는데, 아마 우리나라의 환경에서는 개발자 1명을 위해 샤워부스까지 만들어 주기는 어려울 것이다. 그것보다는 개발자들이 무아지경(몰입)에 다시 쉽게 빠질 수 있도록 적절한 휴식 공간을 제공해 주는 것이 더 좋은 방법이다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;■&lt;STRONG&gt;개발자는 멀티태스킹 기계가 아니다 &lt;/STRONG&gt;&lt;STRONG&gt;&lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/STRONG&gt;조엘은 그의 블로그의 ‘개발자는 멀티태스킹 기계가 아닙니다(Human Task Switches Considered Harmful)’라는 글에서 개발자에게 두 가지 일을 동시에 시키지 말라고 했다. 위에서 언급했듯이 개발자가 개발을 하기 위해서는 한 가지 일에 집중해야 한다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;그런데 두 가지 일을 한꺼번에 시키면 개발자는 두 가지 일 사이에서 문맥교환(context swtching)을 하느라고 오히려 전체 개발 시간이 더 늦어지게 된다. &amp;lt;그림 1&amp;gt;은 조엘이 제시한 예제이다. A라는 작업과 B라는 작업이 있는데, 각각 10초씩 걸린다. 이를 순서대로 처리하면 아래와 같다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;br /&gt;&lt;TABLE cellSpacing="5" cellPadding="0" width="480" align="center" bgColor="#ffffff" border="0"&gt;&lt;br /&gt;&lt;TBODY&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TD style="PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; PADDING-TOP: 2px" bgColor=#e6e6e6&gt;&lt;br /&gt;&lt;TABLE cellSpacing="5" cellPadding="0" bgColor="#ffffff" border="0"&gt;&lt;br /&gt;&lt;TBODY&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TD&gt;&lt;IMG src="http://image.zdnet.co.kr/2009/09/14/OeYKRUGwyHoU3Zrbq0Lh.jpg" width=480 border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;이를 멀티태스킹으로 처리하면 &amp;lt;그림 2&amp;gt;와 같다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BR&gt;&lt;br /&gt;&lt;TABLE cellSpacing="5" cellPadding="0" width="480" align="center" bgColor="#ffffff" border="0"&gt;&lt;br /&gt;&lt;TBODY&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TD style="PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; PADDING-TOP: 2px" bgColor=#e6e6e6&gt;&lt;br /&gt;&lt;TABLE cellSpacing="5" cellPadding="0" bgColor="#ffffff" border="0"&gt;&lt;br /&gt;&lt;TBODY&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TD&gt;&lt;IMG src="http://image.zdnet.co.kr/2009/09/14/MDaj3hrX85KR8K3dkYRq.jpg" width=480 border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;순서대로 처리하면 A를 처리하는 데 10초, B를 처리하는 데 20초가 걸렸다. 평균으로 하면 15초이다. 그런데 멀티태스킹으로 하면 A를 처리하는 데 19초, B를 처리하는 데 20초 걸렸다. 평균 19.5초이다. 오히려 멀티태스킹의 평균 시간이 더 큰 것을 알 수 있다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;br /&gt;&lt;TABLE cellSpacing="5" cellPadding="0" width="480" align="center" bgColor="#ffffff" border="0"&gt;&lt;br /&gt;&lt;TBODY&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TD style="PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; PADDING-TOP: 2px" bgColor=#e6e6e6&gt;&lt;br /&gt;&lt;TABLE cellSpacing="5" cellPadding="0" bgColor="#ffffff" border="0"&gt;&lt;br /&gt;&lt;TBODY&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TD&gt;&lt;IMG src="http://image.zdnet.co.kr/2009/09/14/kPixmoOqmxl8Ag92Uhmg.jpg" width=480 border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BR&gt;문맥을 교환하는 데 비용이 드는 경우도 따져봐야 한다. 실제 개발자가 멀티태스킹을 하기 위해서는 문맥 교환 비용이 들어간다. 문맥을 교환하는 데 0.5초가 걸린다고 가정하고 계산하면 &amp;lt;그림 4&amp;gt;와 같다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;br /&gt;&lt;TABLE cellSpacing="5" cellPadding="0" width="480" align="center" bgColor="#ffffff" border="0"&gt;&lt;br /&gt;&lt;TBODY&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TD style="PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; PADDING-TOP: 2px" bgColor=#e6e6e6&gt;&lt;br /&gt;&lt;TABLE cellSpacing="5" cellPadding="0" bgColor="#ffffff" border="0"&gt;&lt;br /&gt;&lt;TBODY&gt;&lt;br /&gt;&lt;TR&gt;&lt;br /&gt;&lt;TD&gt;&lt;IMG src="http://image.zdnet.co.kr/2009/09/14/tfr4UaE7mUjgLVwmEYhg.jpg" width=480 border=0&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR&gt;평균적으로 보면 멀티태스킹이 28초나 걸린다는 것을 확인할 수 있다. 이렇듯 개발자에게 두 가지 일을 동시에 시키는 것은 결국 생산성만 악화시키는 결과를 초래한다. 개발자들이 한 가지 일에 집중할 수 있도록 관리자는 일을 적절히 배분하는 기술과 요령을 익혀야 한다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;가장 최악의 케이스는 관리자가 개발자에게 할 일을 모두 던져주고 알아서 하라는 식으로 두는 경우이다. 그렇게 일을 주면 개발자는 한 가지 일에 집중할 수 없다. 관리자는 근본적으로 일에 대한 관리를 하는 사람이다. 자신이 작업에 대한 관리를 하지 않고 개발자에게 일임한다면 그 팀의 생산성은 좋지 않을 것이다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;■&lt;STRONG&gt;비자아적 프로그래밍(egoless programming)&lt;/STRONG&gt; &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;비자아적 프로그래밍은 『컴퓨터 프로그래밍의 심리학』(The Psychology of Computer Programming, Weinberg 1971)이라는 책에서 처음 언급됐다. 그 책의 요지는 개발자는 자신이 만든 프로그램에 자아를 투영해서는 안 된다는 것이다. 프로그램을 마치 자신의 작품인 것처럼 생각한다면 남들의 비판에 방어적이 되기 때문이다. 오류보고서는 인신공격으로, 검토는 위협으로, 작업에 대한 질문은 비생산적으로 생각해 오히려 제품의 품질을 떨어뜨릴 수 있다. 팀으로 작업하는 프로젝트에서는 이러한 상황을 내버려 둬서는 안 된다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;누군가가 자신의 코드에 대해 오류를 지적하면 개발자는 감정적으로 대응하게 되고, 나중에는 오류가 있더라도 지적을 하지 않는 사태가 발생해 결국에는 프로젝트의 품질이 떨어질 수 있다. 따라서 개발자는 프로그램을 자신의 작품처럼 생각해서는 안 되며, 팀 작업의 결과물로 인식해야 한다는 것이다. 이러한 ‘비자아적 프로그래밍을 위해 개발자가 갖춰야 할 10가지 지침(Ten Commandments of Egoless Programming)’이라는 것을 TechRepublic이라는 사이트에서 Lamont Adams라는 사람이 주장했다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;1. 당신은 실수할 수 있다는 것을 받아들이고 이해하라 &lt;BR&gt;실수는 일찍 발견할수록 좋은 것이다. 일찍 발견할수록 수정 비용도 적게 든다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;2. 당신의 코드는 당신의 작품이 아니다 &lt;BR&gt;코드 리뷰의 목적은 문제를 발견해서 치료하는 것이다. 그것을 개인적인 감정으로 받아들이지 마라 &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;3. 장기도 훈수 두는 사람이 더 잘 안다 &lt;BR&gt;장기를 두다 보면 장기에 몰입해서 장기를 두는 사람보다도 주변에서 훈수를 두는 사람이 더 잘 알 수도 있다. 따라서 주변에서 하는 가르침에 겸손해야 한다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;4. 조언 없이 코드를 다시 쓰지 마라 &lt;BR&gt;혼자서 독단적으로 판단해서 코드를 다시 작성하지 말고, 코드 리뷰를 통해 코드를 다시 작성해라 &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;5. 잘 알지 못하는 사람들을 존경하고, 복종하고, 참아라.비기술자들은 개발자들을 좋을 때는 오페라의 프리마돈나처럼 생각하지만, 안 좋을 때는 울보로 간주한다. 여기에 휘둘리지 마라. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;6. 세상에서 변하지 않는 진리는 변한다는 것이다. &lt;BR&gt;변화에 대해 열린 마음으로 웃으면서 받아들여라. 요구사항의 변화, 플랫폼의 변화, 기술의 변화 이 모든 것에 대해 열린 마음으로 받아 들여라. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;7. 진정한 권위는 직위가 아닌 지식으로부터 나온다.지식은 권위를 낳고, 권위는 존경을 낳는다. 그러므로 비자아적 프로그래밍 환경에서 존경을 받고 싶다면 지식을 쌓아라. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;8. 당신이 알고 있는 지식을 고수하며 싸워라. 그러나 패배는 겸허히 받아 들여라.때로는 당신의 아이디어가 채택되지 않을 수 있다. 심지어 나중에 그것이 더 낫다고 밝혀지더라도 “내가 말한 게 맞죠?”라면서 복수할 필요는 없다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;9. 독방의 개발자는 되지 마라어두운 사무실에 홀로 앉아서 콜라 살 때만 나타나는 은둔형 개발자는 되지 마라. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;10. 사람이 아닌 코드를 비판하고, 코드가 아닌 사람에게 친절해라코드에 대한 코멘트는 긍정적이며, 개선하는 방향으로 해야 하며, 기존 코드에 대한 비판적인 방향은 좋지 않다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;이러한 비자아적 프로그래밍이 정착되기 위해서는 프로젝트 팀 내에서도 노력이 필요하다. 가령 “이 프로그램은 누가 짜서 이렇게 오류가 많아”라는 식으로 말하게 되면 이는 결국 말하는 사람 스스로가 개발자와 코드를 하나로 인식한 셈이 된다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;이러한 언급을 용인하고 묵인해 주는 환경에서는 비자아적 프로그래밍을 할 수 없다. 또한 개발자가 한번 개발한 코드에 대해서는 영구적인 오류 수정 권한을 부여하는 환경에서도 비자아적 프로그래밍을 할 수 없다. 비자아적 프로그래밍은 특히 오픈소스 환경에서도 잘 적용되는 개념이다. 한명의 독창적인 작품이 아닌 공동의 작품으로 간주하는 오픈소스 환경에서는 누구든지 오류를 수정하고 개선해 가면서 함께 개발해 나갈 수 있다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;이러한 비자아적 프로그래밍은 여러 명이 작업하는 팀 환경에서는 어느정도 필요한 부분이다. 그런데 위의 10가지 지침을 다 지키려면 개발자는 소인이 아닌 군자가 되어야 한다. 남의 비판도 겸허히 받아들여야 하고, 자신이 공들여 애써 만든 작품을 남들이 무너뜨리더라도 웃으면서 받아들여야 한다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;개발자는 자존심을 다 버리고 군자가 되어야 한다. 현실적으로 쉽지 않은 일이다. 필자는 현재도 개발을 하지만, 필자가 개발하는 프로그램에는 최대한의 정성을 다 쏟으려고 노력한다. 하나의 작품을 만든다는 생각으로 내 자신의 자아를 투영한다. 그래야만 정성을 가지고 애착을 가지고 만든다. 만약 개발자가 프로그램에 자아를 심지 않는다면 어떤 정성과 애착을 가지고 잘 만들 수 있을까? 자아 없이 잘 통제하고 잘 감시하면 좋은 프로그램이 나올 수 있을까? &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;정도의 차이는 있겠지만, 극단적인 비자아적 프로그래밍도 좋지 않으며, 그렇다고 프로그램에 자신의 자아를 너무 투영한 나머지 주변의 충고를 무시하는 것도 좋지 않다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;필자는 앞으로도 내 ‘작품’에는 자아를 투영할 것이다. 자신의 작품에는 항상 최선을 다 하고 싶은 것이 예술가들의 자존심이다. 이를 무시한 채, 자아를 버리라고 강요하는 것은 이 또한 현실을 무시한 생각이다. 열린 마음으로 자신의 작품을 향한 주변의 비판을 받아들이는 예술가야말로 진정으로 좋은 작품을 만드는 예술가다. &lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;BR&gt;참고자료 &lt;BR&gt;1. 소프트웨어 공학의 사실과 오해, 로버트 L. 글래스, 2003 &lt;BR&gt;2. 조엘 온 소프트웨어, 조엘 스폴스키, 2004 &lt;BR&gt;3. Professional 소프트웨어 개발, 스티브 맥코넬, 2004 &lt;BR&gt;4. 똑똑하고 100배 일 잘하는 개발자 모시기, 조엘 스폴스키, 2007 &lt;BR&gt;5. 스크럼-팀의 생산성을 극대화시키는 애자일 방법론, 켄 슈와버, 마이크 비들, 2002 &lt;BR&gt;6. 피플웨어, 톰 디마르코, 2003 &lt;BR&gt;7. 개발의 심리학 이해, http://www.devx.com/DevX/Article/11659 &lt;BR&gt;8. 개발자는 멀티태스킹 기계가 아닙니다, http://www.joelonsoftware.com/articles/fog0000000022.html &lt;BR&gt;9. 비자아적 프로그래밍을 위한 10가지 지침, &lt;A href="http://articles.techrepublic.com.com/5100-10878_11-1045782.html"&gt;http://articles.techrepublic.com.com/5100-10878_11-1045782.html&lt;/A&gt;&lt;BR&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;STRONG&gt;[필자소개]&lt;/STRONG&gt;&lt;BR&gt;한용희 woom33@korea.com｜현재 Microsoft Visual C# MVP이며, 여러 SW 개발 프로젝트에 참여했다. 다양한 SW 개발 프로젝트에 참여해 오면서 항상 더 나은 개발 방법에 대해 고민하고 있다. &lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-4801610371341104972?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/4801610371341104972/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/10/2009.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4801610371341104972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/4801610371341104972'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/10/2009.html' title='[한용희]개발자의 심리학'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-7801948615627920409</id><published>2009-10-09T01:46:00.001-07:00</published><updated>2009-10-09T01:46:53.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>오라클 SYS_GUID() 함수</title><content type='html'>MSSQL 에 NEWID() 라는 함수가 있다. 이와 비슷한 함수가 오라클에는 SYS_GUID 함수이다.&lt;br /&gt;&lt;br /&gt;데이터베이스 레코드는 각 레코드별로 무결성을 유지 해야한다. 즉 서로다른 레코드가 같은 값을 가지면 않된다. 테이블의 어느 한 필드 값은 반드시 달라야 한다.  어떤경우 이러한 상태를 유지하기가 어려울 때가 종종 있다. 이런경우 테이블의 한 필드를 반드시 서로 다른 값을 넣어야 한다. &lt;br /&gt;&lt;br /&gt;우리가 다른 레코드와 다른 값을 갖도록 유지 하려면 다른 레코드들을 모두 검색해 보아야 할 것이다. 그러나 레코드 수가 많아지면 속도의 유지를 보장할 수 없다. 그러므로,, 항상 어느상황에서든 난수적으로 다른 값이 나오도록 하는 함수가 필요하다.  이런경우 SYS_GUID함수를 사용한다.&lt;br /&gt;&lt;br /&gt;SYS_GUID함수의 리턴값은 반드시 호출할때마다 다른 값의 문자열을 출력하도록 설계 되어 있다.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;SYS_GUID &lt;br /&gt;&lt;br /&gt;문법 &lt;br /&gt;&lt;br /&gt;sys_guid::= &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;목적 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SYS_GUID함수는 16바이트로 구성된 고유전역식별자(globally unique identifier,RAW 값)을 생성하여 반환한다. 대부분의 플랫폼에서는, 생성된 식별자는 호스트 식별자, 프로세스 또는 프로세스의 thread 식별자 또는 함수를 호출하는 thread, 프로세스 또는 thread에 대한 비반복치값(바이스의 순서)로 구성된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;예제 &lt;br /&gt;&lt;br /&gt;다음 예제는 hr.locations 테이블에서 열을 추가하고, 각행에 고유 인식자를 삽입하고, 고유전역식별자의 16바이트 행값을 32-문자 16진수 표기를 반환한다.&lt;br /&gt;&lt;br /&gt;ALTER TABLE locations ADD (uid_col RAW(32));UPDATE locations SET uid_col = SYS_GUID();SELECT location_id, uid_col FROM locations;LOCATION_ID UID_COL----------- ----------------------------------------       1000 7CD5B7769DF75CEFE034080020825436       1100 7CD5B7769DF85CEFE034080020825436       1200 7CD5B7769DF95CEFE034080020825436       1300 7CD5B7769DFA5CEFE034080020825436. . .참조: http://www.statwith.pe.kr/ORACLE/functions153.htm#i79194&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-7801948615627920409?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/7801948615627920409/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/10/sysguid.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/7801948615627920409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/7801948615627920409'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/10/sysguid.html' title='오라클 SYS_GUID() 함수'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-8490502582212277642</id><published>2009-10-07T20:54:00.000-07:00</published><updated>2009-10-07T20:56:13.573-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bigtable'/><category scheme='http://www.blogger.com/atom/ns#' term='Neptune'/><category scheme='http://www.blogger.com/atom/ns#' term='RDBMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop'/><title type='text'>RDBMS, Hadoop, Neptune, 대용량 데이터 처리의 미래</title><content type='html'>&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;최근&lt;SPAN lang="EN-US"&gt; No-SQL(&lt;A href="http://www.itworld.com/open-source/70146/no-sql-anti-database-movement-gains-steam" target=_blank&gt;http://www.itworld.com/open-source/70146/no-sql-anti-database-movement-gains-steam&lt;/A&gt;) 또는 &lt;/SPAN&gt;&lt;SPAN lang="EN-US"&gt;Anti-RDBMS(&lt;A href="http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores" target=_blank&gt;http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores&lt;/A&gt;)&lt;/SPAN&gt;라는 내용으로 &lt;SPAN lang="EN-US"&gt;RDBMS&lt;/SPAN&gt;로 부터 벗어나고자&lt;SPAN lang="EN-US"&gt;(?) &lt;/SPAN&gt;하는 실험들이 진행되고 있다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;이런 새로운 시도는 저장해야 할 데이터가 계속해서 증가하고&lt;SPAN lang="EN-US"&gt; twitter&lt;/SPAN&gt;와 같이 대량의 트렌젝션을 실시간 처리해야 하는 서비스가 많아 지면서 기존의 관계형 데이터베이스와는 다른 새로운 개념의 데이터 저장소에 대한 요구사항이 늘어났기 때문이다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;국내에서는 이제 겨우&lt;SPAN lang="EN-US"&gt; Hadoop&lt;/SPAN&gt;에 대한 기술적 검토만 수행되거나 적용되고 있는 상황이다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;따라서 관계형 데이터베이스&lt;SPAN lang="EN-US"&gt;(MySQL)&lt;/SPAN&gt;와 분산파일시스템&lt;SPAN lang="EN-US"&gt;(Hadoop FS), &lt;/SPAN&gt;분산데이터저장소&lt;SPAN lang="EN-US"&gt;(Neptune) &lt;/SPAN&gt;등에 대한 정확한 차이점과 사용 용도에 대해 혼란이 많다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;이번 글에서는 이들 사이의 차이점과 각 사용 사례별로 적합한 저장소를 살펴보고자 한다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel=File-List&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel=themeData&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel=colorSchemeMapping&gt;&lt;br /&gt;&lt;STYLE&gt;@font-face {&lt;br /&gt;	font-family: Cambria Math;&lt;br /&gt;}&lt;br /&gt;@font-face {&lt;br /&gt;	font-family: 맑은 고딕;&lt;br /&gt;}&lt;br /&gt;@font-face {&lt;br /&gt;	font-family: @맑은 고딕;&lt;br /&gt;}&lt;br /&gt;@page  {mso-page-border-surround-header: no; mso-page-border-surround-footer: no; }&lt;br /&gt;@page Section1 {size: 612.0pt 792.0pt; margin: 3.0cm 72.0pt 72.0pt 72.0pt; mso-header-margin: 36.0pt; mso-footer-margin: 36.0pt; mso-paper-source: 0; }&lt;br /&gt;P.MsoNormal {&lt;br /&gt;	TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "맑은 고딕"; TEXT-ALIGN: justify; mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; mso-pagination: none; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: "맑은 고딕"; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "맑은 고딕"; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-font-kerning: 1.0pt&lt;br /&gt;}&lt;br /&gt;LI.MsoNormal {&lt;br /&gt;	TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "맑은 고딕"; TEXT-ALIGN: justify; mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; mso-pagination: none; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: "맑은 고딕"; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "맑은 고딕"; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-font-kerning: 1.0pt&lt;br /&gt;}&lt;br /&gt;DIV.MsoNormal {&lt;br /&gt;	TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "맑은 고딕"; TEXT-ALIGN: justify; mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; mso-pagination: none; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: "맑은 고딕"; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "맑은 고딕"; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-font-kerning: 1.0pt&lt;br /&gt;}&lt;br /&gt;.MsoChpDefault {&lt;br /&gt;	mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-style-type: export-only; mso-default-props: yes&lt;br /&gt;}&lt;br /&gt;DIV.Section1 {&lt;br /&gt;	page: Section1&lt;br /&gt;}&lt;br /&gt;&lt;/STYLE&gt;&lt;br /&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;No-SQL&lt;/SPAN&gt;이나&lt;SPAN lang="EN-US"&gt; Anti-RDBMS&lt;/SPAN&gt;에서 주장하는&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;의 문제점 또는 제약 조건으로 제시하는 데이터의 속성은 주로 확장성과 안정성이다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel=File-List&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso" rel=Edit-Time-Data&gt;&lt;br /&gt;&lt;STYLE&gt;v\:* {&lt;br /&gt;	BEHAVIOR: url(#default#VML)&lt;br /&gt;}&lt;br /&gt;o\:* {&lt;br /&gt;	BEHAVIOR: url(#default#VML)&lt;br /&gt;}&lt;br /&gt;w\:* {&lt;br /&gt;	BEHAVIOR: url(#default#VML)&lt;br /&gt;}&lt;br /&gt;.shape {&lt;br /&gt;	BEHAVIOR: url(#default#VML)&lt;br /&gt;}&lt;br /&gt;&lt;/STYLE&gt;&lt;br /&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel=themeData&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel=colorSchemeMapping&gt;&lt;br /&gt;&lt;STYLE&gt;@font-face {&lt;br /&gt;	font-family: Cambria Math;&lt;br /&gt;}&lt;br /&gt;@font-face {&lt;br /&gt;	font-family: 맑은 고딕;&lt;br /&gt;}&lt;br /&gt;@font-face {&lt;br /&gt;	font-family: @맑은 고딕;&lt;br /&gt;}&lt;br /&gt;@page  {mso-page-border-surround-header: no; mso-page-border-surround-footer: no; }&lt;br /&gt;@page Section1 {size: 612.0pt 792.0pt; margin: 3.0cm 72.0pt 72.0pt 72.0pt; mso-header-margin: 36.0pt; mso-footer-margin: 36.0pt; mso-paper-source: 0; }&lt;br /&gt;P.MsoNormal {&lt;br /&gt;	TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "맑은 고딕"; TEXT-ALIGN: justify; mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; mso-pagination: none; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: "맑은 고딕"; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "맑은 고딕"; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-font-kerning: 1.0pt&lt;br /&gt;}&lt;br /&gt;LI.MsoNormal {&lt;br /&gt;	TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "맑은 고딕"; TEXT-ALIGN: justify; mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; mso-pagination: none; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: "맑은 고딕"; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "맑은 고딕"; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-font-kerning: 1.0pt&lt;br /&gt;}&lt;br /&gt;DIV.MsoNormal {&lt;br /&gt;	TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "맑은 고딕"; TEXT-ALIGN: justify; mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; mso-pagination: none; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: "맑은 고딕"; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "맑은 고딕"; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-font-kerning: 1.0pt&lt;br /&gt;}&lt;br /&gt;.MsoChpDefault {&lt;br /&gt;	mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-style-type: export-only; mso-default-props: yes&lt;br /&gt;}&lt;br /&gt;DIV.Section1 {&lt;br /&gt;	page: Section1&lt;br /&gt;}&lt;br /&gt;&lt;/STYLE&gt;&lt;br /&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;B&gt;확장성&lt;SPAN lang="EN-US"&gt;&lt;?XML:NAMESPACE PREFIX = O /&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;RDBMS&lt;/SPAN&gt;는 하나의&lt;SPAN lang="EN-US"&gt; DBMS &lt;/SPAN&gt;인스턴스 내에서 저장할 수 있는 데이터의 크기는 제한적이다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;오라클과 같은 상용&lt;SPAN lang="EN-US"&gt; DBMS&lt;/SPAN&gt;의 경우에는 하나의 인스턴스에 수십억 이상의 레코드와 수백&lt;SPAN lang="EN-US"&gt; GB &lt;/SPAN&gt;이상의 데이터를 저장할 수는 있지만 이보다 더 큰 데이터의 경우 여러 노드에 분산 배치하거나&lt;SPAN lang="EN-US"&gt; Oracle-RAC &lt;/SPAN&gt;등과 같은 분산 기반의 솔루션을 도입해야 한다&lt;SPAN lang="EN-US"&gt;. MySQL&lt;/SPAN&gt;과 같은 오픈소스&lt;SPAN lang="EN-US"&gt; DBMS&lt;/SPAN&gt;의 경우 하나의 인스턴스에서 많은 수의 레코드를 서비스하기 위해서는 적절하게 튜닝해야 하며&lt;SPAN lang="EN-US"&gt; DBMS&lt;/SPAN&gt;가 설치된 장비의 디스크 용량 내에서만 서비스 가능하다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;따라서 지금까지는 하나의 장비에서 수용 가능한 디스크 크기&lt;SPAN lang="EN-US"&gt;(&lt;/SPAN&gt;보통 수백&lt;SPAN lang="EN-US"&gt; GB) &lt;/SPAN&gt;이상의 데이터 저장에 대한 요구가 있는 경우 여러 대의&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;에 분산시키고 분산된&lt;SPAN lang="EN-US"&gt; DBMS&lt;/SPAN&gt;의 데이터 파티션에 대한 정보를 관리하는 모듈을 각자 개발하여 사용하였다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;&amp;lt;!--[if !supportLineBreakNewLine]--&amp;gt; &lt;br /&gt;&lt;DIV class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"&gt;&lt;IMG style="CURSOR: pointer" onclick="open_img('/attach/1/1152887441.jpg'); return false;" height=310 alt="사용자 삽입 이미지" src="http://www.jaso.co.kr/attach/1/1152887441.jpg" width=450&gt;&lt;/DIV&gt;&lt;/SPAN&gt;&lt;br /&gt;&lt;P&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-ALIGN: center" align=center&gt;&lt;SPAN lang="EN-US"&gt;[&lt;/SPAN&gt;그림&lt;SPAN lang="EN-US"&gt;] RBDMS&lt;/SPAN&gt;를 이용한 클러스터 구성&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;이렇게 파티션 될 경우 분리된 파티션 간에는&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;의 최고 강점인 엔티티 간의 관계연산 즉&lt;SPAN lang="EN-US"&gt; JOIN &lt;/SPAN&gt;연산을 사용할 수 없다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;이런 문제를 해결해주는 솔루션이&lt;SPAN lang="EN-US"&gt; Distributed RDBMS&lt;/SPAN&gt;이지만 비용이 비싼 단점이 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;어쨌든 최근의&lt;SPAN lang="EN-US"&gt; No-SQL&lt;/SPAN&gt;에 대한 시도는 &lt;SPAN lang="EN-US"&gt;“RDBMS&lt;/SPAN&gt;에서&lt;SPAN lang="EN-US"&gt; JOIN&lt;/SPAN&gt;을 사용할 수 없다면 굳이&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;를 사용할 필요가 있는가&lt;SPAN lang="EN-US"&gt;?” &lt;/SPAN&gt;라는 의문에서 시작했다고 할 수 있다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;이런 구성에서는 데이터의 파티셔닝&lt;SPAN lang="EN-US"&gt;, &lt;/SPAN&gt;파티셔닝에 따른&lt;SPAN lang="EN-US"&gt; query &lt;/SPAN&gt;수행 전략 등의 코드를 모두 개발자가 만들어야 한다&lt;SPAN lang="EN-US"&gt;. DBMS&lt;/SPAN&gt;의 역할 중에 하나는 구조화된 데이터의 접근에 대해 추상화된 계층을 제공하여 개발자가 쉽게 접근 가능하도록 하는 것인데&lt;SPAN lang="EN-US"&gt;, &lt;/SPAN&gt;위와 같은 구조에서는 이런 역할을 수행하는 계층을 개발자가 구현해야 하는 부담이 있다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;BR&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel=File-List&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel=themeData&gt;&lt;LINK href="file:///C:%5CUsers%5Cjindolk%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel=colorSchemeMapping&gt;&lt;br /&gt;&lt;STYLE&gt;@font-face {&lt;br /&gt;	font-family: Cambria Math;&lt;br /&gt;}&lt;br /&gt;@font-face {&lt;br /&gt;	font-family: 맑은 고딕;&lt;br /&gt;}&lt;br /&gt;@font-face {&lt;br /&gt;	font-family: @맑은 고딕;&lt;br /&gt;}&lt;br /&gt;@page  {mso-page-border-surround-header: no; mso-page-border-surround-footer: no; }&lt;br /&gt;@page Section1 {size: 612.0pt 792.0pt; margin: 3.0cm 72.0pt 72.0pt 72.0pt; mso-header-margin: 36.0pt; mso-footer-margin: 36.0pt; mso-paper-source: 0; }&lt;br /&gt;P.MsoNormal {&lt;br /&gt;	TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "맑은 고딕"; TEXT-ALIGN: justify; mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; mso-pagination: none; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: "맑은 고딕"; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "맑은 고딕"; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-font-kerning: 1.0pt&lt;br /&gt;}&lt;br /&gt;LI.MsoNormal {&lt;br /&gt;	TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "맑은 고딕"; TEXT-ALIGN: justify; mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; mso-pagination: none; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: "맑은 고딕"; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "맑은 고딕"; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-font-kerning: 1.0pt&lt;br /&gt;}&lt;br /&gt;DIV.MsoNormal {&lt;br /&gt;	TEXT-JUSTIFY: inter-ideograph; FONT-SIZE: 10pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: "맑은 고딕"; TEXT-ALIGN: justify; mso-style-unhide: no; mso-style-qformat: yes; mso-style-parent: ""; mso-pagination: none; mso-bidi-font-size: 11.0pt; mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: "맑은 고딕"; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: "맑은 고딕"; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-font-kerning: 1.0pt&lt;br /&gt;}&lt;br /&gt;.MsoChpDefault {&lt;br /&gt;	mso-ascii-font-family: "맑은 고딕"; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-theme-font: minor-bidi; mso-style-type: export-only; mso-default-props: yes&lt;br /&gt;}&lt;br /&gt;DIV.Section1 {&lt;br /&gt;	page: Section1&lt;br /&gt;}&lt;br /&gt;&lt;/STYLE&gt;&lt;br /&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;br /&gt;&lt;DIV class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"&gt;&lt;IMG style="CURSOR: pointer" onclick="open_img('/attach/1/1006992064.jpg'); return false;" height=208 alt="사용자 삽입 이미지" src="http://www.jaso.co.kr/attach/1/1006992064.jpg" width=450&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;P&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-ALIGN: center" align=center&gt;&lt;SPAN lang="EN-US"&gt;[&lt;/SPAN&gt;그림&lt;SPAN lang="EN-US"&gt;] &lt;/SPAN&gt;데이터관리시스템의 기능&lt;SPAN lang="EN-US"&gt;-&lt;/SPAN&gt;추상화된 데이터관리 계층&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;또한 이런 정적인 구성에 가장 큰 문제점은 최초 구성된 클러스터 보다 더 많은 데이터 저장 공간이 필요하게 될 경우 새로운 &lt;SPAN lang="EN-US"&gt;DBMS &lt;/SPAN&gt;인스턴스를 추가하는 것 이외에 전체 클러스터에 대해 파티셔닝 작업을 다시 해야 하며 이런 작업은 보통 시스템을 멈춘 상태에서 작업을 하거나 데이터 유실이 발생할 수 있는 아주 위험한 작업이 된다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;따라서 데이터의 크기가 하나의 서버에서 처리할 수 있는 용량&lt;SPAN lang="EN-US"&gt;(&lt;/SPAN&gt;보통 수백&lt;SPAN lang="EN-US"&gt; GB)&lt;/SPAN&gt;보다 더 큰 경우 분산 환경을 고려해야 한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;가장 간단한 방법은 앞에서도 잠깐 언급한 분산&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;를 사용하는 것이다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;분산&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;는 기존의&lt;SPAN lang="EN-US"&gt; RDBMS &lt;/SPAN&gt;기능&lt;SPAN lang="EN-US"&gt;(JOIN &lt;/SPAN&gt;등&lt;SPAN lang="EN-US"&gt;)&lt;/SPAN&gt;을 그대로 가지면서 대용량 데이터를 저장할 수 있는 솔루션이다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;분산&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;의 가장 큰 문제는 비용이다&lt;SPAN lang="EN-US"&gt;. twitter&lt;/SPAN&gt;에서 발생하는 데이터나 웹에서 발생하는 데이터 등을 위해 이렇게 고 비용 저장소가 필요하지는 않다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;물론 텔레콤 회사의 요금 계산의 기초가 되는 콜 정보 등과 같이 중요하면서 대용량을 요구하는 데이터의 경우 고가의 분산&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;에 저장할 수 있을 것이다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;다음으로 생각할 수 있는 스토리지는&lt;SPAN lang="EN-US"&gt; Hadoop &lt;/SPAN&gt;등과 같은 오픈소스 기반의 분산 데이터 저장소이다&lt;SPAN lang="EN-US"&gt;. Hadoop&lt;/SPAN&gt;은 데이터를 저장하는 파일시스템&lt;SPAN lang="EN-US"&gt;(hdfs, Hadoop distributed file system)&lt;/SPAN&gt;과 데이터를 분석하는&lt;SPAN lang="EN-US"&gt; MapReduce &lt;/SPAN&gt;두 가지 핵심적인 기능을 제공한다&lt;SPAN lang="EN-US"&gt;. Hadoop&lt;/SPAN&gt;에서 가장 오해를 많이 하는 부분이 데이터 저장 부분이다&lt;SPAN lang="EN-US"&gt;. Hadoop&lt;/SPAN&gt;에서 제공하는 데이터 저장소는 단순히 파일 시스템 기능만 제공하기 때문에 파일 내부에 저장된 데이터 중 일부를 검색하거나&lt;SPAN lang="EN-US"&gt;, &lt;/SPAN&gt;키를 이용하여 데이터를 수정하는 등과 같은 실시간 연산에서는 사용하기 어렵다&lt;SPAN lang="EN-US"&gt;. Hadoop &lt;/SPAN&gt;파일 시스템이 실시간 처리가 가능하다는 오해를 갖게 된 가장 큰 원인은&lt;SPAN lang="EN-US"&gt; Hive&lt;/SPAN&gt;라고 하는 &lt;SPAN lang="EN-US"&gt;Hadoop&lt;/SPAN&gt;의 서브 프로젝트 때문이다&lt;SPAN lang="EN-US"&gt;. Hive&lt;/SPAN&gt;는&lt;SPAN lang="EN-US"&gt; SQL&lt;/SPAN&gt;과 비슷한 문법을 이용하여&lt;SPAN lang="EN-US"&gt; Hadoop &lt;/SPAN&gt;내에 테이블을 생성하고 생성된 테이블에 데이터를 저장하거나 조회하는 기능을 제공한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;하지만 &lt;SPAN lang="EN-US"&gt;Hive&lt;/SPAN&gt;에서 수행되는 모든&lt;SPAN lang="EN-US"&gt; SQL(Query)&lt;/SPAN&gt;은 &lt;SPAN lang="EN-US"&gt;MapReduce &lt;/SPAN&gt;작업으로 수행되며&lt;SPAN lang="EN-US"&gt; Hadoop&lt;/SPAN&gt;은&lt;SPAN lang="EN-US"&gt; MapReduce &lt;/SPAN&gt;작업을 실행하는데 최소 수초 이상의 준비 작업을 거친다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;따라서&lt;SPAN lang="EN-US"&gt; Hive&lt;/SPAN&gt;는 실시간 처리를 위한&lt;SPAN lang="EN-US"&gt; SQL&lt;/SPAN&gt;이 아니라 배치 처리&lt;SPAN lang="EN-US"&gt;(MapReduce) &lt;/SPAN&gt;작업을&lt;SPAN lang="EN-US"&gt; SQL &lt;/SPAN&gt;문법을 이용해서 쉽게 해주는 도구에 불과하다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;또 다른 데이터 저장소로는 최근 많이 이슈화 되고 있는&lt;SPAN lang="EN-US"&gt; Key-value &lt;/SPAN&gt;스토리지가 있다&lt;SPAN lang="EN-US"&gt;. Key-Value &lt;/SPAN&gt;스토리지는 대용량 데이터에 대해 심플한 데이터 모델과 실시간 처리를 주요 기능으로 제공한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;따라서 엔티티의 관계 연산&lt;SPAN lang="EN-US"&gt;(JOIN)&lt;/SPAN&gt;은 지원하지 않으며 분산&lt;SPAN lang="EN-US"&gt;(&lt;/SPAN&gt;또는&lt;SPAN lang="EN-US"&gt; standalone)&lt;/SPAN&gt;된 환경에서 운영된다&lt;SPAN lang="EN-US"&gt;. Key-Value &lt;/SPAN&gt;스토리지는 구글의&lt;SPAN lang="EN-US"&gt; Bigtable &lt;/SPAN&gt;개념을 도입한 스토리지와 아마존의&lt;SPAN lang="EN-US"&gt; Dynamo&lt;/SPAN&gt;의 개념을 도입한 스토리지로 구분할 수 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;아마존의&lt;SPAN lang="EN-US"&gt; Dynamo &lt;/SPAN&gt;개념을 도입한 스토리지는&lt;SPAN lang="EN-US"&gt; DHT(Distributed Hash Table)&lt;/SPAN&gt;라고 하는 해쉬 기반의 키 파티셔닝 전략을 이용하여 데이터를 분산된 노드에서 저장한다 한다&lt;SPAN lang="EN-US"&gt;. Bigtable &lt;/SPAN&gt;개념을 도입한 스토리지는 특정&lt;SPAN lang="EN-US"&gt; Key&lt;/SPAN&gt;를 서비스하고 있는 노드에 대한 정보를 별도의&lt;SPAN lang="EN-US"&gt; META &lt;/SPAN&gt;정보로 관리하며 이들&lt;SPAN lang="EN-US"&gt; Key&lt;/SPAN&gt;에 대해서 인덱스 정보까지 가지고 있어&lt;SPAN lang="EN-US"&gt; Dynamo &lt;/SPAN&gt;계열 저장소 보다는 다양한 데이터 연산을 제공한다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;Key-Value &lt;/SPAN&gt;저장소는 기본적으로 대용량 처리를 목적으로 설계되었기 때문에 데이터의 확장성은 대체적으로 잘 지원하고 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;앞에서 언급한&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;를 분산 배치시켜 개발자가 만든 프로그램에 의해 관리되던 부분을&lt;SPAN lang="EN-US"&gt; Key-Value &lt;/SPAN&gt;저장소가 대체함으로써 개발자에게 다시 추상화된 데이터 저장소 계층을 제공하는 데이터관리시스템의 본연의 기능을 수행하고 있다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;B&gt;안정성&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;RDBMS&lt;/SPAN&gt;는 다양한 방법을 이용하여 저장된 데이터의 안정성은 확보한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;데이터 파일을 저장하는 스토리지 자체에서 안정성을 제공할 수도 있으며&lt;SPAN lang="EN-US"&gt;(&lt;/SPAN&gt;이런 스토리지는 일반적으로 가격이 비싸다&lt;SPAN lang="EN-US"&gt;), &lt;/SPAN&gt;주기적으로 백업을 받거나&lt;SPAN lang="EN-US"&gt;, RDBMS &lt;/SPAN&gt;솔루션 자체에서 제공하는&lt;SPAN lang="EN-US"&gt; replication &lt;/SPAN&gt;기능을 이용할 수도 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;이런 모든 작업이 관리자를 필요로 하게 된다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;특정&lt;SPAN lang="EN-US"&gt; DB &lt;/SPAN&gt;서버에 장애가 발생할 경우 백업 받은 데이터를 이용하여 복구하거나&lt;SPAN lang="EN-US"&gt; replication &lt;/SPAN&gt;된 서버가 다시&lt;SPAN lang="EN-US"&gt; active&lt;/SPAN&gt;한&lt;SPAN lang="EN-US"&gt; master&lt;/SPAN&gt;로 인식하게 하는 등의 작업이 필요하다&lt;SPAN lang="EN-US"&gt;. RDBMS&lt;/SPAN&gt;의 기본 전제는&lt;SPAN lang="EN-US"&gt; DBMS&lt;/SPAN&gt;가 수행된 서버에 장애가 발생하지 않는다는 가정하에 만들어진 솔루션이기 때문에 안정적인 스토리지&lt;SPAN lang="EN-US"&gt;, &lt;/SPAN&gt;백업 등과 같은&lt;SPAN lang="EN-US"&gt; DBMS&lt;/SPAN&gt;와 관련 없는 솔루션이나 기법들이 추가되어야 한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;이렇게 추가되는 항목들은 비용을 발생시키거나 더 많은 관리를 필요로 하게 된다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;또한 대용량 데이터 저장을 위해 다수의 데이터베이스 서버를 운영하는 경우라면 이런 관리가 아주 복잡하게 엉켜버릴 수도 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;수 백대의&lt;SPAN lang="EN-US"&gt; MySQL &lt;/SPAN&gt;서버를&lt;SPAN lang="EN-US"&gt; Master-Slave &lt;/SPAN&gt;관계로 구성하고 그 중&lt;SPAN lang="EN-US"&gt; 5% &lt;/SPAN&gt;서버에 장애가 항상 발생할 수 있다고 상상해보라&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;Hadoop&lt;/SPAN&gt;이나 대부분의 &lt;SPAN lang="EN-US"&gt;Key-Value &lt;/SPAN&gt;스토리지는 특정 서버의 장애를 일반적인 상황으로 간주하여 설계되어 있기 때문에 솔루션 자체 내에 안정성을 보장하고 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;데이터의 복제&lt;SPAN lang="EN-US"&gt;, &lt;/SPAN&gt;서버 장애 발생시&lt;SPAN lang="EN-US"&gt; self-healing &lt;/SPAN&gt;기능 등이 이미 구현되어 있기 때문에 특정 서버에 장애가 발생하여도 정상적인 데이터 서비스가 가능하며&lt;SPAN lang="EN-US"&gt;, &lt;/SPAN&gt;장애가 발생한 서버를 빼고 새로운 서버를 넣고 몇 개의 단순한 명령만 수행하면 새로운 노드가 추가된다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;B&gt;적합한 스토리지의 선택&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;아직까지 많은 프로젝트에서 요구사항은 대용량임에도 불구하고&lt;SPAN lang="EN-US"&gt; NAS, Local Disk, RDBMS &lt;/SPAN&gt;만을 이용하여 시스템을 설계한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;당장 시스템을 만들어 오픈 할 수는 있지만&lt;SPAN lang="EN-US"&gt; 1 ~ 2&lt;/SPAN&gt;년 내에 쌓여가는 데이터를 보면서 증설 계획이나 시스템 업그레이드 계획을 수립하게 된다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;이제 개발자&lt;SPAN lang="EN-US"&gt; NAS, Local Disk, RDBMS&lt;/SPAN&gt;뿐만 아니라 추가로 분산파일시스템&lt;SPAN lang="EN-US"&gt;, &lt;/SPAN&gt;분산데이터저장소를 이용할 수 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;시스템의 아키텍처 단계에서 요구사항 분석 후 시스템을 구성하는 데이터의 특성을 분석하고 각 특성에 맞는 적절한 스토리지를 선택함으로써 개발&lt;SPAN lang="EN-US"&gt; -&amp;gt; &lt;/SPAN&gt;관리&lt;SPAN lang="EN-US"&gt; -&amp;gt; &lt;/SPAN&gt;시스템 중지&lt;SPAN lang="EN-US"&gt; -&amp;gt; &lt;/SPAN&gt;확장&lt;SPAN lang="EN-US"&gt; -&amp;gt; &lt;/SPAN&gt;관리가 반복되는 악순환을 제거할 수 있다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;적합한 스토리지를 선택하기 위해서는 먼저 데이터가 요구하는 속성부터 정의해야 한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;일반적으로 다음과 같은 속성을 정의할 수 있다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;데이터 용량&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt"&gt;스토리지에 저장될 데이터가 수백&lt;SPAN lang="EN-US"&gt; GB &lt;/SPAN&gt;이상 이거나 한대의 장비에 저장할 수 있는지 여부&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;실시간 데이터 처리&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt"&gt;데이터의 처리&lt;SPAN lang="EN-US"&gt;(select, insert)&lt;/SPAN&gt;가 실시간 처리를 요구하는지 여부&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;데이터 복잡성&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="MARGIN-LEFT: 38pt"&gt;다양한 데이터가 존재하고 데이터 간의 관계가 복잡한지 여부&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;안정성&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt"&gt;아주 중요한 데이터라서 고 가용성을 요구하는지 여부&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;분석 작업과 연계&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt"&gt;저장된 데이터를 이용하여 분석 작업이 수행되는지 여부&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;비용&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;이런 데이터 특성에 대해 각 스토리지는 다음과 같이 지원한다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;br /&gt;&lt;DIV class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"&gt;&lt;IMG style="CURSOR: pointer" onclick="open_img('/attach/1/1027460134.jpg'); return false;" height=203 alt="사용자 삽입 이미지" src="http://www.jaso.co.kr/attach/1/1027460134.jpg" width=450&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;P&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;위의 스토리지 특성과 요구사항에서 도출된 데이터 특성을 비교하여 적합한 스토리지를 선택한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;최근 시스템은 다양한 특성을 가진 데이터를 관리해야 한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;따라서 시스템에서 사용되는 스토리지 솔루션도 과거와 같이&lt;SPAN lang="EN-US"&gt; NAS, RDBMS &lt;/SPAN&gt;두 종류로만 구성되는 것이 아니라 위에서 언급한 다양한 스토리지 구성을 고려해야 한다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;예를 들어 실시간 데이터 처리가 필요하고&lt;SPAN lang="EN-US"&gt;, &lt;/SPAN&gt;대용량이면서 비용이 싼 스토리지가 필요하면&lt;SPAN lang="EN-US"&gt; Neptune&lt;/SPAN&gt;이나&lt;SPAN lang="EN-US"&gt; Dynomite &lt;/SPAN&gt;등을 고려할 수 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;다음은&lt;SPAN lang="EN-US"&gt; RDBMS, Hadoop, Neptune&lt;/SPAN&gt;으로 구성된 시스템 사례이다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;br /&gt;&lt;DIV class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"&gt;&lt;IMG style="CURSOR: pointer" onclick="open_img('/attach/1/1269018288.jpg'); return false;" height=273 alt="사용자 삽입 이미지" src="http://www.jaso.co.kr/attach/1/1269018288.jpg" width=450&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;P&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-ALIGN: center" align=center&gt;&lt;SPAN lang="EN-US"&gt;[&lt;/SPAN&gt;그림&lt;SPAN lang="EN-US"&gt;] &lt;/SPAN&gt;애플리케이션의 구성 사례&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&amp;nbsp;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;위의 시스템 구성은 다음과 같은 요구사항을 만족하는 시스템 구성이다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;시스템으로 요청되는 데이터는 대부분 실시간으로 처리되어야 하며 데이터는 계속 누적되어야 한다&lt;SPAN lang="EN-US"&gt;(Neptune).&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;누적된 데이터는 실시간으로 조회되어야 한다&lt;SPAN lang="EN-US"&gt;(Neptune).&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;데이터 중 일부는 파일 형태의 데이터도 있다&lt;SPAN lang="EN-US"&gt;(Hadoop).&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;저장된 데이터는 주기적으로 배치 작업을 통해 분석 되어야 하며&lt;SPAN lang="EN-US"&gt;(Hadoop MapReduce) &lt;/SPAN&gt;분석된 결과 중 일부는 데이터 크기는 작지만 복잡한&lt;SPAN lang="EN-US"&gt; query &lt;/SPAN&gt;등에서 활용 가능해야 한다&lt;SPAN lang="EN-US"&gt;(RDBMS).&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;분석 결과 중 일부는 대용량 데이터이며 실시간으로 화면에서 조회 가능해야 한다&lt;SPAN lang="EN-US"&gt;(Neptune).&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoListParagraph" style="MARGIN-LEFT: 38pt; TEXT-INDENT: -18pt"&gt;&amp;lt;!--[if !supportLists]--&amp;gt;&lt;SPAN lang="EN-US"&gt;&lt;SPAN&gt;-&lt;SPAN style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&amp;lt;!--[endif]--&amp;gt;데이터 분석은 요구사항이 수시로 변경될 수 있으며 요구사항 변경에 따라 기존 저장된 데이터를 이용하여 빠르게 분석 가능해야 한다&lt;SPAN lang="EN-US"&gt;(Hadoop MapReduce).&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal"&gt;&lt;B&gt;결론&lt;SPAN lang="EN-US"&gt;&lt;O:P&gt;&lt;/O:P&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;최근&lt;SPAN lang="EN-US"&gt; Hadoop, Neptune &lt;/SPAN&gt;등과 같은 다양한 스토리지가 나오고 있으며 일부 개발자는 이를 자신의 시스템에 적용해보고자 기술적 욕심을 가지고 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;하지만 스토리지의 선택은 신중해야 하며 데이터의 특성에 적합만 스토리지를 선택해야 한다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;그렇지 않으면 개발 시 많은 공수가 필요하거나 시스템 오픈 후 &lt;SPAN lang="EN-US"&gt;1 ~ 2&lt;/SPAN&gt;년 후에 문제가 발생할 수 있다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;SPAN lang="EN-US"&gt;Neptune&lt;/SPAN&gt;이나&lt;SPAN lang="EN-US"&gt; HBase&lt;/SPAN&gt;와 같은 &lt;SPAN lang="EN-US"&gt;Bigtable &lt;/SPAN&gt;기반의 데이터 저장소를 사용하고 싶다는 문의가 많은데 요구사항을 자세히 분석해보면 &lt;SPAN lang="EN-US"&gt;Hadoop + RDBMS&lt;/SPAN&gt;로 충분히 해결 가능한 구성인 경우가 많다&lt;SPAN lang="EN-US"&gt;. Neptune&lt;/SPAN&gt;과 같은 저장소가 사용되는 기본 전제조건은 실시간 처리 여부와 데이터 용량이다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;실시간 처리가 필요하고 데이터가 작으면&lt;SPAN lang="EN-US"&gt; RDBMS &lt;/SPAN&gt;사용하는 것이 최상의 선택이다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;개발자도 익숙하고 다양한 데이터 연산을 제공하기 때문이다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;실시간 처리가 필요하고 데이터 용량이 많은 경우라면&lt;SPAN lang="EN-US"&gt; Neptune&lt;/SPAN&gt;이나 분산&lt;SPAN lang="EN-US"&gt; RDBMS&lt;/SPAN&gt;를 고려할 수 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;저비용이며 상대적으로 덜 중요한 데이터이면&lt;SPAN lang="EN-US"&gt; Neptune&lt;/SPAN&gt;을 사용할 수 있다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;대용량이면서 실시간 처리가 필요 없는 경우라면&lt;SPAN lang="EN-US"&gt; Hadoop &lt;/SPAN&gt;만으로도 충분하다&lt;SPAN lang="EN-US"&gt;. &lt;/SPAN&gt;저장된 데이터를 배치로 분석하였는데 분석된 결과가 다시 실시간으로 서비스 되어야 하고 대용량인 경우라면&lt;SPAN lang="EN-US"&gt; Neptune&lt;/SPAN&gt;과 같은 저장소를 사용해야 한다&lt;SPAN lang="EN-US"&gt;.&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class="MsoNormal" style="TEXT-INDENT: 10pt"&gt;&lt;/P&gt;&lt;br /&gt;&lt;FIELDSET style="PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 20px 0px; PADDING-TOP: 5px"&gt;&lt;LEGEND&gt;&lt;SPAN&gt;&lt;STRONG&gt;크리에이티브 커먼즈 라이센스&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/LEGEND&gt;&lt;!--Creative Commons License--&gt;&lt;br /&gt;&lt;DIV style="MARGIN-TOP: 3px; FLOAT: left; WIDTH: 88px"&gt;&lt;A href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank rel=license&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" alt="Creative Commons License" src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png"&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;DIV style="MARGIN-TOP: 3px; MARGIN-LEFT: 92px; TEXT-ALIGN: justify"&gt;이 저작물은 &lt;A href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank rel=license&gt;크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스&lt;/A&gt;에 따라 이용하실 수 있습니다. &lt;!-- Creative Commons License--&gt;&lt;!-- &lt;rdf:RDF xmlns="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&gt;&lt;br /&gt;			&lt;Work rdf:about=""&gt;&lt;br /&gt;			&lt;license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" /&gt;&lt;br /&gt;			&lt;/Work&gt;&lt;br /&gt;			&lt;License rdf:about="http://creativecommons.org/licenses/by-nc-nd/"&gt;&lt;br /&gt;			&lt;permits rdf:resource="http://web.resource.org/cc/Reproduction"/&gt;&lt;br /&gt;			&lt;permits rdf:resource="http://web.resource.org/cc/Distribution"/&gt;&lt;br /&gt;			&lt;requires rdf:resource="http://web.resource.org/cc/Notice"/&gt;&lt;br /&gt;			&lt;requires rdf:resource="http://web.resource.org/cc/Attribution"/&gt;&lt;prohibits rdf:resource="http://web.resource.org/cc/CommercialUse"/&gt;&lt;/License&gt;&lt;/rdf:RDF&gt; --&gt;&lt;/DIV&gt;&lt;/FIELDSET&gt; &lt;br /&gt;&lt;P class="infoAuthor"&gt;&lt;SPAN&gt;&lt;DFN&gt;Posted&lt;/DFN&gt; by&lt;/SPAN&gt; &lt;CITE&gt;김형준&lt;/CITE&gt;&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-8490502582212277642?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.jaso.co.kr/364' title='RDBMS, Hadoop, Neptune, 대용량 데이터 처리의 미래'/><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/8490502582212277642/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/10/rdbms-hadoop-neptune.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/8490502582212277642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/8490502582212277642'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/10/rdbms-hadoop-neptune.html' title='RDBMS, Hadoop, Neptune, 대용량 데이터 처리의 미래'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-6779102864746747716</id><published>2009-10-07T01:21:00.000-07:00</published><updated>2009-10-07T01:22:53.823-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gungho'/><category scheme='http://www.blogger.com/atom/ns#' term='Subversion'/><title type='text'>원도우에서 버젼 컨트롤러 사용하기 (Subversion 사용하기)</title><content type='html'>Subversion windows 서버에서 해줄 것.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;목적 : 버전 컨트롤 시스템을 윈도우NT 서버에 설치하고, tcp/ip를 통해서 소스를 관리할 수 있도록 한다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;1. Subversion을 server에 설치&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. reposiotory 폴더 생성하기&lt;br /&gt;- D:\repos 폴더를 만든다.&lt;br /&gt;- D:&gt;svnadmin create –fs-type fsfs d:\repos ;repos폴더를 파일시스템으로 만든다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. 사용자 인증을 한다. (TortoiseSVN 도움말 항목 SettingUp A Server/Svnserve Based Server 항목중 Authentication with svnserve 참조)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; d:\repos의 svnserve.conf 항목 수정&lt;br /&gt; [general]&lt;br /&gt; anon-access=read ; 읽기 가능&lt;br /&gt; auth-access=write&lt;br /&gt; password-db=passwd.conf&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;passwd.conf파일의 내용은&lt;br /&gt; [users]&lt;br /&gt; username=password ; nicejay=123456&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;4. subverion manager 수행  ; svnserve를 서비스로 돌리기 위함&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 다운로드 : http://www.pyrasis.com/main/SVNSERVEManager&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Client TortoiseSVN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; 다운로드 http://tortoisesvn.tigris.org/&lt;br /&gt; Repo-browser의 url&lt;br /&gt; svn:://&lt;ip&gt;/repos&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;jay&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;참고 : cvsnt는 2003서버에서 설치가 잘 안돼서 포기.. sourcesafe는 비싸서..&lt;br /&gt;svn 프로토콜은 3690 포트사용&lt;br /&gt;작업관리자를 통해 svnserve 모듈 동작 확인&lt;br /&gt;netstat –na 를 사용하여, 3690 port listening 확인&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-6779102864746747716?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/6779102864746747716/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/10/subversion.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6779102864746747716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/6779102864746747716'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/10/subversion.html' title='원도우에서 버젼 컨트롤러 사용하기 (Subversion 사용하기)'/><author><name>HARU</name><uri>http://www.blogger.com/profile/00584128633258589494</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-2111664715296546962</id><published>2009-07-22T18:43:00.001-07:00</published><updated>2009-07-22T19:15:02.521-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='소프트웨어문화'/><category scheme='http://www.blogger.com/atom/ns#' term='개발문화'/><category scheme='http://www.blogger.com/atom/ns#' term='소프트웨어'/><title type='text'>SW개발자의 희생을 요구하는 문화는 바뀌어야 한다</title><content type='html'>&lt;a href="http://image.zdnet.co.kr/images/columns_writer/inc/inc_hanseok.ryu.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 126px; height: 75px;" src="http://image.zdnet.co.kr/images/columns_writer/inc/inc_hanseok.ryu.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;지난 7월 7일, 티맥스소프트의 티맥스윈도 제품 공개 후 업계와 인터넷이 시끄럽다. 논란의 주제들도 다양하다. OS 개발이 과연 우리 수준에 가능한 일이고 또한 필요한 일인가, MS 호환 제품을 굳이 만들어야 하는가, 오픈소스 도용 의혹, MS와의 상표권 분쟁, 박대연 회장의 발언 논란까지 티맥스와 관련된 이슈들이 참으로 많다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;물론 티맥스의 성공과 박대연 회장의 사업가로서의 능력은 명백하게 인정할 만 하다. 티맥스는 작년에 매출 1천억원을 돌파했는데, 국내 소프트웨어 산업의 현실을 감안할 때 무척 놀라운 일이다. 불가능해 보이는 목표를 향한 그의 공격적인 경영 덕분에 가능한 일이었다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;박대연 회장의 주장대로 이번에 OS만 제대로 개발된다면, 전세계에서 IBM과 MS 다음으로 데이터베이스, 미들웨어, OS 모두를 보유한 토털 소프트웨어 업체가 될 수도 있다. 소프트웨어 산업의 가장 핵심적인 제품 세가지를 모두 보유하게 되는 것이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;하지만 빛이 있으면 그림자도 있다. 티맥스는 부채가 1천500억원이고 작년 영업이익은 14억원에 불과하다. 여전히 티맥스의 소프트웨어들은 국내용이고, 또한 SI 프로젝트의 비중이 상당하고, 작년에만 직원 수가 두 배로 늘어 조직 관리에 대한 잡음이 회사 외부에까지 들리고, 올 1분기에 150억원의 적자를 냈고, 급여가 제때 지급되지 않아 자금위기설도 있었고, 최근에는 자구책으로 임직원들이 증자에 참여하기도 했다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;필자는 티맥스가 OS를 개발하는 것 자체를 평가절하하고 싶은 마음은 전혀 없다. 그것은 경영자의 사업 전략이자 의사결정 영역이기 때문이다. 어려운 목표에 도전하기로 한 사업적 결정을 존중하고 싶다. 다만, 티맥스가 업계에 미치는 영향이 상당하기에(또한 논란이야말로 커다란 에너지 소모가 아니던가), 그러한 관점에서 다음과 같은 세가지 사항을 살펴보고자 한다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;첫째, 개발자들의 희생을 바탕으로 제품을 만드는 문화는 바뀌어야 한다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;티맥스에 따르면, 티맥스윈도의 개발에 350명의 개발자가 참여하고 있다고 한다. 티맥스는 과거 DBMS의 개발에만 7년이 걸렸다고 하는데, 지난 5월까지만 해도 DBMS보다 훨씬 복잡성이 높은 OS 개발과 관련하여 다음과 같이 주장했다. 티맥스는 OS 개발을 올해 상반기에 끝마쳐서, 올 7월에 출시한 후 8월에는 일반인 대상의 테스트를 하고, 늦어도 10월 1일에 소비자가 구매할 수 있도록 하겠다고 호언한 바 있다. 하지만 지난 7일의 발표회에서 선보인 제품은 베타는커녕 알파 버전이랄 수도 없는 것이었다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;이렇듯 말도 안 되는 일정의 수립이야말로, 저명한 소프트웨어 공학자인 에드워드 요든(Edward Yourdon)이 말한 ‘죽음의 행진(Death March)’ 프로젝트의 가장 핵심적인 요건이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;티맥스는 MS 대비 100분 1의 인력으로 OS를 개발하고 있는 상황인데, 박대연 회장은 개발자들에게 “꿈속에서 프로그램이 보이면 문제다. 꿈속에서 에러를 찾아야 한다”고 강조한다고 한다. 그 자신 스스로 ‘8-10맨’이라며 오전 8시 출근해서 오후 10시에 퇴근하며, 또한 자신의 목표 달성을 위해 지난 25년간 영화, 드라마를 단 한번도 보지 않았다고 한다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;그런 타입의 경영자는 모든 산업에 존재하는데, 자신의 열정만큼 직원들에게도 열정을 강요하곤 한다. 실제로 그는 발표회와 인터뷰에서 직원들이 얼마나 희생하고 있는 지를 강조하며, 이혼당한 개발자, 건강 이상으로 쓰러진 개발자 이야기를 공공연히 밝혀왔다. 직원들의 가정파괴와 건강상실은 경영자로서 부끄럽게 생각할 일이지 자랑스러워 할 일이 아니다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;우리는 한국에서 그런 식의 죽음의 행진 프로젝트를 지금까지 많이 보아왔다. “지금의 고생만 참으면 파라다이스를 만날 수 있어” 프로젝트 말이다. 하지만 아무도 파라다이스를 만난 적은 없었다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;인간의 정신에 의한 100% 순도의 멘탈 작업으로 만들어지는 소프트웨어는 희생에 의해 창조되는 것이 아니다. 그렇게 해서는 A+급 소프트웨어가 나올 수 없다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;해외의 성공한 소프트웨어 기업들을 살펴보면 공통점이 있다. 직원들이 자유롭고 즐겁고 행복하다는 것이다. 바로 그런 가운데 고도의 집중력을 발휘함으로써 최상의 정신적 산물인 소프트웨어가 창조된다. 그렇다. 진정으로 가치 있는 A+급의 소프트웨어는 고통을 참고 희생하는 가운데 만들어지는 것이 아니라, 자유롭고 행복한 환경에서 만들어진다. 필자는 그것이 바로, 한국이 아직까지 소프트웨어 산업에서 성공을 만들어내지 못한 가장 큰 이유라고 믿는다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;개발자들이 피곤한 몸을 이끌고 억지로 야근하는 상황에서는 비록 개발이 진척된다고 하더라도, 분노와 고통의 안 좋은 기운이 코드에 스며들어 버그가 양산되고 결국 품질이 저하된다. 해외의 연구에 따르면, 일주일에 20시간 정도의 야근을 할 때는 생산성이 증가할 수도 있지만, 이후에는 분명히 쉬어줘야 하며 그렇지 않으면 순생산성이 낮아진다. 야근은 임시일 뿐 지속되어서는 안 되는 것이다. 삶에서 오로지 일이 전부인 일중독자들을 제외하고는 다들 경험상 이 말에 동의할 것이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;과연 티맥스가 전세계의 선진 소프트웨어 기업들에서는 찾아볼 수 없는 죽음의 행진 방식을 통해 제대로 된 OS를 만들어 낼 수 있을까? 물론 성공할 가능성이 희박하다고 보여지지만, 설사 성공한다고 하더라도 바람직한 일이 아니다. 국내에서 그런 죽음의 행진 풍토가 더욱 일반화될 것이기 때문이다(물론 지금도 충분히 일반화되어 있지만 말이다). &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;한국의 개발자들에게 고하건대, 어떻게 대해도 해내니까 어떻게든 학대하는 것이다. 그렇게 해서 결과물을 완성시켰다고 하더라도 소프트웨어 산업은 발전하지 않는다. 그것이 바로 소프트웨어 산업이 다른 종류의 산업들, 즉 제조업, 건축/토목업 등과 다른 점이다. 육체와 달리 정신은 여유가 있을 때야 비로소 제대로 동작하기 때문이다. 개발자들의 희생을 통해 만들어진 소프트웨어는 언제나 창조성이 떨어지고 본질적인 품질 문제가 존재한다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;필자는 지금까지 이혼을 당하고, 회사에서 쓰러져 식물인간이 되고, 종교에 귀의하고, 다른 직업으로 전직하는 개발자들을 많이 보아왔다. 산업 논리와 경영자의 욕심으로 인해 더 이상 개발자들이 희생 당하는 일이 없기를 바란다. 어떻게든 제품이 나오면 무얼 하겠는가? 개발자들이 치를 떨며 업계를 떠나는 이 현실에서 말이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;한국의 소프트웨어 산업에서 진정으로 필요한 것은 개발자들의 희생정신이 아니라 즐겁게 일하며 최상의 창조성을 발휘할 수 있는 환경이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;둘째, 오픈소스 도용 의혹에 대해 명확히 밝힐 필요가 있다. &lt;br /&gt;&lt;br /&gt;많은 사람들이 티맥스가 너무도 짧은 시간에 적은 인력들로 100% 자체 기술로만 OS를 개발하여 출시하는 것이 실제로 가능한가라는 의문을 갖고 있다. 사실 양적, 질적으로 그것은 불가능한 것이다. 유능한 인재들의 집합체인 마이크로소프트조차 5조원의 돈을 투자하여 개발하고서도 좋은 평가를 받지 못하는 분야가 바로 OS이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;그런 상황에서 티맥스의 OS 개발자라고 밝힌 이가 모커뮤니티 게시판에 오픈소스를 참조하여 개발하고 있다는 글을 올리면서, 티맥스윈도의 오픈소스 도용 의혹이 인터넷에 급격하게 퍼지게 되었다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;의혹의 핵심은 “티맥스윈도가 오픈소스의 짜깁기가 아니냐”는 것이다. 실제로 인터넷에는 MS 윈도 에뮬레이터, 호환 OS 개발을 위한 쓸만한 오픈소스들이 많이 존재한다. 리눅스 상에서 윈도 프로그램을 가동하기 위한 Wine, 그리고 MS 윈도와 호환성 있는 OS를 개발하는 ReactOS 등이 대표적이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;그런데 소스가 공개된 오픈소스라고 해서 라이선스가 없는 것이 아니다. 오픈소스의 종류에 따라 라이선스들도 다 다르고 무척 복잡하여 함부로 상용 소프트웨어의 개발에 사용해서는 안 된다. 저작권 침해로 소송을 당할 수도 있기 때문이다. 그래서 일부 대기업에서는 자사 개발자들이 오픈소스를 함부로 사용하지 못하도록 교육도 하고 있다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;물론 오픈소스를 가져다 쓰는 것 자체가 문제는 아니다. 그 사용을 명확히 밝히고 라이선스의 내용을 준수하면 된다. 만일 기존 오픈소스를 개선한 부분이 있다면 오히려 그것을 공개함으로써 오픈소스 커뮤니티에서 훌륭한 기여자로 평가 받을 수도 있다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;결국 현재의 문제점은, 많은 사람들이 의심을 하고 있고 티맥스의 개발자라고 주장하는 이가 올린 글로 인해 의혹이 더욱 커졌음에도 불구하고 티맥스측에서 “얼마나 오픈소스를 사용했는지, 그리고 라이선스를 지켰는지”에 대해 정확히 밝히고 있지 않다는 점이다. 이와 관련해서 오픈소스 진영의 사람들 중에는 분노를 표시하는 사람들이 많다. 티맥스는 오픈소스 도용 의혹이 해소될 수 있도록 공식적인 입장을 표명할 필요가 있다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;셋째, 애국심에 호소하는 자세와 불필요한 언사, 정치적 행보는 자제할 필요가 있다. &lt;br /&gt;&lt;br /&gt;티맥스윈도와 관련한 여러 가지 의혹과 논란 및 반감을 증대시키는 것은 박대연 회장의 일련의 발언들 덕분이다. 특히 그는 국민이 인정해주는 국민 소프트웨어 기업이 될 것임을 공공연하게 강조해왔다. 그런데 국민 가수가 되고 싶다고 될 수 없듯이, 국민 소프트웨어 기업 또한 스스로 원한다고 해서 될 수 있는 것이 아니다. 그리고 애국, 국민 등의 키워드를 강조해서 잘 된 기업이 없다. 그 자체로 정치적인 성향을 증명하는 것이기 때문이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;최근 중앙일보와의 인터뷰를 통해 알려진 그의 어록은 대단하다. 일부만 살펴보면 다음과 같다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;“토종 OS의 등장은 한국 산업사에서 조선이나 자동차, 반도체 산업 진출에 비견되는 위대한 도전이다.” &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;“티맥스윈도와 오피스로 2012년까지 세계 OS 시장의 10%를 차지할 것이다.” &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;“내년에 해외법인 10개를 세울 것이다. 2011년에는 30개가 추가된다.” &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;(인력이 부족하지 않냐는 질문에 대해) “실제로 MS윈도 개발의 핵심인력은 5명에 불과하다. 나머지는 테스트하고 성능을 개선하는 인력이다.” &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;“구글의 OS는 우리 기술의 5분의 1도 안 된다.” &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;또한 지난 7일의 시연에서 올드 게임 구동과 동영상 재생조차 제대로 되지 않았음에도 불구하고, 여전히 1%가 미완이며 단순 에러라서 향후 3개월 내에 문제점이 0.1%도 남지 않을 것이라고 주장하기도 했다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;이런 경영자의 주장은 회사의 이미지에 나쁜 영향만 끼칠 뿐이다. 개발은 말로 하는 것이 아니다. 제품으로 보여주어야 한다. 기업용 제품인 DBMS, 미들웨어에 대해 호언장담을 할 때에는 대중의 관심이 적어서 그럭저럭 묻힐 수 있었겠지만, 개인 소비자 대상의 OS에 대해 이런 식으로 얘기를 해서는 곤란하다. 기업의 신뢰성에 심각한 손상이 갈 뿐이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;티맥스 내부에서 “회장님, 이러시면 안됩니다.”라고 말하는 사람조차 없는 것일까? 그의 경영 스타일로 보건대 충분히 그럴 거 같다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;그리고 이번 발표회에서 테잎커팅(실제로는 전원을 키는 방식)에 강만수 국가경쟁력강화위원회 위원장을 비롯하여 금융감독원장, 국회의원 등 정재계 인사들이 다수 참석했다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;이에 대해 발표회의 많은 참석자들이 의아하게 생각했으며, 티맥스의 정치적 행보에 다시금 의심의 눈초리를 보내고 있다. 핵심 개발자들이 테잎커팅을 할 수는 없었을까? 그랬다면 그들의 자부심을 높였을 것이고 업계 전반에 훈훈한 미담이 되었을 것이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;티맥스는 기업의 이미지와 티맥스윈도의 마케팅을 위해서 어떻게 처신하는 것이 가장 올바른가를 다시 한번 생각해보았으면 좋겠다. 현재와 같은 방식은 안티들을 양산할 뿐이다. 적어도 이 기술업계의 승자들(예컨대 애플, 구글 등)은 거의 종교라고 할 수 있을 정도로 강력한 팬들을 거느리고 있다. 그런 팬을 만들어내지는 못할망정 안티들만 늘어난다면 티맥스윈도의 앞날은 잿빛이 될 뿐이다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;이상으로 업계와 인터넷에서 큰 논란이 되고 있는 티맥스윈도와 관련된 세 가지 주요 이슈들을 개발자들의 희생, 오픈소스 도용 의혹, 정치적 행보라는 관점에서 살펴보았다. 필자의 주장 또한 하나의 견해일 뿐이므로, 이에 대해서도 바라보는 관점에 따라서 논란이 있을 수 있다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;하지만 위의 세가지 내용은 국내 소프트웨어 업계에서 오래 전부터 만연되어 온 구태의연한 문제점들이다. 새삼스러울 것이 없는 것들이다. 그 정점을 티맥스가 찍고 있다고 본다. &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;혁신적인 제품을 만들려면 그 방식부터 혁신이 필요하다. 그럼에도 불구하고, 티맥스가 성공적인 제품을 만들어 낼 것인지 애정과 비판의 마음으로 계속 지켜보면서 필요하다면 추가적인 글을 쓰도록 하겠다. @&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;위는 류한석 IT컬럼리스트가 쓴 컬럼이며 지디넷에서 발취하였습니다.&lt;br /&gt;&lt;br /&gt;------------- 위 글을 읽으면서 느낀점 -----------&lt;br /&gt;&lt;br /&gt;나도 지난 10년을 개발자로서 일해왔다 &lt;br /&gt;돌이켜보면 10년전 환경은 아침에 퇴근할때가 많았다 &lt;br /&gt;4~5시간 자고 또 출근해야 했던 고3과 같았던 3년이 나에게도 있었다&lt;br /&gt;&lt;br /&gt;그 후로도 SI업체, 서비스 업체 등등을 지내면서 나와 다른 일을 하는 나의 친구들과 &lt;br /&gt;체감적 노동시간을 비교해 보아도 1.5배 이상이 되는 거 같았다 &lt;br /&gt;&lt;br /&gt;늘 친구들 모임에 갈수가 없었고 친구들이 만신창이가 되고 서야 그 자리에 도착을해&lt;br /&gt;뒤수습(?)을 하기 일쑤였다 &lt;br /&gt;&lt;br /&gt;빡빡한 개발시간,&lt;br /&gt;요구분석을 하기도 전에 마감시간이 정해진 업무들 - 실제프로젝트명에 날짜가 붙는경우도 많다 =_=&lt;br /&gt;&lt;br /&gt;결국 1년을 휴일없이 출근해 본적도 있었고 일요일 저녁 9시가 되면 월요일 출근 준비를 하는게 아니라&lt;br /&gt;매일 월요일 같은 일상의 연속이었다 &lt;br /&gt;&lt;br /&gt;그러다 일본으로 오게 되었고 일본에서 IT회사들에서 근무를 하게 되었다 &lt;br /&gt;별반 다를거 없을꺼라 생각했던 환경은 천지차이였고 &lt;br /&gt;한국에서 일반적인 개발자의 희생 강요는 &lt;br /&gt;여기서는 적어도 일반적인 문화는 아니었다 &lt;br /&gt;&lt;br /&gt;일본은 한국 IT 인력을 좋아한다 , 아니 한국 SI업계를 좋아하는지도 모를겠다 &lt;br /&gt;불가능한 일정에 업무를 잘 소화해 주는 싸고 싼 인력들 ....&lt;br /&gt;&lt;br /&gt;하지만 필자가 아는 몇군데 일본 IT기업들은 더 이상 한국SI업계에 일을 주지 않는다 ..&lt;br /&gt;부끄럽지만 시연할때 잘만 돌아가면 된다는 마인드로 영업을하는 영세 SI가 많고 &lt;br /&gt;결국 한국SI업계 전반이 이 값을 치루고 있는 셈이다. &lt;br /&gt;&lt;br /&gt;작년 부터 미국발 경제 여파로 일본 역시 시장이 말이 아니게 얼어 있다. &lt;br /&gt;그리고 어느때보다 SI업계에서 근무하는 한국엔지니어들은 지금 한국으로 쫓겨나고 있는 실정이다 &lt;br /&gt;&lt;br /&gt;일본에 살면서 벌써 5년 &lt;br /&gt;&lt;br /&gt;이런 한국업계, 희생을 강요하는 문화, 그리고 절대 오지 않는 파라다이스에 대한 약속,,,&lt;br /&gt;이런 모습을 한국인도 아닌 일본인도 아닌 입장에서 남일 보듯 바라보고 있으면&lt;br /&gt;한국IT업계의 저질적인 업무능력, 후진 마인드에 고개가 숙여질 뿐이다. &lt;br /&gt;&lt;br /&gt;가끔 IT엔지니어들이 모이는 술자리에 참석을 한다 &lt;br /&gt;이제 일본온지 1년이 채 안되는 사람들이 많이 참석한다. &lt;br /&gt;&lt;br /&gt;비싼 소주를 마시며 일본에 대한 온갖 부정적인 시각을 내 보인다 - 나도 예전에 저랬다 ㅋㅋ&lt;br /&gt;&lt;br /&gt;외국에 나오면 다 애국자가 된다고 했던가 한국인, 한국 문화의 우수함을 주구장창 쏟아낸다&lt;br /&gt;&lt;br /&gt;일본을 갖 경험한 사람들의 공통점이다 &lt;br /&gt;문화적으로도 인간 그 차제로도 우수한 줄 안다 &lt;br /&gt;&lt;br /&gt;하지만 일본인의 시각은 중국인을 바라보는 시각과 별반 차이가 없다 - 조금 낮다 정도??&lt;br /&gt;&lt;br /&gt;문화적으로 다름을 인정하지 않고 그 다르다는 차이를 높낮이로만 평가하려는 그 척도가 &lt;br /&gt;과연 문화적으로 높은 수준의 사람들 시각일까?&lt;br /&gt;&lt;br /&gt;씁씁한 마음에서 일본 살면서 한국 IT엔지니어의 시각으로 바론 필자의 의견이다&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-2111664715296546962?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/2111664715296546962/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/07/sw.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/2111664715296546962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/2111664715296546962'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/07/sw.html' title='SW개발자의 희생을 요구하는 문화는 바뀌어야 한다'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-5432536268554192793</id><published>2009-05-26T02:10:00.001-07:00</published><updated>2009-05-26T02:10:59.321-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>javascript array 다양한 사용법 (일어판)</title><content type='html'>&lt;div style="line-height: 120%; letter-spacing: 0px; font-size: 10pt; left: 30px"&gt;&lt;a href="http://homepage3.nifty.com/aya_js/js2/js2_frm.htm" target="_top"&gt;新JavaScript入門&lt;/a&gt;&amp;nbsp; &lt;a href="http://homepage3.nifty.com/aya_js/js3/index.htm" target="_top"&gt;JavaScript,Neo-Generation&lt;/a&gt;&amp;nbsp; &lt;a href="http://homepage3.nifty.com/aya_js/dom/index.htm" target="_top"&gt;DOM&lt;/a&gt;&amp;nbsp; &lt;a href="http://homepage3.nifty.com/aya_js/wsh/index.htm" target="_top"&gt;WSH&lt;/a&gt;&amp;nbsp; &lt;a href="http://mcgi2.nifty.ne.jp/cgi-bin/thread.cgi?user_id=PXU02524" target="_top"&gt;掲示板&lt;/a&gt;&amp;nbsp; &lt;a href="http://homepage3.nifty.com/aya_js/index.htm" target="_top"&gt;表紙&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://homepage3.nifty.com/aya_js/js2/js204.htm"&gt;4.値と変数&lt;/a&gt;&amp;nbsp; &lt;a href="http://homepage3.nifty.com/aya_js/js2/js206.htm"&gt;6.配列(2)&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div class="TITLE"&gt;新JavaScript入門&lt;/div&gt;&lt;br /&gt;&lt;div class="SUB"&gt;5. 配列(1)&lt;/div&gt;&lt;br /&gt;&lt;div class="HEAD"&gt;■&lt;span class="RED"&gt;配列の作り方&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="TEXT"&gt;前回黙って配列を使ってしまいましたが、 配列は次のように生成します。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; a = &lt;span class="RES"&gt;new&lt;/span&gt; Array(&lt;i&gt;array-length&lt;/i&gt;);&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;このように配列は配列の長さを引数とする &lt;span class="KEY"&gt;Array&lt;/span&gt; 型のオブジェクトとして生成します。&lt;br /&gt;&lt;br /&gt;配列の要素へのアクセス方法はＣと同じです。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    a[&lt;i&gt;expression&lt;/i&gt;]&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;添字は 0 ～ &lt;i&gt;array-length&lt;/i&gt; - 1 です。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; name = &lt;span class="RES"&gt;new&lt;/span&gt; Array(5);        &lt;span class="COM"&gt;//名前&lt;/span&gt;&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; score = &lt;span class="RES"&gt;new&lt;/span&gt; Array(5);       &lt;span class="COM"&gt;//点数&lt;/span&gt;&lt;br /&gt;    name[0] = &amp;quot;さくら&amp;quot;; score[0] = 88;&lt;br /&gt;    name[1] = &amp;quot;知世&amp;quot;;   score[1] = 90;&lt;br /&gt;    name[2] = &amp;quot;千春&amp;quot;;   score[2] = 92;&lt;br /&gt;    name[3] = &amp;quot;奈緒子&amp;quot;; score[3] = 91;&lt;br /&gt;    name[4] = &amp;quot;利佳&amp;quot;;   score[4] = 93;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="COM"&gt;//次の名前の生徒の点数を探し出して表示する&lt;/span&gt;&lt;br /&gt;    tmpname = &amp;quot;さくら&amp;quot;;&lt;br /&gt;    &lt;span class="RES"&gt;for&lt;/span&gt;(&lt;span class="RES"&gt;var&lt;/span&gt; i = 0; i &amp;lt; 5; i++)&lt;br /&gt;        &lt;span class="RES"&gt;if&lt;/span&gt;(name[i] == tmpname) {    &lt;span class="COM"&gt;//名前が一致したら&lt;/span&gt;&lt;br /&gt;            alert(score[i]);        &lt;span class="COM"&gt;//表示&lt;/span&gt;&lt;br /&gt;            &lt;span class="RES"&gt;return&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;form style="text-align: center"&gt;&lt;br /&gt;    &lt;input onclick="test6()" type="button" value="押してね☆" /&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="HEAD"&gt;■&lt;span class="RED"&gt;配列の長さ&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="TEXT"&gt;配列の長さは &lt;span class="KEY"&gt;length&lt;/span&gt; プロパティで得られます。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; a = &lt;span class="RES"&gt;new&lt;/span&gt; Array(3);   &lt;span class="COM"&gt;//長さ3を確保&lt;/span&gt;&lt;br /&gt;    alert(a.length);        &lt;span class="COM"&gt;//3&lt;/span&gt;&lt;br /&gt;    a[5] = 1;               &lt;span class="COM"&gt;//6番目の要素に代入すると&lt;/span&gt;&lt;br /&gt;    alert(a.length);        &lt;span class="COM"&gt;//長さ6になる&lt;/span&gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;form style="text-align: center"&gt;&lt;br /&gt;    &lt;input onclick="test1()" type="button" value="押してね☆" /&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;配列の長さは &lt;span class="KEY"&gt;Array&lt;/span&gt; オブジェクトを作るときに いちおう決められますが、その範囲を超える要素にもアクセスできます。 おそらく、最初に長さを指定するのは、 &lt;span class="KEY"&gt;length&lt;/span&gt; プロパティを設定する以外に意味が無く （別に3個分の領域を確保しているわけではない）、&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; a = &lt;span class="RES"&gt;new&lt;/span&gt; Array();&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;としても何ら問題無いと思われます。 そして &lt;span class="KEY"&gt;length&lt;/span&gt; プロパティにも 現在最大何番目の要素が定義されているかという意味しかないのでしょう。&lt;br /&gt;&lt;p&gt;ただし、 &lt;span class="KEY"&gt;length&lt;/span&gt; プロパティを小さくすると、 値が未定義になってしまうことがあります。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; a = &lt;span class="RES"&gt;new&lt;/span&gt; Array();&lt;br /&gt;    a[0] = &amp;quot;ケロちゃんの&amp;quot;;&lt;br /&gt;    a[1] = &amp;quot;役立たず&amp;quot;;&lt;br /&gt;    alert(a[0] + a[1]);     &lt;span class="COM"&gt;//この時点では長さ2&lt;/span&gt;&lt;br /&gt;    a.length = 1;           &lt;span class="COM"&gt;//長さ1とすると&lt;/span&gt;&lt;br /&gt;    alert(a[0] + a[1]);     &lt;span class="COM"&gt;//a[1]が未定義に&lt;/span&gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;form style="text-align: center"&gt;&lt;br /&gt;    &lt;input onclick="test2()" type="button" value="押してね☆" /&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="HEAD"&gt;■&lt;span class="RED"&gt;連想配列的に使う&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="TEXT"&gt;実は添え字に0以上の整数だけでなく、文字列も使えます。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &lt;span class="RES"&gt;function&lt;/span&gt; test4(form) {&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; a, str;&lt;br /&gt;    &lt;br /&gt;    a = &lt;span class="RES"&gt;new&lt;/span&gt; Array();&lt;br /&gt;    a[&amp;quot;aaa&amp;quot;] = 4;   &lt;span class="COM"&gt;//文字列を添え字に&lt;/span&gt;&lt;br /&gt;    a.abc = 5;      &lt;span class="COM"&gt;//プロパティの形でも&lt;/span&gt;&lt;br /&gt;    alert(a.aaa);   &lt;span class="COM"&gt;//どちらの形でもアクセスできる&lt;/span&gt;&lt;br /&gt;    str = &amp;quot;abc&amp;quot;;&lt;br /&gt;    alert(&amp;quot;&amp;quot; + a[str]);&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;form style="text-align: center"&gt;&lt;br /&gt;    &lt;input onclick="test4()" type="button" value="押してね☆" /&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;この添字に文字列を使うのは、プロパティの別の形と思われます。 というより、通常の添え字もおそらくプロパティで、 &lt;span class="KEY"&gt;length&lt;/span&gt; プロパティに影響を及ぼすかもしれない、 という違いしかないのではないでしょうか。 つまり通常の添え字も自動的に文字列に変換されているのかもしれません。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &lt;span class="RES"&gt;function&lt;/span&gt; test5(form) {&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; a, str;&lt;br /&gt;    a = &lt;span class="RES"&gt;new&lt;/span&gt; Array();&lt;br /&gt;    a[0] = 0; a[1] = 1; a[&amp;quot;3&amp;quot;] = 2;&lt;br /&gt;    alert(a.length);    &lt;span class="COM"&gt;//上は通常の配列&lt;/span&gt;&lt;br /&gt;    alert(a[&amp;quot;0&amp;quot;]);      &lt;span class="COM"&gt;//a[0]と同じ&lt;/span&gt;&lt;br /&gt;    alert(a[&amp;quot;1.0&amp;quot;]);    &lt;span class="COM"&gt;//a[1]とは違う&lt;/span&gt;&lt;br /&gt; }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;form style="text-align: center"&gt;&lt;br /&gt;    &lt;input onclick="test5()" type="button" value="押してね☆" /&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;これで配列が実際にどう実装されているのかは分かりませんが、 とにかく使うと便利です。&lt;br /&gt;&lt;br /&gt;次の例は、一番上の例と同じです。対比してみてください。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; score = &lt;span class="RES"&gt;new&lt;/span&gt; Array();&lt;br /&gt;    score[&amp;quot;さくら&amp;quot;] = 88;       &lt;span class="COM"&gt;//名前を添え字に&lt;/span&gt;&lt;br /&gt;    score[&amp;quot;知世&amp;quot;] = 90;&lt;br /&gt;    score[&amp;quot;千春&amp;quot;] = 92;&lt;br /&gt;    score[&amp;quot;奈緒子&amp;quot;] = 91;&lt;br /&gt;    score[&amp;quot;利佳&amp;quot;] = 93;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="COM"&gt;//こちらが検索する必要はない&lt;/span&gt;&lt;br /&gt;    tmpname = &amp;quot;さくら&amp;quot;;&lt;br /&gt;    alert(score[tmpname]);      &lt;span class="COM"&gt;//一発で表示&lt;/span&gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;form style="text-align: center"&gt;&lt;br /&gt;    &lt;input onclick="test3()" type="button" value="押してね☆" /&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;まとめると、&lt;br /&gt;&lt;br /&gt;&lt;span class="KEY"&gt;Array&lt;/span&gt; 型オブジェクトは通常の配列ではなく、 連想配列のようなものである。 ただし、添え字が0以上の整数またはそれをそのまま文字列にしたものの場合、 通常の配列であるかのようにふるまう。&lt;/div&gt;&lt;br /&gt;&lt;div class="TEXT"&gt;このために、JavaScriptの &lt;span class="KEY"&gt;Array&lt;/span&gt; 型オブジェクトはアクセスが非常に遅くなってしまいます。 これはVBScriptと比べてみるとわかるでしょう。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; n = 50000;&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; a = &lt;span class="RES"&gt;new&lt;/span&gt; Array();&lt;br /&gt;    &lt;span class="RES"&gt;var&lt;/span&gt; sum = 0;&lt;br /&gt;    &lt;span class="RES"&gt;for&lt;/span&gt;(&lt;span class="RES"&gt;var&lt;/span&gt; i = 0; i &amp;lt; n; i++)&lt;br /&gt;        a[i] = i;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="RES"&gt;for&lt;/span&gt;(i = 0; i &amp;lt; n; i++)&lt;br /&gt;        sum += a[a[i]];&lt;br /&gt;    &lt;br /&gt;    alert(sum);&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;form style="text-align: center"&gt;&lt;br /&gt;    &lt;input onclick="test7()" type="button" value="押してね☆" /&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &lt;span class="RES"&gt;Dim&lt;/span&gt; n, sum, i&lt;br /&gt;    &lt;span class="RES"&gt;Dim&lt;/span&gt; a(49999)&lt;br /&gt;    sum = 0&lt;br /&gt;    n = 49999&lt;br /&gt;    &lt;span class="RES"&gt;For&lt;/span&gt; i = 0 &lt;span class="RES"&gt;To&lt;/span&gt; n&lt;br /&gt;        a(i) = i&lt;br /&gt;    &lt;span class="RES"&gt;Next&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="RES"&gt;For&lt;/span&gt; i = 0 &lt;span class="RES"&gt;To&lt;/span&gt; n&lt;br /&gt;        sum = sum + a(a(i))&lt;br /&gt;    &lt;span class="RES"&gt;Next&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    MsgBox sum&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt;&lt;form style="text-align: center"&gt;&lt;br /&gt;    &lt;input onclick="test8()" type="button" value="押してね☆" /&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;下がVBScript版ですが、うちの環境で3倍くらい速いです。&lt;/div&gt;&lt;br /&gt;&lt;div class="INFO"&gt;Written 10/5/97&lt;br /&gt;&lt;br /&gt;Modified 4/24/99&lt;br /&gt;&lt;br /&gt;Modified 4/5/03&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; letter-spacing: 0px; font-size: 10pt"&gt;&lt;a href="http://homepage3.nifty.com/aya_js/js2/js2.htm"&gt;first&lt;/a&gt;, &lt;a href="http://homepage3.nifty.com/aya_js/js2/js204.htm"&gt;prev&lt;/a&gt;, &lt;a href="http://homepage3.nifty.com/aya_js/js2/js206.htm"&gt;next&lt;/a&gt;, &lt;a href="http://homepage3.nifty.com/aya_js/index.htm" target="_top"&gt;exit&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-5432536268554192793?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/5432536268554192793/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/05/javascript-array.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5432536268554192793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/5432536268554192793'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/05/javascript-array.html' title='javascript array 다양한 사용법 (일어판)'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-1024075705065500281</id><published>2009-05-20T23:10:00.000-07:00</published><updated>2009-05-20T23:11:27.566-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='LAMP'/><category scheme='http://www.blogger.com/atom/ns#' term='아파치'/><category scheme='http://www.blogger.com/atom/ns#' term='APM'/><title type='text'>apache2.2 + php 5.2 설치 및 설정 방법</title><content type='html'>&lt;p class="post_option"&gt;&lt;a id="sendPost_30043038695" class="pcol2" onmouseover="ep3SendPostLayer.parentOver('30043038695');" onmouseout="ep3SendPostLayer.parentOut('30043038695');" onclick="ep3SendPostLayer.show('sendPostLayer_30043038695','30043038695',event);sendNDS('30043038695');return false;" href="http://blog.naver.com/PostView.nhn?blogId=loudon23&amp;amp;logNo=30043038695&amp;amp;beginTime=0&amp;amp;jumpingVid=&amp;amp;from=search&amp;amp;widgetTypeCall=true#" style="display: none"&gt;&lt;font color="#8a8a8a"&gt;이 포스트를 보낸곳 &lt;/font&gt;&lt;span class="pcol3"&gt;&lt;font color="#464646" size="2"&gt;()&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;div id="sendPost_kitchen_30043038695" class="post-sub ptr" style="display: none"&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;!-- delete something | 20071116 AjaxUI --&gt;&lt;br /&gt;&lt;div id="post-view" class="post-view pcol2"&gt;&lt;span style="background-color: rgb(228,255,117); font-family: Verdana; color: rgb(0,0,0); font-size: 14pt"&gt;1. Apache 받기&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp; &amp;nbsp; http://httpd.apache.org/download.cgi 에서 아파치를 구할 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 여기에 설치 한 것은 2.2.11을 (no ssl) MSI Installer로 버전으로 설치 했다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 바로 받을 수 있는 주소&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://apache.mirror.cdnetworks.com/httpd/binaries/win32/apache_2.2.11-win32-x86-no_ssl.msi &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br style="background-color: rgb(228,255,117); color: rgb(0,0,0)" /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(228,255,117); font-family: Verdana; color: rgb(0,0,0); font-size: 14pt"&gt;2. Apache 설치&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp; 다운 받은 apache_2.2.11-win32-x86-no_ssl.msi 을 실행 한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;2. A. 설치 초기 메시지 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles7.naver.net/data44/2009/2/17/102/apache_1_loudon23.jpg" width="504" height="388" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;설치 한다고 말해 준다... &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;다음&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;2. B. 라이센스 동의&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;라이센스에 동의 할 것인지 물어본다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;설치하려면 &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;I accept the terms in the license agreement&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; 선택 후, &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;다음 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles8.naver.net/data44/2009/2/17/247/apache_2_loudon23.jpg" width="504" height="388" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;2. C. 아파치 서버 내용 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;아파치 서버에 대한 내용들... 읽어 보고 &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;다음.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles6.naver.net/data44/2009/2/17/5/apache_3_loudon23.jpg" width="504" height="388" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;2. D. 서버 정보 입력 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;서버의 정보를 입력하는 부분이다. &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;아래 항목들을 자신의 환경에 맞게 넣어준다. &lt;/span&gt;&lt;span style="font-family: Verdana"&gt;다음~&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles3.naver.net/data44/2009/2/17/114/apache_4_loudon23.jpg" width="504" height="388" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;2. E. 설치 타입&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;설치 타입을 정한다. &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;Typical&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; 하면 된다. &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;다음&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;~&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles10.naver.net/data44/2009/2/17/249/apache_5_loudon23.jpg" width="504" height="388" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;2. F. 설치 폴더 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;아파치가 설치될 폴더&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;를 물어본다. 기본으로는 Program Files 밑에 Apache Software Foundation 에 설치가 되게 된다.&amp;nbsp; 자신이 원하는 위치로 설정을 바꾼다.&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;여기서는 C:\Apache에 설치 했다 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles2.naver.net/data44/2009/2/17/129/apache_6_loudon23.jpg" width="504" height="388" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;2. G. 인스톨&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;인스톨&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;을 눌러 설치한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles5.naver.net/data44/2009/2/17/228/apache_7_loudon23.jpg" width="504" height="388" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;2. H. 설치 중&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;설치 중~~~&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles2.naver.net/data44/2009/2/17/177/apache_8_loudon23.jpg" width="504" height="388" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;2. I. 설치 완료 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;설치 완료&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; 되었다~!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles12.naver.net/data44/2009/2/17/139/apache_9_loudon23.jpg" width="504" height="388" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(228,255,117); font-family: Verdana; color: rgb(0,0,0); font-size: 14pt"&gt;3. PHP 받기&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;http://www.php.net/downloads.php 에서 php를 받을 수 있다.&amp;nbsp; 여기서는 PHP 5.2.8 zip package를 받았다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;바로 받기 : http://kr2.php.net/get/php-5.2.8-Win32.zip/from/a/mirror&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(228,255,117); font-family: Verdana; color: rgb(0,0,0); font-size: 14pt"&gt;4. PHP 설치&lt;/span&gt;&lt;br style="background-color: rgb(228,255,117); color: rgb(0,0,0)" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp; 4. A. 해당 파일을&lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt; 압축을 풀고 C:\php 에 옮겼다.&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; 어디에 설치하든 그건 자기마음이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp; 4. B. php 파일안에 있는 &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;php.ini-recommended를 php.ini로 바꾼다&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp; 4. C. 해당 파일을 열어서 아래 부분을 수정한다&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px"&gt;&lt;span style="font-family: Verdana"&gt;---------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-left: 40px"&gt;&lt;span style="font-family: Verdana"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;; Paths and Directories&amp;nbsp;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;; UNIX: &amp;quot;/path1:/path2&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;;include_path = &amp;quot;.:/php/includes&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;; Windows: &amp;quot;\path1;\path2&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana; color: rgb(255,108,0); font-weight: bold"&gt;include_path = &amp;quot;.;c:\php\includes&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 자신의 php 설치 폴더 밑으 includes 폴더를 지정한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;---------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;span style="background-color: rgb(228,255,117); font-family: Verdana; color: rgb(0,0,0); font-size: 14pt"&gt;5. Apache 설치 하기 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp; 5. A. 아파치가 설치된 폴더아래의 &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;conf/extra&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;에 &lt;/span&gt;&lt;span style="font-family: Verdana; font-weight: bold"&gt;httpd-php.conf 이름의 빈 파일&lt;/span&gt;&lt;span style="font-family: Verdana"&gt;을 만든다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 여기서는 C:\Apache에 아파치를 설치 했으므로 C:\Apache\conf\extra에 httpd-php.conf를 만든다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp; 5. B.&amp;nbsp; 만든 파일을 텍스트 편집기에서 열어서 아래와 같이 적고 저장한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px"&gt;&lt;span style="font-family: Verdana"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: rgb(255,108,0); margin-left: 40px; font-weight: bold"&gt;&lt;span style="font-family: Verdana"&gt;# PHP configuration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: rgb(255,108,0); margin-left: 40px; font-weight: bold"&gt;&lt;span style="font-family: Verdana"&gt;# PHP 5 module setup&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: rgb(255,108,0); margin-left: 40px; font-weight: bold"&gt;&lt;span style="font-family: Verdana"&gt;LoadModule php6_module &amp;quot;C:/php/php5apache2_2.dll&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: rgb(255,108,0); margin-left: 40px; font-weight: bold"&gt;&lt;span style="font-family: Verdana"&gt;PHPIniDir &amp;quot;C:/php&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br style="color: rgb(255,108,0); font-weight: bold" /&gt;&lt;br /&gt;&lt;div style="color: rgb(255,108,0); margin-left: 40px; font-weight: bold"&gt;&lt;span style="font-family: Verdana"&gt;AddType application/x-httpd-php .php &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: rgb(255,108,0); margin-left: 40px; font-weight: bold"&gt;&lt;span style="font-family: Verdana"&gt;AddHandler application/x-httpd-php .php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-left: 40px"&gt;&lt;span style="font-family: Verdana; color: rgb(255,108,0); font-weight: bold"&gt;AddType application/x-httpd-php-source .phps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp; 5. C. 아파치가 설치된 폴더아래의 conf에 있는 httpd.conf 파일을 열어서 맽끝에 아래의 내용을 추가한다&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px"&gt;&lt;span style="font-family: Verdana"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana; color: rgb(255,108,0); font-weight: bold"&gt;# PHP 5 settings&lt;/span&gt;&lt;br style="color: rgb(255,108,0); font-weight: bold" /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana; color: rgb(255,108,0); font-weight: bold"&gt;Include conf/extra/httpd-php.conf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-left: 40px"&gt;&lt;span style="font-family: Verdana"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br style="background-color: rgb(228,255,117); color: rgb(0,0,0)" /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&lt;span style="background-color: rgb(228,255,117); font-family: Verdana; color: rgb(0,0,0); font-size: 14pt"&gt;6. 설치확인&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6. A. 아파치가 설치된 폴더의 htdocs 폴더에 phpinfo.php 파일을 만들어서 제대로 설치 되었는지 확인한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px"&gt;&lt;span style="font-family: Verdana"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; phpinfo();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;--------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Verdana"&gt;&amp;nbsp;&amp;nbsp; 6. B.&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Verdana"&gt; 브라우저를 열고&amp;nbsp; http://localhost/phpinfo.php 를 열어서 아래 처럼 서버 정보가 나오면 정상적인 설치가 된것이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img onclick="popview(this)" src="http://blogfiles5.naver.net/data41/2009/2/17/196/phpinfo_loudon23.jpg" width="550" height="560" style="cursor: pointer" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 40px"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="autosourcing-stub"&gt;&lt;br /&gt;&lt;p style="padding-bottom: 0px; font-style: normal; margin: 11px 0px 7px; padding-left: 0px; padding-right: 0px; font-family: Dotum; font-size: 12px; font-weight: normal; padding-top: 0px"&gt;&lt;strong style="padding-bottom: 0px; padding-left: 0px; padding-right: 7px; padding-top: 0px"&gt;[출처]&lt;/strong&gt; &lt;a href="http://blog.naver.com/loudon23/30043038695" target="_blank"&gt;Windows에 Apache + PHP 설치&lt;/a&gt;&lt;span style="padding-bottom: 0px; padding-left: 5px; padding-right: 7px; padding-top: 0px"&gt;|&lt;/span&gt;&lt;strong style="padding-bottom: 0px; padding-left: 0px; padding-right: 7px; padding-top: 0px"&gt;작성자&lt;/strong&gt; &lt;a href="http://blog.naver.com/loudon23" target="_blank"&gt;루든&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8769064231310706234-1024075705065500281?l=mcpicdtl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mcpicdtl.blogspot.com/feeds/1024075705065500281/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://mcpicdtl.blogspot.com/2009/05/apache22-php-52.html#comment-form' title='3개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1024075705065500281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8769064231310706234/posts/default/1024075705065500281'/><link rel='alternate' type='text/html' href='http://mcpicdtl.blogspot.com/2009/05/apache22-php-52.html' title='apache2.2 + php 5.2 설치 및 설정 방법'/><author><name>Haru(Vins)</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_MKXTIQWWA9E/R6nTXZAuAnI/AAAAAAAABvs/vHdl5ZMJKOw/S220/200510kawaguchiko_137-antineutron.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8769064231310706234.post-3147981774321729449</id><published>2009-05-20T20:36:00.000-07:00</published><updated>2009-05-20T20:41:11.307-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>Ruby Tutorial (기초편)</title><content type='html'>루비 공식 사이트(한글판)에 나온 내용을 발취한 글입니다.&lt;br /&gt;개인적인 루비에 대한 느낌은 우와한 언어라고는 말하고 있지만 &lt;br /&gt;언어가 우와한 것이 어떤 장점이 있는지 잘 이해가 되지 않는 군요 &lt;br /&gt;예전 vbscript의 딸리던 기능이 계속 생각나는 것은 왜인지.. &lt;br /&gt;해서 컴포넌트 개발하고 window api 갇다 쓰던 기억이 새록새록 ..&lt;br /&gt;&lt;br /&gt;그래서 그런지 루비는 요즘 사양세라고 합니다. &lt;br /&gt;asp로 클래스 개발하셨던 분 접근하시는 쉽겟네요 &lt;br /&gt;asp에선 찾아 볼수 없었던 MVC 개념으로 다가 갈수 있다는 것엔&lt;br /&gt;루비 온 레일즈가 장점을 포함하고 있다고는 보여집니다&lt;br /&gt;&lt;br /&gt;하지만 자바, 스트럿츠 등 유명한 프레임 워크랑 비교하긴 좀 미안한 구석이 ^^&lt;br /&gt;&lt;br /&gt;그럼 즐프&lt;br /&gt;&lt;br /&gt;이하 발취 내용----------------------------&lt;br /&gt;&lt;br /&gt;Ruby for Impatient Nuby&lt;br /&gt;&lt;br /&gt;서민구 (Minkoo Seo)&lt;br /&gt;&lt;br /&gt;http://mkseo.pe.kr&lt;br /&gt;&lt;br /&gt;minkoo.seo AT gmail.com&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 South Korea 라이센스에 따라 이용하실 수 있습니다. 도와주신 분들(공성식, 이민, 정목, 홍민희. 이상 가나다순)께 감사드립니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이 글은 많은 시간을 들이지 않고 루비 언어의 전반적인 내용을 알아 볼 수 있게 하기 위한 간략한 개론입니다. 본 글은 프로그래밍에 익숙한 분들을 대상으로 하며 하나 이상의 프로그래밍 언어에 익숙하신 분들이 읽기 편하게 작성되었습니다. 본 글에 대한 의견은 제 블로그내의 토론에 커멘트 형태로 남겨주시거나 이메일(minkoo.seo AT gmail.com)으로 주시기 바랍니다. 또한 본 글의 수정을 직접 하기를 원하시는 분들께는 제한 없이 수정권한을 드리겠습니다. 이 경우 역시 이메일을 주시면 수정 권한을 설정해드리겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;본 글의 구성은 다음과 같습니다. 먼저 1장에서 루비의 기본 문법을 소개하고, 2장에서 함수, 객체지향적 특징, 블록 구조 등에 대하여 설명합니다. 3장에서는 루비의 메타 프로그래밍에 대하여 간략히 소개드립니다. 이 내용을 보고 난뒤 Rails에 대한 내용은 대산님이 작성하신 Rails 따라하기 1를 참고하세요.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;0. 들어가기에 앞서&lt;br /&gt;&lt;br /&gt;먼저, 오늘의 루비를 있게한 킬러 애플리케이션 Rails에 대한 데모를 보시기 바랍니다. 다 볼 필요는 없고, weblog를 15분에 만드는 데모만 보면 됩니다. &lt;br /&gt;데모를 보셨습니까? 놀라셨나요? 그러면 루비에 대해서 알아보도록 하죠. 먼저 루비를 설치해야겠죠. 윈도우 사용자라면 One-click Installer를 통해 루비를 설치합니다. 리눅스 사용자라면 ruby, ri, rdoc, lib-ruby등의 패키지를 설치해야합니다. yum이나 apt-get으로 설치하세요. &lt;br /&gt;&lt;br /&gt;다음 루비가 설치가되었다면 콘솔에서 다음과 같이 입력합니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mkseo@mkseo:~$ irb &lt;br /&gt;&lt;br /&gt;irb(main):001:0&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;바로 여기가 interactive 콘솔입니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. 루비의 기본 문법과 자료구조&lt;br /&gt;&lt;br /&gt;"Hello World"를 시작하겠습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):001:0&gt; "hello world"&lt;br /&gt;=&gt; "hello world"&lt;br /&gt;irb(main):002:0&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;간단하죠? 이 예는 모든 명령이 값을 반환한다는 중요한 사실을 말해줍니다. 또는 출력문을 이용할 수도 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):003:0&gt; puts "hello world"&lt;br /&gt;hello world&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):004:0&gt; print "hello world"&lt;br /&gt;hello world&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):002:0&gt; p "hello world"&lt;br /&gt;"hello world"&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;puts는 한줄에 객체의 내용을 출력합니다. print는 newline이 따라 붙지 않지만 이 경우에는 interactive shell 이므로 줄이 자동으로 바뀝니다. p는 객체의 내용을 자세히 보여주며, 이를 위해 객체의 inspect 메소드를 호출하고 그 결과를 출력합니다. 그러나 이 예에서는 문자열의 경우 inspect 메소드의 결과값이 문자열 그 자체와 동일하므로 별다른 차이는 없습니다. "=&gt; nil"에서 nil은 Null을 의미합니다. 출력문의 경우에는 반환값이 nil이라는 거죠.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;다음, 루비의 type들에 대해서 알아보겠습니다. 루비의 모든 변수에는 타입이 주어지지 않습니다. 그러나 루비의 모든 값에는 타입이 존재합니다. 예를들어 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):005:0&gt; s = "hello world"&lt;br /&gt;=&gt; "hello world"&lt;br /&gt;irb(main):006:0&gt; puts s&lt;br /&gt;hello world&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):007:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;과 같이 타입 없이 변수를 선언할 수 있습니다. 또한 변수내용 출력시에는 다음과 같이 #{...} 를 사용할 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):006:0&gt; puts "Your message: #{s}"&lt;br /&gt;Your message: hello world&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;한편, 루비에서는 정수, 실수, 매우 큰 정수, 리스트, 해시, range가 기본적으로 존재합니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):014:0&gt; a = 1 # 정수&lt;br /&gt;=&gt; 1&lt;br /&gt;irb(main):015:0&gt; b = 1.1 # 실수&lt;br /&gt;=&gt; 1.1&lt;br /&gt;irb(main):016:0&gt; c = 1000000000000000000000000000000000 # 매우 큰 정수&lt;br /&gt;=&gt; 1000000000000000000000000000000000&lt;br /&gt;irb(main):017:0&gt; c.class&lt;br /&gt;=&gt; Bignum&lt;br /&gt;irb(main):018:0&gt; d = [1] # 배열 or 리스트&lt;br /&gt;=&gt; [1]&lt;br /&gt;irb(main):020:0&gt; e = { 1=&gt;’a', 2=&gt;’b’ } # 해시&lt;br /&gt;=&gt; {1=&gt;"a", 2=&gt;"b"}&lt;br /&gt;irb(main):021:0&gt; e[2]&lt;br /&gt;=&gt; "b"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;대강 어떻게 돌아가는지 감을 잡으셨을 것입니다. c.class 는 c라는 인스턴스 변수의 클래스를 알려주며 매우 큰 수가 자동으로 Bignum 클래스로 처리된 것을 볼 수 있습니다. d는 리스트이고, e는 해시입니다. 한가지 중요한 사실을 빠뜨렸는데요, 루비에서는 everything is an object입니다. 다만 성능을 위해 정수는 a라는 변수가 1이라는 인스턴스를 참조하는게 아니라, a라는 변수 자체에 값을 담고 있습니다. 실수의 경우에는 객체가 생성되며 변수에는 그 객체에 대한 참조가 저장됩니다. 하지만 이것은 성능을 위한 설명일 뿐이고, 실제 사용자의 입장에서는 다음과 같이 정수에 대해서도 메소드를 호출할 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):022:0&gt; a = -1&lt;br /&gt;=&gt; -1&lt;br /&gt;irb(main):023:0&gt; a.abs&lt;br /&gt;=&gt; 1&lt;br /&gt;irb(main):024:0&gt; a.next&lt;br /&gt;=&gt; 0&lt;br /&gt;irb(main):025:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;리스트가 나왔었으니 리스트를 조금 갖고 놀아보죠. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):025:0&gt; l = [1,2,3,4]&lt;br /&gt;=&gt; [1, 2, 3, 4]&lt;br /&gt;irb(main):026:0&gt; l[0]&lt;br /&gt;=&gt; 1&lt;br /&gt;irb(main):027:0&gt; l[1..2]&lt;br /&gt;=&gt; [2, 3]&lt;br /&gt;irb(main):028:0&gt; l[-1]&lt;br /&gt;=&gt; 4&lt;br /&gt;irb(main):029:0&gt; l[100]&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):030:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이처럼 리스트는 임의의 첨자로 내용을 보거나 1..2 와 같은 표현으로 부분을 받아올 수도 있습니다. 여기서 1..2는 1번째 원소부터 2번째 원소까지를 의미합니다. l[-1]은 거꾸로 첫번째 원소(즉 4)를 의미합니다. l[-2]는 3이겠죠. 다음은 해시에 대한 예를 보여드리겠습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):001:0&gt; h = { } # 새로운 해시 생성&lt;br /&gt;=&gt; {}&lt;br /&gt;irb(main):002:0&gt; h[0] = 1 # 키 0에 값 1을 저장&lt;br /&gt;=&gt; 1&lt;br /&gt;irb(main):003:0&gt; h # 해시의 내용을 보여줍니다.&lt;br /&gt;=&gt; {0=&gt;1}&lt;br /&gt;irb(main):004:0&gt; h.keys # 해시의 keys라는 메소드를 호출했습니다. 괄호가 필요 없음에 주목하세요.&lt;br /&gt;=&gt; [0]&lt;br /&gt;irb(main):005:0&gt; h[1] = 2&lt;br /&gt;=&gt; 2&lt;br /&gt;irb(main):006:0&gt; h.keys&lt;br /&gt;=&gt; [0, 1]&lt;br /&gt;irb(main):007:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음은 간단한 조건문의 예입니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):007:0&gt; if 1 + 1 == 2&lt;br /&gt;irb(main):008:1&gt;   puts "yes!"&lt;br /&gt;irb(main):009:1&gt; else&lt;br /&gt;irb(main):010:1*   puts "oops?"&lt;br /&gt;irb(main):011:1&gt; end&lt;br /&gt;yes!&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):012:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;보기 좋게 indent 를 하였지만 indent 자체에 문법적인 의미는 없습니다. 다음은 조건문을 한줄로 적은 예입니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):012:0&gt; if 1 + 1 == 2 then puts "yes" else puts "oops?" end&lt;br /&gt;yes&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):013:0&gt; if 1 + 1 == 2; puts "yes" else puts "oops?" end&lt;br /&gt;yes&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;루비 way라고 할까요. 루비는 줄바꾸기가 중요한 언어입니다. 두번째 형태에서 1 + 1 == 2; 에 있는 세미콜론은 쉘 스크립트에서 하듯이 줄바꿈을 의미합니다. 혹은 if문의 반환값 자체를 써서 줄일 수도 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):002:0&gt; puts (if 1 + 1 == 2 then "yes" else "oops?" end)&lt;br /&gt;yes&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;삼항 연산자도 됩니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):005:0&gt; puts (1 + 1 == 2 ? "Yes" : "oops?")&lt;br /&gt;Yes&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음은 case문입니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):023:0&gt; a = 2&lt;br /&gt;=&gt; 2&lt;br /&gt;irb(main):024:0&gt; case a&lt;br /&gt;irb(main):025:1&gt; when 1; puts 1&lt;br /&gt;irb(main):026:1&gt; when 2; puts 2&lt;br /&gt;irb(main):027:1&gt; end&lt;br /&gt;2&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;caes문을 사용할 때 꼭 case에 넘겨주는 변수가 없어도 됩니다. 그렇게하면 차례로 when 문이 실행되므로 가장 처음 참인 문장이 실행되고 빠지게 됩니다. 예를들면, &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):028:0&gt; a = 2&lt;br /&gt;=&gt; 2&lt;br /&gt;irb(main):029:0&gt; case&lt;br /&gt;irb(main):030:1* when a == 1; puts 1&lt;br /&gt;irb(main):031:1&gt; when a == 2; puts 2&lt;br /&gt;irb(main):032:1&gt; when a == 3; puts 3&lt;br /&gt;irb(main):033:1&gt; end&lt;br /&gt;2&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):034:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이런것도 되는 것이죠. 이런 것들을 보면 루비 해커들의 해킹능력은 끝이 없어보입니다. 한편 영어식 코딩도 가능합니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):034:0&gt; a = 2&lt;br /&gt;=&gt; 2&lt;br /&gt;irb(main):035:0&gt; puts "2″ if a == 2&lt;br /&gt;2&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"puts two if a equals to two" 완벽한 영어 문장이죠? 이런의미에서도 아름다운 언어입니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):036:0&gt; puts "not 1″ unless a == 1&lt;br /&gt;not 1&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;unless도 있습니다만, 이해하는데 시간이 좀 걸립니다. 조건이 거짓인 경우를 말하죠. 조건문에서는 nil과 false는 false이며 그 외에는 참을 의미합니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):037:0&gt; 1 if nil&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):038:0&gt; 1 if false&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):039:0&gt; 1 if true&lt;br /&gt;=&gt; 1&lt;br /&gt;irb(main):040:0&gt; 1 if ""&lt;br /&gt;(irb):40: warning: string literal in condition&lt;br /&gt;=&gt; 1&lt;br /&gt;irb(main):041:0&gt; 1 if 0&lt;br /&gt;=&gt; 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이쯤했으니 리스트를 traverse해보겠습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):001:0&gt; list = [1,2,3,4,5,6,7,8,9,10]&lt;br /&gt;=&gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;br /&gt;irb(main):002:0&gt; list.each { |i| puts i if i % 2 == 0 }&lt;br /&gt;2&lt;br /&gt;4&lt;br /&gt;6&lt;br /&gt;8&lt;br /&gt;10&lt;br /&gt;=&gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;br /&gt;irb(main):003:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;each 는 리스트의 메소드입니다. 각 원소를 i라고 해서 뒤에나오는 {…}로 구성된 블록으로 넘깁니다. 블럭에서는 i가 짝수면 프린트를 했습니다. 한편 { .. } 는 do … end 로도 쓸 수 있습니다. 보통은 한줄짜리면 { … }에 쓰고 여러줄짜리면 do .. end 로 블록을 구성하는데 사실은 둘간에 연산자 우선순위의 미묘한 차이가 있으나 평상시에 문제는 별로 없습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;결과 부분을 주의해서 보세요. 2,4,6,8,10이 줄바꿈을 하며 출력된 내용이 우리가 실행한 결과입니다. =&gt; 뒤의 내용은 단지 each문의 반환값이고요. 따라서 실행과 반환값을 잘 조합하면 복잡한 명령을 연계할 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다른 언어에서도 다 되는 for each 절도 가능합니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):003:0&gt; for i in list&lt;br /&gt;irb(main):004:1&gt;    puts i if i % 5 == 0&lt;br /&gt;irb(main):005:1&gt; end&lt;br /&gt;5&lt;br /&gt;10&lt;br /&gt;=&gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;br /&gt;irb(main):006:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;range로도 가능합니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):006:0&gt; for i in (1..10)&lt;br /&gt;irb(main):007:1&gt;    puts i if i % 5 == 0&lt;br /&gt;irb(main):008:1&gt; end&lt;br /&gt;5&lt;br /&gt;10&lt;br /&gt;=&gt; 1..10&lt;br /&gt;irb(main):009:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;여기서 (1..10)이 1부터 10까지의 range죠. range는 쉽게 list로 바꿀 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):009:0&gt; (1..10).to_a&lt;br /&gt;=&gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;br /&gt;irb(main):010:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;to_a는 array(리스트)로 바꿔달라는 말이죠. 이런식으로 연습하면서, 코딩은 실제로는 에디터 상에서 해서 파일에 저장합니다. 그러면 실행이 가능하게 되는 거죠. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mkseo@mkseo:~$ cat &gt; a.rb&lt;br /&gt;#!/usr/bin/ruby &lt;br /&gt;puts "hello world"&lt;br /&gt;mkseo@mkseo:~$ chmod +x a.rb&lt;br /&gt;mkseo@mkseo:~$ ./a.rb&lt;br /&gt;hello world&lt;br /&gt;mkseo@mkseo:~$&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이제 조금 더 복잡한 반복문을 해보도록 하죠. 루비에도 당연히 while, do-while가 있습니다. 그 외에는 redo/next/break 라는 키워드들이 있는데 이 중 next는 다른언어의 continue에 해당하고 break는 그 break가 맞습니다. redo만 해보죠.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):015:0&gt; $status = 0&lt;br /&gt;=&gt; 0&lt;br /&gt;irb(main):016:0&gt; def f(i)&lt;br /&gt;irb(main):017:1&gt;   if $status == 0&lt;br /&gt;irb(main):018:2&gt;     $status = 1&lt;br /&gt;irb(main):019:2&gt;     0&lt;br /&gt;irb(main):020:2&gt;   else&lt;br /&gt;irb(main):021:2*     i&lt;br /&gt;irb(main):022:2&gt;   end&lt;br /&gt;irb(main):023:1&gt; end&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):027:0&gt; for i in (1..5)&lt;br /&gt;irb(main):028:1&gt;   if f(i) != 0 then puts f(i) else redo end&lt;br /&gt;irb(main):029:1&gt; end&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;=&gt; 1..5&lt;br /&gt;irb(main):030:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;최초 $status == 0 이 성립하기에 처음에는 반환값이 0일것입니다. 따라서 if 문에서 redo를 하게 되고, 결국 i = 0인 루프가 한번 더 수행됩니다. redo 는 이처럼 현재의 값을 그대로 갖고 반복문 안을 한 번 더 수행하게 합니다. 아마 네트워크가 잠시 응답이 없다던가, DB가 잠시 응답이 없다던가 하는 상황에서의 재수행등에 활용할 수 있을 것입니다. 이 외에도 반복문을 완전히 처음부터 재수행하는 retry도 있지만 생략하겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. 함수, 객체지향적 특징, 블록 구조&lt;br /&gt;1장의 puts, p, print, each 등은 모두 함수입니다. 이를 우리도 구현해보도록 하죠.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):018:0&gt; def f(n)&lt;br /&gt;irb(main):019:1&gt;   n + 1&lt;br /&gt;irb(main):020:1&gt; end&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):021:0&gt; f(1)&lt;br /&gt;=&gt; 2&lt;br /&gt;irb(main):022:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;말씀드렸듯이 모든 문장은 값을 반환합니다. 따라서 함수 f안에서 return n + 1이 아니라 n + 1이라고만 써도 그 문장이 함수의 가장 마지막 문장이기에 n + 1의 반환값이 함수의 반환값으로 사용됩니다. 물론 return 을 써도 정상동작합니다. 따라서 보통은 return 문이 꼭 필요하면 return 문을 쓰고, 그렇지 않으면 return이라는 키워드 자체는 생략하는 것이 일반적이라고 알고 있습니다만, 어디까지나 개인의 코딩 습관에따라 달라질 수 있습니다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음은 피보나치 수열의 예입니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):022:0&gt; def fibo(n)&lt;br /&gt;irb(main):023:1&gt;   return 1 if n == 1 || n == 2 # 이 경우에는 return이 필요합니다.&lt;br /&gt;irb(main):024:1&gt;   return fibo(n - 1) + f(n - 2)&lt;br /&gt;irb(main):025:1&gt; end&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):026:0&gt; fibo(1)&lt;br /&gt;=&gt; 1&lt;br /&gt;irb(main):027:0&gt; fibo(2)&lt;br /&gt;=&gt; 1&lt;br /&gt;irb(main):028:0&gt; fibo(3)&lt;br /&gt;=&gt; 3&lt;br /&gt;irb(main):029:0&gt;&lt;br /&gt;&lt;br /&gt;fibo 함수내 첫줄에서 return 문은 꼭 필요합니다. return 이 없다면 해당 문장이 실행되고 반환값은 그대로 사라져버리고 다음줄로 실행이 계속 진행되버리기 때문입니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이외에도, 매개변수에 기본 값을 준다던가 또는 임의 개수의 인자를 받는 다던가 하는 것도 가능합니다. 임의 개수의 인자를 받는 부분을 보죠.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):029:0&gt; def g(*args)&lt;br /&gt;irb(main):030:1&gt;   a1, a2 = args[0], args[1]&lt;br /&gt;irb(main):031:1&gt;   puts a1&lt;br /&gt;irb(main):032:1&gt;   puts a2&lt;br /&gt;irb(main):033:1&gt; end&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):034:0&gt; g(1,2)&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):035:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*args로 쓰면 인자를 리스트로 받게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;한편 루비는 position에 의해 인자를 구분합니다. 함수에 준 첫번째 인자는 함수의 첫번째 매개변수에 들어가고, 두번째 인자는 함수의 두번째 인자에 들어가죠. 그러나 해싱을 사용해 named parameter를 구현할 수 있습니다. 방법은, 함수의 마지막 인자가 해시일때는 { } 를 사용해 명시적으로 해당 인자가 해시임을 지정하지 않아도 된다는 점을 이용하는 것입니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):006:0&gt; def f(opt, vars)&lt;br /&gt;irb(main):007:1&gt;   a1, a2 = vars[:a1], vars[:a2]&lt;br /&gt;irb(main):008:1&gt;   puts "opt = #{opt}\ta1 = #{a1}\ta2 = #{a2}"&lt;br /&gt;irb(main):009:1&gt; end&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):010:0&gt; f(1, :a1=&gt; 1, :a2 =&gt; 2)&lt;br /&gt;opt = 1 a1 = 1  a2 = 2&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):011:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이 코드에서 :a1, :a2는 심볼입니다. 간단히 아무때나 쓸 수 있는 enum이라고 생각하면 됩니다. 굳이 정의 없이 써도 되는거죠. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;한편 함수는 다음과 같이 불러도 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):011:0&gt; f 1, :a1=&gt; 1, :a2 =&gt; 2&lt;br /&gt;opt = 1 a1 = 1  a2 = 2&lt;br /&gt;=&gt; nil&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;즉, 괄호가 없어도 된다는 것이죠. 해싱과 괄호 제거 규칙으로 인해 상당히 자연스러운 메소드들이 등장할 수 있습니다. 예를들면 다음의 rails 메소드들 같은 것들이죠.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;render_text “hello world” # 화면에 hello world를 찍는다.&lt;br /&gt;redirect_to :action =&gt; “index” # index 라는 action으로 리다이렉트 한다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;이에 대해서는 rails와 메타 프로그래밍에서 더 예를 보실 수 있을 겁니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다음은 block에 대해 말씀드리죠. 블록은 { ... } 형태를 띄고 함수에 넘겨집니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;irb(main):035:0&gt; def f(a)&lt;br /&gt;irb(main):036:1&gt;   yield a + 1 # 여기는 함수 f내에서 블록과 상호작용하는 부분입니다.&lt;br /&gt;irb(main):037:1&gt; end&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):038:0&gt; f(1) { |n| puts n } # &lt;- 바로 여기가 블록입니다.&lt;br /&gt;2&lt;br /&gt;=&gt; nil&lt;br /&gt;irb(main):039:0&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;여기서 함수 f는 인자 a 를 받습니다. 다음, yield a+1를 사용해서 f에게 주어진 블록에 a+1을 넘깁니다. f함수의 사용자는 { .. }를 사용해 블록을 지정하는데, 블록안에는 f가 넘겨주는 값을 받기 위한 변수 n이 있습니다. 블록에서는 이 n을 받아와서 화
