'정보 공유터'에 해당되는 글. 82건

  1. 2012/01/30 YooKey Pro v1.1.1 업데이트! - 그리고 프로젝트 페이지 개편! (17)
  2. 2012/01/27 YooKey Pro 새로운 테마, 그리고 테마 스토어? (14)
  3. 2012/01/26 iPhone 4s 유저분들 안녕하세요. (7)
  4. 2011/12/28 iOS5 완탈/iOS 5.0.1(Untethered Jailbreak) 출시! (iPad, iPhone 4s제외) (80)
  5. 2011/10/12 iOS 5 정식 업데이트 즈음해서 iOS 5 탈옥 후기 (56)
  6. 2011/10/10 iOS 5 출시 및 YooKey/Color Keyboard 대응 계획. (41)
  7. 2011/06/15 나랏글 자판, 6월 말부터 추가 가능! (97)
  8. 2011/03/30 Cydia v1.1 출시! (6)
  9. 2011/01/25 YooKey, Cydia 실행 중 튕기시는 분들을 위한 글 (45)
  10. 2011/01/21 YooKey, "다음문장"을 "줄바꿈"으로 바꾸기. (76)
  11. 2011/01/21 iPhone, 무한 사과 발생시... 초기화 하지 않고 복구하는 방법 (11)
  12. 2010/07/30 [C++0x] r-vaule reference: 파라미터의 const 속성 없애기!? (1)
  13. 2010/07/25 [C++] r-value vs. l-value (1)
  14. 2010/07/22 [Apache] 찾을 수 없습니다. (3)
  15. 2010/07/13 [C++] r-value Reference: Performance (2)
  16. 2010/05/27 [C++] 임의의 이름의 변수 만들기
  17. 2010/05/15 [C++] 지연 호출(Deferred Functional Call) 구현
  18. 2010/04/21 [C++] Visual Studio 2010, GCC 4.5.0 Released (2)
  19. 2010/03/31 [Tip] Chrome에서 사용하기 좋은 드래그 사전(DragDic) Bookmarklet (2)
  20. 2010/03/28 [C++] Google의 C++ 라이브러리 (3)
  21. 2010/03/24 [RSS] 네이버 Hot 뉴스 피드
  22. 2010/03/24 [RSS] 네이버캐스트 Feed (2)
  23. 2010/03/19 [VS] ProjectName도 창 제목 표시 해주기.
  24. 2010/03/07 [Tip] Customizing Windows Command Prompt (2)
  25. 2010/03/02 [Game] GameTech 2010 - TERA의 서버 구조 (1)
  26. 2010/02/16 한국 귀화시험 기출 문제... (1)
  27. 2010/02/16 [RSS] 네이버 캐스트 Feed (2)
  28. 2010/02/04 빌드(컴파일, 링크) 속도가 느리다면.... (3)
  29. 2010/01/22 [MySQL] NULL이지만 NULL이 아닌 슬픈 이야기.. (3)
  30. 2010/01/18 [Linux] 콜스택이 깨진 Core 파일 디버깅 하기 (5)

 안녕하세요. 
 오늘 조금 전에 YooKey Pro v1.1.1을 업데이트 하였습니다.

 나름 작업을 많이 하긴 했는데 당장은 체감상 크진 않으실 수 있을 것 같습니다.
 일단 이야기를 들어가기 전에 홍보를 먼저 하면..
 YooKey 프로젝트 사이트를 개편 하였습니다.

 아직 컨텐츠를 완벽하게 옮기진 못 했지만 천천히 작업할 예정이며
 기존 페이지는 슬슬 정리하려고 합니다.

 YooKey 프로젝트 사이트 (개편된 버전)
 http://yookey.9eye.net/


 기존 페이지가 필요하신 분은 다른 주소로 들어가셔야 합니다.
 http://sites.google.com/site/iphoneyookey/


 제 개인 블로그에 너무 YooKey 이야기만 이제는 제가 다른 글을 올리기도 뻘쭘한 상황이 되어 버렸는데 이제는 가급적이면 YooKey에 관련된 사항은 프로젝트 사이트에서 처리하고, 제 블로그는 다른 이야기도 올릴 수 있는 공간으로 바꾸려고 합니다.

 물론 안 지킨 다고 경찰 출동 안하고~ 쇠고랑 안 찹니다.ㅋ 


 이제 각설하고 업데이트 내용을 적어 봅니다.
 예전에 영어로 "Select Theme"로 적혀 있던 것을 한글로 바꿨습니다. ㅋ!
 그리고 가장 중요한 "테마 스토어" 메뉴가 생겼습니다.
 


 각각을 살펴 보면...
 아. 참고로 스토어라고 해서 결제를 꿈꾸고 만든 것은 아니고
 그냥 앱스토어가 익숙하니까 가져다가 붙인 이름 입니다.

테마 선택을 눌렀을 때

테마 스토어를 눌렀을 때



 기본적인 형태는 테마 스토어에서 다운로드를 받으면 테마 목록에 추가되는 구조 입니다.
 그래서 다운 받으신 테마는 옆으로 스와이프를 하시면 지울 수도 있습니다.

 또한, 예전에 테마 이름이 EZ, 1000ZIN 이런식으로 나왔는데 디렉토리 이름이 같아서 그랬습니다. 이제 디렉토리 이름과 테마 이름을 분리할 수 있도록 했습니다.

 지금은 테마가 몇개 없는데.. 테마 스토어를 웹 기반으로 만들었기 때문에 YooKey Pro 업데이트 없이도 계속 추가할 수 있도록 되어 있습니다. 테마 많이 올려 주시길 부탁 드릴게요. 멋진 자작 테마를 만들어 주시면 제가 좋은 것은 못 드려도 Color Keyboard 정품 라이선스는 드릴 수 있습니다. ^^


 그리고, 새로 만든 프로젝트 사이트에 쉽게 접근 하실 수 있도록 설정에 메뉴를 추가 하였습니다. FAQ는 그냥 말 그대로 FAQ 페이지이고, 사용자 포럼은 예전에 YooKey에 관련 된 질문을 하시려면 저에게 메일을 주시거나 블로그에 댓글을 달아 주셔야 했는데... 이제 완전히 YooKey 만을 위한 공간을 만들었습니다.

 관련 글을 부담없이 남겨 주시면 됩니다.

 그리고.. 저번 포스트에 올렸던 길게 눌렀을 때 입력기 선택창이 나오는 것도 구현이 되긴 했는데 드래그로 자연스럽게 연결이 안 됩니다. (아직은!)
 어떻게 만들어야할지 감은 잡았는데 구조를 많이 바꿔야 할 것 같아서 일단 이 정도까지 작업했습니다.

 그밖에도 "무음 모드에서만 진동 키보드 사용"이란 옵션이 있었는데 iOS5에서는 구현이 힘들어서 옵션에서 뺐습니다. 좀 찾아 봤는데 방법이 쉽게 나오진 않더군요. 다음에 좋은 방법을 찾으면 부활 시키겠습니다.



Posted by U∙Seung

 안녕하세요. 요즘 글을 자주 올리네요.

 오늘은 지하철을 타는데 제 앞에 어여쁜 처자분인 아이폰으로 폭풍 타이핑을 하시는 분이 계시던군요. 자세히는 못 봤지만 Sleep 버튼과 이어폰을 보니 iPhone 4가 확실하더군요. 어떻게 저렇게 빨리 타이핑을 할 수 있을까 하고 몰래 훔쳐봤는데 YooKey Pro를 사용 중 이시더군요. :D
 종종 저를 위해서 일부러 탈옥을 해서 YooKey Pro를 구매해주시는 지인 분들이 계시긴 했지만 낯선 사람이 YooKey Pro를 쓰는 것을 본 것은 처음 이었습니다. 많지는 않지만 써주시는 분들이 계셔서 매우 뿌듯한 하루 였습니다.

 잡담이 조금 길었는데.. 아무튼 오늘 새벽에 김정현님이 옵티머스 LTE 테마를 보내 주셨습니다.

Optimus_LTE_iOS

Optimus_LTE_Orignal



 

 소중한 자료 공유 감사드립니다. (다른 분도 메일로 주시면 올려 드리겠습니다. )


 또 한 가지 소식은 다음 버전 부터 테마 스토어(가칭)을 추가 할 생각입니다.
 인터넷에 보면 훌륭한 테마들이 많은데 공유가 잘 되지 않는 것 같아서 안타까울 때가 많이 있습니다.
 이런 테마들을 잘 공유될 수 있도록 서버를 구축해서(웹기반) 이 곳에 테마를 올리면 YooKey Pro 설정에서 다운 받을 수 있도록 하려고 합니다.



 (고민 중이긴 하지만..)
 대략적으로 설정에 위와 같이
 - "테마 스토어" 버튼을 추가하고
 - "테마 스토어"에서는 테마 목록이 보이고
 - 각 테마를 선택하면 테마를 미리볼 수 있고,
 - 테마 상세에서 다운로드를 누르면 바로 아이폰에 내려받을 수 있도록 할 예정입니다.

 테마 제작자 분들을 위해서는
 YooKey 프로젝트 사이트에 테마를 올리실 수도 있도록 하는 웹 페이지를 만들고
 각 테마에 테마 제작자의 블로그 등을 연결시켜서 테마에 대한 피드백을 나눌 수 있도록 할 예정입니다.

 좋은 아이디어나 의견 있으신 분은 알려주세요. ^^








Posted by U∙Seung

 다들 민족의 명절 잘 보내셨는지 모르겠습니다.
 지난 주에 설날 기념인지 iPhone 4s와 iPad 2용 iOS 5.0.1 완탈이 나왔습니다.
 탈옥은 제가 안 해봐서 어떻게 하는 건지도 안 찾아 봤습니다. ㅋ;;

 iPhone Dev-Team에 따르면 거의 100만에 가까운 새로운 탈옥된 iDevice가 생겼다고 하네요. (위 이미지 참조)
 아무튼 국내에도 많은 탈옥 유저분들이 생기셨는지 간만에 YooKey Pro 다운로드수도 조금 늘었습니다.


 그동안 YooKey Pro가 크랙버전이 돌기도 했고, 사용자수도 거의 늘지 않아서 개인적으로 프로젝트 진행이 주춤했던 것 같은데 4s 탈옥 이후로 다시 의지를 가지고 업데이트를 진행하려고 합니다. ^^
 ( 뭐 당연한 이야기를 강조 드리면, BigBoss 에서 배포하는 이외의 버전은 절대 받지 마세요. 잘 동작하지 않는 경우도 많을 뿐더러, 업데이트가 잘 되지 않기 때문에 이번처럼 무한사과에 걸리시면 대책이 없는 경우가 많습니다. )


 일단 버그 수정을 좀 하고, 많은 분들이 요청해주신 기능들을 추가하려고 하고 있습니다.
 작업 중을 스샷을 살짝 유포하면..



 iPhone 4s에서 진동 키보드가 잘 되지 않는다고 몇몇 분이 제보를 해주셨는데 제가 iPhone 4s가 없어서 테스트를 못하고 있습니다. 아무래도 4s를 구매를 해야 할 것 같은데 통신사 가입없이 그냥 테스트용 기기를 중고로 구하고 싶은데 혹시 좋은 방법 아시는 분 계신가요? ( 지금 쓰고 있는 iPhone 4 약정도 많이 남아서 ㅠㅠ )


 다음 업데이트는 이번 주말에 하는 것을 목표로 작업하고 있지만 더 늦어 질수도 있습니다.


 
Posted by U∙Seung
!중요! YooKey Pro를 설치후 무한 사과를 경험했다고 몇 분 제보를 해주셨는데 크랙버전을 설치한 것으로 의심이 됩니다. 그 중 한분은 cydia.hackulo.us를 통해서 받으셨다고 합니다.
(추가로 
SwipeToMoveCursor, xpandr 어플과 충돌을 일으킨다고 합니다. 설치하신분은 주의 부탁드립니다. )

현재 정식 버전인 BigBoss버전 v1.0.9-3의 다운로드 횟수는 4200+이며, iOS 5.0.1에서 설치된 YooKey Pro버전의 기기의 숫자도 3000+를 육박하고 있습니다. 이 숫자에 비하면 무한사과가 제보된 횟수는 그리 많지 않은 것으로 판단하고 있습니다. 그렇기 때문에 크랙버전을 더 의심하고 있는 것입니다.

YooKey Pro의 정식버전은 BigBoss에서 받으실 수 있으며 가격은 $3.99에 판매하고 있습니다. 정식 버전을 받지 않으신 경우에는 어떠한 지원도 받으실 수 없습니다.

참고로 이전에 iOS 5.0.1의 완탈버전이 나오기전에 준완탈(Semi-tethered Jailbreak)을 별도로 설치한 경우 YooKey Pro가 충돌하여서 무한사과처럼 보이는 현상이 있었으나 다행히 이 경우는 iFunbox등을 통해서 YooKey Pro의 dylib를 제거하고 부팅이 가능하였다고 합니다.

하지만 BigBoss에서 정식 버전을 받으신 경우인데도 불구하고 문제가 발생하신 분이 제보 부탁드리겠습니다. 확인후에 조치할 수 있도록 하겠습니다. 제보를 해주실 때에는 다소 불편하시더라도 아래와 같은 사항을 함께 보내주 시면 감사하겠습니다. (보내 주실 곳: airlover@gmail.com)

1. YooKey Pro를 받은 호스팅 업체(Source)
2. iPhon 기기 종류, iOS버전, UDID
3. 사용한 탈옥 툴
4. YooKey Pro이외에 설치한 패키지 (준탈옥툴 설치 유무 포함)
5. 무한사과가 걸리는 시점(특정 어플 사용? 재부팅?)


2011. 12. 31 11:05 추가.
--------------------------------------------------

SwipeToMoveCursor와 출돌이 보고 되었습니다.
SwipeToMoveCursor와 YooKey Pro를 같이 설치할 경우 무한사과에 걸린다고 합니다. 설치하신분은 주의가 요망됩니다.

2012. 01. 01 12:50 추가
--------------------------------------------------


이미 접하신 분들도 있겠지만 너무 좋은 소식이라 저도 공유합니다.
일단 @pod2g라는 (프랑스?) 해커가 기존 탈옥을 완탈로 바꾸는 법을 찾아냈고 이를 iPhone devteam과 Chronic devteam을 통해서 공개하였습니다.

결론만 강조해서 말씀드리면...
완탈을 원하면 iOS 5.0.1로 업데이트! (혹은 복원).
별다른 소식이 없다면 iOS 5.1 등으로 업데이트 보류! 정도가 되겠습니다.
일단 제 패키지인 YooKey Pro와 Color Keyboard는 잘 돌아가는 것을 확인 하였습니다.



 이번에 pod2g가 만든 것은 "untether"로 기존에 tethered-jailbreak을 untethered-jailbreak으로 바꿔주는 녀석 정도가 되겠습니다. 따라서 iOS 5.0.1 버전이 깔끔하게 탈옥된 경우에는 다시 탈옥할 필요없이 untether만 실행 시켜주어도 되겠습니다.
 탈옥툴은 아래와 같습니다.
 - redsn0w 0.9.10b1 이상: http://blog.iphone-dev.org/post/14857834236/untethered-holidays
 - Corona 5.0.1 Untether (Cydia에서 Corona 검색)

 
--------------------
더 자세한 정보를 원하시는 분들도 계실 것 같아서
 iPhone Devteam 블로그에 올라온 글을 간략히 정리했습니다.

@pod2g가 iOS팬들에게 엄청난 선물을 마련했습니다. 바로 iOS 5.0.1 완탈입니다. (iPad2, iPhone 4S 제외)

며칠전 @pod2g는 완탈 방법을 iPhone devteam과 Chronic devteam에 보내왔습니다. iPhone Devteam은 이것을 redsn0w 0.9.10과 PwnageTool에 넣었고, Chronic devteam은 이것을 Cydia Package로 만들었습니다. (둘은 같은 exploit을 사용합니다.)

완탈 툴을 사용하기 전에 주의해야할 사항은 아래와 같습니다.

 - 이번 완탈은 iOS 5.0.1용 이며, iPhone 3GS, iPhone4, iPhone4-CDMA, iPad1, iPod touch 4G, iPod touch 4G에 적용 가능합니다.
 - 혹시 iOS 5.0.1이 아닌 경우, 지금 업데이트 해야 합니다. 다행히 아직 5.0.1로 업데이트 가능 합니다.
   (참고로 iOS 5.1 베타가 배포되고 있습니다. iOS 5.1이 정식 배포되면 iOS 5.0.1로 업데이트가 가능하지 않을 수 있습니다.)
 - 지금 iOS 5.0.1을 반탈 상태로 사용중이면, 완탈을 하는 법은 두 가지가 있습니다. redsn0w 0.9.10을 이용하거나(Install Cydia 옵션 선택해제) chronic devteam에서 만든 Cydia package를 이용하는 방법입니다. 두 가지 방법 모두 기술적으로 동일합니다.
 - hybrid 5.0/5.0.1 설정을 사용 중이라면(저는 hybrid 모드를 어떻게 설정하는 건지 잘 모르겠네요.) 벽돌이 될 수 있으니 절대 위의 완탈 방법을 사용하지 마시고 iOS 5.0.1의 깨끗한 버전으로 복원 하신후 다시 탈옥 하시기 바랍니다.

@pod2g는 이번 완탈을 위해서 exploit과 trick들과 몇 달을 씨름하였습니다. 많은 분들이 기부(donation)를 하는 방법을 알고 싶어할 것 같습니다. 비록 iPhone devteam은 기부를 받지않지만 redsn0w 마지막에 @pod2g에 대한 기부 링크를 넣는 것이 좋겠다고 생각했습니다. Cydia Package에는 Chronic devteam을 위한 기부링크가 포함되어 있습니다.

@pod2g는 현재 이 완탈 방법을 A5 기기(iPad2, iPhone 4s)에도 적용하는 것을 검토하고 있습니다. pod2g의 트위터나 블로그를 주시 해주십시오.

 ---------------------

 저도 소정의 금액을 pod2g에게 기부할 생각입니다. (요즘 판매실적이 매우 저조해서 많이는 못할 것 같지만..)
 예전에 Jailbreakme를 만들던 comex가 Apple에 입사해버려서 아쉬웠는데.. pod2g가 그 빈자리를 채워주면 좋겠네요 :D

  그럼 모두 즐탈 하세요~


Posted by U∙Seung
[2011-10-13 10:10] 추가 사항

 iOS 5 정식버전은 iOS 5 GM 버전과 완전히 동일 합니다.
 따라서 탈옥도 기존에 iOS 5 GM 버전용으로 개발된 redsn0w로 반탈옥(Tethered jailbreak)이 가능합니다.

 redsn0w 공식 버전은 Dev Team 블로그에서 다운로드 가능합니다.
 http://blog.iphone-dev.org/redsn0w-iOS5

 (+) 개략적인 흐름 설명을 덧 붙였습니다.
 
----------------------------------------------------

 오늘 iOS 5가 출시 될 예정입니다.

 저는 아이폰을 항상 탈옥해서 사용 해왔고,  iOS 5 역시 탈옥해서 사용할 계획입니다.
 탈옥을 하게 되면 약간 부가적인 노력이 들어가기 때문에 모든 사람에게 탈옥을 추천하지는 않지만 처음에 약간한 노력하면 이후에 계속 편하게 아이폰을 사용할 수 있기 때문에 많은 분들께 탈옥을 추천하고 싶습니다.

 제가 이번에 iOS 5를 탈옥했던 과정과 탈옥을 하면서 겪었던 삽질 등을 공유 해봅니다.

 이전에 iOS 5 Beta 버전에서 탈옥을 시도하였다가 불안정한 부분이 너무 많아서 사용을 포기하고
 iOS 4를 사용하다가 iOS 5 GM 버전이 출시된 이후에 다시 iOS 5를 탈옥(반탈)을 해서 사용하고 있습니다.

 일단 개략적인 흐름은 아래과 같고, 세부 단계에 대해서는 아래에 약간(?) 더 자세히 적었습니다.

 iOS 4 탈옥 버전에서 iOS 5 탈옥 버전으로 가기.

 1. iTunes를 연결하여서 iPhone 내부의 사용자 데이터 백업. (iOS 4 탈옥 상태라 가정, 순정도 동일)
 2. iTunes를 10.5 버전으로 업데이트 
 3. iPhone을 DFU모드로 진입 시킴
 4. iPhone을 iOS 5으로 복원 (완료시, 순정상태의 iOS 5가 깔린 iPhone이 됨.)
 5. 1번에서 백업된 데이터로 부터 사용자 데이터 복원
 6. redsn0w를 이용하여서 탈옥 (iOS 5 탈옥된 iPhone이 됨)




#. 탈옥전, iTunes를 통한 iPhone 내의 데이터 백업

 업데이트를 위해서 아이폰에 들어있는 데이터 들은 소중하니까 백업을 수행 합니다.
 아이폰을 PC에 연결하고, iTunes를 실행한 후 기기에 우 클릭후에 "백업"를 누르면 됩니다.



 백업을 하면 iPhone에 저장 되어있던 연락처, 사진 부터 통화기록, 사파리 북마크 등등을 아이폰의 많은 정보를 저장하기 때문에 다소 시간이 걸리지만 백업하기를 추천합니다.

 백업에 대한 자세한 정보는 아래를 참조 해주시면 됩니다.
 http://support.apple.com/kb/ht1766?viewlocale=ko_KR&locale=ko_KR



#. iTunes를 최신 버전으로 업데이트

 iOS 5 Beta나 GM버전을 설치하기 위해서는 
 iTunes Beta 버전이 필요하였는데 iOS 정식 버전은 iTunes도 정식 버전을 설치하면 됩니다.

 http://www.apple.com/itunes/download/

 iOS 5를 설치하려면 iTuens 10.5 를 설치하면 됩니다.


 
#. iOS 5 설치.

 정식 버전의 경우, [업데이트 확인]을 누른 후에 "새 버전으로 업데이트 하시겠습니까?" 에서 "예"를 누르면 바로 업데이트가 됩니다만 경우에 따라서 아이폰 최신 펌웨어를 다운 받는데 너무 오랜 시간이 걸릴 수 있습니다.

 이럴때는 최신 펌웨어 파일을 Torrent등을 이용하여 직접 다운로드 받는 방법도 있습니다.
 iOS 최신 펌웨어 다운 받기: http://imzdl.com/


 직접 다운 받은 파일은 iTunes에서 [복원] 을 (Shift) + (클릭)한 후에 다운 받은 ipsw파일을 선택하면 됩니다.

 이때, "아이폰을 복원할 수 없습니다. this device isn't eligible for the requested build" 라는 오류가 뜰 수가 있는데 이럴 때는..
 - host 파일에 gs.apple.com 이 다른 주소로 설정된 것은 아닌지 확인.
   (C:\Windows\System32\drivers\etc\hosts  or    /etc/hosts)
 - 위의 방법이 안 통할 경우, 아이폰을 DFU모드로 만들고 다시 Shift + 복원 시도. 



#. 탈옥 (Jailbreaking)

  iOS 5의 탈옥툴은 아마 Dev-Team에서 내놓을 것 같습니다.
 http://blog.iphone-dev.org/ 
 http://blog.iphone-dev.org/redsn0w-iOS5

 이제 탈옥 다 하실 줄 아시잖아요.ㅋ

 [Extras] > [Select IPSW] > 다운받은 iOS 5 IPSW 파일 선택 > Back
 [Jailbreak] > DFU 모드 만들기 > 탈옥 완료
 [Extras] > [Just boot]

 탈옥이 끝나면 백업한 내용을 복원하면 됩니다.


#. YooKey Pro 설치 

 

 YooKey Pro의 최신 버전은 v1.0.9-2 입니다.
 그 이전 버전은 iOS 5에서 정상동작하지 않을 수 있습니다.



 PreferenceLoader는 2.0.3-2 이상이 되어야지 설정앱에서 설정할 수 있습니다.



#. WinterBoard 설치

 현재 WinterBoard의 공식 최신 버전인 에서는 iOS5가 정상 지원되지 않습니다.
 하지만 Andrew Liu 가 iOS5 에서 사용가능 하는 Fix를 만들었습니다.

 아래 링크에서 다운받으실 수 있습니다.
 https://twitter.com/#!/WyndWarrior/status/105046444645421056

 
 



 YooKey 테마가 정상 적용되는 것을 확인 했습니다.



#. SBSettings 설치

 iOS 5를 지원하는 SBSettigns는 현재 Beta 상태로 http://thebigboss.org/ios5beta 소스에도 별도로 배포하고 있습니다.

 자세한 사용은 아래를 참조 해주시면 됩니다.
 http://thebigboss.org/sbsettings-beta-for-ios5



 설치 후에 Notification Center에서 표시되게 하려면.
 설정 > 알림 > SBSettings > 알림센터 스위치 ON 을 해야 합니다.




 몇가지 이슈가 있지만 전체적으로 잘 동작하고
 YooKey 토글도 Notification Center에서 정상 작동하더군요. ^^



#. 애플SD 네오고딕으로 폰트 변경




 iOS 5 Beta 6 에서는 애플이 한글 폰트를 변경 해주었습니다.
 비록 iOS 5 Beta 7과 iOS 5 GM에서는 포함되진 않았지만 말입니다.

 iOS 5 Beta 6에 포함되었던 폰트를 덮어 씌우면 될 것 같은데
 그 파일은 못 찾고 iOS 4용으로 바꾼 파일? (정확히 어떻게 수정했는지는 잘 모르겠습니다.)을 적용 해보았습니다.

 출처: http://clien.career.co.kr/cs2/bbs/board.php?bo_table=cm_iphonien&wr_id=334490

 폰트는 원하는 모양으로 바뀌었는데 불행하게도 Emoji가 표시되지 않더군요. 



#. Activator 버그로 스크린이 1/4이 되는 현상.



 Activator가 업데이트 되면서, 해결이 된 줄 알았는데 
 전 다시 재현이 되네요. -_-

 리부팅한 이후에 재현이 되는 버그이고
 회피 방법은 (1) Safe Mode 로 진입.  (2) Restart를 눌러서 Respring 한 후 사용. 입니다.
 Safe Mode로 진입하는 방법은 SBSettings을 이용 하시면 됩니다.


 그럼 즐탈 하세요. :)

Posted by U∙Seung

 안녕하세요.
 iOS 5 GM버전은 이미 배포가 되었고,
 2011년 10월 12일 정식 버전이 배포 된다고 합니다.

 탈옥 커뮤니티에서도 이에 대한 준비가 한창인 것 같은데요.
 저도 대응을 시작하고 있습니다.

 정확한 날짜는 장담은 못하겠고 늦어도 이번달 내에는 iOS5 에서 정상 동작하도록 준비하겠습니다.




 
 iOS5를 좀 뜯어보니 키보드 부분이 많이 바뀌었습니다.
 내부적으로 코드가 좀 더 정리되고 깔끔하게 바뀐 것 같은데.. 
 이에 따라서 대응할 사항이 많아 질 것 같습니다. (특히, Color Keyboard)

 일단 YooKey의 경우는..
 처음 받아서 설치해보니 키보드까지는 표시 되는데 키를 누르니 어플리케이션이 Crash되는 현상이 있었습니다.
 살펴보니 키 터치음 쪽이 바뀌어서 문제가 되었는데 이는 아래와 같은 방법으로 회피가 가능합니다.

 설정에서 "버튼 터치음 사용"을 해제 하시면 터치음을 끄게 되어서, 버튼 터치음은 잃지만 동작하는 상태로 만들 수 있습니다. 다만  현재 iOS5에서 PreferenceLoader가 정상 동작 하지 않아서 YooKey 설정에 접근하기 어려운 상태입니다.(2011. 10. 11 현재 iOS5용 Preference Loader가 업데이트 되었습니다. )


  좀 불편한 방법이지만 아래 파일을 
 /var/mobile/Library/Preferences/net.9eye.yookey.plist 에 넣어주시면 수동으로 설정을 바꾸실 수 있습니다. ( 버튼 터치음을 끄는 설정입니다. )
Posted by U∙Seung

 2011년 06월 14일자로 기사가 떴습니다.
 내용은 얼마전에 라이선스 건으로.. 배포를 중지할 것을 요청했던 KT가 6월말 부터는 완전히 공개한다는 것입니다.

 이 기사에 관련해서 더 자세한 문의를 했는데
 정확한 시기(6월 말이 언제인지)는 명확하지 않고, 한글자판의 국가표준화 관련한 정부 공시 이후에 사용가능하다고 합니다. 정부의 공시일이 언제인지는 아직 알 수 없고, 6월 말이라는 것 이외에 정해진 것이 없을 것 같기도 합니다.

 나랏글 자판을 사용할 수 있게 되면,
 YooKey Pro의 테마에 다시 나랏글 자판(이지한글)을 추가 하고,
 YooKey Lite 버전도 다시 공개 하겠습니다.



 
Posted by U∙Seung

얼마전에  Cydia 1.1이출시되었습니다.
기존버전이 Cydia 1.0.3366-7 이었는데 버전이 한단계 올라간 만큼 많은 변화가 있었습니다.



Cydia 제작자인 Saurik은 자신의 Twitter를 통해서 1.1은 좀 더 빠르고, 가볍고, 안정적이라고 밝혔으며 검색 알고리즘도 개선하고 백그라운드 지원도 추가하였다고 하였습니다. ( v1.1 이 출시된 이후 바로  v1.1.1 업데이트 버전이 나왔습니다. )



 실제로 설치 해보니 UI가 개선되었고, 속도가 약간 향상이 된 것을 느낄 수 있었습니다. 개인적으로는 백그라운드에서 돌아가는 기능이 가장 마음에 들었습니다.
 이미 알고 계시는 분도 많으시겠지만 Cydia는 Open source project로 개발 되고 있습니다.
 원 저작자인 Saurik이외에도 몇몇 분들이 이번 업데이트를 위해 수고해주셨다고 하네요.
 그 분들의 노고에 감사와 경의를 표하고 싶네요. ^^

 아무튼 최신 Cydia는 자체 업데이트를 통해서 받으실 수 있으며,



 자체 업데이트가 원활하시지 않은 경우 아래 경로에서 받으실 수도 있습니다.


또한 Cydia 실행시 실행되자 마자 앱이 죽는 현상이 발생하시는 분은
먼저 Respring을 한번 해봐주시고, 그래도 해당 현상이 재현될 경우 아래와 같은 방법을 시도해보시기 바랍니다.
 (출처: http://thebigboss.org/guides/cydia-crash-fix)

  [1] 먼저 아래와 같은 파일을 지웁니다.
   /etc/apt/sources.list.d/cydia.list
   /var/lib/cydia/metadata.plist

  [2] 아래 경로에 있는 모든 파일을 지웁니다. (디렉토리는 빈채로 남겨 둡니다. )
   /var/lib/dpkg/updates/



Posted by U∙Seung

 많은 분들이 질문 해주시고, 오해가 많으신 것 같아서 새롭게 글을 씁니다.


#1. Cydia 실행 중 튕기는 것은 제가 의도한 것은 아닙니다.

 결국 Cydia 어플리케이션이 죽는 다는 것인데.. 이것은 Cydia 어플리케이션의 버그 입니다.
 저는 Package를 만들어서 BigBoss에 등록하였을 뿐 Cydia 어플리케이션이 죽도록 작업하지 않았습니다.
 ( 애플 앱스토어에 게임을 등록 했는데... 앱스토어 어플이 죽는다고 생각 해보시면 쉬울 것 같네요. )

 해당 문제는 Cydia를 최신 버전으로 업데이트 하면 해결 된다고 합니다.
 유키짱님이 제보해 주셨습니다. (http://9eye.net/407#comment7172094)


#2. 등록한 Sourcer간의 어플리케이션이 충돌할 경우 튕긴다는 제보가 있습니다.

 공인되지 않은 소스를 모두 제거 하고 다시 시도해 주십시오.
 등록한 Source 들 간의 어플리케이션이 중복 될 경우, 튕긴다는 제보가 있습니다.
 확인 해보진 않았지만 가능성이 농후하니 한번 해보시기 바랍니다.



#3. 필요하실 경우, YooKey는 다음과 같은 방법으로 제거하실 수 있습니다.

 (A) WinterBoard 의존성을 이용하는 방법

많은 분들이 삭제를 원하는 YooKey Pro v1.0.3 버전은...
WinterBoard에 대한 의존성이 (배포 과정상의 착오로) 포함되어 있습니다.
(YooKey Pro v1.0.4 이후 버전은 WinterBoard에 대한 의존성은 없습니다.)

따라서 v1.0.3 이하 버전은 WinterBoard를 지우시면, YooKey Pro도 함께 지워집니다.


 (B) Command-line을 이용하는 방법 (SSH나 MobileTerminal 이용) 

dpkg --purge net.9eye.yookey
dpkg --purge net.9eye.yookeypro

불법적인 경로에서 받으신 경우, 이름이 다를 수 있습니다.
이 경우 아래 명령어를 입력하시면 설치하신 패키지 이름을 확인 하실 수 있습니다.

dpkg -l

 (C) 수동으로 삭제 하는 방법 (가장 비추 합니다.)

iPhone에 접속 하셔서 해당 경로에 있는 파일을 지워 주시면 됩니다.

/Applications/YooKey.app/*
/Library/MobileSubstrate/DynamicLibraries/YooKey*
/Library/PreferenceLoader/YooKey*
/Library/Themes/YooKey_*
/var/mobile/Library/Preference/net.9eye.yookey.*



#4. Cydia 어플도 꼭 정품을 구매해 주시기 바랍니다.

 Cydia Store에서 판매하는 어플리케이션도 다른 어플리케이션과 마찬가지로 많은 시간과 노력을 기울여서 만들어 집니다. 하지만 간혹 크랙과 탈옥을 구분하지 못하시는 분들이나 탈옥이 불법이고 Cydia Store는 암시장(Black market)인 것 마냥 취급하시는 분들을 보면 많이 안타깝습니다.

 탈옥(JailBreaking)은 애플에서 권장하지는 않지만 합법적인 행위 입니다.
 또한 Cydia Store는 불법적인 암 거래 시장이 아닙니다. Cydia는 SaurikIT라는 회사를 통해 합법적으로 운영되며, 대표인 Jay Freeman(saurik)은 각종 방송이나 강연등을 다니는 등의 공식적인 외부 활동도 다니고 있습니다.

 그리고, 저는 앞으로는 불법적인 이용자 분들을 위해서 제 시간을 할애하지 않겠습니다.




Posted by U∙Seung


 많은 분들이 "다음문장"을 바꾸는 법을 요청하셔서 이를 공유합니다.
 일단 "다음문장" 이란 글씨는 YooKey가 강제로 설정한 문자는 아닙니다. iPhone 시스템에서 설정한 문자이며, 때에 따라서 "검색", "완료", "다음" 등으로 변하기도 합니다.

 따라서 해당 위치에 하나의 문자만 강제로 넣는 것은 바람직 하지 않다고 생각합니다.
 다만, "다음문장"이란 문자가 나올때 다른 문자로 바꾸는 것은 가능합니다.
 

 아래는 "줄바꿈"이란 문자로 바꾼 예제 입니다.
 YooKey에서만 바뀌는 것이 아니라 두벌식 키보드에서도 바뀐 것을 보실 수 있습니다.




바꾸는 방법은 .. 
/System/Library/Frameworks/UIKit.framework/Keyboard-ko.plist 파일에서
UI-Return 필드를 바꾸시면 됩니다.



-----------------------------------
제가 줄바꿈으로 바꾼 파일을 첨부 합니다.



Posted by U∙Seung



 안녕하세요.
 YooKey관련 글을 검색 해보다가 찾은 자료 입니다.

 무한 사과 현상이란.. 아이폰 부팅 시작시 나오는 애플로고가 무한으로 보이면서 부팅이 완료되지 않는 현상을 말합니다. 조금 기다린 후, 부팅이 되었다면 같은 현상은 아닙니다. 저는 해당 현상 발생시 DFU모드 복원 밖에는 방법이 없는 줄 알았습니다..

 하지만 네이버 아이앱 카페에 "잡스횽(yyh3636)"님 올려주신 내용 (위의 링크) 을 보고 다른 방법을 찾았습니다..
(물론, 100% 가능한 방법이란 보장은 못 드립니다.)


 결론부터 말씀드리면 방법은 재 탈옥 입니다.

 탈옥툴이 DFU모드 진입후 이루어 지는데..
 아무리 무한사과가 걸린 iPhone이라도 DFU모드 진입은 이루어 집니다. 이때 탈옥 때 수행했던 과정을 반복 해주시면.. (운이 좋을 경우) 부팅시 문제가 됐던 부분이 초기화 되서 iPhone 전체 Reset없이 복원이 가능한 것 같습니다.

 "잡스횽(yyh3636)"님의 경우, limera1n으로 탈옥 하신 iPhone이 무한 사과를 맞고 greenpois0n으로 재 탈옥해서 복원하셨다고 하네요..


 YooKey Pro v1.0.2 에서 문제가 되었던 부분은 SpringBoard 로딩 부분 이었는데.. 왠지 이 방법이 잘 먹혔을 것 같다는 생각이 드네요... 지금 알고 있는 이 사실을 그때도 알았다면....참 좋았을 텐데요  ㅠㅠ


 끝으로... YooKey Pro의 안정성은 지속적으로 개선하고 있습니다. 참고로 말씀드리면.. v1.0.3 업데이트 이후 무한사과 제보는 한건도 없었습니다. (그 사태 이후로 간이 콩알만해져서) 절대로 발생하지 않는다고 보장을 드리진 못하겠지만 많은 분들이 사용하여 주셨지만 아직까지 문제는 없었다는 말씀은 드릴 수 있겠습니다..




Posted by U∙Seung

 C++ 표준 문서 N2798의 14.3.1의 4번째 항목을 보면. 위와 같은 내용이 있다.
 ( 더 최신 문서인 N3092 에는 위 항목이 빠져 있음. )

 해석을 해서 옮기고 싶지만..
 괜히 혼란만 가중 시킬것 같아서.. 패스하고..

  아무튼 자세히 보면.. 정말 해괴망측한 부분이 있는데
  그 부분을 조금 더 살펴 보자면... 아래와 같은 코드가 있다고 했을 때

    1 template<typename T>

    2 struct X

    3 {

    4     static void f(const T& t)

    5     {

    6         t.a = 100;

    7     }

    8 };

 
 함수 f()는 const로 받은 변수의 값을 변경하고 있다.
 얼핏 보아도 이상한 코드다.
 (  아직 template가 instantiation이 되지 않아서 이 부분만 가지고는 컴파일 에러가 나지 않는다.)


 코드를 조금 더 작성해 보면..

    9 struct S

   10 {

   11     int a;

   12 };

   13 

   14 int main(int argc, char* argv[])

   15 {

   16     S s;

   17     X<S>::f(s);

   18 


이제 아마 Line 17에서 readonly인 a에 값을 넣으려고 했다고 해서 컴파일 에러가 날 것이다.
근데 C++0x 부터는 이를 회피할 수 있는 아주 간단한 방법이 생겼다.
단순히 ' & ' 하나만 추가 하면 된다.


   16     S s;

   17     X<S&>::f(s);

   18 

   19     cout << s.a << endl;


 이제 함수 f()는 
 void X::f(S& t) 와 같이 파라미터의 타입이 정해지고, const 속성을 날려버리게 된다. 우왕ㅋ굳ㅋ
 ( 물론, 이렇게 만들어서 const 속성을 없애서 쓰자는 이야기는 절대 아님...)



 C++의 복잡도는.. 날이 갈 수록 올라가고 있다.


끝으로 Quiz..
각각 파라미터 타입은 어떻게 될까요? ( Line 11 ~ Line 29 )
참고로 gcc 4.5.0과 VS2010 에서 둘다 돌려봤는데. 같게 나왔습니다.

    1 template<typename T>

    2 struct R

    3 {

    4     static void A(T&){}

    5     static void B(const T&){}

    6     static void C(T&&){}

    7     static void D(const T&&){}

    8 };

    9 

   10 {

   11     R<int&>::A(?)

   12     R<int&>::B(?)

   13     R<int&>::C(?)

   14     R<int&>::D(?)

   15 

   16     R<const int&>::A(?)

   17     R<const int&>::B(?)

   18     R<const int&>::C(?)

   19     R<const int&>::D(?)

   20 

   21     R<int&&>::A(?)

   22     R<int&&>::B(?)

   23     R<int&&>::C(?)

   24     R<int&&>::D(?)

   25 

   26     R<const int&&>::A(?)

   27     R<const int&&>::B(?)

   28     R<const int&&>::C(?)

   29     R<const int&&>::D(?)

   30 }



Posted by U∙Seung

{Quiz}. 다음 중 l-value는 몇 개일까요? (line 12 ~ line 29 중에서.. )


    1 int* pa = &a;

    2 const int* pb = &a;

    3 

    4 int fa() { return 1; }

    5 const int fb() { return 2; }

    6 

    7 int& fra() { return a; }

    8 const int& frb() { return b; }

    9 

   10 void main_rvalue()

   11 {

   12     RVALUE_CHECKER(1);

   13     RVALUE_CHECKER(int(1));

   14     RVALUE_CHECKER(new int(1));

   15     RVALUE_CHECKER(*(new int(1)));

   16 

   17     RVALUE_CHECKER(++a);

   18     RVALUE_CHECKER(a++);

   19     RVALUE_CHECKER(a + 1);

   20 

   21     RVALUE_CHECKER(++*pa);

   22     RVALUE_CHECKER(*pa++);

   23     RVALUE_CHECKER(*pa + 1);

   24 

   25     RVALUE_CHECKER(fa());

   26     RVALUE_CHECKER(fb());

   27 

   28     RVALUE_CHECKER(fra());

   29     RVALUE_CHECKER(frb());

   30 }



참고로...
#1.  l-value, r-value 구분은 expression에 대한 구분임 (type 이라던지 하는 건 관계가 없음.)
#2.  ++a (line 17) 은 l-value 이지만, a++ (line 18)은 rvalue임.


Posted by U∙Seung

 Apache를 설치하고, 서비스를 시작하면.. 간혹 실행이 안되고 실패를 한다.
 특별한 메시지를 주는 것이 아니기 때문에.. 관리도구 - 이벤트 로그를 확인 하면..



 뭔가 알 수 없는 메시지를 준다.
 
 아무래도.. 알 수가 없어서.

 >>> \xc3\xa3\xc0\xbb \xbc\xf6 \xbe\xf8\xbd\xc0\xb4\xcf\xb4\xd9.

 여기에 단서가 있을까 해서.. 좀 살펴 보니..

 1. 한글이 깨진 것 같고,
 2. \x 가 붙은 것으로 봐서 바이너리 형태 같고,
 3. 세글자가 아닌 두 글자로 쪼개지며, 대충 범위 대역이 EUC-KR 같아서..

  바꿔 보기로 했다. 

  gvim을 이용해서 아래 처럼 입력하고..
  도구(T) - 원래대로 변환(r) 을 누르면..
  xxd 프로그램으로 Binary로 바꿔 준다.



 결국, 이 메시지 만으로는 문제를 '찾을 수 없다는 것'을 알게 되었다.
 장난 하냐? 응?



Posted by U∙Seung

r-value reference 쓸려고 테스트를 해봤습니다.


#. 일단 임의의 문자열(string) N개를 vector에 넣고..

    1     static const size_t N = 100000;

    2     static const size_t MaxLen = 100;

    3     static const char range[] = "abcdefghijklmnopqrstuvwxyz_0123456789";

    4 

    5     struct rnd_gen

    6     {

    7         char operator()() const

    8         {

    9             return range[std::rand() % (_countof(range) - 1)];

   10         }

   11     };

   12 

   13     std::vector<std::string> v(N);

   14     for(int i=0; i<N; ++i)

   15     {

   16         std::generate_n(

   17             std::back_inserter(v[i]),

   18             std::rand() % MaxLen + 1, rnd_gen());

   19     }



#. Sorting 해보고

   20     {

   21         boost::timer t;

   22         std::sort(v.begin(), v.end());

   23         std::cout << "Sort: " << t.elapsed() << std::endl;

   24     }



#. Join 해봤습니다.

   25     {

   26         boost::timer t;

   27         std::string result = boost::algorithm::join(v, ",");

   28         std::cout << "Join: " << t.elapsed() << std::endl;

   29     }




-[ VS 2008 ]--------------
Sort: 0.178
Join: 0.104

-[ VS 2010 ]--------------
Sort: 0.079
Join: 0.029


 C++0x 이전에는 위 처럼 코딩 하지 말라고 했겠죠..
 사실 부자연 스러울 것이 없는 코드인데..
 하지 말라고 하는게 안타까운 상황이었습니다..ㅋ




Posted by U∙Seung

C++로 프로그래밍을 하다보면 딱히 변수 이름이 중요하지 않을 때가 많이 있습니다.
주로 생성자 혹은 파괴자를 이용한 RAII 패턴을 사용하는 상황이 그렇습니다.


임의의 변수명은 Macro를 이용하여 구현합니다.

 

#include <boost/preprocessor/cat.hpp>

#define RANDOM_NAME BOOST_PP_CAT(_random_, __COUNTER__)

 


선언은 위와 같이 하고
대략적인 사용은 아래와 같이 합니다.

 

namespace NS

{

    bool Func(Arg* arg)

    {

        SomeGuard<Arg> RANDOM_NAME(arg);

 

        (...)

    }

 

    static Initialization RANDOM_NAME;

}

 



이렇게 만들어진 변수 명은 '해당 변수를 생성자와 파괴자의 동작만 사용하겠다' 라고 명시적으로 지정하는 역할도 담당하게 됩니다. 변수 명을 알 수가 없으니까 강제로 다른 용도로 사용하려고 해도 할 수가 없겠지요.



Posted by U∙Seung

제가 구독하는 블로그 중에
rein님의 C++0x를 써서 Closure 다시 만들기와 C++기반의 closure를 보고
제가 쓰고 있던 방법도 공개 합니다.


사용할 수 있는 곳은 여러 곳이 있겠습니다만..
다른 곳으로 Message를 Passing 한다던가 Timer를 쓴다던가 할 때
유용하게 쓸 수 있겠습니다.




typedef
function<void (void)> Closure;


C++0x가 지원되면 std.function을 써도 되고
그렇지 않으면 boost.function을 쓰면 됩니다.




void
freef(int a, int b)

{

    cout << a << " + " << b << " = " << a+b << endl;

}

 

struct Class

{

    Class(int a): a_(a) {}

 

    void memf(int b)

    {

        cout << a_ << " - " << b << " = " << a_-b << endl;

    }

 

    int a_;

};

 

vector<Closure> closures;

{

    int a = 10;

    closures.push_back(bind(freef, a, 4));

    closures.push_back(bind(&Class::memf, new Class(a), 2));

//  closures.push_back([=](){ cout << a << endl; });

}

 

foreach(Closure& closure, closures)

{

    closure();

}



마찬가지로 std.bind 나 boost.bind를 사용하고,
C++0x가 지원되면 lambda를 추가적으로 사용할 수 있습니다.




Posted by U∙Seung


 둘다 깔아서 써보고 있는데 괜찮네요 :)

 이제 tr1뿐만 아니라.
 auto, decltype, lambda, strongly typed enum, Rvalue references 등등의 
 C++0x의 훌륭한 Feature 들을 양쪽에서 사용할 수 있게 되었습니다.

 저런 것들은 Boost 등과 같은 Library 만으로 커버가 안되는 것들이라서 더 의미가 깊다 할 수 있겠습니다.



 이건 g++ 4.5.0 인증샷.

#1.  Local Class를 template parameter로 넘길 수 있게 되었습니다.

#2. -flto 옵션이 컴파일, 링크에 추가 되었습니다. 

#3. c++0x feature 중에 하나인 lambda 가 가능해졌습니다.









Posted by U∙Seung
TAG C++, gcc

DragDicN: 네이버 사전

DragDicD: 다음 사전

DragDicY: 야후 사전



 만든지 정말 오래된 것이지만..
 Chrome이 IE보다는 크롬을 더 많이 쓰기 시작한 시점에서 더욱 유용해졌습니다.
 그래서 Chrome에 더 잘 맞도록 수정했습니다. (추가 버튼 색상을.... )

 사용법은...
 1. Boomarklet을 Browser에 등록 합니다.
 2. 사전에 찾아 보고 싶은 단어를 마우스로 Drag합니다. (옵션)
 3. 설치한 북마클릿(Bookmarklet)을 클릭 합니다.





 4. 그럼 아래와 같은 창이 뜹니다.



 5. 단어 뜻을 봤으면 .. 창을 닫아 버리면 됩니다. (옵션)




Posted by U∙Seung

C++ 관련 자료를 찾다 보면 
Google에서 공개한 자료를 많이 접할 수 있게 됩니다.

뭐 사실 C++의 Library야 찾아보면 다른 Library도 많습니다만...
Google의 자료들은 몇가지 공통적으로 기본빵을 해주는게 몇 가지 있는데..
 - 오픈소스라서 소스레벨의 접근이 가능합니다.
 - 라이선스가 BSD/MIT 입니다. 즉 GPL이 아니라서 라이선스 제약이 상대적으로 덜 합니다.
 - 멀티 플랫폼을 지원합니다. (Windows/Linux은 기본으로 됩니다.)
 - 마지막으로 Google이라는 거대 회사에서 직접 적용해본 도입 사례가 있습니다.


제가 찾은 Google의 자료를 공유 합니다. 이밖에 좋은 자료가 있으시면 공유 부탁드립니다.


#. Google Test & Google Mock
 - Google Test: Google C++ Testing Framework
 - Google Mock: Google C++ Mocking Framework

   C++의 xUnit 도구들이 상당히 많은데.. 사용하다보면 뭔가 하나씩 부족한 느낌이 듭니다.
  그 중에서 제일 덜 부족한 느낌이 드는게 Google Test가 아닌가 싶습니다.







#. Google Performance Tools
 - Google Perftools: Fast, multi-threaded malloc() and nifty performance analysis tools

   멀티쓰레드에서 더욱 좋은 성능을 내는 TCMalloc(Thread-Caching Malloc), CPU Profiler를 제공 합니다. TCMalloc에는 HeapProfiler와 HeapChecker포함되어 있습니다. 하지만, Windows 쪽은 지원이 미약하며 다른 좋은 것들도 많기 때문에 Linux에서 쓰기에 적합하다고 할 수 있겠습니다.







#. Google Log
 - Google glog: Logging library for C++

   glog는 Application Level Logging을 할 때 쓰는 Library입니다. 서버 Application을 만든다면 반드시 어떠한 방식으로든 로깅 기능을 사용할텐데 참조가 될만한 Library입니다. 직접 써도 좋을 것 같다는 생각도 들고요.

  인상적인 부분중에 하나는 google::InstallFailureSignalHandler() 함수 하나만 호출하면.. SIGSEGV 등을 받으면 아래와 같이 Logging을 하게 해준다고 합니다. 매우 편할 것 같습니다. 

*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: *** PC: @ 0x412eb1 TestWaitingLogSink::send() @ 0x7f892fb417d0 (unknown) @ 0x412eb1 TestWaitingLogSink::send() @ 0x7f89304f7f06 google::LogMessage::SendToLog() @ 0x7f89304f35af google::LogMessage::Flush() @ 0x7f89304f3739 google::LogMessage::~LogMessage() @ 0x408cf4 TestLogSinkWaitTillSent() @ 0x4115de main @ 0x7f892f7ef1c4 (unknown) @ 0x4046f9 (unknown)







#. Google Sparse Hash
 - Google Sparse Hash: An extremely memory-efficient hash_map implementation

 긴 설명 보다는 아래 테스트 결과가 많은 것을 말해줄 수 있을 것 같습니다.

Average over 10000000 iterations
Wed Dec  8 14:56:38 PST 2004

SPARSE_HASH_MAP:
map_grow                  665 ns
map_predict/grow          303 ns
map_replace               177 ns
map_fetch                 117 ns
map_remove                192 ns
memory used in map_grow    84.3956 Mbytes

DENSE_HASH_MAP:
map_grow                   84 ns
map_predict/grow           22 ns
map_replace                18 ns
map_fetch                  13 ns
map_remove                 23 ns
memory used in map_grow   256.0000 Mbytes

STANDARD HASH_MAP:
map_grow                  162 ns
map_predict/grow          107 ns
map_replace                44 ns
map_fetch                  22 ns
map_remove                124 ns
memory used in map_grow   204.1643 Mbytes

STANDARD MAP:
map_grow                  297 ns
map_predict/grow          282 ns
map_replace               113 ns
map_fetch                 113 ns
map_remove                238 ns
memory used in map_grow   236.8081 Mbytes






#. Google CoreDumper
 - Google CoreDumper: A neat tool for creating GDB readable coredumps from multithreaded applications

  Runtime에 원하는 시점의 Memory를 Dump할 수 있는 기능입니다.
  ASSERT를 걸어야할 시점이 Runtime에서 한참 작업을 진행중이라면 Core만 떠두고, 일단 작업을 진행하도록 한 다음에 나중에 수정하여 업데이트 하는 방법이 있겠습니다.
 (당연히도) Linux만 지원됩니다.







#. 그 밖에..
 - gflags: Commandline flags module for C++
 - Keyczar: Toolkit for safe and simple cryptography
 - Breakpad: An open-source multi-platform crash reporting system
 - Omaha: Software installer and auto-updater for Windows
 - Protocol Buffers: Google's data interchange format

그리고 꼭 읽어보길 권장하는...
Posted by U∙Seung
Posted by U∙Seung

네이버캐스트 :: 교양 경제학RSS

네이버캐스트 :: 옛날신문RSS

네이버캐스트 :: 오늘의 문학RSS

네이버캐스트 :: 오늘의 클래식RSS

네이버캐스트 :: 지구촌 산책RSS

네이버캐스트 :: 철학의 숲RSS

네이버캐스트 :: 키친 스페셜RSS

네이버캐스트 :: 포토 스페셜RSS

Posted by U∙Seung


 S/W 개발을 하다 보면... 프로젝트들이 하나 둘 추가 되고
 그러다보면 Visual Studio 창은 온갖 창들로 복잡해 집니다.

 저 같은 경우에는 파일 이름을 정하는 것이 힘들어서 프로젝트는 다르지만 같은 이름의 파일을 많이 만들게 됩니다. 그러다 보면 이게 어느 파일인지 창만 보고는 분간이 힘들어지고, 작업이 불편하다고 느끼게 되었습니다.



 그래서 찾아낸 해결 책이 Tabs Studio Add-in 입니다.
 Tabs Studio에 보면 여러 기능이 있는데 그 중에서 창 제목을 바꿀 수 있는 기능을 제공 합니다.
 이를 이용 해서 창 제목에 [$(ProjectName)] $(FileName) 가 되도록 만들었습니다.
 ( Tabs Studio에서는 Add-in안의 Add-in 기능을 제공하는데.. 제작자가 샘플로 공개한 Disambiguator를 조금 고쳐서 만들었습니다. )

 이렇게 쓰고 나서 부터는 작업 효율이 좀 나아진 느낌입니다. :)



Posted by U∙Seung


#1. Prompt 설정.

PROMPT=$P$G$_$$

계속 사용하고 싶으면..
환경 변수에 등록해주면 됩니다.

몇 가지 포인트가 있는데..
$_는 한 줄을 바꿀 때 씁니다.
마지막에 Space 를 넣어 주는 것이 보기 편합니다.

편의에 따라서 %USERNAME%, %COMPUTERNAME% 등을 넣어 줄 수도 있지만
Remote로 접속하는 경우가 적기 때문에 필요 없는 경우가 많습니다.

 

#2. 폰트 변경.


Fixed Width 폰트를 지정할 수 있습니다.
한글은 굴림체, 돋움체, 나눔고딕 코딩 등을 지정할 수 있습니다.
원하는 폰트가 목록에 나오게 하기 위해서는
Registry의 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont 에 추가하시면 됩니다.

영문폰트를 사용하고 싶으시면 Codepage를 바꿔야 합니다.
chcp 명령어를 사용하거나
Registry의 HKEY_CURRENT_USER\Console의 하위를 직접 세팅 해서 바꾸면 됩니다.

Posted by U∙Seung

지난 주에 GameTech 2010에 다녀 왔습니다.
정말 오랜만에 세미나를 들으러 갔던 것 같습니다.

GameTech 2010 공식 홈페이지: http://gametech.gamespot.co.kr/

여러가지 세션을 들었지만 가장 인상 깊었던 블루홀 스튜디오의 세션에 대해서만 몇자 남깁니다.

일단 TERA의 서버 구조는 매우 간단합니다.
  • 한 Planet(Wow의 Relm)당 수용인원은 대략 5000명 정도 예상.
  • 한 Planet에는 하나의 Arbiter 서버를 Front-end로 둠.
  • 한 Arbiter 서버에는 여러개의 World서버를 Back-end로 둠.
    • TERA에서는 Planet간에도 유저가 만날 수 있는 통합전장이라는 시스템이 있으므로,
      특정 World서버에서는 여러개의 Arbiter 서버와 연결을 가질 수 있음.
이게 끝입니다.
(물론, 로그인과 같은 인증관련 부분은 생략 되었습니다. 한게임에서 처리하니 필요 없을 것 같기도 합니다.)

정말 간단합니다.
그렇기 때문에 역할 구분도 매우 명확합니다.

[Arbiter 서버]
  • 주로 I/O를 담당.
  • Network 통신에 해당하는 Non-Blocking I/O와 Database 작업에 해당하는 Blocking I/O를 담당.
    (내부적으로는 위의 두가지 방식의 Thread Pool을 분리 한다고 함.)
  • 채팅, 길드 등의 게임 로직을 담당

[World 서버]
  • 주로 (CPU작업이 많은) 게임로직을 담당.
  • Blocking I/O만을 처리하며 모든 Thread가 대등한 역할을 수행.
  • 대부분의 게임 로직을 처리하며, 통합 전장/Instance Dungeon 기능도 가짐.

----

여기까지는 발표 내용이고, 제 개인적인 생각을 몇 자 적어보자면...
발표 초반에 액션성을 강조한 게임이라고 TERA의 특징을 소개하였으나
설명을 들을 수록 액션성이 잘 표현되는 CPU와 I/O를 많이 쓰는 곳에 적합한 구조라는 생각은 안 들었습니다.

지금 구조에서는 Arbiter 서버 프로세스 하나에서 대부분의 I/O가 일어 나는데
I/O쪽 부하가 지나치게 집중 되도록 되어 있으며,
안정성 측면에서도 Arbiter 서버 이거 다운되면 어떻게 하나 걱정부터 많이 들었습니다.

물론, 서버 기능별로 채팅서버, 파티서버, 몬스터서버 이렇게 한 없이 분리하다보면
복잡도가 올라가서 결국 서버의 안정성이 떨어진다는 것을 부정하긴 힘들지만
아무리 그래도 프로세스 하나에서 Network I/O, 채팅/길드, DB 까지 다하는 것은 좀 지나치다는 생각이 듭니다. ( 물론, 블로홀 스튜디오에는 국내 최고 수준의 막강 QA 인력이 포진하고 있다고 합니다... )

뭐 이런 저런 우려와 걱정이 되긴 하였지만..
가슴 속에서는 'Arbiter 서버와 World 서버만 있다고? 이거 만들기 엄청 편하겠는데 +_+)/.... '


끝으로 강연자 분이 했던 말씀중에 인상 깊었던 말이 있었는데...
정확히 문구까지는 기억이 나지는 않지만 대략 아래와 같은 말이었습니다.

서버 구조는 해당 게임의 특징에 따라서 다르겠지만 그것과 더불어서 해당 게임을 만드는 팀에 따라서 달라져야 합니다. 지금 만들고 있는 서버 구조는 현재 팀의 구성에 따라서 정한 것입니다. 만약 현재 팀 구성이 아니었다면 다른 모델을 도전 해볼 수도 있었을 것 같습니다.




Posted by U∙Seung





Posted by U∙Seung

네이버에서는 좋은 정보를 참 많이 제공 해주고 있습니다.
구워진지(Burned) 얼마 되지 않은 Feed.



네이버캐스트 :: 매일의 디자인: RSS, EMAIL

네이버캐스트 :: 아름다운 한국: RSS, EMAIL

네이버캐스트 :: 오늘의 과학: RSS, EMAIL

네이버캐스트 :: 오늘의 미술: RSS, EMAIL

네이버캐스트 :: 오늘의 집: RSS, EMAIL

네이버캐스트 :: 오늘의 체조: RSS, EMAIL

네이버캐스트 :: 인물과 역사: RSS, EMAIL



Posted by U∙Seung

 컴파일 속도가 느리다면.. IncrediBuild를 쓰세요.




 링크 속도가 느리다면.
 일단 64비트 OS를 설치하고,
 RAM을 넉넉하게 늘리세요.   ( 4G 이상, 6G 이상 추천 )



 RAM 업그레이드 이후에 체감 링크 속도가 2~3배 빨라졌습니다.

------------------------------------

 OS를 Windows 7 x64로 업그레이드 했더니 빌드 속도가 더 빨라 졌습니다.
 Windows 7 에서 멀티코어 지원이 강화 된 영향 같습니다.





Posted by U∙Seung
TAG C++

 일단 어떤 테이블에 varbinary(123) 타입을 가진 컬럼이 하나 있었습니다.

mysql> DESC SomeTable col1;
+-------+----------------+------+-----+---------+-------+
| Field | Type           | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| col1  | varbinary(123) | YES  |     | NULL    |       |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.00 sec)


 이 컬럼에는 NULL이 들어 있었습니다.

mysql> SELECT col1 FROM SomTable LIMIT 0, 10 ;
+------+
| col1 |
+------+
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
+------+
10 rows in set (0.00 sec)


 Stored Procedure를 통해서 여러개의 테이블에서 여러개의 컬럼을 읽는 프로그램이었는데... 디버깅 끝에 이 부분부터 꼬이기 시작한다는 것을 발견했습니다.
 그리고 희한하게도 이 컬럼을 읽는 부분에서 NULL이 아닌 값을 읽고 있는 것을 발견했습니다.




 그리고... 확인결과 ... 진짜 NULL이 아님을 알았고

mysql> SELECT col1 FROM SomeTable WHERE col1 IS NULL LIMIT 0, 10 ;
Empty set (0.00 sec)

 



 비극의 진실은...

mysql> SELECT col1 FROM SomeTable WHERE col1 = "NULL" LIMIT 0, 10 ;
+------+
| col1 |
+------+
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
| NULL |
+------+
10 rows in set (0.00 sec)



.......... oTL

 한 가지 고려해볼 수 있는 사항은
 Binary 컬럼은 SELECT시에 *(asterisk)를 쓰지 않고, HEX(col1) 처럼 HEX() 함수로 감싸도록 (마음속으로.. ) 강제 하는 방법.
 


Posted by U∙Seung

 Linux에서 Daemon을 돌리다 보면 버그로 인해서 프로그램이 Crash 되는 일이 종종 있습니다.
 당연히 문제가 되는 부분 찾아서 고쳐야 합니다.

 그럴때 대부분 사용하는 방법이 Process가 죽기전에 기록을 Core파일에 남기도록 설정 하는 방법 입니다.
 정상적으로 남겨진 Core파일 경우라면 디버깅 하는게 큰 문제는 없을 테지만
 아래와 같이 콜스택이 깨져 보이는 난감한 상황을 만들어 내기도 합니다.

Loaded symbols for /lib/tls/librt.so.1

Reading symbols from /usr/lib/libggauth2.so.56...done.

Loaded symbols for /usr/lib/libggauth2.so.56

#0  0x02d10100 in ?? ()

(gdb) bt

#0  0x02d10100 in ?? ()

#1  0x01010000 in ?? ()

#2  0x000002d2 in ?? ()



 콜스택이 깨져 보이는 경우는 주로 Stack Buffer Overrun 으로 인한 문제 입니다.
 (다른 문제는 이 글에서 다루지 않습니다.)
 이 경우, 스택에 있던 Return Address가 지워져 있기 때문에 GDB는 콜스택을 표시하지 못합니다.

 하지만 이런 경우라고 해서 너무 낙심할 것은 아닙니다.
 Stack Buffer가 조금 넘친 경우에는 남은 정보를 이용해서 문제를 해결 할 수 있기 때문입니다.

 이때, 실마리를 제공해주는 것은 Register의 ESP 입니다.
 비록 원하던 Return Adress는 지워졌지만 ESP는 값은 정상적인 값을 유지하고 있습니다.
 이제 ESP가 가르키던 메모리 주변을 뒤져서 Return Address와 유사한 값들이 있는지 찾아보면 문제에 대한 힌트를 얻을 수 있습니다.

 일단 Return Address랑 유사한 녀석들은 어떤 녀석이어야 하는지 파악 해야 합니다.
 당연히 Return Address는 실행가능한 Instruction 들이 저장되어 있는 Code Segment를 가르키고 있습니다. GDB에서는 maint info sections .text 명령어를 통해서 Code Segment를 찾아 볼 수 있습니다.

(gdb) maint info sections .text

Exec file:

    `/home/aa/bb.debug.1f25cf3be302bd7308d598c132ac904b', file type elf32-i386.

    0x08051e20->0x0824fc08 at 0x00009e20: .text ALLOC LOAD READONLY CODE HAS_CONTENTS

Core file:

    `/home/aa/core.1214458224.bb.30678', file type elf32-i386.



 이제 Code Segment의 범위도 구했으니 ESP를 기준으로 주변 탐색해서 Return Address와 유사한 녀석들을 찾아 본다면 아마 콜스택과 유사한 모양이 만들어 질 수 있을 겁니다.

 이를 위해서 간단한 User-defined Command를 만들었습니다.

define findsymbols
set $textbegin = $arg0
set $textend = $arg1
set $si = $arg2
set $ei = $arg3
while $si < $ei
set $value = *(int*)$si
if ($textbegin <= $value && $value <= $textend)
printf "[0x%08x] ", $si
info symbol $value
end
set $si = $si + sizeof(void*)
end
end

 가독성이 다소 떨어지긴 하지만 동작은 간단합니다.
 주어진 범위를 탐색하면서 정해진 범위의 값(Code Segment의 범위)이 들어오면..
 해당 값을 info symbol 을 이용해서 출력하는 Command 입니다.



 실제로 사용하면 아래와 같은 결과를 얻을 수 있습니다. (함수 이름은 가명..)

(gdb) findsymbols 0x08051e20 0x0824fc08 $esp-1024 $esp+1024

[..] IoHandler::SendPacket(char const*, unsigned int, bool) + 786 in section .text

[..] IoHandler::UniCast(char const*, unsigned int) + 26 in section .text

[..] Remote::PartyCast(Party*, char const*, unsigned int) + 141 in section .text

[..] Dispatcher::Do(Task*, TaskMsg*) + 795 in section .text

[..] Task::ExtractTaskMsg(TaskMsg*) + 953 in section .text

[..] Task::svc() + 510 in section .text



콜스택(?)을 얻었으니 ESP값과 비교 등을 통해서 어느 지점에서 Crash되었는 지를 파악할 수 있을 것입니다. 아마 있어야 하는 함수 1~2개가 누락되어서 보이는 경우가 대부분 일테고요. 어떤 함수가 버퍼를 넘치게 했는지 찾아내면 됩니다.

좀 더 정확한 원인을 얻어 보기 위해서는 GDB의 x 명령어 등을 이용해서 ESP 주변 메모리를 잘 뒤져보면 답을 찾을 수 있습니다. 하지만 이 정도 까지 얻었다면 소스를 보고 문제의 원인을 먼저 찾고 문제점이 맞는지 검증하는 편이 더 빠를 수 있습니다.

그럼 즐거운 디버깅 되세요 :)


Posted by U∙Seung