Hiển thị các bài đăng có nhãn Snippet. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Snippet. Hiển thị tất cả bài đăng

09/07/2022

Gửi tin nhắn lên toàn bộ room chatwork của bạn

 Nếu bạn dùng chatwork và đôi khi muốn gửi 1 thông báo tới tất cả các room/group mà bạn không muốn copy paste thì làm thế nào?

Nếu bạn biết code c#, hãy tham khảo đoạn code sau

Thứ nhất, lấy toàn bộ danh sách room bạn có, trước hết bạn cần có token cá nhân
hãy đăng nhập vào tài khoản chatwork của bạn rồi truy cập link sau để lấy token
https://www.chatwork.com/service/packages/chatwork/subpackages/api/token.php 

=====

//Hàm lấy danh sách room

public partial class ChatworkClient

{

public static List<RoomInfo> GetRooms(string token)

        {

            var client = new RestClient("https://api.chatwork.com/v2/rooms");

            client.Timeout = -1;

            var request = new RestRequest(Method.GET);

            request.AddHeader("X-ChatWorkToken", token);

            IRestResponse response = client.Execute(request);

            //Console.WriteLine(response.Content);

            if(response.IsSuccessful && !string.IsNullOrEmpty(response.Content))

            {

                var rooms = JsonConvert.DeserializeObject<List<RoomInfo>>(response.Content);

                return rooms;

            }

            return null;

        }
}

=====

//model RoomInfo:

public class RoomInfo

    {

        public int room_id { get; set; }

        public string name { get; set; }

    }

======
//Tiếp theo, thực hiện gửi tin nhắn
tham khảo thêm chatwork API: trang 25, 
[POST] /rooms/{room_id}/messages

https://download.chatwork.com/ChatWork_API_Documentation.pdf 

05/06/2022

Javascript thêm dòng dữ liệu động vào form

Đôi khi bạn cần tạo form động, cho phép người dùng tùy ý thêm field dữ liệu vào form

Dưới đây là đoạn code thêm fields động vào form dùng trong dự án .net core, view razor

 <!-- html code -->

<table class="table table-responsive" id="product-table">

<tr>

<th>TÊN SẢN PHẨM</th>

<th>SỐ LƯỢNG</th>

<th>

<a href="javascript:void(0);" class="btn btn-sm btn-success">

<i class="fas fa-plus" onclick="addNewRow()"> Thêm sản phẩm</i>

</a>

</th>

</tr>

<tr>

<td id="col0">

<input class="form-control" type="text" asp-for="Products" />

</td>

<td id="col1">

<input class="form-control" type="text" asp-for="ProductCount" />

</td>

<td id="col2">

</td>

</tr>

</table>

<!-- javascript code -->

<script>

/* This method will add a new row */

function addNewRow() {

let table = document.getElementById("product-table");

let rowCount = table.rows.length;

let cellCount = table.rows[0].cells.length;

let row = table.insertRow(rowCount);

for (let i = 0; i < cellCount; i++) {

let cell = 'cell' + i;

cell = row.insertCell(i);

if (i < cellCount - 1) {

let copycel = document.getElementById('col' + i).innerHTML;

cell.innerHTML = copycel;

} else {

cell.innerHTML = '<a href="javascript:void(0);" class="btn btn-danger btn-sm"><i class="fas fa-trash" onclick="deleteRow(this)"> Xóa sản phẩm</i></a>';

}

}

}


/* This method will delete a row */

function deleteRow(ele) {

let table = document.getElementById('product-table');

let rowCount = table.rows.length;

if (rowCount < 3) {

alert("There is no row available to delete!");

return;

} else {

if (ele) {

//delete specific row

ele.parentNode.parentNode.parentNode.remove();

} else {

//delete last row

table.deleteRow(rowCount - 1);

}

}

}

</script>


[Happy coding]

20/05/2022

Sử dụng sequence tạo mã tăng dần theo cấu trúc

 Đôi khi trong dự án bạn cần tạo mã tăng dần, theo cấu trúc nhất định

Có nhiều cách để thực hiện việc này, sql server sequence là 1 cách

bước 1:

tạo sequence bắt đầu giá trị 1, tăng dần 1 như sau

create sequence dbo.testing

start with 1

increment by 1;

go

bước 2:

tạo mã để sử dụng

select 'GID' + REPLACE(convert(nvarchar(10),getdate(),4),'.','')

+ right('0000'+cast(next value for dbo.testing as nvarchar(5)),5)

bước bổ sung:

kiểm tra sequence hiện tại

SELECT * FROM sys.sequences WHERE name = 'testing' ;  

có thể bạn cần reset giá trị của sequence

alter sequence dbo.testing restart with 1;

01/12/2021

Kết nối máy chấm công Ronald Jack qua thư viện zkemkeeper c#

 Trước tiên, cần đăng ký thư viện zkemkeeper cho máy chạy chương trình kết nối máy chấm công lấy dữ liệu

Tham khảo bài viết chính hãng sau đây để chọn thư viện phù hợp

https://github.com/nrubiano/ZK.Biometric/wiki/ZK-SDK-Installation

Tiếp theo, trong source code c#:

Sau khi add zkemkeeper references vào dự án

using zkemkeeper;

Hàm kết nối máy chấm công thông qua địa chỉ IP:

//===

public static async Task<CZKEM> Connect(string ip)
{

            CZKEM device = new CZKEM();

            await Task.Factory.StartNew(new Action(() => {

                device.Connect_Net(ip, TCP_PORT);//TCP_PORT thường dùng port mặc định 4370

            }));

            return device; 
}

//===

18/09/2021

Sử dụng log4net ghi log trong ASP.NET MVC

 Khi bạn cần debug hay handle exception trong chương trình

bạn có thể tự viết hàm ghi log nhưng log4net có thể làm giúp bạn rất tốt với 5 kiểu khác nhau:

  • Debug
  • Information
  • Warnings
  • Error
  • Fatal
Dưới dây là 1 đoạn log exception:

2021-09-18 15:30:43,751 [5] ERROR MonitoringLogger - Load index error
System.DivideByZeroException: Attempted to divide by zero.
at WebApp.Controllers.HomeController.Index() in P:\****\Controllers\HomeController.cs:line 37

Tham khảo bài viết chi tiết tại đây: https://vnn.me/sJlMw9v

12/08/2021

Export table html to excel with utf-8 using javascript

 // đây là hàm export toàn bộ nội dung trong 1 bảng html ra excel

function exportTableToExcel(tableID, filename = '') {

        var downloadLink;

        var dataType = 'application/vnd.ms-excel;charset=utf-8';

        var tableSelect = document.getElementById(tableID);

        var tableHTML = tableSelect.outerHTML.replace(/ /g, '%20');


        // Specify file name

        filename = filename ? filename + '.xls' : 'excel_data.xls';


        // Create download link element

        downloadLink = document.createElement("a");


        document.body.appendChild(downloadLink);


        if (navigator.msSaveOrOpenBlob) {

            var blob = new Blob(['\ufeff', tableHTML], {

                type: dataType

            });

            navigator.msSaveOrOpenBlob(blob, filename);

        } else {

            // Create a link to the file

            downloadLink.href = 'data:' + dataType + ', ' + tableHTML;


            // Setting the file name

            downloadLink.download = filename;


            //triggering the function

            downloadLink.click();

        }

    }


//sử dụng

<button class="btn btn-success" onclick="exportTableToExcel('tableId', 'file_excel.xlsx')">Export</button>

11/04/2021

Mã hóa số thành chuỗi với Base62 c#

 Đôi khi bạn cần mã hóa 1 số thành chuỗi, để đảm bảo chuỗi mã hóa không trùng, bạn cần 1 số long và kiểu mã hóa đủ rộng, ở đây có mô tả Base62

code sample như sau:

private string ToBase62(long number)

        {

            try

            {

                var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

                var n = number;

                long basis = 62;

                var ret = "";

                while (n > 0)

                {

                    long temp = n % basis;

                    ret = alphabet[(int)temp] + ret;

                    n = (n / basis);

                }

                return ret;

            }

            catch(Exception ex)

            {

                //Helpers.Log.Error("ToBase62 error" + number.ToString(), ex); //hander exception error

                return string.Empty;

            }

        }

10/03/2021

Kiểm tra 1 trang web có cho phép mở trong iframe hay không bằng c#

 Khi cần nhúng 1 trang web (URL) khác vào website của bạn dưới dạng iframe

Nếu website đó không cho phép mở dưới dạng iframe, website bạn sẽ hiển thị lỗi :)

Bạn cần kiểm tra trước để hiển thị phù hợp, code c# có thể dùng như sau:

//using using System.Net;

//check frame support

                    string frame_support;

                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(iframeUrl);

                    using (WebResponse response = request.GetResponse())

                    {

                        //DENY, SAMEORIGIN, ALLOW-FROM

                        //null is open in iframe

                        frame_support = response.Headers["X-Frame-Options"];

                    }

06/01/2021

Convert list object to DataTable

//Chuyển đổi listObject thành data table tương ứng
private static DataTable ConvertToDataTable<T>(List<T> models)
        {
            // creating a data table instance and typed it as our incoming model  
            // as I make it generic, if you want, you can make it the model typed you want.  
            DataTable dataTable = new DataTable(typeof(T).Name);

            //Get all the properties of that model  
            PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

            // Loop through all the properties              
            // Adding Column name to our datatable  
            foreach (PropertyInfo prop in Props)
            {
                //Setting column names as Property names    
                dataTable.Columns.Add(prop.Name);
            }
            // Adding Row and its value to our dataTable  
            foreach (T item in models)
            {
                var values = new object[Props.Length];
                for (int i = 0; i < Props.Length; i++)
                {
                    //inserting property values to datatable rows    
                    values[i] = Props[i].GetValue(item, null);
                }
                // Finally add value to datatable    
                dataTable.Rows.Add(values);
            }
            return dataTable;
        }

20/10/2020

Batch script để chạy website mvc với iisexpress

 Khi bạn làm 1 website với mvc, c#, sql server localDB (cơ bản theo mẫu của visual studio)

bạn có thể deploy nhanh với iisexpress theo file batch script sau:

==

@echo off

start "" http://localhost:9090

iisexpress.exe /path:"yourpart" /port:9090

==

trong đó [yourpart] là đường dẫn thư mục chứa source code website của bạn

mở notepad, copy đoạn script trên và lưu lại với file .bat

sau đó copy file bat vào thư mục cài đặt IIS Express trên máy tính của bạn

(tạo short cut cho file bat nếu cần)

(*) nhấp 2 cái vào file bat của bạn là website chạy rồi :)

30/10/2016

Sử dụng C# gửi email bằng gmail

Đôi khi bạn cần gửi email từ ứng dụng của bạn và... bạn chọn gmail để thực hiện việc gửi email giúp bạn, việc này dễ khi dùng với c#

 private bool SendEmail(string subject, string htmlString)

{

try

{

MailMessage message = new MailMessage();

SmtpClient smtp = new SmtpClient();

message.From = new MailAddress("your_out_going_address");

message.To.Add(new MailAddress("receive_address"));

message.Subject = subject;

message.IsBodyHtml = true; //to make message body as html  

message.Body = htmlString;

smtp.Port = 587;

smtp.Host = "smtp.gmail.com"; //for gmail host  "smtp.gmail.com"

smtp.EnableSsl = true;

smtp.UseDefaultCredentials = false;

smtp.Credentials = new NetworkCredential("your_out_going_address", "your_out_going_address_password");

smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

smtp.Send(message);

return true;

}

catch (Exception ex) {

//Your common write log method

//LogError(GetExceptionMsg(ex));

return false;

}

}

//Lưu ý:

// tìm google "Less secure app access" và tắt theo hướng dẫn.....

03/02/2016

Tạo danh sách chọn đơn giản trong MVC

 Đoạn code c# đơn giản để tạo 1 danh sách chọn theo dạng dropdownlist

Dưới dây là hàm trả về danh sách chọn tháng trong năm hiện tại tính từ tháng 01 tới tháng hiện tại

//start

public static SelectList GetMonths()

        {

            List<CommonKeyValueViewModel> months = new List<CommonKeyValueViewModel>();

            var currentYear = DateTime.Now.Year;

            var currentMonth = DateTime.Now.Month;

            for(int i = 1; i<= currentMonth; i ++)

            {

                months.Add(new CommonKeyValueViewModel { Label = string.Format("{0}/{1}", i < 10 ? "0" + i.ToString() : i.ToString(), currentYear), Point = i });

            }

            List<SelectListItem> list = new List<SelectListItem>();

            foreach (var row in months)

            {

                list.Add(new SelectListItem()

                {

                    Text = row.Label,

                    Value = row.Point.ToString()

                });

            }

            return new SelectList(list, "Value", "Text");

        }

//end

Hiển thị trên razor view như sau:

@Html.DropDownList("month", yournamespace.class.GetMonths(), "Chọn tháng", new { @class = "form-control" })

13/09/2015

Lazy loading partial view in MVC C#

Đối với trang web có nhiều phần nội dung khác nhau, 

ví dụ: 

1) header 

2) body

2.1) left

2.2) center

2.3) right

3) footer

 Để tăng thời gian hiển thị nội dung trang web lên giao diện cho thân thiên với người dùng thay vì load 1 lần ta có thể thực hiện load từng phần riêng lẻ với partial view

Đoạn code sau thể hiện load footer

1) Trên view layout

<script>

    $(document).ready(function() {

//dùng jquery thực hiện load action FooterContents trong controller Home

//vào div có id là partialFooter

        $("#partialFooter").load('@Url.Action("FooterContents", "Home")');

    });

</script>

2) Trong code behind controller Home, action FooterContents

public async Task<ActionResult> FooterContents()
{
List<ObjectDTO> objDTOs = new List<ObjectDTO>();

try
{
//uow call bll to get data from database
objDTOs = await unitOfWork.Entity.GetList(20);
//do some things..
}
catch(Exception ex)
{
//handle exception
}
//display listing
return PartialView("FooterContents", objDTOs);
}

09/10/2014

Custom valid MVC C# field

 Trong MVC, ngoài những ValidationAttribute có sẵn như Required, Display ..

Đôi khi bạn cần gọi hàm check riêng của bạn cho 1 field name nào đó

ví dụ class:

public class AccountDTO

{

/// <summary>

/// Tên đăng nhập

/// </summary>

[Required(ErrorMessage = "Nhập tên đăng nhập")]

[Display(Name = "Tên đăng nhập")]

[CheckUsernameAvailable]

public string Username { get; set; }

//những field khác ....

}

Hãy lưu ý: CheckUsernameAvailable 

cần kiểm tra username có ai sử dụng hay chưa

Ta có class tương ứng


public class CheckUsernameAvailable : ValidationAttribute

{

public CheckUsernameAvailable()

: base("")

{

}


protected override ValidationResult IsValid(object value, ValidationContext validationContext)

{

if (value != null)

{

//parse object qua string

string userName = Convert.ToString(value);

//thực hiện query database

//DAO execute here

var result = checkUsernameAvailable(userName);

if (!result)

{

//khai báo errorMsg

errorMsg = string.Format("Tên đăng nhập {0} đã có người sử dụng", userName);

return new ValidationResult(errorMsg);

}

}

return ValidationResult.Success;

}
}

15/06/2011

Paging - pager helper class c#

//định nghĩa class chia trang thường dùng

 public class Pager

    {

        public Pager(

            int totalItems,

            int currentPage = 1,

            int pageSize = 10,

            int maxPages = 10)

        {

            // calculate total pages

            var totalPages = (int)Math.Ceiling((decimal)totalItems / (decimal)pageSize);


            // ensure current page isn't out of range

            if (currentPage < 1)

            {

                currentPage = 1;

            }

            else if (currentPage > totalPages)

            {

                currentPage = totalPages;

            }


            int startPage, endPage;

            if (totalPages <= maxPages)

            {

                // total pages less than max so show all pages

                startPage = 1;

                endPage = totalPages;

            }

            else

            {

                // total pages more than max so calculate start and end pages

                var maxPagesBeforeCurrentPage = (int)Math.Floor((decimal)maxPages / (decimal)2);

                var maxPagesAfterCurrentPage = (int)Math.Ceiling((decimal)maxPages / (decimal)2) - 1;

                if (currentPage <= maxPagesBeforeCurrentPage)

                {

                    // current page near the start

                    startPage = 1;

                    endPage = maxPages;

                }

                else if (currentPage + maxPagesAfterCurrentPage >= totalPages)

                {

                    // current page near the end

                    startPage = totalPages - maxPages + 1;

                    endPage = totalPages;

                }

                else

                {

                    // current page somewhere in the middle

                    startPage = currentPage - maxPagesBeforeCurrentPage;

                    endPage = currentPage + maxPagesAfterCurrentPage;

                }

            }


            // calculate start and end item indexes

            var startIndex = (currentPage - 1) * pageSize;

            var endIndex = Math.Min(startIndex + pageSize - 1, totalItems - 1);


            // create an array of pages that can be looped over

            var pages = Enumerable.Range(startPage, (endPage + 1) - startPage);


            // update object instance with all pager properties required by the view

            TotalItems = totalItems;

            CurrentPage = currentPage;

            PageSize = pageSize;

            TotalPages = totalPages;

            StartPage = startPage;

            EndPage = endPage;

            StartIndex = startIndex;

            EndIndex = endIndex;

            Pages = pages;

        }


        public int TotalItems { get; private set; }

        public int CurrentPage { get; private set; }

        public int PageSize { get; private set; }

        public int TotalPages { get; private set; }

        public int StartPage { get; private set; }

        public int EndPage { get; private set; }

        public int StartIndex { get; private set; }

        public int EndIndex { get; private set; }

        public IEnumerable<int> Pages { get; private set; }

    }

//cách dùng trong mvc razor view

//css boostrap mặc định

    if (pager != null && pager.Pages.Any())

    {

        <nav class="table-responsive">

            <ul class="pagination justify-content-center d-flex flex-wrap">

                @if (pager.CurrentPage > 1)

                {

                    <li class="page-item">

                        <a class="page-link" href="@Url.Action("Index", "Home")">Trang đầu</a>

                    </li>

                    <li class="page-item">

                        <a class="page-link" href="@Url.Action("Index", "Home")?p=@(pager.CurrentPage - 1)">Trước</a>

                    </li>

                }


                @foreach (var p in pager.Pages)

                {

                    <li class="page-item @(p == pager.CurrentPage ? "active" : "")">

                        <a class="page-link" href="@Url.Action("Index", "Home")?p=@p">@p</a>

                    </li>

                }


                @if (pager.CurrentPage < pager.TotalPages)

                {

                    <li class="page-item">

                        <a class="page-link" href="@Url.Action("Index", "Home")?p=@(pager.CurrentPage + 1)">Tiếp</a>

                    </li>

                    <li class="page-item">

                        <a class="page-link" href="@Url.Action("Index", "Home")?p=@(pager.TotalPages)">Trang cuối</a>

                    </li>

                }

            </ul>

        </nav>

    }

02/02/2010

Dùng HtmlAgilityPack bóc tách nội dung trang web với c#

 HtmlAgilityPack là thư viện rất rất mạnh

bạn có thể bóc tách nội dung 1 trang web (1url) bất kỳ rất rất dễ nhé

Đoạn code sau làm ví dụ:
======================================

string url = "https://www.tuandev.com/2010/01/su-dung-task-trong-c.html";

HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb();

HtmlAgilityPack.HtmlDocument htmlDoc = web.Load(url);

//tới đây bạn có 1 htmlDoc hoàn chỉnh rồi

//bạn có thể lấy nội dung trong từng style class như sau

//bằng cách chọn nhiều node SelectNodes hoặc 1 node SelectSingleNode

                var title = htmlDoc.DocumentNode.SelectNodes("//h3[contains(@class, 'post-title')]");

                if(title == null)

                {

                    //do somethings

                }

else{

    //do somethings

}

[Happy coding]

25/01/2010

Sử dụng task trong c#

 Đôi khi cần load 1 loạt xử lý tương tự nhau, ví dụ map 1 danh sách object A thành danh sách B

thay vì vòng lặp tuần tự, ta có thể dùng multi task để giảm thời gian hoàn thành tiến trình như sau:

//using System.Threading.Tasks;

List<objectDTO> objectDTOs = new List<objectDTO>();

try

{

//Lấy danh sách objects từ cơ sở dữ liệu

List<object> objects = await unitOfWork.objects.Getobjects(20);

//Danh sách không có item nào, hoàn thành tiến trình

if (objects == null || !objects.Any())

{

return objectDTOs;

}

//khởi tạo danh sách task bằng với danh sách objects

Task<objectDTO>[] taskArray = new Task<objectDTO>[objects.Count];

for (int i = 0; i < objects.Count; i++)

{

object item = objects[i];

//sử dụng hàm MapObjectToDTO(item) để thực hiện tiến trình map base object to DTO object

taskArray[i] = Task.Factory.StartNew(() => MapObjectToDTO(item));

}

//chờ toàn bộ task chạy xong

Task.WaitAll();


//đưa kết quả vào danh sách trả về

for (int x = 0; x < taskArray.Length; x++)

{

if (taskArray[x].Result != null)

{

objectDTOs.Add(taskArray[x].Result);

}

}

}

catch(Exception ex)

{

//xử lý exception

}

return objectDTOs;

09/11/2009

Javascript format number

 Format số nhanh trong javascript

ví dụ: 1000000 => 1,000,000

dùng pattern như sau:

    function formatNumber(num) {

        return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')

    }

Đăng ký tên miền, hosting, máy chủ, thiết kế lập trình website theo yêu cầu

 Chính thức trở thành đơn vị cung cấp dịch vụ đăng ký tên miền quốc tế, tên miền Việt Nam hosting, máy chủ, cloud hosting, cloud server, ema...