。공부 。2015.02.06 18:46
스피디란 무엇인가?
     SPDY(스피디/speedy/로 발음)는 웹 콘텐츠를 전송할 목적으로 구글이 개발한 개방형 네트워크 프로토콜이다.
     HTTP의 단점을 보안하여 앞으로의 인터넷 환경을 효율적으로 개선하는데 그 목적이 있다.
     웹 페이지 부하 레이턴시를 줄이고 웹 보안을 개선하는 목표 면에서 HTTP와 비슷하다.
     압축, 다중화, 우선순위, 설정을 통한 레이턴시 감소를 달성한다.    

스피디 특징
     1. 항상 TLS(SSL) 위에서 동작
 HTTS 가 적용된 웹 사이트에서만 사용가능하다.
     2. HTTP 헤더압축
          과거에는 헤더의 용량이 몇바이트 였지만 지금 2kb가 넘고 점점 증가하고 있다 스피디는 이를 효율적으로 압축하여 전송한다.
     3. 바이너리 프로토콜
          프라임 텍스트가 아닌 바이너리로 구성하므로 파싱이 빠르고 오류 발생 가능성이 적다.
     4. Multiplexing
          하나의 커넥션으로 다수의 요청을 동시에 처리한다.(HTTP는 하나의 커넥션에 하나만 처리)
     5. 우선순위 설정
          데이터 전송시 우선순위를 주어 우선순위가 높은데이터가 먼저 전송되도록 한다.
     6. Server Push
          클라이언트에서 요청이 없더라도 서버에서 데이터를 push (전송)할 수 있다.
          서버푸쉬는 따로 구현 필요
     7. 웹사이트 재작성 필요없음
          SPDY를 적용한다고 해서 기존에 있는 웹사이트를 제작성한다거나 할 필요는 없다.


그동안 잘 써온 HTTP 대신 왜 SPDY를 써야할까?
     HTTP 1.1 은 무려 15년전에 만들어져 지금까지 사용하고 있다.
     그때는 하나의 웹페이지에 제공하고자 하는 정보의 양이 적었고 하나의 페이지를 보여줄때 필요한 리소스들이 많이 들지 않았기 때문에
     지금의 HTTP 만으로도 충분했다
     15년이 지난 지금은 리소스가 무려 20배는 증가 되었다.

     웹페이지 로드에 사용되는 리소스 (yahoo 기준)
          1999년 : request 3개, 사이즈 34kb
          2014년 : request 73개, 사이즈 658,4kb


설치방법 (centos)
     nginx
          nginx 설치시 옵션을 추가해준다.
          —with-http_spdy_module —with-http_ssl_module

          /etc/nginx/nginx.conf에 SSL과 SPDY 설정               
               Listen 443 ssl spdy;
               ssl_certificate ssl/xxx.crt;
               ssl_certificate_key ssl/xxx.key;

     apache
          아파치는 스피디모듈만 따로 설치할 수 있다.
          rpm –U mod-spdy-*.rpm

          아파치 openssl 설정
          /etc/httpd/conf/httpd.conf
               SSLCertificateFile ssl/xxx.crt;
               SSLCertificateKeyFile ssl/xxx.key;

          스피디 설정
          /etc/httpd/conf.d/spdy.conf 
               spdyEnabled on


스피디가 정상적으로 적용되었으면 아래와 같이 확인 가능하다.
     크롬브라우저(주소창에 입력): chrome://net-internals/#spdy
     파이어폭스(확장기능 설치) : https://addons.mozilla.org/ko/firefox/addon/spdy-indicator/ 




서버푸쉬(server push) 테스트
     nginx는 서버푸쉬를 아직 지원하지 않는다.

     클라이언트 호출 없이 서버에서 데이터를 헤더로 전송하면 브라우저는 이를 캐시로 가지고 있다가 사용하게 된다.
     테스트로 50개의 이미지를 푸시하는데 여기에서 5.jpg이미지는 푸쉬 목록에서 제외한뒤 테스를 해보았다.
     아래 이미지에서 보는것 처럼 나머지는 캐시 되어 있지만 5.jpg는 캐시되어있지 않은것을 확인 할 수 있다.


푸시할 이미지 목록



푸시결과 5.jpg를 제외한 이미지들은 캐시되어있는 것을 확인 할 수 있다.




서버와 브라우저 지원
Server
     Apache(2.2.*): mod_spdy
     Erlang-spdy
     Node-spdy
     Netty 3.3.1 (jboss)
     Jetty 70602
     Nginx 1.3 이상
     Tomcat 8.0.0-dev
Browser
     Chrome: v 11이상, ice Cream Sandwich
     Amazon Silk(Kindle Fire)
     Firefox: v 13 이상
     Opera version 12.1이상



Posted by kyoe
。공부 。2008.08.08 21:08
Jess 라는 인공지능 프로그램은 Java의 모든클래스를 객체화하여 사용할수 있다.
그 방법또한 어렵지 않아 쉽고 간단하게 객체를 만들어 사용할 수 있다.

- Java의 파일클래스를 객체화하여 사용하기 -
(bind ?file (new java.io.File file.txt))
(bind ?fr (new java.io.FileReader ?file))
(bind ?br (new java.io.BufferedReader ?fr))

(bind ?a (call ?br readLine))
(bind ?b (call ?br readLine))
(bind ?c (call ?br readLine))
(bind ?d (call ?br readLine))

(printout t"A : " ?a crlf)
(printout t"B : " ?b crlf)
(printout t"C : " ?c crlf)
(printout t"D : " ?d crlf)

jess에서는 변수타입과 객체형태가 따로 존재하지 않기 때문에 변수에 값을 할당할때 쓰이는
bind 키워드를 사용하여 자바클래스를 호출하여 만들어진 객체를 담을수있게 된다.
(bind ?file (new java.io.File file.txt))
위의 소스는 자바의 파일클래스 new키워드를 사용해 객체를 만드는 방법이다.
만약 자바였다면 File file = new File("file.txt"); 이런식으로 객체를 만들테지만 jess에는 위에서 설명했듯이 따로 변수타입이나 객체형태가 존재하지 않기 때문에  bind 키워드를 사용해 변수인 ?file에 File객체를 담을수 있게 된다.

위의 세줄은 파일클래스 ?file를 FileReader에 연결해 기능을 확장하고 BufferedReader클래스에 FileReader 클래스 객체인 ?fr을 연결해 버퍼단위로 데이터를 불러올수있는 최종 파일개체인 ?br객체를 만드는 과정이다.

자. 이젠 다만들어진 객체를 활용해 볼 차례지요.
파일객체에는 다양한 메소드들이 많습니다. 이번에 써볼 메소드는 제가 테스트를 할때 주로 쓰는 readLine() 메소드를 호출해 file.txt 안의 데이터를 불러와 봤습니다.

(bind ?a (call ?br readLine))
메소드를 불러들일때 사용하는 키워드는 'call' 입니다.
call 키워드를 사용해 ?br객체를 호출하고 객체의 readLine메소드를 사용한다는 뜻이죠
readLine메소드를 이용해 불러들인 데이터는 변수 ?a에 저장 되게 됩니다.

마지막 4줄은 단순히 불러들인 데이터를 변수별로 출력하게 됩니다.

이런식이로 자바의 모든클래스를 사용할수있습니다. 똑같은 방법으로 말이죠
하지만 제가 직접만든 클래스를 jess에서 객체화 하려고 했는데 잘 되질 않더군요..
객체화하는 방법이 분명 있을텐데말이죠.. 흠...

Posted by kyoe
。공부 。2008.07.08 18:09
제스에서 사용자함수를 만들기 위해서 deffunction문을 앞에 써준뒤 함수명을 기능에 맞게 부여한뒤 사용하면 되는데 이역시 사용하는 방식을 일반함수와 비슷합니다.

2. 큰수를 구하는 함수
(deffunction test_fct(?x ?y)   
    (if(> ?x ?y)then
        (return ?x)
        else
        (return ?y)
        )
)
(printout t"MAX : " (test_fct 100 200) crlf)
어떤가요 함수 선언시 앞에 deffunction문이 붙는거이외에는 일반 저희가 선언할때랑 비슷하죠?
다만 제스에서는 return이 생략되도 ?x 값이나 ?y값을 리턴할수 있습니다.
(if(> ?x ?y)then
        ?x
        else
        ?y
        )
이런식으로 생략되도 ?x 와 ?y값은 리턴됩니다.

3. 리스트를 이용한 함수, multifield 변수
(deffunction show-list(?data1 ?data2 $?datas)
    (bind ?list-num 0)
    (bind ?com-list(create$ ?data1 ?data2 ?datas))
    (foreach ?com-data ?com-list
        (printout t " "(++ ?list-num) ":" ?com-data)
        )
    (printout t crlf)
    )

(show-list 모니터)       ; 에러발생
(show-list 모니터 본체)
(show-list 모니터 본체 스피커)
(show-list 모니터 본체 스피커 키보드 마우스)
show-list 함수를 선언한뒤 매개변수로 3개의 값을 받고 있네요
여기서 눈여겨 봐야 할 부분은 $?datas 이부분입니다.
개변수 앞에 '$'가 붙으면 multifield 변수로써 쓰여지게 됩니다.
여기셔 multifield변수란 위의 show-list 함수에서 3개의 매개변수를 받을수 있게끔되어 있지만 multifield변수를 사용하면 3개이상의 매개변수를 받을수 있게 되는것입니다.
또한 함수호출시 2개의 매개변수만 넘겨주게 되면 multifield변수인 $?datas는 아무값도 없는값이 되므로 2개의 매개변수만 넘겨주어도 에러가 나지 않지만
여기서 한개의 매개변수만 넘겨주게 되면 ?data2변수에 값이 지정되지 않았으므로 에러가 발생한다.

[실행결과]
Jess reported an error in routine show-list
    while executing deffunction show-list
    while executing (show-list 모니터).
  Message: Too few arguments to deffunction show-list.
  Program text: ( show-list 모니터 )  at line 10.

1:모니터 2:본체
1:모니터 2:본체 3:스피커
1:모니터 2:본체 3:스피커 4:키보드 5:마우스

Posted by kyoe
。공부 。2008.07.08 17:15
1. if함수
(bind ?num 100)
(if (> ?num 95)then
   (printout t"A+" crlf)
   else
   (printout t"A+이 아닙니다." crlf)
   )
위의 소스는 ?num이 95보다 크면 A+을 출력하라는 간단한 if함수의 예제 입니다.
선행표기법을 제외하면 일반 if문과 같다는것을 알수있습니다.

2. member$
(bind ?com-list (create$ 모니터 본체 스피커))
(if (member$ 본체 ?com-list)then
    (printout t"본체가 있습니다." crlf)
    else
    (printout t"본체가 없습니다." crlf)  
    )
일반리스트를 활용한 if함수 예제 입니다. 여기서 눈여겨 봐야 할 함수가 member$
member$는 member$ 바로 앞의 원소가 해당리스트에 존재하면 TRUE를 리턴하게 되고
존재하지 않을시에는 FALSE를 리턴하게 됩니다.

[실행결과]
A+
본체가 있습니다.
Posted by kyoe
TAG If, jess, 제스
。공부 。2008.07.08 16:43
C나 자바에서와 같이 제스 에서는 반복문이 존재 한다.
foreach나 for문 while와 같은 함수가 말이죠.

1. foreach 함수는 일반리스트의 원소를 차례차례 한개씩 받아오는 함수이다.
(bind ?com-list (create$ 모니터 본체 스피커))
(bind ?num 0)
(foreach ?data-list ?com-list
    (printout t (++ ?num)" : " ?data-list crlf)
    )
foreach 함수는 위와 같이 쓰인다.
첫번째줄에서 일반리스트를 선언해준뒤 두번째줄에서 카운터변수 ?num을 0으로 초기화 시켜주고 있다.
foreach 함수의  첫번째 변수인 ?data-list는 ?com-list의 원소값 한개를 받아와 저장하게 된다.
com-list의 원소가 nil이 아닐 동안 원소를 한개씩 받아오게 되는것이다.

[실행 결과 ]
1 : 모니터
2 : 본체
3 : 스피커

2. for 함수
(for (bind ?i 0) (<= ?i 9) (++ ?i)
    (printout t"3 *" ?i " = " (* 3 ?i) crlf)
    )
for문의 형식은 씨언어나 자바와 비슷하다 다만 제스는
선형표기법을 쓴다 라는것을 빼면 말이죠
위의 소스는 간단하게 구구단 3단을 출력하는 소스입니다.

3. while 함수
(bind ?num 1)
(while (<= ?num 9) do
    (printout t "2 * " ?num " = "(* 2 ?num) crlf)
    (++ ?num)
    )
역시 형식은 자바와 비슷하죠?
while의 조건이 만족하는 동안 do 아래의 문장을 실행하게 됩니다.
[실행결과]
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18

Posted by kyoe

티스토리 툴바