<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Mimul's Developer World</title>
    <link>http://mimul.com:80/pebble/default/</link>
    <description>미물의 개발 세상</description>
    <language>ko</language>
    <copyright>미물</copyright>
    <pubDate>Sun, 16 Jun 2013 12:21:50 GMT</pubDate>
    <dc:creator>미물</dc:creator>
    <dc:date>2013-06-16T12:21:50Z</dc:date>
    <dc:language>ko</dc:language>
    <dc:rights>미물</dc:rights>
    <image>
      <title>Mimul's Developer World</title>
      <url>http://mimul.com:80/pebble/default/</url>
    </image>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Smartmob" /><feedburner:info uri="smartmob" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Smartmob</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
      <title>비즈니스 부트스트랩에 필요한 10가지 필수 리소스</title>
      <link>http://feedproxy.google.com/~r/Smartmob/~3/fLdq13BCxOE/1371385310541.html</link>
      <content:encoded><![CDATA[본 포스트는 매셔블에서 작성한 <a href="http://mashable.com/2012/09/29/bootstrapping-business-tools/">"10 Essential Resources for Bootstrapping Businesses"</a> 아티클을 기초로해서 발번역한 내용입니다. 스타트업을 시작하시려는 분, 시작하고 계신분들에게 좋은 도움이 될 꺼 같아 일부를 번역해 보았습니다. 자세한 내용은 아래를 참고하세요.<br/><br/>
Mashable이 부트 스트랩 비지니스 시리즈에서 많은 기업가들이 어떻게 사업을 시작했는지, 어떤 툴들을 사용했는지, 사업 초기에 무엇을 알고자 했는지 등을 기업가들에게 질문을 했는데, 그 결과 자금을 조달하거나, 기술 스타트업을 시작하거나, 브랜딩을 구축하고자 하는 기업가에게 도움이 되는 많은 힌트와 트릭이 있었다.<br/>
훌륭한 직원의 선별에서부터 최고의 근무 환경까지의 작은 의사결정들이 모여 롱런이라는 성공으로 이끌 것이다. 아래는 10개의 든든한 지침들을 보기 바란다.<br/>
<br/>
<b>1. 기업가가 회사를 시작하기 전에 알아두고 싶은 것</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup1.jpg" border="0" align="left" hspace="10" />
기업가의 길은 쉽지는 않다. - 제품을 개발하고, 사업 규모도 결정하고, 고객을 확보하는 일과 같은 것들은 끊임없이 정신없고, 야망이나 열정을 엄청 필요로 하는 험악한  일들이다. 그리고 당신이 그러한 품성을 모두 확실히 가지고 있다 해도, 당신의 사업은 실패할 가능성이 훨씬 많다.<br/>
하지만, 1/12 정도의 스타트업들은 성공할지도 모른다. 그리고 이 사업들은 건강하고, 성장성이 있으며 때론, 이익을 가져올 수도 있다. 그러나, 그 길이 평탄하리라고는 말할 수 없다. 우리는 스타트업 창업자들이 알고자 했던 것들을 물었다. 당신과 당신의 스타트업이 가진 치명적인 결함을 해결할 수 있도록 도와줄 수 있었으면 한다.<br/>
<br/>
<a href="http://mashable.com/2012/07/23/startup-founder-tips/">더 많은 조언들은 여기에..</a><br/>
<br/>
<b>2. 아름답고 기능적인 회사를 꾸미기 위한 10가지 팁</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup2.jpg" border="0" align="left" hspace="10" />
만약 당신이 집에서 일한다면 적합한 사무 공간을 만들 필요가 있다. 집에서의 삶(개인 공간)과 별도로 집중할 수 있는 장소를 마련하는 것은 필수적이다. 그리고 시간을 보내는데 아주 나이스하면 더 좋을 것이다. 만약 당신이 소규모 사업을 집 이외의 장소에서 한다면 좋은 작업 공간은 더욱 중요하다.<br/>
보다 전문적인 식견으로 당신을 돕기 위해 우리는 몇가지 유용한 팁을 경험있는 홈 작업자이면서 홈 오피스 전문가인 <a href="http://workingnaked.com/">WorkingNaked.com</a> 설립자 Lisa Kanarek와 함께 이야기 했다.<br/>
<br/>
<a href="http://mashable.com/2012/07/30/tips-home-office/">여기를 보면 회사를 좋게 꾸미는 방법들이 소개되어 있다.</a><br/>
<br/>
<b>3. 고객을 많이 확보하기 위한 4가지 방법</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup3.jpg" border="0" align="left" hspace="10" />
일단 당신의 스타트업이 시장에 나오게 되면, 축하를 받을만하다. 하지만, 그것은 시작에 불과하다. 다음 단계는 성장이다. 간접적으로 유저를 유치하고, 추가 고객을 더 확보해야 한다. 당신의 제품이 잘 작동하고 몇명의 행복한 사용자와 고객을 보유하게 된다. 그러면, 어떻게 하면 그들의 사용자에게 확산을 시킬것인가?<br/>
초기 단계의 스타트업이 직면하는 도전은 유일하다. 과금 사용자로 이끄는 가장 효과적인 진입점을 결정하려고 해도 네트워크 힘을 사용하여 정보를 확산해 주는 사용자 기반이 존재하지 않는다. 또한 많은 스타트업들은 PR 직원을 고용하기엔 너무 작다. 그리고 대부분의 창업자는 미디어에 도달하기 위한 최상의 전술조차 모른다. 좋은 뉴스가 있으면 전통적인 정보 소스에 의존하지 않고도, 소셜 미디어가 잠재 고객에 도달하게해 주었다. 그리고 가끔 이런 전술은 아주 잘 작동한다.<br/>
<br/>
<a href="http://mashable.com/2012/08/06/grow-customer-base/">여기를 보면 고객 확보에 좋은 방법들이 있다.</a><br/>
<br/>
<b>4. 린스타트업들을 위한 4가지 고용팁</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup4.jpg" border="0" align="left" hspace="10" />
회사를 처음 시작했을때, 할 일은 산더미처럼 있다. 공동 창업자와 직원들이 여러 가지 업무가 뒤죽박죽으로 진행되기 십상이다. 이런 상황에서 한가지 솔루션은 새로운 사람을 고용하고, 권한을 위임하고 자신은 그것에 대해 자시 걱정하지 않게 하는 것이 간단한 해결책인 것 같다. 고용으로 인해 많은 사람들이 빨리, 많은 일을 하게 되는 의도된 결과를 그럴듯하게 가져오기 때문에 자금 조달후에 고용은 중요하다.<br/>
그러나, 린 스타트업 방법론의 창시자 Eric Ries에 따르면 이것은 항상 올바른 것은 아니다. 그는 "팀이나 프로젝트에 사람을 늘리는 것은 커뮤니테이션 오버 헤드가 증가하게 되어 관련된 모든 사람들의 생산성을 낮춘다."고 설명한다.<br/>
린 스타트업 방법론을 따를 때, 대부분 느려지는 것은 아니다. Ries가 말하는 요점은 이렇다. 효과적으로 실행하고 있으면 팀에 충돌은 일어나지 않는다. 적합한 사람을 찾아내는 것이 가장 중요하며,이를 위해서는 기다림도 가치있는 일이다.<br/>
<br/>
<a href="http://mashable.com/2012/08/13/recruit-lean-startup/">여기를 보면 좋은 방법들이 기술되어 있다.</a><br/>
<br/>
<b>5. 소규모 비즈니스에서 Freemium 전략을 잘 활용하는 6가지 방법</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup5.jpg" border="0" align="left" hspace="10" />
스타트업 부트스트랩에서 가장 어려운 일 중에 하나는, 빠른 성장과 자원의 효율화와 활용이다. 그리고 이를 위한 가장 좋은 방법으로 고가 정책을 쓰는 것은 도움이 되지 못한다. 특별히 여러분이 꿈꾸던 앱이 한 번의 클릭으로  쓸 마음이 사라졌음을 느낄 때, 가격에 속았다고 쉽게 생각하게 된다.<br/>
하지만, 실망하지 마라. 지난 몇 년 동안, 스타트업들은 소위 "freemium"모델로 이익을 내고 있다. 앱의 기본 기능을 무료로 제공하고, 그런 후 프리미엄 기능과 큰 저장 용량에 요금을 부과하는 것이다. 전형적인 예로는 뉴스 레터 플랫폼이다 <a href="http://mailchimp.com/">MailChimp</a>이 있다. 일정 인원까지는 무료이지만, 사용자 기반과 사업이 확대되면 가입자의 수에 따라 비용이 증가한다. freemium 옵션의 잇점은 예산을 적게쓰면서, 꿈꾸는 회사의 형태를 실현할 수 있게 할 수 있다.<br/>
그러나 freemium 모델을 선택하는 것은 자동으로 만족을 보장하는 것은 아니라는 점을 중요하게 생각해야 한다. 여기에서 freemium 시스템에서 위험을 헤지하기 위한 팁과 트릭을 소개한다. 그리고 거액의 VIP와 같은 이익도 드릴 것이다.<br/>
<br/>
<a href="http://mashable.com/2012/08/20/freemium-small-business-tips/">여기를 보면 좋은 방법들이 기술되어 있다.</a><br/>
<br/>
<b>6. 기업가들을 위한 10가지 필수 도구들</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup6.jpg" border="0" align="left" hspace="10" />
많은 기업가들은 그들이 대기업 위치에 있었을 때보다 스타트업을 운영하면서 더 재너럴리스트가 된다. 그래서 기업가들은 전문적인 도구를 필요로하게 된다. 특정 업무 중심의 어플리케이션이나 프로그램은 작동되지 않는다.<br/>
할 일이 많이 있을 때, 생산성은 빼놓을 수는 없다. 시간은 돈이다. 그래서 앱이 당신을 더 빠르게 행동할 수 있도록 도와주기 때문에 돈을 주고 사는 것은 가치가 있다. 커뮤니케이션 및 협업 프로세스를 효율적으로 하고, 팀 동료들과의 일에서 오는 충돌을 줄이는 앱도 존재한다.<br/>
물론, 일만하고 놀지 말라는 기업가는 없다. 당신의 뇌를 쉬게 하고, 우리의 힘을 집중하기 위해서 적당한 휴식을 취하는 것은 중요하다.<br/>
<br/>
<a href="http://mashable.com/2012/08/27/entrepreneur-toolkit/">여기를 보면 좋은 도구들이 기술되어 있다.</a><br/>
<br/>
<b>7. 프로처럼 예산을 꾸리는 4가지 방법</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup7.jpg" border="0" align="left" hspace="10" />
예산에 관해 이야기하는 것을 좋아하는 사람은 없다. 또한 예산을 책정하는 것은 귀찮은 일이다. 하지만 이모든게 매우 중요하다는 것은 동의를 할 것이다.<br/>
예산을 쉽고 빠르게 수립할 수 있는 소프트웨어를 런칭한 회사가 몇몇 있다. 또한, Twitter나 Quora같은 사이트에서 비슷한 기업가들과 커뮤니케이션하면 적절한 피드백을 얻을 수 있다. 그러면, 당신은 필요하지 않은 서비스에 돈을 지불하는 일은 없게 된다. 아래 전문을 읽고나면, 스트레스 없이 회사의 재무 상태를 관리할 수 있다.<br/>
<br/>
<a href="http://mashable.com/2012/09/04/budget-startup-tips/">여기를 보면 좋은 방법들이 기술되어 있다.</a><br/>
<br/>
<b>8. 싸게 브랜드를 구축하기 위한 8가지 팁</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup8.jpg" border="0" align="left" hspace="10" />
사업을 시작할 때, 처리해야할 것, 생각해야할 것들이 너무도 많다. 당신의 (성장하는)팀, 지적 재산권, 제품 관리, 예산 부족 속에서, 당신은 기업가 정신의 바다를 항해하고 있다.<br/>
그러나, 돈이 수중에 없어도 당신의 브랜드 노출시킬 수 있다. 모든 소셜 미디어 툴은 스타트업 홍보에 좋은 도구이다. 주로 Facebook , Twitter , Tumblr, Instagram , YouTube, Pinterest 등이 주요 키지만, 그 외에도 좋은 인상을 심어줄 수 있는 도구들이 많다. 우리는 저가로 당신의 브랜드를 구축할 수 있는 8가지 방법을 정리했다. 왜냐하면 당신의 제품이나 재능처럼, 그 밖에도 시간과 돈을 투자할 중요한 것들이 있기 때문이다.<br/>
<br/>
<a href="http://mashable.com/2012/09/10/cheap-branding/">여기를 보면 좋은 방법들이 기술되어 있다.</a><br/>
<br/>
<b>9. 소규모 기업들을 위한 기술 업그레이드 7가지 방법</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup9.jpg" border="0" align="left" hspace="10" />
세상에는 빛나는 새로운 기술보다 더 좋은 것은 없다. 하지만, 모두가 새로운 랩탑, 테블릿, iPhone이 발매될 때마다 모두가 과시욕을 가지는 것은 아니다.<br/>
기존 하드웨어에 강력한 메커니즘을 넣기 위해 시장에서 가능한 많은 기술 업그레이드와 액세서리를 가지고도, 간단한 기능을 일부 도입하는 것만으로도 시간과 돈을 절약하고 많은 성가신 문제들을 해결해 주는 것이 중소 기업에게는 보편화된 일이다.<br/>
예를 들어, 몇몇 중소 기업은 모바일 디바이스로 유선 시스템을 사용하여 더 쉽고 값 싼 전화 회의나 화상 회의를 할 수 있게 했다. <a href="http://mashable.com/2012/09/29/bootstrapping-business-tools/www.invoxia.com/en/products/audioffice/">Invoxia의 AudiOffice</a>는 iPhone, iPod, iPad 등의 디바이스 용 스피커 부착 독을 주요한 특징을 가지고 있다. Skype와 FaceTime등의 앱 덕분에 채팅이 가능해 중소 기업의 커뮤니케이션 비용을 줄일 수가 있었다.<br/>
<br/>
<a href="http://mashable.com/2012/09/19/small-biz-tech/">여기를 보면 좋은 기술들이 기술되어 있다.</a><br/>
<br/>
<b>10. 스타트업이 직원 자기 부담의 기술들을 활용하는 4가지 방법</b><br/>
<img src="http://mimul.com/pebble/default/images/blog/enterprise/startup10.jpg" border="0" align="left" hspace="10" />
BYOD (Bring Your Own Device) 즉, "자기 자신의 디바이스를 회사에 가져와 사용"하는 개념으로 최근 스타트업에서 유행하는 방법으로 주목 받고 있다. 많은 대기업과 중소 기업이 기꺼이 이런 개념을 도입하려 하는 것은 어쩌면 당연한지 모르겠다. 직원에게 자신의 디바이스를 업무에 활용하여 준다면 엄청난 비용 절감 된다.<br/>
하지만, 절약에 너무 집착하지 마라. 그렇지 않으면 리스크 속에 자신을 노출하게 된다. 이럴수록 편리하고 절약 효과에 도취해 기업이 형편 없는 관리와 빈약한 정책에 의해 망할수도 있다. BYOD 정책과 함께 생기난 미지의 요소에 대해 비평가들은 BYOD는 "Bring Your Own Disaster"(재해를 가져온다)라고 부르기까지 한다. 좋은 의도가 심각한 보안 위반이나 적합성의 문제를 악화시켜 버린다는 것을 쉽게  상상할 수 있을 것이다..<br/>
BYOD로 전환하려고 검토 중라면, 저책을 작성하고 실시할 때 염두에 두어야 4가지 사항에 대해 소개한다. 그러나, 기업의 취향과 문화는 다르다는 것을 명심해야 한다. 그래서 자신의 회사에 있던 BYOD 시스템을 개발하기 위한 가이드라인으로 필요한 부분을 이용하자.<br/>
<br/>
<a href="http://mashable.com/2012/09/24/byod-tech-business/">여기를 보면 좋은 방법들이 기술되어 있다.</a><br/>
<br/>
<br/>
<b>[참고 사이트]</b><br/>
<ul>
<li><a href="http://mashable.com/2012/09/29/bootstrapping-business-tools/">10 Essential Resources for Bootstrapping Businesses</a></li>
</ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Smartmob?a=fLdq13BCxOE:srtHE6G-v54:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=fLdq13BCxOE:srtHE6G-v54:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=fLdq13BCxOE:srtHE6G-v54:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=fLdq13BCxOE:srtHE6G-v54:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=fLdq13BCxOE:srtHE6G-v54:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=fLdq13BCxOE:srtHE6G-v54:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=fLdq13BCxOE:srtHE6G-v54:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=fLdq13BCxOE:srtHE6G-v54:KwTdNBX3Jqk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=fLdq13BCxOE:srtHE6G-v54:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=fLdq13BCxOE:srtHE6G-v54:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=fLdq13BCxOE:srtHE6G-v54:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=fLdq13BCxOE:srtHE6G-v54:wF9xT3WuBAs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Smartmob/~4/fLdq13BCxOE" height="1" width="1"/>]]></content:encoded>
      <category domain="http://mimul.com:80/pebble/default/categories/Enterprise/">Enterprise 2.0</category>
      <category domain="http://mimul.com:80/pebble/default/tags/startup/">startup</category>
      <pubDate>Sun, 16 Jun 2013 12:21:50 GMT</pubDate>
      <guid isPermaLink="false">tag:mimul.com,2013-06-16:default/1371385310541</guid>
      <dc:date>2013-06-16T12:21:50Z</dc:date>
    <feedburner:origLink>http://mimul.com:80/pebble/default/2013/06/16/1371385310541.html</feedburner:origLink></item>
    <item>
      <title>MQTT Packet 모니터링</title>
      <link>http://feedproxy.google.com/~r/Smartmob/~3/Oh1Ywyi_KCc/1371094782475.html</link>
      <content:encoded><![CDATA[<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; color: rgb(25, 42, 63); line-height: 19px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(25, 42, 63); clear: left; "><b>Wireshark 준비</b></h3>
Wireshark은 패킷을 캡쳐해 주는 도구라는 것을 왠만한 개발자면 모두 알 것이다. 이 도구를 통해서 MQTT 3.1 스펙에 대해서 분석하는데, 도움을 받기 위해서 사용한 내용을 설명한다.<br/><br/>
Wireshark의 패킷 필터링을 통해 패킷을 보기 위해서는 먼저 프로그램을 설치하고 로우 패킷을 보는 것은 정말 어려운 일이기에 헤더가 정의되어 사용자가 보기 쉽게 해석해 주는 플러그인이 있는데, 그것까지 설치를 해야한다.<br/>
<br/>

<b>1. Wireshark 설치</b><br/>
- 다운로드 사이트 : <a href="http://www.wireshark.org/download.html">http://www.wireshark.org/download.html<a/><br/>
<br/>
<b>2. Wireshark Generic Dissector 플러그인 설치</b><br/>
- 다운로드 사이트 : <a href="http://wsgd.free.fr/download.html">http://wsgd.free.fr/download.html</a><br/>
- 플러그인 설치<br/>
&nbsp;&nbsp;&nbsp;  . <a href="http://wsgd.free.fr/download.html">http://wsgd.free.fr/download.html</a>에서 generic.dll 다운로드<br/>
&nbsp;&nbsp;&nbsp;  . generic.dll을 C:\Program Files\Wireshark\plugins\1.10.0에 카피<br/>
- mqtt_wireshark_generic_dissector 설치<br/>
&nbsp;&nbsp;&nbsp;  . <a href="http://false.ekta.is/wp-content/uploads/2011/06/mqtt_wireshark_generic_dissector.zip">여기에서 압축 파일 다운로드</a><br/>
&nbsp;&nbsp;&nbsp;  . 압축을 푼 다음 mqtt3.1.fdesc, mqtt3.1.wsgd 파일을  C:\Program Files\Wireshark\plugins\1.10.0에 카피<br/>
<br/>
<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; color: rgb(25, 42, 63); line-height: 19px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(25, 42, 63); clear: left; "><b>Wireshark 모니터링 화면</b></h3>
실제 MQTT v3.1의 헤더 정보를 가지고 파싱한 내용은 아래와 같다. 이렇게 보아야만 인간이 이해할 수 있는 언어가 된 것이다. 자. 이제부터 분석을 시작하면 된다.<br/>
<br/>
<img src="http://mimul.com/pebble/default/images/blog/mobile/mqtt_wireshark.png" border="0" width="490" /><br/>
<br/>
일단 MQTT가 패킷양만 보더라도 상당히 라이트하다는 것을 볼 수 있다. 그래서 경향 프로토콜로 M2M의 표준이 된 이유이기도 하다.<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Smartmob?a=Oh1Ywyi_KCc:H9u4GFg5oho:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Oh1Ywyi_KCc:H9u4GFg5oho:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Oh1Ywyi_KCc:H9u4GFg5oho:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Oh1Ywyi_KCc:H9u4GFg5oho:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=Oh1Ywyi_KCc:H9u4GFg5oho:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Oh1Ywyi_KCc:H9u4GFg5oho:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Oh1Ywyi_KCc:H9u4GFg5oho:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=Oh1Ywyi_KCc:H9u4GFg5oho:KwTdNBX3Jqk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Oh1Ywyi_KCc:H9u4GFg5oho:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=Oh1Ywyi_KCc:H9u4GFg5oho:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Oh1Ywyi_KCc:H9u4GFg5oho:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=Oh1Ywyi_KCc:H9u4GFg5oho:wF9xT3WuBAs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Smartmob/~4/Oh1Ywyi_KCc" height="1" width="1"/>]]></content:encoded>
      <category domain="http://mimul.com:80/pebble/default/categories/Mobile/">Mobile</category>
      <category domain="http://mimul.com:80/pebble/default/tags/mobile/">mobile</category>
      <category domain="http://mimul.com:80/pebble/default/tags/mqtt/">mqtt</category>
      <category domain="http://mimul.com:80/pebble/default/tags/wireshark/">wireshark</category>
      <pubDate>Thu, 13 Jun 2013 03:39:42 GMT</pubDate>
      <guid isPermaLink="false">tag:mimul.com,2013-06-13:default/1371094782475</guid>
      <dc:date>2013-06-13T03:39:42Z</dc:date>
    <feedburner:origLink>http://mimul.com:80/pebble/default/2013/06/13/1371094782475.html</feedburner:origLink></item>
    <item>
      <title>Singleton, Lazy loading 그리고 WeakSingleton</title>
      <link>http://feedproxy.google.com/~r/Smartmob/~3/b7TAGD_DCw4/1369640835148.html</link>
      <content:encoded><![CDATA[최근에 푸시 솔루션(MQTT 기반)을 만들면서 데몬 프로그래밍을 하다가 Singleton 패턴을 적용한 부분이 있어, 이부분에 대한 정리가 필요할 것 같아서 몇자 정리해 봅니다.<br/>
싱글톤 패턴의 변천사로 봐도 무방하리라 생각됩니다.<br/>
<br/>
<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; color: rgb(25, 42, 63); line-height: 19px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(25, 42, 63); clear: left; "><b>static inner class를 사용한 하나의 인스턴스만 생성하는 Singleton</b></h3>
이 경우 synchronized된 getInstance() 함수를 매번 호출하게 되는 문제가 있다. 실제로는 한번만 호출되어도 되는데...성능 이슈가 있다는 말이다.<br/>
<pre>
public class Singleton {
  private static Singleton instance;

  public static synchronized Singleton getInstance() {
    if (instance == null)
      instance = new Singleton();
    return instance;
  }

}
</pre>
<br/>
그래서, 성능 저하를 방지하기 위해 Double-checked locking(DCL) 방법이 고안되었지만, Java에서는 DCL이 제대로 작동하지 않을 수 있다는 문제점이 존재한다.<br/>
그 예로 out-of-order 쓰기에 의해 인스턴스의 초기화전에 instance가 null이 아닐 수 있으며, 초기화가 끝나지 않은 인스턴스를 반환할 수도 있다.<br/>
이를 보완하기 위해 아래와 같이 JDK1.5 이상에서는 메모리 모델의 변경으로 volatile 한정자를 붙이는 것으로 Double-checked locking의 문제점을 피할수 있게 되었다. 하지만, volatile 비용은 높다.<br/>
<pre>
static volatile Singleton instance;

public static Singleton getInstance() {
  if (instance == null) {
    synchronized (Singleton.class) {
      if (instance == null)
        instance == new Singleton();
    }
  }
  return instance;
}
</pre>
<br/>
<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; color: rgb(25, 42, 63); line-height: 19px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(25, 42, 63); clear: left; "><b>Lazy Loading Singleton</b></h3>
인스턴스 생성을 지연할 경우 Initialization-on-demand holder(IODH) 방식을 사용할 수 있다. Nested static class가 사용하고, 그 클래스의 초기화가 해당 클래스에 처음 액세스 할 때 수행되게 하는 언어는 Initialization-on-demand holder라고 하는 idiom으로 변수의 초기화를 지연할 수 있다. 클래스의 초기화는 동기화 되므로, 멀티 스레드 프로그램에서도 다중으로 초기화 되지 않으며 재정렬에 의해 초기화가 불완전한 변수를 참조 버리는 일도 없어진다.<br/>
<pre>
public class Singleton {
  private static class SingletonHolder {
    public static Singleton instance = new Singleton();
  }

  public static Singleton getInstance() {
    return SingletonHolder.instance;
  }
}
</pre>
<br/>
<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; color: rgb(25, 42, 63); line-height: 19px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(25, 42, 63); clear: left; "><b>WeakSingleton</b></h3>
Singleton 클래스를 보유하고 있는 클래스 로더가 삭제되지 않는 한, Singleton 개체가 생존하고 계속 존재하는 문제점이 있다. <br/>
아래는 자원을 회수할 수 있는 Singleton 클래스를 만드는 방법이다. WeakReference 클래스를 이용해, 외부 프로그램이 getInstance()가 반환하는 Singleton 객체를 참조하게 하고 Singleton 인스턴스가 강한 참조가 아니여서 GC에 의해 Singleton 인스턴스는 회수된다. 그러므로써 Java VM의 메모리 사용량이 줄어든다.<br/>
<pre>
public class Singleton {
    private Singleton() {}
 
    public static Singleton getInstance() {
        synchronized(SingletonHolder.class){
            Singleton referent = SingletonHolder.instance.get();
            if(referent == null){
                referent = new Singleton();
                SingletonHolder.instance = new WeakReference<>(referent);
            }
            return referent;
        }
    }
 
    private static class SingletonHolder {
        public static Reference<Singleton> instance = 
	  new WeakReference<>(new Singleton());
    }
}
</pre>
<br/>

<b>[참조 사이트]</b><br/>
<ul>
<li><a href="http://blog.crazybob.org/2007/01/lazy-loading-singletons.html">Lazy Loading Singletons</a></li>
<li><a href="http://www.javalobby.org/java/forums/t77060.html">Design pattern: WeakSingleton</a></li>
</ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Smartmob?a=b7TAGD_DCw4:B4YvbiyDw68:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=b7TAGD_DCw4:B4YvbiyDw68:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=b7TAGD_DCw4:B4YvbiyDw68:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=b7TAGD_DCw4:B4YvbiyDw68:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=b7TAGD_DCw4:B4YvbiyDw68:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=b7TAGD_DCw4:B4YvbiyDw68:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=b7TAGD_DCw4:B4YvbiyDw68:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=b7TAGD_DCw4:B4YvbiyDw68:KwTdNBX3Jqk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=b7TAGD_DCw4:B4YvbiyDw68:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=b7TAGD_DCw4:B4YvbiyDw68:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=b7TAGD_DCw4:B4YvbiyDw68:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=b7TAGD_DCw4:B4YvbiyDw68:wF9xT3WuBAs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Smartmob/~4/b7TAGD_DCw4" height="1" width="1"/>]]></content:encoded>
      <category domain="http://mimul.com:80/pebble/default/categories/JavaTech/">Java Tech</category>
      <category domain="http://mimul.com:80/pebble/default/tags/java/">java</category>
      <category domain="http://mimul.com:80/pebble/default/tags/singleton/">singleton</category>
      <category domain="http://mimul.com:80/pebble/default/tags/weaksingleton/">weaksingleton</category>
      <pubDate>Mon, 27 May 2013 07:47:15 GMT</pubDate>
      <guid isPermaLink="false">tag:mimul.com,2013-05-27:default/1369640835148</guid>
      <dc:date>2013-05-27T07:47:15Z</dc:date>
    <feedburner:origLink>http://mimul.com:80/pebble/default/2013/05/27/1369640835148.html</feedburner:origLink></item>
    <item>
      <title>메모리 overcommit</title>
      <link>http://feedproxy.google.com/~r/Smartmob/~3/eZ03f6nh0E0/1368171783727.html</link>
      <content:encoded><![CDATA[<img src="http://www.mimul.com/pebble/default/images/blog/tech/OOMKiller.jpg" border="0" width="350" hspace="10" align="left" />
Linux의 메모리 관리에서는 메모리 오버커밋이라는 메커니즘이 적용되어 있어 실제 메모리 이상의 공간을 확보할 수 있다. 이는 어떤 문제를 야기시킬 수 있는가 하면 Linux 가상 메모리 시스템은 프로세스가 메모리를 확보할 때는 많게 보이게 하고 실제로 프로세스가 메모리에 접근을 하게되면 실제 메모리를 할당하는데 이때 실제 메모리가 부족하게 되면 OS내부적으로 프로세스를 마음대로 kill을 해버린다. 이른바  OOM-killer(out of memory killer)라고도 한다.<br/>
<br/>
OOM Killer(Out of Memory Killer)는 시스템이 실제 메모리와 가상 메모리 공간(스왑)을 다 사용해, 필요한 메모리 공간을 새로 확보 할 수 없는 경우 프로세스를 종료시켜 여유 메모리를 확보하는 Linux 커널의 메커니즘 중에 하나이다.<br/>
<br/>
그래서 kill된 프로세스가 자기가 왜 죽어버리는지 알수 없는 인터럽트가 발생해서 자신이 인터럽트가 발생했을 때 예외처리를 수행하지 못하는 문제가 발생한다. 이런 현상이 데이터를 관리하는 DB 서버에서 발생한다면 Linux의 좋은 매커니즘이라도 고객의 인지 정보가 실제 데이터에는 저장되지 않는 데이터 유실을 유발시킬 수 있다. DB 자체가 메모리 부족을 인지하고 예외처리하는 로직을 테우게 OS환경을 만들어줄 필요가 있다.<br/>
사소하지만 고민해야할 부분인 것이다.<br/>
<br/>
<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; color: rgb(25, 42, 63); line-height: 19px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(25, 42, 63); clear: left; "><b>관련 커널 메개변수 정보를 설명하면..</b></h3>
<b>*. vm.overcommit_memory</b><br/>
<ul>
<li>0 : heuristic에 따라 overcommit 할 수 있고, 하지 않을 수도 있다.(디폴트) 메모리 요구가 있을 때 여유 공간이 없는 경우 실행중인 프로세스를 강제 종료 메모리를 억지로 확보함.</li>
<li>1 : 항상 overcommit 함. 메모리를 다 사용했는데도 충분한 메모리가있는 것처럼 처리 됨. 그 외에는 0과 같음.</li>
<li>2 : overcommit하지 않음. 메모리가 부족할 경우 메모리 확보시 에러 발생시킴. [Swap size] + ([RAM size] * vm.overcommit_ratio/100).</li>
</ul>
<b>*. vm.overcommit_ratio</b><br/>
<ul>
<li>사용 가능한 메모리의 백분율로 정의. overcommit_ratio의 디폴트는 50.</li>
</ul>
<br/>
<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; color: rgb(25, 42, 63); line-height: 19px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(25, 42, 63); clear: left; "><b>vm.overcommit_memory = 0 or 1 일 경우 현재 환경에서 메모리 확보 테스트해 보면</b></h3>
현재의 메모리 정보는 아래와 같다.<br/>
<pre>
[root@mimul01 ~]# free
             total       used       free     shared    buffers     cached
Mem:       1019680     457172     562508          0      25384     159084
-/+ buffers/cache:     272704     746976
Swap:            0          0          0
</pre>
<br/>
Physical Memory는 1G정도 된다고 볼 수 있다. CommitLimit(상한)과 Committed_AS(사용량) 정보는 아래와 같다.<br/>
<pre>
[root@mimul01 ~]# cat /proc/meminfo |grep Comm
CommitLimit:     1009480 kB
Committed_AS:     518468 kB
</pre>
<br/>
그런 다음 아래 소스를 가지고 malloc 테스트를 실행 해 보았다. 이 경우 오버커밋이 허용되어 있어서 malloc_test 프로그램이 구동되는 동안 계속 메모리 확보를 하고 오버커밋된 범위까지도 메모리 할당을 시도한다. 즉 malloc에서 에러 리턴을 하지 않는 구조이다.<br/>
<pre>
> cat malloc_test.c
#include &lt;stdio.h>
#include &lt;stdlib.h>

#define KB  1024
#define MB  (1024*KB)

int main()
{
  int i = 0;
  char *ptr = NULL;
  for (i=0; ;i++) {
    ptr = (char *)malloc(MB);
    if(ptr == NULL){
      break;
    }
  }
  printf("MALLOC SIZE=%dMB\n",i);
  return(0);
}
[mimul01]/home/k2/Downloads/alloctest> gcc -o malloc_test malloc_test.c
[mimul01]/home/k2/Downloads/alloctest> ./malloc_test 
죽었음
</pre>
<br/>

오버커밋 처리되어 malloc_test에서 인터럽트되어 제어가 되지 않고 OOM-killer에 의해 프로세스가 죽게 된다. 이럴 경우 malloc_test 프로세스는 내부의 예외처리가 무시되어 중요한 문제에 봉착될 수 있다. 아래는 프로세스가 죽었을 때 로그이다.<br/>
<pre>
May  8 11:18:50 mimul01 kernel: Out of memory: Kill process 3121 
 (malloc_test) score 884 or sacrifice child
</pre>
<br/>

<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; color: rgb(25, 42, 63); line-height: 19px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(25, 42, 63); clear: left; "><b>vm.overcommit_memory = 2, vm.overcommit_ratio = 99 일 경우 테스트 사례는</b></h3>
CommitLimit(상한)과 Committed_AS(사용량) 정보는 아래와 같다.<br/>
<pre>
[mimul01]/home/k2/Downloads/alloctest> cat /proc/meminfo  |grep Comm
CommitLimit:     1009480 kB
Committed_AS:     520128 kB
</pre>
<br/>
이경우에는 아래처럼 정보를 보면 알겠지만 malloc시 널로 리턴되어 거기까지 메모리를 할당하고 빠져나오는 프로그램 프로세스를 그대로 탔다. 이처럼 제어가 프로그램으로 넘어거 예외 처리를 할 수 있는 구조가 된다.<br/>
<pre>
[mimul01]/home/k2/Downloads/alloctest> ./malloc_test 
MALLOC SIZE=433MB
</pre>
<br/>
특히나 대상 서버가 데이터 베이스 서버일 경우에는 데이터의 무결성이 중요함으로 MySQL 데몬에 의해 예외 프로세스를 타게 해주는 것이 유효해 보인다.<br/>
더 중요한건 서버의 자원 모니터링을 해서 부족하지 않도록 Scale Up을 잘 해 주는 것이 필요하다.<br/>
<br/>

<h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1em; color: rgb(25, 42, 63); line-height: 19px; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: rgb(25, 42, 63); clear: left; "><b>결론은..</b></h3>
데이터 베이스 서버(MySQL, PostGreSQL, Redis 등)일 경우에는 커널 정보에 아래 설정을 해 두는 것이 데이터 무결성 보호에 도움을 받을 것이다.<br/>
<pre>
> cat /etc/sysctl.conf
vm.overcommit_memory = 2
vm.overcommit_ratio = 99
</pre>
<br/>
그리고 데이터 베이스 서버는 스왑 사용도 비용이 크므로 vm.swappiness = 0로 운영하는 것도 괜찮다.<br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Smartmob?a=eZ03f6nh0E0:XLMFsSLrlrs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=eZ03f6nh0E0:XLMFsSLrlrs:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=eZ03f6nh0E0:XLMFsSLrlrs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=eZ03f6nh0E0:XLMFsSLrlrs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=eZ03f6nh0E0:XLMFsSLrlrs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=eZ03f6nh0E0:XLMFsSLrlrs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=eZ03f6nh0E0:XLMFsSLrlrs:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=eZ03f6nh0E0:XLMFsSLrlrs:KwTdNBX3Jqk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=eZ03f6nh0E0:XLMFsSLrlrs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=eZ03f6nh0E0:XLMFsSLrlrs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=eZ03f6nh0E0:XLMFsSLrlrs:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=eZ03f6nh0E0:XLMFsSLrlrs:wF9xT3WuBAs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Smartmob/~4/eZ03f6nh0E0" height="1" width="1"/>]]></content:encoded>
      <category domain="http://mimul.com:80/pebble/default/categories/DBTech/">DB Tech</category>
      <category domain="http://mimul.com:80/pebble/default/tags/overcommit_memory/">overcommit_memory</category>
      <pubDate>Fri, 10 May 2013 07:43:03 GMT</pubDate>
      <guid isPermaLink="false">tag:mimul.com,2013-05-10:default/1368171783727</guid>
      <dc:date>2013-05-10T07:43:03Z</dc:date>
    <feedburner:origLink>http://mimul.com:80/pebble/default/2013/05/10/1368171783727.html</feedburner:origLink></item>
    <item>
      <title>변수와 메소드 네이밍에 관한 15가지 모범 사례</title>
      <link>http://feedproxy.google.com/~r/Smartmob/~3/U2nCJAC8CYs/1367639300999.html</link>
      <content:encoded><![CDATA[<img src="http://www.mimul.com/pebble/default/images/blog/design/start-image-500.jpg" border="0" width="350" hspace="10" align="left" /> 코딩 스타일을 좋게 하는 방법 중에 하나가 네이밍을 일관되게 사용하는 것이다. 그래서 관련된 좋은 아티클, <a href="http://codebuild.blogspot.kr/2012/02/15-best-practices-of-variable-method.html">"15 Best Practices of Variable & Method Naming"</a>에 대해서 소개한다.
<br />
<br />
간략하게 정리해 보면..<br/><br/>
1. 범위별로 충분히 짧게, 혹은 충분히 긴 변수 이름을 사용한다. 일반적으로 루프 카운터에는 하나의 문자로, 조건이나 루프 변수는 한 단어로, 메소드는 한/두단어로, 클래스에는 두/세 단어로, 전역 변수는 서/너 단어를 사용한다.<br />
<br />
2. 구체적인 변수 이름을 사용한다. 예를 들어, "value", "equals", "data" 같은 변수 이름은 어떠한 경우에도 유효하지 않다.<br />
<br />
3. 의미있는 변수 이름을 사용한다. 변수 이름은 저장되는 값을 정확하게 설명할 수 있어야 한다.<br />
<br />
4. 변수 이름은 "o_", "obj_", "m_"등으로 시작하지 않는다. 변수 이름에 자신이 변수라고 자기 자신을 언급하는 태그는 필요 없다.<br />
<br />
5. 변수에 관련된 회사의 네이밍 규칙을 따르고, 어플리케이션 내에서도 일관된 변수 이름에 쓴다. 예를 들어, txtUserName, lblUserName, cmbSchoolType 등과 같이. 그렇지 않으면, 가독성이 떨어지고 검색/바꾸기 툴 사용 측면에서 사용할 수 없게 된다.<br />
<br />
6. 프로그래밍 언어의 표준을 따르자. 그리고 대/소문자 문자들을 일관되지 않게 사용하지 않는다. 예를 들어, userName, UserName, USER_NAME, m_userName, username 등에서 처럼 비 일관되게 사용하지 않는다. <br />
&nbsp;&nbsp;- Java의 예로 올바른 네이밍은.<br />
<ul>
<li>Camel Case(aka Upper Camel Case)를 클래스에 사용한다. VelocityResponseWriter</li>
<li>Lower Case(Lower Camel Case)를 패키지에 사용한다. com.company.project.ui</li>
<li>Mixed Case(aka Lower Camel Case)을 변수 로 사용한다. studentName</li>
<li>Upper Case를 상수로 사용한다. MAX_PARAMETER_COUNT = 100</li>
<li>Camel Case를 enum클래스에 사용하고 Upper Case를 enum 값으로 사용한다.</li>
<li>'_'는 상수와 enum값 이외의 어떠한 곳에서도 사용하지 않는다.(이들은 상수이다.)</li>
</ul>
7. 다른 컨텍스트에서는 동일 클래스내에서 동일 변수를 사용하지 않는다. 예를 들어, 메소드및 생성자, 클래스 등이다. 이렇게 하면 더 간단하게 이해하기 쉽고 관리하기 용이하게 할 수 있다.<br />
<br />
8. 메소드및 조건 등에서 다른 목적이라면 동일 변수를 사용하지 않는다. 대신 새로 다른 이름의 변수를 준비한다. 이것은 이해하기 쉬움과 유지 보수의 용이성도 중요하다.<br />
<br />
9. 변수 이름에 ASCII가 아닌 문자를 사용하지 않는다. 그들은 당신의 플랫폼에서 작동 할지도 모르지만, 다른 플랫폼에서 작동하지 않을 수 있다.<br />
<br />
10. 너무 긴 변수 이름을 사용하지(예로, 50자 길이). 너무 긴 이름은 추잡하고, 읽기 어려운 코드이다. 게다가, 어떤 컴파일러는 최대 길이(character limit)에 의해 작동되지 않는다.<br />
<br />
11. 네이밍을 위해 자연 언어를 하나로 정하고 그것을 사용한다. 예를 들어, 영어와 독일어가 혼합 된 이름은 비 일관적이고 읽기 힘들 것이다.<br />
<br />
12. 메소드를 위해서도 의미 있는 네이밍을 사용한다. 이름은 메소드의 정확한 동작(action)을 구체적으로 나타내고, 대부분의 경우 동사로 시작(createPasswordHash 등)한다.<br />
<br />
13. 메소드에 대해서도 회사의 네이밍 규칙에 따르고, 어플리케이션 내에서 일관되게 메소드 이름을 쓴다. 예를 들어, getTxtUserName(), getLblUserName(), isStudentApproved() 등이다. 그렇지 않으면, 가독성이 떨어지고, 검색/바꾸기 툴의 사용 측면에서 유효하지 않게 된다.<br />
<br />
14. 프로그래밍 언어의 표준에 따라 대/소문자 문자열을 일되관하지 않는 상태로 사용하지 않는다. 예를 들어, getUserName, GetUserName, getusername 등의 혼합 말이다. <br />
 - Java 의 예로 올바른 경우는.<br />
<ul>
<li>Mixed Case를 메소드 이름으로 사용한다. getStudentSchoolType</li>
<li>Mixed Case를 메소드 매개 변수에 사용한다. setSchoolName (String schoolName)</li>
</ul>
15. 의미있는 이름을 메소드의 매개 변수로 사용한다. 그렇게 되면, 문서가 없는 경우에도 코드 자체가 문서 역할을 하게 된다.<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Smartmob?a=U2nCJAC8CYs:KH-gs5bJarc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=U2nCJAC8CYs:KH-gs5bJarc:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=U2nCJAC8CYs:KH-gs5bJarc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=U2nCJAC8CYs:KH-gs5bJarc:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=U2nCJAC8CYs:KH-gs5bJarc:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=U2nCJAC8CYs:KH-gs5bJarc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=U2nCJAC8CYs:KH-gs5bJarc:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=U2nCJAC8CYs:KH-gs5bJarc:KwTdNBX3Jqk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=U2nCJAC8CYs:KH-gs5bJarc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=U2nCJAC8CYs:KH-gs5bJarc:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=U2nCJAC8CYs:KH-gs5bJarc:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=U2nCJAC8CYs:KH-gs5bJarc:wF9xT3WuBAs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Smartmob/~4/U2nCJAC8CYs" height="1" width="1"/>]]></content:encoded>
      <category domain="http://mimul.com:80/pebble/default/categories/CommonSkill/">Common Skill</category>
      <category domain="http://mimul.com:80/pebble/default/tags/코딩스타일/">코딩스타일</category>
      <pubDate>Sat, 04 May 2013 03:48:20 GMT</pubDate>
      <guid isPermaLink="false">tag:mimul.com,2013-05-04:default/1367639300999</guid>
      <dc:date>2013-05-04T03:48:20Z</dc:date>
    <feedburner:origLink>http://mimul.com:80/pebble/default/2013/05/04/1367639300999.html</feedburner:origLink></item>
    <item>
      <title>기계가 세상을 통제한다면..</title>
      <link>http://feedproxy.google.com/~r/Smartmob/~3/Iy1xN3DiLeQ/1367598220494.html</link>
      <content:encoded><![CDATA[<img src="http://www.mimul.com/pebble/default/images/blog/algorithm/al.jpg" width="300" border="0" hspace="10" align="left" /> 우연히 검색을 하다가 <a href="http://www.wired.com/magazine/2010/12/ff_ai_flashtrading/all/1">"Algorithms Take Control of Wall Street"</a> 기사를 봤는데 내용이 재미 있어서 소개 및 제 생각을 몇자 적어본다.<br/>
<br/>
내용은 월스트리트는 알고리즘에 의해 접수되었다. 정도...<br/>
<br/>
[Lexicon]은 구독자인 알고리즘이 이해하는 데이터를 전송한다. 즉, 로봇 프로그램(클라이언트)이 이해할 수 있는 방식으로 뉴스를 보낸다. 다우 존스의 모든 기사를 실시간으로 검색하고 주식에 대한 투자자의 기대를 예측할 수 있는 단서를 찾는다. 그리고 그 정보를 컴퓨터가 읽을 수 있는 형태로 해 알고리즘의 구독자에게 전달하는 것이다. 알고리즘은 그것을 더 깊이 분석해 얻어진 데이터를 바탕으로 투자 결정을 내린다. <br/><br/>
[Lexicon]은 뉴스를 읽고 시황을 전망, 그 정보를 바탕으로 주식을 매매하는 일련의 프로세스 자동화를 촉진한다. 컴퓨터는 더 이상 계산하는 것만은 아니다. 의사 결정을하게 된 것이다. 금융 시스템 전체가 점점 그렇게 되어 가고 있다. <br/>
<br/>
[Lexicon]을 구독하는 투자자의 대부분은 인간이 아니다. 알고리즘. 즉, 세계에서로 날마다 일어나는 거래를 지배하는 무수한 코드들인 것이다. 그들은 인간처럼 뉴스를 읽거나 하지 않는다. 기사도, 문장조차도 필요 없다. 우리가 알고리즘을 위해 디자인된 세상에 살고 있으며, 또한 우리는 점점 더 알고리즘에 의해 컨트롤 받고 있다.<br/>
<br/>
"시장은 기계가 접수했다. 인간은 단지 그 안에서 거래를 하고 있는 것에 지나지 않는다." 인지 능력을 초월한 속도와 처리 능력의 월스트리트를을 담당하는 컴퓨터 시스템이 폭주 할 때, 사람은 금융 시장의 붕괴(Flash Crash 등)를 방지 할 수 있을까?<br/>
<br/>
빅데이터 뒤에는 빅 브라더가 도사리고 있다. 기계에 의해 제시되는 추론엔진에 의해 소비자들이 조정되는 환경이 되었다. 우리들은 그럴듯함과 익숙함으로 인해 생각의 종말이 올 수도 있지 않을까? 컴퓨터가 세상을 접수한다.<br/>
<br/>
그리고 제어할 수 없는 카오스적 폭주는 원전에서도 도사리고 있다. 우리의 인생은 우리에 의해 결정되지 않는 날이 멀지 않은 것 같처럼 느껴진다.많은 생각이 나는 새벽이다. <br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Smartmob?a=Iy1xN3DiLeQ:FCSROGlpEu4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Iy1xN3DiLeQ:FCSROGlpEu4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Iy1xN3DiLeQ:FCSROGlpEu4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Iy1xN3DiLeQ:FCSROGlpEu4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=Iy1xN3DiLeQ:FCSROGlpEu4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Iy1xN3DiLeQ:FCSROGlpEu4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Iy1xN3DiLeQ:FCSROGlpEu4:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=Iy1xN3DiLeQ:FCSROGlpEu4:KwTdNBX3Jqk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Iy1xN3DiLeQ:FCSROGlpEu4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=Iy1xN3DiLeQ:FCSROGlpEu4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=Iy1xN3DiLeQ:FCSROGlpEu4:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=Iy1xN3DiLeQ:FCSROGlpEu4:wF9xT3WuBAs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Smartmob/~4/Iy1xN3DiLeQ" height="1" width="1"/>]]></content:encoded>
      <category domain="http://mimul.com:80/pebble/default/categories/LifeLog/">Life2.0</category>
      <category domain="http://mimul.com:80/pebble/default/tags/algorithm/">algorithm</category>
      <pubDate>Fri, 03 May 2013 16:23:40 GMT</pubDate>
      <guid isPermaLink="false">tag:mimul.com,2013-05-03:default/1367598220494</guid>
      <dc:date>2013-05-03T16:23:40Z</dc:date>
    <feedburner:origLink>http://mimul.com:80/pebble/default/2013/05/04/1367598220494.html</feedburner:origLink></item>
    <item>
      <title>서브루틴(subroutine) vs 코루틴(co-routine)</title>
      <link>http://feedproxy.google.com/~r/Smartmob/~3/mf1f_Jf45lQ/1366790596830.html</link>
      <content:encoded><![CDATA[<b>서브루틴(subroutine)</b><br/>
폰노이만이 컴퓨터 아키텍처의 발명에 큰 영향을 준 것중에 하나가 서브루틴 개념의 발명이다. 그러다보니 그 지대한 영향력 때문인지 몰라도 사람들의 프로그래밍 스타일까지 파고들어 오늘날에 이르기까지 한다.<br/>
<br/>
서브루틴은 부모와 자식의 주종 관계가 성립하고, 서브루틴의 호출은 부모에 의해서 호출된다. 결국 서브루틴은 처리 후 리턴에 의해 부모로 돌아가는데 그 때 Context정보는 두고 돌아간다.<br/>
세상에는 서브루틴처럼 순차적인 문제만 있는 것이 아니다. 문제 자체가 병렬적인게 많다. 대게의 경우 게임이 그러하다. 각각의 플레이어를 계층화할 수 없다는 말이다. 둘 이상이 병렬적으로 Context를 가지고 게임을 하게 된다.<br/>
서브루틴은 결과를 리턴할 때마다 Context가 초기화되어 개별 플레이어들의 런타임 Context는 서브루틴 밖으로 리턴시에 가져갈 수 없게 된다.<br/>
이런 문제를 해결한 것이 Conway가 생각해 낸 코루틴(co-routine)이다.<br/>
<br/>
<b>코루틴(co-routine)</b><br/>
주종관계가 없는 프로그램 단위가 병렬적으로 진행된다. 자신의 실행을 중단하고 다른 코루틴으로 제어권을 전달할 수도 있다.<br/>
서브루틴의 컨텍스트는 종료와 함께 사라지지만, 코루틴의 컨텍스트는 그대로 존재한다. 같은 코루틴에서 멈췄던 곳에서 다시 진행할 수도 있다.<br/><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Smartmob?a=mf1f_Jf45lQ:62mWaeZ70o4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=mf1f_Jf45lQ:62mWaeZ70o4:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=mf1f_Jf45lQ:62mWaeZ70o4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=mf1f_Jf45lQ:62mWaeZ70o4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=mf1f_Jf45lQ:62mWaeZ70o4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=mf1f_Jf45lQ:62mWaeZ70o4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Smartmob?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=mf1f_Jf45lQ:62mWaeZ70o4:KwTdNBX3Jqk"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=mf1f_Jf45lQ:62mWaeZ70o4:KwTdNBX3Jqk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=mf1f_Jf45lQ:62mWaeZ70o4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=mf1f_Jf45lQ:62mWaeZ70o4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Smartmob?a=mf1f_Jf45lQ:62mWaeZ70o4:wF9xT3WuBAs"><img src="http://feeds.feedburner.com/~ff/Smartmob?i=mf1f_Jf45lQ:62mWaeZ70o4:wF9xT3WuBAs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Smartmob/~4/mf1f_Jf45lQ" height="1" width="1"/>]]></content:encoded>
      <category domain="http://mimul.com:80/pebble/default/categories/Small Talk/">Small Talk</category>
      <category domain="http://mimul.com:80/pebble/default/tags/co-routine/">co-routine</category>
      <category domain="http://mimul.com:80/pebble/default/tags/subroutine/">subroutine</category>
      <pubDate>Wed, 24 Apr 2013 08:03:16 GMT</pubDate>
      <guid isPermaLink="false">tag:mimul.com,2013-04-24:default/1366790596830</guid>
      <dc:date>2013-04-24T08:03:16Z</dc:date>
    <feedburner:origLink>http://mimul.com:80/pebble/default/2013/04/24/1366790596830.html</feedburner:origLink></item>
  </channel>
</rss>
