Vim with Dvorak keymap

Vim with Dvorak keymap

Akhirnya ada yang nanya tentang Vim dan Dvorak, jadi ada topik. :3

Jika anda menggunakan Vim dengan keyboard layout Dvorak, bukan berarti anda harus mengganti semua tombol menjadi Dvorak. Anda bisa menggunakan Dvorak hanya pada saat mengetik (insert mode), dan tetap menggunakan Qwerty di normal/visual mode. Jadi posisi tombol HJKL tetap berurutan di DHTN, tidak terpecar-pencar. Ini mirip dengan Dvorak-Qwerty yang pernah saya bahas.

Mau? Lha, trus caranya supaya bisa gitu gimana?

Gampang sekali. Buka vim anda, lalu ketik :set keymap=dvorak. Well done. Sekarang anda bisa menggunakan Qwerty di normal/visual mode, dan Dvorak di insert mode.

Kalau mau permanent, tambahkan saja command tadi ke ~/.vimrc.

Bagi yang ingin tau lebih lanjut, sebenernya Vim menyimpan dvorak keymap ini pada /usr/share/vim/vim80/keymap/dvorak.vim.

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
fish
flow
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
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

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: