와우 불매 운동

와우저라면 다들 알듯이, 와우 불매 운동이 진행중이다. 와우 불매 운동 카페가 이 운동의 중심지이고, 많은 사람들이 모여서 자칫 감정적으로 치닫기 쉬운 상황을 그래도 제어하려고 노력하고 있는 것 같다. 그나마, 와우를 플레이하는 나이대가 대부분 성인이라서 이러한 운동이 가능한 것이라 보인다.

유명한 와우 커뮤너티에 가보면 편가르기를 하는 감정적인 글이 꽤 많은 편이다. 불매 운동에 참여안하고, 플레이 하는 게이머나, 아니면 불매 운동에 회의적인 의견을 가진 사람들을 공격하는 사람들도 많다. 물론 이들의 말처럼 이러한 운동의 성패는 소비자들이 얼마나 단합하는 가에 달려있다. 그럼에도 불구하고, 이러한 운동이 나쁜 평판을 얻기 시작하면 그것도 운동의 실패로 직결되는 것이 사실이다.

사실, 개인적으로는 와우의 게임성을 생각하면, 가격 책정 자체가 이상한 정도는 아니라고 생각한다. 국가별로 다른 점도 패키지 여부에 따른 가격 책정 방식과 우리나라의 시장과 다른 나라의 시장은 다르기 때문이라고 생각해볼 수 있을 것 같다. (패키지 가격을 월 이용료에 분산했기 때문에 비싸진 것이기 때문이다. MMORPG의 평균 이용월 수가 3개월이라고 생각하면, 거의 계산은 맞아떨어진다.) 초기에 가격 문제가 크게 부각된 것은 (블리자드 코리아가 PC방에 책정한 가격 때문에) PC 방 업주들의 조직적인 반발때문이고, 사실 일반 와우저의 이해와는 거리가 멀다.

하지만, 진짜 문제는 서비스 유료화 시 저질렀던, 라이센스 문제니, 결제 서버 다운이니 같은 세세한 실수들이 아니다. 블리자드 코리아의 고객에 대한 대응이 매우 불합리하고 거만하기 때문이다. 어떤 게임이라도 서비스 오픈하거나 제품을 출시한 후에 문제가 발생한 경우가 발생하지 않으리라는 법은 없다. 이에 대한 고객들의 반응은 회사측이 얼마나 성의있게 대응하느냐에 달려있다고 볼 수 있다. 와우같이 집중적인 관심을 받은 게임은 당연히 그에 비례해서 불만을 품은 사용자(흔히 말해 ‘안티’)가 생기게 마련이고, 그만큼 더 성의있게 대응해야할 것이 마땅하다. 하지만, 블리자드 코리아는 매우 느리게 대응했고, 고객들이 성의없게 느끼게 만들었고, 문제가 발견된 뒤에서 그 문제를 해결하는 것에 대한 노력을 고객들에게 거의 어필하지 못하고 있는 것 같다.

와우 불매운동에도 불구하고 와우 동접자가 10만명이라고 하지만, 와우 불매 운동 카페 가입자도 현재 16776명이다. 블리자드 코리아가 이러한 상황에도 아무것도 못 느끼고 강행한다면, 물론 소비자들은 더이상 할 수 있는 것이 없다. 그들이 아무런 대가 없이 성공한다면, 블리자드의 성공 신화로 기억될 뿐이고, 소비자들은 모든 것을 잊어버릴 것이다. 반대로, 소비자들이 자신이 원하는 것을 얻어낸다면, 블리자드는 물론 여러 게임사들에게 경고의 역할을 할테고, 게이머들사이에도 이러한 문화가 정착할 것이다.

와우 불매 운동은 전형적인 소비자 권리 운동이다. 게이머들 가운데에서도 이러한 운동이 일어난 것은 매우 긍정적으로 보인다. 그 시작은 상당히 선동적이라고까지 생각하고 있었지만, 와우 불매 운동 카페에서 정확히 자신들이 요구하는 사항을 밝히고 있고, 비폭력적이고 조직적인 항의를 벌이고 있어서 그 결과가 매우 기대된다.

와우 불매 운동 더 읽기"

'Ruby on Rails' on Slashdot

‘Ruby on Rails’를 소개하는 기사가 Slashdot에 실렸다. 이 기사에서는 ONLamp의 Ruby on Rails walkthrough를 언급하고 있기도 하다.

이 walkthrough의 comment를 보다가 Maypole을 발견했다. Maypole은 Perl 기반의 Web app framework이다. 역시 Struts로부터 영향을 받은 것 같고, 따라서, MVC 모델을 채용하고 있으며, Rails 처럼 자동적인 OR mapping 기능을 제공하고 있다. Rails가 처음으로 사용한 방식은 아닌 모양이다.
http://www.perl.com/pub/a/2004/04/15/maypole.html
http://www-106.ibm.com/developerworks/linux/library/l-maypole/?ca=dgr-perlw02BuildMypole

그리고, 직접적으로 Rails로부터 영향을 받은 Trails란 Java project도 있다. Trails에서 Rails와 함께 언급하고 있는 Naked objects는 옛날에 Smalltalk 쪽에서 시도했던, GUI를 사용한 OOP framework인 것 같으나, 좀 더 살펴봐야할 듯하다.

'Ruby on Rails' on Slashdot 더 읽기"

"can't find header files for ruby" error when require 'mkmf' in a ruby program

www.lastmind.net 은 amd64 machine이고, gentoo linux를 사용하고 있는데, gentoo 사용자가 적다보니, x86 계열은 그럭저럭 지원되지만 x86_64(=amd64) 쪽은 잘 지원되지 않는 경우가 많다.

eruby portage(gentoo에서의 package)도 x86_64에서는 지원이 안되어서 직접 source를 받아서 설치해야했다. configure.rb 부터 ‘can’t find header files for ruby’ 에러가 발생했다. 다음과 같은 간단한 errata가 원인.

Found an errata in /usr/lib/ruby/1.8/x86_64-linux/rbconfig.rb.
--- rbconfig.rb.old     2005-01-13 13:29:43.581254776 +0900
+++ rbconfig.rb 2005-01-13 13:29:47.055726576 +0900
@@ -29,7 +29,7 @@
CONFIG["sysconfdir"] = "$(DESTDIR)/etc"
CONFIG["sharedstatedir"] = "$(prefix)/com"
CONFIG["localstatedir"] = "$(DESTDIR)/var/lib"
-  CONFIG["libdir"] = "$(DESTDIR)//usr/lib"
+  CONFIG["libdir"] = "$(DESTDIR)/usr/lib"
CONFIG["includedir"] = "$(prefix)/include"
CONFIG["oldincludedir"] = "/usr/include"
CONFIG["infodir"] = "$(DESTDIR)/usr/share/info"

http://bugs.gentoo.org/show_bug.cgi?id=76359

 

"can't find header files for ruby" error when require 'mkmf' in a ruby program 더 읽기"

Ruby on Rails

Rails는 Ruby 기반의 Web App Framework이다.

특징을 꼽아본다면,

  • Model-View-Controller 패턴을 채택하고 있다.
  • 단순하고 강력한 OR mapping을 제공한다.
  • CRUD logic을 자동으로 생성해준다.

아직 Rails의 ‘The Seeing Is Believing Lesson’을 보지못했다면, 지금 바로 보길 바란다. Web App Framework를 어느 정도 경험해본 사람이더라도, 엄청나게 빠른 prototyping에 놀랄 것이다. 설치부터, 간단한 blog의 prototype 구현까지 10분이면 된다니, 놀랍지 않은가.

불과 수시간 정도 경험해보고나서 판단을 내리기에는 무리일지 모르겠지만, Rails의 빠른 prototyping은 Model, View, Controller의 mapping이 name-based로 이루어지는 점과, OR mapping (DB table과 Model class의 mapping) 역시 name-based로 이루어진다는 점, 그리고 CRUD를 자동으로 생성해주는 점에 기인한다고 생각된다. 다른 Web App Framework를 약간이라도 들여다본 사람이라면 알아차리겠지만, 그러한 framework에서는 확장성을 위한 추가적인 노력이 필요하기 때문에, Rails에서 얻을 수 있는 빠른 prototyping 능력을 희생하고 있다고 볼 수 있다.

다만, OR mapping을 할 때, DB table을 만든 후, Model class가 table에 따라 생성되므로, 설계가 data-oriented 화할 가능성이 커지지 않을까 하는 우려가 있다. 이 부분에 대해서는, 아직 Rails를 충분히 경험하지 못했으므로, 더이상의 언급은 나중으로 미루는 것이 좋을 듯 하다.

다음은 ‘A Guide to Testing the Rails’를 보면서 작성한 Rails application이다.

http://www.lastmind.net/rails/todo/list

Tutorial을 따라가는 동안 내내 즐거웠고, 거의 막힘없이 진행하기는 했으나, 아쉽게도 host의 root로 Rails 설치 위치를 alias하지 않은 경우에(나는 http://www.lastmind.net/이나 http://rails.lastmind.net/이 아니라, http://www.lastmind.net/rails 아래에 Rails app을 설치했다.), mod_rewrite를 이용하는 RewriteRule이 문제가 생겨서, 약간의 손질이 필요했다. 다음이 그 내용이다.

# Make sure that mod_ruby.c has been added and loaded as a module with Apache
RewriteEngine On
# Change extension from .cgi to .fcgi to switch to FCGI and to .rb to switch to mod_ruby
RewriteBase /rails/dispatch.cgi
# Enable this rewrite rule to point to the controller/action that should serve root.
# RewriteRule ^$ /controller/action [R]
# Add missing slash
RewriteRule ^([-_a-zA-Z0-9]+)$                                            $1/
# Default rewriting rules.
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/([0-9]+)$                  ?controller=$1&action=$2&id=$3 [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)$                           ?controller=$1&action=$2 [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/$                                           ?controller=$1&action=index [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/([0-9]+)$ ?module=$1&controller=$2&action=$3&id=$4 [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)$          ?module=$1&controller=$2&action=$3 [QSA,L]
RewriteRule ^([-_a-zA-Z0-9]+)/([-_a-zA-Z0-9]+)/$                          ?module=$1&controller=$2&action=index [QSA,L]

최근에 Ruby를 사용한 Web app를 이것저것 만들고 있었는데, OR mapping에 시간을 불필요하게 많이 소비하고 있었고, view에 있어서 templating이 매우 필요했는데, 이러한 점들 모두 Rails가 해결해줄 수 있을 것 같아서 기쁘다. 앞으로는 기존 ruby web app들(RSS reader, link gallery, ..)을 Rails로 porting 해 볼 생각이다.

Ruby on Rails 더 읽기"

PHP 5

지난 주말에 Zend Engine 2.0Changes in PHP 5/Zend Engine II를 읽었다. (Zend Engine은 PHP 프로그래밍 언어의 핵심 구현 부분이다. 나름대로 언어 중립적인 엔진이라고 할 수 있지만, 그다지-전혀?- 널리 쓰이지는 않았다.) PHP 5가 나온지가 오래인데, 왠 뒷북일까라고 생각하는 사람도 있을 듯하다.

PHP는 매우 널리 퍼져있는 프로그래밍 언어이지만, 또 반대로 여러 사람들이 미워하는(!) 프로그래밍 언어다. PHP를 많이 써보진 않았지만, 어느 정도는 써봤고, 내 나름대로의 PHP를 싫어하는 이유를 몇가지 가지고는 있지만, 사실 그것들이 결정적인 이유가 되기는 힘들다고 생각한다. 그리고, “PHP가 싫어, 미워”라고 외치는 주변의 사람들에게 물어보아도 설득력 있는 이유가 나오는 경우는 드물다. 아마도, Zend 사 자체의 PHP를 개선하려는 노력이 그러한 이유 중의 약간은 제시해줄 지도 모른다는 기대를 할 수 있지 않을까?

일단, 이 글에서는 Zend Engine 2.0에 나오는 항목들을 중심으로 얘기를 풀어나가보자.

Reference semantic on object variables

이 문서에서는 object model이 변화했다고 하지만, 좀 더 정확히 말하면, object를 가리키는 variable의 semantic이 변화했다고 볼 수 있다. PHP 4의 variable은 value semantic을 가지고 있다. 다시 말해 reference semantic이 아니다.

class SomeObject
{
    var $memberVar = 0;
};

$a = new SomeObject;
$b = $a;

$b->memberVar++;

print $a->memberVar;
print $b->memberVar;

위와 같은 코드의 결과는 “01”이다. variable $a는 new를 통해 새로 만들어진 object를 가리키지만, variable $b는 $a의 복사본이다. 서로 다른 object를 가리키는 것이다.

PHP 5에서는 object를 가리키는 variable은 reference semantic으로 동작한다. (이러한 방식을 ‘handle’이라는 이름으로 자주 부른다.) 따라서, 위 코드의 결과는 “11”이 된다.

object가 복사되는 것은 (심지어 function call과 같이 서로 다른 module boundary를 넘어다니더라도) 매우 특별한 것을 의미한다. 매우 단순한 비유를 들어보자. 철수가 영희에게 지우개를 빌려주었을 때, 지우개는 두개가 되는 것이 아니라, 역시 하나만 존재한다. 이처럼 object에 관련된 대부분의 idiom이나 pattern에서도 reference semantic이 훨씬 자연스럽다. (e.g. Factory pattern)

물론 PHP 4에서 reference가 존재한다.

$c = &$a;

프로그래머들에게 reference를 사용하는 규칙(discipline)을 정해서, 위의 문제를 해결할 수 있다. 하지만, PHP 처럼 “쉬운” 것을 지향하는 언어에서 프로그래머가 매순간마다 reference semantic을 써야할 지, value semantic을 써야할 지 고민해야한다는 것은 괴로운 일이다. 프로그래밍 언어는 “무엇을 할 수 있는가/없는가”의 척도로 평가되는 것이 아니라, “무언가를 쉽게 할 수 있는가”의 척도로 평가되는 것이다. 따라서, reference semantic을 기본적인 semantic으로 선택하는 것은 매우 합리적이라고 생각된다.

C++에 익숙한 사람들은 C++의 object를 가리키는 variable은 value semantic이 아니냐고 반문할 수 있겠지만, C++에서 object는 주로 pointer나 reference로 나타내어지는 것이 보통이고 이러한 방식이 자연스럽다. C++이 value semantic을 사용하는 것은 순전히 performance에 대한 고려라고 생각된다. (역설적이게도, C에 익숙한 사람들은 pointer를 사용하는 것이 performance에 대한 고려가 아닌가 의아해할 수도 있을 듯하다.)

잘 알다시피 Java에서는 object를 가리키는 variable은 reference semantic을, primitive type를 가리키는 variable은 value semantic을 선택함으로써, 일종의 trade-off를 선택한다. 이는 Java가 Pure object-oriented programming language가 아니라는 근거로 채택되기도 한다.

Python이나 Ruby 같은 언어는 모두 reference semantic을 채용한다.

Improved Object Dereferencing

아래와 같은 문법을 허용하기 시작했다. 사실상, parser가 그다지 똑똑하지 못했다고 볼 수 밖에 없다.

$object->method()->method()

Object Cloning

reference semantic으로 바뀌면서, 당연히 따라오는 변화이다. object를 copy하는 방법을 __clone() method를 통해서 프로그래머가 지정할 수 있다. 사용시에는 다음과 같은 문법을 가진다.

$copy_of_object = $object->__clone();

Constructor/Destructor

이해할 수 없는 PHP 4의 특징 가운데 하나가, constructor는 있으나, destructor는 없는 것이었다. (destructor와 같은 기능을 하도록 꽁수를 쓰는 방법이 있긴 했지만) destructor를 추가하면서 destructor는 __destruct(), constructor는 __construct()라는 이름의 method로 바뀌었다.

특기할만한 점은 parent class의 destructor가 implicit하게 호출되지 않기 때문에, parent::__destruct()로 직접 호출해주어야 한다는 점이다.

delete statement

object를 참조하고 있는 곳이 있어서 garbage collection이 안되는 object라고 하더라도, 강제로 지우기 위한 방법이다.

어떤 사람들은 garbage collection과 object의 강제 삭제는, 서로의 이익을 침해하기 때문에 상극이라고 주장하기도 한다. 간단히 얘기해서, C++에서 pointer과 delete를 사용하는 것은 object의 life time을 프로그래머에게 위임해서 성능을 올리겠다는 목적을 가지고 있고, 여타의 다른 언어들에서 garbage collection을 사용하는 것은 프로그래머가 object의 life time을 전혀 신경 안쓰겠다는 것이기 때문이다. 이 주제에 대해서는 논란의 여지가 있기 때문에, 더이상 언급을 하지 않겠다.

Multiple Inheritance

Zend Engine 2.0의 feature인데, PHP 5 상에서는 interface의 Multiple inheritance만을 지원하는 듯 하다. parent class의 같은 이름의 method가 충돌하는 경우에 대해서는 항상 override해야하는 (C++과 동일한) 규칙을 사용한다.

Abstract Classes and Methods

구현을 가지지 않는 method를 abstract method라고 하고, 이를 포함하는 class는 abstract class로 선언되어야 한다. abstract class는 instantiate할 수 없다.

기본적인 동작을 구현하고, 특정 동작의 구현을 하위 클래스에 위임하는 Framework 내의 클래스에서 유용할 것이다. C++에서라면 constructor를 protected로 만드는 경우가 여기에 해당할 것이다.

Interface

모든 method가 public이고, 구현을 가지지 않는다. 일반적인 interface 개념과 크게 다르지 않다.

Visibility

object 내부의 정보를 감출 수 (Information hiding) 없는 것은  PHP 4의 커다란 결함 중의 하나이다. public, protected, private 키워드가 추가되었고, Java와 유사한 문법을 사용한다. Visibility에 관한 manual page를 보면, class member와 class method라는 용어를 사용하는데, 일반적인 usage(class method == static method)를 생각하면 좀 짜증스럽다.

Static member variables

static method는 지원했으나, static member는 지원하지 않았던 문제를 해결함으로써, Singleton pattern을 구현할 수 있게되었다.

Exception

대부분의 modern programming language에서는 exception을 지원한다. exception은 크게, error handling을 중심 logic으로부터 제거하는 효과와 error handling을 적절한 장소에서 수행할 수 있는 효과를 가진다.

다른 언어들과 비슷하게 try/throw/catch keyword를 사용하지만, Java/Python의 finally나 Ruby의 ensure와 같은 syntax가 없는 점은 좀 아쉽다고 하겠다.

String offset syntax

PHP 4에서는 string offset syntax와 array offset syntax가 같기 때문에, null variable에 대해서, offset syntax를 사용하면, 애매모호한 문제가 발생해서, array로 변환되는 문제가 있다. PHP 5에서는 string offset syntax를 변경해서 이를 해결한다. PHP에서 자주 발견되는 애매모호한 문법들 중의 하나가 해결된 듯 하다.

Class Type Hints

PHP는 원래 weak typed programming language지만, class에 한정해서 type을 명시할 수 있다. 이는 strong typing의 이익 중의 하나인 Safety 보다는, type을 이용해 contract를 구현하는 abstraction의 역할에 가깝다고 생각된다. interface와 함께 유용하게 쓰일 수 있을 듯 하다. COM이나 다른 OO 언어들과의 interoperation에서도 유용하리라고 생각된다.

PHP 5 더 읽기"

The Hitchhiker's Guide to the Galaxy

“간단해요. 전 너무 지루하고 우울했어요. 그래서 이곳에 와서 외부 컴퓨터 플러그에 저를 연결했죠. 전 컴퓨터에게 오랜 시간 동안 우주에 대한 제 견해를 설명했어요.” 마빈이 대답했다.

“그래서 어떻게 됐는데?”

“컴퓨터가 자살해버렸어요.”

from The Hitchhiker’s Guide to ther Galaxy

The Hitchhiker's Guide to the Galaxy 더 읽기"

Smalltalk syntax

지금 읽고 있는 “Object Thinking”에서 자주 사용되는 예제가 Smalltalk이다보니, 가끔씩 Smalltalk code를 읽을 일이 생겨서, I Can Read C++ and Java But I Can’t Read Smalltalk란 article을 읽어보았다. 말그대로, C++/Java 와 같은 문법에 익숙한 프로그래머가 Smalltalk code 앞에서 적어도 문맹은 되지 않도록 해주는 글이다.

Smalltalk 언어는 Object-Oriented Programming Language의 시조라고 할 수 있는 Simula의 첫번째 아들격으로, 1979년에 태어나, 최근에 만들어진 여러 OOPL 들(Objective-C, Java, Ruby, …)의 아버지 역할을 하면서, 아직도 Pure OOPL의 강력한 정신적 지주로 군림하고 있다. 여기서는 언어의 철학적인 특질(OOP)이나 구현에 관련된 특성(garbage collection, …)은 피하고, 단지 다른 언어들(C++, Java, …)에 비해 문법적으로 특이한 점을 짚어보자.

No parentheses/Keywords

t->rotate (a, v); // C++
t rotateBy: a around: v // Smalltalk

Smalltalk에서는 receiver(object)와 message(method)간의 구분을 위해 따로 operator를 쓰지 않고 space를 사용한다. method 이름이나 parameter 이름과 argument들을 구분할 때도, 괄호를 사용하지 않고, space와 colon을 사용한다. 이 때, method 이름이나 parameter 이름은 keyword라고 부르고, keyword를 조합해서 method를 호출하기 때문에, parameter들의 순서를 신경쓸 필요도 없고, readability를 상당히 향상시킨다. (C++, Java code를 읽을 때 힘든 점이, argument가 무엇을 의미하는 지 모른다는 점이니까) 대신 프로그래머는 약간의 고생을 해야하긴 하지만, 오히려 프로그래머가 정확한 semantic을 이해할 수 있다는 점에서, “example code의 폐해”를 줄일 수 있는 면도 있다.

Getter/Setter method

// C++
long getAge () { return age; }
void setAge (long newAge) { age = newAge; }

// Smalltalk
age ^age
age: newAge age := newAge

요즘에는 Python이나 Ruby, C# 같은 유명한 언어들에서 모두 지원하는, 워낙 일반적인 문법이 되어서 따로 언급할 필요는 없겠지만, Smalltalk 에 이미 있던 문법이라는 점은 특기할만하다. Smalltalk 이전에도 있던 문법일까? 그리고 Smalltalk에서도 default getter/setter를 지원하는지도 궁금하다.

Block

a = f (x) { return x + 1; } // C-Like syntax
a := [:x | x + 1] // Smalltalk

Smalltalk에서는 Block을 통해서 Higher Order Function을 지원한다. 때로는 Closure라는 이름으로 불리기도 한다. (어원이 어느 곳인지는…) C/C++에서는 function pointer의 형태로 이를 간접적으로 지원하지만, Smalltalk에는 Block이라는 이름의 function object가 존재한다. Block은 callback이나 collection의 enumeration 등 매우 쓸모가 많다. Python이나 Ruby, C# 같은 현대의 Programming Language들에서는 모두 직접 지원하는 문법이다.

Conclusion

현대의 여러 Programming Language의 Object-oriented programming paradigm 이나, 위에서 소개한 문법적인 요소들, 그리고 구현에 이르기까지, 많은 요소들이 Smalltalk로부터 전해져 내려왔다. (물론 그 중에서도 어떤 것들은 더욱 오랜 역사를 가지고 있다; 수학적인 개념들부터 상속된 것들이 특히 그러하다) 이러한 역사를 모르는 사람들은 때로 Programming Language에 대한 이상한 오해를 가지기도 한다. 미신을 멀리하고 역사를 배우라.

Links

Smalltalk syntax 더 읽기"

sata_sil + Seagate SATA HD problem (continued)

Silicon 3512 controller와 Seagate의 SATA HD의 특정 모델의 조합에서 발생하는 이 문제를 linux kernel mailing list에서는 mod15 write bug라고 부른다. 뭔가 15번째 sector에 write 작업을 할 때마다 이 문제가 발생하기 때문에 이런 이름이 붙은 듯 하다.

이 문제는 아마 꽤 오래전에 sata_sil 드라이버에서 black list를 유지하고, quirk (workaround)를 적용함으로써 해결된 모양인데, 이 black list에 내가 사용하던 Seagate 하드디스크가 들어있지 않아서, kernel을 upgrade해도 문제가 해결되지 않았던걸로 추측된다.

다음 url에서 내가 가진 하드디스크와 정확히 같은 모델(ST3200822AS)에 대해서 black list에 추가해주는 patch를 언급하고 있다.

http://www.ussg.iu.edu/hypermail/linux/kernel/0412.1/1124.html

나중에 기회가 생기면, 해당 하드디스크를 테스트해보는 것이 좋을 듯 하다. 그리고 Silicon 3512 controller를 사용하는 한, Seagate SATA HD를 피해서 구입할 필요가 있을 듯 하다.

sata_sil + Seagate SATA HD problem (continued) 더 읽기"

More Exceptional C++

More Exceptional C++

Herb sutter“Exceptioanl C++”의 후속작이다. Exceptioanl C++ 처럼 Guru of the Week item을 책으로 엮어서 펴낸 책이다. 때문에 책에 있는 내용들은 거의 전부 웹에서 볼 수 있고 내용도 거의 비슷하다.

C++ In-Depth 시리즈의 번역 quality는 그동안 믿을만 했기 때문에, 별 걱정 없이 번역판을 읽었다. 이로써, 그 시리즈의 번역된 중급서들은 다 읽은 셈이다.

내용은 Scott Meyers의 Effective C++과 비슷한 부류의 것을 기대하면 된다. 즉, C++ 언어를 잘 쓰는 것에 대한 책이다. 여러가지 주제를 다루고 있어서 딱히 한정해서 얘기하기는 힘들 것 같다. 목차를 살펴보라.

형식은 C++ programming 시에 발생하는 문제들을 내놓고 이에 대한 답을 제시하는 식이다. (혹자는 문제집 풀고 있냐고…) 개인적으로 문답법을 상당히 좋아하긴 하지만, 이 책을 읽을 때는 그냥 무시하고 죽죽 읽어나가버렸다.

지금 읽는 소프트웨어 개발 관련 책만도 2권이나 있고 다른 읽을 책도 많지만, C++ 언어 계열로 더 읽는다면, 최근에 C++ In-Depth 시리즈에 추가된 Herb Sutter와 Andrei Alexandrecu의 저작, C++ Coding Standards를 꼽고 싶다. 제목으로부터 오해할 가능성이 높겠지만, tab size를 어떻게 쓰고, bracket 위치를 어디에 두는가에 관한 책이 아니다. 실제로 읽기 전엔 모르겠지만, EC++ 계열의 practice들을 정리해서 “표준적인 coding style”로 집약한 책으로 보인다. 하나를 더 고르라면, C++의 아버지 Bjarne Stroustroup이 C++ 언어의 진화 과정을 설명하고 왜 현재의 문법이 생겼는지를 설명해주는 Design & Evolution of C++을 꼽겠다. 언어의 역사를 이해하는 것은 언어의 철학을 이해하는 데에 도움을 주고, 언어의 철학을 이해한다면 그 언어를 쓰기도 쉬워진다.

덧붙여, 프로그래밍 언어에 대해 왜 그렇게 열심히 공부하냐는 사람도 있는데, 이는 작문법을 왜 그렇게 열심히 공부하냐는 질문과 비슷하다. 작문을 잘하기 위해서는 물론 작문을 많이 해보아야겠지만, 다른 사람들이 이미 고민해둔 좋은 작문방법이 있다면, 시행착오를 통해서 배우는 것보다는 이를 공부하는 것이 훨씬 시간이 절약되기 때문이다. 게다가, 작문법에는 언어간의 벽을 뛰어넘는 무언가가 있어서, 다른 언어에 대해서도 적용되는 경우가 있다. 반대로, 언어간의 벽을 뛰어넘지 못하는 철학적인 요소도 작문을 하는데에 필요하다.

물론, (프로그래밍을 처음 배우는 모든 사람들에게 항상 얘기하듯이) 작문법만 공부해서는 절대로 문장가가 될 수 없다는 점을 유념해야할 것이다. 역사 공부도 중요하고 철학 공부도 중요하지만, 실제로 다작을 해보는 것처럼 중요한 것은 없다. 마찬가지로 어느 정도 프로그래밍에 대한 지식을 익히고 나서는, 실제로 프로그래밍을 해보지 않는 한, 절대로 더 높은 단계로 올라설 수가 없다.

More Exceptional C++ 더 읽기"