Monthly Archives: November 2010
TDD – std::map 에 대한 사용법 TDD
매주 수요일 마다 회사에서 하기로 한 TDD 스터디 -_-
아직은 TDD를 잘 모르겠다라는 T.T
#include <gtest/gtest.h>
#include <iostream>
#include <string>
#include <map>
#include <utility>
using namespace std;
int main( int argc, char *argv[] ){
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
TEST(MapTest, IteratorTest){
map<string, string> phonemap;
phonemap["Tom"] = “555-1234″;
phonemap["Jane"]= “314 555-6576″;
phonemap["Ken"] = “660 555-9843″;
map<string, string>::iterator itr;
itr = phonemap.begin();
ASSERT_STREQ( (itr->first).c_str(), “Jane” );
ASSERT_STREQ( (itr->second).c_str(), “314 555-6576″ );
++itr;
ASSERT_STREQ( (itr->first).c_str(), “Ken” );
ASSERT_STREQ( (itr->second).c_str(), “660 555-9843″ );
++itr;
ASSERT_STREQ( (itr->first).c_str(), “Tom” );
ASSERT_STREQ( (itr->second).c_str(), “555-1234″ );
}
TEST(MapTest, ReverseIteratorTest){
map<string, string> phonemap;
phonemap["Tom"] = “555-1234″;
phonemap["Jane"]= “314 555-6576″;
phonemap["Ken"] = “660 555-9843″;
map<string, string>::reverse_iterator ritr;
ritr = phonemap.rbegin();
ASSERT_STREQ( (ritr->first).c_str(), “Tom” );
ASSERT_STREQ( (ritr->second).c_str(), “555-1234″ );
++ritr;
ASSERT_STREQ( (ritr->first).c_str(), “Ken” );
ASSERT_STREQ( (ritr->second).c_str(), “660 555-9843″ );
++ritr;
ASSERT_STREQ( (ritr->first).c_str(), “Jane” );
ASSERT_STREQ( (ritr->second).c_str(), “314 555-6576″ );
}
TEST(MapTest, FindTest){
map<string, string> phonemap;
phonemap["Tom"] = “555-1234″;
phonemap["Jane"]= “314 555-6576″;
phonemap["Ken"] = “660 555-9843″;
map<string, string>::iterator itr;
itr = phonemap.find(“Jane”);
ASSERT_STREQ( (itr->second).c_str(), “314 555-6576″ );
}
TEST(MapTest, AddSizeTest){
map<string, string> phonemap;
phonemap["Tom"] = “555-1234″;
phonemap["Jane"]= “314 555-6576″;
phonemap["Ken"] = “660 555-9843″;
ASSERT_TRUE( phonemap.size() == 3 );
pair<map<string, string>::iterator, bool> result;
result = phonemap.insert( pair<string, string>(“Jay”, “555-9999″));
ASSERT_TRUE( phonemap.size() == 4 );
}
TEST(MapTest, DuplicateAddSizeTest){
map<string, string> phonemap;
phonemap["Tom"] = “555-1234″;
pair<map<string, string>::iterator, bool> result;
result = phonemap.insert( pair<string, string>(“Tom”, “555-9999″));
ASSERT_TRUE( phonemap.size() == 1 );
}
zlib-1.2.3 에서의 libxml2 와 gzopen64 문제
누군가에게는 쉬운 문제인지도 모르겠지만, CentOS 5.3에서 zlib-1.2.3 이 깔려있는 상태에서
libxml2 가 자꾸 gzopen64 가 undefined symbol 이라는 오류를 내면서 빌드가 되지 않았다.
결론부터 말하자면, zlib-1.2.5를 누군가가 설치했고, 이에 따라서, include 와 zlib 의 library 가 꼬이면서
발생하는 문제다. zlib-1.2.3에는 gzopen64가 없는데, include 는 zlib-1.2.5를 가리키면서, 실제 gzopen
이 gzopen64로 매핑될려고 해서 발생한 것!!!
정답은 zlib-1.2.5를 지우고 /etc/ld.so.conf 에서 제대로 위치를 지정해주면 된다. rpm을 깔면 zlib는
/usr/lib 에 설치된다.
그런데 여기서 나는 .so 만 지우고 include 는 지우지 않는 실수를 -_-; 결국 이 빌드 오류를 찾는데만
하루종일 걸렸다. -_-
–rpath 와 동적라이브러리 링킹
가끔씩은 코딩만 해서는 해결 할 수 없는 문제들이 있습니다.
(뭐, 해결할 수 없다라기 보다는 시간이 많이드는, 열라 힘든?)
-rpath 라는 것이 이런식으로 알면 굉장히 쉬운 일이라고 할 수 있습니다.
우리는 종적 동적라이브러리를 사용합니다. 일명 .so 라고 부르는 파일들이죠.
.so를 사용하기 위해서는 명시적으로 dlopen 을 이용하든지, 아니면 그냥 해당 라이브러리의 이름만
링크되어 있는 라이브러리 들을 이용해서 실제 자동적으로 실행시에 해당 .so가 로드되도록 하는 방법이
있습니다.
그런데, 우리는 보통 이 .so를 사용하기 위해서, 경로 지정에 두 가지 방법을 사용합니다.
첫째는 /etc/ld.so.conf 를 수정해서 /sbin/ldconfig 을 이용해서 전역적으로 지정하는 방식이고, 두번째는
LD_LIBRARY_PATH 를 셋팅해서 해당 유저에게만 사용하는 방법입니다.
위의 방식의 문제점은 무엇일까요? 그건, 사용자가 .so 의 위치를 어떤식으로든 지정을 해줘야 하는 겁니다.
같이 배포하더라도, 해당 위치를 지정해야 한다면, 그렇게 쉬운일이 아닙니다.(조금만 알면 쉽지요.) 그런데
-rpath 라는 넘은 프로그램이 빌드될 때, 자동적으로 .so의 위치를 부여하는 것입니다. 절대 상대 경로 모두 사용 가능하구요.
-rpath .so 경로 -Wl 이런식으로 이용할 수 있습니다.
이렇게 되면 실행시에 지정된 경로에서 바로 .so 파일을 찾게 됩니다. 배포가 더 쉬워지고
사용하기도 더 쉬워지는 겁니다.
그런데, 전, 이걸 모르고 있었습니다. 그러니, 라이브러리 링크 하는데 -_- 계속 .so 가
없다라는 에러가 T.T 아무리 /etc/ld.so.conf 를 지정해줘도 안되길래 고민하다 보니
이런 특성이 있더군요.
여러분들도 조심하시기 바랍니다.
Joyent 라는 곳을 아시나요?
우연히 검색을 하다보니 Joyent 라는 회사명을 발견하게 되었습니다. 뭐, 이미 많이 알려진 회사일
수도 있을 것 같지만……
여기도 Amazon EC2 처럼 IAAS 를 제공하는 회사인데,
다음 URL을 가보면 Amazon EC2와 비교하는 내용들이 있습니다.
http://www.joyent.com/services/cloudhosting/joyent-vs-amazon-ec2/
http://www.joyent.com/services/cloudhosting/performance-comparison/
여기를 보면 Amazon EC2보다 3배 이상 빠르다는 결과를 보여주고 있습니다.(워드프래스는
20배 더 빠르다네요 -_-) 명확한 장비적인 부분을 비교할 수는 없겠지만, Amazon EC2 말고
또, 고려해볼만 것들이 늘어난 것 같습니다.
Performance Benchmarks 를 보면 웬지 믿기지 않아보이는데도 -_- 사실대로면 상당히
괜찮아 보입니다.
가격도 보면 조금 싸보이긴 한데, 여기는 과금제가 하루 단위인것 같아보이네요.
모바일에서의 XML 파싱은 무조건 SAX로 대동단결
그냥 TIP이다. 정말 간단한 것들은 모르지만
웬만하면, 모바일에서 XML 파싱할 일이 있다면 SAX로 대동단결
이유는, 메모리 사용량 때문임!!!
CODE VS SQL
최근에 많이 느끼고 있는 것인데, 확실히 코드로 짜야할 것을 SQL을 이용해서 DB에서 해결이
가능하면, 웬만하면 SQL을 사용하는 것이 훨씬 생산성이 높다.
이일단 이렇게 되기 위해서는 문제가 몇가지 있는데
첫째로, SQL을 잘 하는 사람이 필요하다.
당장, 본인만 하더라도, sql문은 select, insert, update, delete 의 기본 구문을 벗어나지
못하고 있으니, 조금만 복잡해도 그냥 코드로 짜고 말지라는 생각이 든다.
둘째로, 작성한 코드를 유지보수하는데도 일이 생긴다.
SQL 못하면 코드 유지보수하기도 힘들다 -_-
모바일 개발을 할 때만 해도, 웬만하면 SQL보다는 코드 라기 보다는 -_-
둘중에 메모리를 조금 덜 쓰는 쪽으로 작성했는데, 이 때 습관이 지금까지 남아서
SQL 한번으로 처리할 일을 코드로 작성하는 삽질을 하고 있다.
당장 최근에, 특정한 필터링 로직을 재작성할 뻔한 일이 생겼는데,
이걸 아무리 봐도 요구사항을 만족시키려면 재작성 그럼 일정이 두배로 걸릴
상황이었는데, SQL을 잘하는 옆 차장님이, SQL로 작성을 해주셨다. 데이터를
약간 modify 하긴 해야하지만, 하루 정도만 투자하면 될꺼같다라는…
(뭐, 물론 실제로 하기 전까지는 -_- 알 수 없긴 하다.)
하지만, SQL을 어느 정도 깊게 이해하는 것이 필요 할듯 하다.