2011년 12월 31일 토요일

2011년 12월 13일 화요일

Debian(wheezy)의 Gnome3 기본 테마 adwaita 변경하기

# apt-get dist-upgrade후 gnome3의 기본 테마인 adwaita에 변화가 생겼다. taskbar 의 메뉴의 글자색이 taskbar와 같아져 버려 확인이 불가능하고 풍선 도움말의 글자색도 풍선 도움 바탕색과 같아서 마찬가지로 확인 불가능하다. 이래저래 기본 테마를 변경해야하는 상황이 되어 버렸다. 우선 gnome-look.org에 가서 적당한 gtk3 theme를 다운로드하고 ~/.themes밑에 복사한다.   그리고 테마를 변경하기 위해서 gnome-tweak-tool을 설치하자

# apt-get install gnome-tweak-tool

그럼 taskbar의 프로그램 -> 시스템도구 -> 기본설정 밑에 Tweak Advanced Settings라는 항목이 생긴다. 이를 실행하고 gtk+ 테마와 current theme를 다운로드한 테마로 변경하자.



내가 선택한 테마는 clearwaita-master라는 테마다.

그리고 Gnome Shell titlebar의 테마를 변경하기 위해서 Mutter라는 것을 건들여야한다.  나의 경우는 Gnome Classic으로 사용중이기 때문에 변경 하지 않아도 된다. 하지만 Gnome Classic 버전의 Metacity의 변경을 해주어야한다. 
이와 같이 Mutter와 Metacity를 변경하기 위해선 gconf-editor를 사용해야한다. 설치되지 않았다면 설치하자.

# apt-get install gconf-editor

다음은 Mutter의 테마와 Metacity의 테마를 변경하는 상황이다.



해놓고 확인된 사항이지만 gnome-tweak-tool로 설정해 놓으면 위의 두 사항은 자동으로 설정되는 것 같다. 막상 변경하려고 gconf-editor를 실행 시켜 보았더니 이미 변경되어 있었다.





2011년 12월 12일 월요일

Gnome3 의 바탕화면에서의 아이콘과 마우스 오른쪽 버튼 살리기

# dconf-editor

바탕화면에 아이콘이 보고 싶다면 다음 사항을 체크하고

org -> gnome -> background 밑에 show-desktop-icons [V]



쓰레기통이 보고 싶다면 다음 사항도 체크하자.

org -> nautilus -> desktop밑에 trash-icon-visible [V]


2011년 12월 2일 금요일

Xorg의 touchpad설정하기 (클릭과 스크롤 설정하기)

http://www.reddeadresolve.com/2011/01/configure-synaptic-touchpad-enable.html

2011년 11월 30일 수요일

Debian Wheezy에서 사라졌었던 fglrx-driver와 fglrx-control 다시 깔기


$ sudo apt-get remove --purge xserver-xorg-video-radeon
$ sudo apt-get install fglrx-driver fglrx-control fglrx-glx fglrx-atieventsd fglrx-modules-dkms

그리고

$ sudo aticonfig -initial 로 xorg.conf파일을 /etc/X11밑에 생성 시킨다.

만약 laptop의 경우 dual헤드를 사용하여 모니터를 두 개 사용하고자 한다면

다음과 같은 방식으로 xorg.conf파일을 생성하자.

$ sudo aticonfig --initial=dual-head --screen-layout=right -v

2011년 11월 25일 금요일

새로운 3CCD 영상 분할 프리즘 구조

출처 : http://www.nitto-optical.co.jp/english/products/basic_prism/index.html


참조 : http://ntuzhchen.blogspot.com/2011/01/toshiba-3ccd.html

[번역] Multispectral line-scan imaging system for simultaneous fluorescence and reflectance measurements of apples: multitask apple inspection system

Multispectral line-scan imaging system for simultaneous
fluorescence and reflectance measurements of apples: multitask
apple inspection system

Moon Sung Kim, Kangjin Lee, Kuanglin Chao, Alan M. Lefcourt,
Won Jun, Diane E. Chan

이 방법론적 논문에서는 고속으로 움직이는 물체로부터 다파장 반사및 형광 영상을 동시에 획득할 수 있는 최근 개발된 라인-스캔 방식의 영상 시스템이 소개 한다.

시스템은 다파장 영역의 유동적인 선택으로 사과의 품질과 안정성에 대한 다중 검사 작업을 할 수 있도록 해준다.

상업적인 사과 분류 기계에 장착된 시스템은 초당 3 ~ 4개의 선별 속도에서 사과의 영상 해상도를 결정하도록 개발되었다.

분류 시스템에 적재된 사과들은 약 15cm의 간격을 갖도록 하였다.

이런 인자들을 가지고 결과 영상들은 사과당 40개의 라인스캔 영상들을 보여준다.

수평 방향 해상도는 픽셀당 2mm이고, 수직 방향으로 각 라인 스캔 영상당 1002픽셀이고,

시스템의 공간 해상도는 binning의 선택에 의존하는데 픽셀당 0.2mm 정도이다.

종합적인 공간 해상도는 사과의 표면 오염이나 결함의 온라인 영상 기반 검사에 적합하고 이전의 우리의 연구에 비해서도 구분된다.

Keywords
Online inspection, Multispectral imaging, Imaging system, Fluorescence, Reflectance, Food safety and quality, Apples

2011년 11월 24일 목요일

경향신문 1면 FTA 찬성자 명단


[번역] LINE‐SCAN HYPERSPECTRAL IMAGING PLATFORM FOR AGRO‐FOOD SAFETY AND QUALITY EVALUATION: SYSTEM ENHANCEMENT AND CHARACTERIZATION

LINE‐SCAN HYPERSPECTRAL IMAGING PLATFORM FOR
AGRO‐FOOD SAFETY AND QUALITY EVALUATION:
SYSTEM ENHANCEMENT AND CHARACTERIZATION

M. S. Kim,  K. Chao,  D. E. Chan,  W. Jun,  A. M. Lefcourt,  S. R. Delwiche,  S. Kang, K. Lee

Keywords. Fluorescence, Hyperspectral, Line?scan imaging, Reflectance, Spectral calibration.

라인 스캔방식의 초분광 영상화 기술들은 고속 온라인 응용분야에 대한 단 몇 가지의 파장대에 기반한 고속 다파장 기법 개발에 대한 연구 도구로 자주 제안되어 진다.

지속적인 기술적 발전과 광전자 영상화 소자(optoelectronic imaging sensors)와 파장 영상용 파장 분해 장치(spectral imaging spectrographs)에 대한 좀 더 낳은 접근성, 유용성이 증대 됨에 따라서

초분광 영상 장치의 적용 분야는 식품및 농업 산업에서 품질및 안정성 검사 수요에 걸쳐 확대되어 왔다.

우리는 적은 빛에도 감응도를 갖는 EMCCD를 사용한 초분광 라인 스캔 영상 장치에 기반한 식품 검사 영상 시스템을 계속해서 개발해 왔다.

이 방법론적 기사에서 ARS 초분광 영상 시스템의 가장 최근 세대(가시 및 근적외 파장대 영역 400 - 1000nm에서 반사와 형광 측정이 가능한)의 파장 및 공간적 성능이 평가 되었다.

결과는 시스템의 파장 분해능은 우리의 일반적인 동작 모드 (6 픽셀의 파장 binning)에서 6nm의 FWHM과 FWHM 구간에서 4.4nm의 간격을 보인다.

우리는 A/D 변환의 동적인 범위를 더 활용하기 위해서 파장공간에서의 가중 필터를 사용한 시스템 출력 응답성을 개선하였다.

이러한 시스템 출력 조정으로 표준 방사 반사체의 영역에 대한 근적외선 영역 대에서의 잡음으로 추정되는 지수를 측정한 결과 50%정도의 감소 되었다.

[번역] DETECTION OF ORGANIC RESIDUES ON POULTRY PROCESSING EQUIPMENT SURFACES BY LED‐INDUCED FLUORESCENCE IMAGING

DETECTION OF ORGANIC RESIDUES ON POULTRY PROCESSING
EQUIPMENT SURFACES BY LED‐INDUCED
FLUORESCENCE IMAGING

J. Qin,  K. Chao,  M. S. Kim,  S. Kang,  B.‐K. Cho,  W. Jun

가금류 처리 공장에서 장치 표면에 있는 Organic residues(유기물 찌꺼기)는 교차오염을 유발 시킬 수 있고 소비자에게 안전하지 않은 음식에 대한 위험을 증가 시킨다.

이 연구는 가금류 처리 장비 표면에 있는 유기물 찌꺼기 신속한 검사를 위한 LED로 생성된 형광 영상 기술의 가능성을 조사하는 목적을 가지고 있다.

400nm의 파장대의 출력을 갖는 고출력 파란색 LED가 라인 스캔 방식의 초분광 영상 시스템을 위한 활성화 반응의 광원으로 사용되어 졌다.

지방, 피, (결장, 십이지장, 장)배설물을 포함한 공통적인 닭의 찌꺼기 표본들은 스테인레스 철판에 준비하였다.

형광 방출 영상들은 500에서 700nm의 파장대에서 각 찌꺼기의 종류별 20개씩 총 120개의 표본의 영상이다.

실험에 사용된 표본의 LED광원 형광 특성들이 판정 되었다.

주성분 분석(PCA)은 형광 스펙트럼 데이터를 분석에 사용되었다.

두 개의 SIMCA 모델들이 유기물 찌꺼기와 스테인레스 표본을 구분하는데 개발되었다.

유기물 찌꺼기와 스테인레스 강의 2 부류와 스테인레스강, 지방, 피, 배설물등의 4부류에 대한 SIMCA 모델의 분류 정확도는 각각 100%와 97.5%였다.

666nm로 선택된 파장대를 이용한 최적 단일 밴드 접근은 닭의 피 검사에 있어서 false negative errors를 생성할 수 있었다.

503과 666nm의 파장대를 이용한 두 파장의 비율(F503/F666) 영상은 스테인레스 강 표면에 다양한 닭 찌꺼지를 검출하는데 가능성을 보인다.

이 파장대 조합은 가금류 처리 장치 표면 검사를 위해서 LED 기반의 휴대용 형광 영상화 장치 개발에 적용 될 수 있다.

keywords. Food safety, Sanitation monitoring, Hyperspectral imaging, Fluorescence, LED, Poultry.

2011년 11월 21일 월요일

한글 번역 참조

HowTO :  도움글
Residues : 찌꺼기
Optoelectronic Imaging Sensors: 광전자 영상화 소자
Spectral Imaging Spectrographs: 파장 영상용 파장 분해 장치
Push Broom :  밀대
KnowHow: 비법
Threshold Value: 문턱값

2011년 11월 20일 일요일

ASUS 1215T 여러가지 문제점들

전에는 touchpad 동작에 문제가 많아 분해하는 과정에서 유격이 발생하고 몇몇 힌지가 부러져 버렸다. 문제 해결은 touchpad의 금박에 접촉되는 두개의 패드만 제거 하면 되었다.
그리고 그 이후 데비안에서 xorg.conf를 변경하고 테스트 하던중 마우스가 혼자서 춤을 추길래 재부팅을 하였다. 화면이 나오질 않았다. 부팅과정은 외장 모니터를 연결해본 결과 정상적으로 동작하는 것을 확인 할 수 있었다. 우선 변경하였던 Xorg.conf를 원상 복구하고 외장 모니터를 연결해서 원상 복구 시켰다. 하지만, 노트북 lcd는 복구 불가능 한 것 같아 보였다. ASUS A/S에 갔다 첫날엔 부품 없다고 다음날 오라는 통보를 받았다. 다음날 갔다. 1시간 이상 걸린것 같다. 엔지니어 분도 미안했는지 LCD 연결 케이블 까지 같이 갈아 드리려다 보니 시간이 지체되었다고 하시며 교체한 케이블도 보여주었다. 우선은 잘 동작하는 것 같아 만족스럽게 가지고 왔다.

몇일 사용하던중 노트북 Lid "closed"가 동작하지 않는 것을 발견하였다. 뚜껑이 닫혀도 화면은 여전히 밝게 나오고 있었다. 우선은 ACPI의 동작을 의심해 보았다. 코딩으로 LID의 동작을 모니터링 해 보았다.


#include

void main(void)
{
char state[80];

FILE *fd;

while (1) {
fd = fopen("/proc/acpi/button/lid/LID/state", "r");
fgets(state, 80, fd);
printf("%s", state);
fclose(fd);
sleep(1);
}
}


위와 같이 코딩하고 다음과 같이 컴파일하고 실행 하였다.

# gcc test_lid.c

# ./a.out

그리고 뚜껑을 닫아 보았다. 여전히  "state: open"이라는 메시지만 나온다.
하드웨어 적인 문제로 의심을 확정하게 되었다. 우선 뚜껑 주변에 스위치를 찾아 보았다.
어디에도 뚜껑이 닫히는 것을 감지할만한 스위치는 없었다. 검색해 보니 LCD하단에 자석이 있어야 동작을 한단다. 

출처: http://www.insidemylaptop.com/images/Asus-Eee-PC-1201n-screen/replace-damaged-laptop-screen-11.jpg

위 그림의 노란색 화살표가 바로 뚜껑이 동작하게 해주는 자석이다. 뜯어 보니 자석인 사진의 위치보다 한참 위에 있었다. A/S기사의 실수 였다. 핀셋으로 위치를 내렸지만 볼트 머리때문에 사진의 위치까지는 내려가지 않았다. 하지만, 동작은 하였다. 그냥 덥었다. 하도 뜯었다 조립했다를 반복했더니 유격이 있다. 에휴,. 깨끗하게 쓰고 싶었는데 걸래가 되었다. 

2011년 11월 14일 월요일

이질적인 우분투 11.10의 가장먼저 설치할 것들

# sudo apt-get install gnome-session-fallback gnome-tweak-tool

로그인시 그놈 클래식으로 선택하고 gnome-tweak-tool에서 눈 안아픈 테마를 설치하자

추천하는 테마는 adwait-white 인가하는 것이다.

2011년 11월 4일 금요일

막가파 불도저의 무의식이란 ?

무의식이란 단어의 의미는 의식이 없다는 뜻이다.

이 말은 본질적으로 잘못된 말이다.

굳이 이야기 하자면 자각과 무자각의 대립상태를 말하는 것이다.

이러한 무의식의 개념은 프로이드가 많이 연구하였다.

하지만 여기서 이야기하고자 하는 내용은

에리히 프롬의 무의식에 대한 재해석을 기반으로 한다.

나의 경험이다

커다란 일을 시작하다 보면 초반에 여러가지의 문제에 봉착하기도 하고

이 일의 당위성에 위배되는 많은 일들을 겪게 된다.

그래서 아주 짜증나고 골치아픈 일이지만

그러한 일들을 피해갈 수 있는 길들을 고려하면서 일을 진행한다.

그렇게 시간이 지나고 일이 끝날때 쯤 생각을 정리해 보면

위와 같은 일들은 까맣게 잃어 버리고 있었던 나를 발견한다.

싫은 일은 보지 않고 넘어간다는 인간의 능력,

즉 인간은 인식하려고하면 인식할 수 있는 일을

진지한 얼굴로 부정하는 경우도 있다는 사실을 잊었던 것이다.
(H.S. 설리번은 이현상을 매우 훌룡히 표현하여 '선택적 부주의'라는 술어를 만들었다.)

나의 경우는 일을 깔끔하고 추진력있게 진행해야한다는 압박 때문에

이러한 선택적 부주의가 작동한 것같다.

지금에와서 자각해 버렸지만, 지나온 일들은 우려하는 목소리를 전혀 듣지 않았다.

그져 미안한 마음뿐이다. 정말 악의적이지는 않았다.

우리의 가카도 이와 같지 않았나 하는 추정을 해본다.

처음에 반대의 목소리를 귀기울여 듣겠다고 명심했지만,

꼭 임기 중에 해치워야 하는데 하는 압박감이

'선택적 부주의'라는 매카니즘을 작동 시켰다고.

그래서 '유체이탈 화법'은 의도적인 것이 아닌것이다.

그러한 면에서 나도 조심해야 하겠다고 생각한다.

반대의 목소리를 선택적으로 부주의하게 하지 않도록....

하지만, 우리나라에서 성공했다는 그 많은 사람들은

알게 모르게 위와 같은 '선택적 부주의' 매카니즘을 효율적으로 사용하였다.

사실인지 모르겠지만 공식적으로 이야기 한다.

반대의 안된다는 목소리는 신경쓰지 않았다고.

뭐 하고 싶은 일이고 당위성이 있었다면 문제가 없는 건가 ?

왜 국가는 왜 주식시장에 민감한가 ?

실업율보다 더
물가 보다 더
양극화 지수보다 더
주택비용보다 더
빈민층의 비율 보다 더

신경쓰는 것 같다.

반대로 생각해야 하는게 맞는거 아닌가.

Enable MSN, yahoo, etc in Empathy (gnome default messenger)

# apt-get install telepathy-haze

2011년 11월 3일 목요일

Install Mobile Atlas Creator on Debian

Mobile Atlas Creator is  offline atlases for GPS handhelds and cell phone applications.

Installation
# su
# apt-get install mobile-atlas-creator

Execution
# su
# mobile-atlas-creator


2011년 11월 1일 화요일

EEEPC(1215t) hang on with Caplock led blinking in Debian Wheezy.

This symptom is because of kernel panic crashing with wireless module.

# lspci
...

02:00.0 Network controller: Broadcom Corporation BCM4313 802.11b/g/n Wireless LAN Controller (rev 01)
...

As you can see, my wireless card is named as "BCM4313 802.11b/g/n Wireless LAN".

Googling provides that it is necessary to upgrade linux-kernel as 3.0.x.

2011년 10월 29일 토요일

자전거란?

나의 경우 자전거를 사용하게된 계기는

내가 생활하는 영역안에서 조금이나마 자동차의 사용을 줄이려는 목적에 의해서 였다.

다른 사람들도 이와 크게 다르지 않을 것이라 생각한다.

등교 길에서 출퇴근 길에서 자전거 도로가 구비 되고 환경이 갖추어진다면 좋다.

그런 의미에서 "MB의 자전거 길이란 ?"

주말에 잠시 자전거를 타기 위해서 만든

마치 놀이 공원에 가서 자전거를 잠시 타고온 듯한 효과를 노려

놀이 공원이 아주 친환경적인 듯한 착각을 불러 잃으키게 만드는

자전거의 용도를 오직 레져로서만 바라본

극히 끼워 맞춘듯한 그 많은 공사에 대한 변명거리의 용도로 밖에 볼 수 없다.

이와 같은 예는 얼마든지 찾아 볼 수 있다.

핵연료가 단지 이산화탄소만 배출하지 않는 다는 이유로

폐기물 처리에 들어가는 환경적인 피해나 관리 비용에 대한 언급은 없이

친환경 에너지라고 선전하는 것이라던가.

수소에너지에 대한 선전을 위해서 항상 예를 들던 맹물 자동차에 대한 허풍이라던가.

물에서 수소를 분리해내기 위해선

얼마나 많은 양의 석유로 발전된 전기로 분해내야 한다는 것은 전혀 고려하지 않는다.

이런식이다. 항상.

2011년 10월 26일 수요일

After removing AMD/ATI Catalyst radeon driver, experimental trials for fixing problems드라이버의 문제해결을 위한 혹시나 하는 재설정

# apt-get update

# apt-get install --reinstall libgl1-mesa-glx libgl1-mesa-dri <--- libGL.so + mesa3d DRI drivers

# apt-get install --reinstall xserver-xorg-core <--- libglx.so of xserver


# apt-get build-dep libdrm                 <--- Userspace interface to kernel DRM services (development files, radeon-specific, etc.)

# apt-get build-dep mesa                   <--- A free implementation of the OpenGL API (DRI modules, GLX runtime, GLX development files, etc.)

# apt-get build-dep xserver-xorg-video-ati <--- X.Org X server -- AMD/ATI display driver

# apt-get build-dep xorg-server            <--- Xorg X server (core server, development files, etc.)

Reference

http://www.x.org/wiki/radeonBuildHowTo#Removing_AMD.2BAC8-ATI_catalyst.2BAC8-fglrx_driver_.28closed_source.29

ATI radeon 비디오 카드를 위한 Kernel ModeSetting (KMS) 비활성화 하기

부팅시 "nomodeset"를 설정해서 시스템을 가동하고
/etc/modprobe.d/radeon-kms.conf를 편집한다.
"options radeon modeset=0"

Debian Wheezy(7.0) 에서 suspend 동작 살펴보기(debugging 하기)

[출처] http://wiki.debian.org/Suspend

Wheezy는 아직도 testing 상태에 있다. 그레서 그 구성은 언제든지 갑자기 변경될 수 있다.

가장 주목할 만한 변화는 HAL 패키지가 단계적으로 배제된다는 것이다. 여러분이 아직도 HAL 패키지가 설치된 상태로 있다면, 제거해야 합니다. 그렇지 않으면 suspend상태 동안에 pm-utils과 충돌하게 될 겁니다.

suspend / resume 이 여러분의 시스템에서 잘 동작한다면, 여러분은 다행이도 이 페이지의 어떤 것도 읽을 것이 없습니다. 그렇지 않다면 맨 먼저 debug 해야 할 것은suspend와 resume을 제어하는 pm-utils의 debug를 활성화 하는 것이다.

pm-utils의 debug를 활성화 하기
suspend와 resume process의 동작 기록은 /var/log/pm-suspend.log 파일에 있다. 이것은 초기설정으로 절제된 동작 정보를 가지고 있다. 더 많은 정보는 /usr/lib/pm-utils/pm-functions 파일의 앞부분에 "export PM_DEBUG=true"를 추가해서 활성화된 debug를 통해서 활성화 된다.

resume시 오류가 있는 video화면 고치기
컴퓨터가 resume 후에 생기는 가장 공통적인 문제는 오류가 있는 video나 검은 화면, 백라이트가 없는 LCD화면이 나타나는 것이다. 먼저 점검해 봐야 할 점은 시스템이 여전히 동작하는지 확인해 보는 것이다. 이건 "Capslock"버튼을 눌러서 간단히 확인해 볼 수 있다. Capslock LED가 적절히 변화는지를 점검하면 된다. 시스템이 여전히 동작한다면, 대부분의 경우 여러분의 비디오 카드를 위한 "video quirk"를 추가하는 것이 필요하다.

Debian은 현재 Intel, nVidia와 ATI 비디오 카드에 대해서 초기적으로 활성화된 kernel mode setting(KMS)을 가지고 있다. 그러나 pm-utils의 video quirk는 KMS를 이미 지원하고 있다. 그래서 대부분의 경우 여러분은 KMS를 먼저 비활성화하는 시도를 해야한다. 여러분의 특정 비디오 카드에 대한 세세한 내용은 온라인을 검색해서 쉽게 찾아 볼 수 있다.

KMS를 비활성화한 후에도 resume후 video에 여전히 오류가 있다면, 여러분은 어떤 video quirk를 사용함으로써 시스템이 suspend하도록 시도할 수 있다. 모든 사용 가능한 quirk의 자세한 설명은 pm-suspend 프로그램의 manpage를 읽어라. 그리고 명령행에서 그들의 조합을 시도하라. 여러분이 성공적으로 시스템에서 잘 동작하는 quirk의 조합을 찾았다면, 영구적으로 동작하도록 /usr/lib/pm-utils/video-quirks에 추가 할 수 있다. 그리고 동시에 많은 사람들에게 도움이 될 수 있도록 여러분의 변경사항에 대한 patch로 pm-utils 패키지의 bug 파일에 도움을 달라.

Debian의 예전 버전에서 upgrade된 시스템에서 생기는 공통된 문제점은 suspend동안 시스템을 멈추어 버리게 하는 quirk-s3-bios의 활성화 되는 것이다. 여러분의 시스템이 suspend동안 멈추어 버린다면, debug를 활성화 한후에 pm-suspend.log 파일을 주의 깊게 점검하자. 그리고 quirk-s3-bios를 사용하지 않는지를 확인하도록 하자.


10.26. 투표 안내문 없이 투표장 찾기

마이크로 소프트 사의 인터넷 익스플로에서

http://www.nec.go.kr/

위의 주소로 이동한다.

다음과 같은 화면에서 빨간 네모의 "내 투표소 찾기"를 선택한다.


내 거주 지역의 주소와 이름 주민번호를 입력하면 해당 투표소의 주소와 지도를볼수 있다.

2011년 10월 19일 수요일

Orthogonal Partial Least Squares Calibration

* Expression of matrix

 (MATRIX:[n x m]) ; n is the number of rows and m is the number of columns.

* Expression of column vector

 (MATRIX)(j,*) ;  j-th column vector of MATRIX

* Expression of row vector

 (MATRIX)(*,i) ; i-th row vector of MATRIX

* Operation for matrix

 (MATRIX)' ; transpose of Matrix
 (MATRIX)^(-1) ; inverse matrix

* Algorithm

Inputs

 n ; the number of samples
 m ; the number of dimension of independent value
 (X:[n x m]) ; independent values
 (y:[n x 1]) ; dependent values
 interation ; the number of iteration for calibration

Step 1.

Mean centering
(mx:[1 x m]) ; Mean of (X:[n x m])(*,i) for i = 0 ... n-1
(X_{0}:[n x m])(*,i) = (X:[n x m])(*,i) - (mx:[1 x m]) for i = 0 ... n-1

Step 2.

Loading Weight
(w_{a}:[m x 1]) = (X_{a-1}:[n x m])' * (y_{a-1}:[n x 1]) /
                         sqrt((y_{a-1}:[n x 1])' * (X_{a-1}:[n x m]) * (X_{a-1}:[n x m])' * (y_{a-1}:[n x 1]))

Step 3.

Scoring
(t_{a}:[n x 1]) = (X_{a-1}:[n x m]) * (w_{a}:[m x 1])

Step 4.
Spectral Loading
(p_{a}:[m x 1]) = (X_{a-1}:[n x m])' * (t_{a}:[n x 1]) / ((t_{a}:[n x 1])' * (t_{a}:[n x 1]))

Step 5.

Chemical Loading
(q_{a}:[1 x 1]) = (y_{a-1}:[n x 1])' * (t_{a}:[n x 1]) / ((t_{a}:[n x 1])' * (t_{a}:[n x 1]))

Step 6.

Updating
(X_{a}:[n x m]) = (X_{a-1}:[n x m]) - (t_{a}:[n x 1]) * (p_{a}:[m x 1])'
(y_{a}:[n x 1]) = (y_{a-1}:[n x 1]) - (t_{a}:[n x 1]) * (q_{a}:[1 x 1])
a = a + 1

Step 7.

Until 'a' is equal to "iteration" repeat Step 2, 3, 4, 5, and 6.

Step 8.

(b:[m x 1]) = (W:[m x iteration]) * ((P:[m x iteration])' * (W:[m x iteration]))^(-1) * (Q:[iteration x 1])
(b0:[1 x 1]) = (my:[1 x 1]) - (mx:[1 x m]) * (b:[m x 1])

where

(W:[m x iteration])(a,*) = (w_{a}:[m x 1])
(P:[m x iteration])(a, *) = (p_{a}:[m x 1])
(Q:[iteration x 1])(a, *) = (q_{a}:[1 x 1])
(my:[1 x 1]) ; Mean of (y:[m x 1])(0,i) for i = 0 ... n-1

* Prediction

(y^:[1 x 1]) = (b0:[1 x 1]) + (x:[1 x m]) * (b:[m x 1])

2011년 10월 18일 화요일

Debian Wheezy(7.0)의 repository에서 사라진 fglrx-driver, fglrx-control ???

여느날과 다름없이 업데이트 알림에 대해 의심없이 찬성을 했다가 다음 부팅시 Xorg 작동이 멈추어서 터미널로 로그인하게 되었다. 우선 /etc/X11/xorg.conf를 지우고 부팅하면 작동은 되었다만 여간 답답한게 아니다. 동영상도 느리고 화면 반응도 답답하다. 찾아 본 봐 AMD proprierty 드라이버가 충돌이 잃어난다는 보고에 패키지가 내려갔다고 한다. 그 동안은 xorg-server-radeon으로 버텨야 해야한다. http://web.archiveorange.com/archive/v/rzXEMJaA6QnUnWIezYjn 에서 알 수 있듯이 fglrx-driver 11-10이 나온후 packaging과 migration 을 거친후 11월 중순에나 만나 볼 수 있겠다고 한다.

2011년 10월 7일 금요일

MingW + GIT + Emacs

Previous post mentioned about the installation of MingW.
And I add further setting to use Emacs;


To use git tool with MingW in windows XP I installed windows-ported version.

http://code.google.com/p/msysgit/




Then there are two the same shell commanders; Git Bash and Msys Bash contained in MingW package.
I would like to use Git under Msys Bash. However, in Msys Bash I can't access Git binary.
So, I need the below procedure.

1. Create .profile file in your home directory


After installation of Msys, set up your .profile something like this.
Create a .profile file in your home directory

Put the content needed into it. An example might be:

#!/bin/sh.exe
#
# Get the aliases and functions
#
if [ -f ${HOME}/.bashrc ]
then
  . ${HOME}/.bashrc
fi

export CVS_RSH="ssh"
export EDITOR="/usr/bin/vim"
export HISTSIZE="500"
export PATH="/c/emacs-23.3/bin:/c/Program\ Files/Git/bin:${HOME}/bin:${PATH}"

2. Create a .bashrc file in your home directory :

Put the content needed into it. An example might be:

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]
then
  . /etc/bashrc
fi

# User specific aliases and functions
#

Close and restart the MSYS Shell.

2011년 9월 26일 월요일

Install MingW and SDL.

* Goto http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get/


* Download mingw-get-inst-xxxxxx.exe

* Execute MingW Shell




* Execute "mingw-get update" and "mingw-get upgrade"


* Download SDL-X.X.X-win32.zip under Win32 of Runtime Libraries and SDL-devel-X.X.X-mingw32.tar.gz under Win32 of Development Libraries.


* Extract SDL-devel-X.X.X-win32.zip.
* Copy libSDLmain.a, libSDL.la, and libSDL.dll.a into into $(MingW Directory)/lib/*.a.
* Copy include/SDL/* into $(MingW Directory)/include/SDL.
* Copy bin/SDL.dll and bin/sdl-config into $(MingW Directory)/bin.


2011년 9월 25일 일요일

Using delaunay trianglulation, thinning of a mass object.

Thinning algorithm based on morphology operation is not adopted for a mass object on image. It needs too many operations. To down-size a processing time one of the other methods is based on delaunay triangulation.


For a triangle having a edge in outside of a mass object, it is out of consideration.


Blue-colored triangles are out of consideration. And then it needs analysis the relationship of connectivity between triangles. A few definitions are enlisted. the End Triangle is defined as two edges of triangle meet outside of mass object, the Edge Triangle is defined as one edge of triangle meets outside of mass object, and the Branch Triangle is defined as none edge of triangle meets outside of mass object.



Blue-colored triangle indicates a End Triangle, Green-colored triangle indicates a Edge Triangle, and red-colored triangle indicates a Branch Triangle. According to connectivity among three types of triangles, the center of innercircle of End and Branch Triangle forms thinning lines.








2011년 9월 22일 목요일

Fixing delaunay triangulation

During delaunay triangulation unexpacted line crossing is performed.
Given points are like this.



And Its result is


Its code is


void delaunay_list_create_2d_network(delaunay_list_t *list, point_list_t *points, bitmap_t *roi)
{
  dlink_t *x, *y, *z;
  point_t *o, *a, *b, *c;
  point_t *v1, *v2, *v3, *org;
  delaunay_net_t *neta, *netb, *netc, *net;
  //dlist_t *triangles;
  triangle_list_t *triangles;
  triangle_t *tri;
  //dlist_t *lines;
  line_list_t *lines;
  line_t *line, *l;
  real_t da, db, dc, s;
  real_t val, vmin;
  real_t radius, area;

  assert(list);
  assert(points);

  // allocate delaunay network list
  //list = delaunay_list_new();
  for (x = points->tail->next; x != points->head; x = x->next) {
    net = delaunay_net_new((point_t *)x->object);
    delaunay_list_insert(net, list);
  }

  // starting point
  neta = delaunay_list_get_net(0, list);
  a = delaunay_net_get_coordinate(neta);
  // find minimum distance between points
  for (netb = NULL, x = list->tail->next->next; x != list->head; x = x->next) {
    net = (delaunay_net_t *)x->object;
    o = delaunay_net_get_coordinate(net);
    val = distance_between_points(a, o);
    if (val < REAL_EPSILON) continue;
    if (netb == NULL || val < vmin) { netb = net; vmin = val; }
  }

  b = delaunay_net_get_coordinate(netb);
  // find minimum radius of circumscribed circle for triangle
  for (netc = NULL, x = list->tail->next->next; x != list->head; x = x->next) {
    net = (delaunay_net_t *)x->object;
    if (net == netb) continue;
    o = delaunay_net_get_coordinate(net);
    // Heron's formula to find the area formed by three points
    da = distance_between_points(a, b);
    db = distance_between_points(b, o);
    dc = distance_between_points(o, a);
    s = (da + db + dc) / 2;
    area = sqrt(s * (s - da) * (s - db) * (s - dc));
    if (area < REAL_EPSILON) continue;
    // calculate radius of circumscribed circle for triangle
    radius = (da * db * dc) / (4 * area);
    if (netc == NULL || radius < vmin) { netc = net; vmin = radius; }
  }
  c = delaunay_net_get_coordinate(netc);

  v1 = point_new();
  v2 = point_new();
  v3 = point_new();
  org = point_new();

  // re-ordering
  point_subtract(v1, b, a);
  point_subtract(v2, c, a);
  point_xproduct(v3, v1, v2);
  if (v3->z > 0) { // counterclockwise following a to b to c ?
    net = netb, netb = netc, netc = net;
    o = b, b = c, c = o;
  }

  // connect delaunay network
  delaunay_net_connect(neta, netb);
  delaunay_net_connect(netb, netc);
  delaunay_net_connect(netc, neta);

  // Synthesize a triangle and insert it.
  //triangles = dlist_new();
  triangles = triangle_list_new();
  tri = triangle_new_and_assign(a, b, c);
  triangle_list_insert(tri, triangles);

  //triangle_dump(tri);
  // Synthesize three line and insert it.
  lines = line_list_new();
  line = line_new_and_assign(a, b);
  line_list_insert(line, lines);
  line = line_new_and_assign(b, c);
  line_list_insert(line, lines);
  line = line_new_and_assign(c, a);
  line_list_insert(line, lines);

  // main routine
  for (x = lines->tail->next; x != lines->head; x = x->next) {
    line = (line_t *)x->object;
    //line_dump(line);
    for (y = list->tail->next; y != list->head; y = y->next) {
      netc = (delaunay_net_t *)y->object;
      c = delaunay_net_get_coordinate(netc);
      if (point_cmp(c, line->a) == 0 || point_cmp(c, line->b) == 0)
continue;
      // counter-clockwise rotation of the triangle formed by a, b, and c
      point_subtract(v1, line->b, line->a);
      point_subtract(v2, c, line->a);
      point_xproduct(v3, v1, v2);
      if (v3->z < REAL_EPSILON) continue;
      // Does the triangle exist in the pool of delaunay triangles before ?
      tri = triangle_new_and_assign(line->a, c, line->b);
      //if (is_triangle_in_list(tri, triangles)) {
      if (triangle_list_query(tri, triangles) >= 0) {
triangle_destroy(tri);
tri = NULL;
continue;
      }
      // Does the unique triangle form the delaunay triangle ?
      radius = triangle_circumcircle(org, tri);
      for (z = list->tail->next; z != list->head; z = z->next) {
net = (delaunay_net_t *)z->object;
o = delaunay_net_get_coordinate(net);
if (point_cmp(o, line->a) == 0 ||
   point_cmp(o, line->b) == 0 ||
   point_cmp(o, c) == 0)
 continue;
if (distance_between_points(o, org) < radius) {
 triangle_destroy(tri);
 tri = NULL;
 break;
}
      }

      if (tri) {
/* put the trinangle into triangle's list,
* establish connection between delaunay networks, and
* allocate and put two lines into line's list */
triangle_list_insert(tri, triangles);
l = line_new_and_assign(line->a, c);
if (line_list_query(l, lines) < 0) {
 line_list_insert(l, lines);
 for (z = list->tail->next; z != list->head; z = z->next) {
   net = (delaunay_net_t *)z->object;
   o = delaunay_net_get_coordinate(net);
   if (point_cmp(o, line->a) == 0) {
     delaunay_net_connect(netc, net);
     break;
   }
 }
} else line_destroy(l);

l = line_new_and_assign(c, line->b);
if (line_list_query(l, lines) < 0) {
 line_list_insert(l, lines);
 for (z = list->tail->next; z != list->head; z = z->next) {
   net = (delaunay_net_t *)z->object;
   o = delaunay_net_get_coordinate(net);
   if (point_cmp(o, line->b) == 0) {
     delaunay_net_connect(netc, net);
     break;
   }
 }
} else line_destroy(l);
break;
      }
    }
  }

  // de-allocation lines and triangles
  /*
  while (triangles->count) {
    tri = triangle_list_pop(triangles);
    //triangle_dump(tri);
    triangle_destroy(tri);
  }
  triangle_list_destroy(triangles);
  */
  list->head->object = (void *)triangles;

  while (lines->count) {
    line = line_list_pop(lines);
    //line_dump(line);
    line_destroy(line);
  }
  line_list_destroy(lines);

  point_destroy(v1);
  point_destroy(v2);
  point_destroy(v3);
  point_destroy(org);

  //  return list;
}


Its reason is because of four points on the same circle. Delaunay Triangulation is determined by whether there is a point in circumference circle, but for this four points it is impossible to construct the unique delaunay triangulation.


The triangle with red color has properties like this;
three vertex: (333, 311), (333, 183), (308, 315)
center of circumference circle: (309.94, 247)
radius of circumference circle: 68.027688

The triangle with blue color has properties like this;
three vertex: (308, 315), (333, 311), (308, 179)
center of circumference circle: (309.94, 247)
radius of circumference circle: 68.027688

In this case it is necessary that additional algorithm is to avoid a crossing between lines.

The subroutine to detect whether two lines has intersecting point or not. It is referenced at http://paulbourke.net/geometry/lineline2d/


int intersect_point_between_lines(point_t *p, line_t *l, line_t *m)
{
  real_t denom, ua, ub;

  assert(p);
  assert(l);
  assert(m);

  // Pl = l->a + Ua * (l->b - l->a)
  // Pm = m->a + Ub * (m->b - m->a)
  // for Pl = Pm
  denom = (m->b->y - m->a->y) * (l->b->x - l->a->x) - (m->b->x - m->a->x) * (l->b->y - l->a->y);
  ua = (m->b->x - m->a->x) * (l->a->y - m->a->y) - (m->b->y - m->a->y) * (l->a->x - m->a->x);
  ub = (l->b->x - l->a->x) * (l->a->y - m->a->y) - (l->b->y - l->a->y) * (l->a->x - m->a->x);

  if (abs(denom) < REAL_EPSILON) {
    if (abs(ua) < REAL_EPSILON && abs(ub) < REAL_EPSILON)
      return 0; // COINCIDENT
    return -1; // PARALLEL
  }

  ua = ua / denom;
  ub = ub / denom;

  if (ua < 0 || ua > 1 || ub < 0  || ub > 1)
    return -2; // Not intersecting

  p->x = l->a->x + ua * (l->b->x - l->a->x);
  p->y = l->a->y + ua * (l->b->y - l->a->y);

  if ((abs(ua) < REAL_EPSILON || abs(ua - 1.0) < REAL_EPSILON) ||
      (abs(ub) < REAL_EPSILON || abs(ub - 1.0) < REAL_EPSILON))
    return 2; // ENDPOINT

  return 1; // INTERSECTING
}

And the code of modified delaunay triangulation is here.

void delaunay_list_create_2d_network(delaunay_list_t *list, point_list_t *points, bitmap_t *roi)
{
  dlink_t *x, *y, *z;
  point_t *o, *a, *b, *c;
  point_t *v1, *v2, *v3, *org;
  delaunay_net_t *neta, *netb, *netc, *net;
  //dlist_t *triangles;
  triangle_list_t *triangles;
  triangle_t *tri;
  //dlist_t *lines;
  line_list_t *lines;
  line_t *line, *l, *m;
  real_t da, db, dc, s;
  real_t val, vmin;
  real_t radius, area;

  assert(list);
  assert(points);

  // allocate delaunay network list
  //list = delaunay_list_new();
  for (x = points->tail->next; x != points->head; x = x->next) {
    net = delaunay_net_new((point_t *)x->object);
    delaunay_list_insert(net, list);
  }

  // starting point
  neta = delaunay_list_get_net(0, list);
  a = delaunay_net_get_coordinate(neta);
  // find minimum distance between points 
  for (netb = NULL, x = list->tail->next->next; x != list->head; x = x->next) {
    net = (delaunay_net_t *)x->object;
    o = delaunay_net_get_coordinate(net);
    val = distance_between_points(a, o);
    if (val < REAL_EPSILON) continue;
    if (netb == NULL || val < vmin) { netb = net; vmin = val; }
  }

  b = delaunay_net_get_coordinate(netb);
  // find minimum radius of circumscribed circle for triangle
  for (netc = NULL, x = list->tail->next->next; x != list->head; x = x->next) {
    net = (delaunay_net_t *)x->object;
    if (net == netb) continue;
    o = delaunay_net_get_coordinate(net);
    // Heron's formula to find the area formed by three points
    da = distance_between_points(a, b);
    db = distance_between_points(b, o);
    dc = distance_between_points(o, a);
    s = (da + db + dc) / 2;
    area = sqrt(s * (s - da) * (s - db) * (s - dc));
    if (area < REAL_EPSILON) continue;
    // calculate radius of circumscribed circle for triangle
    radius = (da * db * dc) / (4 * area);
    if (netc == NULL || radius < vmin) { netc = net; vmin = radius; }
  }
  c = delaunay_net_get_coordinate(netc);

  v1 = point_new();
  v2 = point_new();
  v3 = point_new();
  org = point_new();

  // re-ordering
  point_subtract(v1, b, a);
  point_subtract(v2, c, a);
  point_xproduct(v3, v1, v2);
  if (v3->z > 0) { // counterclockwise following a to b to c ?
    net = netb, netb = netc, netc = net;
    o = b, b = c, c = o;
  }

  // connect delaunay network
  delaunay_net_connect(neta, netb);
  delaunay_net_connect(netb, netc);
  delaunay_net_connect(netc, neta);

  // Synthesize a triangle and insert it.
  //triangles = dlist_new();
  triangles = triangle_list_new();
  tri = triangle_new_and_assign(a, b, c);
  triangle_list_insert(tri, triangles);

  //triangle_dump(tri);
  // Synthesize three line and insert it.
  lines = line_list_new();
  line = line_new_and_assign(a, b);
  line_list_insert(line, lines);
  line = line_new_and_assign(b, c);
  line_list_insert(line, lines);
  line = line_new_and_assign(c, a);
  line_list_insert(line, lines);

  // main routine
  for (x = lines->tail->next; x != lines->head; x = x->next) {
    line = (line_t *)x->object;
    //line_dump(line);
    for (y = list->tail->next; y != list->head; y = y->next) {
      netc = (delaunay_net_t *)y->object;
      c = delaunay_net_get_coordinate(netc);
      if (point_cmp(c, line->a) == 0 || point_cmp(c, line->b) == 0)
continue;
      // counter-clockwise rotation of the triangle formed by a, b, and c
      point_subtract(v1, line->b, line->a);
      point_subtract(v2, c, line->a);
      point_xproduct(v3, v1, v2);
      if (v3->z < REAL_EPSILON) continue;
      // Does any line crossing with line in the line list ?
      l = line_new_and_assign(line->a, c);
      m = line_new_and_assign(c, line->b);
      for (z = lines->tail->next; z != lines->head; z = z->next) {
// Is there an intersecting ?
if ((intersect_point_between_lines(v3, l, (line_t *)z->object) == 1) ||
   (intersect_point_between_lines(v3, m, (line_t *)z->object) == 1)) {
 line_destroy(l); l = NULL;
 line_destroy(m); m = NULL;
 break;
}
      }
      if (l == NULL && m == NULL) continue;

      // Does the triangle exist in the pool of delaunay triangles before ?
      tri = triangle_new_and_assign(line->a, c, line->b);
      //if (is_triangle_in_list(tri, triangles)) {
      if (triangle_list_query(tri, triangles) >= 0) {
triangle_destroy(tri);
tri = NULL;
continue;
      }
      // Does the unique triangle form the delaunay triangle ?
      radius = triangle_circumcircle(org, tri);
      for (z = list->tail->next; z != list->head; z = z->next) {
net = (delaunay_net_t *)z->object;
o = delaunay_net_get_coordinate(net);
if (point_cmp(o, line->a) == 0 ||
   point_cmp(o, line->b) == 0 ||
   point_cmp(o, c) == 0)
 continue;
if (distance_between_points(o, org) < radius) {
 triangle_destroy(tri);
 tri = NULL;
 break;
}
      }

      if (tri) {
/* put the trinangle into triangle's list, 
* establish connection between delaunay networks, and
* allocate and put two lines into line's list */
triangle_list_insert(tri, triangles);
//triangle_dump(tri);
//point_dump(org);
//printf("radius: %lf\n", radius);
//l = line_new_and_assign(line->a, c);
if (line_list_query(l, lines) < 0) {
 line_list_insert(l, lines);
 //line_dump(l);
 for (z = list->tail->next; z != list->head; z = z->next) {
   net = (delaunay_net_t *)z->object;
   o = delaunay_net_get_coordinate(net);
   if (point_cmp(o, line->a) == 0) {
     delaunay_net_connect(netc, net);
     break;
   }
 }
} else line_destroy(l);
//m = line_new_and_assign(c, line->b);
if (line_list_query(m, lines) < 0) {
 line_list_insert(m, lines);
 //line_dump(m);
 for (z = list->tail->next; z != list->head; z = z->next) {
   net = (delaunay_net_t *)z->object;
   o = delaunay_net_get_coordinate(net);
   if (point_cmp(o, line->b) == 0) {
     delaunay_net_connect(netc, net);
     break;
   }
 }
} else line_destroy(m);
//keyhit();
break;
      }
    }
  }

  // de-allocation lines and triangles
  /*
  while (triangles->count) {
    tri = triangle_list_pop(triangles);
    //triangle_dump(tri);
    triangle_destroy(tri);
  }
  triangle_list_destroy(triangles);
  */
  list->head->object = (void *)triangles;

  while (lines->count) {
    line = line_list_pop(lines);
    //line_dump(line);
    line_destroy(line);
  }
  line_list_destroy(lines);

  point_destroy(v1);
  point_destroy(v2);
  point_destroy(v3);
  point_destroy(org);

  //  return list;
}

At result the line crossing is disappeared.


Unfortunately, two delaunay triangles are deleted in the figure. In the figure dot is the mean center of delaunay triangle. As you see, you can find two triangles without mean center. It is remaining side effect of four points on the same circle. 


So, it needs to change comparison between variables expressed in floating points.

Change
....

    // Does the unique triangle form the delaunay triangle ?
      radius = triangle_circumcircle(org, tri);
      for (z = list->tail->next; z != list->head; z = z->next) {
net = (delaunay_net_t *)z->object;
o = delaunay_net_get_coordinate(net);
if (point_cmp(o, line->a) == 0 ||
    point_cmp(o, line->b) == 0 ||
    point_cmp(o, c) == 0)
  continue;
if (distance_between_points(o, org) < radius) {
  triangle_destroy(tri);
  tri = NULL;
  break;
}
      }
....
to
....

    // Does the unique triangle form the delaunay triangle ?
      radius = triangle_circumcircle(org, tri);
      for (z = list->tail->next; z != list->head; z = z->next) {
net = (delaunay_net_t *)z->object;
o = delaunay_net_get_coordinate(net);
if (point_cmp(o, line->a) == 0 ||
    point_cmp(o, line->b) == 0 ||
    point_cmp(o, c) == 0)
  continue;

val = distance_between_points(o, org);
if ((val < radius) && (round(100*val) < round(100*radius)) {
  triangle_destroy(tri);
  tri = NULL;
  break;
}
      }
....

Then,




2011년 9월 18일 일요일

Watershed by immersion (Vincent-Soille watershed algorithm)

procedure: Watershed-by-Immersion
Input: digital grey scale image G = (D;E; im).
Output: labelled watershed image lab on D.

#define INIT   1 // initial value of lab image
#define MASK   2 // initial value at each level
#define WSHED 0 // label of the watershed pixels
#define FICTITIOUS (-1, -1)  // fictitious pixel 2 D

curlab <= 0; // curlab is the current label
fifo_init(queue);

for all p in D do
   lab[p] <= INIT;
   dist[p] <= 0; // dist is a work image of distances
end for

SORT pixels in increasing order of grey values (minimum hmin, maximum hmax)

// Start Flooding
for h = hmin to hmax do // Geodesic SKIZ of level h   1 inside level h

   for all p in D with im[p] = h do // mask all pixels at level h
             // these are directly accessible because of the sorting step
      lab[p] <= MASK;
      if p has a neighbour q with (lab[q] > 0 or lab[q] == WSHED) then
         // Initialize queue with neighbours at level h of current basins or watersheds
         dist[p] <= 1;
         fifo_add(p, queue);
      end if
   end for

   curdist <= 1;
   fifo_add(FICTITIOUS, queue);

   loop // extend basins
      p <= fifo_remove(queue);
      if p == FICTITIOUS then
         if fifo_empty(queue) then
            break;
         else
            fifo_add(FICTITIOUS, queue);
            curdist <= curdist + 1;
            p <= fifo_remove(queue);
         end if
      end if
      for all q in neighbours of p do // labelling p by inspecting neighbours
         if dist[q] < curdist and (lab[q] > 0 or lab[q] == WSHED) then
            // q belongs to an existing basin or to watersheds
            if lab[q] > 0 then
               if lab[p] == MASK or lab[p] == WSHED then
                  lab[p] <= lab[q];
               else if lab[p] != lab[q] then
                  lab[p] <= WSHED;
               end if
            else if lab[p] == MASK then
               lab[p] <= WSHED;
            end if
         else if lab[q] == MASK and dist[q] == 0 then // q is plateau pixel
            dist[q] <= curdist + 1;
            fifo_add(q, queue);
         end if
      end for
   end loop

   // detect and process new minima at level h
   for all p in D with im[p] = h do
      dist[p] <= 0; // reset distance to zero
      if lab[p] == MASK then // p is inside a new minimum
         curlab <= curlab + 1;  // create new label
         fifo_add(p, queue);
         lab[p] <= curlab;
         while not fifo_empty(queue) do
            q <= fifo_remove(queue);
            for all r in neighbours of q do // inspect neighbours of q
               if lab[r] == MASK then
                  fifo_add(r, queue);
                  lab[r] <= curlab;
               end if
            end for
         end while
      end if
   end for
end for
// End Flooding

Reference

The Watershed Transform: De nitions, Algorithms and
Parallelization Strategies
Jos B.T.M. Roerdink and Arnold Meijster
Institute for Mathematics and Computing Science
University of Groningen
P.O. Box 800, 9700 AV Groningen, The Netherlands
Email: roe@cs.rug.nl,a.meijster@rc.rug.nl

2011년 9월 15일 목요일

Debian Wheezy의 safe-upgrade 해제한 최신 업데이트

다른건 아무런 문제가 없지만 gnome-terminal과 xterm등등의 gnome 어플리케이션의 동작에 문제가 생겼다. 아무래도 gnome버전이 2.x에서 3.0.1로 옮아가는 가정에서 생기는 문제점인거 같다. 일명 slow key라고 하는 한 5번 누르면 하나 입력이 되는 키보드 먹통현상이 가장 큰 문제이다. 그리고 gnome의 기본 테마가 적용이 안된다. xorg에서 제공하는 기본 테마가 적용되서 다른 어플리케이션과 스크롤바와 메뉴등의 테마가 다르다. 수정되겠지 하면서 쓰고 있다. 그냥 safe-upgrade로 업테이트 해야 겠다. 빨리 gnome 3.x가 안정화 되길 바란다.

여러가지 씨름을 한후 ibus와 scim의 충돌로 인한 키보드 입력에 문제가 발생한 것을 알아 차리고 scim을 지웠다. 그 이후로는 ibus를 입력기로 사용하고 있다. 키보드 입력문제는 해결을 보았으나, 여전히 테마적용문제는 풀리지 않고 있다.

이 문제도 해결을 보았다. home 디렉토리 밑의 .gconf를 싹 지웠더니 설정이 제대로 되고 있다. 하지만 그동안의 설정이 사라졌다.

2011년 9월 13일 화요일

멋있는 방문자 지도 제공 사이트

http://www.revolvermaps.com/?target=setup

지도와 해상도 기타등등을 선택하고 코드를 자신의 사이트에 추가하면 된다. 간단하다.

이러한 노력의 결과물을 많이 꽁짜로 제공하는데 왜 그런지 의문스럽다.

2011년 9월 11일 일요일

KS 규격 나사산 그리기(탭 깊이, 나사 맞춤 깊이)



* M3 x 0.5

숫나사의 바깥 지름 d: 3mm
나사를 내기 위한 구멍의 지름 d1: 2.4mm
드릴 깊이 b: 6(강, 주강, 청동, 청동주물), 7.5(주철), 8.5(알미늄과 기타의 경합금제)
탭 깊이 a: 3(강, 주강, 청동, 청동주물), 4.5(주철), 5.5(알미늄가 기타의 경합금제)

* M6 x 1

숫나사의 바깥 지름 d: 6mm
나사를 내기 위한 구멍의 지름 d1: 5mm
드릴 깊이 b: 10(강, 주강, 청동, 청동주물), 13(주철), 15(알미늄과 기타의 경합금제)
탭 깊이 a: 6(강, 주강, 청동, 청동주물), 9(주철), 11(알미늄가 기타의 경합금제)

2011년 9월 6일 화요일

Untouchable HDD noise on Laptop as having age.

I give a priority to change HDD as SDD for out of noise.

But my debian system is too heavy to reconfigure.

One of the disk copy between HDD is through "cat" commnand.

# cat /dev/sda1 > /dev/sda2

or

# dd if=/dev/sda1 of=backup , dd if=backup of=/dev/sda2

Other is backup image of HDD through "tar".

# cd /
# tar cvpjf backup.tar.bz2 --exclude=/proc --exclude=/lost+found --exclude=/backup.tar.bz2 --exclude=/mnt --exclude=/media --exclude=/sys /

Then copy this tar into new HDD and extract it.

# cd $(new_HDD)
# tar xvpjf backup.tar.bz2 -C /
# mkdir proc
# mkdir lost+found
# mkdir mnt
# mkdir sys
# mkdir media

2011년 9월 5일 월요일

3x3 bitmask list sorted by crossing number and pixel count

Here is the source code for generating 3x3 bitmask list.

#include

int value_3x3[256][9+2];

int main(int argc, char *argv[])
{
int i, j, value;
int crossing = 0, count = 0;

for (i = 0; i < 256; i++) {
value_3x3[i][0] = '*';
for (j = 0; j < 8; j++) {
if (i & (1 << j)) value_3x3[i][j+1] = '*';
else value_3x3[i][j+1] = '=';
}
crossing = 0;
count = 0;
value = value_3x3[i][8];
for (j = 1; j <= 8; j++) {
if (value_3x3[i][j] != value) crossing++;
if (value_3x3[i][j] == value_3x3[i][0]) count++;
value = value_3x3[i][j];
}
value_3x3[i][9] = crossing;
value_3x3[i][10] = count;


}
for (crossing = 0; crossing <= 8; crossing += 2) {
for (count = 0; count <= 8; count++) {
for (i = 0; i < 256; i++) {
if (value_3x3[i][9] == crossing && value_3x3[i][10] == count) {
printf("%c%c%c\n", value_3x3[i][4], value_3x3[i][3], value_3x3[i][2]);
printf("%c%c%c %d %d\n", value_3x3[i][5], value_3x3[i][0], value_3x3[i][1], value_3x3[i][9], value_3x3[i][10]);
printf("%c%c%c\n", value_3x3[i][6], value_3x3[i][7], value_3x3[i][8]);
printf("\n");
}
}
}
}
return 0;
}

And then the sorted list is here.


3x3 bitmask, crossing number, pixels equal to center
-------------------------------------------------------------------------

2011년 9월 2일 금요일

To remove clicking configuration of hdparm in Asus 1215t debian system

1. edit /etc/hdparm.conf

...

/dev/sda
{
   apm = 255
   spindown_time = 0
       dma = on
}
...


2. edit /etc/apm/event.d/20hdparm

...
APMD_DRIVES=sda
...

power_performance ()
{
    # Disable IDE hard disk spindown.
    for DRIVE in $APMD_DRIVES; do
      "${HDPARM}" -q -S 0 -B 254 "${DRIVE}" || true
    done
}
...

3. edit /etc/acpi/fglrx-powermode.sh

...
for dev in /dev/sd? /dev/hd? ; do
   if [ -b $dev] ; then

      # Check for APM support; discard errors since not all drives
      # support HDIO_GET_IDENTITY (-i).
      if /sbin/hdparm -i $dev 2> /dev/null | grep -q 'AdvancedPM=yes' ; then
        if [ -f /sys/class/power_supply/AC0/online ] && [ grep -q '1' /sys/class/power_supply/AC0/online ]; then
          /sbin/hdparm -B 254 $dev
        else
          /sbin/hdparm -B 128 $dev
        fi
      fi
   fi
done
...

[번역] hdparm - 완벽 가이드 (hdparm - complete guide)

출처 : http://forums.debian.net/viewtopic.php?t=32794


이글의 목적은 당신의 하드 디스크의 load cycle(하드 디스크의
clicking 음이 반복되어 나타나게 되는 원인)을 조절하기 위한 매개변수를 설정하는 것이다. 이를 통해서 laptop이나 desktop에서 불필요한 하드의 헤드의 정차(하드 디스크의 끍는 소리는 이 헤드의 정차음이다)를 멈출 수 있다.  그러나 이렇게 설정하더라도 베터리로 동작할때 laptop이 헤드의 정차를 하도록 한다.

그레서 나는 사람들이 작성한 스크립트를 이용한 방법을 전혀 사용하지 않았다. 여러분은 이 화면에 있는 것들을 복사해서 사용해야 할 것이다. 대신 약 1년쯤 전에 여러분이 지지하는 방식의 방법을 찾았다. 나는 항상 모두 공유하고 싶지만 워낙에 게을러서. 지금은 작업을 밀어붙이고 있으며 진작에 이것을 공유하지 않은 것에 대해서 자책하고 있다. 나는 여러분이 이 방법을 온라인상에서 찾아 볼 수 있을지 어떨지는 잘 모르겠다. howto 문서와 떨어져 있기 때문에 그러나 여러분은 검색을 통해서 찾아 볼 수 있다.

그리고 문서 작성하면서 기억해 낸 것인데 한가지 주의할 점은 255의 apm 순위는 어떤 컴퓨터에서는 작동하지 않는다. 여러분이 이 값으로 254를 사용하지 않는다면 모든 것은 기본적으로 동일하다.

1. 여러분은 repos(패키지 저장소)로 부터 구할 수 있는 hdparm, sysvconfg, smartmontools를 설치해야한다.

2. hdparm 이 로그인시 시작되는지 확인하자. sysvconfg를 실행하고 hdparm을 enable시키면 로그인시 자동으로 시작된다.

3. 그럼 여기서 내가 다르게 접근한 약간의 것들이 필요하다. 여러분이 직접 수정해야할 몇개의 파일들이 있다. 로그인시 로드되거나 이미 존재하는 hdparm의 config 파일과 약간의 스크립트가 필요하다. 그래서 여러분은 정확한 정보를 그들에게 알려주어야한다.

3.1. /etc/hdparm.conf 수정

...

/dev/${your hard drive name}
{
   apm = 254
   spindown_time = 0
   dma = on
}
...

3.2. 기타 파일 작성


# cd /etc/apm/event.d
# ls
# nano 20hdparm

그저 간단하다. 다음 몇 줄을 추가하자.

APMD_DRIVES=sda        ##Again put YOUR device

그런 다음 스크립트가 동작하도록 편집하자.

power_performance ()
{
    # Disable IDE hard disk spindown.
    for DRIVE in $APMD_DRIVES; do
      "${HDPARM}" -q -S 0 -B 255 "${DRIVE}" || true
    done
}

기본적으로 여러분은 AC 전원일때 loading/unloading cycles을 얻을 수 없다.

3.3. 마지막 단계.

ACPI 전원 관리를 위한 것이다.

# cd /etc/acpi/ac.d
# ls
# nano 90-hdparm.sh        ## or whatever ls shows you

...

for dev in /dev/sd? /dev/hd? ; do
    if [ -b $dev ] ; then
      # Check for APM support; discard errors since not all drives
      # support HDIO_GET_IDENTITY (-i).
      if hdparm -i $dev 2> /dev/null | grep -q 'AdvancedPM=yes' ; then
        if [ $STATE = "BATTERY" ] ; then
          hdparm -B 128 $dev
        else
          hdparm -B 255 $dev
        fi
      fi
    fi
  done
fi
...

3.4. reboot후 확인하기

# smartctl -a /dev/sda | grep Load_Cycle_Count
# smartctl -a -d ata -i /dev/sda | grep Load_Cycle_Count

이 명령은 94116이라는 다섯 자리의 숫자를 제공할 것이다. 몇 분후에 다시 해보자. 숫자는 같아야 한다. 

그리고 몇일 후에 알아낸 것인데 내 컴퓨터의 경우 hdparm이 suspend후 resume되었을대 작동되지 않는다. 이경우 나는 다음과 같이 수동으로 사용한다.

# hdparm -B 254 -S 0 /dev/sda




2011년 8월 31일 수요일

Square Root of Complex Number

As before, r = sqrt(a * a + b * b)

sqrt(a + J*b)
 = sqrt(r) * (sqrt((1 + a / r) / 2) (+ or -) J * sqrt((1 - a / r) / 2))
 = sqrt((r + a) / 2) (+ or -) J * sqrt((r - a) / 2)
 = sqrt((sqrt(a * a + b * b) + a) / 2) (+ or -) J * sqrt((sqrt(a * a + b * b) - a) / 2)

caution ! (+ or -) should be chosen to be the same as the sign of b

example:

sqrt(3 - J * 2) = sqrt((sqrt(3 * 3 + 2 *2) + 3) / 2) - J * sqrt((sqrt(3 * 3 + 2 * 2) - 3) / 2)

2011년 8월 23일 화요일

정부, 삼성, LG의 독자 OS 개발에 대한 생각

아마 예전에도 있었던 행태가 아닌가 기억한다. 보도에서 600억이라는 금액을 투자한다고 하는데 우선 드는 생각이 연구비 사냥꾼에 좋은 먹이감이 아닌가 생각이 든다. 누군가의 펀딩 욕심이거나 누군가의 실적올리기용 꼼수이 아닌가 한다.

아이폰에서 안드로이드폰으로 이어지는 OS 와 제조사의 결합이 이루어 졌다. 뭐 그렇다고 안드로이드가 개방정책을 철회하는것은 아니지만 (혹 그럴지도 모른다) 이 결합에 많이들 걱정하는 것 같다. 뭐 사용자 입장에서 나쁜 것 보다 좋은 점이 더 많다. 우후 죽순처럼 양산되는 완벽하지 못한 안드로이드 폰들을 사용하는 것보다 잘 정돈된 안드로이드폰이 훨씬 쓸만 하니깐. 그런 의미에서 삼성과 LG는 안드로이드 OS자체를 자신의 용도에 맞게 고쳐 쓸 수 있는 혹은 수정할 수 있는 인력의 확보가 더 중요할 지도 모른다. 한 발 더 나아가서 안드로이드 OS에서 파생되는 자체 OS를 개발 할 수도 있다. 안드로이드의 OS의 라이센스를 잘 모르겠지만 물리적으로 얼마든지 가능하다.

그렇지 않고 이 두 OS와 경쟁하기 위해서 지금 당장 처음부터 개발한다는 것은 무모하다. 일정 수준의 완성도를 갖기 위해서 두 회사가 거쳐온 기간과 자금, 지금 현재 유지, 보수되고 있는 노력들을 살펴보면 이해가 쉽다. 만약 안드로이드의 라이센스정책이 그러한 파생 OS를 허용하지 않거나 공개를 철회할 경우, 비슷한 부류의 GNU프로젝트에 투자를 한다던가 개발자를 고용해서 그 프로젝트에 기여하는 방식을 생각해 볼 수 있다. 물론 GPL 라이센스 형식으로 말이다. 그게 유지, 보수 및 개발에 훨씬 유리할 지도 모른다. 안드로이드의 태생도 이러한 방식의 소프트웨어를 기반으로 탄생한 것이었으니깐 말이다. 물론 사적이익 창출이 목표인 삼성이나 LG에서 못마땅 할 수 있지만 공공의 이익을 생각하는 정부 입장에서는 충분히 고려해 볼만한 가치가 있다. 반면 삼성이나 LG의 입장에서는 노키아에 팽당한 인텔의 MiGO프로젝트에 참여하는 방식도 충분히 고려해 볼만한 사항이다. RIM이나 HP를 염두해 두는 목소리도 많은데 내가 보기엔 이 둘과 손을 잡으면 지금 현재 상태의 구글과의 관계보다 더 어려울 수 있다. 이미 OS와 제조를 다 가지고 있기 때문이다.

사용자들은 아무런 걱정을 할 필요가 없다 좋은 것만 잘 골라서 쓰기만 하면된다. 개발자들도 마찬가지로 편한 환경을 골라서 개발하면 아무 문제 없다. 그저 이익이 줄어들어서 걱정하는 삼성과 LG가 문제이지. 그리고 안드로이드가 이상해 지더라도 걱정할 것 없다. 비슷한 목표를 가진 GNU프로젝트는 얼마 든지 많으니깐 당장 쓸정도가 아닌지 모르겠지만 스마트폰의 명세만 잘 공개 된다면 그 누군가의 그룹들이 뚝딱뚝딱하면서 쓸모 있게 만들테니깐 자원들은 풍부하다. 안드로이드도 많은 부분 이러한 자원들에 의존하고 있다. 그러니깐 대부분의 사람들은 삼성, LG 걱정할 필요없다.

2011년 8월 16일 화요일

OpenGL 프로그래밍에 대해서

OpenGL은 하드웨어 독립적인 2D/3D 그래픽 라이브러리이다. SGI사의 IRIS GL라이브러리를 기초로 개발되었지만 개방형이다. 그래픽 라이브러리이기 때문에 기본적인 창관리와 입력처리에 대한 부분이 없다. 그래서 GLUT이라는 보조 도구를 이용해서 창을 관리하고 입력을 관리하는 방법을 제공한다. 이것도 역시 시스템 독립적이기 때문에 OpenGL과 GLUT의 조합이면 어떤 시스템에서도 동일한 결과를 갖는 프로그램을 개발 할 수 있다.

GLUT: OpenGL 유틸리티 툴킷을 줄인 말인 것 같다. 내부에 많은 상태 변수들을 관리하고 있단다. 간단히 초기화하고 창에 점과 선만 그릴 수 있었음 만족한다. 간단히 초기화 하는 법은 다음과 같다.


#include  

void MyIdle(void)
{
   /* 사용된 변수값을 다음 프레임의 상태로 수정해 주는부분*/
};

void MyDisplay(void)
{
   /* 프레임에 실제 그림을 그리는 OpenGL명령어들이 들어간다. */
   /* 프레임이 다 그려진 다음 버퍼를 교체한다. */
   glutSwapBuffers();
};

void main(int argcp, char **argv)
{
   /* GLUT상태를 초기화 한다. */
   glutInit(&argcp, argv);
   glutInitWindowSize(640, 480);
   glutInitWindowPosition(0, 0);

   /* 창을 연다. */
   glutCreateWindow("My OpenGL Application");

   /* 디스플레이모드를 선택한다.:
      이중버퍼 & RGBA색상 */
   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

   /* 콜백함수들을 등록한다. */
   glutDisplayFunc(MyDisplay)
   glutIdleFunc(MyIdle)

   /* 이벤트 처리엔진을 시작한다 */
   glutMainLoop();
};


2011년 8월 8일 월요일

카메라 신호 분석하기

카메라 센서 설정을 보게 되면 Active High혹은 Active Low라는 설정이 있다. 회사마다 다르겠지만, 아래의 두가지 경우를 설정하는 방식을 다양하게 제공하고 있을 꺼다.

 설명하자면 바로 아래의 사진은 Active Low로 설정된 HREF신호이다. 초기 상태는 이와 같은 상태 일 것이다. 대부분이. HREF신호가 Rising edge로의 변경은 PCLK의 Low edge에서 발생한다. 즉 PCLK 의 rising edge에서 화소값을 읽어 들이면 된다.


이와는 반대로 Active High는 정반이다. 마찬가지로 HREF신호의 HIGH상태로의 전이는 PCLK의 Rising Edge에서 잃어난다. 그럼 동일한 방식으로 화소값은 Falling edge에서 읽어 들이면 된다.


문제는 무엇이냐 하면 둘 중 어떤 것으로 설정해도 화면은 나온다. 읽어 들이는 시점이 이전 상태를 읽어 들여서 문제지. 이상하게 좌측에 검은 줄이 생긴다면 의심해 볼 필요가 있다. Active Low 인지 High인지 읽어 들이는 시점은 정확한지.