2016년 12월 12일 월요일

2016.12.09.Fri. 박근혜 대통령 탄핵 소추안 국회 통과

박근혜 대통령 탄핵 결의안 국회 통과

- 국회 표결일: 2016.12.09.Fri.
- 참여 국회의원 명패 수: 299
- 찬성: 234 표
- 반대: 56표
- 무효: 7표
- 기권: 2표

2014년 10월 27일 월요일

2013년 9월 6일 금요일

Register SSH Pub Key to Github

Github SSH Pub Key 등록


Generate SSH Key

$ ssh-keygen -t rsa -C "your@email.com"

Copy generated RSA Key to Clipboard

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3JEUABSWccJt7FhwrtwU5cdWr50Q+Cm80NDEY8CaxF3Vc0sQeqzHYPJLpWowTTRgebeoUgQrluROSWC342WxsSps6cNIlUM0ssl7498xpOZPBVx
... 중략 ...
JX0ZZRxwtSJnBdiuXX2zi1prw2AVsO/X8jIg59jeGJZbIqD3R+SvK5kWe3acPKuj2mdryhIEngpvMvJkAX5d your@email.com

github Site Sign-in

  • Account Setting > SSH Keys Menu
  • Add SSH Key
  • Title: your@email.com
  • Key: Paste your copied rsa pub key

Check Registered SSH Key on Github

$ git -T git@github.com
Warning: Permanently added the RSA host key for IP address '192.30.252.129' to the list of known hosts.
PTY allocation request failed on channel 0
Hi {yourName}! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
* If you see this sentence then you get successful to register SSH Key.

Clone Your Repository

$ git clone git@github.com:/yourID/repositoryPath.git

* NOW You can just pulling without authentication ! :)




2013년 7월 11일 목요일

GCM의 주요 개발자 기능


About GCM

용어 정의


  • GCM
    • Google Cloud Messaging for Android

GCM Overview

Google Cloud Messaging for Android(GCM)는(은) 개발자가 서버에서 Android Device에 있는
Android Application으로 Data를 전송하거나, 사용자의 Device에서 Cloud로 Upstream Message를 전송할 수 있도록 돕는 무료 서비스 이다.

Key Developer Features

Send data from your server to users' Android-powered devices

Send-to-Sync Message

e-mail이나 매번 Update되는 마지막 점수를 Sync하는 Application 처럼 Sync를 위한 Message가 수신될 때
이들은 서로 연관된 종류의 Message끼리 묶여 Collapse되어 관리된다.
그로인해 새로운 메일을 동시에 여러 개 받거나 점수가 연속적으로 Update되었을 때
마지막에 최종적으로 수신된 Message로 인한 Noti.가 발생한다는 것이다.

이는 임의로 발급된 "collepse_key"라는 Parameter를 사용해 관리되며,
Device가 꺼져있다든가하는 등의 경우 Message Collepsing을 위한 Group을 구성하는데 사용된다.

GCM은 최대 4개의 서로 다른 collepse_key를 사용할 수 있도록 허용한다.
즉 동시에 4개의 서로 다른 Send-to-Sync Message만 허용한다는 뜻이며,
4개를 초과할 경우 GCM은 어떤 메세지가 될지 보장할 수 없지만 딱 4개만 유지한다는 것이다.

Send message with payload

Send-to_Sync와 달리 매 "message with payload"(non-collapsible message) 마다 전달되며
Message의 최대 크기는 4KB이다.
아래 예는 경기관중들이 어떤 스포츠 경기에 대해 대화 중인 IM Application에서 사용하는
JSON-formatted 메세지이다.


{
  "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
  "data" : {
    "Nick" : "Mario",
    "Text" : "great match!",
    "Room" : "PortugalVSDenmark",
  },
}

이 "message with payload"는 Mobile Application이 Server의 상태를 알기위해 접속하는 단순한 "ping"이 아니다.

앞서 소개한 IM Application의 경우, 매번 보내는 대화 내용이 다르기 때문에 모든 Message가 전달되어야 할 것이다.
non-collapsible message를 명시할 때는 그냥 "collapse_key"를 생략하면된다.
그러면 GCM은 매번 Message를 개별적으로 전달할 것이다.(단, 전달 순서는 보장할 수 없다.)

GCM는 100개의 non-collapsible message를 저장할 수 있어 이 후 전달되는 모든 Message는 버려지게 된다.
그래서 100개 이후 몇 개의 Message가 버려졌는지를 Client에게 보내게 되며,
다음을 포함하는 정규 com.google.android.c2dm.intent.RECEIVE intent를 통해 전달된다.

  • message_type
    • String Type의 "deleted_message"라는 값만 갖는다.
  • total_deleted
    • String Type의 삭제된 Message의 수
따라서 Application은 Server와의 Syncing을 통해 삭제된 Message에 대한 대응을 해야한다.

Which should I use?



non-collapsible message가 요구되지 않는다면, Performance 관점에서
Device의 베터리 부담을 적게 주는 collapsible message를 사용하는 쪽이 좀더 효과적이다.


2013년 4월 4일 목요일

What is Architecture...


우리는 보통 개발을 하는 과정에서 여러가지 일을 한다.
Project를 관리 작업과 구현을 위한 개발 작업, 그리고 Issue와 Risk 관리, 비용산정 등
크게 나누어도 적지않은 할일들이 있고 또 지금 하려는 얘기의 대상이되는 개발작업을 좀더 나워보면
요구사항 분석, 설계, 설계를 바탕으로 한 구체적인 구현계획 및 설계 등과 같이 역시 적지않은 작업들로 나뉜다.
서론이 길었는데, 하고자하는 얘기를 하자면,
개발 작업에 있어 Architecture는 결코 관가할 수 없는 중요한 작업이라는 것이다.
많은 개발자들이 설계작업을 그리 중요시 하지않거나 불필요한 작업정도로 치부하는 경우가 많다.
이유로는 대부분, "그럴 시간이 없다", "개발하는데 시간이 너무 올래 걸려", "꼭 해야 해?", "그건 규모가 있는 곳 에서나.."등 들어봄직한 말 들일 것이다.
하지만 절대 그렇지 않다. 절대!

Architecture라는 것은 이런 것 이이다..라고 생각하는 몇 가지 예를 들고자 한다.
하나, 우리가 인생을 살아가는 데 있어 크게 두 가지로 많으들 얘기한다. "짧고 굵게"와 "길고 가늘게".
이것의 선택은 각자의 인생관에 따라 결정될 것이고 그에 따라 인생을 그렇게 살아가거나 그렇게 살고자 의지를 가질 것이다.
하나, 길을 찾아갈 때 출발지에서 목적지로 가는 길은 하나만 있지는 않을 것이다. 하지만 최단거리 경로 또는 최단시간 경로는 있을 것이고
이 또한 그 길을 찾아가는 사람의 목적이나 상황에 따라 결정될 것이다.
하나, 도로에는 신호등을 포함해 도로의 상태나 방향 등을 알리기위한 목적의 표지판이 있다는 것을 잘 알고 있을 것이다.
이 신호등이나 표지판은 전 세계가 함께쓰는 하나의 Protocol이다. 그 덕에 우리는 어디를 가든 운전을 하는데 별 어려움이 없다.
그렇다, 이 처럼 Architecture는 Project가 갖는 성격이나 특성에 따라 방향이 결정되고,
Project의 목적에 맞게 다듬어지며, Project 참여자들이 함께 공유하며 함께 작업할 수 있도록 해주는
최소한의 일정한 규칙이 있는 것이다.
그 것이 Architecture인 것이다.
적어도 나는 그것이 Architecture이고 이의 역할이며 목적이라고 생각한다.

위에서 예로 들지는 않았지만 많이들 건물과 같은 실체를 만들기위한 설계에 많이 비유를 하는데
그것만으로 Software에 있어서의 Architecture를 설명하기에는 너무나 식상하고 뻔한 소리같아 조금 다르게 접근해 보았다.
하지만 이 비유는 매우 잘된 비유에 속하며 절대 식상하지 않은 것이다.
개발 작업을 하다보면 여러차례 요구사항이 바뀌고 그에 따라 Code를 수정하는 작업들이 빈번하게 이루어지고
지금도 그 작업을 하기위해 밤을 세우는 개발자들이 많을 것이다.
건물 얘기를 했으니 건물에 비유해 한 번 생각해 보자.
처음의 요구사항은 1층 건물을 짖는 것이었는데 갑자기 2층짜리 건물로 요구사항이 바뀌었다고 생각해보자.
그럼 건물의 높이가 높아지는 만큼 땅도 더 깊이 파야하고, 2층으로 올리기위해 보의 강도도 높여야하고,
층간 소음, 등 고려해야할 것들이 생기고 그에 따른 추가적인 작업이 요구되는 것 처럼,
Software 개발에서도 같은 일이 마찬가지로 발생한다.
"이럴 때 Architecture가 이런 문제들을 쉽게해결해 주기 때문에 Architecture가 반드시 필요하다."라는 말을 하려고 이런 얘길하는 것은 절대 아니다. 의외로 적지않은 사람들이 오해를 하거나 잘 못된 기대를 하는 부분이기도 하다.
하지만 여기서 Architecture의 역할과 목적은 저런 문제를 쉽게 해결하기위한 것이 아니라
올바르게, 정확히는 Project의 특성과 목적에 맞게 진행될 수 있도록 기준을 잡아준다는 것이다.
어떠한 개발 작업이든 개발자가 단 한 번의 Code 작성으로 완성되는 Code는 없다.
이는 오류로 인한 것이든, 요구사항의 변경으로 인한 것이든 여러 외적 요인으로 인해 변경되는데,
그 때마다 정해진 규칙없이 Code가 작성된다면, 그리고 한 사람이 아닌 여러 사람이 그렇게 작성한 Code는
Code의 owner만 알 수 있는 구조와 Logic을 갖게되며 그나마도 얼마간의 시간이 지나면 Owner 역시 당시 자신이 왜 그렇게 Code를 작성했는지 모른다고한다.
부끄럽지만 이것이 현재의 우리네 개발환경의 현실이다.
다음이 없다. 고도화라는 이름을 붙여 Project를 진행하지만 속을 들여다보면 처음부터 다시 같은 동작을 하는 Code를 다른 개발자가 작성하고있는 것 뿐이다.
슬프게도 말이다.

Architecture에는 목적과 방향성 그리고 철학이 있다.
그에 따라 Code를 작성하고, 수정하고, 생각하고 고민해야 한다.
Architecture에서 정한 규칙을 준수해야 한다.
그럼으로 인해 Code에 일관성이 생기고, 사상이 투영된 Logic을 가지며,
Architecture가 말하는 Protocol 대로 해석이 가능하게 함으로써 그 다음을 바라 볼 수 있게 해준다.

2013년 3월 20일 수요일

iBATIS net.sf.cglib.beans.BulkBeanException

iBATIS에서 "net.sf.cglib.beans.BulkBeanException"와 같은 오류가 발생했다면

그것은 Integer Type의 Field가 null인 Record가 ResultMap에 Set되었다는 것을 의미한다.

즉, ResultMap의 Property 중 type이 Integer인 것을 찾아 아래와 같이 수정해 주면된다.



<resultMap id="resultSample" class="sample">

<result property="stringProp" column="STRING_PROP" />

<result property="integerProp" column="INTEGER_PROP" />

</resultMap>


<select id="selectSample" resultMap="resultSample">

SELECT STRING_PROP, COALESCE( INTEGER_PROP, 0 ) AS INTEGER_PROP

FROM TB_SAMPLE

</select>

"COALESCE"를 사용해 null인 경우 '0'으로 대치한다.



Hostname 'some.site.com' is blocked in your defense plan.

 

 

Hostname 'some.site.com' is blocked in your defense plan.

 

위와 같은 오류가 발생했다면 DynDNS를 사용하고 있을 것이다.

이를 해결하기 위해서는 다음 절차를 따르면 된다.

 

  1. DynDNS Updater를 열어 'Advanced' Menu를 선택한다.
  2. Advanced Menu의 'Enable DynDNS.com Internet Guide on this PC'를 uncheck한다.
  3. '네트워크 연결'의 '로컬 영역 연결'을 선택, 오른쪽 Mouse Click 후 '사용 안함' 선택 후
    연결이 끊어지면 다시 오른쪽 Mouse Button을 Click해 '사용함'을 선택한다.

DynDNS를 사용하다 이와 같은 오류를 보고 놀란 가슴 부여잡으며 다급히 Uninstall하는 사용자가 많을텐데 그러지 않아도 되며 안심하고 사용해도 될 것 같다.

 

 

 

Tomcat Error: Error filterStart



Tomcat과 Struts를 연동하던 중 Catalina log에 다음과 같이 "Error filterStart"라는 오류가 난다면

stdout.log의 Error Message를 먼저 확인해 보아야할 것이다.

분명 Load할 Class를 정상적으로 Load하지 못했기 때문이다.

Googling을 해 보면 Tomcat과 Struts의 Version 문제라거나 필수 Library의 문제라고도 하지만 그리 명확한 답변은 못 된다.

오류 Message가 아래와 같다면 적어도 그렇지 않다.

이 오류의 주요 원인은 'stdout.log'에서 보듯이 weblogic Library가 Load 되었기 때문이다.

weblogic Library가 Load되면서 XML 관련 Class의 참조 Path가 바뀐 것이 주요 원인이다.


이 문제의 해결 방법은 두 가지가 있다.

만약 Project에서 weblogic을 사용하지 않는다면 이를(Load된 weblogic.jar File을) 삭제하면 될 것이고,

사용한다면 www.apache.org에서(http://www.apache.org/dyn/closer.cgi/xml/xalan-j) 'xalan'을 Download해

'xalan.jar'과 'serializer.jar'를 Project Library path에 복사해 주면 된다.



아마 이 글을 보고 있는 개발자라면 문제의 원인을 찾거나 해결할 방법을 찾느라 많이 고심했으리라 미루어 짐작된다. 이 글을 쓰고 있는 필자 또한 그러했기 때문에..

모쪼록 이 글을 통해 기쁨이 함께하길 바라며 이 글을 올린다.



  • Canalina log.

2008. 12. 29 오후 11:50:32 org.apache.catalina.core.StandardHost start

정보: XML validation disabled

2008. 12. 29 오후 11:50:32 org.apache.catalina.core.StandardContext start

심각: Error filterStart

  • stdout log

심각: Exception starting filter struts2
java.lang.NoClassDefFoundError: org/apache/xalan/processor/TransformerFactoryImpl
at weblogic.xml.jaxp.RegistryTransformerFactory.<init>(RegistryTransformerFactory.java:62)
at weblogic.xml.jaxp.RegistrySAXTransformerFactory.<init>(RegistrySAXTransformerFactory.java:12)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at javax.xml.transform.FactoryFinder.newInstance(Unknown Source)
at javax.xml.transform.FactoryFinder.findJarServiceProvider(Unknown Source)
at javax.xml.transform.FactoryFinder.find(Unknown Source)
at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
at com.opensymphony.xwork2.util.DomHelper$DOMBuilder.<clinit>(DomHelper.java:167)
at com.opensymphony.xwork2.util.DomHelper.parse(DomHelper.java:115)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:830)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:131)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:100)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:130)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:52)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:395)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:452)
at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:205)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:221)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:302)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:78)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3635)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4222)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)


Subversive update URL

 

http://www.polarion.org/projects/subversive/download/1.1/update-site/

 

 

* TortoiseSVN - http://tortoisesvn.tigris.org/

우편번호 DB

정보통신부에서 제공되는 최신 우편번호 DB 정보를 KSSoft에서 가공해 제공하고 있다.

URL은 다음과 같다.

 

http://kssoft.wowdns.com:8090/postnum/index.html

 

http://www.kssoft.com/postnum/index.html