Skip navigation

Category Archives: Web Programming


This was just an idea popped up when I had trouble sleeping last night. Basically we can use Thrift for defining the data and service going in and out Lambda service instead of plain REST API.

Below is the code for the server. To make it easier to deploy I am using Serverless Framework.

This is still lack authentication process whatsoever so I don’t think this should be use in production until I figure it out.

The full source code is hosted here: https://github.com/petrabarus/aws-lambda-thrift-example

Iklan

Just another snippet. By using Chef’s PHP cookbook, we can easily install Zend Opcache. That if we still use PHP 5.4 since 5.5. have the opcache in the default distribution.

Put this in the recipe

php_pear "opcache" do
  package_name "ZendOpcache"
  action :install
  preferred_state "beta"
  zend_extensions ["opcache.so"]
  directives node['php']['opcache']['directives']
end

and this in the attributes

default['php']['opcache']['directives'] = {
    'memory_consumption' => 128,
    'interned_strings_buffer' => 8,
    'max_accelerated_files' => 4000,
    'revalidate_freq' => 60,
    'fast_shutdown' => 1,
    'enable_cli' => 1,
    'save_comments' => 0,   
}

Just a simple trick I did today.

Basically I want to remove the circle button in the radio button and use the label as the choice for the button.

So instead of having this

Screenshot from 2014-03-06 13:21:31

I want to have this

Screenshot from 2014-03-06 13:21:45

I can do this just using CSS without Javascript. Here’s the JS Fiddle.

http://jsfiddle.net/petrabarus/pPgS7/

 


Kemarin saya sedang iseng membuka-buka StackOverflow dan menemukan pertanyaan ini Displaying CSV file content in Yii Framework’s CGridView.

Inti pertanyaannya adalah bagaimana menampilkan isi file CSV menggunakan GridView.

Cara mudahnya adalah dengan menggunakan CArrayDataProvider.

$file = fopen('test.csv', 'r');
$data = array();
while (($line = fgetcsv($file)) !== FALSE) {
    //$line is an array of the csv elements
    $data[] = $line;
}
fclose($file);
$columns = array();
foreach ($data[0] as $key => $value) {
    $columns[] = array(
        'name' => $key,
        'header' => $value,
    );
}
$data = array_slice($data, 1);
$dataProvider = new CArrayDataProvider($data, array(
    'keyField' => 0,
));
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $dataProvider,
    'columns' => $columns
));

Jika ingin menggunakan secara generik, kita bisa membuat kelas baru bernama CsvDataProvider.

class CsvDataProvider extends CArrayDataProvider {

    private $_columns = array();

    public function __construct($file, $config = array()) {
        $handler = fopen($file, 'r');
        $data = array();
        while (($line = fgetcsv($handler)) !== FALSE) {
            $data[] = $line;
        }
        fclose($handler);
        $this->_columns = array();
        foreach ($data[0] as $key => $value) {
            $this->_columns[] = array(
                'name' => $key,
                'header' => $value,
            );
        }
        $data = array_slice($data, 1);
        parent::__construct($data, array_merge($config, array(
            'keyField' => 0,
        )));
    }

    public function getColumns() {
        return $this->_columns;
    }
}

cara menggunakannya mudah

$dataProvider = new CsvDataProvider('file.csv');
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $dataProvider,
    'columns' => $dataProvider->getColumns(),
));

Tapi kode di atas belum bisa memfasilitasi sorting dan pagination. Kerugiannya juga adalah kinerja yang buruk jika digunakan pada berkas CSV berukuran sangat besar. Dan ada ide menarik untuk menggunakan library pemrosesan CSV yang hemat memori dan dengan fungsi lengkap. Nanti mungkin kalau sempat saya tuliskan penuhnya.


Bulan lalu saya diminta untuk mengisi acara Iftar untuk komunitas PHP Indonesia. Saya membawakan materi tentang “What’s New In Yii2” dan juga materi tambahan “What’s New In PHP 5.5”. Selain saya, ada juga pengisi lain yakni mas Iskandar Soesman dari Detik.com yang berbagi tentang “Optimize PHP Application in High Traffic Environment”.

PHP Meetup Indonesia

Berikut adalah slide dan videonya. Enjoy! Video-video dari acara PHP Indonesia lainnya dapat dilihat di link ini.


Pada postingan kali ini saya akan menuliskan bagaimana menggunakan AWS SDK for PHP version 2 pada Yii. Sebelum menggunakan yang versi 2, saya sudah menggunakan versi 1 dan versi kedua ini lebih mudah digunakan karena dia sudah mendukung pengaturan kode PHP yang sudah terstruktur sesuai dengan rekomendasi standar yang sedang tren yakni PSR. Oleh karena itu penggunaan SDK v2 ini dapat dilakukan dengan menggunakan Composer.

Cara instalasi program Composer untuk melakukan instalasi library AWS SDK, dapat dilihat di sini.

Seperti instalasi paket library ala Composer, pertama-tama kita membuat spesifikasi paket pada berkas “composer.json”. Untuk menambahkan AWS SDK, isi “composer.json” adalah sebagai berikut.

{
  "config": {
    "vendor-dir": "protected/composer/vendors"
  },
  "require": {
    "aws/aws-sdk-php": "2.3.*@dev"
  }
}

Sebenarnya konfigurasi Composer untuk instalasi SDK sudah cukup pada baris 5 sampai 7, tetapi saya pribadi lebih suka menambahkan konfigurasi untuk menyimpan library dari Composer pada direktori “protected/composer/vendors” agar tidak mengotori direktori lain seperti “protected/extensions” dan “protected/vendors“.

Setelah menambahkan konfigurasi tersebut, kita harus menjalankan perintah instalasinya.

petra@pc$composer install
Loading composer repositories with package information
Installing dependencies
  - Installing symfony/event-dispatcher (v2.2.1)
    Loading from cache

  - Installing guzzle/guzzle (v3.5.0)
    Loading from cache

  - Installing aws/aws-sdk-php (dev-master a299b46)
    Cloning a299b46693878b5a7ffaa30e236fbefe9113b6e0

symfony/event-dispatcher suggests installing symfony/dependency-injection (2.2.*)
symfony/event-dispatcher suggests installing symfony/http-kernel (2.2.*)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

Sebelum bisa menggunakan composer, kita harus melakukan include untuk autoloading Composer.

require_once(dirname(__FILE__).'/protected/composer/vendors/autoload.php');
// change the following paths if necessary
$yii=dirname(__FILE__).'/yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';

// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);

require_once($yii);
Yii::createWebApplication($config)->run();

Lalu kode di bagian controllernya seperti demikian

class SiteController extends Controller
{

    public function actionIndex()
    {
        if (Yii::app()->request->getIsPostRequest()) {
            $file = CUploadedFile::getInstanceByName('file');
            /* @var $file CUploadedFile */
            if (isset($file)) {
                $s3 = \Aws\S3\S3Client::factory(array(
                        'key' => 'YourAWSKEY',
                        'secret' => 'YourAWSSecret',
                        'region' => \Aws\Common\Enum\Region::SINGAPORE,
                    ));
                /* @var $s3 Aws\S3\S3Client */
                try {
                    $result = $s3->putObject(array(
                        'Bucket' => 'bucketname',
                        'Key' => $file->name,
                        'SourceFile' => $file->tempName,
                        ));
                    /* @var $result \Guzzle\Service\Resource\Model */
                    $url = $result->get("ObjectURL");
                    Yii::app()->user->setFlash('Success', "Upload Success: " . CHtml::link($url, $url));
                } catch (\Aws\S3\Exception\S3Exception $exc) {
                    /* @var $exc \Aws\S3\Exception\S3Exception */
                    $message = $exc->getMessage();
                    Yii::app()->user->setFlash('Failed', "Upload Failed: {$message}");
                }
            }
        }
        $this->render('index');
    }

}

Bagian controller akan menangani request dari upload form kemudian melakukan pengunggahan ke S3. Untuk pengunggahan kita memerlukan kelas S3Client dari AWS SDK. Pada instansiasinya kita perlu mengeset key dan secret dari akun AWS yang dimiliki, serta region tempat penyimpanan.

Lalu proses pengunggahan sendiri akan dilakukan dengan menginvokasi method putObjectObyek yang dikembalikan oleh method ini hanya berupa model yang berisi return value dari invokasi HTTP request yang dilakukan oleh Guzzle. Untuk mengambil URL dari file yang telah diunggah, kita ambil saja atribut ObjectURL pada model tersebut.

Bagian viewnya sangat sederhana.

<h1>Upload file</h1>

<?php if (Yii::app()->user->hasFlash('Success')): ?>
    <div class="flash-success">
        <?php echo Yii::app()->user->getFlash('Success'); ?>
    </div>
<?php endif; ?>
<?php if (Yii::app()->user->hasFlash('Failed')): ?>
    <div class="flash-error">
        <?php echo Yii::app()->user->getFlash('Success'); ?>
    </div>
<?php endif; ?>

<?php echo CHtml::beginForm('', 'post', array('enctype' => 'multipart/form-data')); ?>
<?php echo CHtml::fileField('file'); ?>
<?php echo CHtml::submitButton(); ?>
<?php echo CHtml::endForm(); ?>

Nanti hasilnya akan seperti demikian.

Tampilan Sebelum Pengunggahan

Tampilan Sebelum Pengunggahan

Setelah melakukan pengunggahan, dia akan menampilkan URL yang telah disimpan oleh setFlash.

Tampilan Setelah Pengunggahan

Tampilan Setelah Pengunggahan

Dan di AWS S3 console, sudah bisa dilihat di dalam bucketnya kalau filenya sudah diunggah.

Isi Bucket Setelah Pengunggahan

Isi Bucket Setelah Pengunggahan

AWS SDK for PHP version 2 ini jauh lebih enak digunakan daripada versi sebelumnya karena sudah memenuhi standar PSR sehingga bisa digunakan dengan Composer serta dengan mudah diintegrasikan pada aplikasi Yii. Selain S3, SDK ini juga menyediakan banyak library untuk layanan AWS lainnya seperti EC2, DynamoDB, dll.

Kodenya dapat dilihat di link ini.

Failed

Since I used to work using Java before went to PHP on daily basis, I really like using Apache Ant. Actually there is a similar technology called Phing that is fully integrated with PHP, i.e. you can use a PHP code in the script. Which is good, by the way.

So recently I need to create a gzipped version to each files in a directory for the static assets. Below is the Apache Ant snippet to do that. Enjoy.

<target name="compress-assets">
    <apply executable="gzip">
        <fileset dir="${assets.dir}">
            <include name="**/*.js"/>
            <include name="**/*.css"/>
        </fileset>
        <arg value="-c" />
        <srcfile />
        <redirector>
            <outputmapper id="out" type="glob" from="*" to="${assets.dir}/*.gz"/>
        </redirector>
    </apply>
</target>

The script above basically applies Gzip executable to each JS and CSS file in the directory to their js.gz and css.gz counterpart.


Setelah sekian lama terbengkalai, akhirnya saya melanjutkan postingan ini. Di postingan tersebut (dan postingan-postingan sebelumnya), saya menulis tentang bagaimana mengkustomisasi CJuiAutoComplete sesuai dengan kebutuhan. Tapi kelemahan dari implementasi sebelum-sebelumnya adalahautocompletetersebut terikat pada satucontroller dan agak repot untuk dipakai diview yang lain.

Agar dapat dengan mudah digunakan di view yang lain solusinya adalah dengan membungkus autocomplete tersebut menjadi sebuah Widget. Dengan demikian, untuk menggunakan autocomplete, kita cukup meletakkan kode widgetnya saja. Permasalahan dengan Widget ini adalah bagaimana cara mendapatkan data untuk autocomplete tersebut? Caranya mudah, yakni dengan menggunakan fitur ActionProvider pada Widget.

Read More »


Salah satu masalah yang dihadapi oleh orang saat menggunakan Yii adalah mengambil atribut dari tabel kedua (ketiga, keempat, dst) yang digunakan pada saat JOIN.

Katakanlah saya mempunya dua buah tabel ModelA dan ModelB seperti di bawah.

CREATE TABLE IF NOT EXISTS `ModelA` (
  `id` int(11) NOT NULL,
  `attribute2` int(11) NOT NULL,
  `attribute3` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `ModelB` (
  `id` int(11) NOT NULL,
  `aId` int(11) NOT NULL,
  `attribute3` int(11) NOT NULL,
  `attribute4` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Read More »


Saya sangat senang menggunakan XAMPP baik itu di Windows maupun Linux karena instalasi yang sangat simpel. Apalagi jika digunakan di Linux, kita tidak perlu pusing-pusing menjalankan perintah-perintah instalasi (apalagi juga mengcompile source code). Cukup download paket programnya, kemudian extract di direktori yang diinginkan.

Hanya saja belakangan saya membutuhkan memcached untuk instalasi XAMPP di komputer saya untuk mengetes aplikasi web saya yang menggunakan memcached. Sebenarnya bisa tinggal instalasi php extension untuk memcached dari PECL.

$/opt/lampp/bin/pecl install memcache

Masalahnya ini tidak bisa langsung dilakukan karena ada perbedaan arsitektur antara XAMPP dengan komputer saya. XAMPP for Linux (atau sering disebut LAMPP) yang saya instal menggunakan arsitektur 32 bit (sepertinya memang hanya disediakan yang 32 bit) sementara komputer saya menggunakan Ubuntu 64bit. Meskipun berhasil diinstal tetapi nanti tidak bisa dijalankan.

Read More »

%d blogger menyukai ini: