Do Not Think!!!

Posted
Filed under 글로 기록하기
실제로 연봉협상을 하는 사람이 있는지 의문이 듭니다.

회사를 많이 다닌것도, 오래 다닌것도 아니고... 딸랑 한군데, 지금 다니고 있는 회사가 첫 회사고, 이제 2년을 넘겨 3년찬데...

신입때, 연봉통보...
2년차, 연봉통보...
그리고 지금 3년차, 연봉통보... 아직은 아니지만 거의...

협상도 기술이라고 합니다. 그 기술이 뛰어난 사람은 더 많은 연봉을 받을 수 있고, 그 기술이 뛰어나지 못한 사람은 적은 연봉을 받는다고 합니다.

아무래도 협상 기술이 부족하기 때문에, 항상 부족하게 생각을 하는 거겠죠.

20년 이상 협상만 해온 사람과... 이제 갓 2년이 조금 넘는, 협상과는 거리가 먼 사회 경험을 한 사람과의 협상력차이는...항상 한쪽으로 끌려다닐 수 밖에 없는 결과를 만들어 내는것 같습니다.

그래서 연봉계약을 하고 난 다음에는 항상 연봉통보라고 생각하는지도 모르겠습니다.

휴... 실제 연봉협상하는 모습을 봤으면 좋겠습니다.



Posted
Filed under 사진으로 기록하기
지난 일요일 아침일찍 차를 한대 몰고 양평에 다녀왔습니다. 먼저 운길산 수종사에 갔는데... 길을 잘못들어 마을 회관에 차를 세워놓고 산을 타고 한참을 올라갔습니다. 산을 올라간 길도 산책 수준이 아니라 등산 수준이었는데, 등산화를 신고가지 않을걸 후회했습니다. 한참을 올라가다 보니 수종사가 나왔는데... 일주문이 아니라 해탈문이 보이네요... 수종사 해탈문

어렵긴 해도 올라왔으니 이곳 저곳을 기웃여봅니다. 그러다 다 부숴진 벌집을 봤습니다. 사진을 찍을땐 몰랐는데, 나중에 보니 부숴져있더군요... 사람이 다칠까봐 부순거라 생각합니다. 빈 벌집

수종사에 가면, 무제한으로 차를 줍니다. 그래도 꽁짠데, 한번 먹어봐야죠... 생전 처음 보는 것들입니다. 어떻게 마시는지 한참을 헤매다가, 옆에 있는 설명서를 보고 간신히 따라 했습니다.
녹차를 무제한으로 제공해주는 다원

다원 한켠에 보면 약숫물이 나오는 곳이 있습니다 . 잠깐 물을 뜨다 피어 있는 꽃을 찍었습니다.


올라온 길로 다시 내려가는데, 해탈문 바로 앞에 있는 은행나무입니다. 세조가 심었다고 하니 500년이 한참 넘었군요...
세조가 심었다는 수종사 은행나무

올라올때는 힘들어서 그냥 지나쳤는데... 올라오면서 잠시 쉬었던 곳입니다. 누군가가 쉬기 위해 이렇게 만들었겠죠?
수종사 올라가면서 잠쉬 쉬었던 곳

마을 길가에 피어있던 철쭉입니다. 펜탁스의 색감을 느끼고 싶었는데, 내공부족으로 표현이 안되네요.
철쭉 접사

용문사에 가기 위해 용문산 관광단지에 들어섰습니다. 관광단지를 지나 용문사로 가는 도중에 본 분수입니다. 아이들처럼 분수 안에 들어가서 장난을 치고 싶었지만, 옷이 없었던 관계로 참았습니다.
용문산 관광단지 분수

용문산에 있는 은행나무입니다. 무려 1000살이 넘었다는군요. 사진에는 안나왔지만, 은행나무 옆에는 낙뢰로부터 보하기위한 높은 철탑이 있습니다.
융문사 은행나무

용문산 뒷켠으로 나 있는 등산로 옆에서 돗자리를 펴고 앉았습니다.
용문사 뒷편에 자리 펴고 꺼낸 과일

햇빛을 밭은 나뭇잎들이 짙은 녹색을 띄고 있었는데... 역시, 표현이 잘 안됩니다.
짙은 녹색 숲

청설모가 아닌 다람쥐가 바로 앞에까지 나타났습니다. 조용히 카메라를 들이댔는데... 어느샌가 사라지고 바위만 남아 있네요.
사라져버린 다람쥐
경선이가 찍은 다람쥐 사진

경선이가 찍은 다람쥐 사진



용문사를 내려오는길에 한폭의 수채화 같은 풍경을 찍었습니다. 울긋불긋한 가을의 산 뿐만이 아니라, 푸른 봄날의 산도 이렇게 아름답다는걸 느꼈습니다.
수채화 같은 풍경
경선이가 찍은 다람쥐 사진

경선이가 찍은 다람쥐 사진

Posted
Filed under 글로 기록하기

연봉, 퇴직금 계산식 (Language : text)
실연봉 = 계약 연봉 * (12/13)

1년 급여 = 실연봉 * (12/15)
1달 급여 = 1년 급여 / 12 = 실연봉 * (1/15)

1년 상여 = 실연봉 * (3/15)
1달 상여 = 1년 상여 / 12

퇴직금 = (최근 3개월 급여 + 최근 3개월 상여)  / 3 = 급여 + 1달 상여

참고
급여 = 기본급 + 월차수당 + 연차수당
퇴직금 정산 3개월전 월차 or 연차 사용시 급여가 깎이므로 퇴직금도 깎임


실제 계산해보기


얼마전에 퇴직금 정산때문에 알게 된 우리회사의 연봉, 퇴직금 계산식입니다. 다른 사람들은 어떻게 생각할 지 모르겠지만, 저는 이 식이 마음에 들이 않습니다. 웬지 사기를 당하고 있다는 생각이 들거든요...

정상적인 결과 (Language : text)
총 급여 + 상여 + 퇴직금 = 계약서에 사인한 금액

이상한 결과 (Language : text)
총 급여 + 상여 + 퇴직금 <= 계약서에 사인한 금액

결국에는 사인한 금액보다 적게 받을 수 있다는 사실을 알고 있는사람이 얼마나 될까요? 저는 이 사실을 모르고 있었고, 그렇기 때문에...

사기당했다.

라는 생각이 드네요.
Posted
Filed under 글로 기록하기
지난 4월 5일 (목)요일 정통부에서 작업 할 당시, 발생한 에러입니다. 그런데 오늘 국방부에서 작업하는데 똑같은 에러가 발생하네요.

물론 정통부에서 작업 할 때에는, 다른 문제 때문이었었는데, 그때에도 문제를 해결하는 과정에서 오늘 발생한 문제에 대한 내용을 봤었습니다. 그때에는 다른 문제라 생각하고 그냥 지나쳤었는데, 오늘 이 에러를 접하고 나니, 바로 정리하지 못한 아쉬움이 남네요.


시스템은 그림에서 보이는 것 처럼 구성되어 있습니다.
  1. Client 와 WAS는 CORBA로 연결됩니다.
  2. WAS와 DB는 다른 네트워크에 존재합니다.
현상은 다음과 같습니다.
  1. Client <-----> DB 2-티어로 잘 연결됩니다.
  2. Client <-----> WAS <-----> DB 3-티어로는 DB에 연결이 되지 않습니다.
에러 로그는 다음과 같습니다.
Caused by: java.sql.SQLException: IO 예외 상황: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:420)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)


그림 보기



이런 에러가 발생하는 이유로는 네트워크로 데이터베이스에 접근하지 못하는 문제인데,
  1. 리스너가 안떠있거나
  2. 호스트명이 잘못되어있거나
  3. 방화벽문제
인 경우가 대부분입니다.

실제 웹에서 검색을 해보면, 1번과 2번 때문에 이런 문제가 발생한다는 것과, 그에대한 해결방법에 대해 많이 찾을 수 있었습니다. 하지만 2-티어로는 접속이 잘 되고 있는 상황이기 때문에, 다른 원인을 찾아야만 했는데, 그래서 찾은 원인은 Oracle이 Multithreaded Server (MTS)로 설정되어 있을 경우 ORA-17002 (ORA-12505) 문제가 발생한다는 것입니다.

해결방법으로는 다음과 같은 접속 URL 대신에
JDBC Thin 드라이버 Orcle 접속 URL (Language : java)
"jdbc:oracle:thin:@<HOST>:<PORT>:<SID>"

다음 URL을 사용합니다.
Multithreaded Server (MTS)가 설정된 Oracle에 접속하기 위한 JDBC Thin 드라이버 Oracle 접속 URL (Language : java)
"jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<HOST>(PORT=<PORT>)))(CONNECT_DATA=(SERVICE_NAME=<SID>)(SERVER=DEDICATED)))"

Posted
Filed under 01010101
JDBC로 Oracle 접속 테스트를 하기 위한 jsp 코드입니다.

JBoss에서 Oracle 접속 테스를 하기 위해 간단하게 만들었습니다.


jdbc_pool_test.jsp

JDBC 드라이버를 이용하여 접속 테스트 하기 파일 다운로드

jdbc_test.jsp

WAS 컨넥션 풀을 이용하여 접속 테스트 하기 파일 다운로드





JDBC 드라이버를 이용하여 접속 테스트 하기 (Language : java)
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
  2. <%@ page language="java" import="java.sql.*" %>
  3.  
  4. <%
  5. String url = "jdbc:oracle:thin:@<HOST>:<PORT>:<SID>";
  6. String user = "<USER>";
  7. String pwd = "<PASSWORD>";
  8.  
  9. Connection conn = null;
  10.  
  11. try
  12. {
  13.     Class.forName("oracle.jdbc.driver.OracleDriver");
  14.     out.println("드라이버 로딩 성공");
  15.     out.println("<br /><br />");
  16.  
  17.     conn = DriverManager.getConnection(url, user, pwd);
  18.     out.println("DB 접속 성공");
  19.     out.println("<br /><br />");
  20. }
  21. {
  22.     e.printStackTrace();
  23.     out.println("드라이버 로딩 에러 : " + e.getMessage());
  24.     out.println("<br /><br />");
  25. }
  26. catch (SQLException e)
  27. {
  28.     e.printStackTrace();
  29.     out.println("DB 접속 에러 : " + e.getMessage());
  30.     out.println("<br /><br />");
  31. }
  32. finally
  33. {
  34.     if (null != conn)
  35.     {
  36.         try
  37.         {
  38.             conn.close();
  39.         }
  40.         catch (Exception e)
  41.         {
  42.             e.printStackTrace();
  43.         }
  44.         finally
  45.         {
  46.             conn = null;
  47.         }
  48.     }
  49. }
  50. %>

WAS 컨넥션 풀을 이용하여 접속 테스트 하기 (Language : java)
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
  2. <%@ page language="java" import="java.sql.*" %>
  3. <%@ page language="java" import="javax.sql.*" %>
  4. <%@ page language="java" import="javax.naming.*" %>
  5.  
  6. <%
  7. String jndi = "<JNDI>";
  8. String user = "<USER>";
  9. String pwd = "<PASSWORD>";
  10.  
  11. Context context = new InitialContext();
  12. DataSource ds = null;
  13. Connection conn = null;
  14.  
  15. try
  16. {
  17.     ds = (DataSource)context.lookup(jndi);
  18.     out.println("JNDI lookup 성공");
  19.     out.println("response.getWriter()<br /><br />");
  20. }
  21. catch (NamingException e)
  22. {
  23.     e.printStackTrace();
  24.     out.println("풀 에러 : " + e.getMessage());
  25.     out.println("<br /><br />");
  26. }
  27. finally
  28. {
  29.     if (null != context)
  30.     {
  31.         try
  32.         {
  33.             context.close();
  34.         }
  35.         catch (NamingException e)
  36.         {
  37.             e.printStackTrace();
  38.         }
  39.         finally
  40.         {
  41.             context = null;
  42.         }
  43.     }
  44. }
  45.  
  46. try
  47. {
  48.     conn = ds.getConnection();
  49.     out.println("getConnection() - DB 접속 성공");
  50.     out.println("<br /><br />");
  51. }
  52. catch (SQLException e)
  53. {
  54.     e.printStackTrace();
  55.     out.println("getConnection() - DB 접속 에러 : " + e.getMessage());
  56.     out.println("<br /><br />");
  57. }
  58. finally
  59. {
  60.     if (null != conn)
  61.     {
  62.         try
  63.         {
  64.             conn.close();
  65.         }
  66.         catch (Exception e)
  67.         {
  68.             e.printStackTrace();
  69.         }
  70.  
  71.         conn = null;
  72.     }
  73. }
  74.  
  75. try
  76. {
  77.     conn = ds.getConnection(user, pwd);
  78.     out.println("getConnection(\"" + user + "\", \"" + pwd + "\") - DB 접속 성공");
  79.     out.println("<br /><br />");
  80. }
  81. catch (SQLException e)
  82. {
  83.     e.printStackTrace();
  84.     out.println("getConnection(\"" + user + "\", \"" + pwd + "\") - DB 접속 에러 : " + e.getMessage());
  85.     out.println("<br /><br />");
  86. }
  87. finally
  88. {
  89.     if (null != conn)
  90.     {
  91.         try
  92.         {
  93.             conn.close();
  94.         }
  95.         catch (Exception e)
  96.         {
  97.             e.printStackTrace();
  98.         }
  99.  
  100.         conn = null;
  101.     }
  102. }
  103. %>
  104.  


Posted
Filed under 글로 기록하기
회사에 있는 지금 시간...

졸립다.

Posted
Filed under 글로 기록하기
4월 13일 (금) ~ 4월 15일 (일)까지 전산학과 총모꼬지였습니다. 졸업한지 2년이 넘게 지났지만, 길재와 토요일, 일요일동안 총모꼬지에 갔다왔습니다.

도착해서 해변에서 아이들 운동하는걸 지켜봤고, 저녁에는 장기자랑하는것도 지켜봤습니다. 그리고 일요일 아침 7시까지 같이 밤을 지새우기도 했습니다.

비록 제가 모르고, 저를 모르는 아이들이 많았지만... 제가 알고 있던 아이들과 새롭게 알게된 아이들이 있었기에 즐거운 시간이었습니다. 2007년을 맞이하고 그렇게 마음놓고 웃은적이 없네요...

정말 마음껏 웃을 수 있는 시간이었습니다.

Posted
Filed under 01010101
JavaScript의 Equality Operators에는 ==과 ===이 있습니다.

==는 두 값을 비교합니다. 이때, 타입이 서로 다르면, 비교 가능한 타입으로 변환해서 비교합니다.
===는 타입을 고려하여 두 값을 비교합니다.

== 예제 (Language : javascript)
  1. alert(1 == true); // true
  2. alert(0 == true); // false
  3. alert(1 == "1"); // true

=== 예제 (Language : javascript)
  1. alert(1 === true); // false
  2. alert(0 === true); // false
  3. alert(1 === "1"); // false


위 예제를 보면 명확하게 알 수 있습니다.
==는 타입을 변환하며 값을 비교하고 있고, ===는 값과 타입을 비교하고 있습니다.


참고
Core JavaScript 1.5 Reference:Operators:Comparison Operators
Posted
Filed under 글로 기록하기
스프링노트를 시작합니다.

스프링노트(이하 봄공책)는 오픈마루의 개인 위키 서비스입니다.

블로그와 봄공책의 용도는 다음과 같이 구분합니다.
블로그 : 시간 축의 기록 - 일기장
봄공책 : 내용 축의 기록 - 사전 or 단어장

주로 사용하는 기능은 msn을 이용해서 봄공책에 아이디어를 적는 것입니다.
봄공책 MSN 사용법
물론 이렇게 적은 아이디어는 따로 정리를 합니다.

하루 사용해보고 느낀점은...
  • 글쓰기는 봄공책이 편합니다.
  • 두개를 어떤 식으로든 연동하고 싶습니다.

Posted
Filed under 01010101
얼마 전에 phpschool에서 행복한고니 님의 특이한 javascript의 표현이라는 글을 보고 new Object()와 {}는 같다고 생각했습니다. 하지만, 이에 대해 숨어지내리 님은 반대 의견을 제기하셨고, 열띤 토론이 이루어지고 있습니다.


토론 내용만 봐서는 무엇이 사실인지 구분을 할 수 없어, 직접 rhino 소스를 분석해 보았습니다.


ScriptRuntime.java - new Object() 코드 (Language : java)
  1. public static Scriptable newObject(Context cx, Scriptable scope, String constructorName, Object[] args)
  2. {
  3.     scope = ScriptableObject.getTopLevelScope(scope);
  4.     Function ctor = getExistingCtor(cx, scope, constructorName);
  5.     if (args == null) { args = ScriptRuntime.emptyArgs; }
  6.     return ctor.construct(cx, scope, args);
  7. }

ScriptRuntime.java - literal {} 코드 (Language : java)
  1. public static Scriptable newObjectLiteral(Object[] propertyIds, Object[] propertyValues, Context cx, Scriptable scope)
  2. {
  3.     Scriptable object = cx.newObject(scope);
  4.     for (int i = 0, end = propertyIds.length; i != end; ++i) {
  5.         Object id = propertyIds[i];
  6.         Object value = propertyValues[i];
  7.         if (id instanceof String) {
  8.             ScriptableObject.putProperty(object, (String)id, value);
  9.         } else {
  10.             int index = ((Integer)id).intValue();
  11.             ScriptableObject.putProperty(object, index, value);
  12.         }
  13.     }
  14.     return object;
  15. }


코드를 간단하게 해석해 보면, new Object() 코드는 instance를 반환하고, literal {} 코드는 instance를 재가공해서 반환합니다.

즉, new Object() 와 literal {}는 같은 결과를 반환하기는 하지만, 내부적으로는 다르게 구현되어 있습니다.


어렵다. JavaScript

덧. JavaScript Literals 설명