공룡호가 사는 세상 이야기

코드를 짜다 보면, 종종 현재 페이지의 각 컴포넌트들을 제어해야 할 경우가 빈번하게 발생한다.
아래 코드는 현재 페이지에 "radio1" 으로 명명된 컴포넌트를 찾고,
그 중에서, checked 옵션이 true인 컴포넌트를 찾아 그 값을 출력한다.
getElementsByName을 사용했지만, 근래 getElementsByClassName도 추가되었다. (단 IE6은 지원되지 않음)
그 외에도 다양한 document class내 함수가 존재하니 찾아보면 많은 도움이 될 듯.

<script>
    function getSelected(){
        var element1 = document.getElementsByName("radio1");
        for(var i=0; i<element1.length; i++) {
            if(element1[i].checked){
                alert(element1[i].value);
            }//if
        }//for
    }//function
</script>

호출측
onclick=getSelected()


안녕하세요.
phpschool 에서 나이별로 막대그래프를 생성하는 방법을 검색하던 중 딱 입맛에 맞는 글이 없어서 나름 고민해서 나온 방법입니다.
이미 알고 계신 정보일 수도 있고 허접한 정보이지만 차트를 만드는데 조금이나마 도움이 되면 좋겠습니다.

그래프는 Open Flash Chart 를 사용하였습니다.
Open Flash Chart 에 대해서는 다음의 사이트를 참고하여서 보시는 게 설명보다는 나을 듯 하여서 생략합니다.
http://teethgrinder.co.uk/open-flash-chart-2/

생일 데이터가 0000-00-00 식으로 들어가 있다고 가정합니다.

Open Flash Chart 에 들어갈 데이터 파일은 다음과 같이 만듭니다.
====================
$rangeQry = "SELECT count( * ) as range_count, ( ";
$rangeQry .= " CASE WHEN a.age <10 THEN '00' ";
$rangeQry .= " WHEN a.age >=10 AND a.age <20 THEN '10' WHEN a.age >=20 AND a.age <30 THEN '20' ";
$rangeQry .= " WHEN a.age >=30 AND a.age <40 THEN '30' WHEN a.age >=40 AND a.age <50 THEN '40' ";
$rangeQry .= " WHEN a.age >=50 AND a.age <60 THEN '50' WHEN a.age >=60 AND a.age <70 THEN '60' ";
$rangeQry .= " WHEN a.age >=70 THEN '70' END ) AS age_range ";
$rangeQry .= " FROM ( ";
$rangeQry .= " SELECT num, date_format( now( ) , '%Y-%m-%d' ) - left( birth, 4 ) AS age FROM christ_basic_info ";
$rangeQry .= " )a GROUP BY age_range ORDER BY age_range ";
=====================
요로코롬 하시면 10대 미만 몇명, 10대 몇명...이런식으로 결과가 나옵니다.
$bar_values = array();
while($rangeRes = mysql_fetch_array($rangeSql)){
$rangeTempData = intval($rangeRes[range_count]);
array_push($bar_values, $rangeTempData);
}
//$bar_values = array(321,749,702,608,649,505,947,365 ); -> 예제데이터
$bar = new bar_filled( '#E2D66A', '#577261' );
$bar->set_values( $bar_values );
$tags = new ofc_tags();

$tags->font("굴림체", 12)
->colour("#333333")
->align_x_center()
->text('#y# 명');

$x=0;
foreach($bar_values as $v)
{
$tags->append_tag(new ofc_tag($x, $v));
$x++;
}

$x = new x_axis();
$x_labels = new x_axis_labels();
$x_labels->set_colour( '#666666' );
$x_labels->set_size( 12 );
$x_labels->set_labels(
array( '10대미만','10대','20대','30대','40대','50대','60대','70대이상' )
);
$x->set_labels( $x_labels );

$chart = new open_flash_chart();
$chart->set_title( $title );
$chart->add_element( $bar );
$chart->add_element( $tags );
$chart->set_x_axis( $x );

$y = new y_axis();
$y->set_label_text('#val# 명');
$y->set_range( 0, 1200, 200);

$y_labels = new y_axis_labels();
$y_labels->set_colour( '#666666' );
$y_labels->set_size( 12 );
$y->set_labels( $y_labels );

$chart->set_y_axis( $y );
$chart->set_bg_colour( '#FFFFFF' );
echo $chart->toString();

---
phpschool, 바램선수님

지난 9일 아침 트위터를 뜨겁게 달구는 글이 있습니다. 한 직장인이 자신의 상사에 관한 얘기를 쓴 글인데요. 정말 감동 자체입니다. 이 사연을 보고 여러 트위터리언들이 감동해 수많은 리트윗이 발생하고 있습니다.

사연은 이렇습니다. 어느날 이 직장인은 자신이 실수를 해 회사에 큰 피해를 끼쳤습니다. 도망가듯 회사를 퇴사하고 집에 있는데, 호랑이 같은 상사가 집에 찾아왔습니다. 호랑이 상사는 그 직원을 데리고 전국을 돌며 그 회사원이 실수한 것을 만회하고 회사로 같이 복귀합니다. 그런데, 돌아와서 보니 사장님이 그 호랑이 상사에게 사표를 돌려주었습니다. 그 호랑이 상사는 이 일을 해결하지 못하면 내가 직장을 그만두겠다며 이미 사표를 냈던 겁니다.

다음은 글의 원문입니다.

"존경할 수는 있는 사람이 있어 행복합니다

입사한 지 이제 1년, 최근까지 한분의 과장님 때문에 매일 같이 퇴사를 생각하고 있었습니다.

이 과장님이 모자란 사람이라면 차라리 낫습니다. 모든 프로젝트와 일을 칼같이 해결하는 양반입니다.
문제는 부하직원들도 자기처럼 할 수 있어야 한다는 괴상한 믿음 때문에 아랫사람들이 죽어난다는 것입니다.

3개월 전, 매일 야근에 피곤한 제가 아주 큰 실수를 저지르고 말았습니다.

저희가 하청을 주는 공장에 신제품 샘플 제작을 의뢰했는데 1,000개만 받으면 되는 것을
서류 작성 미스로 10,000개를 의뢰한 것입니다. 규정대로 한다면 2중, 3중의 확인 절차가 있지만
대부분 잘 지키지 않는 요식행위였고, 저 역시 대충 넘어간 것이 큰 화근이 되었습니다.

실수를 알았을 때는 이미 3,000개의 제품이 제작된 후였습니다. 이 제품의 출고가는 8만 원, 2,000개면 1억 6천만 원. 저는 무단 퇴사하는 것으로 도망쳐 버렸습니다. 그때는 정말 왜 그랬는지...

하지만, 과장님이 집안에 숨어 있던 저를 멱살을 잡고 끌고 나오시더니 저와 함께 찜질방과 여관을 전전하며 전국을 돌아다니면서 새로운 판매처를 확보하였습니다. 그리고 고작 사흘 만에 2,000개의 신제품을
깨끗이 팔아치웠습니다.

회사로 돌아온 후 더 놀라운 일을 겪었습니다. 회사로 돌아온 저희에게 사장님이 오시더니 과장님에게 과장님의 사표를 돌려주시더군요. 과장님이 자신이 이 일을 해결하지 못하면 그만두겠다며 사장님에게 사표를 맡기고 저와 함께 나선 것이었습니다.

저는 눈물을 쏟으며 연신 감사하다고 말했는데, 과장님은 담담하게 이렇게 말씀하셨습니다. "해결할 수 있다고 판단했으니까 사표까지 낸 거다. 특별히 널 위해서 그런 것은 아니야. 정 고맙거든 나중에 네 후임이 실수 했을 때 너도 사표 던질 각오로 그 일 해결해."

저희 과장님 존경할만한 분 아닌가요?

원문 바로 가기 http://www.twitlonger.com/show/2csmcp

이같은 사연이 공개되자 트위터리언들은 "그런 상사와 일하면 더 바랄 것이 없겠다", "정말 감동이다", "나도 저런 상사가 될 수 있을까" 등등의 리트윗을 날리며 감동하고 있습니다.



iPhone 에서 작성된 글입니다.

간만에 웹기반 코딩을 하니, 생각보다 잘 안됩니다.
늘 그렇지만, 간단한 것 하나 때문에 고생하다가 노트 해 둡니다.
그 전에 중요한 것 한가지. 물론 잘 알고 계시겠지만...
Javascript는 클라이언트 사용자의 컴퓨터에서 실행되며, PHP는 서버에서 해석되고 실행됩니다.


1. 변수를 그냥 쓰는 방법
<script>
function fx()
{
    excution += "<?=$variable?>";
}
</script>
※ string 따위의 경우, 앞뒤에 \" 처리 필요.

2. 파라미터로 전달하는 방법
<script>
function fx(variable)
{
     excution += variable;
}
</script>

※ call
echo("<script>fx(\"$phpvar\");</script>");



FTP 업/다운로드를 할 경우, 요즈음은 [자동]모드로 대부분 FTP 프로그램에서 알아서 해 줍니다만,
가끔 이 모드가 잘못되어 실컷 보낸/받은 파일이 사용할 수 없는 상태가 되기도 합니다.
또한 저 처럼, cmd창에서 windows의 기본 FTP를 이용하여 파일을 업/다운로드 할 경우에도 binary로 받겠다는 명령어를 사전에 날려줘야 합니다. 저는 이를 알고 있음에도 불구하고, 실수를 저질러서 오늘 큰 낭패를 보기도 했는데요.

기본적으로 Text 모드이건 Binary모드이건, 내용은 동일합니다. 그러나 Binary모드의 파일이 Text로 저장될 경우, 특정 문자가 다르게 저장이 됩니다. 여기서 그 특정문자는 줄바꿈 문자인데, CR+LF(캐리지리턴+라인피드) 이 문자가 다르게 저장됩니다.
Binary파일은 말 그대로 Binary방식으로 읽어들이도록 되어 있다보니, 이것이 Text로 저장되면 올바로 읽어낼 수가 없습니다.
압축 파일을 Text로 전송해 버리면, 풀리지가 않는 것도 그 이유입니다.
역으로 해석하면 어떤 파일이건간에 Binary모드로 전송하면 [문제없다]가 됩니다.

의문점이 생기시지 않나요? Binary모드로 전송하면 아무런 문제가 발생하지 않는다면, Text모드는 왜 존재하는 걸까요?
Text는 7비트로 한 개의 문자를 표현합니다. 이는 해석도 7비트로 한다는 의미가 되며, 일종의 규약이 됩니다.
7비트 단위의 규약에 따라 전송하기 때문에, 안정성과 빠른전송에 장점이 있습니다. 또한 Binary모드와 달리, 일부 정보가 유실되어도 접근이 가능하죠. 또한, 인터넷 초창기 시대에는 Text방식의 전송만이 허용이 되었습니다. 그 관습이 아직도 남아있어, 그러한 방식만 지원하는 경우와의 호환성 등으로 아직 Text모드가 존재합니다.

※ 위에서 사용한 Text 모드는 ASCII 모드와 동일한 표현임.
[덧] 본Article과 관련된 Programming 정보도 있네요 http://snbosoft.tistory.com/entry/바이너리Binary-텍스트Text-파일의-차이


지난 해 9월달 이후, 많은 것들이 변했습니다.
싱가폴로 교육 출장을 다녀왔고, 국내 고객사들을 대상으로 DR솔루션 구축을 하러 다녔습니다.
밀려드는 일에 쉴 틈 없이 바빴고, 집에 돌아오면 곯아 떨어지기 바빴습니다.
주말에는 연애(?)를 한다고 바빴고, 가끔은 현재 생활에 대한 회의가 들기도 했던 몇 개월이었습니다.
회사의 새 회계년도가 시작되었습니다. 조직개편이 있었고, 자리도 바뀌었습니다.
결혼을 했습니다. 이제는 혼자가 아니라는 생각에, 두 어깨가 많이 무거워 지는 것을 느낍니다.
참석하여 축하해 주신 많은 분들께 감사의 말씀을 드립니다.

이제는 삶의 목표도, 마음가짐도 조금은 달라져야 함을 느낍니다.
올 해의 작은 소망은, 개인적인 작은 프로젝트를 하나 하는 것입니다.
바쁘다는 핑계로 읽지 못한 책들도 많이 읽고, 가끔씩 짧은 습작도 할 수 있었으면 좋겠습니다.
이제 아내가 된 와이프와 행복한 가정을 꾸리는 것은 무엇보다 우선임을 느낍니다.
더 열심히 살아야겠습니다.


수많은 벤더에서, 시스템과 FC/SCSI카드, LTO 등을 만들고 있으며, 이를 사용하게 하는 백업 S/W또한 다양하다.
그만큼 이 장치들간의 접속/호환/운영에 많은 문제점들이 있는데, 작업 순서는 일반적으로 아래와 같다.

1. 서버에 FC/SCSI카드 장착
2. LTO와 물리적으로 연결
3. 서버에서 Drive 및 Changer(Robot) 인식
4. 백업 소프트웨어 설치 및 백업 스케줄링, 백업 실시

여기서, 3번에 주목하자.
Drive는 Tape를 읽어, 실제로 I/O를 일어나게 한다. 여기에서 Drive에 Tape을 자동으로 삽입하게 하는 Robot을 Changer라 하는데,
이 Changer의 인식이 OS에서 불가한 몇몇 장비들이 존재한다. 아니, 일반적으로 Drive만 OS에서 인식하고, Changer는 백업 소프트웨어를 설치하면 Changer를 인식한다.

Drive는 대부분 /dev/rmt 에 device가 생성이 되나, Changer가 여기에 생성되지 않는 장비들이 있다.
퀀X, 오버XX 등의 장비들이 이에 속하는데, 그 이유는 이들이 기본 인터페이스로 SCSI 인터페이스를 가지고 있기 때문이다.
대부분 LTO의 drive module은 st module을 사용하는데, 이러한 장비들은 sgen 이라 하는 모듈을 사용한다.

#modinfo |grep sgen
결과에 아무런 정보가 출력되지 않는다면, sgen driver가 load되지 않은 것이다.

sgen driver를 load한다.
#modload /kernel/drv/sparcv9/sgen

확인한다.
#modinfo |grep sgen
254 7b7e6000   3d90 151   1  sgen (SCSI generic driver 1.11)

/kernel/drv/sgen.conf 파일 내부에 changer에 해당하는 부분을 기술한다.
device-type-config-list="changer";

그 후, 해당 Changer의 target number와 lun number를 /kernel/drv/sgen.conf 파일 내부에 기술한다.
name="sgen" class="scsi" target=0 lun=0;
name="sgen" class="scsi" target=0 lun=1;
name="sgen" class="scsi" target=1 lun=0;
name="sgen" class="scsi" target=1 lun=1;

Changer를 인식시킨다
#touch /reconfigure
#shutdown -g0 -i6 -y
또는,
#update_drv -f sgen

인식 확인은 다음과 같이 한다.
#ls /dev/scsi/changer
(changer는 cxtxdx 명으로 인식된다.)

이후, 백업 소프트웨를 설치하여 해당 Changer(Robot)을 컨트롤 하는 테스트와 함께 백업 테스트를 실시해 본다.

협력사 대상으로 솔라리스 Jumpstart 구성 방법을 강의하고, 필요한 내용을 요약 해 둔다.
강의 내용은 자사 플랫폼만을 대상으로 하였으나, 일부 범용적으로도 사용할 수 있도록 수정.
아래 예제는 서버 1대에 클라이언트 1대를 대상으로 함.

1. 인스톨서버에 디렉토리 작성 후 CD로 부터 OS Image 생성
# mkdir -p /export/install/Sol10
# cd /cdrom/cdrom0/s0/Solaris_10/Tools
# ./setup_install_server /export/install/Sol10
(시간이 꽤 걸림) <- 여기서 생성된 /export/install/Sol10 디렉토리 내용을 iso로 묶어 두면, 재사용 가능

2. 미니루트 작업용 디렉토리 작성 후 복사, unpack중 에러발생할 경우, 가볍게 무시
# mkdir /tmp/work
# /boot/solaris/bin/root_archive unpackmedia /export/install/Sol10 /tmp/work
# rm /tmp/work/tmp/AdDrEm.lck

3. 드라이버 설치
Jumpstart는 네트웍을 통해 설치를 하므로, 해당 네트웍 인터페이스에 대한 드라이버가 없다면, 해당 드라이버를 설치한다.
아래 드라이버는 Fujitsu용 Giga-Ethernet 드라이버와 Ultra-SCSI 드라이버 설치과정이다.

3.1. 미니루트에 FJSVgid 설치
# cd /cdrom/cdrom0/FJSVgid_4.0/10
# pkgadd -R /tmp/work -d . FJSVgid.u
# pkgadd -R /tmp/work -d . FJSVgid.v

3.2. 미니루트에 Ultra SCSI 설치
# cd /cdrom/cdrom0/ultra_lvd_driver/10
# pkgadd -R /tmp/work -d . FJSVulsa.u
# pkgadd -R /tmp/work -d . FJSVulsa.v
# patchadd -C /tmp/work 914572-01(?) - 그냥 들어있는 패치하면 됨

4. 미니루트를 재포장 후 적용
# mkdir -p /tmp/media/Solaris_10
# /boot/solaris/bin/root_archive packmedia /tmp/media /tmp/work
# cd /tmp/media
# find boot Solaris_10/Tools/Boot | cpio -pdum /export/install/Sol10
# df -k 확인
# umount -f /dev/lofi/1
# lofiadm -d /dev/lofi/1

5. 커스텀 jumpstart 디렉토리 작성, 드라이버, 샘플 복사
# mkdir /jumpstart
# echo "share -F nfs -o ro,anon=0 /jumpstart" >> /etc/dfs/dfstab
# shareall

(Giga-Ethernet)
# mkdir /jumpstart/fjgi
# cp -p /cdrom/cdrom0/install_v4 /jumpstart/fjgi/.
# cp -p /cdrom/cdrom0/admin /jumpstart/fjgi/.
# cp -pr /cdrom/cdrom0/FJSVgid_4.0/10/* /jumpstart/fjgi/.
(Ultra-SCSI)
# mkdir /jumpstart/fjulsa
# cp -p /cdrom/cdrom0/install /jumpstart/fjulsa/.
# cp -p /cdrom/cdrom0/admin /jumpstart/fjulsa/.
# cp -pr /cdrom/cdrom0/ultra_lvd_driver/10/* /jumpstart/fjulsa/.

# cp -r /export/install/Sol10/Solaris_10/Misc/jumpstart_sample/* /jumpstart

6. nfs서버 가동중 확인, disable이면 enable
# svcs -av | grep nfs
# svcadm enable (기동시킬 서비스)

7. profile 작성 (설치 기본정보를 기록한다-아래 형식에 주의)
# vi /jumpstart/profile
 install_type initial_install
 system_type server
 partitioning explicit
 cluster SUNWCXall
 filesys c0t0d0s0 51200 /
 filesys c0t0d0s1 24576 swap
 geo             Asia
 locale          ko

8. finish 작성
# vi /jumpstart/finish
 #!/bin/sh
 BASE=/a
 JUMPSTART=/a/mnt
 mount -F nfs 인스톨서버IP:/jumpstart ${JUMPSTART}
 ${JUMPSTART}/fjgi/install_v4 -R ${BASE} -d ${JUMPSTART}/fjgi -p sun4u
 ${JUMPSTART}/fjulsa/install -R ${BASE} -d ${JUMPSTART}/fjulsa -p sun4u
 umount ${JUMPSTART}
 exit 0

9. rules 작성
# vi /jumpstart/rules의 가운데 쯤, 클라이언트 호스트 정보 입력
 hostname 클라이언트호스트명 - profile finish

10. rules 체크 (ok가 떨어질 때 까지 위 내용 확인)
# cd /jumpstart
# ./check -p /tmp/media -r rules

11. 인스톨서버에 클라이언트 서버정보 추가
# vi /etc/hosts
클라이언트IP[탭]hostname(클라이언트)[탭]loghost

12. 클라이언트의 맥어드레스 확인
클라이언트 PROM(ok-mode까지 부팅)
{ok} show-nets
jumpstart에 사용될 ethernet-port 선택
{ok} cd ethernet-port 주소
{ok} .properties
mac 부분에서 해당 MAC Address 확인

13. 클라이언트 서버 맥 등록
# vi /etc/ethers
맥어드레스 hostname(클라이언트)

14. bootparams 생성
# /export/install/Sol10/Solaris_10/Tools/add_install_client -c 서버호스트명:/jumpstart 클라이언트호스트명 sun4u  <== 호스트명은 꼭 /etc/hosts에 들어가 있어야하며(IP안됨) 서버호스트명은 loghost명 이어야 됨
# cat /etc/bootparams 확인하여 올바로 값이 입력되었는지 확인

15. 인스톨
{ok} boot net - install
위 방법이 안될경우, net의 alias 를 확인하거나
{ok} boot 자신의 네트웍 물리주소 - install

#mkisofs -o /tmp/test.iso -V cies -R /test

-o : Output Option
/tmp/cies.iso : Image file이 생성되는 디렉토리
-V : Volume 이름 Option
cies : Volume 이름
-R : Sub dir. Option
/test : Image를 만들고자 하는 디렉토리(Source)

1. 건강 관리에 좀 더 투자하기(주4회 1시간씩 / 6개월 1회 건강검진)
 - 10kg 감량(한달에 1.5kg감량 * 6, 1kg* 1, 남은 5달은 유지) / 근육량 2배 / 체지방 30감소 / 체중관리표 작성
 - 마라톤 대회 2회 출전
2. TOEFL IBT 120 / JPT 600
 - 출퇴근길 외국어 서적 보기/청취, 자기전 외국어 공부 30분씩, 시험치고 월별 그래프 작성
3. 독서 일주일에 1권(전공서적/개발서적 제외)
 - 자기 개발서는 30%이상 넘지 않기 / 독서후 감상평 기록
4. 수면시간 지키기(7am - 1am or 6am - 12am) / 최소 6시간 이상 수면 / 토요일 제외 / 일요일 적용
5. 피아노 다시 시작하기
 - 3개월에 1곡씩, 총 4곡 마스터(곡 리스트는 1월 둘째주 까지 선정)
6. 여행경비 따로 모으기(150-200)
 - 월 15씩 12개월
7. 가계부 작성 (지출 내역 몽땅 기록)
 - 월별 그래프 작성 / 매월말 개선가능한 지출내역 작성 및 차월 계획
8. 블로깅 / Facebook 외 소셜 네트웍 강화
 - 일주일 1회 이상 포스팅
9. 주 1회, 영화감상 (DVD/DVIX/영화관 포함)
 - 영화 감상평 작성
10. 컬럼쓰기 (월 1회로 천천히 시작)
11. 위 10가지 계획 실천 내역 수치화 하여 매월 말 평가.

*option*
1. 업무에 충실 (부서 업무 효율화에 좀 더 기여하기)
 - ACM Guide 완성하기
2. 새로운 취미 가지기 (시간이 많이 투자되지 않는 것으로, 집에서 할 수 있는 것으로)
3. SERA 졸업 모임 활성화 (월 정기모임 / 네트워킹 구축)
4. 대학원 진학에 대한 구체적 계획작성 (회사 지원)
5. 개발 커뮤니티 또는 오픈소스 개발 시작/성과 거두기 (touching ?)