2011년 11월 17일 목요일

mac osx에 Dock에서 Ctrl+마우스로 눌렀을때 최근 연 파일리스트 제거하기

만일 그럴일은 없지만 야구 동영상을 봣다치자.
그럼 Dock에서 동영상 플레이어 어플을 오래도록 클릭하거나 Ctrl+클릭을 하면
최근 파일 목록이 나온다.

나는 좀 컴퓨터를 한다.
봣다 그럼 뒷처리는 깨끗하게 처리한다.
그래 프로그램 메뉴에서 최근 연파일 -> 목록 지우기.

그래도 Dock에는 남아있다.
이걸 지우는 방법은
~/Library/Preferences

여기에 보면 프로그램 별로 파일들이 있는데
그냥 귀찮으면 프로그램이름이 들어간 파일을 모두 지워버린다.

xxx.xxx.xxx.LSSharedFileList.*를 삭제한다.

2011년 11월 13일 일요일

XCode 4.2에서 4.0시뮬레이터 사용하기

OSX 라이온 업그레이드와 함께 XCode 4.2로 업그레이드 되었다.
기존에 사용하던 프로젝트 컴파일 배포는 문제가 없긴 하지만

왠지 4.3이사만 Deployment타겟이 되는게 맘에 들지 않았다.


라이온으로 OS를 변경하고 XCode를 새로 설치해서 당연히 SDK버젼이 높아 졌지만
하위 버젼을 빌드 해야 할경우도 있을듯 하다.

XCode -> Preference -> Download

여기서 3.0 4.0 디바이스를 설치한다.

덤으로 Documentation에서 5.0 도큐먼트도 로컬에 받아두는게 좋을듯


참고 XCode 4.2에서 Storyboard로 프로젝트를 생성하면 iOS5.0에서만 동작한다.

3.x, 4.x를 지원하는 앱을 만들려면 Storyboard를 언체크 해서 기존 xib파일로 
생성해야 할듯 하다.


2011년 11월 11일 금요일

iOS alert view 클릭시 iTunes 앱 구매로 연결하기


#ifdef FREE_APP
        if(mArcadeLock)
        {
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"lock", @"")
                                                           message:NSLocalizedString(@"free", @"")
                                                          delegate:self
                                                 cancelButtonTitle:nil
                                                 otherButtonTitles:NSLocalizedString(@"OK", @""),NSLocalizedString(@"Purchase", @""), nil];
            alert.tag = 1;
            [alert show];
            [alert release];
            return;  
        }
#endif  


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    //구매 사이트 연결
    if ( buttonIndex == 1 && alertView.tag == 1)
    {
        NSURL * url = [[NSURL alloc]initWithString:NSLocalizedString(@"URL", @"")];
        [[UIApplication sharedApplication] openURL:url];
        [url release];
    }
}

UIAlertView가 여러개 있을때 어떤 AlertView에서 온 이벤트인지 구분하는 방법은
alert.tag = 값을 주고

alertView clickedButtonAtIndex: 메서드에서 분기하면된다.

NSURL 로 url을 문자열로 만들고
[[UIApplication sharedApplication] openURL:url];
로 브라우저를 링크 할수 있다.

위에 예제는 실제 sudok9에서 사용하는 것으로 로컬라이제인션을 고려해서
NSLocalizedString을 이용했고
kr / us에 따라 다른 URL을 이용하도록 하였다.

Localizable.strings 파일에 아래와 같이. (KR) 일때
"URL" = "http://itunes.apple.com/kr/app/id465633051?mt=8&ls=1";

2011년 11월 4일 금요일

xcode4 tip __MyCompanyName__ 바꾸기

xcode 3버젼에서 하던 방법으로 되지 않는다.

xcode4에서는 계정에 주소록을 가져다가 쓰는것으로 보인다.

시스템환경설정->사용자및 그룹->주소록카드 (열기)
이렇게 해서 주소록을 연다음
하단에 편집
회사를 체크 하여 회사이름을 설정한다.

이렇게 설정을 하고 xcode에서
프로젝트를 생성하면..



//  Created by  on 11. 11. 4..
//  Copyright (c) 2011 SPARROWAPPS. All rights reserved.

이러한 주석이 자동으로 생성됨을 볼수 있다.
그런데 이건 사용자 이름이 사라지고 회사 이름만 생겼다.

이전에는 
//  Created by 최준호 on 11. 10. 31..
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.

머 반즘 성공한 방법이다.
이름이 사라지고 회사이름이 제대로 나오고...
머 그리 중요한건 아닌데...

Mac 용 어플리케이션을 개발하다가

- (void)aboutMenu:(id)sender
{
[NSApp activateIgnoringOtherApps:YES];
[NSApp orderFrontStandardAboutPanel:sender];
}

위와 같은코드로 About창을 생성했을때
Credits.rtf파일로 개발자 등을 설정 할수 있는데.

이상하게 회사이름은 MyCompanyName으로 나온다.

이건 어찌 바꾸는지 모르겟음.



2011년 11월 3일 목요일

OSX Lion terminal X11 connection broken 문제

X connection to localhost:18.0 broken (explicit kill or server shutdown).

 snow leopard에서 잘사용했었는데..

ssh -X 로 접속해서 X서버를 땡겨 쓰고 했는데.
lion으로 업그레이드 하고 나니 위와 같은 에러가 가끔씩 난다

한번 나고 나면 서버에 있는 GUI프로그램을 사용할 수가 없다.

man ssh를 하면 아래와 내용을 볼 수 있다.
-X      Enables X11 forwarding.  This can also be specified on a per-host
             basis in a configuration file.

             X11 forwarding should be enabled with caution.  Users with the
             ability to bypass file permissions on the remote host (for the
             user’s X authorization database) can access the local X11 display
             through the forwarded connection.  An attacker may then be able to
             perform activities such as keystroke monitoring.

             For this reason, X11 forwarding is subjected to X11 SECURITY
             extension restrictions by default.  Please refer to the ssh -Y
             option and the ForwardX11Trusted directive in ssh_config(5) for
             more information.

     -x      Disables X11 forwarding.

     -Y      Enables trusted X11 forwarding.  Trusted X11 forwardings are not
             subjected to the X11 SECURITY extension controls.

-Y 옵션으로 접속하면  trusted X11 forwarding 이라고 한다.
실제로 아직까지는 연결 끊김 없이 잘 사용되고 있다.

2011년 11월 2일 수요일

소스인사이트 업그레이드 2011.5.31

이런 소스인사이트가 나도 모르게 은근 슬적 업그레이드를...

이거누가 유지 보수 하고 있엇나보다...

http://www.sourceinsight.com/changes.html

Version 3.50.0065 - May 31, 2011

Fix: Holding down the CTRL key for a long time on Vista or Windows 7 would cause the application to become gray and inactive.
Fix: Misc symbol lookup and syntax formatting fixes.
Fix: Added support for Java annotations.
Fix: General parsing errors caused by very long symbol names.
Fix: Some parsing errors that could happen in lines that end in continuation mark (\)
Fix: File seeking error that happened when the SI.LOG file got too big. 


Virtual Box 데스크탑 바로가기 (Mac OSX)

VirtualBox에OS 목록에서 데스크탑 바로가기 메뉴가 비활성되어 있다.
기존에 설치되어 있던 Guest OS가 VirtualBox 버젼이업그레이드 되어도
기본적으로 가능 하지 않다.

/Users/계정/Library/VirtualVox/Machines/..
여기에 저장되어 있는 Guest OS는 데스트탑 바로가기가 안된다.
이전 방식으로 저장되어 있는 Guest OS는 지원하지 않는다.

새로운 버젼에서 생성된 Guest OS만이 되는거 같다.

그래서 새 가상시스템을 생성해서 기존에 설치된 .vdi를 잡아주고
새롭게 생성하면 (이미 설치된 OS를 그대로 다시 이용)

/Users/계정/VirtualBox VMs/이하에 OS이름의 폴더
OS.vbox로 존재

이렇게 만들어진 Guest OS는 데스크탑 바로가기가 된다.

이렇게 하여 데스크탑 바로가기를 만들면

어떤 경우 연결 프로그램이 없어서 동작 하지 않는 경우가 있고
실수로 연결프로그램을 VirtualBox라고 잡아주면 실행은 되지만 VirtualBox메니져와
함께 뜨기때문에 가치가 없다.

.vbox 파일에 정보가져오기를 해서 다음으로 열기:에 vmstarter로 해주어야
VirtualBox 관리 어플리케이션 없이 바로 시작이 된다.

이렇게 하면 Lion 시스템 종료를 할때 VirtualBox메니져 프로그램때문에 시스템 종료가
취소 되는 경우가 없이 잘된다.

2011년 11월 1일 화요일

iphone 과 mac 데스크탑과 연동하는 어플을 개발하기 1

mac 데스크탑 어플리케이션을 개발하기위해 준비중인데.

icns라는 파일을 이용한다.

이게 먼고 하니 Mac OS X에선 아이콘이 dock에서 마구 마구 확대되는 이유가

이 아이콘 파일을 사용해서 그런듯

이리 저리 웹서핑을 해보니

icns를 편집하려면?

Adobe Photoshop , Fireworks 에 플러그인으로 제공되는 icon builder라는 프로그램이
있다.

http://www.namgoongu.com/board/writing/content.asp?num=5&bnum=5&Gotopage=1&column=&searchString=

위 주소가 가장 잘 설명된거 같아서 링크를 건다.

mac에서는 이런 icns 파일로 아이콘을 생성해서 xcode에서 작성하는 어플리케이션에 아이콘으로 지정해야 된다.


IconBuilder도 Adobe CS4용 까지만 있는것 같고 해서
기본으로 Xcode와 함께 있는
Developer/Applications/Utilities/Icon Composer

이를 이용해서도 아이콘 작업이 가능해 보인다.

위에 링크는 이미 오래전 OSX 초기 2006년에 글이고
현재는 512x512 256x256 128x128 32x32 16x16
에 이미지만 넣으면 되는거 같다.


2011년 10월 18일 화요일

cocos2d 시작. (설치)

cocos2d를 시작한다.

먼저 standard 컴퍼넌트 만으로 게임을 만드는건 무리 같다.
sudok9 은 standard 컴퍼넌트로만 구성된 게임으로
간단한 에니메이션만 구성되어 있다.

이제 cocos2d를 시작해서 좀더 게임다운 게임을 위한 한발작...

자 cocos2d설치...


http://www.cocos2d-iphone.org/download

템플릿 설치
http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:lesson_1._install_test

현재 2011년 10월 18일

1.0.1 안정 버젼을 내려 받았다.
파인더에서 클릭으로 압축이 풀리면
cocos2d-iphone-1.0.1 디렉토리
여기서

sudo ./install-templates.sh -U
를 입력하면 알아서 템플릿을 설치 한다.

xcode 현재 2011년 10월 18일
4.2 build 4D199 iOS5 sdk
기본 템플릿을 하나 열어서 실행하면 2개의 워닝이 있지만 iOS5 시뮬레이터에서
hello World를 만나 볼수 있다.


2011년 8월 23일 화요일

mac mini 와 T60 메모리 나눠갖기



우연찮게 맥미니랑 노트북이랑 둘다 merom플렛폼에 같은 CPU c2d1.83을 사용한다.
맥미니만 4GB메모리를 설치해도 3GB만 쓸수 잇는게 아니라
T60 노트북도 최대 메모리가 3GB더라.

그래서 맥미니에 2GB x 2설치 되어 있고 노트북에 1GB x2 설치 되어 있는 것을 
사이좋게 3GB씩 나누어 줫다.

메모리 분해 때문에 맥미니를 완전 분해 했다가 결합했더니

OSX lion 에서 인식 하지 않던 CD-RW도 인식해서 
먹었던 CD를 밷어 내더라.

노트북이든 맥미니든 성능상에 아무런 느낌에 변화가 없지만 
왠지 뿌듣한 느낌...

2011년 8월 5일 금요일

SyncMaster TA531 review

모니터를 하나 장만 했다.
혹시 나중에 서브 TV로 쓸수잇을거 같아 HDTV가 되는 넘으로 골랐다.



엄청나게 시원하게 큰 27인치 Full HD LED 모니터 이넘을 설치하고 맥미니에 연결
DVI-HDMI케이블이 하나 들어 있고 나도 하나 가지고 있었다.

실망 할지 모른다. 
화면이 왜이레...

TV는 아파트에 벽에 있는 단자를 연결하니 마치 아날로그 TV수준

머 세탑 연결 하지 않고 하면 그럴수도 있지...

일단 난 모니터를 사용하는거니까?? 화질이 왜이렇지 
내가 가지고 있는 조금더 좋아 보이는 DVI-HDMI케이블 연결

그래도 썩 좋지 않은 text가독성..
화면모드 영화로 설정 하니까 좀 편안해짐..

D-SUB가 오히려 좋음

T60노트북은 D-SUB밖에 없기 때문에 D-SUB는 T60이랑 연결해야 하기 때문에
어떻게 해서든 DVI-HDMI로 해결해야 하는데...

메뉴얼에는 외부입력 편집이라는 타이틀에 10 페이지...

대략 VCR, DVD 등등... 이름을 설정 해두라는 거라 패스할려다가...

HDM 1에 DVI PC 로 세팅 하니까 화면이 컴퓨터 화면 답게....
아주 잘나온다. 대만족... 이거 하나로 완전 대만족...
DSUB도 PC로 세팅 했음.

여기서 교품 받거나 전화 하거나 열받은 유저들이 많을것으로 보임 
메뉴얼을 제대로 쓰지 않았다.

일단 PC화면으로 설정 하고 나니까 T60 노트북이랑 Mac min랑 TV랑 전환이 아주 빠릿 
빠릿하니 깔끔하게 잘도 된다.
아주 맘에 든다.

쓸일이 없지만 PIP도 되고 
USB에 영화도 문제 없이 잘도 플레이한다.
오디오 두개 들어 있는 쿵푸 팬더에서 영어 한국어 잘도 플레이 한다.
요런점이 맘에 든다.


단점1 
IPS가 아니고 TN 계열임 매직앵글 실망
매직앵글이 마치 커버 하는거 같지만 매직 앵글은 사용이 불편해서 있으나 마나한 기능
매직 앵글 기능은 켜서 누워서 볼거다라고 세팅 하는 것임 
세팅 하면 정면에서 볼때 이상하게 보임
32인치 LCD TV가 720p HD이지만 확실히 TV는 어느 각도에서 봐도 쵝오
모니터는 모니터일뿐 절대 LED TV가 아님

단점2 모니터 베젤이랑 화면이 5mm정도 깊고 그게 반사하는 유광 검정이라서 그분분에 화면이 
반사되는게 거슬림 특히 맥OS에 메뉴 타이틀이 비침



2011년 8월 4일 목요일

2007 mid mac mini lion 문제점...


2007 mid mac mini에 라이온을 설치한것은 오바인거 같기도 하지만.
나름 쓸만한거 같기도 하고 10.7.x 로 패치가 나오면 버벅 거리는 UI도 개선??
되지 않을까 하는 마음으로 그냥 쓰고 있다.

딱히 iOS개발에 큰 불편을 주지 않는다면 그냥 쓸려고 했다.
CD-RW를 구울일이 있어서.. 옆에 T60 을 내버려두고 구지 mac mini에 disc를 삽입하는 순간..

쪽 빨아 갔지만. finder 어디에도 나에 CD정보가 없다.
알고 보니 하드웨어 자체를 인식 하고 있지 않았다.

스노우 레오퍼드때는 가끔 사운드가 사라지더니...
이제는 CD다...

CD eject가 안된다.
하드웨어 버튼이 없는 맥은 keyboard eject버튼 부터 해서 파인더에서 eject이라든지 부팅시
마우스 왼쪽 click 모든 방법을 해도 안나온다.

인터넷으로 검색한 모든 방법은 모두 하드웨어가 인식 되었을때 이야기이다.

사운드 카드 인식이 안된것과 마찬가지로 SMC 초기화 .. PRAM초기화
cmd + option + r + p
머 해볼건 다해봣다.
부팅시 마우스 클릭은 머 10번도 더한듯...

나오지 않는 나의 CD-RW 미디어.. 맥미니가 먹어버렸다....

오늘 회사에서 동료 한분은 신형 맥미니를 질렀다고 한다. 부럽다.....
가격도 착해지고 하는데 난 왜 중고로 삿을까 ㅠ.ㅠ...

2011년 7월 25일 월요일

snow leopard & lion multi booting

mac mini 에 결국 라이온으로 클린 설치를 했다.

약간 느낌이 좋아진듯 하다.
스노우 보다 느리긴 한대 그래도 여러 기능들 특히 전체화면 이랑 mission control등등

여러 유혹 그리고 10.7.1 패치가 이 약간 느려진 UI 퍼포먼스를 올려주지 않을까 기대감..

등등으로 snow leopard 클린설치냐, lion 클린설치냐 고민하다가 그냥 라이온으로 엎었다.

이것저것 세팅 하고 타임머신이란것도 함 써볼까 해서

디스크 유틸리티로 파티션을 나누고 타임머신을 세팅했다.

파티션 나누는것도 처음 해본일이다. 부트캠프가 알아서 윈도우 파티션 생성 해주던거 외에

디스크 유틸리티로 나눠보기는 처음

문득 생각이 난건 그럼 다른 파티션에 OSX를 설치하면
부팅 할때 option키로 부팅 디스크를 선택 해서 부팅 하거나

startup disk설정 해서 부팅 할수 있지 않을까? 이런 생각이 문득... 떠올랐다.

구글링하니.. 정말 있다.

http://osxdaily.com/2011/03/12/how-to-install-dual-boot-mac-os-x-10-7-lion-and-10-6-snow-leopard/

일단 500GB에 lion/backup으로 세팅 해서 사용중인데..
패치가 나와도 느리고 작업하기가 정말 곤란 하다고 느껴지면..

snow로 엎고 다른 파티션에 라이온을 설치 한번 해봐야 겠다.

2011년 7월 20일 수요일

wave파일을 효과음으로 내는 허접한 클래스


#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>

@interface SPSoundEffect : NSObject {
    
}
-(void) playWithWavFileName:(NSString *)fileName;

@end




#import "SPSoundEffect.h"


@implementation SPSoundEffect


- (void)playWithWavFileName:(NSString *)fileName
{
    NSString *fpath = [[NSBundlemainBundle] pathForResource:fileName ofType:@"wav"];
    SystemSoundID ssound;
    
    AudioServicesCreateSystemSoundID((CFURLRef)[NSURLfileURLWithPath:fpath], &ssound);
    AudioServicesPlaySystemSound(ssound);
}

@end

2011년 7월 19일 화요일

xcode tip - 주석에 __MyCompanyName__. 바꾸기

$ defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{"ORGANIZATIONNAME"="sparrow apps";}'

터미널에서 위와 같이 입력하면
SPARROW APPS로 된다.

바꾸고 싶은 문자열로 바꾸삼!!

출처 : http://cocoadev.co.kr/114

근데..

Xcode4에서는 이상하게 안됨

__MyCompanyName__ 계속 이넘....

2011년 7월 8일 금요일

Objective-C++ ??

Objective-C로 iOS프로그래밍을 한다.
그런데 Objective-C++ 이란것도 있다.

이게 먼고하니 간단히 이야기 해서 Objective-C에서 C언어를 혼재해서 쓸수 있는것처럼

Objective-C++은 C++을 혼재해서 쓰는 경우를 Objective-C++이라고 한다.

확장자는 .m이 아니라 .mm

C++과  Objective-C와의 클래스 상호간에 상속이 안된다는 제약은 있다.

하지만 C/C++ 로 만들어진 수많은 코드들을 이용하고 싶을때는 사용하면 좋을듯 하다.



언제나 모르는것 새로운것을 알게되는것은 참으로 흥미로운일이다.

2011년 7월 4일 월요일

xcode4 tip: svn 사용하기

기본적으로 xcode4에서 프로젝트를 생성하면 git와 연동이되고
자동으로 리포지토리에 등록이 되서 코드 수정시 마다 변경 이력이 자동으로 되는거 같기도 하다.

근데 잘 모르겠다.

git도 모르겠다.

svn osx 10.6에 기본으로 세팅되어 있으니

# sudo svnadmin create /Users/계정/svnroot
이렇게 입력하고 여기를 리포지토리로 등록하면
이후 프로젝트들을 관리 할 수 있다.

xcode4실행후

file -> Source Control -> Repositories
또는 xocde에서 Organizer를 수행해서 Repositores를 선택한다.
+를 눌러 새로운 리포지토리를 등록한다.

위에서 만든 svnroot의 접근 경로를
file:///Users/계정/svnroot라고 해준다.

그리고 이미 만들어진 프로젝트를 import한다.

다른 경로에 chekout을 하고 거기에 프로젝트 파일을 열어본다.
이후 부터는 버젼 컨트롤이 이루어지고 xcode에서 수정하면 M아이콘과
File -> Source Control -> 메뉴들이 활성 된다.

2011년 7월 1일 금요일

sudoku 풀이 app in appstore

appstore에서 보기

sudoku 풀이 app도  앱스토어에 올라 갔다.

이제 민준이 퍼즐이 앱스토어에서 승인 직전이다.

민준이 퍼즐 버젼이 앱스토어에 올라가면

바로 은준이 퍼즐이 올라가고.

이제 좀 수익이 될만한 아이템을 찾아 무공수련과 함께 운기조식을 하고
좀 제대로된 어플을 만들어야 겠다.

Xcode4 tip -- 도움말 내려 받기

머 그냥 도움말이 나오길래 머 그냥 그냥 썻는데 솔직히 좀 느렸다.
이유가 먼지 몰랐다.

이유인즉 도움말이 기본적으로 Xcode4설치 했다고 설치되는게 아니다.

XCode>Preferences..> Documents탭
Check for and istall updates automatically 를 체크 하고
옆에 Check and Install Now 버튼을 눌러주면
여러번 계정 password확인을 하고
각각의 항목을 Getting...... (내려 받는다.)

이후로는 도움말이 네트워크를 사용하지 않고 로컬에서 쾌적하게 바로바로 찾아진다.

Xcode4 tip -- NSZombiEnabled

Product -> Edit Scheme ->
Run Debug에서 Arguments 탭을 선택
Environment Variables에
NSZombieEnabled 를 추가하고 Value에 YES 를 넣어준다.

객체 release를 했을때 release를 하지 않고 다시 참조 하려고 하는 코드를
디버그 창에 출력 해준다.


앱이 비정상 종료를 할때 NSZombie를 사용했더니 다음과 같은 메세지가 출력됬다.


*** -[UIImage isKindOfClass:]: message sent to deallocated instance

구글링을 하니..



Sounds like you're over-releasing your image objects. Like all the Cocoa collection classes, an NSMutableArray instance retains objects added to it and releases them when it is itself released. If you create an object using a call that doesn't increase its retain count and then release it once you've added it to the array, you'll see this sort of error.
For example:
UIImage *image = [UIImage imageWithData:someData];
[myArray addObject:image];
[image release]; // <-- BAD!
Here you don't own the object image (because you didn't create it using alloc or copy), so you don't need to release it. The pointer in the array now points to an object with a retain count of zero, which will eventually be deallocated.
Using autorelease instead of release in the above example is equally wrong, for the same reason.

답은 imageWithData:someData처럼 머 UIImage가 alloc한게 아니기 때문에 release나 autorelease모두 문제가 된다는 것이다.
덕분에 잘 해결 했다.

2011년 6월 21일 화요일

두번째 앱을 앱스토어에 올렷다.





6/1일 apple개발자를 등록하고 숨가쁘게 두번째 app까지 waiting for review.....
이번 작품?? ㅋㅋ 역시 그냥 허접으로 일단 올려보자 앱이다.
수도쿠 문제를 입력하면 수도쿠 문제를 풀어주는 앱....

다음앱은 민준이 100일 기념 슬라이드 퍼즐.. 

2011년 6월 17일 금요일

sudoku generation algorithm....

머 인터넷 뒤져 보면 무지하게 많겟지만...
실제로 찾아 봣음
Prolg로 된거... VB로 된거...
수학... 어렵더라....
막만들어 보면 행....
그렇지 사람이 쓰다가도... 지우고 다시 써야 되는 상황이 온다...

램덤으로 항상 1 ~ 9 를 생성 하는거는 좀...
어짜피 가용한 숫자가 몇개 안되는 상황에서...

그래서 짱구좀 굴린건...
칸을 체우다가 보면 앞으로 가능한 숫자는 점점 적어진다.
그걸 가능 배열이란 곳에 만들고
처음에 이 가능 배열은 1 ~ 9가...
근데 점점 적어지겟지..
이 가능한 숫자 배열에 불가능한 넘들은 100으로체워 버리고 바로 소트 시켜 버려서
가능한 숫자는 앞쪽으로
그리고 랜덤으로 생성하는건 가능한 숫자들의 개수로 해서 인덱스로 찾으면 좀더 빠를거
같아서.

그리고 오늘 옆자리 짝궁에게 들은 백..
그렇지 잘못되어서 더이상 쓸수 없는 경우는 되돌아 가야 하는데..
7*9 즉 7줄 이상 진행 햇을때는 2줄 백하면 문제가 없고
이하로 진행된경우는 그냥 1줄 백하면 된다.

해서 만든 허접 프로그램...


//
//  main.c
//  sudoku_gen
//
//  Created by sparrow on 11. 6. 16..
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//

#include
#include
#include
#include
#include

int gArray[9][9]={0,};
int gAvail[9]={1,2,3,4,5,6,7,8,9};

int fn_qsort_intcmp( const void *a, const void *b ) 
    return( *(int *)a - *(int *)b); 

void makeAvailList(int x, int y);
int setNum(int x, int y);
int isConflict(void);

int main (int argc, const char * argv[])
{
    int cnt = 0;
    int x =0;
    int y =0;
    int res;
    
    double start,end;
    
    srand((int)time(NULL));
    start = clock();
    
    do{
        res = setNum(x, y);
        if (res)
        {
            cnt ++;
            y = (int)cnt / 9;
            x = cnt % 9;
        }
        else
        {
            if(isConflict())
            {
                //back
                if (cnt > 62)
                    cnt = (cnt - 9) - x;
                else
                    cnt = cnt - x;
                
                if (cnt < 0
                    cnt =0;
                
                y = (int)cnt /9;
                x = cnt % 9;
            }
        }
    }while(cnt < 81);
    
    end = clock();
    
    printf("time : %f\n", (double)(end - start)/CLOCKS_PER_SEC);
    for(y=0;y<9;y++)
    {
        for(x=0;x<9;x++)
        {
            printf(" %d ",gArray[x][y]);
        }
        printf("\n");
    }
    
    return 0;
}

void makeAvailList(int x, int y)
{
    int i,j;

    for(i=0;i<9;i++)
        gAvail[i]=i+1;
    
    for (i = 0; i <= x ; i ++ )
    {
        for( j = 0; j <9 ; j++)
        {
            if ( gAvail[j] == gArray[i][y] )
                gAvail[j] = 100;
        }
    }

    for (i = 0; i <= y ; i ++ )
    {
        for( j = 0; j <9 ; j++)
        {
            if ( gAvail[j] == gArray[x][i] )
                gAvail[j] = 100;
        }
    }
    
    qsort(gAvail, 9, sizeof(int), fn_qsort_intcmp );
    
}

int setNum(int x, int y)
{
    int idx;
    int num;
    int cnt;
    
    cnt = (9 - x);
    idx = rand() % cnt;
    
    makeAvailList(x, y);
    
    num = gAvail[idx];
    
    if ( num != 100)
    {
        gArray[x][y] = num;
        return 1;
    }
    else
    {
        return 0;
    }
}

int isConflict(void)
{
    int i;
    int cnt = 0;
    for( i =0; i <9; i ++)
    {
        if(gAvail[i] != 100)
            cnt ++;
    }
    
    if (cnt == 0)
        return 1;
    else
        return 0;
}


성능을 측정하는 코드도 넣어 보았다.
생각 보다 빠르다. 
내컴터가 그렇게 좋은것도 아니고 xcode4 디버그 환경인데...
빠르다..
[Switching to process 1411 thread 0x0]
time : 0.005082
 7  9  8  4  6  3  1  5  2 
 9  3  4  5  7  2  8  6  1 
 4  2  1  8  9  6  3  7  5 
 3  5  2  7  8  1  9  4  6 
 1  7  3  6  4  5  2  9  8 
 8  6  9  3  1  4  5  2  7 
 6  4  5  1  2  8  7  3  9 
 2  1  6  9  5  7  4  8  3 
 5  8  7  2  3  9  6  1  4 
Program ended with exit code: 0

허접 sudoku 앱을 만들기에는 부족하지 않을듯..




이런... 지금 다시 보니 개버그....

3x3 셀 안에서 1 ~ 9를 사용했는지를 체크하는 루틴이 없어서...
중복 숫자가 셀속에 있는 개버그...
완전 잘못 만들었다.. sudoku를 잘 모를고 만들엇네.... 

2011년 6월 15일 수요일

처음으로 올려본 app이 등록이 되었다.

일단 전혀 어렵지 않게 만든 어플이고 
너무 간단하고
이런 프로그램이 필요 할까??
아무렇게나 만들고 이런 프로그램이 이미 수십여개가 있고
심지어 오타까지 ... 이게 그대로 스크린샷으로 올라 갔는데도...

apple에서는 바로 올려 주었다.

waiting for review상태에서  reject되겟찌... 
머 그렇게 힘들게 만든것도 아니고 app store에 올리는 프로세스 정도 알아보기 위해 해본
것인데..

무사히 올라 갔다.


이제 부터 본격적으로 app을 개발 해야겠다.

6/1 apple developer

6/8 app uploda

6/15 ready for sale까지

아주 빠르게... 허접 프로그램을 올려 보았는데...

아이디어가 없는한 이런 허접한 프로그램이라도 다수 올려야 겠다.

2011년 5월 30일 월요일

Mac PRAM reset

맥미니에서 갑자기 오디오가 디바이스가 사라지는 현상이 발생했다.
제부팅 하면 부팅이 안될때도 있다.
전원을 강제로 끄고 전원 플러그를 뺏다가 다시 키니 부팅이 된다.

이상 현상이 발생 했다.

첫 증상은 사운드가 안되고
하드웨어 정보를 보면 오디오에 가용 장치가 없다고 나타났다.

맥미니에 사운드가 안된다고 나오는 증상으로 검색을 하니 아래 글이 연결 되고

mac mini audio output problem

해결 방법으로 PRAM reset 이란것이 있다.

PRAM reset

cmd + option + p + r

부팅음이 두번 들린다.

부팅이 부팅음이 울리고 부팅이 된거 자체가 사운드 디바이스 초기화가 이루어진것 같다.

정상적으로 부팅이 되고 오디오도 동작하고
이렇게 블로그에 글도 쓴다.

근데 왠지 불안 불안...

역시 mac os도 m$ windows처럼 꼬이기도 하나???

잘 모르니 더 겁이난다.

부팅이 안될때는 ROM bios같은것도 없으니 더 손쓸 방법이 없다.

2011년 5월 29일 일요일

iOS SDK - PickerView




간단한 사용방법을 기술한다.


내용을 위해서 .h 파일에 선언 한다.
NSMutableArray *pickData;


.m 파일에
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    pickData = [[NSMutableArrayalloc]init ];
    [pickData addObject:@"asd1"];
    [pickData addObject:@"asd2"];
    [pickData addObject:@"asd3"];
    [pickData addObject:@"asd4"];
    [pickData addObject:@"asd5"];
    [pickData addObject:@"asd6"];
  
    [super viewDidLoad];
}

viewDidLoad 메서드에 주석을 제거 하고 데이터를 addObject메세지로 추가 한다.


3개의 메서드를 구현해야 한다.

//몇개가 선택되느냐??
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

//총 몇 row인가
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return [pickData count];
}

//선택 된 text
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [pickData objectAtIndex:row];
}

// 클릭 이벤트 
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    selectedData.text=[pickData objectAtIndex:row]; // <-- selectedData 레이블 에 값 전달
}

2011년 5월 26일 목요일

imac 2.4inch c2d2.8ghz ram upgrade

iMac은 업그레이드가 다 안되는줄 알았다.
알아 보니 메모리 업그레으드는 정말 간단하다.

iMac은 노트북 플렛폼 (하드디스크 제외) 이기 때문에 노트북용 메모리를 이용한다.

http://support.apple.com/kb/ht1423

2GB 에서 4GB로 업그레이드 했다.

산뜻한 느낌

구형 2008 early iMac 24인치 인데
더욱더 오래 잘 쓸수 있을듯.....

2011년 5월 21일 토요일

하운드 HD 리뷰

삼천리 자전거 하운드 HD를 구매 하였다.
자전거에 대한 전문가는 아니고 그냥 2륜을 좋아하는 라이더로써
느낌을 적어 본다.

하운드 700D와 하운드 HD 두모델을 고민 끝에 하운드 HD로 선택했다.
스펙은 거의 동일한데 가장 큰 차이점은 로드형 타이어 체택 이다.
그래서 나의 자전거 타기에 목적상 로드형 타이어를 장착한 하운드 HD를 선택 했다.

무게
무게는 로드형 타이어를 장착해서 인지 인터넷 쇼핑몰 기준 스펙으로 900g이 하운드 700D에 비해 가볍다.
14kg 전에 타던 자전거가 생활형 철TB에 접이식 으로 중간에 있는 거대한 경첩 무게
때문인지엄청 무거웠다.
그러한 자전거에 비하면 가볍다.
하지만 저질 체력을 지닌 나로써는 아주 가볍다고 느낄 정도는 아니다.
아파트 11층에 사는데 지금까지 벌써 엘리베이터 중지 상황이 두어번 있었다.
철티비 들고 11층을 걸어 내려가서 팔이 끈어질번한 경험이 있기 때문에
조금이라도 가벼운 알류미늄 프레임에 자전거를 사고 싶어 하운드 HD를 선택 했다.

디스크 브레이크
모토바이크 라이더인 나로서는 자전거를 좀 우습게 생각했다.
전문적으로 자전거를 좋아하는 매니아 들은 어떻게 들을지 모르겠지만.
엔진 바이크그것도 2종소형 면허를 가지고잇는 나에게는
자전거의 속도 브레이킹 이런건 너무 우습게 여겼다.
좀 고급 자전거에 디스크 브레이크가 들어간다는것을 알고선 자전거에 무슨
디스크 브레이크 식이나... 이런 마인드 였지만 막상 자전거를 사려고 하니 디스크 브레이크가 땡긴다. 그래서 하운드 시리즈를 선택 했다.
여튼 하운드 HD 기계식 디스크 브레이크가 달렸다.
이게 왠지 일반 생활 자전거에는 없고 고급자전거에만 있다 하니 더욱 이뻐 보인다.
디스크 브레이크때문에 다소 무게가 나간다고 하는데. 그 값어치를 할련지..
실제로 타보니 브레이크도 잘걸린다.
디스크 브레이크에 단점이 무게도 무게거니와 소음이 있다고 하던데 V브레이크도 머 전에 타본 철티비에서 브레이크 소음이 발생했다.
이정도 소음이라면 애교로 바줄 수 있다.
많은 시간을 타보지 못했지만 브레이크 성능은 죽이는거 같다.
앞브레이크 : 뒷브레이크를 모터 바이크 탈때는 7:3 내지 8:2를 잡았었다.
오른속 왼손을 같이 잡는 비율을 그렇게 습관들여야 겠다. (모터바이크는 오른손 앞, 발 뒤)
성능이 좋은 하운드 HD에 디스크 브레이크로 잭나이프 까지 연습하면 쉽게 할수 있을거 같다.

시마노 아세라 24단 기어
제일 맘에드는 부분이다.
철티비에서 아날로그 같은 느낌에 그립기어는 최대로 땡기느냐 최대로 풀어주냐 로
그냥 기어 변속을 했다.
결국 가장 작은 기어로 내려가지 못하고 가장 큰 기어로 올라가지 못하고
앞 기어 같은 경우는 가운데 기어에서 고정되던가 가장큰 기어로 올라 가던가
즉 5단 정도 가끔 5 x2 정도를 사용할수 있었던거 같다.
아파트 단지 입구에서 우리동까지 한번도 자전거로 완주 해본적이 없는데.
하운드 HD를 가지고는 별로 힘들이지 않고 완주 한다.

그외 나머지
조립은 머 어렵지 않았다.
하지만 부품들이 그렇게 고급 스럽지는 못하고 화학 냄새가 좀 심한편이다.
색상은 일부러 튀지 않게 검정을 골랏는데.
도둑이 두려워 색상을 포기한것은 정말 바보짓 같다.
지나다니는 하얀색 자전거나 연두색 자전거를 보면
내가 검정을 선택한것은 실수 같은 느낌이 든다.
그래도 나에게는 이쁘고 가볍고 주행잘되고 브레이크 잘드는
어느 정도 수준의 고급 생활 자전거임에 틀림 없다.

2011년 4월 29일 금요일

replace iphone 3gs ear speaker

저번 강화유리 교체에서 이어스피커에 손상이 있었던거 같다.
거기에 그릴망이 사라져서 그릴망 마져 없다.
해서 아에 상판을 나의것과  와이프의 상판을 바꿔서 조립했다.
통화 할때 이어폰을 끼고 하면 문제는 없지만 그냥 통화를 하면 조금 거슬리기는 했다.
옥x에 부품 판매한 곳에 문의를 했더니 이어스피커는 4000원
그릴망은 그냥 준다고 한다.
또 주문을 했고 오늘 택배가 왔다.
벌써 아이폰 뚜껑을 열어 본게 몇번 되니 이제 그냥 자연스레 연다.



저번에 잃어 버렸던 그릴망을 와이프가 찾았다. 하지만 새로 그릴망이 왓고 그 위에 보이는 것이 이어스피커다.
아주 작은 부품인데 택배에는 박스에 뽁뽁이 비닐까지 잘 포장되어 배달 되었다.



그릴망이 없는 나의 아이폰 구멍 두개가 보인다.




아주 쉽게 상판을 분리, LCD를 분해 하고 작업 준비 끝!!




강화 유리와 미들 프레임에 분리는 강화유리가 깨진 상태가 아니므로 비교적 쉽다.
헤어드라이기로 열을 가하고 조금씩 떼어 내면 쩍 벌려 떼어 낼수 있다.

i fix it 사이트에서는 강화유리를 떼어내지 않고도 조도센서와 이어스피커 커버를 열수 있다고
되어 있지만 사실 어렵다.
난 그릴망도 부착해야 하기 때문에 강화유리 분리를 했다.



강화유리를 분리하고 나면 미들프레임에서 조도 센서및 커버 분리가 쉽다.
일자 드라이버로 강화유리 뒷편에 3군데만 눌러주면 분해가 된다.


기존이어 스피커가 달려 있는 모습이다.

기존 이어스피커를 쪽집게로 떼어내고 새 이어스피커를 넣었다.

그릴망을 붙이고 강화유리를 붙이고 조도센서및 커버를 장착하고
분해에 역순으로 하면 조립이 된다.

3번 케이블에 대해 자세히 언급하지 않은거 같아서 결합할때 3번 케이블 사진이다.
3번 케이블은 결합시에 잘 밀어 넣고 손으로 젖힌것을 내리면 된다.


모든 조립을 완료하고 테스트 통화음이 시원하게 잘들린다.
총비용이 그래도 사설 수리업체에 강화유리를 교체한것보다는 적게 들었다.

베터리, 강화유리, 그외 작은 소소한 부품도 할 수 있다.
작은 부품에 손을 대기전에는 i fix it같은 사이트를 반드시 참고하고 분해에 들어가야
http://www.ifixit.com/Guide
나 처럼 이어스피커 파손사고를 경험하지 않을듯.

2011년 4월 25일 월요일

replace iphone 3gs battery myself

일단 강화유리 교체 하듯이 상판 하판 분해 방법은 동일하다
하단에 나사 두개를 풀고 유리 흡착기로 강화유리에 붙여서 힘을 줘서 분해
한번 해본거기 때문에 아주쉽게 작업이 된다.
케이블도 이제 다른 블로거들에 사진을 보면서 하지도 않고 그냥 제거 한다.

이제 베터리 교체를 위해서는 하판에 주목한다.

여기도 친절하게 케이블에 번호가 모두 적혀 있다.
모든 케이블을 제거하고 아래쪽을 향하고 있는 나사를 다 제거한다.
7번 케이블 밑에는 do not remove라는 스티커가 있는데
제거 해야 나사가 있다.
이거 꼭꼭 숨겨 놧는데 안제거 하고 들면 메인보드가 부서질듯 하다.
그리고 상단에 카메라 나사를 제거 하고 카메라 모듈을 분해 하지 않으면
카메라 모듈에 커넥터와 메인보드 커넥터를 나중에 마추지 못할것이다.
반드시 카메라 모듈도 분해 해야 한다.

1년 2개월 사용에 보험 미가입 AS포기 이므로  Do not remove를 확실하게 제거해서 메인보드에 그냥 붙여 버렸다.



메인보드를 제거하면 베터리가 보인다.
아이폰은 양면테이프로 고정된 부품이 많다.
베터리도 마찬가지다. 상단에 무슨 손잡이 같은거 죽어라 당겨도 안빠진다.
그냥 그 손잡이랑 베터리랑 틈에 지렛대난 일자드라이버 넣고 양면테이프에 접착력을 이겨내야 한다.


그래야 이렇게 분리가 된다. 양면테이프를 제활용해야 하니 가지런히 잘 놓고
새로 구매한 베터리르 넣은다음 분해에 역순으로 결합을 하면된다.
이렇게 분해해 보니 외관에서 크롬부분이랑 아래케이스랑 틈이 생기는건
하판에 안쪽 나사를 어찌하면 될거 같은데.. 그냥 내비두었다.
문제가 되면 나중에 아에 뒷케이스 사서 갈아버리면 된다는 마인드....

이제 아이폰에 칼을 대기 시작 했으니 가끔 맘에 안들면 분해...

결론:
베터리 1년 2개월 사용한 베터리와 새로구매한 베터리에 느낌이 별로 없다.
내가 관리를 잘한건지. 원래 아이폰 베터리가 이모양인지.
전에 쓴던게 조금 더 쓰면 확 시간이 줄어들건지...
베터리는 12000원에 저렴하니 와이프 아이폰에 베터리 시간이 많이 단축 된다면
아주 쉽게 교체해 줄수 잇을듯 하다.

iphone 3gs fix myself

와이프 아이폰 강화유리 파손
내 아이폰 노후화에 의한 베터리 교체

두가지작업을 결심 하고 옥X에 가서 물품을 구매 했다.
강화유리 16000원
수리킷 4000원
미들프레임 7000원 ( 혹시나해서 )
베터리 12000원

이렇게 구매 했다.

왼쪽 부터 강화유리, 베터리, 수리킷, 미들프레임
수리킷에 구성은 십자드라이버, 일자드라이버, 지렛대 큰거1 작은거1, 기타 칠때 쓰는거 같은것
인형유리에 흡착 하는거, 기타 칠때 쓰는건 어디에 쓰는지 모르겟음
나머지는 가끔씩 썻던거 같음

먼저 before상태 ..


왼쪽 나의 아이폰, 오른쪽 강화유리가 박살난 와이프 아이폰

준비물은 수리킷이면 다 해결이 되지만 이런 작업을 할때 반드시 필요한것은 자석이다.
아이폰의 경우 나사가 매우 작을 것이고 우리집 바닥은 마루 바닥이라서 틈에 그게 들어간다면
아주 곤란할것이다. 하여 자석을 준비 했다.

제일 먼저 충전 부분에 나사 두개를 분리 한다.



나사를 분리 하고 유리흡착하는것을 유리에 붙인뒤에 힘껏 들면 아래 부분이 살짝 열린다.
힘을 너무 가하게 주면 안에 있는 케이블 커넥터들이 손상 될거 같고 어느정도 주지 않으면 꿈적도하지 않는다. 적당히 ??


케이블들에 번호가 써있다. 다른 블로거들 사진을 참조 해서 나도 분해를 한것인데. 저 번호는 그들이 스티커를 붙여 놓고 찍은줄로 오해 했었다. 
근데 실제로 되어 있다. 1번 2번을 떼어 분리 하면 속에 3번이 나온다.
사진을 찍지 않았지만 3번은 지렛대로 앞부분을 졎혀 주면 뒤로 빼는 스타일이다.
그걸 그대로 기억하고 있다가. 나중에도 케이블을 삽입하고 닫아줘야 한다. 케이블 삽입할때 어느정도 들어가 있었는지 반드시 기억하길..
케이블을 제거 하고 나면 상판 하판으로 나뉜다.


상판에 나사 6개를 제거하고 유리흡착을 다시 붙여서 떼어내야 한다.
잘안된다면 일자 드라이버로 틈을 벌려 주는 방법을 써야 한다.

왼쪽 부터 분리를 위해 다시 유리흡착을 붙이고 일자드라이버를 틈을 벌리고 있고
오른쪽은 새로 구매한 미들 프레임
이렇게 하면 LCD가 분리 된다.



강화유리+미들프레임 과 LCD가 분리되면 
파손된 강화유리를 미들 프레임과 분리를 해야한다.
분리 방법은 이상하게도 아이폰에 유리는 그냥 양면테이프로 고정되어 있다는 것이다.
헤어드라이기로 열을 주어 떼어 내야 한다.

그리고 난 미들 프레임을 구매했기 때문에 새로산 강화유리+미들프레임을 결합하면 끝인줄 알았는데. 여기서 내가 사전에 잘못 조사한게 있었다.

기존 강화유리를 제거 하는 빡신 작업을 피하려고 7000원이나 주고 미들프레임을 구매 했지만..
파손된 강화유리를 제거해야만 전화수화 스피커랑, 스피커 옆에 있는 센서들 
그리고 홈버튼을 분해 할수 있다.

사전 조사에 의하면 헤어드라이기 작업을 하다가 미들프레임에 변형이 올수도 있다고 해서
이부분을 하지 않으려고 한것인데 정말 힘든 작업이다.
여기서 포기 하면 그냥 사설 수리업체에 가는게 낳을듯

그리고 미들프레임을 구매 하지 않고 기존 미들프레임을 그냥 쓰는 방법이 훨씬덜 힘들다.
이유는 스피커 분해가 장난아니게 어렵다는것

위에 보이는게 스피커인데 이거 머 어찌 설명을 할수가 없다. 수리킷에 있는 일자드라이버로 해도 안되고 결국 바늘까지 이용해서 힘들게 분해 했다. 구리선 하나 끊어지면 통화 소리가 안들리는 ...
이거 따로 구매 해야 하나. 고장난건 아닌가 울뻔했다.

이제 조립은 역순으로 
내경우는 기존 미들프레임에서 센서, 홈버튼, 스피커를 분해해서 새로산 미들프레임에 이식하고
3M양면테잎이 미들프레임에 붙어 있는거에 강화류리를 붙이고
LCD결합 
하판과 케이블결합
하단 나사 2개를 조여줌으로써
강화유리교체를 끝마쳤다.



이게 After사진 되겠다.
통화 잘된다. 사실 스피커 분해시 너무 괴로웠기때문에 ... 가슴도 졸이고...
혹시 통화시 소리가 안들릴까봐...
부팅은 되려나...
걱정했는데.. 다 잘된다...


결론 :
강화유리교체 조금 어렵다.
미들프레임을 사서 부품을 옴기느니. 드라이기 작업을 좀더 신중히하고 기존 프레임을 쓰는게 쉽다.
아니면 미들프레임+센서+홈버튼+스피커+강화유리 이렇게 되어 있는 제품이 30000원에 있다면
난 옥X에 상품후기로 남겼다. 
좀비싸더라도 이걸 사는게 가장 속편할듯..

베터리 교체는 다음 ......으로........








2011년 4월 19일 화요일

NDRIVE for MAC 아직도 200MB 업로드 제한!!

NDRIVE가 맥용 어플도 있고 30GB 업그레이드 약속도 지켜줘서 고맙기는 한대..
언제까지 맥용 어플은 최대 200MB 업로드 제한... 이 해결 안되는지...

동영상이랑 사진이랑 모두 NDRIVE로 관리 하려고 하니 200MB넘는 동영상들이 업로드되다가
모조리 팅겨 버리니 짜증이 지대로 나고 있다.

맥에서는 2% 부족한데...

어째꺼나 다음클라우드, KT Ucloud, NDRIVE 요넘들 덕에 데이터 공간이 많이 늘어 났다.
사용은 이것 저것 나누고 와이프 계정까지 포함 하니 남아 돈다.

사진 같이 중요한 자료는 역시 깜박하고 백업 안하고 포멧 할수 있는 컴퓨터보단.
이런 네트워크에 여러군데 깔아 놔야 안심.

2011년 3월 26일 토요일

mac에서 이제 기업은행은 인터넷뱅킹 잘된다.

이제 우리도 할 수 있습니다.
우리 이때 까지 인터넷뱅킹 못해서 어땟나요. 컴퓨터 나두고 은행까지 뛰어가다가 숨차서 이체 못시키고.. 이런 설움 이제 ... ㅋㅋ

난 기업은행을 주로 사용한다. 그런데 mac을 쓰면서 모든 사람들이 가장 걱정 하는것은 인터넷 뱅킹일것이다. 나두 마찬가지로 인터넷 뱅킹때문에 윈도우 머신이 하나 있고, 맥에도 항상 VBox속에 윈도우 하나는 설치해서 인증서를 넣어둔다.

근데 언젠가 부터 기업은행에 접속하면 마치 모든 플렛폼에서 인터넷뱅킹이 되는거 같은 팝업광고를 보았는데. 오늘에서 비로서 테스트 해보았다.
osx에서 사파리만 된다. 리눅스는 파폭인듯

나는 인증서도 USB로 들고 다니거나 하지 않고 해당 컴퓨터나 가상 머신에 직접 복사해 넣는다. C:\Program files\NPKI
windows 7 64bit 에서도 x86디렉토리 상관 없이 무조건 C:\Program files\NPKI 다

근데 OSX에다가 하려니 이거 어디다 복사 해놔야 하나??

sparrow-mac-mini:/ sparrow$ cd /Users/sparrow/Library/Preferences/NPKI/
위처럼
/Users/계정/Library/Preferences/
여기에 NPKI를 통재로 넣으면 된다.

아이제 mac에서도 자유로운 기업은행 인터넷 뱅킹시대가 왔다.

점차 다른 은행들도 되겟지..

근데 아쉬운점은 X큐어 머시기 자물통 아이콘이랑. nP텍트 머시기 방패 아이콘 설치 된다.
물론 기업은행 페이지에 접속 할때만.

2011년 3월 19일 토요일

uclud, naver ndrive, daum cloud

ucloud
KT에서 가입자에 한해서 20GB를 사용 할 수 있다.
OSX 용 어플이 있고 두대에 컴퓨터를 세팅해서
집에 있는 mac mini 와 회사 iMac에 폴더를 모두 사용 할 수있다.
아이폰 응용프로그램도 있어서 가끔 동영상을 인코딩 하자 마자 ucloud에 넣어 아이폰으로
내려 받아 보기도 했었다.

NDRIVE
ucloud보다 먼저 출시 되었지만 mac용 어플도 없었고
용량도 적었고 무엇보다도 200MB 업로드 제한
이런 여러 점으로 오래된 사진만 올리고 잘 사용하지 않았다.
아이폰 어플도 그냥 사진 보는 정도로 이용했다.

다음클라우드
용량 20GB에 기능도 단순해 보이면서 OSX어플이 처음부터 제공된다.
아직 아이폰 어플은 없는거 같다.


어째거나 유저로서 아주 바람직한 무료 데이터 제공으로 인해 백업 활동이 편리해 젔다.
얼마 전에 T60에 windows7클린 설치를 했다.
자료 백업은 사진이 주요한일이다.
서비스팩이랑 기본 업데이트 사항 정도만 설치 하고 바로 windows 백업으로 이미지를 만들었는데 대략 15기가 이정도의 백업 이미지 크기가 생긴다.
사진은 네이버 드라이브에 윈도우즈 백업은 다음에
기타 OSX 데이터 등등은 ucloud 에 넣어야 겠다.

mac mame

osx 에서도 예전 오락실 게임을 즐길수 있도록 mame가 있다.

http://www.macmame.org/files/MacMAME-0.103u2.dmg

3 - insert a Quarter
1 & 2 - 1 and 2 player start
ESC - Pause
TAB - access configuration menu, ESC to return to the game
F3 - reset the emulated machine
F4 - show the charsets. Use the arrows to navigate through the various combinations, ESC to return to the game
F7 - if cheats were enabled in the front-end, this allows you to toggle them on and off
F8 - cycle through frameskip options
F9 - cycle through the volume levels
F10 - toggle speed throttling
F11 - toggle FPS
F12 - save a screenshot


문제는 내가 좋아 하는 게임중에 테라크레스타를 한번 해봣는데 이게 디폴트 키가 control , alt를 이용한다.
osx에서는 기본적으로 ctrl + 방향키는 데스크탑 화면 전환이기 때문에 총알 한번쓰고 화면이 전환된다.

위에 mame 키 구성 모 다른 플렛폼도 비슷 하다. 직감적으로 5번 눌러서 코인 하고 1눌러서 스타트 하는게
본능 처럼 여기서 tab 키를 누르고 게임 키를 변경 좀 오래도록 기다려야 된다.
여러키를 지원 하려고 인터페이스가 하나 누르고 오래도록 입력이 없어야 되는거 같다.

테라크레스타의 경우 z, x로 변경하고 게임 종료후 다시 실행해보니 키를 기억하는거 같다.

2011년 3월 17일 목요일

코드를 힙에 복사해서 실행 하기

mprotect() 함수

int mprotect(const void * addr, size_t len, int prot);

메모리 영역 보호 설정하기

호출 프로세스의 메모리 페이지들 가운데 addr, addr+len -1  주소 범위를 포함하고 잇는 것들에 대한 보호 방식을 변경 한다.

PROT_NONE : 접근할 수 없다.
PROT_READ : 읽기
PROT_WRITE : 쓰기
PROT_EXEC : 실행

이걸로 다음과 같은 작업을 할수 있다.

함수를 함수 포인터에 카피한다음
그걸 수행 하게 할수 있다.
즉 heap영역에 코드를 복사하고 수행 할수도 있다.

func();  < --- 어떤 수행을 하는 코드가 있다고 하고

memcpy( p, func , 대강 크기);

p어드레스를 수행 가능하게 mprotect()를 해주면

p를 수행 시킬수도 있다.

ex) binary hacks라는 책에서 발췌
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>

double func(void)
{
    return 3.14;
}

void allow_execution(const void *addr)
{
    long pagesize = (int)sysconf(_SC_PAGESIZE);
    char *p = (char *)((long)addr & ~(pagesize -1L));
    mprotect(p, pagesize * 10L, PROT_READ | PROT_WRITE | PROT_EXEC);
}

int main(int argc, char **argv)
{
    void *p = malloc(100);
    memcpy(p, func, 1000);
    allow_execution(p);
    printf("PI equals to %g\n", ((double (*) (void))p) ());
}

$./mprotect2
PI equals to 3.14

2011년 3월 16일 수요일

windows7 과 mac mini간에 공유

OSX에서 공유 설정으로 smb ( samba )로 설정을 하고
윈도우 7에서 네트워크 드라이브로 설정하면

OSX에 디렉토리를 공유 드라이브로 사용할 수 있다.

비교적 간단한 설정 같고

OSX에다가 VirtualBox를 설치해서 XP설치후 바로 세팅해서 OSX와 XP 간에 데이터를
공유하게 세팅을 한다.

windows7에서는 이렇게 하면

매번 네트워크 드라이브 경로를 찾지 못한다면서 인증을 다시 하게 하고
분명 자격증명을 저장 했는데도 계속 귀찮게 한다.

구글링을 했더니 windows7 에서는 로컬정책 세팅을 좀 해줘야 한다.
제어판->관리도구->로컬보안정책
보안옵션

네트워크 보안:  LAN Manager 인증 수준 ->  LM & NTLM responses 응답보내기
네트워크 보안: NTLM SSP 기반 서버에 대한 최수준 -> 128비트 암호화 필요 체크 해제

이렇게 설정을 하니 네트워크 드라이브 설정하고 자격증명을 저장 하면
바로 바로 붙는다.

그러나 OSX파일 시스템과 NTFS파일 시스템에 차이로 인지
windos7에서 제공하는 백업 기능으로 네트워크 드라이브를 지정하면 실패 한다.

원래의 목표는 맥미니에 windows7 디스크를 백업하려고 했는데.
다른 백업 유틸리티를 사용해야 될듯 싶다.

2011년 3월 12일 토요일

tucsonIX 서비스 센터 방문

BLU hands 에서 에어컨 관련 에어컴프레샤를 교환 받은적이 있다.
아주 더운 여름에 에어컨이 고장나서

이번에는 시동걸면 RPM이 불안정 하다가  시동이 꺼지기도 한다.
게시판을 보고 BLU hands를 찾으려다가

현대자동차 서비스 센터 서구 가좌동에 가기로 했다.
규모도 엄청 크고 친절하고 바로 고객 휴게실을 안내

지금 고객 휴게실에서 인터넷중이다.

무선인터넷에 TV에 커피 고객 휴게실은 최고인거 같은데. 조금 후 8:40부터 정비 시작.
내 애마가 잘 수리되어지기를 바란다.

windows7 sp1 설치시 반드시 지켜야 할거

windows7 64비트를 재설치 하였다.
OS설치후 바로 해야 할일 백신 설치
V3Lite를 바로 설치 했다.
그리고 windows update 알림을 보니 64개의 업데이트가 어쩌구 한다.
windows7도 나온지 꾀됫으니 지금껏 나온 보안 업데이트 등등이 64개나 되나 보다.

무심코 업데이트 시켰다. 한동안 다운로드 받고 설치 하고
큰글씨로 몇% 구성중 오랜시간 동안 동작 하더니
실패....

한번더 실패....

sp1이 나왔다는 이야기를 들은적이 있고 이번 서비스팩은 보안업데이트 묶음이라는 글도
본적이 있어서 이거 받아서 설치 하면 끝이겟거니..

900여MB 의 SP1을 받았다.
설치 시도. 업데이트 설치와 비슷하게 ... 한동안 시간이 걸리더니
실패....

OS재설치후 설치한것은 v3lite 밖에 없는데.
v3lite uninstall
SP1설치 바로 성공

이상태를 바로 백업 받아두고 노트북 덮음 피곤.

2011년 3월 11일 금요일

osx hostname 변경하기

회사에서 사용하고 있는 iMac을
포멧 하지 않고 그설정 그대로 사용하고 있다.

해킨 설치 몇번에, 리얼맥에서 OS 설치는 중고 맥미니를 사자 마자 leopard에서 snow leopard로 한번 설치 해본것이 osx설치 경험이 전부이고,
별문제 없으면 그냥 쓰는 스타일이라서 OS재설치를 하지 않았다.

하지만 조금 걸리는 것은 터미널을 띄 우면
cloud:~ sparrow$

이렇게 프롬프트가 나오는것이 맘에 들지 않았다.

시스템 설정에서 공유 설정에 들어가서 컴퓨터이름을 sparrow.local이라고 변경 해도 항상
저렇게 나온다.

구글링을 통해 osx에서 호스트 이름을 변경 하는 방법을 알아냈다.

sudo scutil --set HostName hostname.local

변경이 되더라..


sparrow:~ sparrow$ hostname
sparrow.local
sparrow:~ sparrow$

이걸 몰라서.. 얼마나 해멧나..

2011년 2월 25일 금요일

stack overflow 상태에서 sigaction처리 하기.

sigaction()
signal handler를 작성해서 특정 시그널에 따라 어떤 조치를 취하도록 할 수 있다.

시그널이  발생했을 때 에러 원인을 파악하기 위해

 backtrace()
backtrace_symbol()
함수를 이용해서 호출 스택까지도 출력할 수 있다.

문제는 stack overflow가 발생해서 SIGSEGV 가 된경우 이를 처리할 함수 조차 호출 할 수 없다.

이를 해결 하기 위해 sigaltstack()함수로 미리 스택영역을 잡아두는 방법이 있다.



$cat stack_overflow.c
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define STACK_SIZE ( 4 * 1024 )
static int is_altstack_defined =0 ;
static char tmp_stack[STACK_SIZE];
void sig_segv(int signo);

int foo()
{
    return foo();
}
void sig_segv(int signo)
{
    printf("stack overflow\n");
    exit(-1);
}

static void register_sigaltstack()
{
    stack_t newSS, oldSS;

    if(is_altstack_defined)
    {
        return;
    }

    newSS.ss_sp = tmp_stack;

    newSS.ss_size = STACK_SIZE;
    newSS.ss_flags = 0;

    if(sigaltstack(&newSS, &oldSS) < 0)
    {
        printf ("error altstack");
    }

    is_altstack_defined = 1;
}


int main(int argc, char * argv[])
{
    int i = 0;
    struct sigaction sigsegv;
 
    register_sigaltstack();

    sigsegv.sa_handler = sig_segv;
    sigemptyset(&sigsegv.sa_mask);
    sigsegv.sa_flags = SA_ONSTACK;

    if( sigaction(SIGSEGV, &sigsegv, 0 ) == -1)
    {
        printf("signal SIGSEGV error");
        return -1;
    }

    foo();
}





위코드를 스레드로 변경 하면 동작 하지 않는다.
스레드에서 foo()  무한 재귀 함수를 호출 해서 스택 오버플로우가 발생했을때는 동작 하지 않는다.

여러 삽질 끝에 답을 알아 냈는데.

스레드 마다. sigaltstack() 을 해줘야 동작 한다.

여기에 관해서 찾은 글귀..
Operating in a multithreaded environment
If a process calls sigaction and then spawns pthreads within it, then those pthreads will inherit the signal handlers that were already installed. Apparently, this is not the case forsigaltstack: If a signal handler is installed with sigaction using a sigaltstack, and a thread spawned from that process is killed with the right signal, then the installed stack will not be found! The signal handler must instead be installed on each pthread individually. I’m not sure whether this is a bug in Linux or just a quirk of POSIX; in any case, I couldn’t find it documented anywhere.