SSIS (Integration service) ตอนที่ 1 พื้นฐาน SSIS และ ETL

SSIS (Integration service) เป็น Business Intelligent Tools ของ Microsoft ที่ออกมาเพื่อใช้งานในการจัดการข้อมูลในรูปแบบ ETL ซึ่ง ETL คืออะไร E – Extract การนำข้อมูลออกมาจาก Source database ซึ่งมาจากแหล่งเดียวหรือหลายแหล่ง T – Transform การแก้ไขและเปลี่ยนแปลงข้อมูลให้เหมาะสมที่จะในไปใช้งานต่อไป L – Load การเอาข้อมูลไปเก็บที่ปลายทาง (destination) แหล่งเดียวหรือแยกเป็นหลายๆแหล่ง โดย Business Intelligent Tools ของ Microsoft นั้นประกอบด้วย 3 ตัวได้แก่ Integration service :: เป็น ETL Tool Analysis service :: เป็น Tool ที่ใช้วิเคราะห์ข้อมูล ใช้ทำ Data warehouse Reporting service :: เป็น Tool ที่ใช้ในการสร้างรายงาน   ก่อนที่จะมี Tools ที่ใช้ทำ ETL (ซึ่งมีหลายตัว หลายค่าย ทั้งฟรีและไม่ฟรี) เราต้องลำบากในการจัดการข้อมูลดังรูป ที่มาของภาพ คือต้องจัดการข้อมูลจาก Source ต่างๆลงใน Database แยกเป็นแต่ละ Source กันไปแล้วค่อยมาทำการ Cleaning data ที่หลังแล้วค่อยไปรวมฐานข้อมูลอีกครั้งจึงจะเอาข้อมูลไปใช้งานได้ ซึ่งจะทำให้การทำงานค่อนข้างยุ่งยากและซับซ้อนและต้องทำซ้ำๆหลายๆครั้ง   SSIS ทำงานอย่างไร ที่มาของภาพ เตรียมข้อมูลให้พร้อมที่จะ load เข้าไปเก็บในฐานข้อมูล มี audit data เพื่อทำให้ตรวจสอบได้ว่าข้อมูลที่ได้มาได้มากจากไหน เมื่อไร process ไหนเป็นผู้จัดการข้อมูล สามารถทำ data cleaning ได้ก่อนที่จะนำข้อมูลเข้าสู่ฐานข้อมูล สามารถใช้ได้กับข้อมูลที่ใหญ่และซับซ้อนได้เป็นอย่างดี SSIS ประกอบด้วย Package ไฟล์ของ SSIS นามสกุล *.dtsx Control flow คือ Workflow engine สำหรับจัดการ tasks และ Containers ที่สั่ง Execute   Control Flow เป็น Workflow engine โดยมี Objects ใน Control Flow ดังนี้ -Control flow tasks คือ การเนินการของ Workflow Object -Control flow Containers เป็น Grouping tasks กับ Tasks หรือ Containers อื่นๆ -Precedence constraints ให้ติดต่อ Tasks และ Containers และ กำหนดลำดับการ execute และ Precedence สำหรับจัดการ tasks และ Containers ที่สั่ง Execute   Data flow ควบคุมการการประมวลผลข้อมูลต่างๆ Transform data จากแหล่งข้อมูล (Sources) ไปยัง ปลายทางข้อมูล (Destinations) Data flow task ยอดนิยมมีดังนี้ Aggregate Conditional Split Data Conversion Derived Column Lookup Merge Merge Join Multicast Sort Union All ไว้จะลงรายละเอียดในแต่ละ task กันในตอนต่อๆไปนะครับ สำหรับตอนที่ 1 นี้ก็ขอจบไว้เท่านี้ก่อนครับ

Read More »

Unit test สำหรับ method ที่ใช้ Entity Framework

กลไกการทำงานของ .NET method โดยส่วนใหญ่  จะมีกลไกการทำงานที่ต้องขึ้นกับเงื่อนไข ปัจจัยต่างๆจากภายนอกอย่างเช่น method ที่มีเรียกใช้ database หรือ web service ทำให้การทดสอบจำเป็นต้องแยก component ที่ต้องการทดสอบออกมาจากปัจจัยแวดล้อมต่างรอบๆ component ซึ่งสามารถทำได้โดยใช้ shim ที่อยู่ภายใต้การควบคุมในกระบวนการทดสอบ สามารถที่จะควบคุมผลลัพธ์ที่ได้การทำงานตามที่กำหนดในทุกๆครั้งที่เรียกใช้งาน ซึ่งทำให้การเขียน unit testing ทำได้ง่ายขึ้นมาก การพัฒนา unit test สำหรับ method ที่ใช้ Entity Framework เพื่อเข้าถึงฐานข้อมูล ก็สามารถใช้ shim type ในการกำหนดชุดของข้อมูลเพื่อทำการทดสอบ ซึ่งการ query จะกระทำกับ property ของ DbContext ซึ่ง return IDbSet<T> public partial class Entities : DbContext { public Entities(): base(“name=Entities”) { } public IDbSet<CONFIG> CONFIG { get; set; } … } ในการพัฒนา unit test จะต้องสร้าง shim type สำหรับ class “Entities” และแทนที่ property ที่ดึงข้อมูลจากฐานข้อมูลจริงแยกออกจากการทดสอบ ด้วยข้อมูลสำหรับทดสอบ จากตัวอย่างข้างบนคือ property “CONFIG” ซึ่งเป็นประเภท IDbSet<CONFIG> โดยจะทำการ returm DbSet<CONFIG> ที่เตรียมข้อมูลไว้สำหรับการทดสอบ using (ShimsContext.Create()) { ShimEntities.AllInstances.CONFIGGet = (e) => { return … DbSet<CONFIG> }; } แต่ใน DbSet ไม่มี public constructor ทำให้ไม่สามารถสร้าง instance ของ DbSet ได้ จึงจำเป็นต้องสร้าง class ใหม่ที่ implement interface IDbSet<T> แทนการใช้ DbSet public class TestDbSet<T> : IDbSet<T>, IQueryable, IEnumerable<T> where T : class { ObservableCollection<T> _data; IQueryable _query; public TestDbSet() //: base() { _data = new ObservableCollection<T>(); _query = _data.AsQueryable(); } public virtual T Find(params object[] keyValues) { throw new NotImplementedException(“Derive from TestDbSet<T> and override Find”); } public T Add(T item) { _data.Add(item); return item; } public T Remove(T item) { _data.Remove(item); return item; } public T Attach(T item) { _data.Add(item); return item; } public T Create() { return Activator.CreateInstance<T>(); } public TDerivedEntity

Read More »

Auto remove schema in EDMX on build

Entity Framework (EF)  คือ data access technology ที่เริ่มเปิดตัวครั้งแรกเป็นส่วนหนึ่งของ .NET Framework 3.5 SP1 โดยตัว EF จะทำหน้าที่เป็น object-relational mapper ที่ทำให้ผู้พัฒนาไม่จำเป็นต้องเขียน code ในส่วน data access ก็สามารถใช้ข้อมูลจาก relational database โดยผ่าน object model การพัฒนาโปรแกรมโดยใช้ EF นั้นจำเป็นต้องมี Entity Data Model เป็น model ที่กำหนดรายละเอียดเกี่ยวกับ entity และ relationship ระหว่าง entity นั้นๆ การสร้าง Entity Data Model สามารถแยกออกเป็น 2 แนวทางคือ “Code First” เป็นการกำหนดรูปร่างของ model โดยการสร้าง class (เขียน code) จะมี database หรือไม่มีอยู่ก่อนก็ได้  และ “Database First” ที่จะทำการสร้าง model ( reverse engineer) จาก database ที่มีอยู่โดย EF Designer ซึ่ง model ที่ได้จะเก็บอยู่ใน EDMX file (.edmx) สามารถเปิดหรือแก้ไขเพิ่มเติมได้ด้วย EF Designer สำหรับ class ที่ใช้ในโปรแกรมจะถูกสร้างโดยอัตโนมัติจาก EDMX file ข้อมูล Entity Data Model ใน EDMX file อยู่ในรูปแบบ xml สามารถแบ่งออกเป็น 3 ส่วนคือ Storage model, Conceptual model และ Mapping ซึ่งในส่วนของ Storage model จะเป็นข้อมูลรายละเอียดของ entity จาก database เช่น ข้อมูล EntityType ที่ให้รายละเอียดของชื่อของ entity (table ใน database), ชื่อและประเภทของ property (column ของ table ใน database)  <EntityType Name=”VF_CONFIG_REPORT”> <Key> <PropertyRef Name=”ID” /> </Key> <Property Name=”ID” Type=”number” Precision=”38″ Scale=”0″ Nullable=”false” /> <Property Name=”REPORT_NAME” Type=”varchar2″ MaxLength=”512″ /> <Property Name=”REPORT_PATH” Type=”varchar2″ MaxLength=”512″ /> <Property Name=”GROUP_TYPE” Type=”number” Precision=”38″ Scale=”0″ /> <Property Name=”SIGN_NUM” Type=”number” Precision=”38″ Scale=”0″ /> <Property Name=”SIGNS” Type=”varchar2″ MaxLength=”128″ /> </EntityType> ข้อมูล EntitySet ที่ประกอบด้วย ชื่อ,ประเภทของ entity, schema และ query ที่ใช้ดึงข้อมูล <EntitySet Name=”VF_CONFIG_REPORT” EntityType=”Self.VF_CONFIG_REPORT” store:Type=”Views” store:Schema=”FINANCE”> <DefiningQuery> SELECT “VF_CONFIG_REPORT”.”ID” AS “ID”, “VF_CONFIG_REPORT”.”REPORT_NAME” AS “REPORT_NAME”, “VF_CONFIG_REPORT”.”REPORT_PATH” AS “REPORT_PATH”, “VF_CONFIG_REPORT”.”GROUP_TYPE” AS “GROUP_TYPE”, “VF_CONFIG_REPORT”.”SIGN_NUM” AS “SIGN_NUM”, “VF_CONFIG_REPORT”.”SIGNS”

Read More »

การเขียนโปรแกรม JSP เชื่อมต่อ ORACLE

     JSP หรือชื่อเต็มว่า Java Server Page เป็นภาษาที่ใช้ในการพัฒนา Application ที่ทำงานบนเว็บไซต์ โดยรูปแบบการทำงานจะทำงานคล้ายกับภาษา  ASP ,PHP และ .Net รูปแบบการทำงานจะแตกต่างกันตรงที่ JSP เป็น Subset ของภาษา Java โดยรูปแบบการเขียนนั้นจะใช้รูปแบบคำสั่งและชุด SDK ของ Java และใน JSP จะมีนามสกุลของไฟล์เป็น .jsp โดยการทำงานจะทำงานในรูปแบบของ Server และ Client แสดงผลและโต้ตอบกับ User Interface ผ่าน Web Browser เช่น  IE ,Chrome ,Firefox และอื่นๆ โดยจะสามารถทำงานร่วมกับ Client Tags เช่นพวก HTML / JavaScript / CSS และพวก jQuery ให้ได้ผลลัพธ์ตามที่ต้องการ ที่สำคัญ JSP สามารถใช้งานได้ฟรี และสามารถรองรับได้ทุก Platform ไม่ว่าจะเป็น Windows ,Linux และ iOS รวมทั้ง Software อื่น ๆ      Oracle เป็น Database ชนิดหนึ่งซึ่งเป็นโปรแกรมที่ใช้ในการจัดการฐานข้อมูล โดยจะทำหน้าที่เป็นตัวกลางคอยติดต่อประสานระหว่างผู้ใช้และฐานข้อมูล ทำให้ผู้ใช้งานสามารถใช้งานฐานข้อมูลได้สะดวกขึ้น เช่น การค้นหาข้มูลต่างๆ ภายในฐานข้อมูลที่ง่ายและสะดวก โดยผู้ใช้ไม่จำเป็นต้องทราบถึงโครงสร้างภายในของฐานข้อมูลก็สามารถเข้าใช้ฐานข้อมูลนั้นได้      เริ่มต้นในการเขียนโปรแกรมที่นิยมการ connect  oracle ด้วย jsp จะใช้การ connect  ด้วย  JDBC โดยในส่วน ภาษา jsp จะสามารถใช้ packet ของ java ที่จะสามารถ import class ของ JDBC มาใช้งานใน  jsp ได้ทันที โดยไม่จำเป็นต้องเขียน โปรแรกม เพิ่มเติมให้ยุ่งยาก   ขั้นตอนที่ 1 สร้างไฟล์ jsp โดยข้อมูลภายในจะมีsyntax เหมือนกับ HTML แต่ต่างกันที่นามสกุลไฟล์ จะเป็นนามสกุล .jsp <HTML> <HEAD> <TITLE>Simple JSP to Oracle connection Example</TITLE> </HEAD> <BODY> </BODY> <HTML> ขั้นตอนที่ 2 ทำการ import library ที่ใช้ในการเชื่อมต่อกับ database oracle ด้วย java.sql.* <%@ page import=”java.sql.*” %> <HTML> <HEAD> <TITLE>Simple JSP to Oracle connection Example</TITLE> </HEAD> <BODY> </BODY> <HTML> ขั้นต้อนที่ 3 สร้างตัวแปลที่ใช้ในการเขื่อมต่อ String strdrive =”oracle.jdbc.OracleDriver”; //driver ของ oracle String url = “jdbc:oracle:thin:@localhost:1521:xe”; //server database String usr = “username”; //user name String pwd = “pwd”; //password ขั้นต้อนที่ 4 สร้าง connection การเชื่อมต่อไปยัง database Connection conn = null; ขั้นตอนที่ 5 ทำการเชื่อมต่อกับ database โดยใช้ ตัวแปลจากข้างต้น <% Connection conn = null; try { Class.forName(strdrive ); conn = DriverManager.getConnection(url, usr, pwd); out.println(“connected….!!”); } catch(Exception e) { out.println(“Exception : ” + e.getMessage() + “”); }

Read More »

Oracle Database 12CR1 monitoring with MRTG

OS: Oracle Enterprise Linux  7.2  (CentOS 7.2) วิธีติดตั้ง MRTG สามารถติดตั้งได้โดยสามารถดูคู่มือที่ ติดตั้ง mrtg บน ubuntu อาจไม่เหมือนกันแต่สามารถทำได้ทำนองเดียวกัน กราฟสำหรับ Idle CPU and Load average, CPU Time spent waiting for IO, Traffic Analysis for eth0, TCP Current Establish สามารถใช้ script เดียวกับลิงค์ในข้อ ๒ ได้เลย สร้างแฟ้ม /etc/mrtg/get-memory.sh มีข้อความว่า #!/bin/bash FREE=$(free |grep “Mem:”|awk ‘{print $7}’) SWAP=$(free |grep “Swap:”|awk ‘{print $3}’) TIME=$(uptime) echo “${FREE}” echo “${SWAP}” echo “$TIME” hostname  สร้างแฟ้ม /etc/mrtg/myhost-memory.cfg มีข้อความว่า WorkDir: /var/www/mrtg/myhost Target[myhost-mem]:`/etc/mrtg/get-memory.sh` MaxBytes[myhost-mem]: 20000000000 Title[myhost-mem]: Free Memory and Swap Used PageTop[myhost-mem]: <H1>Free Memory and Swap Used</H1> ShortLegend[myhost-mem]: bytes YLegend[myhost-mem]: bytes LegendI[myhost-mem]:  Free Memory: LegendO[myhost-mem]: Swap Used: Legend1[myhost-mem]: Free memory, in bytes Legend2[myhost-mem]: Swap Used, in bytes Options[myhost-mem]: gauge, nopercent, growrightทดสอบสร้างภาพต้นแบบด้วยคำสั่ง env LANG=C /usr/bin/mrtg/myhost-memory.cfgปรับปรุงแฟ้ม index.html ด้วยคำสั่ง indexmaker –column=2 –output=/var/www/mrtg/myhost/index.html /etc/mrtg/myhost-cpu.cfg /etc/mrtg/myhost-cpu-io.cfg /etc/mrtg/myhost-speed-eth0.cfg /etc/mrtg/myhost-tcpestab.cfg /etc/mrtg/myhost-memory.cfg โฟลเดอร์ที่ต้องเฝ้าระวังได้แก่ /u02/app/oracle/adump, /u02/app/oracle/diag/rdbms/regist/regist/alert, /u02/app/oracle/rdbms_trace ซึ่งเป็นโฟลเดอร์สำหรับเก็บ Log ไฟล์ต่างๆ ซึ่งอาจมีขนาดเพิ่มขึ้นจนระบบไม่สามารถให้บริการได้ และโฟลเดอร์ /u03 เป็นโฟลเดอร์ที่ใช้เก็บ archive log (ในกรณีที่ฐานข้อมูลเปิด archive log mode) สร้างแฟ้ม /etc/mrtg/get-diskfree-misc1.sh มีข้อความว่า #!/bin/bash adump=$(du -sm /u02/app/oracle/adump|awk ‘{ print $1 }’) free=$(df -m /u02|grep u02|awk ‘{ print $4 }’) TEMP=$(uptime|grep -o “load average.*”|awk ‘{print $3}’|cut -d’,’ -f 1) LOAD=$(echo “${TEMP:-0} * 100″|bc|cut -d’.’ -f 1) TIME=$(uptime) echo “${adump}” echo “${free}” echo “$TIME” hostname สร้างแฟ้ม /etc/mrtg/myhost-diskfree-misc1.cfg มีข้อความว่า WorkDir: /var/www/mrtg/myhost Target[myhost-misc1]:`/etc/mrtg/get-diskfree-misc1.sh` MaxBytes[myhost-misc1]: 20000000000 Title[myhost-misc1]: Free disk space and disk Used of /u02/app/oracle/adump PageTop[myhost-misc1]: Free disk space and

Read More »