Daily Tweets
6월 17, 2009
private AP, apple, daily, e3, 봇, 구글토크, 블로그, game, google, google talk, iCal, iphone, iPhone3GS, 터치, 트위터, 아이폰, 앱스토어, 유료, loudtwitter, MS, OP, spec, twitter 댓글 남기기
- 08:58 Twigterrific 의 Favorite 와 Mark 는 무슨 차이일까요? #
- 09:03 @emailer 아항 그렇군요 Mark 는 그럼 실제론 별로 일거 같네요 어짜피 오프라인저장도 안되던데 #
- 09:09 휴가중이라 간만에 트위터에 왔더니 (그래봐야 한 이틀? -.-) DM이 Spymaster 초대로 도배되었군요;;; 전 spymaster 안해요 -,.-; #
- 09:13 @jdpapa 어디까지나 취향의 문제이긴 하겠으나, 아이폰,팜프리같은 최신폰을 며칠비교사용해본바… 역시 선택하라면 아이폰입니다. 다떠나서 반응속도가 다른것과 비교가 안되요. 성격급하신분은 아이폰 Win~ #
- 09:15 @hongss 트위터에서 그룹기능은 아직 공식적으로 제공하지 않는걸로 아는데요. pbtweet을 쓰시거나, Tweetdeck을 쓰면 가능은 하지만 그건 어디까지나 클라전용이라서 #
- 09:18 @Elebong 마피아 이건 스파이마스터와 또 다른거였나요? -_-; 전 같은건줄 알았는데 홀홀홀 #
- 09:26 @Asreanet 개인적으로는 감압식은 터치라고 안쳐줍니다. 최신스마트폰을 지향하면서 감압식을 쓰는곳은 아무데도 없습니다. 삼성도 곧 다 감전식으로 바꾸는걸로 알고있습니다. 감전식의 유일한 단점인 지문문제는 iPhone3GS가 해결한것으로 압니다. #
- 09:29 전 iPhone 3GS의 새기능중 가장 관심가는건 지문방지코팅입니다. -_-; 의외로 중요한 기능이라능 ㅋㅋㅋ #
- 09:31 @ludens_ 알바회장이신가여? ㅋㅋㅋ #
- 09:36 @doax tumblr질문이 하나 있습니다. 저도 텀블러괜찮아서 쓰다가, 트위터에서 클릭시 일단 텀블러로 가서 다시 실제사이트로 연결되는게 사람들이 싫어할듯하여 끊었는데, 요령이 있는것인가요? 설정을 자세히 못봐서… #
- 09:37 @tohappy 아이폰은 터치와 달리 뒷면이 블랙,화이트 둘다 플라스틱인지라 -_-; 어짜피 거울과는 무관합니다. 애플로고부분이 반사재질인데, 이걸로 셀카찍는용인가? 싶던 ^^ #
- 09:40 @sangwooklim www.apple.com/iphone/specs.html – Display 3line – Fingerprint-resistant oleophobic coating 라고 씌여 있습니다. 아직 출시는 안됬으니미확인
# - 09:42 RT @joone_net: @ludens_ @lavisi 돌핀 브라우저는 금시초문이군요.. / 저도 금시초문입니다.. 루머일 확율이 높은듯합니다. #
- 09:44 @lavisi 안그래도 아침부터 제트폰 이야기가 나오던데, 디자인은 많이 보던거긴한데, 첨듣는 이름;;; 저게 그 전략폰인가? 싶기도하던데, 그쪽관련 정보는 사내에서도 전무한듯합니다. #
- 09:51 RT @azbdc: bit.ly/kCeBD 델이 트위터로 300만 달러를 번 사연 / 기업들의 트위터활용에 좋은 보기가 될듯해요 #
- 09:53 @latte4u 안드로이드폰도 제트폰처럼 생겼던데요 ^^ 햅틱,터치계열 디자인들이 다 거기서 거기인지라 -_-; 삼성안드로이드폰도 나름 괜찮습니다. #
- 09:57 RT 첨 트위터를 할때 방화벽때문에 메신저가안되서 한것이었는데 ^^ @Yeonh: 이제 회사에 출근해서 네이트온을 먼저 키는게 아니라 트윅을 먼저 키게되는군요.. #
- 09:59 @murianwind 저희 보스께서도 한컴초기멤버신데, MS-Word쓰십니다. -_-; #
- 10:02 @gagamell48 삼성핸드폰 모델명규칙상 s~로 시작하는것은 스마트폰이 아닙니다. i~ 로 시작하는것들이 스마트폰입니다. s계열치고는 스마트폰에 근접한 그런 개념이라면 괜찮아보입니다. 가격이 문제지요 -_- #
- 10:23 @roceun: @gagamell48 특정 트위터클라에서 프로필사진이 안보이는것은 그림사이즈크기가 크거나, 한글파일명의 그림을 업로드했기 때문입니다. #
- 10:25 @latte4u i7500은 그냥 단순히 오리지널 안드로이드를 그대로 포팅한것이고, 그다지 주목받는 기능은 없는것으로 압니다. G1보다야 물론 낫겠지만;;; #
- 10:30 bit.ly/14iRYe 무사의 우산 : 아 이거 맘에 듭니다만… 쩍팔려서 못들고 다닐듯 ㅋㅋㅋ #
- 10:38 @roceun 흠… 저도 프로필사진을 이리저리 바꿔보다 트러블이 있길래,… 혹시 띄워쓰기된 긴파일명의 이름이라서??? 일듯도 싶네요. 이것도 아니면. 뭐 트위터측 버그 ^^ #
- 10:40 @roceun 아 그리고 추가로 .png 파일은 지원하지 않던 클라들이 좀 있던듯했습니다. 그래서 그냥 jpg로 대동단결을 #
- 10:43 bit.ly/VZrOC
오 애플코리아 아이폰 설명서페이지 … 뒷북이었다면 죄송합니다. 정작 폰설명은 아직 없지만 -_-; # - 10:46 @latte4u 당연히 i7500 (이게 이번 6월 유럽출시예정) 외에도 올해에만 4대이상의 삼성안드로이드모델이 예정중인걸로 압니다. 물론 약속은 못지킬확율이 농후하지만 ㅋ #
- 10:48 @hae_rang 지금 한국앱스토어 무료1위인 그 앱은 말그대로 무료인데??? 유료앱도 또 있었나요? #
- 10:50 RT 헉 @terasia: 청와대요!? RT @self_intro: "청와대 국민소통비서관입니다. 트위터가 정부와 네트즌들간의 소통 창구가 될수 있는지 궁금해서 써보고 있습니다. by @saunakim [1092]" #
- 10:52 @latte4u bit.ly/2j95z 지금 한국앱스토어 무료1위는 Ultimate SMS라는 이것인데 (전 다운만 받고 안써본;) 다른게 더 있나보군요. #
- 10:56 RT 국내 이용가능 터치용 SMS 랍니다. @latte4u: @seungwoonlee 네 3가지 입니다. Ultimate SMS(무료), Extreme SMS($0.99), Moa SMS($2.99) #
- 10:58 @mooozi 블럭은 무의미할듯합니다. 트위터의 특성상 신규계정생성에 아무런 제약이 없는고로, 오히려 신분을 숨기고, 팔로우하면 알수가 없으므로, 더 찍히기만 하실듯 -,.-; #
- 11:00 @lavisi 인도연구소 케켁 대충 알겠습니다. 기대안하셔도 됩니다 ㅋㅋㅋ #
- 13:06 휴가중에 민방위때문에 회사출근 뷁 #
- 13:55 @seoksik 전 트위터 메신저라길래;;; 봤더니 twhirl ;;; 트위터클라이언트라고 불리우며, 대략 천여개 이상이 있는걸로 알고 있습니다… twitter.com/downloads – wiki를 따라가보세요 #
- 13:57 RT 재방송입니다.bio씁시다 #KorTwitterTip 1)트위터의 첫인상 Bio를 충실히 : Settings-Account-Online Bio 160자에 가급적 충실히 쓰셔야 괜한 스패머로 오해받지도 않고, 같은 관심사분에게 팔로잉되기도 쉽습니다. #
- 14:02 @latte4u 터치 락화면관련 앱중 앱스토어에서 구매가능한 건 하나도 없는건가요? ㅠ.ㅠ #
- 14:04 RT 트위터는 특성상 구글톡으로 힘들겁니다. 대신 Yammer는 가능합니다. #yam @seoksik: Google Talk을 이용해서 트윗을 할수있는 방법은 없을까??? #
- 14:06 @seoksik 구글톡에서도 twitter@twitter.com 계정을 구글토크에서 친추해서 거기에 글을 쓰면 트윗팅된다고 한듯하던데, 계정이 틀린건지… 친추자체를 받아주지 않더군여 ~.~ 아하하 #
- 14:11 @terasia 벌써 트위터닷컴 구글톡 친추를 신청했으나, 몇주쨰 친신을 무쉬당하고 있습니다. -_-; 친추결재나신분 계신가요? ^^ #
- 14:12 @for30 감전식 방식에는 필림자체를 아예 안붙이는게 가장 제대로된 느낌이 나는건 아닐까 싶습니다. #
- 14:15 twitter.com/saunakim/friends 아직 저는 없습니다. ㅋ #
- 14:25 @isude 저도 비슷한 경험이 있습니다. 내가 팔로우한것도 아니고, 더군다나 팔로우끊어도 다음날 또 제가 팔로우하고있떤;;; 먼가 이런류의 봇이나 정보가 새어나가는게 아닐까?라고 급의심이 들더군요. 한번쯤은 자신의 팔로잉검사를 해보심이 좋을듯하네요 #
- 19:12 이 깜둥이 무지 짜증나는군요 -_-; 벌써 언팔로우 3번이나 했는데; 또 제가 팔로우하고 있는걸로 나오는;;; 다시 내용을 좀 보고 있는데, Verified Account 라고 나오고… 이게 혹시 트위터유료화모델? @souljaboytellem #
- 19:17 @weisskatze @emailer 제 무지에 의한 것인듯 싶습니다. Setting-Connection에 보시면, 트위터와 연동시키 서비스들이 나오는데, 그중에 TwitterRemote란게 범인인듯하네요. 서비스연동은 신중히 해야할듯 -.- #
- 19:25 Verified Account 이거 이해되었습니다. twittercounter.com/pages/featured 의 악질적 유료화모델이군요. 돈낸사람들의 자동팔로워봇?을 심어줍니다. TwitterRemote를 단사람에게.. 체크들해보세요 #
- 19:29 @emailer 그러고보니 그렇네요 -_-; 죄송합니다. 하도 화가 나서리 틀린정보를 제가 …. 다시 정리하자면, Verified Account 이건 상관없는것이고, TwitterRemote이넘은 나쁜넘 이네여 -_- #
- 19:33 @ruinblue Verified Account 는 트위터의 공식서비스인것 같습니다. 유명인이 정말 그사람 맞는지 검증해주는 시스템 twitter.com/help/verified #
- 19:34 @ruinblue TwitterRemote 는 twittercounter.com 에서 하는 서비스로서 자신의 블로그에 다녀간 트위터가 누구누구인지 리스팅해주는 위젯입니다. 그 위젯을 다는 댓가가 언팔로우해도 살아나는 좀비를 팔로잉해야함; #
Automatically shipped by LoudTwitter
Daily Tweets
6월 11, 2009
private daily, 동영상, iCal, iphone, 트위터, 아이폰, loudtwitter, spec, twitter, youtube 댓글 남기기
- 08:47 동영상구경하기–Wonder Girls Special Announcement bit.ly/jFFSO
| youtube리얼타임감상? yfrog.com/azzxfp # - 11:21 삼보컴퓨터가 한컴을 인수했군요 #
- 13:39 @xguru 오늘 천팔로워 넘으실듯, 미리 축하드려요 ^^ 저는 요 며칠 iPhone관련 T/F에 묶여서리 ㅋ.ㅋ #
- 13:39 스파이마스터 재미있나요? 게임을 할 생각은 별로 없지만, 어떤 방식일지는 흥미가 땡깁니다. #
- 18:53 ~.~乃 "The Man With The Golden iPhone: Spymaster Going Mobile" | 아이폰앱도 있군요;;; #spymaster ( bit.ly/NOjoq ) #
- 18:55 @xguru 님 천팔로워 축하요 ^^ #
- 19:15 @sheknown 긴주소 줄이기는 bit.ly 사이트에 가셔서 트위터와 연계시켜두시면, 자동으로 pbtweet상에서 길게 써두어도 ShortURL로 들어갑니다. #
Automatically shipped by LoudTwitter
Daily Tweets
5월 16, 2009
private 10.5.7, AP, car, daily, 미투데이, flickr, itunes, 터치, 트위터, 플리커, 아이폰, 해킨토시, 워드프레스, 유료, loudtwitter, mac, me2day, MS, nambu, OP, OSX, spec, twitter, xcode 댓글 남기기
<![CDATA[
- 12:36 @widerock 전 아이맥사고 나서 심심해서;;; PC에다가 해킨을... 메인자료는 아이맥에 해킨은 마루타용 ㅋ.ㅋ 날려먹을 각오하고 10.5.7 업데이트 했는데, 이거머... 잘만 업뎃되던 -ㅠ- #
- 12:37 @chulhoon 파컷이면 파이널컷인가 하는 SW를 말씀하시는듯한데? 해킨에서 특별히 안돌 이유가 있는지요? 저는 잘 몰라서 #
- 12:39 @cecil0414 AP의 이름을 Open으로 거기다 Broadcasting되도록 해놓은것은 한마디로 맘데로 써라~ 라고 받아들여야하지 않는지요? 물론 상당수는 무지에 의해서 본의아니게 그렇게 설정된 것이겟지만, FON이라는것도 있고, OpenMind #
- 12:42 RT @hanjool: TwitterFon 업데이트 소식, 제일 위에 광고가 추가됬군요. 광고 없어서 좋아 했는데 .. // 그럼 광고없는 유료버전등장? 쓸만한 트위터클라들이 모두 유료화되는군요 ~.~ #
- 13:03 RT 자자 총알들 장전 @MacRumorsRSS @golbin: Mac OS X 10.5.7 설치 후 해킨토시 노트북의 배터리 수명이 33%나 증가. 아마도 인텔 아톰 프로세서에 대한 옵티마이징이 이루어진 것 같다는데, 애플 넷북이 진짜로 출현? #
- 13:04 RT 더 정확하게는 미투데이를 트위터특성을 고려하지 않고 신디케이트 시키는 문제죠. 저역시 1차 unfollow대상입니다;;; @golbin: 프렌드 피드 쓰시는 분들 unfollow 해야겠음(...) #
- 13:17 트위터들이싫어하는 미투데이fromFriendFeed 1)클릭하면 미투데이가 뜬다-또클릭또클릭 2)미투의 RSS를 싱크시키는것이라 폭탄식으로 타임라인한페이지를 장식한다.3)그러면서도 정작트위터자체는 로긴x 트위터유저가 아니시므로 unfollow합니다. #
- 13:18 @hanjool 보청기 블루투스 ㅎㅎㅎㅎ 센스작렬이십니다. #
- 13:20 @sweetcherry_kr 설정의 문제입니다. FriendFeed를 제대로 설정않으시면 그렇게 됩니다. 미투포토는 Flickr의 공용계정을 이용하는 것인데, 트위터가 미투포토를 대신할 기능은 훨씬 더 많습니다. #
- 13:25 @sweetcherry_kr 트위터 클라에서 그림삽입을 하시면 됩니다. twipic Yfrog Pikchur MobyPicture TwitGoo ... Twittelator만 해도 이렇게 지원하고 있네요 #
- 13:28 @sweetcherry_kr 전 핸드폰사진을 업로드하는것이 아니라, 개인적으로 Flickr를 쓰고 있어, 큰사진은 Flickr제 계정에 올려서 링크걸고 있습니다. 해보진 않았으나, 국내 핸드폰으로 모바일사진 업로드가능한 (트위터연계되는) 있는걸로압니다 #
- 13:38 RT @shabdmoon: 아이폰 컨셉 사진 게재 bit.ly/2MmOlD 짱입니다. !!! #
- 13:40 @devilworks MS는 업데이트하면할수록 느려지고, OSX는 업데이트할수록 빨라진다고 하더군요 ~.~ #
- 13:50 @heyun @sumanpark 미투데이를 트위터와 연계하는 자체가 문제가 아니라, 트위터유저를 배려하지 않은 프렌드피드를 통한 설정의문제입니다. ping.fm 같은걸 써도 좋고, #twit 이런 해쉬태그를 써도 좋고, 방법은 찾기 나름인듯합니다. #
- 13:56 @heyun @sumanpark 아마도 가장 좋은 방법은 간접적으로 FriendFeed를 통하지않고,직접 미투데이가 @미투데이유저 링크도 호환되도록 그리고 선별적으로도가능하도록 직접 지원해주는 것이지요.기본적으로 FF를 묻지마 트위터퍼블리싱하는건좀; #
- 14:12 @heyun ^^ 아무래도 제한된글자수에 구겨넣어 쓰다보니;;; 간단히 말해 미투데이에서 직접 트위터 지원해주면 간단합니다. 만박님께 압력을 ~.~ #
- 14:16 RT 혹시 한국카드로 성공하신건가요? +_+ 그렇다면 비법을 좀 굽신굽신 @doccho: 아자. 페이팔 계정 iTS에 다시 연결 성공! #
- 14:40 @doccho @nass0131 Paypal 로 iTS 연결하기 비법의 소스는 @doccho 님에게 ^^ #
- 14:49 @deuxdoom 프렌드피드를 쓴다고 문제가 아닙니다. 지금은 프렌드피드가 리뉴얼되어서 잘 모르겠으나, 클릭또클릭 은 안할수 있도록 하는 옵션설정이 있었습니다. 배려심이 없는 유저를 싫어하는것은 인지상정일것입니다. #
- 14:52 @colus6 페이팔 국내카드로 됩니다. (제가 Flickr를 페이팔 국내카드로 결재했었으니) iTS는 근데 국내카드를 통한 iTS도 원칙적으로 봉쇄더군요 -_-; #
- 14:52 @colus6 앗 오타가... iTS는 국내카드로 등록된 페이팔 기본저으로는 거부하더군요 -_-;; #
- 14:55 @zizukabi 저역시 프렌드피드를 사용하지만, 프렌드피드는 제목대로 모든 피드를 모아두는 집합장소의 개념으로서쓰고 있지, 프렌드피드 자체를 다시 트위터등으로 퍼블리싱은 하지 않고 있습니다. SNS원서비스의 목적에 충실하게 쓰는것이 가장 좋지않을까요 #
- 14:58 @sumanpark #me2day : #yam 의 yammer처럼 트위터 글을 미투데이 자신의 계정으로 #m2d or #me2day 가 달린 경우 한정 전송되었으면 좋겠습니다. #
- 15:00 @sumanpark #me2day : 미투데이에서 트위터로 보내주는 전용 매쉬업등을 만들어, 미투에서 글을 쓸때 체크박스 선택해줄 경우, 트위터로 동시전송하게 해주면 좋겠습니다. SNS간의 연계는 유저뺏기 치킨게임이 아니라 윈윈 아닐런지요 #
- 15:03 @hiseka 워드프레스 설치형으로 나가셔야죠 -_-;;; 안되는 것으로 압니다. 스킨은 커녕 <script>달린 위젯들도 태그 다 자동삭제됩니다; #
- 15:11 @deuxdoom 저도 그점이 염려되어, 무조건 via friendfeed라고 되어 있다고 unfollow하는건 당연히 문제가 있지요. 아직 많은 분들이 SNS연계에 익숙치 않아서 인듯해요. 저역시 많이 배워야하는데, 워낙에 이쪽은 리뉴얼이 빨라서;; #
- 15:14 @Ericto144 @deuxdoom 저는 환율이 1600 일때 플리커 2년 그었습니다. ㅠ.ㅠ 어흑;;; #
- 15:30 @neutrospec twhirl 이 tweedeck 다음으로 많이 쓰이는 클라죠. 한글윈도우상에서는 개인적으로 가장 나은 인터페이스를 가지고 있다고 봅니다. 다만 following 이 늘어나시면 감당이 좀 ~.~ #
- 15:41 @neutrospec twhirl은 한동안쓰다 요즘은 잘 안써서, 그룹기능이 없어서요. 인터페이스는 미려하게 나오는 편이라 맘에 드는데, Nambu면 Mac용뿐인데... Nambu도 괜찮지요. 무료중에선 가장 좋았던걸로 기억합니다. #
- 15:42 그러고보니 TwitterFon 이 무료광고/유료 버전이 생기면서, Nambu 아이폰버전이 쓸만한 무료 트위터 클라로 남는건가요? ^^ #
- 15:44 Xcode 의 Monaco 폰트를 Visual C에서 쓰면 왜이렇게 언밸런스 할까요 ~.~; #
- 17:25 @tohappy @latte4u 웹주소록과 아웃룩간의 연계에 www.plaxo.com 이란게 있습니다. 조금 불안정한 감이 있는데, 어느정도 해결책이 될수 있으려나요? 단 백업필수입니다. 싱크하다 꼬이면 대책이 없어서요 #
- 17:28 @graphysics 구글리더 표시는 되지 않지만, 9999개까지만 쌓인다고 들었습니다. ^^ #
- 19:39 RT 연내 앞에 "백''자가 빠졌군요 ~.~ @hf61: 지경부, 오픈소스기반 휴대폰용 SW플랫폼을 연내 국산화 추진 bit.ly/tmRPh... 절대 상용화 성공 못한다에 10표...ㅠㅠ #
- 19:50 @premist @delpini 나라갈아타기 신공을 쓰면 한국카드로 iTS를 쓸수 있긴합니다. 하지만 이것도 한달에한번꼴로 경고창과함께리셋당하고,또나라갈아타고;;; 걍 구찬아서 한국에서만 결재합니다. 겜만 포기하면 편해요 -_-; #
- 19:52 @premist @delpini 리딤코드를 파는 자체는 거의 100% 불법이라고 보시면 됩니다. 미국의 지인을 통해서 사는 수 뿐이라고 보셔야합니다. #
- 19:54 @premist 제말은 그렇게 게임결재를 하더라도 한달단위로 또 카드등록행위를 해야한다는 것입니다;;; 그게 구차나요 -_-; 저도 물론 게임몇개 사긴했죠. 한두번 터치완전 밀어버리고 새로 결재된거 다운로드 받을때... 움찔하더군요. 당해보시면아라요 #
- 20:14 @hjcha 상식적으로 생각하시면 됩니다. 정상적인 방법으로 Giftcard를 사서 판다면, 수고비?때문에 당연히 iTunes에서 직접사는것보다 비싸야하는 법입니다. 코드생성기로 우선 통과만되게 코드만들어서 이베이등으로 팔아보자는건 뻔한 술법이지요. #
- 20:18 @hjcha 얼마나 애플이 불법생성된 코드에 대한 단속을 하는지는 잘모르나, 종종계정블락된 이야기를 들어보면 시간이 지난후엔 결국 블록될 위험을 감수할수밖에 없는셈인데, 굳이 그렇게 졸이면서까지 키프트카드를 살필요는;;;그래서전 겜포기하고 한국iTS만 #
- 20:27 @kiyong2 네 저도 그렇게만 쓰고 있습니다. 물론 iTuneU같은건 어쩔수없이^^ 그래도 카드신공으로 예전결재해둔건 업데이트는 다행히 해주더군요. 추가로 미국주소는 Wizwid 사서함주소 추천합니다. 애플사주소이런건 좀 글차나요 ㅋ.ㅋ #
- 20:56 @premist 아 미국-홍콩-미국으로 하신게 아니라 그냥 홍콩에 눌러사신? ^^ 홍콩은 참고로 도시국가라는 특성상 주소체계때문에 좀 특수케이스라고 하더군요. 전 근데 솔직히 일본iTS를 뚫고싶은데, 역시 장벽이 만만찬던 ~.~ #
- 20:59 @saramdle 저는 4,5월 평일 100%야근율을 현재까지 기록중입니다. ㅠ.ㅠ 문제는 이 페이스가 끝이 안보인다는 것;;; #
- 21:00 @lavisi 기왕 지르실 것이면 트위레이터프로가... 아쉽;; 전 트위레이터 프로 질른뒤 아이폰용 트위티는 삭제할까말까 갈등중 -_-;;; #
- 21:04 @estima7 아 역시 일본 iTS는 기프트카드뿐일려나 ㅠ.ㅠ 값은 머 떠나서 거기서 밖에 못구하는 것들이 좀 많아서;;; 일본가는 지인들에게 기프트카드라도 부탁해놔야겠네요. 감사합니다. #
- 21:06 @saramdle ^^ 오늘은 일찍퇴근할려고요... 전 9시퇴근하면 일찍퇴는 하는거인 어흑 ㄱ-; #
- 21:12 전 이만 오늘은 칼퇴근 ~.~ 잠시후 트위레이터로 뵙겠습니다 . ^^ #
- 21:51 @deuxdoom 개인적으론 Jpop 을 선호해서 이쪽 노래를 구하거나 하다못해 앨범자켓이라도구하고 싶어서요 아이팟에 담긴 노래상당수가 앨범자켓도 없는 안습;;; 어플은 거의 비슷하지않나요? 니코니코는 US iTS에도 있던데 #
- 22:06 @Neoz 저는 특성상 회사에서 와이파이가 안되서 오프라인기능이 절실했는데 트위레이터프로가 그걸 ]
]>
Mactracker
4월 24, 2009
apple AP, apple, h/w, imac, ipod, itunes, 앱스토어, mac, mactracker, OSX, spec 댓글 1개
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=311421597&mt=8
맥트래커라는 앱스토어 무료앱입니다.
맥 H/W 의 히스토리라고나 할까요? ㅋ.ㅋ
09 early 버전까지 모든 Apple 사 H/W 의 Spec 이 적혀 있습니다. 자기것 한번 찾아보세요 ^^
(추가)
Mac OSX 버전도 있군요.
Doors 교육
2월 20, 2008
Computing backup, iStory, OP, spec, story, XP 댓글 남기기
C/S 프로그램이다
- 설치
포트는 36677 – 원래 있던건 지우고
19353@licenseserver_ip flexlm 방식 포트는 19353
포트 36677, 19353 방화벽 주의
c:\> hostname
최초 실행시 admin 암호를 넣으라고 한다 < telelogic 이라고 그냥 넣으라
.DPA 파일이 DB파일이다. import … < file 메뉴의 restore 로
< Doors Project Archive
DB import or 설치가 잘 안될때는 한글path 주의 < path 에서 한글이 지원이 잘 안된다.
What is DOORS ?
< 그냥 ’문’ 이다.
< Dynamic Object Orieted Requirements System
< 최근에 약어부여
교육은 이틀간, 첫날은 User, 둘째날은 Admin
최초 DB 의 admin 계정명은 > Administrator < 대문자 A
user 를 만든다. < 한글로 가능
user 타입은 4가지
Tool - Option – Display – Current Background 더블클릭 색깔을 바꿔준다.
Folder 와 Project 의 구분은 그냥 의미적인 차이일뿐이다.
< Folder <-> Project 는 서로 상위/하위 개념이 아님
< 속성은 조금 차이가 있다.
< Project 는 Archive 될수 있다. < backup 저장 등가능,
< Folder 는 그냥 단순한 구분일뿐이다.
< Folder 는 이름이 겹쳐도 되나, Project 는 Unique 해야한다
모듈은 두가지가 있다. Formal / Link 문서 = 모듈
모듈 내 한행. 을 Object 라고 한다.
Change Bar - 붉은색 < 무언가가 바뀌었다.
노란색 < 바뀐뒤 저장되었다. < 8.3 버전부터 색깔이 바뀐…
녹색 < 안바뀜 < 8.3 은 파란색
한열 – Attribute 라고 한다.
모듈을 여는 방법은 3가지
Read Only < 못고치는 부분은 회색으로 보임
Shareable Edit
Exclusive Edit
Object Structure Terminology
siblings – 형제, 같은 부모
Copy/Cut/Paste 하면 자동으로 renumbering 이 되는데, 이 속도가 빨라서 헷갈리니 주의
Ctrl+H 헤더입력
Ctrl+T 텍스트입력
Ctrl+N 새로운 Obj. 추가 같은 레벨
Ctrl+L - 한수준 아래 레벨
Ctrl+Enter = Ctrl+N + Ctrl+T
입력하다가 최종레벨 보다 낮은 Obj 를 잘못만들면, ‘ – ‘ 가 생긴다. < 이경우는 거의 대부분 잘못된 경우다.
Promote / Demote Object 레벨을 상/하 로 한수준이 옮긴다.
< 수준이 잘못 만들어지면 쓴다.
Promote Ctrl+ALT+Left
Demote Ctrl+ALT+Right
Attribute 목적
- Filtering
- Searching
- Sorting
Attribute 는 두가지
- Object Attribute
- Module Attribute
Compound Filter 가 Advanved Filter 이다. < 복합필터
Module Explorer 는 Sorting 에 영향을 받지 않는다
Sorting 의 영향을 Close 후 다음에도 유지하게 하고 싶기 위해 View 를 만든다.
> 폭만 조금 조절해도, 마칠때 Continue / Cancel 처럼 View 로 저장하지 않으면, 사라진다고 경고함.
Link Modules, Linksets, Links
Formal Module 은 Obj 를 담고 있고, Link Module 은 Linkset 을 담고 있다
< 2일차 >
Analysis 를 할때는 Explorer View 를 끄고 하는 것이 좋다. < Wide…
군(軍) 에서는 링크를 여러단계까지 실제로 설정하여 사용한다.
Suspect
연관 요구사항이 변경이 있으면, 링크된 요구사항의 변경이 필요. > ? 로 표시됨
History
DOORS는 거의 모든 변경사항을 다 기록하고 있다
-> Change Bar 를 더블클릭하면 바로 History 를 볼수 있다
-> redlining 하면 변경된 부분이 빨간색으로 표시되어 쉽게 알아볼수 있다
< Part II >
Archive
Module – .dma
Project - .dpa
Module Copy
Module 을 카피했을때, 받아들이는 링크입장에서는 복사를 하더라도 링크정보가 없지만
Source 입장에서는 Link 정보도 다 같이 복사된다.
여러개를 Select 한뒤 Shift_마우스를 꾸욱 눌러주고 있으면, 여러개가 선택되는것이 기본으로 된다.
Attribute 에 색깔을 넣을수 있다.
> Attribute 에 따라서 Obj 전체가 색깔을 나타내어 쉽게 구분을 할수 있다
> View Save As 를 잊지말자
Baseline 을 그으면 Change Bar 가 모두 파란색으로 쫙 바뀐다.
Baseline Sets
Baseline 은 하나의 모듈에 대해서고, Baseline set 은 Module 의 묶음
텔레로직 코리아
김윤종 과장 yoonjong.kim@telelogic.com
김대승 차장 daeseung.kim@telelogic.com (DOORS expert)
서울시 서초구 양재동 14-4 모산빌딩 6층
이 글은 스프링노트에서 작성되었습니다.
black-pc SPEC add..
2월 1, 2008
private 8800GT, blackpc, 동영상, HP, 코어2쿼드, MS, spec, USB 댓글 남기기
|
[조립비] 하드웨어 조립비 |
1 개 | 20,000 원 | 20,000 원 |
|
[세신EMC] 세이즈 이동형 개별스위치 멀티콘센트 6구 1.5M |
1 개 | 10,100 원 | 10,100 원 |
|
|
1 개 | 1,400 원 | 1,400 원 |
|
[HP] [LS]HP DVD-R 16배속 4.7GB 10장 케익 |
1 개 | 5,400 원 | 5,400 원 |
|
[마이크로소프트] MS 리클루사(Reclusa) 게이밍 키보드[고급청패드 증정] |
1 개 | 59,300 원 | 59,300 원 |
|
[시소닉] S12II-430 |
1 개 | 76,700 원 | 76,700 원 |
|
[GMC] R-2 TOAST 토스트 (블랙) |
1 개 | 25,600 원 | 25,600 원 |
|
[삼성전자] DVD-Multi SH-S203P 블랙 정품박스 |
1 개 | 32,000 원 | 32,000 원 |
|
[기가바이트] GeForce 8800GT 256MB 네버윈터나이츠2 Zalman PCI-E |
1 개 | 236,300 원 | 236,300 원 |
|
[시게이트] SATA2 500G (7200/32M) |
1 개 | 123,900 원 | 123,900 원 |
|
[ST메모리] ST2 DDR2 4G PC2-6400(800Mhz)DUAL KIT 방열판 |
1 개 | 91,400 원 | 91,400 원 |
|
[기가바이트] GA-P35-DS3R (Rev.2.0) |
1 개 | 115,890 원 | 115,890 원 |
|
[INTEL] 코어2쿼드 켄츠필드 Q6600 (2.40GHz/1066MHz/8MB)정품/인기상품 |
1 개 | 294,000 원 | 294,000 원 |
|
[대현] 5구접지 블랙 [1.5미터] |
4 개 | 2,600 원 | 10,400 원 |
|
[유니콘] HC-3500 Combo |
http://www.joyzen.co.kr/mypage/order/view.html?order_code=080130000906369507
이 글은 스프링노트에서 작성되었습니다.
black-pc SPEC.
1월 31, 2008
private 8800GT, blackpc, HP, 코어2쿼드, MS, spec 댓글 1개
| 2008-01-30 | [조립비] 하드웨어 조립비 | 1 개 | 20,000 원 | 20,000 원 |
| 2008-01-30 | [세신EMC] 세이즈 이동형 개별스위치 멀티콘센트 6구 1.5M | 1 개 | 10,100 원 | 10,100 원 |
| 2008-01-30 | [AIDATA] AIDATA CM04 케이블타이 50 | 1 개 | 1,400 원 | 1,400 원 |
| 2008-01-30 | [HP] [LS]HP DVD-R 16배속 4.7GB 10장 케익 | 1 개 | 5,400 원 | 5,400 원 |
| 2008-01-30 | [마이크로소프트] MS 리클루사(Reclusa) 게이밍 키보드[고급청패드 증정] | 1 개 | 59,300 원 | 59,300 원 |
| 2008-01-30 | [시소닉] S12II-430 | 1 개 | 76,700 원 | 76,700 원 |
| 2008-01-30 | [GMC] R-2 TOAST 토스트 (블랙) | 1 개 | 25,600 원 | 25,600 원 |
| 2008-01-30 | [삼성전자] DVD-Multi SH-S203P 블랙 정품박스 | 1 개 | 32,000 원 | 32,000 원 |
| 2008-01-30 | [기가바이트] GeForce 8800GT 256MB 네버윈터나이츠2 Zalman PCI-E | 1 개 | 236,300 원 | 236,300 원 |
| 2008-01-30 | [시게이트] SATA2 500G (7200/32M) | 1 개 | 123,900 원 | 123,900 원 |
| 2008-01-30 | [ST메모리] ST2 DDR2 4G PC2-6400(800Mhz)DUAL KIT 방열판 | 1 개 | 91,400 원 | 91,400 원 |
| 2008-01-30 | [기가바이트] GA-P35-DS3R (Rev.2.0) | 1 개 | 115,890 원 | 115,890 원 |
| 2008-01-30 | [INTEL] 코어2쿼드 켄츠필드 Q6600 (2.40GHz/1066MHz/8MB)정품/인기상품 | 1 개 | 294,000 원 | 294,000 원 |
| 2008-01-30 | [대현] 5구접지 블랙 [1.5미터] | 4 개 | 2,600 원 | 10,400 원 |
| 2008-01-30 | [유니콘] HC-3500 Combo |
http://www.joyzen.co.kr/mypage/order/view.html?order_code=080130000906369507
이 글은 스프링노트에서 작성되었습니다.
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)); } 인라인 함수를 이용함으로써 얻을 수 있는 이득은 다음과 같다.
|
개발자가 놓치지 말아야 할 책 70권
5월 30, 2007
Software Test air, ani, AP, apple, architecture, car, 개발자, frontier, iCal, mac, MS, OP, programming, spec, XP 댓글 2개
개발자가 놓지지 말아야 할 책 베스트10
Thinking In Java/Bruce Eckel
Practical C Programming/Steve Oualline
Instant CORBA/Robert Orfali,Dan Harkey,Jeri Edwards
Modern Database Management/Fred R.McFadden,Jeffrey A.Hoffer,Mary B.Prescott
Programming Pearls/Jon Bently
Effective C++/Scott Meyers
Unix Network Programming/W.Richard Stevens
MicroC/OS-II The Real-Time Kernel/Jean J.Labrosse
Unix Internals:The New Frontiers/Uresh Vahalia
Extreme Programming Installed/Ron Jeffries,Ann Anderson,Chet Hendrickson
개발자가 놓지지 말아야 할 책 베스트40
Macintosh Human Interface Guidelines/Apple Computer Staff
Design Patterns/Gang of Four
Refactoring/Martin Fowler
The Pragmatic Programmer:From Journeyman to Master/Andrew Hunt,David Thomas,Ward Cunningham(Preface)
Peopleware:Productive Projects and Teams/Tom DeMarco & Timothy Lister
Linkers and Loaders/John R. Levine
Client Server Database Enterprise Computing/James Martin
DataWareHouse From Architecture To Implementation/Bary Devlin
Operation System Design-The XINU Approach/Douglas Comer
Writing Solid Code/Steve Maguire
Algorithm+Data Structure=Programs/NIclus Wirth
Code Complete/Steve McConnell
Component Software:Beyond Object Oriented Programming/Clemens Szyperski
Software Reuse-Architecture,Process and Organization for Business Success/Ivar Jacobson,Martin Griss,Patrik Jonsson
Extreme Programming Explained/Kent Beck
Applying UML and Patterns,2nd Ed/Craig Larman
The Java Programming Languages, 3rd Ed/David Holmes,James Gosling,Ken Arnold
리눅스 완전분석으로 가는 길/박장수
Operating System Concept/Abraham Silberschatz
TCP/IP Illustrated Volume I,II,III/W.Richard Stevens
Advanced Programming in UNIX Environments/W.Richard Stevens
Understanding COM+/David S.Platt
Compilers: Principles,Techniques and Tools/Jeffrey D.Ullman
Numerical Reciples in C/William H.Press
The C++ Programming Language Special Ed/Bjarne Stroustrup
Effective STL/Scott Meyers
Professional Jini/Sing Li
C++ Primer/Stanley B.Lippman,Josee Lajoie
대용량 데이터베이스 시스템/이화식,조광원
Armchair Universe/A.K.Dewdney
Writing for Computer Science/Justin Zobel
The C Programming Language/Brian W.Kernighan,Dennis M.Ritchie
Bugs in Writing Revisted:A Guide to Debugging Your Prose/Lyn Dupre
The Design of The UNIX Operationg System/Maurice Bach
Building Business Objects/Peter eles,Oliver Sims
The Art of Computer Programming:Fundamental Algorithms/D.Knuth
Professional ATL COM Programming/Ricard Grimes
Pattern-Oriented Software Architecture, Volume 2/Douglas Schmidt
Inside Java2 Virtual Machine/Bill Venners
Understanding ActiveX/COM/David Chappell
개발자가 놓지지 말아야 할 책 베스트20
Fundamentals of Data Structues in C++/Ellis Horowitz,Dinesh Mehta
Computer Networks/Andrews.Tanenbaum
Modern C++ Design/Andrei Alexandrescu
Database System Concepts/Abraham Silberschatz,Henry F.Korth,S.Sudarshan
Modern Database Management/DaFred R.McFadden,Jeffrey A.Hoffer,Mary B.Prescott
Data Mining:Concepts and Techniques/Jiawei Han,Micheline Kamber
The Design and Implementation of the 4.4BSD Operating System/Marshall Kirk McKusick,Keith Bostic,Michael J.Karels
UNIX Power Tools/Jerry D.Peek,Tim O’Reilly,Mike Loukides
The Unix Programming Environment/Brian W.Kernighan,Rob Pike(Contributor),Robert Pike
The Cathedral & The Bazaar/Eric S.Raymond
The Society of MIND/M.Mmsky
Fundamentals of Object Oriented Design in UML/Meilir Page-Jones
Computer Organization and Design:The Hardware/Software
Interface/David A. Patterson, John L. Hennessy
Design Web Usability The Practice of Simplicity/Jakob Nielsen
Introduction to Algorithms/Charles E.Leiserson,Ronald L.Rivest, Thomas H. Cormen
Introduction to the Team Software Process/Watts .Humphrey,Marc Lovelace
Mythical Man Month/Frederick P.Brooks
The Psychology of Computer Programming/Gerald M.Weinberg
After the Gold Rush/Steve C McConnell
Structure and Interpretation of Computer Programs – 2nd Ed/Harold Abelson,Gerald Jay Sussman,Julie Sussman
The Joel Test
3월 8, 2007
Software Test AP, daily, internet, 소프트웨어 테스트, Joel, MS, OP, SEMA, Software Engineering, Software Test, spec, test, XP 댓글 남기기
The Joel Test: 나은 코딩을 위한 12단계
글 : Joel Spolsky
번역 : B.K. Chung 정봉겸
감수 : Jang Han Goo 구장한
2000년 8월 9일
SEMA에 대해서 들어보신 적이 있습니까? 소프트웨어 팀이 얼마나 잘하는지를 재는 나름대로 복잡한 시스템입니다.
앗, 아니! 그 링크를 누르지 마세요. SEMA를 “이해“만 하는데 아마 6년정도가 걸릴것입니다.
그래서 소프트웨어 팀이 얼마나 좋은지 등급을 매길 수 있는 – 좀 무책임하고 되는대로의 – 자체적인 버젼의 테스트를 만들었습니다.
이 테스트의 장점은 3분정도밖에 걸리지 않는다는 것입니다. 절약되는 시간으로 의대에 가서 공부할 수도 있을 것입니다.
The Joel Test
- Source Control(소스 컨트롤)을 사용하십니까?
- 한번에 빌드를 만들어낼 수 있습니까?
- daily build(일별 빌드)를 만드십니까?
- 버그 데이타베이스를 가지고 있습니까?
- 새로운 코드를 작성하기 전에 버그들을 잡습니까?
- up-to-date(최신) 스케줄을 가지고 있습니까?
- spec(설계서)를 가지고 있습니까?
- 프로그래머들이 조용한 작업환경을 가지고 있습니까?
- 돈이 허락하는 한도내의 최고의 툴들을 사용하고 있습니까?
- 테스터들을 고용하고 있습니까?
- 신입사원들은 면접때 코드를 직접 짜는 실기시험을 봅니까?
- hallway usability testing(무작위 사용성 테스팅)을 하십니까?
Joel Test이 특별한 점은 각 직문에 예/아니오로 바로 대답할 수 있다는 것이다. lines-of-code-per-day(하루동안 산출되는 코드의 줄수)나 average-bugs-per-inflection-point(산출 시점의 평균 버그수) 같은 것은 알 필요가 없습니다. “예”에 해당 하는 질문에 1점씬 가산됩니다.
하지만 이 테스트는 핵 원자로에 사용하는 소프트웨어가 안전한지를 검사하는등 에는 사용하지 말아주십시오.
12점은 완벽, 11은 충분한 점수이지만 10점이나 그 이하는 심각한 문제가 있다는 신호입니다. 사실은 대개의 소프트웨어 회사 들이 2~3점을 받고 있고,
심각한 도움을 필요로 하고 있습니다. Microsoft같은 회사는 12점 만점을 받고 있습니다.
당연한 이야기지만 이것들만으로 성공과 실패를 가를 수는 없습니다. 특히, 아무도 필요없는 제품을 굉장히 훌륭한 소프트웨어 팀이 만들고 있다면,
역시나 아무도 원하지 않을 것입니다. 반대로 이런 방식을 따르지 않는 명인들이 세상을 바꾸는 소프트웨어 를 만드는 경우로 생각할 수 있겠습니다.
그러나, 이 12가지 이외의 요소를 모두 동등하게 놓고 본다면, 이들만 제대로 한다면 지속적으로 좋은 결과를 내는 잘 훈련된 팀이 될 것입니다.
1. Source Control(소스 컨트롤)을 사용하십니까?
상용 소스 컨트롤 패키지들도 사용해보았고, 무료로 사용할 수 있는 CVS도 사용해보았습니다. CVS는 무료이기는 하지만 충분합니다.
그렇지만 소스 컨트롤이 없다면 프로그래머들을 조율하는 일이 상당히 피곤할 것입니다. 프로그래머들은 다른 사람들이 어떤 것을 했는지 알 수 있는 방법이 없습니다.
이를 사용하면 실수를 쉽게 롤백할 수 있습니다. 소스 컨트롤의 다른 장점은 소스코드 자체가 모든 프로그래머의 하드디스크에 체크아웃(check out)되어 있다는 것입니다.
소스 컨트롤을 사용하는 프로젝트에서 코드를 날렸다는 이야기를 들어본 적이 없습니다.
2. 한번에 빌드를 만들어낼 수 있습니까?
“최신의 소스로부터 몇단계를 거쳐서 완제품(shipping build)을 만들 수 있습니까?”라는 의미의 질문입니다.
잘 되어있는 팀인 경우라면 하나의 스크립트로 checkout부터 시작하여 각 소스를 리빌드(rebuild)하고 각 버젼, 언어, #ifdef같은 조건별로 실행파일을 만들어내어 마지막 CDROM 레이아웃, 다운로드할 수 있는 웹사이트를 만들어 내는 정도까지 되어 있을 수 있겠습니다.
만일 이 과정이 하나의 단계 이상을 거친다면, 여기서부터 에러가 발생할 확률이 생깁니다. 정해진 기일이 가까워질수록 “마지막” 버그를 수정하고
실행파일을 만드는 등을 위해 빠른 사이클을 필요로 할 것입니다. 코드를 컴파일하고 설치파일을 구성하는데에 20단계가 필요하다면 급박한 시간때문에 사소한 실수를 저지르게 될 것입니다.
필자가 마지막으로 근무했던 회사에서는 이런 이유로 WISE를 InstallShield(역자주 : 두 제품 모두 설치본을 만들기위한 도구 입니다.)로 교체하였습니다.
설치 과정을 스크립트를 통해서 NT 스케줄러로 밤새에 자동으로 실행하도록 하고자 하였는데, WISE는 스케줄러로 실행할 수 없던 이유입니다.
(WISE의 친절한 분들이 최신 버젼에는 이것이 가능하다고 알려왔습니다.)
3. daily build(일별 빌드)를 만드십니까?
소스 컨트롤을 사용하다 보면 누군가가 빌드를 실패하게 만드는 코드를 체크인 할 수 있습니다. 예를 들면,
새로운 소스파일을 추가해서 그 사람의 컴퓨터에서는 잘 컴파일되지만, 이를 코드 레파지토리(repository)에는 추가를 하지 않았을 수 있습니다.
이 사람은 이를 잊고 만족한 상태에서 컴퓨터를 잠그고 집에 돌아갑니다.
그렇지만 이로 인해 다른사람들은 작업을 할 수 없게 되고 결국 찝찝하지만 결과없이 집으로 돌아갈 수 밖에 없습니다.
모르는 사이에 빌드를 실패하는 이런 컴파일 오류가 나지 않도록 daily build를 만들게 됩니다.
큰 팀에서는 이런 경우를 위해서 daily build를 매일 오후 – 점심시간등 – 에 합니다. 사람들은 점심시간 이전에 될 수 있는 한 많이 체크인을 합니다.
점심을 먹으로 갔다가 다시 돌아오면 빌드는 이루어져 있습니다. 빌드가 실패하면, 사람들은 빌드가 성공한 이전 소스로 작업을 하면 됩니다.
엑셀팀에서는 누군가 빌드를 깨면 벌칙으로 다른 사람이 다시 깰때까지 빌드를 관리하도록 벌칙을 주었습니다.
이는 빌드를 깨면 받는 벌칙으로써 뿐만 아니라 모든 이들이 돌아가면서 빌드를 관리할 수 있게하여, 어떻게 돌아가는 지를 익히게 하는 방법으로써도 좋았습니다.
daily build에 관해 더 자세히 아시려면 저의 기사 daily builds are your friend를 읽으십시오.
4. 버그 데이타베이스를 가지고 있습니까?
뭐라고 반박하셔도 확신합니다. 코드를 짜고 있다면 설령 혼자 짜더라도 정리된 버그 명세 데이타베이스를 가지고 있지 않다면 낮은 질의 코드로 제품을 출시할 것입니다.
많은 프로그래머들이 머리로 버그들을 모두 기억할 것이라고 생각합니다. 말도 안되는 이야기입니다. 제 경우에는 한번에 2~3개의 버그밖에 기억을 못하고,
다음날이 되거나 출시를 위해 급해지면 전부 잊어버리게 됩니다. 버그를 제대로 트래킹해야합니다.
버그 데이타베이스는 복잡할 수도 있고, 간단할 수도 있습니다. 최소한으로 갖추어야할 요소는 다음과 같습니다:
- 버그를 완벽하게 재현할 수 있는 과정
- 버그가 없었다면 이루어졌어야할 결과(동작)
- 버그로 인하여 생긴 결과(동작)
- 누가 이 버그에 할당되어 있는지
- 고쳐진 버그인지 아닌지
버그 데이타베이스를 사용하지 않는 이유가 제품들이 너무 복잡해서라면, 이것들을 포함한 5컬럼의 테이블을 만들어서 사용하기 시작하세요.
버그 트래킹에 관해 더 읽으려면, Painless Bug Tracking을 읽으세요.
5. 새로운 코드를 작성하기 전에 버그들을 잡습니까?
마이크로소프트 Windows용 Word의 첫 버젼은 죽음의 프로젝트였습니다. 끝이 없었습니다. 계속해서 스케줄을 펑크냈습니다.
팀 전체는 말도 안되는 시간동안 일했고, 계속해서 연기되고 또 연기되었습니다. 그 스트레스는 엄청났습니다.
빌어먹을 제품이 몇년 후에 출시되었을때, 마이크로소프트는 팀 전원을 Cancun으로 휴가보내고, 이 원인을 분석하기 시작했습니다.
그들이 깨닫게 된 것은 프로젝트 매니저들이 스케줄을 너무 강요하였기 때문에 프로그래머들은 코딩을 빨리 할 수 밖에 없었습니다.
게다가 버그를 고치는 단계는 스케줄에 아예 존재하지 않았습니다. 결과적으로 질이 아주 나쁜 코드를 만들게 되었습니다.
버그 갯수를 줄이려는 노력은 전혀 하지 않았습니다. 한 프로그래머는 텍스트의 높이를 계산하는 루틴 대신에 “return 12;”로 대체하여
버그 리포트로부터 이 값이 어떤 영향을 주었는지를 알고자 했습니다. 스케줄은 단지 버그일 수 밖에 없는 기능들을 모아 놓은 체크리스트였습니다.
나중에 이 상황을 “무한 결함 방식(infinite defects methodology)”이라고 이름지었습니다.
문제를 해결하기 위해서 마이크로소프트는 반대의 “무결함 방식(zero defects methodology)”라는 방식을 체택했습니다.
많은 프로그래머들은 경영진들의 명령에 의해서 버그 갯수를 줄일 수 있다고 생각했음직한 이 방식의 이름 탓에 이를 비웃었습니다.
하지만 실제로는 “무결함(zero defects)”이라는 이름은 주어진 시간에 가장 우선순위가 높은 것은 코딩하기전에 버그를 잡는 것이란 사실을 지칭하는 말이었습니다.
이유는 다음과 같습니다.
일반적으로 버그를 고치지 않고 방치하는 시간이 길어지면 길어질수록 고치는데 더 많은 시간과 금전이 요구된다는 것입니다.
예를 들면, 오타나 문법오류등은 컴파일러가 쉽게 잡아서 고치는데도 별로 문제가 되지 않습니다.
만일 버그가 처음 실행시에 발생하여 보이게 되면, 모든 코드가 머릿속게 생생하게 존재하기에 바로 고칠 수 있을 것입니다.
며칠전에 작성한 코드에서 버그를 찾게 되면 이를 고치기 위해 조금 시간이 더 걸릴 것입니다.
아마도 코드를 다시 보게 되면 대부분의 내용이 기억나고 적정한 시간내에 버그를 고칠 수 있을 것입니다.
하지만 몇달전에 작성한 코드에서 버그가 발견된다면 이미 그 코드에 관해서 많은 것이 이미 생각나지 않을 것이고, 고치기도 상대적으로 힘들 것입니다.
그때쯤 되면 다른 사람의 코드를 수정하고 있는 와중일지도 모르고, 그사람은 Aruba로 휴가를 떠나있을지도 모릅니다. 이렇게 된다면 버그를 고치는 것은 기술을 익히는 것같이 되어버릴 것입니다. 천천히 꼼꼼하게 그리고 주의 깊게 코드를 살펴봐야 하고, 물론 문제를 해결하는데에 얼마나 걸릴지 정확하게 판단하기 힘든 상황이 될 것입니다.
게다가 이미 출하된 코드에서 버그를 발견한다면, 이를 고치는데에 큰 대가를 치뤄야할지도 모를 것입니다.
이렇게 시간이 적게 들기 때문이라는 이유가 하나의 이유가 됩니다.
또다른 이유는 버그를 수정하는데 걸리는 시간을 예상하는 것보다는 새로운 코드를 작성하는데 걸리는 시간을 예상하기가 훨씬 쉽기 때문입니다.
예를 들면, 내가 당신에게 리스트를 소트하는 코드를 만드는데 얼마나 걸리냐고 물어본다면, 꽤 정확한 대답을 할 수 있을 것입니다.
그렇지만, 질문을 바꿔서 당신의 코드가 Internet Explorer 5.5만 설치되어있으면 동작하지 않는 버그를 고치는데 걸리는 시간을 묻는다면, 문제가 무엇인지도 모르는 상황이기 때문에 얼마나 걸릴지 추측하지도 못할 것입니다. 3일이 걸릴 수도 있을 것이고, 운좋으면 2분이 걸릴 수도 있을 것입니다.
이것이 의미하는 바는 고쳐야할 버그가 많이 존재하는 상태의 스케줄이라면 그 스케줄은 정확할 수가 없다는 것입니다.
그렇지만 이미 알고있는 버그들은 모두 고친 상태라면 그 스케줄은 상대적으로 상당히 정확하게 지킬 수 있는 스케줄일 것입니다.
버그 갯수를 0에 가깝게 하는 또하나의 좋은 점은 경쟁에서 훨씬 빠르게 대응할 수 있다는 것입니다.
어떤 프로그래머들은 이를 두고 제품을 바로 출하할 수 있는 항상 유지하는 것이라고 이야기합니다.
경쟁자가 고객들을 가로채갈만한 굉장히 좋은 기능을 새로 만들었다면 축척된 많은 버그를 수정할 필요없이 바로 이 기능을 추가할 수 있을 것입니다.
6. up-to-date(최신) 스케줄을 가지고 있습니까?
비즈니스에 당신의 코드가 조금이라도 중요한 부분이라면, 코드가 언제쯤 완성될 수 있는지를 아는 것 또한 중요하다는 것은 당연할 것입니다.
프로그래머들은 엉터리 스케줄을 만드는데 악명이 높습니다. “언젠가는 될꺼야!”하고 외칩니다.
불행하게도 그런 식으로는 해결할 수 있는것은 없습니다. 비즈니스에는 코드를 출하하기 전에 데모, 전시회, 광고등등 미리 많은 것들을 판단하여 결정해야합니다.
이를 할 수 있는 단 한가지 방법은 스케줄을 가지고 이를 계속해서 현실적으로 최신내용으로 유지하는 것입니다.
스케줄을 가져야하는 또다른 중요한 이유는 이를 통해서 어떤 기능이 필요한지를 결정하게끔 만들어준다는 것입니다.
때문에 어떤 기능이 덜 중요한지 결정해야하고 featuris 가 되기 전에 이들을 포기하도록 합니다.
스케줄을 관리하는 것이 어려울 필요는 없습니다. 제 글Painless Software Schedules 에 좋은 스케줄을 만드는 간단한 방법을 설명하였습니다.
7. spec(설계서)를 가지고 있습니까?
스펙을 만드는 것은 이빨을 쑤시는것과 같습니다: 모든 사람들이 좋다고 인정하지만, 아무도 하지 않습니다.
왜 그런 현상이 일어나는지는 정확히 모르겠습니다만, 아마도 프로그래머들이 문서를 만드는 것을 굉장히 싫어하는데에 기인하는 것 같습니다. 그 결과로, 프로그래머밖에 없는 집단에서 한가지 문제를 해결하고자 하면, 이들은 문서를 만들기 보다는 코드로 자신들의 의견을 표명하려 합니다. 스펙을 먼저 만들기보다는 차라리 코드를 짜서 보여주는 것을 택한다는 것입니다.
설계 단계에서 문제를 발견하면 몇줄을 고쳐서 이를 수정할 수 있습니다. 그렇지만 코드가 짜여진 상황이라면 이 문제를 수정하는 댓가는 감정적으로나(코드를 그냥 버리는 것을 좋아하는 사람은 없습니다) 시간적으로나 훨씬 높게 되고 더 힘든 작업이 되어버립니다. 스펙을 통해서 만들어지지 않은 소프트웨어는 대개 설계가 잘못되어 스케줄을 엉망으로 만들어놓습니다. Netscape에서도 이런 문제로 인해 브라우저의 초기 네개의 버젼이 너무 엉망이 되어 결국 관리자들이 멍청하게도 코드를 전부 버리고 다시 짜도록한 결정을 내려버리게 되는 상황이 벌어졌습니다. 거기다 한술 더 떠서 Mozilla에서 이런 실수를 다시 반복하여 겨우 Alpha 단계에 가는데 몇년이라는 시간이 걸리게 되었습니다.
필자의 지론은 이 문제는 프로그래머들이 문서를 작성하는데 거부감이 없도록 작문 강의를 듣도록 보내는 것으로 해결할 수 있다는 것입니다. 다른 해결책이라면 스펙같은 문서 작성에 능숙한 관리자를 두는 것입니다. 두 경우 모두 “스펙없는 코드는 금물”이라는 간단한 규칙을 따라야 할 것입니다.
저의 4부짜리 글에 스펙 작성하는 요령에 대해 이야기했습니다.
8. 프로그래머들이 조용한 작업환경을 가지고 있습니까?
지식 근로자에게 공간, 조용함, 프라이버시를 줌으로해서 많은 생산성 향상을 얻는다는 것은 이미 증명된 사실입니다.
소프트웨어 관리의 고전인 Peopleware에서는 이 생산성 향상에 대해 자세히 기술합니다.
문제는 여기에 있습니다. 지식 근로자는 “in the zone”상태라고도 하는 “flow”상태에 들어섬으로써 가장 최상의 상태가 되어 일에 완벽히 집중하고 외부에 개의치 않게 됩니다. 완벽한 집중으로 시간 가는 것을 잊고 좋은 결과를 내게 됩니다. 이때에 바로 대부분의 생산적인 일들을 처리하게 됩니다.
작가, 프로그래머, 과학자 그리고 심지어 농구선수들까지도 “in the zone”상태가 있음을 이야기할 것입니다.
문제는 “zone”으로 들어가는 것이 쉽지 않다는 것입니다. 측정해보면, 최상의 생산성으로 일을 하기 위해서는 평균 15분이 걸립니다.
하지만 어떤 경우에는 피곤하고 이미 많은 일을 한 상태에서 “zone”상태에 들어가지 못하고 다른 일을 하거나 웹서핑이나 테트리스로 시간을 허비하게 될 수도 있습니다.
또다른 문제는 “zone”상태에서 빠져나가는 것이 매우 쉽다는 것입니다. 잡음, 전화소리, 점심식사, 잠시 스타벅스에 5분간 갔다오는 것 그리고 특히 동료에 의한 방해등에 의해 바로 “zone”에서 빠져나가게 됩니다. 동료가 1분이라는 짧은 시간 동안이라도 질문을 하여 “zone”상태에서 빠져나간다면 다시 되돌아가기 위해서 30분이 넘는 시간이 걸려 전체 효율에 치명적인 영향을 미칠 수 있습니다. 카페인 가득한 닷컴 회사들이 좋아하는 합숙소같은 곳에 옆의 마케팅 부서에서 계속해서 오는 전화에 대고 소리지르는 그런 시끄러운 환경이라면 계속된 방해로 지식 근로자들의 생산성은 추락하여 “zone”상태에 절대 이르지 못할 수도 있습니다.
프로그래머들에게 있어서 특히 어렵습니다. 생산성은 단기적인 기억력으로 한번에 얼마나 많은 작은 세부사항들을 다루느냐에 달려있습니다.
어떠한 방해도 이런 세부사항들을 잊어버리게 할 수 있습니다. 일을 다시 재개하면 그것들을 다시 기억하지 못하여 (사용하던 지역변수나 검색 알고리즘을 만들던 중에 어디에서 멈줬었는지등) 다시 찾아보게 되고, 이로 인해 다시 속도가 붙을때까지 느려지게 됩니다.
직관적으로 계산해보면 다음과 같습니다. 만일 프로그래머가 단 1분이라도 방해를 받아서(명백한 근거에 의해) 15분의 생산성을 날려버린다고 합시다. 철수와 영희 두 프로그래머가 낮은 칸막이로 주욱 늘어선(a standard Dilbert veal-fattening farm) 열린 사각 파티션 옆자리에 앉아 있다고 합시다. 영희가 strcpy함수의 유니코드 버젼 이름을 잊었습니다. 30초면 찾아볼 수 있겠지만, 철수한테 물어보면 15초가 걸립니다. 그래서 바로 옆에 앉아 있는 철수에게 묻습니다. 철수는 산만해지고 – 영희의 15초를 아끼기 위해 – 15분을 낭비하게 됩니다.
이번에는 벽과 문으로 나뉘어진 별도의 사무실로 가정을 합시다. 여전히 영희는 함수를 기억하지 못합니다. 다시 찾아보는 것으로 30초를 보낼 수 있을 것이고 옆 방에 있는 철수에게 물어보기 위해서 (일반적인 프로그래머의 평균 물리적인 건강상태를 봐서는 쉽지 않은) 일어나서 걷는 것을 포함한 45초를 보낼 수 있을 것입니다. 결국 찾아보는 것을 선택하여 30초를 보내게 되지만 철수의 15분을 벌어주게 됩니다. 대단하죠!
9. 돈이 허락하는 한도내의 최고의 툴들을 사용하고 있습니까?
컴파일 되는 언어로 코드를 작성하는 것은 여전히 아무 PC에서 할 수 없는 것 중의 하나입니다. 컴파일을 하는데 몇초 이상 걸린다면 최상의 기종을 사용함으로써 시간을 절약할 수 있을 것입니다. 15초 이상 걸린다면 지루해서 그 시간동안 The Onion을 읽게 될 것이고 너무 재미있는 관계로 거기에 빠져 수시간의 생산성을 날려버릴 것입니다.
모니터 하나로 GUI코드를 디버깅한 것은 불가능하지는 않지만 고통스러운 작업입니다. GUI코드를 작성하고 있다면, 2대의 모니터로 훨씬 쉬운 작업을 할 수 있을 것입니다.
대개의 프로그래머들은 아이콘이나 툴바를 위해 비트맵을 수정해야하고 대부분의 프로그래머 역시 좋은 비트맵 에디터를 가지고 있지 않습니다. 마이크로소프트에서 기본적으로 제공하는 Paint 프로그램으로 비트맵을 수정하는 것은 웃긴 일이지만 대부분 이렇게 하고 있습니다.
필자의 가장 최근 직장에서 시스템 관리자가 계속해서 자동적으로 스팸을 보냈습니다. 이유인 즉슨 220MB이상의 하드드라이브를 사용하고 있다는 것이었습니다. 필자는 요즘 HD가격을 본다면 이 공간의 환산된 가격은 내가 이용하는 화장실 휴지보다 싸다는 것을 지적했습니다. 디렉토리를 정리하기 위해 10분을 허비하는 정도로도 큰 생산성 저하일 것입니다.
“최고의 개발팀은 절대 그들의 프로그래머들을 고문하지 않습니다!” 후진 제품으로 인한 작은 불편함이 쌓여서 프로그래머들이 불만에 찰 수도 있습니다. 그리고 그로 인한 불만에 찬 프로그래머는 비생산적인 프로그래머이기 쉬울 것입니다.
이런 것들을 모두 종합하면 프로그래머들은 최고/최신의 것들로 쉽게 매수된다는 뜻이 됩니다. 이는 높은 연봉을 주는 것보다는 훨씬 싼 방법일 것입니다!
10. 테스터들을 고용하고 있습니까?
팀이 최소한 2~3명의 프로그래머에게 테스팅만 전담하는 테스터가 할당되어 있지 않다면, 버그가 많은 제품을 출하하고 있거나 시간당 $100짜리 프로그래머에게 시간당 $30의 일을 시키는 낭비를 하고 있는 것입니다. 테스터를 고용하는 것이 낭비로 생각하는 것은 정말 잘못된 계산을 하고 있는 것이며, 많은 사람들이 이를 깨닫지 못하고 있는데에 놀랍니다.
이에 관해 더 자세히 알고자 한다면 Top Five (Wrong) Reasons You Don’t Have Testers 를 읽으십시오.
11. 신입사원들은 면접때 코드를 직접 짜는 실기시험을 봅니까?
마법사를 고용하는데 그의 마법을 보지 않고 고용하시겠습니까? 당연히 그렇지 않겠죠.
결혼식에 요리사를 고용하는데 요리사가 만든 요리의 맛도 모르고 고용하시겠습니까? 그렇지 않을것입니다.(역자주: 실제로 결혼식장 요리사의 맛을 보는 비유는 우리나라에 맞지 않을 것 같네요. 이 문구의 뜻만 이해하세요)
하지만 현실에서는 매일 인상적인 이력서나 면접에서 맘에 든 이유로 고용하는 일들이 일어납니다. 혹은 (“CreateDialog()와 DialogBox()의 차이점은 무엇입니까”)등의 문서만 보면 알 수 있는 사소한 질문으로 채용하기도 합니다. 프로그래머를 채용하는데 있어서 중요한 것은 그런 사소한 것들을 얼마나 많이 외웠느냐가 아니고 코드를 잘 작성할 수 있느냐입니다. 혹은 “아하!”류의 질문으로 채용하기도 합니다. “아하!”류의 질문이란 답을 알면 간단하지만 모르는 경우에는 절대 맞출 수 없는 질문을 이야기합니다.
제발 이런 방식을 그만 두십시오. 면접때 무얼해도 상관없지만 반드시 코드를 작성하도록 해야합니다.(더 많은 것을 알고 싶다면 Guerrilla Guide to Interviewing를 읽으십시오)
12. hallway usability testing(무작위 사용성 테스팅)을 하십니까?
무작위 사용성 테스트(hallway usability test)는 복도를 지나가는 다음 사람을 붙잡고 방금 짠 코드를 사용하게 하는 방식입니다. 5명에게 이 테스트를 한다면 95%의 사용성 문제에 대해 배울 수 있을 것입니다.
좋은 사용자 인터페이스 설계는 생각처럼 어려운 것이 아니고 사용자들이 당신의 제품을 구입하고 사용하게 하는데 있어서 절대적으로 중요합니다. 짧은 프로그래머 입문서로 UI 설계에 관해 필자가 쓴 무료 온라인 책을 읽어보실 수 있습니다.
하지만 사용자 인터페이스에서 제일 중요한 것은 많은 사람들에게 당신의 프로그램을 보여주면(5~6명이면 충분합니다) 제일 큰 문제점을 빠른 시간에 발견할 수 있다는 것입니다. Jakob Nielsen의 글에서 그 이유에 대한 설명을 찾을 수 있습니다. UI 설계 경험이 별로 없다고 하더라도 – 비용이 전혀 들지 않는 – 무작위 사용성 테스트를 한다면 당신의 UI는 훨씬 좋아질 것입니다.
Joel Test를 사용하는 4가지 방식
- 자신이 속한 소프트웨어 팀의 점수를 매기고 그것에 대해 언급할 수 있도록 결과에 대한 이유를 필자에게 알려주십시오.
- 프로그래머 팀의 관리자라면, 당신의 팀이 최대한 잘 운영될 수 있는지 확인할 수 있는 지표로 사용하십시오. 12점을 받기 시작하면 프로그래머들을 간섭없이 그냥 두고 비즈니스쪽 사람들이 그들을 간섭하지 못하게 하는데에 모든 시간을 할 수 있습니다.
- 프로그래머 일을 맡을지를 결정해야하는 상황이라면 그 팀의 친한 사람에게 이 테스트 결과가 어떤지를 물어보십시오. 결과 점수가 너무 낮다면 이를 고칠 수 있는 권한을 받을 것인지를 확인하십시오. 그렇지 않으면 불만과 스트레스에 빠질 것입니다.
- 프로그래밍 팀을 평가하여야 하는 투자자이거나 당신의 회사가 다른 소프트웨어 회사와 합병을 한다면 이 평가가 급한대로 괜찮은 지표가 될 것입니다









최근 댓글