links for 2009-07-24
7월 25, 2009
private AP, apple, cocoa, 네이버, 개발자, 블로그, freeware, HP, iphone, ipod, 팁, mac, OSX, touch, USB, wifi, xcode 댓글 남기기
-
헐퀴 좀 짱인데요. 그럼 모든 휴대폰들이 다 와이파이가 되는건가요 ㅎㅎㅎ
-
맥용 램드라이브
-
Xcode – 램디스크 컴파일
-
QSoft Ramdisk
-
램디스크 활용 설명 – 3.25GB 초과 메모리의 활용에 대한 상세한 설명
-
[칼럼]SW개발자의 희생을 요구하는 문화는 바뀌어야 한다
links for 2009-07-22
7월 23, 2009
private develop, 동영상, HP, iphone, iStory, 트위터, 팁, 플러그인, 아이폰, mac, MS, OP, programming, sdk, story, twitter, xcode 댓글 남기기
-
트위터 아웃룩 플러그인
-
아이폰 개발 동영상 강좌
-
트위터 평판점수
Daily Tweets
6월 12, 2009
private AP, daily, iCal, iphone, 터치, 트위터, 팁, loudtwitter, nambu, safari, tweetie, twitter, twitterfeed 댓글 남기기
- 09:01 @geek2live ^^ 저도 안그래도 TwitterRemote 달아보고자하고 있는데, 도통 회사일로 시간이 안나네요 #
- 09:04 어떤 트위터 클라이언트를 사람들이 많이 사용할까? 어떤 트위터클라이언트를 써볼까? 이런분은 참고하세요. 트위터클라랭킹 : www.twitstat.com/twitterclientusers.html #
- 09:07 RT 이건 스파이마스터 매냐들을 위한 것인가 ㄷㄷㄷ @playspymaster: Another iPhone wallpaper for #spymaster, submitted by a fan – flic.kr/p/6veYiL #
- 12:47 #KorTwitterTip 최근 한국 트위터유저수가 급격히 늘어나신 기념으로 미천한 지식이나마 짧게 간간히 트위터팁을 올릴까 합니다. #
- 12:47 #KorTwitterTip 1)트위터의 첫인상 Bio를 충실히 : Settings-Account-Online Bio 160자에 가급적 충실히 쓰셔야 괜한 스패머로 오해받지도 않고, 같은 관심사분에게 팔로잉되기도 쉽습니다. #
- 12:50 #KorTwitterTip 2)트위터는 도배 스팸방지등의 목적으로 100 API/Hour의 제약이 있습니다. API란 트위터의 글쓰기,검색등 어떤형태든지의 1회사용이라고 보시면 됩니다.따라서 동시에 여러클라이언트를 사용하시면 낭패를 봅니다. #
- 12:57 #KorTwitterTip 3)개인적인 추천 트위터클라는 윈도우)Chrome+pbtweet,TweetDeck,twhirl 맥)Tweetie,Nambu,Safari+pbtweet 터치)TwitterFon,Twitterrific,TwittelatorPro #
- 13:02 #KorTwitterTip 4)FriendFeed,TwitterFeed 처럼 RSS형식을 빌어 트위터로 재전송(신디케이션)하는 경우,도배+중복+이중클릭요구 등의 이유로 싫어하는 분이 많아서,Unfollow되기 쉬우므로 신중하게 연동하실것을 추천합니다 #
- 13:10 #KorTwitterTip 5)Reply 를 하실때 (@id 내용) 원칙적으로 @id가 가장 앞에 나와야 정상적으로 글추적이되는 클라들이 많습니다. 따라서 가급적이면 Reply시에는 @id를 가장 앞에 달아주세요. #
- 13:16 #KorTwitterTip 6) #단어 <- 해쉬태그 라고 불리며,클릭만으로 검색할수있는 비공식적기능이나, 유감스레도 한글로검색이 안됩니다. 한글내용을 검색하고 싶으신 경우는 트위터 공식홈 좌측검색란에 # 없이 한글로 입력하면됩니다. #
- 13:19 윽 #KorTwitterTip 6) 이거 오타 좌측(x) 우측(o) ^^ #
- 13:25 #KorTwitterTip 7) 글자절약팁:한글축복:트위터는140자글자제한인데,영어알파벳1문자=한글한글자 입니다. 한글이 훨씬많은내용을 담을수있습니다.^^ 국내유저에게 보여지길원하시면 가급한 한글로쓰시는것이 절대유리합니다. #
- 17:27 #KorTwitterTip 8) 팔로잉/팔로워 정리에 관련해서는 트위터 카르마를 가장 추천합니다. dossy.org/twitter/karma/ #
Automatically shipped by LoudTwitter
Daily Tweets
5월 22, 2009
private AP, daily, GPS, iCal, iphone, 트위터, 팁, 유료, loudtwitter, sync, twitter, wifi, XP 댓글 남기기
- 09:13 @xguru 축하드려요. 칼퇴근이라 부럽습니다. ^^ #
- 09:29 @yeongmin DEVONthink 는 잘 쓰고 있음??? #
- 12:10 내가 할일이 많긴 한가보다, 걸핏하면 #RTM 에서 스크립트처리량이 과도하니 중지시키시겠냐고 물어본다 X< #
- 14:18 RT good & simple 좋네요 @rabbiyang: tr.im/lXpq @mehori 님이 맥에서 간편하게 쓰기 좋은 이미지 관련 프로그램들 소개한 글. (단, 일본어임;) #
- 15:25 @archcoral 와 첫트윗 축하드려요. 회식인데, 차가 대수입니까 #
- 16:10 @cool_uk 왜 내가 트위터를 하느냐? 누굴 Follow해야하는가? 문제는 딱히 답이 있는것 같진않습니다. 멀티계정도해보고 여러시행착오끝에는 결국, 한계정에 모조리 following으로 되더군요. 수많은트윗을 일단 모아놓고 빠르게 검색하는 팁이필요 #
- 16:14 changing firefox theme to ChromiFox – bit.ly/xbP9u – simply & fast – recommened ff theme #
- 17:47 @ludens_ del.icio.us 가 아무래도 가장 낫더군요. #
- 19:04 @jenix 전송버튼을 한번 눌러보시지요 ^^; 사랑은 블루투스를 타고 ~ 인가요 #
- 19:08 @hof @fribirdz Byline의 문제이기도 하지만, 더근본적인건 iPhone의 가용메모리를 훨씬초과하는 feed를 보고계시기때문이기도합니다. 가능한 1feed=1folder로 하시고, 200개씩sync 안하시면 괜찮습니다. #
- 19:11 RT @seanchoe: Bookmarked : Eric Schmidt’s Keynote Speech tinyurl.com/pcl7tq #
- 19:32 @doax 생각보다는 Tweetree 유저가 그리 많지않습니다. (via tweetree 인 경우가 손에 꼽을정도라서) 모든 링크의 실제정보다 다보이기 때문에 편한점도 있지만, 역으로 보고싶지않은것까지 다보이는면도 있어서, 저는 별로 맘에들지않더군요 #
- 19:42 to #egguser 궁금한게 있습니다. Egg는 Wifi사정거리가 얼마나되나요? 특성상 전파강도를 쎄게하지는 않은듯한데 #
- 22:04 twitoaster – Smart Thread Viewing & RSS Feed – twitoaster.com/about – reply까지 rss되니좋네요. 스레드로 깔끔하게 보이고 추천 #
- 22:24 99 Essential Twitter Tools And Applications – bit.ly/qAU7a – 와 이거 언제다해보냥 ㅋ.ㅋ #
- 22:38 @latte4u 전 지금가면 일찍 칼퇴하네 소리듣습니다. -_-;;; #
- 22:41 Twitter를 지원하는 ToDo Management Tool 은 역시 #RTM 뿐인가요? RTM 간접홍보 ~.~ #
- 23:02 @zombi70 Toodledo 가 Twitter 지원인가보네요.써보진않아서 어떤식으로 지원하는지 아시나요? RTM은 ToDo지정시간이 되면 DM을 쏴주는식인데, 비슷할려나요? #
- 23:10 @nurinamu RTM은 앱의 가격을 받는것이 아니라, 모바일기계의 싱크에 유료라서, 해킹팟으로도 어쩔수가없습니다. 앱은 무료이며,거의모든 모바일기계를 다지원합니다. 개인적으로 Todo Activity가 많고 복잡하다면 추천드립니다. #
- 23:19 @lavisi 와우 4천트윗축하요. 4천트윗이면 국내톱 아닌가요? ^^ #
- 23:57 @latte4u 안그래도 정시 퇴근중입니다 ㅜ.ㅡ ☠. twittercounter.com/pages/country&time_zone=Seoul GPS location: bit.ly/dYIsS #
- 00:14 털민웨이터 LOL #
- 00:30 ~.~乃 "Geeky Clothing – The Twitter T-Shirts | Geeky Gadgets" ( bit.ly/13ZZkt ) #
Automatically shipped by LoudTwitter
iDeck 체험단 리뷰
5월 6, 2009
apple, iphone, ipodtouch blogyam, color, 동영상, 블로그, 블로그얌, flickr, GPS, HP, iDeck, iphone, ipod, ipodtouch, 터치, 팁, 체험단, 카덱, last.fm, nano, touch, wifi, wps 댓글 3개
지난달 말 블로그얌에서 실시한 iDeck (=iPod 전용 카덱) 체험단 리뷰에 당첨되어, 연휴기간동안 iDeck 체험리뷰를 하였습니다.
이러한 리뷰가 처음인지라 ^^; 부족한 점 많더라도 양해를 바랍니다. 제가 사진찍는 스킬이 부족한 관계로 일단은 많이 찍고 보자 싶어 리뷰에 표시되지 않은 사진들은 제 Flickr에 게시되어 있으니, 추가사진은 [이곳]에서 확인하시면 됩니다.
1. 포장 및 구성
체험단 인증샷입니다. ^^
포장박스는 이처럼 생겼습니다. 중앙아래에 조그맣게 표시되어 있는 마크는 정식 아이팟악세서리임을 애플인증받았다는 표식입니다. 그래서인지, 포장박스는 투명프라스틱재질로 깔끔하게 … 만점입니다. ^^
구성물은
1. iDeck 본체
2. 설명서
3. 카트릿지? 4개 ( Basic, Slim, Nano3G용, Nano4G용 )
4. Basic 카트릿지등에 헐거워짐을 방지하기 위한 소프트패드 2장
5. 충전을 위한 자동차용 전원잭
2. 아이팟을 장착해보자.
저희 집에는 아이팟이 3종이 있습니다. 저의 첫 아이팟인 iPod Mini 와 와이프용 iPod Nano 4G Pink, 그리고 iPod Touch 2G … 우선 아이팟나노를 전용 카트리지인 Nano4G용을 꽂고, 자동차로 가져가기 전에 한번 찍어보았습니다.
※ 나노4G용 카트릿지는 나노4G의 아래부분 컨넥터부분이 중앙에 위치한것이 아닌 정면기준 왼쪽에 치우쳐져 있는 관계로 장착시 오른쪽으로 약간 치우친 형태로 장착이 됩니다. 이에 따라 카트리지의 휠을 조작할수 있는 홀 부분도 오른쪽으로 맞게 되어 있습니다.
※ iPod mini 의 경우는 워낙에 오래된 모델인지라;;; 맞는 카트리지가 일단 없더군요. 설명서에도 지원한다고 되어 있지 않는;;; 어흑… 하지만 가장 큰 Basic 카트릿지에서는 될듯도 한데, 해보진 않았습니다. 그리고 솔직히 카트릿지는 그냥 일종의 가드 역할을 할 뿐인지라… 굳이 꽂고자 한다면, 카트릿지 없이 해도 될듯하네요 ^^;
전체적으로, 카세트형 본체와 아이팟장착부분 그리고 중간부분 3부분으로 되어 있는데, 카세트형부분과 중간부분사이는 구부러지는 연질의 프라스틱으로 되어 있어, 길이가 늘어나지는 않지만 차종별 다를수 있는 카세트덱의 형태에 맞출수 있도록 구부러지는 형태로 되어 있는 듯합니다.
일단 여기까지 구성품과 프라스틱의 상태도 싸구려재질이 아닌, 제법 탄탄한 구성입니다. 만족 ^^
카트릿지의 교환은 윗 사진처럼 손으로 위로 조금 압력을 주면서 눌러주시면 빠집니다. 실제로는 양손으로 해야하는데, 한손으로 카메라 들고 찍느라 ~.~ 한번장착하면, 꽤 쎄게 붙잡혀 있는지라, 일부러 빼지 않는한은 빠지지 않을듯 합니다.
3. 자동차에 장착하러 가기
처음에 약간 헤맷었는데, 카세트형 부분만을 넣는 것인줄 알았더니, 그게 아니라, 중간부분의 일부까지도 카세트안으로 넣는 것이더군요.(구부러지는 부분 포함) 이부분은 아마 차종별로 다를수도 있습니다. 제 차의 경우에는 중간부분의 절반정도까지 카세트안으로 삽입이 되면서 찰칵하면서 장착됩니다.
4. iDeck 에 아이팟 장착모습
터치2세대인 경우는 설명서에 의하면, Slim 카트리지를 사용하라고 되어 있습니다. 터치1세대의 경우는 약간 더 두꺼운 관계로 Basic 카트리지에 동봉된 패드를 부착하고 하라고 되어 있던것 같았습니다.
슬림카트릿지를 장착하고 터치2세대를 장착하면 딱 맞습니다. ^^
그리고 중간부분과 터치장착부분은 앞뒤로 사진처럼 움직일수 있습니다. 고정식은 아니고, 약간 뻑뻑하게 잡고 있는 정도…
운전중의 아주 심한 충격 (속도방지턱을 넘는 정도로는 고정이 틀어지진 않습니다.)이 아니면, 움직이지 않을 정도의 뻑뻑함입니다.
저의 구닥다리 네비인 파인드라이브와 함께 한 컷 ~.~
네비보다는 그래도 확실히 화면이 작군요 ^^;
iDeck 에 나노를 장착한 모습
급하게 주차장으로 내려온지라, 나노4G용 카트릿지를 안가지고 와서;;; 터치용인 슬림카트릿지 상태에서 나노를 꽂아보았습니다. 좌우 가드역할의 의미가 없긴하지만 ^^;;; 나름 안떨어지고 튼튼하게 붙어 있습니다.
저희처럼 아이팟 여러대를 번갈아서 장착하실분은 참고하세요.
5. iDeck 과 iPod Touch 의 활용???
먼저 다음맵입니다. 사진이 삑살이 낫네요 ~.~
실제 아이팟 터치의 경우는 GPS가 아닌 WIFI에 의한 WPS 방식인지라, 거기다 차량처럼 이동중인 상태에서는 현위치를 GPS처럼 잡아낼것이라고 생각하시면 큰 오산입니다. 즉 적어도 터치에서는 네비게이션으로서의 활용은 무리입니다.
단 저처럼 저급;;; 네비를 가진 분에게는 다음맵같은 곳에서 제공하는 지리정보를 활용할 수가 있겠습니다. 즉 와이파이가 잡히는 곳에 잠시 주차시켜주시고, 네비가 할수 없는 다음맵의 로드뷰!!! 를 통한 목적지 주변실사 풍경을 미리 보는 것. 이건 참 좋을듯합니다.
다만 안습인것은 위 사진처럼 로드뷰하면, 목을 옆으로 90% 꺽어주셔야한다는점 ~.~
다음맵 다음업그레이드하면 로드맵 세로모드도 지원해주시나요? ~.~ iDeck은 세로로 틀기가 쉽지 않을듯한데;;;
네 다음으로 해본것은 바로 터치의 킬러앱 “스카이프” 입니다. 인터넷 전화지요. 물론 저는 Skype 캐쉬를 전혀 충전하지 않은 관계로 통화는 안되지만 폼만 잡아봤습니다. ~.~ 사진처럼 버튼을 눌러주시면 카스피커로 버튼음이 다 나옵니다. 통화가되면 핸즈프리처럼 소리도 나오겠지요.
이거 상당히 괜찮게 보이네요. 스카이프 캐쉬를 긋고 싶은 급충동이 …
하지만 문제가 있습니다.
위 사진처럼 카덱의 경우는 당연히 출력밖에 없을 것이므로, 마이크 입력을 위하여, 아래에 위치한 이어폰잭에 이어폰을 연결한 채로 iDeck에 장착이 되질 않습니다. ㅠ.ㅠ
따라서 iDeck 상태에서는 기존의 이어폰잭은 활용할 수가 없게 됩니다.
iPhone OS 3.0 이 나오면, 블루투스가 된다는데, 천상 블루투스 모드를 쓰던지 해야할 듯하네요.
혹은 iDeck 의 다음 버전에서는 장착상태에서도 이어폰잭에 대해서 조금 고려해 주시면 어떨까 싶기도 합니다.
아이팟 나노도 안되는거 마찬가지…
그외 날씨, 주식, 메일, 인터넷라디오, Last.fm 등등을 돌려보았습니다. 대략 만족입니다. ^^
특히 자동차에서 메일확인하는 맛이 나름 상큼하네요.
6. 가장 핵심기능이랄수 있는 카 뮤직 라이프 관련
음질 관련해서는 제가 지독한 막귀인 탓도 있지만, 제 차의 사운드가 10년전 차를 산 당시에서 손을 댄것이 없는 순정상태인데다;;; CD도 아닌 카세트의 인터페이스를 그리고 모든 면에서 우수하나, 단하나 음질에서는 좋은 평을 받고 있지 못한 아이팟인 지라… 음질쪽 리뷰는 생략합니다.
솔직히, 고급세단급 차량이 아닌 이상, 운전중 음악듣는데 있어서는 기본적인 소음이 있는 관계로, 음질의 영향… 다른 말로는 음원의 질보다는 출력스피커등에 크게 영향을 받지 않을까 싶습니다.
일단은 예전 사용하던 카덱의 끼익끼익하는 마찰음은 전혀 들리지 않는 것만으로도 대만족입니다. 음질면에 있어서도 적어도 저에게는 전혀 불만이 없습니다. 카세트가 낼수 있는 최대한의 음질은 나오는 것 같습니다. ^^
약간 특이사항이라면, 아래 두장의 사진에 보이듯이 볼륨이 기본적으로 장착시 한가운데 (50%음량)으로 자동설정됩니다…
그런데, 이건 표시뿐이고, 실제로 저것이랑 볼륨은 무관합니다.
무슨 말이냐면, 장착된 상태에서의 볼륨을 터치상에서 조정해도 실제 볼륨은 저것이 아닌, 카세트의 자체 볼륨으로 조절을 해야합니다. 즉, 아이팟 컨넥터를 통해서 출력되는 음원은 볼륨은 고정인듯하더군요.
다만 저 볼륨이 상대적으로 약간 적은 듯하였습니다.
이부분도 차량마다 차이가 있을순 있는데, 제 경우는 위 상태에서 카세트덱을 추출하면 바로 FM라디오로 나오는데, 라디오쪽의 볼륨이 더 큰것으로 보아, 짐작하는 것입니다.
또한, 엔진시동시, 제차의 경우는 전원이 전체 잠시 정전?이 되는데, 이때, 아이팟충전잭이 꽂힌 상태라면, 음악이 잠시멈춤상태가 됩니다.
저희 와이프가 좋아하는 휘성의 인솜니아 뮤직비디오입니다…
네 애석하게도 … 역시 목을 좀 꺽어서 보셔야합니다. =_=
어디선가 보았는데, 강제로 비디오등을 세로모드로 보는것이 있다고 했는데, 한번 검색해봐야겠네요.
찾는데로 리뷰에 추가하도록 하겠습니다.
(추가) 역시 방법이 있네요 ^^; 팁발견한곳 [링크]
결론부터 말하자면, 음악 아이콘을 통해서 보면 세로모드 / 비디오 아이콘을 통해서 보면 가로모드 랍니다.
- 음악 메뉴에 동영상이 나오게 하기 위해서는 두가지 방법이 있습니다.
1) 적절한 스마트재생목록을 만듭니다. ^^
2) 해당 동영상의 등록정보 – 옵션탭 – 미디어종류(M) 에서 “뮤직비디오” 로 바꿔줍니다. 그러면 스마트재생목록에 뮤직비디오가 없는 경우 생성되면서 음악아이콘으로 볼수 있습니다.
※ 이렇게 해두어도 비디오아이콘으로로 들어가면 역시 풀스크린 가로모드로 동작합니다. ^.^
7. 총평
- 장점
깔끔함…
정품스러움…
아이팟 기종별 카트리지 제공하는 섬세함…
충전이 된다! 항상 배터리부족에 시달리는 터치유저에게는 환상적인 ^^
구형자동차(저처럼 CDP도 없는;;;) 소유주에게는 최상의 선택
- 아쉬운점
가로모드에 대한 고려 및 이슈
장착상태에서의 이어폰잭 이슈 < 블루투스로 해결가능?
§ 운전중에는 안전을 위하여 조작을 삼가하여 주세요 ~.~
이것으로 부족한 리뷰를 마칩니다. 추가내용은 내용수정으로 지속적으로 계속 추가하도록 하겠습니다. 감사합니다.
Daily Tweets
4월 16, 2009
private AP, color, daily, iCal, iphone, 트위터, 팁, loudtwitter, nambu, OP, twitter, xcode 댓글 남기기
- 08:16 iPhone OS 3.0 Beta3 tr.im/iPU9 Xcode가 업데이트 되나보네요 궁금 ^.^ #
- 09:13 @boogab @hur RTM 활용 팁 알려주십시오. // tinyurl.com/5ba5jl 이거 참고하세요. 저도 이글보고 RTM pro로 결재해서 사용중이랍니다. Things랑은 수준이 달라요 ^^ #
- 09:15 @makeanymove Evernote가 모든 면에서 다 좋은데, 치명적인 문제가 있어서 스프링노트를 다시 활용하기로 했었는데, (아주 많은 양을 넣으면, 맘대로 잘라버림;;;) 이제 고쳐졌나모르겠네요 #
- 16:42 역시 이시간 즈음이 되면, 근무효율이 다들 떨어지나봐요. 트위터 포스팅수가 장난이 아님… 읽다가 포기 -ㅠ- #
- 16:51 RT @mushman1970: @kwwoo 저는 아직도 오프라인입니다.ㅠㅠ 어떻게 이런 일이 발생할까요? 구글이 저를 미워하는 걸까요? // 저는 모두다 온라인데 ~.~ #
- 16:54 아직 맥을 쓰기 시작한지 얼마 안되었지만 Nambu : www.nambu.com : 가 좋았습니다. 장점은 Search를 통한 분류가 막강, 그리고 공짜, 단점은 베타라서인지 좀 불안정? #
- 17:47 RT @Sanghyuk: I cannot write or read Korean characters with @TweetDeck
// Setting – Color/Font – International Font Check # - 18:07 RT @boreum @hannal playtalk과 twitter의 큰 차이는 무엇이라고 생각하십니까~? 조심스레 여쭤봅니다^^;; // OPEN API 트위터는 막강 서드파티가 ㅎㄷㄷ 하죠 #
- 22:43 RT @kwwoo: Coverity가 많은 발전이 있었네요. ^^; www.coverity.com/ | build analysis 라 우리도 최근 auto build구축하던데, 빌드타임관리를 해주는건가? 최신 prevent는 어떻던? #
- 23:32 Yahoo oneConnect 도 괜춘한데
인기가
없어 •.• #
Automatically shipped by LoudTwitter
구글토크 와 봇 : Googletalk & Bot
2월 26, 2009
private bot, buddy, color, 덧글, 버디, 봇, 구글토크, 블로그, gmail, google, google talk, igni, igni.pe.kr, 트랙백, 트위터, 팁, MS, rss/response 댓글 9개
개인적으로 아주 예전부터 인스턴트 메신저(IM)를 사용해왔었습니다. 요즘은 제한이 없어졌지만, 한때는 MSN 250명 친구제한을 다 채웠었으니 말이죠. ^^ 요즘은 방화벽으로 막힌 제 주 근무여건상 “구글토크” 이것이 주 IM이 되었습니다.
심플하면서도 꼭 필요한 기능만 있는 ( 하지만 그룹챗이 좀 아쉽습니다. ) 추천 IM 이지요. 하지만 대부분 구글토크를 잘 안쓰는 분들의 이야기를 들어보면, 아주 간단한 이유입니다.
접속해도 버디(친구)가 없다는 거죠…
IM은 특성상 버디가 없으면 무용지물이지요.
그래서 대안이나마… 썰넝한 구글토크 버디리스트를 유용하게 채워줄 이들을 소개하고자 합니다. ( 물론 저는 구글토크 버디리스트가 화면2페이지를 넘어가는 쿨럭;;; )
<구글제공 번역봇>
en2ko.dict@bot.talk.google.com
이넘들 아주 유용합니다. 이름에서 보이다 시피 ^^;
간단한 번역이나 사전을 전 이걸 애용합니다. 번역품질은 뭐 어짜피 기계번역이니 그러러니 하시면 되지만, 구글번역의 또다른 인터페이스일 뿐이므로 나름 쓸만합니다. 중간에 하나가 Naming Rule이 조금 다르지요. 저넘은 “사전” 입니다.
사용방법은 단순히 저 이메일 주소를 구글토크에서 Add 해주시면 됩니다. 번역하고 싶은 단어를 챗창에 써주시면 답변으로 응답합니다.
※ 팁 !!!
번역이 필요하다는 뜻은 아무래도 해당언어에 익숙하지 않다는 뜻이지요. 실시간 채팅에서는 번역사이트 돌리랴, 사전찾으랴… 쉽지않습니다.
구글토크 클라에서는 그룹챗이 되지 않지만 (현재 제가 아는 한) Gmail 의 구글토크 위젯에서는 그룹챗이 됩니다.
서로 다른 언어를 사용하는 두 사람간의 대화에 해당언어의 봇을 참여시켜 3자대화를 하면, 실시간 통역사를 데리고 채팅이 가능합니다. ^^
<Remember the Milk>
제가 애용하는 ToDo 관리 웹서비스입니다. RTM 이라고 줄여서 호칭됩니다. RTM Alert 를 알려주는 봇입니다. 해당설정은 RTM 쪽에서 가능합니다. 귀여운 송아지 아이콘~
<Yammer>
Yammer (기업형/폐쇄형 트위터) 의 내용을 구글토크로 알려줍니다. 설정은 Yammer 쪽에서 가능
@bot.im
이거 강추천입니다. 자신이 봇을 만들수 있습니다. !!.!!
너무 이제 봇이랑 놀다 지쳐 직접 봇을 만드는 경지에;;;
아주 간단한 사용사례를 보자면,
http://igni.pe.kr/rss/response < 본 블로그의 최근댓글/트랙백 rss 주소입니다. 이걸 제경우는 igni???????@bot.im 이란 이름을 부여해주었지요.
그리고 저주소를 구글토크에 친추하시면, 제 블로그의 덧글/트랙백을 구글토크를 통해서 보고 받을수 있습니다.
위에 있는 imified 와 비슷합니다. 예전엔 이걸 사용했었는데, 잘 동작안하더라구요. 아직도 되는지는 미확인;;;
잘 아시는 유명 SNS중 하나인 FriendFeed 지요.
프렌드피드 의 Account 메뉴 한가운데쯤 보시면 익숙한 아이콘이 하나 보이실 겁니다.
IM settings – Send an IM when there is activity on:
를 적절히 설정해주시면,
라는 친구로부터 FF관련 포스팅을 보고 받을 수 있습니다.
구글토크 버디리스트가 썰넝하신 분들은 … 봇들과 춤을 …
myLG070 WiFi Pirate
2월 5, 2009
private AP, ipod, 터치, 팁, 아이팟터치, 유료, myLG070, wifi 댓글 3개
터치를 가지고 길을 다니다보면,,, 서울은 뭐 거의 AP홍수속에 살고 계시다지만, 제가 사는 수원은 그렇지 못합니다. 길거리 다니다보면 터치 배터리의 2/3를 와이파이 찾느라 써버리는것 같아요… 그때 유용한 팁입니다.
myLG070 의 원리가 WIFI AP 지요.
하지만 WEP로 보안이 걸려있습니다.
물론 IT Geek 하신 분들은 암호를 알아서 바꾸셨겠지만, 거의 대부분 (85%이상인듯…) 사람들은 기본세팅 그대로 놓고 쓰십니다…
네 기본암호를 쳐서 통과되면 재수고, 아니면 말고 -ㅅ-;;;
설정방법입니다. AP 이름조차도 안바꾸고들 쓰시는 경우가 대부분이므로, 한번 설정해두고 돌아다니시면 현재보다 훨씬 높은 확율로 터치가 인터넷에 접속되실 겁니다.
1. 설정 – WI-FI – 기타 를 선택
2. 이름에 “myLG070″을 입력
3. 보안에 “WEP”를 선택
4. 암호에 “123456789a” 를 입력하고 Join 을 선택
네 됬습니다. 와이파이 바가 올라가면 쓰시면 됩니다. ^^
떳떳한 방법은 아니지만 FON 정신이라는 것도 있지요. 악의적인 목적으로 쓰는게 아니라면야 뭐… 터치정도가 트래픽먹어봐야 얼마나 먹을거라고… 공유정신!
그나저나 WiFi Finder 앱 좋은거 좀 있으시면 추천해주세요. 거의다 유료인듯해서 흑흑
WiFinder 를 애용하기는 하는데… 뭐 더 좋은건 없나여?
myLG070을 현재 사용하고 계신 분들은 이글을 보시면 적절히 보안관리에 유념해주시기 바랍니다 ^^;
영어해석이 안될 때 이렇게 하자
11월 7, 2008
분류되지 않음 bot, car, color, 가치, family, 팁, 영어해석, MS, OP 댓글 남기기
모르는 것들은 파란색으로 표시 했습니다.
자주 보면서 익혀야 겠네요^^
==========================================
단어를 다 알고 있는데 해석이 안될 때가 있죠? 그건 영문법 때문이랍니다…
접속사나 분사구문, 부사 등의 해석이 자연스럽지 못할 때 그냥 중요한 건 외워두세요! ^____^
♣ 여러 의미를 갖는 접속사
* as : -할 때, -때문에, -처럼(-한 대로), -할수록 ※전치사 : -로서
* if : 만약 -라면, -인지 아닌지, 비록 -할지라도
* since : -이래로, -때문에
* while : -하는 동안, -하는 반면에
♣ 상관 접속사
* both A and B A B 둘 다
* either A or B A B 둘중 하나
* neither A nor B A B 둘다 – 아니다
* not A but B A가 아니라 B다
* not only A but (also) B A 뿐만아니라 B도
(= B as well as A)
* no sooner ∼ than … ∼ 하자마자 … 하다
hardly when
scarcely before
♣ 기타 주요 접속사
* unless = if ∼ not : 만약 ∼ 하지 않는다면
* until = till ∼ : ∼까지
* as soon as ∼ : ∼하자마자
* so ∼ that … : 너무 ∼ 해서 … 하다
* so that S may ∼ : ∼ 하기 위해서
* though = although = even if [though] ∼ : 비록 ∼일지라도
* as if = as though ∼ : 마치 ∼처럼
* not ∼ until … : … 까지는 ∼ 않다, … 하고나서야 ∼ 하다
* as long[far] as = so long[far] as ∼ : ∼ 하는한 * lest S should ∼ : ∼ 하지 않기 위해서
* now that = ,for : 왜냐하면
♣ 원형 부정사의 관용적 표현
* had better + 원형 : – 하는게 더 낫다
* can’t but + 원형 : – 하지 않을 수 없다 (=can’t help ∼ing)
* do nothing but + 원형 : 단지 – 하기만 하다
♣ 중요 부정사 구문
* too ∼ to – : 너무 ∼ 해서 -할 수 없다 (= so ∼ that S can’t -)
* ⓐ enough to ∼ : ∼ 할 만큼 충분히 ⓐ 하다 (= so ⓐ that S can-)
♣ 독립 부정사 (숙어처럼 암기)
* so to speak : 말하자면, 소위
* strange to say : 이상한 이야기지만
* to begin with : 우선, 먼저
* to be frank with you : 솔직히 말하면
* to be sure : 확실히
* to make matters worse : 설상가상으로
* to do one justice : one을 공평히 평가하면
* to say nothing of : – 은 말할 것도 없이
(=not to speak of, not to mention, let alone)
♣ 의미상 차이
* stop + ∼ing : ∼ 하는 것을 멈추다
to ∼ : ∼ 하기 위해 멈추다 (부사의 목적)
* try + ∼ing : 시험삼아 ∼ 해보다
to ∼ : ∼ 하려고 애쓰다
* remember + ∼ing : <과거> ∼ 한 것을 기억하다(잊다)
(forget) to ∼ : <미래> ∼ 할 것을 기억하다(잊다)
♣ 동명사의 관용적 표현 (숙어처럼 암기)
* go -ing : – 하러 가다
* be busy -ing : – 하느라 바쁘다
* on -ing : – 하자 마자
* feel like -ing : – 하고 싶다
* be worth -ing : -할 가치가 있다
* can’t help -ing : – 하지 않을 수 없다
* come near -ing : 거의 – 할 뻔하다
* It is no use -ing : – 해봐야 소용없다
* There is no -ing : – 하는 것은 불가능하다
* of one’s own -ing : 직접(손수) – 한
* It goes without saying that -: -은 두말할 필요가 없다(너무 당연)
* make a point of -ing : – 을 규칙으로 삼다
* be on the point of -ing : 막 – 하려던 참이다
* cannot[never] … without ∼ing : …할 때마다 ∼하다
* look forward to -ing : – 을 학수고대하다
* be used to -ing : – 하는데 익숙하다
* object to -ing : – 하는 것을 반대하다
* be opposed to -ing : – 하는 것을 반대하다
* with a view to -ing : – 할 목적으로
* What do you say to -ing? : -하는게 어때?
♣ 비인칭 독립 분사구문
* generally speaking = if we speak generally 일반적으로 말하면
* frankly speaking 솔직히 말하면(말해서)
* strictly speaking 엄격히 말하면(말해서)
* judging from ∼ ∼로 판단하면(판단컨대)
* considering ∼ ∼을 고려하면
♣ 부대 상황의 with
☞ with + 목적어 + 분사 (해석: 목적어를 분사한채로)
with his arms folded (팔장을 낀채로)
with little wind blowing (바람이 거의 불지않는)
Don’t speak with your mouth full.
♣ 추측의 조동사 (3개)
추측의 조동사 + 원형 (현재에 대한 추측)
(may,must,cannot) have + p.p. (과거에 대한 추측)
* may 원형 : -일지 모른다 = It is possible that S + V현재 ∼
* may have + p.p. : -이었을지 모른다 = It is possible that S + V과거∼
* must 원형 : -임에 틀림없다 = It is certain that S + V현재 ∼
* must have + p.p. : -이었음에 틀림없다 = It is certain that S + V과거∼
* cannot 원형 : -일리가 없다 = It is impossible that S + V현재 ∼
* cannot have + p.p. :-이었을리가 없다 = It is impossible that S + V과거∼
♣ 조동사의 관용 표현 (숙어처럼 암기)
* would ∼ : ∼ 하곤 했다 (불규칙)
* used to ∼ : ∼ 하곤 했다 (규칙)
* would like to ∼ : ∼ 하고 싶다
* would rather A than B : B 하느니 차라리 A 하는게 더 낫다
* had better ∼ : ∼ 하는게 더 낫다
* may[might] as well ∼ : ∼ 하는게 더 낫다
* may well ∼ : ∼ 하는게 당연하다
* ought to ∼ = should ∼ : ∼ 해야한다
* lest S should ∼ : ∼ 하지 않기 위해서
* cannot ∼ too — : 아무리 — 해도 지나치지 않다
* should have p.p. : ∼ 했었어야 했는데…(못했다)
* should not have p.p. : ∼ 하지 말았어야 했는데…(했다)
* need not have p.p. : ∼ 할 필요가 없었는데…(괜히 했다)
※ 요구(demand), 주장(insist), + that + S + (should) + 원형
제안(suggest), 명령(order), (-해야한다)
동의, 결정, 충고, 소망의 V
♣ 해석에 주의할 수동태
be told (듣다), be given (받다), be asked (질문 받다)
♣ If 대용 어구
* Suppose(Supposing), Provided(Providing), In case, On condition
* Otherwise (만약 그렇지 않으면), Unless (= If ∼ not)
♣ If 의 생략 ( V + S 로 도치)
Were I in your place, I would not do so. (= If I were)
Had he been more careful, he would not have lost his purse.
♣ 기타 가정법 구문
* I wish + 가정법 과거(과거완료) ——— ∼ 라면 좋을텐데
* as if (as though) + 가정법 과거(과거완료) – 마치 ∼ 처럼
* Without (=But for) ∼ —————- 만약 ∼ 이 없(었)다면
= If it were not for ∼
= If it had not been for ∼
♣ 주의할 부사
* hardly : 거의 ∼ 않다 (= rarely, barely, scarcely, seldom)
* lately : 최근에
* nearly : 거의
* highly = deeply : 매우
* derectly : 즉시
* necessarily : 반드시
* frequently : 자주
* exactly : 정확하게
* similarly : 유사하게
* consequently = eventually = ultimately : 결과적으로
* accordingly : 따라서
♣ 라틴어에서 온 비교급
* senior to : -보다 손위의 * junior to : -보다 손아래의
* major to : -보다 주요한, 더 큰 * minor to : -보다 사소한, 더 작은
* superior to : -보다 더 우수한 * inferior to : -보다 더 열등한
ex> He is older than I = He is senior to me
(전치사 + O)
※ prefer A to B : B 보다 A를 더 좋아하다
♣ 비교 구문 정리 ( 꼭 암기)
* no more = not ∼ any more : 더이상 ∼ 않다
* no longer = not ∼ any longer : 더이상 ∼ 않다
* not a few = quite a few = no few = many : 많은
* not a little[bit] = quite a little = no little = much : 많은
* at most = not more than : 많아야, 기껏해야
* at least = not less than : 적어도
*as many : 동수의
* as much : 동량의
* not so much A as B = not A so much as B : A 라기 보다는 차라리 B
* not so much as ∼ : ∼ 조차 못하다
* no[little] better than ∼ : ∼보다 나을게 없는, ∼나 마찬가지
* no more than : 단지 (= only = merely)
* no more ∼ than — : ∼ 가 아닌 것은 — 가 아닌 것과 같다
* no sooner ∼ than — : ∼ 하자마자 — 하다
* know better than to ∼ : ∼할 만큼 어리석지 않다
♣ 관계대명사 what 의 관용 표현
* what S be S의 인격, 상태
* what S have S의 재산
* what we(you,they) call = what is called 소위, 이른바
* what is better[worse,more] 금상첨화로[설상가상으로, 더욱이]
* what with A and (what with) B 한편 A 때문에 또 한편 B 때문에
* what by A and (what by) B 한편 A 에 의해 또 한편 B 에 의해서
* A is to B what C is to D A와 B의 관계는 C와 D의 관계와 같다.
이 글은 스프링노트에서 작성되었습니다.
C Code Optimize
10월 18, 2007
Computing AP, color, google, HP, 팁, MS, OP, profile, Software Engineering, spec, test 댓글 남기기
|
원본 from : http://www.codeproject.com/cpp/C___Code_Optimization.asp 번역 from : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/C/Documents/COptimization 1 소개얼마전에 모바일기기에서 일정수준의 품질을 유지하면서 실행되는 JPEG라이브러리를 만드는 프로젝트를 진행한적이 있었다. 이 프로젝트를 진행하면서, 여러가지 방법으로 프로그램을 더 빨리 만들 수 있다는 사실을 경험적으로 알게 되었다. 이 문서는 C로된 코드를 속도와 메모리 양측모두에서 최적화하기 위한 경험적인 정보들을 포함하고 있다.
물론 여러분은 C 코드를 최적화 하는 방법에 대한 참고문서를 어렵지 않게 획득할 수 있을 것이다. 그러나 대부분의 문서가 팁수준에서 문제에 접근할 뿐으로, 컴파일러나 기계수준에서 어떻게 프로그래밍을 해야 하는지에 대한 정보는 담고 있지 않다.
보통 프로그램의 속도를 높이게 되면 코드의 크기가 늘어나게 된다. 코드의 크기가 늘어나면 프로그램이 복잡해지고, 읽고 이해하기 어려워진다. 메모리 자원이 넉넉한 개인PC혹은 서버 컴퓨터라면 문제가 되지 않겠지만 PDA와 같은 제한된 메모리 자원을 가진 기기일 경우 심각한 문제가 될 수 있다. 1%의 속도향상을 위해서 코드의 크기가 10%만큼 늘어난다면 분명 문제가 될 것이다. 이런 이유로 속도와 코드크기 모두에 대한 최적화를 수행하기로 결정을 했다.
2 선언내가 진행하는 프로젝트가 ARM 플랫폼에서 진행된 관계로, ARM 최적화와 관련된 팁들이 필요했었다. 나는 인터넷을 통해서 ARM 최적화와 관련된 많은 문서를 검색하고 이중 유용한 것들 중심으로 수집해서 테스트를 했었다. 그러나 대부분의 문서들이 나에게는 도움이 되지 않았음을 고백한다. 이러한 실수를 줄이기 위해서 유용하고 효과적인 몇개의 팁만을 모으기로 결정했다.
3 어디에 필요한가토론의 주제를 명확히 하고 넘어가자. 컴퓨터 프로그램을 최적화하기 위한 가장 중요한 것은 프로그램을 이루는 각각의 모듈중 어느 부분이 느리게 작동하거나, 큰 메모리를 소비하는지를 찾아내는 것이다. 이들 각각의 부분을 최적화하면 프로그램이 전체적으로 빨라질 것이기 때문이다. 이러한 모듈단위의 최적화는 최적화를 위한 부분을 비교적 쉽게 찾고, 쉽게 해결할 수 있다는 장점을 가진다.
The optimizations should be done on those parts of the program that are run the most, especially those methods which are called repeatedly by various inner loops that the program can have.
일반적으로 경험이 풍부한 프로그래머들은 아주 쉽게 프로그램이 요구하는 최적화될 필요가 있는 핵심을 쉽게 찾아낼 수 있을 것이다. 가장 좋은 최적화 방법은 경험많은 프로그래머를 고용하는 것이다. 그러나 경험많은 프로그래머는 매우 비싸며, 경험이 많다고 해도 더 좋은 결과를 위해서는 최적화를 위한 좋은 툴을 사용할 필요가 있다. Visual C++ 과 같은 통합 개발환경은 함수단위로 프로그램의 소비시간을 측정할 수 있는 profiler를 제공한다. 리눅스의 경우에는 gprof와 같은 profiler를 사용할 수 있다. 혹은 Intel Vtune와 같은 프로그램을 사용할 수 있는데, 이들 프로그램을 사용하면 프로그램의 어느부분이 가장 많은 시간을 소비하는지를 확인할 수 있다. 개인적인 경험으로 루프 혹은 third party 라이브러리 메서드를 호출하는 영역이 프로그램을 느리게 하는 경우가 많았다.
4 데이터 연산4.1 정수우리가 사용할 값이 음수가 아니라면 int 형대신에 unsigned int형을 사용해야 한다. 어떤 프로세스들은 unsigned integer의 연산이 signed 연산보다 매우 빠르다. 또한 나누기/나눗셈 작업의 경우에도 음수가 필요 없다면 unsigned 를 명시해주는게 좋다.
루프에 사용될 변수라고 한다면, 다음과 같이 깔끔하고 효율적으로 선언할 수 있을 것이다.
register unsigned int variable_name; 기억해야할 또다른 점은 floating point 연산은 매우 느리다라는 점이다. floating point 데이터 타입은 자바와 함께 하는 컴퓨터과학문 서를 참고하기 바란다. 척 봐도 floating point 숫자는 다루기가 꽤나 복잡하다는 것을 알 수 있을 것이다. 만약 여러분이 소숫점 2자리까지의 정확도를 유지하는 회계프로그램을 만든다면, 모든 값에 x100을해서 int 형으로 바꾼다음 연산을 하도록 한다. 가능하면 외부의 수학라이브러리를 사용하지 않도록 한다. FPUs와 같은 라이브러리는 매우 느리다.
4.2 나눗셈 그리고 나머지표준적인 프로세서에서의 분모와 분자의 32bit 나눗셈은 20~140의 실행 사이클을 가지고 있다. 나눗셈을 이용하면 다음과 같은 시간이 소비된다.
Time (numerator / denominator) = C0 + C1* log2 (numerator / denominator) = C0 + C1 * (log2 (numerator) - log2 (denominator)). 널리 쓰이는 버젼은 약 20+4.3N의 사이클을 보여준다. ARM 뿐만 아니라 프로세서를 막론하고 이런 연산은 피하는게 바람직하다. 나눗셈연산은 가능하다면 곱셈으로 대체해서 사용하기 바란다. 예를들어 (a/b) > c 는 b * c가 integer 범위안이라는 것을 안다면 a > (c * b)로 다시 쓰일 수 있다.
4.3 Combining division and remainder나눗셈 (x/y) 그리고 나머지(x%y)둘다 종종 필요한 케이스이다
그러한 케이스에 비추어보아 나눗셈펑션을 컴파일러에 결합하는것이좋다 왜냐하면 나눗셈펑션은 항상 나눈값과 나머지를 리턴하기 필요하다 만약둘다 필요하다면 우리는 이와같은 예제를 같이 쓸수있어야한다 int func_div_and_mod (int a, int b) {
return (a / b) + (a % b);
}
4.4 2의 배수로 나누기나누기를 할 때 2의 배수를 분자로 함으로써, 코드를 더 효율적으로 만들 수 있다. 이경우에 컴파일러는 나누기 연산대신에 shift 연산을 할 수 있기 때문이다. shift 연산은 가장빠른 연산중의 하나다. 그러므로 가능하면 2의 배수로 나눌 수 있도록 스케일을 조절할 필요가 있다. (예를 들어 66으로 나누어야 한다면 64로 나눌 수 있도록 스케일을 조절하라).
typedef unsigned int uint;
uint div32u (uint a) {
return a / 32;
}
int div32s (int a){
return a / 32;
}
이경우에도 signed 값보다는 unsigned 로 나누어질 수 있도록 함수를 조절할 필요가 있다. signed의 경우에는 더많은 시간이 소비된다. 왜냐하면 오른쪽으로 쉬프트 시킬경우 가장왼쪽의 비트를 0으로 만들어주는 연산이 한번더 들어가기 때문이다. #include <stdio.h> int main() { unsigned int a = 1024; unsigned b, c; b = a/32; // --- 1 c = a >> 5; // --- 2 } 1과 2는 동일한 결과를 보여주며, 컴파일러내에서도 동일하게 shift 처리된다. 다음은 intel 프로세서에서 gcc로 컴파일된 어셈블리어중 1과 2에 해당되는 부분의 코드다. movl $1024, -12(%ebp) movl -12(%ebp), %eax shrl $5, %eax # b = a / 32 movl %eax, -8(%ebp) movl -12(%ebp), %eax shrl $5, %eax # c = a >> 5 4.5 Binary Breakdown여러개의 조건을 검사하다 보면, if와 else if를 여러개 사용하는 경우가 생긴다.
if(a==1) {
} else if(a==2) {
} else if(a==3) {
} else if(a==4) {
} else if(a==5) {
} else if(a==6) {
} else if(a==7) {
} else if(a==8)
{
}
이경우 2개로 나누어서 조건 검사를 하도록 한다. if(a<=4) {
if(a==1) {
} else if(a==2) {
} else if(a==3) {
} else if(a==4) {
}
}
else
{
if(a==5) {
} else if(a==6) {
} else if(a==7) {
} else if(a==8) {
}
}
이렇게 하면 최악의 경우 비교횟수가 절반이 됨을 알 수 있다. 필요에 따라서는 아래와 같이 3중루프 코드로 만들 수도 있다. 좀더 빠르게 동작하긴 하겠지만 코드가 보기 어려워진다는 단점이 생긴다. if(a<=4)
{
if(a<=2)
{
if(a==1)
{
/* a is 1 */
}
else
{
/* a must be 2 */
}
}
else
{
if(a==3)
{
/* a is 3 */
}
else
{
/* a must be 4 */
}
}
}
else
{
if(a<=6)
{
if(a==5)
{
/* a is 5 */
}
else
{
/* a must be 6 */
}
}
else
{
if(a==7)
{
/* a is 7 */
}
else
{
/* a must be 8 */
}
}
}
4.6 배열을 이용한 index 생성특정값에 대응되는 문자를 변수에 입력하는 코드를 만든다면 다음과 같이 switch 문을 사용할 것이다.
switch ( queue ) {
case 0 : letter = 'W';
break;
case 1 : letter = 'S';
break;
case 2 : letter = 'U';
break;
}
혹은 if else 문을 사용할 수도 있을 것이다. if ( queue == 0 ) letter = 'W'; else if ( queue == 1 ) letter = 'S'; else letter = 'U'; 다음과 같이 문자의 배열을 인덱스화 하면 더 빠른 접근이 가능하다. – 사용하기도 쉽다 -
static char *classes="WSU"; letter = classes[queue]; 4.7 나머지 연산자의 대체우리는 나눗셈의 나머지를 알기 위해서 나머지 연산자 %를 사용한다. 이경우 % 연산대신 판단문을 사용해서 시간을 줄일 수 있다. 아래의 두 코드를 비교해 보기 바란다.
uint modulo_func1 (uint count)
{
return (++count % 60);
}
uint modulo_func2 (uint count)
{
if (++count >= 60)
count = 0;
return (count);
}
if 문은 나머지 연산자보다 빠른코드를 생성한다. 주의 할점은 2번째 함수의 경우 0에서 60사이의 값에 대해서만 제대로 측정이 된다는 점이다. 4.8 Using Aliases아래의 코드를 보기 바란다.
void func1( int *data ) { int i; for(i=0; i<10; i++) { anyfunc( *data, i); } } *data 가 결코 변하지 않는다고 하더라도, anyfunc 함수를 호출하는 컴파일러는 이걸 알 수가 없다. 그래서 변수가 사용될 때마다 메모리로 부터 다시 읽어들이게 된다. 이 문제는 지역변수를 하나더 둠으로써 해결할 수 있다.
void func1( int *data ) { int i; int localdata; localdata = *data; for(i=0; i<10; i++) { anyfunc ( localdata, i); } } 5 데이터 타입C 컴파일러는 char, short, int, long, float, double 등의 다양한 원시 데이터 타입을 제공한다. 필요한 영역에 필요한 수준의 데이터 타입을 사용하도록 하자.
5.1 전역 변수전역 변수는 절대 레지스터에 할당할 수 없다. 포인터를 사용하여 간접적으로 할당하거나 함수호출을 이용해서 전역변수를 변환할 수 있다.
따라서 컴파일러는 전역변수의 값을 레지스터에 올려서 캐쉬할 수 없게 되고 때문에 글로벌 변수를 이용할 때마다 다시 읽어들이는 오버로드가 생기게 된다. 그러므로 가능하면 글로벌 변수를 직접 호출하는 대신에, 로컬변수를 이용해서 필요한 연산을 하고 그 결과를 글로별 변수에 할당하는 방법을 사용해야 한다.
int f(void); int g(void); int h(void); int errs; void test1(void) { errs += f(); errs += g(); errs += h(); } void test2(void) { int localerrs = errs; localerrs += f(); localerrs += g(); localerrs += h(); errs = localerrs; } test1은 매번 전역변수를 로드해야 한다. 반면 test2의 경우 레지스터에 등록된 localerrs에 값을 저장하고 마지막에 한번만 전역변수에 접근함을 알 수 있다. 5.2 지역변수가능하면 지역변수로 char 이나 short를 사용하지 않도록 한다. char와 short가 사용될 경우 컴파일러는 값을 저장하기 위해서 8bit 혹은 16bit를 할당한 후, 남는 크기를 줄이는 작업을 하게 된다. 이는 24bit, 16bit 만큼을 shift 시키는 연산을 하게 됨을 의미한다. 그러므로 입력되는 데이터가 8 혹은 16 비트라고 하더라도, 32bit로 연산을 하도록 함수를 만들 필요가 있다.
int wordinc (int a)
{
return a + 1;
}
short shortinc (short a)
{
return a + 1;
}
char charinc (char a)
{
return a + 1;
}
3번째 코드가 가장 빠른결과를 보여줄 것이라고 생각할지도 모르지만, 1번째 코드가 가장 빠르게 작동한다. 5.3 포인터구조체를 그대로 넘길경우 구조체의 모든 값이 스택에 올라가기 때문에 느리게 작동한다. 그래서 구조체의 포인터를 넘기는 경우가 많다. 나는 수 kbyte의 구조체를 넘기는 프로그램을 본적이 있다. 이런 경우 포인터를 쓰도록 하자.
포인터를 통해서 구조체를 넘길때, 구조체의 멤버를 수정할일이 없다면 상수로 선언해서 넘기도록 하자.
void print_data_of_a_structure ( const Thestruct *data_pointer)
{
...printf contents of the structure...
}
이렇게 하면 컴파일러는 인자로 넘어온 포인터가 수정할 수 없는 외부 구조체라는 것을 알게 된다. 이렇게 되면, 값이 사용될 때마다 다시 읽혀질 필요가 없어지게 된다. 또한 이러한 코드는 실수로 구조체 멤버의 변수를 바꾸는 것과 같은 실수를 하지 않도록 해준다. 5.4 Pointer chains구조체내의 정보에 접근하려다 보면 포인터의 chain을 사용해야 할 때가 있다. 다음과 같은 경우다.
typedef struct { int x, y, z; } Point3;
typedef struct { Point3 *pos, *direction; } Object;
void InitPos1(Object *p)
{
p->pos->x = 0;
p->pos->y = 0;
p->pos->z = 0;
}
이럴 경우 p->pos 를 다른 포인터에 할당해서 접근하도록 하자. 이렇게 하면 p->pos 가 캐쉬되므로 좀더 효율적으로 작동하게 된다. void InitPos2(Object *p) { Point3 *pos = p->pos; pos->x = 0; pos->y = 0; pos->z = 0; } 코드가 좀더 보기 좋아진다는 효과도 노릴 수 있다. 5.5 Switch 대신 lookup table 를 사용하라switch는 다음과 같은 경우 사용한다.
예를 들어서 조건값을 입력받아서 거기에 맞는 문자열을 리턴하는 아래와 같은 코드가 있다고 가정해보자. char * Condition_String1(int condition) { switch(condition) { case 0: return "EQ"; case 1: return "NE"; case 2: return "CS"; case 3: return "CC"; case 4: return "MI"; case 5: return "PL"; case 6: return "VS"; case 7: return "VC"; case 8: return "HI"; case 9: return "LS"; case 10: return "GE"; case 11: return "LT"; case 12: return "GT"; case 13: return "LE"; case 14: return ""; default: return 0; } } 위의 코드는 아래와 같이 좀 더 효율적인 코드로 만들 수 있다. 덤으로 보기에도 편하다. char * Condition_String2(int condition) { if ((unsigned) condition >= 15) return 0; return "EQNECSCCMIPLVSVCHILSGELTGTLE" + 3 * condition; } 첫번째 루틴은 240byte가 필요하지만 두번째 루틴은 72바이트만 소모되고 있다. 6 루프루프는 모든 프로그램에서 사용되는데, 많은 경우 루프에서 과다한 시간을 소비하게 된다. 여러번 실행되는 루프틔 특성상 조그마한 시간의 낭비가 게속 누적되기 때문이다.
6.1 Loop termination루프를 종료시키기 위한 검사는 항상 count-down-to-zero 방식을 사용하도록 한다. 이것은 좀더 적은 시간을 소비한다. 아래의 두개의 예제는 동일한 일을한다. 다른점이 있다면 첫번째 코드는 루프를 증가시킨다는 점이고 두번째는 루프를 감소시킨다는 점이다.
int fact1_func (int n)
{
int i, fact = 1;
for (i = 1; i <= n; i++)
fact *= i;
return (fact);
}
int fact2_func(int n)
{
int i, fact = 1;
for (i = n; i != 0; i--)
fact *= i;
return (fact);
}
6.2 더욱 빠른 for 문다음은 0부터 10까지의 숫자를 연산하기 위해서 for 문을 사용한 일반적인 예다.
for (i = 0; i < 10; i++) {...}
i는 0,1,2,3,4,5,6,7,8,9 로 1씩 증가할 것이다. 가능하면 아래와 같이 숫자를 감소시키는 방향으로 for 문을 사용하라.
for (i = 10; i--;) {...}
첫번재 코드보다 두번째 코드가 더 빠른 수행능력을 보여준다. 두번째 코드는 i가 0이 아니면 i를 감소시키고 다음 코드를 진행하라의 의미인데, 조건 검사의 경우 0인지 아닌지를 비교하는데 더 작은 시간이 소비되기 때문이다. 그러므로 두번째 코드는 아래와 같이 재작성할 수 있다. 두번째 예제코드 보다는 아래의 코드가 더 보기 쉬우므로, 아래의 코드를 사용하는게 가독성 측면에서 유리할 것이다.
for (i = 10; i ; i--) { }
혹은
for (i = 10; i!=0; i--) { }
이들은 모두 동일한 수행능력을 보여준다. 6.3 Loop jamming6.4 함수 루프함수는 호출되기 위한 분명한 오버헤드가 존재한다. 실행해야될 함수가 있는 포인터만 변경하는게 아닌, 값들을 stack에 push하는 것과 새로운 변수의 할당과 같은 작업이 수행되기 때문이다. 때문에 루프에서 함수를 호출하는 등의 코드는 작성하지 않는게 좋다. 이런류의 코드는 반대로 함수에서 루프를 수행하도록 변경하는걸 추천한다.
for(i=0 ; i<100 ; i++)
{
func(t,i);
}
-
-
-
void func(int w,d)
{
lots of stuff.
}
위의 코드는 아래처럼 바꿀 수 있다. 동일한 일을 좀더 빠르게 수행할 수 있다.
func(t); - - - void func(w) { for(i=0 ; i<100 ; i++) { //lots of stuff. } } 6.5 Population count – 비트 계수하기아래의 코드는는 주어진 값에 1bit가 몇개인지를 검사하는 코드다. 0000 1010 이라면 2를 리턴하는 식이다. 이러한 비트필드는 일정한 범위의 값이 참인지 거짓인지를 빠르게 체크하기 위해서 널리 사용될 수 있다.
다음과 같이 1씩 오른쪽으로 쉬프트 하면서, & 연산을 한다.
int countbit1(uint n) { int bits = 0; while (n != 0) { if (n & 1) bits++; n >>= 1; } return bits; } 이 코드는 다음과 같이 4만큼 쉬프트 하는 식으로 바꿔서, 성능을 높일 수 있다.
int countbit2(uint n) { int bits = 0; while (n != 0) { if (n & 1) bits++; if (n & 2) bits++; if (n & 4) bits++; if (n & 8) bits++; n >>= 4; } return bits; } 6.6 Earyl loop breaking루프를 사용하다보면, 일정 조건이 만족되면 뒤의 프로세스가 더이상 필요 없어지는 경우가 있다. 이 경우에는 break를 이용해서 루프를 벗어나도록 한다.
found = FALSE;
for(i=0;i<10000;i++)
{
if( list[i] == -99 )
{
found = TRUE;
}
}
if( found ) printf("Yes, there is a -99. Hooray!\n");
위의 코드는 -99가 포함되어 있는지 아닌지를 확인하는 프로그램이므로, 일단 발생이 되었다면, 루프를 돌 필요가 없다. 아래와 같이 break 문으로 빠져나가면 쓸데없는 루프의 낭비를 줄일 수 있다.
found = FALSE;
for(i=0; i<10000; i++)
{
if( list[i] == -99 )
{
found = TRUE;
break;
}
}
if( found ) printf("Yes, there is a -99. Hooray!\n");
6.7 Loop 사용하지 않기몇번만 순환하는 루프의 경우 풀어쓰면 성능을 향상시킬 수 있다 – 코드가 좀더 커지긴 한다 -. 루프를 사용하지 않게 되면, 카운터를 유지하고 업데이트하고 비교하는 작업이 그만큼 줄어들게 된다.
for(i=0; i<3; i++){
something(i);
}
보다는 아래의 코드가 더 효율적이다. something(0); something(1); something(2); 여하간에 가능하면 루프를 줄이는게 더 효율적이다. 아래의 코드는 한번의 루프에서 블럭단위로 함수를 호출함으로써, 루프의 수를 줄이고 있다.
//Example 1 #include<STDIO.H> #define BLOCKSIZE (8) void main(void) { int i = 0; int limit = 33; /* 33 번 함수를 호출한다 */ int blocklimit; /* The limit may not be divisible by BLOCKSIZE, * go as near as we can first, then tidy up. */ blocklimit = (limit / BLOCKSIZE) * BLOCKSIZE; /* 한번의 루프에서 8번의 함수를 호출해서 루프의 순환횟수를 줄이고 있다. */ while( i < blocklimit ) { printf("process(%d)\n", i); printf("process(%d)\n", i+1); printf("process(%d)\n", i+2); printf("process(%d)\n", i+3); printf("process(%d)\n", i+4); printf("process(%d)\n", i+5); printf("process(%d)\n", i+6); printf("process(%d)\n", i+7); /* counter 업데이트 */ i += 8; } /* * 8의 배수만큼 함수를 호출하고 있으므로, 처리하지 못한 함수가 생긴다. * 아래에서 처리하지 못한 함수를 호출한다. */ if( i < limit ) { /* Jump into the case at the place that will allow * us to finish off the appropriate number of items. */ switch( limit - i ) { case 7 : printf("process(%d)\n", i); i++; case 6 : printf("process(%d)\n", i); i++; case 5 : printf("process(%d)\n", i); i++; case 4 : printf("process(%d)\n", i); i++; case 3 : printf("process(%d)\n", i); i++; case 2 : printf("process(%d)\n", i); i++; case 1 : printf("process(%d)\n", i); } } } 7 함수 디자인함수를 작고 가볍게 많드는건 좋은 생각이다. 이렇게 함으로써 컴파일러는 register 할당과 같은 영역에서 좀더 쉽게 최적화 할수 있게 된다.
7.1 함수 호출 Overhead프로세서에서 함수의 호출은 예상과 달리 그리 큰 비용이 들지는 않는다. 함수가 호출되면 register에 함수의 인자를 넘기게 된다. 이 인자들은 char, short, int, float, structure등 이 올 수 있다. 이들 인자는 실제 4개만을 전달할 수 있다는 한계를 가진다. 이 이상으로 인자가 넘어가게 되면, stack를 이용해서 함수의 인자를 넘기게 된다. 당연히 함수를 호출함에 있어서 OverHead가 발생하게 된다. 함수호출시 발생하는 인자의 제한에 대해서는 Linux에서의 Assembly문서를 참고하기 바란다.
예제코드
int f1(int a, int b, int c, int d) { return a + b + c + d; } int g1(void) { return f1(1, 2, 3, 4); } int f2(int a, int b, int c, int d, int e, int f) { return a + b + c + d + e + f; } ing g2(void) { return f2(1, 2, 3, 4, 5, 6); } 6개의 인자를 사용하는 f2와 g2함수는 스택에 저장되어 있는 인자를 꺼내기 위해서 2번의 메모리 접근이 더 발생하게 된다. 7.2 가능한 인자의 수를 줄여라그러므로 가능한 적은 수의 인자를 넘겨받도록 함수를 설계할 필요가 있다.
7.3 인라인 함수__inline키워드를 이용하면 함수를 인라인화 할 수 있게 된다. 이것은 일종의 매크로 처럼 작용을 하며, 함수가 호출되는 대신 함수의 본체가 직접 치환이 되어 버린다. 이렇게 함으로써, 함수를 호출하는데 드는 비용을 줄일 수 있게 된다. 반면 코드가 모두 치환되어 버리므로, 코드의 크기가 커지게 된다.
__inline int square(int x) { return x * x; } #include <MATH.H> double length(int x, int y){ return sqrt(square(x) + square(y)); } 인라인 함수를 이용함으로써 얻을 수 있는 이득은 다음과 같다.
|












































최근 댓글