[AIP-dev] 스크랩:UIImageView에 원격이미지 비동기 로드 및 캐쉬 기능 넣기

출처 : http://cafe.naver.com/mcbugi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=95095

http://blog.naver.com/jiyh78?Redirect=Log&logNo=40117592091

http://cafe.naver.com/mcbugi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=71846&

아이폰 개발시작한지 3~4개월 되어가면서 조금 감각을 익히기 시작했습니다. 

어플도 그동안 3개 만들어 올려보고요.  
물론 사운드, 그래픽을 고급스럽게 다뤄보지는 못했지만 기본 UI기반으로 개발할때도 워낙 이슈가 많다보니 학습과 개발을 병행하는게 정말 쉽지 않더군요…. 
각설하고요 ㅎㅎ
여기에 소개할 것은 UIImageView에 원격 이미지를 비동기로 로드할 수 있도록 하는 기능과 이미지 캐쉬 기능을 추가한 소스를 공개하려고 합니다.(소스 분석은 주석을 참고 ^^)
아이폰 어플 개발하면 UIImageView를 매우 많이 사용할 겁니다.  번들이미지의 경우야 어짜피 문제 없지만 원격이미지를 로드할때는  몇가지 이슈가 발생합니다.
1. 원격이미지를 매번 로드하는 것은 네트워크 부하를 일으키며 특히나 3G사용자들에게 치명적이 될 수 있다.
2. 테이블에 원격이미지를 붙이는 경우에 동기적으로 이미지 로드하는 경우 멈춤 현상을 일으킬 수 있다. 
3. 비동기적으로 이미지를 로드하더라도 한번에 로드할 수 있는 이미지를 제어하지 않으면 어플의 전체적인 퍼포먼스가 죽는다.
4. TableView에서 TableViewCell는 캐쉬처리되어 재사용된다. 그러므로 거기에 붙은 UIImageView도 재사용하게 되는데 스크롤을 빨리 넘기는 경우 기존에 로드 요청한 이미지가 하나의 UIImageView에 계속 적재되는 현상이 발생할 수 있다.
위 이슈에서 1, 2는 금방 이해갈 갈겁니다. 3번의 경우 1,2번의 처리가 잘되었다고 해도, 한 화면에 5개 이상의 이미지를 비동기적으로 로드한다는 것은 스레드를 5개 이상 생성해서 처리한다는 의미와 같습니다. 어플 하나에 스레드를 너무 돌리면 별로 좋지 못하기 때문에 동시에 로드할 수 있는 이미지를 제어해주어야 합니다. 1~2개 정도로요. 
4번 이슈의 경우 예전에 문씨님이 올려주신 [문씨의 강좌]멀티스레딩2<NSOperation>에 올린 글에 소개된 소스의 경우에 발생합니다. 저는 여기에 이미지 캐쉬기능만 넣어서 실제로 썼습니다. 하지만 TableView에서 문제가 발생했습니다. 분명 NSOperation을 이용한 이미지 로드는 2,3 문제를 해결해줍니다. 하지만 TableViewCell을 재사용되기 때문에 빠른 스크롤을 하는 경우 거기에 붙은 UIImageView 하나에  지속적으로 다른 이미지가 붙도록 요청이 되어 이미지가 광고롤링되는 현상마냥 보이는 경우가 발생합니다. 
1,2,3,4 번의 이슈를 모두 해결하고자 간단하게 클래스를 제작했습니다.
사용하는 방법은 너무도 간단합니다. 그저 UIImageView를 붙히고 (IB에서든 코드상이든) #import “UIImageView+AsyncAndCache.h”를  넣습니다. 그 다음 아래 UIImageView 카테고리 4개 함수중 하나를 쓰시면 됩니다.  UIImageView *imageView = [[UIImageView alloc]init]; 하신뒤 [imageView setImageURLString:@”이미지 원격 경로”]; 형태로 쓰시면 됩니다. 
UIImageView를 카테고리로 만들었으므로 기존 UIImageView 기능은 그대로 사용할 수 있겠고요.
UIImageView 카테고리 외에 내부적으로 2개의 클래스가 정의되어 있습니다. 이는 개발자가 직접 제어하지 않고 위 4개 이슈를 해결하기 위해 내부적으로 사용되는 클래스입니다. 소스 분석을 원하신다면 주석을 달아두었으니 참고하시면 되겠습니다.
아래는 header만 올려놓습니다. 구현부는 첨부파일을 참고하세요.

//

//  UIImageView+AsyncAndCache.h

//

//  Created by Yongho Ji on 10. 12. 3..

//  Copyright 2010 Wecon Communications. All rights reserved.

//

#import <UIKit/UIKit.h>

@class AsyncAndCacheImageOperator;

@class AsyncAndCacheImageOperatorManager;

//////////////////////////////////////////////////////////////

//

// UIImageView에 대한 카테고리 

// 이 카테고리는 테이블뷰에 적용된 Cell안에 UIImageView에서 활용하면 좋다.

// UIImageView의 주요 기능은 다음과 같다. 

//

// 1. 이미지 비동기 로드 

//   이미지를 비동기로 로드해서 화면에 이미지가 뜨는데 버벅거림을 없앤다.

// 2. 이미지 캐쉬기능 

//   이미 로드한 이미지는 cache 디렉토리에 캐쉬해서 나중에 반복 요청시 

//   로컬에 저장된 캐쉬 이미지를 로드해서 네트워크 부하를 없애준다.

// 3. 반복적인 이미지 요청에 대한 로드부하 최소화 

//    같은 UIImageView에 중복으로 로드 요청한다면 맨 마지막에 요청한 이미지가 적용되도록 한다.

//    그뿐 아니라 수십번 반복해서 요청하더라도 무조건 이미지 로드 요청하지 않고 되도록이면 

//   마지막 이미지를 로드요청하여 네트워크 부하를 줄여준다. 

// 

// 개선해야할 사항 

//

// 1. 캐쉬기능 강제삭제기능 

// 2. 지정된 시간이 지난 캐쉬 이미지 자동 삭제기능 

// 3. 캐쉬사용여부 결정기능  

// 

//////////////////////////////////////////////////////////////

@interface UIImageView (AsyncAndCache)

//String형태의 이미지 URL로 초기화

-(id)initWithURLString:(NSString*)url;

//NSURL 형태의 이미지 URL로 초기화 

-(id)initWithURL:(NSURL*)url;

//String형태의 이미지 URL로 셋팅 

-(void)setImageURLString:(NSString*)url;

//NSURL 형태의 이미지 URL로 셋팅 

-(void)setImageURL:(NSURL*)url;

//동시에 로드할 이미지 최대수 수 

+(void)setMaxAsyncCount:(NSUInteger)count;

@end

//////////////////////////////////////////////////////////////

//

// 한개의 ImageView에 대한 오퍼레이터이다.

// 비동기적으로 로드하는 것을 지원하며 더불어 캐쉬기능까지 지닌다.

// 개발자가 이 클래스를 직접 사용하지 않는다.

// 이 클래스는 AsyncAndCacheImageOperatorManager 클래스에서 동작/관리한다.

//

//////////////////////////////////////////////////////////////

@interface AsyncAndCacheImageOperator : NSObject

{

NSURL *_url; //로드할 이미지의 URL 정보 

UIImageView *_imageView; //이미지를 적용할 View

BOOL _canceled; //이미지 적용을 막는다. 즉 UIImageView 재사용시 나중에 로드되더라도 이게 YES이면 적용하지 못하도록 해서 사용자들로 하여금 잘못된 이미지가 로드되는 것을 방지 한다.

id _loadCompleteTarget; //이미지 로드가 완료되었을때 호출할 target

SEL _loadCompleteSelector; //이미지 로드를 완료했을때 호출할 selector

}

@property (readonly) UIImageView *imageView;

//초기화 함수 

– (id)initWithURL:(NSURL*)url imageView:(UIImageView*)imageView;

//스레드 적용 함수 

– (void)main;

//이미지 적용 취소

//main 메서드가 실행중일때 스레드자체는 중단시킬 수 없지만 imageView에 로드한 image를 적용하는 것은 방지시킨다.

– (void)cancel;

//이미지 로드 완료후 호출할 target/selector 적용 

– (void)setLoadCompleteWithTarget:(id)target selector:(SEL)selctor;

@end

//////////////////////////////////////////////////////////////

//

// ImageView정보를 담은 여러개의 오퍼레이터(AsyncAndCacheImageOperator클래스 객체)를 관리한다.

// 개발자가 이 클래스를 직접 사용하지 않는다.

// setMaxAsyncCount를 이용해 한번에 로드할 수 있는 이미지 갯수를 설정할 수 있다.

// 중요한 것은 동일한 UIImageView에 대해서 다른 이미지 로드 요청이 있는 경우 

// 맨 마지막에 요청한 이미지가 붙도록 하며, 같은 UIImageView가 이미지 로드 대기중인 경우에는 

// 이전 UIImageView에 대한 Operator를 삭제함으로써 부적절한 로드로 인한 네트워크 부하를 최소화 해준다.

//

//////////////////////////////////////////////////////////////

@interface AsyncAndCacheImageOperatorManager : NSObject

{

@private

NSUInteger _maxAsyncCount; //동시에 비동기적으로 로드할 이미지 갯수 

NSUInteger _currentAscynCount; //현재 비동기적으로 로드하고 있는 이미지 갯수 

NSMutableArray *_standByImageOperators; //대기중인 Image Operator들

NSMutableArray *_loadImageOperators; //로드중인 Image Operator들 

}

//한번에 로드할 수 있는 이미지 갯수(스레드 최대 갯수)

-(void)setMaxAsyncCount:(NSUInteger)count;

//오퍼레이터 추가 

-(void)addImageOperator:(AsyncAndCacheImageOperator*)imageOperator;

@end

제 소스는 많은 테스트는 거치지 못했습니다. 그러므로 여기 개발자 분들께서 필요하시다면 제 소스를 분석하고 수정하면서 개선해주셨으면 합니다.  
—————————-
수정사항 1
역시 소스가 공개되니 많은 분들이 테스트도 해주시고 좋네요. 만약 이미지 경로가 image.php?ggg=465.jpg로 되어 있다면 ?ggg=465.jpg 부분을 제대로 가져오지 못하는 버그가 있더군요. [_url path]로 되어 있는 부분을 [_url absoluteString]으로 하면 괜찮다고 합니다. 수정해서 쓰세요. 
수정사항 2
초기에 이미지가 붙어 있는데 주어진 이미지 경로에 이미지를 못불러오는 경우 image = nil이 되기 때문에 초기 이미지를 지우는 부분으로 이상하시다는 분도 계셨습니다. 이 부분은 아래처럼 처리하세요.

if (_canceled==NO) 
{
// 이 부분 추가
if (image)
_imageView.image = image;
}

if (_loadCompleteTarget!=nil) 
{
[_loadCompleteTarget performSelectorOnMainThread:_loadCompleteSelector withObject:self waitUntilDone:YES];
}

NSStringEncoding 인코딩 상수값에 대한 테이블

출처 : http://limechat.net/rubycocoa/wiki/?NSStringEncoding

NSStringEncoding 인코딩 상수값에 대한 테이블

1 NSASCIIStringEncoding Western (ASCII) US-ASCII
2 NSNEXTSTEPStringEncoding Western (NextStep) X-NEXTSTEP
3 NSJapaneseEUCStringEncoding Japanese (EUC) EUC-JP
4 NSUTF8StringEncoding Unicode (UTF-8) UTF-8
5 NSISOLatin1StringEncoding Western (ISO Latin 1) ISO-8859-1
6 NSSymbolStringEncoding Symbol (Mac OS) X-MAC-SYMBOL
7 NSNonLossyASCIIStringEncoding Non-lossy ASCII
8 NSShiftJISStringEncoding Japanese (Windows, DOS) CP932
9 NSISOLatin2StringEncoding Central European (ISO Latin 2) ISO-8859-2
10 NSUnicodeStringEncoding Unicode (UTF-16) UTF-16
11 NSWindowsCP1251StringEncoding Cyrillic (Windows) WINDOWS-1251
12 NSWindowsCP1252StringEncoding Western (Windows Latin 1) WINDOWS-1252
13 NSWindowsCP1253StringEncoding Greek (Windows) WINDOWS-1253
14 NSWindowsCP1254StringEncoding Turkish (Windows Latin 5) WINDOWS-1254
15 NSWindowsCP1250StringEncoding Central European (Windows Latin 2) WINDOWS-1250
21 NSISO2022JPStringEncoding Japanese (ISO 2022-JP) ISO-2022-JP
30 NSMacOSRomanStringEncoding Western (Mac OS Roman) MACINTOSH
-1677721344 Unicode (UTF-32LE) UTF-32LE
-1744830208 Unicode (UTF-32BE) UTF-32BE
-1811939072 Unicode (UTF-16LE) UTF-16LE
-1879047936 Unicode (UTF-16BE) UTF-16BE
-1946156800 Unicode (UTF-32) UTF-32
-2147480574 Western (EBCDIC Latin 1) IBM037
-2147481079 Traditional Chinese (Big 5-E)
-2147481080 Ukrainian (KOI8-U) KOI8-U
-2147481082 Traditional Chinese (Big 5 HKSCS) Big5-HKSCS
-2147481083 Simplified Chinese (HZ GB 2312) HZ-GB-2312
-2147481084 Western (Mac Mail) X-MAC-ROMAN-LATIN1
-2147481085 Traditional Chinese (Big 5) BIG5
-2147481086 Cyrillic (KOI8-R) KOI8-R
-2147481087 Japanese (Shift JIS) SHIFT_JIS
-2147481280 Korean (EUC) EUC-KR
-2147481295 Traditional Chinese (EUC) EUC-TW
-2147481296 Simplified Chinese (EUC) EUC-CN
-2147481536 Korean (ISO 2022-KR) ISO-2022-KR
-2147482062 Chinese (GB 18030) GB18030
-2147482063 Chinese (GBK) GBK
-2147482072 Japanese (Shift JIS X0213) Shift_JIS
-2147482360 Vietnamese (Windows) WINDOWS-1258
-2147482361 Baltic Rim (Windows) WINDOWS-1257
-2147482362 Arabic (Windows) WINDOWS-1256
-2147482363 Hebrew (Windows) WINDOWS-1255
-2147482589 Traditional Chinese (Windows DOS), CP950
-2147482590 Korean (Windows DOS), CP949
-2147482591 Simplified Chinese (Windows DOS), CP936
-2147482595 Thai (Windows DOS), CP874
-2147482596 Greek (DOS Greek 2) IBM869
-2147482597 Cyrillic (DOS) CP866
-2147482598 Nordic (DOS)
-2147482599 Arabic (DOS) cp864
-2147482600 Canadian French (DOS)
-2147482601 Hebrew (DOS) DOS-862
-2147482602 Icelandic (DOS) CP861
-2147482603 Portuguese (DOS)
-2147482604 Turkish (DOS) CP857
-2147482605 Cyrillic (DOS)
-2147482606 Central European (DOS Latin 2) CP852
-2147482607 Greek (DOS Greek 1)
-2147482608 Western (DOS Latin 1) CP850
-2147482618 Baltic Rim (DOS) CP775
-2147482619 Greek (DOS) CP737
-2147482624 Latin-US (DOS) CP437
-2147483120 Romanian (ISO Latin 10) ISO-8859-16
-2147483121 Western (ISO Latin 9) ISO-8859-15
-2147483122 Celtic (ISO Latin 8) ISO-8859-14
-2147483123 Baltic Rim (ISO Latin 7) ISO-8859-13
-2147483125 Thai (ISO 8859-11) ISO-8859-11
-2147483126 Nordic (ISO Latin 6) ISO-8859-10
-2147483127 Turkish (ISO Latin 5) ISO-8859-9
-2147483128 Hebrew (ISO 8859-8) ISO-8859-8
-2147483129 Greek (ISO 8859-7) ISO-8859-7
-2147483130 Arabic (ISO 8859-6) ISO-8859-6
-2147483131 Cyrillic (ISO 8859-5) ISO-8859-5
-2147483132 Central European (ISO Latin 4) ISO-8859-4
-2147483133 Western (ISO Latin 3) ISO-8859-3
-2147483412 Inuit (Mac OS)
-2147483496 Cyrillic (Mac OS Ukrainian) X-MAC-UKRAINIAN
-2147483508 Farsi (Mac OS) X-MAC-FARSI
-2147483607 Keyboard Symbols (Mac OS)
-2147483608 Gaelic (Mac OS)
-2147483609 Celtic (Mac OS)
-2147483610 Romanian (Mac OS) X-MAC-ROMANIAN
-2147483611 Icelandic (Mac OS) X-MAC-ICELANDIC
-2147483612 Croatian (Mac OS) X-MAC-CROATIAN
-2147483613 Turkish (Mac OS) X-MAC-TURKISH
-2147483614 Dingbats (Mac OS) X-MAC-DINGBATS
-2147483619 Central European (Mac OS) X-MAC-CENTRALEURROMAN
-2147483622 Tibetan (Mac OS) X-MAC-TIBETAN
-2147483623 Simplified Chinese (Mac OS) X-MAC-SIMP-CHINESE
-2147483627 Thai (Mac OS) X-MAC-THAI
-2147483637 Gujarati (Mac OS) X-MAC-GUJARATI
-2147483638 Gurmukhi (Mac OS) X-MAC-GURMUKHI
-2147483639 Devanagari (Mac OS) X-MAC-DEVANAGARI
-2147483641 Cyrillic (Mac OS) X-MAC-CYRILLIC
-2147483642 Greek (Mac OS) X-MAC-GREEK
-2147483643 Hebrew (Mac OS) X-MAC-HEBREW
-2147483644 Arabic (Mac OS) X-MAC-ARABIC
-2147483645 Korean (Mac OS) X-MAC-KOREAN
-2147483646 Traditional Chinese (Mac OS) X-MAC-TRAD-CHINESE
-2147483647 Japanese (Mac OS) X-MAC-JAPANESE
feed-dialog-iphone-1

Dialog Feed : Facebook SDK 2.0 for iOS

이번에 Facebook SDK 2.0 for iOS 가 나오면서 Dialog Feeding방법이 변경되었네요.

OpenGraph등이 적용되고, Session, Token처리가 좀 달라진것 같습니다.

“photos.upload”가 안되서 한참 쳐다봤네요.. ㅠㅠ


Mobile dialog

On an iPhone, the following code makes an equivalent dialog:

The above code generates the following dialog:

Take a webcam snapshot in Flex 2.0

출처 : http://blog.newmovieclip.com/2006/05/26/take-a-webcam-snapshot-in-flex-20-beta-3/

The bitmapdata class is also represent in Flex offcourse but finally I had the time to test a few things. In this little article I want to show you how you can easily capture a snapshot from a webcam in Flex 2.0. Because I want to do some more experiments later on I created an actionscript component that immediately embed the webcam image in a Panel. So we need to extend the Panel class to make our custumized WebcamPanel class. This sound difficult but it really isn’t. Let’s go ahead !
First make a new Flex project by choosing File > new > Flex Project. Give your project the name you like eg WebcamTutorial.

Next we are going to build our custom WebcamPanel component. Make some new “actionscript class” in your project by choosing File > new >actionscript class. As package we choose myComponents and we call our class WebcamPanel. As superclass we choose mx.containers.Panel.
We want to have all the functionality from our parent class so in the constructor of our WebcamPanel class we call the super() method.

As you see in the constructor we also calling another method called insertWebcamVideo(). These method looks like this:

The first thing we do in the insertWebcamVideo method is declaring a variable videoHolder of the UIComponent type. We must do this to avoid getting errors when adding this as a child to our Panel. I tried casting to an UIComponent also but this way seems to be the only working. The next step is to put our camera stream into a Video object by using the attachCamera method. Next we want to make this all visible (= put it in the DisplayList) by using the addChild method. This way we first put our video object in the videoHolder and last but not least we put our videoHolder in the Panel which we are inheriting from. In the example code above we also changed the y value of our videoHolder to make it look a bit better in the Panel.

Ok, now we have following actionscript class:

Next step in our webcam project is to use our actionscript component in a mxml application.

Choose FILE > new > MXML application. Give it eg the name “MainApplication”.

Your MainApplication.mxml looks like this:


You can see we are now using the default adobe namespace defined by mx prefix.
But we also want to use our own namespace where our components are defined. Change the application opening tag so it looks like this:

As you can see we can now reference all our own components in the package myComponents with a prefix “MyComp”.
This is really cool ! So lets implement our component in our application and skin our panel (YEAH, skinning is sooo damn easy in Flex !) Type following code right under your opening tag:
This is the code that places our own WebcamPanel on the screen. You see we use our own MyComp namespace to reference our component. Next we want to place a normal Panel where we are going to place the snapshot later on :
We also place a button instance on the screen by writing following code:

As you can see at then end of last code we call a function takeSnapshot() when a user click on the button. So next we have to do is writing that function that will do the snapshot job. We write this function in actionscript between tags. These tags are placed directly under your application tag. As mxml files are based on the XML standard we have to use a CDATA section wherein we write our actionscript code. So the start situation is like this :
< ![CDATA[ //write code here ]]>
Place following code between your CDATA section:

As you can see in the function takeSnapshot we use the same technics as in the beginning of this article. We start by declaring a Bitmapdata object with width 320px and height 240 px. We put the bitmapdata in a real Bitmap object. Normally we should try now to add this Bitmap as a child to the Panel pnlSnapshot but also here it is not possible to add it directly because of type problems. So we use a snahshotHolder to store our bitmap. That snapshotHolder can easily be added to our pnlSnapshot as a child. After or before (you can choose) we did that we can call the draw() method of the BitmapData class to put the captured data in our bitmapData object (snapshot) and the job is done !

I hope you liked this tutorial and feel free to give some feedback

altitude

[AIP-dev] 현재 위치의 해발고도 알아내기


* 초기 iPhone과 iPod Touch에서 볼수있는 WiFi기반의 위치정보서비스는 이 기능을 지원하지 않습니다.
GPS칩을 가진 디바이스만 제공가능하며, GPS fix를 지원해야 합니다.

// MainView.h

//MainView.m

변수 newLocation에는 고도(해발고도) 정보가 들어있지만, 같은 장소에 대한 위도와 경도정보도 얻을수 있습니다.

screen-capture-2

iOS SDK Release Notes for iOS 4.3 beta 1

important: This is a preliminary document for an API or technology in development. Although this document has been reviewed for technical accuracy, it is not final. Apple is supplying this information to help you plan for the adoption of the technologies and programming interfaces described herein. This information is subject to change, and software implemented according to this document should be tested with final operating system software and final documentation. Newer versions of this document may be provided with future seeds of the API or technology.

Introduction

iOS SDK 4.3 provides support for developing iOS applications and includes the complete set of Xcode tools, compilers, and frameworks for creating applications for iOS and Mac OS X. These tools include the Xcode IDE and the Instruments analysis tool among many others.

With this software you can develop applications that run on iPhone, iPad, or iPod touch running iOS 4.3. You can also test your applications using the included iOS Simulator, which supports iOS 4.3. Installing iOS SDK 4.3 requires a Macintosh computer running Mac OS X 10.6.4 (Snow Leopard) or later.

For more information and additional support resources, visit:

http://developer.apple.com/programs/ios/

Bug Reporting

Please report any bugs not mentioned in the “Notes and Known Issues” section using the Apple Bug Reporter on the Apple Developer website at: http://developer.apple.com/bugreporter/. Additionally, you may discuss these issues and iOS SDK 4.3 in the Apple Developer Forums: http://devforums.apple.com.

Notes and Known Issues

The following issues relate to using the 4.3 SDK to develop code.

AppleTV

  • AirPlay Video requires the AppleTV Software Beta.
  • AirPlay Video support is now available as an option for developers in the MPMoviePlayerController class. It is also available to web authors via the QuickTime Plug-In or media element. Supported formats include:
    • H.264 video with AAC audio
    • HTTP streaming, both live and on demand
    • progressive download content
    • local content
  • For web-based content, AirPlay Video can be enabled in the QuickTime Plug-in or media element as described below:
    • QTPlug-in attribute:
      • airplay=”allow”
      • airplay=”deny” (Default)
    • For example: <embed src=”movie.mov” width=320 height=240 airplay=”allow”>
    • Media element:
      • x-webkit-airplay=allow
      • x-webkit-airplay=deny (Default)
    • For example: <video controls width=640 height=368 x-webkit-airplay=allow src=content/side_with_the_seeds.mov> </video>

Core Audio

  • NEW: When using the AudioQueueRef type or AVAudioRecorder class to record at a sample rate that is different from the hardware sample rate, the resulting recording is corrupt.

GameKit

  • FIXED: GameKit now reports an error when an achievement or leaderboard score is not actually submitted.

Xcode

  • NEW: Application symbols are not being symbolicated correctly in the Xcode organizer’s device logs.
AdobeMaxK1-3D-immersive

Flash Low-Level 3D API : Molehill 에 대해..

작년 Adobe MAX 2010에서 선보였던 Flash기반 3D API, Codename ‘Molehill’ 에 대해 포스팅 하려고 합니다.
참고사이트 : http://labs.adobe.com/technologies/flash/molehill/

Flash Player 10.2 까지 플래시플랫폼에서 지원하는 3D기능들은 전부 Software Rendering방식으로 구현됩니다. 이는 CPU에 치중된 방식이기 때문에, CPU점유율이 많이 올라가며 좋지않은 퍼포먼스를 보입니다. 그렇기에 Molehill에서 강조했던 가장 큰 기능인 CPU가 아닌 GPU Hardware Accelating 은 차원이 다른 퍼포먼스를 보여줄수 있다는 강점이 있습니다.

주요 특징으로는,
1. z-buffering
2. stencil color buffer
3. vertex shader

이들은 Flash Platform최초로 GPU를 이용한 3D구현하는 공식API라는 점에서 의미가 있습니다.
Windows에서는 DirectX기반으로,  Mac,Linux에서는 OpenGL 1.3, 모바일에서는 OpenGL ES기반으로 작동된답니다. 이도저도 아닌 플랫폼에서는 기존처럼 소프트웨어렌더방식이구요.

아래에는 이를 활용하여 제작된 3D게임들 영상입니다. 퍼포먼스를 확인해보세요~ 깜짝 놀랍니다 ㅋ

MAX Racer – 3D Flash Game with P2P Multiplayer from Tom Krcha on Vimeo.

[하단의 이미지와 링크들은 지돌스타님 블로그에서 발췌했답니다]

Adobe Labs – 3D APIs for Adobe Flash Player and Adobe AIR
Adobe MAX 2010에서 소개된 차세대 GPU 가속 Flash API – Molehill
Molehill Flash Player 3D APIs 소개
Flash Player 3D APIs 간단한 소개글 – 잼있음
[동영상][at MAX 2010] GPU Acceleration on Adobe AIR “Molehill” – 우야꼬 군이 직접 미국에 MAX 행사에가서 찍은 영상입니다.
[동영상][at MAX 2010] Alternativa 3D in Adobe MAX 2010 – 우야꼬 군이 직접 미국에서 Molehill을 체험했군요.
[동영상] Adobe MAX 2010 – Alternativa 3D 시연 – 땡굴이 님께서 Alternativa의 시연모습을 동영상으로 담았습니다.
Molehill Programming Tutorial
ActionScript의 언어 순위는 몇 위일까?

images

미래의 모바일기술에 대한 고민 #5 – 네트워킹편

현시점에서 모바일에서 이용가능한 통신방식은  2G(GSM,CDMA)/3G(IMT)/4G(LTE Advanced), WiFi, Bluetooth, IrDA, RFID, NFC, GPS 정도가 있을것 같습니다. 혹시 빠진 내용이 있다면 댓글로 부탁드립니다 ^^

* Celluar Network

휴대폰에서 기본적으로 사용하는 2G, 3G, 4G에 대해서는 많이 들어보셨을겁니다.
1995년 세계최초로 CDMA다중 접속기술을 사용하는 이동전화시스템을 상용화한 이래로 PCS(GSM, PHS, AMPS, IMT-2000, TDMA,FDMA 등이 이와 같은 범주에 속함) 기술들이 등장했었고, IMT-2000이라는 3세대(3G) 방식이 등장했습니다.
당시 IMT-2000 의 등장으로 전세계가 떠들썩했었죠. 단일화된 공통의 규격으로 어디에서나 자유로운 로밍서비스를 제공한다는 것과 고속의 데이터서비스를 통해 서비스의 질을 높인다는 것이었습니다. 이와 함께 무선규격은 셀룰러통신방식에 탁월한 성능을 가지는 CDMA방식으로 간다는 대원칙도 있었습니다.

지금 시점에서는 이러한 단일규격의 원칙은 찾아보기 힘들며 3G에서도 GSM방식과 CDMA방식으로 양분되었습니다. 2.5세대급인 CDMA2000은 HSPD(High Speed Packet Data)라는 고속데이터 서비스를 통해 350Kbps이상의 전송률(DTP)을 제공하며, EV-DV의 경우는 2Mbps정도의 전송률을 제공합니다.

3G와 4G의 차이점은 특정한 기술의 이름이 아니라 속도에 따른 세대의 구분입니다.  ITU(국제전기통신연합)기구에서 모바일네트워크의 전송속도에 따라 결정하는데, 이는 같은 4G에도 여러기술이 존재할수 있음을 의미합니다.
3G는 ITU에 의해 144k~2Mbps의 전송속도로 규정됐습니다. KT의 Show, SK의 T, LG의 OZ등이 3G에 속하는데 전부 다른기술기반을 가집니다. 4G는 정지중 1Gbps, 이동중 100Mbps의 속도를 가질것으로 규정되었습니다. 기존 아이폰4에 대한 네이밍에 대한 논란이 있었습니다. 보통 애플제품에 붙이는 Generation이라는 단어가 네트워크세대를 표현하는 단어와 같아서 발생했던 문제였죠.
iPhone 4G(4세대) 제품이 네트워크4G를 지원하느냐라는.. 결국엔 iPhone 4라고 네이밍을 했구요. 진정한 4G는 iPhone 5가 될것 같습니다. 현재 통신사에서 4G서비스를 하는곳이 없으니까요.(미국의 Sprint사가 가장 빠르게 대응하는거 같더군요)

하단의 이미지는 대표적인 4G기술입니다. LTE는 많이 들어보셨을거구요. 국내 대기업에서도 많이 참여하고 있답니다.

* LTE (long-term evolution), UMB (ultramobile broadband), and WiMAX II (IEEE 802.16.m)

4G and the ITU

* Protocol Layer

유선환경에서 사용하는 물리계층 Protocol은 Ethernet이며 Network, Transport 계층은 TCP/IP를 사용합니다. 무선환경에서 사용하는 물리계층 Protocol은 Ethernet이 아닌 Bluetooth, Wireless, Zigbee등이 사용됩니다. 이처럼 물리계층의 프로토콜이 다름에도 불구하고 유/무선 네트워크는 실제로 많은 공통점을 가지고 있습니다.

유/무선의 Network/Transport계층의 프로토콜이 아예 같거나 전송방식 자체가 매우 유사한데, TCP에 대해 간단히 살펴볼 필요가 있습니다. TCP의 중요요소를 대략적으로 구분하면 크게 Source Address, Destination Address, Source Port, Destination Port, Session 이렇게 5가지로 나눌수 있습니다.

Session은 Source/Destination간의 상호 안정적인 통신을 보장하기 위해서 존재합니다. Session은 호스트 간에 상호 통신시 데이터가 정확하게 전달되었는지 확인할 수 있는 기능도 제공하지만, Source와 Destination간의 연결 과정이나 연결 유지에 대한 보안적인 측면에서의 신뢰성도 보장합니다. 즉, 쉽게 표현하면 Source와 Destination이 연결되었다고 가정했을 때, 제 3자는 이들의 연결에 함부로 끼어들 수 없는 기능을 제공합니다.

무선 Network 환경에 쓰일 수 있는 매개체는 다양하게 존재합니다. 모두 무선이라는 연결 매개체를 사용한다는 공통점이 있으나 사용하는 주파수가 다르고, 또 주파수 영역마다 특징이 존재하기 때문에 각각 특성에 맞는 활용 분야가 따로 존재합니다. 예를 들어 어떤 주파수는 전송 거리가 짧거나 어떤 주파수는 한번에 전송될 수 있는 데이터 용량이 적기도 합니다.

무선 Network의 활용도는 매우 광범위하기 때문에 각각의 무선 매개체가 활용될 수 분야에 대한 표준 같은 것이 정해진 것은 아닙니다. 아직까지도 Protocol에 대한 표준 재정 작업이 진행중인 것도 있으며 종전에 촉망 받던 매개체가 여러 가지 문제점이나 혹은 보다 나은 매개체의 등장으로 인해 바뀌기도 합니다.

1. Wireless LAN Network

몇년 사이에 Wireless를 이용한 무선 네트워크는 많은 사람들에게 이용되며 각광받고 있습니다. 무선 Protocol의 표준기술을 가리켜 IEEE 802.11이라 부릅니다. 이는 유선에 비해 이동성, 비용, 유연성등의 장점이 있습니다. (Wi-Fi 라고 명칭하기도 합니다)

IEEE 802.11 (b)
Power Profile Hours
Complexity Very Complex
Nodes/Master 32
Latency Enumeration up to 3 seconds
Range 100m
Extendability Roaming possible
Data Rate 11Mbps
Security Authentication Service Set ID (SSID)

2. Bluetooth Network

비교적 저렴한 생산비용과 확장성, 그리고 유연성적인 측면에서 높은 평가를 받고있고, 실제로 많이 사용되고 있습니다. Wi-Fi에 비해서 일반무선네트워크에 쓰이기엔 부족한 전송속도를 갖고 있으며, Zigbee와 비교하여 홈네트워크에 쓰이기엔 높은전력소모와 생산비용을 갖고 있지만, 그 중간단계의 활용분야에서 많이 사용되고 있습니다.

Bluetooth
Power Profile Days
Complexity Complex
Nodes/Master 7
Latency Enumeration up to 10 seconds
Range 10m
Extendability NO
Data Rate 1Mbps
Security 64 bit, 128 bit

3. Zigbee(Zigzag+Bee의 합성어) Network

앞으로 가정내에서 사용하는 가전제품에도 컴퓨팅능력이 들어갈 것이라고 많은 사람들이 말하고 있으며, 실제로도 몇몇 제품들이 실제로도 사용되고 있습니다. 예를 들어 집 밖에서 원격으로 보일러를 조정하여 방안의 온도들을 설정할수도 있습니다. 또한 가전 제품들이 컴퓨팅 능력을 갖춤으로써 서로 간의 통신을 통해 여러 가지 편리한 점들을 누릴 수도 있습니다. 집 주인이 집에 들어왔을 때 집에 들어온 현재 시간을 파악하여 주인이 선호하는 TV 채널을 자동으로 틀게 하는 것도 좋은 예입니다.

Zigbee
Power Profile Years
Complexity Simple
Nodes/Master 64000
Latency Enumeration 30ms
Range 70m~300m
Extendability YES
Data Rate 250Kbps
Security 128bit AES and Application layer user defined

4. RFID Network

RFID는 일반적으로 13.56Mhz대역, 그리고 UHF대역인 860~960Mhz영역이 가장 많이 활용됩니다. 이는 물류네트워크에서 많이 사용되는데 RFID Tag을 물품이나 물류등에 붙여서 사용될수 있습니다. 이 Tag안에는 EPC(Electronic Product Code)라는 것이 존재하여 상품의 제조일,특징 등에 대한 정보를 포함하고 있습니다.

4-1. NFC (Near Field Communication) – RFID Extension

NFC는 초단거리 무선통신 기술로 대략 10cm이내의 기기간에 통신을 가능하게 해줍니다. ISO/IEC 14443 proximity-card standard(비접촉카드 또는 RFID)표준을 확장한 것으로 스마트카드와 리더기를 하나로 합쳐놓은것이라고 생각하면 됩니다.
ISO/IEEE 14443표준을 확장한 것이기 때문에 NFC디바이스간 뿐 아니고 기존의 ISO/IEEE 14443리더기나 스마트카드와도 통신을 할수 있습니다. NFC는 기본적으로 휴대폰에서 사용할 목적으로 만들어졌습니다.

– 13.56MHz의 ISM밴드에서 14KHz의 대역폭을 사용
– 최대 동작 거리: 20cm
– 지원하는 통신 속도: 106, 212, 424, 848 Kbit/s
– 동작모드: Passive, Active

현재 NFC는 주로 휴대폰에서 사용되는데 3가지 방식으로 동작하고 있습니다.

– 카드 에뮬레이션: NFC디바이스(휴대폰)이 기존의 RFID카드와 같이 동작한다. 즉 리더기에 기존의 카드 대신 휴대폰을 가져다 대면 된다.
– 리더 모드: NFC디바이스가 카드 리더기로 동작하는 모드이다.
– P2P 모드: 두대의 NFC디바이스가 서로 통신하는 모드이다.

이렇게 3가지 모드를 지원하기 때문에 NFC디바이스는 매우 다양한 방법으로 사용할 수 있습니다. 휴대폰이 교통카드, 문 열쇠등으로 동작(카드 에뮬레이션), 미술관, 박물관 등에서 작품에 휴대폰을 가까이 가져가면 해당 작품의 소개로 연결하기, 스마트카드 결제 단말기(리더모드), 휴대폰간 명함 교환 (P2P 모드)등등이 가능해집니다.

그리고 통신거리가 매우 짧기 때문에 보안 문제도 간단해지고 통신을 위한 초기 셋업타임이 매우 짧은것이 (0.1초 이하) 최대의 장점입니다.

NFC에 대해서는 다음에 좀더 자세히 포스팅하도록 하겠습니다.

The-VGA-Adapter-for-iPad

[AIP-Dev] VGA-Adapter를 이용하여 화면출력하기

공식적으로 VGA-Adapter를 지원하는 어플들이 몇가지 있습니다.

1. 기본으로 설치되어있는 Video App
2. 사진 (슬라이드쇼 지원)
3. YouTube
4. Keynote같은 Apple에서 나온 Office App
5. Safari (일부 컨텐츠 지원)
6. 그외 몇몇 지원하는 Apps

6번항목에 해당하는 Apps들을 보면서, 어떻게 하면 이 기능을 활성화시킬수 있을까를 구글링하다보니, 관련 포스팅을 발견하여, 저도 공유하려고 합니다.

기본적으로 아이패드 화면을 Mirroring하는 기능이고, 해상도는 1024 * 768 입니다.

http://code.google.com/p/iphoneos-screen-mirroring/
http://stackoverflow.com/questions/2662201/ipad-vga-connector-mirror-screen-in-own-application

가장 중요한 핵심코드는 아래와 같습니다.

이 코드를 삽입하지않으면, Adapter를 연결해도 아무런 반응이 없습니다.

Application을 시연하는 경우에 반드시 필요한 기능인것 같네요.

참고ref : http://alones.kr/1809

1055354877

iOS Packager를 사용하여, iPhone/iPad어플 개발하기 #1

오랜만에 포스팅을 하네요.

Apple에서 iOS 4.0을 출시하면서, 앱스토어 정책을 변경하여,
플래시 혹은 ThirdParty Tool을 사용하여 iOS Application개발이 가능해진 사실은 많은분들이 알고계실겁니다.
사실 플래시를 사용하게 해주고 싶어서라기보다는, Quake Engine for iOS 같은 훌륭한 게임엔진들의 사용을
가능하게 해주려고 하다보니 덩달아서 Adobe FlashPlatform이 덕을 본게 아닌가 생각됩니다.

일단 Mobile Device (Touch기반) 과 PC와의 가장 큰 차이점은 Input장치에 있습니다.
키보드,마우스를 사용하느냐 아니면 손가락을 사용하여 터치스크린을 제어하느냐 이 부분이 사용자들이
가장크게 느끼는 차이점일 것이며, 개발자입장에서는 기존에 고려하지 않았던(고려할필요가 없었을수도 있죠)
Device의 CPU, RAM사용량의 최적화가 많은 걸림돌이 될것입니다.

가장 좋은 퍼포먼스를 보여주기 위해서는, 권장하는 언어를 사용하여 Native로 제작하는 것이 가장 좋겠습니다만,
간단하게 손쉽고 빠르게 프로토타입정도 수준의 Application을 제작할때는 Flash/AIR 만한 툴도 없다고 생각합니다.
(물론 제가 익숙해서 이게 편한거겠지만요 ^^)

현재 Adobe에서 제공하는 레퍼런스는 상당히 내용면에서 빈약하다고 할수밖에 없습니다.
http://help.adobe.com/en_US/as3/iphone/index.html
위의 주소에서 간단한 Description을 확인하실수 있습니다.

아이폰 어플을 제작할때는 퍼포먼스를 극대화 할수있는 모든방법을 총동원해야 할것 같습니다.
(사실 Web-Application, RIA등을 작업할때는 귀찮아서 신경안썼던 방법까지두요)

아이폰어플개발을 하며 가장 크게 문제가 되었던 부분들에 대해서 앞으로 여러차례에 나눠서 포스팅을 하려고 합니다.
1. Tweener
2. Touch, Gesture, SupportedGesture
3. BitmapCaching (cacheAsBitmap, cacheAsBitmapMatrix)
4. EventListener의 선언시점
5. NativeCommand, ExternalInterface등의 Mobile에서만 존재하는 특수기능들

아직까지 geoLocation을 사용하여 활용해보진 않아서, 이런 부분들도 나중에 추가할생각입니다~
아이패드어플 Prototype 작업하면서 얻을수 있는 팁들은 전부 포스팅할까합니다.
자료를 찾아보려고 했는데 정말 없더라구요. 저라도 써보려구요 ㅎㅎ

PS> 트위터를 통해서 비트맵캐싱에 대해 조언해주신 세계의끝님, 우야꼬님 감사합니다.