songpol

Model Validation for .NET MVC5 + EF Database First

หากใช้งาน database first แล้วเกิดปัญหาว่าเวลาที่ update model from database แล้ว EF จะ gen model ให้เราใหม่ ทำให้ Validation ที่เราทำไว้หายไปในพริบตา

วิธีการนั้นมันผิดตั้งแต่ตอนแรกแล้ว เพราะยังไงเราก็ปรับ model เรื่อยๆตามกาลเวลาแน่นอนอยู่แล้ว

ให้เราเขียน Class Metadata Add Validate เข้าไปจะทำให้ไม่ต้องมาคอยกลัวว่ามันจะหายจะดีกว่า

นี่คือ class ที่ได้จากการ gen ado.net

//------------------------------------------------------------------------------
// <auto -generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto>
//------------------------------------------------------------------------------
 
namespace WebPortal.Models
{
    using System;
    using System.Collections.Generic;
 
    public partial class Patient
    {
        public Patient()
        {
            this.PatientExams = new HashSet<patientexam>();
        }
 
        public int PatientId { get; set; }
        public string Fullname { get; set; }
        public string Company { get; set; }
        public string ID { get; set; }
        public Nullable<system .DateTime> Birthday { get; set; }
        public int GenderId { get; set; }
        public string Telephone { get; set; }
 
        public virtual Gender Gender { get; set; }
        public virtual ICollection<patientexam> PatientExams { get; set; }
    }
}
</patientexam></system></patientexam>

จากนั้นเราก็เขียน class ไว้ที่ใหนก็ได้ ให้ namespace เดียวกันเพราะมันคือส่วนหนึงของ model เราเหมือนกันแบบนี้

namespace WebPortal.Models
{
    [MetadataType(typeof(Patient.Metadata))]
    public partial class Patient
    {
        internal sealed class Metadata
        {
            [Required]
            public string Fullname { get; set; }
 
 
            [Required]
            public string ID { get; set; }
 
 
            [Required]
            public string GenderId { get; set; }
 
 
            [Required]
            public string Telephone { get; set; }
        }
    }
}

ที่ form ของ scaffold จะทำให้มี validation พวกนี้ขึ้นมาทันที สะดวกดีนะ :)

MVC Pagination Xml Setting for Bootstrap

หากเราใช้ Pagination Class for ASP.NET MVC แล้วเราต้องการใช้งานเป็น Style BootStrap จะง่ายมากๆ เพียง Setting XML ให้เป็นแบบ Bootstrap ก็ใช้งานออกมาสวยงามทันที

ตามนี้

< ?xml version="1.0" encoding="utf-8" ?>
<pagination>
  <numlinks>< ![CDATA[10]]></numlinks>
 
  <fulltagopen>< ![CDATA[<ul class="pagination pagination-lg">]]></fulltagopen>
  <fulltagclose>< ![CDATA[</ul>]]></fulltagclose>
 
  <curtagopen>< ![CDATA[<li class="active"><a href="#">]]></a></curtagopen>
  <curtagclose>< ![CDATA[</a>]]></curtagclose>
 
  <numtagopen>< ![CDATA[<li>]]></numtagopen>
  <numtagclose>< ![CDATA[</li>]]></numtagclose>
 
  <nexttagopen>< ![CDATA[<li>]]></nexttagopen>
  <nexttagclose>< ![CDATA[</li>]]></nexttagclose>
 
  <prevtagopen>< ![CDATA[<li>]]></prevtagopen>
  <prevtagclose>< ![CDATA[</li>]]></prevtagclose>
 
  <firsttagopen>< ![CDATA[<li>]]></firsttagopen>
  <firsttagclose>< ![CDATA[</li>]]></firsttagclose>
 
  <lasttagopen>< ![CDATA[<li>]]></lasttagopen>
  <lasttagclose>< ![CDATA[</li>]]></lasttagclose>
</pagination>

ตัว pagination class ให้ download ที่ http://www.codeproject.com/Articles/28605/Pagination-Class-for-ASP-NET-MVC

ป ลิง ให้เอา Pagination.xml ไปใส่ไว้ใน ~/Content/ แล้วเวลาที่เรียกใช้งาน Class Pagination ให้ใส่ parameter ด้วย ตัวอย่างเช่น

Pagination pagination = new Pagination(true);
pagination.BaseUrl = Url.Action("ServicesIndex", "Services") + "?page=";
pagination.TotalRows = statement.Count();
pagination.CurPage = page;
pagination.PerPage = take;
ViewBag.pagination = pagination.GetPageLinks();

javascript generate password function

 
function GeneratePassword(length, numbers_len, specialchars_len) {
 
    length = typeof length !== 'undefined' ? length : 8;
    numbers_len = typeof numbers_len !== 'undefined' ? numbers_len : 1;
    specialchars_len = typeof specialchars_len !== 'undefined' ? specialchars_len : 1;
    alphabets_len = length - numbers_len - specialchars_len;
 
    var alphabets = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
    var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    var specialchars = ['-', '=', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+'];
    var randomstring = '';
 
 
    for (var i = 0; i < alphabets_len; i++) {
        var r = Math.floor(Math.random() * alphabets.length);
        randomstring += alphabets[r];
    }
    for (var i = 0; i < numbers_len; i++) {
        var r = Math.floor(Math.random() * numbers.length);
        randomstring += numbers[r];
    }
    for (var i = 0; i < specialchars_len; i++) {
        var r = Math.floor(Math.random() * specialchars.length);
        randomstring += specialchars[r];
    }
 
    var shuffled = [];
    randomstring = randomstring.split('');
    while (randomstring.length) {
        shuffled.push(randomstring.splice(Math.floor(Math.random() * (randomstring.length - 1)), 1)[0]);
    }
 
    return shuffled;
}

2.4GHz RFID

ตอนนี้กำลังดูเกี่ยวกับ RFID เยอะมาก ลองหาข้อมูลก็เห็น 2.4GHz น่าสนใจแต่ดูไม่ได้ เลยขอปักเอาไว้ดูหน่อย

มันน่าสนใจเรื่องระยะ และการทำใบใช้งานทั้งหมดเลย

Interactive Customization

เชื่อว่า VDO นี้คงจะมีคนทำให้มันเป็นจริงๆแล้ว แล้วก็อีก 3-5 ปีจะมีการใช้งานจริงๆ และอีก 20 ปีคงเป็นโครงสร้างพื้นฐานของร้านอาหารทุกร้านในที่สุด ถึงแม้ว่ามันจะไม่ได้มีหน้าตาแบบนี้ก็ตาม

Running Redis On Windows Server

****ตอนแรกให้อ่าน Document ไปก่อน ถ้าใครอยากอ่านเรื่องการติดตั้ง ให้ลงไปข้างล่างสุดเลย****

Running Redis as a Service

In order to better integrate with the Windows Services model, new command line arguments have been introduced to Redis. These service arguments require an elevated user context in order to connect to the service control manager. If these commands are invoked from a non-elevated context, Redis will attempt to create an elevated context in which to execute these commands. This will cause a User Account Control dialog to be displayed by Windows and may require Administrative user credentials in order to proceed.

Installing the Service

--service-install

This must be the first argument on the redis-server command line. Arguments after this are passed in the order they occur to Redis when the service is launched. The service will be configured as Autostart and will be launched as “NT AUTHORITY\NetworkService”. Upon successful installation a success message will be displayed and Redis will exit.

This command does not start the service.

For instance:

redis-server --service-install redis.windows.conf --loglevel verbose

Uninstalling the Service

--service-uninstall

This will remove the Redis service configuration information from the registry. Upon successful uninstallation a success message will be displayed and Redis will exit.

This does command not stop the service.

For instance:

redis-server --service-uninstall

Starting the Service

--service-start

This will start the Redis service. Upon successful start, a success message will be displayed and Redis will begin running.

For instance:

redis-server --service-start

Stopping the Service

--service-stop

This will stop the Redis service. Upon successful termination a success message will be displayed and Redis will exit.
For instance:

redis-server --service-stop

Naming the Service

--service-name name

This optional argument may be used with any of the preceding commands to set the name of the installed service. This argument should follow the service-install, service-start, service-stop or service-uninstall commands, and precede any arguments to be passed to Redis via the service-install command.

The following would install and start three separate instances of Redis as a service:

redis-server --service-install –service-name redisService1 –port 10001
redis-server --service-start –service-name redisService1
redis-server --service-install –service-name redisService2 –port 10002
redis-server --service-start –service-name redisService2
redis-server --service-install –service-name redisService3 –port 10003
redis-server --service-start –service-name redisService3

ถึงตอนที่ติดตั้งจริงๆ เราก็ใช้ default ประมาณว่า

ตอนที่เรา Download มาเราจะได้ Zip ซึ่งในนั้นจะมีพวก execute fileต่างๆพวกนี้

Redis on Windows Release Notes.docx
Redis on Windows.docx
Windows Service Documentation.docx
redis-benchmark.exe
redis-check-aof.exe
redis-check-dump.exe
redis-cli.exe
redis-server.exe
redis.windows.conf

ย้ายพวกนี้่ไปยัง folder ที่เราต้องการติดตั้ง เช่น c:\ ก็ได้ จากนั้นเราก็เข้า Command Line ไปที่ folder ที่เราวางไว้แล้ว install service ด้วยคำสั่ง

redis-server --service-install redis.windows.conf --loglevel verbose

จากนั้นเราก็จะได้ Redis Server Service ขึ้นมาใช้งาน Start Stop ได้เลย

Redis Service

การทดสอบว่าเปิด Port ทำงานเรียบร้อย ก็ให้ Telnet เข้าไปก็ได้

telnet 127.0.0.1 6379

หากใครเปลี่ยน port ไปก็ให้ telnet ไปที่ port นั้นๆนะ โดย default จะอยู่ที่ 6379ครับ

ทำนี้ก็ทำงานกันต่อเลย

my digital ocean setup LAMP

a2enmod rewrite
apt-get update -y
apt-get install curl libcurl3 libcurl3-dev php5-curl php5-sqlite -y
service apache2 restart

มีไม่กี่คำสั่งหรอก แต่เอามารวมกันไว้คราวหลังจะได้ลากปืดเดียวจบเลย