John Edward Warnock by 바죠

John Edward Warnock (1940년 생, 78세)
https://en.wikipedia.org/wiki/John_Warnock


Postscript 언어와 PDF (Portable Document Format) 양식을 개발한 컴퓨터 공학자이다. 
또한 그는 포토삽 프로그램을 인수하여 성공리에 상업화하였다.
https://en.wikipedia.org/wiki/PostScript
https://en.wikipedia.org/wiki/Portable_Document_Format

솔트레이크 시티 태생
유타 대학교에서 수학 전공, 학사, 석사 학위 취득
컴퓨터 공학으로 박사 학위 취득
유타 대학교 박사 학위 논문으로는 매우 짧은 논문을 발표함
슈퍼컴퓨터를 이용한 프로그래머로 활동
1976년, 컴퓨터 그래픽스 회사 Evans & Sutherland 회사에 합류
1978년, 제록스 팔로알토 연구소 재직
포스트스크립트 언어 개발, 상용화 추진
상용화 무산
1982년, 어도비 시스템즈 설립, 팔로알토 소재 집 뒤에 흐르는 조그만 개울 이름 "Adobe Creek"에서 자신의 회사 이름을 따왔다.
https://en.wikipedia.org/wiki/Adobe_Systems
https://en.wikipedia.org/wiki/Adobe_Creek_(Santa_Clara_County,_California)
GUI 기반 컴퓨터 개발에 열을 올리던 스티브 잡스가 500만 달러에 어도비 회사 인수를 희망했지만, 워녹은 이 제안을 거부함
1984년, 포스트스크립트를 일반에 공개함
컴퓨터 기기, 출력 장치가 포스트스크립트 언어를 읽을 수 있다면 해당 그림/문서를 출력할 수 있게 됨
1985년, 애플이 이 언어를 이용할 수 있는 LaserWriter라는 레이저 프린터를 최초로 출시, 타 업체들이 동참하게 됨
https://en.wikipedia.org/wiki/LaserWriter
포스트스크립트가 표준으로 자리 잡을 수 있게한 계기가 됨
출판사들을 한 방에 물 먹이는 계기가 됨. 사무실 책상에서 출간이 사실상 가능하게 됨. Desktop Publishing 시대 도래
1987년, 벡터 이미지와 디지털 글꼴을 제작할 수 있는 일러스터레이터 발표
1990년, 포토삽 발표. raster 형식의 편집 기술을 사들여서 벡터 이미지에만 의존하는 기능적 한계를 보강함
1995년, 어도비는 포토삽에 대한 모든 권리를 취득함
1993년, Portable Document Format을 발표, 열람, 출력, 보관에 최적화된 문서 양식 발표
PDF 형식을 가능한 모든 프로그램들에게 사용할 수 있도록 제공함 즉, PDF 문서의 모든 사양을 공개함
사실상의 문서 보급 표준으로 군림
2003년, 약 60억원 상당(5.7 million dollars) 유타 대학교에 기부
2008년, PDF에 대한 대부분의 권리를 포기함. 국제표준화기구(ISO)에 PDF 권한을 넘김
모든 기업이 PDF 기술을 이용할 수 있게 만들었다.
7개의 특허를 가지고 있다.
기술을 강조하는 최고 경영자이다. 경영자라기보다 모범적인 공학자이다.



 

 http://incredible.egloos.com/4223942
 http://incredible.egloos.com/4525532

JavaScript [컴퓨터 언어] by 바죠

자바스크립트(JavaScript)는 객체 기반의 스크립트 프로그래밍 언어이다.
이 언어는 웹브라우저 내에서 사용된다. 다른 응용 프로그램의 내장 객체에도 접근할 수 있는 기능을 가지고 있다.
또한 Node.js와 같은 런 타임 환경과 같이 서버 사이드 네트워크 프로그래밍에도 사용된다.

라이브스크립트(LiveScript)라는 이름으로 개발되었다. 최종적으로 자바스크립트가 되었다.
자바스크립트가 썬 마이크로시스템즈의 자바와 구문이 유사한 점도 있다. 
하지만, 자바와 자바스크립트는 직접적인 관련성이 없다.

jQuery(제이쿼리)는 HTML의 클라이언트 사이드 조작을 단순화 하도록 설계된 크로스 플랫폼의 자바스크립트 라이브러리다.
jQuery는 오늘날 가장 인기있는 자바스크립트 라이브러리 중 하나이다.
jQuery는 한 개의 JavaScript 파일로 존재한다.

웹브라우저를 프로그램밍적으로 제어하려면 JavaScript 언어를 사용해야한다. 
브라우저를 프로그래밍적으로 제어하는 것이 목적인 언어가 JavaScript 언어이다.
이 목적을 정확하게 수행하는 사실상 유일한 언어이다.
그런데, 현재, JavaScript 언어는 그 용도로만으로 사용되지 않는다. 좀 더 확장된 개념이다.
웹서버를 동작하시키는 도구
웹서버에서 사용되도록 하는 기술, java, php, python, ruby


웹브라우저, 노드, 구글 애플리케이션

ECMA 국제기구
ECMAScript <==  JavaScript <== LiveScript


웹서버 -----------  웹브라우저
웹서버를 JavaScript로 만들 수 있다. 
Google Apps Script

기본적으로 html 파일 양식에 script를 넣는 형식으로 JavaScript 프로그램을 만든다.

브라우저를 실행하고 function F12키를 치면 콘솔이 나타난다.

\'s
backslash 를 사용하면 escape
문자와 문자 구획을 정의하지 않고 그기능을 해지함: escape 기능

1
"1"
다른 데이터 형식.
typeof 1
"number"
typeof "1"
"string"

var 를 한 번만 사용하여 변수임을 선언한다.
//  주석, comment

/*
구간 주석, comment area
*/

var a ;
alert(a);

세미콜론 ; 이 반드시 필요한 경우--> 한 줄에 여러 명령어가 들어 갈 경우
한 줄에 한 명령어를 사용할 경우, ; 이 필요없을 수도 있다.

대입, 비교 연산은 사실상 다른 언어들과 유사하다.
특별히 다른점이 없다.

조건문

반복문
for(var i=0 ; i < 1000; i++){

}

함수
function(arg1,arg2) {

return  zz;
}

function numbering(){
var i=0;
while (i < 10){
document.write(i);
i+=1;
}
}

numbering = function (){}

(function(){})();  
익명함수
일회성으로 사용할 때 사용함. 이름이 필요없고, 바로 실행할 때 사용함. 

배열
var members =[1,2,3,4];
배열 생성시킴.
members[0]
members[1]
for(i=0 ; i <members.length ; i++){}


var li=['a', 'b'];
li.push('c');
뒷쪽에 추가할 경우, push

li=li.concat(['d','e']);
두 개 이상 추가할 경우, 뒷쪽에 추가할 경우.
li.unshift('z');
제일 앞쪽에 추가할 경우, unshift

splice 명령어을 이용하면 특정구간에 추가할 경우에 사용한다.
array.splice(1,0,'d');
한 개를 1번 위치 앞에 추가할 경우.
즉, 0, 1번 사이에 추가할 경우.

array.splice(1,1,'x','y');
1번 위치에서 1개를 삭제한 후 'x', 'y'를  추가함.

shift   첫번째 원소 제거
pop   마지막 원소 제거
sort 정렬
reverse 역순 정렬

데이터를 담아 내는 그릇: 객체, object

모듈화 개념.
<script src="aaa.js"></script>
속성 src 가 있으면 해당 파일을 읽어 온다. 
.js 라는 파일을 만들고 이것을 읽어 올 수 있다.
예를 들어 함수를 불러올 수 있게 된다.
head 영역에 위치시킨다.

윈도우 커맨드 창에서 아래와 같이 실행함.
node node.demo.js

jQuery
명령어들의 리스트, 사용설명서 API documentation을 파악해야한다. 라이버러리 사용의 핵심.
다운로드 받은 파일을 읽어온다.
src="jquery.js" 헤더 부분에서 읽어 드림.



-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------


JavaScript examples
<!DOCTYPE html>
<html>
<head>
<title> get values and print result </title>
</head>
<body>
<h1> get values and print result </h1>
Enter val1: <input type='number' id="v1" value="" /> <br/>
Enter val2: <input type='number' id="v2" value="" /> <br/>
Enter val3: <input type='number' id="v3" value="" /> <br/>
Enter val4: <input type='number' id="v4" value="" /> <br/>
<button onclick="getValues()">Get Values</button>
<p id="boo"></p>
<script>
function getValues(){
var y = document.getElementById('boo');
var v01 = document.getElementById('v1').value;
var v02 = document.getElementById('v2').value;
var v03 = document.getElementById('v3').value;
var v04 = document.getElementById('v4').value;
var vv1=Number(v01);
var vv2=Number(v02);
var vv3=Number(v03);
var vv4=Number(v04);
var a = vv1*vv1 + vv2*vv2 + vv3*vv4;
y.innerHTML=a;
}
</script>
</body>
</html>
 
-------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<body>
<script>
function myfunct(){
var num1= parseInt(document.getElementById("num1").value);
var num2= parseInt(document.getElementById("num2").value);
document.getElementById("output").innerHTML=num1 + num2;
}
</script>
number 1 : <input type="text" id="num1">
+
number 2:  <input type="text" id="num2">
<button onclick="myfunct()">=</button>
<p id="output"> </p>
</body>
</html>


-------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
   function validator(){
     if(document.aform.thebox.checked)
 alert("Yes, it is checked!");
     else
 alert("No, it is not checked!");
}
</script>
</head>
<body>
<form name="aform">
 <input type="checkbox" name="thebox" />
 <input type="button" value="Press me!" onClick="validator()" />
</form>
</body>
</html>

-------------------------------------------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<body>
<script>
function myfunct(){
var num1= parseInt(document.getElementById("num1").value);
var num2= parseInt(document.getElementById("num2").value);
document.getElementById("output").innerHTML=num1 + num2;
}
</script>
number 1 : <input type="text" id="num1">
+
number 2:  <input type="text" id="num2">
<button onclick="myfunct()">=</button>
<p id="output"> </p>
</body>
</html>


-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------





Sobol sequence by 바죠

Sobol sequence
https://en.wikipedia.org/wiki/Sobol_sequence
https://en.wikipedia.org/wiki/Low-discrepancy_sequence
https://en.wikipedia.org/wiki/Ilya_M._Sobol


랜덤 넘버, 막수는 컴퓨터 프로그램에서 매우 중요한 것이다. 특히, 몬테칼로 (Monte Carlo) 알고리듬에서와 마찬가지로 매우 중요한 의미를 가지고 있다.
많은 경우, 랜덤 넘버 생성기는 컴퓨터 언어자체에서 내장함수 형식으로 제공된다.  
랜덤 넘버는 통상 함수로 만들어져 있으며, 초기화가 가능하다. 함수를 부를 때마다 새로운 값을 얻을 수 있다.
0.에서 1.0 사이의 값이 생성되게 된다. 몬테칼로 알고리듬에서 필요로하는 확률이라고 볼 수 있다.
특정한 행위가 받아들여질 확률이 바로 랜덤 넘버와 비교되는 것이다.

x  ----> x',
V(x) ----> V(x')

===>

exp[-{V(x')-V(x)}/(kBT)]  > tmp


포트란 90 언어의 경우,
call random_seed()라고 실행하면 랜덤 넘버 생성기를 초기화할 수 있다.
call random_number(tmp)처럼 부함수를 부르면 부를 때마다 새로운 랜덤 넘버를 얻어낼 수 있다.

일차원 또는 이차원 문제의 경우 매우 많은 시도로 부터 균일한 분포를 얻을 수 있다.
다차원으로 가게 되면 우리가 생각하고 있는 균일한 그러한 분포를 가질 수 있을까?  훨씬 더 많은 시도가 있어야하는 것은 자명하다. 유한한 갯수의 시도로 균일한 분포를 이야기하는 것 자체가 매우 까다롭고 신중하게 취급해야만 하는 것이다. 특히, 다차원의 문제풀이에서는 더욱더 신중해야만 할 것이다.  
수렴정도를 체크하기가 쉽지 않기 때문이다. 아래의 그림 두 개를 보자. 뚜렷한 차이를 볼 수 있다. 이차원 보기임에도 불구하고 확연히 다른 랜덤 넘버들의 분포를 볼 수 있다.  







http://people.sc.fsu.edu/~jburkardt/f_src/sobol_dataset/sobol_dataset.html
http://people.sc.fsu.edu/~jburkardt/f_src/sobol/sobol.f90

다운로드
받은 루틴은 체크를 하고 사용해야 한다. 한 가지 문제점을 발견했다.
integer type 정의가 잘못된 곳이 있었다.
아래의
컴파일러 옵션으로 쉽게 찾을 수 있었다.

ifort  -CB -check all  -warn interface -assume  realloc_lhs

아래에 표시된 적분을 한 번 실행해
보자. 정답이 알려진 2차원 정적분이다.
컴퓨터 알고리듬을 사용하여 실행하는 것을 목표로 한다.
두 가지 방식의 랜덤 넘버들을
이용하고 결과를 비교한다.
차이점을 확인할 수 있다.


많은 응용을 기대할 수 있다.


http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.473.490&rep=rep1&type=pdf


!234567890
       program  main
       implicit none
       integer mdim,n,iskip
       integer j,i,k,is,kase,ksgn,k1,k2
       real*8 tmp,vec(3)
       real ( kind = 8 ), allocatable, dimension ( :, : ) :: r
       call random_seed()
       call random_number(tmp)
       mdim=3
       mdim=2
       n=120000
       iskip=n*2**4+tmp*10000
       allocate(r(1:mdim,1:n))
       call i8_sobol_generate(mdim,n,iskip,r)
       if(mdim == 2)then
       r=r-0.5d0
                    endif
       if(mdim == 3)then
       r=r-0.5d0
                    endif
       tmp=0.d0
       do j=1,n
       tmp=tmp+4.d0*r(1,j)**2+3.d0*r(2,j)
       enddo
       write(6,*) tmp/dble(n)
       do j=1,n
       call random_number(tmp)
       r(1,j)=tmp-0.5d0
       call random_number(tmp)
       r(2,j)=tmp-0.5d0
       enddo
       tmp=0.d0
       do j=1,n
       tmp=tmp+4.d0*r(1,j)**2+3.d0*r(2,j)
       enddo
       write(6,*) tmp/dble(n)
       if(allocated(r)) deallocate(r)
       stop
       end
  0.333351784496133    
  0.338188940039489
    







알파고 제로 출현 by 바죠

지난번 이세돌 9단(4:1 승, 커제 9단, 지난 5월, 3:0 승, 알파고 마스터)과의 바둑 대결에 사용된 컴퓨터 프로그램 "알파고 리", 이것이 엄청난 뉴스를 만들어내었다. 이번에 새롭게 개발된 "알파고 제로"라는 프로그램은 더 놀라운 것이라고 본다. 왜냐하면, 더이상 사람들이 만들어낸 기보같은 데이터에 의존하지 않기 때문이다. 게임의 룰을 알려주고나면, 이 프로그램이 스스로 바둑 게임에서 이기는 방법을 찾기 때문이다.

더 이상 사람들의 행동을 흉내내지 않는다. 스스로 어떻게해야만 이기는지를 찾아낸다. 백지 상태(tabula rasa)에서 시작한다는 것이 핵심이다.

사람의 도움이 없이 단순히 36시간 독학으로 공부하고 알파고 리 성능을 뛰어 넘는다고 한다.
사람들이 둔 기보를 전혀 보지 않기 때문에 사람들 보다 더 강하다고 한다.
“강화학습 방식으로 만들어진 알파고 제로는 지금까지 나온 알파고 버전들 중 가장 강력하며 컴퓨팅 파워도 덜 든다”
 
“인간 지식의 한계에 더이상 속박되지 않기 때문”
"인공지능이 단백질 접힘(각 단백질에 고유한 접힌 구조가 만들어지는 과정)이나 신소재 설계 등 현실의 문제를 해결하는 데 혁신을 이뤄낼 수 있기를 희망한다"

알파고 리에 100전 100승

3일만에 알파고 리 성능 돌파
21일만에 알파고 마스터 성능 돌파

기존 알파고 : 기보 기반 학습
알파고 판 : 2015년 판 후이 2단(유럽 챔피언)을 이긴 버전, 가치망, 정책망 두 개의 deep neural networks
알파고 리 : 경기전 7개월 동안 기보 16만건을 학습함. (18회 국제 대회 우승자 이세돌에 승리를 거둠.)
알파고 마스터: 올해 1월 온라인 대국 사이트에 등장해 인간 고수들을 60전 전승으로 꺾은 것은 '알파고 마스터(Master)'다. 세계 랭킹 1위 커제에게도 3:0으로 승리한 버전
알파고 제로 : 가상 기보를 두면서 학습. 스스로 빅데이터를 구성함.  단 하나의 neural network만을 사용함. 간결한 tree search를 사용함. 알파고 마스터와의 승부, 100전 89승 11패로 알파고 제로 승리. 스스로 학습하는 것은 지도학습에 비해서 결과적으로 더 뛰어난 결과를 준다. 다만, 학습 초반에는 지도 학습이 더 뛰어난 것처럼 보인다. 한 수를 두는데 5초를 소요한다.

                     
동양에서 개발한 문제 풀이 방식은 사람들이 만들어낸 문제 풀이방식이다.
경험적으로 이러할 때에는 이렇게 하면 된다는 것들을 모두 모아 두었다.
여러 가지 변형이 있을 수 있고, 체계적으로 정리를 할 수 있다.
장기, 체스같은 게임은 이미 그 풀이과정이 잘 알려져 있고, 아주 빠른 시간안에 문제풀이가 가능했다.

바둑 게임의 정복의 아주 먼 미래의 것으로만 여겨왔지만, 동양이 아닌 서양에서 새로운 방식으로 사실상 정복을 했다.

남겨진 문제는, 하사비스가 언급한 것처럼, 어떻게 다른 도메인에서도 이와같은 성공을 이루어내는냐이다.
각 도메인에서는 보다 더 복잡한 '경기 룰'을 요구한다.
예를 들어, 양자역학을 이용하는 도메인에서는 각각의 시도마다 훨씬 더 많은 계산시간을 요구한다. 많은 경우, 5초 안에 한 수를 둘 수 있는 바둑과는 다르다. 바둑은 2시간 안에 경기가 끝이난다. 다시 말해서, 도메인에서 요구하는 기본단위의 시간은 타협의 대상이 될 수 없다. 따라서, 다양한 응용에는 여전히 갈길이 멀다. 결코 쉽지 않은 도전이다.  

-----------------------------------------------------------------------------------------------------------------
스스로 깨우친 바둑
Mastering the game of Go without human knowledge

David Silver1*, Julian Schrittwieser1*, Karen Simonyan1*, Ioannis Antonoglou1, Aja Huang1, Arthur Guez1,
Thomas Hubert1, Lucas Baker1, Matthew Lai1, Adrian Bolton1, Yutian Chen1, Timothy Lillicrap1, Fan Hui1, Laurent Sifre1,
George van den Driessche1, Thore Graepel1 & Demis Hassabis1
 
A long-standing goal of artificial intelligence is an algorithm that learns, tabula rasa, superhuman proficiency in
challenging domains. Recently, AlphaGo became the first program to defeat a world champion in the game of Go. The
tree search in AlphaGo evaluated positions and selected moves using deep neural networks. These neural networks were
trained by supervised learning from human expert moves, and by reinforcement learning from self-play. Here we introduce
an algorithm based solely on reinforcement learning, without human data, guidance or domain knowledge beyond game
rules. AlphaGo becomes its own teacher: a neural network is trained to predict AlphaGo’s own move selections and also
the winner of AlphaGo’s games. This neural network improves the strength of the tree search, resulting in higher quality
move selection and stronger self-play in the next iteration. Starting tabula rasa, our new program AlphaGo Zero achieved
superhuman performance, winning 100–0 against the previously published, champion-defeating AlphaGo.


tabula rasa
정해진 의견이 없는 상태


1 2 3 4 5 6 7 8 9 10 다음