Tortoisehg error saat di jalankan pada Archlinux

1 Comments.


Kejadian ini terjadi pada tanggal 4 Juli 2014, setelah saya upgrade archlinux saya. Berikut ini adalah screenshot erronya

Setelah browsing-browsing ternyata masalah ada pada library qscintilla pada pyhton2, solusinya adalah dengan mendowngrade libary dari versi 2.8.3-1 ke versi sebelumnya (2.8.1-2). Berikut perintah ini perintah untuk mendowngrade
pacman -U /var/cache/pacman/pkg/python2-qscintilla-2.8.1-2-x86_64.pkg.tar.xz.
dan Alhamdulillah aplikasi Tortoisehg kembali bisa jalan :)

Semoga bermanfaat.


Yii: Membuat validasi di luar model

Leave a comment.


Kali ini saya ingin sedikit menjelaskan tentang validasi di luar model, maksudnya?. Contoh kasus Anda sedang membangun sebuah aplikasi quisioner yang mengharuskan pengguna memilih satu jawaban dan jawaban tersebut bisa angka maupun huruf. Nah data tersebut harus di validasi agar aman, namun sangat merepotkan jika harus membuat model untuk setiap jawaban. Maka dari di perlukan validasi di luar model, jadi Anda hanya perlu membuat sebuah model dengan satu attribut tetapi bisa menyimpan berbagai tipe dan validasi sesuai dengan datanya.

Pertama buatlah sebuah model class turunan dari CFormModel, kenapa tidak pake CModel saja. Karena CFormModel secara otomatis akan mendeteksi atribut apa saja yang di deklarasikan pada kelas. buat model dengan nama misalnya User.php

<?php
class User extends CFormModel
{
    public $id;
    public $username;
}

Kemudian Anda bisa meletakkan pengecekan ini pada fungsi atau action pada controller. Misalkan kita akan memeriksa bahwa atribut id dan username harus di isi, maka kita gunakan aturan “required”

 

<?php
public function actionIndex() {
    $model = new User();

    $validator = CValidator::createValidator('required', $model, 
        array('id', 'username'));
    $validator->validate($model);
    if(count($model->errors) > 0)
        echo 'Id dan username harus di isi.';
    else
        echo 'Sudah benar.';
}

Dari kode di atas terlihat bahwa pertama kita membuat model dulu, lalu membuat validator dari kelas CValidator dengan parameter sbb:

  1. tipe validator, misalnya: required, numerical. tipe validator ini merupakan alias dari kelas-kelas validator di Yii, misalnya required alias dari kelas CRequiredValidator, numerical alias dari kelas CNumberValidator.
  2. Nama model
  3. Atribut yang akan di validasi
  4. Opsional, tambahan option dari validator misalnya untuk numerical terdapat opsi min dan max, yang mengatur panjang minimal dan maksimal dari data.
<?php
// Contoh validasi dengan validator "numerical"
public function actionIndex() {
    $model = new User();

    $validator = CValidator::createValidator('numerical', $model, 
        array('id'), array('min' => 6, 'max' => 12));
    $validator->validate($model);
    if(count($model->errors) > 0)
        echo 'Atribut Id panjang minimal 6 dan maksimal 12 angka';
    else
        echo 'Sudah benar.';
}

Untuk daftar tipe validator yang lengkap bisa di lihat di bawah ini:

  • required: CRequiredValidator
  • filter: CFilterValidator
  • match: CRegularExpressionValidator
  • email: CEmailValidator
  • url: CUrlValidator
  • unique: CUniqueValidator
  • compare: CCompareValidator
  • length: CStringValidator
  • in: CRangeValidator
  • numerical: CNumberValidator
  • captcha: CCaptchaValidator
  • type: CTypeValidator
  • file: CFileValidator
  • default: CDefaultValueValidator
  • exist: CExistValidator
  • boolean: CBooleanValidator
  • date: CDateValidator
  • safe: CSafeValidator
  • unsafe: CUnsafeValidator

 

Mudah bukan, jadi Anda tidak perlu membuat fungsi lagi untuk memvalidasi data-data. Karena Yii sudah menyediakannya untuk Anda, seperti namanya Yii = Yes it is :)
Semoga bermanfaat


Mendeklarasikan property private pada JavaScript

Leave a comment.


JavaScript merupakan bahasa scripting yang berbasis objek, namun karena pada JavaScript OOP-nya sedikit berbeda dengan bahasa berbasis objek yang lainnya membuat orang bingung. Kali ini saya ingin sedikit menjelaskan tentang properti/atribut private dalam kelas. Banyak yang berpikir bahwa JavaScript tidak ada metode untuk menyembunyikan atribut seperti pada bahasa pemrograman lain. Anggapan itu salah karena JavaScript juga memiliki mekanisme untuk membuat atribut private. Untuk lebih jelasnya kita lihat kode berikut ini:

// Membuat kelas User
function User()
{
    this.id = 1;
    var name = 'Agus',
        email = 'smartgdi@gmail.com';
}

var user1 = new User();

console.log('Id: ' + user1.id); // 1
console.log('Name: ' + user1.name); // undefined
console.log('Email: ' + user1.email); // undefined

Pada contoh di atas kita membuat kelas User dengan 3 buah atribut, yang pertama atribut id merupakan atribut public, name dan email merupakan atribut private. Jika di jalankan script di atas akan menampilkan output 1, undefined, undefined. Karena name dan email bersifat private, hanya kelas itu sendiri yang dapat mengaksesnya. JavaScript menggunakan keyword var untuk mendeklarasikan atribut private dan menggunakan keyword this untuk mendeklarasikan atribut public.

Ada satu kelemahan pada JavaScript tentang atribut private ini yaitu atribut private tidak dapat di akses oleh fungsi yang bersifat public yang menggunakan prototype untuk menambah fungsi pada kelas itu. Contoh:

function User()
{
    var name = 'Agus';
}

User.prototype.getName = function() {
    return name;
};

var user1 = new User();
console.log( user1.getName() ); // name not defined

Pada saat di jalankan script di atas akan menampilkan pesan “name not defined”, karena variabel name tidak di kenali pada lingkup di luar closure. Seharusnya method getName di deklarasikan di dalam kelas User atau di namakan closure. Lihat pembenahan kode di bawah:

function User()
{
        var name = 'Agus';
        this.getName = function() {
            return name;
        };
}

var user1 = new User();
console.log( user1.getName() ); // output: Agus

Demikian artikel saya yang singkat ini semoga dapat bermanfaat :)


Optimasi javascript pada Yii Framework

Leave a comment.


Optimalisasi kode website sangat penting dilakukan pada awal pengembangan suatu website. Kenapa? karena tanpa adanya optimalisasi di awal pengembangan, akan menyebabkan kurangnya efisiensi waktu. Di sebabkan optimalisasi menunggu suatu website lambat pada saat sudah dalam proses produksi. Untuk itu di perlukan adanya optimalisasi kode pada awal pengembangan, salah satunya yaitu optimalisasi javascript.

Menurut optimalisasi javascript versi Yahoo, javascript sebaiknya di letakkan di bagian bawah sebelum tag penutup body. Hal ini sesuai dengan prinsip bahwa sebuah halaman website seharusnya yang di load pertama kali adalah html dan css, kemudian baru javascript. Sehingga user tidak menunggu terlalu lama hanya karena javascriptnya terlalu banyak. Dan hal ini dapat menghindari unstyled content.

Pada framework Yii default lokasi javascript adalah di header, untuk itu kita akan memindahkan lokasinya ke footer. Ada dua cara yang bisa kita gunakan, cara pertama dengan menambahkan posisi pada saat kita mendaftar sebuah file javascript. Cara kedua dengan memaksa Yii agar menggunakan default lokasi ke footer. Cara pertama memiliki kelemahan pada saat kita Yii mendaftarkan javascript dari widgetnya secara otomatis, maka javascriptnya akan berada di header sesuai lokasi defaultnya.

Sebelumnya kita lihat format penulisan registerScript file pada Yii.

public CClientScript registerScriptFile(string $url, integer $position=NULL)

registerScriptFile merupakan fungsi dari class CClientScript, parameter pertama adalah lokasi script yang akan kita daftarkan, parameter kedua adalah konstanta angka posisi javascript. Terdapat 3 posisi yang dapat kita gunakan, pertama POS_HEAD. Posisi ini akan meletakkan script di antara tag head. Posisi POS_BEGIN akan meletakkan script setelah tag pembuka body dan posisi POS_END akan meletakkan script sebelum tag penutup body (</body>). Bisa juga dengan angka yaitu 0 untuk POS_HEAD, 1 untuk POS_BEGIN dan 2 untuk POS_END.

Kita lihat cara pertama terlebih dahulu seperti contoh berikut ini, misalkan kita ingin mendaftarkan file javascript custom.js:

<?php
$cs = Yii::app()->getClientScript();
$customJsFile = Yii::app()->baseUrl . '/js/custom.js';

$cs->registerScriptFile($customJsFile, CClientScript::POS_END);

Dengan cara ini script kita akan di letakkan pada akhir sebelum tag penutup body.
Cara yang kedua adalah dengan menambahkan posisi pada file konfigurasi pada Yii. misalkan namanya main.php (nama config ini bisa berbeda tergantung setingan Anda). File ini berada di folder protected/config.

'components' => array(
    // ... baris komponen lain
    'clientScript' => array(
        'defaultScriptFilePosition' => CClientScript::POS_END
    ),
    // ... baris komponen lain
)

Dengan begini semua file javascript yang di daftar dengan fungsi registerScriptFile akan berada pada footer dan Anda tidak perlu menyertakan lokasi pada saat menggunakan fungsi registerScriptFile. Ok, semoga artikel ini bermanfaat bagi Anda :)


Berkenalan dengan Silex, PHP Microframework

Leave a comment.


Silex adalah microframework yang di buat dengan bahasa PHP. Silex di buat berdasarkan pada komponen framework Symfony, framework ini terinspirasi oleh sinatra (Ruby). Karena sangat simple dan di tujukan untuk halaman web satu file saja. Instalasi silex sangat mudah, apalagi jika menggunakan Composer.

Kebutuhan PHP minimum yang di butuhkan silex adalah PHP versi >= 5.3.3. Dan pastikan ekstensi php phar aktif jika Anda akan menginstall silex menggunakan composer. Jika menggunakan composer, tinggal buat file composer.json lalu tambahkan script berikut ke file composer.json:

{
    "require": {
        "silex/silex": "~1.1"
    }
}

Kemudian jalankan composer dengan mengetikan

// Jalankan script ini terlebih dahulu jika composer belum di install
// curl -s http://getcomposer.org/installer | php

php composer.phar install

Jika ingin mengupdate silex tinggal ketikan php composer.phar update

Penggunaan Dasar

Sebagai contoh saya membuat folder aplikasi dengan nama silex-app di dalam folder htdocs, folder ini berisi file-file aplikasi termasuk framework silex. Strukturnya seperti berikut:

+ silex-app
  + vendor
  - composer.json
  - composer.lock
  - index.php

Untuk memulai menggunakan silex, tambahkan require vendor/autoload.php pada file php (dalam contoh saya letakkan pada file index.php ). Kemudian buatlah instance dari kelas Silex\Application. Setelah definisi kontroler, panggil fungsi run dari instansi aplikasi. Untuk lebih jelasnya silahkan lihat kode berikut ini:

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

$app = new Silex\Application();

// Buat action untuk menerima request dengan alamat /hello/{nama}
$app->get('/hello/{name}', function($name) use ($app) {
    return 'Hello ' . $app->escape($name);
});

$app->run();

Kemudian coba Anda jalankan dengan mengetikan alamat localhost/silex-app/hello/world, viola akan muncul tulisan hello world.

Jika Anda ketikan localhost/silex-app/hello/php makan akan muncul tulisan hello php. Pertama kali saya mencoba framework ini cuma bisa bilang wow, simpel banget hehehe. Mungkin pada saat masih dalam pengembangan Anda di sarankan untuk menghidupkan fitur debug dengan menambahkannya pada aplikasi. Hal ini sangat membantu dalam mengetahui eror pada aplikasi atau istilahnya bugs.

$app['debug'] = true;

Bagi yang belum mengetahui apa itu anonymous function, saya akan jelaskan sedikit. Anonymous function adalah fungsi yang tidak memerlukan nama, mirip dengan anonymous function pada javascript. Kemudian keyword use setelah anonymous function di gunakan agar variabel di luar anonymous function dapat di akses di dalam anonymous function.

Coba kita tambah action lain dengan nama about:

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

$app = new Silex\Application();

// Buat action untuk menerima request dengan alamat /hello/{nama}
$app->get('/hello/{name}', function($name) use ($app) {
    return 'Hello ' . $app->escape($name);
});

$app->get('/about', function() {
    return 'Halaman about'; 
});
$app->run();

Coba Anda jalankan lagi dengan mengetikan alamat localhost/silex-app/about, wow akan muncul tulisan “halaman about”. Kita sudah mencoba method get, bagaimana dengan method post. Untuk menggunakan method post, Anda perlu menyertakan class Request dan Response setelah keyword require. Kelas ini sudah termasuk di dalam framework silex.

Pertama buat action untuk menampilkan formnya, misalkan namanya contact-us. Kemudian buat action untuk menerima data dari form, misalnya save-contact. Kita lihat kode berikut ini:

// Tambahkan kode ini setelah autoload
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

// Tambahkan sebelum $app->run();
$app->get('/contact-us', function() {
    $form = '
    <form action="/silex-app/save-contact" method="post">
      <input type="text" name="email" id="email" />
      <input type="submit" name="submit" value="Submit" />
    </form>';

    return $form;
});

$app->post('/save-contact', function(Request $request) {
    $email = $request->get('email');
    return new Response('Email Anda adalah: ' . $email, 201);
});

Jika urlnya di akses maka akan menampilkan output seperti berikut:

Kemudian setelah form di submit, makan akan tampil seperti ini:

Fitur silex yang masih banyak sekali yang tidak mungin saya jelaskan semua. Mungkin lain waktu akan saya jelaskan fitur-fitur yang lainnya seperti penggunaan template engine Twig, Class controller, Session, Database dengan Doctrin dll. Semoga artikel yang singkat ini dapat memberi gambaran tentang microframework silex pada PHP. Untuk lebih detilnya Anda bisa mengunjungi website resminya di silex.sensiolabs.org