iPhone 에서 OAuth 라이브러리 사용하기

지난 주에 아이폰에 OAuth 컨슈머 라이브러리 돌리는데 삽질을 너무 많이 해서 반성하는 의미로 포스팅 해본다. http://oauth.net에 있는 라이브러리는 아이폰에 바로 쓸 수 없어서 약간 손을 봐야하는데 누군가 이미 해놓은 것도 있지만 기본(?) 라이브러리로 한번 해봤다. 붙이는건 그렇게 어렵지 않은데 아이폰에 써드파티 바이너리 프레임웍 추가 안되는거랑 Security.framework 내용이 Mac의 것과 다르다는 걸 몰라서 시간을 엄청 허비했음.

  1. OAuthConsumer 라이브러리를 체크아웃 한다.

    svn checkout http://oauth.googlecode.com/svn/code/obj-c/ .

  2. 프레임웍으로 빌드해서 넣으면 깔끔하겠지만 아이폰에는 그렇게 넣을 수 없으니 소스를 직접 넣는다. 다운받은 OAuthConsumer 디렉토리 아래에서 필요한 파일만 남기고 모두 삭제한다.

    rm -rf English.lproj OAuthConsumer.xcodeproj *.plist *.pch *.rb *Test.?

  3. Xcode에서 OAuthTest 라는 이름의 View-Based Application 하나를 생성한다.

  4. Finder에서 OAuthConsumer 디렉토리를 끌어다 Groups & Files 창의 Classes 아래에 놓는다. 파일을 복사할꺼니까 끌어다 놓을때 뜨는 'Copy items into destination group's folder'에 체크하고 Add 한다.

  5. 이 상태에서 빌드를 해보면 OAToken_KeychainExtensions.m 파일에서 에러가 난다. 원래 Mac Cocoa 환경이라면 Security.framework 라이브러리를 추가해서 컴파일 할 수 있지만 아이폰용 Security.framework 라이브러리는 맥용과 달라서 OAToken_KeychainExtensions.m 파일을 컴파일 시킬 수 없다. 하지만 이 파일은 꼭 필요한건 아니고 나중에 OAuth 인증 끝나고 토큰과 시크릿을 키체인에 안전하게 보관할 수 있게 도와주는 유틸리티인데 필요하면 알아서 구현하고 일단 지워도 문제 없다. 파일 목록에서 OAToken_KeychainExtensions.? 파일을 삭제하고 빌드하면 일단 문제없이 컴파일이 될 것이다.

  6. 시작하기 전에 OAuthConsumer.h 파일을 열어서 import 경로를 올바른 경로로 바꾸어주자.

    #import <Foundation/Foundation.h> #import <OAuthConsumer/OAToken.h> #import <OAuthConsumer/OAConsumer.h> #import <OAuthConsumer/OAMutableURLRequest.h> ...

    이걸 아래처럼 변경.

    #import <Foundation/Foundation.h> #import "OAToken.h" #import "OAConsumer.h" #import "OAMutableURLRequest.h" ...

  7. 이제 OAuthTestViewController.xib 파일을 열어서 아래 그림처럼 웹뷰, 'Get Request Token' 버튼, 'Get Access Token' 버튼, PIN 번호를 입력받을 텍스트 필드가 있는 화면을 생성한다. 'Get Request Token' 버튼을 누르면 Request Token을 얻어와서 트위터의 Authorize URL로 이동시키고, 사용자가 로그인 한 후 보여지는 PIN 번호를 넣고 'Get Access Token' 버튼을 누르면 Access Token을 가져올 것이다.

  8. 위에서 추가한 웹뷰, 텍스트필드의 아웃렛 변수와 두 버튼에 연결될 액션 메서드를 만들고 연결한다.

    #import <UIKit/UIKit.h> @interface OAuthTestViewController : UIViewController { UIWebView *webView; UITextField *textField; } @property (nonatomic, retain) IBOutlet UIWebView *webView; @property (nonatomic, retain) IBOutlet UITextField *textField; - (IBAction)requestTokenButton:(UIButton *)sender; - (IBAction)accessTokenButton:(UIButton *)sender; @end

  9. 먼저 'Get Request Token' 버튼을 눌렀을때 Request Token을 얻어와서 로그에 찍어보자. 아래처럼 호출하도록 requestTokenButton: 메서드를 작성하고 성공/에러시에 호출될 델리게이트 메서드도 만든다.

    #import "OAuthConsumer.h" ... - (IBAction)requestTokenButton:(UIButton *)sender { OAConsumer *consumer = [[OAConsumer alloc] initWithKey:@"Z0DxPl4q7kmSOgh3LTpV4Q" secret:@"LWryiOYBAHJ58PX9Yn1yG5bzDwpMJiksqpXxfst7kcU"]; NSURL *url = [[NSURL alloc] initWithString:@"http://twitter.com/oauth/request_token"]; OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url consumer:consumer token:nil realm:@"http://twitter.com/" signatureProvider:nil]; [request setOAuthParameterName:@"oauth_callback" withValue:@"oob"]; OADataFetcher *fetcher = [[OADataFetcher alloc] init]; [fetcher fetchDataWithRequest:request delegate:self didFinishSelector:@selector(requestTokenTicket:didFinishWithData:) didFailSelector:@selector(requestTokenTicket:didFailWithError:)]; [consumer release]; [url release]; [request release]; [fetcher release]; } - (void)requestTokenTicket:(OAServiceTicket *)ticket didFinishWithData:(NSData *)data { if (ticket.didSucceed) { NSString *responseBody = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; OAToken *token = [[OAToken alloc] initWithHTTPResponseBody:responseBody]; NSLog(@"Request Token: key=%@, secret=%@", [token key], [token secret]); [token release]; [responseBody release]; } else { NSLog(@"Finish but did not succeed."); } } - (void)requestTokenTicket:(OAServiceTicket *)ticket didFailWithError:(NSError *)error { NSLog(@"Error: %@", [error localizedDescription]); }

    위와 같이 작성해서 실행해보면 requestTokenTicket:didFailWithError: 쪽으로 떨어지면서,

    Operation could not be completed. (NSURLErrorDomain error -1012.)

    이런 메시지가 떨어진다. 이유는,

    [request setOAuthParameterName:@"oauth_callback" withValue:@"oob"];

    이 부분 때문인데 oauth_callback 이라는 파라미터를 추가하고 싶어서 이렇게 적었으면 이 파라미터를 포함하여 시그니쳐를 생성해야 하는데 OAuthConsumer 라이브러리에서는 추가된 파라미터를 제외하고 시그니처를 생성해 요청했고 결과적으로 트위터에서 시그니처가 틀리다는 이유로 200 OK가 떨어지지 않는 상태이다(버그이거나 OAuth 1.0a 스펙을 고려하지 않아서인 듯). 추가된 파라미터를 포함하여 시그니처를 생성하도록 OAMutableURLRequest.m 파일을 수정해보자. 파일을 열어서 _signatureBaseString 메서드 중간쯤에,

    ... for (OARequestParameter *param in [self parameters]) { [parameterPairs addObject:[param URLEncodedNameValuePair]]; } for(NSString *parameterName in [[extraOAuthParameters allKeys] sortedArrayUsingSelector:@selector(compare:)]) { [parameterPairs addObject:[[OARequestParameter requestParameterWithName:parameterName value:[extraOAuthParameters objectForKey:parameterName]] URLEncodedNameValuePair]]; } NSArray *sortedPairs = [parameterPairs sortedArrayUsingSelector:@selector(compare:)]; NSString *normalizedRequestParameters = [sortedPairs componentsJoinedByString:@"&"]; ...

    이렇게 for 루프를 하나 추가한다. 이제 다시 실행해서 'Get Request Token' 버튼을 눌러보면,

    2010-03-05 17:09:40.438 OAuthTest[1691:207] Request Token: key=wyGw0VUSE79MTuVm0iqs7ZdWiPI3ZRJWCZ2k6P73w, secret=AUGrkHfx3nr6xb9Q5dUbNQzykZQvFJ62WW90BojT8

    콘솔에 이렇게 찍히면서 정상적으로 토큰을 얻어올 수 있다.

  10. 이제 Request Token을 얻어왔으니 토큰을 임시로 저장하고 트위터의 Authorize URL을 호출한다. 아래처럼 OAuthTestViewController.h 파일을 수정하고,

    #import <UIKit/UIKit.h> @class OAServiceTicket; @class OAToken; @interface OAuthTestViewController : UIViewController { UIWebView *webView; UITextField *textField; OAToken *requestToken; } @property (nonatomic, retain) IBOutlet UIWebView *webView; @property (nonatomic, retain) IBOutlet UITextField *textField; @property (nonatomic, retain) OAToken *requestToken; ...

    아래처럼 OAuthTestViewController.m 파일을 수정한다.

    if (ticket.didSucceed) { NSString *responseBody = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; OAToken *token = [[OAToken alloc] initWithHTTPResponseBody:responseBody]; NSLog(@"Request Token: key=%@, secret=%@", [token key], [token secret]); self.requestToken = token; [token release]; [responseBody release]; NSString *authorizeURL = [[NSString alloc] initWithFormat:@"http://twitter.com/oauth/authorize?oauth_token=%@", [self.requestToken.key URLEncodedString]]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:authorizeURL]]]; [authorizeURL release]; } ...

    이제 실행하고 'Get Request Token' 버튼을 누르면 아래 이미지 처럼 인증을 요구하는 화면이 나오고 Allow 하고 나면,

    아래 이미지 처럼 PIN 번호가 보여진다.

  11. 이제 PIN 번호를 입력하고 'Get Access Token'을 클릭했을 때의 처리를 하면 된다. accessTokenButton: 메서드를 아래처럼 작성하고 accessTokenTicket:didFinishWithData:, accessTokenTicket:didFailWithError: 델리게이트 메서드도 만들자.

    - (IBAction)accessTokenButton:(UIButton *)sender { OAConsumer *consumer = [[OAConsumer alloc] initWithKey:@"Z0DxPl4q7kmSOgh3LTpV4Q" secret:@"LWryiOYBAHJ58PX9Yn1yG5bzDwpMJiksqpXxfst7kcU"]; NSURL *url = [[NSURL alloc] initWithString:@"http://twitter.com/oauth/access_token"]; OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url consumer:consumer token:self.requestToken realm:@"http://twitter.com/" signatureProvider:nil]; [request setOAuthParameterName:@"oauth_verifier" withValue:self.textField.text]; OADataFetcher *fetcher = [[OADataFetcher alloc] init]; [fetcher fetchDataWithRequest:request delegate:self didFinishSelector:@selector(accessTokenTicket:didFinishWithData:) didFailSelector:@selector(accessTokenTicket:didFailWithError:)]; [consumer release]; [url release]; [request release]; [fetcher release]; } - (void)accessTokenTicket:(OAServiceTicket *)ticket didFinishWithData:(NSData *)data { if (ticket.didSucceed) { NSString *responseBody = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; OAToken *token = [[OAToken alloc] initWithHTTPResponseBody:responseBody]; NSLog(@"Got Access Token [key:%@, secret:%@]", token.key, token.secret); [token release]; [responseBody release]; } else { NSLog(@"Finish but did not succeed."); } } - (void)accessTokenTicket:(OAServiceTicket *)ticket didFailWithError:(NSError *)error { NSLog(@"Error: %@", [error localizedDescription]); }

  12. 이제 실행해서 PIN 번호를 넣고 'Get Access Token' 버튼을 누르면 아래처럼 Access Token 정보가 콘솔에 출력된다.

    Got Access Token [key:14368376-CyPcPg7uVLcOkzRJBlJLMVKqZQMzCMQnRxHMmzQG8, secret:HY3eENZ6Pt4AFdUUtzAROlZDaKHOJHtcc7lMKMyKE]

  13. 이제 위에서 출력되는 Access Token 정보를 저장해서 OAMutableURLRequest 클래스로 요청 할 때 token 인자에 넣어 보내면 된다. 요청 할 때 파라미터를 세팅해야 할 경우에는, OARequestParameter 파라미터를 NSArray 로 묶어 OAMutableURLRequest 생성 후에 setParameter: 해주면 된다.

틀린 내용이 있다면 지적해주세요!

'컴퓨터 얘기 > 프로그래밍' 카테고리의 다른 글

iPhone 에서 OAuth 라이브러리 사용하기  (7) 2010/03/05
Read Me 플러그인  (3) 2007/12/07
드림위버와 이별하기  (5) 2007/11/28
MySQL Foreign Key 바보짓  (6) 2007/04/09
TinyMCE 플러그인 - WikiExporter  (5) 2007/02/07
멜론 앨범 커버 다운로더  (20) 2007/02/04

내가 쓰는 아이폰 어플들

설치된 아이폰 어플리케이션들 아이콘

아이폰 구입하고 지금까지 이것 저것 깔아보면서 아직 살아남아 있는 어플들을 정리해본다.

Echofon Pro for Twitter ($4.99)
주력으로 사용하고 있는 트위터 클라이언트다. 프로 버전에서 지원하는 Mention/DM 푸시 기능과 이미지를 플리커로 업로드 할 수 있는 기능때문에 사용함. 그 밖에 reply를 묶어서 보여준다거나 near by/trends 검색 등 기본 기능은 고만고만 함. 얼른 List만 지원해주면 좋겠다.
IM+ ($9.99)
기능이 엄청 많고 지원하는 서비스도 다양하지만 그냥 GTalk, MSN용으로만 쓰고 있다. 어플 닫아놔도 72시간동안 로그인된 상태를 유지시켜주고 메시지가 오면 푸시로 알려줌. 무료 버전도 광고가 붙는거 말고 기능 차이는 없는 듯? WhatsApp 이나 Ping! 같은 메시징 어플보다는 그냥 이거 깔아서 쓰는게 더 편할거 같다.
Neon ($1.99)
네이트온 메신저 어플인데 그냥 화면이 예뻐서 쓰고 있다. 그냥 기본적인 기능만 있음. SK컴즈에서 어플 만들고 있다는 루머도 있던데 제대로 만들어서 얼른 나왔으면 좋겠네.
Flickr (Free)
트위터에 링크하는 사진을 올리는 용도로 쓰던 어플인데 Echofon 에서 플리커 업로드가 되니 지금은 별로 여는 일이 없어졌다. 그래도 올린 사진 관리하거나 공개 사진 검색해서 찾아보거나 하면서 놀때 좋음.
Google Tasks (Website)
이건 어플은 아니고 TODO 관리 하는 어플들을 많이 찾아봤는데 그냥 브라우저로 구글 태스크 열어서 쓰는게 최고인 것 같다. GMail, Google Calendar 를 메인으로 쓰는 사람이라면 접근이 쉽고 데스크탑과 싱크가 쉬우니 추천.
Air Video ($2.99)
PC에 서버를 설치해놓고 동영상이 들어있는 디렉토리를 공유해놓으면 아이폰으로 동영상을 볼 수 있다. 아이폰에 맞게 실시간 인코딩을 해서 보여주기 때문에 화질이 매우 좋고 버퍼링 시간도 그리 길지 않다(5~7초 정도). 3G로 보면 중간에 버퍼링이 심하고 무선랜이 잡혀야 제대로 쓸 수 있다. 주로 자기전에 누워서 뭔가 보거나 회사 화장실에서 뮤직비디오 보는 용도로 씀. 자막도 지원은 하는데 smi를 다른 파일로 한번 변환해줘야 한다.
Seoul Bus (Free)
버스 노선, 정류장 정보, 실시간 버스 위치 등을 제공해주는 어플. 아침마다 버스 타이밍으로 고생하는 사람이라면 필수 어플일 것이다. 아마 모바일 서울 사이트의 데이터를 이용하는 듯? 아이폰에서 쓰기는 좀 불편하지만 요 사이트에 가면 조금 더 자세한 정보와 지하철 운행 정보도 볼 수 있다.
Jihachul (Free)
그냥 노선 보여주고 역 출구정도 보여주는 심플한 어플. 경로 찾기 기능이 최근에 추가되었다. iKorway 어플이 기능이 더 많지만 아직 9호선이 추가되지 않아서 안 쓰고 있지만 곧 나올 3.0에서는 기능도 더 강력해지고 9호선도 되고 해서 나오면 갈아탈 듯 싶다.
MotionX GPS ($2.99)
켜놓고 움직이면 경로를 기록해준다던가 현재 속도를 표시해준다거나 하는 어플. 집에 걸어오는 길에 새로운 코스를 시도해보고 싶을 때 종종 사용한다. 저장한 경로는 트위터나 이메일로 보낼 수 있음.
TiltShift Generator ($0.99)
사진에 특수효과를 주는 어플 몇가지를 써봤는데 이게 제일 나은 것 같다. 다른 어플에서 제공하는 color effect, vignetting 외에 강력한 blur를 제공해서 사진을 뽀샤시 하게 만들 수 있다. 어플 제목처럼 Tilt-shift 효과를 낼 수도 있고.
SketchBook Mobile ($2.99)
그림 그리는 어플 중에서는 최고인 듯. 능력만 있다면 이런 그림들을 그려낼 수 있다고 함.
Photoshop.com Mobile (Free)
기본적인 이미지 에디팅 기능을 제공해준다. Crop/Rotate/Flip/Exposure/Saturation/Tine/Black&White. 그리고 몇 가지 특수효과도 지원하고 하나쯤 있으면 언젠가는 쓸일이 생길만한 어플.
GuitarToolkit ($9.99)
기타 튜너, 메트로놈, 코드/스케일 사전 어플.
Layar (Free)
유명한 증강현실 어플. 길에서 치킨집을 검색하면 치킨집 위치가 카메라 위에 둥둥 뜬다. 딱히 쓸데는 없지만 간지가 폭발하는 어플.
아프리카 (Free)
모든 방송을 볼 수 있는 건 아니지만 꽤 쓸만함. 이제 잠들기 전에도 여신님들을 만나뵐 수 있다능!
매일경제 (Free)
스타화보 소식이나 연예계 가십을 보는데 가장 좋은 어플.
중앙일보 (Free)
그냥 중앙일보. 기사 새로고침 하는 시간이 더럽게 오래걸린다.
MBC Radio Lite (Free)
MBC의 표준FM, FM4U를 들을 수 있다. 편성표 보기가 불편하고 보이는 라디오 지원이나 음질 향상 등이 되었으면 하는 아쉬움이 있지만 쓸만함.
G마켓 (Free)
아직 제대로 써본적은 없지만 언제 어떤 환경에서라도 지체없이 지를 수 있다는 든든함은 아이폰을 더욱 빛나게 한다.
DigiDrummer Lite (Free)
드럼 놀이 하는 여러 어플들을 써보고 마지막까지 살아남은 어플. 보통 드럼 모양 그림 나오는 어플들은 보기는 좋아도 놀기는 좋지 않다. 유료 버전을 구입해봤지만 쓸만한 음원이 별로 없고 쓸데없이 로딩만 오래 걸려서 Lite 버전을 사용한다.
Banner Free (Free)
전광판 모양으로 글자가 흘러가게 해주는 어플. 회의시간에 맞은편의 사람에게 잡담을 날린다거나 할때.. 유료 버전은 색깔, 스크롤 속도 등을 조절할 수 있는데 설정화면 들어가는데 버벅이는거 보기가 싫어서 이 것도 무료 버전 사용 중.
Tweetie 2 ($2.99)
트위터 클라이언트 중에 제일 유명한 것 같다. 지금은 Echofon 쓰고 있어서 Lists 볼 때만 사용하는데 전체적으로 흠잡을데 없이 완벽한 것 같다. 새로고침 할때 아래로 당겼다 놓으면 새로고침 되는게 재밌어서 계속 당기게 됨..
Dropbox (Free)
유명한 파일 공유 서비스인 Dropbox의 아이폰용 어플. PC에서 사진, PDF, DOC, XLS 등등 넣어놓고 아이폰에서 볼때 제일 편한 방법인 것 같다.
Flashlight. (Free)
아이폰화면을 하얗게 채워서 전등으로 쓰거나 여러가지 색으로 번쩍번쩍 하게 해주는 어플.
Night Stand ($0.99)
시계/알람 어플. 개중에 비쥬얼이 좋아서 낙찰.
Sleep Cycle alarm clock ($0.99)
어플을 켜놓고 침대 위에 뒤집어놓은 다음에 자고 일어나면 자면서 얼마나 뒤척거렸는지 그래프로 나타내준다. 매일매일 기록 중. 이렇게 기록된 데이터를 바탕으로 가장 일어나기 쉬운 시각에 알람을 울려 깨워준다고 한다.
Ocarina ($0.99)
마이크에 바람을 불어서 오카리나 연주를 할 수 있는 어플. 어렵다..
World of Warcraft Mobile Armony (Free)
와우 전투정보실 어플. 님 그 렙에 잠이 오나여..
iClouds ($0.99)
구름위를 날아다니는 화면이 나오고 그게 끝인 어플인데 보고 있으면 몽롱하니 좋다. 유료버전은 노을, 야간 비행 모드가 추가되었는데 그냥 기본 화면이 제일 낫다.
ShinMatgo (GoStop) ($1.99)
휴대폰에 당연히 고스톱 깔려있어야 되는거 아닌가요..
Vexed ($0.99)
예전에 되게 열심히 했던 벽돌 이동해서 같은 벽돌끼리 없애는 게임. Palm에서 하던 느낌 그대로 옮겨놓은 듯 아이폰에서 즐기기는 좀 불편하다.
iSniper 3D ($0.99)
화면을 터치하면 저격모드로 바뀌고 아이폰을 이리저리 기울여 겨냥해서 헤드샷~
Call of Duty: World at War: Zombies ($9.99)
3D FPS 게임 멀미가 있는 사람은 과연 아이폰 게임에서도 멀미를 하는가 궁금해서 사봤는데 튜토리얼 하다 토할뻔 하고 봉인되었음. 조작이 조금 불편하지만 재밌기는 할 것 같다.
ROCK BAND ($6.99)
유명한 연주게임인 ROCK BAND의 아이폰 버전. 좀 더 높은 난이도가 있었으면 하는 아쉬움이 남지만 재밌게 즐길 정도는 됨.
Tap Tap Revenge 3 ($0.99)
예전부터 많은 인기를 얻고 있는 시리즈이지만 개인적으로는 리듬게임 장르 속에서 봤을때 쓰레기 축에 든다고 생각하는 게임. 연주한다는 느낌이 전혀 들지 않는 면에서 DDR 같은 부류에 가까운거 같지만 그렇게 보기에도 박자감을 느끼기 힘들정도로 말랑말랑한 이상한 게임. 곧 지울꺼임.
Bejeweled ($2.99)
PDA 사면 당연히 깔아야 했던 그 게임.. 돌을 잘못 움직일 때마다 alert이 계속 뜨는데 끄는 옵션이 없어서 좀 짜증난다. 미친 수족관이나 얼른 나왔으면 좋겠네..
Need for Speed™ Undercover ($4.99)
예전에 터치 쓸때 무슨 레이싱게임 받아서 해보고 이상한 조작감에 터치에서 레이싱 게임은 안되는구나..라고 생각했었는데 요 NFSU는 완벽한 조작감을 보여준다. 커리어모드가 좀 더 길었으면 하는 아쉬움이 있음.
TETRIS® ($4.99)
완성도가 훌륭한 편. 특수 모드들도 재밌는 편이다.
Crush the Castle ($1.99)
플래시 게임의 아이폰 버전.

'컴퓨터 얘기 > 쓸만한팁들' 카테고리의 다른 글

내가 쓰는 아이폰 어플들  (5) 2009/12/12
Acrobat Reader  (0) 2004/07/21
자동로그인  (3) 2004/07/17
수수께끼는 모두 풀렸다..  (0) 2004/07/16
디스크 공간부족 메세지 끄기  (0) 2004/07/08
Style XP 2.10의 Explorer Bar  (0) 2004/07/04

TmaxDay 2009

네임 택

사전등록 입력폼에 대충 쓰고 등록했더니 네임택이 이모양 ㅋㅋ

어쨌든 실체가 있기는 있었다. 실로 몇 년만에 포스팅을 부르는 행사.

참가자 등록 및 전시 관람

홀이 사람에 비해 좁아서 별로 돌아다니진 못했는데 그다지 눈에 띄는 전시물도 없었다. 오전에 기자들은 직접 조작도 해봤다길래 전시된 PC라도 있을까 했는데 하긴 미리 공개할리가.. 아무튼 사람이 무지 많아서 입장한 뒤에도 뒷줄에 엄청 많은 사람들이 서서 봐야 했다.

Opening

큰 북을 가져다 놓고 북을 치는 퍼포먼스.. 아 이거 이름이 있었는데 뭐였지; '이 것은 뒷북이란다~' 라는 짤방으로 유명한 바로 그.. 행사랑은 좀 어울려서 나름 괜찮았음.

Open The Window Performance

테이프 커팅이 있겠습니다~ 하고 내빈들을 불러모아 뻘줌하게 생긴 버튼을 동시에 누르니 무대에서 김이 푸아악 하고 솟아올랐다. 이 것이 대륙의 테이프 커팅..이 아니고 이부분은 약간 손발이 오골오골.

축사

아 시밬 강만수크리 ㅋㅋㅋㅋㅋ 오랫만에 교장선생님 훈화 말씀을 듣는 것 같은 노곤함. 니가 좀 잘했으면 나는 윈도우즈 7을 조금 더 싸게 살 수 있었을텐데요.. 의아한건 내빈이라고 모인 사람이 강만수, 금융 무슨 협회장, 무슨 은행장 등 다 돈만지는 사람이었던 것. 관공서가 타겟인줄 알았더니 은행권에 납품하는게 최종 미션이었나? 아님 그냥 투자받으려고? 은행 전산 담당자가 본다면 등골 쫄깃할 장면이었을 것 같음.

Keynote : Change The Future - 회장 박대연

조선, 자동차, 반도체 처럼 이제 소프트웨어의 부가가치에 집중해야 한다. 항간의 소문처럼 국가 지원을 받으려거나 주식을 띄우려고 시도하는게 아니다. 뭐 이런 티맥스 윈도우즈의 탄생 배경에 대해 설명. 계속 느낀거지만 이 사람들 PT 정말 못하는 것 같다; 텍스트와 클립아트로 가득한 주입식 스타일.. '윈도우즈7은 안써봐서 잘 모르겠지만' 이라고 말하던데 그 무슨..; 뒤에 OS 발표한 김대승 상무도 그렇고 이 사람들은 '일하다가 이혼한 사람도 있고 애인과 헤어진 사람도 다반사고 맹장 터진줄도 모르고 30일동안 일한사람도 있으니 이쁘게 봐주삼~' 이라던데 개발자들 앞에서 그게 할 소리냐. 그래 니들은 평생 공정무역 커피같은건 먹지 말고 어린애들 노동착취로 만든 커피만 먹어라.

Tmax Windows 제품군 소개

이미 기업용 솔루션 시장에서 다져온게 있기 때문에 다양한 요소들이 필요한 개인용 OS 개발이 가능했다. 무슨무슨 프레임웍이 이렇게 저렇게 임베디드 어쩌구 앱스트랙션 레이어가 쿨럭쿨럭 시바 하나도 못알아듣겠어;;

Feature1: Tmax Window 소개

그리하여 대망의 OS 데모..하기 전에 또 지루한 PT가 시작된다. 이 세션의 화두는 '호환성'. UNIX 실행파일도 실행하는 막강한 기능을 자랑한다는데 좀 오버스펙인거 같기도..; 나라면 되게 자랑했을꺼 같은데 실제로 윈도우에서 UNIX 바이너리가 돌아가는건 보여주지 않았다. PT에서는 세세한 구현 내용들을 설명하는데 노량진 OS 단과반에 온줄 알았다. 다 놀라운 기능들이긴 한데 정말 구현이 되었는가에 대한 의문은 풀어주지 않았다. 안정성을 위해 Windows와는 다르게 마이크로 커널 구조를 사용했고(학교다닐땐 Windows NT 커널은 마이크로 커널이라고 배웠던거 같은데..) 효과적인 데이터 관리를 위해 Tmax의 DBMS인 Tibero를 내장했다고 한다. 기억이 정확하진 않지만 파일시스템에 적용했다고 하는거 같았는데 DB를 통한 장애 복구 그런게 가능하다고 한다. 근데 보통 파일시스템보다 DB 장애가 더 빈번하지 않음?;

데모에서는 간단한 작업 몇개만 보여주고 빨리 끝내서 오히려 의구심을 들게 한.. 사용자들의 거부감을 없애기 위해 친근한 윈도우즈 UX를 기본으로 사용하고 일부 특허가 있는 부분은 잘 피해가서 문제가 없다고 했다(자랑이다;). 자체 개발한 미디어 플레이어로 소녀시대 뮤직비디오를 틀어줬는데 재생 속도가 빨라 헬륨끼 있는 목소리로 들린건 기분탓으로 치자. MS 워드를 띄워 문서편집하는걸 보여줬는데 바탕화면에 같은 파일명을 가진 워드 임시파일이 두 개가 생겼다!? IE6도 잘 돌아간다고 띄워졌는데 워드도 그렇고 시스템 크롬이 어딘가 어색하게 적용되거나 깨진 것 처럼 나오고 IE는 화면에 줄이 죽죽 가서 그리 잘 돌아간다고 볼 수는 없었다. 스타크래프트를 실행했는데 로딩이 심하게 오래 걸렸고 게임 진행도 많이 느렸다. 같이 가셨던 분의 말로는 Wine에서 스타 돌리면 딱 저 모습이라고..; 뭔가 그래픽 디바이스 드라이버가 제대로 돌고 있지 않다는 느낌.. 워드에서도 스플래시 스크린의 글자가 깨지고 편집화면에 지저분한 잔상이 있는걸로 보아 그래픽 출력 부분이 아직 완벽하진 않은 것 같다. 개인적으로 제일 궁금했던 지뢰찾기도 베껴넣었나 하는 의문은 밝혀지지 않았음.

그리고 내장 캡쳐 프로그램이 잘 돌아가는걸로 봐서 며칠 전 있었던 스샷 포샵 조작 사건은 마케팅 부서의 지독한 귀차니즘일 가능성이 높은 듯.

Coffe Break & Networking

수 개월간 담배를 끊었던 직장 동료가 담배를 피웠다..

Feature2: Tmax Office, Tmax Scoutor 소개 - 수석 이장원

이 세션의 화두는 '친숙한 UX'. 여러가지 파일포맷을 모두 지원하는게 얼마나 힘든지 한참 설명한 후 데모를 했는데 초점은 'MS 오피스 랑 완전 똑같이 나오는데 혼신을 다했음' 이었다. 정말 장점이라고는 저렴한 가격 밖에 없는건가? 오피스랑 똑같으니 데모처럼 일상 작업에서도 돌아만 간다면 완성도 면에서 훌륭하다고 할 수 있겠지만 제품의 기능을 카피해서 싸게 내놓는 것, 우리가 중국도 아니고 무슨 의미가 있나 하는 생각이.. 게다가 완벽하게 같지는 않아서 프로포인트같은 경우 도형 안에 글자가 몇픽셀 아래로 떨어져 있다던가 하는 식으로 파워포인트의 화면과 미묘하게 다르다. 전체적으로 프로그램들 디자인은 영 구린 편이다. 베끼려면 오피스 2007을 베낄 것이지..

그리고 제일 벙쪘던건 이 데모를 티맥스 윈도우가 아닌 Windows XP에서 했다는 것. 출시 이전에 돌던 루머중에 스카우터 개발팀이 Tmax Window를 한번도 못봤다 뭐 그런 말이 있었는데 진짜일꺼 같기도 하다; 자체 개발했다고 하는 스카우터 브라우저는 꽤 심플한 UI에 빠른 속도를 보여주었다. Acid1/2 패스하고 Acid3 에서 99점 받았다고 하는데 WebKit 엔진 가져다 쓰면서 국내 웹사이트들의 호환성 문제로 1점을 포기하고 호환성을 유지하는 기술적 결단을 내렸다고 한다. 여러 사이트들이 어떻게 나오는지 보여줬으면 좋을텐데 주구장창 ActiveX가 잘 돌아간다는 내용만 나왔다. 아니 XP에서 ActiveX 당연히 잘돌아가지 그럼;;

축하 공연

당연히 티맥스가 와서 노래부를 줄 알았는데 오지 않았다; 이름모를 비보이들의 공연이랑 바비킴+부가킹즈, 그리고 윤하가 노래불렀음. 아흥 쪼그만게 노래를 어쩜 그리 잘불러♥ 윤하가 거위의꿈 부르는 동안 미리 준비한 티맥스의꿈;이 영상으로 흘러나왔다. 개발자 여러분들 고생 많았어요 흙

경품 추첨

1. 삼성 넷북, 2. 위핏 세트, 3. 아이팟 터치 8G.. 뭔가 규모에 비해 경품 규모가 짭쪼름한 듯?


계속 까는 내용 뿐이었지만 그래도 국산 OS는 나왔으면 좋겠다. 그 어려운 시작을 해준 Tmax에게는 고마울 따름이지만 사람들이 궁금해 하는 오픈소스 차용이나 실제 구현 내용 등에 대해서 더이상은 뻔한 거짓말로 일관하지 않았으면 좋겠다. 황우석이 기술력이 없어서 까인게 아니잖아. 11월 1일에는 반드시 출시될꺼고 그 전에 다운로드 해서 테스트 할 수 있겠다고 회장이 그러던데 쓸데없이 개발자들 쪼아서 제품 망치지 말고 차근차근 진행해서 좋은 제품 만들기를 바란다. 지금 이만큼 만든 것만 해도 대단한 일이라고 봐. 모두 응원하는 가운데 만들어도 힘든 일인데 굳이 안먹어도 될 욕 먹으며 만들 이유 없지. 빌게이츠 초청했다고 기사난걸 보면서 개발자들이 무슨 마음이 들겠냐.

좀 잘하자 티맥스!

'컴퓨터 얘기 > 시시한얘기' 카테고리의 다른 글

TmaxDay 2009  (5) 2009/07/07
EPSON R230 프린터  (8) 2006/04/01
스팸 리퍼러의 재습격  (22) 2006/03/13
Gmail Mobile  (11) 2005/12/20
그분이 오셨어요..  (13) 2005/09/20
인터페이스 혁신, AJAX 기술 실전 워크샵  (7) 2005/09/15
태그 : Windows

Read Me 플러그인

구글 리더설정 » 추가기능 메뉴에 가보면 '다음'이라는 링크가 있고 이걸 즐겨찾기에 추가해서 클릭하면 리더의 안읽은 글을 하나씩 꺼내 포스트를 보여준다. 꽤 편리한 기능이라 구글 리더를 본격적으로 써보려고 RSS들을 등록하고 정리를 열심히 해봤으나 리더 자체가 꽤 느리고 꺼내오는 글이 시간 역순 정렬이 아니라 GG. 그냥 텍큐 리더에 이런 기능을 넣는게 낫겠다 싶어서 한참을 부비작거려 나온 물건이 바로 이놈.

설치한 다음 플러그인 환경설정 창을 열면 '피드 보기'라는 링크가 있는데 이걸 즐겨찾기에 추가해서 쓰면 된다. '로그인을 해야 사용할 수 있게 합니다'로 설정하면 처음 누를때 로그인해야 쓸 수 있으니 결벽증이 있으신 분들은 이쪽을 쓰시고 나머지 분들은 링크가 노출되지 않도록 주의해서 사용하면 됨. 더이상 읽을게 없으면 이상한 페이지가 나와요.

내경우엔 이걸 WebMa 플러그인으로 만들어놓고 마우스 제스쳐에 등록해서 ㄱ자를 그리면 포스트가 하나 튀어나오도록 해놨는데 일하다가 딴짓하기 매우 좋다.

'컴퓨터 얘기 > 프로그래밍' 카테고리의 다른 글

iPhone 에서 OAuth 라이브러리 사용하기  (7) 2010/03/05
Read Me 플러그인  (3) 2007/12/07
드림위버와 이별하기  (5) 2007/11/28
MySQL Foreign Key 바보짓  (6) 2007/04/09
TinyMCE 플러그인 - WikiExporter  (5) 2007/02/07
멜론 앨범 커버 다운로더  (20) 2007/02/04

드림위버와 이별하기

소스 저장소로 SVN을 쓰고 로컬 하드디스크에 이 소스를 다운로드해 수정한 다음 원격의 개발서버에 FTP 등으로 즉각 업로드해 테스트하고 로컬에서 TortoiseSVN 등을 이용해 소스를 커밋해 완료한다. 웹개발 하는 일반적인 방법에서 크게 벗어나는건 없지 않나 싶은데도 이렇게 작업하는 사람들은 그리 많지 않나보다. 작업하는 PC에 개발에 필요한 서버들을 세팅해서 작업하고 실제 서버와 비슷한 환경에서의 개발하는 사람들이 가장 많아보이는데 그래도 실서비스와 최대한 같은 환경에서 개발하는게 배포했을때 이기종간의 미묘한 삑사리를 줄여줄 수 있는 방법이라고 아직까지는 생각된다.

그래서 이런 환경에서 어떤 에디터나 IDE를 쓰는게 가장 편하냐고 하면 우울하게도 드림위버 말고는 쓸만한게 없다. 이놈을 써야하는 거의 유일한 이유는 PC의 디렉토리와 원격 FTP 사이트의 디렉토리를 매칭시켜서 파일을 수정하면 바로바로 업로드 해주는 에디터라는건데 지금까지도 이런일을 해주는 에디터를 계속 찾아봤지만 드림위버처럼 깔끔하게 처리해주는 에디터는 없는 것 같다. 에디트플러스 같은 에디터는 여러 파일 작업하기도 불편하거니와 원격이나 로컬 한쪽의 파일만 수정 가능해서 쓸 수 없고 이클립스는 FTP 사이트와 로컬 디렉토리간이 매칭은 가능하지만 실시간 저장이 안되고 양쪽의 변경된 파일을 Sync 해주는 기능만 있는데 이래가지고서야 파일 수정 한번하고 한세월 기다려야 하니 역시 곤란하다. (rsync를 이용해 업로드하는게 차라리 빠르다. Ant를 이용해 빌드 파일 만들어놓고 단축키에 걸어서 while(!퇴근) { 수정하고; 저장하고; sync; 확인하고; } 하면 원츄라고 함)

그런 이유로 드림위버를 떠나고 싶어도 떠날수 없던 세월 가운데..

그나마 가장 가능성 높은 대안이었지만 불안정하고 무겁고 어렵다는 이유로 눈밖에 있던 Aptana를 다시 테스트해봤는데 이제는 주력 개발툴로 사용해도 별 문제가 없을 정도로 안정되어졌고 결정적으로 드림위버의 'Upload file on save' 기능을 간접적으로나마 지원하기 시작했다. 벌써 한참 전에 이런 기능의 요구가 있었고 Eclipse Monkey(Aptana Monkey?) 플러그인을 통해 Save command가 일어날때 Upload가 이루어지도록 할 수 있게 됐다. (메뉴의 Save를 클릭하거나 CTRL-S를 누를때만 실행이 돼서 나처럼 ALT-F,S로 저장하는 사람은 살짝 불편할 수 있다.)

PHP 개발환경에 있어서는 이클립스에 PDT 깔아서 쓰는거보다는 못하지만 드림위버에 비하면야 많이 좋다. 좀 무거운거야 드림위버 살돈으로 좋은 CPU와 메모리를 사서 해결하면되..나?; 이클립스가 베이스인만큼 Subclipse나 Mylyn 같은거 쓰면 근사하지만 좁은 화면에 그런거 구겨넣어서 딱히 좋은점도 모르겠고 느려지기만 하는거 같아서 Aptana 기본 환경에 PHP 에디터만 추가해서 쓰는게 제일 좋은것 같음. 단축키도 일반적인 윈도우 어플들과는 좀 다른면이 있고 기본적으로 워드랩도 안되는 등의 자잘한 태클들이 많지만 그나마 이게 어디야..

Aptana Logo

사실 Aptana의 강점은 JS/RIA 개발과 디버깅에 매우 강하다는 거지만 그냥 firebug와 alert()이 익숙해요..;;

'컴퓨터 얘기 > 프로그래밍' 카테고리의 다른 글

iPhone 에서 OAuth 라이브러리 사용하기  (7) 2010/03/05
Read Me 플러그인  (3) 2007/12/07
드림위버와 이별하기  (5) 2007/11/28
MySQL Foreign Key 바보짓  (6) 2007/04/09
TinyMCE 플러그인 - WikiExporter  (5) 2007/02/07
멜론 앨범 커버 다운로더  (20) 2007/02/04

MySQL Foreign Key 바보짓

DROP TABLE IF EXISTS testChild;
DROP TABLE IF EXISTS testParent;

CREATE TABLE testParent (
    id INT NOT NULL,
    PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE testChild (
    id INT NOT NULL,
    parentId INT DEFAULT NULL,
    PRIMARY KEY(id),
    KEY parentId(parentId),
    CONSTRAINT testFKey FOREIGN KEY(parentId) REFERENCES testParent(id)
        ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO testParent VALUES(1);
INSERT INTO testChild VALUES(1, 1);

ALTER TABLE testChild MODIFY parentId INT NOT NULL;

DELETE FROM testParent WHERE id = 1;

MySQL 5.0에서는 마지막 DELETE문을 실행할때 mysql이 crash 되고 4.1에서는 testChild 테이블에 (1, 0) 값이 남게 돼 foreign key constraint가 깨지게 된다. 아놔 이자식 때문에 반나절을 삽질했;;

'컴퓨터 얘기 > 프로그래밍' 카테고리의 다른 글

Read Me 플러그인  (3) 2007/12/07
드림위버와 이별하기  (5) 2007/11/28
MySQL Foreign Key 바보짓  (6) 2007/04/09
TinyMCE 플러그인 - WikiExporter  (5) 2007/02/07
멜론 앨범 커버 다운로더  (20) 2007/02/04
Crizin.HTTPRequest.php  (8) 2007/02/03

TinyMCE 플러그인 - WikiExporter

회사에서 생성되는 문서의 많은 부분은 Trac의 위키로 관리된다. 장점이 많지만 문서의 길이가 길어지기 시작하면 위키 코드만 보고는 편집하기 어려운 것도 사실이다. 좀 분량이 되는 문서를 Google Docs에서 만들었다가 위키로 옮길 일이 있어 예전에 만들다 말았던 위키도우미;;를 끄집어내 TinyMCE 플러그인으로 만들었는데 어지간히 복잡한 문서 말고는 그럭저럭 나와주는 것 같다. 덕분에 집에 일찍 갔다-_-

다운로드 : WikiExporter.1.0.zip (6.02KB)

그림에 보이는 것 처럼 원본은 Google Docs나 드림위버나 MS워드같은 HTML 편집이 가능한 곳에서 작성하고 TinyMCE 편집화면에 붙여넣은 후 왼쪽 위에 있는 빨간 W 버튼을 누르면 HTML 코드를 변환해준다. 문서가 지나치게 길면 컴퓨터가 폭발할 수도 있으니 주의..

TinyMCE를 다운로드 받아 플러그인을 설치해서 써도 되고 (어디 업로드 하지 않고 그냥 PC에서 바로 실행해도 된다) 귀찮은 사람은 이 쪽을 이용해도 된다.

'컴퓨터 얘기 > 프로그래밍' 카테고리의 다른 글

드림위버와 이별하기  (5) 2007/11/28
MySQL Foreign Key 바보짓  (6) 2007/04/09
TinyMCE 플러그인 - WikiExporter  (5) 2007/02/07
멜론 앨범 커버 다운로더  (20) 2007/02/04
Crizin.HTTPRequest.php  (8) 2007/02/03
preg 계열 함수들의 버그?  (10) 2006/08/21

멜론 앨범 커버 다운로더

앞선 Crizin.HTTPRequest.php의 활용 예.

D2 재생모습

D2에서는 각 MP3 파일마다 같은 이름을 가진 JPG 이미지를 넣어놓으면 노래를 재생할때 옆에 같이 보여주는데 멜론 인기곡 Top100 같은걸 다운받아 넣고 각 앨범 커버를 손으로 하나씩 넣어주자면 굉장한 노가다를 해줘야 한다. 이 과정을 간단히 줄여주는 스크립트가 바로 이 녀석.

다운로드 : melon.zip (2.11MB)

압축풀고 auto.bat(이 파일명 정말 좋아;;)를 실행하면 covers 디렉토리를 만들고 오늘의 차트 종합순위 Top100에 해당하는 앨범 커버를 다운로드 한다. 에픽 하이-17-Fan.jpg 같은 이름으로 만들어주기 때문에 대부분의 경우는 멜론에서 받은 DCF 파일이 들어있는 곳에 같이 넣어주기만 하면된다. 가끔씩 에픽 하이-17-Fan.jpg 처럼 트랙번호가 어긋나는 경우가 있는데 멜론 앨범정보가 이상하게 들어있어서 이건 어쩔 수 없음. 몇개 안되니 손으로 고쳐주자;; 또 타이푼-01-기다릴게....jpg 처럼 제목이 마침표로 끝나는 경우에는 D2에서 제대로 앨범 커버 인식을 못하는 것 같으니 DCF, JPG 양쪽 모두 ...을 제거해줘야 한다.

오늘의 Top100이 아니고 주간, 월간 차트의 곡을 받고싶거나 종합순위 말고 가요, 팝 등의 개별 장르 차트를 다운로드 하고 싶으면 src 디렉토리의 melon.php 파일을 메모장으로 열어 앞부분을 약간 수정해줘야 한다.

melon.php 수정화면

공장 출하값(..)은 오늘의 종합차트로 맞춰져있고 이걸 월간 클래식 차트로 바꾸고 싶다면 8번째줄 맨 앞에다 //를 넣어주고 10번째의 //를 제거하고 같은 방법으로 14번째줄에 //를 추가, 19번째줄의 //를 제거하면 된다.

php.exe도 포함돼있고 해서 거시기한 문제가 될 수도 있으니 다른곳으로의 펌/업로드는 삼가해주시기를..

'컴퓨터 얘기 > 프로그래밍' 카테고리의 다른 글

MySQL Foreign Key 바보짓  (6) 2007/04/09
TinyMCE 플러그인 - WikiExporter  (5) 2007/02/07
멜론 앨범 커버 다운로더  (20) 2007/02/04
Crizin.HTTPRequest.php  (8) 2007/02/03
preg 계열 함수들의 버그?  (10) 2006/08/21
IE 6.0의 버그들  (7) 2006/08/11

Crizin.HTTPRequest.php

예전에 웹브라우저를 에뮬레이트 하는 간단한 PHP 클래스를 만든적이 있었는데 회사에 들어온 뒤 파파챠님이 만드신 태터툴즈용 HTTPRequest 클래스에 감명을 받아;; 전체적인 모습을 그 것과 비슷하게 발전시켜왔다. 2년넘게 이걸로 다양한 짓거리들을 하며 써오고 있는데 마지막 버전업이 작년 여름인걸 보니 이제 될건 다 되겠다 싶어 공개. Snoopy같은 라이브러리와 많이 비슷한데 필요한 기능들을 집어넣다보니 꽤 다르게 됐다. 이걸 가지고 할 수 있는 일은 A 게시판을 RSS로 만들어 구독한다던가 B 갤러리에 새 사진이 등록되면 하드에 저장한다던가 브라우저로는 접근하기 어려운 C 사이트의 뒷구멍으로 뭔가를 날리는 등등의 다양한 노가다성 작업이 가능하다.

다운로드

Download from GoogleCode

Simple tutorial

<?
    require 'Crizin.HTTPRequest.php';

    // Create instance
    $h = new HTTPRequest('www.foo.com');
    // Turn on debug mode (request/response streams will be print)
    $h->debug(true);
    // Setting 'PATH'
    $h->setPath('/');
    // Request by GET method
    $h->send();
    // Get responsed informations
    $responseText = $h->responseText;
    $contentType = $h->getResponseHeader('Content-Type');

    // Let's try to another host into 8080 port
    $h->open('www.bar.com', 8080);
    // Path and GET parameter string
    $h->setPath('/accept.php?mode=login&and=more');
    // Send around proxy server
    $h->setProxy('www.proxy.com', 8888);
    // Modify 'User-Agent' header
    $h->setRequestHeader('User-Agent', 'Gozilla/1.0');
    // Import from cookie string
    $h->importCookie('COOK1=foo; COOK2=bar;');
    // Set cookie
    $h->setCookie('cook', 'something');
    // Request by POST method
    $h->send('param1=value1&param2=value2');
    // Get cookie
    $sessionId = $h->getCookie('PHPSESSID');

    // Download image
    $h->setPath('/images/logo.gif');
    // Login with apache authorization
    $h->authorization('myId', 'myPassword');
    // Hide 'User-Agent' header
    $h->removeRequestHeader('User-Agent');
    // Response content will be saved in './save'
    $h->saveToFile('./save');

    // Upload some files
    $h->setPath('/write.php');
    // <input type="file" name="image" value="/files/blah.gif"/> and rename to 'myImage.gif'
    $h->attachFile('image', './files/blah.gif', 'myImage.gif');
    // Request
    $h->send();

    // Test some text exists in $responseText or not
    $result = $h->existText('OK') ? 'Succeed' : 'Failed';
    // Get all text fragments was surrounded by '<td>' and '</td>' (array will be return)
    $result = $h->getAllTextFragments('<td>', '</td>');
    // Get 5th text only (string will be return)
    $result = $h->getTextFragment('<td>', '</td>', 5);
?>

'컴퓨터 얘기 > 프로그래밍' 카테고리의 다른 글

TinyMCE 플러그인 - WikiExporter  (5) 2007/02/07
멜론 앨범 커버 다운로더  (20) 2007/02/04
Crizin.HTTPRequest.php  (8) 2007/02/03
preg 계열 함수들의 버그?  (10) 2006/08/21
IE 6.0의 버그들  (7) 2006/08/11
태터툴즈 1.0.5 플러그인  (58) 2006/05/09

preg 계열 함수들의 버그?

preg_match('/(.)*/', str_repeat('x', 20000), $matches);

PHP에서 위 명령을 실행하면 $matches 변수에 아래와 같은 값이 들어가야 정상이지만,

array(2) {
   [0]=>
   string(20000) "xx...xx"
   [1]=>
   string(1) "x"
}

Segmentation fault를 내고 죽어버리는 경우가 있다. 이유는 아직 이해불가; 20000번의 매치 과정중 두번째 원소에 계속 x를 저장하는 과정에서 메모리가 빵꾸나는게 아닐까 하는 생각이 들지만 캡쳐기능이 없는 괄호 (?:.)*를 사용해봐도 역시 죽어버린다. ereg 계열 함수는 제대로 실행이 되는걸 보면 preg 함수가 삽질하고 있는게 맞는 것 같다. preg_replace(), preg_match_all() 등 모든 함수에서 동일한 결과가 나오며 PHP 4.4.1, 5.1.4에서 이런 증상을 보였다.

좀 복잡하다 싶은 정규식은 극한 상황의 테스트를 꼭 해볼 것;

'컴퓨터 얘기 > 프로그래밍' 카테고리의 다른 글

멜론 앨범 커버 다운로더  (20) 2007/02/04
Crizin.HTTPRequest.php  (8) 2007/02/03
preg 계열 함수들의 버그?  (10) 2006/08/21
IE 6.0의 버그들  (7) 2006/08/11
태터툴즈 1.0.5 플러그인  (58) 2006/05/09
태터툴즈 방문자 그래프 플러그인  (9) 2006/03/22