รู้หรือไม่ : บริการโทรศัพท์ภายในมหาวิทยาลัยสงขลานครินทร์

เกี่ยวกับ บริการโทรศัพท์ภายในมหาวิทยาลัยสงขลานครินทร์ เผื่อท่านใดไม่ทราบ (เป็นการสรุปจาก “คู่มือการใช้งานโทรศัพท์พื้นฐาน”  http://telecom.cc.psu.ac.th/telephone/fn.pdf ) — ที่สรุปไว้นี่เพื่อให้ง่ายต่อการใช้งานอย่างรวดเร็วมากยิ่งขึ้นเท่านั้น และเป็นเฉพาะที่ใช้บ่อยทำนั้น — ติดต่อ Operator : กด 9 โทรซ้ำเบอร์ที่เพิ่มโทรไป : กด *70 รับสายแทนอีกเครื่องนึงที่ดัง : กด *72 ตามด้วยหมายเลขที่ดัง ฝากสายให้อีกเบอร์รับ ทันที : กด *60 ตามด้วยหมายเลขที่จะช่วยรับสายแทน ฝากสายให้อีกเบอร์รับ กรณีสายไม่ว่าง : กด *61 ตามด้วยหมายเลขที่จะช่วยรับสายแทน ฝากสายให้อีกเบอร์รับ กรณีไม่มีคนรับสาย : กด *62 ตามด้วยหมายเลขที่จะช่วยรับสายแทน ฝากสายให้อีกเบอร์รับ กรณีทั้ง สายไม่ว่าง และ ไม่มีคนรับสาย : กด *63 ตามด้วยหมายเลขที่จะช่วยรับสายแทน ยกเลิกการฝากสาย: กด *64 โทรกลับเบอร์ที่โทรเข้ามาล่าสุด: กด *68

Read More »

รู้จักฟังก์ชัน Excel ตอนที่ 1 เรื่อง ตระกูลท่าน Count

หลาย ๆ ท่านคงใช้ Excel อยู่ในชีวิตประจำวันไม่มากก็น้อย อาจจะชินตากับ Function Count กันอยู่บ่อย ๆ แต่ Function นี้ ไม่ได้มาเดี่ยว ๆ นะคะ ยังมีญาติ ๆ ในตระกูลอีกเพียบเลย มาดูกันค่ะว่า มีอะไรบ้าง และแต่ละ Function นั้นทำงานกันอย่างไรค่ะ COUNT COUNTA COUNTBLANK COUNTIF COUNTIFS Function ตระกูล Count หลัก ๆ ที่ผู้เขียนใช้งานจะมี 5 Function ข้างต้นนะคะ สำหรับในตอนที่ 1 นี้ ผู้เขียนจะนำเสนอ 3 ฟังก์ชันแรกก่อนก็คือ COUNT, COUNTA และ COUNTBLANK ค่ะ ส่วนอีก 2 Function สามารถติดตามต่อได้ในตอนที่ 2 นะคะ   COUNT  สำหรับฟังก์ชันนี้ จะใช้สำหรับนับจำนวนเฉพาะตัวเลข โดยไม่นับตัวอักษรและช่องว่าง ที่อยู่ในช่วงที่เรากำหนด(range) หรือเลือกทีละค่า(value) ตามที่เราต้องการ รูปแบบ Function แบบ value คือ COUNT(value1, [value2],…) value1 คือ ค่าข้อมูลแรกที่ต้องการนับจำนวน ในที่นี้คือใส่ทีละค่า ค่านี้จำเป็นต้องระบุ value2 คือ ค่าข้อมูลที่สอง ที่ต้องการนับจำนวน ไม่จำเป็นต้องมี สามารถเลือกค่าได้เรื่อย ๆ ตัวอย่าง ภาพที่ 1 การเลือกทีละค่าเพื่อนับจำนวนโดยใช้ Function Count   รูปแบบ Function แบบ range คือ COUNT(value1, [value2],…) value1 คือ ค่าข้อมูลแรกที่ต้องการนับจำนวนในที่นี้คือใส่เป็นช่วง การระบุคือ จุดเริ่มต้น:จุดสิ้นสุด ค่านี้จำเป็นต้องระบุ value2 คือ ค่าข้อมูลที่สอง ที่ต้องการนับจำนวน ไม่จำเป็นต้องระบุ สามารถเลือกค่าได้เรื่อย ๆ ตัวอย่าง ภาพที่ 2 การเลือกค่าเป็นช่วงเพื่อนับจำนวนโดยใช้ Function Count ผลลัพธ์ที่ได้ หมายเหตุ เนื่องจาก จากภาพที่ 1 และ 2 มีการเลือกค่าเท่ากับการเลือกแบบช่วงดังนั้นค่าที่ได้จะเท่ากันค่ะ จากผลลัพธ์ที่ได้ จะเห็นได้ว่า Function Count จะนับเฉพาะตัวเลขเท่านั้น ส่วนตัวอักษรหรือช่องว่าง จะไม่ถูกนับค่ะ ซึ่งจะเห็นได้ว่า ข้อมูลคำนำหน้า เกรดและคะแนน จะนับได้แค่ 0 เนื่องจากมีช่องว่างข้อมูลและข้อมูลใน Column นั้นเป็นตัวอักษรค่ะ COUNTA สำหรับฟังก์ชันนี้ จะใช้สำหรับนับจำนวนข้อมูลทั้งหมดทั้งตัวอักษรและตัวเลข แต่ไม่นับช่องว่าง ที่อยู่ในช่วงที่เรากำหนด(range) หรือเลือกทีละค่า(value) ตามที่เราต้องการดังภาพค่ะ รูปแบบ Function แบบ value คือ COUNTA(value1, [value2],…) value1 คือ ค่าข้อมูลแรกที่ต้องการนับจำนวน จะระบุทีละค่าหรือระบุเป็นช่วงก็ได้ แต่ค่านี้จำเป็นต้องระบุ value2 คือ ค่าข้อมูลที่สอง ที่ต้องการนับจำนวน ไม่จำเป็นต้องมี สามารถเลือกค่าได้เรื่อย ๆ ตัวอย่าง จากผลลัพธ์ที่ได้ จะเห็นได้ว่า Function CountA จะนับข้อมูลทั้งหมด ยกเว้นช่องว่าง จะไม่ถูกนับค่ะ ซึ่งจะเห็นได้ว่า ข้อมูลเกรดและคะแนน จะนับได้แค่ 4 เนื่องจากมีช่องว่างข้อมูลละช่อง COUNTBLANK สำหรับฟังก์ชันนี้ จะใช้สำหรับนับจำนวนเฉพาะช่องว่าง ที่อยู่ในช่วงที่เรากำหนด(range) รูปแบบ Function แบบ value คือ COUNTBLANK(range) range คือ ช่วงของข้อมูลที่ต้องการ ตัวอย่าง จากผลลัพธ์ที่ได้ จะเห็นได้ว่า Function CountBlank จะนับเฉพาะข้อมูลที่เป็นช่องว่างค่ะ ซึ่งจะเห็นว่าข้อมูลในที่นี้มีช่องเกรดและช่องคะแนน ที่มีช่องว่าง Column ละช่อง   สำหรับในตอนที่ 1 ก็ขอจบลงเพียงเท่านี้ สามารถติดตาม

Read More »

Migration project.json to csproj format (C#)

ในช่วงการพัฒนาของ .NET Core tooling จนถึงปัจจุบัน มี design/component หลายอย่างที่มีการเปลี่ยนแปลงในลักษณะที่ไม่ compatible กับ version ก่อนหน้า หรือยกเลิกการใช้งาน หนึ่งในนั้นก็คือ project config file ที่เริ่มต้นใช้รูปแบบ json ซึ่งอยู่ใน file ที่ชื่อ project.json แต่ปัจจุบัน เปลี่ยนมาใช้ MSBuild/csproj format การ migration project.json ไปสู่ .csproj format ทำได้ด้วยกันสองวิธีคือ Visual Studio 2017 dotnet migrate command-line tool ทั้งสองวิธีใช้กลไกการทำงานเดียวกัน ซึ่งผลที่ได้จะเหมือนกัน Visual Studio 2017 เปิด project โดยเปิด file .xproj ใน Visual Studio 2017 จะปรากฎ One-way upgrade dialog ขึ้นมาให้เลือก OK, Visual Studio จะทำการ migrate โดย file ที่ถูก migrate (project.json, global.json, .xproj) จะถูกย้ายไปสำรองไว้ใน folder Backup dotnet migrate ใช้ command-line เข้าไปที่ folder ที่เก็บ project และใช้คำสั่ง dotnet migrate ซึ่งจะทำการ migrate โดย file ที่ถูก migrate (project.json, global.json, .xproj) จะถูกย้ายไปสำรองไว้ใน folder Backup <Project Sdk=”Microsoft.NET.Sdk”> … </Project> ข้อแตกต่างระหว่าง project.json กับ csproj format ( อยู่ในรูปแบบ XML-based ซึ่งมี root node ระบุ sdk ที่ใช้คือ Microsoft.NET.Sdk สำหรับ web project sdk ที่ใช้คือ Microsoft.NET.Sdk.Web ) มีดังนี้ Common options ****** JSON format ****** { “name”: “MyProjectName”, “version”: “1.0.0-alpha-*”, “authors”: [ “name1”, “name2” ], “company”: “PSU”, “language”: “en-US”, “title”: “My library”, “description”: “This is my library.”, “copyright”: “PSU 3000”, “userSecretsId”: “xyz123” } ****** csproj format ****** <PropertyGroup> <AssemblyName>MyProjectName</AssemblyName> <PackageId>MyProjectName</PackageId> <VersionPrefix>1.0.0</VersionPrefix> <VersionSuffix>alpha</VersionSuffix> <Authors>name1;name2</Authors> <Company>PSU</Company> <NeutralLanguage>en-US</NeutralLanguage> <AssemblyTitle>My library</AssemblyTitle> <Description>This is my library.</Description> <Copyright>PSU 3000</Copyright> <UserSecretsId>xyz123</UserSecretsId> </PropertyGroup> frameworks ****** JSON format ****** { “frameworks”: { “netcoreapp1.0”: {}, “net451”: {} } } ****** csproj format ****** <PropertyGroup> <TargetFrameworks>netcoreapp1.0;net451</TargetFrameworks>

Read More »

ASP.NET API Security

ปัจจุบันการพัฒนาโปรแกรมในรูปแบบของ API นั้นแพร่หลายมาก เนื่องจากจะทำให้โปรแกรมยืดหยุ่น สามารถพัฒนา Interface ไปในรูปแบบที่หลากหลาย ทั้ง Desktop, Mobile โดยเฉพาะการเรียก API ผ่าน http นั้น ถือว่าค่อนข้างที่จะยืดหยุ่นกับเกือบจะทุก platform ดังนั้น การรักษาความปลอดภัยให้กับ API เหล่านี้ เป็นสิ่งที่จำเป็นและสำคัญอย่างยิ่ง บทความนี้จะพูดถึง 2 เรื่องหลักๆ ได้แก่ การ Authentication และการ Authorization ดังนี้ครับ   Authentication เปรียบเสมือนกับการตรวจสอบว่าใครเป็นผู้ร้องขอ (request) ซึ่งอาจจะเป็นในลักษณะของ username/password หรือเป็น API Key จากใน HTTP Request Header ในบทความนี้จะขอข้ามการพูดถึงการ authentication ด้วย username/password เพราะเชื่อว่าสามารถทำกันได้อยู่แล้ว ไม่ว่าจะเป็นการเขียน provider เองหรือใช้ provider ที่มีมาให้กับ .net framework ซึ่งได้แก่ MembershipProvider โดยจะขอเริ่มพูดในส่วนของ API Key ซึ่งจะใช้คลาส HttpMessageHandler (ทำงานใน http message level ดีกว่าไปทำใน controller แน่นอนครับ) วิธี implement คือ การสร้าง Class ที่ inherite มาจาก DelegatingHandler (ซึ่งมาจาก HttpMessageHandler อีกที) จะให้ override ส่วนของการตรวจสอบ HTTP Request โดยการทำ overriding method ชื่อ SendAsync และเพื่อให้ทำงานได้ จะต้องทำการ register handler ที่ Global.asax ใน Application_Start ด้วยครับ ด้วยคำสั่ง GlobalConfiguration.Configuration.MessageHandlers.Add(new MY_CLASS()); API Key Authentication เราจะต้องมี API Key โดยสามารถเก็บไว้เป็นค่าคงที่ หรือเก็บไว้เป็นข้อมูลในฐานข้อมูล จากนั้นทำการตรวจสอบ Request ที่เข้ามาด้วยคำสั่งต่อไปนี้ HttpRequestMessage.Headers.TryGetValues(“API_KEY”, out myHeader) (ต้องทำการสร้าง instance ของ HttpRequestMessage ก่อนนะครับ — myHeader เป็น type IEnumerable<string>) จากนั้นเรานำค่าในตัวแปรมาตรวจสอบกับ API Key ของเรา ที่เราเก็บไว้ เช่น ถ้าเก็บไว้เป็นค่าคงที่ ก็ตรวจสอบดังนี้ myHeader.FirstOrDefault().Equals(“MySecretAPIKeyNaJa”); หรือถ้าเก็บไว้ในฐานข้อมูล ก็ตรวจสอบดังนี้ db.API_KEY.Where(w => w.KEY == myHeader.FirstOrDefault()).Count() > 0 เป็นต้น หากเป็น API Key ที่ถูกต้อง สามารถ return response ดังนี้ได้ทันที await base.SendAsync(HttpRequestMessage, CancellationToken); ส่วนถ้าเป็น API Key ที่ไม่ถูกต้อง สามารถ return response ดังนี้ เพื่อให้ browser รู้ว่าเกิดอะไรขึ้น HttpRequestMessage.CreateResponse(HttpStatusCode.Forbidden, “Invalid API Key”);   Authorization การทำ authorization นี้จะใช้งาน RoleProvider จาก .NET Framework ซึ่งจะต้องทำการ Implement role provider มาก่อน (รายละเอียด: https://msdn.microsoft.com/en-us/library/8fw7xh74.aspx) หลังจากการทำยืนยันตัวตน (Authentication) แล้ว ควรจะทำการตรวจสอบการอนุญาตให้เข้าถึงทรัพยากรหรือการกระทำ (action) ด้วย ด้วยการใช้งาน AuthorizeAttribute ซึ่งเป็น filter attribute ด้วยวิธีการง่ายๆ

Read More »

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

บทความนี้นำเสนอขั้นตอนการพัฒนา Unit Test อย่างง่ายโดยแสดงให่้เห็นการพัฒนาทีละขั้นตอน สำหรับระบบที่พัฒนาบน .NET Core โดยใช้ MSTest เพื่อทำความเข้าใจการพัฒนาแบบ test-driven development (TDD) ซึ่งในขั้นแรก เริ่มต้นด้วยการสร้าง source project ชื่อ “CalcTool” ใช้สำหรับการทดสอบ อยู่ภายใต้ folder “TestSample” ซึ่งขั้นตอนการสร้าง project สามารถดูได้จาก บทความ การพัฒนา Unit Testing โดย xUnit test library (.NET Core) ซึ่งจะได้ class “Calc” ซึ่งประกอบไปด้วย method “AbsAddByOne(int value)” ที่ยังไม่ได้เขียน code การทำงาน สร้าง test project ที่ใช้ MSTest library โดยเปิด command prompt เข้าไปที่ folder “TestSample” และสร้าง sub folder ชื่อ “CalcTool.MSTests” จากนั้นเข้าไปที่ folder “CalcTool.MSTests” ทำการสร้าง .NET Core project โดยใช้คำสั่ง dotnet new mstest โดยคำสั่งนี้จะทำการสร้าง test project ที่ใช้ MSTest test library และกำหนดค่า test runner <ItemGroup> <PackageReference Include=”Microsoft.NET.Test.Sdk” Version=”15.0.0″/> <PackageReference Include=”MSTest.TestAdapter” Version=”1.1.11″/> <PackageReference Include=”MSTest.TestFramework” Version=”1.1.11″/> </ItemGroup> เพิ่ม reference ไปยัง project ที่ต้องการทดสอบซึ่งในที่นี้คือ CalcTool project โดยใช้คำสั่ง dotnet add reference ../CalcTool/CalcTool.csproj จากนั้นให้ execute คำสั่ง dotnet restore เพื่อ restore NuGet package ที่จำเป็นต้องใช้ในแต่ละ project เริ่มพัฒนา unit testing โดยลบ file “UnitTest1.cs” และสร้าง file ใหม่โดยใช้ชื่อว่า “CalcTest.cs” และเขียน code ดังนี้ using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace CalcTool.MSTest { [TestClass] public class CalcTest { [TestMethod] public void AbsAddByOneTest() { var c = new Calc(); var result = c.AbsAddByOne(5); Assert.AreEqual(result, 6); } } } *[TestClass] attribute ใช้เพื่อบอกว่ามี unit test อยู่ใน class นั้น *[TestMethod] attribute ใช้เพื่อกำหนดว่า method นั้นๆเป็นแบบ single test ทำการทดสอบโดยการ execute dotnet test ซึ่งจะทำการ build และ start MSTest test runner ซึ่งพบว่าผลการทดสอบ fail เนื่องจากยังไม่ได้ implement code ใน method “AbsAddByOne” ของ class “Calc” ดังนั้นกลับไปที่ method

Read More »