티스토리 초대권 배포합니다.

양식에 맞게 덧글로 달아주세요

(비밀글로 다는 것을 추천합니다)


1. 메일주소

2. 블로그 개설목적

3. (선택사항) 기존에 운영하던 블로그주소



int *A;

A는 int형 포인터이다.


int B[5];

B는 크기가 5인 int형 배열이다.


int *C[5];

연산자우선순위에서 배열첨자인[]가 먼저이므로 C는 배열이다. 크기가 5인 배열.

즉 int형 포인터(int *)를 5개 담을 수 있는 배열이다.


int (*D)[5];

괄호 안을 먼저 처리하므로 D는 포인터이다.

크기가 5인 int형 배열(int [5])의 포인터를 할당할 수 있는 포인터인 것이다.


int *(*E)[5];

D와 같이 괄호 안을 먼저 처리하므로 E는 포인터이다.

이 것 역시 남은 부분을 보면 E가 무슨 포인터인지 알 수 있는데,

남은부분이 int *[5]이므로 E는 int *[5]의 포인터를 담을 수 있는 포인터가 된다.

이 int *[5]꼴은 C와 같은 형태이다. 이것을 참조해서 정리해 보면

E는'int형 포인터(int *)를 5개 담을 수 있는 배열'의 포인터을 할당할 수 있는 포인터이다.


int *F[5][4];

[]가 먼저 처리되므로 F는 이차원배열이다.

int * 형태의 데이터를 5x4로 담을 수 있는 크기가 20인 이차원배열. 


int (*G[5])[4];

역시 우선순위를 따져보면 G는 크기 5의 배열이다.

남은부분은 int (*)[4]로, 이는 D와 같은 꼴이다.

즉 G는, D와 같은 형태의 데이터를 5개 담을 수 있는 배열.


int *(*H[5])[4];

H 역시 배열이며, 남은부분은 int *(*)[4]이고,

이는 E와 같은 형태이다.

즉 H는, E와 같은 형태의 데이터를 5개 담을 수 있는 배열.

 







플립플롭을 쓰다가 JKFF(JK플립플롭)에서 JK가 무슨뜻인지 의문이 들었다.

RS래치에서 RS는 Reset-Set

DFF에서 D는 Data 또는 Delay

TFF에서 T는 Toggle 이라고 들었는데 JK에 대한 이야기는 들어본적이 없었다.


미국의 물리학자 잭 킬비(Jack St. Clair Kilby ,1923~2005)의 이름을 딴 것이라는 이야기가 있다.(Jack Kilby는 1958년 집적회로를 발명했고 2000년에 노벨물리학상을 수상).

그러나 위 내용은 확실한 근거가 없고, 영문판 위키백과에는 보다는 Eldred Nelson이라는 사람이 특허문서에서 이 회로의 입력단자 이름을 붙일 때,

알파벳순으로 A,B, C,D, E,F, G,H, J,K 로 J-input과 K-input을 사용했기 때문이라고 기록되어 있다.


출처 : https://in.answers.yahoo.com/question/index?qid=20101101061506AAPNY2q







영화 '겨울왕국(Frozen, 2013)'의 한 장면으로 나오는 시계를 플래시로 만들어서 HTML5로 변환.

크롬, 파이어폭스, 최신버전의 익스플로러(익스10 이상)로 봐야 제대로 나옵니다.
(한스머리를 누르면 숨어있는 초침을 볼 수 있습니다.. 다시 누르면 사라져요
그냥 디버깅용 초침이라서 깊이처리는 안했습니다)

현재 시간이 나옵니다










오늘 웹툰보려고 한번 들어가보니까

네이버 웹툰에 스피드뷰라는게 생겼네요.

그동안 웹툰이 11시 5분경부터 순차적으로 올라오던 이유가 

네트워크 부하가 한번에 몰리는 것을 막으려고 그랬다는데


이 스피드뷰라는 프로그램이 일종의 그리드 컴퓨팅 프로그램인것 같네요

이걸 설치한 사람의 컴퓨터자원을 이용해서 서버부하를 줄이는..



제가 직접 깔아보겠습니다

설치하고 웹툰들어가서 플러그인 실행하면 작업표시줄에 아이콘 뜨고

작업관리자 보면 프로그램 하나 돌아가고있네요.. 일단 특별히 크게 느려지거나 하진 않는 것 같긴한데

일단 유저쪽 자원을 쓰는건 맞으니 꺼림칙하면 그냥 웹툰뜰때까지 기다리는 것도 좋겠네요

전 원래 웹툰을 다음날보는지라 크게 필요없어서 지웠습니다.








사용자정의 클래스를 만들 때

메서드와 이벤트리스너(Event를 Dispatch하는 클래스일 경우)와 관련된 코드힌트를 띄우는 방법입니다.


FlashDevelop(플래시디벨롭)으로만 해 본 거라서

다른 액션스크립트 개발툴에서도 되는지는 모릅니다.




1. Method details


/**

 * This is function.

 * @param a parameter1

 * @param b parameter2

 * @return something

 */

public function func1(a:int, b:String):int

{

return 0;

}

메서드 func1()을 사용할 때 코드힌트가 뜬다.





2. Event 메타태그


[Event(name = "complete", type = "flash.events.Event")]

public class ClassA extends EventDispatcher {


아래와 같이 addEventListenr( 를 입력하면 등록해놓은 이벤트가 뜬다.

이벤트가 여러개일 경우엔 메타태그를 여러 번 써도 된다.






1번과 같은 경우는 'documentation'이라고 해서 ASDoc문서를 구성할 수 있는 것들이다.

클래스 선언부 위에 

/**
*
*
*/

과 같은 꼴로 'documentation box'를 만들어서 @author, @version, @eventType등의 정보를 쓰고

메서드 선언부 위에도 @param, @return 등의 documentation tag를 달 수 있다.



자세한 내용은 documentation tag나 AsDoc 등의 검색어로 검색해보면 잘 나오니 pass..




p.s. /** ... */ 꼴 대신 슬래시를 3개 쓴 ///를 써도 가능하다.






function a() { b(); } function b() { c(); } function c() { d(); } function d() { trace(""); //중단점 1 setTimeout(e, 0); } function e() { trace(""); //중단점 2 } a();




● 중단점 1에서의 호출스택



d

c

b

a

init

Main





● 중단점 2에서의 호출스택 (비동기적으로 새로운 스택으로 실행된다.)



e

builtin::apply

onTimer

_timerDispatch

tick



flash.utils.setTimeout()함수를 실행하면

flash.utils.Timer객체의 함수들이 실행되고있다.

그래서 AS3.0레퍼런스에도 setTimeout()을 쓰기보다

repeat이 1인 Timer객체를 쓰라고 추천하고있다.











( tibyte.kr과 cafe.naver.com/sdbx에 게시)


 2D 게임을 짜다가 날아가는 미사일이 적을 향해 회전해야 하는 것을 구현할 때

미사일이 시계방향(CW : ClockWise)으로 회전할 것인지, 아니면

반시계방향(CCW : CounterClockWise)으로 회전해야 하는지 알아내야 한다.


 arctangent 함수로 미사일 진행방향과 적(목표물)의 각도를 구하여

미사일의 현재 진행각도와 조건문으로 비교하면 쉽게 될 것 같지만

각도체계가 -pi ~ pi 로 pi각 부분에서 불연속적인 수치가 나타나기 때문에

조건문이 생각보다 복잡해진다.



 미사일 진행방향의 방향벡터를 u, 미사일로부터 목표물에 이르는 방향벡터를 v로 놓고

두 방향벡터의 판별식을 보면 시계방향으로 돌아야 하는지 반시계방향으로 돌아야 하는지 알 수 있다.

판별식 값의 크기는 기하학적으로 두 방향벡터가 이루는 평행사변형의 넓이가 되는데

여기서 그 값의 부호를 보면 두 벡터의 위치관계가 나온다.



[그림1]



[그림1] 과 같이 방향벡터 u를 기준으로, det[u v]<0이면 v는 u보다 시계방향으로 회전한 곳에 위치하고,

det[u v]>0이면 v는 u에서 반시계방향으로 회전한 곳에 위치한다.

판별식 값이 0이면 두 방향벡터는 평행하다.






[그림2]



 다시 처음의 미사일 문제로 돌아와서 [그림2]에는

미사일의 벡터(벡터 AB)와 목표물(점 P)가 그려져 있다.

여기서 벡터AB와 벡터AP를 구하여 판별식을 구해본다면

미사일이 어디로 돌아야 하는지 계산할 수 있을 것이다.


벡터 AB : (Bx-Ax, By-Ay)

벡터 AP : (Px-Ax, Py-Ay) 




det[AB AP] = (Bx-Ax)*(Py-Ay) - (By-Ay)*(Px-Ax)



즉  (Bx-Ax)*(Py-Ay) (By-Ay)*(Px-Ax)의 부호를 보면

시계방향, 반시계방향을 결정할 수 있다는 것이다. 


컴퓨터 그래픽에서는 y좌표의 값이 아래로 갈수록 커지기 때문에

위의 내용을 반전하여,

판별식값이 0보다 작으면 반시계방향이고,

판별식값이 0보다 크면 시계방향으로 처리하면 된다.







 

 

 

 

 

 

티스토리 초대장 9장 배포합니다!

아래 양식에 맞추어 덧글을 작성해주세요

 

1. 메일주소

2. 블로그 운영목적 (간단하게)

3. (있을 경우)기존에 운영하던 블로그

 

 

 

 

 

 

 

 

 

 

이 글은 tibyte.krcafe.naver.com/sdbx에 게시됩니다.

(설명글은 http://cafe.naver.com/sdbx/737에 있습니다.) 


플래시 클라이언트는 소켓서버에 연결할 때 정책파일(crossdomain.xml)을 달라는 요청을 보내는데 이 파일을 보내주지 않으면 통신을 시작할 수 없습니다.

클라이언트에서 Security.loadPolicyFile()메서드로 원격 서버와 같은 도메인에 연결하여 xml파일을 직접 받아올 수 있지만 그러지 못하는 상황에는 서버프로그램에서 이 정책파일을 직접 보내줄 수도 있습니다.

ActionScript 3.0으로 작성된 Adobe AIR 소켓서버 코드를 보겠습니다.

 

 


우선 ServerSocket객체를 만들고 bind()listen()을 수행하여 서버소켓을 가동시키는 함수입니다. (serverSocket은 이 클래스의 private멤버변수입니다.)


private function bind():void

{

//기존에 실행 중인 소켓서버가 있으면 닫고 새로 실행

if(serverSocket.bound)

{

serverSocket.close();

serverSocket = new ServerSocket();

}

serverSocket.bind(로컬포트, 로컬IP);

serverSocket.addEventListener(ServerSocketConnectEvent.CONNECT, onConnect);

serverSocket.listen();


//로그 코드 삽입

}

 



다음은 ServerSocketConnectEvent.CONNECT 이벤트가 발생했을 때  실행되는 onConnect함수입니다.



private function onConnect(event:ServerSocketConnectEvent):void

{

var socket:Socket = event.socket;

clientSockets[socket.remoteAddress] = 1;//연결된 클라이언트들을 배열로 관리

socket.addEventListener(Event.CLOSE, onClientDisconnect);//클라이언트가 접속을 끊었을

socket.addEventListener(ProgressEvent.SOCKET_DATA, onClientSocketCert);//클라이언트로부터 데이터가 들어올 때

//이 밖에도 다른 이벤트나 예외처리구문, 로그(기록) 남기는 구문들을 넣어줍니다.

}



 

연결이 되면 클라이언트는 서버로 메시지를 보내고 이에 따라 ProgressEvent.SOCKET_DATA 이벤트가 발생합니다.

 


 클라이언트가 정책파일을 찾지 못했을 때는 843번 포트로 "<policy-file-request/>" 이라고 정책파일을 요청하는 메시지를 보냅니다. 따라서 서버에서는 저 메시지가 들어왔을 때 정책파일을 보내주어야 합니다.

 



private function onClientSocketCert(event:ProgressEvent):void

{

var socket:Socket = event.target as Socket;

var message:String = socket.readUTFBytes(socket.bytesAvailable);

if (message == "<policy-file-request/>") {

var policy:String = "<cross-domain-policy>" +

"<allow-access-from domain=\"*.example.com\" to-ports=\"8800\"/>" +

"</cross-domain-policy>\x00";

socket.writeUTFBytes(policy);

socket.flush();

socket.close();

} else if(message=="BEGIN") {

socket.removeEventListener(ProgressEvent.SOCKET_DATA, onClientSocketCert);

socket.addEventListener(ProgressEvent.SOCKET_DATA, onClientSocketData);

socket.writeUTFBytes("READY");

socket.flush();

      }

//이 밖에도 로그 남기는 코드를 삽입

}

 

위 함수에서 볼 수 있듯이 XML파일을 문자열형태로 직접 전송합니다.

 

"<cross-domain-policy>" +

"<allow-access-from domain=\"*.example.com\" to-ports=\"8800\"/>" +

"</cross-domain-policy>\x00"

 

(여기서 쓴 8800번 포트는 임의로 정한 포트번호입니다.)

 

크로스도메인(crossdomain.xml)파일에서 도메인과 포트를 지정해주는데요, 와일드카드 문자를 쓸 수 있습니다.

 

 







 

+ Recent posts