Tip 에 해당하는 글27 개
2007/08/01   Checking user bandwidth (1)
2007/03/06   Converting to a Cartesian coordinates
2007/02/12   SWFObject add-on: MouseWheel on Mac
2007/02/12   SWFObject: SWF embed script
2007/02/07   IME-Input Method Editor
2007/01/10   How to sort Objects(Class)
2006/12/26   Blink Effect
2006/12/21   Object Drawing Model
2006/12/15   Why must u use a function statement ? (3)
2006/09/22   URL Encoding
2006/08/28   FileReference Class Tip (2)
2006/08/16   ZenDoc 1.0 Released
2006/08/09   ActionScript 3.0 Tip of the Day
2006/08/06   Use Alpha Gradiant Masks
2006/08/06   Static textfield Error?
2006/07/31   Mouse image scroll
2006/07/25   flash 에서의 초기화 문제
2006/06/23   XML Parsing Error
2006/06/20   Shift + Space Bar로 한영전환하기
2006/06/14   이벤트 지향 프로그래밍...
2006/05/26   Action 초기화 순서
2006/05/19   Alcon - ActionScript Logging Console
2006/05/14   전역 보안 설정 패널
2006/05/08   이미지 지글거림 없애기
2006/05/02   Clearing All setIntervals
2006/04/29   IE 패치에 대한 Flash Extention
2006/04/26   플래시 백버튼 팁

flash/Tip | 2007/08/01 12:00

우리나라의 웹환경에서는 초고속 인터넷과 같은 인프라의 발전으로 대역폭(bandwidth)을 고려해야할 만큼 네트워크 속도가 절대적으로 중요하지는 않다.
워낙 전송 속도가 빨라서 왠만한 웹사이트는 로딩시간없이 실시간으로  보여진다. 하지만 이는 특수한 우리나라의 경우에서만 해당하는 사항일뿐 아직까지 대부분의 다른나라에서의 전송속도는 생각하는 것 만큼 빠르지 않다. 좀더 범용적인 사이트의 개발을 위해서는 반드시 고려해야 할 사항이다.

특히 영상위주의 컨텐츠가 포함된 사이트의 경우 사용자의 대역폭을 고려하는 것이 좀더 사용자에게 좋은 컨텐츠를 제공하는 방법이 될 수 있다. 대부분 영상을 보여주는 방법으로 점진적 다운로드 방식(progressive download)을 사용한다. 실시간으로 다운로드 한만큼 플레이하는방식으로 이는 사용자 환경의 대역폭이 서비스의 질을 크게 좌우하게 된다.

영상을 보여주는 데 있어 점진적 다운로드 방식은 영상의 전체적인 용량보다는 영상의 압축률에 더 큰 영향을 받는다. 다시말해 데이타를 로드하면서 플레이하는 방식이기 때문에 비디오의 압축률을 높여 단위시간당 받을 수 있는 용량을 보다 크게 하여 좀더 원할하게 플레이 할 수 있다.

 따라서 미리 사용자의 대역폭을 알아내어 거기에 알맞는 압축률의 비디오를 제공할 수 있는 것이다.
플래시에서 일반적으로 대역폭을 측정하는 방법으로는 일정크기의 샘플파일을 다운로드하여 걸린시간을 측정하여 구할 수 있다. 하지만 이 대역폭은 절대적인 속도를 의미하는 것은 아니다.
네트워크 사용량, 네트웍크 지연과 같은 여러가지 요인에 의해 언제든지 속도가 변경될 수 있다. 항상 측정된 속도로 데이타를 받을 수 있다는 의미가 아니다. 현재 시간에서 대략적인 사용자의 네트워크 속도를 가늠해 볼 수 있는데 의미가 있다. 불안정한 네트워크 일수록 측정 대역폭의 편차가 크게 발생한다.

대역폭 측정의 정확성을 높이기 위해서는 테스트하기 위해 사용하는 샘플의 용량을 크게 하거나,측정하는 테스트의 횟수를 늘려야한다. 하지만 이는 전송속도 측정을 위해 불필요하게 자원을 소모하게 되기 때문에 어느정도 적정선을 유지해야한다.
여기서 제공하는 방법은 샘플파일의 크기를 50~100 KB 로 제한하고 측정횟수를 2회로 한정하였다.
위 조건으로 측정한다고 해도 사용자의 네트워크 속도가 50KB 미만일 경우 100~200KB 를 테스트를위해 최소 2~4초정도의 시간이 걸리게 된다.

<bandwidthCheck class>

import com.dstrict.UB.events.Dispatcher;
import com.dstrict.UB.events.Event;

class com.dstrict.UB.util.system.BandwidthCheck extends Dispatcher {
 
 private var _bandwidthSet:Array;
 private var _bandwidth:Number;
 
 private var _startTime:Number;
 private var _checkCount:Number;
 
 private var _loader:MovieClipLoader;
 private var _container:MovieClip;
 
 public function get bandwidth():Number{
  return _bandwidth;
 }
 
 public function BandwidthCheck() {
  _checkCount=0;
  _bandwidth=0;
  _bandwidthSet=new Array();
 }
 
 public function check():Void{
  _container= _root.createEmptyMovieClip("container", _root.getNextHighestDepth());
  var nocache:Number=Math.random()*1000000;
  _loader=new MovieClipLoader();
  _loader.addListener(this);  
  _loader.loadClip("bandwidthDummy.png?nocache="+nocache,_container);
 }
 
 private function calculateBandwidth():Void{
  for(var i in _bandwidthSet){
   _bandwidth+=_bandwidthSet[i];
   }
  _bandwidth=_bandwidth/_checkCount;
 
  //dispatch a complete event
  startEvent(new Event(Event.COMPLETE,this));
 }
 
 private function onLoadStart(targetMc:MovieClip):Void{
  _startTime=getTimer();
 }
 
 private function onLoadComplete(targetMc:MovieClip):Void{
  _loader.unloadClip(_container);
  var elapsedTime:Number=(getTimer()-_startTime)/1000;  
  _checkCount++;
 
  var progress:Object = _loader.getProgress(targetMc);
  var kilobytes:Number=progress.bytesTotal/1024;  
  var kBps:Number=kilobytes/elapsedTime;
  _bandwidthSet.push(kBps);
 
  if(_checkCount==1){
   check();
  }else{
    calculateBandwidth();
  }
 }
}

<sample code>

var bandwidthCheck:BandwidthCheck=new BandwidthCheck();
bandwidthCheck.addEventListener(Event.COMPLETE,onBandwidthCheck);
bandwidthCheck.check();

function onBandwidthCheck(evt:Event){
 trace("bandwidth----------------->"+evt.target.bandwidth);
}


대역폭(bandwidth) 의 단위로는 KBps(kilobytes per second) 이다. 브라우저 캐쉬로 부터 다운받는것을 방지하기 위해 첨부한 문자열로 인해 반드시 웹상에서 다운받아야 로드할수 있다.



download sample files.......
 


 
 
태그 : As2.0, bandwidth, flash, Tip
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/100
BlogIcon 김진혁 2007/08/24 13:41 ReplyDelete
오.... 글쿠나..

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기

math&physics | 2007/03/06 21:58

동적으로 여러개의 MovieClip 을 원형으로 배열할때 직교좌표계 사용하는 것보다 극좌표계를 사용하면 훨씬 다루기가 쉽다. 또한 x,y 와 같은 점을 다룰경우 Point 클래스를 이용하면 각 점간의 수학적인 연산에 있어 기본적으로 Point  클래스의 메서드를 이용하여 쉽게 처리할 수 있다.

극좌표를 직교좌표로 바꿀때도 기본으로 제공해주는 메서드를 사용하면 된다.


polar (Point.polar method)
public static polar(len: Number, angle: Number) : Point

Converts a pair of polar coordinates to a Cartesian point coordinate.

Parameters
len: Number - The length coordinate of the polar pair.
angle: Number - The angle, in radians, of the polar pair.

Returns
Point - The Cartesian point.


사용자 삽입 이미지















import
flash.geom.Point;

var len:Number = 125;
var angleInRadians:Number ;
var cartesianPoint:Point
var unitAngle:Number=15;

for(var i=1 ; i<=24 ; i++){
  var mc:MovieClip=this.attachMovie("M_thumb"+i,"M_thumb"+i,i);
    angleInRadians = Math.PI*unitAngle/180*(i-1);

    cartesianPoint = Point.polar(len, angleInRadians);  // 극 좌표를 직교좌표로 전환
 
 var offsetX:Number=Math.round(cartesianPoint.x);
 var offsetY:Number=Math.round(cartesianPoint.y);
 
 
 mc._x=Stage.width/2+offsetX;
 mc._y=Stage.height/2+offsetY;
 
}



굳이 point 클래스를 사용하지 않고서도 극좌표계를 직교좌표계로 간단한 삼각함수를 사용하여 다음과 같이도 쉽게 바꿀수 있다.

x1=x0+(Math.cos(angle)*radius);
y1=y0+(Math.sin(angle)*radius);

하지만 Point 클래스를 사용하여 좌표를 구성한다면 코드의 일관성에 있어서나 간결성에 있어 상당한 도움이 될것이다.


 
 
태그 : flash, Point, polar coordinates, Tip
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/89

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기

flash/Tip | 2007/02/12 17:21
관련사이트
http://blog.pixelbreaker.com/flash/swfmacmousewheel/

다운로드

mac os 상에서의 Flash Player 는 마우스 휠을 감지하지 못한다. 따라서 이 문제를 해결하려면
플래시 내부에서 마우스 휠반응을 체크하는 것이 아니라 자바스크립트로 마우스 휠을 감지하여
플래시로 알려줘야 된다.

SWFMacMouseWheel 라는 자바스크립트 파일을 사용하여 플래시의 내부 함수를 호출한다.
그리고 플래시에서는 ExternalInterface를 사용하여 자바스립트에서 호출하는 함수를 받아서
마우스 휠 반응을 처리한다.

<actionscript code>

import flash.external.ExternalInterface;
import com.pixelbreaker.event.EventBroadcaster;
/**
 * @author Gabriel Bucknall
 *
 * Class that supports using the mouseWheel on Mac OS, requires javascript class
 * swfmacmousewheel.js
 */
class com.pixelbreaker.ui.MouseWheel
{
 private static var isMac:Boolean;
 private static var macBroadcaster:EventBroadcaster;
 
 private static function main():Void
 {
  isMac = System.capabilities.os.toLowerCase().indexOf( "mac" ) != -1;
  if( isMac )
  {
   macBroadcaster = new EventBroadcaster();
   ExternalInterface.addCallback( "externalMouseEvent", MouseWheel, MouseWheel.externalMouseEvent );
  }
 }
 /**
  * Add a listener for using the mouseWheel
  * obj param must have an "onMouseWheel" method to be called.
  */
 public static function addListener( obj:Object )
 {
  if( !isMac ) MouseWheel.main();
  if( isMac )
  {
   macBroadcaster.addListener( obj );
  }else{
   Mouse.addListener( obj );
  }
 }
 
 /**
  * Remove a listener
  */
 public static function removeListener( obj:Object ):Void
 {
  if( isMac )
  {
   macBroadcaster.removeListener( obj );
  }else{
   Mouse.removeListener( obj );
  }
 }
 
 private static function externalMouseEvent( delta:Number ):Void
 {
  macBroadcaster.broadcastMessage( "onMouseWheel", delta );
 }
}

<frame code>

MouseWheel.addListener(this);

타임라인 상에 MouseWheel Class 를 사용하여 리스너를 생성한다.



<html code>

<script type="text/javascript">
     // <![CDATA[
      var so = new SWFObject('test.swf', 'website', '100%', '100%', '8', '#FFFFFF');
      so.useExpressInstall('js/expressinstall.swf');
      so.addParam('menu', 'false');
      so.addParam('scale', 'noscale');
      so.addParam('salign', 'lt');          
     
 
      //change below
     if(so.write('flashcontent')){
        var macmousewheel = new SWFMacMouseWheel( so );
      }
     // ]]>
</script>

SWFObject 를 사용하여 swf 파일을 임베드하였다. 마지막 줄 코드만 삽입하면 html
상에서 플래시로 마우스 휠반응을 감지하여 값을 보낼수 있다.




 
 
태그 : ExternalInterface, flash, Mac, mouseWheel, Tip
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/85

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기

flash/Tip | 2007/02/12 15:46
SWFObject is a small Javascript file used for embedding Macromedia Flash content. The script can detect the Flash plug-in in all major web browsers (on Mac and PC) and is designed to make embedding Flash movies as easy as possible. It is also very search engine friendly, degrades gracefully, can be used in valid HTML and XHTML 1.0 documents*, and is forward compatible, so it should work for years to come.

SWFObject는 swf 임베드 자바스크립트 소스이다.

2006년도 초에 이올라스와의 소송이후 MS에서 IE설계를 바꿔 embed,object 태그의 직접사용을 막아 놓았기 때문에 swf 파일을 html 에 임베드할때 반드시 외부 자바스크립트 파일로 해야지만 플래시 활성화 클릭이 뜨지 않고 보여지게 되었다. 그 이후로 여러 다른 사람들이 만들어 놓은 swf 임베드 javascript 파일 소스를 사용하여 쓰곤했는데 플래시로 변수를 넘겨줄때는 여러모로 불편한 문제가 있었다. 종종 해외사이트에서 사용된 SWFObject 가 오픈 소스였다니....그때는 무심코 넘겼는데 자세히 보니 여러가지로 유용한 점이 많이 있는 것 같다.
또한 브라우저 종류에 상관없이 모든 플랫폼에 적용되어 범용성 측면에서도 도움이 될 듯 싶다.


<SCRIPT type=text/javascript>
   var so = new SWFObject("movie.swf", "mymovie", "200", "100%", "7", "#336699");
   so.addParam("quality", "low");
   so.addParam("wmode", "transparent");
   so.write("flashcontent");
</SCRIPT>

사용법은 어렵지 않다. SWFObject 객체를 생성해서 파라미터만 넘겨주면 된다. 플래시파일 버전 체크도가능하다. 위에서 보이는 7 이라는 숫자 파라미터가 체크할 Flash Player 버전이다. 여기까지 기존의 임베드 스크립트와 별반 다르지 않다.

<SCRIPT type=text/javascript>
   var so = new SWFObject("movie.swf", "mymovie", "200", "100", "7", "#336699");
   so.addVariable("variable1", "value1");
   so.addVariable("variable2", "value2");
   so.addVariable("variable3", "value3");
   so.write("flashcontent");
</SCRIPT>


위에서와 같이 플래시 파일안으로 쉽게 변수를 넘겨 줄 수 있다. 자바스크립트에 익숙하지 않는 사람에게는 변수 처리하는 과정이 여간 까다로운게 아니다. 브라우저 플랫폼에 따라서 결과 값이 다를수도 있고.... 또한 url 로 붙여서 들어온 변수도 처리해 줄수도 있다. 예를 들어

http://www.example.com/page.html?variable1=value1&variable2=value2 다음과 같은 주소로 변수가 붙어서 들어왔을 경우

<SCRIPT type=text/javascript>
   var so = new SWFObject("movie.swf", "mymovie", "200", "100", "7", "#336699");
   so.addVariable("variable1", getQueryParamValue("variable1"));
   so.addVariable("variable2", getQueryParamValue("variable2"));
   so.write("flashcontent");
</SCRIPT>


위와 같이 getQueryParamValue 함수를 이용하면 쉽게 플래시 안으로 넘겨줄 수 있다.

다운로드

관련 사이트
http://blog.deconcept.com/swfobject/
 
 
태그 : flash, SWFObject, Tip, 이올라스
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/84

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기

flash/Tip | 2007/02/07 11:41
IME(System.IME) Class를 이용하면 클라이언트 컴퓨터에서 실행되고 있는 flash player 에서 운영체제의 IME(Input Method Editor) 를 조절할 수 있다. IME 는 사용자의 문자입력을 받을수 있는 요소로서 흔히 사용하는 Input Textfield 나 TextArea, TextInput 와 같은 component 가 있다. 일정한 폼의 형태로 사용자의 텍스트 정보를 받아야 할 경우 흔히 Input Textfield 를 사용한다. 이때 우리나라와 같이 한글, 영문을 같이 병행하여 사용할 경우 사용자들은 한영키 전환을 잊고 입력하는 경우가 자주 발생한다. 이때 사용성을 높여주는 방법으로써 자동으로 입력 해당필드로 이동했을시 IME Mode 를 변경해 주는 것이다.


class com.dstrict.UB.util.system.IME {
  /**-------------------------------------------------------------------
    * @description IME Mode 설정
  *-------------------------------------------------------------------*/
  public static function setIMEMode(mode:String):Void{
 
   if(System.capabilities.hasIME) {
   
   if(mode=="KOREAN"){
      mode=System.IME.KOREAN;
   }
   if(mode=="ALPHANUMERIC"){
       mode=System.IME.ALPHANUMERIC_HALF;
   }
  }
  System.IME.setConversionMode(mode);
 
 }
}

<example code>
 import com.dstrict.UB.util.system.IME;
 IME.setIMEMode("KOREAN"); // 한글전환시
 IME.setIMEMode("ALPHANUMERIC"); // 영문전환시

각 필드에 포커스 되었을때 원하는 모드에 맞게 설정해 놓으면 사용자의 사용성이 개선될 수 있다.

 
 
태그 : flash, IME, Tip
이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/83

Name 
Password 
Homepage 
  secret
Comment 
  글쓰기

flash/Tip | 2007/01/10 00:01

sortOn (Array.sortOn method)

public sortOn(fieldName:Object, [options:Object]) : Array

Sorts the elements in an array according to one or more fields in the array. The array should have the following characteristics:

  • The array is an indexed array, not an associative array.
  • Each element of the array holds an object with one or more properties.
  • All of the objects have at least one property in common, the values of which can be used to sort the array. Such a property is called a field.

    If you pass multiple fieldName parameters, the first field represents the primary sort field, the second represents the next sort field, and so on. Flash sorts according to Unicode values. (ASCII is a subset of Unicode.) If either of the elements being compared does not contain the field that is specified in the fieldName parameter, the field is assumed to be undefined, and the elements are placed consecutively in the sorted array in no particular order.

    오브젝트를 일반적인 단일속성이 아닌 한개 이상의 여러 속성을 기준으로 정렬할시 사용되는 메서드이다. 오브젝트를 정렬할때 종종 사용하던 방법이였는데 이번 프로젝트를 진행하면서 클래스 자체를 정렬할때 사용해 보았는데 역시나 생각한 대로 작동하였다...^^

    클래스는 당연히 오브젝트의 일종이다. 따라서 클래스 안에 있는 멤버 변수들을 기준으로 정렬이 가능하다는 의미다. 자신이 클래스를 사용하여 이미지 갤러리같은 정렬의 기능이 있는 컨텐츠를 제작할시에 아주 유용한 기능일 것이다.


    // widget class : 정렬에 사용될 클래스

    class com.dstrict.UB.project.ces2007.widget.Widget {

      public var _id:String;
      public var _title:String;
      public var _date:Number;

      public function Widget(id:String,title:String,date:Number) {
      _id=id;
      _title=title;
      _date=date;
    }

    }


    // example code

    import com.dstrict.UB.project.ces2007.widget.Widget ;

    var widgetArr:Array=new Array();

    var widget1:Widget=new Widget("vkimone","widget1",20061213);
    var widget2:Widget=new Widget("kimkijeung","widget2",20061110);
    var widget3:Widget=new Widget("Tom","widget3",20061115);
    var widget4:Widget=new Widget("Jane","widget4",20061211);

    widgetArr.push(widget1);
    widgetArr.push(widget2);
    widgetArr.push(widget3);
    widgetArr.push(widget4);

    for(var i=0; i<widgetArr.length ; i++){
    trace(i+"  : "+widgetArr[i]._id+" : "+widgetArr[i]._title+"  ----------->"+widgetArr[i]._date);

    trace
    ("======================================");

    widgetArr.sortOn("_date",Array.NUMERIC| Array.DESCENDING);

    for(var i=0; i<widgetArr.length ; i++){
    trace(i+"  : "+widgetArr[i]._id+" : "+widgetArr[i]._title+"  ----------->"+widgetArr[i]._date);
    }


    //result
    0  : vkimone : widget1  ----------->20061213
    1  : kimkijeung : widget2  ----------->20061110
    2  : Tom : widget3  ----------->20061115
    3  : Jane : widget4  ----------->20061211
    ======================================
    0  : vkimone : widget1  ----------->20061213
    1  : Jane : widget4  ----------->20061211
    2  : Tom : widget3  ----------->20061115
    3  : kimkijeung : widget2  ----------->20061110



    각각의 아이디값과 제목 그리고 날짜 정보를 포함하는 widget 클래스에서 여러개의 객체를 생성한후
    배열에 넣은 다음 오브젝트 속성인 _date 를 기준으로 내림차순으로 숫자 정렬했을때의 결과값이다.
    각 클래스 속성을 기준으로 통채로 정렬이 된다.

    만역 클래스를 이용해 철저히 오브젝트들을 캡슐화(encapsulation)했다면 손쉽게 오브젝트 정렬을 사용할 수 있을 것이다.





  •  
     
    태그 : array, sort, Tip
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/77

    Name 
    Password 
    Homepage 
      secret
    Comment 
      글쓰기

    flash/Tip | 2006/12/26 23:50


    작업을 하다가 우연하게 발견한 팁이다.
    전에는 아무생각없이 blink 효과를 구현하려면 그냥 간단하게 모션트윈으로 키프레임 에니메이션을 만들어서 사용하곤했다. 그런데 actionscript 로 blink 효과가 가능했다....^^

    PropertyTweenEase class 는 이전 포스트에서 새롭게 구현한 방법을 사용했다.



    <code>
    import mx.transitions.easing.Bounce;
    import com.dstrict.UB.util.transitions.tween.PropertyTweenEase;


    function blink(){
    src_mc._alpha=0;
      PropertyTweenEase.tween(src_mc,{_alpha:100},Bounce.easeIn,8);
    }


    start_btn.onRelease=function(){
    blink();
    }

    플래시에서 기본으로 내장되어있는 이징 패키지 함수를 이용한 방법으로
    Bounce 클래스는 뜻 그대로 뛰어오르는 느낌을 낼 수 있게 해준다.
    따라서 Bounce 클래스에서 증가하는 느낌의 easeIn 함수를 사용하면 손쉽게 번쩍거리는 효과를 만들 수 있다.




     
     
    태그 : blink effect, flash, Tip
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/76

    Name 
    Password 
    Homepage 
      secret
    Comment 
      글쓰기

    flash/flash8 | 2006/12/21 13:20
    What is Object Drawing Model?

    OBD 란 이전버전에서는 할 수 없었던 오브젝트 드로잉을 가능하게 해주는 기능이다.
    플래시에서 drawing tool 로 같은 레이어에 어떤 shape를 그리게 되면 single object로 인식해
    shape 간에 겹치는 부분이 생기게 되면 한개의 오브젝트로 바뀌게 된다.
    OBD 란 이런 single object 를 overlapping shape 로 드로잉 가능하게 해준다.



    물론 grouping 과 비슷한 개념이긴 하지만 약간의 차이가 있다.
    OBD 로 그린 오브젝트는 group 오브제트가 할 수 없는 fill and stroke color 를 조정할 수 있다.
    또한 Envelope , transformations 이 가능하다.




    그리고 두개의 overlapping OBD shapes 를 선택하게 되면 Modify-Combine Objects 의 메뉴가 활성화 된다.
    이 메뉴를 이용하여 Union, Intersect, Punch and Crop 할 수 있다.

     
     
    태그 : flash, OBD, Tip
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/75

    Name 
    Password 
    Homepage 
      secret
    Comment 
      글쓰기

    flash/As3.0 | 2006/12/15 14:06
    Methods are defined using the function keyword.
    You can use a function statement, such as the following:
    public function sampleFunction() : String {}

    Or you can use a variable to which you assign a function expression, as follows:
    public var sampleFunction:Function = function () : String {}

    In most cases you will want to use a function statement instead of a function expression for
    the following reasons:

    * Function statements are more concise and easier to read.
      Function statements 는 좀더 간결하고 가독성이 뛰어나다.
    * Function statements allow you to use the override and final keywords.
      Function statements 는 override 와 final 키워드를 사용할 수 있게 한다.(override 방법은 expression 방법으로는 불가능합니다.)
    * Function statements create a stronger bond between the identifier—that is, the name of the function—and the code within the method body. Because the value of a variable can
    be changed with an assignment statement, the connection between a variable and its
    function expression can be severed at any time. Although you can work around this issue
    by declaring the variable with const instead of var, such a technique is not considered a
    best practice because it makes the code hard to read and prevents the use of the override
    and final keywords.

    Function statements 는 식별자(함수 이름과 메소드 몸체안에 있는 코드) 와의 결합을 더 강하게 한다.
    변수값이 할당구문에 의해 변할 수 있기 때문에 function expression 과 변수와의 연결이 언제든지 위험하게 될수 있다.
    비록 var 대신에 const 를 사용하여 변수선언을 하여 문제를 해결할 수 있겠지만, 그런 기술은 오버라이드(override)와 final 키워드의 사용을 막고, 코드를 읽기 어렵게 만들기 때문에 좋은 방법이라고 생각되어지지 않는다.

    One case in which you must use a function expression is when you choose to attach a function
    to the prototype object.


    전에는 function statement 방법과 function expression 과의 차이점에 큰 영향을 느끼지 못했다.
    주로 가독성 측면에서 좋아서 전자의 방법으로 코딩을 해왔는데 이 방법이 추천하는 방식이였다니....

    가독성 측면이나 메소드 오버라이드 같은 기능을 활용하려면  function statement  방법을 사용해야할 것이다.
     
     
    태그 : AS3.0, Function, Tip
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/74
    BlogIcon aminoai 2006/12/17 21:48 ReplyDelete
    좋은글 보고 갑니다. 다만 원어라서 정확하게 이해가 되지 않는군요. 그러니까 쉽게 말해서

    1) public function sampleFunction() : String {}
    2) public var sampleFunction:Function = function () : String {}

    2보다 1을 추천한다는 의미가 맞는지요? 1은 원래 다른언어에서도 메소드 정의하는 방식이라 당연시 사용되는거고 2는 액션스크립트 고유의 방식인걸로만 알고 있었는데요. 하지만 사실 가독성면에서는 2가 더 나은거 같은데... 여튼 정확한 원문의 의미를 좀 설명해 주시면 감사하겠습니다.
    BlogIcon 기정e 2006/12/18 11:45 ReplyDelete
    후자의 방법은 flash MX 버전에서 콜백(callback) 형식이 등장하면서 나온 방식입니다. 솔직이 AS1.0 방식으로 코딩한다면 그다지 큰 차이는 없습니다.
    여기서 말씀드리는 내용은 AS3.0 에 관한 내용입니다.

    statement 와 expression 방식에는 크게 2가지 차이점이 있습니다.

    첫번째로, expression 방식은 메모리 관리 측면에서 독립적으로 존재하지 못합니다. 다시말해 function expression 을 반드시 다른 오브젝트(배열이나 변수)에 할당해야만 참조가 가능한 구조입니다. 만약 실수로 위에서 나온 sampleFunction 참조 값을 delete 하게 된다면 더 이상 함수를 사용할 수 없게 됩니다.
    원문에서 나온
    'Function statements create a stronger bond between the identifier '

    이 부분이 그런 의미로써 function statement 가 함수 식별자(이름)와 좀더 강한 결합을 생성한다고 말하고 있습니다.

    두번째로, 함수 활성화 시간에 있습니다. statement 방법은 함수의 호출 위치에 상관없이 항상 호출 가능합니다. 그에 비해 expression 방법은 반드시 함수 선언 이후에만 사용이 가능하다는 것입니다.
    즉,

    expressionTest(); ---> 먼저 호출시 AS3.0 에서는 runtime error !!
    var expressionTest:Function = function () : String {
    trace("expression test......";)
    }
    반면 statement 방식은 아무 문제 없습니다.

    원문은 제가 번역해서 다시 올려 드렸습니다....^^

    아무에게도 공개 하지 않은 블로그였는데 어찌 아시고....ㅋㅋ
    더 궁금한 내용이 있으시면 물어보세요....제가 아는한 성심껏 답변드리겠습니다...
    그럼 이만~~
    BlogIcon aminoai 2006/12/18 22:21 ReplyDelete
    오호~~ 친절한 답변 감사드립니다. 저도 나름대로 플래쉬를 하면서 밥벌이를 하고 있는데 여러모로 정말 도움되는 글들이 많아서 늘 들리고 있었습니다. 사실 저도 어떤경로로 들어왔는지는 잘 기억이 안나네요. 첨 오고 바로 북마크 해버렸거든요. 사실 이후에 주변 사람에게 이 좋은 사이트를 널리널리 전파하고 있었는데 공개하고 있지 않은 사이트였다니...ㅎㅎㅎ
    여튼 좋은 글 감사드리고요 추운겨울에 감기라도 걸리지 않게 건강하시기를 기원합니다.

    Name 
    Password 
    Homepage 
      secret
    Comment 
      글쓰기

    flash/Tip | 2006/09/22 00:10

    escape 함수
    escape(expression:String) : String
    매개 변수를 문자열로 변환하거나 영숫자가 아닌 모든 문자를 % 16진수 시퀀스로 바꾸는
    URL 인코딩 형식으로 인코딩합니다. URL 인코딩 문자열에서 사용되면 퍼센트 부호(%)는
    이스케이프 문자를 시작하는 데 사용되고 이는 모듈러스 연산자(%)와 동일하지 않습니다.

    URL인코딩은 웹에서 흔히 볼수 있는 것으로
    "kimkijeung%20vkimone"를  "kimkijeung%vkimone" 이런식으로 인코딩을 하는 것을 말한다.

    외부 데이터와 연동을 시킬 때는 꼭 사용해야 에러를 막을 수 있다. 반대로 바꿔 주는 함수로는 unescape 가 있다.


    예) a=escape("김기정");
        trace(a);


    /* 이 구문을  실행하면 output 창에

    %EA%B9%80%EA%B8%B0%EC%A0%95

    과 같이 나온다. */


    다른 나라 사람의 언어 환경을 고려하지 않는다면 별 해당사항이 없겠다.
    하지만 각 나라마다 고유의 언어 셋이 있어 나라 별로 컴퓨터에서 사용하는 언어가 다르다.
    플래시에서 그냥 static field 를 사용하여 작성한다면 그냥 적은 그대로 보이겠지만
    외부 데이타를 가져 와서 보여 줘야 한다면 반드시 주의할 점이 있다.

    플래시에서의 정보는 유니코드(utf-8) 로 입출력된다. 플래시가 기본적으로 외부 텍스트를 해석할테
    System.useCodePage 값을 true 로 설정하지 않느다면 말이다.

    useCodePage  는 Flash Player가 외부 텍스트 파일을 해석할 때 유니코드를 사용할 것인지 현재 운영 체제의 기존 코드 페이지를 사용할 것인지 여부를 지정하는 부울 값이다
    간혹가다 유니코드로 인코딩 되지 않은 외부데이타를 불러올때 플래시에서 깨져서 보이는 경우가 있다. 이럴때 useCodePage 값을 true 로 설정하면 현재 운영체제에 맞는 코드 페이지를 사용하여 텍스트가  재대로 보이게 된다.

    하지만, System.useCodepage를 true로 설정하는 경우, 현재 운영 체제의 기존 코드 페이지에 외부 텍스트 파일에 사용된 문자가 포함되어 있어야만  텍스트를 표시할 수 있습니다. 예를 들어, 중국
    어 문자가 포함된 외부 텍스트 파일을 로드하는 경우, CP1252 코드 페이지에는 중국어 문자
    가 들어 있지 않기 때문에 이 페이지를 사용하는 시스템에서 이 문자들이 표시되지 않는다.

    모든 운영 체제 사용자가 SWF 파일에 사용된 외부 텍스트 파일을 볼 수 있게 보장하려면 모
    든 외부 텍스트 파일을 유니코드로 인코딩하고 System.useCodepage를 기본값인 false로 설
    정해야 한다.

    하지만 이걸로 모든 문자가 표시되는 것이 아니다. 플래시에서 데이타를 저장하고 그걸 다시 불러올때 이런 방식으로 해도 데이타는 원하는 값을 표시할수 없다.
    반드시 특수문자나 다른 나라 언어를 저장할때는 텍스트 정보를 URL 인코딩 방식으로 변환하여 보내야 한다.

    여기서 escape, 와 unescape 를 사용하면 된다.
    그리고 반드시 URL 인코딩을 사용하려면  System.useCodepage 는 기본값인 false 로 놓아두어야 한다. 그렇지 않으면 각 나라의 운영체제의 코드 체계의 문자들의 바뀌어져 인코딩 되어 다른 결과가 보여질 것이다.





     
     
    태그 : encoding, flash, Tip
    이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/58

    Name 
    Password 
    Homepage 
      secret
    Comment 
      글쓰기

    flash/flash8 | 2006/08/28 17:54

    현재 flash8 에서 지원하는 파일 업로드 클래스인 FileReference 는 어쩌면 반쪽짜리 업로드 클래스이다. 왜냐하면 파일업로드 완료시 서버와의 어떤 변수 값도 받을 수 없기 때문이다.
    물론 onComplete 가 업로드 완료시에 플래시 쪽에서 호출되지만 이는 단순히 업로드 완료만 알수 있는것이다.
    특별히 안정적으로 업로드를 구성하지 않는다면 다시말해, 개인이 업로드를 관리하고 사용자가 많지 않을경우 물론 업로드가  완료되는 이벤트만 발생되어도 문제가 없다.
    하지만 사용자가 많은 경우, 예를 들어 사용자가 사진을 업로드하는 사이트를 만들경우,
    이런 경우에는 반드시 업로드하는 클라이언트 파일명을 바꾸어야 할 필요가 있다.
    중복의 여지가 있기 때문이다. 만약 이런 파일 필터링을 거치지 않는다면 분명히 파일이름이 같게되어 이전 파일이 덮어써지는 현상이 발생할 것이다.

    따라서 좀더 안정적인 파일 업로드 구현을 원한다면 파일 생성 일자나 일련의 첨자를 붙여 파일 이름을 변경하는 것은 필수이다.
    이때 문제가 되는 것이 바로 위에 언급한 서버와 플래시간의 변수 교환문제이다.

    FileReference class 에서의 upload()  method의 파라미터에는 서버파일의 데이타를 받을수 없다.
    따라서 서버에서 파일 이름을 임의로 변경해 버리면 플래시에서 알 수 있는 방법이 없다.
    물론 약간의 팁을 사용하면 가능하다.

    다행이도 upload url에 매개변수를 첨부하여 서버에 전송할 수 있다.
    바로 이런방법으로 서버에서 파일명을 저장하는 것이 아니라 플래시에서 정한 파일명을 서버로 보내 그걸 파일명으로 저장하면 위와 같은 문제를 해결할 수 있다.

    <upLoad.as>
    private function