티스토리 툴바


Ways 프로그램

programming 2012/02/02 21:00
이 브라우저는 <canvas> 태그를 지원하지 않아 이미지로 대체함.

이건 내가 새로운 프로그래밍 언어를 배울 때마다 해당 언어로 만들어 본 간단한 데모 프로그램이다. 그냥 화면에 미리 정해진 규칙에 따라 계속 그림을 그리는 프로그램이다.

처음에는 Apple Basic, 그 다음에는 Apple Pascal, C로 작성했다. 그때만 해도 윈도우 환경이 아니어서 화면을 그래픽 모드로 바꾼 다음 그림을 그렸다. 나중에는 C로 Window에서 돌아가게도 만들었다. 이 프로그램을 처음 만들었을 때만해도 컴퓨터 속도가 느려 무식하게 루프만 돌려도 그림을 그리는 과정이 그대로 보였지만, 지금은 컴퓨터 속도가 빨라 일부러 천천히 그리게 하지 않으면 순식간에 화면을 채워버릴 것이다.

예전 소스 코드를 지금 보면 재미있을 것 같은데... 아쉽게도 제대로 보관해놓지 않았다.

저작자 표시 비영리 변경 금지
Posted by ntalbs
TAG Canvas

닭고기 vs 치킨

국어 2012/01/19 18:40
내가 어렸을 때는 '치킨'이라는 말 보다는 '닭고기', '통닭' 같은 말이 일반적으로 사용됐다. 닭고기를 튀겨 파는 가게는 통닭집이라 불렀다. 그런데 언제부터인지 '치킨'이란 말이 사용되기 시작하더니 이제는 '닭고기'를 뜻할 때는 의례 '치킨'이란 말을 사용한다. 우리말을 올바르게 사용하는 데 앞장서야 할 방송사도 마찬가지다. 드라마, 쇼 프로그램, 뉴스 할 것 없이 모두 '치킨'이란 외국어를 사용한다.

우리말은 빠른 속도로 영어로 오염되고 있다. 사람들은 '팩트'가 어쩌구 저쩌구 말하고, '고객의 니즈'가 어쩌구 저쩌구 말하며, '리얼리티'가 어떻다고 말하기도 한다. '팩트'는 '사실'로, '니즈'는 '필요'로, '리얼리티'는 '사실성'으로 쓴다고 해서 원래 말하려는 뜻을 나타내기가 어려울까? 예를 들자면 끝도 없을 것이다.

'닭고기' 또는 '통닭'이라고 말하면 왠지 촌티나는 것 같고 '치킨'이라고 해야 있어 보인다고 생각하는 사람들이 늘어나는 것 같다. 그래서 바보상자에 나오는 정치인들이 '사실'이라고 말해도 되는데 굳이 '팩트'라고 말하는지도 모르겠다. 좀더 유식해보이고 싶어서, 좀더 잘나 보이고 싶어서.

예전에는 국한문을 혼용하거나 적어도 병기해야 한다고 주장하는 사람들이 있었다. 국어 단어의 70%가 한자어로 되어 있기 때문에 한자로 써놓지 않으면 이해하기가 어렵다는 것이었다. 아직도 이렇게 생각하고 있는 사람들이 있는지는 모르겠지만, 지금 상태로라면 한 세대쯤 지난 다음에 국영 혼용 또는 병기를 해야 한다고 주장하는 사람들이 생길지도 모르겠다. 국어 단어의 OO%가 영어 단어로 되어 있으니 영어를 병기하지 않고는 정확한 뜻을 이해하기 어렵다고 할지도 모를 일이다.

분별없이 영어 단어를 섞어쓰며 말하는 것은 별로 멋있어 보이지 않는다. 그저 잘난척 하는 재수없는 인간으로만 보일 뿐이다.
저작자 표시 비영리 변경 금지
Posted by ntalbs

NoSuchMethodError

programming 2011/08/12 22:54
CI서버에서 대략 삼분의 일 정도의 테스트가 실패하고 있었다. 로그를 확인해보니 어이없게도 실패하는 테스트에서 NoSuchMethodError가 발생했고, 모두 Google의 컬렉션 라이브러리를 사용하는 부분이었다. 이클립스에서 테스트를 실행시킬 때는 아무런 문제가 없는데 CI 서버에서는 실패하는 것이었다.

에러 이름으로 보자면 메서드를 찾지 못해 생기는 문제다. 컴파일할 때와 실행할 때 클래스패스에 차이가 있다면 이런 문제가 발생할 수 있다. 그러나 문제가 생기는 라이브러리는 guava-r09.jar 파일에 있는 것으로, 가져다 쓰는 것이고, 컴파일 할 때나 실행할 때 같은 파일을 클래스패스에 추가했기 때문에 이런 문제가 생기는 이유를 알 수 없었다.

조금 더 확인을 해보니, 내 PC에서도 Ant 태스크로 JUnit 테스트를 돌릴 때 동일한 문제가 발생한다는 것을 알게 되었다. 이클립스에서 그냥 돌릴 때와 Ant로 돌릴 때의 차이점이 무엇일까? 아무리 생각해도 알 수 없었다. 혹시 guava 라이브러리가 클래스패스에 중복해 존재하는지 확인하기 위해 클래스패스의 모든 jar 파일을 확인하기도 했다. 분명 클래스패스에 중복된 클래스가 있고, 클래스 로더가 내가 원하는 클래스가 아닌 다른 클래스를 로딩해 발생한 문제인 것은 알겠는데, 그 이상 나아갈 수가 없었다.

이렇게 어제 하루를 날렸다. 오늘 아침에 다시 구글로 검색을 하다가 귀중한 정보를 찾았다. JVM 파라미터 중에 로딩되는 클래스 정보를 표시하도록 하는 옵션이 있다는 것이다.
 java -verbose:class <other args=>
옵션을 추가해 테스트를 실행해보니 문제를 바로 확인할 수 있었다. com.google.common.collect.Maps 클래스를 내가 의도한 guava-r09.jar가 아닌 checkstyle-5.3-all.jar에서 로딩하고 있는 것이었다. 허거덕! 결국 이클립스에서 테스트를 실행시킬 때와 Ant로 돌릴 때와의 차이점은, Ant로 돌릴 때 정적 분석을 위해 클래스패스에 추가한 몇몇 jar 파일이었다. Checkstyle의 jar 파일에 Google 컬렉션 라이브러리 클래스가 함께 들어있어 이 때문에 문제가 생기리라고는 상상도 하지 못했다.

물론 이건 설정을 잘못한 문제다. 테스트를 실행할 때 checkstyle-5.3-all.jar가 클래스패스에 있어야 할 이유는 전혀 없다. checkstyle-5.3-all.jar는 Checkstyle을 돌릴 때만 필요하다. 빌드 스크립트를 만들 때 클래스패스를 구분하기 귀찮아 그냥 하나의 변수에 몰아넣고 아무데서나 이 변수를 참조해 쓴 게 잘못이다.

구글에서 NoSuchMethodError로 검색했을 때 상위에 나오는 국내 블로그 글들은 문제에 대한 설명은 있지만 해결하는 방법에 대한 설명은 부족해 보인다. 그냥 중복된 jar 파일이 있는지 확인해 지우니 잘 되더라 하는 정도다.

정확한 문제 해결 방법을 정리하자면 다음과 같은 정도가 될 것 같다:
java를 실행시킬 때 -verbose:class 옵션을 주어 에러가 발생하는 클래스가 원하는 jar 파일(또는 클래스패스)에서 로딩되었는지를 확인한다.

저작자 표시 비영리 변경 금지
Posted by ntalbs