RoR
April 17th, 2009
Reference
- gem update rails --include-dependencies : 레일스 최신 버전으로 갱신
- TextMate(http://macromates.com/) : 루비 코드 작성하는데 쓸만한 편집기. 맥용
- RadRails(http://www.radrails.org/) : 레일스 이클립스 플러그인
- Mongrel(http://mongrel.rubyforge.org/) : WEBrick 서버를 대체할만한 웹서버
- mongrel 서버 구동 : mongrel_rails start -p <Port> -d
- http://nalnari.tistory.com/31 : 레일스 환경 설정
- http://myruby.net/ : 문식님이 운영하는 루비 사이트
- http://www.troubleshooters.com/codecorn/ruby/ : Ruby Rivival
- http://svn.techno-weenie.net/projects/beast/ : Open Source rails forum source
Description of contents
- app : 개별 어플리케이션의 해당 코드를 포함한다.
- controllers : 자동화된 URL 매핑을 위해 weblogs_controoler.rb 와 같이 명명되는 컨트롤러들을 포함한다. 모든 컨트롤러는 그 자신이 ActionController::Base 로부터 상속되는 ApplicationController 로부터 상속된다.
- models : post.rb 와 같이 명명되는 모델을 포함한다. 대부분의 모델들은 ActiveRecord::Base 로부터 상속된다.
-
views : WeblogsControlle#index 액션을 위해 weblogs/index.rhtml 으로 명명되는 뷰를 위한 템플릿 파일을 포함한다.
- layouts : 뷰와 함께 사용되는 레이아웃을 위한 템플릿 파일을 포함한다. 이것은 뷰를 wrapping 하는 범용 header/footer 메소드를 모델한다. view 안에, <tt>layout :default</tt> 를 사용하는 레이아웃을 정의하고 default.rhtml로 명명되는 파일을 만든다. default.rhtml 안에서 이 레이아웃을 사용하는 view 를 렌더링하도록 <% yield %> 를 호출한다.
- helpers : weblogs_helper.rb 와 같이 명명되는 뷰 헬퍼를 포함한다. 이들은 컨트롤러를 위한 script/generate 를 사용할 때 자동으로 생성된다. 헬퍼들은 뷰를 위해 메소드 형태로 기능을 감싸는데 사용될 수 있다.
- components : 컨트롤러, 모델, 뷰를 몽땅 묶어버릴 수 있는 자체 포함형 미니 어플리케이션
-
config : 레일스 환경을 위한 라우팅 맵, DB, 다른 종속요소들 등의 설정파일들
- routes.rb : index 페이지, routing 정책 등
- environments.rb : session 사용여부, observer 정의, inflection 정의 등
- db : schema.rb 안에 DB 스키마를 포함한다. db/migrate 는 스키마를 위한 모든 마이그레이션 순서를 간직한다.
- doc : 이 디렉토리에 <tt>rake doc:app</tt> 를 사용해 생성되는 어플리케이션 문서가 있다.
- lib : 어플리케이션 specific libraries. 기본적으로 컨트롤러, 모델 또는 헬퍼에 속하지 않는 커스텀 코드의 일종. 이 디렉토리는 load path 안에 있다.
- public : 이 디렉토리는 웹서버를 위해 유용하다. 이미지, 스타일시트와 자바스크립트를 위한 서브 디렉토리를 포함한다. 또한 dispatcher 와 기본 HTML 파일을 포함한다. 웹서버의 DOCUMENT_ROOT 로 설정된다.
- script : 자동화 및 generation 을 위한 헬퍼 스크립트
- test : fixture (like sample data)를 동반한 유닛 및 기능테스트. script/generate 스크립트를 사용할 때 템플릿 테스트 파일이 이 디렉토리에 생성된다.
- vendor : 어플리케이션이 의존하는 외부 라이브러리. 또란 플러그인 서브 디렉토리를 포함한다. 이 디렉토리는 load path 안에 있다.
Convensions
- controller 는 자신과 이름이 같은 layout 을 찾아서 기본 템플릿으로 삼는다. eg. store_contoroller.rb : store.rhtml
- 반복되는 레이아웃은 partial 템플릿으로 빼내어 재사용 할 수 있다. cf. asp, php 의 inc 와 비슷
- controller 의 public action 에서 redirect_to 를 사용하지 않으면 같은 이름의 rhtml 로 redirect 하거나 같은 이름의 rjs 에서 그 response 를 처리한다.
- 메인 템플릿의 render 메서드는 partial 템플릿과 같은 이름의 변수를 partial 템플릿의 참조변수로 설정한다.
- form 에 :action 을 기술하지 않으면 해당 form 이 존재하는 rhtml 과 같은 이름의 controller 상 action 을 수행한다.
Symbols
-
What are symbols?
- A Ruby symbol is a thing that has both a number (integer) representation and a string representation.
- The string representation is much more important and used much more often.
- The value of a Ruby symbol's string part is the name of the symbol, minus the leading colon.
- A Ruby symbol cannot be changed at runtime.
- Multiple uses of the same symbol have the same object ID and are the same object.
-
What are symbols not?
- A Symbol is Not a String
- A Symbol is not (Just) a Name
- A Symbol is an Object, but So What? : Almost everything in Ruby is an object, so nothing distinctive.
-
What are adventages of symbols?
- Symbols are immutable. (can't be changed at runtime)
- Performance benefits : Additional usages consume no additional memory.
-
Summary
- A Ruby symbol looks like a colon followed by characters. (:mysymbol)
- A Ruby symbol is a thing that has both a number (integer) and a string.
- The value of a Ruby symbol's string part is the name of the symbol, minus the leading colon.
- A Ruby symbol cannot be changed at runtime.
- Neither its string representation nor its integer representation can be changed at runtime.
- Ruby symbols are useful in preventing modification.
- Like most other things in Ruby, a symbol is an object.
-
When designing a program, you can usually use a string instead of a symbol.
- Except when you must guarantee that the string isn't modified.
- Symbol objects do not have the rich set of instance methods that String objects do.
- After the first usage of :mysymbol all further useages of :mysymbol take no further memory -- they're all the same object.
- Ruby symbols save memory over large numbers of identical literal strings.
- Ruby symbols enhance runtime speed to at least some degree.
Workflow
-
환경 세팅
- database.yml : DB connection 정보 세팅
- create database
- environment.rb : session 사용 설정
- 모델 생성 : ruby script/generate model <모델명>
- 추가 마이그레이션 생성 : ruby script/generate migration <마이그레이션명>
- 데이터 마이그레이션 : rake db:migrate
- 발판코드 생성 : ruby script/generate scaffold <모델명> <컨트롤러명>
- 컨트롤러 생성 : ruby script/generate controller <컨트롤러명> (<액션명1> <액션명2> <액션명3> ...)
Open ID
-
라이브러리 설치
- 자동설치 : gem install ruby-openid (depends on the Ruby Yadis library.)
- 수동설치 : http://www.openidenabled.com/openid
-
Trouble Shooting
- Couldn't find 'openid_login' generator : C:\ruby\lib\ruby\gems\1.8\gems\ruby-openid-1.1.4\examples\rails_openid_login_generator 를 C:\ruby\lib\ruby\gems\1.8\gems\rails-1.2.3\lib\rails_generator\generators\components 하위에 openid_login 폴더명으로 복사
- require_gem is obsolete. Use gem instead : gem pristine --all
- Generate Scaffold : ruby script/generate openid_login Openid
- 테스트 : http://localhost:3000/open_id/login
-
참고 자료
- http://blog.naver.com/mrtajo75/60036834836 : install guide
- http://www.openidenabled.com/resources/docs/openid/ruby/ : api reference
Triz
September 26th, 2008
창의적인 아이디어
- 이 아이디어가 창의적인 아이디어인가? = 왜 그런 아이디어를 생각하지 못했을까?
- 아이디어의 이상성: 효과/비용 = ∞
Ideation 회의기법
- Brain Storming : 비판하지 않는다는 원칙 하에 편하게 쏟아져 나오는 그저그런 아이디어가 다른 사람들의 경험/생각이 보태져 좋은 아이디어로 발전
-
Thinking Hats : 1시간 동안 10분씩 6단계로 나누어 진행. 이 기법의 가장 큰 장점은 아이디어의 제안과 비판이 시간간격을 두고 떨어져 있다는데 있음. 긍정적인 가치를 알고 비판하는 것과 즉시 비판하는데는 차이가 있음.
- White : 객관적 정보 공유
- Blue : 문제 정의
- Green : 아이디어 제안
- Red : 직관, 느낌을 말하기
- Yello : 긍정적 가치 찾기
- Black : 비판
Triz 란?
-
러시아 특허 전문가 Altshuller(알츠슐러) 가 전 세계 200만건의 특허를 분석하여 좋은 발명을 공통점을 뽑아내어 정리한 Ideation 방법론
- 40가지 발명 원리
- 76가지 표준 해결책
- 문제해결 프로세스(ARIZ)
- 회의기법이 아닌 생각하는 방법. 구체적인 생각에 도움을 준다.
- 창의적 발명들의 공통점 : 모순 극복을 통한 혁신
- Triz 의 목적은 이상해결책(IFR)
모순(Contradiction)의 정의
-
물리적 모순 : 한가지 성질이 충돌
- 화승총 : 총신의 길이가 짧으면 정확도가 떨어지고, 길면 장전속도가 느려짐
- 비행기 바퀴 : 착륙할 때는 있어야 하지만, 공기저항을 최대한 줄여야 하므로 비행 중에는 없어야 함
- 자전거 체인 : 패들의 동력을 바퀴에 전달하기 위해 Flexable 해야 하지만, 강한 힘을 전달하기 위해서는 Rigid 해야 함
- 말뚝박기 : 단단한 땅에 잘 들어가게 하려면 끝이 뾰족해야 하고, 건물을 안정적으로 지탱하려면 끝이 평평해야 함
- 고층빌딩 엘리베이터 : 고층일수록 수용인원이 많아지므로 엘리베이터가 많아야 하는데, 가용공간을 늘리려면 적어야 함
- 혼다의 자동차 엔진
-
기술적 모순 : 서로 다른 성질이 충돌
- 하드디스크 : 용량을 늘리면 정확도가 줄고, 정확도를 늘리면 용량이 줄어듬.
- 양모직물 : 촉감,광택을 개선하기 위해 실을 가늘게 빼면 주름이 잘가고, 주름이 안가게 하려면 실을 굵게 빼야 함.
- 페트로나스 빌딩 : 공사기간을 줄이면 품질이 낮아지고, 품질을 높이려면 공기가 늘어남.
모순의 해결책
-
물리적 모순
- Separation in TIME : 시간을 나눠서 생각 -> 비행기 바퀴 : 이륙시, 비행시
- Separation in SPACE : 공간을 나눠서 생각 -> 고층빌딩 엘리베이터 : 하위층, 상위층으로 나눠서 생각
- Separation in SCALE : 전체와 부분을 나눠서 생각 -> 자전거 체인 : 전체적으로는 Flexable, 부분적으로는 Rigid
- 기술적 모순 : 40가지 발명원리 적용. Contradiction Matrix 를 활용해 보는 것도 괜찮지만 의존하지는 마라.
General IFR 도출 예제
-
문제(=물리적 모순)와 문제의 원인(=기술적 모순)이 뭔지 분석해야 한다.
- 영화 Outbreak 에서 자신의 잘못을 숨기기 위해 마을에 폭탄을 투하하라는 상관의 명령을 하달받은 전투기 조종사의 문제
| 문제 | 이상해결책 | 문제의 원인(why?) |
|---|---|---|
| 폭탄을 투하해야 한다. | 상관의 명령에 복종하면서 폭탄을 투하하지 않는다. ↙ | 상관의 명령에 복종하기 위하여 |
| 폭탄을 투하하지 말아야 한다. | 무고한 희생을 막으면서 폭탄을 투하한다. ↖ | 무고한 희생을 막기 위하여 |
-> 마을이 아닌 바다에 폭탄을 투하
- 극심한 기아로 인해 정권이 흔들리고 있는 김정일 국방위원장의 문제
| 문제 | 이상해결책 | 문제의 원인(why?) |
|---|---|---|
| 개방을 해야 한다. | 주민의 굶주림을 해결하면서 개방을 하지 않는다. ↙ | 주민의 굶주림을 해결하기 위하여 |
| 개방을 하지 말아야 한다. | 정권을 유지하면서 개방을 한다. ↖ | 정권을 유지하기 위하여 |
-> 대남관계를 우호적으로 하여 실익을 얻으면서, 대미관계를 적대적으로 하여 주민들의 단합을 유도하여 정권 유지
결론
- 모든 문제에는 물리적인 모순과 기술적 모순이 공존한다.
- 물리적 모순을 해결하면 기술적 모순을 쉽게 해결할 수 있지만 기술적 모순을 해결해도 물리적 모순을 해결하기는 어렵다.
- 기술적 모순이 해결되지 않으면 40가지 발명원리를 적용하고 거기서 물리적 모순을 찾는다.
- 76가지 표준 해결책, 문제해결 프로세스 등 모든 원리를 총동원하라.
참고
- 참고사이트 : http://trizacademy.net/
- 참고서적 : 생각의 창의성 Triz
플래시 보안 요약
March 23rd, 2009
기본규칙
-
동일한 보안 샌드박스의 리소스는 항상 서로 액세스 가능
- swf, bitmap, audio, text 등 자체 도메인의 모든 에셋 로드 가능
- as 3.0 으로 작성된 swf 간 cross scripting 항상 허용
- as 3.0 이전 버전으로 작성된 swf 와는 LocalConnection 을 통한 통신 가능
- 원격 샌드박스(Remote Sandbox)의 swf 에서는 로컬 파일과 데이터에 엑세스 불가능
-
Flash Player는 다음을 개별 도메인으로 간주하고 각각에 대해 개별 보안 샌드박스를 설정
- http://example.com
- http://www.example.com
- http://store.example.com
- https://www.example.com
-
[!] 보안 샌드박스: 일종의 보안 그룹
-
컨텐츠를 로드하는 것과 데이터를 액세스하는 것을 구분하며, 일반적으로 컨텐츠를 로드하는데 적용되는 제한이 적음. 즉, 컨텐츠를 로드하는 것과 로드된 컨텐츠의 데이터에 액세스 하는 것은 별개의 보안 적용
-
컨텐츠(오디오, 비디오 또는 SWF 파일) 로드
- Loader, Sound, NetStream 클래스 사용
- 모든 네트워크 주소의 컨텐츠 로드 가능하나 다른 도메인의 컨텐츠는 별도의 보안 샌드박스로 구분
- 사용자 하드 드라이브에서 로드된 로컬 SWF 파일은 local-with-filesystem 샌드박스로 분류되어 컨텐츠 로드 불가
- RTMP(Real-Time Messaging Protocol) 서버로 컨텐츠에 대한 액세스 제한 가능
-
데이터 엑세스
-
로드된 미디어 내용에서 데이터를 추출하거나 XML 파일 등의 외부 파일에서 데이터를 직접 로드하는 두 가지 방법을 사용하여 데이터에 액세스
- 비트맵 객체, BitmapData.draw() 메서드, Sound.id3 속성 또는 SoundMixer.computeSpectrum() 메서드를 사용하여 로드된 미디어에서 데이터 추출
- URLStream, URLLoader, Socket 및 XMLSocket 등의 클래스를 사용하여 데이터를 로드
-
로드된 미디어 또는 데이터의 도메인에 있는 cross domain policy 파일을 통해 액세스 권한 부여 가능
-
-
권한 컨트롤
- 리소스(SWF 파일, 로컬 데이터, 인터넷 URL 등의 객체) 중심 설계
- 각 리소스에는 네 명의 관계자가 있으며 소유한 리소스에 대해 컨트롤 가능
-
컴퓨터 관리자 > 사용자 > 웹사이트 > 제작자(개발자) 설정
-
관리자 컨트롤
- mms.cfg 파일: 설정치는 대부분 ActionScript 에서 쿼리 불가
-
Global Flash Player Trust 디렉토리
- 특정 로컬 SWF 파일을 신뢰파일로 등록 가능
- local-trusted 샌드박스에 할당
- 모든 데이터 로드 가능
-
사용자 컨트롤
- 설정UI 및 설정 관리자
- User Flash Player Trust 디렉토리
-
웹사이트 컨트롤(cross domain policy 파일)
- crossdomain.xml 이라는 이름의 정책 파일이 해당 서버의 루트 디렉토리에 상주해야 함.
- 다른 도메인의 SWF(caller) 에서 Security.loadPolicyFile() 메서드를 호출하여 다른 이름 또는 디렉토리 위치 확인가능
- 임의의 하위 디렉토리에서 로드된 정책 파일은 해당 디렉토리와 하위 디렉토리에만 적용
- 문서 기반 정책 파일과 소켓 정책 파일의 두 종류의 정책 파일을 지원
- 정책 파일은 연결 시도에서 사용하려는 프로토콜과 동일한 프로토콜 사용해야 함. 즉, 소켓 정책파일을 가져올 때는 소켓으로 연결하여 가져와야 함.
-
제작자(개발자) 컨트롤
-
SWF(callee)에서 Security.allowDomain() 으로 특정 도메인의 SWF 파일에 권한 부여
- SWF 의 크로스 스크립팅 허용
- 표시 목록 엑세스
- 이벤트 감지
- Stage 객체의 속성 및 메서드에 대한 액세스
- Security.allowInsecureDomain(): HTTPS 연결에 의해 제공되는 SWF 파일에서 사용. 보안이 취약해짐
-
-
보안 샌드박스
Security.sandboxType 으로 샌드박스 확인 가능
-
local-with-filesystem 샌드박스
- 컴파일 옵션으로 지정
- 네트워크 통신 불가
-
local-with-networking 샌드박스
- 컴파일 옵션으로 지정
- cross domain policy 파일이나 원격 swf 에서 Security.allowDomain("*") 해줘야 작동
- local-trusted
네트워킹 API 제한
<object> 및 <embed> 태그에서 allowNetworking 매개 변수로 설정
- all(기본): 모든 네트워크 API 허용
- internal: 브라우저 상호작용 API를 호출할 수 없지만 다른 네트워킹 API 호출 가능
- none: 브라우저 상호작용 API 및 모든 SWF 간 통신 API 사용불가
서로 다른 샌드박스의 에셋에 엑세스할 수 가능하도록 사용할 수 있는 2가지 방법
-
Security.allowDomain()
로드된 SWF 파일에서 Security.allowDomain() 메서드를 호출하여 cross scripting 하거나, data 로드
- crossdomain policy file
더 자세한 내용 보기 : http://livedocs.adobe.com/flash/9.0_kr/main/00000347.html