Thursday, June 25, 2015

Би Програмист уу? Хөгжүүлэгч үү? эсвэл Инженер үү?

Хэсэг хугацаанд бодсоны эцэст өөрсдийн мэргэжлийн зарим нэг ойлголтыг өнгөрсөн хугацаанд мэдэрсэн мэдрэмж, ажилласан туршлага, интернетээс олж авсан, бас их сургуулийн багш нараасаа дуулж байснаар тодорхойлохыг оролдоё. Мэдээж хүн бүрт өөр өөрийн гэсэн тайлбар байгаа гэж бодож байна. 

Яагаад энэ талаар бичих болсон шалтгаан маань дараах хэдэн зүйлээс үүссэн юм. Үүнд:

1. Ихэнх хүмүүст (ялангуяа өөр мэргэжлийн хүмүүст) өөрийн ямар мэргэжилтэйг тайлбарлахдаа Програмист гэж хэлдэг. Өөр олон нэр томьёог хэлэхэд ойлгохгүй санагддаг. Жишээ нь: Компьютер инженер, програм хангамжийн инженер, хөгжүүлэгч г.м.

2. Програм хангамжийн компаниуд хүртэл ажилд хүн авахдаа програмист авна гэсэн зарыг ихээр тавьсан байдаг. Мэдээж зарим нь өөр нэр томьёог ашигласан байдаг л даа. Гэтэл тухайн компанид үнэхээр програмист хэрэгтэй юу? эсвэл програм хангамж хөгжүүлэгч үү?, програм хангамжийн инженер үү? гэдгээ нарийн тодорхойлвол хэрэгтэй юм шиг. 

3. Мөн хувийнхаа кариерын хувьд би цаашдаа яг ямар чадвар, мэргэжилтэй болох вэ? гэдгээ зөв тодорхойлоод түүнийхээ төлөө суралцаж, туршлагажих шаардлагатай юм шиг.

Иймээс дараах байдлаар тодорхойлох гээд үзье.

1. Програмист (Programmer)

Ерөнхийдөө ямар нэгэн програмчлалын хэлийг сайн эзэмшсэн, түүгээрээ оноож өгсөн ажлыг хэлсэн загварчлалынх нь дагуу хийдэг хүнийг хэлээд байгаа. Боловсруулсан бичиг баримтыг ойлгох чадвартай, кодоо хэрхэн бичих логик буюу алгоритмын чадвартай, нэг ёсны бусад эх үүсвэрүүд дээр тодорхойлолсноор хэрхэн код бичихийг мэддэг хүн юм.

Компанийн зүгээс харахад програмист хүнийг аль хэдийн боловсруулсан програм хангамжийн дизайн, түүнийгээ нэгж ажил болгон жагсаагаад одоо кодчлоход бэлэн болсон ажлуудыг гүйцэтгүүлэх явдал юм.

Багш маань хэлэхдээ програмист гэдэг бол тухайн хүний эзэмшсэн нэг чадвар юм. Ямар ч мэргэжилтэй хүн хэрхэн код бичихийг сураад програмист болж болно гэсэн юм. Би бол үүнтэй санал нэг байдаг.

2. Хөгжүүлэгч (Developer)

Хөгжүүлэгчийн хувьд мэдээж дараагийн түвшний гэж хэлж болно. Програмистын чадварыг заавал эзэмшсэн байх шаардлагатай. Харин дээр нь нэмэгдэх зүйл бол програм хангамжийн дизайн гаргах, ямар архитектур ашиглан хөгжүүлж гүйцэтгэх, түүнийг хэрхэн хийх бичиг баримтыг боловсруулах, мөн бусад програмист болон хөгжүүлэгч нарын асуудлыг шийдвэрлэж, хэрхэн кодчилох болон кодын стандартыг, зарчмыг тодорхойлох гээд хамаагүй өөр түвшинд яригдаж байгаа юм.

Их сургуульд байхад энэ чиглэлийн аргачлалуудаас заадаг, сургадаг байсан. Програм хангамж хөгжүүлэх процесс, цикл гээд. (SDLC - Software Development Life Cycle) гээд. Эдгээрийг сурсанаар хэрхэн шаардлагаа тодорхойлох, дизайнаа боловсруулах, түүнийгээ кодчлох, шалгах, шалгалтаас гарсан үр дүнг хэрхэн тусгах гээд нилээдгүй хугацааг зарцуулж байсан. 

Мэдээж бодит практик дээр илүү судалгааг явуулж ямар аргачлалаар програм хангамж хөгжүүлэлтийг явуулах уу? аль алхамыг автоматжуулах уу? гээд их зүйлийг сурч авч байна. 

Миний хувьд ч анх төгсөөд програмист үүргийг гүйцэтгэж байгаад, энэ чиглэлрүү бага багаар орсон юм. Хамгийн гол нь олон ажлууд дээр ажиллаж байж түүнээсээ туршлага аван дараа дараагийн түвшинд шилжинэ.

Ийм чадварыг эзэмшсэн хүнийг компаниуд програм хангамжийн архитектур, дизайн боловсруулах, түүнийхээ техникийн бичиг баримтыг боловсруулах, шийдэл олж асуудлыг шийдвэрлэх зэрэг үүргээр сонгон шалгаруулж авах нь тохиромжтой юм шиг. Мөн дотоод хүний нөөцөө энэ чиглэлрүү сургах нь илүү тохиромжтой.

3. Инженер (Engineer)

Инженер гэхээр илүү том сэдэв рүү ороод байгаан. Миний бодлоор дээрх програмист, хөгжүүлэгчийн чадваруудыг бүрэн эзэмшсэн байх шаардлагагүй ч эдгээрийн талаар маш сайн ойлголттой байх ёстой. Яагаад гэвэл томоохон хэмжээний системүүдийг боловсруулахад дан ганц програм хангамжийнхаа архитектураас гадна серверүүдийг хэрхэн зохион байгуулах, сүлжээний бүтэц ямар байх шаардлагатай, тэдгээрийг хамгийн тохиромжтойгоор хэрхэн суурилуулах, бусад интерпрайс системүүдтэй хэрхэн, ямар протоколоор холбогдох, системүүдийн дотоод компонент болон модулиуд нь цаашид өргөжих байдал нь ямар байх, технологийн өөрчлөлтийг хэрхэн хамгийн хурданаар тусгах гээд бүхий л түвшиний асуудлыг хамраад байгаан. 

Мөн бас нэг чухал ойлголт нь аливаа програм хангамж нь өгөгдөл дээр суурилан үйл ажиллагаагаа явуулдаг учир өгөгдлийн архитектурыг зөв тодорхойлох, хэдэн сая өгөгдлийг хэрхэн байршуулж, хурдан хугацаанд статистик тайланг авах. Cluster, Partition, Index зэргийг зөв тодорхойлох гээд судлах сурах зүйл их байгаан.

Энэ төрлийн хүнийг компаниуд системийнхээ том архитектурыг боловсруулах, технологийн сонголтуудыг тодорхойлох, компонент болон модулиудын хоорондын уялдаа холбоог гаргах, техникийн бичиг баримтыг бичих зэрэг чухал албан тушаалаар авдаг байна. 


Иймэрхүү байдлаар эдгээр нэрний утга учрыг тайлбарлаад байж болох байх. Харин та бүхэнд ч зөндөө тайлбар байгаа гэдэгт итгэлтэй байна. Хамгийн чухал нь бид нэг ойлголттой байж бусад хүмүүст хүргэх нь чухал юм. Энийг хаанаас хүргэх нь одоогоор тодорхойгүй байна. Тиймээс ядаж өөрийн блог дээрээ, өөрийн тайлбарыг бусад эх үүсвэртэй хослуулан хүргэж байна. 

Хүндэтгэсэн,
Эрдэнэбаяр

Linkedin: http://www.linkedin.com/in/erdenebayare

Friday, June 19, 2015

AES Encryption and Decryption with Oracle Database

Сайн байцгаана уу?

Удаан хугацаанд бичсэнгүй, өнгөрсөн хугацаанд судалсан зүйлүүдээсээ хуваалцаж эхлье. Өнөөдрийн хувьд Oracle мэдээллийн сан дээр AES - аар хэрхэн мэдээллээ нууцлах болон сэргээх талаар орууллаа.

Магадгүй нууцлах шаардлагатай мэдээлэлтэй хүмүүс байвал санаа авч болохын.

Хамгийн эхлэн тухайн хэрэглэгчдээ crypto эрхийг оноож өгөх шаардлагатай.

 grant execute on dbms_crypto to YOUR_USER;  

Үүний дараа шифрлэх болон сэргээх хоёр процедурыг мэдээллийн сандаа нэмэж өгсөнөөр бэлэн боллоо гэсэн үг.

 create or replace FUNCTION sec_return_encrypted_data(data IN VARCHAR) RETURN RAW IS  
   key VARCHAR(16) := 'A1B2C3D4E5F6G7H8';  
   encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;  
   BEGIN        
      RETURN DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW (data, 'AL32UTF8'),   
       encryption_mode, UTL_I18N.STRING_TO_RAW(key, 'AL32UTF8') );  
   END;  

 create or replace FUNCTION sec_return_decrypted_data(data IN RAW) RETURN VARCHAR IS  
   key VARCHAR(16) := 'A1B2C3D4E5F6G7H8';  
   encryption_mode NUMBER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;  
   BEGIN  
      RETURN UTL_RAW.CAST_TO_VARCHAR2(DBMS_CRYPTO.DECRYPT  
       (data, encryption_mode, UTL_I18N.STRING_TO_RAW(key, 'AL32UTF8')));  
   END;  

Анхаарах ёстой зүйл нь шифрлэсэн өгөгдөл нь RAW өгөгдлийн төрөлтэй байх ёстой. Мөн шифрлэх төрлийг тохируулахдаа дээр харуулсан аргачлалыг сонгосон ба өөр олон хослолыг хэрэглэж болох санагдсан. (DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC  + DBMS_CRYPTO.PAD_PKCS5).

AES алгоритм нь key шаардлагатай байдаг ба энийг хэрэгжүүлж байгаа хүн нь процедурлуугаа гаднаас дамжуулах, өөр газар хадгалах гээд олон аргаар шийдэж болох байх.

За тэгээд сайжруулалтыг хүн бүр өөрийнхөөрөө судлан нэмэх боломжтой санагдаж байна.

Хүндэтгэсэн,
Эрдэнэбаяр

Linkedin: http://www.linkedin.com/in/erdenebayare
Twitter: http://twitter.com/#!/erdenebayare

Wednesday, January 15, 2014

Big Data Infrastructure and Analytic Solution

Today i need to share my some resource about Apache Hadoop, Hive, HBase and Mahout projects. How i configured them etc...

Last year I presented that presentation at Chungbuk National University, South Korea, it was great result for me.



I will share all of my research related the big data, data warehouse and data mining concepts.

Thank you

Wednesday, June 19, 2013

Out of box: Oracle proxy user with ADF Application

I was facing long time with oracle proxy user and ADF application module problem. Therefore, i need to share how i resolved that problem. Main purpose of that proxy connection: We need to audit user action in oracle database side (audit trail).

Problem: I have an implemented Oracle Proxy User connection into Application Module. Same as this (https://blogs.oracle.com/imc/entry/how_to_use_database_proxy). But after i implemented, there is coming one strange problem with application module session. It means, Our application module always replicated by different session and connection.

Solution: First of all, many thanks for Vijai, who is helped me on Oracle Forum.
This is our piece of code for Proxy Connection in the Application Module implementation class:


    @Override
    protected void prepareSession(Session session) {
        String username =
            ADFContext.getCurrent().getSecurityContext().getUserName().toUpperCase();

        Statement st =
            getDBTransaction().createPreparedStatement("rollback", 0);

        try {
            if (st.getConnection() instanceof PoolConnection) {
                PoolConnection poolConnection =
                    (PoolConnection)st.getConnection();
                OracleConnection connection =
                    (OracleConnection)poolConnection.checkConnection();


                if (connection.isProxySession() &&
                    username.equals(connection.getUserName())) {
                    // no proxying required, we already have a connection that is proxied for this user
                    super.prepareSession(session);
                    return;
                }

                clearStatementCache(poolConnection);

                if (connection.isProxySession()) {
                    connection.close(OracleConnection.PROXY_SESSION);
                }

                Properties properties = new Properties();
                properties.put(OracleConnection.PROXY_USER_NAME, username);
                connection.openProxySession(OracleConnection.PROXYTYPE_USER_NAME,
                                            properties);

                clearStatementCache(poolConnection);

            } else {
                throw new JboException("Not Pool Connection");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        super.prepareSession(session);
    }


    /**
     * Clear out any cached statements
     */
    @Override
    protected void beforeDisconnect() {
        Statement st =
            getDBTransaction().createPreparedStatement("rollback", 0);
        try {
            PoolConnection poolConnection = (PoolConnection)st.getConnection();
            clearStatementCache(poolConnection);
            poolConnection.close(OracleConnection.PROXY_SESSION);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        super.beforeDisconnect();
    }


    private void clearStatementCache(PoolConnection poolConnection) throws SQLException {
        poolConnection.clearStatementCache();

        OracleConnection connection =
            (OracleConnection)poolConnection.checkConnection();

        if (connection.getExplicitCachingEnabled()) {
            connection.purgeExplicitCache();
        }
        if (connection.getImplicitCachingEnabled()) {
            connection.purgeImplicitCache();
        }
    }

And if you want use one connection, you can make all AM to child connection of that AM.

Tips:
1. Before i could not import weblogic.jdbc.wrapper.PoolConnection class. Problem is my model project hasn't any technology scope. It means, We have to select ADF Business Component in technology scope of project properties.

2. Also we was getting different error from weblogic side. (Error: java.lang.ClassCastException: weblogic.jdbc.wrapper.JTAConnection_weblogic_jdbc_wrapper_XAConnection_oracle_jdbc_driver_LogicalConnection cannot be cast to weblogic.jdbc.wrapper.PoolConnection). After i changed XA datasource to NON-XA connection, it was work. In our case, it must be (oracle.jdbc.OracleDriver).

3. Additional tip: Regarding to http://javaosdev.blogspot.com/2011/01/adf-closed-statement-again.html that post. Because i get following error "Caused By: java.sql.SQLRecoverableException: Closed Statement". In this case, We have to turn off statement cache from connection pool. (Give parameter Statement Cache Size : 0).



If i found additional tips from real world problem, i will update it.

Thank you,
Erdenebayar

Linkedin: http://www.linkedin.com/in/erdenebayare
Twitter: http://twitter.com/#!/erdenebayare

Friday, June 7, 2013

Java Mail Client with GMAIL SMTP and PURE SMTP

This post shows you small example of java mail client with gmail smtp and pure smtp server.

 package ia.demo.utils;  
 import ia.demo.exception.fault.EmptyRecipientException;  
 import java.util.Properties;  
 import javax.mail.AuthenticationFailedException;  
 import javax.mail.Authenticator;  
 import javax.mail.Message;  
 import javax.mail.MessagingException;  
 import javax.mail.PasswordAuthentication;  
 import javax.mail.Session;  
 import javax.mail.Transport;  
 import javax.mail.internet.InternetAddress;  
 import javax.mail.internet.MimeMessage;  
 /**  
  * Mail sending class  
  *  
  * @author Erdenebayar  
  */  
 public class MailUtil {  
  /* GMAIL SMTP CONFIGURATION */  
  static String GMAIL_HOST = "smtp.gmail.com";  
  static String GMAIL_FROM = "yourmail@gmail.com";  
  static String GMAIL_PASS = "yourpass";  
  static String GMAIL_PORT = "587";  
  
/* PURE SMTP CONFIGURATION */  
  static final String SMTP_HOST_NAME = "mail.server.com";  
  static final String SMTP_AUTH_USER = "yourmail@server.com";  
  static final String SMTP_FROM_ADDRESS = "yourmail@server.com";  
  static final String SMTP_AUTH_PWD = "yourpass";  
 
public static void main(String[] aaa) throws MessagingException {  
   String emailMsgTxt = "Message from Java";  
   final String emailSubjectTxt = "You are receiving mail from Java system";  
   String[] to = {"recipient1@yahoo.com", "recipient2@outlook.com"};  
   sendMailWithGmail(to, emailMsgTxt, emailSubjectTxt);  
   sendMailWithSmtp(to, emailMsgTxt, emailSubjectTxt);  
  }

  /**  
   * Email configured with GMAIL SMTP server  
   *  
   * @param recipients - List of recipients mail address  
   * @param subjectText - Subject of mail  
   * @param bodyText - Body of mail  
   * @throws MessagingException  
   */
public static void sendMailWithGmail(String[] recipients, String subjectText, String bodyText) throws MessagingException {  
   if (recipients.length > 0) {  
    Properties props = System.getProperties();  
    props.put("mail.smtp.starttls.enable", "true"); // added this line  
    props.put("mail.smtp.host", GMAIL_HOST);  
    props.put("mail.smtp.user", GMAIL_FROM);  
    props.put("mail.smtp.password", GMAIL_PASS);  
    props.put("mail.smtp.port", GMAIL_PORT);  
    props.put("mail.smtp.auth", "true");  
    Session session = Session.getDefaultInstance(props, null);  
    MimeMessage message = new MimeMessage(session);  
    message.setFrom(new InternetAddress(GMAIL_FROM));  
    InternetAddress[] toAddress = new InternetAddress[recipients.length];  
    // To get the array of addresses  
    for (int i = 0; i < recipients.length; i++) { // changed from a while loop  
     toAddress[i] = new InternetAddress(recipients[i]);  
    }  
    System.out.println(Message.RecipientType.TO);  
    for (int i = 0; i < toAddress.length; i++) { // changed from a while loop  
     message.addRecipient(Message.RecipientType.TO, toAddress[i]);  
    }  
    message.setSubject(subjectText);  
    message.setText(bodyText);  
    Transport transport = session.getTransport("smtp");  
    transport.connect(GMAIL_HOST, GMAIL_FROM, GMAIL_PASS);  
    transport.sendMessage(message, message.getAllRecipients());  
    transport.close();  
   } else {  
    throw new EmptyRecipientException("There are no recipient");  
   }  
  }

  /**  
   * Email configured with PURE SMTP server  
   *  
   * @param recipients - List of recipients mail address  
   * @param subjectText - Subject of mail  
   * @param bodyText - Body of mail  
   * @throws MessagingException  
   * @throws AuthenticationFailedException  
   */  
  public static void sendMailWithSmtp(String recipients[], String subjectText, String bodyText) throws MessagingException, AuthenticationFailedException {  
   if (recipients.length > 0) {  
    boolean debug = false;  
    //Set the host smtp address  
    Properties props = new Properties();  
    props.put("mail.smtp.host", SMTP_HOST_NAME);  
    props.put("mail.smtp.auth", "true");  
    Authenticator auth = new SMTPAuthenticator();  
    Session session = Session.getDefaultInstance(props, auth);  
    session.setDebug(debug);  
    // create a message  
    Message msg = new MimeMessage(session);  
    // set the from and to address  
    InternetAddress addressFrom = new InternetAddress(SMTP_FROM_ADDRESS);  
    msg.setFrom(addressFrom);  
    InternetAddress[] addressTo = new InternetAddress[recipients.length];  
    for (int i = 0; i < recipients.length; i++) {  
     addressTo[i] = new InternetAddress(recipients[i]);  
    }  
    msg.setRecipients(Message.RecipientType.TO, addressTo);  
    // Setting the Subject and Content Type  
    msg.setSubject(subjectText);  
    msg.setContent(bodyText, "text/plain");  
    Transport.send(msg);  
   } else {  
    throw new EmptyRecipientException("There are no recipient");  
   }  
  }  
  private static class SMTPAuthenticator extends javax.mail.Authenticator {  
   @Override  
   public PasswordAuthentication getPasswordAuthentication() {  
    String username = SMTP_AUTH_USER;  
    String password = SMTP_AUTH_PWD;  
    return new PasswordAuthentication(username, password);  
   }  
  }  
 }  

Thank you,
Erdenebayar

Linkedin: http://www.linkedin.com/in/erdenebayare
Twitter: http://twitter.com/#!/erdenebayare

Friday, May 24, 2013

Out of box: Database TNS Ping Tester using ADF and Java

I have a implement Database TNS Ping tester using ADF View Controller and Java backing bean. It is just required IP Address and Port of your database. I used JDeveloper 11.2.3.0 and only ViewController project and very small project.

This is my backing bean class. It connected with my JSPX:
package mn.view;

import java.io.IOException;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

/**
 * @author Erdenebayar.E
 * @link erdenebayare.blogspot.com
 */
public class TNSPingTester {
    static String CONN_SUCCESSFULLY = "Connection is healthy";
    static String CONN_UNSUCCESSFULLY = "Please check your connection";

    String ipAddress = "192.168.100.5";
    Integer dbPort = 1521;

    String finalResult = "";

    public String checkDBConnection() {
        //pass in a byte array with the ipv4 address, the port & the max time out required;
        String[] ipAddresses = getIpAddress().split("\\.");
        long start = -1; //default check value
        long end = -1; //default check value
        long total = -1; // default for bad connection
        byte[] addr1 = new byte[] { };
        try {
            addr1 =
                    new byte[] { (byte)Integer.parseInt((ipAddresses[0])), (byte)Integer.parseInt((ipAddresses[1])), (byte)Integer.parseInt((ipAddresses[2])),
                                 (byte)Integer.parseInt((ipAddresses[3])) };
        } catch (Exception ex) {
            setFinalResult(ex.getMessage());
            return getFinalResult();
        }
        
        int timeoutMs = 5000; // 5 seconds

        //make an unbound socket
        Socket theSock = new Socket();

        try {
            InetAddress addr = InetAddress.getByAddress(addr1);

            SocketAddress sockaddr = new InetSocketAddress(addr, getDbPort());

            // Create the socket with a timeout
            //when a timeout occurs, we will get timout exp.
            //also time our connection this gets very close to the real time
            start = System.currentTimeMillis();
            theSock.connect(sockaddr, timeoutMs);
            end = System.currentTimeMillis();
        } catch (UnknownHostException e) {
            start = -1;
            end = -1;
        } catch (SocketTimeoutException e) {
            start = -1;
            end = -1;
        } catch (IOException e) {
            start = -1;
            end = -1;
        } finally {
            if (theSock != null) {
                try {
                    theSock.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if ((start != -1) && (end != -1)) {
                total = end - start;
            }
        }

        if (total == -1) {
            setFinalResult(CONN_UNSUCCESSFULLY);
        } else {
            setFinalResult(CONN_SUCCESSFULLY);
        }

        System.out.println(getFinalResult());

        return getFinalResult();
    }

    public void setIpAddress(String ipAddress) {
        this.ipAddress = ipAddress;
    }

    public String getIpAddress() {
        return ipAddress;
    }

    public void setDbPort(Integer dbPort) {
        this.dbPort = dbPort;
    }

    public Integer getDbPort() {
        return dbPort;
    }

    public void setFinalResult(String finalResult) {
        this.finalResult = finalResult;
    }

    public String getFinalResult() {
        return finalResult;
    }

}

I have a attached final result of web result.

Connection is healthy.


Connection is unhealthy.
 

If you want source code: Source Code TNS Ping Tester.




Wednesday, January 30, 2013

Oracle Data Integrator Installation Guide on Linux_64bit

Dear All,

I just published Oracle Data Integrator 11.1.1.6.0 installation guide on Oracle Enterprise Linux 64bit operation system. Before you have to configure RCU on database (RCU Installation Guide).

1. First you have to run your setup. Go to Disk1 directory and run following command:

[Disk1]$ ./runInstaller

And specify your java home directory



2. Welcome page. Click on Next button.



3. If you have an Oracle support, configure it. But now i just skipped and click on next button.



4. Select your installation type. I installed all components of ODI on server side. Go to Next.



5. After ODI will your prerequisite checks. If everything is OK, click on next button.



6. Specify your middleware directory. Go to next.



7. In this step, you have to choose your repository configuration type.
- if you already created repository using RCU (Described in RCU Installation Guide), select first type.
- If didn't, select skip type.

In my guide, i have already configured and go to next.



8. Now let's specify your repository information. Go to next step.
Connection string should be following format: HOST:PORT@SERVICE_NAME



9. Enter supervisor user details. Which you created in RCU configuration.



10. Select and specify work repository details. And go to next.



11. Specify first agent details. Go to next.
We will use agent when we schedule ODI jobs (Interface, procedure, package etc...).



12. Now we are ready to install ODI. Click on Install button.




13. Let's see installation progress. Wait for Next button will appear :).




14. Let's see configuration progress. Go to next button.



15. Okey. We finished our installation. Let's click finish button.



Next post should be focues ODI domain configuration and ODI Studio installation on client side.

Thank you for my installation guide.
If you have an any questions, please comment here.

Best regards,
Erdenebayar

Linkedin: http://www.linkedin.com/in/erdenebayare
Twitter: http://twitter.com/#!/erdenebayare