Sunny Son's Blog (손인선)

June 30, 2017

ICS(Integration Cloud Service)를 통한 HCM(Human Capital Management) 연계 (Integrate HCM and others via ICS)

Filed under: Cloud — sunnyson @ 1:23 pm
Tags: , , , ,

Oracle 의 기존 ERP제품의 클라우드 버젼이 많이 발표 되었습니다.
대표적인 제품 중의 하나가 HCM(Human Capital Management) 제품입니다.
한국에서도 모 회사에 판매가 되어 좋은 레퍼런스가 되고 있습니다.

이 서비스 POC 중에 경험 했던 내용을 정리하고자 합니다.

사용된 제품은 HCM과 이를 연계하기 위한 ICS (Integration Cloud Service) 입니다.

HCM을 사용하게 되면 볼 수 있는 화면은 다음과 같습니다.

HCM GUI

이번 시나리오는 Employee Information을 조회 / 업데이트 하는 것입니다.
HCM상에서 조회하는 화면은 다음과 같습니다.

HCM_Employee_Information

전체 시나리오 화면은 다음과 같습니다.

HCM_Integration_Scenario

클라이언트 단은 별도의 프로그램을 작성하지 않고 SOAP UI를 통하여 JSON 형태의 데이터를 전달하였습니다.

HCM_Integration_Scenario2

이제 그 절차에 대해서 화면으로 설명하겠습니다.

Slide6Slide7

이 부분은 HCM에서 확인하는 것입니다. Business Object 를 탐색하는 것입니다. 해당 Business Object를 찾는게 어렵기는 합니다.

Slide8

실제로 HCM Business Object는 웹서비스 형태입니다. 이렇게 WSDL형태로 외부에 노출이 됩니다.

새로운 Integration을 생성합니다.

Slide9

HCM과의 연계를 위하여 새로이 어댑터를 생성하고자 합니다. Oracle HCM Cloud를 선택합니다.

Slide10

신규 HCM 연결 어댑터를 만드는 겁니다. 이름 지정합니다.

Slide11

HCM_Invoke라는 것을 만들었습니다. 아래 보시면 WSDL URL이 있습니다.

Slide12

HCM을 연결하기 위한 ID / Password 등이 보입니다.

Slide13

신규 Integration을 작성하고자 합니다. 편의를 위해서 4가지의 기본 Style 혹은 Pattern을 제공합니다. 선택하셔서 실제 편집중에 수정하실 수 있습니다.

Slide14

Integration에 대한 이름등을 지정합니다.

Slide15

Trigger 부분에서 부터 시작합니다. 즉, 외부 Client가 호출하는 부분입니다. 여기서는 REST로 하겠습니다. 왼쪽의 Generic Rest Connector를 Drag & Drop해서 가운데 동그라미 부분에 넣습니다.

Slide16

이 REST Endpoint 부분에 대한 설정을 합니다. 이 부분은 HCM의 데이터를 갖고 오는 시나리오이므로, REST의 룰에 의해 GET 을 선택합니다.

Slide17

REST API는 Query Parameter 를 전달합니다. 이 Query Parameter에 HCM에서 데이터를 조회할 키 부분을 넣을 수 있습니다.

Slide18

조회한 데이터를 Client에 돌려 주는 JSON 데이터를 미리 작성한 샘플로 넣었습니다.

Slide19

종료되었습니다.

Slide20

이제 가장 앞 Trigger 부분이 생성되었습니다. 그리고 바로 아래 화살표 부분이 같이 생성됩니다. 이것은 데이터 매핑을 위해 자동으로 생성되는 것입니다.

Slide21

이제 HCM 부분을 호출해야 합니다. 이를 위해서 앞서 생성한 HCM Connector를 Drag & Drop 으로 생성합니다.

Slide22초기화 작업 중입니다.

Slide23

이 부분은 HCM을 호출하는 어댑터 이름을 지정합니다.

Slide24

앞서 Connector 생성시에는 연결 정보만 있습니다. 이제 실제 HCM에서 호출할 Business Object를 선택해야 합니다. 이 부분에 대해서는 HCM Consultant 에게 도움을 받아야할 것 같습니다.

Slide25

생성 되었습니다.

Slide26

Client에서 들어오는 데이터를 HCM을 호출하기 위하여 변경하여야 합니다.

Slide27

앞서 Query Parameter로 받은 값을 HCM에서 필요로 하는 값으로 매핑합니다.

Slide28

이제 Client에 반환하는 데이터를 매핑합니다.

Slide29

왼쪽이 HCM 데이터입니다. 이 부분에서 필요로 하는 부분을 오른쪽으로 매핑합니다.

Slide30

이제 다 됬습니다.

Slide31

개발자의 가장 중요한 부분의 하나는 모니터링입니다. 지나 다니는 데이터를 확인할 수 있습니다. 저는 Phone Number를 선택하였습니다.

Slide33

작업을 마친 Integration은 바로 작동하지 않습니다. 일단 Pending 상태이구요, 원하실때 Activation 하면 됩니다. 가운데 체크 표시는 앞서 지정한 모니터링 부분을 수행할 것인지를 묻는 것입니다.

Slide34

해당 Integration의 오른쪽에 느낌표가 있습니다. 이 부분에 마우스를 올리면 해당 Integration에 대한 정보를 확인할 수 있습니다.

Slide35

위의 URL (파란색 부분)을 클릭하면 해당 Integration 에 Endpoint에 접속합니다. 어떤 Method를 사용하는지, 어떤 형태의 데이터를 넣어야 하는지, 어떤 결과 값을 받는지를 참조하여 프로그래머에게 도움을 줄 수 있습니다.

Slide36

SOAP UI를 통해 간단하게 테스트 해봤습니다.

Slide37

테스트 도구는 다양합니다. POST MAN도 있구요, 저는 Firefox를 사용하는데 REST Client라는 Add-on 프로그램도 꽤 좋은 툴입니다.

이상이 Employee Information 을 조회하는 설정입니다.

다음은 Update를 하는 부분입니다. 참조하세요

Slide38Slide39

ICS는 기본적으로 Endpoint 라는, 이 시나리오에서는 SOAP UI라는 Client를 사용하는데요, 외부에 노출되는 부분을 생성합니다. 기본적으로 REST 형태를 지원하지만, 필요하다면 SOAP 등도 사용할 수 있습니다.

Slide40

이부분은 Update 이기 때문에, REST 사용시 기본적인 PUT option 을 선택합니다.

Slide41

잘 아시겠지만, REST는 Query Parameter를 지정해야 하죠. 이번에는 PUT 이기 때문에 Query Parameter는 지정하지 않겠습니다.

Slide42

이번 시나리오에서는 JSON  데이터를 사용하고자 합니다. 이때 XML, URL-encoded 데이터 형태도 사용할 수 있습니다.

Slide43

이미 생성된 JSON 데이터를 업로드하실 수도 있고, 아니면 간략하게 샘플 데이터를 직접 넣을 수도 있습니다.

Slide44Slide45Slide46

이 부분이 ICS 제품에서 실제 디자인을 담당하는 화면입니다. 가장 윗 부분에 보이는 UpdatePhone(trigger) 라는 부분이 외부에서 호출되는 부분입니다. 그리고 다음 UpdatePhone(화살표) 부분은 JSON data를 매핑하는 부분입니다.

Slide47

왼쪽에 보이는 Invokes 부분에서 이미 만들어진 HCM_Invoke Adapter 부분을 Drag & Drop 형태로 끼워 놓습니다.

Slide48

HCM 을 호출하는 커넥터 부분입니다. 어댑터라고도 하구요. 이 부분의 이름을 변경하실 수도 있습니다.

Slide49

앞서 Query 부분에서 보았듯이, HCM Connector기본적으로는 HCM에 연결하기 위한 기본적인 연결 정보만을 가지고 있습니다. 이제 HCM에서 실제 호출할 서비스 명을 지정합니다. 필요하다면 이 작업을 여러번 하여 여러개의 서비스를 호출할 수 있습니다.

Slide50Slide51

HCM Connector를 배치하면 다시 화살표 모양의 매핑할 수 있는 component가 생성됩니다.

Slide52

이제 매핑을 해보겠습니다. 일차로 client에서 들어온 데이터를 HCM을 호출 할때 사용하도록 데이터 매핑을 하겠습니다.

Slide53

왼쪽은 Client에서 들어온 데이터이고 오른쪽은 HCM의 mergePerson 이라는 서비스를 호출하는 메타 데이터입니다. 이 메타 데이터가 일반적으로 굉장히 복잡합니다. 정확한 데이터의 위치를 찾는 것이 상당히 어렵습니다. 저도 이 부분을 확인하느라고 HCM GUI와 계속 비교 해봤었습니다.

Slide54

다시 Client에게 돌려주는 부분의 매핑도 합니다. (생략)

Slide55

ICS상에서 실제 운영시 모니터링을 할 수 있습니다. 이 때 어떠한 데이터를 모니터링 할 것인가를 결정하는 부분입니다. 저는 전화번호를 수정할 꺼니까 이 부분을 모니터링 하기로 했습니다.

Slide56

ICS 에서 작업을 마쳤습니다. 작업은 마쳤지만, 실행이 되는 것은 아닙니다. Activation 이라는 부분을 마쳐야 하는 것이죠. 위의 그림에서 보듯이 오른쪽에 초록색 화살표로 되는 것이 실제 작동하는 것이고, Pending Activation 은 실제로 구동하지 않는 것입니다. 실제 운영시에도 언제든지 이 부분의 선택을 통하여 작동 / 정지를 선택할 수 있습니다.

Slide57Slide58

작성한 Integration 의 옆에 보면 느낌표가 있습니다. 이 느낌표 위에 마우스를 올리면 해당 Integration에 대한 정보를 알 수 있습니다. 특히 Endpoint URL이 있는데요(즉 Client에서 연결하는 부분) 이 부분은 다시 링크가 되어 있습니다. 이 부분을 클릭하면 다음의 데이터를 확인할 수 있습니다.

Slide59

앞서 URL를 선택하면 나오는 샘플 및 Method 등입니다. 앞서 Integration 작성시 넣었던 샘플이 사용되어 예를 들어주고 있습니다.

Slide60

SOAP UI를 통하여 역시 테스트를 마쳤습니다.

Slide61

실제 HCM UI를 통하여 특정인의 데이터를 변경한 화면입니다.

이상이 HCM의 데이터를 조회하고 업데이트 하는 방법입니다.

감사합니다.

Advertisements

June 23, 2016

VOA Podcast titles on 23rd June 2016

Filed under: English,써니 — sunnyson @ 6:28 pm

Uffizi, Indiana University Make Digital Copies of Sculptures
Jaguar Killed After Olympic Torch Presentation
Rare Rescue for Sick South Pole Workers
North Korea’s Missile Tests Show Progress
Islamist Extremism in America: Is Religion the Problem?
New Updates to iPhone Software

June 22, 2016

VOA PodCast titles on 21st June 2016

Filed under: English — sunnyson @ 8:35 am

FBI: Orlando Shooter Was ‘Chilling, Calm and Deliberate’
Iran Claims It Has Stopped a Major Terrorist Attack
Aspirin May Cut Cancer Deaths
Cavaliers Give Cleveland First Championship in 52 Years
Donald Trump’s Campaign Manager Dismissed
UN: 24 People Displaced Every Minute
EU President Says Europe Must Deal with Dissatisfaction

June 17, 2016

English word from VOA

Filed under: English — sunnyson @ 10:21 am
  1. they believe they do not abide by their attitudes toward sexuality
    그들은 성적문제에 대한 그들의 태도를 (다른) 그들이 준수하지 않는다고 생각한다.

 

 

June 15, 2016

Oracle MFT – callout to support sub-directory

Filed under: 써니,SOA — sunnyson @ 6:07 pm
Tags: , , , , ,

Till now (June 15th 2016), Oracle MFT product doesn’t support file transferring especially with sub-directory.
So thus, I made a Java Callout in order to resolve this matter for a customer who purchased and need it urgently.


  1. Source Pre-processing
    – Java Callout : com.oracle.callout.sample.SrcPre1
    -Xml file for Callout : SrcPre1.xml
  2. Target Pre-processing
    -Java Callout : com.oracle.callout.sample.InsertFolderForFTP
    -Xml file for Callout : InsertFolderForFTP.xml
  3. Compile
    – Core-12.1.1.0.jar, mdsrt.jar should be added into CLASSPATH
    – Org.apache.commons-net-1.4.1.jar( for FTP)
  4. Install
    -$ cp InsertFolderForFTP.jar $MW_HOME/user_projects/domains/base_domain/mft/callouts/
    -$ $MW_HOME/mft/common/bin/wlst.sh
    -connect(“weblogic”, “<PASSWORD>, “t3://localhost:7001”)
    -createCallouts(‘/home/oracle/InsertFolderForFTP.xml’)
    -createCallouts(‘/home/oracle/SrcPre1.xml’)
  5. Log : /tmp/mft/*.log
    – Hard coded at Java Callout source itself. It should be changed.

Java Source code –  SrcPre1.java

package com.oracle.callout.sample;

import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

import java.io.PrintWriter;

import java.util.Map;

import oracle.tip.mft.engine.processsor.plugin.PluginContext;
import oracle.tip.mft.engine.processsor.plugin.PluginOutput;
import oracle.tip.mft.engine.processsor.plugin.PreCalloutPlugin;
import oracle.tip.mft.bean.MFTMessage;
import oracle.tip.mft.bean.SourceMessage;
import oracle.tip.mft.bean.TargetMessage;

import java.sql.*;

import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Hashtable;

import java.util.Iterator;
import java.util.List;

import java.util.StringTokenizer;

import javax.naming.*;

import oracle.tip.mft.engine.mds.MdsManager;
import oracle.tip.mft.mds.model.source.SourceMO;
import oracle.tip.mft.system.MFTBeanFactory;
import oracle.tip.mft.system.MFTUtil;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import oracle.mds.core.*;

import oracle.tip.mft.common.transport.util.EngineTransportUtil;
import oracle.tip.mft.mds.model.binding.TechnologyBindingType;
import oracle.tip.mft.mds.model.category.SourceTargetCategoryType;

//import com.google.common.base.Splitter;

public class SrcPre1 implements PreCalloutPlugin {

@Override
public boolean isPayloadChangeRequired(PluginContext pluginContext, Map<String, String> map) {
return false;
}

@Override
// This function will be called only if the isPayloadChangesRequired returns false.
public PluginOutput process(PluginContext pluginContext, InputStream input, Map<String, String> calloutParams) {
PluginOutput res = new PluginOutput();

try {
PluginOutput out    = new PluginOutput();
String protocolType = “FTP”;
String FolderName   = null;

String SourceName = getSourceName(pluginContext.getMessage().toString());
MdsManager mdsMgr = (MdsManager) MFTBeanFactory.getBean(“mdsManager”);

List moList = mdsMgr.getAllSources();
SourceMO mo;

for (Iterator i$ = moList.iterator(); i$.hasNext();) {
mo = (SourceMO) i$.next();

//                logme(“\n getSourceID = [” + mo.getSource().getId() + “]”);
//                logme(“\n getSourceName = [” + mo.getSource().getName() + “]”);
//                logme(“\n getSourceID = [” + mo.getSource().toString() + “]”);
//                logme(“\n getSourceID = [” + mo.getMDSInstance().getMDSConfig().toString() + “]”);
//                logme(“\n getSourceID = [” + mo.getTypeName().toString() + “]”);
//                logme(“\n getSourceID = [” + mo.getReference().getMOName() + “]”);

SourceTargetCategoryType sourceTargetCategory =
mo.getSource().getSourceType().getSourceTargetCategory();
String _SourceName = mo.getSource().getName();
TechnologyBindingType protocal = EngineTransportUtil.getTechnologyBindingFromMO(sourceTargetCategory);
if (protocal != null && _SourceName.equals(SourceName)) {
protocolType = protocal.getType();
//                    logme(“protocolType = ” + protocolType + “,SourceName = ” + SourceName);
if (protocolType.equals(“FTP”)) {
TechnologyBindingType.FTPType ftptype = protocal.getFTP();
FolderName = ftptype.getFolder();
break;
} else if (protocolType.equals(“SSH-FTP”)) {
TechnologyBindingType.SSHFTPType sshftptype = protocal.getSSHFTP();
FolderName = sshftptype.getFolder();

break;
}
break;

}
}

logme(“++ Source [” + pluginContext.getCustomPropertyMap().get(“directory.path”) +
“/” + pluginContext.getTransformedInputFileName() +
“] with “+protocolType+”, SourceName = [” + SourceName + “]++”);
//Debug
//logme(“\n++ Source Context tostring = [” + pluginContext.getMessage().toString() + “]”);
//logme(“\n++ Source Context tostring = [” + pluginContext.getTransformedInputFileName()+ “]”);
// In order to pass root directory of source server.
pluginContext.getCustomPropertyMap().put(“FolderName”, FolderName);
return out;
} catch (Exception e) {
e.printStackTrace();
res.setException(new Exception(“Callout:RENAMEEXP- Exception in custom plugin class:\n” +
pluginContext.getMessage()));
}
return res;
}

@Override
// This function will be called only if the isPayloadChangesRequired returns true.
public PluginOutput process(PluginContext context, InputStream input, OutputStream out,
Map<String, String> calloutParams) {
return null;
}

public void logme(String text) {
try {
PrintWriter output = new PrintWriter(new BufferedWriter(new FileWriter(“/tmp/mft/RenameRegexp.txt”, true)));
String timeStamp = new SimpleDateFormat(“yyyy.MM.dd.HH.mm.ss”).format(new java.util.Date());
output.write(timeStamp + “:”);
output.write(text);
output.write(“\n”);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}

public String getSourceName(String _input) {
String _s2 = null, _s3 = null;

StringTokenizer st1 = new StringTokenizer(_input, “, “);
while (st1.hasMoreElements()) {
//System.out.println(st1.nextElement());
_s2 = (String) st1.nextElement();
if (_s2.contains(“sourceName=”)) {
_s3 = _s2.substring(_s2.lastIndexOf(“sourceName=”) + “sourceName=”.length());
break;
}
}
return _s3;
}

}

 


Java Source code –  InsertFolderForFTP.java

package com.oracle.callout.sample;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

import java.io.PrintWriter;

import java.util.Map;

import oracle.tip.mft.engine.processsor.plugin.PluginContext;
import oracle.tip.mft.engine.processsor.plugin.PluginOutput;
import oracle.tip.mft.engine.processsor.plugin.PreCalloutPlugin;
import oracle.tip.mft.bean.MFTMessage;
import oracle.tip.mft.bean.SourceMessage;
import oracle.tip.mft.bean.TargetMessage;

import java.sql.*;

import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Hashtable;

import java.util.Iterator;
import java.util.List;

import java.util.StringTokenizer;

import javax.naming.*;

import oracle.tip.mft.system.MFTUtil;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import oracle.tip.mft.bean.*;
import oracle.tip.mft.common.transport.util.EngineTransportUtil;
import oracle.tip.mft.engine.mds.MdsManager;
import oracle.tip.mft.mds.model.binding.TechnologyBindingType;
import oracle.tip.mft.mds.model.category.SourceTargetCategoryType;
import oracle.tip.mft.mds.model.security.SSH;
import oracle.tip.mft.mds.model.source.SourceMO;
import oracle.tip.mft.mds.model.target.TargetMO;
import oracle.tip.mft.security.SecurityUtility;
import oracle.tip.mft.system.GlobalContext;
import oracle.tip.mft.system.MFTBeanFactory;
import oracle.tip.mft.transport.adapter.impl.ftp.FTPTransportReceiver;
import oracle.tip.mft.transport.adapter.impl.ftp.FTPTransportUtil;

public class InsertFolderForFTP implements PreCalloutPlugin {

@Override
public boolean isPayloadChangeRequired(PluginContext pluginContext, Map<String, String> map) {
return false;
}

@Override
// This function will be called only if the isPayloadChangesRequired returns false.
public PluginOutput process(PluginContext pluginContext, InputStream input, Map<String, String> calloutParams) {
PluginOutput res = new PluginOutput();
String newfname = “”;
String oldfname = “”;
String protocol = “FTP”;

try {
// Should be considered how to get rid of these parameters. It should be inherited from MFT framework
String TargetName     = getTargetName(pluginContext.getMessage().toString());
String TargetFolder   = null;
String TargetHostname = null;
String Targetusername = null;
String Targetpassword = null;
String protocolType   = null;
int TargetPort = 21;

// this code only works for Target Pre- processing
PluginOutput out = new PluginOutput();
oldfname         = pluginContext.getTransformedInputFileName();

// Query MDS to get all target list and compare with name from MFTConsole configuration
MdsManager mdsMgr = (MdsManager) MFTBeanFactory.getBean(“mdsManager”);
List moList = mdsMgr.getAllTargets();
TargetMO mo;

for (Iterator i$ = moList.iterator(); i$.hasNext();) {
mo = (TargetMO) i$.next();

SourceTargetCategoryType sourceTargetCategory =
mo.getTarget().getTargetType().getSourceTargetCategory();

TechnologyBindingType protocal = EngineTransportUtil.getTechnologyBindingFromMO(sourceTargetCategory);
String _TargetName = mo.getTarget().getName();
if (protocal != null && _TargetName.equals(TargetName)) {
protocolType = protocal.getType();
if (protocolType.equals(“FTP”)) {
TechnologyBindingType.FTPType ftptype = protocal.getFTP();
TargetFolder   = ftptype.getFolder();
TargetHostname = ftptype.getHost();
TargetPort     = ftptype.getControlPort();
Targetusername = ftptype.getUser();
//Targetusername = ftptype.
Targetpassword = SecurityUtility.getPasswordCredentialAsString(ftptype.getPassword());
break;
} else if (protocolType.equals(“SSH-FTP”)) {
protocol = “SSH-FTP”;
TechnologyBindingType.SSHFTPType sshftptype = protocal.getSSHFTP();
TargetFolder   = sshftptype.getFolder();
TargetHostname = sshftptype.getHost();
TargetPort     = sshftptype.getPort();
Targetusername = sshftptype.getUser();
Targetpassword = SecurityUtility.getPasswordCredentialAsString(sshftptype.getPassword());
break;
}

}
}

String SourceFolder     = pluginContext.getCustomPropertyMap().get(“FolderName”);
String SubDirectoryName = pluginContext.getCustomPropertyMap().get(“directory.path”);
SubDirectoryName =
SubDirectoryName.substring(SubDirectoryName.lastIndexOf(SourceFolder) + SourceFolder.length());

if (protocol.equals(“FTP”)) {
if(SubDirectoryName.length() > 0) SubDirectoryName = SubDirectoryName.substring(1);
if(SubDirectoryName.length() > 0)
newfname = TargetFolder + “/” + SubDirectoryName + “/” + oldfname; // worked relative path but not absolute path
else
newfname = TargetFolder + “/” + oldfname; // worked relative path but not absolute path
}
else if (protocol.equals(“SSH-FTP”))
newfname = SubDirectoryName+ “/” + oldfname;

destFileName = newfname;
logme(“with ” + protocolType + “, TargetName = [” + TargetName + “]++”);

if (newfname != null && newfname.length() > 0) {
// Check & Create subdirectories for each files.
// Should be modified to process exceptions later.
if (protocol.equals(“FTP”))
checkTargetDirectoryFTP(TargetHostname, TargetPort, Targetusername, Targetpassword,
TargetFolder + “/” + SubDirectoryName);
else if (protocol.equals(“SSH-FTP”))
checkTargetDirectorySFTP(TargetHostname, TargetPort, Targetusername, Targetpassword,
TargetFolder + SubDirectoryName);

// Set new filename with sub directory name
out.setNewFileName(newfname);
}
return out;
} catch (Exception e) {
e.printStackTrace();
res.setException(new Exception(“Callout:RENAMEEXP- Exception in custom plugin class:\n” +
pluginContext.getMessage()));
}
return res;
}

@Override
// This function will be called only if the isPayloadChangesRequired returns true.
public PluginOutput process(PluginContext context, InputStream input, OutputStream out,
Map<String, String> calloutParams) {
return null;
}

public void logme(String text) {
rawlog(“++ Target [” + destFileName + “] ” + text);
}

public void rawlog(String text) {
try {
PrintWriter output = new PrintWriter(new BufferedWriter(new FileWriter(“/tmp/mft/RenameRegexp.txt”, true)));
String timeStamp = new SimpleDateFormat(“yyyy.MM.dd.HH.mm.ss”).format(new java.util.Date());
output.write(timeStamp + “:”);
output.write(text);
output.write(“\n”);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}

public int checkTargetDirectoryFTP(String TargetHostname, int TargetPort, String Targetusername,
String Targetpassword, final String directory) {

FTPClient client = new FTPClient();

try {
if (!client.isConnected()) {
client.connect(TargetHostname, TargetPort);
client.login(Targetusername, Targetpassword);
int reply = client.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
client.disconnect();
logme(“Negative reply form FTP server, aborting, id was {}:” + reply);
throw new IOException(“failed to connect to FTP server”);
}
}

String[] iterable = directory.split(“/”);
String dir = “”;
boolean dirExists1 = client.changeWorkingDirectory(directory);
if(!dirExists1) {
for (int i = 1; i < iterable.length; i++) {
dir = dir + “/” + iterable[i];
boolean dirExists = client.changeWorkingDirectory(dir);
if (!dirExists) {
// try to create directory:
logme(” try to create directory [” + dir + “]\n”);
client.makeDirectory(dir);
dirExists = client.changeWorkingDirectory(dir);
}
if (!dirExists) {
logme(“failed to change FTP directory (forms), not doing anything\n”);
return -1;
}
}
} else {
logme(“!! Target Directory [” + directory + “] existing already, skip!!\n”);
}

if (client.isConnected()) {
client.disconnect();
}
} catch (Exception s) {
return -1;
}
return 0;
}

public int checkTargetDirectorySFTP(String TargetHostname, int TargetPort, String Targetusername,
String Targetpassword, final String directory) {

try {
//            logme(“\nEstablishing Connection.0..”);
JSch jsch = new com.jcraft.jsch.JSch();
//JSch jsch = new JSch();
//            logme(“\nEstablishing Connection..1.”);
Session session = jsch.getSession(Targetusername, TargetHostname, TargetPort);
//            logme(“\nEstablishing Connection..2.”);
session.setPassword(Targetpassword);
session.setConfig(“StrictHostKeyChecking”, “no”);
//            logme(“\nEstablishing Connection…”);
session.connect();
//           logme(“\nConnection established.”);
//           logme(“\nCrating SFTP Channel.”);
ChannelSftp sftpChannel = (ChannelSftp) session.openChannel(“sftp”);
sftpChannel.connect();

//            logme(“\nDirectory:” + sftpChannel.pwd());
//            logme(“\n directory = ” + directory + “\n”);
String[] iterable = directory.split(“/”);
String dir = “”;

Boolean dirExist = false;

try {
sftpChannel.cd(directory);
} catch (SftpException s2) {
dirExist = false;
}

if(!dirExist) {
for (int i = 1; i < iterable.length; i++) {
dir = dir + “/” + iterable[i];
try {
sftpChannel.cd(dir);
} catch (SftpException s2) {
sftpChannel.mkdir(dir);
}
}
}else {
logme(” Target Directory existing already, skip!!”);
}

sftpChannel.disconnect();
session.disconnect();
} catch (Exception s) {
s.printStackTrace();
logme(s.toString());
return -1;
}

return 0;
}

public String getTargetName(String _input) {
String _s2 = null, _s3 = null;

StringTokenizer st1 = new StringTokenizer(_input, “, “);
while (st1.hasMoreElements()) {
_s2 = (String) st1.nextElement();
if (_s2.contains(“targetName=”)) {
_s3 = _s2.substring(_s2.lastIndexOf(“targetName=”) + “targetName=”.length());
break;
}
}
return _s3;
}

private String destFileName = null;

}


SrcPre1.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<mft:Callouts xmlns:mft=”http://xmlns.oracle.com/mft&#8221;
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221;
xsi:schemaLocation=”http://xmlns.oracle.com/mft callout.xsd “>
<mft:Callout description=”Insert Folder For FTP”
helpText=”File Rename with Regular Expressions”
groupName=”Source-pre” timeout=”300″
implementationClass=”com.oracle.callout.sample.SrcPre1″
libraryName=”SrcPre1.jar” name=”SrcPre1″>
</mft:Callout>
</mft:Callouts>


InsertFolderForFTP.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<mft:Callouts xmlns:mft=”http://xmlns.oracle.com/mft&#8221;
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221;
xsi:schemaLocation=”http://xmlns.oracle.com/mft callout.xsd “>
<mft:Callout description=”Insert Folder For FTP”
helpText=”File Rename with Regular Expressions”
groupName=”Target-pre” timeout=”300″
implementationClass=”com.oracle.callout.sample.InsertFolderForFTP”
libraryName=”InsertFolderForFTP.jar” name=”InsertFolderForFTP”>
</mft:Callout>
</mft:Callouts>


MFT Console

mft1mft2mft3mft4

June 10, 2016

Obama Officially Endorses Clinton for President

Filed under: English — sunnyson @ 6:05 pm

U.S. President Barack Obama has officially endorsed Hillary Clinton, his former secretary of state, for president.
버락 오바마 미 대통령은 이전 그의 국무장관이었던 힐러리 클린턴의 대통령으로의 공개적인 지지를 밝혔다.

Obama gave his endorsement in a video published online.
오바마는 온라인으로 배포된 비디오를 통하여 지지를 표하였다.

“I want to congratulate Hillary Clinton on making history as the presumptive Democratic nominee for president of the United States.”
“나는 미 대통령 선거에서 사실상의 민주당 대선 후보로서 역사를 만들어 가고 있는 힐러리 클린턴에게 축하를 드립니다.”

In the video, he said he knows “how hard this job can be,” and that he knows Hillary “will be so good at it.”
이 비디오에서, 그는 “이 일이 얼마나 힘든지”를 알고 있다고, 그리고 힐러리가 “이 일을 잘할 것”을 알고 있다고 말하였다.

“In fact, I don’t think there’s ever been someone so qualified to hold this office,” he said. Specifically, Obama said Clinton has the “courage, compassion and heart to get the job done.

“I am fired up and I cannot wait to get out there and campaign for Hillary,” Obama said.

Clinton responded to the endorsement in an interview with Bloomberg Politics.

“It just means so much to have a strong, substantive endorsement from the president. Obviously I value his opinion a great deal personally,” she said. “It’s just such a treat because over the years of knowing each other, we’ve gone from fierce competitors to true friends.”

With a high approval rating of over 50 percent, Obama is seen as a valuable campaign tool for Clinton. The Clinton campaign said Obama will join Clinton to campaign in Green Bay, Wisconsin next week.
President Barack Obama walks with Democratic presidential candidate Sen. Bernie Sanders, I-Vt., down the Colonnade of the White House in Washington, June 9, 2016.

President Barack Obama walks with Democratic presidential candidate Sen. Bernie Sanders, I-Vt., down the Colonnade of the White House in Washington, June 9, 2016.

Sanders remains in the race
샌더스는 경선을 계속 한다.

The endorsement came after Obama met with Clinton’s Democratic rival, Vermont Senator Bernie Sanders, Thursday at the White House.
이 지지선언은 오바마가 클린턴의 민주당내에서의 라이벌인, 버몬트 상원의원 버니 샌더스와 목요일 백악관에서 만난 이후에 나왔다.

In the endorsement, Obama also congratulates Sanders on an “incredible” campaign and for getting more people involved in the political process.
이 지지선언에서, 오바마는 또한 샌더스가 “믿기지 않을” 선거운동하여 정치에 보다 많은 사람을 참여 시킨것에 대해서 축하하였다.

Obama also thanked Sanders for highlighting important issues such as economic inequality, excessive money in politics and bringing young people into the process.
오바마는 또한 경제적 불평등, 과도한 정치자금 과 같은 중요한 사항들을 부각시키고 젊은이들을 이 정치과정에 불러 들인것에 역시 감사했다.

Clinton received enough delegates to capture the Democratic nomination this week after major primary wins on Tuesday. But Sanders told reporters Thursday he is looking forward to the last Democratic primary of the campaign in the District of Columbia on Tuesday.

He also spoke about the main issues he plans to bring to the Democratic National Convention in Philadelphia at the end of July. The Democratic Party will officially choose its nominee at the convention.

Sanders said he spoke with Clinton after her victories this week to congratulate her on a “very strong campaign.

“I look forward to meeting with her in the near future to see how we can work together to defeat Donald Trump. And to create a government which represents all of us, and not just the 1 percent.”

Sanders also took the opportunity to criticize Trump, whom he said would be a “disaster” as president of the United States.

I’m Bryan Lynn.
________________________________________________________________
Words in This Story

presumptive — adj. something that is more than likely, going to happen

endorse : v. declare public support for

courage : n. the ability to do something difficult or dangerous

compassion : n. to have sympathy or concern for the suffering or others

highlight : v. to pick out and emphasize

June 7, 2016

Jun 6th, 2016 VOA

Filed under: English — sunnyson @ 10:57 am

Release Details About Drone Strikes, Groups Say

http://learningenglish.voanews.com/a/rights-groups-demand-more-details-on-us-global-drone-strikes/3358998.html

Rights groups are calling on the United States to release details about its secretive drone attacks around the world.
-> 인권 그룹들은 미국이 전 세계에 걸쳐서 비밀스러운 드론에 의한 공격에 대해서 자세한 내용을 발표하도록 촉구하고 있다.

A recent U.S. drone strike in Pakistan led to the calls for more transparency. The leader of Afghanistan’s Taliban was killed in that attack.
최근 파키스탄에서 있었던 미군 드론 공격에 대하여 보다 투명하게 하도록 요청받고 있다. 아프카니스탄 탈레반의 리더가 그 공격에서 살해 되었다.

In the past, U.S. drone aircraft have hit terrorist targets in Yemen and Somalia.
과거에는 미군 드론이 예멘과 소말리아의 테러리스트를 공격 대상으로 했었다.

Rita Siemion is with the group Human Rights First. She says the U.S. government should establish clear policies and provide real numbers on all its drone attacks.
리타 시멘은 인류 인권 우선 그룹 소속이다. 그녀는 미국 정부가 명확한 정책을 수립하여야 하고, 미군에 의한 드론 공격의 정확한 숫자를 제공하여야 한다고 주장한다.

“And, ‘Just trust us. We have high standards. We are doing the best that we can,’ really isn’t enough.”
또한, ‘우리를 믿어라. 우리는 높은 수준의 기준을 갖고 있다. 우리는 우리가 할 수 있는 최고를 하고 있다’ 라는 것은 충분하지 않다고 주장한다.

The administration of President Barack Obama has promised to provide this kind of information in a report soon.
버락 오바마 대통령 행정부는 이런 종류의 정보를 보고서로 곧 제공하기로 약속 해왔었다.

The report is expected to list the number of combatants and civilians killed in U.S. drone strikes since 2009. It will not have information from active battle areas like Iraq, Afghanistan and Syria.
이 보고서는 2009년부터 미군 드론에 의해 사살된 시민과 전투원의 숫자를 제시하기로 기대되고 있다. 보고서는 현재 전투가 진행중인 이라크, 아프카니스탄 그리고 시리아에 대한 정보는 담지 않을 것이다.

President Obama’s spokesman, Josh Earnest, told reporters in March the report represents a big step forward for transparency.
오바마 대통령의 대변인인 조쉬 어니스트는 지난 3월에 기자들에게 이 보고서가 투명성을 위한 큰 진보를 뜻한다고 얘기 했었다.

“We wouldn’t even acknowledge publicly that these things were taking place. So the fact that we’re now in a position on a regular, routinized basis to publish the results and to quantify the totals about the impact of these operations — I do think represents substantial progress in the direction of transparency.”
“우리는 그런 일들이 일어 나고 있음을 공개적으로 인정하지 않았었다.  따라서 그런 결과들을 공개하는 것과 그러한 작전들로 인한 영향에 대한 합계의 정량화를 정기적, 일상적으로 하고 있다는 것에 대하여 — 나는 투명성의 방향으로 상당히 진행 되었음을 뜻한다고 생각한다.”

But Human Rights First and other critics of the drone policy believe it is not enough to just list the number of deaths and injuries. They say administration officials should also explain how they collected the data and how they define terms used in the report.
하지만 드론 정책에 관하여 인류 권리 우선그룹이나 다른 비판적인 그룹은 단지 죽거나 다친 사람의 수에 관한 정보만으로는 충분하지 않다고 생각한다. 그들은 행정부 관리들이 그런 데이터가 어떻게 수집되었으며 그 보고서에서의 용어들이 어떻게 정의되었는지를 또한 설명하여야 한다고 한다.

John Hannah worked as an adviser to two U.S. presidents: Bill Clinton and George W. Bush. He says the drone program is not the best way to deal with terrorists.
죤 한나는 빌 클린턴과 조지 w 부시 대통령의 고문으로 일했었다. 그는 드론 프로그램이 테러리스트를 상대하기 위한 최고의 프로그램은 아니라고 한다.

“The Obama administration has almost completely foregone an effort to capture and detain and get intelligence from these terrorists. Instead, it has universally decided it’s going to be the judge, jury and executioner.”
“오바마 정부는 테러리스트들에 대한 체포와 구류, 정보 획득에 대한 노력을 거의 완전히 포기하였다. 대신 정부는 법관, 배심원 그리고 집행자가 되기로 전반적으로 결정하였다.”

Hannah does believe drone strikes can be effective in some areas. He noted countries such as Yemen and Pakistan, where the governments have not aggressively fought terrorists.
한나는 드론에 의한 공격이 어떤 지역에서는 효과적일 수 있다고 믿는다. 그는 예멘이나 파키스탄과 같이 정부가 적극적으로 테러리스트과 싸울 수 없는 나라들을 특히 언급했다.

Hannah also said drone attacks do reduce the number of civilian casualties compared to conventional military conflict. The answer, he said, is to create safeguards for accountability, while balancing national security, transparency, and the rule of law.
한나는 또한 드론에 의한 공격이 재래적인 / 전통적인 군사적 충돌에 비해서는 시민 사상자의 수를 줄일 수 있다고 얘기 한다.

“Ensure that we are doing everything possible to find the right balance that ensures American security, and yet at the same time, ensures that we are not crossing that line into becoming a lawless nation.”
“미국인의 안전을 확보하는데 있어 올바른 균형을 맞추기 위한 모든 가능한 일을 수행하고 있다고 확신하며, 또한 동시에 우리가 무법의 나라가 되는 선을 넘지 않고 있음을 확신한다.”

_____________________________________________________________
Words in This Story

drone : n. unmanned aircraft or ship guided by remote control

transparency : n. the state of being transparent

combatant : n. person or nation engaged in fighting during war

quantify : v. calculate the quantity of something

data : n. facts or information

forgo : v. to give up

conventional : adj. used and accepted by most people

accountable : adj. required to explain actions or decisions

ensure : v. make certain that something will happen

 

Sanctuary Movement Helps Immigrants at Risk

http://learningenglish.voanews.com/a/the-new-sanctuary-movement-seeks-to-help-immigrants-to-us/3361063.html

For more than 30 years, religious groups in many parts of the U.S. have provided refuge to immigrants who face possible expulsion from the country.

Today, religious groups are treating non-criminal immigration law violators and their families differently.

The effort to provide refuge for immigrants is called the Sanctuary Movement. It started more than 30 years ago at a time of civil and economic unrest in Guatemala, El Salvador and Nicaragua.

By the end of the 1980s, nearly 1 million refugees had fled north to the United States to seek asylum.

Religious congregations sheltered refugees who would have been denied asylum. They opposed the efforts by the U.S. Immigration and Naturalization Service to deport those people.

In 2014, something similar happened. Violence from the illegal drug trade and gangs, plus weak economic conditions in Central America, led to an increase of refugees and migrants, including children.
Immigrants from El Salvador and Guatemala, who entered the country illegally, board a bus after they were released from a family detention center in San Antonio, Texas in 2015.

Immigrants from El Salvador and Guatemala, who entered the country illegally, board a bus after they were released from a family detention center in San Antonio, Texas in 2015.

Also, an estimated 4.5 million children born in the U.S. have parents who are undocumented. They lack the paperwork required to live as legal residents.

The result has been a policy that has led to more than 350,000 “removals” each year. The term removal means being expelled from the country or denied entry at the border. In many of these cases, family members are separated.

New sanctuary movement considers current policy unfair

A leader of the sanctuary movement 30 years ago was Southside Presbyterian Church in Tucson, Arizona. Recently, the church has restarted its efforts to provide shelter and legal assistance to immigrants facing deportation.

The Reverend Alison Harrington told VOA that a growing number of religious groups feel “outraged and heartbroken” over current U.S. policies. She said these congregations are opening their doors in hopes of keeping families and communities together.

Harrington said individuals and politicians are fueling a growing anti-immigrant nativist movement.

“You kind of have this rising of people, who are people of faith, who will be conscious to say, ‘This is not who we believe we are as a people, as an American people,’” Harrington said.

She added that she feels a moral imperative to help.

Southside Presbyterian Church is near the Sonora desert and the U.S. border with Mexico. Harrington said she often meets immigrants seeking assistance.

The 1980s was a period Harrington calls a “nightmare.” She said 80 people slept on the church floor at times, with about 14,000 receiving shelter over a period of 10 years. However, the church now shelters one family at a time, rarely for more than a month.

Harrington said she remembers the case of one family in 2014. A woman named Rosa, her husband and two sons remained at Southside Presbyterian for a record 461 days before Rosa’s case was resolved.

“We had to get into high-level negotiations on that one,” Harrington said.

Groups work together to provide services for immigrants

Judson Memorial Church in New York City provides sanctuary in more ways than one.

“It could be physical, it could be spiritual, it could be financial, it could be legal,” the Reverend Donna Schaper said. But the most important term, she said, is “accompaniment.”

“We accompany about 200 people a month, and we train volunteers to go to ICE so they know their rights,” she said. ICE is short for the U.S. Immigration and Customs Enforcement, the agency that deals with immigration issues.

Schaper said that ICE employees are not the enemy. But she said what they do “terrifies people,” and she does not morally respect it.

Miguel Angel Animas and his two U.S.-born daughters came to the Judson Memorial Church for help. His wife, the girls’ mother, was recently deported to Mexico.

Schaper says immigration, like other difficult issues, lacks a human face to inspire quick action or major reform.

“I can’t let myself say that [Americans] don’t know or that if they knew, they would do something,” she said. “They take care of dogs and cats. These people are not dogs and cats.”

However, Schaper still describes New York City as a “very friendly city” to immigrants. And, during her time at the church, she has seen results, especially at the local level.

The New Sanctuary Coalition of NYC is an alliance of congregations around New York City. In 2009, the coalition started an effort to support immigrants who were found guilty of minor offenses, or whose cases were dismissed. The group sought to prevent ICE agents from questioning and detaining these immigrants at city jails.

The church says that in 2011, the coalition’s efforts resulted in then-New York Mayor Michael Bloomberg signing a bill that changed some of those practices.

I’m Mario Ritter.

Ramon Taylor reported this story for VOA News. Mario Ritter adapted it for VOA Learning English. George Grow was the editor.

_____________________________________________________________
Words in This Story

congregation : n. people who regularly attend religious services at a church

deport : v. to send out of a country

nativist : adj. related to people whose ancestors lived for a long period in a country and who oppose newcomers or immigrants to it

moral imperative : n. a strongly believed idea or principle that causes a person to act

accompaniment : n. the act of accompanying someone, going with someone to a place

inspire : v. to cause someone to do, believe or feel something

 

Minivan-sized Sponge Found off Hawaii Coast

http://learningenglish.voanews.com/a/largest-sponge-found-off-hawaii-coast/3360778.html

It might be hard to imagine, but scientists found a sponge the size of a minivan in deep waters near the Hawaiian Islands.

The scientists said this sponge is the largest one ever found by researchers. A U.S. government research ship called the Okeanos Explorer found the record-setting sponge last year. A report on the discovery was published recently in the journal Marine Biodiversity.

The ship was in the Pacific Ocean, off the Northwestern Hawaiian Islands, when the researchers first saw the sponge. They were surprised to find it about two kilometers below the water’s surface. Because the sponge is so large, the researchers said it suggests that it is very, very old.

They captured pictures of the rare organism with video taken by an underwater vehicle, which was operated from the research ship. The sponge has a bluish-white color, and looks a little like a huge brain.
Sponge the Size of Minivan Found in Hawaiian Waters

Sponge the Size of Minivan Found in Hawaiian Waters

Christopher Kelley is a biologist at the Hawaii Undersea Research Lab. He helped with the research project.

“Here’s this animal that has presumably never been encountered before,” he told The Maui News. “And it’s enormous and that kind of brings up a little intrigue for deep water and what else exists down there.”

The scientists said the sponge measured over 3.5 meters from one end to the other. They said it was from 1.5 to two meters wide. That would make it bigger than the largest sponge ever recorded.

Scientists do not know how long sponges can live. But some of the large ones found in shallow water are thought to be over 2,300 years old. Some estimates say they could be thousands of years older.

“The largest portion of our planet lies in deep waters, the vast majority of which has never been explored,” said Daniel Wagner. He is the lead scientist for the project with NOAA’s Office of National Marine Sanctuaries. NOAA is short for the National Oceanic and Atmospheric Administration.

Wagner said that finding such a large sponge shows “how much can be learned from studying deep and pristine environments,” like the Papah?naumoku?kea Marine National Monument in Hawaii.

Sponges are similar to coral reefs because they give other sea life a habitat or place to live. They also filter seawater. They remove unwanted material that other sea creatures do not eat.

The report said very large and old sponges provide “key ecosystem services such as filtering large amounts of seawater.” According to the study, sponges also provide important homes for invertebrate and microbial species.

Sponges are actually sea creatures, but sometimes people think they are plants. A website called Shape of Life says ancient sponges were the first animals on Earth, showing up about 2.5 billion years ago.
Sponge the Size of Minivan Found in Hawaiian Waters

Sponge the Size of Minivan Found in Hawaiian Waters

Sponges are simple organisms. They come in many different shapes and sizes. They connect to rocks or other solid structures and get their food through the seawater.

The Papah?naumoku?kea Marine National Monument was founded in 2006. Its website says the monument area is the “largest contiguous fully protected conservation area under the U.S. flag, and one of the largest marine conservation areas in the world.” It protects 362,073 square kilometers of land. That makes it bigger than every U.S. national park combined.

The Okeanos Explorer made another discovery last February when it spotted a “ghost-like” octopus believed to be a new species.

The octopus was found in water over 4,000 meters deep, off Hawaii’s Neckler Island. Okeanos’ remotely-operated vehicle, Deep Discoverer, spotted the creature on a flat rock.

According to NOAA, “the appearance of this animal was unlike any published records and was the deepest observation ever for this type of cephalopod.”

I’m Anne Ball.

This story was written by VOA News. Anne Ball adapted it for Learning English. George Grow was the editor.

We want to hear from you. Write to us in the Comments section, and visit our Facebook page.

_____________________________________________________________
Words in This Story

presume – v. to think something is true without knowing it is true

intrigue – v. to make (someone) want to know more about something

shallow ? adj. not deep

pristine ? adj. clean and fresh as if new

invertebrate ? n. an animal without a backbone

microbial ? adj. having to do with microbes?tiny living things that can only be seen with a microscope

cephalopod ? n. a kind of sea animal mollusk such as an octopus or squid.

May 19, 2016

Words – 19 May 2016

Filed under: English,써니 — sunnyson @ 3:56 pm
  • Place a mandate : 지시를 내리다
  • be stranded : 좌초되다, 오도 가도 못하다
  • converge : 집중하다. 수렴하다
  • mate, first mate : 1등 항해사
  • embark on : (사업) 착수하다. 시작하다
  • toss : (배 따위를) (파도 등이) 흔들다. 동요시키다
  • remedial : 보충하는, 보습의 . remedial class 보충 학습반
  • a late bloomer : 대기 만성형 인간
  • tutor : 개인 교사
  • tune out : 주의 하지 않다. 귀를 기울이지 않다. stop paying attention
  • to be coasting in : very well without even trying

March 21, 2016

Orace CDC

Filed under: Experience_Mainframe — sunnyson @ 1:01 pm

I want to make a simple memory for my further memory and working for this Oracle CDC adapter for IMS/DB

In fact, it was my crazy days with it as there is no support from them. Restricted document made me hard again.

However, it’s working on my environment with IMS expert’s help and I wanna make a simple description for my own memory

It’s my result after configuration of CDC for IMS/DB on my environment. It’s designed to retrieve changed data from IMS/DB and store into Staging Area on Linux Server for further work with ODI or OSB

cdc_explain1

December 29, 2010

킹크랩먹는 주영이

Filed under: Children — sunnyson @ 10:35 am

처음에는 무서워하더니, 어느 순간 이 큰 녀석을 먹어버리겠다고 덤비는 주영이.. ㅎㅎㅎ

이때만 해도 아인슈타인 젓가락으로 먹었네요… 짜식~~~

Next Page »

Create a free website or blog at WordPress.com.