RoR

April 17th, 2009

Reference

 

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

  1. 환경 세팅

    • database.yml : DB connection 정보 세팅
    • create database
    • environment.rb : session 사용 설정
  2. 모델 생성 : ruby script/generate model <모델명>
  3. 추가 마이그레이션 생성 : ruby script/generate migration <마이그레이션명>
  4. 데이터 마이그레이션  : rake db:migrate
  5. 발판코드 생성 : ruby script/generate scaffold <모델명> <컨트롤러명>
  6. 컨트롤러 생성 : ruby script/generate controller <컨트롤러명> (<액션명1> <액션명2> <액션명3> ...)

 

Open ID

  1. 라이브러리 설치

  2. 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
  3. Generate Scaffold : ruby script/generate openid_login Openid
  4. 테스트 : http://localhost:3000/open_id/login
  5. 참고 자료

     

 

 

 

Triz

September 26th, 2008

창의적인 아이디어

  • 이 아이디어가 창의적인 아이디어인가? = 왜 그런 아이디어를 생각하지 못했을까?
  • 아이디어의 이상성: 효과/비용 = ∞

 

Ideation 회의기법

  • Brain Storming : 비판하지 않는다는 원칙 하에 편하게 쏟아져 나오는 그저그런 아이디어가 다른 사람들의 경험/생각이 보태져 좋은 아이디어로 발전
  • Thinking Hats : 1시간 동안 10분씩 6단계로 나누어 진행. 이 기법의 가장 큰 장점은 아이디어의 제안과 비판이 시간간격을 두고 떨어져 있다는데 있음. 긍정적인 가치를 알고 비판하는 것과 즉시 비판하는데는 차이가 있음.

    1. White : 객관적 정보 공유
    2. Blue : 문제 정의
    3. Green : 아이디어 제안
    4. Red : 직관, 느낌을 말하기
    5. Yello : 긍정적 가치 찾기
    6. Black : 비판

 

Triz 란?

  • 러시아 특허 전문가 Altshuller(알츠슐러) 가 전 세계 200만건의 특허를 분석하여 좋은 발명을 공통점을 뽑아내어 정리한 Ideation 방법론

    • 40가지 발명 원리
    • 76가지 표준 해결책
    • 문제해결 프로세스(ARIZ)
  • 회의기법이 아닌 생각하는 방법. 구체적인 생각에 도움을 준다.
  • 창의적 발명들의 공통점 :  모순 극복을 통한 혁신
  • Triz 의 목적은 이상해결책(IFR)

 

모순(Contradiction)의 정의

  • 물리적 모순 : 한가지 성질이 충돌

    • 화승총 : 총신의 길이가 짧으면 정확도가 떨어지고, 길면 장전속도가 느려짐
    • 비행기 바퀴 : 착륙할 때는 있어야 하지만, 공기저항을 최대한 줄여야 하므로 비행 중에는 없어야 함
    • 자전거 체인 : 패들의 동력을 바퀴에 전달하기 위해 Flexable 해야 하지만, 강한 힘을 전달하기 위해서는 Rigid 해야 함
    • 말뚝박기 : 단단한 땅에 잘 들어가게 하려면 끝이 뾰족해야 하고, 건물을 안정적으로 지탱하려면 끝이 평평해야 함
    • 고층빌딩 엘리베이터 : 고층일수록 수용인원이 많아지므로 엘리베이터가 많아야 하는데, 가용공간을 늘리려면 적어야 함
    • 혼다의 자동차 엔진
  • 기술적 모순 : 서로 다른 성질이 충돌

    • 하드디스크 : 용량을 늘리면 정확도가 줄고, 정확도를 늘리면 용량이 줄어듬.
    • 양모직물 : 촉감,광택을 개선하기 위해 실을 가늘게 빼면 주름이 잘가고, 주름이 안가게 하려면 실을 굵게 빼야 함.
    • 페트로나스 빌딩 : 공사기간을 줄이면 품질이 낮아지고, 품질을 높이려면 공기가 늘어남.

 

모순의 해결책

  • 물리적 모순

    1. Separation in TIME : 시간을 나눠서 생각 -> 비행기 바퀴 : 이륙시, 비행시
    2. Separation in SPACE : 공간을 나눠서 생각 -> 고층빌딩 엘리베이터 : 하위층, 상위층으로 나눠서 생각
    3. Separation in SCALE : 전체와 부분을 나눠서 생각 -> 자전거 체인 : 전체적으로는 Flexable, 부분적으로는 Rigid
  • 기술적 모순 : 40가지 발명원리 적용. Contradiction Matrix 를 활용해 보는 것도 괜찮지만 의존하지는 마라.

 

General IFR 도출 예제

  • 문제(=물리적 모순)와 문제의 원인(=기술적 모순)이 뭔지 분석해야 한다.

  • 영화 Outbreak 에서 자신의 잘못을 숨기기 위해 마을에 폭탄을 투하하라는 상관의 명령을 하달받은 전투기 조종사의 문제
문제 이상해결책 문제의 원인(why?)
폭탄을 투하해야 한다. 상관의 명령에 복종하면서 폭탄을 투하하지 않는다. ↙ 상관의 명령에 복종하기 위하여
폭탄을 투하하지 말아야 한다. 무고한 희생을 막으면서 폭탄을 투하한다. 무고한 희생을 막기 위하여

 -> 마을이 아닌 바다에 폭탄을 투하

  • 극심한 기아로 인해 정권이 흔들리고 있는 김정일 국방위원장의 문제
문제 이상해결책 문제의 원인(why?)
개방을 해야 한다. 주민의 굶주림을 해결하면서 개방을 하지 않는다. ↙ 주민의 굶주림을 해결하기 위하여
개방을 하지 말아야 한다. 정권을 유지하면서 개방을 한다. ↖ 정권을 유지하기 위하여

-> 대남관계를 우호적으로 하여 실익을 얻으면서, 대미관계를 적대적으로 하여 주민들의 단합을 유도하여 정권 유지

 

결론

  • 모든 문제에는 물리적인 모순과 기술적 모순이 공존한다.
  • 물리적 모순을 해결하면 기술적 모순을 쉽게 해결할 수 있지만 기술적 모순을 해결해도 물리적 모순을 해결하기는 어렵다.
  • 기술적 모순이 해결되지 않으면 40가지 발명원리를 적용하고 거기서 물리적 모순을 찾는다.
  • 76가지 표준 해결책, 문제해결 프로세스 등 모든 원리를 총동원하라.

 

참고

 

플래시 보안 요약

March 23rd, 2009

기본규칙

  1. 동일한 보안 샌드박스의 리소스는 항상 서로 액세스 가능

    • swf, bitmap, audio, text 등 자체 도메인의 모든 에셋 로드 가능
    • as 3.0 으로 작성된 swf 간 cross scripting 항상 허용
    • as 3.0 이전 버전으로 작성된 swf 와는 LocalConnection 을 통한 통신 가능
  2. 원격 샌드박스(Remote Sandbox)의 swf 에서는 로컬 파일과 데이터에 엑세스 불가능
  3. Flash Player는 다음을 개별 도메인으로 간주하고 각각에 대해 개별 보안 샌드박스를 설정

  4. 컨텐츠를 로드하는 것과 데이터를 액세스하는 것을 구분하며, 일반적으로 컨텐츠를 로드하는데 적용되는 제한이 적음. 즉, 컨텐츠를 로드하는 것과 로드된 컨텐츠의 데이터에 액세스 하는 것은 별개의 보안 적용

    1. 컨텐츠(오디오, 비디오 또는 SWF 파일) 로드

      • Loader, Sound, NetStream 클래스 사용
      • 모든 네트워크 주소의 컨텐츠 로드 가능하나 다른 도메인의 컨텐츠는 별도의 보안 샌드박스로 구분
      • 사용자 하드 드라이브에서 로드된 로컬 SWF 파일은 local-with-filesystem 샌드박스로 분류되어 컨텐츠 로드 불가
      • RTMP(Real-Time Messaging Protocol) 서버로 컨텐츠에 대한 액세스 제한 가능
    2. 데이터 엑세스

      • 로드된 미디어 내용에서 데이터를 추출하거나 XML 파일 등의 외부 파일에서 데이터를 직접 로드하는 두 가지 방법을 사용하여 데이터에 액세스

        1. 비트맵 객체, BitmapData.draw() 메서드, Sound.id3 속성 또는 SoundMixer.computeSpectrum() 메서드를 사용하여 로드된 미디어에서 데이터 추출
        2. URLStream, URLLoader, Socket 및 XMLSocket 등의 클래스를 사용하여 데이터를 로드
      • 로드된 미디어 또는 데이터의 도메인에 있는 cross domain policy 파일을 통해 액세스 권한 부여 가능

         

권한 컨트롤

  1. 리소스(SWF 파일, 로컬 데이터, 인터넷 URL 등의 객체) 중심 설계
  2. 각 리소스에는 네 명의 관계자가 있으며 소유한 리소스에 대해 컨트롤 가능
  3. 컴퓨터 관리자 > 사용자 > 웹사이트 > 제작자(개발자) 설정

    1. 관리자 컨트롤

      1. mms.cfg 파일: 설정치는 대부분 ActionScript 에서 쿼리 불가
      2. Global Flash Player Trust 디렉토리

        • 특정 로컬 SWF 파일을 신뢰파일로 등록 가능
        • local-trusted 샌드박스에 할당
        • 모든 데이터 로드 가능
    2. 사용자 컨트롤

      1. 설정UI 및 설정 관리자
      2. User Flash Player Trust 디렉토리
    3. 웹사이트 컨트롤(cross domain policy 파일)

      1. crossdomain.xml 이라는 이름의 정책 파일이 해당 서버의 루트 디렉토리에 상주해야 함.
      2. 다른 도메인의 SWF(caller) 에서 Security.loadPolicyFile() 메서드를 호출하여 다른 이름 또는 디렉토리 위치 확인가능
      3. 임의의 하위 디렉토리에서 로드된 정책 파일은 해당 디렉토리와 하위 디렉토리에만 적용
      4. 문서 기반 정책 파일과 소켓 정책 파일의 두 종류의 정책 파일을 지원
      5. 정책 파일은 연결 시도에서 사용하려는 프로토콜과 동일한 프로토콜 사용해야 함. 즉, 소켓 정책파일을 가져올 때는 소켓으로 연결하여 가져와야 함.
    4. 제작자(개발자) 컨트롤

      1. SWF(callee)에서 Security.allowDomain() 으로 특정 도메인의 SWF 파일에 권한 부여

        • SWF 의 크로스 스크립팅 허용
        • 표시 목록 엑세스
        • 이벤트 감지
        • Stage 객체의 속성 및 메서드에 대한 액세스
      2. Security.allowInsecureDomain(): HTTPS 연결에 의해 제공되는 SWF 파일에서 사용. 보안이 취약해짐 

 

보안 샌드박스

Security.sandboxType 으로 샌드박스 확인 가능

  1. local-with-filesystem 샌드박스

    • 컴파일 옵션으로 지정
    • 네트워크 통신 불가
  2. local-with-networking 샌드박스

    • 컴파일 옵션으로 지정
    • cross domain policy 파일이나 원격 swf 에서 Security.allowDomain("*") 해줘야 작동
  3. local-trusted

 

네트워킹 API 제한

<object> 및 <embed> 태그에서 allowNetworking 매개 변수로 설정

  1. all(기본): 모든 네트워크 API 허용
  2. internal: 브라우저 상호작용 API를 호출할 수 없지만 다른 네트워킹 API 호출 가능
  3. none: 브라우저 상호작용 API 및 모든 SWF 간 통신 API 사용불가

 

서로 다른 샌드박스의 에셋에 엑세스할 수 가능하도록 사용할 수 있는 2가지 방법

  1. Security.allowDomain()

    로드된 SWF 파일에서 Security.allowDomain() 메서드를 호출하여 cross scripting 하거나, data 로드

  2. crossdomain policy file

 

더 자세한 내용 보기 : http://livedocs.adobe.com/flash/9.0_kr/main/00000347.html