Month: July 2017

  • การพัฒนา Unit Testing โดย xUnit test library (.NET Core)

    บทความนี้นำเสนอขั้นตอนการพัฒนา Unit Test อย่างง่ายโดยแสดงให่้เห็นการพัฒนาทีละขั้นตอน สำหรับระบบที่พัฒนาบน .NET Core โดยใช้ xUnit เพื่อทำความเข้าใจการพัฒนาแบบ test-driven development (TDD) ซึ่งในขั้นแรก เริ่มต้นด้วยการสร้าง source project ที่จะใช้สำหรับการทดสอบ สร้าง folder “TestSample” และ sub folder ชื่อ “CalcTool”  จากนั้นเปิด command prompt เข้าไปที่ folder “CalcTool” เพื่อทำการสร้าง .NET Core project โดยใช้คำสั่ง

    dotnet new classlib

    rename class1.cs เป็นชื่อ calc.cs และเขียน code ดังนี้

    using System;
    
    namespace CalcTool
    {
        public class Calc
        {
            public int AbsAddByOne(int value)
            {
                throw new NotImplementedException("Not implemented");
            }
        }
    }
    

    สร้าง test project โดยกลับไปที่ folder “TestSample” และสร้าง sub folder ชื่อ “CalcTool.Tests” จากนั้นเปิด command prompt เข้าไปที่ folder “CalcTool.Tests” เพื่อทำการสร้าง .NET Core project โดยใช้คำสั่ง

    dotnet new xunit

    โดยคำสั่งนี้จะทำการสร้าง test project ที่ใช้ xunit test library และกำหนดค่า test runner ไว้ใน CalcTool.Tests.csproj

    file : CalcTool.Tests.csproj
    
    <Project Sdk="Microsoft.NET.Sdk">
    
    <PropertyGroup>
        <TargetFramework>netcoreapp1.1</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0"/>
        <PackageReference Include="xunit" Version="2.2.0"/>
        <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0"/>
    </ItemGroup>
    
    </Project>
    
    

    เพิ่ม reference ไปยัง project ที่ต้องการทดสอบซึ่งในที่นี้คือ CalcTool project โดยใช้คำสั่ง

    dotnet add reference ../CalcTool/CalcTool.csproj

    ก่อนที่จะ build CalcTool project หรือ CalcTool.Tests project ต้อง execute คำสั่ง dotnet restore เพื่อ restore NuGet package ที่จำเป็นต้องใช้ในแต่ละ project

    เริ่มพัฒนา unit testing โดยลบ file “UnitTest1.cs” และสร้าง file ใหม่โดยใช้ชื่อว่า “CalcTest.cs” และเขียน code ดังนี้

    using System;
    using Xunit;
    using CalcTool;
    
    namespace CalcTool.Tests
    {
        public class CalcTest
        {
            [Fact]
            public void AbsAddByOneTest()
            {
                var c = new Calc();
                var result = c.AbsAddByOne(5);
    
                Assert.Equal(result, 6);
            }
        }
    }
    

    *[Fact] attribute ใช้กำหนดว่า method นั้นๆเป็นแบบ single test

    ทำการทดสอบโดยการ execute dotnet test ซึ่งจะทำการ build และ start xUnit test runner ซึ่งพบว่าผลการทดสอบ fail เนื่องมาจากยังไม่ได้ implement code ใน method “AbsAddByOne” ของ class “Calc” ดังนั้นกลับไปที่ method “AbsAddByOne” เพิ่ม code ลงไปเพื่อให้ผลการทดสอบถูกต้อง/ผ่าน (test pass)

            public int AbsAddByOne(int value)
            {
                return Math.Abs(value) + 1;
                //throw new NotImplementedException("Not implement");
            }
    

    กลับไปที่ folder “CalcTool.Tests” และ execute dotnet test ซึ่งจะทำการ build และ start xUnit test runner ซึ่งพบว่า ผ่านการทดสอบ (test pass)

    ใน xUnit ยังมี attribute ที่ใช้กำหนด suite of tests ซึ่ง execute code เดียวกันแต่มี input ที่มีค่าแตกต่างกันนั่นคือ [Theory] attribute และใช้ [InlineData] attribute ในการกำหนดค่าของ input

            [Theory]
            [InlineData(5)]
            [InlineData(-5)]
            public void AbsAddByOneTest2(int value)
            {
                var c = new Calc();
                var result = c.AbsAddByOne(value);
    
                Assert.Equal(result, 6);
            }
    

    การพัฒนาในรูปแบบ test-driven development (TDD) จะทำเป็นรอบๆในลักษณะนี้โดย เพิ่ม unit testing , เพิ่ม code ใหม่เข้าไป ทดสอบ unit test จนผ่านและเริ่มรอบใหม่ จนกระทั่งได้ test ชุดสุดท้ายและโปรแกรม/library ที่สมบูรณ์ ก็เป็นอันจบการพัฒนาในรูปแบบ test-driven development (TDD)

  • Itextsharp #3 คู่มือเทคนิคพื้นฐานการใช้งาน PdfTable สำหรับมือใหม่ ตอนที่ 1

    บทความนี้ผู้เขียนจะพูดถึงส่วนที่มีการทำงานในรูปแบบ Table สำหรับผู้ที่เริ่มต้นใหม่สามารถอ่านบทความ ตอนที่ 1 และ ตอนที่ 2 เพื่อความเข้าใจต่อเนื่องกันนะครับ

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

    จากรูปตัวอย่างจะเป็นการแสดงส่วนของการทำงานในการสร้างTable ของโปรแกรม Itextsharp โดยเมื่อเราได้ทำการเพิ่ม pdfCell ลงไปใน pdfTable Itextsharp จะทำการนำ pdfCell มาเรียงต่อกันไปเรื่อยๆ และทำการอ้างอิงว่าในแต่ละ Row มีได้กี่ Collumn ตามที่ได้ระบุไว้ตอนสร้าง Table เมื่อมี Cell ครบตามกำหนดจะขึ้นRowใหม่ให้อัตโนมัติ แต่สิ่งที่ควรระวังคือ กรณีที่Rowนั้นๆมี Collumn ไม่ครบตามที่กำหนด โปรแกรมอาจไม่แสดงผลของส่วนนั้นได้ ซึ่งในตัวอย่างผู้เขียนได้กำหนดไว้ 3 Collumn ต่อ Row และได้เพิ่ม pdfCell ไปทั้งหมด 9 อันด้วยกันครับ เมื่อทำการแสดงผลจะได้ Table ที่มีขนาด 3×3 นั้นเอง

    PdfPTable PdfTable = new PdfPTable(3);//#1
    float[] tbwidths = { 50f, 50f, 50f};
    PdfTable.SetWidths(tbwidths);
    PdfTable.WidthPercentage = 100;
    PdfPCell PdfCell = null;
    PdfCell = new PdfPCell(new Phrase(new Chunk("1", bold)));//#2
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("2", bold)));//#3
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("3", bold)));//#4
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("4", bold)));//#5
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("5", bold)));//#6
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("6", bold)));//#7
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("7", bold)));//#8
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("8", bold)));//#9
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("9", bold)));//#10
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    

    จาก code ด้านบนผู้เขียนได้ทำการสร้าง Table ขึ้นมาโดยกำหนดขนาด Collumn ไว้เท่ากับ 3 (#1)และทำการกำหนดขนาดความกว้างของ Collumn ในบรรทัดถัดมา เมื่อทำการสร้าง Table เรียบร้อยแล้วผู้เขียนก็ทำการสร้างและเพิ่ม Cell ลงใน Table ไล่ลงมาตามลำดับใน Code (#2-#10) แค่นี้เราก็ได้ Table ตามรูปตัวอย่างแล้วครับ หลังจากตัวอย่างแรกผ่านไป ก็มาต่อกันที่ตัวอย่างต่อไปที่ใครใช้งาน Table ก็จำเป็นต้องได้ใช้ฟังก์ชั่นนี้แน่นอน นั้นก็คือ Colspan กับ rowspan นั้นเอง ตัวอย่างนี้จะให้ดูการจัดงานฟังก์ชั่นและการจัดวางลำดับของ Cell เพื่อให้แสดงผลตรงตามที่เราต้องการโดยเริ่มจากฟังก์ชั่น colspan กันก่อนดังนี้

    จากตัวอย่างเป็นการรวม collumn ที่ 1 และ 2 เข้าด้วยกัน และมี column 3-8 เป็นแบบปกติ การเขียนโปรแกรมนั้นให้ยึดเอา collumn แรกที่ทำการรวมCell เป็นจุดเริ่มต้นในการเขียนฟังก์ชั่น Colspan ซึ่งในรูปก็คือ Cell ที่ 1 นั้นเอง

    PdfPTable PdfTable = new PdfPTable(3);
    float[] tbwidths = { 50f, 50f, 50f};
    PdfTable.SetWidths(tbwidths);
    PdfTable.WidthPercentage = 100;
    PdfPCell PdfCell = null;
    PdfCell = new PdfPCell(new Phrase(new Chunk("1", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfCell.Colspan = 2; <---------------------------------------------------#1
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("2", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("3", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("4", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("5", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("6", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("7", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("8", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    

    จาก Code ตัวอย่างส่วนที่เป็นฟังก์ชั่นการรวม Cell คือ PdfCell.Colspan (#1) นั้นเองและ Cell ที่เหลือก็เพิ่มปกติเหมือนตัวอย่างแรก ต่อไปจะเป็นตัวอย่างของการใช้งาน Rowspan ตามรูปและ Code ดังนี้

    ตัวอย่าง Code ดังนี้

    PdfPTable PdfTable = new PdfPTable(3);
    float[] tbwidths = { 50f, 50f, 50f};
    PdfTable.SetWidths(tbwidths);
    PdfTable.WidthPercentage = 100;
    PdfPCell PdfCell = null;
    PdfCell = new PdfPCell(new Phrase(new Chunk("1", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfCell.Rowspan = 3; <---------------------------------------------------#1
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("2", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("3", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("4", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("5", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("6", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("7", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfTable.AddCell(PdfCell);
    

    ก็จบในส่วนของ Colspan และ Rowspan ในฟังก์ชั่นที่จะแนะนำต่อไปจะเป็นเรื่องของการทำ Header และ Footer ให้กับ Table ของเรากันครับ โดยฟังก์ชั่นดังกล่าวจะทำการโชว์ Header และ Footer ที่เรากำหนดในทุกๆหน้าที่ Table แสดงผลอยู่ อารมณ์เหมือนกับ Header Footer ใน MSWord ครับ

    จากในรูปตัวอย่างจะแบ่งออกเป็น2ส่วนด้วยกันคือ บล๊อกด้านซ้ายจะเป็นรูปแบบการจัดเรียง Row ของการเขียน Code และบล๊อกด้านขวาจะเป็นการแสดงในการใช้งานจริงบน PDF โดยลักษณะการเขียนนั้น Itextsharp บังคับให้เราเขียน Code ส่วนของ Header และ Footer ก่อนเสมอจากนั้นก็ตามด้วยส่วนของ Body ที่เราต้องการต่อท้ายไปเรื่อยๆ ซึ่งเพิ่มฟังก์ชั่นการทำงานมาเพียงแค่2บรรทัดก็สามารถใช้งานได้แล้วครับ มาดูตัวอย่าง Code กันเลยดีกว่า

    PdfPTable PdfTable = new PdfPTable(3);
    float[] tbwidths = { 50f, 50f, 50f};
    PdfTable.SetWidths(tbwidths);
    PdfTable.WidthPercentage = 100;
    PdfTable.HeaderRows = 2; <----------------------------------------#1
    PdfTable.FooterRows = 1; <----------------------------------------#2
    PdfPCell PdfCell = null;
    PdfCell = new PdfPCell(new Phrase(new Chunk("Headder", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfCell.Colspan = 3;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("Footer", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfCell.Colspan = 3;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("body 1", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfCell.Colspan = 3;
    PdfTable.AddCell(PdfCell);
    PdfCell = new PdfPCell(new Phrase(new Chunk("body 2", bold)));
    PdfCell.HorizontalAlignment = Element.ALIGN_CENTER;
    PdfCell.Colspan = 3;
    PdfTable.AddCell(PdfCell);
    

    จาก Code ตัวอย่างจะพบว่ามีฟังก์ชั่นใหม่เพิ่มมา2บรรทัดด้วยกันคือ (#1)ส่วนของการกำหนดให้มี Headder+Footer โดยในฟังก์ชั่นนั้นสังเกตุว่าจะกำหนดให้ HeaderRows=2 แต่พอไปดูส่วนของการสร้าง Cell พบว่ามี Header ที่สร้างแค่อันเดียว เหตุผลที่กำหนดเป็น 2 เพราะการกำหนดส่วนของ Header นั้นต้องรวม footer เข้าไปด้วย ในกรณีตัวอย่างคือมี Header 1 และ Footer 1 รวมกันเป็น 2 และต้องไปกำหนดแยกของ Footer แยกอีกฟังก์ชั่นเพื่อให้ตัว Itextsharp รู้ว่ามี Footer กี่แถวด้วยกัน (#2) หลายท่านอาจสับสน ผู้เขียนจะทำการยกตัวอย่างให้ดูเพื่อความเข้าใจมากขึ้น

    จากตัวอย่างในรูปผู้เขียนได้ยกตัวอย่างกรณีที่เราต้องการ Header 2 แถวและ Footer 1 แถว เวลาเขียน Code ให้กำหนดส่วนของ HeaderRow=3 เนื่องจาก 3 มาจาก (Header)2 + (Footer)1 นั้นเองและหลังจากนั้นก็กำหนด FooterRow =1 ตามที่เราตั้งไว้

    จากรูปตัวอย่างถัดมา เราต้องการ Header 2 แถวและ Footer 2 แถว เวลาเขียน Code ให้กำหนดส่วนของ HeaderRow=4 และหลังจากนั้นก็กำหนด FooterRow =2 ตามที่เราตั้งไว้ เราก็จะได้การแสดงผลตรงตามที่เราต้องการแล้ว แต่กรณีที่เราต้องการ Footer เพียงอย่างเดียวเราสามารถทำได้โดยกำหนด HeaderRow=1 และหลังจากนั้นก็กำหนด FooterRow =1 เราก็จะได้ Footer เป็นที่เรียบร้อยครับ

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

  • ภาพสวยประกอบบน office ด้วย Pickit

    ในการนำเสนองานต่างๆ สิ่งที่ช่วยให้การนำเสนอดูน่าสนใจมากยิ่งขึ้น คือ รูปภาพและรูปแบบการจัดวาง ซึ่งใน office จะมี Add-in ที่ชื่อว่า Pickit ซึ่งเป็นเป็นเครื่องมือที่ช่วยการค้นหาภาพตามที่เราต้องการนำมาใช้ในงานนำเสนอของเราได้ มาดูขั้นตอนการใช้งานกันเลยค่ะ 

    1.เริ่มต้นเราต้องทำการติดตั้ง Add-in ซึ่งสามารถติดตั้งได้ใน Microsoft office (Word, excel, power point) ในที่นี้จะนำเสนอในส่วนของ power point ไปยังแท็บ INSERT > Store

     

    2.เป็นหน้าจอ Apps for Office ในช่องค้นหา พิมพ์คำว่า “Pickit” เมื่อเจอรายการ “Picket Free Images” ให้กดปุ่ม Add

    3.เมื่อติดตั้งโปรแกรมเรียบร้อย โปรแกรมจะปรากฎอยู่ด้านขวาของหน้าจอ

    4.หากโปรแกรมไม่ขึ้นมาสามารถเรียกใช้โปรแกรมได้ที่ INSERT> My Apps > Pickit Free Images

    5.จากนั้นพิมพ์ชื่อภาพที่ต้องการหรือเลือกภาพตามหมวดหมู่ต้องการได้ ในตัวอย่างนี้ข้อยกตัวอย่าง คำว่า “network” ระบบก็จะแสดงรายการภาพ

    6.จากนั้นเลือกภาพที่ต้องการ ก็กดปุ่ม Insert เพื่อดึงภาพมาใช้ในงานของเรา

     

    เพียงเท่านี้เราก็ได้ภาพสำหรับตกแต่งให้งานนำเสนอของเรา น่าสนใจมากยิ่งขึ้น นอกจากนี้ภาพดังกล่าว ยังเป็น “ภาพฟรี” อีกด้วย

  • การส่งค่าจาก Models แบบ Multiple มายัง Single View

    โดยปกติแล้วใน MVC เราจะไม่สามารถส่งค่าที่อยู่ใน Models มามากกว่า 1 Models จาก Controller มายังวิวเดียวกันได้ ซึ่งจริงๆ แล้วมีเทคนิคที่จะทำให้สามารถส่งค่าผ่านมาได้โดยง่าย ดังหลายๆ วิธีต่อไปนี้

     

    ดาวน์โหลด Source Code ได้ที่นี่ครับ

     

    หมายเหตุ: ในตัวอย่างผมจะใช้ method GetTeachers() และ GetStudents() ร่วมกันในหลายวิธีนะครับ ตามนี้ครับ

     

    1. ใช้ View Model

    View Model เป็น Class เดี่ยวๆ ที่อาจจะประกอบด้วยหลาย models อยู่ภายใน ซึ่งไม่ควรจะมี method อยู่ภายใน
    จากตัวอย่างข้างล่าง เป็น model ที่มี 2 properties ซึ่งจะต้องทำการ define strongly typed เพื่อให้ Intellisense สามารถใช้งานได้

    Controller

    View

     

    2.ใช้ View Data
    การใช้ ViewData เป็นอะไรที่ง่ายมาก สามารถเก็บค่าและส่งค่าผ่านจาก Controller ไปยัง View ได้ทันที (คล้ายกับตัวแปล Session ใน C# รุ่นก่อนๆ) ดังตัวอย่าง

    Controller

     

    View

     

    3.ใช้ Dynamic Model

    จะต้องทำการเรียกใช้คลาส ExpandoObject (อยู่ภายใต้ namespace: System.Dynamic เฉพาะใน .NET Framework 4.0 ขึ้นไป) จะอนุญาตให้เราเพิ่มหรือลบค่า properties ของ object ขณะ runtime ซึ่งจะทำให้เราสามารถสร้าง object และ เพิ่มหรือลบ ค่าเข้าไปใน properties ได้ ซึ่งมีข้อเสียคือการส่งค่าแบบ dynamic นี้จะไม่สามารถใช้ strongly typed model ได้ ซึ่งจะต้องนำไป cast เป็น type ที่ต้องการ เมื่อเรียกใช้อีกครั้งหนึ่ง

    Controller

    View

     

     

    4. ใช้ View Bag

    จะเหมือนกับการใช้ View Data ซึ่ง View Data เป็น dictionary object ต่างจาก View Bag ที่เป็น dynamic property ของ ControllerBase Class

    Controller

    View

     

    5. ใช้ Tuple

    Tuple คือ Object ที่ไม่สามารถเปลี่ยนรูปได้ (Immutable), ขนาดคงที่และเรียงตามลำดับ (fixed-size and ordered sequence object) โดยโครงสร้างจะมีหมายเลขที่เจาะจงและลำดับที่ของข้อมูล โดย .NET Framework รองรับได้สูงสุด 7 ข้อมูล (elements) ดังตัวอย่าง

    Controller

    View

     

    6. ใช้การ Partial View (Partial Render in Action Method)

    ทำการ render partial view อยู่ภายในวิว ซึ่งเราสามารถแยกเป็นสอง partial view โดยแต่ละ partial view ก็จะมี model เป็นของจนเอง ตามตัวอย่าง

    Controller

    View

     

    ดาวน์โหลด Source Code ได้ที่นี่ครับ

     

    หากผิดพลาดประการใด ขออภัยด้วยครับ

     

     

  • ไวรัส shortcut

    เหตุที่ตั้งชื่อบทความว่า ไวรัส shortcut ไม่ได้หมายความว่าไวรัสประเภทนี้ชื่อ shortcut แต่เป็นอาการทีเกิดขึ้นเมื่อไวรัสตัวนี้ทำงาน โดยสาเหตุและลักษณะอาการที่พบคือ เมื่อเรานำ flash drive หรืออุปกรณ์จำพวก removable drive (เช่น external hardisk) ไปใช้งานกับเครื่องคอมพิวเตอร์เครื่องใดเครื่องหนึ่ง ไฟล์ที่อยู่ใน flash drive หรือ removable drive จะหายไป และจะมีไฟล์ shortcut เกิดขึ้นแทนที่ โดย shortcut มักจะถูกตั้งชื่อเหมือนกับไฟล์ข้อมูลเดิมที่มีอยู่ ซึ่งหากเราเผลอเปิดไฟล์ shortcut ดังกล่าว ก็จะเป็นการไปเรียกไฟล์ไวรัสให้ทำงานนั่นเอง ส่วนไฟล์ข้อมูลเดิมนั้นไม่ได้หายไปไหน เพียงแต่เมื่อแรกเริ่มที่ติดไวรัสมานั้น ไฟล์เหล่านี้จะถูกซ่อนไว้ไม่ให้เห็นนั่นเอง

     

    ตัวอย่างไฟล์ shortcut ที่ไวรัสสร้างขึ้น ข้อสังเกตุคือจะมีไอคอนเป็นแบบ shortcut (ไอคอนรูปลูกศร)

     

    แนวทางการแก้ไข (ในบทความนี้จะยกตัวอย่างบน Windows 8.1)

    • อันดับแรกสิ่งที่ต้องเตรียมคือ เครื่องคอมพิวเตอร์ที่ไม่ติดไวรัส เพื่อใช้สำหรับกำจัดไวรัสและกู้ข้อมูลที่อยู่ใน flash drive หรือ removable drive โดยคอมพิวเตอร์ควรมีความพร้อมดังต่อไปนี้
      – ติดตั้งโปรแกรม antivirus ที่อัพเดตฐานข้อมูลไวรัสล่าสุด กรณี Windows 8.1 จะมี antivirus มาพร้อมอยู่แล้วคือ Windows Defender ซึ่งควรอัพเดตฐานข้อมูลไวรัสให้ล่าสุดก่อน
      – ปิด Autorun หรือ AutoPlay เพื่อป้องกันไม่ให้ไฟล์ใน  flash drive หรือ  removable drive ที่ติดไวรัส ถูกเปิดอ่านเมื่อมีการเชื่อมต่อกับเครื่องคอมพิวเตอร์ ซึ่งอาจจะเป็นสาเหตุให้ไวรัสแพร่กระจายต่อไปได้
    • เชื่อมต่อ flash drive หรือ removable drive ที่ติดไวรัสเข้ากับเครื่องคอมพิวเตอร์ จากนั้นทำการแสกนไวรัสด้วยโปแกรม antivirus ที่เตรียมไว้  และทำตามคำแนะนำของโปรแกรม antivirus  เพื่อกำจัดไฟล์ไวรัสและไฟล์ shortcut ที่ถูกไวรัสสร้างขึ้นมา   ซึ่งเมื่อเสร็จสิ้นขั้นตอนนี้แล้ว อาจจะพบว่า drive จะกลายเป็นพื้นที่ว่าง ๆ แต่หากดู properties ของ drive แล้วจะพบว่ามีเนื้อที่ส่วนหนึ่งถูกใช้ในการเก็บข้อมูล ซึ่งที่จริงแล้วก็คือไฟล์ข้อมูลที่ถูกไวรัสซ่อนไปนั่นเอง

    ตัวอย่าง falsh drive ที่ติดไวรัส หลังจากกำจัดไวรัสออกไปแล้ว จะเห็นเป็น drive ว่าง ๆ แต่เมื่อดู properties จะเห็นว่ามีเนื้อที่ส่วนหนึ่งที่มีการใช้เก็บข้อมูลอยู่

     

    • ส่วนของขั้นตอนการกู้ไฟล์ที่หายไปนั้น ก็คือการทำให้คอมพิวเตอร์ของเราเห็นไฟล์ที่ซ่อนไว้นั่นเอง
    • ซึ่งโดยปกตินั้น เราสามารถตั้งค่าการแสดงไฟล์ได้ในหน้าต่าง File Explorer โดยก่อนเข้าไปตั้งค่านี้ ให้เราเข้าไปที่ drive ที่ต้องการกู้ข้อมูลก่อน เพื่อจะได้เห็นผลจากการตั้งค่าได้เลย  จากนั้นเลือกเมนู View ที่อยู่ด้านบน แล้วเลือกเลือกเมนู Options แล้วเลือกคำสั่ง Change folder and search options เสร็จแล้วจะปรากฏหน้าต่างสำหรับตั้งค่า ต่อมาคือให้ไปที่แท็บ View จากนั้นให้ลองเลือกตัวเลือก ดังนี้
      • เลือก Show hidden files, folders, and drives จากนั้นกดปุ่ม Apply
      • หากไฟล์ที่ถูกซ่อนยังไม่ปรากฏ ให้เลือกตัวเลือก Hide protected operating system files (Recommended) แล้วกดปุ่ม Apply ซึ่งเมื่อถึงขั้นตอนนี้แล้ว ไฟล์ที่ถูกซ่อนไว้ก็น่าจะปรากฏขึ้นมาแล้ว
    • จะสังเกตเห็นว่าไฟล์ข้อมูลที่หายไปจะปรากฏขึ้นมา แต่ไอคอนจะเป็นสีจาง ๆ เนื่องจากถูกตั้งค่าให้เป็น Hidden โดยไวรัส และเมื่อดู properties ของไฟล์ จะพบว่าไม่สามารถเปลี่ยนค่าจาก Hidden เป็นปกติได้ เนื่องจากตัวเลือก Hidden ถูก disable อยู่
    • วิธีการแก้ไขเพื่อเอาค่า Hidden ออกทำได้ดังนี้คือ
      • อันดับแรก ให้กลับไปตัั้งค่าการแสดงผลไฟล์และโฟลเดอร์ให้เป็นเหมือนเดิมก่อน (ติ๊กเครื่องหมายถูกตัวเลือก Hide protected operating system files (Recommended) แล้วกดปุ่ม Apply) ไฟล์ก็จะถูกซ่อนไม่ให้เห็นเช่นเดิม  เพื่อจะได้ดูผลลัพธ์หลังจากแก้ปัญหาตามขั้นตอนแล้ว ว่าไฟล์ที่ซ่อนจะกลับมาแสดงให้เห็นเหมือนเดิมหรือไม่
      • เปิดหน้าต่าง command prompt แล้วพิมพ์ชื่อของ drive ที่ต้องการยกเลิกการซ่อนไฟล์
      • จากนั้นพิมพ์คำสั่ง attrib -s -h -r /S /D กดปุ่ม Enter
      • กลับไปตรวจสอบที่ drive ที่ต้องการกู้ข้อมูล ก็จะพบว่าไฟล์ที่ถูกซ่อนไว้กลับมาแสดงเช่นเดิม
      • อ้างอิงวิธีการจาก http://computertipeasy.blogspot.com/2014/03/hidden-file-and-folder-unlock-hidden.html

     

    สรุป

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

  • สั่งให้ Excel พูดด้วยเครื่องมือ Speak Cells

    สำหรับ blog ในวันนี้ ทางผู้เขียนขอแนะนำเทคนิคการใช้งานเครื่องมือใน Quick Access Toolbar (QAT) ที่จะสามารถทำให้เราทำงานได้เร็วขึ้น โดยการเลือกเครื่องมือที่มีการใช้งานบ่อยๆ มาไว้ในที่ที่เข้าถึงง่าย

     

    แล้ว Quick Access Toolbar คืออะไร ?

    อธิบายแบบง่ายๆ เลยนะ มันคือ แถบคำสั่งที่อยู่มุมบนด้านซ้ายของตัวโปแกรมชุด Office ไม่ว่าจะเป็น Excel, Word หรือ PowerPoint เพื่อให้เราสามารถเรียกใช้งานคำสั่งต่างๆ ได้อย่างรวดเร็ว ที่เราเห็นอยู่บ่อยๆ คือพวกปุ่ม Save, Undo, Redo นั่นแหละ

     

    แล้วถ้าหากเราต้องการ Add คำสั่งอื่นๆ เพิ่มเข้ามาละ จะต้องทำยังไง ?

    วิธีการเพิ่มคำสั่งใน Quick Access Toolbar

    1. วิธีที่หนึ่ง สามารถ Add ได้จากปุ่มที่เห็นอยู่แล้ว ดูตัวอย่างได้ตามรูปด้านล่าง
      • คลิกขวาบนคำสั่งที่ต้องการ จากนั้นเลือก Add to Quick Access Toolbar
    2. วิธีที่สอง คลิก Add More Command (วิธีนี้สามารถเลือกคำสั่งแบบแปลกๆ ที่เราไม่ค่อยจะได้เห็นเข้ามาได้ด้วย) ดูตัวอย่างได้ตามรูปด้านล่าง
      • คลิกเลือกสัญลักษณ์ สามเหลี่ยม ดังรูป เลือก “More Commands…”
      • Choose commands from ให้เลือกแสดงเป็นแบบ All Commands หากอยากเห็นทั้งหมด หรือจะเลือกแบบ Commands Not in the ribbon ก็ได้นะ เดี๋ยวมันจะกรองให้ ตัวอย่างดังรูป
      • จากนั้นเราจะเห็นเมนูทั้งหมด สามารถเลือกคำสั่งที่ต้องการและ คลิกปุ่ม “Add” จากนั้นคลิกปุ่ม “OK” เพื่อยืนยันการเพิ่มคำสั่งดังกล่าว
      • สำหรับคำสั่งที่เราจะเลือกแนะนำใน Blog นี้คือ คำสั่ง “Speak Cells”
      • เมื่อเรา Add Commands เสร็จเรียบร้อยแล้ว เราก็จะเห็นสัญลักษณ์คำสั่งดังกล่าวเพิ่มเข้ามาในส่วนของ Quick Access Toolbar

    ซึ่งประโยชน์ของเจ้าคำสั่งนี้เนี่ย คือการที่โปรแกรมจะช่วยทวนสิ่งที่เราพิมพ์เข้าไป เพื่อลดความผิดพลาด โดยไม่ต้องมานั่งเสียเวลาอ่านทวนซ้ำในสิ่งที่เราพิมพ์เข้าไปนั่นเอง (แต่ต้องเป็นภาษาอังกฤษนะ)

    ทางผู้เขียนหวังเป็นอย่างยิ่งว่า เกร็ดความรู้เล็กๆน้อยๆ เหล่านี้น่าจะมีประโยชน์สำหรับใครหลายๆ คน (รวมถึงตัวผู้เขียนด้วย) ซึ่งนอกเหนือจาก Commands ดังกล่าวนั้น Excel ก็ยังมีเครื่องมือเจ๋งๆ ที่เราสามารถ Add เข้ามายัง Quick Access Toolbar เพิ่มเติมได้อีกเยอะแยะมากมาย ผู้อ่านสามารถทดลองคลิกๆ เลือกๆ เพิ่มเข้ามาได้เลย ไม่ต้องกลัวโปรแกรมจะเจ๊งงงงนะ ไม่ลองเล่นก็จะไม่รู้น่ะแจ๊ะ แฮ่ ^____^

     

    ขอบคุณแหล่งข้อมูลอ้างอิง

    • https://www.sara2u.com/tips-trick.html
    • http://www.inwexcel.com/
  • Facebook Spam ที่หลอกมาเป็น “ข่าวสด”

    วันนี้พบเพื่อนคนนึง มีโพสต์ประหลาดๆขึ้นบน Profile ดังภาพ

    แต่พอลองเอา Mouse Over ดูพบว่า Link ไป khaosod.me/XXXXXX

    ลองมั่วตามไปดู พบว่าไปเปิด Web หนึ่ง เลียบแบบ kapook.com

    คาดว่า เกิดจาก ก่อนหน้านี้ไปคลิก Facebook App บางอย่าง ทำให้เกิดการ ให้สิทธิ์ App เขียน Wall ได้

    วิธีแก้เคยเขียนไว้แล้วใน วิธีจัดการ Facebook Spam

  • การสลับภาษาด้วย “~” Linux Mint 18.2 64 bit

            สำหรับใครที่ในช่วงนี้เบื่อๆเซ็งๆระบบปฎิบัติการ Windows อยากลองอะไรใหม่ๆให้กับชีวิตบ้าง ใจก็อยากไป macOS แหละ ครั้นจะเอามาลงที่เครื่องเรา มันได้เหรอ(คิดในใจเบาๆ) ว่าแล้วก็หันไปซบอก OpenSource อย่าง linux ดีกว่า linux ก็จะประสบปัญหาการเปลี่ยนภาษาเหมือนตอนที่เราลง Windows ใหม่ๆ ต้องกด Left Alt + Shift เพื่อเปลี่ยนภาษา มันก็จะลำบากหน่อยๆ กดไปบ้างไม่ไปบ้างแต่คนที่ชินแล้วก็ปล่อยเขาไปนะค่ะ ส่วนเรายังไม่ชินปกติก็จะใช้ Grave “~” ตลอด ซึ่ง linux เดิมจะใช้ ปุ่ม Ctrl+Shift ในการเปลี่ยนภาษา สืบไปสืบมาได้ความว่า linux จะใช้ “~” แทนการอ้างอิง path home จึงไม่สามารถใช้ “~” เปลี่ยนภาษาได้ แต่สำหรับใครที่ยังไม่ชินก็สามารถติดตั้งโปรแกรมเพิ่มเติม เพื่อให้สามารถเปลี่ยนภาษาได้เนอะ

                ก่อนอื่นต้องทำการ download โปรแกรมมาติดตั้งติดตั้งในเครื่องเพื่อใช้ในการสลับภาษาโดยชื่อว่าgrave-key.tar.gz สามารถ download ได้ที่ http://noc.rmutl.ac.th/main/wp-content/plugins/download-monitor/download.php?id=29
           

    วิธีการติดตั้ง

    1. ไฟล์ที่ download มาจะมีนามสกุล .gz โดยเป็นไฟล์ zip ประเภทหนึ่งบนระบบปฎิบัติการ linux ดังนั้นก่อนการใช้งาน จึงต้องทำการ คลาย zip ก่อน โดยโปรแกรม zip จะถูกติดตั้งเป็นโปรแกรมพื้นฐานมาแล้ว จึงสามารถใช้งานได้ทันที โดยวิธีการคลายzip เข้าไปยังตำแหน่งไฟล์ที่ download คลิกขวาที่ไฟล์ แล้วเลือก “open with archive manager” โปรแกรมที่ไช้ในการคลาย zip จะถูกเปิดขึ้นมา หลังจากนั้น กด Extract แล้วเลือกตำแหน่ง เก็บไฟล์ ดังภาพที่ 1                                  ภาพที่ 1  Extract File ด้วย open with archive manager
    2. ทำการ install โปรแกรม โดยใช้ command ในส่ง install 
      • เปิดโปรแกรม terminal เข้าไปยังตำแหน่ง path ที่ไฟล์โปรแกมอยู่
      • run โปรแกรม ด้วยคำสั่ง ./script.sh
                                                               ภาพที่ 2 run โปรแกรม
    3. ตั้งค่า keyboard เพื่อให้สามารถใช้งานได้ โดยเปิดโปรแกรม Keyboard ตามขั้นตอนดังภาพที่ 3 หรือ Search คำว่ “keyboard” ตรงรูปแว่นขยายด้านบน                                                     ภาพที่ 3 Keyboard Settings
    4.  จากภาพที่ 4 เลือก Tab Layout แล้วกดปุ่ม Options
      • เลือก Layout switching (ดูภาพที่ 5)
      • ติ๊กที่ช่อง Grave switches layout หลังจากนั้น ปิดโปรแกรม ก็จะสามารถใช้ “~” ในการเปลี่ยนภาษาได้ เหมือนกับ Windows ปกติ (ดูภาพที่ 6)

    ภาพที่ 4 Keyboard Layout

    ภาพที่ 5 Layout switching

    ภาพที่ 6 Options

  • App Analytics: เครื่องมือจัดเก็บวิเคราะห์สถิติและเฝ้าระวัง แอพลิเคชั่นบน iOS

    นักพัฒนาหลายท่านโดยเฉพาะ นักพัฒนาเว็บ น่าจะคุ้นเคยกับบริการเก็บข้อมูลและวิเคราะห์ สกิติเว็บไซด์อย่างเช่น Google Analytic เป็นอย่างดี ซึ่งในปัจจุบันถือว่ามีความจำเป็นมากที่นักพัฒนาต้องบอกได้ว่า ผู้ใช้ของเรามีจำนวนเท่าไหร่ เกิดข้อผิดพลาดมากน้อยเพียงใด และช่วงเวลาใดที่มีการใช้งานเยอะ เพื่อเตรียมทรัพยากรให้เพียงพอต่อการให้บริการ รวมถึงการกำหนดเวลาปิดระบบเพื่อบำรุงรักษา ได้อย่างมีประสิทธิภาพ

    ในส่วนของ แอพลิเคชั่นบนระบบปฏิบัติการ iOS เองก็มีเครื่องมือที่ชื่อว่า App Analytics ให้ใช้งาน โดยที่นักพัฒนาไม่ต้องทำอะไรเพิ่มเติม เพียงแค่แอพพลิเคชั่นของท่านอยู่ในสถานะ พร้อมให้ใช้งาน (Ready For Sale) ก็สามารถเข้าใช้งาน App Analytics ได้ทันที โดยมีขั้นตอน และการแปลผลดังนี้

    1. เข้าไปยัง https://itunesconnect.apple.com ทำการ Login ด้วย Apple Developer Account
    2. เลือกเมนู App Analytics
    3. เมื่อเข้าไปยังหน้าแรกจะมีรายการแอพพลิเคชั่นของเราแสดงอยู่ พร้อมข้อมูลเบื้องต้น ในระยะเวลา 1 เดือนล่าสุด (สามารถเปลี่ยนช่วงเวลาได้) โดยข้อมูลที่แสดงอยู่ประกอบไปด้วย
      1. Impressions : จำนวนครั้งที่แอพพลิเคชั่นของเราปรากฏให้ผู้ใช้เห็นเช่น อยู่ในผลการค้นหา, แอพแนะนำ, Top Chart หรือเมื่อผู้ใช้เปิดดูหน้าข้อมูลแอพพลิเคชั่นของเรา เพื่อใช้ดูว่าจำนวนการดาวส์โหลด เมื่อเทียบกับจำนวน Impressions แล้ว ความสนใจในแอพของเรามีมากน้อยเพียงใด
      2. App Units: จำนวนเครื่องที่ติดตั้งแอพพลิเคชั่นของเราอยู่
      3. Sales: จำนวนเงินรวม ที่ขายได้
      4. Sessions: จำนวนการเปิดใช้งาน
      5. Crashes: จำนวนข้อผิดพลาดที่เกิดขึ้นขณะใช้งาน
    4. เมื่อคลิกเลือกที่รายการ แอพลิเคชั่น จะแสดงข้อมูล Impressions, Product Page Views, App Units, In-App Purchases, Sales, Sessions, Active Devices, Crashes ในรูปแบบกราฟ อยู่ส่วนบนสุด
    5. ถัดมาจะเป็น Info graphic แยกตามประเทศ โดยสามารถเลือกได้ว่าเป็นข้อมูล App Units, Sessions, Active Devices เป็นต้น
    6. ล่างสุดจะเป็นกราฟวงกลม แยกตามอุปกรณ์ โดยสามารถเลือกได้ว่าเป็นข้อมูล App Units, Sessions, Active Devices ได้เช่นกัน
    7. หากต้องการดูข้อมูลในมุมมองอื่นๆ หรือกำหนดเงื่อนไขเพิ่มเติมเพื่อดูในรูปแบบกราฟเส้น สามารถเลือกเมนู Metrics และกำหนดค่าต่างๆได้ตามต้องการ
    8. จากหน้าจอกราฟแบบ Metrics สามารถ Export ออกเป็น Excel ได้โดยกดปุ่ม