2015년 1월 29일 목요일

[Windows 7] ODBC 설정시 Oracle Driver 설정 방법

과거 응용프로그램들 또는 설정을 해야 하는 경우가 간혹 발생을 하게 되는데 Windows7을 사용하지만 잘 알지 못하는 경우가 대부분이다.

평상시 처럼 제어판에 있는 ODBC를 열고나서 설정해야지 했더니 보이지 않는다. 앗 뭐지 잠시 생각하다가 뭔가 분명 32Bit와 64비트의 차이가 있을 것이다라는 흠짓한 생각들이 들면서 알게된 내용 누군가를 위하다기 보다는 내 스스로가 또 지나면 잊어 버릴 듯 하여 남겨 놓는다.

Oracle ODBC 드라이버가 32 Bit 이기 때문입니다. 따라서 "데이터 원본(ODBC)"을 32bit 모드로 실행을 하면 사용이 가능 하다.

1. Run CMD

2. C:\>%systemroot%\SysWOW64\odbcad32.exe  Enter

3. 뭐 나머지야 설정 하면 되겠지?

<< 오늘도 이래저래 주저리 주저리 궁시렁 궁시렁... 삽질 하지 않는 그날까지.>>

2015년 1월 26일 월요일

[Power Builder] datawindow.Update() option Example

오랜시간 PowerBuilder 사용하고 있으나 실상을 뒤집어 보면 아는게 별로 없는 허접한 개발자 맞다. 이제서야 정확한 이 옵션의 의미를 이해 했다는 것은 편의성이 가져다 주는 오만함을 심어 줬던것은 아니었을까. 역시나 내 무식함을 오늘도 한번 다시 느낀다.

Reference URL
http://infocenter.sybase.com/archive/index.jsp?topic=/com.sybase.help.pb_10.5.pbug/html/pbug/BHBHDIEG.htm


Example
Consider this situation: a DataWindow object is updating the Employee table, whose key is Emp_ID; all columns in the table are updatable. Suppose the user has changed the salary of employee 1001 from $50,000 to $65,000. This is what happens with the different settings for the WHERE clause columns:

If you choose Key Columns for the WHERE clause, the UPDATE statement looks like this:

UPDATE Employee
SET Salary = 65000
WHERE Emp_ID = 1001
This statement will succeed regardless of whether other users have modified the row since your application retrieved the row. For example, if another user had modified the salary to $70,000, that change will be overwritten when your application updates the database.

If you choose Key and Modified Columns for the WHERE clause, the UPDATE statement looks like this:

UPDATE Employee
SET Salary = 65000
WHERE Emp_ID = 1001
   AND Salary = 50000
Here the UPDATE statement is also checking the original value of the modified column in the WHERE clause. The statement will fail if another user changed the salary of employee 1001 since your application retrieved the row.

If you choose Key and Updatable Columns for the WHERE clause, the UPDATE statement looks like this:

UPDATE Employee
SET Salary = 65000
WHERE Emp_ID = 1001
   AND Salary = 50000
   AND Emp_Fname = original_value
   AND Emp_Lname = original_value
   AND Status = original_value

2015년 1월 14일 수요일

[Struts 2] Web Application - Getting Started

#과거 2004년도에 초기 Struts 1.3 버전 때 개발을 주로 하다가 프로그래밍 안한지 6년 7년 만에 필요한 것이 있어서 다시 시작하려니 이미 많은 부분이 바뀌어서 간단하게 만드는 부분이니 Struts 을 찾아 보다 또 버전이 업그레이드 되었다.

# 간략하게 정리 하면서 샘플을 만들어 봤다. 혹 나와 같은 사람이거나 새롭게 접근하는 친구들이 있다면 도움이 될지 모르겠다.

# 그러나, 개략적인 설명의 대부분은 기존 Struts 1을 경험한 사람을 위주로 하였음을 미안하게 생각한다. 또는 기존에 Web 관련 개발을 해본 친구들이라면 함께 이해하고 넘어가는데 큰 어려움이 없을것으로 생각된다.


[이미지출처 - 스프링3입문]

위 사진은 전반적인 구성을 보여주고 있다. 브라우저에서 요청이 들어 오면 일단 프론트 컨트롤러가 받아서 공통된 처리를 시행하면서 개별 처리와 뷰를 호출하는 구조로 되어 있다. 개별처리 부분에선 데이터에 대한 모델이 필요한 경우 참조하게 된다. 이구성은 기존의 Struts1 과도 동일하다는 것을 알 수 있다.

단지 차이가 좀 있다면 기존의 Struts1 에서는 로그인이나 입력되는 Form 관련 페이지에서 Form 값을 받아 주는 ActionForm 클래스를 상속받아서 처리 해줘야 하는 번거로움이 있었다. 그런데 버전 2.0 대에 오면서 이 부분이 없어졌다.



[이미지출처 - 스프링3입문]




# 실행을 위한 사전 준비사항

1) web.xml파일 설정
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"
version="2.5">
    <display-name>inv</display-name>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 
    <resource-ref>
        <res-ref-name>jdbc/myoracle</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

2) Action 설정
import org.apache.struts2.dispatcher.SessionMap;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;
import Resource;
import User;
import HrInfoService;
import HrInfoServiceImpl;
public class LoginAction extends ActionSupport  implements Preparable {
private static final long serialVersionUID = 9149826260758390091L;
private User user;
private Resource resource;
private HrInfoService hrInfoService;
private String id;
private String password;
private String companyName;

public void prepare() {
resource = new Resource();
resource.setDriver(getText("driver"));
resource.setUrl(getText("url"));
resource.setUsername(getText("username"));
resource.setPassword(getText("password"));

hrInfoService = new HrInfoServiceImpl();
}
public String loginForm() {
return SUCCESS;
}

public String login() throws Exception {
User user = new User();
user.setId(this.id);
user.setPassword(this.password);
User isValidLogon = hrInfoService.authenticateLogin(resource, user);

if (isValidLogon != null) {
String id = isValidLogon.getId();

@SuppressWarnings({ "rawtypes", "unchecked" })
SessionMap<String, String> session = (SessionMap) ActionContext.getContext().getSession();
session.put("userId", id);
session.put("companyName", companyName);
return SUCCESS;
} else {
addActionError("Incorrect ID or password");
return INPUT;
}
}

// ---------------------------- Log Out register user
public String logOut() {
@SuppressWarnings("rawtypes")
SessionMap session = (SessionMap) ActionContext.getContext().getSession();
session.remove("userId");
addActionMessage("You Have Been Successfully Logged Out");
return SUCCESS;
}
public void setuser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

3) JSP 페이지 설정
<%@ page contentType="text/html; charset=UTF-8"%>
<!doctype html>
<html lang="ko">
<head>
<title>SUNATFOOD - Purchase</title>
<link rel="stylesheet" href="css/baseStyle.css" />
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body >
<header>
<hgroup>
<h1>Example</h1>
</hgroup>
</header>
<nav>
<ul>
<li><a href="index.jsp">Home</a></li>
<li><a href="#">About Us</a></li>
</ul>
</nav>

<article>
<section>
<header>
<h1>Beta Test HTML5 적용 (크롬브라우저 사용 권장 최적화) </h1>
</header>
<form action="/login.action" method="post">
<label for="id">LogIn ID:</label>
<input type="text" required name="id" id="id" placeholder="Enter your id" autofocus><br />
<label for="password">LogIn Password:</label>
<input type="password" required name="password" id="password" placeholder="Enter your password"><br />
<input type="submit" value="LOG-IN">
</form>
</section>

</article>

<footer>
<p>&copy; **** All rights reserved.</p>
</footer>
</body>
</html>


4) struts.xml 작성
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default" namespace="/">      
<!-- Login Action -->
<action name="loginForm" class="saf.hr.action.LoginAction" method="loginForm">
<result name="success">/index.jsp</result>
</action>
<action name="login" class="saf.hr.action.LoginAction" method="login">
<result name="success" type="redirect">/getPayInfoList.action</result>
<result name="input">/index.jsp</result>
</action>
<action name="logOut" class="saf.hr.action.LoginAction" method="logOut">
<result name="success" type="redirect">/loginForm.action</result>
</action>
</package>
</struts>



[Struts 2] Web Application - Env. Configuration


# Reference URL - http://struts.apache.org/docs/tutorials.html 

아래 문서는 내부 구성원을 위한 간략한 설정 및 설치를 위한 정보 공유에 목적이 있으며 IT의 구성 환경에 따라 달라 질 수 있으므로 개인적인 활용에는 적절하지 않을 수도 있다.

1. 개발환경
- Windows 7 64Bit Pro
- Java  JDK 1.7.0_55
http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=ocomen
- Struts 2.3.16.3
http://archive.apache.org/dist/struts/binaries/ 
- Spring Tool Suite (STS) R3.6.1
 : https://spring.io/tools


2. 운용환경
- CentOS 6.5 64Bit
- apache Tomcat 7.0
 : http://tomcat.apache.org/download-70.cgi


3. 설치 및 설정
 JDK와 Struts 버전에 관한 관리를 위해서 lib 폴더는 버전별로 별도로 관리 하고 향후 STS에서 버전별 그리고 기능별로 분리 관리 하여 사용할 수 있도록 한다. 예를 들면 아래와 같은 화면으로 User Library 를 추가하여 관리 한다.

개발 하고자 하는 경우에 따라 버전별로 기능별로 구성하여 Build Path 를 구성 할 수 있다. 

가장 필수가 되는 라이브러리는 데이터베이스 관련 JDBC 라이브러리 이다. 우리는 오라클 11g 를 사용하는 관계로 아래 링크의 라이브러리 파일을 추가 하여 활용 한다. 오라클의 정책이 변경되서 인지 모르겠으나 어느 시점 부터는 로그인이 필요하도록 연결되어 있으니 만일 오라클 계정이 없다면 추가 한 이후에 가능 할 것으로 생각 된다. 

Oracle Database 11g Release 2 JDBC Drivers

Help URL 

라이브러리 설정이 완료된 이후엔 기존 Web Application 을 연결 또는 신규로 프로젝트를 생성하여 구성한다. 

우리는 기본 구성을 다음과 같이 한다. 
패키지 명명 기준은 "계열사명.서브시스템.action, dao, odel, service " 로 구성한다. 또한 기본구성이 되는 properties 파일은 기준이 되는 파일을 공용 디스크에서 공유된 파일로 복사 하여 맞춘다. 











2015년 1월 9일 금요일

[Book #24] 여기에 당신의 욕망이 보인다. - 송길영 지음





"욕망을 이해하면 미래를 알 수 있다!"

『여기에 당신의 욕망이 보인다』는 다음소프트 부사장 송길영이 소셜 빅 데이터를 통해 미래를 보는 새로운 눈을 제시한다. 그 매개체는 모바일의 확산과 함께 폭발하기 시작한 소셜미디어로 자동차, 전자, 식음료, 패션, 헬스케어, 홈쇼핑 등 산업의 전 분야를 망라한 한국의 실제 빅 데이터 분석사례 20여 건을 소개한다. 아울러 선거와 사람들의 라이프스타일, 셀러브리티의 이미지 등 우리 삶 전반에 투영된 대중의 생각과 불만, 욕망을 데이터에서 뽑아내 해석하는 법을 제시한다.

각 장의 말미에는 빅 데이터를 도입하고 싶은 경영자나 마케터, 빅 데이터에서 기회를 찾고 싶은 학생이나 IT 전문가들에게 주는 당부의 말이 담겨 있다. 최근의 빅 데이터 열풍은 세상의 모든 문제를 해결해줄 듯이 거세지만, 저자는 데이터 자체만으로는 아무것도 할 수 없다고 잘라 말한다. 그가 10여 년간 소셜미디어를 분석하면서 깨달은 것은, 데이터가 아니라 그 안에 숨은 사람의 욕망을 보는 데 집중해야 한다는 것이다.

[인터넷 교보문고 발췌] 

2014년 반년동안 이래 저래 여러가지 이유로 정신 없이 보내다 보니 그 좋아 하던 책을 지근에 두지 못한 잘못을 저질렀죠. 2015년엔 다시 정신좀 차리고 매월 책 추천을 부지런히 해야 겠습니다. 그 첫 시작을 데이터로 시작해보고자 한다. 빅데이터라는 키워드에 관심을 갖기 시작한 것이 4년? 5년이 되어 간다. 물론 그렇다고 내가 빅데이터의 전문가 라든가 하는 것은 절대로 아니다. 찾아 보면 볼 수록 참으로 넓은 지식과 통찰력이 필요 한 것은 아닌가 하는 한숨을 쉬고 있게 되니 말이다.

IT 기술서적이 아니라는 것으로 일단 시작을 해보자. 이책을 알게된건 송길영 이란 저자를 알게 됨이었을것이다. 어느날 KBS 시사기획 창 빅데이터 세상을 바꾸다 란 프로그램에서 나온 소셜미디어분석의 사례를 통한 매출 변화 경쟁사에 대한 판단 그리고 마케팅 포지셔닝에 대한 생각들. 그 뿐 아니라 세상의 트랜드를 읽어 내는 것이 바로 사람을 이해하고 사람의 마음을 이해 하는 것이 결국 그 트랜드를 인지 할 수 있는 아주 좋은 접근 방식이라는 것 티비를 보는 내내 무릎을 칠 수 밖에 없고 와 난 왜 이제서야 저것을 보게 되었는가 라는 스스로의 무지함을 한탄하고 있었다.

이 책을 통해 다음소포트가 그동안 해왔던 여러가지 사례들을 설명하고 어떤 효과가 있었는지에 대한 설명을 해주고 있다. 그중에 "왜" 구매하는가 라는 색션이 있는데 그부분의 일부를 발췌하여 정리 해본다.

** 본문 일부 발췌

"아이패드 최고의 어린이 선물"
통화 기능도 없는 아이패드를 왜 살까? 단지 멋있다는 이유로? 그리고 누가 살까?
아이패드와 사람과의 연관도를 측정해 보면 '가지고 다닐 수 있는 것들' 중에서 어린이와 연관도가 가장 높은 것으로 나타났다. 결코 어린이 용으로 만든 제품이 아니다. 그런데 어떻게 된것일까? 인터넷의 글들을 보면 " 아이패드를 아이한테 뺐겼어요" "아이패드 앱을 사용하면 빠져나오지 못해요 " 우리딸이 앱을 열고 노래를 골라서 춤을 추고 놀아요 "

14개월 된 아이는 말을 못하니 소비자 조사가 불가능 하다. 설령 대상이 성인이라도 그 제품을 쓰는지 본인도 정확히 설명하기 어렵다. "스타벅스 좋아요?" 라고 물어서 "네"라고 대답한 사람에게 "왜요?"라고 물으면 말을 못한다. 기껏해야 공정무역이니까, 스타번스는 문화를 파니까 같은 스타벅스가 우리에게 말해준 마케팅 메세지를 반복하는데 그친다. 그러나 우리는 소비자에게 일일이 묻지 말고 관찰해서 알아내야 한다.

이 접근 방식은 문화기술지(ethnography)의 방식과 흡사하다. 이는 동행관찰 기법과 같이 한 사회의 문화에 대해 기술적으로 연구하는 과정을 뜻한다. 소셜미디어를 통한 분석은 인터넷을 통하기 때문에 네스노그라피(internet + ethnography)라 명명하되기도 한다. 관찰한 결과 어린이가 좋아한다고 하니 애플로서는 즐거운 일이다. 아이를 위해서 지갑이 쉽게 열리니까. 디바이스가 비슷한 아이폰은 통화하고 메일 보내고 음악듣고 블로그를 보는 "휴대폰"으로 인식되는 반면, 아이패드는 책도 읽고 티비도 보고 인터넷도 할 수 있는 선물로 각인돼 있다. 마케팅의 본분이 구매 결정 단계에서 "사아할 이유"를 주는 것이라고 할때 이처럼 숭고한 이유가 어디 있겠는가.


통신회사 담당자라면 아이패드를 자기 회사에서(데이터 요금을 사용하는) 사는것이겠으나 소비자 입장에서 무슨 상관이 있겠는가? 위 도포에서 4개의 "왜"를 설명할 수 있어야 한다. 그러려면 소비자들이 각 단계마다 어떤 점을 고려하는지를 이해하고 있어야 한다. 소비자들이 엄청나게 똑똑해 졌기 때문에 마케팅은 점점 까다로워지고 있다. 소비자의 머릿속을 들여다보지 않은채 " 이걸 해주면 좋아 할 꺼야" 라고 지레짐작하는 건 금물이다.

모든 업종들이 위와 같은 의사결정 단계는 아닐 것이다. 근본적인 "왜" 라는 질문에서 완전히 벗어난다고 보기도 어렵다. 여러가지 형태들의 맛집을 제공하는 서비스들이 많다. 블러그를 기반으로 사람들의 성향으로 빅데이터 서비스를 한다고 하는 업체들도 있고 기발한 아이디어도 있고 하지만 아직은 좀 조심스러운 입장이다. 물론 개인적인 사견일 뿐이지만 말이다. 우리가 과거에 해왔던 많은 것들은 과거의 우리 데이터를 바라 보고 또는 경험을 가지고 우리 소비자들(매장을 방문하는 고객들)의 성향이 이랬어 이런 계절적인 영향이 있었어 라든가 이벤트에 반응을 했어 라는 것만으로는 부족함을 몸소 느끼게 된다. 그렇다면 과연 우린 그들의 머릿속 마음속에 들어가 그들이 원하는 것이 무엇인가를 알아가려는 노력을 해야 하는 것은 아닐까. 연관된 키워들을 어떻게 변화 하고 있는지 결국 그러한 변화는 시장의 트랜드가 아닌 사람의 마음이라는 결론이 정말이지 100% 공감이 되는 내용이다. 그런 사람의 마음을 읽어 내려면 기존 구매 내역 + 외부 연관단어(소셜미디어&블러그) + 다양한 접근 분석력  이세가지가 우선 기본되어야 하지 않을까 생각이 든다.

아래는 책 뒷부분에 있는 카페에 대한 소셜미디어 감성분석에 사례이다. 이러한 변화를 볼 수 있다는 것도 있지만 또 한가지 데이터를 바라보고 분석해 내놓은 다양한 관점이 함께 수반되어야 한다는 말을 하고 싶었다.


가볍게 책에서 사례나 내용들을 보았다면 실제로 그러한 사례들을 활용하는 서비스들을 아랠의 링크에서 간략하게 접해 볼 수 있을 것이다.

맛집 랭크와 관련된 서비스
* 레드테이블 - http://redtable.kr/about.php?p=rti
* 식신(웹서비스) - http://www.siksinhot.com/
* 다이닝코드 - http://www.diningcode.com/

오프라인 데이터 분석 워크인사이트(지오)
* 워크인사이트 - http://walkinsights.com/

언제 부터 였던가 생각해보니 아르바이트 겸 외부 컨설팅을 의뢰 받고 맥북 프로를 처음 써봤을 때 부터 였던 것 같다. 지금은 거의 대부분의 작업을 맥으로 작업을 하다 보니 윈도우에서만 실행되는 일부 프로그램들 때문과 회사 내부 ERP프로그램이 윈도우 ...