Tag Archive directory

WSL: mkdir สร้าง windows folder ใหม่

วิธีสร้าง folder ใหม่โดยปกติจะมีรูปแบบ mkdir { folder path } ใน wsl สามารถสร้าง folder ในวินโดว์ได้โดยใช้รูปแบบ sudo mkdir /mnt/{ drive letter }/{ folder path } เช่น จะสร้าง C:\UsersDatas\var\www\prototypes_laravel จะใช้ จะใช้ command
sudo mkdir /mnt/c/UsersDatas/var/www/prototypes_laravel
แต่ถ้าหากไม่มี folder C:\UsersDatas\var\www มาก่อนจะมี error แสดง
mkdir: cannot create directory ‘/mnt/c/UsersDatas/var/www/prototypes_laravel’: No such file or directory
แก้ได้โดยใช้ parameter -p เช่น

sudo mkdir -p /mnt/c/UsersDatas/var/www/prototypes_laravel

ก็จะสร้าง C:\UsersDatas\var\www\prototypes_laravel ตามที่ต้องการ

อ่านเพิ่มเติม WSL: Creating links shortcut


เขียนหน้า 404 แบบง่ายๆ

เป็นธรรมดาที่เวลาเว็บมีอายุนานๆ แล้วจะมีการที่เพิ่มลดหน้าเพจ มีภาพที่โดนลบออก มีโดนย้ายตำแหน่ง รวมถึงพวก hacker ที่พยามจะมาเดินเล่นหา file ต่างๆ ที่อาจจะสามารถใช้รวบรวมข้อมูลไปทำอันตรายต่างๆได้ หลายๆเว็บจึงทำหน้า 404 not found ไว้ เพื่อ

  • บอกว่าไฟล์นี่ไม่มีแล้วนะ
  • พา user ไปหน้า search ข้อมูล หรือหน้าที่รวมความช่วยเหลือ
  • ป้องกันไม่ให้มาค้นหาไฟล์อะไรง่ายๆ โดยการเดาชื่อไฟล์ เพราะจะได้หน้านี้กลับไป เป็นการถ่วงเวลาอย่างหนึ่งให้ระบบตรวจจับการบุกรุกสามารถเห็นได้ง่ายขึ้น

    สร้างไฟล์ .htaccess ไว้ใน folder หลักของเว็บ หรือ directory ที่ต้องการ โดยเขียน

    RewriteEngine on
    
    RewriteRule (.*) 404.html [L]
    

    ถ้ามีคำสั้่งอื่นๆ อยู่แล้ว ก็ให้ใส่คำสั่ง RewriteRule (.*) 404.html [L] ไว้ล่างสุด และเขียนไฟล์ 404.html ไว้เนื้อหาภายในก็เปลี่ยนไปตามจุดประสงค์ที่ต้องการ จะแค่ภาพ 404 ที่มีตามเน็ตก็ได้

default file รูปด้วย .htaccess

ทำระบบสมาชิกโดยแต่ละ user จะมีภาพประจำตัว โดยเก็บในรูปแบบ \datas\peoples\id ของ user.jpg แต่บางคน (ส่วนใหญ่) ไม่ส่งภาพมา แต่ในหลายๆ หน้าจะมีจุดที่แสดงภาพสมาชิก

มี 2 ทางเลือกคือ

  • ใช้คำสั่ง file_exists ตรวจสอบดูว่ามีไฟล์นี้รึเปล่า ถ้ามีก็เอาภาพไปแสดง ถ้าไม่ก็แสดงภาพเป็นเงาดำๆ ให้ดูไป
  • อีกวิธีคือ แสดงภาพเหมือนว่ามีไฟล์นี้จริงๆ แต่ถ้าหาไฟล์ไม่เจอก็ให้ server ไปดึงไฟล์ดีฟอล์ตมาแสดง โดยใน code ไม่ต้องตรวจสอบอะไรเลย

วิธีการคือ สร้างไฟล์ .htaccess ใน \datas\peoples\ โดยมีเนื้อหาคือ

RewriteEngine on

# If requested resource exists as a file or directory go to it
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule (.*) - [L]

# Else rewrite requests for non-existent .jpg to default.jpg
RewriteRule (.jpg$) default.jpg [L]

# Else rewrite requests for non-existent resources to 404.html
RewriteRule (.*) ../404.html [L]

เมื่อมีการเรียกใช้ภาพ .jpg มาใน folder \datas\peoples\ ตัว apache จะไปหาก่อนว่าไฟล์นั้นมีหรือเปล่า ถ้าไม่มีก็จะใช้ไฟล์ default.jpg มาแสดงแทน แค่นี้ก็ไม่ต้องตรวจสอบทุกจุดที่แสดงภาพแล้วว่ามีภาพจริงๆ หรือเปล่า

ถ้าใช้ git อ่านเรื่อง git: ไม่สนไฟล์ในโพลเดอร์นี้ ยกเว้น ด้วย

1 ภาพ 1,000 ข้อมูล

ต้องการจะเก็บภาพโดยเก็บตามวันที่ ที่โดนถ่าย เหมือนใน Camera Roll เพราะว่าภาพ TIFF, JPEG, WAV จะมีข้อมูล meta data ที่เรียกว่า Exchangeable image file format (Exif) ที่จะใส่ข้อมูลที่ถูกบันทึกไว้ตอนที่ถ่ายไว้โดยใช้กล้องดิจิติล มีข้อมูลสำคัญๆ อย่าง ถ่ายกับกล้องอะไร Manufacturer, Model เวลาที่ภาพถูกถ่าย Date and Time (original) มีการแต่งภาพรึเปล่า เมื่อไหร่ Date and Time (digitized) และถ่ายที่ไหน

ใน php เราสามารถใช้ function exif_read_data ดึงข้อมูลออกมาให้ใช้จัดการกับรูปได้ จะย้ายภาพไปเก็บไว้ตามวันที่ที่ถ่าย หรือตามสถานที่

<?php

/* fix maximum execution time */
set_time_limit(0);

/* find file */
$root = 'Photos';
echo'<dl>';
foreach (glob($root."/*.{jpeg,JPEG,jpg,JPG}", GLOB_BRACE) as $filename) {

	if($exif = exif_read_data($filename, 'IFD0'))
	{

		$date = date('Y-m-d', strtotime($exif['DateTimeOriginal']));

	    /* create folder */
	    $dir = $root.'/'.$date;
	    if (!is_dir($dir)) {
	        mkdir($dir, 0644, true);
	    }

	    /* move file */
	    $path = explode('/', $filename);
	    $newFile = $dir.'/'.$path[1];
	    rename($filename, $newFile);

	    echo '<dt>',$filename,'</dt>',
	    '<dd>',$newFile,'</dd>';

	}

}
echo'</dl>',
'<h1>Compleate!</h1>';

ย้ายไฟล์ลง folder ตามวันที่

เดิมไฟล์ backup ถูกเก็บในรูปแบบ ปี เดือน วัน โปรเจ็ค เช่น 2015-07-10-joomla.sql, 2015-07-10-joomla.zip, 2015-07-10-prestashop.sql, 2015-07-10-prestashop.zip ทุกๆวัน วันละ 4 ไฟล์ ถ้าเก็บแบบนี้ทุกวันก็จะมีไฟล์ 1,440 ไฟล์ เริ่มจะรก จะลบไฟล์แบ็กอัพเก่าๆ ออกก็ไม่สดวก ถ้ามีโปรเจ็คที่ต้องดูแลมากกว่านี้

ก็มีความคิดว่า ทำไม่ไม่เก็บ backup เป็น directory ปี เดือน วัน ละ เวลาลบจะได้ง่ายๆ อยากจะลบปีก่อนทั้งปี ก็แค่คลิก 2 ครั้งก็เสร็จ ลบ 3 เดือนที่แล้วก็ไม่ยาก มันแยกไว้อยู่แล้ว แต่ก่อนอื่นก็ต้องย้ายไปเก็บให้ถูกที่ก่อน

PHP มี function glob ช่วยหาไฟล์ตามรูปแบบอยู่ ทำให้เขียน code หาไฟล์ตามรูปแบบได้ ไม่ยากนัก

<?php
/* find file */
$root = 'backup';
foreach (glob($root.'/*-*') as $filename) {
	/* get path */
	$path = explode('/', $filename);
	list($year, $month, $date) = explode('-', $path[1]);

	/* create folder */
	$dir = $root.'/'.$year.'/'.$month.'/'.$date;
	if (!is_dir($dir)) {
		mkdir($dir, 0644, true);
	}

	/* move file */
	rename($filename, $dir.'/'.$path[1]);

}
rt :
สร้างโฟลเดอร์ตัวอักษรไทย
คัดลอกหมดทั้งโฟลเดอร์

คัดลอกหมดทั้งโฟลเดอร์

โปรเจ็คที่ทำอยู่ตอนนี้ ทางลูกค้าต้องการให้สามารถ สร้างระบบย่อยได้เอง จะทำงานคล้ายๆกัน แต่ละส่วนสามารถปรับแต่งได้อิสระจากตัวอื่นๆ เช่น ใช้ logo ของบริษัทพันธมิตร โดยจะมีส่วนย่อยๆ นี้ตามจำนวนพันธมิตรที่เค้าหามาได้ และใน backed จะต้องสามารถสร้างขึ้นมาได้เอง โดยที่ไม่ต้องการให้โปรแกรมเมอร์ มาเซ็ตระบบเริ่มต้นให้

หนึ่งในกระบวนการที่คิดไว้ก็คือ แยก code ของแต่ละ partner ออกไปในอีกโพลเดอร์และใช้ php clone ออกไปทั้ง sub directory ไปไว้อีกที่ ให้แต่ละบริษัทใช้

<?php

function cloning($folderSource, $folderClone) {
	if (!@mkdir($folderClone, 0755)) {
		return error_get_last();
	}
	foreach ($iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($folderSource, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST) as $item) {
		if ($item->isDir()) {
			mkdir($folderClone . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
		} else {
			copy($item, $folderClone . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
		}
	}
	return true;
}

$message = cloning('partner', 'partner_dolly');
if ($message === true) {
	echo 'Success';
} else {
	echo print_r($message, true);
}

แก้ YII Assets ย้าย static cache folder

โดยปกติ yii จะเก็บไฟล์ static บางไฟล์ที่เป็น CSS, JavaScript ทั้งที่เป็น framework อย่าง jQuery หรือไฟล์ที่เกิดจากการใช้คำสั่ง Yii::app()->getClientScript()->registerScript(‘featured’ ,”…”); หรือ Yii::app()->clientScript->registerCoreScript(‘jquery’); ไว้ใน folder assets/ค่าสุ่ม บางครั้งเราแก้ไขไปแล้ว แต่ไฟล์พวกนี้ยัง cache ของเดิมอยู่เพราะว่า hash ไม่ได้ต่างจากเดิม หน้าเว็บจึงทำงานไม่ถูกต้องตามที่ตั้งใจไว้ วิธีแก้คือการที่จะต้องเข้าไปลบออกทั้งโฟลเดอร์ ซึ่งไม่สดวกนักเพราะว่าใน assets ยังมีไฟล์ที่เป็นดาต้าจริงๆ อยู่ด้วย ทางที่จึงควรแยกไฟล์ที่เป็น static cache พวกนี้ออกไปไว้ที่อื่นเพื่อความสดวกในการทดสอบและปลอดภัยของข้อมูล

สมมุติว่าสร้างโฟลเดอร์เก็บไฟล์ static cache ไว้ที่ D:/xampp/htdocs/yiiTest/assetsRuntime (user ต้องเข้าถึงได้จาก internet และต้องกำหนดให้ php มีสิทธิเขียน / ลบไฟล์ อย่างน้อย cmod ต้องเป็น 0755 ) แล้วไปที่ protectedconfig main.php เพิ่มบรรทัดตามตัวอย่าง

	'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
	'name'=>'My Web Application',
…
	// application components
	'components'=>array(
		'assetManager'=>array(
			'basePath'=>'D:/xampp/htdoc/syiiTest/assets/Runtime',
			'baseUrl'=>'/yiiTest/assetsRuntime/'
		),
…

อาจจะลบโฟลเดอร์ static cache ใน assets เก่าออก ครั้งต่อไปที่เขียนไฟล์ จะเขียนลงที่ใหม่