การเขียน Config สำหรับ CakePHP

เวลาเขียนโปรเจ็คที่มีต้องมีการใช้ค่ากลางร่วมกันหลายๆ โมดูล เพื่อให้ง่ายต่อการจัดการทั้งตอน Dev และ Production เราจึงจำเป็นที่จะต้องแยกค่ากลางเหล่านี้ออกจาก code

ใน CakePHP มีไดเร็กทอรี่หลักสำหรับการเก็บ Config ทั้งหมดของระบบคือ app/Config 

cakephp_config

ในไดเร็กทอรี่นี้เราจะสร้างไฟล์ขึ้นมาอีก 1  ไฟล์เพื่อจัดเก็บ Config ทั้งหมด ในที่นี้สร้างไฟล์ configs.php

ภายในไฟล์ configs.php ที่สร้างขึ้นมาใหม่ ค่าต่างๆ ที่ต้องการกำหนดจะต้องอยู่ภายใต้ตัวแปร $config ในรูปแบบ array ตัวอย่างดังรูปภาพด้านล่าง

cakephp_config2

การเรียกใช้ค่าจากไฟล์ configs.php ให้เรียกใช้ผ่านฟังก์ชัน load ของ class Configure  โดยวางไว้ในไฟล์ bootstrap.php ดังภาพ

cakephp_config3

การอ่านค่า Config สามารถเรียกผ่าน Configure::read หรือเพื่อให้ง่าย อาจเขียนเป็นฟังก์แยกขึ้นมาทำให้การเรียกใช้งานค่า Config ได้สะดวกรวดเร็วขึ้น

 

Advertisements

คะนึง

หากเปรียบซึ่งคะนึงหาคืออาวุธ
ที่แทงสุดบาดลึกครั้งหวนหา
หากเช่นนั้นคงนองเลือดและโรยรา
อนาถาจนขาดปลิ้นหมดสิ้นใจ

หมดเวลาบนต้นไม้ใหญ่ ถึงเวลาเดินทางเข้าสู่โรงงานแห่งความฝัน

เมื่อชีวิตของคนเราก้าวเดินมาถึงปลายสุดของระดับการศึกษาที่คนส่วนใหญ่มองว่าคนในยุคนี้ควรจะก้าวผ่านพ้นไปให้ได้ คำถามแรกที่แต่ละคนพยายามที่จะให้คำตอบกับตัวเองคือ “เอายังไงต่อดี?” หากคนๆ นั้นเป็นคนที่มีความสามารถ เก่งกาจ เกินกว่าระดับมันสมองของคนทั่วไปแล้ว ทางเดินหลังจากนี้ต่อไป คงจะถูกโปรยไว้ด้วยกลีบกุหลาบ ที่พร้อมให้เดินหรือกลิ้งนอนไปได้สุดปลายทาง ถ้าหากไม่เรียนต่อในระดับการศึกษาที่สูงกว่า ก็อาจกลายไปเป็นพนักงานใหม่ไฟแรง หัวกระทิคั้นสดในบริษัทหรือองค์ไหนสักแห่ง แต่หากคนๆ นั้นเป็นเพียงผลผลิตที่อาจไม่สวยงาม และไม่สุกงอมพร้อมกินมากนัก ทางเดินหลังจากนี้ต่อไปแม้จะเต็มไปด้วยกลีบกุหลาบ แต่ทุกครั้งที่ก้าวเดิน อาจเต็มไปด้วยเศษหนาม เศษกิ่งไม้ ที่พร้อมจะบาดกินฝ่าเท้าตลอดเวลา ผมเองก็จัดเป็นบุคคลประเภทที่สองนี่แหละ ก้าวเดินมาถึงจุดนี้ได้แบบล้มลุกบ้าง คลุกคลานบ้าง และไม่อาจตั้งตัวได้บ้าง แม้เรตติ้งของระดับความสุกงอม อาจจะเป็นที่พอใจของคนที่มองเห็น แต่หากมองเข้ามาลึกๆ ข้างในแล้ว มันยังมีจุดโบ๋ จุดเว้าแหว่ง ที่ถูกกัดกินอยู่เป็นจำนวนมาก ด้วยเหตุปัจจัยหลายๆ อย่างที่ห้อมล้อมอยู่ภายนอก

ต่อเนื่องจากคำถามแรกที่ถามตัวเองอยู่ตลอดเวลา ว่าหลังจากนี้ “เอายังไงต่อดี?” ถามเดิมๆ ซ้ำๆ อยู่กับตัวเองตลอดเวลา นานวันเข้าเริ่มเห็นว่าการถามซ้ำอยู่กับตัวเองเริ่มไม่เข้าที ก็เลยเปลี่ยนจากการนอนนิ่งๆ มาทำใบปิดประกาศผลงานตัวเอง แล้วลองส่งไปที่โรงงานแห่งความฝันแต่ละที่ รอจนวันแล้ววันเล่าก็ยังไม่มีโรงงานแห่งความฝันที่ไหนติดต่อกลับมา จนวันหนึ่งเผลอไปเห็น Missed Call เบอร์แปลกพยายามติดต่อมา 2-3 ครั้ง จึงรีบติดต่อกลับไป โดยไม่กลัวว่าปลายสายจะเป็นเสียงผู้หญิงอัตโนมัติ ที่เตรียมบอกโปรโมชันสินค้าของตนเองแบบน้ำไหลไฟดับ เมื่อเสียงเรียกสัญญาณจบสิ้นลง ปลายสายเป็นเสียงผู้หญิงคนหนึ่งพูดจาอย่างเรียบนิ่ม และเป็นจังหวะ คำถามที่ได้จากเสียงปลายสายนั้น คือการนัดวันสัมภาษณ์งานครั้งแรกในชีวิต คำตอบที่ออกจากปากไปในตอนนั้น จึงเป็นคำยืนยันตอบรับ โดยลืมไปว่าตัวเองยังไม่ได้เตรียมพร้อมอะไรสักอย่าง แต่ก็อยากจะลองดูและลองเดินออกไปสัมผัสโรงงานแห่งความฝันนั้นสักครั้งRead More »

รวบรวมคู่มือการใช้งานโปรแกรม SPSS

สไลด์ประกอบการบรรยาย 31/3/2558

[Download] การใช้งานโปรแกรม SPSS.pptx

เอกสารคู่มือการใช้งานโปรแกรม SPSS

รวบรวมเนื้อหาตั้งแต่พื้นฐานการใช้งานโปรแกรม อธิบายการทำงานไว้อย่างละเอียด

[Download] SPSS_manual.doc

สไลด์สอนการใช้งานโปรแกรมโดย เฉิดฉันทร์ ราชบุรณะ

[Download] SPSS.ppt

สไลด์สอนการใช้งานในหัวข้อ “การวิเคราะห์ข้อมูลโดยใช้โปรแกรม SPSS FOR WINDOWS

[Download] spss_2

*** เพิ่มเติม ***
อะไรคือค่า SD (Standard Deviation)

SPSS16

Simple Parallax Website ด้วย jQuery

หลังจากมั่วๆ งมๆ กับ เว็บไซต์ Parallax ตอนส่งไป YWC จำไม่ได้ละว่าตัวนั้นใช้ js plugin ตัวไหน แต่เหมือนทำไปทำ พอกรรมการเปิดดูหน้าเว็บก็ดันพังไม่เป็นท่า วันนี้ไปเจอคลิปที่ฝรั่งทำไว้ เป็นการทำ Parallax แบบง่ายๆ ด้วย CSS3 และ jQuery เน้นว่า Simple จริงๆ พอจะให้เข้าใจในหลักการของ Parallax แบบพื้นฐาน ไม่รอช้า ไปสดับรับชมคลิปกันเลย

ต่อด้วย ซอร์สของนักพัฒนาเผื่อใครขี้เกียจพิมพ์ตาม

https://github.com/Creativohn/Efecto-Parallax

Group By จากวันและเวลาในฟิลด์แบบ DATETIME

เจอมาใน Stackoverflow มี 3 วิธีการหลักที่ user ที่ชื่อว่า Salman Aได้แก่

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
— codelogic
average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, ‘%Y%m’)
— Andriy M
average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
— fu-chi
average 0.203 sec.

http://stackoverflow.com/questions/508791/mysql-query-group-by-day-month-year

ฟังก์ชั่นที่ใช้สำหรับป้องกัน SQL injuction เบื้องต้น

มีหลายๆเทคนิค และหลายๆ วิธีที่ใช้สำหรับการป้องกันปัญหา SQL injuction หรือการส่งคำสั่งพิเศษเพื่อไปประมวลผมรวมกับคิวรี่ของภาษา SQL โดยเทคนิคโดยทั่วไปที่นิยมใช้คือ

1. ฟังก์ชั่น mysql_real_escape_string() เป็นฟังก์ชั่นสำหรับการเปลี่ยนอักขระพิเศษที่ส่งเข้ามาให้กลายเป็น string ที่ไม่สามารถประผลได้เช่น ถูกส่งคำสั่ง ‘or’ 1=1 เข้ามา ฟังก์ชันจะแปลงให้กลายเป็น \’or\’ 1=1 แทน เป็นต้น

2. trim() หรือ str_replace() ใช้สำหรับการตัดช่องว่างหรือแทนที่ช่องว่างด้วยค่าอื่นๆ เช่น หากส่งคำสั่ง or 1=1 เข้ามา ช่องว่างจะถูกตัดออกทำให้คำสั่งไม่สามารถประมวลผลร่วมกับคำสั่ง SQL ได้

3. เทคนิคการแปลงให้ค่าให้เป็นข้อมูลชนิดใดชนิดหนึ่ง เช่น หากมีการส่งค่า id มาจากตัวแปร $_GET[‘id’] เพื่อเรียกเรคเคอร์ที่มีค่า id เท่ากับ id ที่ส่งมา โดยทั่วไป id ต้องเป็นข้อมูลประเภทตัวเลข หรือ Integer เท่านั้น ดังนั้นก่อนนำค่าที่ได้จาก id ไปทำงานร่วมกับคำสั่ง SQL ควรแปลงค่าที่ถูกส่งมาทั้งหมดให้กลายเป็นตัวเลขโดยอาจใช้

  • ฟังก์ชัน intval (return ค่า integer ของตัวแปรออกมา)
  • ใช้ sprintf(“%d %s”)
  • หรือตรวจสอบค่าในตัวแปรที่รับมานั้นเป็นตัวเลขหรือด้วยฟังก์ชัน is_numuric() เป็นต้น

4. ใช้ฟังก์ชัน bind_param ร่วมกับการทำงานของคำสั่ง SQL ตัวอย่าง php.net

<?php
$mysqli = new mysqli(‘localhost’, ‘my_user’, ‘my_password’, ‘world’);

/* check connection */
if (mysqli_connect_errno()) {
printf(“Connect failed: %s\n”, mysqli_connect_error());
exit();
}

$stmt = $mysqli->prepare(“INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)”);
$stmt->bind_param(‘sssd’, $code, $language, $official, $percent);

$code = ‘DEU’;
$language = ‘Bavarian’;
$official = “F”;
$percent = 11.2;

/* execute prepared statement */
$stmt->execute();

printf(“%d Row inserted.\n”, $stmt->affected_rows);

/* close statement and connection */
$stmt->close();

/* Clean up table CountryLanguage */
$mysqli->query(“DELETE FROM CountryLanguage WHERE Language=’Bavarian'”);
printf(“%d Row deleted.\n”, $mysqli->affected_rows);

/* close connection */
$mysqli->close();
?>

ยังมีอีกหลายๆ เทคนิค หากพบเจอจะนำมาบันทึกและนำเสนอในครั้งๆ ต่อไป

คู่มือการใช้งาน Greenstone ฉบับประยุกต์

ตอนเรียนวิชา Library Automation ได้ลองเล่น ลองใช้งาน Greenstone เอามาทำคลังเก็บเอกสารดิจิทัล ท้ายเทอมมีการทำรายงานคู่มือการใช้งานเบื้องต้นด้วย เห็นว่าน่าจะมีประโยชน์ต่อคนที่เข้ามาอ่านในภายหลัง เนื้อหาในรายงานคร่าวมีดังนี้

การสร้าง Collection ด้วย Greenstone Digital Library
1. ความต้องการพื้นฐานของระบบ
2. การเริ่มต้นใช้งานซอฟต์แวร์สำหรับบรรณารักษ์และผู้จัดทำ Digital Collection
3. การสร้าง Collection และเพิ่มไฟล์เข้าสู่ Collection
4. การกำหนด Metadata ให้แก่ไฟล์ใน Collection
5. การกำหนดหมวดหมู่ย่อยใน Collection ด้วย Metadata
6. การ Build และแสดงตัวอย่าง Collection ที่สร้างขึ้น
7. การสร้างเมนูเพื่อจัดกลุ่มการแสดงผล Collection
8. การติดตั้ง Plug-in สำหรับการดึงสารบัญในไฟล์เอกสาร Word และ PDF
9. การเพิ่มไฟล์มัลติมีเดีย เพลงและวิดีโอ
10. การปรับแต่งการแสดงผล
11. การส่งออก Collection เพื่อการใช้งานบน CD-Rom
การติดตั้งและใช้งาน Collection (มุมมองผู้ใช้งาน)
1. การติดตั้ง Collection ลงบนคอมพิวเตอร์
2. การใช้งานเบื้องต้น
วิเคราะห์จุดเด่นและจุดด้อยของ Greenstone Digital Library

ท่านใดสนใจดาวน์โหลดได้จาก ลิงก์ด้านล่างเลยครับ

ดาวน์โหลดเอกสารรายงาน – re54lib287

จับเวลาการแสดงผลหน้าเว็บไซต์ด้วย microtime()

เริ่มจับเวลาส่วนต้นของเอกสาร

$time_start = microtime(true);

//สคริปต์ทั้งหมดทำงาน

$time_end = microtime(true);
$time = $time_end – $time_start; #เวลาเริ่มต้น – เวลาท้ายสุด

echo “เวลาที่ใช้ในการประมวลทั้งหมด $time วินาที\n”;

บทความการทำงานร่วมกับ sqllite

Creating, dropping, and altering tables in SQLite
http://zetcode.com/db/sqlite/tables/


SQlite ใช้การเปลี่ยนชื่อ คอลัมน์โดยการ สร้างตาราง TEMPORARY ใหม่ที่สร้างขึ้นมา แทรกข้อมูลเก่าลงไปในตาราง TEMPORARY ลบตารางเก่าเอา จากนั้นสร้างตารางใหม่ขึ้นมา แทรกข้อมูลจากตาราง Temp ลงตารางใหม่ และ ลบตาราง Temp ออกในลำดับสุดท้าย

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;


ตัวอย่าง PHP เชื่อมต่อกับ SQLite ผ่าน PDO

$db = new PDO(‘sqlite:database_file_name’);

สร้าง ตาราง
/*$sql = “CREATE TABLE members”.
“(id INTEGER PRIMARY KEY AUTOINCREMENT,”.
“username VARCHAR(20) NOT NULL,”.
“email VARCHAR(50),”.
“added_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP);”;

เพิ่มข้อมูล
/*$sql = “INSERT INTO members (id,username,email,added_date) VALUES (null,’username’,’email@mail.com’,'”.date(“Y-m-d H:i:s”).”‘) “;*/

คิวรี่ข้อมูล
/*$sql = “SELECT * FROM members ORDER BY added_date DESC LIMIT 0,50”;
$result = $db->query($sql);
while($row = $result->fetchObject()){
echo “[$row->id]”.$row->name.”|”.$row->email.”|”.$row->added_date.”<br/>”;
}*/

unset($db); #ปิดการเชื่อมต่อ