Catatan brew packages yang harus saya install

List brew packages yang biasanya ane install. Jangan lupa beberapa GNU kita pake tanpa prefix “g” dengan parameter --with-default-names.

aria2
autoconf
automake
axel
bash
binutils
boost160
caddy
cmake
colordiff
coreutils
curl
diff-so-fancy
diffutils
dirmngr
dnsmasq
dwarfutils
elasticsearch
emacs
fasd
ffmpeg
findutils
fish
fontconfig
freetype
fzf
gawk
gd
gdbm
gettext
gflags
git
git-extras
git-ftp
glog
gmp
gnu-indent
gnu-sed
gnu-tar
gnu-time
gnu-which
gnupg
gnupg2
gnutls
gpg-agent
grep
gzip
hhvm
httpie
icu4c
imagemagick
jemalloc
jpeg
jq
keychain
lame
less
libassuan
libelf
libevent
libffi
libgcrypt
libgpg-error
libksba
libmemcached
libpng
libssh2
libtasn1
libtiff
libtool
libusb
libusb-compat
libxml2
libyaml
libzip
llvm
lz4
mas
mcrypt
md5sha1sum
memcached
mhash
mpfr
mycli
mysql
nano
ncurses
nettle
node
ocaml
ocamlbuild
oniguruma
openssh
openssl
ossp-uuid
pcre
pcre2
perl
php-version
php70
php70-redis
php70-swoole
php70-uuid
php70-xdebug
pinentry
pkg-config
prettyping
pth
python
python3
ranger
readline
redis
rsync
ruby
safe-rm
sqlite
tbb
the_platinum_searcher
the_silver_searcher
thefuck
tig
tmux
unixodbc
unzip
utf8proc
vifm
vim
vimpager
watch
watchman
webp
wget
whois
x264
xvid
xz
youtube-dl
zsh
zsh-syntax-highlighting

Multiple .env di Laravel

Multiple .env di Laravel

Singkat cerita saya butuh konfigurasi yang berbeda-beda di tiap sub-domain, tapi dengan menggunakan core aplikasi yang sama. Maksudnya gini, kalau membuat sub-domain, maka ada folder khusus untuk sub-domain. Isi sub-domain ini adalah isi dari folder public. Misalnya begini struktur folder-nya

~/company1.example.com
  company2.example.com
  company3.example.com
  main_app

Nah, lokasi aplikasi utama ada di main_app. Sedangkan company1/2/3 maunya menggunakan core-nya si main_app tapi dengan konfigurasi environment dan database yang berbeda. Gimana caranya?:/

Update bootstrap/app.php

Tambahkan ini sebelum return $app;

if (is_readable(getcwd().'/.env')) {
    $app->useEnvironmentPath( getcwd() );
}

Yup, selesai😀

Sekarang kalau menuju ke http://company1.example.com, maka akan menggunakan konfigurasi dari company1.example.com/.env

Weits, jangan lupa juga file .env diamankan. Kalau menggunakan Apache HTTPD

<Files ".env">
    Order Allow,Deny
    Deny from all
</Files>

Nginx

location ~ /\.env
{ 
    deny all; 
}

How to use “Laravel facade” outside of Laravel

How to use “Laravel facade” outside of Laravel

I love Laravel facade. With Laravel facade the code be more beautiful and readable than traditional approach. But, what if you don’t use Laravel? How to use the “facade”?

For example, I want to use Laravel “File” facade inside of my application.

First, I need to install illuminate/filesystem via composer.

composer require illuminate/filesystem

Then, just load the composer autoloader and create a new class like this

<?php

require 'vendor/autoload.php';

use Illuminate\Filesystem\Filesystem;

class File
{
    public static function __callStatic($name, $args)
    {
        $self = new Filesystem;

        return $self->{$name}(...$args);
    }
}

Finally, we can use File:: like in Laravel.

File::allFiles('./');

File::get('somefile.txt');

UPDATE 23 Aug 2016 – illuminate/config

For example I have folder structure like this

\ - assets/
  - config/
     \ - database.php
       - site.php
       - mail.php

Inside of database.php, site.php, mail.php just simple array. Example of database.php

<?php

return [
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'test',
];

Here’s the main file to load all configurations.

<?php

require 'vendor/autoload.php';

use Illuminate\Config\Repository;

class Config
{
    protected static $instance;

    public static function __callStatic($method, $args)
    {
        if (! static::$instance) {
            static::$instance = new Repository(
                (new self)->loadConfig('config')
            );
        }

        return static::$instance->{$method}(...$args);
    }

    protected function loadConfig($configPath)
    {
        $items = [];

        foreach(scandir($configPath) as $file) {
            if (substr($file, -4) === '.php') {
                $filename = str_replace('.php', '', $file);
                $items[$filename] = require $configPath . '/' . $file;
            }
        }

        return $items;
    }
}

To get the configuration, just use Config::

Config::get('database.username');             // root
Config::set('database.username', 'newuser');  // Set new value
Config::get('database.username');             // newuser

Config::all();  // All configs

Pengalaman “Spritual” di Medan

Tahun ini 2016, saya memutuskan lebih lama tinggal di Medan. Tahun ini sudah dua kali bolak-balik ke Medan. Dari sebelum puasa, balik ke Jogja lagi, lalu ke Medan lagi sebelum lebaran.

Selama di Medan saya merasa lebih “dekat” dengan YME. Karena di Medan ini lalu lintas amburadul, jadi lebih sering istigfar. Misalnya jika ada simpang empat, yang selatan lampu hijau, maka yang utara juga lampu hijau. Sehingga yang dari selatan tidak bisa ke timur. Begitu juga yang dari utara kesulitan ke barat. Ntah siapa yang mendesain traffic light seperti ini. Karena tolol, atau ada pertimbangan lain? Saya juga tidak punya jawaban pasti. Hal-hal seperti ini tidak pernah saya temui di Jawa, terutama di Jogja.

Lampu merah artinya berani.

Kasus lalu lintas lain, di Medan ini lampu merah artinya berani, bukan berhenti. Sehingga banyak yang melanggar lampu merah. Lampu merah saja dilanggar, apalagi berhenti di belakang garis? Berhenti saat lampu merah, malah dimarahi dari belakang.

Tidak seperti di Jogja yang kalau belok kiri maka ada tulisan “Kiri Langsung”, dan kalau harus ikuti tanda di lampu juga ada tulisannya. Tapi di Medan tidak ada (setidaknya jalan-jalan yang saya lewati). Jadi bingung, seharusnya berhenti atau langsung. Saya yakin pemerintah setempat tidak ada ilmu tentang UX.

Di Jogja, yang saya rasakan, pengemudi cenderung memberi. Misalnya kita lurus, ada kendaraan lain mau belok, maka kendaraan yang mau belok akan memberi jalan ke yang lurus. Di Medan, hadehh… gak mau ngalah. Jadi lebih banyak beristigfar.

Tanggal 14 Agustus, saya ke acara resepsi pernikahan sepupu di Hotel Emerald. Saat dipersilahkan makan, saya lagi-lagi beristigfar. Orang-orang mencari makan, seakan-akan gak pernah makan. Bisa-bisanya tamu datang ke belakang stand makanan, ngambil makanan sendiri. Baru kali ini saya lihat seperti itu. Saya yang sudah mengantri dan sudah di posisi paling depan diserobot juga. Akhirnya saya lebih memilih untuk mundur dari kumpulan orang bar bar.

Seperti di alam liar.

Setelah itu cerita dengan sepupu, dua dari Jakarta dan satu dari Medan. Tanggapanannya serupa. Yang dari Jakarta cerita, pas ngambil makanan tadi seperti di alam liar. Yang dari Medan bilang di sini harus keras. Sayapun bengong. Seliar apa orang-orang di Medan ini sampai makanan pun berebut kayak gak pernah makan makanan seperti sate padang, dim sum, bakso, nasi?

Walaupun saya bermarga Nasution, tapi dari kecil gak di Medan. Jadi gak tau liarnya seperti apa. Tapi dengan adanya kejadian-kejadian seperti ini, dan bila frekuensinya cukup tinggi, mungkin saya akan menjadi sosok yang lebih religius.

Uncaught SecurityError: Tainted canvases may not be exported

Today, I play with HTML5 canvas to load an image from a URL, then convert it to dataURL. Here a piece of my JavaScript ES6 code

const image = new Image()
const canvas = document.createElement('canvas')
let dataURL

image.onload = () => {
  canvas.getContext('2d').drawImage(image, 0, 0)
  dataURL = canvas.toDataURL()
}

image.src = 'http://placehold.it/300'

But when I run the code, I got this error message

Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

That’s happen because of CORS. The solution is so simple. Just add crossOrigin="Anonymous" attribute to HTMLImageElement (image object), like so

const image = new Image()
const canvas = document.createElement('canvas')
let dataURL

image.crossOrigin = 'Anonymous'

image.onload = () => {
  canvas.getContext('2d').drawImage(image, 0, 0)
  dataURL = canvas.toDataURL()
}

image.src = 'http://placehold.it/300'

The problem solved.

References:

Vim tidak bisa jalan karena versi libruby tidak sesuai

Ceritanya dapat koneksi bagus pas main ke Gongshin. Langsung upgrade semuanya, dari Mac AppStore, brew, composer, npm, dll, sampai ruby gem.

Keesokan harinya saat buka vim, dapat error seperti ini

dyld: Library not loaded: /usr/local/opt/ruby/lib/libruby.2.3.0.dylib
 Referenced from: /usr/local/bin/vim
 Reason: Incompatible library version: vim requires version 2.3.1 or later, but libruby.2.3.0.dylib provides version 2.3.0
[1] 33234 trace trap vim

Error-nya sih sudah jelas. Tapi tetep cari solusinya di internet. Ternyata tidak ada yang memuaskan.

Tanya di facebook group Vim Indonesia, malah di-like. Saya heran juga, kenapa di-like? 😕 Apa dia senang kalau saya kesulitan? Apa dia suka melihat vim tidak bisa jalan? Atau dia suka dengan error? Ntahlah…

Saat coba brew reinstall ruby, katanya sudah terinstall 2.3.1. Akhirnya saya coba telusuri sana-sini, dan menemukan /usr/local/Cellar/ruby/ mengandung dua versi, yaitu 2.3.0 dan 2.3.1.

Saya coba remove ruby

brew remove ruby

Lalu dapat message

Uninstalling /usr/local/Cellar/ruby/2.3.0... (1,260 files, 19.0M)
ruby 2.3.1 is still installed.
Remove them all with `brew uninstall --force ruby`.

Aha! Berarti aman sudah ini. Tinggal di-link saja dengan brew link ruby.

Tada!! Vim sudah bisa dijalankan kembali.😀

How to use Illuminate/Validation outside of Laravel

How to use Illuminate/Validation outside of Laravel

Ok, judulnya english, tapi isinya Indonesia.😐

Kebetulan hari ini ada pertanyaan di Facebook Group Laravel Indonesia tentang bagaimana cara menggunakan Validator-nya Laravel tapi bukan di dalam project Laravel?

Ini dia enaknya Laravel, kita bisa menggunakan component-nya di luar Laravel itu sendiri. Ngg… sebenernya bukan cuma Laravel sih. Symfony, ZF, CakePHP, Aura, dll juga bisa digunakan component-nya di luar framework-nya sendiri. Mungkin pengecualian untuk Yii. Component di Yii terlalu terikat dengan framework-nya. Sehingga sangat sulit menggunakan component di Yii tanpa Yii.😐 Itu salah satu alasan saya kurang suka Yii. Karena nggak mau berbagi dengan komunitas PHP secara keseluruhan.

Ok, kembali ke topik utama. Saya anggap kita bikin project from scratch. Pertama bikin folder project, setelah itu gunakan composer init untuk generate file composer.json

Ambil illuminate/validation dengan composer require illuminate/validation.

Buat file baru index.php dan load composer autoloader.

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

Kalau kita lihat di vendor/Illuminate/Validation/, ada file Factory.php. Factory adalah istilah yang umum digunakan untuk membuat suatu object.

Tambahkan code berikut.

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

$validator = new Illuminate\Validation\Factory();

Hmm, untuk membuat Validation\Factory kita membutuhkan Translator dari Symfony. Ini digunakan untuk menentukan error message dalam bahasa apa. Jadi kita tambahkan Symfony Translator

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

$trans = new Symfony\Component\Translation\Translator($locale = 'en');
$validator = new Illuminate\Validation\Factory($trans);

Nah, sekarang $validator sudah bisa digunakan😀 Mari kita coba

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

$trans = new Symfony\Component\Translation\Translator($locale = 'en');
$validator = new Illuminate\Validation\Factory($trans);

$validation = $validator->make([
  'name' => ''
  'email' => 'hello'
],[
  'name' => 'required'
  'email' => 'required|email'
]);

var_dump($validation->fails()); // Seharusnya true

Ok, that’s it😀 Selamat bereksperimen! Kalau ada pertanyaan, jangan ditanyakan.😐