파이썬으로 작성한 Max-Heapify의 코드다. 의사코드는 Introduction to Algorithms라는 MIT Press에서 나온 교재에서 참조했다.
Source: MaxHeapify.py
파이썬으로 작성한 Max-Heapify의 코드다. 의사코드는 Introduction to Algorithms라는 MIT Press에서 나온 교재에서 참조했다.
Source: MaxHeapify.py
아파치 서버데몬을 사용할 때, 디렉터리에 index.html이나 index.php 파일 등이 없으면 일반적으로 해당 디렉터리에 있는 파일들을 나열하거나, 혹은 보안상 이를 감추기도 한다. 일반적으로 -Indexes옵션을 붙였을 경우 아래처럼 나온다.
그런데, 굳이 디렉터리의 내용을 감출 필요가 없거나 혹은 내부를 보여줘서 직접 파일을 다운로드하게 할 필요가 있을 때는 직접 보여줘야하는데 일반적으로는 아래처럼 보여지게 된다.
이 멋없는 페이지도 개별적인 꾸밈이 가능하다. 설명은 우분투/데비안 기준으로 한다.
도메인이 여러 개가 있어서 특정 도메인에만 세팅할 경우 /etc/apache2/sites-available/에서 알아서 불러오시고, 그런 게 없는 경우는, 즉 다시 말해 잘 모르시겠다면 아래의 명령어를 입력한다.
$ sudo vi /etc/apache2/sites-available/default
그런다음, <Directory /var/www/>라고 적혀있는 부분을 찾아서,
Options으로 시작되는 라인에서 Indexes라는 글자가 있는지 보고 없으면 Indexes라고 적어준다.
예) Options Indexes FollowSymLinks MultiViews
그리고 그 아래에다 다음을 추가시켜준다.
IndexOptions +FancyIndexing +FoldersFirst
마지막으로, </directory>라고 적힌 라인 아래에다 다음을 추가시켜준다.
Include /etc/apache2/pretty-dir.conf
최종적인 모습은 다음과 같다. 다른 항목은 신경쓰지 말고, <Directory /var/www/>에서 시작해서 </Directory>로 끝나는 안의 내용과, 그 다음 줄인 Include /etc/apache2/pretty-dir.conf만 신경쓰면 되겠다. 혹시 몰라서 파일을 첨부한다.
default.txt
그런다음, 방금 적어준 Include /etc/apache2/pretty-dir.conf 라는 파일의 내용을 작성하면 된다. 역시 파일을 첨부한다. pretty-dir.conf
여기서 주목할 부분은 5번째 라인, "IncludeStyleSheet /.style.css" 이다. 여기서 바로 페이지의 전체적인 모습을 결정한다. CSS로 작성하면 되고, 따라서 웹디자인이 가능하신 분은 알아서 작성해주시면 되겠다. 본인의 샘플은 다음과 같다. style.css
물론 위치는 아무데나 적어주셔도 상관이 없다. 다만 출처의 예제에서는 디렉토리를 따로 만들어서 넣었지만, 굳이 그렇게까지 할 필요가 없어서 내 경우는 저렇게 했다. 알아서 바꿔주시면 되겠다. 완성된 화면은 다음과 같다.
출처: https://we.riseup.net/debian/pretty-directory-indexes
이것 때문에 무려 2시간이나 소비했다는 사실. 원인은 정말 쓸데없는 것이었는데...
방법을 공유하고자 한다. 이상하게 국내에는 장고 설치에 관한 블로그가 없다. 본 포스트는 장고를 설치하고 아파치의 mod_python 모듈로 운영하고자할 때 필요한 내용이다.
먼저 장고설치. 우분투 10.04 LTS 기준으로 아래의 명령어는 Django 1.1버전이 설치된다. 현재 최신버전은 1.3이며, 장고 홈페이지에서 직접 내려받아서 설치할 수 있다. 이 경우 설치되는 경로만 조금 다를 뿐, 작동은 정상적으로 한다.
sudo apt-get install -y libapache2-mod-python python-django python-django-doc
이제 장고가 정상적으로 작동되는지를 알아볼 차례.
sudo vi /etc/apache2/sites-available/django-example
<Location "/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonDebug On
PythonPath "['/usr/share/doc/python-django-doc'] + sys.path"
SetEnv DJANGO_SETTINGS_MODULE examples.settings
</Location>
라고 작성해준 다음,
sudo a2dissite default
sudo a2ensite django-example
sudo service apache2 reload
(출처: https://wiki.ubuntu.com/Django)
이제 본인의 서버 혹은 컴퓨터로 접속을 해본다. 그러면 아래와 같은 화면을 볼 수 있다.
그러면 이제 나만의 페이지를 만들어볼 차례. 여기서부터 2시간 동안 삽질도 아닌 쌩쑈를 다 했다.
먼저 장고로 웹서비스를 할 디렉토리를 만든다. 예를 들기 위해, 필자의 유저네임은 jswlinux이며, 홈디렉토리는 /home/jswlinux 이다.
장고를 이용한 웹서비스는 /home/jswlinux/jswlinux.com에서 할 예정이라고 가정한다.
장고의 어드민 명령어로 초기화 파일을 생성해준다. 프로젝트의 이름은 myproject라고 가정한다.
$ mkdir ~/jswlinux.com
$ cd ~/jswlinux.com
$ django-admin startproject myproject
이제 ls를 해보면 myproject라는 폴더가 생성되어있는 것을 볼 수 있다. 그러면 아파치 설정파일을 작성해줄 차례다. /etc/apache2/apache.conf 파일에 작성하라고 되어있는데, 보통 일반적으로는 /etc/apache2/sites-available/ 밑에 작성하는 것이 관리도 수월하고 보기도 편하므로 그곳에 작성하기로 한다.
sudo vi /etc/apache2/sites-available/jswlinux.com
<VirtualHost *:80>
ServerName seowonjung.com
ServerAlias www.seowonjung.com
DocumentRoot /home/jswlinux/seowonjung.com
<Directory />
Options FollowSymLinks Multiviews
AllowOverride all
</Directory>
LogLevel warn
ErrorLog /var/log/apache2/seowonjung.com-error.log
CustomLog /var/log/apache2/seowonjung.com-access.log combined
<Location "/django/">
SetHandler python-program
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE myproject.settings
PythonPath "['/home/jswlinux/jswlinux.com'] + sys.path"
PythonDebug On
</Location>
</VirtualHost>
위의 작성된 내용 중에서 글씨체가 굵게되어있는 곳을 주목해야하는데, 저 부분 때문에 2시간이나 삽질을 했던 거다.
먼저, 첫번째 <Location "/django/"> 라고 되어있는 부분은, 웹서버를 관리해보신 분이면 쉽게 아시겠지만, 웹사이트를 접속했을 때 최종경로를 지정하는 부분이다. 다시 말해, http://jswlinux.com/ 이라고 접속했을 때 장고로 서비스하는 페이지가 나오게 하고싶다면 <Location "/"> 라고 입력하면 되고, http://jswlinux.com/django/ 라고 입력해야 장고로 만들어진 페이지가 나오게 하고싶다면 위와 같이 하면 된다. 별것 아니지만, http://jswlinux.com/ 이라고 접속했을 때 바로 장고로 만들어진 페이지가 나오게 하고싶다면, 사실 상단의 VirtualHost에 해당하는 부분은 모두 삭제해도 상관없다.
두번째, 위의 django-admin startproejct myproject 라고 실행해서 만들어줬던 디렉토리를 넣으면 *절대로* 안된다. 프로젝트 폴더가 만들어진 상위 디렉토리를 넣어야한다. 다시 말해, django-admin 명령어로 만들어진 프로젝트 폴더의 경로가 /home/jswlinux/jswlinux.com/myproject라면, 위의 아파치 설정파일에는
PythonPath "['/home/jswlinux/jswlinux.com'] + sys.path"
까지만 넣어야한다는 사실이다. 여기서 myproject라는 장고 프로젝트의 이름은 그 윗 라인, SetEnv DJANGO_SETTINGS_MODULE myproject.settings 에서 판단한다는 사실을 추측해볼 수 있겠다. 저장하고 아파치를 reload 해준다.
이상 완료하면 다음과 같은 페이지를 볼 수 있다.
참고로, 맥에서만 가능하다.
from AppKit import NSPasteboard, NSArray
pb = NSPasteboard.generalPasteboard()
pb.clearContents()
strClipboard = NSArray.arrayWithObject_('Message Here')
pb.writeObjects_(strClipboard)
요즘 기타를 사고싶어서 환장해있다. 컴퓨터에 빠져사는 UNIX Geek, 그리고 맥빠인 내가 왠 기타냐...
사실 어릴 때부터 피아노를 쳤었는데 우연히 접하게 된 베이스 기타를 시작으로 헤비메탈 광이 되어버린 내가 뒤늦게서야 기타를 배워보고싶다는 생각이 들게됐다는 것이다. 쓸데없는 얘기긴 한데, 피아노를 배워서 그런지 몰라도 손가락 힘은 좀 센거 같다. 기계식 흑축 키보드를 쓰는데, 흑축도 너무 부드러워서 키압력이 더 쎈걸 치고싶다. 아무튼...
초등학교 1학년부터 5학년 때까지 피아노를 배웠고, 고등학교 1학년 때 교회에서 우연히 접한 베이스 기타가 나름 연주하기가 쉬워서 해보기로 했고, 고등학교 2학년 때 학교 축제에서 베이스 기타를 연주하게 됐으며, 대학교 때는 교내 락그룹 동아리에 보컬로 들어가게 됐다. 물론 베이스 기타는 허접한 수준의 연주력이었고 보컬로서의 자질도 그닥 좋진 않았다. 친구한테서 배운 샤우팅 창법을 좀 갈고닦아서 보컬이 됐을 뿐. 물론 당시 누구나 부른다던(?) 쉬즈곤도 1절은 부를 수 있었다.
당시는 내가 1학년이었고, 감히 1학년이 공연에는 나갈 수 없다는 나름 규율 아닌 규율이 있었기에 그냥 학교 교내 밴드 7기 보컬이 됐다는 타이틀에 만족을 했어야했는데, 축제 때 나갈 공연에 베이스를 칠 사람이 없었고 그나마 째끔 칠 줄 아는 날 내보내게 된 것이다. 사실 그때까지는 베이스치는 게 너무 싫었다. 재미도 없고 주목도 받지못하고 게다가 들리지도 않고...
나이가 들어서인가 이제는 베이스가 참 매력적인 악기라고 생각이 들어서, 나중에 악기를 배워볼만큼 여유로움이 생기면 꼭 베이스를 연습할테다 라고 다짐했었건만 인터넷에서 우연히 보게 된 애프터스쿨 이영의 베이스기타의 연주동영상을 보고(아이돌 가수가 악기를 친다는 데에) 깜짝 놀라서 더 찾아보니까 잉위 맘스틴의 Far beyond the sun의 연주를 보고 더 깜짝 놀라게 됐다. 그것을 시작으로 일반인 그것도 여자들의 일렉기타 속주 동영상을 보고, 진정 내가 원하는 것은 베이스가 아니라 일렉기타가 아니었나 하는 생각을 하게됐다.
상대음감 얘기할려고 서두를 이렇게 오래 쓰다니...
내가 대학 신입생 때 락그룹 동아리에 들어간 후에 일어났던 일이었는데, 선배들이 무슨 노래를 연주하고 싶어서 그 노래의 코드를 따낼려고 한참을 듣고있길래 내가 옆에서 한 마디 했다. "제가 따드릴까요?" 선배들이 놀라더라. 들으면 코드 아냐고 하길래, 듣는 즉시 바로 코드 나온다고 얘기를 했었고 그 이후로 내 별명은 베토벤이 됐다.
그런데 난, 피아노 배운 사람은 누구나 가능한 일이라고 생각해서 별 거 아닌 줄 알았다. 나중에 알고보니, 피아노를 배워도 안되는 사람은 안된다고 하더라. 내 동기는 "청음"이라고 부르던데, 난 그런 용어가 있는 걸 그때 처음 알았다. 절대음감이니 상대음감이니 하는 말들을 한 번도 들어본 적이 없었다. 사실 내 음감은 형편없다. 아무 음이나 대충 하나만 치면 피아노 건반에서 그게 무슨음인지 도저히 구분이 안간다.
뭐 암튼 요즘 기타를 사고싶어하는 이유를 와이프한테 나름 합리화하기 위해 내세운 게 바로 내 상대음감 때문인데… 그 동안 머리 속에서만 만들어왔던 나만의 곡들이 지금 생각해보면, 일렉기타로만 표현할 수 있는 곡들로 작곡해왔다는 생각이 들면서 점점 더 기타가 치고싶어졌다. 그러면서 와이프는 상대음감이 뭐하는건지 인터넷으로 알아봤다더라. 생각난 김에 나도 알아보니까, 청음이나 상대음감이 있는 사람들은 30분에서 한 시간 정도면 곡 하나 정도의 계이름이나 코드 등은 다 따낸다고 하더라.
그런데, 내 경우는 한 번만 들으면 된다. 노래를 들으면서 동시에 계이름을 적는 게 가능하다. 속주는 당연히 한 번에 안된다. 게다가 아직 기타는 연주를 할 줄 모르다보니 소리에 많이 익숙치도 않다... 물론 이게 대단한 능력은 아니다. 난 아직도, 피아노 조금만 배우면 누구나 가능한 능력이라고 생각하고 있다. 이거 하나만으로도 기타를 배워볼만한 가치가 있겠지? 악기연주는 평생 취미라던데, 이제는 해봐야 남는 거 하나도 없는 게임은 그만하고 기타리스트 되보고 싶었지만, 막상 시작하려고하니 시간도 없고 먹고사는데 급급해서 결국은 포기했다.
텍사스에 있는 모 대학에서 음대 박사과정을 공부하고 있는 지인 말로는, 절대음감과 상대음감은 다른 능력이라고 하더라. 지인은 절대음감을 갖고있는데, 어떤 음악을 들으면 그게 절대음으로만 들리지, 계이름으로는 들리지 않는다고 한다. 본인도 계이름으로 들어보려고 노력을 많이 했는데, 둘다 동시에 갖는 것은 잘 안된다고 했다. 사람마다 다를 수는 있겠지만, 내가 겪은 바로는 그렇다. 상대음감은, "음을 기억하는 능력"이 남들보다 조금 더 낫다는 정도라고 한다. 나는 어떤 음악을 듣고 계이름을 말하려면 최소한 한 마디는 들어봐야 계이름이 나오는데, 생각해보면 음을 몇 개 듣고나서 그 음들의 간격을 뇌가 본능적으로 계산해서 그것들의 관계 등을 장/단조로 파악하게되어 계이름이 나오는게 원리가 아닌가 싶다. 따로 훈련을 받았다거나 연습을 한 것은 아니라서 잘 모르겠다. 그냥 피아노를 좀 오래쳤고, 남들도 다 되는 건줄 알고 살아왔다.
글쓴이야 절대음감은 안갖고있으니 그 느낌이 어떤지는 잘 모르겠고, 글쓴이가 느끼는 상대음감은 이렇다. 예를 들어, 다음의 글을 읽어보자.
송강호 왈 "옛날에 말이야, 최영의 라는 분이 계셨어. 최.영.의"
마치 영화 넘버 쓰리에서 송강호 목소리가 들리는 것 같다. 글쓴이도 어떤 음악을 듣든, 음을 듣는 순간 계이름 혹은 코드가 머리 속에 동시에 떠오른다. 생각을 안할려고 해도, 음악을 들으면 그냥 자연스럽게 떠오르기 때문에 좀 신경이 쓰인다. 어떻게 보면, 아무 생각없이 마음 편한하게 음악을 들으려고 해도, 뇌의 한 쪽 구석에서는 계속해서 계이름이랑 코드를 라디오 방송국 마냥 뿌려대니, 잡생각 없이 음악을 감상하기는 좀 곤란하다고 볼 수 있다. 다른 분들의 경우는 잘 모르겠다.
뭐 어쨌든 지금은 음악 안한지 오래됐고, 컴퓨터만 붙잡고 사는 컴쟁이이니 이 글을 너무 믿지는 마시라.
우분투 포럼 채팅방에서 일어난 일이었다. 어느 분께서 아파치 서버의 세팅을 뭘 잘못 손대셨는지 뭐가 잘 안된다고 하신다. 그러면서 재설치와 동시에 PHPMyAdmin 설정을 모두 할려고 하는데, 어떤 순서대로 설치를 해야하냐고 물으셨다. 일반적으로 APM의 설치는 다음과 같다.
sudo apt-get install apache2 libapache2-mod-auth-mysql
sudo apt-get install mysql-server mysql-client
sudo apt-get install php5 php5-common libapache2-mod-php5 php5-mysql
sudo apt-get install phpmyadmin
그런데, 다른 분께서 위의 명령어를 한 방에 정리하셨다.
sudo apt-get install phpmyadmin
그런데 사실이다!!! 생각해보면 phpmyadmin과 의존관계에 있는 패키지들이 모두 연결되어있다. 따라서, 인터넷에 나와있는 리눅스에서의 APM 설치법은 이제 위의 명령어 단 한 줄로 정리가 된다.
sudo apt-get install phpmyadmin (데비안 계열일 경우)
실제로 해봤다. 새로 포맷하고 새로 설치하는 컴퓨터에 해봤는데, 우분투나 데비안에서는 위의 명령어를 치기 전에 하나를 해줘야한다.
sudo apt-get install mysql-server mysql-client
왜냐하면, phpmyadmin이 설치되면서 DB의 root 비밀번호를 설정하는 입력화면이 나오는데, mysql-server의 비밀번호가 먼저 설정되어있지 않으면 설치가 제대로 되지않는다. 물론 잘 아는 유저들한테서야 별거 아니지만, 리눅스를 배우기 시작한지 얼마 안되는 분들한테는 엄청 당황스러울 거다. 따라서 우분투/데비안 유저라면 아래의 방법으로 APM을 설치한다.
sudo apt-get install mysql-server mysql-client
sudo apt-get install phpmyadmin
쉽고 간단한 APM 설치~
OWC Mercury Extreme Pro 6G라는 SSD를 하나 구입했다. 240GB이고 이름에 적힌대로 6Gbps를 지원하는 SATA3 제품이다.
한국에서 OWC를 아는 분들은 일부 맥 유저들 뿐이지만, 미국에서는 꽤 유명한 업체이다. 주로 맥용 주변기기나 부품들을 판매하는 업체인데, 자신이 사용하는 맥이나 맥북에 어떤 램/하드디스크 등이 인식되는지 잘 모르는 경우가 많기 때문에 OWC에서는 그러한 유저들을 위해 맥에서 인식이 잘되는 부품의 리스트를 나열하고 그것들을 판매하는 형태의 웹사이트였다.
그런데 이 OWC에서 램부터 시작하여 하나둘씩 자체적으로 부품을 제조하면서 맥유저들 사이에서 점점 입지를 자리잡아가고 있었는데, SSD에서 대박을 하나 터뜨렸다. 내가 구입한 이 모델이 현존하는 전 세계에서 가장 빠른 SSD라고 한다. 읽기쓰기 550 MB/s라는 어마어마한 속도에 프리징 현상도 없고 5년이라는 제품보증 기간과 TRIM이 필요없는 뛰어난 성능의 GC가 장착된 컨트롤러는 수많은 리뷰 사이트에서 인정한 현존 최강의 SSD라는 거다. 자세한 리뷰는 구글에서 제품명으로 검색하면 한국 모 사이트에서 리뷰한 페이지가 나오는데 리뷰가 아주 잘되어있으니 참고하시고.
그놈의 속도가 뭔지, 맥미니 서버를 팔고 SSD를 주문했는데 과연 디스크와 맥미니를 바꿀만한 값어치가 있는지 정말이지 한참이나 고민했다. SSD가 진리라는 소리는 수차례 들어왔고 봐왔지만 그게 정작 쓸려니 고민이 되는 것은 사실. 내 맥북의 사양은 맥북프로 15인치 2011 모델이다.
어찌됐든 주문은 했고 물건은 왔다. 오자마자 라이언을 클린설치를 하고, 하나하나 설정하려니 너무나도 귀찮고 할 게 많아서 도저히 유혹을 뿌리칠 수 없었다. 그냥 라이브러리 통째로 복사해버렸다. XBench라는 맥용 벤치마크 테스트를 돌리는데 이게 실행이 되다가 자꾸 멈추는 거다. 알고보니 만들어진지 오래된 프로그램이라 라이언에서는 더 이상 호환이 안된다. 따라서, XBench 실행시 디스크 테스트만 돌리도록 하자.
돌리고나니 이럴수가… 쓰기속도가 반 밖에 안나오는 것이다. 다시 말하면, 읽기성능은 그런대로 500메가 이상 나오는데, 쓰기성능이 200메가 정도 밖에 안나오는 것이다. 슬슬 짜증이 나기 시작했다. 분명 모 리뷰 사이트에서는 스펙 검증을 했을 때 제조사가 제시한 스펙대로 충분히 나왔고, 일부 항목에서는 스펙을 뛰어넘는 성능을 보여줬다고 했는데...
OWC기술지원쪽이랑 약 1주일간 메일을 주고받았고 제품을 교환받기로 했다. OWC에는 Advanced Cross-Shipping 이라는, 물건을 먼저 보내주는 대신 해당 액수만큼을 신용카드에서 Hold해놓는 편리한 제도가 있어서 일단 물건부터 수령받았다.
UPS 2day Air로 와서 다다음날 바로 받았다. 뜯어서 연결하고 라이언을 클린설치했다. 그리고나서 바로 QuickBench를 돌리니 쓰기에서 초당 400메가 이상이 나왔다. 일단 예전 제품보다 2배 이상이 나왔으니 제 성능이 나왔다고 판단, 이제 이것저것 원래 쓰던 프로그램 등 이전의 상황을 복구했다. 대략 4시간 정도 걸린 것 같다. 귀차니즘으로 인해 Library 폴더를 갖다붙이고 싶은 마음이 간절했으니, 이전부터 클린설치 한 번 할려고 벼르고 있었던 터라 꾹 참고 하나하나 다 설정해줬다.
주변 지인들한테 늘상 하는 얘긴데, 맥은 사용자랑 착 달라붙는 경향이 있어서 모든 자료를 맥에 넣어놓는 습성이 있고 따라서 내 맥의 자료는 아주아주 중요했다. 개인적인 정보부터 시작해서 별게 다 있었으니. FileVault2 역시 나에겐 필수다. 나중에 하면 시간이 오래 걸리니, 벤치마크를 끝내자마자 바로 해놨다.
모든 복구가 끝나고나니 벤치마크 결과가 또 다시 궁금해서 한 번 더 돌려봤다. 그런데, 성능이 또 다시 반으로 줄었다. 분명 뭔가 있다...
이게 뭐가 문제인지 하나하나 찾아내려니 시간이 안되고, 꾹 참고 쓸려니 내가 이노무 속도 때문에 일부러 비싼 모델을 산게 아까웠고해서 웹서핑을 좀 해봤다. 힌트를 찾았다!
http://blog.macsales.com/11051-to-trim-or-not-to-trim-owc-has-the-answer
리플들을 읽다보니 "File Vault 2를 쓰는데 쓰기 속도가 너무 느리다"라는 리플이 발견된 것이다. 순간 눈 앞에서 불이 번쩍했다. 그렇다면, 처음 구매해서 받은 제품 역시 정상이었던가...
리플들을 계속 읽어내려가다보니 이 제품은 File Vault 2와 사용시 쓰기성능이 반으로 줄어든다는 결과가 있었다는 리플들이다. 아니, OWC Tech Support 직원은 이 사실을 알면서도 나한테 File Vault 2 쓰는지 물어보지도 않았단 말인가?
File Vault 2를 해제했고 퀵벤치를 돌렸다. 쓰기성능이 400메가 이상 나온다. 제길, 이거 알았으면 교환신청을 하고 계좌를 홀드하고 메일을 주고받고 이딴 짓은 안했을 거 아냐! 설마 그럴리는 없겠지만, UPS 반송 잘못되서 OWC에서 물건 못받았다고 내 계좌에서 돈 빼가면 진짜 골치아파지는거다...
드디어 시작된 진정한 SSD Life 고고씽~
제목은 거창하게 달았는데, 실상은 SSD 구입을 하게되면서 조사한 내용들이다.
이번에 구입하게된 SSD는 OWC의 Mercury Extreme Pro 6G 240GB인데, 현존하는 최고속도의 제품이라고 한다.
SSD는 특성상 쓰기 작업을 많이 하면 수명을 깎아먹는다더라. 따라서 캐쉬폴더를 램드라이브로 옮기거나 혹은 쓰기가 잦은 폴더의 기능을 꺼버리는 것이 좋다고 하는데, 그것을 알아보다가 알게된 몇 가지를 공유하고자 한다.
1. 맥에서는 파일에 마지막으로 접근한 시간을 기록하는데 이것이 필요없으면 끄도록 한다.
sudo touch /Library/LaunchDaemons/com.my.noatime.plist
sudo chown root:wheel /Library/LaunchDaemons/com.my.noatime.plist
이제 vi 혹은 nano를 열어서 내용을 적어넣는다.
<?xml version=“1.0” encoding=“UTF-8”?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=“1.0”>
<dict>
<key>Label</key>
<string>com.my.noatime</string>
<key>ProgramArguments</key>
<array>
<string>mount</string>
<string>-vuwo</string>
<string>noatime</string>
<string>/</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
재부팅 후, 터미널에서 mount 명령어를 입력하여 하드디스크(예 /dev/disk0s2 on / (hfs, local/jounaled, noatime) 이라고 나오면 정상이다.
2. 램이 많아서 스왑을 안쓸 것 같으면 스왑을 아예 꺼주자.
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
3. SMS 끄기
컴퓨터를 떨어뜨렸을 때 하드디스크의 헤더를 안전한 곳으로 옮겨주는 종류의 명령어이다. SSD에서는 필요없다. 당연히 꺼준다.
sudo pmset -a sms 0
4. Sleep 모드 변경 및 하이버네이션 파일 삭제
sudo pmset -a hibernatemode 0
sudo rm /var/vm/sleepimage
5. 사파리 썸네일 끄기
defaults write com.apple.Safari DebugSnapshotsUpdatePolicy -int 2
6. 램디스크
현재 SSD 사용자들 사이에서 가장 이슈가 되고있는 부분이 바로 이 램디스크다.
하드디스크 입출력이 잦은 캐쉬 폴더 등을 아예 램에 일정공간을 만들어서 떼어주는데, 대다수의 블로거들은 램디스크를 만들어주는 프로그램을 별도로 이용하는 방식을 설명하고있지만 실은 맥OSX에서 자체적인 램디스크 생성이 가능하다.
먼저 램디스크에 올려도 될만한 디렉토리들을 나열해본다.
시스템
/private/var/tmp - /tmp 에 링크가 걸린 임시 디렉토리다. 유닉스 계열의 OS에서는 필수적인 디렉토리로서, 없으면 안된다.
/private/var/folders - 맥OSX에서 사용하는 임시 폴더이다. 경로는 echo $TMPDIR 을 입력하면 상세한 경로가 나오지만 아예 통째로 옮겨도 된다.
/private/var/vm - 스왑파일이 저장되는 곳이다.
개인용
개인용 홈폴더 안에서 사용되는 임시 디렉토리들인데, 편의상 내 폴더이름으로 기준을 정한다. 본인의 로그인 아이디는 jswlinux 이므로 /Users/jswlinux 부분에는 각자 알아서 자신의 로그인 아이디를 적으면 된다. 로그인 아이디를 잘 모르면 터미널에서 echo $USER 라고 입력하면 나온다.
/Users/jswlinux/Library/Cache/com.apple.Safari - 사파리의 캐쉬 폴더다.
/Users/jswlinux/Library/Cache/com.apple.Safaridavclient - DAV, 다시 말해 웹서버를 이용하여 원격지의 컴퓨터에 파일을 읽고쓰게 해주는 것과 관련된 캐쉬 폴더다. 뭔지 모르면 삭제항목에 넣어도 된다. 알면 당연히 넣을 거다.
/Users/jswlinux/Library/Cache/Google - 크롬이 사용하는 캐쉬 폴더이다. 실은 Google 폴더 아래 Chrome이라는 폴더가 있지만, 구글제품의 모든 캐쉬를 옮기고자 아예 통째로 넣어버렸다.
/Users/jswlinux/Library/Saved Application State - 사파리를 종료할 때, 탭이 여러 개 있는 상태에서 Cmd+Q를 눌러서 꺼본 적이 있으신가? 그렇다면 다시 사파리를 띄워보시라. 전의 상황을 그대로 복구해줄 것이다. 이 폴더는 그러한 기능을 제공하는 폴더이다. 다시 말해서, 프로그램이 종료될 당시에 작업하던 문서들이나 상황을 그대로 재현해주는 기능에 이용되는 폴더인데, 본인은 개인적으로 이게 너무 귀찮다. 작업은 내가 알아서 한다. 이게 필요하신 분들은 나중에 밑에서 빼시면 된다.
/Users/jswlinux/Library/Autosave Information - 맥을 종료할 때 다시 로그인하면 프로그램을 다시 띄울거냐고 물어보는 창을 보셨을 거다. 거기에 이용되는 폴더인데, 그 기능 귀찮으신 분이 여럿 있는 걸로 알고있다. 이게 기능을 꺼도 잘 안된다. 따라서 폴더 자체에 접근을 금지시키거나 하면 된다. 본인은 그냥 램디스크에 넣어버렸다. 어차피 재부팅되면 날아갈테니.
여기까지다. 각자의 상황에 맞게 미리 체크를 해두셨으면 이제 적용하는 단계에 들어가보자. 명령어 뒤에 붙은 # 표시는 주석이니 이 부분은 따라서 입력하시면 안된다.
램디스크 생성
cd /System/Library/StartupItems # 작업하기 편하게 디렉토리를 옮기자.
sudo mkdir RamFS # RamFS라는 이름의 폴더를 만든다.
sudo chown -R root:wheel RamFS # RamFS의 폴더 소유주를 root와 wheel 그룹으로 지정한다.
sudo chmod -R 755 RamFS #RamFS의 권한을 755로 지정한다 (기본값이다).
sudo mkdir /private/RamFS # 램디스크가 마운트 될 곳을 /private/RamFS로 지정했다. 물론 다른 곳으로 원하시면 원하시는대로 적으셔도 된다.
cat << "EOF" | sudo tee RamFS/RamFS > /dev/null # 이제 램디스크가 생성되는 내용을 입력한다. 주의깊게 보셔야한다.
#!/bin/sh
RAMDisk()
{
mntpt=$1
rdsize=$(($2*1024*1024/512))
echo "Creating RamFS for $mntpt"
dev=`hdik -drivekey system-image=yes -nomount ram://$rdsize`
if [ $? -eq 0 ] ; then
newfs_hfs $dev
eval `/usr/bin/stat -s $mntpt`
mount -t hfs -o union -o nobrowse $dev $mntpt
chown $st_uid:$st_gid $mntpt
chmod $st_mode $mntpt
fi
}
if [ -z $1 ]; then
echo "Usage: $0 [start|stop|restart] "
exit 1
fi
test -r /etc/rc.common || exit 1 . /etc/rc.common
StartService ()
{
ConsoleMessage "Starting RamFS disks..."
RAMDisk /private/RamFS 256 # 램디스크를 설정하는 부분이다. 단위는 메가바이트다.
mkdir /private/RamFS/tmp
mkdir /private/RamFS/folders
mkdir /private/RamFS/vm
# 여기서부터 위에 설명한 폴더들을 넣는다. 원하지 않는 폴더가 있으면 빼시길 바란다. 본인은 위의 리스트 전부 다 넣었다.
# 시작
mkdir /private/RamFS/com.apple.Safari
mkdir /private/RamFS/com.apple.safaridavclient
mkdir /private/RamFS/Google
mkdir "/private/RamFS/Saved Application State"
mkdir "/private/RamFS/Autosave Information"
# 끝
# 역시 마찬가지. 윗 부분에서 뺀 부분을 아래 항목에서도 똑같이 삭제해주면 된다.
# 시작
chmod 1777 /private/RamFS/tmp
chmod 755 /private/RamFS/com.apple.Safari /private/RamFS/com.apple.Safari /private/RamFS/com.apple.safaridavclient
chmod 700 "/private/RamFS/Saved Application State" /private/RamFS/Google
chown -R jswlinux:staff /private/RamFS/com.apple.Safari /private/RamFS/com.apple.Safari /private/RamFS/com.apple.safaridavclient /private/RamFS/Google "/private/RamFS/Autosave Information"
rm -rf /private/var/folders /private/var/vm /Users/jswlinux/Library/Caches/com.apple.Safari /Users/jswlinux/Library/Caches/Google/ /Users/jswlinux/Library/Caches/com.apple.safaridavclient "/Users/jswlinux/Library/Saved Application State" "/Users/jswlinux/Library/Autosave Information"
ln -s /private/RamFS/folders /private/var/
ln -s /private/RamFS/vm /private/var/
ln -s /private/RamFS/com.apple.Safari /Users/jswlinux/Library/Caches/
ln -s /private/RamFS/com.apple.safaridavclient /Users/jswlinux/Library/Caches/
ln -s /private/RamFS/Google /Users/jswlinux/Library/Caches/
ln -s "/private/RamFS/Saved Application State" /Users/jswlinux/Library/
ln -s "/private/RamFS/Autosave Information" /Users/jswlinux/Library/
# 끝
}
StopService ()
{
ConsoleMessage "Stopping RamFS disks, nothing will be done here..."
diskutil unmount /private/RamFS
}
RestartService ()
{
ConsoleMessage "Restarting RamFS disks, nothing will be done here..."
}
RunService "$1"
이제 실행에 필요한 plist 파일을 작성한다.
cat << EOF | sudo tee RamFS/StartupParameters.plist > /dev/null
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
<key>Description</key>
<string>RamFS Disks Manager</string>
<key>OrderPreference</key>
<string>Early</string>
<key>Provides</key>
<array>
<string>RamFS</string>
</array>
<key>Uses</key>
<array>
<string>Disks</string>
</array>
</dict>
</plist>
EOF
램디스크 생성은 여기까지가 끝이다.
참고로, 외국쪽 블로그에서 가져왔고 한 외국 포럼에서는 /private/var/run 폴더도 램디스크에 넣을 수 있다고는 했지만 실제로 그렇게 하면 제대로 작동되지 않았다. 대표적인 예로 인터넷이 되질 않았다. /etc/resolv.conf 파일을 별도로 작성해줘도 작동되지 않았으며, 또한 Dock, 상단 패널, 배경사진 등등 모두 제대로 나오지 않았다.
추가로 더 넣을 수 있는 임시/캐쉬 폴더가 있으면 알려주시면 감사하겠습니다.