Catatan brew packages yang harus saya install

Post ini juga untuk catatan pribadi, simpen di GitHub Gist nggak ada fitur search. T_T Jadi di sini aja. Akan di-update secara berkala.

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 --with-default-names \
fish \
flow \
fontconfig \
freetype \
fzf \
gawk \
gd \
gdbm \
gettext \
gflags \
git \
git-extras \
git-ftp \
glog \
gmp \
gnu-indent --with-default-names \
gnu-sed --with-default-names \
gnu-tar --with-default-names \
gnu-time --with-default-names \
gnu-which --with-default-names \
gnupg \
gnupg2 \
gnutls \
go \
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 \
mackup \
mas \
mcrypt \
md5sha1sum \
memcached \
mhash \
mpfr \
mycli \
mysql \
nano \
ncurses \
nettle \
nginx \
node \
ocaml \
ocamlbuild \
oniguruma \
openssh \
openssl \
openssl@1.1 \
ossp-uuid \
pcre \
pcre2 \
perl \
phantomjs \
php-version \
php71 \
php71-apcu \
php71-event \
php71-intl \
php71-mcrypt \
php71-pcntl \
php71-redis \
php71-ssh2 \
php71-stats \
php71-swoole \
php71-uuid \
php71-xdebug \
php71-yaml \
pinentry \
pkg-config \
prettyping \
pth \
python \
python3 \
ranger \
readline \
redis \
rsync \
ruby \
safe-rm \
selenium-server-standalone \
speedtest_cli \
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

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. ­čśÉ