counter create hit

워드프레스 댓글이 다른 포스트에서 표출될때 해결법

얼마 전 워드프레스에 맞는 스킨(테마)를 제작하여 적용하였다. 현재 적용되어 있는 이 스킨인데, 사실 이 스킨은 2013년에 홈페이지 프로필 제작용으로 만든 html + css 스킨이고, 블로그에도 적용할 것을 고려하고 만들었다가, 여러가지 사정으로 홈페이지에만 (현재 프로필페이지로 넘겨짐) 적용하고 블로그 적용은 계속 미뤄오다 이제야 잘 적용할 수 있게 되었다.

네이버 등의 서비스형 블로그와 설치형 텍스트큐브를 기반으로 한 티스토리 블로그에 비해, 워드프레스 블로그는 테마 구조가 상당히 복잡하다. 알짜배기 기능만을 구현한다고 하더라도 약 7개 정도의 php 파일로 구성되어 있고 (header, footer, single 등), 코어에서 정의된 함수명들을 알아야 하기에 처음 개발시에는 관련 문서를 많이 찾아보면서 작성하게 된다.

최근에 워드프레스 댓글이 다른 포스트에서 표출되는 문제를 발견하였는데, 문제가 발생한 원인이 블로그 포스트 뒤에 붙는, "블로그 내 관련 포스트" 목록에 있다는 것을 알게 되었다. 아래 코드는 관련 포스트 목록을 뽑아주는 코드이다.

$category = get_the_category();
$my_query = new WP_Query("category_name".$category[0]->name."&showposts=5&orderby=post_date&order=desc");

while ($my_query->have_posts()) : $my_query->the_post();
echo '<li><a href="'.$post->guid.'">"'.$post->post_title.'"</a></li>';
endwhile;

위 코드가 실행되는 도중에 $post 전역변수를 건드려서 이후에 comments_template() 함수를 호출할 시에 영향을 준다고 한다. 목록을 뽑은 후에, 영향받은 변수를 다시 리셋하는 wp_reset_query() 함수를 호출 후 comments_template() 함수를 호출하면 문제를 해결할 수 있다.

References

[1] stackoverflow.com, "Previous post is shown after submitting a comment," StackOverflow, 06-Dec-2011. [Online]. Available: http://stackoverflow.com/questions/8406150/previous-post-is-shown-after-submitting-a-comment

[Ubuntu] 기존 Apache 서버에 GitLab 설치하기

GitLab을 처음 설치하면 번들로 내장된 Nginx 웹서버에서 돌아가도록 기본 설정되어 있다. 웹 서버로 GitLab만 구동하지 않고, 다른 웹사이트와 함께 돌리는게 일반적인데, 이를 해결할 수 있는 가장 간단한 방법은 80번이 아닌 다른 포트로 할당하는 것이다. 하지만, 접속할 때 뒤에 포트번호를 매번 입력해야 하는 불편함이 있다. 이를 해결하기 위한 방법이 reverse proxy를 설정하는 것인데, 본 글에서는 이를 사용하여 기존에 Apache 서버를 사용하면서 GitLab을 같은 포트에 설치하는 방법에 대해 다룬다.

Step 1: GitLab 설치

GitLab을 설치하기 위해, 아래 명령어를 입력한다.

sudo apt-get install curl openssh-server ca-certificates postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt-get install gitlab-ce
sudo gitlab-ctl reconfigure

만약 GitLab만 웹사이트로 운영할 생각이면, 더 이상 추가 설정을 할 필요가 없다. 해당 웹서버의 ip 주소를 웹 브라우저에 입력하면, GitLab 페이지가 뜨는 것을 확인할 수 있다. 하지만, 만일 Apache 등의 웹서버를 기존에 돌리고 있었던 상황이라면, 아래 명령어를 입력하여 Apache 서버를 재시작 후 다시 확인해 보자. 기존 Apache에서 운영하던 웹페이지가 없어지고, GitLab만이 뜨는 것을 확인할 수 있다.

sudo service apache2 restart

바로 다음 절에서 이 부분에 대한 해결책을 소개할 것이다.

Step 2: GitLab 설정 변경

Ubuntu에서 기본적으로 GitLab의 설정파일은 “/etc/gitlab/gitlab.rb”에 위치되어 있다. Type the following command to edit the configuration file:

sudo nano /etc/gitlab/gitlab.rb

설정파일에서 아래의 항목을 변경.

# Change GitLab port (any unused port is ok.)
external_url 'http://127.0.0.1:14500'

설정 저장 후, 아래 명령어를 입력하여 GitLab 설정 변경 적용.

sudo gitlab-ctl reconfigure

Step 3: Apache에서 GitLab reverse proxy 설정

본론으로 들어가기 전에, GitLab 주소로 사용할 도메인을 하나 갖고 있어야 한다. 만일 없다면, 최소한 hosts 레코드 혹은 공유기 설정에서 DNS 설정을 사용하여 임시 도메인을 하나 만들어서 사용하면 된다. 이 부분에 대한 설명은 생략하고, 본 절에서는 “http://gitlabtest.yoursite.com/” 을 GitLab 주소 예시로 설명한다.

Apache에서 proxy_http 모듈을 사용하도록 설정한다. 설정 방법은 아래와 같다.

sudo a2enmod proxy_http

Apache의 site 설정에 GitLab을 다음과 같이 추가한다.

cd /etc/apache2/sites-available/
sudo touch gitlab.conf
sudo nano gitlab.conf

nano 에디터에 다음과 같이 입력한다.

<VirtualHost *:80>
  ServerName gitlab.yoursite.com

  ProxyRequests off
  ProxyPass / http://127.0.0.1:14500
  ProxyPassReverse / http://127.0.0.1:14500
<VirtualHost>

저장 후, site 활성화를 위해 아래와 같이 입력한다.

sudo a2ensite gitlab
sudo service apache2 restart

Step 4: GitLab 페이지에서 잘못된 repository 표출 문제 수정

Reverse proxy를 사용하여 설정하였기에, GitLab 페이지에서는 내부 Nginx에서의 URL (예: http://127.0.0.1:14500/repo_url) 을 표출하는데, 이는 실제 클라이언트에서는 접근이 불가능한 주소인 경우가 많다. 이는 아래와 같이 설정 파일을 수정하여 해결할 수 있다.

sudo nano /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

초기 설정 (변경 전):

## Web server settings (note: host is the FQDN, do not include http://)
host: 127.0.0.1
port: 14500
https: false

변경 후:

## Web server settings (note: host is the FQDN, do not include http://)
host: gitlabtest.yoursite.com
port: 80
https: false

설정 후, GitLab을 다음 명령어를 사용하여 재실행한다.

sudo gitlab-ctl restart

이후 GitLab 페이지에 접속하면, 실제 URL을 표출하는 것을 확인할 수 있다. 추후 수정시에, gitlab-ctl reconfigure 를 실행하여 GitLab을 재설정하면 위의 URL 설정값이 초기화된다. 그런 경우에는, 위와 같이 다시 수정하여 gitlab-ctl restart 명령어로 재실행하면 된다.

Note 1: https 설정 방법

GitLab을 https로 설정하는 방법은 위의 방법에서 추가적으로 수정할 부분이 있다. https 설정시에 필요한 인증서, 키, 루트 인증서등은 이미 준비되어 있다고 가정하고, 이후 추가 수정하는 방법을 기술한다.

GitLab 설정 변경

설정 파일 /etc/gitlab/gitlab.rb 에서 다음 부분 수정:

# GitLab 포트 변경 (원하는 port 로 변경하면 됨.)
external_url 'https://127.0.0.1:14500'

...
################
# GitLab Nginx #
################
...
nginx['ssl_certificate'] = "/path/to/certificate.crt"
nginx['ssl_certificate_key'] = "/path/to/certificate_key.key"

이후, 아래 명령어로 GitLab 설정을 재구성한다.

sudo gitlab-ctl reconfigure

추가적으로, 설정파일 /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml 에서 다음 부분을 수정한다.

## Web server settings (note: host is the FQDN, do not include http://)
host: gitlabtest.yoursite.com
port: 443
https: true

마지막으로, 아래 명령어로 GitLab을 재시작한다.

sudo gitlab-ctl restart

Apache 설정 변경

Apache에서 reverse proxy를 구성하기 위해, 설정 파일 /etc/apache2/sites-available/gitlab.conf 를 생성 후 아래 설정값을 입력한다.

<VirtualHost *:80>
  ServerName gitlabtest.yoursite.com
  Redirect permanent / https://gitlabtest.yoursite.com/
</VirtualHost> 

<VirtualHost *:443>
  ServerName gitlabtest.yoursite.com

  # Certificate
  SSLEngine on
  SSLCertificateFile /path/to/certificate.crt
  SSLCertificateKeyFile /path/to/certificate_key.key
  SSLCertificateChainFile /path/to/certificate_ca.crt

  # Proxy
  SSLProxyEngine on
  SSLProxyVerify none
  SSLProxyCheckPeerCN off
  SSLProxyCheckPeerName off
  SSLProxyCheckPeerExpire off

  ProxyPass / https://127.0.0.1:14500/
  ProxyPassReverse / https://127.0.0.1:14500/
</VirtualHost>

이제 Apache 서버를 아래 명령어로 재실행한다.

sudo service apache2 restart

Note 2: IP를 제한하고 싶다면…

접속 IP를 제한하고 싶다면, Apache 설정파일 gitlab.conf에 아래 항목을 추가 입력한다.

<Proxy *>
  Order Deny,Allow
  Deny from all
  Allow from your_ip_address
<Proxy>

결론

이 글은 Apache 서버에 reverse proxy를 사용하여 GitLab의 번들 서버인 Nginx를 Apache를 통해 접속하도록 설정하는 방법을 설명하였습니다. 위 방법은 많은 방법들 중 하나이고, 더 좋은 방법이 있다면 댓글로 말씀 부탁드립니다.

References

[1] forum.gitlab.com, “[SOLVED] Setting up Gitlab on Ubuntu 14.04 with Apache2 without owning a domain name,” GitLab Forum, 27-Apr-2015. [Online]. Available: https://forum.gitlab.com/t/solved-setting-up-gitlab-on-ubuntu-14-04-with-apache2-without-owning-a-domain-name/679/2
[2] superuser.com, “js, and css not appearing after installing gitlab,” Superuser, 19-Nov-2015. [Online]. Available: http://superuser.com/questions/1002827/js-and-css-not-appearing-after-installing-gitlab
[3] Goedecke, “Setup GitLab on Debian 7 with existing Apache WebServer,” GitLab Forum, 17-Sep-2015. [Online]. Available: https://kevingoedecke.me/2015/09/17/setup-gitlab-on-debian-7-with-existing-apache-webserver/
[4] stackoverflow.com, “Gitlab in a subdirectory with apache and passenger,” kevingoedecke.me, 29-Jul-2013. [Online]. Available: http://stackoverflow.com/questions/17924644/gitlab-in-a-subdirectory-with-apache-and-passenger
[5] Tully, “Running GitLab from a subdirectory on Apache,” shanetully.com, 23-Aug-2012. [Online]. Available: https://shanetully.com/2012/08/running-gitlab-from-a-subdirectory-on-apache/
[6] redmine.org, “Redmine in a subdirectory,” redmine.org, 03-Sep-2008. [Online]. Available: http://www.redmine.org/boards/2/topics/2244

집에 가는 길에 만난 오리온자리

집에 가는 길에 하늘을 보니 오리온 자리가 눈에 들어오더군요..ㅎㅎ

오리온자리는 늦가을에 나타나기 시작해서 겨울을 지나 초봄까지 볼 수 있는 별자리로, 가운데에 연속적으로 위치한 3개의 별이 있어 비교적 눈에 잘 띄고, 잘 알려진 별자리이기도 합니다.

매년 이 별자리를 보게되면, 벌써 1년이 흘렀구나.. 라는 생각과 함께,, 시간이 참 빠르다는걸 느끼게 됩니다.

이번 한 해도 좋은일이 가득하기를 바라겠습니다.

아래는 사진을 찍었던 시간의 별 지도를 찾아보았습니다. 사진 위쪽이 약간 밝게 나왔는데, 별 지도에서 보시다시피 바로 위에 달이 있었습니다.

워드프레스 모바일 로그인 오류 해결방법

워드프레스 모바일 로그인시에 간혹 아래와 같은 오류를 표출하며 로그인이 불가능할 때가 있다.

워드프레스 (wordpress.com)의 블로그는 서버 설정이 되어있기에 문제가 없는데, 개인서버 (self-hosted website)는 서버 설정에 따라 위의 오류가 발생하는 경우가 종종 있다. 원인이 다양한데, 본 글에서는 PHP 버전에 따른 xml과 xmlrpc 모듈이 설치되지 않아 발생하는 원인에 대한 해결책을 소개한다.

원인 파악

아래는 WordPress for Android에서 출력한 application log 중 일부이다.

01 - WordPress.onCreate
02 - App comes from background
03 - ConnectionChangeReceiver.setEnabled true
04 - Connection status changed, isConnected=true
...
13 - No documented SNI support on Android <4.2, trying with reflection
14 - Established TLSv1.2 connection with www.cheonghyun.com using TLS_RSA_WITH_AES_128_CBC_SHA
15 - No HTTP error document document from the server
16 - system.listMethods failed on: https://www.cheonghyun.com/xmlrpc.php - exception: HTTP status code: 500 was returned. Internal Server Error
17 - StackTrace: org.xmlrpc.android.XMLRPCException: HTTP status code: 500 was returned. Internal Server Error
	at org.xmlrpc.android.XMLRPCClient$Caller.callXMLRPC(XMLRPCClient.java:547)
	at org.xmlrpc.android.XMLRPCClient$Caller.access$000(XMLRPCClient.java:430)
	at org.xmlrpc.android.XMLRPCClient.call(XMLRPCClient.java:231)
	at org.xmlrpc.android.XMLRPCClient.call(XMLRPCClient.java:226)
	at org.xmlrpc.android.XMLRPCUtils.doSystemListMethodsXMLRPC(XMLRPCUtils.java:96)
	at org.xmlrpc.android.XMLRPCUtils.checkXMLRPCEndpointValidity(XMLRPCUtils.java:203)
	at org.xmlrpc.android.XMLRPCUtils.verifyXmlrpcUrl(XMLRPCUtils.java:291)
	at org.xmlrpc.android.XMLRPCUtils.verifyOrDiscoverXmlRpcUrl(XMLRPCUtils.java:250)
	at org.wordpress.android.ui.accounts.helpers.FetchBlogListWPOrg$FetchBlogListTask.doInBackground(FetchBlogListWPOrg.java:55)
	at org.wordpress.android.ui.accounts.helpers.FetchBlogListWPOrg$FetchBlogListTask.doInBackground(FetchBlogListWPOrg.java:35)
	at android.os.AsyncTask$2.call(AsyncTask.java:287)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
	at java.lang.Thread.run(Thread.java:856)
...
26 - The XML-RPC endpoint was not found by using our 'smart' cleaning approach. Time to start the Endpoint discovery process
27 - The app will call the RSD discovery process on the following URLs: [https://www.cheonghyun.com]
28 - Downloading the HTML content at the following URL: https://www.cheonghyun.com
29 - RSD endpoint found at the following address: https://www.cheonghyun.com/xmlrpc.php?rsd
30 - Downloading the RSD document...
31 - Extracting the XML-RPC Endpoint address from the RSD document
32 - Found the XML-RPC endpoint in the HTML document!!!
33 - Trying system.listMethods on the following URL: https://www.cheonghyun.com/xmlrpc.php
34 - No documented SNI support on Android <4.2, trying with reflection
35 - Established TLSv1.2 connection with www.cheonghyun.com using TLS_RSA_WITH_AES_128_CBC_SHA
36 - No HTTP error document document from the server
37 - system.listMethods failed on: https://www.cheonghyun.com/xmlrpc.php - exception: HTTP status code: 500 was returned. Internal Server Error
38 - StackTrace: org.xmlrpc.android.XMLRPCException: HTTP status code: 500 was returned. Internal Server Error
	at org.xmlrpc.android.XMLRPCClient$Caller.callXMLRPC(XMLRPCClient.java:547)
	at org.xmlrpc.android.XMLRPCClient$Caller.access$000(XMLRPCClient.java:430)
	at org.xmlrpc.android.XMLRPCClient.call(XMLRPCClient.java:231)
	at org.xmlrpc.android.XMLRPCClient.call(XMLRPCClient.java:226)
	at org.xmlrpc.android.XMLRPCUtils.doSystemListMethodsXMLRPC(XMLRPCUtils.java:96)
	at org.xmlrpc.android.XMLRPCUtils.checkXMLRPCEndpointValidity(XMLRPCUtils.java:203)
	at org.xmlrpc.android.XMLRPCUtils.discoverSelfHostedXmlrpcUrl(XMLRPCUtils.java:393)
	at org.xmlrpc.android.XMLRPCUtils.verifyOrDiscoverXmlRpcUrl(XMLRPCUtils.java:257)
	at org.wordpress.android.ui.accounts.helpers.FetchBlogListWPOrg$FetchBlogListTask.doInBackground(FetchBlogListWPOrg.java:55)
	at org.wordpress.android.ui.accounts.helpers.FetchBlogListWPOrg$FetchBlogListTask.doInBackground(FetchBlogListWPOrg.java:35)
	at android.os.AsyncTask$2.call(AsyncTask.java:287)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
	at java.lang.Thread.run(Thread.java:856)
...

위 로그의 16번째줄, 26번째 줄을 확인해 보면, xmlrpc쪽에서 오류가 발생하는 것을 알 수 있다. 더 자세히 원인을 파악하기 위해, Apache Engine에서 출력한 error.log를 확인해 보았다. error.log는 우분투 기준 /var/log/apache2/error.log에서 확인할 수 있다.

[Sun Oct 16 23:29:00.403764 2016] [:error] [pid 2200] [client CLIENT_IP:PORT] PHP Fatal error:  Call to undefined function xml_parser_create() in /var/www/html_main/wp-includes/class-IXR.php on line 264
[Sun Oct 16 23:29:00.403882 2016] [:error] [pid 2200] [client CLIENT_IP:PORT] PHP Stack trace:
[Sun Oct 16 23:29:00.403896 2016] [:error] [pid 2200] [client CLIENT_IP:PORT] PHP   1. {main}() /var/www/html_main/xmlrpc.php:0
[Sun Oct 16 23:29:00.403913 2016] [:error] [pid 2200] [client CLIENT_IP:PORT] PHP   2. wp_xmlrpc_server->serve_request() /var/www/xmlrpc.php:84
[Sun Oct 16 23:29:00.403922 2016] [:error] [pid 2200] [client CLIENT_IP:PORT] PHP   3. IXR_Server->IXR_Server() /var/www/wp-includes/class-wp-xmlrpc-server.php:197
[Sun Oct 16 23:29:00.403930 2016] [:error] [pid 2200] [client CLIENT_IP:PORT] PHP   4. IXR_Server->__construct() /var/www/wp-includes/class-IXR.php:440
[Sun Oct 16 23:29:00.403938 2016] [:error] [pid 2200] [client CLIENT_IP:PORT] PHP   5. IXR_Server->serve() /var/www/wp-includes/class-IXR.php:432
[Sun Oct 16 23:29:00.403945 2016] [:error] [pid 2200] [client CLIENT_IP:PORT] PHP   6. IXR_Message->parse() /var/www/wp-includes/class-IXR.php:464

error.log 파일의 stack trace 를 보면, xmlrpc.php 에서 내부적으로 호출하는 함수에서 오류가 발생하는 것을 알 수 있다.

해결책

버전에 맞는 xml, xmlpc 모듈 설치

결론부터 말하자면, 필자는 버전에 맞는 php의 xml과 xmlrpc 모듈을 설치하여 해결하였다. 명령어는 아래와 같다.

sudo apt-get install php5.6-xml
sudo apt-get install php5.6-xmlrpc
sudo service apache2 restart

위 해결책은 현재 서버에서 사용하고 있는 php 버전과 .htaccess 설정에 따라 다르다. 이를 확인하기 위해서는, 현재 워드프레스가 설치되어 있는 디렉토리에 아래와 같은 코드를 적은 파일을 php 파일로 저장한 후 웹 서버에서 실행하면 된다.

<?php echo phpversion(); ?>

php 버전에 5.6이라면, 앞서 언급한 명령어를 사용하서 해결해 보길 바란다. (php -v 명령어를 통해서도 php 버전을 확인할 수 있으나, .htaccess 설정에 따라 실제 사용하는 엔진의 버전이 다를 수 있기에, php 파일을 간단하게 생성하여 확인하는 방법이 더 정확할 수 있다.)

xml, xmlrpc 재설치

이 항목부터는 다른 유저들이 해결책으로 제시한 것들을 정리하였다. 한 유저는 xml과 xmlrpc를 재설치하여 해결하였다고 한다 [1, 2]. 현재 php에서 사용중인 모듈을 php -m 명령어를 통해 확인한다.

[PHP Modules]
calendar
Core
ctype
date
...
tokenizer
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
zlib

xml과 xmlrpc 엔진이 목록에 없다면 설치되지 않은 것이니 아래 명령어로 설치한다.

sudo apt-get install php-xml
sudo apt-get install php-xmlrpc

혹시 이미 설치가 되어있는데도 문제가 발생하는 것이라면, 앞서 언급하였듯이 버전에 맞는 모듈을 설치하거나, 아래와 같이 삭제 후 재설치를 권장한다.

sudo apt-get purge php-xml
sudo apt-get purge php-xmlrpc

.htaccess 권한 및 엔진 버전 확인

간혹 .htaccess 에서 xmlrpc.php 파일에 직접 권한을 줘야 하는 경우가 있다 [3]. 본 글하고는 거리가 조금 있는 해결책인데, 해당 원인의 경우는 애초에 403 Forbidden 오류가 발생하였을 것이고, 오류 로그 자체도 다르게 출력되었을 것이다. .htaccess 파일에 아래와 같이 수정해 본다.

<Files xmlrpc.php>
    Order allow,deny
    Allow from all
</Files>

간혹 버전 문제인 경우도 있는데, 해당 폴더에 사용하는 php 버전 수정은 아래 명령어를 .htaccess 에 삽입하면 된다. (php 5.6 기준)

# Use PHP5.6 as default
AddHandler application/x-httpd-php56 .php

References

[1] Alexander, "Fixing Errors «Jetpack: site_inaccessible,» zakharovlx.com, 08-Apr-2016. [Online]. Available: https://zakharovlx.com/category/dev/wordpress/.
[2] http://tecfused.com/, "PHP Fatal error: Uncaught Error: Call to undefined function xml_parser_create()," tecfused.com, 08-Sep-2016. [Online]. Available: http://www.tecfused.com/2016/09/php-fatal-error-uncaught-error-call-undefined-function-xml_parser_create/.
[3] JigmeDatse, "[Resolved] The Jetpack server was unable to communicate with your site [HTTP 500]," WordPress.org, 22-Sep-2016. [Online]. Available: https://wordpress.org/support/topic/the-jetpack-server-was-unable-to-communicate-with-your-site-http-500/.

파이썬 기초 01: 입문

1장에서는 파이썬의 기본적인 특징과 파이썬을 배우는데 필요한 기본적은 내용들을 간단히 다룬다.

학습목표

  • 파이썬의 특징을 알아본다.
  • 파이썬의 기능 및 용도에 대해 알아본다.

파이썬이란?

파이썬은 네덜란드 출신의 개발자인 귀도 반 로섬(Guido van Rossum)에 의해 1989년에 개발을 시작하여, 1991년 2월에 출시한(v0.9.0) 프로그래밍 언어이다 [1].

파이썬의 특징

고수준 언어이다.

파이썬은 자연어에 가까워 인간이 이해하기 쉬운 고수준 언어이다. 저수준 언어는 기계어에 가까워 이해가 쉽지 않고 기계적인 처리와 관련한 개발에 많은 시간 투자를 해야 하는데 반해, 고수준 언어인 파이썬은 다른 부분에 많은 에너지를 들이지 않고 문제를 해결하는 것에 집중할 수 있다.

배우기 쉽다.

누구나 쉽게 프로그램을 작성할 수 있도록 만들어져 있어 프로그램 개발 경험이 없는 초보자들도 비교적 어렵지 않게 익힐 수 있는 스크립트 언어이다.

생산성이 높다.

개발에 필요한 다양한 라이브러리가 존재하고, 원하는 프로그램을 단시간에 빠르게 개발할 수 있다.

재미있다.

귀도는 파이썬을 개발한 목적 중 하나로 사용하기 재밌는 언어를 만들이 위함이라고 하였고, 파이썬이라는 이름도 이러한 배경으로 몬티 파이썬의 날아다니는 서커스(Monty Python’s Flying Circus) 에서 따왔다고 한다 [2].

파이썬의 용도

위의 특징 및 장점을 배경으로 하여, 파이썬은 웹 개발, 과학 및 수학적 목적, 교육 등 다양한 분야에서 널리 쓰이고 있다 [3]. 쓰이는 용도에 대한 예시를 간단하게 나열해 보았다.

프로토타이핑 및 간단한 도구 제작

개인이 간단하게 몇 줄짜리 스크립트를 만들어 사용하기 편리하다. 예를 들어, 웹 주소로부터 html 소스를 받아오는 간단한 툴을 제작한다고 한다면, 다른 언어들은 웹 클라이언트를 직접 제작하거나, 해당 OS에서 제공하는 라이브러리로 직접 구현해야 한다. 이에 반해, 파이썬은 내장되어 있는 라이브러리를 사용하거나 3자에서 개발한 다양한 패키지(라이브러리)를 사용하여 간단한 코드 몇줄을 작성하여 제작할 수 있다. 이러한 편리함은 프로토타입 제작에도 많은 장점으로 작용한다.

웹 개발

파이썬에 내장되어있는 표준 라이브러리는 웹 프레임워크, HTML, JSON 등 다양한 마크업 언어와 HTTP, FTP, IMAP 등 다양한 인터넷 프로토콜을 편리하게 사용할 수 있도록 하여 다양한 웹 개발에 편리하도록 하였다.

공학 및 과학 계산

SciPy는 수학, 과학 및 공학 계산에 필요한 기능들을 모아놓은 패키지이다. 이러한 패키지의 제공으로 복잡한 계산에 용이하도록 하였다.

GUI 개발

파이썬의 표준 패키지로 포함되어 있는 Tk를 활용하여 GUI 개발은 손쉽게 할 수 있다.

다른 언어로의 확장

파이썬은 플랫폼에 구애받지 않고, 확장성이 용이하다. 쉽고 간단한 문법의 장점으로, C언어로의 확장을 위한 Cython, .NET을 기반으로 한 IronPython 등 표준 Python 이외에도 다양한 버전의 인터프리터가 존재하여, 필요한 상황에 맞게 사용할 수 있다.

References

[1] Python Foundation, "Python source distribution."
[2] Python Software Foundation, "General Python FAQ – Why is it called Python?," Python 2.7.12 Documentation, 2016. [Online]. Available: https://docs.python.org/2/faq/general.html#why-is-it-called-python.
[3] Python Software Foundation, "Applications for Python," Python.org, 2016. [Online]. Available: https://www.python.org/about/apps/.

윈도우 업데이트가 현저하게 오래걸리는 문제에 대한 해결책

윈도우 재설치를 해보았다면, 윈도우 업데이트 확인중이라는 문구에서 현저하게 오래걸리는 걸리는 현상을 자주 접할 수 있다. 감사하게도 이를 해결해 주는 hotfix가 있으며, 아래 링크에서 받을 수 있다.

한글:
https://support.microsoft.com/ko-kr/kb/3102810

영문:
https://support.microsoft.com/en-us/kb/3102810

위 기술문서에 의하면, 이는 svchost가 CPU 점유율을 100% 차지하는 문제 (멀티코어의 경우 쓰레드가 사용중인 코어에 대한 100%)도 해결해 준다고 언급되어 있다.

참고

http://superuser.com/questions/951960/windows-7-sp1-windows-update-stuck-checking-for-updates

Bluesoleil 설치 후 발생하는 문제점 정리

컴퓨터(Windows PC) 에서 블루투스 이어폰을 사용할 때 Bluesoleil (블루소레일) 만큼 편리한 소프트웨어를 찾기 어렵다. 여러 장점이 있지만, 윈도우 7에서 설치할 시에 다양한 문제점을 발생시키는데, 해결책을 아래와 같이 정리하였다.

1. 네트워크 연결 아이콘 표시 문제

인터넷은 제대로 작동하는데, 위와 같이 네트워크가 연결되지 않았다고 나타나는 경우가 있다. Bluesoleil이 설치 도중 기존에 설치된 다른 네트워크 드라이버에 영향을 주는 것 같다. Bluesoleil을 설치한 후, 블루투스 네트워크 연결을 제외한 모든 네트워크 드라이버를 완전히 삭제한 후 다시 설치하여 문제를 해결할 수 있다.

2. 부팅 딜레이 현상

Windows 7 x64에서 발생한 문제이다. Bluesoleil을 설치한 후 눈에 띄게 부팅 속도가 늦어졌다면 (특히 윈도우 로그온 화면이 뜨기까지 시간이 현저하게 느려진 경우), Bluesoleil 설치 폴더에서 setup.ini 파일을 수정 후 재설치를 시도해 볼 수 있다.

setup.ini에서 IsSupportBLEFunction의 설정값을 0로 변경 후 재설치 한다.

제작사의 기술문서에 의하면, ISSupportBLEFunction의 BLE는 Bluetooth Low Energy device를 의미하는 것이라고 하며, 포도당, 혈압, 심박수 등을 측정하는 장치에 대한 지원 여부를 설정하는 것이라고 한다. 일반적인 사용자들은 이 기능을 사용하지 않으니, 해제하고 설치하면 되겠다.

참고

http://www.bluesoleil.com/life/208.html

[Software] 다음 꼬마사전 중국어, 일본어 툴팁해석 설정법

다음 꼬마사전 DB파일 사용법입니다.

꼬마사전 설치파일 및 DB파일 다운로드는 아래 URL에서 하시면 됩니다.

https://www.cheonghyun.com/ko/daum-minidic-download-installation-db-file/

다운로드 받은 DicDB.rar 파일을 압축 해제하신 후에, 아래 그림과 같이 Daum 꼬마사전이 설치된 폴더에 db3 파일을 복사, 붙여넣기 합니다. 중국어 사전은 dicCnKo.db3 를, 일본어는 dicJpKo.db3 만을 복사하시면 됩니다.

복사 후 다음 꼬마사전을 재실행 하시면, 아래와 같이 일본어 및 중국어 단어 해석 설정이 가능해집니다.

[Network] netsh 를 이용하여 포트포워딩하기

netsh interface portproxy 명령어로 다른 컴퓨터의 포트를 로컬 컴퓨터의 포트로부터 접속할 수 있게 할 수 있다. 제목에 포트포워딩이라고 했지만, 더 정확한 명칭은 포트프록시 이다. 이 방법은 한 컴퓨터만 외부에서 접속할 수 있는 상황에서, 해당 컴퓨터에서만 접속할 수 있는 컴퓨터의 서비스를 접속 가능한 컴퓨터로 포워딩하기 할 때 유용하다.

netsh interface portproxy add v4tov4 listenport=[로컬 포트] connectport=[연결할 포트] connectaddress=[연결할 주소]

netsh interface portproxy 명령어:

The following commands are available:

Commands in this context:
?              – Displays a list of commands.
add            – Adds a configuration entry to a table.
delete         – Deletes a configuration entry from a table.
dump           – Displays a configuration script.
help           – Displays a list of commands.
reset          – Resets portproxy configuration state.
set            – Sets configuration information.
show           – Displays information.

To view help for a command, type the command, followed by a space, and then
 type ?.

netsh interface portproxy add v4tov4 명령어:

One or more essential parameters were not entered.
Verify the required parameters, and reenter them.
The syntax supplied for this command is not valid. Check help for the correct syntax.

Usage: add v4tov4 [listenport=]<integer>|<servicename>
             [connectaddress=]<IPv4 address>|<hostname>
            [[connectport=]<integer>|<servicename>]
            [[listenaddress=]<IPv4 address>|<hostname>]
            [[protocol=]tcp]

Parameters:

       Tag              Value
       listenport     – IPv4 port on which to listen.
       connectaddress – IPv4 address to which to connect.
       connectport    – IPv4 port to which to connect.
       listenaddress  – IPv4 address on which to listen.
       protocol       – Protocol to use.  Currently only TCP is supported.

Remarks: Adds an entry to listen on for IPv4 and proxy connect to via IPv4.

예시) 192.168.1.150의 웹서버(80번 포트)를 192.168.1.100의 8080번으로 접속할 수 있게 설정

netsh interface portproxy add v4tov4 listenport=8080 connectport=80 connectaddress=192.168.1.150

위와 같이 설정하여 http://192.168.1.100:8080 주소로 http://192.168.1.150을 접속할 수 있다. 또한, netsh interface portproxy show v4tov4로 설정이 잘 되었는지 아래와 같이 확인할 수 있다.

설정은 재부팅 후에도 적용되며, 설정을 삭제할 때는 아래의 명령어를 입력하여 삭제할 수 있다.

netsh interface portproxy delete v4tov4 listenport=8080

[Utility] DirectDraw Compatibility Tool – 고전 게임 색상 문제 해결

스타크래프트와 같은 고전 게임을 Windows 7 이후 버전에서 작동하게 되면, 색깔이 깨지는 문제를 경험하게 된다. 이는 운영체제가 버전업 되면서 호환성에 문제가 발생하는 것인데, DirectDraw Compatibility Tool을 사용하여 색상 문제를 해결할 수 있다.

해결법은 간단하다. DirectDraw_Compatibility_Tool.exe 를 실행한 후, … 를 클릭, 게임 실행 파일을 선택한 후 “Apply”를 클릭하면 된다.

스타크래프트의 경우, 위의 방법은 DirectDraw 호환성 문제 해결을 위해 레지스트리를 추가하는 것이고, 다른 해결책으로는 프로세스 목록에서 explorer.exe 를 강제 종료하면 색상 문제를 일시적으로 해결 할 수 있는 것으로 알려져 있다.

또 다른 방법으로는, Windows 7 호환성 문제가 해결된 ddraw.dll 파일로 교체하는 방법이 있는데, 이는 시스템 dll 파일을 교체하는 것이므로 위험 부담이 있긴 하다. (교체하지 않고 해당 게임만 수정된 dll을 사용하게 하는 방법이 있을 듯 한데, 시간나면 한번 해보고 다시 포스트 하겠습니다.)

※ ddraw.dll 교체하는 방법은 제가 직접 해본 방법이 아니라, 위험 부담이 있을 수 있고, 어떻게 자세히 말씀 드리기는 어렵습니다. 시스템 파일 ddraw.dll의 위치는 C:\Windows\System32 입니다.

DirectDraw Compatibility Tool 다운로드
DirectDraw_Compatibility_Tool_1.01.rar

수정된 ddraw.dll 다운로드
ddhack10.rar