Posts

Showing posts from April, 2017

Tentang Caching di Django

Sedikit cerita tentang cache backend, saya menggunakan redis  sebagai default cache backend di django, ini juga berarti redis saya gunakan untuk: fungsi decorator cache_page cache query database dependensi python-rq dependensi django-cachalot Kejadian server bolak-balik mati karena service redis gagal terhubung, akhirnya saya ubah redis hanya untuk dependensi python-rq saja, selainnya saya menggunakan memcached. Dan untuk sementara problem error connection di redis teratasi. [UPDATE] : Sampai saat ini, kurang lebih 12 jam sejak beralih dari redis ke memcached, problem redis error connection ndak muncul, semoga terus anteng si server.

Redis Bikin Panik

Semalaman jaga lilin karena server bolak-balik mati, setelah diinvestigasi, karena redis service mati, error connection. Perlu diketahui, redis ini merupakan backend default cache dari aplikasi django yang saya buat (baik untuk cache_page maupun dependensi untuk library python-rq), akhirnya gerak cepat untuk mengganti redis dengan memcached untuk fungsi decorator cache_page saja. sudo apt-get install memcached pip install python-memcached Redis tetap saya gunakan karena terkait dengan python-rq yang memang saya perlukan. Sehingga untuk cache_page sekarang saya pakai memcached. Let's see how this combination will perform...

Mahalnya Django-HTMLmin

Awalnya berniat untuk memperkecil ukuran html dengan menghapus baris-baris kosong yang tidak perlu, namun ternyata ada harga yang harus dibayar, yakni respon server menjadi lambat, dan akhirnya... pip uninstall django-htmlmin pip freeze > requirements.txt Setelah di-uninstall, load CPU server turun hampir separonya...

Setup Vagrant Nginx Django uwsgi di Localhost

Karena versi OS local tidak selalu sama dengan yang di server, maka kadang saya ingin menyamakan environment OS dengan yang di server, disinilah vagrant banyak berperan. Asumsinya Anda sudah punya punya vagrant, nginx, django project beserta dengan uwsgi. Mari kita mulai..

Disable Parameter PageSpeed=noscript

Ah, ternyata setelah muter-muter, men-disable fitur ini cukup dengan menambahkan baris berikut di nginx.conf: pagespeed SupportNoScriptEnabled false;

Membuat Custom Middleware di Django 1.8 dan 1.10.5

Apa fungsi middleware? Banyak, salah satunya adalah melakukan sesuatu sebelum atau sesudah request di jalankan. Pada salah satu project, saya ingin me-redirect semua request yang di URL mengandung parameter 'PageSpeed' ke halaman itu juga namun parameter 'PageSpeed' dihilangkan. Bingung ya? Begini contohnya:

Cara Mengambil Screenshot di Macos

Ada 3 perintah yang sering saya gunakan untuk mengambil tangkapan layar (screenshot) di macos, yakni: Shift+Command+3 : screenshot seluruh layar Shift+Command+4 : screenshot custom area Shift+Command+4 Space : screenshot current window

Custom Bash Prompt di Byobu Macos

Image
Custom bash prompt gak jalan di byobu macos? Sederhananya, byobu mencari file .bashrc, namun karena di macos tidak tersedia secara default, Anda dapat meng-copy file .bash_profile ke .bashrc, kemudian jalankan ulang byobu.

Optimasi Gambar PNG dengan pngquant

Beberapa alternatif command line tool untuk compress gambar png diantaranya pngcrush, optipng dan pngquant dan mungkin ada lagi yang saya belum pernah coba. Di antara ketiganya yang menghasilkan kualitas kompresi paling bagus adalah pngquant. Dari situs resminya disebutkan kalau pngquant bisa compress png sampai 70%. Mau coba?

Download File Dari Server Menggunakan scp

scp (secure cp), salah satu command line tool untuk transfer secara aman antara localhost dengan server atau antar server. Berikut ini contoh perintah untuk mengunduh file dari server:

Byobu Auto Start Ketika Membuka Terminal

Image
Saya tidak terlalu suka dengan visible tab, saya lebih suka dengan invisible tab, seperti halnya konsep buffer di emacs, atau setidaknya meski ada tab tapi tidak terlalu mencolok berjejer di bagian atas window. Begitu juga dengan gnome-terminal, jika kita membuka tab baru maka tampilannya menjadi kurang cantik.

Tentang Query Random

Sebenarnya tema optimasi ini tidak terbatas pada python/django aja sih, bisa bahasa apa pun. Kadangkala dalam sebuah project kita butuh untuk menampilkan data secara random, entah itu random user, random post maupun random-random lainnya. Jika data masih sedikit (< 50k rows) mungkin tidak terlalu masalah, namun akan menjadi masalah kalau data sudah di atas 50.000 baris dengan model relasi yang cukup kompleks. Bagaimana cara yang efisien?

Cara Setting Nginx FastCGI Cache

Untuk sementara referensi saja ya... Jangan kuatir, ini works kok, cuma lum sempat nulis versi Indonesia nya saja... How to Setup FastCGI Caching with Nginx on your VPS

Cara Compile Nginx Dari Source

Kenapa harus compile dari source? Karena ada modul yang tidak disertakan dalam repo Ubuntu, seperti modul mod_pagespeed. Langsung saja berikut ini langkah-langkah compile nginx dari source beserta 2 dynamic module, yakni nginx image-filter dan mod_pagespeed.

Memasang Vagrant di Ubuntu 16.04 64bit

Prasyarat: Virtualbox Vagrant Setelah keduanya terpasang, sekarang waktunya menambahkan box, semacam kontainer untuk sistem operasi yang akan kita pasang.

[macos] Berpindah Antar Window Dalam Satu App

Kalau berpindah antar window app mungkin sudah banyak yang tahu (Command + Tab), bagaimana dengan berpindah antar window dalam satu app? Misal saya membuka 2 window perambah chrome, satu window reguler, dan satunya window dalam mode incognito, maka untuk berpindah antar window chrome tersebut, cukup tekan: Command + ` Mengingatnya mudah saja, cukup cari tombol di atas Tab. Syaratnya window jangan di-minimize lho yaaa...

Mudah Membuat https Dengan Cloudflare

Image
Ini juga salah satu isu yang lagi hot di dunia SEO, karena Google memandang lebih terhadap web yang mendukung https. Bagaimana cara settingnya? Menurut saya, ada 2 cara, yakni cara mudah (auto) dan cara manual (agak susah) . Cara yang mudah adalah memanfaatkan Cloudflare, tentunya setelah kita menggunakan DNS dari Cloudflare. Berikut ini langkah-langkahnya:

Hal-hal di Google Webmaster Tools Yang Pantas Diperhatikan

Saya sendiri kadang memandang GWT hanya sebatas urusan submit sitemap terus selesai. Kebiasaan ini mungkin berlaku kalau kita menggunakan CMS atau script yang tidak nganeh-nganeh, tapi kalau sudah develop custom engine, kadang kita sendiri tidak bisa menduga URL apa saja yang sudah diindeks oleh Google. Kadang saya sendiri bahkan tidak membayangkan ada URL tersebut.

Hati-hati Dengan PageSpeed URL Params

Image
By default, pagespeed akan menambahkan url param ?PageSpeed di setiap URL yang dioptimasi, jika tidak ditangani segera, ini akan berakibat kontra-produktif terhadap SEO, karena akan muncul duplicate content. Untuk mengatasi, kita manfaatkan GWT, beri tahu Google kalau URL dengan params tersebut tidak mengubah isi konten yang kita miliki.

Cloudflare Untuk Menghemat Bandwidth dan Resource Server

Image
Berikut ini hasil dari tangkapan layar analytics requests ke salah satu website yang menggunakan cloudflare. Dan berapa penghematan gara-gara cloudflare? Dan ini hanya paket free lho... Lumayan ya?

Gunakan git alias Untuk Produktivitas Yang Lebih Baik

Berikut ini beberapa git alias yang saya gunakan: git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit git config --global alias.st status Reference: git-scm

Manajemen Django Settings dengan Paket python-decouple

Sebelumnya, saya menggunakan local_settings.py untuk membedakan settings lokal dan server, namun ternyata masih ada cara lain yang lebih efisien, yakni dengan membuat berkas plain text yang berisi config penting dan dipanggil menggunakan paket python-decouple.

Menambahkan Domain ke nginx

Berikut contoh konfigurasi /etc/nginx/sites-available/default server { listen 80 ; server_name www.example.com ; location / { try_files $uri @app ; } location @app { include uwsgi_params ; uwsgi_pass unix:/tmp/uwsgi.sock ; } }

Setup uwsgi

Berikut ini perintah uwsgi yang biasa saya gunakan: /home/kholidfu/quotely/bin/uwsgi \ --socket /tmp/uwsgi.sock --http :8000 \ --chdir /home/kholidfu/quotely/quotely/ \ --module quotely.wsgi \ --env DJANGO_SETTINGS_MODULE=quotely.settings \ --virtualenv /home/kholidfu/quotely \ --chmod-socket=666 --master \ --pidfile=/tmp/project-master.pid --harakiri=20 \ --max-requests=5000 --vacuum --home=/home/kholidfu/quotely/ \ --processes=2

Setup Server Untuk Deployment Proyek Django

Berikut ini setup server Ubuntu 16.04 yang biasa saya lakukan sebelum deploy proyek Django. $ ssh root@1.2.3.4 # adduser kholidfu # adduser kholidfu sudo # apt update && sudo apt-get upgrade -y # apt install build-essential python-dev python-pip python3 # apt install emacs24-nox git Setting locale # edit /etc/default/locale LC_ALL= " en_US.UTF-8 " LANG= " en_US.UTF-8 " LANGUAGE= " en_US.UTF-8 " Logout dari server, kemudian login lagi untuk mencoba user baru (kholidfu) yang baru dibuat. $ ssh kholidfu@1.2.3.4 $ sudo pip install virtualenv $ sudo pip install setuptools $ sudo pip install supervisor Setelah itu, lakukan git clone dan buat virtualenv. $ git clone https://github.com/kholidfu/gitreponame $ cd gitreponame $ virtualenv -p python3 . $ . bin/activate $ pip install -r requirements.txt Note: Dokumentasi ini sifatnya work in progress , akan diupdate sesuai kebutuhan.    

Memasang Django-Grappelli

Bosan dengan tampilan default dari django-admin? Gunakan django-grappelli. https://django-grappelli.readthedocs.io/en/latest/index.html Drawbacks: fungsi prepulated_fields untuk slug tidak jalan, terpaksa harus menggunakan cara manual dengan meng-override fungsi save di models.py. Contoh: from django.db import Models from django.template.defaultfilters import slugify from django.utils.translation import ugettext_lazy as _ class Rumah(models.Model): """Rumah models.""" judul_iklan = models.CharField( max_length=255, help_text=_('Masukkan judul iklan') ) judul_iklan_slug = models.SlugField( help_text=_('Otomatis terisi, biarkan saja') ) def save(self, *args, **kwargs): # override save for judul_iklan_slug field self.judul_iklan_slug = slugify(self.judul_iklan) super(Rumah, self).save(*args, **kwargs)  

Reset Django DB - PostgreSQL

Ketika sedang development, kadang Anda ingin untuk mereset semua database berikut dengan semua berkas-berkas migrasi. Berikut ini contoh untuk melakukan reset di django dengan database engine postgresql:

Optimasi Django-Admin

Rules: Jangan terlalu banyak memunculkan relasi di halaman add/edit Gunakan list_select_related di list view Gunakan readonly_fields untuk relasi Drawbacks : Limitasi di atas dapat mengganggu proses penambahan data, karena kita tidak bisa memilih data-data relasi. References: https://medium.com/@hakibenita/things-you-must-know-about-django-admin-as-your-app-gets-bigger-6be0b0ee9614 https://blog.ionelmc.ro/2012/01/19/tweaks-for-making-django-admin-faster/

Optimasi Kecepatan Website Dengan django-htmlmin

Salah satu teknik optimasi lain adalah dengan me-minify html. Kalau minify css dan javascript sudah bisa diatasi oleh mod_pagespeed, kalau html membutuhkan paket django tersendiri, salah satunya adalah django-htmlmin. https://github.com/cobrateam/django-htmlmin [UPDATE on 3 Mei 2017] Library ini cukup menguras resource server, jadi gunakan dengan bijak.

Mengaktifkan gzip Compression di nginx

Salah satu teknik optimasi kecepatan lainnya adalah dengan membuat web kita mendukung gzip compression, caranya dengan menambahkan baris berikut di nginx.conf Anda: gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_min_length 256; gzip_types text/plain text/css application/json application/x-javascript application/javascript \ text/xml application/xml application/xml+rss text/javascript; GZIP TEST: https://www.giftofspeed.com/gzip-test/

Install nginx dengan mod-pagespeed dan mengaktifkan kompresi js dan css

Salah satu parameter penilaian sebuah website adalah dari sisi kecepatan akses yang ditentukan oleh 2 faktor utama, faktor dari backend dan frontend. Dari faktor backend contohnya adalah request ke database, dari sisi frontend contohnya adalah optimasi image, minify css, js, dan banyak hal lagi.

GIT Tips

git push origin secara default akan push ke branch remote sesuai dengan branch yang aktif di local saat ini.

Mudah Deteksi User-Agent Mobile di Django

Saya menggunakan package django-mobile untuk memudahkan deteksi user-agent visitor. Hanya dengan menambahkan {% if flavour == 'mobile' %} {% endif %} atau 'full' untuk visitor dengan desktop browser {% if flavour == 'full' %} {% endif %} Membuat halaman dinamis sesuai dengan ukuran layar visitor menjadi mudah.

Membuat Table Menjadi Responsive Secara Mudah

Salah satu kendala ketika berhadapan dengan tabel adalah tampilan yang tidak mobile-friendly, terutama jika tabel berisi banyak kolom. Meski Anda sudah menggunakan Bootstrap template pun, kendala ini masih muncul. Solusinya?

Aplikasi Django dengan Satu File

Meski bukan termasuk micro-framework, untuk project sederhana, aplikasi Django dapat kita buat hanya dengan satu file saja. Tanpa perintah startproject dan startapp. $ virtualenv dj-single $ cd dj-single $ pip install django $ emacs hello.py Isikan berkas dengan kode berikut: