macOS Change the Default Save Location of Screenshots

MacOS have a built-in screenshot feature which can be used right off the bat. This feature is an important one which I previously never met in Windows environment. It’s so helpful to chat and give instant example of my screen.

However, I took screenshots often, so it started to pile up on my desktop. Something I’m not very fond about. Fortunately, I can set up a dedicated folder for them and have them automatically save there. This can be done with a simple Terminal command

First, I create a dedicated screenshots folder via Finder.

Create Screenshots Folder

Open Terminal, and fire these commands. Don’t forget to change the path on the first command. The easy way rather than typing the path by yourself is by dragging the newly created screenshots folder into the Terminal, after you type

defaults write location /Users/username/Pictures/Screenshots
killall SystemUIServer

The first command, sets the screenshot location to defined path, and the seconds restarts the SystemUIServer so the alteration can be recognized instantly by system.

Nginx Block Countries Using GeoIP Modules

Nginx block countries using GeoIP modules. Fortunately using EasyEngine installation, nginx is already installed with -with-http_geoip_module option. You can check with this command

nginx -V 2>&1 | grep -- 'http_geoip_module'

The IP database is also already downloaded on /usr/share/GeoIP/GeoIP.dat

1. Map and Declare $allowed_country Variable

This means the only steps we need to do is create a conf file inside /etc/nginx/conf.d/ directory. For a reminder, creating a conf file inside the conf.d directory will be auto-included from nginx.conf file. The configuration content below is meant to be put inside http block. Let’s name it badcountries.conf.

geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
    default yes;
    CN no;
    ID no;
    IN no;
    RU no;
geo $exclusions {
    default 0; 1;

2. Check $allowed_country Variable with Active IP Visitor

Next step is check the $allowed_country variable against the current visitor’s IP address. Put this code inside server block.

if ($allowed_country = "no") { 
  return 444; 

Restart nginx after editing is done.

service nginx restart

Now, every visitors coming from countries you defined as no inside badcountries.conf will be served with 444 error code.

For the list of ISO 3166 country codes you can put inside badcountries.conf file, follow this link.

Brew Install PHP Redis on MacOS High Sierra 10.13

After upgrading to MacOS High Sierra (or any upgrade process previously), first thing I need to check is the local webserver status: apache, php, redis, mysql. Brew install php redis. Thankfully, MacOS High Sierra is now shipped with PHP 7.1 installed, which met the new standard for my future web developments.

PHP-redis is a must-installed library since I love the MySQL + Redis tandem for handling data storage and requests. Of course, along with the newly upgraded OS, the Apache installation in fresh installed with standard “It works!” welcome page.

Now, into the installation steps.

1. Install php71-redis Library

Easier said, I simply shot brew install php71-redis into Terminal and then served with Error, suggesting that I need to install Xcode Command Line Tools.

xcode-select --install

2. Unlink Previous PHP 5.6 Libraries

I tried to install again the library, but another error came along. It said the installed formulae was conflicting: different php versions install the same binaries. It suggested me to unlink all php 5.6 libraries. Ok then..

brew unlink php56

3. Install php71-redis (Again)

Hopefully this attempt for installing php71-redis library was a successful one.

brew install php71-redis

brew install php redis php7.1 macos high sierra

4. Edit php.ini; Include php71-redis Extension

Edit /etc/php.ini, add the extension as follows. If the php.ini file not exist, copy the php.ini~previous. Don’t forget to include the igbinary extensions too, so you won’t get problem my previous php56-redis module not loaded here.

5. Restart Apache

Final steps

sudo apachectl restart

dyld: Library not Loaded MacOS High Sierra

MacOS High Sierra problem when executing php command through terminal. Problem? An error stating dyld library not loaded.

dyld: Library not loaded: /usr/local/opt/jpeg/lib/libjpeg.9.dylib
Referenced from: /usr/local/bin/php
Reason: image not found
Abort trap: 6

According to this stackoverflow post, I need to uninstall current version of libjpeg. Use --ignore-dependencies to force uninstallation since libjpeg is needed by other library dependencies.

brew uninstall libjpeg --ignore-dependencies

Reinstall with: brew install libjpeg

dyld library not loaded /usr/local/opt/jpeg/lib/libjpeg.9.dylib

The command will produce warning since latest version of libjpeg has already installed Warning: jpeg 9b is already installed, it's just not linked.

Simply we can shoot brew link jpeg command into Terminal, and all our problem should be solved.

php56-redis Module Not Loaded in PHP-CGI macOS Sierra

After macOS Sierra 10.12.6 Update, my php56-redis module is not working, causing some of my PHP applications cannot communicate with Redis as storage engine. My confusion raises when the module is loaded in PHP-CLI but not in PHP-CGI. It means, if I type php -m in command line, redis shows up. But, if I access via browser via phpinfo(); nothing says about redis.

I googled for nearly two days, until I realized that I haven’t look for a file which I should investigate the first time any errors occured in PHP: error_log. In macOS, the logs are located in /var/log/apache2/ so the file is located on /var/log/apache2/error_log.

I open the file via Sublime and then voila … Here comes the essential hint.

PHP Warning:  Cannot load module 'redis' because required module 'igbinary' is not loaded in Unknown on line 0

I remember that I never typed any of these igbinary module in php.ini, so this is new case for me. Maybe after macOS Sierra last update, the module is not loaded automatically.

php56-redis Module Must Be Defined Manually in php.ini

I’m sure I have this igbinary module installed, however I try to install it again via Homebrew. Of course, it results in error message homebrew/php/php56-igbinary 2.0.4 already installed. This means the binary has been installed within the modules directory, all I need to do is define its inclusion within the php.ini file.

php56-redis module: php56-igbinary extension must be loaded manually within php.ini

I add one line statement right before the php56-redis module extension.


Restart apache, then everything just back to normal, like the good ol’ days.

Tips Mengakali Telkom Ads Injection Script

Seperti yang digerutukan oleh Raymond Reddington dalam artikelnya di medium TELKOM Indonesia Secretly Injects Advertisements, Telkom ads memang sejak lama melakukan praktik ini. Yang dirugikan tentu pengguna layanan IndiHOME (dulu Speedy) yang notabene sudah membayar harga yang tidak murah untuk mendapatkan layanan internet bulanan.

Sebelum menggunakan IndiHOME, saya menggunakan provider XL yang juga sama curangnya: menginjeksi iklan ke dalam halaman web yang saya akses. Lebih parah, XL tidak hanya injeksi script tapi juga iframing website yang mengakibatkan gagal berfungsinya website yang menolak diakses dalam iframe. Sebagai contoh, jika saya menggunakan XL untuk mengakses situs Histats, maka saya tidak akan pernah bisa login karena akan terus redirect oleh sebab cookie yang ada tidak terbaca karena kondisi site yang diakses dalam sebuah iframe.

Mau tahu caranya akali Telkom ads? Baca selengkapnya

MySQL Cannot Connect to MySQL 4.1+ Using the Old Insecure Authentication

Install phpMyAdmin di localhost AppServ namun kemudian tidak bisa diakses karena alasan old password? Begini caranya

Database connection failed: mysqlnd cannot connect to MySQL 4.1+ using the old
insecure authentication. Please use an administration tool to reset your
password with the command SET PASSWORD = PASSWORD(‘your_existing_password’).

login via Run -> cmd
login ke mysql dgn user root

SET old_passwords = 0;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD ('admin');
SET PASSWORD FOR 'root'@'' = PASSWORD ('admin');