Month: March 2017

  • Spark #03: Query Apache Access Log with Spark SQL

    ต่อจาก

    บทความนี้ จะกล่าวถึงการนำเข้าไฟล์ Apache Access Log เข้าไปเก็บไว้ใน Hadoop HDFS แล้ว ให้ Apache Spark Cluster เข้าไปค้นหาข้อมูล โดยใช้ภาษา SQL ผ่าน Spark SQL API

    นำ Apache Access Log เข้า HDFS

    1. ให้ Copy Apache Access Log ที่มีอยู่มาเก็บไว้ในเครื่องที่สามารถติดต่อ Hadoop HDFS ได้ (ในที่นี้ ชื่อไฟล์เป็น apache.access.log)
    2. ใช้คำสั่งต่อไป
      (แทน /test/ ด้วย Path ที่สร้างไว้ใน HDFS)

      hdfs dfs -copyFromLocal apache.access.log /test/
    3. เมื่อไปดูผ่าน Web UI ของ Hadoop HDFS ก็จะเห็นไฟล์อยู่ดังนี้

    วิธี Query ข้อมูลจาก Zeppelin ไปยัง Spark Cluster

    1. เปิด Zeppelin Web UI แล้วสร้าง Note ใหม่ โดยคลิกที่ Create new node
      แล้วใส่ชื่อ Note เช่น Query Apache Access Log
      ตั้ง Default Interpreter เป็น Spark
      แล้วคลิก Create Note
    2. ใส่ Code ต่อไปนี้ลงไป
    3. ด้านขวามือบน จะมีรูปเฟือง ให้คลิก แล้วเลือก Insert New
    4. แล้วใส่ข้อความนี้ลงไป
    5. จากนั้นคลิก Run all paragraphs
    6. ผลที่ได้

    ตอนต่อไปจะมาอธิบายวิธีการเขียนคำสั่งครับ

  • เตือนภัยออนไลน์วันนี้

    วันนี้ได้รับรายงานว่า นักศึกษาของมหาวิทยาลัย โดนหลอกเอารหัสผ่านที่ใช้สำหรับจัดการระบบทะเบียนไป โดนคนร้าย ไปสร้าง LINE แล้วปลอมตัวเป็น “อาจารย์ที่ปรึกษา”

    นักศึกษาก็พาซื่อ … ให้ไป ปรากฏว่า คนร้าย เข้าไปในระบบทะเบียน แล้วไป Drop ทุกวิชาทิ้งหมด …. เมื่อตรวจสอบก็พบว่า ใช้ Account ของนักศึกษาเข้ามาเอง แต่เจ้าตัวไม่ได้ทำ

    และไม่ใช่รายเดียว เช้านี้มีมา 2 รายซ้อน

    >> ในทางคดี ก็ต้องว่ากันไป <<

    แต่ที่อยากจะนำเสนอคือ ในฐานะที่เราทุกคนทุกวันนี้เป็น Net Citizen หรือ พลเมืองอินเตอร์เน็ต กันโดยปริยายอยู่แล้ว เรื่องนี้เป็น Common Sense ที่จะต้องเก็บรหัสผ่าน เป็นความลับ ไม่บอกใครเด็ดขาด

    จึงขอแจ้งเตือน ทั้งคนที่เป็น นักศึกษา บุคลากร และ บุคคลทั่วไป ถึง Common Sense พื้นๆข้อแรกคือ

    ***
    ไม่ว่ากรณีใดๆ ไม่ว่าจะเป็นทาง
    Email/LINE/Facebook/Twitter/Whatsapp/WeChat/SMS/โทรศัพท์/ช่องทางใดๆก็ตาม ทั้งที่กล่าวถึงแล้วยังไม่กล่าวถึง
    ต้องไม่ เปิดเผย รหัสผ่านของบริการใดๆก็ตามให้กับบุคคลอื่นเด็ดขาด ไม่ว่าจะด้วยเหตุผลใดๆก็ตาม
    ***

    ครับ

  • Zeppelin #01 Installation

    Apache Zeppelin เป็น Web-Base Notebook สำหรับเป็นการเชื่อมต่อกับระบบ Data Analytic [1] สามารถใช้ทำ Data-Driven แบบ Interactive และยังสามารถใช้งานพร้อมๆกันหลายคนได้ รองรับการทำงานผ่านภาษา SQL, Scala และอื่นๆอีกมากมาย

    ในบทความนี้ จะแนะนำการติดตั้ง Apache Zeppelin 0.7.0 บน Ubuntu 16.04

    1. ไปที่ http://zeppelin.apache.org/download.html เพื่อ Download ชุดติดตั้ง ซึ่งแบ่งออกเป็น แบบรวมทุก Interpreters ขนาด 710 MB หรือ จะเลือกเป็นแบบ ที่รองรับเฉพาะ Spark ขนาด 272 MB ซึ่งหากในอนาคตต้องการใช้ภาษาอื่นอีก ก็จะต้องติดตั้งเพิ่มเติม (แนะนำให้ใช้แบบรวม Interpreters)
    2. บน Ubuntu ที่จะใช้เป็น Zeppelin Server ใช้คำสั่งต่อไปนี้เพื่อ Download
      wget http://www-eu.apache.org/dist/zeppelin/zeppelin-0.7.0/zeppelin-0.7.0-bin-all.tgz
    3. ติดตั้ง Zeppelin (ต้องใช้ Java) ด้วยคำสั่งต่อไปนี้
      sudo apt install default-jre
      tar -zxvf zeppelin-0.7.0-bin-all.tgz ; ln -s zeppelin-0.7.0-bin-all.tgz zeppelin
    4. Start Zeppelin
      cd zeppelin
      bin/zeppelin-daemon.sh start
    5. หากเรียบร้อยก็จะสามารถใช้งานผ่านทาง Web UI ที่ port: 8080 ได้
    6. ในกรณีที่ติดตั้ง Zeppelin บนเครื่องเดียวกับ Spark Master ก็จะพบว่า Port ชนกัน (คือใช้ Web UI ที่ port 8080 เหมือนกัน) เราสามารถเปลี่ยน Web UI port ของ Zeppelin ได้โดยใช้คำสั่งต่อไปนี้
      cp conf/zeppelin-site.xml.template conf/zeppelin-site.xml

      แล้วแก้ไขไฟล์ conf/zeppelin-site.xml
      แก้ไขค่า 8080 เป็น ค่าอื่น เช่น 8090 เป็นต้น

      <property>
       <name>zeppelin.server.port</name>
       <value>8080</value>
       <description>Server port.</description>
      </property>

      แล้วทำการ Start Zeppelin ใหม่

    Reference:

    1. http://zeppelin.apache.org/
  • Spark #02: Cluster Installation

    ต่อจาก Spark #01: Standalone Installation

    Apache Spark ทำงานแบบ Master – Slave โดย Spark Cluster Component ดังภาพ


    ภาพจาก http://spark.apache.org/docs/latest/img/cluster-overview.png

    การใช้งาน Apache Spark จะใช้ผ่านการเขียนโปรแกรมด้วยภาษา Scala, Java, Python หรือ R แล้วสั่งการผ่าน “Driver” ซึ่งจะทำการส่งการไปยัง “Worker” เพื่อให้ Execute ตามที่ต้องการ การสร้าง Cluster จะมี Cluster Manager เป็น Standalone, Apache Mesos และ Hadoop YARN [1]

    ในบทความนี้ จะกล่าวถึงเฉพาะ การติดตั้ง Apache Spark Cluster แบบ Standalone คือใช้ Apache Spark เองเป็น Cluster Manager

    1. ติดตั้ง Ubuntu 16.04 อีกเครื่องหนึ่ง แล้วติดตั้งตามขึ้นตอนที่กล่าวใน Spark #01: Standalone Installation ข้อ 1-2 เท่านั้น (ไม่ต้อง Start Master ขึ้นมา)
    2. ตอนนี้จะมีเครื่อง Master และ เครื่อง Slave ซึ่งแนะนำให้ทำ Password-less SSH จากเครื่อง Master ไปยัง Slave เพื่อสะดวกต่อการใช้งาน
    3. ที่เครื่อง Master ใช้คำสั่งต่อไปนี้ เพื่อสร้างไฟล์ spark-env.sh ซึ่งเป็นตัวกำหนดการทำงานต่างๆของ Spark Cluster โดยในที่นี้ จะ SPARK_MASTER_HOST เป็น IP ของเครื่อง Master (แทนที่ 192.168.XXX.YYY ด้วย IP ของ Master )
      cp conf/spark-env.sh.template conf/spark-env.sh
      
      echo "SPARK_MASTER_HOST=192.168.XXX.YYY" >> conf/spark-env.sh
    4. ที่เครื่อง Master ใช้คำสั่งต่อไปนี้ เพื่อสร้างไฟล์ slaves ซึ่งจะกำหนดว่า เครื่องใดบ้างจะเป็น Slave ของ Cluster นี้ (หากมี Slave หลายเครื่อง ก็ใส่ IP ลงไปในไฟล์ conf/slaves ให้หมด)
      cp conf/slaves.template conf/slaves
      
      echo "192.168.XXX.ZZZ" >> conf/slaves
    5. ที่เครื่อง Master ใช้คำสั่งต่อไปนี้ เพื่อเชื่อมต่อ Cluster
      sbin/start-all.sh

      หมายเหตุ: หากไม่ได้ทำ Password-less SSH ก็จะต้องใส่ Password ทีละเครื่องจนเสร็จ

    6. เมื่อเสร็จเรียบร้อย ก็จะสามารถดูสถานะได้ที่ http://192.168.XXX.YYY:8080 ดังภาพ

    ประมาณนี้

    บทความต่อไป จะลงรายละเอียดเกี่ยวกับการเขียน Program เพื่อทำงานบน Spark Cluster

    Reference:

    1. http://spark.apache.org/docs/latest/cluster-overview.html

     

  • Spark #01: Standalone Installation

    Apache Spark : เป็นระบบ Data Processing ในระดับ Large-Scale ซึ่งทำงานได้เร็วกว่า Apache Hadoop MapReduce 100 เท่าบน Memory และ 10 เท่าบน Disk สามารถพัฒนาโปรแกรมเพื่อทำงานบน Spark ได้หลายภาษา ทั้ง Java, Scala, Python และ R อีกทั้งยังมี Library ทำงานกับ SQL, Machine Learning และ Graph Parallel Computation

    ในบทความนี้ จะกล่าวถึงเฉพาะวิธีการติดตั้ง Apache Spark เบื้องต้น บน Ubuntu 16.04 จำนวน 1 Machine ก่อน

    1. ไปที่ http://spark.apache.org/downloads.html
      เลือก Release, Package ที่ต้องการ แล้วเลือก Copy Link จาก Download Link มาได้เลย
    2. ที่ Ubuntu Server ใช้คำสั่งต่อไปนี้ ติดตั้ง Java และ Download Spark มาไว้บนเครื่อง
      sudo apt-get install default-jre openjdk-8-jdk-headless
      cat <<EOF >> .bashrc 
      export SPARK_HOME=/home/mama/spark
      export PATH=\$PATH:\$SPARK_HOME/bin
      EOF
      wget http://d3kbcqa49mib13.cloudfront.net/spark-2.1.0-bin-hadoop2.7.tgz
      tar -zxvf spark-2.1.0-bin-hadoop2.7.tgz ; ln -s spark-2.1.0-bin-hadoop2.7 spark
      cd spark
    3. แล้วทำการ Start Spark Master Server ด้วยคำสั่ง
      sbin/start-master.sh
    4. จากนั้น สามารถเรียกดู Web UI ได้ที่ port 8080 (Default) และต่อไป เครื่อง Worker หรือ เครื่องที่จะมาเข้า Cluster จะติดต่อเครื่องนี้ผ่าน port 7077 (Default)
    5. สามารถใช้งาน Spark Shell ซึ่ง จะเป็นภาษา Scala แบบ Interactive ด้วยคำสั่ง
      bin/spark-shell
    6. สามารถดู Jobs ที่ทำงานได้ผ่านทาง Web UI ที่ port 4040 (Default)

    ประมาณนี้ก่อน ในบทความต่อไปจะเป็นการสร้าง Spark Cluster

    Reference:

    1. http://spark.apache.org/
  • Cassandra #02 Scale-Out to Multi-nodes

    ต่อจาก Cassandra #01 เริ่มต้นใช้งาน

    ความสามารถที่สำคัญของ Cassandra คือสามารถทำการ Scale Out หรือขยายความสามารถของระบบได้โดยการเพิ่มเครื่องคอมพิวเตอร์ในระดับ Commodity Hardware [1] เข้าไปใน Cluster

    ในบทความนี้ จะแสดงวิธีการสร้าง Cassandra Cluster ที่ประกอบไปด้วย 3 Node ชื่อ cassandra01, cassandra02 และ cassandra03 โดยมีชื่อ Cluster ว่า PSUCluster และกำหนดให้ cassandra01 เป็น Seed Node (ทำหน้าที่เป็นผู้ประสานงานสำหรับ Node ใหม่ๆเข้าร่วม Cluster)

    ขั้นตอนการขยายระบบแบบ Scale Out ไปยังหลายๆ Node แต่ละ Node ทำดังนี้

    1. ติดตั้ง Cassandra ตามขั้นตอนใน Cassandra #01 เริ่มต้นใช้งาน
    2. แก้ไขไฟล์ /etc/cassandra/cassandra.yaml ดังนี้
      # กำหนดชื่อ Cluster ที่ต้องการ
      cluster_name: 'PSUCluster'
      
      # กำหนด Seed Node ซึ่งมีไว้ให้ node ใหม่ประกาศตัวเองเพื่อเข้าร่วม Cluster
      # ควรมีไม่เกิน 3 Node ต่อ Data Center
      # ในที่นี้ กำหนดไว้เพียงตัวเดียว 
      seed_provider:
       parameters:
       - seeds: "192.168.107.111"
      
      # กำหนด listen_address เป็นค่าว่าง
      listen_address:
      
      # กำหนด endpoint_snitch เป็น GossipingPropertyFileSnitch
      # เพื่อให้สามารถมี Cluster แบบข้าง Data Center ได้
      endpoint_snitch: GossipingPropertyFileSnitch
      
    3. ในการเริ่มใช้งานครั้งแรก ให้ลบข้อมูลใน /var/lib/cassandra/data/system ออกก่อน
      sudo rm -rf /var/lib/cassandra/data/system/*
    4. ในการใช้ Endpoint Snitch แบบ GossipingPropertyFileSnitch ต้องลบไฟล์ cassandra-topology.properties ออกไปก่อน
      sudo rm /etc/cassandra/cassandra-topology.properties
    5. จากนั้นก็ Start Cassandra Service
      sudo service cassandra restart

    วิธีดูสถานะของระบบ

    sudo watch nodetool status

    ในตอนแรกจะเป็นแบบนี้

    เมื่อ cassandra02 เข้ามา

    และเมื่อครบ 3 Node

    วิธี Debug ว่าเกิดอะไรขึ้น

    sudo tail -f /var/log/cassandra/debug.log

     

    Reference

    [1] http://docs.datastax.com/en/landing_page/doc/landing_page/planning/planningHardware.html

    [2] http://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archIntro.html

    [3] https://docs.datastax.com/en/cassandra/3.0/cassandra/initialize/initSingleDS.html

  • กว่าจะมา… C# 7.0

    สวัสดีครับ

    บทความนี้เขียนเพื่อนำเสนอ Features ใหม่ บนภาษา C# 7.0 พร้อมกับเปรียบเทียบกับเวอร์ชั่นก่อนหน้าครับ ซึ่งเพิ่งจะ Release ออกมาเมื่อวันอังคารที่ 7 มีนาคมที่ผ่านมานี่เอง และได้เป็นส่วนหนึ่งของ Visual Studio 2017 ไปเรียบร้อยแล้วครับ (มีให้ดาวน์โหลดใน Microsoft Imagine แล้วครับ ซึ่งขณะเขียนบทความนี้เป็นเวอร์ชั่น Release Candidate (RC))

    ขั้นตอนการติดตั้ง ไม่ขอเอ่ยถึงนะครับ เชื่อว่าทุกคนติดตั้งเป็น ส่วนสำคัญจะเป็นการเลือก Component สำหรับติดตั้งครับ เลือกตามที่ต้องการ ซึ่งใน Microsoft Imagine จะเป็น Professional Edition ครับ เพียงพอสำหรับการใช้งาน

     

    ตัวอย่าง Source Code สามารถ ดาวน์โหลดได้ที่นี่ ครับ

     

    เริ่มกันเลยครับ

    • Out Variable

    ก่อนหน้าตัวแปร out variable จะต้องทำการประกาศค่า (pre-declare) ก่อนที่จะนำไปใช้

    แต่ด้วย C# 7.0 สามารถ declare ค่าพร้อมกับรับค่าจากส่วน out argument ได้ทันที

    ตัวอย่างการนำไปใช้งาน กับ Decision if…else…

    ซึ่งหากเราต้องการ discards ค่าตัวแปรที่รับมา ก็สามารถทำได้ ด้วยการใส่ “_”

    • Pattern Matching

    เป็นการตรวจสอบว่า element ที่มีอยู่นั้นมีรูปร่าง (shape) หรือค่า (value) ตรงกับที่ต้องการหรือไม่ ดังตัวอย่าง

    Is expression

    ตัวอย่างการนำไปใช้งานร่วมกับการ decision if…else… ร่วมกับ method Try…

    Switch expression

    สามารถ switch โดยใช้ type ได้ (ไม่เฉพาะ primitive types) ซึ่งสามารถนำ patterns มาใช้ในส่วนของ case และสามารถเพิ่มเงื่อนไข (condition) ได้ ดังตัวอย่าง

     

    • Tuples

    คือการ return ค่าจาก method มากกว่า 1 ค่า (ในเวอร์ชั่นก่อนหน้าของ c# ก็สามารถทำได้ โดยใช้ out parameters หรือ System.Tuple<…> หรือสร้าง transport type ด้วยตัวเอง (custom-built) หรือให้ return ค่าเป็น anonymous type ผ่าน dynamic return type) ซึ่งในเวอร์ชั่นใหม่นี้ ไม่จำเป็นต้องทำเช่นนั้นอีกแล้ว ดังตัวอย่าง

    (กรณี target framework ต่ำกว่า 4.6.2 จะไม่สามารถใช้ได้ ให้เลือก target framework ของ project เป็น 4.6.2 หรือไม่ก็ค้นหา “System.ValueTuple” จาก Nuget Package ครับ

    การนำไปใช้งาน หรือเรียกจาก method อื่น สามารถรับค่า tuple ผ่านประเภทตัวแปร var โดยสามารถเข้าถึงแต่ละ element แบบ individually ได้เลย

     

    ซึ่งถ้าสังเกตตอน coding พิมพ์ตัวแปร names จะขึ้น Intellisense Item… ให้เลือก

    หรือจะตั้งชื่อให้กับ tuple เพื่อความสะดวกในการเรียกใช้งาน ดังตัวอย่างนี้ครับ

    และแน่นอนว่า Intellisense ก็จะมีชื่อให้เลือก แทนที่จะเป็น Item1, Item2, Item3 ตามตัวอย่างก่อนหน้าครับ

    • Deconstruction

    เป็นอีกวิธีหนึ่งของการใช้งาน tuple คือการ deconstruct ซึ่งมี syntax สำหรับ split tuple value ใส่ในตัวแปลแต่ละตัว (individually variable)

    ทั้งสามตัวอย่างด้านล่างนี้คือการนำค่ามาใส่ในตัวแปรที่ถูกสร้างขึ้นใหม่

    ตัวอย่างข้างล่างนี้ คือการนำค่ามาใส่ในตัวแปรที่มีค่าอยู่แล้ว (existing variable value)

    และเราสามารถ discard ค่าที่เราไม่ต้องการได้ ด้วยสัญลักษณ์ “_” เหมือนกับตัวอย่างแรกๆ ที่เคยกล่าวไว้ก่อนหน้านี้

     

    • Local Functions

    บางครั้งการเขียน method (function) ซ้อนเข้าไปด้านใน method (function) อีกทีหนึ่ง จะช่วยให้เขียนโปรแกรมได้ make sense มากขึ้น ดังตัวอย่าง

    เช่น ตามตัวอย่าง เมื่อมีการเรียก CalcFibonacci(int x) จะเรียก method (function) ข้างในอีกครั้งหนึ่งที่ชื่อ DoFib และ return ค่าเป็นแบบ tuple โดยที่ patermeter จะใช้งานได้ใน scope ของ method (function) ของตัวเองเท่านั้น

    จากตัวอย่างข้างบน method ที่ implement อยู่ภายใน จะทำการ execute เมื่อมีการเรียกใช้เท่านั้น (ไม่สามารถเรียกมาจาก outer method หรือจาก method อื่นๆ ได้)

    จะสังเกตว่า การทำงานนี้คล้ายๆ กับการสร้าง private method แยกไว้อีก method นึง แต่การสร้างแยกไว้นั้น อาจจะมีข้อผิดพลาดในการเรียกใช้งานโดยไม่ตั้งใจ กรณีที่ชื่อ method คล้ายกัน โดยไม่ผ่าน argument checking/validating (คือตัวแปร source, filter) อาจทำให้เกิดการทำงานที่ผิดพลาดได้

    • Literal Improvements

    นอกจากการปรับเพิ่มความสะดวกในการเขียนโปรแกรมมากขึ้นแล้ว ยังปรับปรุงเรื่องความสะดวกในการอ่านโค้ด โดยเฉพาะเมื่อมีการ assign ค่าตัวเลขลงในตัวแปร

    จึงได้มีการใช้สัญลักษณ์ “_” เพื่อใช้เป็นตัวคั่น (digit separator) โดยไม่กระทบกับค่าที่ assign (ใช้เพื่อให้เราอ่านได้สะดวกขึ้นนั่นเอง) – (improve readability)

    • Ref return and locals

    เป็นการส่งค่าผ่านการ reference (ไม่ใช่การส่ง value) เช่น reference address, reference location ของ array เป็นต้น

    สิ่งนี้การเขียนโปรแกรมทั่วไปอาจจะไม่ค่อยได้ใช้เท่าไหร่  และในบางกรณีอาจส่งผลถึงเรื่องความปลอดภัย (เช่นการ modified ค่าใน memory ทำให้โปรแกรมทำงานผิดพลาด เป็นต้น) ดังตัวอย่าง

     

    • Expression bodied members allowed

    expression body ที่ไว้สำหรับเขียน method, properties ใน C# รุ่นก่อนหน้า เป็นปัญหามาก เพราะเขียนได้เฉพาะ method และ properties เท่านั้น

    และใน C# 7.0 นี้ ได้เพิ่ม accessors, constructors และ finalizers ซึ่งสามารถเขียนลงในในส่วนของ expression body ได้แล้ว ดังตัวอย่าง

     

    • Throw Exception

    ใน C# 7.0 สามารถเขียน throw exception ได้แม้ไม่อยู่ใน method (ของเดิมต้องอยู่ใน method เท่านั้น)  โดยสามารถเขียนใน expression body ที่เดียวกับ accessors, constructors และ finalizers ได้เลย ดังตัวอย่างด้านล่างนี้

    สำหรับโค้ดตัวอย่างโปรแกรม สามารถ ดาวน์โหลดได้ที่นี่ ครับ
    (มีตัวอย่างตามบทความนี้ ทุกตัวอย่าง – รันบน Visual Studio 2017 ครับ)

     

    ขอบคุณครับ

    อ้างอิง ต้นฉบับจาก https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/

     

  • การแต่งภาพให้มีมิติด้วย PowerPoint

    วันนี้มานำเสนอการแต่งภาพง่าย ๆ โดยไม่ต้องใช้โปรแกรมตกแต่งภาพ แค่มีโปรแกรมนำเสนอผลงานอย่าง Power Point ก็สามารถทำได้ไม่ยากเลย โดยวันนี้ขอเสนอการแต่งภาพให้มีมิติ ไปดูกันเลยจร้า

    1.เปิดโปรแกรม Power point จากนั้นไปที่เมนู Insert คลิก Pictures เลือกภาพที่ต้องการ

    2.คลิกที่ภาพที่ Insert เข้ามา จากนั้นกด ctrl ค้างไว้ แล้วลากภาพออกมา จะได้เพิ่มขึ้นมาอีกภาพนึง

    3.เอาภาพพื้นหลังออก คลิกที่ภาพที่ต้องการเอาพื้นหลังออก ไปที่เมนู Format คลิก Remove Background แล้วปรับขนาดให้ได้ตามต้องการ

    4.จากนั้นที่เมนู Format คลิก Keep Changes ภาพพื้นหลังก็จะหายไป

    5.ภาพตั้งต้นเราทำการใส่กรอบเข้าไป ไปที่เมนู Format คลิก Metal Frame

    1. แล้ว Crop ตัดเป็นรูปร่าง ที่เมนู Format คลิก Crop to Shape .ในส่วนของการทำรูป Pop out ขึ้นมาด้านบน เลือก Trapizoid จากนั้นคลิก Crop
    2. ลดขนาดของภาพลงมาเหลือสักครึ่งหนึ่ง ให้คาบเกี่ยวกับส่วนของดอกบัวที่จะแสดงออกมาสักครึ่งนึง จากนั้นกดปุ่ม Crop
    3. จากนั้นนำดอกบัวภาพที่นำพื้นหลังออกมาประกบลงในภาพที่1 ก็จะได้รูปดอกไม้ที่ลอยเด่นขึ้นมา

    9.กรณีที่ 2 ให้รูปดอกบัวปรากฏเด่นมาด้านข้าง ที่เมนู Format คลิก Crop to Shape เลือก Flowchart Manual Input จากนั้นคลิก Crop

    10.เลื่อนขนาด และเลื่อนด้านข้างเข้ามา เพื่อให้ดอกบัวปรากฏขึ้นมาทั้งด้านบนและด้านข้าง จากนั้นคลิก Crop

    11.จากนั้นนำดอกบัวภาพที่นำพื้นหลังออกมาประกบลงในภาพที่1