iOS2012. 8. 27. 10:51

UIProgressHUD / 어플 실행 및 , 데이터 호출시 "로딩중" 메세지처리



아이폰 어플은 거의 대부분 로딩중이라는 메세지가 나타나길레.. 대부분 자동으로 처리되는줄 알았습니다..
그런데;;; 아니더군요 -_-;;

UIActivaityIndicatorView 의 경우 별도 스타일이나 지원되는 것이 있는듯하나..


모두다 호출전 출력 / 호출후 출력.. 노가다를 통해 진행한듯합니다
아직 잘은 모르겠지만. 

앱을 이용하는 이용자가 마냥 기다리지않도록 처리해야하는 로딩메세지는 상당히 중요한 UI중에 하나인데요


여러책에도 나왔지만 구체적으로 어떤 방법으로 처리되는지 나와있는게 없어 포스팅합니다.



보통 "Delegate -> 메인뷰 -> 서브뷰" 형태로 진행이되는데요

우선 메인뷰에 적용한 소스입니다.

해당 소스를 Delegate 에 동일하게 추가하셔도 이용이 가능합니다

============= 헤더파일 ==================
#import <UIKit/UIKit.h>

//프로그래스 - 로딩메세지
@interface UIProgressHUD : NSObject
- (UIProgressHUD *) initWithWindow: (UIView*)aWindow; 
- (void) show: (BOOL)aShow;
- (void) done;
- (void) hide;
- (void) setText: (NSString*)aText; 
@end

@interface MainView : UIViewController{
    UIProgressHUD *hud;
}


@end
=====================================
상위 @interface UIProgressHUD : NSObject 부분부터 @end 까지 별도 해당 소스가 추가되며.



============= 메인파일 ==================

//프로그레스 - 로딩메세지
-(void)mostraProgressHUD:(BOOL)done{
    hud = [[UIProgressHUD alloc] initWithWindow:self.view];
   //hud = [[UIProgressHUD alloc] initWithWindow:self.window];    //Delegate 에 추가시 해당 부분을 self.window로 변경하여 이용

 
    if(done){
        [hud setText:@"로딩완료"];
    }else{
        [hud setText:@"로딩중"];
    }
    [hud show:YES];
    if(done){
        [hud done];
    }
}

//프로그래스 로딩메세지
-(void)escondeProgressHUD{
    if (hud != nil){
        [hud hide];
        hud = nil;
    }
}

=====================================
메인파일은 mostraProgressHUD / escondeProgressHUD 두개가 추가하시고.


팝업호출은 [self mostraProgressHUD:NO]; 과 

 [self mostraProgressHUD:YES]; 로 호출하시면 됩니다.
프로그레스의 좀더 구체적이고 자동화되어있는것이 있으면 별도 포스팅을 하겠습니다.


기타 다른 함수는

[hud show];
[hud done];
[hud hide];
[hud setText:@"하이욤"];

과같이 이용하시면 됩니다.



P.S : 아시죠?? 해당 소스는 특정 저자의 소스를 인용한것이 아닙니다.
        애플개발자 레퍼런스와, 외국 개발자들의 소스를 인용한것이며.

        누구를 가르키기 위함이 아니라.
        제가 개발중 까먹는것을 대비해서 포스팅하는것입니다.

Posted by 다오나무
iOS2012. 8. 26. 13:02

안녕하세요. 팬텀입니다. 
첨부된 파일은 이번 정모에 발표했던 'App과 Server의 은밀한 대화'에 리뷰했던 코드 예제 입니다.
그날 리뷰했던 코드에 urlencoding / urldecoding 관련된 부분이 추가되었습니다.

첨부된 파일을 xcode에서 실행시키면, 뷰에 버튼이 하나 있습니다. 
이 버튼이 parameter와 security token을 만들고, 서버로 request를 보내고,
서버로부터의 결과를 콘솔에 남기는 일을 합니다. 콘솔에서 다음과 같이 확인할 수 있습니다.

 [Session started at 2010-07-21 00:57:01 +0900.]
 -------------------------------------------
[app]
1) param : id=2&point=450&name=%EB%A7%A5%EB%B6%80%EA%B8%B0&nonce=16807
2) st : PysueoNho2uhis%2B8%2FQjpWuSuYdGYA0m4HM969zadxBZIMNwe%2BJle
 -------------------------------------------
[server]
1) result : id=2&point=450&name=맥부기&nonce=16807

endpoint는 코드에 들어있는 http://rockk.org/mcbugi/test.php 입니다. 2주 정도 열어 놓도록 할께요.
서버쪽 코드는 다음과 같구요. 간단하게 st를 복호화 한 값을 그대로 echo 합니다.
app과 key값을 꼭 맞춰주어야 합니다. 아래 붉게 강조된 부분에요. '123456789abcdef'

 <?php
// base64 decode st
$tmp_st = base64_decode(urldecode($_POST['st']));

// decrypt st (key is '123456789abcdef')
$st = urldecode(trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, '123456789abcdef', $tmp_st, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_RAND))));

// echo decrypted data
echo $st;
exit;
?>


실제로 사용할 땐, $st 값을 &로 파싱하고, key & value로 활용하면 되지 않을까 싶습니다.

CryptoHelper 관련 참고 url은 아래와 같구요.
http://pastie.org/297563.txt
http://stackoverflow.com/questions/1235171/iphone-how-to-encrypt-a-string

php의 mcrypt와 padding을 다루는 부분에서 차이가 있어CryptoHelper.m의 다음 부분에 kCCOptionECBMode를 추가했습니다.
참고하세요.

 // Create and Initialize the crypto reference.
    ccStatus = CCCryptorCreate(    encryptOrDecrypt, 
                               kCCAlgorithmAES128, 
                               kCCOptionPKCS7Padding | kCCOptionECBMode
                               (const void *)[theSymmetricKey bytes], 
                               kCCKeySizeAES128, 
                               (const void *)iv, 
                               &thisEncipher
                               );


혹시나 해서 발표자료도 공유합니다- :D

App과 Server의 은밀한 대화
View more presentations from rockk.




한글 잘림현상- 아래수정 부분 확인해서 사용하삼
- (NSString*)encryptString:(NSString*)string
{
NSRange fullRange;
fullRange.length = [string length];
fullRange.location = 0;

uint8_t buffer[[string length]];

[string getBytes:&buffer maxLength:[string length] usedLength:NULL encoding:NSUTF8StringEncoding options:0 range:fullRange remainingRange:NULL];

// NSData *plainText = [NSData dataWithBytes:buffer length:[string length]];// 한글 잘림
NSData *plainText = [string dataUsingEncoding:NSUTF8StringEncoding];

NSData *encryptedResponse = [self doCipher:plainText key:symmetricKey context:kCCEncrypt padding:&pad];

return [self base64EncodeData:encryptedResponse];
}

Posted by 다오나무
우분투2012. 8. 26. 01:17

우분투는 SSH로 거의 모든 작업을 다 처리할 수 있지만,

가끔 GUI 모드로 원격접속해야 할 때가 있다. (이쁘기도 하고...)

이를 설정하기 위해 검색해보니 vnc를 이용한 서버 설치와 접속이 주류를 이루었는데,

접속하려는 윈도우에 별도의 프로그램을 깔아야 하니 번거롭다 생각하던중 괜찮은걸 발견했다.

바로 vnc 클라이언트 프로그램 설치 없이 윈도우 원격 데스크톱 연결(mstsc)을 이용해 접속 가능한 xrdp이다.


1. 설치방법

apt-get을 이용해 xrdp를 설치하자. 알아서 vnc4server등 필요한 패키지를 설치해 준다.

$ sudo apt-get install xrdp


2. xrdp 설정 변경

설치하면 포트는 기본적으로 3389로 활성화 된다. 이 포트를 변경하고 싶으면 아래의 파일을 열어 설정값을 변경하자

$ sudo vim /etc/xrdp/xrdp.ini

1[globals]
2bitmap_cache=yes
3bitmap_compression=yes
4port=3389 #원하는 포트로 변경
5crypt_level=low
6channel_code=1


3. .xsession 파일 수정

2번까지만 설정하고 접속하면 접속은 되는데 바탕화면만 나오고 아무런 반응이 없다.

이럴땐 홈 디렉토리 아래에 .xsession 파일을 아래와 같이 수정하거나 없다면 추가해주자

$ sudo vim ~/.xsession

1gnome-session --session=ubuntu-2d


이후 접속해보자.

로그인은 따로 설정하지 않았다면 모듈부분을 sesman-Xvnc로 두고 계정과 비밀번호를 입력하면 된다. 

 

아주 잘 된다 !


'우분투' 카테고리의 다른 글

Linux 하드카피 방법  (0) 2012.09.06
우분투 하드카피  (0) 2012.09.06
우분투 - 예약실행 명령어 cron  (0) 2012.07.26
crontab 사용법 및 php 실행  (0) 2012.07.26
vsftpd 폴더 생성시 권퐇  (0) 2012.07.08
Posted by 다오나무
iOS2012. 8. 22. 11:46

http://sonnyparlin.com/2011/12/pulltorefresh-ios-5-and-arc-tutorial/

Posted by 다오나무
iOS2012. 8. 22. 09:56

아이폰이나 안드로이드 프로젝트를 하다보면 처음에 가장 신경쓰이는 부분이 UI구성입니다.

디자인에 따라 배경이나 버튼 이미지, 간격등을 고려해서 구성해야 되는데 책이나 기본 강좌에서는 이런 내용을 잘 다루지 않죠.
기획안에 따라서 기능적으로는 UINavigationController를 사용해야 되는데 화면의 특성에 따라서 UINavigationController를 숨기거나 수정해야되는 경우가 생깁니다. 

UINavigationController에서 배경색을 바꾸고 배경이미지를 넣고 상황에 따라 타이틀을 바꾸고 하는 등의 작업을 간단히 정리해 보도록 하겠습니다.

1. 코드를 이용해 UINavigationController 만들기
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     
 RootViewController * rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];

 UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];

 [self.window addSubview:navigationController.view];
 [self.window makeKeyAndVisible];
 return YES;
}
이것은 코드를 통해 만들수 있다는 한가지 예일 뿐이고 실제 interface builder를 이용해서 만드셔도 상관 없죠.
 
2.Title 바꾸기
- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.title = @"My Title";
}
화면별로 각각의 ViewController에 따라서 Title을 변경해야 될 떄 사용 되겠죠.

3.Navigation Bar 숨기기 & 보이기
- (void)viewDidLoad 
{
    [super viewDidLoad];
     self.title = @"My Title";
     self.navigationController.navigationBarHidden = YES; //YES : 숨기기, NO : 보이기
}
위 코드는 Navigation Bar를 숨기는 코드 입니다. 이처럼 ViewController에 따라서 보여줄수도 있고 숨길수 있습니다.
다시 보이게 하려면 self.navigationController.navigationBarHidden값을 NO로 하시면 되겠습니다.

4. Navigation Bar 배경색 바꾸기 (Background Color) 
- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.title = @"My Title";
    self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:255.0/255 
                                                                                  green:10.0/255 blue:100.0/255 alpha:1];

}

5. Navigation Bar Style 바꾸기
- (void)viewDidLoad 
{
   super viewDidLoad];
   self.title = @"My Title";
   self.navigationController.navigationBar.barStyle = UIBarStyleBlack; //스타일 적용
   self.navigationController.navigationBar.translucent = YES; // 반투명 효과 주기
}
스타일에는 기본적으로 UIBarStyleBlack, UIBarStyleBlackOpaque, UIBarStyleBlackTranslucent, UIBarStyleDefault이 있죠.

6. Navigation Bar 배경이미지 넣기 (Background image)
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect
{
   UIImage *bgImage = [UIImage imageNamed:@"background.png"];
   [bgImage drawInRect:rect];
}
@end
UInavigationBar 서브클래스를 만들어서 구현합니다.

7. Navigation Bar Back 버튼의 Text 변경 하기
- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.title = @"My title";
    self.navigationController.navigationBar.backItem.title = @"뒤로가기";
}
본래 "Back"이라는 Text가 들어가는데 "뒤로가기" 라고 바꿔 주었습니다.
위 코드는 상황에 따라 적용되지 않을 수 있습니다. 
가령 UITabbarController와 UINavigationController를 같이 사용하면서 pushViewController를 이용해 뷰를 이동할 때 안되더군요.

이때는 다음과 같이 해결 합니다.
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
                                    initWithTitle: @"Back"
                                    style: UIBarButtonItemStyleBordered
                                    target:nil action:nil];
[[self navigationItem] setBackBarButtonItem: backButton];

UINavigationController *homeNav = self.navigationController;
LoginView * loginView = [[LoginView alloc] initWithNibName:@"LoginView" bundle:nil];
[homeNav pushViewController:loginView animated:YES];

위 코드는 이동하고자 하는 뷰(LoginView)를 push하는 뷰 컨트롤러에서 백버튼을 재설정한 후에 뷰를 push하는 방법 입니다.
즉 뷰를 이동하고 나서 처리하는 것이 아니라 이동하기 전에 백버튼을 설정하고 이동하는 처리 입니다.

여기서 하나 더 알아봅시다.
NavigationController에서 화면 전환시 이전 화면으로 이동하고자 할 때 바로 이전 화면이 아닌 자신이 원하는 이전 화면으로 이동하고 싶을 때 처리는 어떻게 할까요. 

다음을 보시죠
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
위처럼 objectAtIndex값을 설정해서 이전의 원하는 컨트롤러로 이동할 수 있습니다.

8.Navigation Bar 오른쪽의 버튼 아이템 추가하기
- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.title = @"My Title";
    UIBarButtonItem *loginButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Log in" 
                                                            style:UIBarButtonItemStylePlain target:self  

                                                            action:@selecter(ActLogin)];
    self.navigationItem.rightBarButtonItem = loginButtonItem;
    [loginButtonItem release];
}

//버튼을 눌렀을 때 이벤트 처리
-(IBAction) ActLogin:(id)sender
{
     NSLog(@"Log-in Action");
}
Navigation Bar 오른쪽 영역에 버튼을 추가하는 코드 입니다. 여기서는 버튼을 눌렀을 때 이벤트 메소드 ActLotin 메소드도 정의 했습니다.
버튼의 종류나 여러가지 옵션은 상황에 맞게 처리하시면 되겠습니다.

일단 NavigationController 커스터마이징은 여기까지 정리해 놓겠습니다. 
추가적으로 필요한 내용은 주기적으로 업데이트 하겠습니다.

Posted by 다오나무
iOS2012. 8. 20. 17:11

copyright www.irontop.com All rights reserved.

This Example show to you that communication with iPhone App, iPhone UIWebView each other 
There is two ways for commucation.
One is the [webView:shouldStartLoadWithRequest:navigationType:]UIWebViewDelegate 
The other is the [stringByEvaluatingJavaScriptFromString:] WebView

You can use "shouldStartLoadWithRequest" to commucate UIWebView 2 APP
You can use "stringByEvaluatingJavaScriptFromString" to commucate APP 2 UIWebView 

유관업체에서 앱과 웹뷰간의 통신 예제를 작성해달라고 해서.
간단히 만들어 보았다.

웹뷰에는 자바스크립트의 머리를 깎아줄 수 있는 api를 제공하기 때문에(eval)
자바스크립트를 잘 이해하고 있다면, 팝업을 포함하여 거의 모든 기능을 훼이크로 구현이 가능하다.

아래는 주요 코드 부분이다.

APP에서 WebView로 값을 보내는 부분

 71 (IBAction)toWeb:(id)sender {
 72     NSString *strScript = [NSString stringWithFormat:
 73                            @"var fromApp = document.getElementById('fromApp');\
 74                            fromApp.value = '%@';"self.txtToWebView.text];
 75     [webView stringByEvaluatingJavaScriptFromString:strScript];
 76 }


input 요소를 id로 찾아서 값을 세팅하는 자바스크립트를 생성한 후에
webView에 밀어 넣고 있다.

WebView로부터 APP로 보내지는 값을 획득하는 부분
 83 (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
 84     
 85     NSString *strUrl = [[request URL] absoluteString];
 86     if ([strUrl hasPrefix:@"toAPP://"]) {
 87         NSString *strRequest = [[strUrl componentsSeparatedByString:@"://"] objectAtIndex:1];
 88         NSArray *arrRequest = [strRequest componentsSeparatedByString:@"?"];
 89         NSString *strCmd = [arrRequest objectAtIndex:0];
 90 
 91         if (YES == [@"toAppCmd" isEqualToString:strCmd]) {
 92             // code to set Your Application communication
 93             self.txtFromWebView.text = [arrRequest objectAtIndex:1];
 94         }
 95         
 96         // toApp protocol do not StartLoad
 97         return NO;
 98     }
 99     
100     // other protocol do StartLoad
101     return YES;
102 }


form GET Action을 사용하였고,
action-url을 "toApp://toAppCmd?toApp=abc" 형식이 되도록 하였다.
즉, 로드할 url을 가로채서 "toAPP" 로 시작하는 경우에는 NO 를 리턴하여 실제로 로드되지 않도록 하고,
url을 파싱하여 toApp 의 값을 획득하도록 하였다.
여기서 strCmd 를 명령으로 사용하는 예제이므로 toAppCmd 를 다른 값으로 바꾸고,
구분하여 처리하는 것으로 처리할 종류(명령)을 구분할 수 있는 구조로 확장도 가능하다.

자세하는 것은 첨부된 예제 파일을 참조하자.~~

Posted by 다오나무
iOS2012. 8. 20. 13:21

1. 밖에서 안으로
당연한 이야기지만
[webView stringByEvaluatingJavaScriptFromString:@"alert('aa')"];

이런게 가능하다.
외부(ex:push notification)로부터 해당 웹뷰 안에다가 Javascript를 실행하게 할 수 있다.
2. 안에서 밖으로
document.location = "iOS:checkParams:" + param1;
javascript 에서 custom protocol (여기선 iOS라는 이름)
마찬가지로

-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

NSString *URL = [[request URLabsoluteString];

NSLog(@"requested URL :%@", URL);

// URL 특정 문자열과 매치하면

if ([URL isEqualToString:@"iOS:checkParams:"]) {

// 처리

return NO;

}

return YES;

}

커스텀 프로토콜을 지정할 수 있다. 말이 거창해서 커스텀 프로토콜이지 그냥 문자열 지지는 것으로 보면 쉽다.

Posted by 다오나무
iOS2012. 8. 20. 13:10

모달 뷰 (Modal View) 란?

모달 뷰(Modal View)란 iOS(iPhoneOS) 에서 제공하는 여러 개의 뷰를 전환하기 위한 아주 기본적인 뷰 관리 기법 중 하나입니다. 특히 모달 뷰 컨트롤러(Modal View Controller)는 현재 어플리케이션 흐름을 잠시 중단하고 사용자에게 무언가를 입력을 받게 하거나 표시한 후에 다시 원래의 흐름으로 되돌아가도록 흐름을 변경할 때 사용됩니다. 그림을 보며 설명하겠습니다. 아래 표시된 All Calendar / Add Event 간의 관계가 전형적인 모달 뷰 관계로 볼 수 있습니다.



 

일정을 하나 추가하기 위해서는 다음과 같은 절차가 필요합니다.

  • Calender 화면에서 추가하기 버튼을 터치하여 Add Event 화면을 띄웁니다.
  • Add Event 화면에서 일정을 입력합니다.
  • Done 버튼을 터치하여 Add Event 를 종료시킵니다.
  • Calender 화면으로 되돌아 옵니다.


위와 같이 사용자가 일정을 관리하다가  현재의 흐름을 잠시 중단하고 원래의 흐름으로 다시 되돌아 오도록 애플리케이션의 흐름을 구현하고자 할때 모달 뷰를 사용하는 것입니다. 참고로 모달 뷰 모델에서는 호출자(Caller)와 피호출자(Callee)간의 부모(Parent)와 자식(Child) 관계가 생깁니다.

모달 뷰 컨트롤러 띄우기
현재 애플리케이션 흐름에서 모달 뷰 컨트롤러를 띄우기 위해서는 부모 뷰의 인터랙션 내 아래와 같이 구현합니다. 

- (IBAction) buttonPressed:(id)sender
  {
      
SecondViewController *viewController = [[SecondViewController alloc] init];    // 새롭게 띄울 뷰 컨트롤러 생성
      [self presentModalViewController:viewController animated:YES];  // 새로운 뷰 컨트롤러를 모달로 표시
  }
 


모달 뷰 컨트롤러 닫기
모달 뷰를 닫고 원래의 흐름으로 되돌아 가기 위해서는 모달 뷰의 인터랙션 내 아래와 같이 구현합니다.

- (IBAction) buttonPressed:(id)sender
  {
      
[self dismissModalViewControllerAnimated:YES];  // 현재 모달로 띄워진 뷰 컨트롤러를 닫음
  
}



모달 뷰 컨트롤러 전환시 효과주기
iOS에서는 기본적으로 모달 뷰를 전환하기 위한 기본적인 전환 애니메이션을 제공합니다.
 모달 뷰를 전환하기 위한 애니메이션 효과는 setModalTransitionStyle을 이용하여 아래와 같이 값을 설정하면 전환시 효과가 적용됩니다.

  -(IBAction)buttonPressed:(id)sender
   {
      SecondViewController *viewController = [[SecondViewController alloc] init];
      [viewController setModalTransitionStyle:UIModalTransitionStylePartialCurl];
      [self presentModalViewController:viewController animated:YES];
   }

  // UIModalTransitionStyleCoverVertical : 모달 뷰가 아래서 위로 덮으며 전환됩니다. (기본값)

  // 
UIModalTransitionStyleFlipHorizontal : 앞면의 부모 뷰가 회전되어 뒷면의 모달 뷰로 전환됩니다
  // UIModalTransitionStyleCrossDissolve : 부모 뷰가 서서히 사라짐과 동시에 모달 뷰로 전환됩니다.

  // UIModalTransitionStylePartialCurl : 부모 뷰가 종이처럼 휘어지며 모달 뷰로 전환됩니다. 


실행화면 - UIModalTransitionPartialCurl

















Posted by 다오나무
iOS2012. 8. 1. 08:21

UDID 대체 방법 -> MAC 어드레스 얻기

올해 3월이었죠. 애플이 개인정보 유출을 막고자 UDID를 쓰는 앱에 대해 단계적으로 심사하겠다고 했습니다.

지금은 IOS 5.0 이상에서는 UDID를 추출하는

NSString *udid = [[UIDevice currentDeviceuniqueIdentifier];


메소드를 쓰면 안된다고 하네요. 


그래서 나온 대안 중, MAC 어드레스 값을 추출하는 방법입니다.


일종의 PC의 랜카드 고유번호(?)라고 하는데 아이폰에서는 네트워크 접속 이더넷카드 시리얼 넘버라고 보시면 되요.


구글에서 떠도는 소스는 3G와 WI-FI 환경에서 값이 다르게 추출된다고 하네요.


형식은 FF:FF:FF:FF:FF:FF 이런식으로 나와요

그 문제를 해결한 소스입니다. 저도 어디서 구한 소스구요 ㅋ

개발자님들 대단하다.


구현 방법입니다.



Macaddress.h


char*  getMacAddress(char* macAddress, char* ifName);


Macaddress.c


#include <sys/types.h>

#include <stdio.h>

#include <string.h>

#include <sys/socket.h>

#include <net/if_dl.h>

#include <ifaddrs.h>


char*  getMacAddress(char* macAddress, char* ifName) {

    

    int  success;

    struct ifaddrs * addrs;

    struct ifaddrs * cursor;

    const struct sockaddr_dl * dlAddr;

    const unsigned char* base;

    int i;

    

    success = getifaddrs(&addrs) == 0;

    if (success) {

        cursor = addrs;

        while (cursor != 0) {

            if ( (cursor->ifa_addr->sa_family == AF_LINK)

                && (((const struct sockaddr_dl *) cursor->ifa_addr)->sdl_type == 0x06) && strcmp(ifName,  cursor->ifa_name)==0 ) {

                dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;

                base = (const unsigned char*) &dlAddr->sdl_data[dlAddr->sdl_nlen];

                strcpy(macAddress, ""); 

                for (i = 0; i < dlAddr->sdl_alen; i++) {

                    if (i != 0) {

                        strcat(macAddress, ":");

                    }

                    char partialAddr[3];

                    sprintf(partialAddr, "%02X", base[i]);

                    strcat(macAddress, partialAddr);

                    

                }

            }

            cursor = cursor->ifa_next;

        }

        

        freeifaddrs(addrs);

    }    

    return macAddress;

}



갖다 쓰실 때는 이런식으로 


#import "MacAddress.h"


char* macAddressString= (char*)malloc(18);

    NSString *macAddress= [[NSString allocinitWithCString:getMacAddress(macAddressString,"en0")

                                                   encoding:NSMacOSRomanStringEncoding];

    NSLog(@" %@ ", macAddress);


 

Posted by 다오나무
MYSQL2012. 7. 31. 23:21

mysql 디비에 등록되는 접속자로그 또는 시스템관련 로그는 디비에 쌓이게 되면 용량이 장난아니게 늘어난다.
일정기간이 지나면 도움도 안될뿐더러 용량만 차지하게 된다.
로그는 그때그때 보는게 최고..

mysql 자체적으로는 자동삭제는 불가능하며 php를 이용한 방법과 crontab에 등록해서 사용하는 방법이 있다.
쉘에서 실행하는 명령은 mysql -e "명령" 이렇게 사용한다.

30일이 지난자료 삭제

mysql -u아이디 -p비밀번호 디비명 -e "DELETE FROM  테이블명 WHERE 날짜필드명 < date_add(date_format( now() , '%Y-%m-%d'), interval -30 day)"


-e 옵션에서 mysql query 뒤에 세미콜론 ;는 사용안하며, 큰따옴표가 사용이 안되므로 쿼리명령어 안에는 작은 따옴표를 사용하면 된다.

-e 옵션과 내부적인 명령의 차이 - 따옴표가 변경된걸 확인할수 있다.
#mysql -u아이디 -p비밀번호 디비명 -e "select date_add(date_format( now() , '%Y-%m-%d'), interval -30 day)"

mysql>select date_add(date_format( now() , "%Y-%m-%d"), interval -30 day);


위 명령을 사용하여 크론탭에 등록해서 사용하면 된다.
한꺼번에 디비를 삭제하면 시스템이 다운될수도 있으니 조금씩 조금씩 삭제하는게 좋다.

Posted by 다오나무