SF대작「트랜스포머」의 특수효과는 이렇게 만들어졌다 SF대작「트랜스포머」의 특수효과는 이렇게 만들어졌다 진행 류준영 기자, 촬영 유회현PD, 편집 이정우PD [자료=한국문화콘텐츠진흥원]한국문화콘텐츠진흥원 주최로 열린 ‘2007 문화기술(CT) 전시회’ 및 컨퍼런스‘에선 SF대작 ‘트랜스포머’와 지난해 아카데미 시각효과상 수상작인 ‘캐리비안의 해적-망자의 함’ 등 세계적인 작품에 참여한 기술감독(홍재철, 김상진)들이 내한, 영화지망생들을 위한 ‘할리우드 최첨단 시각효과’에 대한 특강을 가졌다. 홍재철 감독은 조지 루커스가 설립해 더욱 유명한 특수효과 업체 ILM 소속이며, 영화 ‘트랜스포머’ ‘스타워즈’ ‘해리포터와 아즈카반의 죄수’ 등에 참여했다. 또 김상진 감독은 애니메이션의 명가 월트 디즈니의 기술감독으로 ‘치킨 리틀’ ‘쿠스코 쿠스코’ ‘타잔’ 등의 작품을 맡아 진행했다.@ 출처 : http://www.mncast.com/mainFrame.asp?mainSubMenu=/player/index.asp?mnum=3214857
2007/11/08 13:32 2007/11/08 13:32
날이 갈수록 웹 관련 기술은 발전하고 있지만, 이러한 기술의 발전에 비례하여, 웹 관련 사용자들의 새로운 불편함이 나타나고 있다. 최근 이에 대한 조사를 통하여 나타난 웹 사용자들이 현재 웹에 대하여 가장 불편함을 느끼는 10가지 요소를 다음과 같이 제시하고자 한다.

첫째, 의심스러운 프라이버시 관련 정책
69퍼센트의 사용자들이 긍정적으로 답변하고 있는데, 특히 비즈니스 관련 사이트, 이 중에서도 건강이나 재무관련 서비스 사이트에서 사용자들로부터 민감한 정보들을 수집하고자 하는 성향에서 나타나고 있는 것으로 알려지고 있다. 이러한 첫 번째 내용은 최근 기사의 내용[GTB2007100662]과도 부합하는 요소이다.

둘째, 난해한 온라인 형식
새로운 사이트에 등록하거나, 웹 상에 정보를 제공하고자 할 때, 사용자들은 익숙하지 못한 인터페이스나 너무 많은 정보를 한꺼번에 요청하는 방식에 대하여 65퍼센트의 사용자들이 거부감을 느끼고 있는 것으로 조사되었다. 웹사이트 개발자들은 이러한 사용자들의 거부감을 최소화시키기 위하여 중요한 정보와 그렇지 않은 정보를 하이라이트시키는 방식을 통하여 차별화시킬 필요가 있다.

세 번째, 웹의 지나친 상업화
웹 사이트에 들어가보면, 사용자의 정상적인 웹 내비게이션을 방해하는 흐름들이 지나치게 많이 관찰된다. 예를 들자면, 팝업창, 시끄러운 플래시 광고파일, 배너광고, 사용자의 특정 행동 없이도 자동으로 작동되는 비디오 광고들, 대개 푸쉬 광고의 형태로 사용자에게 제공되고 있는 이러한 파일들은 상업화된 주요 요소로서 사용자들 중 62퍼센트가 거부감을 느낀다고 조사되었다. 야후나 마이스페이스 같은 유명사이트도 마찬가지로, 이럴 경우 수익모델의 확보를 위한 상업화 노력도 좋지만, 구글과 같은 단순한 인터페이스가 사용자들에게 더 크게 어필할 수 있다는 사실에 주목할 필요가 있다.

네 번째, 표준화에 대한 필요성
현재 사용자들이 주로 사용하고 있는 웹브라우저인 인터넷 익스플로러의 경우, 웹 페이지를 제작하기 위하여 사용되는 핵심 포맷에 대한 지원이 부족하다는 것이 가장 큰 단점 중의 하나이다. 많은 웹디자이너들은 표준화에 부합하지 못하는 페이지를 제작하고 있고 단지 이러한 IE에만 익숙한 사이트를 만들고 있는 것이다. 새로운 웹 2.0 스타일의 사이트가 많아질수록 이러한 흐름에 역행하는 새로운 시도가 필요할 것이고, Firefox.com의 성공에 주목할 필요가 있는 것이다.

다섯 번째, 지나친 커뮤니티와 상호작용들
약 58퍼센트의 사용자들이 웹 2.0으로 진화되고 있는 현 웹 플랫폼에 대하여, 지나친 다른 사람들과의 상호작용, 자신이 업로드한 콘텐츠 하나하나에 대한 사용자들의 댓글들이 오히려 부담스럽다고 응답하고 있다.

여섯 번째, 이벤트 티켓 구입하기
약 54퍼센트의 사용자들이 불편함을 나타내고 있는데, Ticketmaster와 같은 사이트에서 사용자의 편의성을 어떻게 증진시키고 있는지 주목할 필요가 있다. 사용자들은 티켓 구입사이트에서의 잦은 매진, 표가 연기되는 상황, 금융사이트와의 복잡한 링크로 인하여 불편함을 호소하고 있다.

일곱 번째, 웹 2.0이 과연 무슨 도움이 되고 있는가?
웹 2.0 기술이 사용자들에게 새로운 체험과 경험을 제공하여 웹에서의 상호작용을 증진시키고 있는 부분에 대하여는 모두 공감하지만, 이러한 경험이 궁극적으로 사용자 가치향상에 무슨 도움이 되고 있는지 사용자들은 의구심을 품고 있다. 커뮤니티 지향적인 웹사이트에 대하여 사용자들이 매력을 갖게 하기 위해서는 사용자들을 유인하기 위한 동기들이 무엇이 되어야 할지에 대한 고찰이 필요하다.

여덟 번째, 전자책에 대한 비용
웹 상에서 구매할 수 있는 전자책은 출판비용이나 유통비용이 거의 들지 않는데도 불구하고, 사용자들이 실제 지불하는 비용은 기존의 오프라인 책에 비하여 크게 차이가 나지 않는 부분에 대하여 사용자들이 의구심을 품고 있다.

아홉 번째, 실망스러운 웹 비디오
UCC 동영상의 활성화로 인하여 다양한 동영상 콘텐츠가 웹 상에 나타나고 있는데, 사용자 제작의 개념은 훌륭하나, 과연 효율적인 동영상이 얼마나 되느냐에 사용자들이 그저 그런 동영상 콘텐츠에 대하여 흥미를 잃어가고 있다.

열 번째, 지루한 가상세계
세컨드 라이프와 같은 가상세계가 나타나고 있지만, 이러한 사이트를 이용하지 않는 비사용자들의 반응은 자신들이 생각하고 있는 가상세계에 대한 반응과 이러한 사이트에서 알 수 있는 가상세계에 대한 반응과 일치하지 않고 있다는 데에 대하여 의구심을 제시하고 있는 것에 주목할 필요가 있다.

위에서 나타난 10가지 불편 요소를 살펴보자면, 신기술 자체가 중요한 것이 아니라, 사용자의 요구에 기반한 사용자들의 가치를 정확히 꿰뚫을 수 있는 것이 무엇인지 접근하는 것이 가장 필요한 것으로 파악할 수 있다. 바야흐로 푸쉬 기반의 기술전략이 아니라 풀 기반의 기술전략을 어떻게 추진할 것인가? 그리고 그 중심에 사용자, 다시 그 중심에 가치란 부분이 어떻게 연결될 것인지가 필요한 것이다.

출처 : http://www.yeskisti.net/yesKISTI/Briefing/Trends/View.jsp?ct=TREND&clcd=&clk=&lp=BM&gotoPage=1&cn=GTB2007100803
2007/11/01 09:09 2007/11/01 09:09
Tags:

출처 : http://www.zdnet.co.kr/itbiz/column/anchor/hsryu/0,39030308,39162121,00.htm

장말 공감 가는 글인거 같다...ㅋㅋ
일단 제목부터 맘에 들어서..ㅋ



류한석(IT 컬럼니스트)   2007/10/09

한국의 많은 소프트웨어 업체들이 개발자를 제대로 관리하지 못하고(또는 안하고) 있다. 소프트웨어 개발은 정신에 의한 작업이다. 누가 하는 가에 따라서, 어떤 동기부여를 하는 가에 따라서, 어떤 환경에서 하는 가에 따라서, 어떻게 관리하는 가에 따라서 엄청나게 다른 결과를 만들어낸다.

하지만 관리라는 이름 하에 개발자에게 모욕적인 대우를 하는 경우도 많다. 작업에 지장이 있을 정도의 저사양 개발장비를 제공하고, 좁아터진 공간에, 계속 울리는 전화벨과 시끄러운 대화 소리, 휴식공간이라고는 전혀 없는 조직도 많다. 직원들의 일거수일투족을 감시하고, 심지어는 복장 검사를 하는 경우도 있다.

또한 프로젝트 데드라인을 맞추기 위해 새벽에야 겨우 집에 들어갔음에도 불구하고, 출근시간에 몇 분 늦었다고 해서 지각을 체크하고 전체 직원이 모인 회의에서 실명을 거론하는 회사도 있다. 그런 회사일수록 야근수당이 없고 교통비도 지급하지 않으며 사소한 비용을 아낀다. 한마디로 작은 비용을 절약함으로써, 신뢰 상실이라는 큰 비용을 지불하는 것이다.

그런 회사에서 만들어지는 소프트웨어는 품질이 나쁘다. 불행한 개발자들은 품질이 나쁜 소프트웨어를 만들어 낸다. 어쩌면 잠을 못 자고 피로에 지친 개발자들이 내쉬는 서글픈 한숨이 소프트웨어의 영혼에 스며들어 가는 것은 아닐까? 저주받은 소프트웨어. 마치 호러영화의 한 장면처럼 느껴진다.

회사는 직원들을 사랑하지 않으면서, 직원들에게 애사심을 강요하는 회사를 보고 있자면 실소가 나온다. 물론 회사로서는 직원들에게 사랑을 보여줄 수 없는 가장 큰 이유가, 열악한 비즈니스 환경으로 인한 비용적 압박 때문이라고 얘기할 것이다. 백분 양보하여 그것을 인정한다고 할 지라도, 그렇다면 도대체 왜 부적절한 관리자에게 관리를 맡기고 있는 것일까?

나쁜 관리자가 프로젝트를 망치고 있다!
업계를 보면 관리자의 자격이 전혀 없는 사람이 관리를 맡고 있는 경우가 무척 많다. 나쁜 관리의 비용은 엄청나다. 단지 팀 구성원들의 작업에 지장을 주는 정도가 아니라, 조직의 목표 달성에 해악을 미치며 결국 상당한 대가를 치르게 만들고 프로젝트를 완전히 망치는 경우가 빈번하다.

필자는 단지 관리자를 잘못 배정했기 때문에 수백억 원의 손해를 본 어느 대기업의 프로젝트를 경험한 적이 있다. 팀원들은 모두 유능했고 각자의 마음 속에 일을 잘하고자 하는 열정이 있었지만, 관리자의 무능과 변덕과 학대로 인해 팀원들은 모두 좀비가 되어갔다. 일부는 떠났고 일부는 일을 하지 않았고 일부는 하는 척을 했다. 결국 수년간 프로젝트를 진행했으나 결과는 나오지 않았고 프로젝트는 취소됐다. 몇 가지 추가적인 원인이 없었던 것은 아니지만, 가장 주요한 요인은 ‘나쁜 관리자의 존재’ 그 자체였다.

나쁜 관리자는 팀원들이 무엇을 하고 있는지 알지 못하며(또는 관심이 없으며), 팀원들의 능력을 제대로 파악하지 못한 채로, 원칙 없이 업무를 지시하며, 부적절한 인력을 배치하고, 팀원들과 제대로 대화를 나누지 않으며, 펫프로젝트(pet project, 고위층 또는 자신의 개인적인 관심으로 만들어낸 프로젝트)로 인해 업무 우선순위를 마구 바꾸고, 결과가 나와도 잘했는지 못했는지 제대로 판단하지 못한 채 자신의 기호에 따라 결과를 재단한다. 한마디로 그들은 조직의 목표와 팀원의 성장에는 아무런 관심이 없으며 단지 자신의 안위만 생각하는 사람들이다.

그러한 나쁜 관리자의 존재가 지극히 예외적인 경우라고 생각하는가? 만일 그렇다면 당신은 조직 생활의 경험이 많지 않든가, 아니면 억세게 운이 좋은 경우일 것이다. 그런 나쁜 관리자로 인하여 젊은 시절의 소중한 경험을 빼앗기는 팀원들이 몹시 많다. 나쁜 관리자의 해악은 단지 프로젝트의 실패로 나타나는 것뿐만 아니라, 사람들의 인생에서 그 시기에 필히 겪어야 할 소중한 경험까지 앗아가 버리는 것에 있다. 좋은 관리를 받아보지 못한 사람은 좋은 관리를 할 수가 없다.

좋은 관리자가 되기 위한 지침
그렇다면 좋은 관리란 어떻게 관리하는 것인가? 하단과 같이 몇 가지 지침을 제시할 수 있을 것이다.

첫째, 바라는 결과를 명확히 알려주어야 한다. 어떤 관리자들은 자신이 무엇을 원하는지 자기 스스로도 정확히 모르는 채 작업을 지시하고, 팀원의 작업 결과를 그날그날의 기분에 따라 자신의 기호대로 판단하곤 한다. 그런 관리자는 관리자로서의 자격이 없다.

둘째, 위임을 적절하게 수행해야 한다. 어떤 사람의 그릇은 위임할 수 있는 양의 크기로 정해진다. 즉 어떤 사람이 이루어낼 수 있는 최대 성과치는 그가 팀원들에게 권한을 위임할 수 있는 능력에 의해서 결정된다는 뜻이다. 할 일이 너무나 많지만 일할 시간이 없고 혼자서 모든 일을 처리하려고 하는 관리자는 탈진증후군(burnout syndrome)에 빠지게 된다. 그리고 탈진증후군에 빠진 관리자는 결국 팀을 궤멸시킨다.

셋째, 방법보다는 결과에 초점을 맞추어야 한다. 이 말에 오해가 없기를 바란다. 오로지 결과만 중요시하라는 뜻이 아니라, 결과가 올바르다면 방법은 팀원에게 맡겨두라는 뜻이다. 개발자 출신의 관리자는 자신이 선호하지 않은 방법으로 구현을 했다는 이유로 팀원을 질책하거나 업무를 회수하는 잘못을 저지르는 경우가 많다. 그런 관리자는 좋은 결과도 팀원들의 신뢰도 얻지 못할 것이다. 결과가 옳다면 그 방법은 팀원에게 맡겨두는 포용력을 가져야 한다.

넷째, 피드백을 주고, 코칭을 하고, 경력 개발을 지원해야 한다. 피드백이란 해당 직원의 업무 결과에 대해 어떻게 생각하는지 그 내용을 전달하는 것이다. 코칭은 일종의 도움을 주는 것으로서 선택 가능한 사항들 속에서 실행 계획을 만들도록 도와주는 것이다. 그리고 팀원이 새로운 지식과 경험을 쌓음으로써 성장할 수 있도록 경력 개발을 지원해야 한다. 팀원의 경력 개발에 전혀 신경을 쓰지 않은 관리자들이 너무 많다. 그것은 팀원을 일회용품으로 취급하고 있음을 스스로 증명하는 것과 같다. 경력 개발에 도움을 받은 팀원은 관심을 갖고 도와준 관리자를 언제까지나 기억할 것이다.

다섯째, 좋은 관리자는 자기 자신을 관리하는 사람이다. 좋은 관리자는 감정의 폭발에 반응하기보다는 사건에 대응한다. 불필요한 감정을 발산하여 팀원에게 공포심을 조장해서는 안 된다. 만일 감정이 폭발했거나 또는 잘못된 지시를 했다고 판단될 시에는 즉각 솔직하게 인정하고 사과를 해야 한다. 실수를 인정하는 관리자는 인간적으로 보인다.

좋은 관리 방법을 배우기는 힘들다. 왜냐하면 그것은 눈에 잘 보이지 않기 때문이다. 하지만 우리는 그것을 배우고 실천해야 한다. 그것이야말로 업계에 만연된 악순환의 고리를 끊어버리는 유일한 방법이기 때문이다. 우리가 겪은 불행한 경험을 다시금 후배들에게 전달해서는 안 된다.

비록 기술 중심의 소프트웨어 업체라고 할 지라도, 기술 관리란 기술이 아니라 사람을 다루는 것임을 잊지 말아야 한다. 회사가 가능한 범위 내에서 최상의 업무 환경을 제공하고, 개발자 개개인을 세심히 배려하는 피드백, 코칭, 경력 개발을 지원하는 관리자가 있는 조직이라면 개발자는 결코 불행하지 않을 것이며 더 나아가 어려운 일도 기꺼이 극복해 낼 것이다.

하지만 지금 이 순간에도 많은 기업들이 사소한 비용 절감과 무의미한 규칙 준수를 위해 직원들의 신뢰를 잃고 있으며, 나쁜 관리자를 배정함으로써 프로젝트와 팀원의 인생을 망치고 있다. 나쁜 관리자는 개인, 회사, 사회 모두에 악영향을 미치는 존재이다.

반면에 좋은 관리자는 탁월한 결과를 만들어내고 팀원들을 성장시키고 사회 전반에 좋은 인재를 공급한다. 그런 훌륭한 관리자가 어디 흔하냐고 항변하는 기업의 목소리가 들린다. 하지만 기업들이여, 그런 변명보다는 좋은 관리자를 채용하려는 노력, 그리고 양성하려는 노력, 그리고 그가 ‘진짜 관리’를 제대로 수행하였는지 평가하려는 노력을 무엇보다 먼저 기울여야 하지 않을까?

2007/10/13 09:51 2007/10/13 09:51
Tags:
주제 : IT 업체들은 과연 재택근무를 권장해야 하는가?
(부제 : IT 관리자들의 원격 노동자에 대한 두려움)

최근 컴퓨터와 통신의 발달은 재택근무 및 원격 근무를 가능하게 한다. 원격에서 회사 내의 컴퓨터에 접근하고 회사 내 하드디스크에 있는 데이터를 활용하여 근무를 연장하고 있다. 물론 회사 입장에서는 회사에서도 일을 하고 가정에서도 추가적으로 일을 함으로써, 근무 연장의 개념을 도입할 수도 있고, 예기치 못한 기상 변화에 따른 업무의 중단 없이 연속성 있게 업무를 처리할 수 있다는 장점이 있다.
그러나 원격 노동자에 의한 회사 내 네트워크에 대한 외부 접근이 업무의 효율성 면에서는 좋으나, 외부의 네트워크 공격에 대해서는 치명적일 수 있다는 약점이 있다. 이에 IT 관리자들은 이를 막으며 원격에서 근무를 할 수 있는 방안에 대해 고민하고 있다.
본 뉴스는 10명의 IT 관리자 중에서 9명 정도는 증가되는 생산력에도 불구하고 많은 댁내 노동자들은 결과들이 연결되어 있는 부지 밖으로부터 나온다고 주장하는 원격 노동 행위에 의해 야기되는 보안 위험에 두려워하고 있다는 새로운 연구 결과를 제기하고 있다. 주된 우려는 해커들이 회사 네트워크 속으로 “back door"로서 원격 연결하여 사용할 수 있고 인증 받지 않은 소프트웨어의 사용과 인터넷 접근에 의해 공동 네트워크가 위험해질 수 있다는 것이다.
Vanson Bourne의 연구에 따르면, 원격 노동자들의 87%가 자신들의 가정용 PC를 사용하여 회사의 업무 데이터에 접근한다. 소비자들은 총괄적으로 1,335명의 영국 성인을 조사하였고, IT 관리자는 250여 명의 종업원을 두고 의문을 갖는 200명의 경제인을 조사하였다.
가정용 컴퓨터에서 제어를 하거나 수정을 하는 것이 불가능한 회사 IT 부서를 가진 IT 관리자들은 가정 사용자들이 바이러스를 위해 전자메일 첨부 파일을 검사하거나 패치 파일을 설치하는지를 감시할 수 없다. 가정 노동자들의 90퍼센트는 자신들의 컴퓨터의 보안 재설치를 유지하는 것에 자신들이 책임을 진다는 것을 인정하고 있다.
ZvXEL에서 보안 관련 관리자인 James Walker는 “오늘날 우리는 이전에 가능하였던 것보다 더욱 쉽게 외국과 집을 연결할 수 있는 기술을 갖고 있다. 예를 들어, 이러한 연결이 보안이 되지 않는다면, 가정용 컴퓨터에 트로이 목마 바이러스와 같은 것을 통해 회사 로그인 정보를 훔칠 수 있는 해커는 빌딩 내부에 한 번도 들어오지 않고서, 공동 네트워크를 아수라장으로 만들 수 있다”고 말했다.
노동자들은 회사가 원격 노동자들에게 적당한 보안 제어를 제공하기 위해 노트북 컴퓨터를 제공할 필요가 있다고 결론짓고 있다.
결론적으로, 점차 모든 정보가 실시간으로 처리될 수 있을 정도의 네트워크 속도와 컴퓨터의 발달은 원격 및 재택근무를 확대하게 될 것으로 기대되며, 이를 활성화하기 위해서는 해커로부터의 안전을 위해 원격으로 회사 내의 네트워크에 접근할 때 확실한 보안 프로그램 및 인증 절차가 필요하며, 원격에서 회사 망으로 접근할 때에는 업로드에는 제한을 두고 다운로드만 허용하는 등의 바이러스 예방에 만전을 기해야 한다.


정말 재택 하고 싶당...된장 왜이리 오기 힘든건지...
나이가 있어서 그러나...ㅡㅡㆀ
재택을 한다고 해도 작업을 안하거나 하지않는데, 목표 업무량을 따라갈 수 있는 부분인데..
하지만 모든 경영진이나 관리진은 작업자가 눈에 보이기를 바라고 있다.
이건 나도 마찬가지이니.....
어떠한 방식으로든 작업 환경의 변화가 필요한 직업이  IT 관련 직업인듯 하다..(갠생각)
2007/10/13 09:48 2007/10/13 09:48
Tags:
대표적인 오픈소스 DBMS로 IT업계에서 널리 사랑 받아 온 MySQL이 상용화 서비스로 전열을 갖춰 국내 시장에 들어왔다. 이에 따라 MS와 오라클 등 상용 DBMS 업계는 긴장 국면으로 접어들고 있다.

MySQL의 국내 인스톨 비중은 전체 DBMS 시장에서 약 25% 가량을 차지하고 있는 것으로 추정된다. 그 동안 MySQL을 도입한 거의 대부분 기업(혹은 사용자)이 무료 다운로드를 통해 사용해 왔기 때문에 정확한 수치를 알기는 힘들지만, 상당한 비중을 차지하고 있다는 것은 MS나 오라클 등 경쟁사들도 동의하는 부분이다.

지난 14일 MySQL은 한국지사를 설립하는 대신 리눅스데이타시스템(LDS)를 국내 총판으로 채택하고, 사용자 컨퍼런스를 개최함으로써 국내 DBMS 시장에 본격적으로 상용 서비스를 시작한다고 선언했다. 이와 함께 ‘MySQL 유저 컨퍼런스’를 개최했는데 1,200여명 이상이 참석한 가운데 성황리에 마무리됐다.

행사에 대한 대대적인 홍보가 없었음에도 불구하고 수많은 참석자가 모인 것은, 그만큼 MySQL에 대한 기술지원이 필요하다는 것을 반증하고 있다. 참석자들은 오픈소스에 관심이 있는 학생도 있었지만, 과반수 이상이 MySQL을 사용하고 있는 기업의 IT엔지니어였으며 이중 오라클이나 MS SQL을 사용하고 있는 고객사의 엔지니어도 상당수 차지했다.

‘기술지원’ 갈증 해소, 상용화 부응
LDS는 주로 SMB 시장을 노리고 있다. 현재 국내 SMB DBMS 시장은 오라클, MS, IBM, 알티베이스, 큐브리드 등 약 1,000억원의 규모를 형성하고 있으며, LDS는 향후 3~4년 이내에 10~20%의 시장을 장악하겠다는 계획이다.

MySQL의 국내총판을 맞게 된 LDS의 정정모 대표는 “MySQL은 기업시장을 타깃으로 MS, 오라클, IBM 등과 경쟁을 예상한다. 오픈소스를 장려하는 정부정책에 대한 기대가 있으며 초기에는 공공 프로젝트에 도입이 예상된다”며 “특히 공공기관은 DBMS 도입에 있어 컨설팅이나 서비스가 필요하기 때문에 책임소재가 명확해야 하는데 LDS라는 책임자가 생겼기 때문에 가능성이 있다”고 설명했다.

단, 그 동안 MySQL이 ‘공짜’라는 인식이 강하기 때문에 이를 상용으로 전환하는데 진통을 겪을 것으로 예상된다. 국내 시장 진입에서 가장 큰 걸림돌 역시 이 부분이다.

MySQL의 카이 아르노 부사장은 “기업 시장 진출은 자신 있지만 프리웨어 기반이 많아서 단기간에 시장확대는 힘들 것으로 보인다. 자체 기술력을 가진 기업은 이미 MySQL을 도입해 스스로 개발해 운영하고 있는 곳이 많다”며 “이들에게 무리하게 상용을 권유하지 않을 것이다. 중장기적으로 보고 지원이나 마케팅을 강화해 가며, 공공기관이나 기술지원을 요하는 중소기업을 공략할 것이다”라고 말했다.

LDS는 이러한 부분을 고려해 중장기적인 계획을 세웠다. 기업에 있어 DB는 절대 멈춰서는 안될 미션크리티컬한 부분이라는 것을 감안할 때 반드시 기술지원이 필요한 시점이 ‘자연스럽게’ 발생한다는 설명이다. 그리고 MS나 오라클 등 기존 상용 DBMS 벤더들은 이들의 움직임에 예의 주시를 하고 있다.

‘공짜’라는 인식 제거와 신뢰성 확보가 관건
한국MS의 호웅기 부장은 “MySQL 행사장에 가보니 사용자층이 두터워서 놀랐다. 유료건 무료건 사용자가 많은 것은 사실이다. 그 동안 MySQL은 기술지원 주체가 없었던 것이 문제였지만, 이제 LDS가 권한을 가짐으로써 그 갈증을 해소할 단초를 제공했다”라고 말했다.

그는 또 “때문에 MS 입장에서는 신경이 쓰이는 것이 사실이다. 사업 주체가 생겨나 기업용으로 적용될 확률이 높아졌고, MySQL이 리눅스 보다 윈도우 기반에서 더 많이 쓰이고 있기 때문에 MS의 시장을 잠식할 수 있다는 우려도 있다”라고 덧붙였다.

가트너의 DBMS 시장 조사 결과 역시 MS, 오라클에 이어 MySQL이 뒤따르고 있는 것으로 조사된 바 있다. 그렇지만 앞서 언급한 대로 MySQL이 무료에서 유료로 성공적으로 전환하게 될지는 미지수다. 조사 결과처럼 인스톨 기반이 많은 것과 그 매출이 높은 것은 별개의 문제기 때문이다. 또한 DB의 안정성과 신뢰도 측면에서 ‘상용제품으로서’ 입증이 부족한 상황이다.

MS의 호부장은 “MS나 오라클은 MySQL의 진입으로 인해, 인스톨 부분에서 타격을 입게 될 것이다. 잠재매출이 MySQL로 인해 잠식당하게 되지만 매출에서는 위협을 느끼지 않고 있다. 수익창출 부분과 신뢰성 확보가 MySQL이 극복해야 될 과제다. 이는 좀더 두고 봐야 할 것이다”라고 말했다.

오라클의 한 관계자는 “최근 MySQL 등 오픈소스의 시장 진출이 활발해지고 있다. 그러나 오라클DB는 대용량 트랜잭션에서 강점을 가지고 있다. 전체 DBMS 시장에서는 MySQL 등 오픈소스 SW의 진출이 큰 영향을 주지 못할 것이라 생각한다”고 말했다.


출처 : http://www.zdnet.co.kr/news/enterprise/dbms/0,39031095,39161483,00.htm
2007/09/29 04:32 2007/09/29 04:32
Tags:

출처 : http://www.zdnet.co.kr/news/enterprise/os/0,39031185,39159100,00.htm


MS의 데스크톱 거점이 사라지고 있다.

사람들이 수년 동안 예측해 왔듯이, 윈도우 사용자를 빼앗아가는 웹 대신 이제는 리눅스와 핸드헬드 기기가 대세이다.

3일(미국시간) 발표된 에반스 데이터 연구에 따르면 소프트웨어 개발자들이 윈도우 데스크톱 PC용 애플리케이션을 작성하는 비율은 과거에 비해 줄어들고 있다고 한다.

이번 조사에서 에반스 데이터는 본인의 애플리케이션에 대해 윈도우용 버전을 목표로 하는 소프트웨어 개발자는 전년도 75%에 비해 65%에 불과하다는 것을 보여주었다. 연구 그룹은 이 수치가 내년에는 2% 추가 하락할 것으로 예상하고 있다.

리눅스 데스크톱용 애플리케이션을 작성하는 리눅스 개발자는 12%에 가까운데, 이는 전년도에 비해 34% 늘어난 수치이다.

에반스 데이터의 CEO 존 앤드류스는 발표문에서 "윈도우 이탈 현상은 2년 전부터 시작된 것이 분명하며, 데이터는 이러한 이탈이 가속화되고 있다는 것을 보여준다. 리눅스가 혜택을 봤지만 비전통적인 클라이언트 기기용 틈새 운영 시스템도 덩달아 성장하고 있다. 지형이 변하고 있다"고 말했다.

유능한 웹브라우저는 온라인이나 오프라인에서 정교한 애플리케이션을 실행할 수 있기 때문에 데스크톱 운영 시스템을 전혀 무관하게 만들지는 않더라도 중요성은 저하시킨다는 것이 기술업계의 공통된 의견이다.

많은 기업들, 심지어 MS조차 개발자가 온라인에서 작성할 수 있는 '웹, 클라우드, 운영 시스템' 구축 개념을 받아들이고 있다.

하지만 온라인 애플리케이션이 늘어나고 있지만, 에반스 데이터 연구는 윈도우 데스크톱 애플리케이션 개발도 꾸준하다고 지적한다.

조사에서는 현대 브라우저에서 지원되는 자바스크립트 언어는 현재까지 가장 대중적인 스크립팅 언어로, PHP나 루비, 파이톤과 같은 사용자 수는 3배 이상 늘어났다는 점도 확인됐다.

또한 가상화는 보편적 현상이 되고 있으며, 개발자의 42% 가량이 내년에 이 기술을 이용할 것으로 예상하고 있다.

조사는 매년 두 차례 400개 소프트웨어 개발자가 자발적으로 작성하며, 소프트웨어 판매업체의 후원을 받지 않는다.

2007/07/04 13:49 2007/07/04 13:49
Tags:

<html>
<head>
<style type="text/css">
<!--
#sponsorAdDiv {position:absolute; height:1; width:1; top:0; left:0;}
-->
</style>
<SCRIPT LANGUAGE="JavaScript1.2">

adTime=180;  // 보여줄 초 입력
chanceAd=1; // ad will be shown 1 in X times (put 1 for everytime)

var ns=(document.layers);
var ie=(document.all);
var w3=(document.getElementById && !ie);
adCount=0;
function initAd(){
       if(!ns && !ie && !w3) return;
       if(ie)                adDiv=eval('document.all.sponsorAdDiv.style');
       else if(ns)        adDiv=eval('document.layers["sponsorAdDiv"]');
       else if(w3)        adDiv=eval('document.getElementById("sponsorAdDiv").style');
       randAd=Math.ceil(Math.random()*chanceAd);
       if (ie||w3)
       adDiv.visibility="visible";
       else
       adDiv.visibility ="show";
       if(randAd==1) showAd();
}
function showAd(){
if(adCount<adTime*10){adCount+=1;
       if (ie){documentWidth  =document.body.offsetWidth/2+document.body.scrollLeft-20;
       documentHeight =document.body.offsetHeight/2+document.body.scrollTop-20;}
       else if (ns){documentWidth=window.innerWidth/2+window.pageXOffset-20;
       documentHeight=window.innerHeight/2+window.pageYOffset-20;}
       else if (w3){documentWidth=self.innerWidth/2+window.pageXOffset-20;
       documentHeight=self.innerHeight/2+window.pageYOffset-20;}
       adDiv.left=documentWidth-200;adDiv.top =documentHeight-200;
       setTimeout("showAd()",100);}else closeAd();
}
function closeAd(){
if (ie||w3)
adDiv.display="none";
else
adDiv.visibility ="hide";
}
onload=initAd;
//End-->
</script>

</head>

<body>


<div id="sponsorAdDiv" style="visibility:hidden">

       <table border="0" cellpadding="0" cellspacing="1" width="300" bgcolor="gray">
   <tr>
       <td width="288" height="145" valign="top" bgcolor="white"><p>태그인넷입니다<br>
           www.tagin.net<br>이 레이어는 3초뒤 사라집니다</td>
   </tr>
</table>
</div>

</body>

</html>


2007/06/21 15:51 2007/06/21 15:51
Tags:

This is a protected post. Please enter the password to view the article.
이 글은 비밀글입니다. 글을 보시려면 비밀번호를 입력하세요.

1.객체지향 스크립팅
어떤 정보를 클래스(class)라 부르는 그룹 내에 정리해서 구성하는 방식
클래스 = 속성(properties) + 메서드(method)
ex) 사람 = 성,키,피부색(구별특징) + 말하기,걷기,잠자기(행동)
(사랑은 클래스 이고 개개인은 오브젝트)

2.오브젝트
액션 스크립트에서 미리 정의된 클래스
오브젝트의 메소드를 통해 정보를 얻거나 변경
ex) Date 오브젝트 경우 getHours(); , getSecond(); 메소드에 의해 시간과 초의 정보를
얻는다
무비클립 오브젝트 경우 play(); , stop(); 메소드 와 _alpha , _visible 속성변경

3.액션 스크립트(버튼 , 무비클립 , 프레임타임라인)
버튼 – 마우스 커서 반응(on 핸들러 액션)
무비클립 - 마우스 커서 반응(onClipEvent 핸들러 액션)
프레임 – 프레임 헤드가 프레임 내에 들어가면 실행

4.무비클립 계층구조
절대주소 : _root . a . aa . aaa
상대주소 :_ parent . _parent . a
_root : 메인scene
_parent : 무비클립의 한단계 위
점(.)의 의미 : 점은 계층 구조의 각 레벨을 구분하는 액션 스크립터 구문 작성요소
             ~의,~안에 있는 해석합니다.

5.무비클립속성
ex) A라는 무비클립 높이가 80
_root . A . height = 80;
_alpha : 투명도  
_x , _y : x , y의 위치
_rotation : 회전
_xmouse , _ymouse : 마우스의 x,y좌표
_width : 가로길이
_height : 세로길이
_visible : 0(안보임) , 1(보임)
_currentframe : 현재프레임수
_totalframes : 전체프레임수

6.좌표의 체계
(0,0)                              (800,0)
 
           
           
       

(0,600)
_root . a ._x = _root . a ._x + 200
_root . a ._y = _root . a ._y + 150

7.onClipEvent(이벤트){액션 실행명령}
load : 무비클립이 처음 실행될 때
unload : 무비클립이 타임라인에서 제거 된 다음
enterFrame : 매 프레임 마다 발생 (12fps이면 1초에 12번 실행)
mouseMove : 마우스가 움질익때
mouseDown : 마우스를 눌렀을 때
mouseUp : 마우스를 놓았을 때
keyDown : 키를 누를 때
keyUp : 키를 놓았을 때
Data : 로드무비를 통해 Data값을 얻을 때
2007/03/24 13:03 2007/03/24 13:03
                        <<  플래시 액션 스크립트  flash action script  >>

----------------------------------------------------------------------------
// .....       주석 기호  
/* ..... */    주석 기호  
----------------------------------------------------------------------------
\r        // 리턴 코드  (ASC 13)
\n        // 줄바꿈 코드 (ASC 10)
\r\n      // 줄바꿈 코드  (2줄)
\t        // Tab 코드 (ASC 9)
\b        // Backspce 코드 (ASC 8)
&         // text 파일 데이타 구분 코드
----------------------------------------------------------------------------
산술연산자  +, -, *, /, %                 //  %  나머지를 구한다
대입연산자  =, +=, -=, *=, /=, %=         //  i+=4 와  i=i+4 는 같다
증감연산자  ++, --                        //  i++  와   i=i+1 는 같다  
비교연산자  ==, !=, >, <, >=, <=          //  !=  '같지않다' 로 해석
비교연산자  ===                           //  숫자 와 문자 구분
a = 5;    b = "5";                        //  숫자 5 와 문자 "5"
(a == b)                                  //  숫자 5 와 문자 "5"  는 같다 (true)
(a === b)                                 //  숫자 5 와 문자 "5" 는 틀리다 (false)
논리연산자  &&, ||, !                     //  그리고(AND), 또는(OR), 아니면(NOT)
조건연산자  ?    ( a ) ? b : c ;          //  a 조건이 맞으면 b 틀리면 c 실행
x=5;  y=10;  z=(x<6) ? x: y;   trace (z); //  z 은 5 이다
문자연산자  eq  ne  not  or  add          //  eq(==) ne(!=) not(!) or(||) add(+ 문자열의 연결)
( )                                       //  연산의 순서를 정한다
[ ]                                       //  배열을 지정한다
" "                                       //  문자를 지정한다
a=1+2;  trace(a);                         //  연산 결과 출력.  결과는 3
aaa=1;  set("ccc", aaa );  trace(ccc);    //  변수에 값을 지정.  결과는 1
aaa=1;  set("ccc", "aaa");  trace(ccc);   //  변수에 값을 지정.  결과는 aaa
set("ooo", getProperty ("ppp", _x ));     //  ppp x 좌표를  ooo 에 지정.
----------------------------------------------------------------------------
for (a=1; a<=10; a++)  { trace("a="+a); };             //  for  반복문
for (i=1; i<=120;  i+=12) { continue; };               //  for step 반복문
while(true) {  if(a == 0) { break; }; };               //  while  반복문
do { if(a == 0) { break; }; };  while(true);           //  do 반복문
if((n == 0) || (n >= 5)  &&  (n <= 55)  !(n=15)) {     //  if 조건문
 gotoAndPlay(1);
} else if (n == 2) {
 gotoAndPlay(2);
} else {
 gotoAndPlay(3);
};
num_ch = 3;                                             //  switch 조건문
switch (num_ch) {                                                
     case 1:    trace ( " case 1 tested true " );  break;
     case 2:    trace ( " case 2 tested true " );  break;
     default:    trace ( " no case tested true " );
};
----------------------------------------------------------------------------
function sumnumber(a,b,c) {  return(aaa= a+b+c); };    // 함수
sumnumber(1,2,3);
trace(aaa);
----------------------------------------------------------------------------
Math.abs(-1)              //  절대값.   결과는 1
Math.sin(1)               //  sin 값.   결과는 0.841470984807897
Math.cos(1)               //  cos 값.   결과는 0.54030230586814
Math.tan(1)               //  tan 값.   결과는 1.5574077246549
Math.log(2)               //  log 값.   결과는 0.693147180559945
Math.exp(1)               //  지수 값.    결과는 2.71828182845905
Math.sqrt(9)              //  제곱근 값.    결과는 3
Math.pow(2 , 4)           //  거듭제곱 값.    결과는 16
Math.ceil(1.1)            //  가까운 정수로 올림 값.    결과는 2
Math.ceil(1.5)            //  가까운 정수로 올림 값.    결과는 2
Math.floor(1.2)           //  가까운 정수로 내림 값.    결과는 1
Math.floor(1.7)           //  가까운 정수로 내림 값.    결과는 1
Math.round(1.2)           //  가까운 정수로 반올림 값.    결과는 1
Math.round(1.5)           //  가까운 정수로 반올림 값.    결과는 2
Math.max(1 , 2)           //  두 정수 중 큰 정수값.    결과는 2
Math.min(1 , 2)           //  두 정수 중 작은 정수값.    결과는 1
int(1.12 );               //  수치를 정수화.   결과는 1    
int(1.82 );               //  수치를 정수화.   결과는 1    
parseInt("3.2");          //  문자열을 정수화.  결과는 3    
parseInt("3.7");          //  문자열을 정수화.  결과는 3    
parseInt("5abc");         //  문자열을 정수화.  결과는 5
parseInt("abc5");         //  문자열을 정수화.  결과는 NaN    
parseInt("3E8", 16);      //  16 진수로 변환.   결과는 1000
parseInt("777", 8);       //  8 진수로 변환.   결과는 511
parseInt("1010", 2);      //  2 진수로 변환.   결과는 10
parseFloat("2")           // 문자열을 부동점 숫자로 변환.  결과는 2
parseFloat("2.4")         // 문자열을 부동점 숫자로 변환.  결과는 2.4
parseFloat("2.6abc")      // 문자열을 부동점 숫자로 변환.  결과는 2.6
Number("11")              //  문자열을 숫자로 변환.   결과는 11
Number("12.34")           //  문자열을 숫자로 변환.   결과는 12.34
Number("12.34abc")        //  문자열을 숫자로 변환.   결과는 NaN
sss = 123;  uuu = sss.toString();      // 숫자를 문자로변환.  결과는 123
ord("abc");                            //  ASCII 값.   결과는 97
s = "abc";   sss = s.charCodeAt(0);    //  1번째 ASCII 값 .   결과는 97
s = "abc";   sss = s.charCodeAt(1);    //  2번째 ASCII 값.    결과는 98
chr(65);                               //  ASCII 코드를 문자화.  결과는 A
String.fromCharCode(64,65,66);         //  ASCII 코드를 문자화.  결과는 @AB
Math.random();                         // 난수 발생.  결과는 0 - 1 사이의 소숫점 포함한 값
random(5);                             // 난수 발생.  결과는 0,1,2,3,4 중 하나
----------------------------------------------------------------------------
// delete 변수 또는 객체 ;             // 변수를 삭제  (var 로 선언된 변수는 삭제할 수 없다)
account = 1;   trace (account) ;                      // 결과는 1  
account = 1;   delete account;    trace (account);    // 결과는 undefined
delete onEnterFrame;                                  // 반복 실행 중지
this.onMouseMove = null;                              // 마우스 실행 중지
this.MoCp.clear ();                          // MoCp 무비클립 화면만 지움      
this.MoCp.removeMovieClip ();                // MoCp 무비클립 삭제
----------------------------------------------------------------------------
typeof( );            // String, Number, MovieClip, Object, Boolean, Function 여부를 지정
trace (typeof(1));    // 결과는 Number
trace (typeof("1"));  // 결과는 String
trace (typeof(aaa));  // aaa가 무비클립 이라면  결과는 MovieClip
----------------------------------------------------------------------------
isFinite( );            // 숫자가 유한수이면 true 무한수거나 음의 무한대이면 false
trace (isFinite(aaa));  // aaa 값이 NaN 이라면 결과는 false
----------------------------------------------------------------------------
Mouse.show();           // 마우스 보임
Mouse.hide();           // 마우스 감춤
myClip.onMouseDown = function () {trace (" depth 무시 "); };    // 마우스 누를 때
myClip.onMouseUp = function () {trace ("depth 무시 "); };       // 마우스 눌렀다 놓을 때
myClip.onMouseMove = function () { trace ("depth 무시 "); };    // 마우스 이동할 때
myClip.onPress = function () { trace ("depth 적용 "); };        // 마우스 누를 때
myClip.onRelease = function () { trace ("depth 적용 "); };      // 마우스 눌렀다 놓을 때
myClip.onReleaseOutside = function () { trace ("Outside"); };   // 마우스 나가서 놓을 때
myClip.onRollOver = function () { trace ("Over called"); };     // 마우스 오버 때
myClip.onRollOut = function () { trace ("Out called"); };       // 마우스 아웃 때
----------------------------------------------------------------------------
// 단추무비클립 클릭후 액션 스크립트를 넣는다
on (press){           }  // 마우스 버튼을 누를 때   };  x  }  o
on (release){         }  // 마우스 버튼을 눌렀다 뗄 때
on (releaseOutside){  }  // 마우스 버튼을 누르고 나가서 뗄 때
on (rollOver){        }  // 마우스 포인트가 위로 올라올 때
on (rollOut){         }  // 마우스 포인트가 밖으로 나갈 때
on (dragOver){        }  // 누른 채로 밖으로 나갔다가 다시 들어올 때
on (dragOut){         }  // 마우스버튼을 누르고 바깥으로 드래그할 때
on (keyPress){        }  // 지정한 키를 누를 때
----------------------------------------------------------------------------
// 무비클립 클릭후 액션 스크립트를 넣는다
onClipEvent (load) {            }  // 시작 될때  };  x  }  o  
onClipEvent (unload) {          }  // 제거 될때
onClipEvent (enterFrame) {      }  // 트리거 될때
onClipEvent (mouseMove) {       }  // 마우스가 이동할 때
onClipEvent (mouseDown) {       }  // 마우스 클릭 시
onClipEvent (mouseUp) {         }  // 마우스 클릭 후
onClipEvent (keyDown) {         }  // 키를 누를 때
onClipEvent (keyUp) {           }  // 키를 눌렀다 놓을 때
onClipEvent (data) {            }  // loadVariables 또는 loadMovie 액션에서 데이터가 수신될 때
----------------------------------------------------------------------------
// 마우스 더블클릭 때
ins.onPress = function() {
   if ((Number(getTimer()-mytime)<300) && (myxxx==_xmouse) && (myyyy==_ymouse)) {
       trace (" bdclick ");    // 더블클릭 성공
   } else {
       mytime = getTimer();  myxxx = _xmouse;  myyyy = _ymouse;  // 더블클릭 실패
   }
};
----------------------------------------------------------------------------
TextField.onChanged = function () { trace ("onChanged called"); };
// 텍스트 필드의 내용이 변경될 때
TextField.onSetFocus = function () { trace ("onSetFocus called"); };
// 텍스트 필드의 내용 부분에 마우스가 클릭 될 때
TextField.onKillFocus = function () { trace ("onKillFocus called"); };
// 텍스트 필드의 내용 바깥 부분에 마우스가 클릭 될 때
TextField.onScroller = function () { trace ("onScroller called"); };
// 텍스트 필드의 내용이 스크롤 될 때
----------------------------------------------------------------------------
myMovieClip.onData = function () { trace ("onData called"); };  
// 무비 클립이 loadVariables 또는 loadMovie 호출로부터 데이터를 받을 때
myMovieClip.onLoad =  function () { trace ("onLoad called"); };  
// 무비 클립이 load 호출로부터 데이터를 받을 때
myMovieClip.onUnLoad =  function () { trace ("onUnLoad called"); };  
// 무비 클립이 Unload 때
myMovieClip.stop()  
// 작업 중지
----------------------------------------------------------------------------
myDate = new Date();                               // 날짜 로드
myDate = new Date (년,월,일,시,분,초);             // 날짜 지정
yyyy = (myDate.getFullYear() + "-" + (myDate.getMonth() + 1) + "-" + myDate.getDate());
tttt = (myDate.getHours()+ " :" + myDate.getMinutes() + " :" +myDate.getSeconds());
----------------------------------------------------------------------------
_root.onEnterFrame = function() {   };             // 메인화면에서 프레임 반복
onEnterFrame = function() {   };                   // 심볼화면에서 프레임 반복
----------------------------------------------------------------------------
tmtm = getTimer();          
onEnterFrame = function() {
if ( (getTimer()-tmtm) >= 500 ) { tmtm=getTimer(); trace (tmtm); };   // 0.5초후 반복실행
if ( (getTimer()-tmtm) >= 1000 ) { tmtm=getTimer(); trace (tmtm); };  // 1초후 반복실행
if ( (getTimer()-tmtm) >= 2000 ) { tmtm=getTimer(); trace (tmtm); };  // 2초후 반복실행
};
----------------------------------------------------------------------------
tmtm = getTimer();
while(true) { if( (getTimer()-tmtm) >= 1000 ) {  break;  };  };    // 1초간 중지
while(true) { if( (getTimer()-tmtm) >= 2000 ) {  break;  };  };    // 2초간 중지
----------------------------------------------------------------------------
onEnterFrame = function() {                                
  nr += 1;  if (nr > 5 )  {  delete  onEnterFrame;  };           // 5번 반복실행후 중지
  trace (nr);
};
----------------------------------------------------------------------------
createTextField ("ins", 1, 100, 100, 50, 50)
ins.border = true;
function callback() {
  ins._x += 5;
  if ( ins._x > 400 ) { clearInterval( intervalID );  };      // 중지 (clearInterval)
}
var intervalID;
intervalID = setInterval( callback, 100 );             //  0.1초후 반복실행 (setInterval)
----------------------------------------------------------------------------
#include "script.as"         // script.as 파일 넣기 (액션 스크립트 txt 파일)
----------------------------------------------------------------------------
System.useCodepage = true;   // 한글 깨짐 방지
trace(System.capabilities.language)          // Flash Player가 지원하는 언어. 결과는 ko
trace(System.capabilities.hasVideoEncoder)   // 지원되는 비디오 인코더. 결과는 true, false.
trace(System.capabilities.hasAudioEncoder )  // 지원되는 오디오 인코더. 결과는 true, false.
trace(System.capabilities.hasAudio)          // 오디오 성능이 있는지 여부. 결과는 true, false.
trace(System.capabilities.hasMP3)            // MP3 디코더가 있는지 여부. 결과는 true, false.
----------------------------------------------------------------------------
escape("abc가나다");         // URL에 사용하기 위해 인코딩.
// System.useCodePage= true; 일때 결과는 abc%B0%A1%B3%AA%B4%D9
// System.useCodePage= false; 일때 결과는 abc%EA%B0%80%EB%82%98%EB%8B%A4
----------------------------------------------------------------------------
trace(targetPath(this));     // 대상 패스를 반환.  결과는 _level0.instance1 로 표시
trace(this.valueOf());       // 결과는 _level0 로 표시
----------------------------------------------------------------------------
trace(this.getBytesLoaded());  // 무비클립의 로드된 바이트 수를 알려준다.
trace(this.getBytesTotal());   // 무비클립의 전체용량 바이트 수를 알려준다.
----------------------------------------------------------------------------
getURL("C:/")                                          // 탐색기 열기
getURL("C:/Windows/NOTEPAD.EXE");   };                 // 메모장 열기
getURL("C:/Program Files/Accessories/WORDPAD.EXE");    // 워드패드 열기
getURL("C:/Program Files/Accessories/MSPAINT.EXE");    // 그림판 열기
getURL("C:/Windows/CALC.EXE");                         // 계산기 열기
getURL ("getdisplay.exe");                             // exe 파일 열기 (message)
getURL ("getdisplay.txt", "_self");                    // txt 파일 열기
getURL ("getdisplay.html", "_self");                   // html 파일 열기
getURL ("http://getdisplay.com.ne.kr", "_blank");      // 새로운 창으로 열기
----------------------------------------------------------------------------
Stage.showMenu = "true";        // 스크린 메뉴 보임
Stage.showMenu = "false";       // 스크린 메뉴 감춤  
Stage.scaleMode = "noScale";    // 화면의 사이즈를 고정
Stage.align = "TL";             // 화면의 정렬을 T(위) L(왼쪽)
          //  "T" 위 가운데    "B" 아래 가운데    "L" 가운데 왼쪽    "R" 가운데 오른쪽
          //  "TL" 위쪽 왼쪽   "TR" 위쪽 오른쪽   "BL" 아래쪽 왼쪽   "BR" 아래쪽 오른쪽
Stage.height      // 픽셀로 표시된 스테이지의 높이
Stage.width       // 픽셀로 표시된 스테이지의 넓이
----------------------------------------------------------------------------
_root.createEmptyMovieClip("box",1);      // 스테이지 테두리 주기
with (_root.box) {  moveto(1, 1);   linestyle(10, 0x00cc00, 100);
   lineto(stage.width, 1);     lineto(stage.width, stage.height);
   lineto(1, stage.height);    lineto(1, 1);   };
----------------------------------------------------------------------------
fscommand("showmenu", true);      // 스크린 메뉴 보임
fscommand("showmenu", false);     // 스크린 메뉴 감춤
fscommand("allowscale", true);    // 스크린 크기에 따라 무비의 크기도 변함
fscommand("allowscale", false);   // 스크린 크기에 따라 무비의 크기도 안변함
fscommand("fullscreen", true);    // 풀 스크린 (esc키 누르면 해제)
fscommand("fullscreen", false);   // 풀 스크린을 원래의 크기로 만든다
fscommand("trapallkeys", true);   // 키보드 키 사용할 수 없음 (풀 스크린 일때 esc키 먹통)
fscommand("trapallkeys", false);  // 키보드 키 사용할 수 있음
fscommand("quit");                // 스크린 닫기
fscommand ("exec", "b.exe");      // b.exe 파일 실행 (no message)
  플래시 무비(a.exe) 가 위치하는 폴더안에 fscommand 라는 하위 폴더를 만들고
  fscommand 디렉토리에  b.exe 가 있을때 플래시 무비(a.exe)를 실행하면 b.exe파일 실행
----------------------------------------------------------------------------
// getURL 로 javascript 사용하기
var hello = "Hello, World";
getURL("javascript:alert(\" "+ hello + "  \")");   // 메세지 띄우기
getURL("javascript:window.self.close()");          // 윈도우창 닫기
getURL("javascript:window.external.AddFavorite('http://','가')" );    //즐겨찾기 추가
----------------------------------------------------------------------------
// fscommand 로 javascript 사용하기
1.  fscommand ("messagebox", "This is a Flash.");   // aaa.swf flash script
2.  파일메뉴 - 제작설정 - 포맷 (HTML체크) - HTML (템플릿: with FSCommand 체크)
3.  파일메뉴 - 제작 (파일명은 aaa.swf) -  aaa.html 파일이 디렉토리에 만들어 진다
4.  aaa.html 파일을 열고  function aaa_DoFSCommand(command, args) {  아래에
     if (command == "messagebox") {  alert(args);  };   을 적고 저장 한다
5.  aaa.html 실행 (실행후 제작설정 해제)
----------------------------------------------------------------------------
// fscommand 로 javascript 의 변수값 불러오기
1. fscommand ("search", TextFieldvar);     // aaa.swf flash script
2. if (command == "search") {              // aaa.html script
      EEEfind = "FFFFFFFF";
      window.document.aaa.SetVariable("TextFieldvar", EEEfind) ;
      return TextFieldvar;
   };
3. aaa.html 실행
----------------------------------------------------------------------------
_root.loadMovie("a.swf");            // swf 파일 불러오기
_root.bbb.loadMovie("a.swf")         // swf 를 메인에 있는 bbb무비클립인스턴스에 불러오기
_root.loadMovie("a.swf", 1);         // swf 를 레벨1로 불러오기 (2 는 1를  screen over)
_root.loadMovie("aaa.jpg");          // jpg 파일 불러오기
_root.bbb.loadMovie("aaa.jpg");      // jpg 파일을 메인에 있는 bbb무비클립인스턴스에 불러오기
unloadMovie (1);                     // 레벨 1에 로드된 무비를 언로드
unloadMovie ("a.swf");               // 현재 무비에 로드된 a.swf 무비를 언로드
_root.bbb.unloadMovie();             // 메인 타임라인의 bbb 무비클립에 로드된 무비를 언로드
this["bbb"].unloadMovie();           // 현재 타임라인의 bbb 무비클립에 로드된 무비를 언로드
sss.bbb.unloadMovie();               // sss 심볼 타임라인의 bbb 무비클립에 로드된 무비를 언로드
----------------------------------------------------------------------------
button.onPress = function() { _root.loadMovie("aaa.swf"); }     // aaa.swf 실행중 초기화 하기
----------------------------------------------------------------------------
_root["ball_"+counter]._x = 11;       //  메인 화면의 클립 좌표
this["ball_"+counter]._x = 11;        //  현재 화면의 클립 좌표
aaa["ball_"+counter]._x = 11;         //  aaa 심볼 화면의 클립 좌표
----------------------------------------------------------------------------
this.createEmptyMovieClip("aaa", 1);             //  무비클립 생성 (2 는 1를 screen over)
duplicateMovieClip (aaa, bbb, 1);                //  aaa 무비클립  bbb 로 복사
this.bbb.removeMovieClip();                      //  bbb 무비클립 삭제
myClip._visible = true;                          //  클립 보임
myClip._visible = false;                         //  클립 감춤
myClip.swapDepths(100);                          //  클립 깊이 100 으로 지정 (2 는 1를 screen over)
myClip.swapDepths(otherClip);                    //  클립 깊이 otherClip 과 바꿈
for (i=1; i<=360; i++)  {                        //  클립 복사
    duplicateMovieClip (ins1, "mc"+i, i);
    setProperty ("mc"+i, _x, random(300));
    setProperty ("mc"+i, _y, random(300));
    setProperty ("mc"+i, _alpha, random(300));
    setProperty ("mc"+i, _xscale, 150);
    setProperty ("mc"+i, _yscale, 150);
};  
for (i=1; i<=360; i++)  {                        //  클립 복사
    duplicateMovieClip (ins1, "mc"+i, i);
    this["mc" + i]._x = i;
    this["mc" + i]._y = i;
};  
for (i=1; i<=50; i++)  {                          // 클립 이동
     this["mc_"+i]._x += 10;
     this["mc_"+i]._y += 10;
};  
for (i=1; i<=360; i++)  {                         // 클립 삭제
    this["mc" + i].removeMovieClip ();
};  
this["mc" + i].clear ();                        // 클립 화면만 지움
----------------------------------------------------------------------------
setProperty ("mv", _x, 150);           // mv 무비클립 x좌표 속성 변경
myMovieX = getProperty( mv, _x);       // mv 무비클립 x좌표 속성 읽기
trace(myMovieX);
----------------------------------------------------------------------------
_alpha              알파값(%)
_currentframe       현재재생중인 프레임(#)
_droptarget         드래그 앤드드롭 할때 놓는 타깃위치(name)
_framesloaded       로드된 프레임수(#)
_height             높이(#)
_name               인스턴스(string)
_rotation           회전값(#)
_soundbuftime       사운드버퍼링 시간(기본값 5초:#)
_totalframes        총프레임수(#)
_url                다운로드한 URL(string)
_visible            보인다,안보인다 (true,false)
_width              가로길이(#)
_x                  x좌표(#)
_y                  y좌표(#)
_xmouse             마우스x좌표(#)
_ymouse             마우스y좌표(#)
_xscale             x배율(%)
_yscale             y배율(%)
----------------------------------------------------------------------------
_root.a.play;                    //  메인에 있는 a무비클립  프레임 재생
_root.a.stop;                    //  메인에 있는 a무비클립  프레임 중지
play();                          //  stop으로 정지된 현재타임라인의 프레임 재생
stop();                          //  현재타임라인의 프레임 중지
gotoAndPlay(1);                  //  현재 Scene의 1프레임 재생
gotoAndPlay("a");                //  현재 Scene의 Label명 a 재생
gotoAndPlay("Scene 2", "c");     //  Scene 2의 Label명 c 재생
a.gotoAndPlay(1);                //  a무비클립의 1프레임 재생
gotoAndStop(1);                  //  현재 Scene의 1프레임 중지
nextScene();                     //  다음 장면의 프레임 1로 보내고 중지
prevSecne();                     //  이전 장면의 프레임 1로 보내고 중지
nextFrame();                     //  다음 프레임으로 보내고 중지
prevFrame();                     //  이전 프레임으로 보내고 중지
toggleHighQuality ();            //  저해상도와 고해상도 간을  전환
updateAfterEvent();              //  화면을 갱신 (onClipEvent 핸들러 내에서만 사용)
                                 //  (onMouseDown,  onMouseUp,  onMouseMove)
----------------------------------------------------------------------------
tellTarget ("../a") { nextFrame(); } //  ../a 무비클립을 호출후 다음 프레임 재생
if (_framesloaded = 10) {  }         // 만약 무비의 10프레임이 로드되면
----------------------------------------------------------------------------
// with 문
for (i=0; i<1000; i++) {
   with (aaa[i]) {
      _x = Math.floor(Math.random() * 500);
      _y = random(500);
      _rotation = random(360);
  }
}
// tellTarget 문 (속도빠름)
for (i=0; i<1000; i++) {
   tellTarget (aaa[i]) {
      _x = Math.floor(Math.random() * 500);
      _y = random(500);
      _rotation = random(360);
   }
}
----------------------------------------------------------------------------
aaa = new Array();              // 배열 초기화    
aaa = new Array("1","2","3");   // 배열값 넣기
bbb = ["Sun","Mon","Tue"];      // 배열값 넣기
aaa[1] = "abc";                 // 배열값 변환  ( "2" 가 "abc" 로 변환)
aaa[0] = "Jan" ;  aaa[1] = "Feb" ;  aaa[2] = "Mar" ;         // 배열값 변환
aaa[3] = "Apr"                  // 배열 추가 (aaa 값은  "Jan,Feb,Mar,Apr" )
ccc = aaa.concat(bbb);          // 배열 합침 (ccc 값은  "Jan,Feb,Mar,Apr,Sun,Mon,Tue" )
ddd = ccc.join("/");            // ,를  /로 변환  (ddd 값은  "Jan/Feb/Mar/Apr/Sun/Mon/Tue" )
ddd = ccc.length;               // 배열값 갯수 (ddd 값은  7 )
ddd = ccc.slice(2,4);           // 배열값 읽기 (ddd 값은  "Mar,Apr" )
eee = ccc.push("z","zz");       // 배열추가후  배열값 갯수 (eee 값은  9 )
                                //  (ccc 값은 "Jan,Feb,Mar,Apr,Sun,Mon,Tue,z,zz"   로 변함)
eee = ccc.pop();                // 마지막 배열 분리후 값  (eee 값은  "zz" )
                                //  (ccc 값은  "Jan,Feb,Mar,Apr,Sun,Mon,Tue,z"   로 변함)
eee = ccc.shift();              // 첫번째 배열 분리후 값 (eee 값은  "Jan" )
                                //  (ccc 값은  "Feb,Mar,Apr,Sun,Mon,Tue,z"   로 변함)
eee = ccc.reverse();            // 배열값 순서바꿈 (eee 값은  "z,Tue,Mon,Sun,Apr,Mar,Feb" )
                                //  (ccc 값도  "z,Tue,Mon,Sun,Apr,Mar,Feb"   로 변함)
eee = ccc.splice(2,5,"x","xx","xxx");  // 배열값 읽기후  변환  (eee 값은  "Mon,Sun,Apr,Mar,Feb" )
                                       //  (ccc 값은  "z,Tue,x,xx,xxx"   로 변함)
eee = ccc.unshift("1","2");     // 첫번째 배열추가후  값  (eee 값은  "7" )
                                //  (ccc 값은  "1,2,z,Tue,x,xx,xxx"   로 변함)
sss = new Array(1,2,3);         // 숫자 배열값 넣기
uuu = sss.toString();           // 문자로변환.  결과는 1,2,3
vvv = uuu.toLowerCase();        // 대문자를  소문자로 변환.  원래 값은 변경되지 않음      
vvv = uuu.toUpperCase();        // 소문자를  대문자로 변환.  원래 값은 변경되지 않음  
xxx = Number("111")             //  숫자로 변환.   결과는 111
xxx = Number("aaa")             //  숫자로 변환.   결과는 NaN
xxx = Number(true)              //  숫자로 변환.   결과는 1
xxx = Number(false)             //  숫자로 변환.   결과는 0
----------------------------------------------------------------------------
aaaAry = new Array();              // 2차원배열 사용하기   (5 * 5  배열)
aaasubAry0 = new Array();
aaasubAry1 = new Array();
aaasubAry2 = new Array();
aaasubAry3 = new Array();
aaasubAry4 = new Array();
aaasubAry5 = new Array();
aaaAry[0] = aaasubAry0;  
aaaAry[1] = aaasubAry1;  
aaaAry[2] = aaasubAry2;  
aaaAry[3] = aaasubAry3;  
aaaAry[4] = aaasubAry4;  
aaaAry[5] = aaasubAry5;  
for(i=0;i<6;i++) {
     for(j=0;j<6;j++)  {
        aaaAry[i][j]=  " ==> " + i  + " * " + j  + " value" ;
        trace( i  + " * " + j  +  aaaAry[i][j]);
     };
};
trace(aaaAry[1][2]);
trace(aaaAry[4][5]);
----------------------------------------------------------------------------
cliparray = new Array();                     // 무비클립을 배열로 저장하기
for (a=1; a<=3; a++)  {
    cliparray[a] =  _root["clip"+a];
    cliparray[a].x =  _root["clip"+a]._x;
    cliparray[a].y =  _root["clip"+a]._y;
    trace(cliparray[a].x);
    trace(cliparray[a].y);
}
----------------------------------------------------------------------------
myString = new String();                           // 문자 변수초기화    
myString = new String("가나다");                   // 문자 넣기
tet="가나다";   myString = new String(tet);        // tet  변수 넣기
text0=myString.charAt(0);                          // text0 값은 "가"  -  1개 읽기
text1=myString.charAt(1);                          // text1 값은 "나"  -  1개 읽기
text2=myString.charAt(2);                          // text2 값은 "다"  -  1개 읽기
text3=myString.concat("라마","바사","다");         // text3 값은 "가나다라마바사다"  -  추가
text4=text3.substr(2,4);                           // text4 값은 "다라마바"  -  여러개 읽기
text5=text3.substring(2,4);                        // text5 값은 "다라"  -  여러개 읽기
text6=text3.slice(2,4);                            // text6 값은 "다라"  -  여러개 읽기
text7=myString.charCodeAt(1);                      // text7 값은  45208  - 문자를 코드화
text8="a" + String.fromCharCode(64) + "m";         // text8 값은 "a@m"  - 코드를 문자화
text9= text3.indexOf("다");                        // text9 값은 2  -  문자위치
text10= text3.lastIndexOf("다");                   // text10 값은 7  -  마지막 문자위치
text11= text3.length;                              // text11 값은 8  -  문자길이
text12= text3.split("나");                         // text12 값은 "가,다라마바사다"  -  문자분리
text13= text6.concat(text3);                       // text13 값은 "다라가나다라마바사다"  -  문자합침
text14= text13.substr((text13.length-1),1);        // text14 값은 "다"  -  마지막 문자 읽기
sss = myDate.toString();  day = sss.substring(0,3);     // 문자로변환        
----------------------------------------------------------------------------
// aaa 문장을 bbb 배열로 저장하기                  // 문장을 배열로 저장하기
// 결과는 bbb[0]="a" bbb[1]="b" bbb[2]="c" bbb[3]="d" bbb[4]="e"
aaa = "a b c d e";
aaalen = aaa.length;
bbb = new Array();
for (a=0; a<=aaalen; a++)  { bbb[a] = "";  };
bbbno = 0;   bbbchr = "";
for (a=0; a<=aaalen; a++)  {
if ( aaa.charAt(a) == " " ) {  bbb[bbbno] = bbbchr;   bbbno += 1;   bbbchr = "";  
} else { bbbchr += aaa.charAt(a);   };
};
for (a=0; a<=bbbno; a++)  {  trace( "*" + bbb[a] + "*" )   };  
----------------------------------------------------------------------------
for (a=1; a<=22; a++) {                                       // 텍스트 필드 글자속성
       this["k"+(a)].textColor=0xff0000;
       this["k"+(a)].border=true;
       this["k"+(a)].borderColor=0xff0000;
       this["k"+(a)].background=true;
       this["k"+(a)].backgroundColor=0xffffff;
};
----------------------------------------------------------------------------
TextField.removeTextField();                                   // 텍스트 필드 삭제
----------------------------------------------------------------------------
createTextField ("instanceName", depth, x, y, width, height)   // 텍스트 필드 생성
     instanceName 새 텍스트 필드의 인스턴스 이름
     depth 새 텍스트 필드의 깊이를 지정하는 양의 정수 (2 는 1를  screen over)
     x 새 텍스트 필드의 x 좌표를 지정하는 정수
     y 새 텍스트 필드의 y 좌표를 지정하는 정수
     width 새 텍스트 필드의 넓이를 지정하는 양의 정수
     height 새 텍스트 필드의 높이를 지정하는 양의 정수
instanceName.type = "dynamic";               // 텍스트 필드의 기본 속성  (dynamic 또는 input)
instanceName.autoSize = false;               // (글자수에 맞게 테두리 크기 자동 조절 true false center right)
instanceName.border = false;                 // (테두리)  
instanceName.borderColor = 0xff0000;         // (테두리 색상)  
instanceName.background = false;             // (배경)
instanceName.backgroundColor=0xffffff;       // (배경 색상)
instanceName.textColor = 0xff0000;           // (글자 색상)
instanceName.multiline = false;              // (한줄  또는  여러줄)
instanceName.selectable = true;              // (텍스트 필드를 선택할 수 있는지 여부)
instanceName.maxChars = null;                // (사용자가 입력할 수 있는 최대 문자 수) (null 이면 무한대)
instanceName.length = 0;                     // (글자 수)
instanceName._name = "";                     // (인스턴스 이름)
instanceName.variable = "";                  // (변수 이름)
instanceName.html = false;                   // (html 태그 사용 여부)
instanceName.htmlText = "";                  // (html 태그)
instanceName.wordWrap = true;                // (자동 줄바꿈 )
instanceName._x = 0;                         // (x 좌표)
instanceName._y = 0;                         // (y 좌표)
instanceName._width  = 0;                    // (넓이)
instanceName._height = 0;                    // (높이)
instanceName._xscale = 100;                  // (넓이 조절 %)
instanceName._yscale = 100;                  // (높이 조절 %)
instanceName.restrict = "";                  // (입력할 수 있는 문자 세트)
instanceName.embedFonts = false;             // (장치 글꼴 사용 여부)
instanceName.password = false;               // (****표시)
instanceName._visible =  true;               // (보임/안보임.  false로 설정된 텍스트 필드는 사용할 수 없음)
instanceName.scroll = 0;                     // (현재 스크롤 수직 위치)
instanceName.hscroll = 0;                    // (현재 스크롤 수평 위치)
instanceName.maxscroll = 0;                  // (TextField.scroll의 최대값)
instanceName.maxhscroll = 0;                 // (TextField.hscroll의 최대값)
instanceName.text = "";                      // (글자)

myformat = new TextFormat();                 // 텍스트 필드의 기본 TextFormat 속성
myformat.align = "left";                     // (단락의 정렬 )
myformat.blockIndent  = 0;                   // (왼쪽 여백에서 블록 들여쓰기. 포인트 단위)
myformat.indent  = 0;                        // (왼쪽 여백에서 단락 들여쓰기. 각 단락의 첫 줄에만 적용)
myformat.bold = false;                       // (텍스트가 굵은체로 표시되는지 여부)
myformat.bullet = false;                     // (텍스트가 불릿 목록에 있는지 여부 * 표시)
myformat.color  = 0x000000;                  // (텍스트의 색상)
myformat.font = "Times New Roman";           // (텍스트의 글꼴)
myformat.italic = false;                     // (텍스트가 기울임체로 표시되는지 여부)
myformat.leading  = 0;                       // (줄 사이의 행간 세로 간격)
myformat.leftMargin  = 0;                    // (단락의 왼쪽 여백 포인트 단위)
myformat.rightMargin  = 0;                   // (단락의 오른쪽 여백 포인트 단위)
myformat.tabStops = [];                      // (사용자 정의 탭 중지를 지정 // (empty array))
myformat.target = "";                        // (브라우저에서 하이퍼링크가 표시되는 창)
myformat.size = 12;                          // (텍스트의 크기)
myformat.underline = false;                  // (텍스트에 밑줄이 그어졌는지 여부)
myformat.url = "";                           // (텍스트가 링크되는 URL)

instanceName.text = "this is my test field \r aaa" + "bbb";    // 텍스트에 내용 넣기
instanceName.setTextFormat(myformat);        //  텍스트 필드의 TextFormat  변경
----------------------------------------------------------------------------
instanceName.restrict = "A-Z 0-9";           // 대문자, 공백, 숫자만 입력할 수 있음
instanceName.restrict = "^a-z";              // 소문자를 제외한 모든 문자를 입력
instanceName.restrict = "A-Z^Q";             // 대문자 Q를 제외한 대문자만 입력
instanceName.restrict = "\\-"            
2007/03/24 12:53 2007/03/24 12:53