วิธียืดอายุ Windows License Windows server 2016

  • เมื่อ Windows license หมดอายุ จะมีอาการเครื่องรีบูตเอง ทำให้ไม่สามารถเข้าเว็บไซต์ได้
  • เราสามารถยืดอายุมันได้เรื่อยๆ โดย
  • เปิด command prompt โดยพิมพ์ cmd ที่ช่องค้นหา
  • พิมพ์ slmgr -rearm แล้วเคาะ Enter (2008 พิมพ์ slmgr /rearm)
  • restart เครื่องโดยเลือก Security issue (planned)
  • จะเห็นว่า สามารถยืดอายุได้อีก 180 วัน

เครดิต: วิธีต่ออายุ Windows License สำหรับ Windows server 2008 และ Windows server 2016 – คลังความรู้ – VPS HiSpeed (cloudhosting.co.th)

แก้ปัญหาฟังก์ชั่น arrayToDataTable ใน Google Charts API (แบบเร่งด่วน)

วันนี้ผมพบปํญหาว่า รูปกราฟที่ใช้ฟังก์ชั่นของ Google Charts ไม่แสดงผล ตรวจแล้วมีการแจ้ง error เกี่ยวกับ Uncaught (in promise) error invalid row # บลาๆ

ไล่ไปไล่มาก็พบว่าน่าจะเป็นปัญหาที่ฟังก์ชั่น arrayToDataTable มีรูปแบบการใช้ดังนี้

var dataArray = [ ["Name", "Income"], ["John", 20000], ["Smith", 25000], ["Ann", 10500] ];
var data = google.visualization.arrayToDataTable( dataArray );

พอพบปัญหา เล่นหันไปลองใช้ฟังก์ชั่นอื่นคือ

var data = new google.visualization.DataTable();
data.addColumn("string", "Name");
data.addColumn("number", "Income");
data.addRows([["John", 20000], ["Smith", 25000], ["Ann", 10500]]);

ปรากฏว่าได้ผล!!!  รูปกราฟกลับมาแสดงผลได้

ฟังก์ชั่นที่เพิ่มเข้ามา (พารามิเตอร์ยังไม่ตรงกับฟังก์ชั่นต้นแบบ)
ฟังก์ชั่นต้นแบบจะเป็น arrayToDataTable( array [, boolean] )

function arrayToDataTable(a, types) {
     var data = new google.visualization.DataTable();
     var firstRow = a.shift();
     for(var i=0; i<firstRow.length; i++) {
         var type = types[i]!=null ? types[i] : 'number';
         data.addColumn(type, firstRow[i]);
     }
     data.addRows(a);
     return data;
 }

การใช้งาน

var data = arrayToDataTable(dataArray, ["string","number"]);

การตั้งค่า DNS ให้สามารถส่งเมลไปยัง Gmail ได้

ใน DNS Manager ให้เพิ่มข้อมูลดังนี้

Mail Exchanger (MX)
mail server priority = 10
Value = [ใส่ชื่อโดเมนของเมลเซิร์ฟเวอร์]
SPF Record (TXT)
Record Name  = [blank]
Text = v=spf1 mx -all
_dmarc Record (TXT)
Record Name = _dmarc
Text = v=DMARC1; p=none
DKIM (TXT)
Record Name = DKIM._domainkey
Text = ใส่โค๊ดที่ก๊อปปี้มาจาก DKIM ใน Mail Server

อ้างอิง
DMARC Record
DKIM on MailEnable

แปลงตัวเลขเป็นตัวอักษร Amount in words converter

คลาสแปลงจากตัวเลขเป็นตัวอักษร แบบภาษาอังกฤษ

class NumberToWord{
	
	var $word;
	
	var $ones = array(
	 "",
	 " one",
	 " two",
	 " three",
	 " four",
	 " five",
	 " six",
	 " seven",
	 " eight",
	 " nine",
	 " ten",
	 " eleven",
	 " twelve",
	 " thirteen",
	 " fourteen",
	 " fifteen",
	 " sixteen",
	 " seventeen",
	 " eighteen",
	 " nineteen"
	);

	var $tens = array(
	 "",
	 "",
	 " twenty",
	 " thirty",
	 " forty",
	 " fifty",
	 " sixty",
	 " seventy",
	 " eighty",
	 " ninety"
	);

	var $triplets = array(
	 "",
	 " thousand",
	 " million",
	 " billion",
	 " trillion",
	 " quadrillion",
	 " quintillion",
	 " sextillion",
	 " septillion",
	 " octillion",
	 " nonillion"
	);

	// recursive fn, converts three digits per pass
	function convertTri($num, $tri) {
		// chunk the number, ...rxyy
		$r = (int) ($num / 1000);
		$x = ($num / 100) % 10;
		$y = $num % 100;

		// init the output string
		$str = "";

		// do hundreds
		if ($x > 0)
			$str = $this->ones[$x] . " hundred";

		// do ones and tens
		if ($y < 20) $str .= $this->ones[$y];
		else
			$str .= $this->tens[(int) ($y / 10)] . $this->ones[$y % 10];

		// add triplet modifier only if there
		// is some output to be modified...
		if ($str != "")
			$str .= $this->triplets[$tri];

		// continue recursing?
		if ($r > 0)
			return $this->convertTri($r, $tri+1).$str;
		else
			return $str;
	}


	// returns the number as an anglicized string
	function Convert($num) {
		$num = (int) $num;    // make sure it's an integer

		if ($num < 0) return "negative".$this->convertTri(-$num, 0);

		if ($num == 0)
			return "zero";

		return $this->convertTri($num, 0);
	}

	function NumberToWord($string)
	{
		$this->word = $this->Convert($string);
	}
	
	function NumberToWordFormat($string,$mainCurrency="Baht",$subCurrency="Satang") {

		$this->word = ucfirst(trim($this->Convert($string)));

		$this->word.= " {$mainCurrency}";

		$number = explode(".",$string);

		$stangText = '';
		if( count($number)>1 && intval($number[1])>0 ) {
			$strlen = strlen($number[1]);
			if( $strlen>1 )
				$stang = intval($number[1]);
			else $stang = $number[1]*10;
			$stangWord = $this->Convert( $stang );
			$stangText = " and ".$stangWord." ".$subCurrency;
			$this->word.= $stangText;
		}
		
		return $this->word;
	}
}

ตัวอย่าง

require_once( "NumToWord_en.class.php" );
$num = "17193.25";
$numObj = new NumberToWord($num);
print $numObj->NumberToWordFormat($num);

ผลลัพธ์

Seventeen thousand one hundred ninety three Baht and twenty five Satang

คลาสแปลงจากตัวเลขเป็นตัวอักษร แบบภาษาไทย

class NumberToWordThai{
	
	var $word;
	
	function Convert($number,$mainCurrency="บาท",$subCurrency="สตางค์"){

		$txtnum1 = array('ศูนย์','หนึ่ง','สอง','สาม','สี่','ห้า','หก','เจ็ด','แปด','เก้า','สิบ');
		$txtnum2 = array('','สิบ','ร้อย','พัน','หมื่น','แสน','ล้าน'); $number = str_replace(",","",$number);
		$number = str_replace(" ","",$number); $number = str_replace("บาท","",$number);
		$number = explode(".",$number);
		if(sizeof($number)>2){
			return 'ทศนิยมหลายตัวนะจ๊ะ';
			exit;
		}

		$strlen = strlen($number[0]);
		$convert = '';

		for($i=0;$i<$strlen;$i++){

			$n = substr($number[0], $i,1);

			if($n!=0){
				if($i==($strlen-1) AND $n==1){ $convert .= 'เอ็ด'; }
				elseif($i==($strlen-2) AND $n==2){ $convert .= 'ยี่'; }
				elseif($i==($strlen-2) AND $n==1){ $convert .= ''; }
				else{ $convert .= $txtnum1[$n]; }
				$convert .= $txtnum2[$strlen-$i-1];
			}
		}

		$convert .= $mainCurrency;
		if($number[1]=='0' OR $number[1]=='00' OR $number[1]==''){ $convert .= 'ถ้วน'; }
		else{
			$strlen = strlen($number[1]);
			if( $strlen>1 )
				$stang = intval($number[1]);
			else $stang = $number[1]*10;
			$strlen=2;
			
			for($i=0;$i<$strlen;$i++){
				$n = substr($stang, $i,1);
				if($n!=0){
					if($i==($strlen-1) AND $n==1){$convert .= 'เอ็ด';}
					elseif($i==($strlen-2) AND $n==2){$convert .= 'ยี่';}
					elseif($i==($strlen-2) AND $n==1){$convert .= '';}
					else{ $convert .= $txtnum1[$n];}
					$convert .= $txtnum2[$strlen-$i-1];
				}
			}
			$convert .= $subCurrency;
		}
		return $convert;
	}

	function NumberToWordThai($string)
	{
		$this->word = $this->Convert($string);
	}

	function NumberToWordFormat($string,$mainCurrency="บาท",$subCurrency="สตางค์") {
		$this->word = $this->Convert($string,$mainCurrency,$subCurrency);
		return $this->word;
	}
}

ตัวอย่าง

require_once("NumToWord_th.class.php");
$num = "17193.25";
$numObj = new NumberToWordThai($num);
print $numObj->NumberToWordFormat($num);

ผลลัพธ์

หนึ่งหมื่นเจ็ดพันหนึ่งร้อยเก้าสิบสามบาทยี่สิบห้าสตางค์

เครดิต
ดัดแปลงจากโค๊ดของ Hugh Bothwell (hugh_bothwell@hotmail.com)

การเขียน PHP เพื่อแปลง HTML เป็น PDF ด้วย HTML2PDF (Convert HTML to PDF) ภาค 2

วิธีการของผมคือ นำไฟล์ที่ต้องการแปลงมาปรับแก้ โดยตัด tag ดังต่อไปนี้ออก ได้แก่ <html>, <meta>, <head>, <body> (โปรแกรมเมอร์น่าจะทำได้นะ) และเพิ่มองค์ประกอบสำหรับ html2pdf เข้าไป ได้แก่

<page>
<page_header> ... </page_header>
<page_footer> ... </page_footer>

<!-- contents here -->

</page>

<page></page> ใช้ครอบหน้าทั้งหมดที่จะแสดงในไฟล์ PDF ทั้งหมด มีส่วนประกอบอื่น ได้แก่ backtop, backbottom, backleft, backright    แทนพื้นที่โดยรอบของตัวเอกสาร บน, ล่าง, ซ้าย และขวา ตามลำดับ

<page_header></page_header> เนื้อหาใน tag นี้จะเป็นส่วนของหัวกระดาษทั้งหมด ซึ่งจะแสดงในทุกๆ หน้ากระดาษ

<page_footer></page_footer> เนื้อหาใน tag นี้จะเป็นส่วนของท้ายกระดาษทั้งหมด ซึ่งจะแสดงในทุกๆ หน้ากระดาษ

[[page_cu]] ใช้แทรกใน HTML เพื่อแสดงหมายเลขหน้าปัจจุบัน

[[page_nb]] ใช้แทรกใน HTML เพื่อแสดงหมายเลขหน้าทั้งหมด

ผมจะใช้วิธีเซฟไฟล์ตัวนี้ลงใน temp folder ของระบบก่อน แล้วค่อยเปิดไฟล์ดังกล่าวด้วย html2pdf class ดังต่อไปนี้

ตัวอย่างไฟล์ view.php

<?php
ob_start();
?>

<page backtop="20mm" backbottom="20mm" backleft="20mm" backright="20mm">
<page_header>header here : Page [[page_cu]] of [[page_nb]]</page_header>
<page_footer>footer here</page_footer>

<!-- contents here -->
<h1>HelloWorld</h1>This is my first test

</page>

<?php
$html = ob_get_clean();
$tmpfname = tempnam( sys_get_temp_dir(), "pdf-" );
chmod( $tmpfname, 0666 );
$handle = fopen($tmpfname, "w");
fwrite($handle, trim($html));
fclose($handle);

$filename = basename($tmpfname);
header("Location: makepdf.php?tmpfname=$filename");
exit;
?>

ตัวอย่างไฟล์ makepdf.php

<?php
require_once dirname(__FILE__).'/vendor/autoload.php';

use Spipu\Html2Pdf\Html2Pdf;
use Spipu\Html2Pdf\Exception\Html2PdfException;
use Spipu\Html2Pdf\Exception\ExceptionFormatter;

$tmpfname = $_GET['tmpfname'];

try {

	ob_start();
	include rtrim(sys_get_temp_dir(),DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$tmpfname;
	$content = ob_get_clean();

	$content = str_replace('font-family:','font-family:freeserif;',$content); // แก้ปัญหา font ภาษาไทย
	
	$html2pdf = new Html2Pdf('P', 'A4', 'fr', true, 'UTF-8', 3);

	$html2pdf->pdf->SetDisplayMode('fullpage');
	$html2pdf->writeHTML($content);
	$html2pdf->output('result.pdf');

} catch (Html2PdfException $e) {
	$formatter = new ExceptionFormatter($e);
	echo $formatter->getHtmlMessage();
}
?>

ทดลองเปิดไฟล์ view.php หลังจากสร้างไฟล์แล้วจะกระโดดไปยังไฟล์ makepdf.php

ด้านหัวกระดาษ

ด้านท้ายกระดาษ

ตัวอย่าง

การเขียน PHP เพื่อแปลง HTML เป็น PDF ด้วย HTML2PDF (Convert HTML to PDF)

เตรียมตัว

ส่ิงที่ต้องเตรียมตัวก่อนการแปลงไฟล์หน้าเว็บ HTML ไปเป็นไฟล์ PDF คือการติดตั้ง Composer ซึ่งเป็นเครื่องมือในการติดตั้งไลบรารี่ต่างๆ สำหรับ PHP

บน Windows ดาวน์โหลดได้ที่   Composer-Setup

บน macOS พิมพ์คำสั่งดังนี้

$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer

ติดตั้ง

หลังจากติดตั้ง composer แล้ว ให้ไปที่ตำแหน่งที่จะเขียนโค้ด เพื่อรันคำสั่งผ่านทาง command line (วินโดว์ใช้ DOS prompt ส่วน macOS ใช้ Terminal) พิมพ์คำสั่งตามนี้

composer require spipu/html2pdf

Composer จะทำการติดตั้งเครื่องมือที่จำเป็นต้องใช้สำหรับ html2pdf หลังติดตั้งเสร็จแล้วเราจะเห็นโฟลเดอร์ชื่อ vendor

ทดสอบ

สร้างไฟล์ทดสอบ test.php

<?php 
require __DIR__.'/vendor/autoload.php';

use Spipu\Html2Pdf\Html2Pdf;

$html2pdf = new Html2Pdf();
$html2pdf->writeHTML('<h1>HelloWorld</h1>This is my first test');
$html2pdf->output();

?>

ทดลอง

เปิดสคริปตัวบนเว็บเบราซ์เซอร์ จะได้ผลดังนี้

ตัวอย่าง

ตัวอย่างอื่น

ดาวน์โหลดมาทดลองใช้ได้ที่ลิงค์นี้ https://html2pdf.fr/en/example

อ้างอิง