Fungsi Tail pada Windows

Sekiranya anda menggunakan sistem pengoperasian *nix. Ada masa-masanya anda perlu membaca server log, fungsi tail sangat berguna. Malangnya fungsi tail tidak ada pada sistem pengoperasian windows. Sekurang-kurangnya tidak semudah dan sependek *nix.

Perkara pertama anda perlu pastikan Windows anda dilengkapi dengan Windows Powershell. Sekiranya anda menggunakan Windows 8, Windows 7 ataupun Windows Server, Windows Powershell sudah siap dipasang pada sistem pengoperasian anda. Sekiranya tiada, anda boleh baca http://technet.microsoft.com/en-us/library/hh847837.aspx arahan muat-turun dan cara pemasangannya.

Pada sistem pengoperasian Windows 8, anda cuma perlu tekan Win+q dan taip “Power” pada ruangan Search.

Win+q

Kemudian anda akan mendapat paparan seperti ini

Capture

Berikut merupakan arahan yang perlu anda masukkan


Get-Content <pathToFile> -Tail <bilanganBaris> -Wait

Contoh adalah seperti berikut :


Get-Content error.log -Tail 10 -Wait

-Wait merupakan arahan supaya Get-Content sentiasa mengawasi sebarang perubahan kepada fail error.log. Untuk tamatkan fungsi ini anda cuma perlu tekan Ctrl+c.

Selamat mencuba!

DRY – Don’t repeat yourself.

Dalam konteks pengaturcaraan, ini melibatkan proses perancangan dan juga proses perlaksanaan. Sebagai contoh, kita mahu memaparkan senarai peserta tadarus, apa yang perlu kita buat adalah buat satu fungsi untuk memanggil data dari pangkalan data. Fungsi ini sepatutnya boleh dikongsikan/digunapakai oleh fungsi-fungsi lain.

Jadi kita tidak perlu membuat pernyataan SQL yang sama berulang-ulang kali. Itu yang dimaksudkan dengan ‘Don’t Repeat Yourself’.

DRY tidak sama sekali bermaksud, kalau sudah buat validasi di bahagian PHP, kita tidak perlu buat validasi di JAVASCRIPT. Javascript untuk UI, pengguna tak perlu menunggu borang disubmit kemudian dapat respon, ‘Maklumat tidak berjaya disimpan, data A wajib diisikan’.

Jadi apa perlunya validasi pada PHP sekiranya sudah ada validasi JAVASCRIPT. Jawapannya mudah, orang boleh off JAVASCRIPT pada pelayar bila-bila masa yang dia suka. Validasi pada PHP adalah bertujuan menjaga sistem kamu sendiri dari menerima data yang tidak lengkap dan juga kemungkinan di HACKED.

Konsep DRY yang boleh dipraktikkan dalam fungsi validasi adalah, kita buat satu fungsi validasi yang boleh digunakan oleh mana-mana form dalam html kita. Ya itu namanya DRY. Kita tak buat atau copy&paste kod JAVASCRIPT ke setiap form kita.

Dengan ini saya mengharapkan tiada lagi orang yang salah faham akan konsep DRY ini.

p/s : Itu sebab orang cipta framework, sebab nak elak buat code yang sama lebih dari sekali.

Mengira perbezaan hari

Apabila kita membangunkan sistem, seringkali kita berhadapan dengan mengira perbezaan hari. Terutamanya sistem yang melibatkan KPI ataupun ISO bagi sesuatu proses. Catatan kali ini akan menceritakan bagaimana kita boleh mendapatkan perbezaan hari dari 2 tarikh.

Bagi yang menggunakan PHP versi 5.2 dan kebawah bolehlah mencuba cara ini

<?php
$unix_time1 = mktime(0,0,0,3,1,2013);
$unix_time2 = mktime(0,0,0,5,1,2013);
	
echo $unix_balance = floor(($unix_time2 - $unix_time1) /(60 * 60 * 24));
?>

Format bagi fungsi mktime() adalah seperti ini mktime(jam,minit,saat,bulan,hari,tahun).  Kemudian kita perlu gunakan rumus ini bagi mendapatkan bilangan hari.

(Tarikh2 – Tarikh1) / (60saat x 60minit x 24jam)

Hasil dari pengiraan diatas, kita perlu melakukan proses pembundaran ke nilai yang lebih rendah. Dengan itu fungsi floor() diperlukan.

 

Cara yang kedua adalah dengan menggunakan Class Datetime yang terdapat didalam PHP 5.3 dan keatas. Menggunakan method diff. Bagi mendapat format yang boleh difahami, method format digunakan.

<?php
$Date1 = new Datetime('2013-03-01');
$Date2 = new Datetime('2013-05-01');
$interval = $Date1->diff($Date2);
	
echo $interval->format("%R%a days");
?>

Sekiranya kita perlu membuat perbandingan dengan data yang dipanggil dari pangkalan data, adalah lebih baik kita menggunakan sql. Ini bagi mengurangkan PHP perlu memprosesnya berulang-ulang kali. Caranya mudah. Pernyataan Sql dibawah menggunakan fungsi yang terdapat didalam MySQL.

 

Selamat mencuba!

SELECT DATEDIFF( tarikh_tamat, tarikh_mula )
FROM nama_jadual
WHERE syarat_anda
LIMIT 0 , 30

Invalid argument supplied for foreach() CORE\Cake\Utility\ObjectCollection.php, line 330


<a><b>Warning</b> (2)</a>: Invalid argument supplied for foreach() [<b>CORE\Cake\Utility\ObjectCollection.php</b>, line <b>330</b>]
Code Context
ObjectCollection::normalizeObjectArray() - CORE\Cake\Utility\ObjectCollection.php, line 330
BehaviorCollection::init() - CORE\Cake\Model\BehaviorCollection.php, line 66
Model::__construct() - CORE\Cake\Model\Model.php, line 748
ReflectionClass::newInstance() - [internal], line ??
ClassRegistry::init() - CORE\Cake\Utility\ClassRegistry.php, line 164
Model::_constructLinkedModel() - CORE\Cake\Model\Model.php, line 1031
Model::__isset() - CORE\Cake\Model\Model.php, line 857
Model::__get() - CORE\Cake\Model\Model.php, line 887
DboSource::read() - CORE\Cake\Model\Datasource\DboSource.php, line 1063
Model::find() - CORE\Cake\Model\Model.php, line 2674
Batch::count_enrolled() - APP\Plugin\course\Model\batch.php, line 73
CoursesController::index_admin() - APP\Plugin\course\Controller\CoursesController.php, line 55
ReflectionMethod::invokeArgs() - [internal], line ??
Controller::invokeAction() - CORE\Cake\Controller\Controller.php, line 485
Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php, line 186
Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php, line 161
[main] - APP\webroot\index.php, line 97

Selama 3 hari saya tersangkut dengan ralat ini. Sungguhpun ianya sekadar amaran(warning), tapi saya mahu menjadikan sistem saya bebas ralat. Kod yang pada asalnya menggunakan cakephp 1.3 kini dalam proses migrasi ke cakephp 2.3.

Hasil daripada apa yang saya kesan penggunaan fungsi $this->NamaModel->(‘count’) haruslah mempunyai parameter ‘contain’ => array(). Dimana kesemua hubungan model ini bersama model lain, haruslah diputuskan.


<?php

$params = array(

'conditions' => array('namaField' => $value),

'contain' => array()

);

$this->NamaModel->find('count',$params);

?>

Custom Helper in Cakephp 2

Hanya ingin berkongsi pengalaman saya menaiktarafkan code yang dijana dari Cakephp 1.3 ke Cakephp 2.0

Ada beberapa peralatan yang saya gunakan, yang pertama menggunakan Shell Script dari command bake


php cake.php upgrade All

Maklumat lanjut boleh diperolehi dari sini (http://book.cakephp.org/2.0/en/console-and-shells/upgrade-shell.html)

Perkara kedua yang saya lakukan adalah, mengubah nama fail untuk ikut standard Cakephp 2. Untuk itu saya telah buat script dibawah untuk ubah nama-nama controller.


<?php
$root = 'C:/Dev/www/vip2/app';
$path = $root.'/'.$_GET['path'].'/';

echo $path;

$dir_handle = opendir($path);

while ($file = readdir($dir_handle))
{
echo $file.'<br />';
if(($file != ".") && ($file != ".."))
{
$filename = explode('_',$file);
echo '<br />';
print_r($filename);
echo '<br />';
//if(isset($filename[1]))
//{
$newFileName = null;
$i = 0;
foreach($filename as $key => $value)
{
$newFileName .= ucfirst($value);
}

echo $newFileName.'<br />';
$oldPath = $path.$file;
$newPath = $path.$newFileName;
rename($oldPath,$newPath);
//}
}

}
closedir($dir_handle)
?>

Sekiranya, sistem anda melibatkan log masuk, maka perubahan perlu dilakukan pada method login. Boleh rujuk book.cakephp.org berkaitan perkara itu.

Kadangkala, kita sering membuat custom helper, dimana custom helper ini pula, akan memanggil Helper standard yang ada didalam Cakephp.

Oleh itu anda boleh melakukan sebegini,


App::import('Helper','Javascript');
App::import('Helper','Form');
App::uses('View','View');

$this->Js = new JavaScriptHelper(new View(null),$options);
$this->Form = new FormHelper(new View(null),$options);

Ini kerana parameter pertama adalah merujuk kepada View. Ini merupakan perubahan yang dilakukan di Cakephp 2.

Selamat mencuba dan memeningkan kepala! 😀