삽질하는플머

'이런저런잡다구리'에 해당되는 글 19건

  1. 우분투 서버에 Redmine 설치 1
  2. NAS 갖고놀기 - DS110j
  3. 삽질하는플머 위키 - PHP-GD
  4. 삽질하는플머 위키 - XML-RPC 갖구놀기
  5. 방향 선호 셸 추출

우분투 서버에 Redmine 설치

이런저런잡다구리/LinuxHeaven
우분투에 redmine 설치하기. 
10.04 LTS, LAMP,  OpenSSH 까지 설치한 상태

우분투 설치 마무리

# sudo apt-get update
# sudo apt-get upgrade
# sudo apt-get dist-upgrade



재부팅 후 빌드도구 및 unzip, zlib, openssl 헤더 설치

# sudo apt-get install build-essential unzip zlib1g-dev libssl-dev



덤으로 phpMyAdmin도 설치

# sudo apt-get install phpmyadmin



루비 빌드. 레드마인은 루비 1.8.x 버전을 써야 한다. 

# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.zip 
# unzip ruby-1.8.7-p334.zip

# cd ruby-1.8.7-p334
# ./configure
# make
# sudo make install



설치 확인

# ruby --version
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-linux]



루비 zlib 설치. (꼭 필요한지는 확인 못함.) 

# sudo apt-get install libzlib-ruby



rubygem 1.3.6 설치. 레드마인은 gem 1.5 이상에서 오류발생함. 업데이트 자제요!

# wget http://rubyforge.org/frs/download.php/69366/rubygems-1.3.6.zip
-->> 막힘. 이걸로. 
#  wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.6.tgz
# unzip rubygems-1.3.6.zip
# cd rubygems-1.3.6/
# sudo ruby ./setup.rb
# gem --version
1.3.6



레일즈를 비롯한 루비 젬 설치. 도큐멘트 없이 깔자. (이 작업은 몇 분 걸림..)

# sudo gem install rails -v 2.3.5 --no-ri --no-rdoc
# sudo gem install rack -v 1.0.1 --no-ri --no-rdoc
# sudo gem install ruby-mysql --no-ri --no-rdoc <== 이거 오류남. 2.9.3-beta 를 설치할 것. 추가 #2 참고.

 

레드마인 작업 디렉토리 만들고 0.9.5 받아 압축 해제. 

# sudo mkdir /ruby-apps
# cd /ruby-apps
# sudo wget http://rubyforge.org/frs/download.php/71421/redmine-0.9.5.tar.gz
# sudo tar -xzvf redmine-0.9.5.tar.gz

# sudo ln -s redmine-0.9.5 redmine



mysql에 redmine 이라는 데이터베이스 생성. 

CREATE DATABASE `redmine` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;



레드마인 설정하기. 

# cd redmine/config/
# cp database.yml.example database.yml



 database.yml 파일 수정

......
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: root <- 여기에 사용자
  password: 1234 <- 여기에 암호
  encoding: utf8
......



mysql.sock 연결해두기. 

# sudo ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock



또는 database.yml 의 adapter 밑에 다음 줄 추가. 

production:
  adapter: mysql
  socket: /var/run/mysqld/mysqld.sock


(참고 : http://hervalicio.us/blog/2007/07/07/no-such-file-or-directory-tmpmysqlsock/)

 
레드마인 설정. 

# cd .. (레드마인 디렉토리로 이동)
# RAILS_ENV=production rake generate_session_store
# RAILS_ENV=production rake db:migrate
# RAILS_ENV=production rake redmine:load_default_data  <== 언어는 ko를 입력한다 
# RAILS_ENV=production rake config/initializers/session_store.rb


 
레드마인 구동

# ruby script/server webrick -e production
( 이 때 -d를 붙여 ruby script/server webrick -d -e production 라고 하면 디태치된다. )
( 데몬구동 스크립트 만들기 귀찮아서 그냥 screen 을 써서 사용할 예정임 )



이제 3000번 포트로 접속해보면 레드마인이 나타남. 초기 로그인은 admin/admin

http://my-ubuntu:3000



형상관리 연동을 위해 subversion, git 설치

# sudo apt-get install subversion git-core




레드마인 설정에서 저장소 인코딩값에 UTF-8,EUC-KR 을 넣어주면 한글주석도 제대로 표시된다. 



플러그인 설정. 먼저 울트라바이올렛 하이라이터. 
http://www.redmine.org/plugins/redmine_ultraviolet

레드마인에 내장된 CodeRay도 있기는 하지만... 파스칼 코드가 별로다. 


먼저 울트라바이올렛을 깔고

sudo apt-get install libonig-dev
sudo gem install ultraviolet



설치는 다음과 같이

script/plugin install git://github.com/epitron/redmine_ultraviolet.git



위 과정을 통해 redmine_ultraviolet 디렉토리가 vendor/plugins/ 로 복사된다. 

레드마인 재구동하면 계정정보에 Ultraviolet Theme 가 나타남. 

근데 도대체 어케 활성화 시키는거야~!!

--->> 저장소의 소스보기가 영향받는다. 





 

추가 #1
NAS에 이미 운용중인 레드마인 DB를 사용하려면?? 일단 NAS의 mysql 을 다른 계정으로 접속할 수 있도록 해준다. 
database.yml 을 적당히 편집, host, username, password 를 NAS의 해당 정보로 변경한다. 

로컬 네트웍의 NAS 이름을 못찾네... 아이피를 고정하기 어려운 상황이라... /etc/hosts 에 적당히 추가. 
 재구동하면 기존 운용중인 정보를 그대로 사용 가능. 

로컬네트워크상의 컴퓨터를 이름으로 검색하는 방법
http://oranke.tistory.com/172 





추가 #2
NAS에서는 잘 동작하는데... 상위 프로젝트에서 작업내역 볼 때 오류가 나오네. 

http://www.redmine.org/issues/5693 참고. mysql 드라이버를 재설정하자. 

# sudo gem uninstall ruby-mysql

# sudo apt-get install libdbd-mysql-ruby1.8

# wget https://github.com/downloads/tmtm/ruby-mysql/ruby-mysql-2.9.3-beta.tar.gz --no-check-certificate
-->> 잘 안되면 이렇게
# curl -O https://github.com/downloads/tmtm/ruby-mysql/ruby-mysql-2.9.3-beta.tar.gz
# tar -xzf ruby-mysql-2.9.3-beta.tar.gz
# cd ruby-mysql-2.9.3-beta/
# sudo ruby setup.rb

 




 
2011.5.25

1.1.3 으로 업그레이드. 
참조 : http://www.redmine.org/projects/redmine/wiki/RedmineUpgrade

먼저 기존 DB의 백업. 

# /usr/bin/mysqldump -u <username> -p<password> <redmine_database> | gzip > /path/to/backup/db/redmine_`date +%y_%m_%d`.gz



1.0 이상의 레드마인은 i18n 0.4.2 가 필요하다. 설치하자. 

# sudo gem install i18n -v 0.4.2



/ruby-apps 로 이동, 최신 버전을 받아 압축 해제. 

# cd /ruby-apps

# sudo wget http://rubyforge.org/frs/download.php/74722/redmine-1.1.3.tar.gz
# sudo tar -xzf redmine-1.1.3.tar.gz
# cd redmine-1.1.3



기존 사용중인 files/ 디렉토리 내용과 database.yml 복사. 

# cp ../redmine/files/* ./files/
# cp ../redmine/config/database.yml ./config/ 



플러그인도 복사. 위에서 설치한 울트라 바이올렛만...

# cp ../redmine/vendor/plugins/redmine_ultraviolet ./vendor/plugins/ -r



레드마인 설정
 

# RAILS_ENV=production rake config/initializers/session_store.rb



위의 명령이 안먹히면 이렇게... 

# RAILS_ENV=production rake generate_session_store



데이터베이스 업그레이드

# RAILS_ENV=production rake db:migrate



플러그인도 깔아줬으니 이것도..

# RAILS_ENV=production rake db:migrate:upgrade_plugin_migrations
# RAILS_ENV=production rake db:migrate_plugins



클린업 후 재구동. 

# rake tmp:cache:clear
# rake tmp:sessions:clear



일단 포트를 변경해 3001 에서 테스트. 

# ruby script/server -e production -p 3001


잘 되는군. 
 
기존 심볼릭 링크 제거하고 새로 만들자. 

# cd ..
# sudo rm redmine
# sudo sudo ln -s redmine-1.1.3 redmine




추가 #3

MySQL 의 Interactive_timeout 문제로 인해 8시간 이상 방치한 레드마인이 더이상 동작하지 않는 문제가 있다. 
하지만 이 값을 늘려주는 것은 그다지 좋지 않은 방법인듯 하다. DB연결이 끊기기 전에 레드마인이 재구동되는 것이 나을 듯. 

레드마인이 올라앉은 WEBrick 서버가 데몬모드로 동작할 때 pgrep 을 써서 이 녀석의 PID를 얻어 정지시키는 방법 

http://www.alecjacobson.com/weblog/?p=28
 

위 내용응 응용, 적절한 스크립트를 작성하고 crontab 으로 돌려주는 편이 좋겠다. 

/ruby-apps/redmine/restart.sh  

#!/bin/sh
# 레드마인 재구동

# 기존 동작중인 레드마인 죽이고
REDMINE=`pgrep ruby`
kill -KILL $REDMINE

# 데몬모드로 재구동
ruby /ruby-apps/redmine/script/server webrick -d -e production

#재구동 로그 남김
echo "Redmine restart at :"  `date` >> /ruby-apps/redmine/restart.log



/ect/crontab 을 관리자 권한으로 수정. 다음 내용을 적어넣는다. 

...

# 토, 일요일 6시간 단위
0 */6   * * 6,7   user     /ruby-apps/redmine/restart.sh > /dev/null 2>&1
# 평일 새벽 5시, 저녁 11 재구동
0  5,23   * * 1-5   user     /ruby-apps/redmine/restart.sh > /dev/null 2>&1
 

좀 무식해 보이기는 하지만... 일단 넘어가자. 





 

추가 #4 

하위 프로젝트를 만들었을 때 일감에 대한 gantt 차트를 출력하면 최상위에서만 제대로 보이는 문제가 보임. 
"redmine gantt subproject" 로 검색. 패치가 있다. 
http://www.redmine.org/issues/6476

다운로드 후 패치 진행

# wget  http://www.redmine.org/attachments/download/5281/gantt_filters.patch
# mv gantt_filters.patch /ruby-apps/redmine
# cd /ruby-apps/redmine 
# patch -p0 < gantt_filters.patch 



패치하면 잘 동작한다. 


 
 

추가 #5
14.04 에서 루비 1.8.7 설치
http://n3rve.com/how-to-install-ruby-1-8-rubygems-on-ubuntu-14-04


NAS 갖고놀기 - DS110j

이런저런잡다구리/Synology-nas
Synology의  NAS 는 X86, PPC, Arm 등 다양한 CPU를 사용한 제품이 있다. 그 중 ARM 기반의 DS110j 를 갖고 놀게 되었다. 




카페도 있다. 
http://cafe.naver.com/synologynas

대충 설치를 마치고 접속해보니 이것이야말로 신세경. 진작 써볼 껄... 

일단 SSH 접속부터 설정.  




부트스트랩을 올리는 방법이라는데 후덜덜하군. 

DS110j 의 CPU 정보는 여기서 확인. 독일어이므로 영어로 바꿔보자. 

여기에 나와있는 링크를 NAS의 Public 에 저장. 
http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/stable/syno-mvkw-bootstrap_1.2-7_arm.xsh

SSH로 접속해서 /volume1/public 으로 이동 후 과감하게 실행해보자.  ipkg 사용가능. 우햐~~ 뭐 이런~~
(루트권한 필요. su 또는 아예 root로 접속해 처리할 것) 
업데이트/업그레이드 실행. 

ipkg update
ipkg upgrade


몇년이 지나도 vi 는 익숙해지지 않는다. 발전이 없구먼... 암튼 nano 부터 깔아보자.  

ipkg install nano


히야~ nano 가 떴다~~




데몬 스크립트들은 /usr/syno/etc/rc.d 에 위치한다. 루트디렉토리에 etc, etc.defaults 가 별개로 있는 이유는 잘 모르겠네. 



로컬 네트웍상의 익명 rsync 서버로서 가지고 놀아보기.  


현 시점에서 /etc/rsyncd.conf 파일은 다음과 같이 되어있다. 

#motd file = /etc/rsyncd.motd
#log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
use chroot = no
[NetBackup]
path = /var/services/NetBackup
comment = Network Backup Share
uid = root
gid = root
read only = no
list = yes
charset = utf-8
auth users = root
secrets file = /etc/rsyncd.secrets


여기에 설정된 NetBackup 이 제대로 동작하는지 테스트 해 보자. 

C:\SyncWork-Test> rsync -avz --delete root@zh-storage::NetBackup
rsync: failed to connect to zh-storage: Connection refused (111)
rsync error: error in socket IO (code 10) at /home/lapo/packaging/rsync-3.0.7-1
src/rsync-3.0.7/clientserver.c(122) [Receiver=3.0.7]


rsync 데몬이 돌고있지 않은 상태이므로 일반 접속으로는 붙지 않는다. 
RSH 접속은 어떨까. 

C:\SyncWork-Test> rsync -avz --delete root@zh-storage:~/
root@zh-storage's password:
receiving incremental file list
drwxr-xr-x        4096 2010/11/02 17:18:18 .
-rw-r--r--          22 2010/11/02 17:18:18 .bashrc
-rw-r--r--          40 2010/11/02 17:17:21 .inputrc
-rw-r--r--         396 2003/09/04 18:49:39 .profile

sent 11 bytes  received 85 bytes  21.33 bytes/sec
total size is 458  speedup is 4.77


아주 잘 동작하는군... 현재 설정된 rsh 에서 대상의 rsync 를 구동시키기 때문이다. 
그리고 쩝... 현 시점에서 /var/services/ 에 NetBackup 이라는 디렉토리는 존재하지 않는다. 카페의 사용기를 보면 네트웍 백업을 활성화하면 나타나는 듯 한데... 이 펌웨어에는 그런 메뉴가 없다. 


NAS로 들어가서 rsync 데몬을 굴려보자. 

일단 /volume1/public/rsync-test 디렉토리를 만들고 /etc/rsyncd.conf 를 rsyncd.my.conf 로 복사. 내용을 다음과 같이 편집하자. 

pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
use chroot = no

[rsync-test]
path = /volume1/public/rsync-test
comment = rsync test directory
read only = no
list = yes
charset = utf-8


이제 rsync 를 데몬모드로 구동. 

rsync --config=/etc/rsyncd.my.conf --daemon


데몬이 도는지도 확인해보자. 

$ ps | grep rsync
30870 root      8000 S    rsync --config=/etc/rsyncd.my.conf --daemon
30980 root      2944 S    grep rsync
$ cat /var/run/rsyncd.pid
30870


앞에서 내렸던 명령을 다시 한 번 때려보자. 익명모드로 만들었으므로 유저없이 접근 가능. 

C:\SyncWork-Test>rsync -avz --delete zh-storage::rsync-test
receiving incremental file list
drwxrwxrwx        4096 2010/11/02 17:55:13 .

sent 32 bytes  received 68 bytes  66.67 bytes/sec
total size is 0  speedup is 0.00


잘 되는군. 위에서 read only = no 로 설정했으므로 보내기도 가능하다. 

C:\SyncWork-Test>rsync -avz --delete ./ zh-storage::rsync-test
sending incremental file list
./
rsync: failed to set times on "." (in rsync-test): Operation not permitted (1)
aaa.bmp
aaa.png
curl_stack.h
curl_stack.o
main.o

sent 151433 bytes  received 106 bytes  303078.00 bytes/sec
total size is 1513787  speedup is 9.99
rsync error: some files/attrs were not transferred (see previous errors) (code
3) at /home/lapo/packaging/rsync-3.0.7-1/src/rsync-3.0.7/main.c(1042) [sender=3
0.7]


문제는 이 명령어를 NAS 로그인과 동시에 실행시키는 건데... rc.d 는 /usr/syno/etc 에 있고 rc.local 은 /etc 에 존재... 
일단 /etc/rc.local 에 다음과 같이 추가하고 재부팅 해 보자. 

#rsync daemon
rsync --config=/etc/rsyncd.my.conf --daemon


(루트계정으로 로그온한 상태에서는 poweroff, reboot 명령이 먹는다.)

재부팅한 뒤 ps | grep rsync 때려보면 데몬이 잘 돌아가고 있는 게 보인다. 일단 해결. 

--------
2010.11.3

도움말을 읽다보니 이렇게 데몬을 띄우지 않아도 활성화되는 rsync 모듈이 이미 있는 듯 하다. 
/usr/syno/etc/rc.d/S84rsyncd.sh 이 그 물건이겠지. 

일단 위에서 띄운 데몬을 죽이고 관리화면에서 백업및 복원 -> 네트워크 백업서비스 활성화 를 켜보자. 




zh-storage> ps | grep rsync
22587 root      8000 S    /usr/syno/bin/rsync --daemon
22890 root      2944 S    grep rsync

rsync 데몬이 구동중이고, 이 설정파일은 위에서 살펴봤던 /etc/rsyncd.conf 를 사용할 것으로 보인다. 

이 서버스는 동종의 Synology 머신에서 백업을 때릴 때 받아주는 역할을 하므로, 자유도가 떨어진다. 
좀 더 살펴봐야겠지만, 나하고는 안어울림. 





한걸음만 더 나가보자... crond 를 써서 원격지에서 주어진 시간마다 특정 폴더를 자동으로 rsync로 동기화하는 것도 테스트. 
일단 rsync 와 달리 crond 는 기본적으로 떠있는 상태. 다행 다행~~

위에서 살펴본 것 처럼 /etc/rc.local 이 제대로 동작하므로 /etc/crontab 도 잘 동작할 것으로 보인다. 




WebDAV 설정법 참고



2010.11.6  Bash 설치

 http://isulnara.com/tt/202

Bootstrap 과 coreutils 가 먼저 설치되어있어야 한다. 설치 후 bash 깔 것. 

# ipkg install coreutils
# ipkg install bash

/etc/passwd 에서 root의 셸을 bash로 변경

root:x:0:0:root:/root:/opt/bin/bash

설정파일 링크. 

# ln -s /opt/etc/profile /root/.bash_profile
# ln -s /opt/etc/profile /root/.bashrc

/opt/etc/profile 수정 - 필요에 따라 적당히 수정
#
# Bash initialization script
#

PS1='[\u@\h:\w]# '
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/bin:/usr/syno/sbin:/opt/sbin:/opt/bin
LD_LIBRARY_PATH=/opt/lib:${LD_LIBRARY_PATH}

export PS1 PATH LD_LIBRARY_PATH

MANPATH=/opt/man:${MANPATH}

if [ `/usr/bin/id -u` -eq 0 ]; then
HOME=/root
else
HOME=/volume1/`/usr/bin/id -n -u`
fi

EDITOR=vim
PAGER=less
TERM=linux
TERMINFO=/opt/lib/terminfo
MANPAGER='less -isrR'
RSYNC_RSH=ssh

export PATH OUTPUT_CHARSET MANPATH HOME EDITOR PAGER TERM MANPAGER RSYNC_RSH TERMINFO

alias ll='ls -la --color=auto'


그리고 접속확인. 무엇보다 중요한 것은 현재 작업중인 연결을 끊지 말고 새 연결을 시도할 것
잘못되면 완전 초기화해야 할 수도 있기 때문임. 






2011.3.30. SVN 설정하기. 

http://forum.synology.com/wiki/index.php/Step-by-step_guide_to_installing_Subversion 

먼저 제어판에서 snvowner 라는 유저를 생성하자. 어드민권한도 줌. 
svn 폴더를 만들고 네트웍에서 감춤. svnowner 에 접근권한도 줌. 

SSH접속후 다음과 같이 입력해 설치. 
ipkg install svn

위 글에서는 SVN 데몬을 상시로 띄우는 것 보다는 inetd 를 써서 필요할 때만 쓰는 방법을 추천하고 있다. 

/etc/inetd.conf 파일에 다음 라인 추가. 

svn stream tcp nowait svnowner /opt/bin/svnserve svnserve -i -r /volume1/svn



/etc/services 파일에 다음 라인 추가. 

svn 3690/tcp # Subversion 
svn 3690/udp # Subversion



이 시점에서 reboot 한 번 해줌. 

 root로 SSH접속 후 다음과 svnowner 로 변경. 

su svnowner --> 잘 안되네...
/etc/passwd 에서 로그인용 셸을 지정해주어야 한다. 
svnowner:x:1026:100:SVN 관리자:/var/services/homes/svnowner:/sbin/nologin
다시 su svnowner

SVN을 테스트 해보자.

cd /volume1/svn 
svnadmin create test 

권한설정을 테스트 해보자. 
/volume1/svn/test/conf/passwd 파일을 열고 다음과 같이 입력. 

[users] 
testuser = 1234


 /volume1/svn/test/conf/svnserve.conf 파일에 다음과 같이 구성. 
 

[general] 
anon-access = none 
auth-access = write 
password-db = passwd 
realm = I am your test repository


exit 를 입력, root 로 돌아온다. 

이제 거북이 등 SVN 클라에서 위에 설정한 유저로 체크아웃. 

svn co svn://<IP of your Diskstation>/test <some localfolder>

로컬에서 테스트하려면 이렇게. 

svn co svn://127.0.0.1/test test

root의 암호를 물을 때는 그냥 엔터. 이후 유저와 암호를 위에서 설정한 값으로 입력. 

체크아웃된 test 디렉토리로 이동후 다음과 같이 해보세. 

echo "I am a Test" > test.txt
svn add test.txt
svn ci -m "Commit test"


커밋 잘된다. 거북이에서도 요령은 동일.


2011.5.4 추가. 
pre--revprop-change 라는게 있군. 이걸 설정해줘야 거북이 SVN에서 지난로그 수정하는게 된다. 
http://www.pyrasis.com/main/SubversionCommitMail-HOWTO
 
SVN 작업디렉토리 내 hook 디렉토리에 가서 다음과 같이 하자. 

cp pre-revprop-change.tmpl pre-revprop-change
chmod 755 pre-revprop-change






2011.3.31. 모니위키 이전을 위한 설정. 

아파치 설정파일은 /usr/syno/apache/conf 에 존재. httpd.conf  들여다봄.  
도큐멘트 루트는 다음과 같이 되어있다. 

DocumentRoot "/var/services/web"

이 디렉토리는 /volume1/web 으로 심볼릭 링크되어있음. 

웹 디렉토리 밑에 주렁주렁 깔아주는 것 보다 다른 곳에서 링크하는 게 나아보임.  /volume1/@hideweb/moniwiki 디렉토리 생성. 
웹서비스 재시작시 httpd.conf 는 원래대로 돌아가버리니  httpd.conf-user 파일을 편집. 

<IfModule alias_module>
    # Alias for MoniWiki

    Alias /MoniWiki/    "/volume1/@hideweb/moniwiki/"
    Alias /MoniWiki     "/volume1/@hideweb/moniwiki/"

    <Directory "/volume1/@hideweb/moniwiki">
        #Options Indexes MultiViews
        #Options MultiViews
        Options All

        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</IfModule>



시놀로지 관리자에서 서비스 재구동시켜봄. 잘 동작한다. 아싸~
 여기에 모니위키를 설치하면 됨. 
 




2012. 3. 27. 

SVN의 오래된 내용 정리하는 방법. 종택형님이 갈쳐줌. 


삽질하는플머 위키 - PHP-GD

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

삽질하는플머 위키 - XML-RPC 갖구놀기

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

방향 선호 셸 추출

이런저런잡다구리/Research
선공, 또는 먹자 몬스터가 시야 내의 유저나 아이템을 발견할 때 사용한 방법.
2004. 6. 8. 작업노트로 부터 정리 해 둠.




오브젝트가 향하는 방향값은 다음과 같이 정의되어있다.

4 0 5
3 C 1
7 2 6


첫번째 테이블, 즉 거리가 1일 때의 갯수는 8개이며 거리에 비례해 8의 배수로 늘어난다.

1st Table
0, 4, 5, 3, 1, 7, 6, 2
1, 5, 6, 0, 2, 4, 7, 3
2, 6, 7, 1, 3, 5, 4, 0
3, 7, 4, 2, 0, 6, 5, 1
4, 3, 0, 7, 5, 2, 1, 6
5, 0, 1, 4, 6, 3, 2, 7
6, 1, 2, 5, 7, 0, 3, 4
7, 2, 3, 6, 4, 1, 0, 5

2nd Table
0-0, 4-0, 5-0, 4-4, 5-5, 4-3, 5-1, 3-3, 1-1, 7-3, 6-1, 7-7, 6-6, 7-2, 6-2, 2-2
0-0의 의미는 0번 방향에서 다시 0번방향이라는 의미...

이 관계를 테이블로 정리 해 보면 다음과 같다.

4,4,4,4 4,4,4,0 4,4,0,0 4,0,0,0 0,0,0,0 5,0,0,0 5,5,0,0 5,5,5,0 5,5,5,5
(-4,-4) (-3,-4) (-2,-4) (-1,-4) (0,-4) (1,-4) (2,-4) (3,-4) (4,-4)
4,4,4,3 4,4,4 4,4,0 4,0,0 0,0,0 5,0,0 5,5,0 5,5,5 5,5,5,1
(-4,-3) (-3,-3) (-2,-3) (-1,-3) (0,-3) (1,-3) (2,-3) (3,-3) (4,-3)
4,4,3,3 4,4,3 4,4 4,0 0,0 5,0 5,5 5,5,1 5,5,1,1
(-4,-2) (-3,-2) (-2,-2) (-1,-2) (0,-2) (1,-2) (2,-2) (3,-2) (4,-2)
4,3,3,3 4,3,3 4,3 4 0 5 5,1 5,1,1 5,1,1,1
(-4,-1) (-3,-1) (-2,-1) (-1,-1) (0,-1) (1,-1) (2,-1) (3,-1) (4,-1)
3,3,3,3 3,3,3 3,3 3 C 1 1,1 1,1,1 1,1,1,1
(-4,0) (-3,0) (-2,0) (-1,0) (0,0) (1,0) (2,0) (3,0) (4,0)
7,3,3,3 7,3,3 7,3 7 2 6 6,1 6,1,1 6,1,1,1
(-4,1) (-3,1) (-2,1) (-1,1) (0,1) (1,1) (2,1) (3,1) (4,1)
7,7,3,3 7,7,3 7,7 7,2 2,2 6,2 6,6 6,6,1 6,6,1,1
(-4,2) (-3,2) (-2,2) (-1,2) (0,2) (1,2) (2,2) (3,2) (4,2)
7,7,7,3 7,7,7 7,7,2 7,2,2 2,2,2 6,2,2 6,6,2 6,6,6 6,6,6,1
(-4,3) (-3,3) (-2,3) (-1,3) (0,3) (1,3) (2,3) (3,3) (4,3)
7,7,7,7 7,7,7,2 7,7,2,2 7,2,2,2 2,2,2,2 6,2,2,2 6,6,2,2 6,6,6,2 6,6,6,6
(-4,4) (-3,4) (-2,4) (-1,4) (0,4) (1,4) (2,4) (3,4) (4,4)


정리결과 재미난 규칙을 발견함.. 기준좌표를 중심으로 6-2-2-2 위치의 좌표는 6방향 옵셋값인 (1,1)과 2방향 옵셋값인 (0,1)을 그 반복횟수만큼 옵셋시킨 값이 된다. (1,1) + (0,1) + (0,1) + (0,1) = (1,4).

각 방향의 '어깨걸이' 방향을 좌우 순서로 정리하면 다음과 같다.

0 - 4, 5
1 - 5, 6
2 - 6, 7
3 - 7, 4
4 - 3, 0
5 - 0, 1
6 - 1, 2
7 - 2, 3

단계 1의 방향을 추출해 보자.

1의 왼쪽 오른쪽인 5, 6까지 추출... 5번의 왼쪽 0, 6번의 오른쪽 2,
다시 0번의 왼쪽 4, 2번의 오른쪽 7. 마지막으로 4의 왼쪽 3 또는 7의 오른쪽 3.

1, 5, 6, 0, 2, 4, 7, 3

어깨걸이 좌표 테이블로부터 추출이 가능하다는 얘기가 됨.

기준좌표로부터 거리 3인 위치를 6번방향 기준으로 추출할 경우...
먼저 3개의 인자를 갖는 바이트배열 두 개를 준비한다. 각각 오른쪽, 왼쪽값이 된다.
DirArr_R, DirArr_L : TByteArray;

초기값은 두 방향 모두 6-6-6 으로 채운다. DirArr_R[0], [1], [2] := 6;
이 인자들의 값을 해당 루프만큼 바꿔가며 방향을 추출할 수 있다.
총 루프 횟수는 거리값인 3 * 8 / 2 -1 = 11 번이 된다.
(하나의 방향이 모두 치환되는 횟수는 거리값, 즉 이경우 3번이 된다.)

시작방향이 0~3이면 앞부분을 치환, 4~7이면 뒷부분을 치환한다.

RepPos: Integer;

오른쪽을 기준으로 설명 해 보자. 시작방향, 즉 DirArr_R[0] 값이 6이므로 뒷부분 치환.

RefPos:= 0;
RepPos:= 거리 -1;
IncVal := -1; // RepPos를 줄이는 참조값.

또한 6의 오른쪽 방향은 ND2CD_TBL[6][7] => 2 이므로 루프 첫번째 값은 [6-6-2] 이다.
DirArr_R[RepPos] := ND2CD_TBL[ DirArr_R[RefPos] ][7];

RepPos는 하나 줄인다.
Inc(RepPos, IncVal);

RepPos가 0보다 작아지면 RepPos를 0으로, RefPos를 거리-1로, IncVal을 1로 수정.
RepPos가 거리보다 크거나 같아지면 RepPos를 거리-1로 RefPos를 0으로, IncVal을 -1로 수정.

이 과정을 총 루프횟수만큼 반복한 후 마지막 방향은 처음방향의 역방향으로 결정.
또는 왼쪽, 오른쪽 아무쪽이나 이 과정을 한 번 더 진행시켜 결정.

얻어낸 좌표옵셋의 거리제곱이 주어진 (거리+1)의 제곱보다 작은 경우만 범위로 인정.
이렇게 추출한 점열들은 결국 원형이 된다. 이 때 원형 내부에 꽉 차는 축직교 정사각형의 범위는 굳이 거리를 재지  않아도 원 내부이며 따라서 단순 비교문만으로 처리할 수 있다. 주어진 거리에 cos(45) 값을 곱한 후 반올림하면 사각영역의 경계값을 얻게 되며 이 경계안에 포함되는 영역은 거리비교를 하지 않도록 하자.
이 경계값은 스텝에 바로 대응된다. n번째 스탭에서 (n <= 경계값)의 조건을 만족 한다면 거리값을 잴 필요없이 원형 범위 이내가 된다는 이야기..

추출좌표의 총 갯수는 ((추출하려는 거리 * 2) -1)^2 -1 이 된다. 여기서 -1은 원점을 뺐기 때문이다.



지금까지의 정리를 코딩을 통해 확인. (델파이 5)


흰색 점 : 거리를 벗어난 셸
검은 점 : 거리 이내로 판단된 셸
회색 점 : 사각영역이므로 거리판단을 생략하고 무조건 추출한 셸