Mind Forest: Beneath imaginations: 빚어내기/삽질하기 카테고리 글 목록https://forest.nubimaru.com/시간의 토양에 기억의 나무를 심으며2024-03-19T14:58:24+09:00Textcube 1.10.10 : Tempo primo블로그 정비inureyeshttps://forest.nubimaru.com/entry/blog-optimization2013-05-28T15:41:05+09:002013-05-28T15:38:43+09:00일 년 넘는 기간동안 서버 속도가 느려셔 심심할 때 마다 별별 최적화를 다 해 보았다. 그 과정에서 서버 최적화에 대하여 정말 많은 것을 배울 수 있는 계기가 되었지만 정작 문제는 해결하지 못했다. 블로그를 포함한 서버가 느린 상태가 계속 지속되었다.<br /><br />오늘 재원의 로그인 관련 요청을 해결해 주다가 드디어 문제 해결. 댓글 및 트랙백 테이블에 스팸이 넘치는데, 어딘가에서 페이지 쿼리할 때마다 특정 글에 엄청나게 달라붙은 스팸들을 카운트할 때 발생하는 문제였다. 슬로우 쿼리 로그는 0이라 파악하는 것이 늦었다. 약간씩 느린 쿼리들에 요청 자체가 많은 것과, 댓글 테이블이 2기가 바이트가 넘어가면서 발생한 DBMS의 속도 저하로 인하여 복합적으로 생겼던 문제였다.<br /><br />글 쓰러 들어오다 최적화 삽질만 하고 돌아가던 일 년 가까이 지속되던 상태에서 드디어 벗어나게 되었다. :)<br /><br />덧) 역시 삽질은 가장 바쁠때 전기를 맞이하게 마련이다.<fieldset style="margin:20px 0px 20px 0px;padding:5px;"><legend><span><strong>크리에이티브 커먼즈 라이센스</strong></span></legend><!--Creative Commons License--><div style="float: left; width: 88px; margin-top: 3px;"><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank><img alt="Creative Commons License" style="border-width: 0" src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png"/></a></div><div style="margin-left: 92px; margin-top: 3px; text-align: justify;">이 저작물은 <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank>크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스</a>에 따라 이용하실 수 있습니다.
<!-- Creative Commons License-->
<!-- <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#">
<Work rdf:about="">
<license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" />
</Work>
<License rdf:about="http://creativecommons.org/licenses/by-nc-nd/">
<permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
<permits rdf:resource="http://web.resource.org/cc/Distribution"/>
<requires rdf:resource="http://web.resource.org/cc/Notice"/>
<requires rdf:resource="http://web.resource.org/cc/Attribution"/><prohibits rdf:resource="http://web.resource.org/cc/CommercialUse"/></License></rdf:RDF> --></div></fieldset><div class="fb-like" data-href="https://forest.nubimaru.com/entry/" data-layout="standard" data-action="like" data-show-faces="true" data-share="true"></div>
<div class="fb-comments" data-href="https://forest.nubimaru.com/entry/" data-width="630" data-numposts="2" data-colorscheme="light"></div><p><strong><a href="https://forest.nubimaru.com/entry/blog-optimization?commentInput=true#entry2041408WriteComment">댓글 쓰기</a></strong></p>mod_limitipconn 설치하기inureyeshttps://forest.nubimaru.com/entry/how-to-install-mod_limitipconn2009-04-04T14:15:26+09:002009-04-04T14:15:09+09:00<p>텍스트큐브 메인 사이트가 터져 나가는 일련의 문제 (<a href="http://notice.textcube.org/ko/167">이런</a><a href="http://notice.textcube.org/ko/167" onclick="window.open('http://notice.textcube.org/ko/167');return false;" style="border:none; text-decoration:none; padding-left:15px; margin-right: -0.5em; background: transparent url(/plugins/NewWindowLink/newwindow.gif) no-repeat 0px 50%;" title="다음 링크를 새 창으로 엽니다. : '이런'"> </a> 문제들) 때문에 아침놀님 서버의 더부살이를 끝내고 TNF1 서버로 다시 메인 사이트의 이전준비를 하는 중이다. 매번 서버 준비할 때 마다 설정하는 것들이 많은데, 그 중에서 좀 마이너한 아파치 모듈 하나를 정리해 본다.</p>
<p>mod_limitipconn은 한 IP에서 동시에 접속하는 수를 아파치 서버 설정을 통해 간단하게 제한하는 기능을 가지고 있다. 터져나가는 서버나 DDoS에 대한 간단한 대비에 좋은 모듈이다.</p>
<p>먼저 데비안 시스템에 build-essential 패키지가 설치되어 있어야 한다.</p>
<ol>
<li>http://dominia.org/djao/limitipconn2.html 에서 mod_limitipconn 소스 파일을 내려 받는다. mod_limitipconn-0.23.tar.bz2 라는 파일을 받을 수 있다.
[CODE]wget http://www.dominia.org/djao/limit/mod_limitipconn-0.23.tar.bz2
[/CODE]</li>
<li>압축을 푼다. (bz2 압축이므로 j 옵션을 쓴다.)
[CODE]tar xvjf mod_limitipconn-0.23.tar.bz2
[/CODE]</li>
<li>디렉토리로 진입한다.
[CODE]cd mod_limitipconn-0.23
[/CODE]</li>
<li>보통 apxs2가 아파치에 깔려있지 않다. 이 도구는 아파치 개발도구에 들어있다. 아파치 개발 도구를 설치한다.
[CODE]sudo apt-get install apache2-dev
[/CODE]</li>
<li>Makefile을 vi 등으로 열어서 (vi Makefile) 현재 버전에 맞게 아래처럼 수정한다.
[CODE]APXS=apxs2
APACHECTL=apache2ctl
[/CODE]</li>
<li>DSO를 컴파일해서 만들고 아파치 라이브러리에 설치한다.
[CODE]sudo make install
[/CODE]</li>
<li>아파치의 DSO 로 등록한다. 우선 아파치 디렉토리로 이동한 다음 load 파일을 만든다.
[CODE]cd /etc/apache2/mod_available
vi limitipconn.load
이후 내용을
LoadModule limitipconn_module /usr/lib/apache2/modules/mod_limitipconn.so
으로 만들고 저장하고 나온다.
[/CODE]</li>
<li>아파치 서버의 모듈로 등록한다.
[CODE]a2enmod limitipconn
[/CODE]</li>
<li>아파치 서버를 재시작한다.
[CODE]sudo /etc/init.d/apache2 restart
[/CODE]</li>
</ol>
<p>설치하고 나면 사이트 파일을 편집하면 된다. 원하는 사이트 정보 하위에 아래의 예제처럼 적으면 된다. (아래는 <a href="http://www.webhostgear.com/279.html">webhostgear 페이지</a><a href="http://www.webhostgear.com/279.html" onclick="window.open('http://www.webhostgear.com/279.html');return false;" style="border:none; text-decoration:none; padding-left:15px; margin-right: -0.5em; background: transparent url(/plugins/NewWindowLink/newwindow.gif) no-repeat 0px 50%;" title="다음 링크를 새 창으로 엽니다. : 'webhostgear 페이지'"> </a> 에서 소개하는 예이다.)
[CODE]<IfModule mod_limitipconn.c>
<Location /somewhere>
MaxConnPerIP 3
# exempting images from the connection limit is often a good
# idea if your web page has lots of inline images, since these
# pages often generate a flurry of concurrent image requests
NoIPLimit image/*
</Location></p>
<pre><code><Location /mp3>
</code></pre>
<p>MaxConnPerIP 1
# In this case, all MIME types other than audio/mpeg and video*
# are exempt from the limit check
OnlyIPLimit audio/mpeg video
</Location>
</IfModule>
[/CODE]</p>
<p>다음에는 spamhaus PHP 확장 설치를 써볼까 싶다.</p>
<fieldset style="margin:20px 0px 20px 0px;padding:5px;"><legend><span><strong>크리에이티브 커먼즈 라이센스</strong></span></legend><!--Creative Commons License--><div style="float: left; width: 88px; margin-top: 3px;"><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank><img alt="Creative Commons License" style="border-width: 0" src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png"/></a></div><div style="margin-left: 92px; margin-top: 3px; text-align: justify;">이 저작물은 <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank>크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스</a>에 따라 이용하실 수 있습니다.
<!-- Creative Commons License-->
<!-- <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#">
<Work rdf:about="">
<license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" />
</Work>
<License rdf:about="http://creativecommons.org/licenses/by-nc-nd/">
<permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
<permits rdf:resource="http://web.resource.org/cc/Distribution"/>
<requires rdf:resource="http://web.resource.org/cc/Notice"/>
<requires rdf:resource="http://web.resource.org/cc/Attribution"/><prohibits rdf:resource="http://web.resource.org/cc/CommercialUse"/></License></rdf:RDF> --></div></fieldset><div class="fb-like" data-href="https://forest.nubimaru.com/entry/" data-layout="standard" data-action="like" data-show-faces="true" data-share="true"></div>
<div class="fb-comments" data-href="https://forest.nubimaru.com/entry/" data-width="630" data-numposts="2" data-colorscheme="light"></div><p><strong><a href="https://forest.nubimaru.com/entry/how-to-install-mod_limitipconn?commentInput=true#entry2041246WriteComment">댓글 쓰기</a></strong></p>MATLAB 객체 프로그래밍의 특이점inureyeshttps://forest.nubimaru.com/entry/MATLAB-object-orient-programming-and-its-strangeness2009-03-23T20:34:31+09:002009-03-23T20:33:41+09:00<p>MATLAB이 2008a 이후부터 클래스 지원을 필두로 객체를 지원한다. 주 언어가 C++이라 예전 전산물리학 조교할 때와 비선형 계획 수업을 제외하면 MATLAB을 필드에서 제대로 써 보지 않아서, 테스트겸 어제 오늘 이틀동안 여러가지 코딩을 해 보았다.</p>
<p>테스트 결과 MATLAB에서도 객체 프로그래밍이 가능하긴 하지만 원래 객체 기반의 언어가 아니라 몇 년에 걸쳐 구조체부터 하나씩 도입을 해 온 산물이기 때문에 C++이나 자바와는 굉장히 특성이 다르다. 간단하게 정리해 본다. 아래의 지원 목록은 help 를 참조하며 하나씩 만들어가면서 본 것이라 확실하지는 않다. (지원하더라도 괴상하게 지원하는 경우가 많다...)</p>
<h3>객체 프로그래밍을 위해 지원하는 것</h3>
<ul>
<li>Member variable / function</li>
<li>Scope and Methods
<ul>
<li>Public / Private / Protected</li>
<li>Static / Accessor</li>
</ul></li>
<li>Inheritance</li>
<li>Polymorphism</li>
<li>Abstract
<ul>
<li>Subclasses / Superclasses</li>
</ul></li>
<li>Interface</li>
</ul>
<h3>꼭 필요한 것은 아니지만 지원하는 것들</h3>
<ul>
<li>Event / handler</li>
<li>Dynamic methods</li>
<li>Recursion</li>
<li>Properties and attributes</li>
</ul>
<h3>MATLAB에서 기형적으로 지원하는 것들</h3>
<ul>
<li>Properties</li>
</ul>
<p>적어놓고 보면 다 지원하는 것 같은데, 총평을 먼저 하자면 구현이 괴악하다. 다른 언어에서 아주 기본적으로 지원하는 몇몇 부분이 지원되지 않거나 굉장히 특이하게 지원된다. 여러가지 중에서 properties의 경우, MATLAB가 주언어가 아니라서 이해가 참 힘들었다.</p>
<p>Properties 는 객체에서 저장 공간이나 속성을 담당한다. 다른 언어에서 변수를 member variable의 형태로 객체에 포함시켜서 사용하는 것과는 차이가 있는 부분인데, 변수들을 properties라는 일종의 구조체로 묶어서 가지고 있다. 예를 들면</p>
<p><pre class="prettyprint"><code>classdef Trader
properties (SetAccess = protected, GetAccess = protected)
name = 'Trader'
id = 1
end
</code></pre></p>
<p>이런 식으로 기술한다.</p>
<p>그런데 MATLAB에서는 같은 객체 안의 method에서 자신의 property를 참조할 수 있는 직접적인 방법을 제공하지 않는다. (this나 self등이 없다!) 그래서 편법을 써야 하는데, method의 첫 인자로 자신을 넘기는 방법이다.</p>
<p><pre class="prettyprint"><code>function obj=initialize(obj,name)
test = obj.id
end
</code></pre></p>
<p>이렇게 method를 만들면 MATLAB은 첫 인자로 자신을 넘겨주게 되고, 그 객체의 변수값을 직접 억세스하는 방식으로 현재의 값을 읽어오게 된다.</p>
<p>이러한 이상한 특징은 MATLAB의 기본적인 특징 하나와 맞물려 굉장히 재미있는 동작을 만든다. MATLAB은 call-by-reference를 지원하지 않는다. 그래서 위의 예에서 인자로 넘어간 객체는 실제 객체가 아니라 객체의 복사본이다. 따라서 값을 읽을 수는 있는데, <strong>그 값을 수정할 수는 없다.</strong> 객체 안의 method에서 자신의 값을 수정할 수가 없게 된다. 그래서 properties의 값은 constructor에 의해서만 지정이 가능하다. 메모리를 가질 수 없는 객체라니, 객체 프로그래밍의 관점에서 보면 진정 엽기적인 객체 지원이다.</p>
<p>MATLAB에서 제안하는 방법은 객체의 리턴값으로 객체를 재지정하는 것이다. 아래와 같이, 리턴되는 값이 property 값이 변한 객체이므로 그것으로 자신을 재지정하는 식이다.
<pre class="prettyprint"><code>A = Trader;
A = A.initialize();
</code></pre></p>
<p>주윗 사람들의 태반은 이 방법에 동의할 수 없을 것이다. 방법이 없는 것은 아니다. MATLAB에서도 call-by-reference를 사용하는 부분이 있는데, handle 지원이다. MATLAB에서 그래프를 그리거나 UI를 만들 때, 모든 UI object들을 제어하기 위해서 handle이라는 unique number가 존재한다. 그 handle 값을 이용하여 오브젝트들의 핸들을 잡고 내부의 속성을 조정할 수 있다.</p>
<p>따라서 MATLAB 클래스 지원의 상속 기능을 사용하여 객체를 handle을 상속해서 생성하는 방법이 가능하다. 그러면 위의 예에서 obj는 복사된 객체가 아니라 원래 객체의 handle이 된다. 따라서 직접적인 수정이 가능해진다. 이 방법에도 문제점이 있다. 객체를 상속받은 경우 abstract나 interface를 사용할 수가 없다. 또한 여러개의 superclass들을 상속받아서 클래스를 정의하려는 경우, 모든 클래스는 handle을 루트로 가지고 있어야 한다.
<pre class="prettyprint"><code>classdef Trader < handle
properties
name = 'Trader'
id = 1
end
methods (Access = public)
function obj=initialize(obj,name)
obj.name = 'TEST';
end
end
end
</code></pre></p>
<p>대충 이런 식으로 '상식적인' 객체 프로그래밍을 할 준비가 마무리 되었다. 사실 처음 시작이 복잡해서 그렇지 MATLAB으로 객체 프로그래밍을 하는 것은 <span style="color: #E4E4E4">(코딩과 거리가 먼 사람들을 위한)</span> 다른 언어에서 유래를 찾아볼 수 없는 어마어마한 내부 함수들 때문에 꽤 재미있다. 첫인상 정리는 여기까지.</p>
<fieldset style="margin:20px 0px 20px 0px;padding:5px;"><legend><span><strong>크리에이티브 커먼즈 라이센스</strong></span></legend><!--Creative Commons License--><div style="float: left; width: 88px; margin-top: 3px;"><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank><img alt="Creative Commons License" style="border-width: 0" src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png"/></a></div><div style="margin-left: 92px; margin-top: 3px; text-align: justify;">이 저작물은 <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank>크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스</a>에 따라 이용하실 수 있습니다.
<!-- Creative Commons License-->
<!-- <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#">
<Work rdf:about="">
<license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" />
</Work>
<License rdf:about="http://creativecommons.org/licenses/by-nc-nd/">
<permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
<permits rdf:resource="http://web.resource.org/cc/Distribution"/>
<requires rdf:resource="http://web.resource.org/cc/Notice"/>
<requires rdf:resource="http://web.resource.org/cc/Attribution"/><prohibits rdf:resource="http://web.resource.org/cc/CommercialUse"/></License></rdf:RDF> --></div></fieldset><div class="fb-like" data-href="https://forest.nubimaru.com/entry/" data-layout="standard" data-action="like" data-show-faces="true" data-share="true"></div>
<div class="fb-comments" data-href="https://forest.nubimaru.com/entry/" data-width="630" data-numposts="2" data-colorscheme="light"></div><p><strong><a href="https://forest.nubimaru.com/entry/MATLAB-object-orient-programming-and-its-strangeness?commentInput=true#entry2041245WriteComment">댓글 쓰기</a></strong></p>MATLAB R2008~2009a 가 MacOSX에서 64비트로 동작하지 않는 이유inureyeshttps://forest.nubimaru.com/entry/reason-why-matlab-macos-x-version-still-stuck-to-32bit2009-03-19T03:24:46+09:002009-03-18T18:23:37+09:00<p>MATLAB의 맥오에스 포팅 버전이 나온지 3년이 흘렀다. 하지만 아직 윈도우나 리눅스 버전이 모두 지원하고 있는 64비트 바이너리를 지원하지 않는다. 따라서 다룰 수 있는 메모리가 2GB로 묶여 있다. 갈수록 다루는 데이터 크기가 커지는 현재 연구들의 경향에 비추어 볼 때, 이러한 제약은 많은 연구자들이 맥을 MATLAB 머신으로 사용하지 못하는 이유가 되고 있다.</p>
<p>MacOSX로의 포팅 초창기에는 BSD 서브시스템만이 64비트를 지원할 수 있는 운영체제의 특성상 GUI를 사용하는 MATLAB은 64비트로 포팅이 불가능했다. 이후 MasOSX 10.5 (leopard)가 등장한 이후 OS 단계에서의 64비트 지원은 완성되었지만 MATLAB은 64비트 코드로 이전하지 못하고 있다. (신청하면 64비트 베타 버전을 보내주기는 한다)</p>
<p>MATLAB의 GUI를 구성하는 자바는 맥오에스용 64비트 버전이 배포되고 있기 때문에 현재도 64비트로 이전할 수 있는 상태이다. 그렇지만 MATLAB 패키지의 큰 부분을 차지하는 Simulink의 경우 QT에 기반하고 있고, 아직 MacOSX용 QT가 64비트로 포팅되지 않은 상황이기 때문에 MATLAB의 공식 배포판은 32비트 제한에 묶여 있다.</p>
<p>Snow Leopard 발표때까지 QT의 64비트 포팅이 완료될 지 알 수 없지만, 당분간 공식 배포판을 받아 볼 때 MacOSX용 64비트 MATLAB을 찾기는 어려울 듯 하다. 관련 쓰레드는 <a href="http://www.mathworks.co.kr/matlabcentral/newsreader/view_thread/161842">이 쪽</a><a href="http://www.mathworks.co.kr/matlabcentral/newsreader/view_thread/161842" onclick="window.open('http://www.mathworks.co.kr/matlabcentral/newsreader/view_thread/161842');return false;" style="border:none; text-decoration:none; padding-left:15px; margin-right: -0.5em; background: transparent url(/plugins/NewWindowLink/newwindow.gif) no-repeat 0px 50%;" title="다음 링크를 새 창으로 엽니다. : '이 쪽'"> </a>을 참조.</p>
<fieldset style="margin:20px 0px 20px 0px;padding:5px;"><legend><span><strong>크리에이티브 커먼즈 라이센스</strong></span></legend><!--Creative Commons License--><div style="float: left; width: 88px; margin-top: 3px;"><a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank><img alt="Creative Commons License" style="border-width: 0" src="http://i.creativecommons.org/l/by-nc-nd/2.0/kr/88x31.png"/></a></div><div style="margin-left: 92px; margin-top: 3px; text-align: justify;">이 저작물은 <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" target=_blank>크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스</a>에 따라 이용하실 수 있습니다.
<!-- Creative Commons License-->
<!-- <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#">
<Work rdf:about="">
<license rdf:resource="http://creativecommons.org/licenses/by-nc-nd/2.0/kr/" />
</Work>
<License rdf:about="http://creativecommons.org/licenses/by-nc-nd/">
<permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
<permits rdf:resource="http://web.resource.org/cc/Distribution"/>
<requires rdf:resource="http://web.resource.org/cc/Notice"/>
<requires rdf:resource="http://web.resource.org/cc/Attribution"/><prohibits rdf:resource="http://web.resource.org/cc/CommercialUse"/></License></rdf:RDF> --></div></fieldset><div class="fb-like" data-href="https://forest.nubimaru.com/entry/" data-layout="standard" data-action="like" data-show-faces="true" data-share="true"></div>
<div class="fb-comments" data-href="https://forest.nubimaru.com/entry/" data-width="630" data-numposts="2" data-colorscheme="light"></div><p><strong><a href="https://forest.nubimaru.com/entry/reason-why-matlab-macos-x-version-still-stuck-to-32bit?commentInput=true#entry2041240WriteComment">댓글 쓰기</a></strong></p>