컴퓨터 얘기 : 해당되는 글 136건

2010/03/05 >> iPhone 에서 OAuth 라이브러리 사용하기 (2)
2009/12/12 >> 내가 쓰는 아이폰 어플들 (4)
2009/07/07 >> TmaxDay 2009 (5)
2007/12/07 >> Read Me 플러그인 (3)
2007/11/28 >> 드림위버와 이별하기 (5)
2007/04/09 >> MySQL Foreign Key 바보짓 (6)
2007/02/07 >> TinyMCE 플러그인 - WikiExporter (5)
2007/02/04 >> 멜론 앨범 커버 다운로더 (20)
2007/02/03 >> Crizin.HTTPRequest.php (8)
2006/08/21 >> preg 계열 함수들의 버그? (10)
2006/08/11 >> IE 6.0의 버그들 (7)
2006/05/09 >> 태터툴즈 1.0.5 플러그인 (58)
2006/04/01 >> EPSON R230 프린터 (8)
2006/03/22 >> 태터툴즈 방문자 그래프 플러그인 (9)
2006/03/13 >> 스팸 리퍼러의 재습격 (22)
2005/12/20 >> Gmail Mobile (11)
2005/10/04 >> 태터툴즈에 FTP로 첨부파일 올리기 (11)
2005/09/20 >> 그분이 오셨어요.. (13)
2005/09/15 >> 자바스크립트에서 문자열을 합치는 방법 (2)
2005/09/15 >> 인터페이스 혁신, AJAX 기술 실전 워크샵 (7)
2005/09/13 >> 태터툴즈 + BBClone의 10원짜리 팁 (5)
2005/09/13 >> 태터툴즈 답글 + 기타등등을 RSS로 (21)
2005/09/06 >> 나우누리 재가입 (16)
2005/08/31 >> 결국 Gmail로 정착 (20)
2005/08/23 >> Standalone Internet Explorer (4)
2005/08/16 >> Konfabulator Widget 만들기 (26)
2005/08/16 >> 태터툴즈 답글 삭제부분 수정 (8)
2005/08/15 >> 태터툴즈 0.96 위치로그 업데이터 (9)
2005/08/13 >> 태터툴즈 0.96용 노가다 유틸 (5)
2005/08/12 >> 태터툴즈용 간단한 통계 그래프 (9)

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 라이브러리 사용하기  (2) 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)
플래시 게임의 아이폰 버전.

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

내가 쓰는 아이폰 어플들  (4) 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 라이브러리 사용하기  (2) 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 라이브러리 사용하기  (2) 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

IE 6.0의 버그들

1. letter-spacing 문제

자간을 줄이는 CSS 속성인 letter-spacing을 -1px 정도로 주면 글자가 다닥다닥 붙어 정돈되고 아기자기한 느낌을 준다. 이 속성을 썼을때 일어날 수 있는 문제중 잘 알려진 것 중 하나는 특정한 코드와 섞여있을때 br 태그를 두번 입력해야 줄바꿈이 되는 문제가 있다. 그리고 어제 gendoh님이 발견한 새로운 버그는 꽤 재밌다.

<html>
   <head>
       <style type="text/css">
           body { letter-spacing: -1px; }
       </style>
   </head>
   <body>
       <br/><br/><br/><br/><br/><br/><br/>
       <br/><br/><br/><br/><br/><br/><br/>
       <br/><br/><br/><br/><br/><br/><br/>
       <br/><br/><br/><br/><br/><br/><br/>
       <br/><br/><br/><br/><br/><br/><br/>
       <div style="float: left">A</div>B
   </body>
</html>

View example

위에 줄바꿈이 주루룩 있으면 저 코드에서 B가 A를 잡아먹어버린다. div 태그 안에 이미지나 기타 등등 아무리 거대한놈이 있어도 화면에는 표시되지 않는다. 더 재밌는건 위에 br 태그의 개수를 늘이거나 줄이면 이 버그는 사라진다. tistory 새 스킨 QA 과정에서 우연히도 엔터를 35번 눌러 버그를 발견한 gendoh님께 박수;

2. 잘못된 ul 태그 렌더링 문제

이건 HTML이 잘못된 문법으로 작성된 거지만 IE의 처리가 깔끔하지 못했다. 역시 tistory 새 스킨에서 ul/li 태그로 구성한 코멘트 부분이 스크롤 할때마다 배경색이 깨져버리는 문제가 있었는데 처음엔 li 태그의 padding 때문인줄 알았지만 나중에 보니 근본적인 원인은 잘못 들어간 a 태그때문에 생긴 문제였다. (어제는 li 태그의 아래쪽 padding 값을 0으로 했더니 문제가 사라져서 그냥 넘어갔음;)

<html>
   <head>
       <style type="text/css">
           li { padding-top: 8px; background-color: #aaa; }
       </style>
   </head>
   <body>
       <ul>
           <a id="anchorHere"></a>
           <li><div>-_-</div></li>
           <a id="anchorHere"></a>
           <li><div>-_-</div></li>
           ...
           <a id="anchorHere"></a>
           <li><div>-_-</div></li>
       </ul>
   </body>
</html>

View example

위 예제 페이지를 열어서 스크롤바를 잡고 위아래로 천천히 이동해보면 li 태그의 배경색이 찢어지는 현상을 볼 수 있다. 이 현상은 브라우저 크기를 작게 할 수록, 스크롤 속도를 느리게 할 수록 잘 볼 수 있다.

3. design mode scrolling 문제

태터툴즈 위지윅 에디터에서 아래쪽 커서키를 계속 누르면 화면 끝에서 더이상 스크롤 되지 않는 버그가 있었다. 이렇게 브라우저가 후져서 생기는 버그는 여러가지 원인이 누적돼 하나의 현상으로 터져버리는 경우가 많은데 이 경우는 에디터 영역의 줄간격을 150%에서 163%로 바꿔서 해결했다. 비슷한 상황을 간단히 재현해보면 아래와같은 경우도 있다.

<html>
   <head>
       <style type="text/css">
           div { float: left; width: 200px; }
           iframe { width: 100%; }
       </style>
       <script type="text/javascript">
           window.onload = function() {
               var document1 = document.getElementById("Frame1").contentWindow.document;
               var document2 = document.getElementById("Frame2").contentWindow.document;
               document1.designMode = document2.designMode = "on";
               var html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><style type="text/css">body { font: 12px/1.5 Dotum, Sans-serif; }<\/style><\/head><body>1<br/>2<br/>3<br/>4<br/>5<br/>6<br/>7<br/>8<br/>9<br/>10<br/>11<br/>12<br/>13<br/>14<br/>15<br/>16<br/>17<br/>18<br/>19<br/>20<br/><\/body><\/html>';
               document1.open("text/html", "replace");
               document1.write(html);
               document1.close();
               document2.open("text/html", "replace");
               document2.write(html);
               document2.close();
           }
       </script>
   </head>
   <body>
       <div>
           <iframe id="Frame1"></iframe>
       </div>
       <div>
           <iframe id="Frame2"></iframe>
           <table style="margin-top: 3px"></table>
       </div>
   </body>
</html>

View example

예제에 보이는 두개의 iframe중 첫번째 프레임은 정상이고, 두번째 프레임은 아래 방향키를 계속 눌러보면 스크롤되지 않고 화면 끝에서 첫번째 줄로 커서가 점프한다-_- 해결하려면 iframe 아래에 있는 테이블의 위쪽 마진을 없애거나 줄간격을 바꾸거나 iframe document의 DOCTYPE을 제거하는 등의 다양한 방법이 있다.

4. IE를 다운시키는 코드

열기만 해도 IE가 다운되는 HTML 코드가 있다. 내가 알고 있는건 아래 두가지인데,

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <body>
       <table style="table-layout: fixed">
       <col width="10"></col>
   </body>
</html>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
   <body>
       <table>
       <tr>
           <td>
               <table style="table-layout: fixed">
               <col width="10"></col>
               <col width="10"></col>
               </table>
           </td>
       </tr>
       </table>
   </body>
</html>

예전에 tattertools.com 메인 페이지는 두번째 코드가 포함돼 있었다. 가운데 있는 테이블에 내용이 반복해서 들어가게 되는데 어느날 DB가 살짝 맛이 가서 <tr>...</tr> 부분이 쏙 빠져버려 위와 같은 모습이 돼버렸다. 당연히 tattertools.com을 방문하는 대부분의 사람은 브라우저가 죽어버리는 경험을 할 수밖에 없었다; 궁금하신 분은 작업중이던거 다 저장하고 아래의 링크를 눌러보면 된다.

View example1 View example2 (주의 : 브라우저가 다운될 수 있습니다)

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

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
태터툴즈에 FTP로 첨부파일 올리기  (11) 2005/10/04
태그 : Tip

태터툴즈 1.0.5 플러그인

태터툴즈 1.0.5 릴리즈에 맞추어 만든 플러그인 4종세트.. 당연히 1.0.5 이상에서만 동작하며 각 플러그인들의 라이선스는 GPL에 따르니 더 좋게 고쳐서 나눠쓰세요..;

로봇의 방문횟수 제외 [Download - ExcludeRobotsCounter.zip]

기능
많이 알려진 로봇의 이름을 미리 입력해서 로봇이 방문했을때는 방문자 카운터를 증가시키지 않는다.
설명
플러그인 관리자 화면에서 플러그인을 활성화 시키면 동작한다. 봇의 이름을 추가하거나 삭제할때는 index.php 파일을 열어 $robots 배열에 봇의 이름을 편집해주면 된다. 추후에 User-agent 필터링 기능이 추가되기 전까지 임시로 사용되는 플러그인.

피드버너 리다이렉터 [Download - FeedBurnerRedirector.zip]

기능
태터툴즈의 RSS 주소로 접속하면 피드버너의 피드 주소로 이동시켜준다. 스킨의 [##_rss_url_##] 치환자도 피드버너의 URL로 바뀐다.
설명
사용하는 블로그 식별자가 crizin 이라면 http://feeds.feedburner.com/crizin 주소로 이동된다. 블로그 식별자와 피드버너 ID가 다른 경우에는 index.php 파일 10번째줄의 "http://feeds.feedburner.com/{$blog['name']}" 부분을 "http://feeds.feedburner.com/xxxxxx" 같이 변경해줘야 한다. 피드버너 설정에서 Original Feed 주소는 http://crizin.net/rss 같이 원래 RSS 주소를 입력해두면 된다.

전체피드 읽어오기 [Download - GetEntireFeed.zip]

기능
네이버의 모든 블로그, 이글루스의 블로그중 피드 부분공개를 선택한 블로그에 대해 본문 전체를 보여준다.
설명
플러그인을 활성화 시키면 피드가 업데이트 될때마다 직접 블로그에 접속해 본문을 읽어와 RSS의 본문 대신 저장하게 된다. 따라서 피드 업데이트 속도가 느려질 수 있으며 특이한 스킨을 사용하는 이글루스 블로그에 대해서는 본문을 제대로 읽어오지 못할 가능성도 있다.
주의
부분공개된 피드의 전문을 강제로 읽어와 리더에 저장하는건 블로거의 의도에 반하는 행동이 될 수 있다. 개인적인 편의가 아닌 다수에게 서비스를 제공하는 블로그에서 이 플러그인을 사용하는건 문제의 소지가 될 수 있음에 주의할 것.
변경내역
1.0.1 - 네이버의 글에서 이미지에 달려있는 onload 이벤트를 제거해서 스크립트 오류가 뜨지 않게 함
1.0.2 - 파란의 RSS도 지원 (포스트 하나 가져오려면 두번 접속을 해야해서 매우 느림)
1.0.3 - 네이버 블로그 출력부분 변경사항 반영
1.0.4 - 파란 블로그 출력부분 변경사항 반영
1.0.5 - 네이버 블로그 출력부분 변경사항 반영, 이글루스 포스트는 무조건 읽어오도록 수정

리퍼러 로그 정리 [Download - RefererURLBeautifier.zip]

기능
통계보기 » 리퍼러 통계를 봅니다 메뉴에서 리퍼러 로그를 읽기 쉽게 바꿔주고 검색어가 포함된 경우 검색어를 눈에 잘 띄게 표시해 준다.
설명
리퍼러를 저장하는 공간(255bytes)의 제약으로 인해 매우 긴 URL의 경우 한글이 깨지는 등의 문제가 있을 수 있다. 그리고 index.php 파일의 15번째줄 맨 앞의 //를 제거하면 각 도메인의 favicon을 불러다 표시해준다.
변경내역
1.0.1 - Eolin.com 검색어 표시가 안되는 문제 수정
1.0.2 - Baidu.com 검색어 표시가 안되는 문제 수정
1.0.3 - %uXXXX 형식의 문자 해석해서 보여주도록 수정
1.0.4 - http://images.google.co.kr 등에서 유입되는 검색어가 제대로 추출되지 않는 문제 수정

EPSON R230 프린터

95년에 첫 컴퓨터를 살때 같이 산 레이저 프린터의 토너가 바닥나면서 (토너가 단종된 관계로) 프린터라는 기기와는 계속 별거중이었는데 요즘 프린터의 필요성이 커져서 큰맘먹고 하나 지르게됐다. 컬러인쇄가 필요하니 레이저는 어렵고 저렴한 잉크젯으로 알아봤는데 다나와에서 인기상품순 정렬해놓고 훑어보니 엡손 R230에 무한잉크 쓰면 쵝오라고 한다.

무한잉크?

써도써도 바닥나지 않는 무한대의 용량을 가진 카트리지를 떠올렸는데 그런게 있을리는 없고.. 찾아보니 외부에 별도 잉크 탱크를 연결해서 카트리지로 끊임없이 잉크를 공급해주는 장치라고 한다. 잉크가 떨어지면 외부 탱크에 잉크를 부어주기만 하면 되니 리필이 간편하고 가격면에서는 90% 절감효과가 있다고 한다. 대충 계산해보니 정품 카트리지 6개가 20ml * 6 = 120ml 용량에 7.8만원정도 하고 무한잉크 카트리지 6개 한세트는 100ml * 6 = 600ml 용량에 7.2만원이니 잉크값만 따지면 대충 80%정도 절약되는 것 같다. 세상참 좋아졌네..;

무한잉크 설치모습

이렇게 외부에 대용량 잉크를 연결해서 쓴다

아직 제대로 테스트는 못해봤지만 사용해본 사람들의 말로는 최적의 환경에서 최고급 용지에 출력하면 인터넷 인화소에서 출력하는것과 동급으로 출력이 가능하다고 한다. 일반적인 출력 상황에서는 속도도 빠르고 색깔도 잘 나와줘서 만족.. 프린터값도 10만원정도라 크게 고민하지 않고 지를 수 있다. (무한잉크는 8-9만원정도)  무한잉크 제작 업체가 꽤 많아서 선택이 힘들었는데 홈페이지가 깔끔하다는 이유로 퍼스트잉크라는 업체것을 골랐다. 다른 업체들도 비슷하긴 하지만 프린터에 설치하는 지지대 같은건 설치가 쉽지는 않았다. 잉크 튜브도 프린터 뚜껑에 눌리게 돼있어서 뭔가로 받쳐주는게 좋을 것 같음..

프린터 뚜껑을 받치고 있는 곰인형

잉크 튜브가 뚜껑에 눌리는걸 온몸으로 막고있는 곰인형씨

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

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

태터툴즈 방문자 그래프 플러그인

예전에 만들었던 태터툴즈 클래식용 그래프 프로그램을 태터툴즈 1.0.2 이상에서 쓸 수 있는 플러그인으로 제작..

대충 이런 모양으로 출력된다. 사용법은,

  1. 플러그인을 plugins 디렉토리에 설치 (그리고 환경설정에서 활성화 시켜줌)
  2. VisitorStatisticsGraph 디렉토리의 퍼미션을 707 정도로 조정 (chmod 707 VisitorStatisticsGraph)
    (그래프가 생성되지 않고 자꾸 엑박으로 뜬다면 이부분을 의심해봐야함)
  3. 플러그인의 index.php 파일을 열어서 5째줄부터 나오는 그래프 설정을 원하는 모양대로 맞춘다
  4. 스킨의 적당한 곳에 [##_VisitorStatistics_##] 이라는 태그를 삽입한다

그래프는 하루에 한번만 갱신되므로 설정값을 변경한 후에는 graph.png 파일을 삭제하고 다시 블로그 페이지를 열어서 graph.png 파일을 생성해야 한다.

스팸 리퍼러의 재습격

태터 클래식을 설치한 뒤로는 일일 몇백씩 되던 카운터에서 검색봇 등을 추려낸 담백한 카운팅을 즐기고 있는데 간혹 스팸리퍼러가 습격하는 날에는 카운터가 수백번씩 증가해 방문자 그래프를 널뛰기 시키기도 한다.

BBClone 상세기록 화면, 스팸 리퍼러가 잔뜩..

운동회도 아닌데 만국기를 쳐발라놨어..

그동안 .httaccess 파일을 이용해서 스팸으로 추정되는 단어가 포함된 리퍼러를 차단시키는 식으로 방어해왔는데 요 며칠간의 스팸 리퍼러는 공통적인 단어가 없는 난잡한 패턴이라 정규식으로 간소화할 뾰족한 방법이 없어보인다. 덕분에 리퍼러 차단목록만 거의 2kb에 육박하게 돼버렸네..

.htaccess에 적어놓은 스팸 차단목록, 무지하게 길다;

스팸 리퍼러 차단 키워드

며칠간의 스팸 도메인은 모두 다른 이름(세어보니 66개)이지만 연결되는 곳은 한군데인 것 같다. IP가 이곳저곳 흩어져있는 걸로 보아 빌어먹을 웜에 감염된 서버들이 이곳저곳에 리퍼러를 찍어대고 있는 듯. 카운터에 신경끄고 살면 그만이지만 편집증 크리진씨는 오늘도 .htaccess 파일을 붙잡고 스팸 키워드를 알파벳순으로 정렬하느라 삽질을 하고있다고..

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

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
태그 : 스팸

Gmail Mobile

휴대폰에서도 http://m.gmail.com 이라는 주소를 넣으면 Gmail을 이용할 수 있다고 한다. 내가 쓰고 있는 LG KV-5900 휴대폰으로 테스트 해봤는데 기대했던 것 보다 상당히 깔끔하게 나와준다. 더 좋은 브라우저가 내장된 폰에서는 아이콘 이미지같은 것도 나오는 듯 싶지만..

메일 목록 화면

메일 목록 화면

본문 보기 화면

본문 보기는 텍스트만 보여준다

첨부파일 보기 화면

첨부파일을 누르면 이미지도 보여주고
MS 워드 파일 같은건 텍스트로 변환해서 보여준다

Gmail은 PDA에 내장된 IE나 아주 낮은버전의 웹브라우저에서 접속했을때를 위한 화면을 따로 운영하고 있다. 오리지널 Gmail만은 못하지만 Gmail에서 일반적으로 할 수 있는 기능은 다 할 수 있다. (Contacts, Archive, Add star, Mark (un)read 등등) 이 Mobile 버전도 마찬가지로 Gmail의 모든 기능을 쓸 수 있고 메일을 보다가 발신자에게 바로 전화를 걸 수 있다던가 하는 추가된 기능도 있다. 어떤 환경에 처해지더라도 내 메일을 읽을 수 있다는 점은 Gmail을 쓰게 하는 가장 큰 이유중 하나다.

그건 그렇고 몇년전 휴대폰에 들어있던 브라우저는 URL을 넣었을때 제대로 나오는게 거의 없다시피 했는데 이 브라우저에서는 출력 화면이 꽤 깔끔하게 나온다. 여기에 감동한 나머지 내 블로그 주소를 입력해 봤더니..

생각보다 깔끔하게 나와주심

a 태그의 title 속성같은 자잘한(?)부분도 지원해준다

훌륭해 훌륭해;;

KV5900 User-Agent

User-Agent

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

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
나우누리 재가입  (16) 2005/09/06

태터툴즈에 FTP로 첨부파일 올리기

태터툴즈 포럼에 뎅엽이님 질문을 보고 하나쯤 있으면 좋겠다는 생각이 들어 만들었다. 원래는 Flash8에 추가된 업로드 기능으로 폼나게 만들어볼 생각이었는데 거친마루님의 예제를 한참 보고있으니 머리위에 OTL이라는 말풍선이 뜨면서 기운이 확 빠져버리는 현상이;; 그리하여 결국 FTP로 업로드한 파일을 태터툴즈에 붙여주는 원시적인 방식을 택하게 됐음.

upload.php

Version 2006.01.04.01

사용법,

  1. 위의 파일을 내려받아 태터툴즈 홈 디렉토리에 올려놓는다.
  2. 태터툴즈 홈 디렉토리에 upload 라는 디렉토리를 만들고 FTP로 사진이나 기타 파일을 올려놓는다.
    (upload가 아닌 다른 디렉토리 이름을 쓰고싶으면 upload.php 파일의 4번째줄을 수정한다)
  3. 1번에서 업로드한 upload.php 파일을 호출하면 글목록과 업로드한 파일 목록이 보인다 (관리자 로그인 필요)
  4. 파일을 첨부할 포스트를 선택한다. 새로운 포스트로 붙이고 싶으면 (새 포스트)를 선택하면 됨.
  5. 나열된 파일 목록중에서 첨부를 원하지 않는건 체크를 해제한다.
  6. 등록 버튼을 누르면 잠시 시간이 걸린 후 결과가 표시된다.
  7. 각각의 파일 끝에 (복사 성공)이라는 메세지가 뜨면 성공인데 실패라고 뜨면.. 이 포스트에 답글을 달아 도움을 요청한다;;

파일이 이동되는게 아니고 복사된다는 점에 주의. 아직 충분한 테스트를 거치지 못해서 삭제하는 코드를 넣기가 겁나는 관계로..;; 일단 등록이 끝난 파일은 수동으로 지워줘야 한다.

태그 : 태터툴즈

그분이 오셨어요..

두솔시스템 XGATE XG20SM 사진

두솔시스템 XGATE XG20SM

전에쓰던 뷰소닉 19인치 모니터가 너무 오래돼서 여러모로 짜증나던 관계로 LCD 아이쇼핑을 하고있던 어젯밤에 17인치와 19인치는 해상도도 같은데 19인치 살 바에야 17인치 두개 사는게 낫지 않을까 하는 의문이 들어 모처에 질문을 한 결과, 두솔시스템에서 나온 20.1인치 LCD가 매우 훌륭하여 강력추천이라 한다. 찾아보니 현재 다나와 LCD 카테고리의 인기순위 2위!! LG S-IPS 패널을 쓰고 1600x1200 해상도에 20인치나 되는놈이 38.4만원 한다. 가격이 좀 많이 저렴해서 의심이 됐지만 상품평을 보니 대부분 칭찬일색이라 일단 마음을 놨다.

몇시간동안 세심히 살펴본 끝에 지르기로 결정! 이왕 지를거면 최대한 빨리 지르는게 이득이라는 생각에 오후 반가를 내고 용산으로 갔다. 연휴 직후라 그런지 재고가 없는 곳이 많았고 재고가 있는 곳은 모두 불량화소 체크같은건 안해준다고 한다. 찝찝하긴 하지만 이왕 온거 빈손으로 가기도 뭐해서 뽑기에 도전! 선인상가 3층의 허름한 상가에 들어서 두솔 모니터 하나 달라고 하자 대뜸 책상위에 올려진 모니터를 가리키며,

"아 저거 테스트 다 놓은거예요. 야 저거 싸드려!"

디스플레이 해놓은건지 자기들이 쓰던건지 알 길은 없지만 뭐 테스트 끝난 제품이라고 얘기하니 뽑기보다는 낫겠다 싶어 그냥 가져오기로 했다. 주인아저씨는 용산에 세무조사가 떴다고 여기저기 전화하느라 바빠서 뭔가 물어보고 싶은게 많았지만 차마 그럴 틈이 없었다;;

(집에와서 확인해보니 녹색 불량화소 3개가 박혀있다-_- 테스트는 개뿔;; 중앙쪽이긴 하지만 이가격에 무결점 찾아다니는 것도 웃기고 해서 그냥 쓰기로 했음)

그래픽 카드가 1600x1200 DVI 출력이 불가능하다는걸 뒤늦게 깨달아서 일단은 D-SUB 연결로 사용중인데 요리조리 봐도 잘보이고 화면도 널찍하고 마음에 든다. 세로로 세워서 쓰고있는데 DirectDraw가 엄청나게 느려지고 게임이 안돌아간다는거 빼면 완전 감동. 포털사이트 메인페이지가 한 화면에 들어오고도 조금 남는다. Editplus에서도 한화면에 가로 155글자 x 세로 99라인이 나온다. 글자가 좀 작은감이 있지만 이정도면 투자한 돈에 비해 엄청난 환경의 개선이 아닌가 싶다.

그나저나 지금은 이상하게 글자가 번져서 조만간 DVI-D 지원되는 그래픽카드를 추가로 질러야 할 상황이다. 피벗되는 스탠드도 사야되고.. 한번 지르면 멈출 수 없어어어.. orz;;

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

스팸 리퍼러의 재습격  (22) 2006/03/13
Gmail Mobile  (11) 2005/12/20
그분이 오셨어요..  (13) 2005/09/20
인터페이스 혁신, AJAX 기술 실전 워크샵  (7) 2005/09/15
나우누리 재가입  (16) 2005/09/06
결국 Gmail로 정착  (20) 2005/08/31
태그 : 지름신

자바스크립트에서 문자열을 합치는 방법

어제 워크샵에서 배운 것들을 이것 저것 해보는 중인데 그 중 StringBuffer의 성능에 대해 간단히 벤치마킹 해본 결과를 적어본다. 진작에 좀 알았으면 좋았을 것을..;

자바스크립트에서 두 문자열을 하나로 합치고 싶을때는 + 연산자로 간단히 합칠 수 있다. 다른 언어에서도 마찬가지지만 좀 저수준에서 바라보면 문자열을 합치는 작업은 앞쪽 문자열의 끝부분을 찾아서 그 뒤에 뒤쪽 문자열을 붙이는 방법이기 때문에 앞쪽 문자열이 길수록 작업시간이 늘어난다. 그래서 거대한 양의 HTML 코드를 동적으로 생성해 + 연산자로 이어붙여 innerHTML 메소드로 넣어줄때는 문자열이 길어질 수록 길이의 제곱에 비례해 시간이 늘어나는 걸 볼 수 있다.

자바의 경우는 이 문제를 StringBuffer라는 객체를 사용해 해결한다. 일정 공간의 버퍼를 만들고 여기에 문자열을 추가하면서 버퍼가 모자라면 지금 할당된 버퍼의 용량을 두배로 늘려 사용하는 단순한 방법인데 속도가 상당히 향상된다.

자바스크립트에서는 메모리를 직접 다루는게 불가능하기 때문에 이런 방법은 쓰기 힘들고, 추가할 문자열을 실제로 이어붙이는게 아니라 배열에 임시로 넣어두었다가 필요할때 합쳐서 쓰는 방법을 사용한다. 배열에 문자열을 집어넣는건 문자열의 길이와 상관없이 항상 일정한 시간이 걸리기 때문에 최종적으로 문자열을 하나로 합치는 시간에서만 문자열의 길이에 비례한 시간이 소요된다.

Example. http://crizin.net/work/demo/stringBufferExample.html

prototype을 선언해서 좀 더 우아하게 쓸 수도 있다.

Example. http://crizin.net/work/demo/stringBufferPrototypeExample.html (참고 : Java Script String Buffer)

아무튼 저런식으로 문자열을 다루면 극한 상황일수록 많은 시간을 줄일 수 있게된다. IE의 경우에는 대략 몇십배씩 차이가 나는데 파이어폭스나 오페라 같은 경우는 두 방법의 차이가 거의 없다. 아마 내부적으로 + 연산자를 StringBuffer로 처리하는게 아닌가 추측됨. (오페라의 경우에는 최적화가 잘 돼 있는지 오히려 + 연산자가 더 빠르다)

Demo : http://crizin.net/work/demo/stringBenchmark.html

그래서 결론은 IE7이 빨리 나오길 바란다는 것으로 마무리;;

인터페이스 혁신, AJAX 기술 실전 워크샵

워크샵 로고 이미지

..이라는 제목을 가진 컨퍼런스를 듣고 왔다. 윤석찬님의 AJAX 대략 훑어보기, 박병권님의 AJAX 실전 예제, 그리고 강규영님의 삽질 프리 AJAX 프로그래밍;;까지 세개의 섹션으로 진행됐는데 AJAX를 처음 접해보는 사람과 이미 다루어본 사람 모두 커버되는 알찬 자리였다. 내경우엔 사전에 주워들은 풍월이 좀 있어 세번째 강규영님 섹션이 아주 도움이 많이 됐는데 그야말로 삽질을 최소화해주는 팁으로 가득차있어 유용했다. 그래서 나는 이렇게 스스로 삽질을 자청해 수많은 사람들의 삽질을 방지해주는 분들을 존경해 마지 않는다. (세번째 섹션의 PPT 파일과 참고자료들이 이 곳에 올라와있다. AJAX에 관심이 없더라도 자바스크립터라면 한번쯤 훑어보길 강력히 권함)

예전에 어디선가 자바스크립트 팁이라고 XMLHTTPRequest 객체를 이용한 꼼수를 소개하는 글을 본적 있는데 '이런 것도 되는구나..' 하고 나중에 써먹을 요량으로 북마크만 해둔채 잊어버린 적이 있다. 그 뒤에 여러 블로그에서 AJAX가 자주 언급돼서 살펴보니 예전에 봤던 바로 그녀석인거다. 같은 도구를 던져줘도 나처럼 북마크만 해두고 잊어버리는 녀석이 있는가 하면 이걸로 지도를 보여줄 상상을 해내는 사람도 있다. 3초간 반성..

PPT 서너장이면 개념에 예제설명까지 끝날정도로 간단한 요녀석에 기대가 크다. 웹이 플랫폼화 되어가고 웹페이지가 윈도우 어플리케이션처럼 편리한 인터페이스를 가지고, 무엇보다 좀더 재밌는 웹을 만들어주는데 큰 역할을 해주는 녀석이기에..

쓸데없는 얘기 1. 가장 중요한 AJAX를 어떻게 읽는가 하는 문제는 강의하신 세분 모두 '에이잭스'로 합의 보신 듯 싶다. (찾아보니 유럽쪽에선 '아약스', 미국쪽에선 '에이잭스'가 대세라고 하는데 개인적으론 '아작스'가 왠지 정겹다;;)

쓸데없는 얘기 2. 웹페이지에 동적인 객체들을 추가하는데 있어서 'createElement(), appendChild() 따위의 DOM 노가다' vs 'innerHTML()' 둘중에 어떤게 좋을지 예전부터 궁금했었는데 innerHTML()쪽이 빠르다고 한다. 사람도 편하고 기계도 편하니 innerHTML 승! (다만 innerHTML()에 삽입될 스트링에 + 연산을 과도하게 사용할경우 문자열 작업에 관련된 고질적인 퍼포먼스 저하가 생겨 배보다 배꼽이 더 큰 경우가 생길 수도 있음에 주의)

쓸데없는 얘기 3. 아직도 궁금한건 98년도에 나온 기술이(그때는 IE에서만 되긴 했지만) 왜 이제서야 히트치고 있는건지. Jesse James Garrett이 이름을 불러주기 전에는 다만 한떨기 ActiveX 컴포넌트에 지나지 않았던건지?;

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

Gmail Mobile  (11) 2005/12/20
그분이 오셨어요..  (13) 2005/09/20
인터페이스 혁신, AJAX 기술 실전 워크샵  (7) 2005/09/15
나우누리 재가입  (16) 2005/09/06
결국 Gmail로 정착  (20) 2005/08/31
This Page Is Valid XHTML 1.0 Transitional!  (8) 2005/08/07

태터툴즈 + BBClone의 10원짜리 팁

Trackback to :: 강력한 접속통계 프로그램 BBClone

예전부터 쓰려고 했던건데 잊고있다 올블로그에서 한스님의 포스트를 보고 생각난김에 간단히 기록한다.

BBClone은 방문한 페이지에 각각 ID를 부여해서 페이지별 순위를 매길 수 있는데 태터툴즈에서라면 각 포스트별 순위를 매기는 용도로 쓸 수 있다. 일반적인 index.php 맨 처음부분에 코드를 삽입하는 경우라면 아래처럼 넣으면 된다.

switch($md)
{
    case "rss": $bbclone_id = "RSS Paper"; break;
    case "guest": $bbclone_id = "Guestbook"; break;
    case "local": $bbclone_id = "Locations"; break;
    case "keyword": $bbclone_id = "Guestbook"; break;
    default: $bbclone_id = $pl ? "POST #$pl" : "Blog Main";
}

define("_BBC_PAGE_NAME", $bbclone_id);
define("_BBCLONE_DIR", "bbclone/");
define("COUNTER", _BBCLONE_DIR."mark_page.php");

if
(is_readable(COUNTER))
    include_once(COUNTER);

예제는 본인의 BBClone 페이지로..;

태터툴즈 답글 + 기타등등을 RSS로

Trackback to :: 블로그에 코멘트 남기면 쪽지 날라오게 하기

Miranda-IM에 입문하면서 이것저것 만져보는 중인데.. 이것저것 다 마음에 들지만 메신저 주제에 옵션이 이렇게 복잡하리라고는 상상도 못했다 orz;; 그만큼 강력하다는 얘기겠지만서도.. 나름대로 처음보는 프로그램에 대한 적응이 빠르다고 생각하는데 이녀석은 시간좀 걸릴 듯 싶다.

아무튼 예전부터 탐냈던 최근 답글 목록을 RSS로 만들어 Miranda로 알림받는 것도 해봤는데 최근버전의 RSSNews 플러그인에 Store only unread news 옵션이 없어져버려 살짝 문제가 됐지만 (다시 보니까 Maximum displayed items 옵션에 1을 넣으면 알려줄 답글이 여러개일 경우에 하나 알려주고 또 알려주고 하는식으로 알림이 온다. 이렇게 되면 위 옵션은 굳이 없어도 될 듯) (그냥 기본값 그대로 0을 넣어두면 답글 하나에 메세지 하나씩 잘 온다) 일단 편하고 좋다. 예전에 골빈해커님이 만드신 패치를 약간 변형해서 답글, 트랙백, 방명록, 방명록 답글을 시간순서대로 보여주는 스크립트를 만들어서 쓰고있다.

rss_notify.php

Version 2006.01.01.01

..이제 답글만 많이 달리면 된다;

태그 : RSS, 태터툴즈

나우누리 재가입

아래 글을 쓰면서 나우누리의 근황이 너무 궁금해지는 바람에 프리미엄 회원으로 전환해 한번 둘러보기로 했다. 인터넷 결제 대행 서비스가 발에 채이는 요즘에도 11년전 방식 그대로 가입후에 상담원의 확인 전화를 받아야만 했다. 예전과 달라진게 있다면 매월 클럽박스 포인트 5,000P가 지급되니 잘 쓰라는 당부. 조PD가 1집을 MP3로 올렸던 그 나우누리 공개자료실은 이미 사라져버린지 오래고 한때 나우와레즈라고 불리던 클럽 자료실만 근근히 운영되고 있다.

게시판들은 대부분 그대로 남아있으나 올라오는 게시물들은 전부합쳐서 한달에 100개나 될까 모르겠다. 스스로 하느님이라고 자처하던 이병권씨도 아직 유머란에서 볼 수 있었다;; 나우장터처럼 연결이 아예 되지 않는 서비스도 꽤 있었고 번호만 표시되고 실제로는 없는 메뉴가 꽤 많은걸 보면 VT 서비스는 사실상 방치되고 있다고 봐도 될 것 같다.

뭔가 옛 추억을 더듬어볼 수 있을까 해서 재가입을 했지만 2년사이에 동호회들도 아예 없어져버린게 꽤 많고(소모임은 아예 소모임 자체가 사라졌다) 메일이 오면 삐삐로 알려주는 서비스 같은건 무조건 장애가 있다고 튕겨내는 바람에 구경해볼 수가 없었다. 이런걸 누가 쓰고 있을까.. 하고 초기화면에서 user 명령을 쳐보니 나와 운영자를 제외하고 2명이 더 쓰고 있었다. 반가운 마음에 쪽지를 보내고 싶은걸 참고 일단 로그아웃. 이제 마지막으로 아직도 수요일 새벽에 정기점검 하는가에 대한 궁금증만 해결하고 탈퇴해야겠다.

나우누리 로그인 화면

로그인 화면
지금은 VT에서 '손님' 또는 'GUEST'를 입력해서 가입할 수 없다

로그인 후 쪽지 확인

아마 동호회의 몰락을 찬찬히 지켜봐야 했던 분들;

나우누리 초기 화면

화면을 가득 채우던 메뉴는 많이 줄어들고 그자리를 인터넷 URL이 차지하고 있다

부록 : 90개월치 요금납부내역

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

그분이 오셨어요..  (13) 2005/09/20
인터페이스 혁신, AJAX 기술 실전 워크샵  (7) 2005/09/15
나우누리 재가입  (16) 2005/09/06
결국 Gmail로 정착  (20) 2005/08/31
This Page Is Valid XHTML 1.0 Transitional!  (8) 2005/08/07
태터툴즈 업데이트  (7) 2005/08/07
태그 : 나우누리

결국 Gmail로 정착

나우누리 캐릭터 나우깨비

나우깨비

내 첫 메일은 나우누리 메일(@nownuri.net)이었다. 일찌기 1994년 서비스 시작부터 무제한의 스페이스(구글처럼 째째하게 2기가로 제한하지 않는다)를 제공하여 각종 게임을 메일함에 쌓아놓고 채팅방에 죽치고 앉아 게임을 교환하는 클럽이 성행했다. 나중에 한메일이 크게 히트하기 시작할때도 나우누리 메일을 고수했다. POP3는 당연히 지원했고 웹메일 보다는 VT 모드로 접속해서 사용하는 메일이 너무 편했기 때문에.. 내가 마지막으로 나우누리를 떠날때까지 나우누리에는 스팸메일 필터가 아예 없고 인터넷 메일 수신/비수신 옵션 뿐이었는데 신기하게도 스팸메일은 거의 없었던 것 같다.

그러다 결국 대세를 따라 웹메일로 옮겨가게 됐는데 어찌어찌 하다보니 결국 Hotmail을 선택하게 됐다. 요즘 메일박스 용량이 슬슬 250MB로 증설되고 있는 중이지만 어쨌든 그때는 달랑 2MB의 공간. '메모리는 640KB면 충분합니다' 파문에 이어 '메일박스는 2MB면 충분하다' 훈훈한 감동. 주 메일계정으로 쓰기에는 턱없이 부족했으므로 2만 얼마를 주고 유료 결제를 했다. (근데 결제한지 1년 넘은거 같은데 아직 2기가 그대로네..) 초기에는 돈내고 쓰는 메일에 광고를 붙여 보내는 짓도 하고 메일 제목이 아닌 발신자 이름을 눌러야 메일이 열리는 빨간펜적인 인터페이스로 미움받기도 했다. 뭐 좋다고 그놈의 익스플로러 전용 다이얼로그는 남발을 해대는지 메일한번 지우려면 '지울래 말래' 하는 팝업을 띄우느라 쓸데없는 시스템 리소스가 출동해야 한다. (파이어폭스같은 비 IE 브라우저로 접속하면 산뜻하게 confirm 다이얼로그 하나 뜨고 만다. 이거 만든놈 익스플로러 안티가 아닌가 싶다.)

그리하여 1년 좀 넘게 울며 겨자먹기로 핫메일을 쓰다가 Gmail로 옮기려 한다. 이제는 거의 베타 딱지 떼도 될만한 수준이 된 것 같고 내 PDA에서 POP3는 당연히 지원되고 특히 포켓 익스플로러에서도 웹메일 사용이 가능하다는 점에서 감동의 눈물을 이백만 바가지 흘릴 수 밖에 없었다. 저기 저 산골짜기 오두막에 먼지로 뒤덮인 골동품 PC에서도 Gmail 접속이 가능할꺼라는 구글의 약속은 뻥이 아니었다. 그밖에도 여러가지 독특하고 구글스러운 기능들은 쓰면 쓸수록 매력적이다. 단축키도 이참에 싹 외워버렸더니 나우누리에 텔넷접속해서 메일 읽는 것 만큼 편리하다.

텔레토비 네마리

아이 좋아~

그건 그렇고 예전에 가입해둔 사이트들 메일주소를 변경하려고 핫메일 편지함을 쭉 뒤져가며 하나씩 변경해주고 있는 중인데 몇몇 대형 쇼핑몰이나 전자정부 사이트처럼 로그인만 하는데도 ActiveX를 설치해야 되는 곳이 꽤 많아져서 놀랬다. SSL을 만든 사람이 이 꼴을 보면 소주 한잔 하고싶어질꺼다.

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

인터페이스 혁신, AJAX 기술 실전 워크샵  (7) 2005/09/15
나우누리 재가입  (16) 2005/09/06
결국 Gmail로 정착  (20) 2005/08/31
This Page Is Valid XHTML 1.0 Transitional!  (8) 2005/08/07
태터툴즈 업데이트  (7) 2005/08/07
구글의 습격  (5) 2005/08/04
태그 : Gmail, Google

Standalone Internet Explorer

Standalone Internet Explorer Download (via miniwini)

홈페이지를 IE 5.0에서 테스트 하기 위해서 VMware에 Windows 2000을 설치하는 삽질을 하곤 했는데 단독으로 실행가능한 패키지가 있었다. 내 블로그도 IE 5.0에서 레이아웃이 작살나는 문제가 있어서 고쳐야지 하고 마음만 먹고 있었는데 (VMware 설치하기 귀찮아서-_-) 이참에 치명적인 문제만 수정해뒀다. 어차피 IE 5.0으로 이곳에 오는 사람도 거의 없는거 같고 보는데는 지장 없으니 뭐..

각각의 익스플로러를 다운로드 해서 압축만 풀어 쓰면 된다. IE 3.0에서는 PNG 이미지도 안나오고 CSS 지원이 IE 4.0부터 되는지 CSS 없는 XHTML만 표시된다. 저 때만해도 넷스케이프를 버리고 익스플로러를 쓰게될거라는 생각은 못했었는데.. IE 3.0 툴바의 유치한 배경그림이 왠지 반갑다.

Internet Explorer 3.0 About 화면

벌써 9년이나 흘렀다

'컴퓨터 얘기 > 유용한놈들' 카테고리의 다른 글

Standalone Internet Explorer  (4) 2005/08/23
Windows XP Remote Desktop Connection software  (0) 2004/09/04
양력/음력 변환 SQL  (3) 2004/08/26
Adobe Reader Speed-Up 1.28  (0) 2004/08/06
Gmail 유틸리티  (0) 2004/06/24
Nokia Monitor Test 2.0  (0) 2004/05/29

Konfabulator Widget 만들기

뒤늦게 Konfabulator를 받아서 위젯들을 들었다 놨다 하면서 놀던중에 위젯이 자바스크립트로 만들어졌다는 충격적인 사실을 알아냈다. 자바스크립트라면 덤벼볼만 하지. Konfabulator Workshop 페이지에 가서 튜토리얼 문서를 받아 살펴보다가 몇번 좌절한 끝에 우선 남이 만들어놓은거 한번 뜯어보는 걸로 방향을 바꿨다. 위젯 갤러리를 훑어보다가 RSS를 읽어다 표시해주는게 왠지 만만해보여서 The Apple Blog RSS라는 놈을 잡아다 분석해봤더니 생각보다 심플! 위젯 내부는 XML 파일에서 화면을 꾸미고 자바스크립트를 호출해 사용하는 기묘한 구조로 이루어져 있었다. 테스트용으로 배경이미지 하나 달랑 깔아놓고 블로그의 최근 답글 5개를 불러다 표시해주는 녀석을 만들었다. (거의 copy & paste로 만든거긴 하지만;;)

태터툴즈 답글 위젯 실행화면

만들고 보니까 크기가 너무 크다 -_- 기능은 오로지 1분에 한번씩 답글 XML 파일을 불러다 뿌려주는 것 밖에 없다. 위에 첨부한 rss_replies.php 파일을 태터툴즈 메인에 올려놓고 위젯을 실행한 다음 Preference에 들어가 자신의 rss_replies.php 파일 URL을 적어줘야 한다. (기본값은 내 블로그가 들어가 있음;;) 그리고 호스팅 서버에서 iconv 함수 사용이 가능해야 한다. 글꼴은 굴림으로 했더니 영 보기 불편해서 HY견고딕으로 바꿔버렸다. 오피스던가 한글이던가 설치하면 같이 깔리는거 같던데.. 아무튼 웬만한 컴퓨터엔 다 있을 것으로 간주하고;; (HY견고딕, 중고딕 같은건 윈도우에 기본으로 좀 넣어줬으면 좋겠다)

위젯 만드는거 꽤 재밌어서 당분간은 이녀석으로 심심하지 않을 것 같다;

태터툴즈 답글 삭제부분 수정

태터툴즈 0.96 정식버전에만 해당하는 내용임

어쩌다보니 최근엔 계속 태터툴즈 관련 포스팅이다. 아무튼;; 0.96 정식버전에 추가된 기능중의 하이라이트라고 할 수 있는 답글에 답글달기 기능 중에 의도한 것과 살짝 다르게 동작해서 당황하게 되는 부분이 하나 있는데, 하위 답글이 달린 상위 답글을 삭제했을때의 경우다. 상위 답글이 삭제되면서 하위 답글들은 최근 답글 목록 외에서는 영영 볼 수 없는 미아가 돼버리고 마는데 이걸 방지하려면 약간의 수정이 필요하다.

칼을 대야할 부분은 del_exe.php 파일의 34 ~ 43번째 줄이다. (아래 표시된 부분)

put_query("delete from t3_".$dbid."_reply where no = '$num'");
set_rp_cnt($pnum);
?>
<script type="text/javascript">
    alert('지정하신 글이 삭제되었습니다t');
    opener.exe_frame.location.href='add_exe.php?md=rp&num=<?=$pnum?>&d_target=post_<?=$pnum?>';
    window.close();
</script>
<?
exit;

위의 부분을 일단 아래와 같이 고쳐놓은 뒤에,

list ($is_parent) = mysql_fetch_array(mysql_query("select count(*) from t3_${dbid}_reply where rno = '$num'"));

if($is_parent)
{
    /* 뭔가 삽입될 곳 */
}
else
{
    put_query("delete from t3_".$dbid."_reply where no = '$num'");
    set_rp_cnt($pnum);
    ?>
    <script type="text/javascript">
        alert('지정하신 글이 삭제되었습니다t');
        opener.exe_frame.location.href='add_exe.php?md=rp&num=<?=$pnum?>&d_target=post_<?=$pnum?>';
        window.close();
    </script>
    <?
    exit;
}

/* 뭔가 삽입될 곳 */ 이라고 표시된 곳에 어떻게 처리할건지에 따르는 코드를 넣어주면 된다. 답글 삭제시에 하위 답글을 어떻게 처리할 것인가는 기호에따라 몇가지 방법이 있을 수 있는데 대략 3가지 정도 추려보면,

  1. 상위 답글을 아예 못지우게 하는 방법. 방문자의 삭제 권리를 무시하는 방법이므로 사전에 낙장불입 시스템임을 알려둘 필요가 있다.
    ?>
    <script type="text/javascript">
        alert('하위 답글이 달려있어서 지울 수 없습니다t');
        window.close();
    </script>

    <?
    exit;
  2. 상위 답글의 이름, 홈페이지, IP, 본문만 날려버리는 방법. 일단 리플 개수가 줄어들지 않아 좋다 -_-
    put_query("update t3_${dbid}_reply set name='Anonymous', homepage='', body='(삭제된 답글입니다)', password='', ip='0.0.0.0' where no = '$num'");
    ?>
    <script type="text/javascript">
        alert('하위 답글이 달려있어서 내용만 삭제했습니다t');
        opener.exe_frame.location.href='add_exe.php?md=rp&num=<?=$pnum?>&d_target=post_<?=$pnum?>';
        window.close();
    </script>

    <?
    exit;
  3. 하위 답글까지 몽땅 삭제하는 방법. 화끈한 만큼 운영에 주의가 필요하다.
    put_query("delete from t3_${dbid}_reply where no = '$num' or rno = '$num'");
    set_rp_cnt($pnum);
    ?>
    <script type="text/javascript">
        alert('지정하신 답글과 관련 답글이 모두 삭제되었습니다t');
        opener.exe_frame.location.href='add_exe.php?md=rp&num=<?=$pnum?>&d_target=post_<?=$pnum?>';
        window.close();
    </script>

    <?
    exit;

이렇게 3개의 방법중 원하는 방법에 해당하는 코드를 /* 뭔가 삽입될 곳 */ 부분에 넣어주면 된다.

이 블로그는 두번째 방법을 쓰고있다. 어떤 방법이든 이렇게 수정해두지 않으면 쓰레기 데이터가 쌓여서 DB의 일관성에도 문제가 있고 Staticker 같은 통계프로그램에서도 잘못된 결과가 나올 수 있으니 가급적 수정해주는쪽을 추천.

태그 : 태터툴즈

태터툴즈 0.96 위치로그 업데이터

태터툴즈 0.96RC에서 입력된 위치정보는 일단 기본적으로는 태터센터 지역별 목록에 표시되지 않는 모양이다. 이럴땐 싱크를 다시 시켜줘야 목록에 표시되는데 각각의 포스트 수정화면에 들어가 REFLECT 버튼을 한번씩 눌러서 다시 싱크시켜주면 된다. (0.96 정식버전 부터는 싱크된 포스트일경우 REFLECT만 해도 수정된 내용으로 다시 싱크된다) 일일히 작업하기는 귀찮을땐 아래의 스크립트를 사용하면 간편하게 할 수 있다.

위의 파일을 ftp로 태터툴즈 메인 디렉토리에 올려놓고 웹브라우저에 http://yourdomain.com/location.php 이런식으로 입력해서 실행되는 화면을 지켜보기만 하면된다. 일단 위치정보가 삽입된 포스트중 이미 싱크된 포스트의 목록이 나열되고 각각의 포스트를 싱크시켜 성공, 실패 여부를 표시하게 된다. 모든 포스트 제목 뒤에 (성공) 이라고 표시되면 작업 끝. 실패 메세지가 나온다거나 반응이 없거나 하는 경우에는 일일히 REFLECT 버튼을 눌러주거나 SYNC 해제 후 재 SYNC 작업을 하는 수밖에 없다.

확실히 위치로그 등록해두니까 찾아오는 사람이 꽤 된다;; 지역별로 분류해서 보니까 메타사이트에서 시간순으로 보는 것과는 다른 재미도 있고.. 아직은 495개의 포스트 뿐인데 앞으로 글이 많이 늘어났으면 좋겠다.

이번껀 좀 많은 사람들이 봤으면 하는 바람이 있어서 올블로그 추천글로 등록함

태그 : 태터툴즈

태터툴즈 0.96용 노가다 유틸

드디어 기다리던 답글에 답글달기 기능이 추가됐다. 스킨을 고치고 스타일을 수정하는 과정에 예제가 필요해서 DB를 몇개 수정했는데 게시물이 280개 정도 되는 수준이라 이거 그냥 전부다 수정해버릴까? 하는 생각이 들어 노가다 작업에 필요한 유틸을 만들었다.

reply_helper.zip

주의 : 데이터 백업은 필수!!

DB를 직접 건드리는 민감한 물건이니 정신 바짝 차리고 해야함;; 무조건 데이터 백업후에 몇개 해보고 잘 된다 싶으면 계속 진행하고 이상하게 나오거나 답글이 사라져버리면 즉시 복구해야한다.

  1. 태터툴즈 메인 디렉토리에 올려놓고 reply.php 파일을 호출한다.
  2. 가장 최근의 포스트에 달린 답글이 표시된다. 첫번째 게시물에 답글이 없으면 실행 & 다음 게시물로 버튼을 눌러 답글달린 포스트가 나올때까지 넘어간다. (단축키 ALT-S)
  3. 답글이 쭉 나오면 작업을 시작한다. 방법은 먼저 부모글을 클릭하고, 그에 해당하는 자식 글을 클릭한다. (순서에 주의) 하나의 부모글에 여러개의 답글이 있을때도 부모글 클릭, 자식글 클릭을 반복하면 된다.
  4. 관계 설정이 끝나면 실행 & 다음 게시물로 버튼을 눌러 다음 게시물로 이동해 작업을 계속한다.
  5. 클릭을 잘못해서 취소하고 싶으면 F5키를 눌러서 새로고침한 다음에 다시 하면 된다.

다시한번 강조하지만 반드시 백업후 작업할 것 급조해서 이 블로그에만 적용한뒤 올려놓은거라 다른 곳에서는 이상동작을 하지 않는다는 보장이 없다.

덧. 0.96RC 쓰면서 입력해 놓은 글들이 태터툴즈 홈 지역별 분류 목록에 보이지 않는다면 해당 포스트의 SYNC를 한번 풀었다 다시 걸어주거나 게시물 편집으로 들어가서 위치 입력 옆의 SET 버튼을 한번 눌러주면 업데이트 된다.

덧. 아참 파일명이 reply.php, reply_exec.php 인데 태터툴즈에 원래 들어있는 reply_exe.php 파일과 혼동하지 않도록 주의. (아까 작업 끝내고 지운다고 저것까지 지워버리는 바보짓을 해서..;;)

태그 : 태터툴즈

태터툴즈용 간단한 통계 그래프

그래프 프로그램 데모 화면

최근 n일 동안의 데이터를 뽑아 출력해 그래프를 그려준다. 기존에 있는 것도 많지만 매일매일의 그래프가 아닌 증권차트의 n일 평균 이동선을 보고싶어서 삽질을 거듭해 완성. 오늘 기준으로 최근 두달간 5일 이동평균선의 추세를 보니 꾸준히 상승중. 지금이야말로 매입 찬스!;; 제일 높았던 기록은 올블로그 알찬글 올랐을때고 제일 낮았을때는 구글봇때문에 트래픽 초과됐던 날이다.

저 아래 graph.php 파일을 받아서 태터툴즈가 설치된 디렉토리에 올려놓고 파일을 열어서 변수들을 수정하면 된다.

num
불러올 카운터의 개수. 한달치를 불러오고 싶으면 30으로 수정.
width, height
각각 그래프의 너비, 높이.
trend
위 그래프에서 빨간 선으로 표시된 추세선의 기준값. 5라고 넣으면 그래프의 한 점의 값은 지난 5일간의 평균을 의미한다. 0을 집어넣으면 표시하지 않음.
grid
얼룩무늬의 폭을 지정하는건데 단위는 1일. num 값에 따라 유동적으로 변한다.
color_*
주석에 표시된대로 각각 배경, 무늬, 그래프의 색을 지정한다. 빨간색이면 0xff0000 이렇게 넣어주면 됨.

불러올때는 <img src="graph.php" width="175" height="95" alt="통계 그래프"/> 같은 식으로 호출하면 된다. 이렇게 되면 graph.png 파일이 만들어져 표시되게 되는데 이 파일은 하루에 한번만 만들어지기 때문에 최초에 graph.php 파일을 실행하면 변수를 바꿔서 또 실행해도 graph.png 파일이 업데이트 되지 않는다. 이럴땐 http://yourdomain.com/tt/graph.php?force=1 이렇게 실행해주면 강제로 graph.png 파일을 업데이트 한다. (참고로 저렇게 실행한 상태에서 새로고침을 누르면 graph.png 파일만 새로고침 되기 때문에 graph.php 파일은 호출되지 않는다. 그래서 변수를 수정하고 바뀐 내용을 확인할때는 항상 위에 적힌 URL처럼 PHP 파일을 직접 호출해줘야 함. 또 참고로 새로고침해도 잘 업데이트가 안되면 http://yourdomain.com/tt/graph.php?force=1&asdfasdf 이렇게 URL 뒤에 & + 의미없는 문자를 추가해 입력하면 확실히 새로고침 된다)

좀 그럴듯 하게 만들어서 배포하고 싶은데 이정도에 만족해버려서 더이상은 포기;

graph.php

Version 2005.08.16.01