2009년 12월 22일 화요일

이클립스에서 C/C++ 개발

보통 이클립스는 자바 개발에 사용하지만 gcc, gdb와 연동해서 훌륭한 C/C++ 개발툴이 될수 있다.

이클립스는 C/C++을 플러그인 형태로 지원하는데 이를 CDT라고 한다.

1. 이클립스 다운로드

http://www.eclipse.org/downloads/ 에서 Eclipse IDE for C/C++ Developers (79 MB)을 다운로드 받는다. 별도의 설치과정 없이 적당한 경로에 압축을 풀면된다.

2. JRE(Java Runtime Environment) 설치

이클립스는 자바로 만들어 졌기 때문에 http://java.sun.com/javase/downloads/index.jsp 에서 JRE를 설치한다.

3. 툴체인 설치

이클립스는 순수 IDE이므로 컴파일러와 디버거를 포함하지 않는다.

1) 아래 링크에서 컴파일러를 다운로드 한다.
실행하면 자동으로 설치된다.


2) 아래 링크에서는 디버거(gdb)를 다운로드 한다.
에서 GDB를 다운로드 받고 적당한 위치에 압축을 푼다.

4. 환경 설정(PATH)

제어판 -> 시스템 -> 고급 탭 -> 환경변수에서 PATH 값을 수정해 준다.

예) C:\Program Files\Microsoft Visual Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\VC98\bin;;C:\Program Files\SSH Communications Security\SSH Secure Shell;C:\Program Files\SoftForum\XecureHSM\;C:\MinGW\bin

환경변수 뒤에 설치한 gcc, gdb가 설치된 경로를 추가해줘야 한다. 난 gdb, gcc를 동일한 경로에 설치해서 PATH에 하나만 추가해 주었다.

5. 이클립스 설정

이클립스를 실행한다.
Window->Preferences를 선택하면 다이얼로그 박스가 나온다. C/C++ 아래의 New CDT project wizard->Makefile Project 를 선택하고
Build command를 mingw32-make 로 바꿔준다.


2009년 12월 14일 월요일

책으로 표현하는 나 <유저스토리북>


유저 스토리북이란 서비스가 베타 오픈을 했습니다.

가까히 사는 분에게 책을 빌려주고 빌려 볼수 있는 그런 사이트입니다.

저두 가입해서 가진 책도 등록하고 했습니다.

그런데 누가 컴쟁이 아니랄까봐 집에 있는 책의 대부분이 IT 관련 서적 ㅠㅠ;;

그 이외에는 전부 재테크, 주식 서적 ㅠㅠ;;

열심히 활동하면서 마음의 양식을 쌓아보렵니다. 아래는 사이트 주소입니다.


사이트가 AJAX로 만들어 졌는지 깔끔하고 별도의 리프레쉬 하면서 발생하는 깜빡거림이 없네요. 이놈의 컴쟁이 본능 관심은 서비스가 아니라 웹페이지 기술 ㅠㅠ;;

Dtrace를 이용한 솔라리스 메모리 누수(memory leak) 잡기

참조 문헌

Dtrace를 이용한 메모리 누수 잡는 법을 소개하고자 한다.

아래 사용한 스크립트는 5번 항목 또는 위의 링크를 참조하도록 한다.


1. 메모리 leak을 유발하는 코드 작성

#include

int main(void)
{
char *test1;

while(1)
{
test1 = malloc(sizeof(char) * 256);

printf("memory leak\n");

sleep(1);
}
return 1;
}

2. 해당 프로그램 실행
# a.out

3. dtrace로 memory malloc과 free한 부분을 찾음
사용법
# ./memleak.d PID > output

사용 예
# su -
# pgrep a.out
5659
# ./memleak.d 5659 > leak.data
Ctrl+c

4. 스크립트로 malloc과 free를 매칭해서 제대로 free가 되지 않은 부분을 추출해 냄
사용법
./findleaks.pl output

사용예
./findleaks.pl leak.data
Ptr=0x22018 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21af0 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21e08 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21d00 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21bf8 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21f10 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c


5. 스크립트

1)
# cat ./memleak.d

-------------------------------------- cut --------------------------------------------
#!/usr/sbin/dtrace -s

pid$1:libc.so.1:malloc:entry
{
self->trace = 1;
self->size = arg0;
}
pid$1:libc.so.1:malloc:return
/self->trace == 1/
{
printf("Ptr=0x%p Size=%d", arg1, self->size);
ustack();
self->trace = 0;
self->size = 0;
}

pid$1:libc.so.1:realloc:entry
{
self->trace = 1;
self->size = arg1;
self->oldptr = arg0;
}

pid$1:libc.so.1:realloc:return
/self->trace == 1/
{
printf("Ptr=0x%p Oldptr=0x%p Size=%d", arg1, self->oldptr, self->size);
ustack();
self->trace = 0;
self->size = 0;
}

pid$1:libc.so.1:calloc:entry
/self->trace == 1/
{
self->trace = 1;
self->size = arg1;
}

pid$1:libc.so.1:calloc:return
/self->trace == 1/
{
printf("Ptr=0x%p Size=%d", arg1, self->size);
ustack();
self->trace = 0;
self->size = 0;
}

pid$1:libc.so.1:free:entry
{
printf("Ptr=0x%p ", arg0);
}
-------------------------------------- cut --------------------------------------------

2)
# cat findleaks.pl

-------------------------------------- cut --------------------------------------------
#!/usr/bin/perl

use Data::Dumper;

my %hash = ();

while (<>) {
if ((/malloc:return Ptr=([^ ]*) Size=(.*)/) ||
(/calloc:return Ptr=([^ ]*) Size=(.*)/)) {
$hash{$1} = { size => $2 };
while (<>) {
last if /^$/;
$hash{$1}->{stack} .= $_;
}
}
elsif (/free:entry Ptr=([^ ]*)/) {
if (exists $hash{$1} and $hash{$1}) {
$hash{$1} = '';
}
}
elsif (/realloc:entry Ptr=([^ ]*) Oldptr=([^ ]*) Size=(.*)/) {
if ($1 eq $2) {
if (exists $hash{$1} and $hash{$1}) {
$hash{$1} = { size => $3 };
$hash{$1}->{stack} = '';
while (<>) {
last if /^$/;
$hash{$1}->{stack} .= $_;
}
}
} else {
$hash{$1} = '';
$hash{$2}= { size => $3 };
$hash{$2}->{stack} = '';
while (<>) {
last if /^$/;
$hash{$2}->{stack} .= $_;
}
}
}

}

foreach my $key (keys %hash) {
next if not $hash{$key}->{size};
print "Ptr=$key Size=", $hash{$key}->{size}, "\n";
print $hash{$key}->{stack}, "\n---------\n";
}
-------------------------------------- cut --------------------------------------------

2009년 12월 8일 화요일

솔라리스 메모리 누수 확인(Memory Leak)

* 솔라리스에서 메모리 누수를 확인하는 방법

1. 누수를 확인할 블럭 실행
- sh, ksh, bash 일 경우
# UMEM_DEBUG=default UMEM_LOGGING=transaction LD_PRELOAD=libumem.so.1 ./block&
- csh 일 경우
setenv UMEM_DEBUG default; setenv UMEM_LOGGING transaction; setenv LD_PRELOAD libumem.so.1; ./block&
[1] 1234

2. 코어 덤프
# gcore 1234 gcore: core.1234 dumped

3. 덤프 분석
root@wl # mdb core.1234
Loading modules: [ libumem.so.1 libc.so.1 ld.so.1 ]
> ::umem_status
> ::umem_log
> ::umalog ...
> ::findleaks
CACHE LEAKED BUFCTL CALLER
080798d0 1 0808ae30 main+0xf
08079c50 1 0808eaf8 main+0x1e
----------------------------------------------------------------------
Total 2 buffers, 64 bytes

Ctrl+D

- 출처(자세한 사항은 링크 를 참조하세요)

2009년 12월 1일 화요일

MFC에서 CString과 char* 형변환

개인적으로 MFC의 CString을 극도로 혐오하지만, MFC 개발을 한다면 반드시 써야한다.

1. CString에서 char*으로 형변환

CString my_cstr;
my_str = "Hello World!";

char* my_pchar = LPSTR(LPCTSTR(my_str ));


2. char*에서 CString으로 형변환

char my_pchar[] = "Hello World!";

CString my_cstr;
my_cstr.Format("%s", my_pchar);

※ Windows에서 MFC가 없어지는 그날까지...

2009년 11월 29일 일요일

Solaris 10 에서 sparc용 64비트 gdb 컴파일 하기

주로 64비트 Solaris 개발을 많이 하게 되는데, sunfreeware 에서는 32비트 gdb 패키지만 제공한다. 그래서 직접 컴파일 해보기로 했다.

1. configure 하기

가장 중요한 부분이다.
1) ./configure ==> 일반적인 32비트 컴파일
2) CC="gcc -m64" ./configure ==> 일반적인 64비트 컴파일

64비트 컴파일을 위해 2)번 방식을 사용했는데 make를 하면 에러가 나온다. 이 때부터 구글 검색이 시작되었다. ㅋㅋㅋ

결론은
3) CC="gcc -m64" ./configure --disable-tui
이렇게 configure를 수행하니 잘 된다. tui가 뭐하는 녀석인지 모르겠지만 컴파일이 안되게한 원흉임이 분명하다.

$ CC="gcc -m64" ./configure --disable-tui
checking build system type... sparc-sun-solaris2.10
checking host system type... sparc-sun-solaris2.10
checking target system type... sparc-sun-solaris2.10
checking for a BSD-compatible install... /usr/local/bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for a sed that does not truncate output... /usr/local/bin/sed
checking for gawk... no
...

2. make, make install

생략...

3. 간단한 gdb 사용...

간단히 버그를 내포한 코드를 빌드한다. -m64는 64비트 빌드를 의미하고, -g는 디버깅을 위한 옵션이다. 코드 내용은 생략한다.

$ gcc -g -m64 test.c -o test
$ ./test
세그멘테이션 결함(Segmentation Fault)(코어 덤프)
$ ls
a.out core gdb test test.c

hk9:/src1/hk9/test$ gdb -c core test
GNU gdb (GDB) 7.0
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "sparc-sun-solaris2.10".
For bug reporting instructions, please see:
...
Reading symbols from /src1/hk9/test/test...done.

warning: exec file is newer than core file.
Reading symbols from /usr/lib/sparcv9/libc.so.1...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 1 (LWP 1)]
Loaded symbols for /usr/lib/sparcv9/libc.so.1
Reading symbols from /platform/SUNW,Sun-Fire-V440/lib/sparcv9/libc_psr.so.1...(no debugging symbols found)...done.
Loaded symbols for /platform/SUNW,Sun-Fire-V440/lib/sparcv9/libc_psr.so.1
Reading symbols from /lib/sparcv9/ld.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/sparcv9/ld.so.1
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0 0xffffffff7f2371b8 in strlen () from /usr/lib/sparcv9/libc.so.1
(gdb) where
#0 0xffffffff7f2371b8 in strlen () from /usr/lib/sparcv9/libc.so.1
#1 0xffffffff7f29f968 in _ndoprnt () from /usr/lib/sparcv9/libc.so.1
#2 0xffffffff7f2a1b9c in printf () from /usr/lib/sparcv9/libc.so.1
#3 0x000000010000085c in main () at test.c:5
(gdb)

2009년 11월 26일 목요일

Sun Studio 12 GUI 디버깅 툴 dbxtool 사용하기



솔라리스에서 GUI 디버깅 툴을 찾는 중 dbxtool 이란 것을 접하게 되었다.

Sun Studio 12 Update 1에서부터 제공되는 tool로써 dbx 디버거를 쉽게 사용하도록 한 GUI라고 볼 수 있다.

1. 설치

● 우선 Sun Studio 12를 아래 링크에서 다운 받는다. 자신이 설치하고자 하는 flatform과 언어를 적절히 선택한다.

● 패키지를 다운로드 받고 적당한 위치에 압축을 해제한다.
ex > # bzcat downloaded_directory/SunStudio12u1-SunOS-SPARC-pkgs-ML.tar.bz2 | /bin/tar -xf -

● 압축을 푼 디렉토리로 이동한다.
ex> cd SunStudio12u1-SunOS-SPARC-pkgs-ML

● 대부분 GUI를 사용하지 못하는 환경일 것이다. Command-Line 모드로 설치를 진행하겠다.
# su -
# ./SunStudio12u1-SunOS-SPARC-pkgs.sh --non-interactive-accept-license

● 기본적으로 /opt 아래에 설치가 되기 때문에 경로를 지정해야 할 경우 아래와 같이 설치 경로를 변경해 줄 수 있다.
# ./SunStudio12u1-SunOS-SPARC-pkgs.sh --non-interactive-accept-license --installation-location 설치할 경로

● 설치와 관련된 추가적인 부분은 문서에서 확인할 수 있다.

● 설치하는 데 시간이 오래 걸린다. 차라도 한잔 마시고 오는게 좋겠다.

● 이제 실행해 본다.
# dbxtool
Sun Studio is unable to find a supported version of Java.
Sun Studio supports Java version 1.5.0_16 and newer and looks for a valid Java installation in the following order:
1) Location specified with --jdkhome command line option
2) In PATH environment variable
3) At /usr/jdk/latest location, if exists
4) At /usr/java location, if exists
5) At /usr location, if exists

근데 안된다... 자바 버전을 확인해보니... 버전이 낮았다.
# java -version
java version "1.5.0_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_01-b08)
Java HotSpot(TM) Server VM (build 1.5.0_01-b08, mixed mode)

다시 자바를 새로 설치한다. 설치 과정은 생략... 아래 링크 참조...

참고로 자바 설치 후 아래와 같이 링크를 변경해 주었다.

# ls -al
총 18
drwxr-xr-x 5 root bin 512 11월 27일 16:27 .
drwxr-xr-x 44 root sys 1024 2009년 3월 18일 ..
drwxr-xr-x 3 root bin 512 2005년 6월 14일 instances
lrwxrwxrwx 1 root other 7 2005년 6월 14일 j2sdk1.4.2_06 -> ../j2se
lrwxrwxrwx 1 root other 18 2005년 6월 14일 jdk1.5.0_01 -> instances/jdk1.5.0
drwxr-xr-x 10 root root 512 11월 27일 16:27 jdk1.6.0_06
lrwxrwxrwx 1 root root 11 11월 27일 16:27 latest -> jdk1.6.0_06
lrwxrwxrwx 1 root other 11 2005년 6월 14일 latest_old -> jdk1.5.0_01
drwxr-xr-x 7 root bin 512 2005년 6월 14일 packages
# pwd
/usr/jdk

2. 실행

보통 xmanager를 통해 서버에 직접 접속하거나, 서버 앞 모니터로 이동해서 GUI를 띄워야 한다. 난 이것이 너무 귀찮기 때문에 xming과 ssh 터미널을 이용해서 원격에서 GUI를 구동했다.

ssh 터널링을 사용해서 원격에서 X-window 어플리케이션을 실행하는 방법인데, 이건 추후에 정리하도록 하겠다.

터미널에서 dbxtool을 수행하면 끝...
# dbxtool

그런데 사용하다 보니 xming을 이용할 경우 GUI가 오작동 한다. java로 된 프로그램을 xming으로 사용하는데 문제가 있는 듯 하다.

다시 xmanager를 이용해서 dbxtool을 실행해 보았더니 잘 동작한다.

자세한 사용 법은 아래 문서를 참조하면 되겠다.





솔라리스 64비트 바이너리 코어 분석

1. 서론

리눅스와 솔라리스에서 개발할 때 가장 큰 차이는 개발 환경인 듯하다.
리눅스는 설치하면 gcc, gdb 같이 개발에 필요한 대부분의 것이 갖추어져 있다.
솔라리스의 경우 http://www.sunfreeware.com/에서 필요한 툴은 다운 받아 직접 설치해야 한다. 의존성 문제나 기타 여러가지 이유로 해서 상당히 귀찮다. 그리고 가장 큰 문제는 64비트용 gdb가 제공되지 않는다는 것이다.

이 글에서는 Sun Studio의 dbx를 이용한 디버깅 방법을 소개하겠다.

2. 버그 실행 파일 생성

먼저 버그를 내포한 실행 파일을 생성해 보겠다.

# vi test.c

#include

int main(void)
{
printf("test %s\n", 1);
return 1;
}

왜 코어가 발생하는지 설명하지는 않겠다.

아래와 같이 컴파일 한다. 반드시 64비트로 컴파일 한다.
# gcc -m64 -o test test.c

이제 바이너리를 실행하고 코어를 생성해 본다.

# ./test
# ls -al
drwx------ 2 hk9 staff 512 11월 27일 10:18 .
drwxr-xr-x 43 hk9 staff 1536 11월 27일 10:16 ..
-rw------- 1 hk9 staff 1661108 11월 27일 10:18 core
-rwx------ 1 hk9 staff 8168 11월 27일 10:17 test
-rw------- 1 hk9 staff 75 11월 27일 10:16 test.c

3. 코어 분석

- pstack 사용

기본적으로 pstack을 이용해 분석하고, gdb를 이용하는게 일반적이다.

# pstack core
core 'core' of 8496: ./test
ffffffff7f2371b8 strlen (10000090f, ffffffff7ffff898, ffffffff7f29dbf0, ffffffff7fffefe9, 1, 10000090e) + 18
ffffffff7f2a1b94 printf (100000908, 2000, ffffffff7f3ea224, ffffffff7f3ea228, ffffffff7f3e0000, 4) + e4
0000000100000854 main (1, ffffffff7ffff988, ffffffff7ffff998, 100100d60, 100000000, ffffffff7f400100) + 20
00000001000006e4 _start (0, 0, 0, 0, 0, 0) + 7c

printf 함수에서 스트링 출력을 위해 strlen 함수를 호출하다가 코어가 발생했음을 알 수 있다.

- gdb 사용

이제 gdb를 사용해 보자. 근데 뭔가 이상하다.

# gdb test core
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "sparc-sun-solaris2.10"...
(no debugging symbols found)
Reading symbols from /usr/lib/sparcv9/libc.so.1...(no debugging symbols found)...done.

warning: sol_thread_new_objfile: td_ta_new: Debugger service failed
Loaded symbols for /usr/lib/sparcv9/libc.so.1
Reading symbols from /platform/SUNW,Sun-Fire-V440/lib/sparcv9/libc_psr.so.1...(no debugging symbols found)...done.

warning: sol_thread_new_objfile: td_ta_new: Debugger service failed
Loaded symbols for /platform/SUNW,Sun-Fire-V440/lib/sparcv9/libc_psr.so.1
Reading symbols from /lib/sparcv9/ld.so.1...(no debugging symbols found)...done.

warning: sol_thread_new_objfile: td_ta_new: Debugger service failed
Loaded symbols for /lib/sparcv9/ld.so.1

warning: Couldn't find general-purpose registers in core file.

warning: Wrong size fpregset in core file.

warning: Couldn't find general-purpose registers in core file.

warning: Wrong size fpregset in core file.
#0 0x0000000000000000 in ??
()
(gdb) where
#0 0x0000000000000000 in ?? ()
(gdb)

http://www.sunfreeware.com/에서 배포하는 gdb는 32비트용으로 64를 지원하지 않는다. 그래서 엉뚱한 결과를 얻게 된다. 물론 64비트로 gdb를 컴파일 해서 사용할 수도 있지만, 생각처럼 간단한 작업은 아닌 듯하다. 몇 번 시도해봤지만 번번히 실패했다.

- dbx 사용

dbx는 썬 스튜디오에서 제공하는 소스-레벨 디버깅 툴이다. 자세한 사항은 링크를 참조한다..
기본적으로 사용 법은 gdb와 비슷하다. where 명령으로 어디에서 코어가 발생했는지 확인해 보자.

# dbx test core
For information about new features see `help changes'
To remove this message, put `dbxenv suppress_startup_message 7.6' in your .dbxrc
Reading test
core file header read successfully
Reading ld.so.1
Reading libc.so.1
Reading libc_psr.so.1
program terminated by signal SEGV (no mapping at the fault address)
0xffffffff7f2371b8: strlen+0x0018: ldub [%o2], %o1
(dbx) where
=>[1] strlen(0x1, 0x53, 0x1, 0x0, 0x1, 0x53), at 0xffffffff7f2371b8
[2] _ndoprnt(0x10000090f, 0xffffffff7ffff898, 0xffffffff7f29dbf0, 0xffffffff7fffefe9, 0x1, 0x10000090e), at 0xffffffff7f29f960
[3] printf(0x100000908, 0x2000, 0xffffffff7f3ea224, 0xffffffff7f3ea228, 0xffffffff7f3e0000, 0x4), at 0xffffffff7f2a1b94
[4] main(0x1, 0xffffffff7ffff988, 0xffffffff7ffff998, 0x100100d60, 0x100000000, 0xffffffff7f400100), at 0x100000854
(dbx) quit

gdb를 사용했을 경우와 비슷한 결과를 얻을 수 있다.

한가지 더 재미있는 것은 Sun Studio에 내장된 cc 컴파일러로 컴파일 했을 경우
아래와 같이 보다 정확한 디버깅 정보가 표시된다. 역시 Sun 플랫폼에서는 cc 컴파일러를 써야 하는 것 같다.

# cc -g -m64 test.c -o test
# dbx test core
For information about new features see `help changes'
To remove this message, put `dbxenv suppress_startup_message 7.7' in your .dbxrc
Reading test
core file header read successfully
Reading ld.so.1
Reading libc.so.1
Reading libc_psr.so.1
program terminated by signal SEGV (no mapping at the fault address)
0xffffffff7f2371b8: strlen+0x0018: ldub [%o2], %o1
Current function is main
5 printf("test %s\n", 1);
(dbx) where
[1] strlen(0x1, 0x53, 0x1, 0x0, 0x1, 0x53), at 0xffffffff7f2371b8
[2] _ndoprnt(0x1000008bf, 0xffffffff7ffff248, 0xffffffff7f29dbf0, 0xffffffff7fffe999, 0x1, 0x1000008be), at 0xffffffff7f29f960
[3] printf(0x1000008b8, 0x2000, 0xffffffff7f3ea224, 0xffffffff7f3ea228, 0xffffffff7f3e0000, 0x4), at 0xffffffff7f2a1b94
=>[4] main(), line 5 in "test.c"
(dbx) quit

자세한 사용법은 Sun Studio 11: Debugging a Program With dbx
문서를 참고하기 바란다.

4. 마치며

솔라리스 64비트 환경에서는 기본적으로 Sun studio 에서 제공하는 개발환경을 이용하는 것이 가장 현명할 것 같다. 컴파일러만 제공하는 것이 아니라 MS의 Visual Studio처럼 통합 개발환경을 제공하기 때문이다. 하지만 나와 같이 gcc에 길들여진 개발자가 64비트 환경에서 개발할 때 gdb 대신에 dbx를 사용하는 것만으로도 개발에 큰 도움이 되지 않을까 싶다.

2009년 11월 25일 수요일

엠피온 하이패스 교통정보 이름 짓기 공모


엠피온으로 유명한 서울통신기술(우리 회사입니다 ㅠㅠ, 제가 만드는 건 아니고 옆에서 열심히 만들고 있습니다. ㅋㅋ)이 하이패스 교통정보 이름 공모를 합니다.

현재 경부고속도로 양재~안성, 영동고속도로 신갈~호법 구간에서 시범 운영하고 있으며, 내년 1월부터 전국 고속도로에 이어, 오는 2012년 전국 모든 지역으로 확대 적용된다고 합니다.

실제 써봤는데 뭐 하이패스를 통해 수집한 데이터를 이용하다 보니 오차가 거의 없습니다. 중요한건 공짜인데다 일반 국도까지 확대 적용한다고 하니 기대가 크네요 ㅎㅎ


* 시상내역

구분

내역

시상금/경품

최우수상: 1명

우수상 : 5명

입선 : 10명

-최우수: 200만원

- 우수 : 최고급 엠피온 내비게이션 (모델명: SEN-100)

- 입선 : 최고급 엠피온 하이패스 (모델명: SET-130G)

http://www.mpeon.com 에서 응모할 수 있습니다.

로드 인포, 하이 로드, 엠피로드 ㅋㅋ 이게 제 상상력의 한계인가 봅니다.