2007년 5월 30일 수요일

ASDT(Action Script Development Tool)가 다시 살아났네요.

ASDT가 0.0.8 빌드 이후로 문을 닫은 줄 알았습니다만, 다시 살아났네요.
참고로, ASDT는 ActionScript 2를 Eclipse에서 프로그래밍할 수 있게 해주는 플러그인입니다.
sourceforge.net에는 0.0.8이 가장 최신 빌드로 나와있습니다만, 테스트릴리즈에 들어가보시면 0.0.9버전까지 나와있습니다. 이번 0.0.9의 가장 큰 특징은 아마도 MTASC를 내장했다는 점이겠네요. 이전에는 MTASC 같은 빌드 프로그램을 따로 설치를 해야했으나 0.0.9로 오면서 ASDT만 설치하면 ActionScript 프로그램을 바로 프로그래밍해서 빌드할 수 있게 되었다는 점입니다.
 
또하나 기분 좋은 소식은 ASDT에서는 AS3를 지원할 계획을 포함하고 있다고 하네요.
참고, MTASC가 ActionScript2까지 지원하고 AS3를 지원하지는 않고 haXe.org를 지원하기로 했다고 하네요. haXe를 사용해서 Flash export 지원됩니다.

ASDT를 사용해서 Flash를 만들고 싶으시다면, 먼저 File> New > New ActionScript Project 를 사용해서 ActionScript 프로젝트를 만듭니다.
사용자 삽입 이미지

그리고, src폴더에서 as파일을 만들어서 프로그램을 작성한 다음에 Run > Run... 을 사용해서 Run 다이얼로그를 띄운 다음에 AS Standalone Player에서 새 프로그램을 생성하고, main 함수를 선언한 as 클래스를 지정해주고 Run을 누르면 bin폴더에 swf파일이 생성됩니다.

P.S.1  Flash ActionScript 2.0의 API를 이용해서 Java의 Graphics 클래스를 만든 분이 있더군요.
P.S.2  Flash ActionScript 2.0 API 주소
P.S.3  _root는 root MovieClip에 대한 참조를 지정하거나 반환합니다. _root를 사용해서 MovieClip을 생성할 수 있더군요. (ActionScript 1.0)

2007년 5월 29일 화요일

정기검진 결과... ^^;;;

정기검진 결과, 모두 정상이라고 하시더군요. 하나 빼고!!
사용자 삽입 이미지

불행하게도 과체중이랍니다 ㅠㅠ.
새해들어 살빼기를 목표로 해서 5kg를 뺐는데, 아직 5kg은 더 빼야 된다네요 흑~

이미지 출처: Peggy님의 고양이 이미지 in Flickr

2007년 5월 26일 토요일

발언을 듣는것과 읽는 것의 차이?

N사의 뉴스를 보다보니 문화일보에서 '盧 “정말 필요한 배일까” 발언 논란'이라는 글이 올라와 있더군요.
노무현 대통령은 25일 울산 현대중공업에서 열린 해군 이지스구축함 ‘세종대왕함’ 진수식에서 “정말 이 좋은 배가 우리에게 필요한것이냐 곰곰이 생각도 해보았다”면서 “우리가 언제까지 북한하고만 아옹다옹하고 있을 일은 아니지 않으냐”고 말했다.

기사의 첫 문단을 보면 "세종대왕함이 필요없다."라는 말로 들립니다. 그러나, 실제 원문을 보면,
정말 이 좋은 배가 우리에게 필요한 것이냐 곰곰히 생각도 해보았습니다.
우리가 언제까지 북한하고만 아웅다웅하고 있을 일은 아니지 않습니까.

장차 저는 동북아시아의 질서가 화해와 협력 그리고 통합의 질서로 나 아 가리 라고 믿고 있습니다.
전세계의 질서가 그와같은 방향으로 가고 있기 때문에 동북아시아도 따라가지 않을 수 없으리라는 확고한 믿음을 가지고는 있습니다.

그러나, 아직도 이 동북아시아의 멈추지 않는 군비경쟁이 있기 때문에 우리도 구경만 하고 있을수는 없다는 것이죠
북한하고만의 경쟁이 아니라 동북아시아 경쟁을 위해서 필요하다는 의미더군요.


글에도 어휘에 따라 차이가 많지만, 말도 뉘앙스에 따라 참 차이가 많다는 생각이 들게하는군요.
아마도, 이글을 쓴 문화일보의 이미숙 기자는 연설을 안듣고 자기 읽고 싶은 내용만 골라 읽었나 보군요.

출처:
  盧 “정말 필요한 배일까” 발언 논란
  [연설] 이지스함 '세종대왕함'진수식

2007년 5월 25일 금요일

Slider의 부분이름을 뭐라 부를까요?

Slider를 만들 일이 있어서 js로 만들던 도중에 짓기가 어려워서 Java의 JSlider의 API문서를 좀 뒤져봤습니다.
Java로 프로그래밍할 때는 별생각 없이 사용했는데, 다양한 부분으로 구성이 되더군요 ^^
사용자 삽입 이미지

먼저, 슬라이더의 값을 설정하는 버튼을 knob(손잡이)라고 합니다. 그리고 값의 구간을 표시하는 부분을 track이라고 하구요.  아래 쪽의 값부분을 나타내는 선들은 tick이라고 합니다. (선 중에서 큰단위를 나타내는 긴 선은 major tick, 작은 선은 minor tick이라고 합니다.) 값을 표시해주는 부부은 label이라고 하구요.

상당히 공돌이틱한 포스트가 되어버렸지만, 변수이름 짓는것도 프로그래밍의 중요한 요소 중 하나니 알아두시면 좋겠죠? ^^

출처: JSlider(Java Platform SE6)

2007년 5월 21일 월요일

검색엔진에 최적화하기

검색엔진에 최적화시키기 위한 방법(How To Design A Search Engine Friendly Website)이라는 글이 올라왔네요.

1. Search Engine Friendly Pages
검색 엔진이 필요로 하는 속성들을 고려하여서 페이지를 작성합니다. Title, Description, Keyword, Alt 태그같은 속성을 사용합니다. 페이지 내부에서 출력을 위해 사용되는 javascript 사용을 자제합니다.

TIPS:
  • table을 사용하는 경우 페이지를 단순하게 사용합니다.
  • frame을 사용하는 것을 피합니다.
  • grphic요소를 사용해야할 경우 꼭 사용해야하는지를 한번 더 생각해봅니다. 만약, 사용해야한다면, alt태그를 사용하는 것과 내용에 관련이 있는 이미지를 사용합니다.
  • 이미지를 사용하는 경우 이미지 앞에 페이지의 내용을 배치하거나 텍스트 사이에 이미지가 배치되게 합니다.
2. Keywords
웹사이트나 웹페이지를 디자인할 때, 10~15개의 키워드를 생성합니다. (Wordtracker를 사용하는 것도 좋은 방법입니다.)

3. Content
검색엔진은 페이지의 body를 분석해서 키워드와 문구를 생성하기 때문에, text body안의 핵심 키워드에 대해서 heading 태그를 사용하거나 boldhyperlink를 사용해서 강조해줍니다.

4. Page Title
페이지의 타이틀도 페이지를 나타내는 핵심 키워드로 사용되기 때문에 선택에 주의가 필요합니다. 일반적인 검색엔진에서는 페이지의 타이틀에 제한을 가지고 있기 때문에 9개를 넘지 않도록 해야합니다.

5. Page Description
페이지를 묘사하는 META Description 태그도 중요합니다. 사용자가 검색엔진으로 검색을 했을 때, 나오는 내용이므로 여기에 주의를 해서 작성을하고, 20~25개의 단어로 이루어진 짧은 글과, 사용자가 페이지를 보지 않더라도 내용을 알 수 있어야 합니다.

6. Graphics
Graphic을 사용할 때는 Graphic과 관련있는 alt를 사용해서 어떠한 Graphic인지를 나타내주고, text:image의 비율이 70:30안에서 유지되어야 합니다.

7. Site Map
Site Map은 검색엔진이 웹사이트에서 어떠한 페이지가 어디에 있는지 아는 중요한 수단이므로 웹사이트 설계 시 고려해야할 중요한 사항 중 하나입니다.

8. Navigation Links
네비게이션 링크들이 플래시나 팝업같이 복잡하게 구성이 될 경우, 검색엔진은 현재의 페이지에서 어디로 가야되는지 찾지 못하는 경우가 있습니다. 따라서, 복잡한 구성이 아닌 하이퍼링크텍스트 기반의 네비게이션을 생성해 주는게 좋습니다.

출처 : How To Design A Search Engine Friendly Website via reddit.com

일본 프로야구 구단의 모기업

전에, 야근하면서 식사를 하다가 일본 프로야구 팀명에 대한 얘기가 나왔습니다.
이승엽 선수의 경기가 있었거든요.

그 때 '요미우리 자이언츠'의 요미우리가 모기업인지? 연고지인지? 얘기가 나왔었습니다.
만약, 요미우리가 연고지라면 '한신 타이거스'의 한신은 연고지인가?
'한신 타이거스'의 한신이 모기업이라면 '히로시마 도요카프'의 히로시마는 뭐지? -_-;;;

주말에 시간이 남아서 잠시 검색을 해봤습니다.
일단, 일본의 프로야구는 센트럴리그와 퍼시픽리그로 나뉩니다.
 
사용자 삽입 이미지

센트럴리그
  • 요미우리 자이언츠 - 도쿄를 연고지로 하고 있고, 요미우리 신문사 소유
  • 한신 타이거스 - 효고현 니시노미야시, 한신철도 소유(한신 타이거스의 모기업에 대해서는 정확하게 나와있지 않아서 구글에서 검색했습니다.)
  • 주니치 드래곤즈 - 아이치현 나고야시 모기업은 주니치 신문사에서 소유
  • 히로시마 도요카프 - 히로시마현 히로시마시를 연고지로하며, 시민구단 (검색하다보니 Naver지식in의 geperensis 님이 도요(동양방직)에서 인수하여 운영 중이란 글을 올리셨더군요.)
  • 야쿠르트 스왈로스 - 도쿄도를 연고지로 합니다. 모기업은 식품·음료회사인 일본 야쿠르트입니다. (한국야쿠르트는 일본야쿠르트와의 합작회사라고 하네요)
  • 요코하마 베이스타스 - 가나가와현 요코하마시를 연고지로 하고 다이요어업을 모기업으로 했다가, 방송국인 TBS에서 인수. 여기서 앞에 붙는 요코하마는 기업명이 아닌 지역명을 따르고 있다고 합니다.
사용자 삽입 이미지

퍼시픽리그
  • 지바 롯데 마린즈 - 도쿄 인근 지바현 지바시를 연고로 하고 있으며, 마이니치 신문에 의해 1949년 창단, 1969년 롯데가 인수
  • 홋카이도 니혼햄 파이터스 - 삿포로가 연고지, 식품회사인 니혼햄이 모기업
  • 후쿠오카 소프트뱅크 호크스 - 후쿠오카가 연고지이고, 슈퍼마켓 체인회사인 다이에가 구단을 1989년에 인수 했었고, 2005년에 소프트뱅크로 넘어갔다.
  • 오릭스 버팔로즈 - '긴테쓰 철도'가 운영하던 긴테쓰 버팔로즈와 오릭스 블루웨이브가 합병하여 만들어진 구단를 모기업으로 하며 오사카시를 연고지로 두었었다. (현재의 모기업은 모르겠네요. -_-;;)
  • 도호쿠 라쿠텐 골든이글스 - 센다이를 연고지로하고, 인터넷 쇼핑몰 라쿠텐을 모기업으로 하고 있다.
  • 세이부 라이온즈 - 도쿄 인근 사이타마현 도코로자와시를 연고, 민간 철도회사인 세이부 그룹에서 운영

출처 :

이미지 출처 : Nippon Professional Baseball

P.S. 일본 프로야구팀은 다른 야구팀보다 모기업이 자주 바뀌네요. 궁금증 때문에 찾아서 올린 포스트니 잘못된 내용이 있을 수 있습니다. (제가 잘 몰라서 ^^;;) 틀린부분 있으면 말씀해주세요. 수정할께요 ^^;;;;

2007년 5월 18일 금요일

CSS Hack 사이트

rirublue님이 가르켜 주신 nmind님의 CSS핵 정리도 좋지만, CENTRICLE.COM의 "Will the browser apply the rule(s)?" via Fading Roses & Raging Viruses 도 좋네요. 표 형태로 깔끔하게 정리되어 있구요.

사용자 삽입 이미지
출처 : CENTRICLE.COM의 "Will the browser apply the rule(s)?" via Fading Roses & Raging Viruses

P.S. : 그나저나,  Opera 8,9만 적용되는 핵은 없군요.

2007년 5월 17일 목요일

메모리 부족

요즘 들어 메모리 부족을 많이 느낍니다. 이클립스를 주 개발 플랫폼으로 쓰고 있는데 한두시간 작업하면 OutOfMemory가 나는군요. 견디다 못해서 오늘 설치한 대부분의 프로그램을 제거 했습니다. VPN, Symantec AntiVirus, Apache 몇 개만 남기고 삭제했는데도 기본으로 315M를 먹어치우는군요.

도대체 뭐가 먹는건지 -_-;;

사용자 삽입 이미지

tapefailure: 사용자가 웹에서 어떻게 행동하는지를 분석한다.

사용자 삽입 이미지


tapefailure
  • 웹에서 사용자의 동작을 분석하는 툴입니다.
  • iframe과 prototype.js를 사용했다고 합니다. (옷: iframe은 데이터 전송을, prototype.js로는 마우스 위치, 또는 키보다 눌림을 기록했을 것 같군요.)
  • 자바스크립트의 용량은 10KB정도 됩니다.
  • 사용자의 동작을 수집하고 재생할 수 있습니다. (옷: 사용자의 동작을 수집 재생하는 부분이 프라이버시 침해는 아니라고 공지를 해놨다지만, 사용자들이 알면 어떤 반응을 보일지는...)
  • 분석기능(platform, browser, window size)등의 기능을 제공합니다.
  • 마우스의 움직임, 클릭, 멈춤을 통하여 사용자가 어디에 집중(heatmap)을 하고 있는지를 분석합니다. (옷: 시선을 빼고 마우스의 움직임만으로 heatmap 작성이 가능한지는 좀 의문스럽네요.)
출처 : tapefailure via Ajaxian

Flash Tooltips

Ajaxian에 Flash Tooltip이 소개되었습니다.

Peeter Goodman 씨가 만든 라이브러리로 img 또는 a 태그를 사용하면 툴팁을 만들 수 있는데, 굳이 따로 만든 이유는 다양한 텍스트 포멧을 줄 수 없기 때문이라고 합니다. 첫 인상은 깔끔한 느낌이네요. 다이얼로그가 작아서인지 느린 것 같지는 않습니다.(이전 글의 다이얼로그를 보면 늦기는 합니다. 일부러 늦게 한것인지는 모르겠습니다. 코드까지는 보지를 않아서 -_-;;)
사용자 삽입 이미지
기타 특징들
  • 라이센스: GPL
  • jQuery가 필요합니다.
  • tooltip.config파일을 사용해서 세부 설정을 할 수 있습니다.
출처 : Flash Tooltips Using jQuery via Ajaxian.com

2007년 5월 16일 수요일

필립스 핸디형 청소기 FC6050

먼지가 하도 많이 들어와서 작은 청소기를 하나 구매했습니다. 디자인과 바람세기, 작은 집의 청소를 고려해서 샀는데요.
사용자 삽입 이미지

장점
  • 색상 및 디자인이 산뜻합니다. 사진과 다르게 깔끔합니다.
  • 2중 먼지 필터, 2중 필터라서 좋기보다는 물로 새척할 수 있어서 좋더군요.
  • 머리카락 효과적으로 청소, 매트에 붙어있는 머리카락을 쉽게 때어내더군요.
  • 바람세기도 괜찮은 것 같습니다. (연속 사용 시간이 10분이라더군요. 이건 단점인가? -_-;;)
  • 다른 모델에 비해서 가볍다고 합니다.(1.2kg)

단점
  • 충전 시간이 많이 걸립니다.(일반 사용시간에 대한 언급이 전혀 없지만, 처음 사용시에는 16시간을 충전해야 한다는군요. -_-;;)
  • 아답터와 받침대가 고장날 경우 수리가 불가능합니다.(폐기처분되어야 한다는군요.)
  • 넓적한 노즐이 없습니다. 솔 노즐과 틈새 노즐만 제공되어서 넓은 방 청소에는 적합하지 않더군요.

P.S.1 가전제품에 대해서도 디씨인사이드나 K벤치처럼 벤치마킹하는 사이트가 있으면 좋겠더군요. 선택의 폭도 넓긴하지만, 제품에 대한 정확한 정보를 구분하기가 어려워요 --;;;
P.S.2 다른 청소기 중에서 5시간 충전하고 10분쓴다고 자랑하는 제품이 있었는데.. 자랑할만 하군요. -_-


출처: CJmall 필립스 핸디형 청소기 FC6050

2007년 5월 14일 월요일

TuneGlue

Programmableweb.com의 RSS 피드를 보다 재미있는 쇼핑몰을 봤습니다.
TuneGlue라는 사이트인데, Amazon.com uk와 Last.fm의 API를 사용해서 음악가들 사이의 관계를 비쥬얼하게 보여준다고 하네요.
사용자 삽입 이미지

깔끔하면서도 절제된 색상과, 움직이는 트리구조가 마음에 드는군요.
Kanno Yoko 씨를 검색해봤는데, 앨범은 그닥 없습니다. (-_-;; 영국에는 오타쿠가 이리도 없단말인가~!!)

출처: TuneGlue by Programmableweb.com

MNCAST의 새로운 수익모델..

오랜만에 mncast.com 동영상을 보다 [성인] 카테고리를 들어가보니 "엠엔캐스트 성인 인증하기"라는 새로운 절차가  도입 되었더군요.
그것도 24시간만 인증되면서 수수료 270원(부가세 10%별도)라는군요.
사용자 삽입 이미지


처음에는 이런걸 누가봐~!라는 생각이었지만, 포털에서의 강력한 단속이라는 시국을 생각한다면...

사용자 삽입 이미지




2007년 5월 11일 금요일

본관을 영어로 하면?? -_-;;

오늘 아침에 외국인을 만났습니다.
컨퍼런스 참석차 왔다고 하는데, 시간이 안맞더군요. 그래서 본관(本館)으로 가야한다고 얘기를 하려고 했는데..

'본관(本館)이 영어로 뭐지 ???'
사용자 삽입 이미지


결국엔, 손짓 발짓으로 얘기는 통했습니다만... 영어 공부 해야겠네요 ㅠㅠ

참고로 본관은?
사용자 삽입 이미지
생각해보니 -_-;;
여기가 본관이고 외국인이 가야할 곳이 신관이었군요. --;;;;;;;;;;;

영어 단어 출처: Naver 영어사전

2007년 5월 10일 목요일

JavaScript와 CSS를 하나의 파일안에서 사용하기

Ajaxian에 재미있는 기사가 올라왔습니다.
JavaScript와 CSS를 하나의 파일로 쓰는 방법에 관한 기사(Squeeze CSS and JS into one file)인데요. 브라우져의 JavaScript파서와 CSS파서가 <!--에 대해서 동일하게 주석(또는 무시)처리를 한다는 점을 이용하였더군요.
<!-- /*
    function t(){}
<!-- */
<!-- body {background-color:Aqua;}
- CSS 파서의 경우 <!--를 만나는 경우 무시를 해버립니다.
- JavaScript 파서의 경우 <!--를 만나는 경우 한 줄을 주석처리합니다.

따라서, 위의코드를 CSS파서에서 보면 다음과 같이 인식을 합니다 .
<!-- /* CSS파서는 여기를 주석처리 합니다.
    function t(){}
<!-- */
<!-- body {background-color:Aqua;}
<!--를 무시하고 /* */ 부분을 주석처리하고 남은 나머지 부분을 CSS로 인식합니다.

반면에, JavaScript 파서에서는 다음과 같인 인식을 합니다.
<!-- /*
    function t(){}
<!-- */
<!-- body {background-color:Aqua;}
<!-- 부분을 한 줄 주석으로 판단하고 남은 부분을 JavaScript로 인식합니다.
<!-- 말고도 //로도 동일하게 처리가 가능합니다.

출처 : "Combine CSS with JS and make it into a single download!" by Ajaxian

LukeW님의 Web Application Page Hierarchy

LukeW님의 블로그에 Web Application Page Hierarchy라는 포스팅이 올라왔습니다.
WebVisions 2007에서 발표하신 자료라고 하네요.
사용자 삽입 이미지

큰 주제는 "왜 페이지를 계층화시키고, 어떻게 계층화를 할 것인가" 입니다.
그 중에서 "우리는 어떻게 보는가?(How We See)"라는 부분에서는 동질성, 차이점, 의미를 두기, 그룹화, 관계맺기 등의 여러 관점으로 설명이 되어있는 점이 좋았습니다.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

음.. 제가 설명하기(개발자가 뭘 알겠습니까 ㅎㅎ ^^;;)보다는 링크를 클릭하셔서 자료를 보시는게 더 빠를것 같네요 ^^

아래는 LukeW님의 발표자료에 나와있는 예제중 하나입니다.
사용자 삽입 이미지
사용자 삽입 이미지

단순하게 보이는 사이트라도 강조색 하나와, 배치만으로도 이정도의 효과를 낼 수 있다는게 매우 신기하네요.

출처: LukeW님의 블로그에 Web Application Page Hierarchy

PS. 89장이나 되는 많은 분량의 pdf이나, 예제 사이트가 많고, 영어도 알기 쉽게 되어있네요. 꼭 한번 읽어보세요.

ColorSchemes.org


사용자 삽입 이미지
ColorSchemes.org라는 Color와 관련된 리소스를 정리한 사이트가 나왔습니다.
Color Tools(Online/Offlie), Color Schemes, Individual Colors, Techniques and References 항목이 정리되어 있네요.

출처: ColorSchemes.org by Techhawking

2007년 5월 8일 화요일

Fleuron(or leaf) - ❧ ❧ ❧

Jon Aquino씨의 블로그에 "How to write a fleuron character - useful for separating paragraphs of longhand"라는 글이 올라왔습니다. Fleuron(❧)이 뭔가 글을 읽어봤는데요.

Jon Aquino씨의 블로그에 Fleruron이란 생각에 변화가 생기거나 생각을 중단한 것을 나타내는 유용한 기호라고 합니다. 문단의 시작부에는 한번사용하는게 더 유용하긴하지만 기호를 세번 연달아 사용하는 경향이 있다하구요.

본문: The fleuron (or leaf) is a usefulsymbol for indicating a pause or change of thought. They tend to comein threes, though a single fleuron can be useful to indicate thebeginning of a paragraph.
Wikipedia에 Fleuron을 검색해보니 없더군요. 네이버 영어사전 검색에서는 "꽃무늬 장식"이라고 나오더군요.
(영문과이신 분은 아실지 모르겠네요 ^^;;)

Flickr에서 검색해보니 책과 관련된 fleuron 사진이 있기는 하더군요. 정확하게 무엇인지는 모르겠습니다만, 책속에 나오는 꽃처럼 생긴 기호들을 전부다 칭하는게 아닌가 하는 생각이 드네요.
출처:

2007년 5월 7일 월요일

4장 컨테이너,블록,반복자

  배열(Array)
Array 클래스는 객체 참조를 콜렉션(Collection)으로 저장합니다. 배열의 기본 특징은 다음과 같습니다.
  • []를 사용하여 위치를 지정합니다.
  • 위치는 정수로 지정을 합니다.
  • 인덱스는 0부터 시작합니다.
  • 정수로 지정하면 해당 위치의 객체를 반환하고, 없는 경우에는 nil을 리턴합니다.
  • 음수로 지정하는 경우에는 뒤에서부터 찾습니다.
  • 배열 인덱스를 [start, count]를 사용하여 새로운 배열을 반환할 수 있습니다.
    a = [1,2,3,4,5]
    a[1,4]  -> [2,3,4,5]
  • 또한 범위(.. ...)를 사용하여서 새로운 배열을 반환할 수 있습니다.
    a = [1,2,3,4,5]
    a[1..3]  ->  [2,3,4]   # ..는 마지막 위치를 포함합니다.
    a[1...3]  ->  [2,3]    # ...는 마지막 위치를 포함하지 않습니다.
  해시(Hash)
배열과 흡사합니다. 배열의 인덱스는 정수이나, 해시의 인덱스는 어떠한 종류의 객체도 사용할 수 있습니다. 키 => 값의 쌍을 중괄호 사이에 써서 해시를 정의합니다. 해시에는 원소에 순서가 없기 때문에, 스택이나 큐로는 쓰기 어렵습니다.
 
   h = {'dong' =>'canine', 'cat' =>'filine', 'donkey'=>'asinine'}

  SongList 컨테이너 구현하기
class SongList
   def initialize
      @songs = Array.new
   end
   def [](index)
      @songs[index]
   end
end

  블록과 반복자
class SongList
   def with_title(title)
      @songs.find{|song| title == song.name}    # title이 song(songs의 element)의 name과 같은지 비교
   end
end
블록은 메소드 호출 바로 뒤에만 나타납니다.
블록 안의 코드는 나타나자마자 실행되지 않으며, 블록이 나타날 때의 문맥을 기억하고 메소드로 들어갑니다.
def three_times
   yield "A"
   yield "B"
   yield "C"
end
three_times {|name| puts name}
또한, 위의 코드처럼 매개변수를 넘기고 이를 넘겨 받을 수도 있습니다.
블록은 {}로도 정의할 수 있으나, do...end를 사용하여 정의할 수 있습니다. 이 경우에는 {}보다 우선순위가 더 낮습니다.

inject 메소드는 컬렉션의 원소를 하나씩 반복하며 모아서 새로운 값을 만듭니다.
   [1,3,5,7].inject(0) {|sum,element| sum + element}   -> 16

inject 메소드에서 sum의 값은 0이 됩니다.(매개변수가 됩니다.) element의 경우에는 [1,3,5,7] 배열의 첫 번째인자가 됩니다. 두 번째 실행될 때는 바로 전에 실행된 블록의 반환 값이 sum이 됩니다.
매개변수가 없는 경우에는 [1,3,5,7] 배열의 첫 번째 값이 인자가 됩니다.

  트랜잭션을 위한 블록
class File
   # *args: 실제로 메소드에서 넘겨받은 매개변수를 모아서 배열로 만들고 args로 이름을 붙인다.
   def File.open_and_process(*args)
      # ["test", "r"]을 배열로 받아서 File.open으로 넘긴 다음에 블록을 실행합니다.
      f = File.open(*args)
      yield f
      f.close()
   end
end

File.open_and_process("test","r") do|file|
   while line = file.gets
      puts line
   end
end

  블록은 클로저이기도 하다.
Button을 상속받아 새로운 Button을 만드는 경우, 새로운 버튼을 만들기 위해서 많은 수의 하위클래스가 필요해지고, 실제 버튼을 눌렀을 때 동작하는 부분은 버튼이 아니라 버튼에 의해서 실행되는 코드가 책임을 가지고 있다.

songlist = SongList.new
class JukeboxButton < Button
   # &를 붙일 경우, 코드 블록이 있는지 살펴본 다음에 결합된 코드는 Proc 클래스 인스턴스로 변환되어
   # 형식인수에 할당됩니다.
   def initialize(label, &action)
      super(label)
      @action = &action
   end
   def button_pressed
      @action.call(self)
   end
end
start_button = JukeboxButton.new("Start") { songList.start }
pause_button = JukeboxButton.new("Pause") { songList.pause }

Proc객체를 만들어 얻는 것은, Proc이 정의된 시점에서의 모든 문맥 정보를 함께 갖게 된다는 점입니다. self값과 범위내의 메소드, 변수, 상수를 포함하게 됩니다.(closure)

def n_times(thing)
   return lamda {|n| thing *n}   # 블록을 Proc객체로 변환시켜 줍니다.
end
p1 = n_imes(23)
p1.call(3)

2007년 5월 3일 목요일

[Script.aculo.us] dragdrop.js

  dragdrop.js
script.aculo.us에서 Drag&Drop 기능을 제공해주는 라이브러리입니다.

  Droppables
드래그 대상이 되는 Draggable객체들을 Drop할 수 있는 element들을 관리하는 클래스입니다.
사용자 삽입 이미지

  Attribute
Droppables.drops: Array - Droppable 객체(실제로는 add()의 options 전체 항목이 저장됩니다.)들을 저장하는 배열입니다.

  Method
1. Droppables.add(element, options) - Droppable 객체를 추가합니다. options로 다음 사항을 받을 수 있습니다.
options 항목들
  • accept - Droppable에서 받아들일 Draggable 객체의 클래스 스트링들을 설정합니다.
  • containment - Droppable에서 받아들일 Draggable객체의 element나 id를 설정합니다.
  • hoverclass:boolean - 받아들이기로 한 Draggable객체가 Droppable의 위에 있을 때 css를 설정하는 class를 설정합니다.
  • overlap - 'horizontal' 또는 'vertical'을 인자로 받습니다. 수직/수평 방향으로 이동할 때 동작이 발생하도록 합니다.
  • greedy:boolean - true로 설정된 경우 hover와 관련된 처리를 수행하지 않습니다.
options 항목들 중 내부사용 프로퍼티
  • tree - tree에서 사용하기 위한 코드로 보임
  • _continaers - options.containment객체들이 저장됩니다.
  • element - 실제 Droppable element가 저장됩니다.
options 항목의 callback들
  • onHover(dragElement, dropElement, position) - 받아들이기로 한 Draggable 객체가 Droppable의 위에 있에 있을 때 메소드를 onHover 인자로 받은 function을 호출합니다.
  • onDrop(dragElement, dropElement, event) - 받아들이기로 한 Drggable 객체가 Droppable의 위에서 릴리즈되었을 때 onDrop 인자로 받은 function을 호출합니다.
2. Droppables.remove(element) - Droppable 객체를 삭제합니다.

3.
Droppables.findDeepestChild(drops)
- drops 루프를 돌면서 drops에서 가장 먼저 등록한 Droppable 객체들 중에서 가장 상위에 있는 Droppable 객체를 찾는 메소드입니다. (의도는?)

4.
Droppables.isContained(element, drop)
- 인자로 받는 element의 부모노드가 drop의 containment(받아들이기로 한 element) 목록에 있는 지 여부를 리턴합니다.

5. Droppables.isAffected(point, element, drop)
- 인자로 받는 element가 인자로 받는 drop(Droppable)에 Drop이 된 것인지의 여부를 체크하는 메소드입니다.
  1. drop.element와 달라야하고,
  2. drop._containers가 있는 경우 여기에 속해야하고,
  3. drop.accept가 있는 경우 element의 className중 하나가 해당해야하고,
  4. drop.element의 안에 인자로 받는 point의 위치가 속해야 합니다.
6. Droppables.activate(drop) [Droppables.deactivate(drop)]
- active[deactive]가 된 경우, drop.hoverclass가 있다면 drop.element에 hoverclass를 설정[제거]하고 last_activate 값을 설정[null로 설정]합니다.

※ show, fire, reset 메소드의 경우 Draggable에서 호출되는 메소드입니다.
7. Droppables.show(point, element)
- element의 Drop에 해당하는 Droppable이 있으면 hover 이펙트를 발생시킵니다.
  1. 인자로 받은 element가 Drop되었는지를 체크(isAffected())하여 affected에 담습니다.
  2. affected된 Droppable 중에서 가장 상위의 element(findDeepestChild()를 사용하여)를 찾습니다.
  3. 해당하는 Droppable을 activate시킵니다.
8. Droppables.fire(event, element) - onDrop 옵션을 가지고 있는 경우 onDrop 이벤트를 실행시킵니다.
9. Droppables.reset() - 초기화(deactivate) 시킵니다.

  Draggables
Draggables객체들을 관리하는 클래스입니다.
사용자 삽입 이미지

  Attribute
Draggables.drags: Array - draggable을 저장합니다.
Draggables.observers: Array -
activeDraggable - 현재 활성화되어 있는 Draggable을 가르키는 변수입니다.

  Method
1. Draggables.register(draggable)
- draggable을 인자로 받아서 drags에 추가합니다.
- drggable이 처음 등록되는 경우 document의 mouseup/mousemove/keypress 이벤트 핸들러로 eventMoueUp/eventMouseMove/eventKeypress 메소드를 등록합니다.

2. Draggables.unregister(draggable) -
- 인자로 받는 draggable을 drags에서 삭제합니다.
- 모든 draggable이 삭제되는 경우, document의 mouseup/mousemove/keypress 이벤트에 등록된 핸들러들을 모두 삭제합니다.

3. Draggables.activate(draggable)
- Draggable에서 호출되며, (delay 옵션이 있는 경우 dealy 옵션 뒤에) activeDraggable을 설정합니다.

4. Draggables.deactivate() - activeDraggable을 삭제합니다.(null처리)

※ 2에서 등록하였던 mouseup/mousemove/keypress 이벤트에 따라서, (activeDraggable이 있는 경우)activeDraggable에 해당하는 이벤트를 전달하는 역할을 합니다.
5. Draggables.updateDrag(event)
6. Draggables.endDrag(event)
7. Draggables.keyPress(event

※ 8, 9, 10, 11은 Draggables.observers와 관련된 메소드들로 Draggable에서 onStart/End/Drag 이벤트가 발생됬을 때, 해당하는 이벤트를 듣기 위한 구조입니다.
8.
Draggables.addObserver(observer)
9. Draggables.removeObserver(element)
10. Draggables.notify(eventName, draggable, event)
- notify는 Draggable에서 호출되는 메소드로 onStart/onEnd/onDrag 이벤트가 발생한경우 observer에서 해당하는 이벤트를 관차하는 observer가 있는 경우 observer의 callback을 호출한 후 draggable의 등록된 callback을 호출합니다.
11. Draggables._cacheObserverCallbacks()

  Draggable
Drag되는 (Draggable)객체 입니다.
사용자 삽입 이미지
Creation
new Draggable('id_of_element', [options]);
options항목은 다음과 같습니다.
  • handle - v1.0에서는 draggable할 element의 레퍼런스와 id를 인자로 받습니다. v1.5에서는 css 클래스 스트링으로 사용됩니다.
  • revert :boolean - true인 경우, 시작점으로 돌아갑니다. function이 들오올 수 있습니다.(since v1.5) 디폴트 값은 false입니다.
  • snap - true인 경우, snapping(달려들어 무는)이 발생합니다. 디폴트 값은 false입니다.
  • zindex - draggable할 item의 zindex를 정의합니다.
  • constraint - 'horizontal' 또는 'vertical'이 설정되는 경우, 수평/수직으로만 이동하도록 설정됩니다.
  • ghosting :boolean - Drag~Drop이 진행되는 동안 자신의 위치에 clone object를 남겨둡니다.
  • starteffect - Drag가 시작될 때, 적용할 이펙트를 정의합니다. 디폴트로 투명 이펙트(Opacity)를 실행합니다.
  • reverteffect - Drag를 하다 되돌아가는 경우(Droppable영역이 아닌 지역에서 릴리즈했을 때)에 적용할 이펙트를 정의합니다. 디폴트 값으로는 시작점 포인트로 직선 이동하는 이펙트(Move)를 실행합니다.
  • endeffect - Drag가 종료될 때, 적용할 이펙트를 정의합니다. 디폴트로 투명 이펙트(Opacity)를 실행합니다.
options에 설정되는 callback function입니다.
  • change - Drag로 인하여 Draggable의 위치가 변경된 경우 발생합니다.
  Attribute
Draggable.drags: Array - draggable을 저장합니다.
Draggable.observers: Array - observer할 object들을 저장합니다.
activeDraggable - 현재 활성화되어 있는 Draggable을 가르키는 변수입니다.
dragging: boolean - dragging이 진행 중인지를 저장하는 변수입니다.

  Method
1. destroy()
2. currentDelta() - Draggable element의 left/top 위치를 리턴합니다.
3. initDrag(event)
- Draggable에 mousedown 이벤트가 발생한 경우 호출됩니다.
- draggable에 포함되는치, form element인지를 체크한 후, 현재의 마우스 위치와 실제 화면상의 위치 값을 저장한 후 Draggables.activate를 호출합니다.

4.
startDrag(event)
- Draggable.updateDrag에서 호출됩니다.
  1. dragging 값을 true로 설정합니다.
  2. zindex, ghosting, scroll과 관련된 option이 있는 경우 해당 option과 관련된 작업을 수행합니다.
  3. Draggables에 onStart이벤트가 발생했음을 알립니다.
  4. options에 starteffect가 있는 경우 starteffect를 수행합니다.
5. updateDrag(event, pointer)
- Draggables.updateDrag에서 document의 mousemove 이벤트에 등록된 updateDrag에 의해서 호출됩니다.
  1. this.dragging이 설정되어 있지 않은 경우 startDrag를 호출합니다.
  2. Droppables.show를 호출하여 현재 해당하는 Droppable이 있는 경우에 대한 처리를 수행합니다.
  3. Draggable을 이동시킵니다.
  4. options.scroll과 관련된 항목을 처리합니다.
6. finishDrag(event, success)
- mouseup 또는 esc키가 눌린 경우 호출됩니다.
  1. this.dragging을 false로 설정합니다.
  2. mouseup인 경우, Droppables.fire를 호출하여 Drop 이벤트에 대한 처리를 수행하게 합니다.
  3. Draggables.notify를 호출해서 onEnd이벤트가 발생했음을 알립니다.
  4. revert인 경우, startDrag시 저장하였던 시작점으로 복귀시킵니다.
  5. drag가 완료되었으므로 zindex를 복원시킵니다.
  6. endeffect설정이 되어있으면 이를 호출해줍니다.
  7. Draggables.deactivate를 호출하여서 활성중인 Draggable이 없음을 설정합니다.
7. keyProcess(event) - esc키가 눌린 경우, finishDrag를 호출합니다.
8. endDrag(event) - mouseup이벤트가 발생한 경우, stopScrolling()과 finishDrag를 호출합니다.
9. draw(point)  - mouse 이동에 따른 draggable의 이동 처리를 수행합니다. (repaint코드라고 보시면 될 듯)
10. stopScrolling()
11. startScrolling(speed)
12. scroll()
13. _getWindowScroll(w)

※ scrolling의 경우 제가 정확하게 파악하지 못해서 생략했습니다. ^^;;


관련링크
  Script.aculo.us - Draggable, Draggables, Droppables

Read/Write Web에 소개된 Dapper요약

출처:
  Read/Write web의 "Dapper: the Quest To Unlock Web Data(Legally)"
  Dapper.net

사용자 삽입 이미지

  Dapper는 어떤 서비스인가?
HTML을 읽어들여서 변환과정을 거쳐서 XML을 생성해내는 서비스입니다.
  1. Unstructured information from HTML
  2. - clean, transform and re-emit it -
  3. structured XML
크게보면 외부의 웹 사이트를 Dapper 서비를 통해서 Data를 생성해낸다고도 볼 수 있습니다.
Web site => (Dapper) => Data Service
  Dapper Applications의 특징
  1. 외부 링크를 사용할 수 있다. (외부 서비스의 HTML을 읽어올 수 있습니다. 통???)
  2. RSS, E-mail 그리고 HTML과 같은 다양한 포멧으로 결과물을 새성할 수 있다.
   Business and Legal questions
Dapper의 핵심기능인 '컨텐츠 스크랩 후 재사용'은 명백히 저작권(Copyright)에 위반된다는 문제점을 가지고 있습니다. Dapper는 어떠한 역할을 하려고 하는걸까요? 단순하게 컨텐츠를 Data로 생성하는 역할은 아닐 겁니다. 그렇다면?
 컨텐츠 소유자와 소유자의 컨텐츠를 사용하고 싶어하는 (want to remix the content) 회사를 연결시켜주는 역할(marketplace)입니다..

극복해야할 문제점은 1. 쉬운 사용법과 2. Yahoo!의 Pipes나 Teqlo, kapow와 같은 업체들과의 치열한 경쟁이다.

P.S Dapper를 사용해서 블로그의 컨텐츠를 RSS로 생성해보려고 했습니다만, -_-;;;  자바스크립트 에러가 나더군요. 그리고, 쉬운 사용법도 중요한 이슈가 될 것 같습니다.

2007년 5월 2일 수요일

Silverlight

Silverlight

Silverlight의 특징들
  • cross-browser, cross-platform을 지원(Win XP의 Firefox에서는 제대로 동작하지 않는다. -_-)
    Firefox에서 정상 동작이 가능합니다만, 제대로 보기 위해서는 html페이지에서 html 태그의 xmlns 삭제, DOCTYPE선언 부분을 삭제하셔야지만 볼 수 있습니다. 출처: Silverlight, Firefox, and Inline Xaml: A Solution to the Problem
  • very small download(4.2M)
  • streams video and audio,  HD 720p video quality.
  • refresh하는 경우 전체 페이지를 refresh하지 않는다.
  • WPF and XAML
  • Extensions to JavaScript : XAML의 control처리 시 javascript가 사용된다.
Silverlight Platform
Core Presentation Framework와 .NET Framework, Installer and Updater 세가지로 구성된다.

사용자 삽입 이미지

Core

.NET Framework for Silverlight
  • WPF - Rich controls that extend the features of standard Web browser controls 제공
  • Data - LINQ(Language intergrated Query) 제공
  • BCL(Base Class Library) - String, Regular Expressions, Input and output, Reflection, Collections and Globalizatoin지원
  • Networking - Remote services and data에 접근하는 기능을 제공한다.
  • CLR(Common Language Runtime) - Memory management, Garbage Collection, Type checking, Exception handling
  • DLR(Dynamic Language Runtime) - Dynamic compilation and execution of scripting languages(JavaScript & IronPython) 제공
그 외의 프로그램의 특징들
  • Isolated storage - local storage와 data의 caching지원
  • asynchronous programming - a background worker thread carries out programming tasks
  • File managment - 파일 업로드를 위한 File Open dialog box지원
  • HTML : managed code interaction - .NET 프레임 웍 프로그래머들이 웹페이지의 HTML DOM에서 직접 UI elements들을 생성해낼 수 있게 한다.
  • JSON
  • POX services
  • XML libraries - XMLReader and XMLWriter제공

출처: Microsoft의 Silverlight
 
관련자료:
Netflix, Silverlight의 HD급 스트리밍 기능을 이용한 데모관련 영상 from Webware
태요님의 Silverlight강좌 - S2 innovation day에서 처음 태요님의 세미나를 들었는데... 재미있더군요. 그리고, 말의 속도가 너무 빨라서 ... ^^

2007년 5월 1일 화요일

포천 워크샵 때 찍은 사진입니다.

U100이로 찍은 사진입니다.
사람이 없다는게 특징이라고나 할까요? ^^

사용자 삽입 이미지사용자 삽입 이미지
포천에 있는 허브 아일랜드 사진입니다. 허브 식물원보다는 상품과 식당만으로도 관광지를 만들 수 있다는 주요 사례중 하나가 아닐까 하는 생각이(-_-;;; - 제가 좀 삐딱하죠.. ㅋ)

사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지

해질녘 쯤의 산책나갈 때 찍은 사진입니다. 햇빛이 좋더군요.
사용자 삽입 이미지

워크샵에 갔던 팬션에서 찍은 노을입니다. 봄이네요 ^^

사용자 삽입 이미지

3장 클래스,객체,변수

  클래스
클래스 정의는 다음의 양식을 띕니다. (Object에서 상속)
class ClassName
    # 생성자
        def initialize(param)
            @name = name     #인스턴스 변수 앞에는 @를 사용한다.
            ....
        end

    # 기본제공, 객체의 ID와 인스턴스 변수를 출력
    def inspect
       ...
    end

    # obj를 나타내는 string을 리턴
    def to_s
       ...
    end
end

  상속과 메시지
상속은 < 기호를 사용합니다.
class SubClassName < SuperClassName
    def initialize(param)
       # 부모 초기화
       super(param)
       ...
    end
   
    # super의 사용 예
    def to_s
      super + ""
    end
end

- SubClass에서 메소드가 없는 경우 부모를 따라가며 해당하는 메소드를 찾습니다.
- 메소드 내에서 super 키워드를 매개변수 없이 호출하면, 현재 객체의 부모의 메소드 중 동일한 이름의 메소드를 호출하도록 요청한다. 때로는 현재 메소드 호출에 전달된 매개변수를 호출하도록 요청합니다.
- 루비 객체의 최상위 부모는 Object이다. Object에는 to_s를 비롯한 몇 개의 메소드를 정의하고 있습니다.

 객체와 속성
외부에서 객체의 상태에 접근하고 이를 다루는 메소드를 속성(attribute)라고 부릅니다.
Song 클래스의 name 접근 메소드를 정의한다면 다음과 같이 정의할 수 있습니다.
class Song
   def name
      @name
   end
end

song = Song.new()
puts song.name

접근 메소드를 attr_reader를 사용하여 쉽게 정의할 수 있습니다. 사용법은 위의 접근 메소드와 동일합니다.
class Song
   attr_reader :name
end

  쓰기 가능한 속성
쓰기 가능한 속성의 정의는 다음과 같습니다.
class Song
   def duration=(new_duration)
      @duration = new_duration
   end
end

song = Song.new()
song.duration = 300

attr_reader처럼 attr_writer를 사용해서도 쉽게 정의할 수 있습니다.
class Song
   attr_writer :duration
end

  가상의 속성
속성이 꼭 인스턴스 변수로 존재할 필요는 없습니다. 가상으로 정의가 가능합니다.
class Song
   def duration_in_minutes
      @duration/60.0
   end
   def duration_in_minutes=(new_duration)
      @duration = (new_duration*60).to_i
   end
위의 코드 정의를 보면 song.duration_in_minutes라는 변수를 사용할 수 있지만, 실제로는 변수가 정의되어 있지는 않습니다.

  클래스 변수와 클래스 메서드
클래스 변수(@@name처럼 @두 개를 사용하여 정의)는 그 클래스의 모든 객체가 공유하며, 클래스 메서드에 의해서만 접근할 수 있습니다.

class MyLogger
   private_class_method : new

   # 클래스 변수는 사용하기 전에 반드시 초기화되어야 합니다.
   @@logger = nil

   # 클래스 메서드의 정의는 클래스이름.메소드이름으로 정의합니다.
   def MyLogger.create
      @@logger = new unless @@logger
      @@logger
   end
end
위의 코드대로 정의하는 경우 new를 사용하여 클래스를 생성할 수 없고, MyLogger.create를 사용해서만 클래스를 생성할 수 있게 됩니다.(싱글턴 패턴)

  접근제어
접근에 대해서 설정할 수 있는 속성은 세가지가 있습니다.
  • Public 메소드 - 아무런 접근 제어를 하지 않습니다.
  • Protected 메소드 - 그 객체를 정의한 클래스와 그 하위 클래스에서만 접근할 수 있습니다.
  • Private 메소드 - private 메소드는 오직 현재 객체에서만 접근 가능합니다. 같은 클래스의 다른 객체에서도 접근이 불가능합니다.
class MyClass
   def method1     #기본값은 public입니다.
   end
protected      #이하 정의되는 메소드는 protected 접근을 가집니다.
   def method2
   end
   ...
private     #이하 정의되는 메소드는 private 접근을 가집니다.
   ...
public
   ...
end

또는 다음과 같이 정의할 수 있습니다.
class MyClass
   ...
   public :method1, :method2
   protected :method3
   private :method4
end

변수는 값을 저장하는게 아니라 레퍼런스(참조)를 저장하고 있다. (Java와 동일)

2장 Ruby.new 정리

  루비 설치, 맥에서 빌드하기
맥에서 루비 설치할 때 사용했던 관련 포스트(Building and installing Ruby 1.8.6 on Mac OS X Tiger)
RDT에 RDoc과 ri명령어를 넣어주기 위해서는 따로 설치가 필요
./configure --enable-install-doc --with-readline-dir=/usr/local --enable-pthread
make
make test
sudo make install
make check

  루비 기초 문법

루비는 객체지향 언어다.
클래스/메서드/ 인스턴스/생성자 - new 메서드로 호출
객체는 고유하다. 객체 아이디(Object identifier), 인스턴스 변수(Instance variables), 인스턴스 메서드(Instance method, 클래스 내부적으로 호출되는 메소드)를 갖는다.
루비에서 메소드 호출 형태 : Receiver.methodName()
자바와 달리 루비에서는 숫자 객체 자체에 절대값을 구하는 기능을 포함하고 있다.
  Math.abs(number) <-> number.abs
루비는 한 줄에 하나의 표현식만 쓴다면 세미콜론을 넣을 필요가 없다.
주석은 #을 사용하면 줄 끝까지 적용된다.

메소드를 정의하려면 def키워드가 필요하다.
메소드  다음에는 괄호로 싸인 메서드 형식인수를 쓴다.  def method(param)
중괄호로 구분하지 않는다.
키워드 end를 써준다.

변수는 대입을 하려 할 때, 자동으로 만들어진다.

문자열을 만드는 방법 - 문자열 리터럴을 사용한다. ''""를 붙여서 문자열 리터럴을 만든다.
 - 작은 따옴표는 루비에서 사소한 작업시 사용하며
 - 큰 따옴표는 더많은 작업을 한다. 대표적인 것으로 \n에 대한 개행 처리를 수행한다.
표현식을 삽입한다. #{expression}과 같은 형태가 있으면 이는 expression의 값으로 표현된다.
전역변수($name)나 인스턴스 변수(@name)도 다음과 같이 "#$greeting #@name"형태로 사용이 가능하다.
메소드에서는 마지막으로 실행된 표현식의 결과값이 리턴된다.

  Naming Rule
지역변수, 메서드형식인수, 메서드이름은 모두 소문자나 밑줄(_)로 시작되어야 한다.
전역변수는 $
인스턴스 변수는 @
클래스 변수는 @@
클래스 이름, 모듈 이름, 상수는 대문자로 시작된다.
인스턴스 변수는 단어 사이에 밑줄을 넣어서 구분하고, 클래스 이름의 경우에는 대문자로 시작한다.

  배열과 해시
Array는 []로 정의 하며, 스트링으로 구성된 배열은 %w{}를 사용하여 쉽게 정의할 수 있다.
Hash는 {}로 정의하며, {key => value} 형태로 정의한다. 객체가 없는 경우는 nil을 리턴한다.

  제어문
if/elsif/else/end 와 같이 정의할 수 있다. 종료는 end로 끝난다.
while 조건문
 내용
end

내용이 한 줄인 경우, 구문 변경자(statement modifier)를 사용하여 한 줄로 표시할 수 있다.
if radiation >3000
  puts "위험합니다."
end
 => puts "위험합니다." if radiation >3000

  정규표현식
if line ~= /Perl|Python/
  puts "스크립트 언어에 대한 언급: #{line}"
end
~= 특정 문자열이 정규표현식과 매치되는지 검사하는데 사용할 수 있다.

  블록과 반복자
코드블록은 중괄호do...end로 묶인 코드다.
{puts "Hello"}
do
  puts "Hello"
end
블록을 메소드에서 다시 호출하기 위해서는 yield를 사용해서 호출할 수 있다.
블록에 매개변수를 전달하려면 |를 사용한다. call_block {|param| ...}

  읽기와 쓰기
puts는 개행문자를 문자열의 끝 부분에 더해서 출력을 해준다.
print는 개행문자 없이 문자열만을 출력해준다.
둘 다(puts/print) 어떤 I/O 객체에든 사용할 수 있다.
printf(C나 perl)과 동일하다.
입력, gets 메소드를 사용하면 스트림에서 문자열 한 줄을 읽어들인다.