Posts

Showing posts from March, 2017

robots.txt via nginx

Sebagai sebuah file statis, memang sudah seharusnya file robots.txt ditangani oleh nginx, berikut ini salah satu contoh config-nya: /etc/nginx/sites-available/default location /robots.txt { alias /home/kholidfu/path/to/your/robots.txt; }

Optimasi Database di Django Menggunakan Query select_related

Bandingkan 2 query ini: Query 1: data = Quote.objects.filter(published=True).order_by('-modified') Query 2: data = Quote.objects.select_related('author').filter(published=True).order_by('-modified')

Cara Menghapus (Invalidate) page_cache django

Caching di django sungguh mudah, tinggal import fungsi decorator page_cache, tambahkan di view yang mau kita cache, dan bamm, selesai, halaman kita sekarang sudah masuk cache. Masalah muncul karena kadang kita ingin halaman ini kita invalidate, misal karena ada comment baru, ada update terbaru di halaman tersebut. Bagaimana cara invalidate page_cache?

Jangan Lupakan django-debug-toolbar

Query hampir bisa dipastikan selalu ada di setiap aplikasi web, dari mulai query sederhana sampai ke query kompleks yang melibatkan data ratusan ribu bahkan mungkin hingga jutaan. Kalau tidak berhati-hati, desain aplikasi yang sudah bagus akan percuma kalau dalam query kita berat dikarenakan tidak efisien.

Install PostgreSQL dan Memcached di MacOS

Menggunakan brew: brew install postgresql brew install memcached Jalankan service daemon brew services start postgresql brew services start memcached

Pencarian Full-Text di Django

Tambahkan baris berikut di settings.py, pada bagian INSTALLED_APPS INSTALLED_APPS = [ ... ... 'django.contrib.postgres', ... ] Kemudian ganti fungsi query yang biasanya menggunakan icontains dengan search, seperti dalam contoh berikut: >>> Quote.objects.filter(quote_text__search='love') Ini, contoh sederhana sih, query lebih lanjut silakan explore sesuai kebutuhan.

Custom Filter Query di Django Admin

Selain filter standar, django juga memberi kita kebebasan untuk membuat custom filter. Meski begitu, satu hal yang perlu diingat adalah fungsi query yang kita jalankan harus berbentuk object queryset. Dalam contoh ini, saya ingin mengetahui berapa panjang karakter dari field quote_text yang ada di model Quote.

Resize Image secara Dinamis via nginx

Ada 2 cara memasang nginx, yang pertama menggunakan repo dari nginx sesuai dengan petunjuk di tautan berikut: http://nginx.org/en/linux_packages.html?_ga=1.7002802.1293912275.1489706695 Atau, Install modul extras di Ubuntu (menggunakan repo ubuntu): sudo apt install nginx-extras Tambahkan baris berikut di /etc/nginx/sites-available/default location ~ ^/img([0-9]+)(?:/(.*))?$ { alias /path/to/images/dir/$2; image_filter_buffer 10M; image_filter resize $1 -; } Restart nginx sudo service nginx restart Sekarang kita bisa mengubah ukuran gambar secara mudah hanya dengan menambahkan /imgxxx/ di depan path ke image asli, misal, path berikut berarti me-resize gambar ke ukuran 200: /img200/assets/image.png atau mengubah ke ukuran 75 /img75/assets/image.png Referensi: dzone

Optimasi nginx

optimasi buffers client_body_buffer_size 10K; client_header_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 2 1k; optimasi timeouts client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15; send_timeout 10; Gzip Compression (/etc/nginx/nginx.conf) Cukup hilangkan tanda # di file di atas. 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 text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon; Static File Caching location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { root /home/kholidfu/path/to/your/statics/; expires 365d; } Matikan access_log Hal ini biasa saya lakukan untuk web yang sudah agak settle, demi mengoptimalkan kinerja server, access_log biasanya saya nonaktifkan. acce

Pentingnya Slug Field

Berguna ketika kita ingin membuat URL dengan format /topic/topic-name/ Topic name biasanya diambil dari CharField, jika ingin dibuat URL, kita harus parsing manual supaya karakter-karakter non-alphanumeric hilang. Ada cara mudah dan elegan di django, yakni dengan memanfaatkan SlugField, yang secara otomatis akan menghilangkan karakter non-alphanumeric dari topic name.

Membuat Sitemap Sesuai Standar

Seperti yang sudah saya singgung dalam tulisan sebelumnya, agar bernilai valid dan dapat didaftarkan ke Google Webmaster Tools (GWT), sitemap harus memenuhi standar minimal penulisan. Untuk standar tanggal (lastmod) silakan mengacu ke tulisan saya sebelumnya. Hal ini adalah urutan tag tidak boleh terbalik, ada aturannya.

Format Tanggal di Sitemap Django

Meski biasanya dikerjakan di bagian akhir, sitemap ini penting lho guys, jika tidak valid ketika disubmit ke Google Webmaster Tools akan muncul error. Salah satu tag dari sitemap adalah lastmod, dimana nilainya adalah date. Dulu mengira kalau nilai ini berkaitan dengan last-modified header, yang berarti kapan terakhir website kita diperbarui, ternyata tidak, jadi untuk nilai lastmod ini tidak perlu sampai menunjukkan time, date saja sudah cukup.

Django Admin URL Sesuai Keinginan

By default, URL untuk admin di django adalah /admin/, namun kita dapat dengan mudah menggantinya di /myproject/myproject/urls.py, satu direktori dengan file settings.py. urlpatterns = [ url(r'^kemin/', admin.site.urls), ... ... ] Note: django versi 1.10

Redirect non-www ke www (atau sebaliknya) di nginx

Mesin pencari tidak suka dengan konten duplikat, dan bagi mereka, www dan non-www adalah dua entity yang berbeda, untuk menghindari penalti konten duplikat, disarankan untuk memilih satu saja, non-www atau yang versi www. Dalam contoh kali ini kita akan membahas cara redirect dari non-www ke www. Langkahnya adalah sebagai berikut:

Manajemen Settings di Django untuk Workflow yang Efisien

Di era workflow yang serba menggunakan git, sangat tidak lucu jika harus melakukan seremonial git (git push dan git pull) hanya untuk meng-update DEBUG=True ke DEBUG=False di file settings.py. Sementara beberapa baris di file ini sering berubah sesuai dengan kebutuhan konfigurasi aplikasi. Bagaimana solusinya? Ada banyak sebenarnya, mulai dari membuat file yaml, ini, env, namun yang paling mudah menurut saya adalah dengan membuat file local_settings.py pada direktori yang sama dengan direktori di mana file settings.py berada. Baris-baris kode di local_settings berfungsi untuk meng-override kode di settings.py. Untuk itu, tambahkan baris berikut di settings.py bagian PALING BAWAH :

Menggunakan Annotate di Django

Misal ada 2 model, dengan model relasi One-to-Many, Post dan Image. Satu Post punya banyak Image. Bagaimana kita dapat menghitung jumlah image di masing-masing post? Menggunakan annotate kita dapat melakukan query ini dengan satu langkah mudah.

Membuat Custom Filter di Django Admin

Secara default, django sudah menyertakan filter untuk field-field yang ada di Model, misal, kita punya field berikut: is_published = models.BooleanField(default=True) maka, secara otomatis, django admin akan membuat filter Is Published dengan nilai All, True, False. Tergantung kebutuhan, kadang dibutuhkan juga custom filter, misal untuk menghitung berapa jumlah Image di masing-masing Post, di mana Post dan Image memiliki model relasi One-To-Many. Caranya adalah sebagai berikut:

Contoh Konfigurasi Supervisor

Berikut ini contoh konfigurasi supervisor:

Konfigurasi PostgreSQL

Saya yakin, ada banyak contoh konfigurasi bertebaran di Internet, namun konfigurasi ini bagi saya termasuk sederhana dan working, kesampingkan dulu parameter performance dan security. Yang pertama  saya lakukan adalah mengubah sistem autentikasi default postgreSQL dari peer ke md5, kenapa? Untuk mempermudah dan biar terasa lebih familiar seperti mySQL.

Python - Mendapatkan Direktori Home

Salah satu task yang kemungkinan besar muncul dalam sebuah proyek adalah membuat path ke direktori home user. Bagaimana caranya di python? from os.path import expanduser homedir = expanduser("~")  

Dari Linux Mint ke Ubuntu Mate

Image
Kalau tidak salah, semenjak versi 5.10, Ubuntu selalu menjadi OS favorit di PC saya, dan ketika Ubuntu menggunakan Desktop Environment Unity, mulai terpikir untuk berganti distro karena Unity terlalu berat di PC saya saat itu. Pilihan akhirnya jatuh ke Linux Mint karena Cinnamon DE jauh lebih ringan dari Unity saat itu. Sejak itu (2014) sampai sekarang (2017) saya menjadi pengguna Linux Mint.

PostgreSQL - Instalasi dan Konfigurasi

Entah kenapa, saya lebih familiar mySQL dibanding dengan postgresql, mungkin karena faktor "kemudahan" dan pengguna yang relatif banyak, sehingga ketika stuck dengan masalah, kita dapat dengan mudah browsing referensi di internet atau phone a friend, hehehe.. Sekilas PostgreSQL Ada hal mendasar yang seringkali membuat bingung bagi pengguna pemula database postgresql, yakni sistem autentikasi. Kalau di mysql lazimnya kita mengenal auth dengan username dan password, jika keduanya cocok, kita dapat dengan mudah memulai proses manajemen dan manipulasi database.

Beberapa Hal Penting Ketika Deploy Django Project

Image
Setelah beberapa kali men-deploy aplikasi django, berikut ini beberapa hal penting yang harus diperhatikan:

First blog post

This is your very first post. Click the Edit link to modify or delete it, or start a new post . If you like, use this post to tell readers why you started this blog.