2012년 2월 12일 일요일
iPhone WebVeiw - Reading Html ( html 가져오기 )
NSString* html = [webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
iPhone WebView Error - uiwebkit error 101 ( 한글, 빈화면, 안뜨는 경우 )
url 에 한글/빈문자 등의 문제로 webview 가 "uiwebkit error 101" 를 뱉어내며
실제 화면에 아무것도 출력이 안된다.
아래와 같이 인코딩을 해주면 해결이 된다.
NSString* url = @"http://www.jmkook77.com?%@"
NSString* param = [@"q=가나다 가나다 가나다" stringByAddingPercentEscapeUsingEncoding:NSUTF8StringEncoding];
NSString* webUrl = [NSString stringWithFormat:@"%@%@", url, param];
실제 화면에 아무것도 출력이 안된다.
아래와 같이 인코딩을 해주면 해결이 된다.
NSString* url = @"http://www.jmkook77.com?%@"
NSString* param = [@"q=가나다 가나다 가나다" stringByAddingPercentEscapeUsingEncoding:NSUTF8StringEncoding];
NSString* webUrl = [NSString stringWithFormat:@"%@%@", url, param];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: webUrl]]];
2012년 2월 9일 목요일
페이스북 유저수 국가별 통계 ( facebook user )
페이스북 한국 유저가 570만이 넘는군요. 국가 순위 28위!!
일본이 670만에 25위!!
곧 따라잡는건가요.
http://www.socialbakers.com/facebook-statistics/
twitter, youtube 등 괜춘한 사이트네요.
일본이 670만에 25위!!
곧 따라잡는건가요.
http://www.socialbakers.com/facebook-statistics/
twitter, youtube 등 괜춘한 사이트네요.
2012년 2월 5일 일요일
몽고db ( mongodb ) - 로깅 ( Logging ) , Rotating
1. 커맨드라인 옵션 설정
1) Rotating
./mongod --logpath /log/mongodb/mongod1.log --logappend
> ls /log/mongodb/
-rw-rw-r-- 1 user user 55020391 2월 6 03:42 mongod1.log
-rw-rw-r-- 1 user user 9496452 2월 6 02:04 mongod1.log.2012-02-06T02-04-16
위와 같이 날짜별로 로깅이 됨
2) 로그 레벨
--quiet 옵션으로 로그 최소화
-v 옵션으로 더욱 상세히 -vv 더더욱 상세히 -vvv 더더더욱 상세히 -vvvv....
2. 어드민 콘솔에서 설정
> use admin
> db.runCommand("logRotate")
{ "ok" : 1 }
1) Rotating
./mongod --logpath /log/mongodb/mongod1.log --logappend
> ls /log/mongodb/
-rw-rw-r-- 1 user user 55020391 2월 6 03:42 mongod1.log
-rw-rw-r-- 1 user user 9496452 2월 6 02:04 mongod1.log.2012-02-06T02-04-16
위와 같이 날짜별로 로깅이 됨
2) 로그 레벨
--quiet 옵션으로 로그 최소화
-v 옵션으로 더욱 상세히 -vv 더더욱 상세히 -vvv 더더더욱 상세히 -vvvv....
> use admin
> db.runCommand("logRotate")
{ "ok" : 1 }
2012년 2월 2일 목요일
몽고db ( mongodb ) 3 - 3 노드 리플리카셋 ( 3 Node Replica Set ) - 레플리카셋,이중화,장애
3 노드 리플라카셋
1. 구성
1) 세개의 mongodb 프로세스를 가집니다.
2) 1개의 장애를 허용합니다.
a,b,c 중 a 가 master 이고 b,c 가 슬레이브라면 b,c 두개 장애 시에는 물론 운영에 영향을 안받겠습니다만. master 인 a 가 먼저 죽으면 b,c 중 우선권이 높은 녀석이 master 가 됩니다.
다시, 두번째 master 가 죽는다면 답이 없습니다.
master 는 각 노드의 투표를 통해 과반수가 넘는 표를 받은 우선순위 높은 노드로 선출이 됩니다. 즉, 3 개의 리플리카셋 구성에서는 3 개중 하나가 장애가 발생하여 2개가 남더라도 총 2/3 이라는 과반수가 넘는 표결로 남은 2 개중에서 새로운 master 가 선출될 수 있겠지만, 남은 두개중에서 장애가 발생한다면 1/2 이므로 누가 될지 선출할 수가 없습니다.
아 헷갈려 ㅋㅋ
3) 데이터는 세개의 저장소를 가지며 동기화 됩니다.
테스트로 하므로 제 맥 하나에 세개를 띄울 것이지만.. 운영상에서는 동일한 서버에 이런 구성을 가진다면 io 경합으로 성능이 현저하게 떨어지겠죠.
2. 설치 환경
1) mac os
2) mongodb : /app/mongodb
3) log : /app/mongodb/log
4) data : /app/mongodb/data1, data2, data3 ( 폴더를 생성해 놓습니다. 권한도 체크 )
5) port : 40001,40002,40003
6) replica-set group name : group1 ( group 이라는 말이 이해가 쉬워서 그냥 이렇게 적습니다. )
3. 설치
1) 구동/중지 스크립트 작성
# data1
# start_data1.sh
/app/mongodb/bin/mongod --replSet group1 --port 40001 --fork --logpath /app/mongodb/log/data1.log --dbpath /app/mongodb/data/data1
# stop_data1.sh
ps -ef |grep -v grep |grep data1.log |awk '{print $2}' |xargs kill -2
# data2
# start_data2.sh
/app/mongodb/bin/mongod --replSet group1 --port 40002 --fork --logpath /app/mongodb/log/data2.log --dbpath /app/mongodb/data/data2
# stop_data2.sh
ps -ef |grep -v grep |grep data2.log |awk '{print $2}' |xargs kill -2
# --replSet 에 각 노드들을 묶을 수 있는 이름인 group1 이 들어갑니다.
2) 리플리카셋 초기화
각 노드들을 구동합니다.
ps -ef |grep mongod 로 프로세스가 정상적으로 떠있는지 확인하구요..
다음과 같이 한 서버에 접속합니다.
$ ./mongo localhost:40001
MongoDB shell version: 2.0.1
connecting to: localhost:40001/test
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
1. 구성
1) 세개의 mongodb 프로세스를 가집니다.
2) 1개의 장애를 허용합니다.
a,b,c 중 a 가 master 이고 b,c 가 슬레이브라면 b,c 두개 장애 시에는 물론 운영에 영향을 안받겠습니다만. master 인 a 가 먼저 죽으면 b,c 중 우선권이 높은 녀석이 master 가 됩니다.
다시, 두번째 master 가 죽는다면 답이 없습니다.
master 는 각 노드의 투표를 통해 과반수가 넘는 표를 받은 우선순위 높은 노드로 선출이 됩니다. 즉, 3 개의 리플리카셋 구성에서는 3 개중 하나가 장애가 발생하여 2개가 남더라도 총 2/3 이라는 과반수가 넘는 표결로 남은 2 개중에서 새로운 master 가 선출될 수 있겠지만, 남은 두개중에서 장애가 발생한다면 1/2 이므로 누가 될지 선출할 수가 없습니다.
아 헷갈려 ㅋㅋ
3) 데이터는 세개의 저장소를 가지며 동기화 됩니다.
테스트로 하므로 제 맥 하나에 세개를 띄울 것이지만.. 운영상에서는 동일한 서버에 이런 구성을 가진다면 io 경합으로 성능이 현저하게 떨어지겠죠.
2. 설치 환경
1) mac os
2) mongodb : /app/mongodb
3) log : /app/mongodb/log
4) data : /app/mongodb/data1, data2, data3 ( 폴더를 생성해 놓습니다. 권한도 체크 )
5) port : 40001,40002,40003
6) replica-set group name : group1 ( group 이라는 말이 이해가 쉬워서 그냥 이렇게 적습니다. )
3. 설치
1) 구동/중지 스크립트 작성
# data1
# start_data1.sh
/app/mongodb/bin/mongod --replSet group1 --port 40001 --fork --logpath /app/mongodb/log/data1.log --dbpath /app/mongodb/data/data1
# stop_data1.sh
ps -ef |grep -v grep |grep data1.log |awk '{print $2}' |xargs kill -2
# data2
# start_data2.sh
/app/mongodb/bin/mongod --replSet group1 --port 40002 --fork --logpath /app/mongodb/log/data2.log --dbpath /app/mongodb/data/data2
# stop_data2.sh
ps -ef |grep -v grep |grep data2.log |awk '{print $2}' |xargs kill -2
# data3
# start_data3.sh
/app/mongodb/bin/mongod --replSet group1 --port 40003 --fork --logpath /app/mongodb/log/data3.log --dbpath /app/mongodb/data/data3
# stop_data2.sh
ps -ef |grep -v grep |grep data3.log |awk '{print $2}' |xargs kill -2
# start_data3.sh
/app/mongodb/bin/mongod --replSet group1 --port 40003 --fork --logpath /app/mongodb/log/data3.log --dbpath /app/mongodb/data/data3
# stop_data2.sh
ps -ef |grep -v grep |grep data3.log |awk '{print $2}' |xargs kill -2
2) 리플리카셋 초기화
각 노드들을 구동합니다.
ps -ef |grep mongod 로 프로세스가 정상적으로 떠있는지 확인하구요..
다음과 같이 한 서버에 접속합니다.
$ ./mongo localhost:40001
MongoDB shell version: 2.0.1
connecting to: localhost:40001/test
> config = {_id: 'group1', members: [
{_id: 0, host: 'localhost:40001'},
{_id: 1, host: 'localhost:40002'},
{_id: 2, host: 'localhost:40003'}]
}
{
"_id" : "group1",
"members" : [
{
"_id" : 0,
"host" : "localhost:40001"
},
{
"_id" : 1,
"host" : "localhost:40002"
},
{
"_id" : 2,
"host" : "localhost:40002"
}
]
}
> rs.initiate(config);
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
3) 확인
일단, 기본적인 시간이 들어가므로. 몇분정도 뒤에 확인을 하도록 합니다.
$ ./mongo localhost:40001
MongoDB shell version: 2.0.1
connecting to: localhost:40001/test
우선, 해당 서버가 PRIMARY 즉, master 로 설정된 것을 확인할 수 있습니다.
PRIMARY> rs.status()
{
"set" : "group1",
"date" : ISODate("2012-02-03T06:52:12Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "localhost:40001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"self" : true
},
{
"_id" : 1,
"name" : "localhost:40002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 180,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:52:10Z"),
"pingMs" : 0
},
{
"_id" : 2,
"name" : "localhost:40003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 178,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:52:10Z"),
"pingMs" : 0
}
],
"ok" : 1
}
data2,3 가 SECONDARY 로 설정되어있는것을 확인할 수 있습니다.
4) 장애확인
현재 master 인 data1 을 stop_data1.sh 로 내립니다.
$ ./mongo localhost:40001
MongoDB shell version: 2.0.1
connecting to: localhost:40001/test
Fri Feb 3 15:54:16 Error: couldn't connect to server localhost:40001 shell/mongo.js:86
exception: connect failed
물론, 접속이 안됩니다. data2로 접속을 합니다.
$ ./mongo localhost:40002
MongoDB shell version: 2.0.1
connecting to: localhost:40002/test
PRIMARY> rs.status()
{
"set" : "group1",
"date" : ISODate("2012-02-03T06:55:18Z"),
"myState" : 1,
"syncingTo" : "localhost:40001",
"members" : [
{
"_id" : 0,
"name" : "localhost:40001",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:54:08Z"),
"pingMs" : 0,
"errmsg" : "socket exception"
},
{
"_id" : 1,
"name" : "localhost:40002",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"self" : true
},
{
"_id" : 2,
"name" : "localhost:40003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 364,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:55:18Z"),
"pingMs" : 0
}
],
"ok" : 1
}
위와 같이 data1 은 응답없는 상태, data2 는 새로운 master (PRIMARY)로 선출된 것을 확인할 수 있습니다.
이제 data2 를 stop_data2.sh 를 통해 내립니다.
남은 data3 로 접속을 합니다.
$ ./mongo localhost:40003
MongoDB shell version: 2.0.1
connecting to: localhost:40003/test
SECONDARY> rs.status()
{
"set" : "group1",
"date" : ISODate("2012-02-03T06:58:44Z"),
"myState" : 2,
"members" : [
{
"_id" : 0,
"name" : "localhost:40001",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:54:07Z"),
"pingMs" : 0,
"errmsg" : "socket exception"
},
{
"_id" : 1,
"name" : "localhost:40002",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:58:26Z"),
"pingMs" : 0,
"errmsg" : "socket exception"
},
{
"_id" : 2,
"name" : "localhost:40003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"self" : true
}
],
"ok" : 1
}
data1,data2 가 응답없는 상태입니다. 한대가 살아있지만 여전히 SECONDARY 로 남아있는것을 확인할 수 있습니다. 표수가 1개 밖에 없기 때문에 master 를 선출할 수 없기 때문입니다.
SECONDARY> show collections
Fri Feb 3 16:02:05 uncaught exception: error: { "$err" : "not master and slaveok=false", "code" : 13435 }
정상동작하지 않는것을 확인할 수 있습니다.
4) 자동 복구
다시 data1 을 구동합니다.
그리고 data3 로 다시 접속을 합니다.
$ ./mongo localhost:40003
MongoDB shell version: 2.0.1
connecting to: localhost:40003/test
PRIMARY> rs.status()
....
master 로 선출이 된것을 확인할 수 있습니다. data1 은 SECONDARY 로 설정이 되었을것입니다.
이것으로 3 Node ReplicaSet 의 기초적인 테스트를 완료합니다.
끝
아이폰 (iPhone) Xcode4 OTA (Over the Air) : 애드혹 ( Adhoc ) URL 배포
1. Menu / Product / Archive
2. iOS App Store Package (.Ipa ) -> Next
3. 배포될 Full URL 입력 및 파일명 일치
4. 저장하면 다음의 파일 생성됨
test.ipa
test.plist
5. 배포될 URL 로 업로드
6. 다음의 html 작성
...
<a href="itms-services://?action=download-manifest&url=http://URL/test.plist">Test Adhoc</a>
...
끝
2. iOS App Store Package (.Ipa ) -> Next
3. 배포될 Full URL 입력 및 파일명 일치
4. 저장하면 다음의 파일 생성됨
test.ipa
test.plist
5. 배포될 URL 로 업로드
6. 다음의 html 작성
...
<a href="itms-services://?action=download-manifest&url=http://URL/test.plist">Test Adhoc</a>
...
끝
2012년 2월 1일 수요일
아이폰 세션 유지 iphone keep session
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[NSHTTPCookieStorage sharedHTTPCookieStorage]
setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
...
return YES;
}
피드 구독하기:
글 (Atom)

