วันศุกร์ที่ 14 กันยายน พ.ศ. 2561

การ Replace เครื่องหมายจบ บรรทัด (End paragraph) ใน Microsoft Office Word

ใช้ Function Search Replace แล้วค้นหาตัวอักษร ^p ต่อ Enter จบรรทัด หนึ่งตัว

ถ้าติดกันสองตัว หรือ Enter สองครั้ง ก็ใช้ ^p^p

วันพุธที่ 12 กันยายน พ.ศ. 2561

ปัญหาไม่สามารถใช้คำสั่ง User.IsInRole ใน .Net Core 2.1 ได้

เป็นปัญหาจากการ Design ของ .Net Core เอง ดูได้จาก คู่มือของ Microsoft ดังนี้
ซึ่งเกิดจากการใช้ AddDefaultIdentity ใน ASP.NET Core 2.1 แต่ ฟังก์ชั่นนี่จะได้รับการแก้ไขใน ASP.NET Core 2.2 ซึ่่งขณะนี้ยังเป็นสถานะ preview อยู่

แต่ก็มี work around โดยการกลับมาใช้ function เดิม คือ การกลับมาใช้ services.AddIdentity<ApplicationUser, IdentityRole>() แบบเดิม
ดังภาพ
แต่การกลับมาทำแบบนี้ จะทำให้มีปัญหาเกิดขึ้นอีกอย่าง คือ การ redirect และ การส่งอีเมล์จากฟังก์ชั่นยืนยันตนสองขั้นตอน จาก function ของ AddDefaultIdentity  เนื่องจากหายไป เพราะการใช้ AddIdentity

ทำให้ต้องมีการ config เพิ่มในสองส่วนนี้  (สาม ถ้าต้องส่ง SMS ด้วย)

อย่างแรก แก้ปัญหาการ redirect ผิดหน้า เนื่องจาก AddIdentity เดิม จะอ้าง Controller เดิม ซึ่งไม่มี Area ทำให้หาไม่พบ เนื่องจาก .Net Core 2.1 ได้มีการเพิ่ม Area สำหรับ Function Identity เพิ่มเข้ามาแทน

ตัวอย่างเช่น Function ConfigureServices ใน StartUp.cs


เราจะใช้ Function services.ConfigureApplicationCookie ในการดำเนินการ ดังตัวอย่าง
    services.ConfigureApplicationCookie(options =>
    {
        // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

        options.LoginPath = "/Identity/Account/Login";
        options.AccessDeniedPath = "/Identity/Account/AccessDenied";
        options.SlidingExpiration = true;
    });

เท่านี้ การ Redirect เมื่อยังไม่เข้าระบบหรือถูกปฏิเสธิสิทธิ์การเข้าถึงก็จะใช้งานได้ ต่อไป การจัดการเกี่ยวกับการส่งอีเมล เนื่องจาก ถ้าคลิกเข้าหน้า Manage หรือ หน้าที่มีการ injection IEmailSender จะ Error เนื่องจากไม่ได้ตั้งค่าไว้ ก็ให้สร้าง class ใหม่ สืบทอดจาก IEmailSender

 public class EmailSender : IEmailSender
    {
        public EmailSender()
        {
        }

        public Task SendEmailAsync(string email, string subject, string message)
        {
            return Execute("", subject, message, email);
        }

        public Task Execute(string apiKey, string subject, string message, string email)
        {
            SmtpClient client = new SmtpClient("mysmtpserver");
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential("username", "password");

            MailMessage mailMessage = new MailMessage();
            mailMessage.From = new MailAddress("whoever@me.com");
            mailMessage.To.Add("receiver@me.com");
            mailMessage.Body = "body";
            mailMessage.Subject = "subject";
            return client.SendMailAsync(mailMessage);
        }
    }

แล้วก็ไปเพิ่ม option ในส่วนของ services ว่า

services.AddTransient<IEmailSender, EmailSender>();

ก่อนเรียก mvc  จะได้ประมาณนี้ครับ


เท่านี้ ก็น่าจะใช้ได้แล้ว สำหรับการใช้ User.IsInRole หรือการจัดการ Role ใน Controller ต่าง ๆ

วันพุธที่ 2 พฤษภาคม พ.ศ. 2561

ปัญหาไม่สามารถลบ (Remove) Keyboard Layout ใน Windows 10 Build 17134 ได้

ปกติ ผมจะใช้อยู่สองภาษา คือ English (US) กับ Thai แต่พอ Update ทีไร จะได้ English (UK) ติดมาด้วยทุกที  ซึ่งปกติ ก็ลบออกได้นะ  แต่รอบนี้ลบออกไม่ได้ เนื่องจากปุ่ม Remove มีลักษณะเป็นสีเทา (Gray) ทำให้กดไม่ได้

ซึ่งเคยทำให้เหลือแค่ English (UK) กับ Thai ได้ แต่มีปัญหาอีกว่า เวลาใช้พวก Single quote หรือ Double quote ตัว English (UK) มันจะแปลก ๆ คือมันจะไม่ Display ขึ้นมาทันที ต้องกดอีกที ถึงจะเห็น  ก็ค่อนข้างจะสร้างความรำคาญมากกว่าความสะดวก เลยต้องพยายามเอาภาษาหรือ Layout นี้ออกไป

เอาละพูดถึงการย้อนเวอร์ชั่นก่อน
ซึ่งจะอยู่ในหัวข้อ Recovery (ใช้ Search หาเอาได้ครับ หลังจากอัพเดท หากมีปัญหานี้)
โดยเราจะใช้หัวข้อ Go back to the previous version of Windows 10 เพื่อทำการย้อนเวอร์ชั่น
หลังจากนั้น เราจะใช้ language ทำการ Remove ทุกภาษาที่ไม่ใช้ออกไป แล้วทำการตรวจสอบภาษาด้วยคำสั่งดังนี้
เปิด Command Prompt ด้วยสิทธิ์ ของ Administrator และใช้คำสั่ง
dism /online /get-intl

ซึ่งสาระสำคัญ จะอยู่ที่ Default system UI Language และ Language Packs
ซึ่งเดิม OS ผมจะใช้ en-GB เป็น Default system UI language ทำให้การอัพเดททุกครั้ง จะได้ภาษาและ Keyboard Layout English (UK) ติดมาเสมอเลย

แต่ทั้งนี้ เราสามารถเปลี่ยน Default system UI language ได้ครับ เพียงแต่ จะต้องลง Language Pack เอาไว้ก่อนด้วย ถึงจะเปลี่ยนได้ เพราะมีผลกระทบกับ Display language  ซึ่งหลังจากที่ผมพยายามจะติดตั้ง Language pack ก็ไม่สามารถทำได้ จะขึ้นข้อความ A language pack isn't available ตลอดเลย

แต่ใน build 16299 - 1709 นั้นสามารถโหลด language pack เพื่อมาติดตั้งได้เอง ที่นี่

English (US) 64 bit
Thai 64 bit

ทั้งนี้ ใครที่ต้องการภาษาอื่น ก็ไปที่ https://www.itechtics.com/windows-10-version-1709-language-packs-direct-download-links ได้เลยครับ มีให้โหลดครบเลย ทั้ง 32bit และ 64bit

ตัวไฟล์ที่ได้มาจะเป็น cab files ซึ่งสามารถติดตั้งด้วยคำสั่ง lpksetup ใน Command prompt ครับ

พอติดตั้งเสร็จแล้ว จะได้ Display language มาด้วย ก็ให้เราปรับปรุงระบบของเราให้เหลือแต่ภาษาที่จะใช้ครับ โดยเช็คได้จาก Copy settings ครับ ดังภาพ

ซึ่งจะต้องเหลือแค่ภาษาที่เราใช้จริง ๆ หลังจากตั้งค่าเรียบร้อยแล้ว ก็ทำการเปลี่ยน Default system language ด้วย Regedit กันครับ
โดยพุ่งเป้าไปที่
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Nls\Language
โดยให้มองหาค่า Default และ InstallLanguage ครับ
ซึ่งอ้างอิงจาก โพสต์ที่แล้ว ค่า 0809 จะเป็นค่า English - UK ครับ ก็ทำการเปลี่ยนค่า Default ให้เป็น 0409 ซึ่งเป็นของ English - US แล้ว Restart เครื่องครับ

เท่านี้ ก็เรียบร้อยสำหรับการเตรียมพร้อมเครื่องเพื่อการอัพเดท โดยไม่มี Keyboard Layout อื่นมากวนใจแล้วครับ

ทังนี้ทั้งนั้นต้องขอบคุณต้นทาง ที่ทำให้ผมหาทางแก้ไขปัญหานี้ได้สำเร็จ คือที่
https://www.tenforums.com/tutorials/30656-see-default-system-language-windows-10-a.html
ครับ

วันพุธที่ 3 มกราคม พ.ศ. 2561

การใช้งาน NLog ใน Core 2.0

1. ใช้ NuGet ลง "NLog.Web.AspNetCore" Version 4.5.x ขึ้นไป (ในตอนนี้ยังเป็นตัว Prerelease อยู่)
2. สร้างไฟล์ "nlog.config" ใน Root folder project.
แล้วใส่ข้อมูลตามนี้

<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="info"
      internalLogFile="c:\temp\internal-nlog.txt">


  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file  -->
    <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId.Id}|${uppercase:${level}}|${logger}|${message} ${exception}" />

    <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
    <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-own-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId.Id}|${uppercase:${level}}|${logger}|${message} ${exception}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />

    <!-- write to the void aka just remove -->
    <target xsi:type="Null" name="blackhole" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>

3. แก้ไข Program.cs ใน Root ในส่วนของ BuildWebHost โดยเพิ่ม UseNLog() เข้าไป
เป็น

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseNLog() // NLog: setup NLog for Dependency injection
                .Build();

โดยใช้ using NLog.Web;

4. สำหรับการใช้งานใน Controller ก็ทำ injection โดยใช้รูปแบบ ดัง Code ต่อไปนี้

using Microsoft.Extensions.Logging;

namespace xxxHome.Controllers
{
    public class HomeController : Controller
   {
        private readonly ILogger<HomeController> _logger;
     
        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            _logger.LogInformation("Index page says hello");
            return View();
        }
    }
}




ref :// https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2