Posts

Showing posts from May, 2017

Solusi CSRF verification failed di Django

Masalah ini muncul ketika saya mengubah web server dari uwsgi ke gunicorn dan menggunakan proxy_pass di nginx, solusinya: Tambahkan baris berikut di nginx.conf: location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8000; # proxy_set_header X-Forwarded-Host $server_name; } Kemudian tambahkan baris berikut di settings.py: USE_X_FORWARDED_HOST = True Done!

Setup mysql di MacOS

Dengan menggunakan brew, mari kita install mysql di macos: brew install mysql Kemudian, jalankan service dengan: brew services start mysql Setelah itu, coba masuk ke mysql cli (by default tanpa password): mysql -uroot Jika tidak ada pesan kesalahan, berarti mysql sudah terpasang dengan benar di macos...

Mengiris List di Django Template

Aneh ya, mengiris, ini terjemahan bebas versi saya untuk kata "slice".. hehehe.. Bagaimana caranya? {% for keyword in keywords | slice :"10" %} {{ keyword }} {% endfor %} Atau, contoh lain, jika ingin dari urutan tertentu: {% for keyword in keywords|slice:"11:" %} {{ keyword }} {% endfor %} Siiip  

Akses Variabel Di Dalam tag include di Django Template

Bagaimana mengakses sebuah variabel di dalam tag include? Misal, contoh kode berikut tidak akan jalan, karena diidentifikasi sebagai string: {% include {{ TEMPLATE_DIR }}/home.html %} Bagaimana solusinya? Dengan menggunakan tag with, contohnya adalah sebagai berikut: {% with template_name = TEMPLATE_DIR | add : "/home.html" %} {% include "" | add : template_name %} {% endwith %}

Menambahkan Django Custom Template Filter Tanpa App

Bingung juga mau kasih judul, intinya sih aplikasi django saya ini tidak mengikuti pakem django-admin startproject maupun startapp, tapi hanya berupa 1 buah file tunggal, app.py. Kalau menggunakan startapp, untuk menambahkan custom filter cukup dengan membuat direktori templatetags yang isinya __init__.py dan module yang berisi dari custom filter kita. Nah, bagaimana kalau tanpa startapp?

Django + Nginx di Localhost

Prinsip utama yang harus dipahami adalah nginx disini menjadi proxy untuk port 8000 (port default django untuk dev), caranya dengan menambahkan di nginx.conf atau di sites-available/default baris berikut: server { listen 80; server_name localhost; location / { proxy_pass 127.0.0.1:8000; } } Setelah itu jalankan perintah ./manage.py runserver dan buka localhost di browser, sekarang nginx menjadi web server di local development Anda, kalau mau lebih yakin lagi, buka tools chrome inspect -> network -> Server, localhost dilayani oleh: Server : nginx/1.10.3 sedangkan URL localhost:8000 dilayani oleh: Server : WSGIServer/0.2 CPython/3.6.1 Selamat mencoba!

Fungsi count() Yang Lebih Efisien di Django

Bagaimana Anda mengetahui jumlah seluruh row dalam sebuah model? Masih menggunakan count()? Sebaiknya hentikan itu dari sekarang, karena query ini terkenal boros resource. Sebagai penggantinya, gunakan Max. Berikut contoh penggunaannya: from django.db.models import Max MyModel.objects.aggregate(Max('id'))['id__max'] Reference:  django aggregation

Membatasi Pencarian Pada Kolom Tertentu di Django

Ini salah satu tips untuk melakukan query secara lebih efisien dan cepat, dalam kasus ini membatasi pencarian hanya pada kolom tertentu yang kita butuhkan. Misal saya ingin mencari nilai kolom id dari model Collection, maka query yang saya lakukan adalah: from myapp.models import Collection ids = Collection.objects.filter(done=True).values('id')

Cara Setup nginx x-accel-redirect

Belum habis kagum dengan nginx pagespeed, barusan nemu salah satu fungsi lagi dari nginx untuk internal redirection. Contoh kasus penggunaan, kadang dalam sebuah proyek kita menyediakan file yang bisa diunduh oleh user, dan umumnya logic ini kita buat di level web app. Karena ini terkait dengan file, tentu dengan nginx kerja akan lebih efisien dan aplikasi web kita bisa bekerja untuk hal yang lain.

Format Tanggal RSS Feed di Django Template

Format tanggal di RSS Feed mengacu pada RFC5322 standart, dan berikut implementasi di django template: <pubDate> {{ d.created | date :"r" }} </pubDate> Referensi: Django built-in template tags and filter #date

MySQL - Melihat Character Set

show full columns from app_html;

3 Langkah Mudah SSH ke Server Tanpa Password

Semua langkah ini dikerjakan di komputer local. Langkah I: ssh-keygen Langkah II: ssh-copy-id -i ~/.ssh/id_rsa.pub kholidfu@remote-host Langkah III: ssh kholidfu@remote-host

Jangan Pernah Membiarkan Redis Terbuka

Sebenarnya sudah ada feeling ketika membuat tulisan  Redis Bikin Panik  ini, dan kemarin sudah tidak panik lagi, tapi pasrah... Pasrah karena server kena hack, diduga kuat karena redis yang dibiarkan blong2an tanpa auth. Seberapa parah? Data diangkut semua sama si hacker, nyaris tidak bersisa. Dan karena hampir tidak pernah backup, ya akhirnya pasrah aja, mulai dari awal. Kalau ada di antara pembaca memanfaatkan redis sebagai salah satu tools, tolong banget untuk mengaktifkan fitur auth-nya.

Optimasi Crawler Budget

Berdasar pengalaman, beberapa hal yang harus diperhatikan ketika mau melakukan optimasi crawler budget adalah: Pastikan server Anda sehat, silakan diuji dengan google page speed test, webpagetest atau gtmetrix. Perhatikan ke nilai TTFB. Struktur internal link yang bagus, tidak usah set nofollow, kecuali untuk halaman statis, misal about, contact, dsb. Kalau mau set blok crawler, lakukan lewat robots.txt Pastikan ada sitemap dan feed, kedua hal ini membantu crawler menemukan halaman yang ada di web Anda. Backlink yang berkualitas.

Tentang Priority di Sitemap

Jika pernah melihat berkas sitemap xml, maka di salah satu kolomnya ada yang bernama priority , yang nilainya antara 0.0 sampai 1.0? Apa arti dari nilai-nilai ini? Menurut sitemaps.org , nilai tersebut bermakna seberapa penting sebuah url dibanding dengan url lain bagi mesin pencari. Misal kita memiliki url tag dengan nilai 0.4 dan url single/detail dengan nilai 0.8, maka kita seolah-olah memberi tahu mesin pencari bahwa bobot url single lebih penting dari url tag. Demikianlah kira-kita penjelasannya.

Sitemap Django Lambat

Sitemap dengan isi cuma 7 ribuan URL kok lambat banget ya, akhirnya diakali dengan nginx, karena ini masih static file juga, biarin nginx aja yang kerja, dikombinasi dengan perintah wget via crontab 5 menit sekali mengunduh file yang asli, kemudian tambahkan location block yang baru di nginx. Hasilnya cuepet! location /index.xml { alias /home/kholidfu/path/to/index.xml; } perintah wget di crontab */5 * * * * wget https://example.com/sitemap.xml -O /home/kholidfu/path/to/index.xml Done  

Manfaat Ctrl+R di Bash

Sering utak-atik bash terminal? Berarti sering juga mengetik perintah yang sama berulang-ulang? Tidak ada salahnya juga sih, namun ada  kok cara yang efisien biar tidak mengetik perintah yang sama terus-menerus, yakni dengan memanfaatkan perintah Ctrl+R diikuti dengan penggalan kata dari perintah yang pernah kita tulis.

RSS, Sitemap dan Crawler

Barusan baca paragraf berikut di Official Google Webmaster Central: Sitemaps can be in XML sitemap , RSS , or Atom formats. The important difference between these formats is that XML sitemaps describe the whole set of URLs within a site, while RSS/Atom feeds describe recent changes. This has important implications: XML sitemaps are usually large; RSS/Atom feeds are small, containing only the most recent updates to your site. XML sitemaps are downloaded less frequently than RSS/Atom feeds. For optimal crawling, we recommend using both XML sitemaps and RSS/Atom feeds. XML sitemaps will give Google information about all of the pages on your site. RSS/Atom feeds will provide all updates on your site, helping Google to keep your content fresher in its index. Note that submitting sitemaps or feeds does not guarantee the indexing of those URLs. Ternyata untuk optimal crawling, Google merekomendasikan webmaster untuk menyediakan sitemap sekaligus RSS feeds. Sitemap untuk list semua URL, s

Deep Pagination SEO Problem

Keyword ini salah satu sering saya cari sekarang, karena ini menyangkut dengan salah satu web saya yang sampai saat ini masih mencari best practices untuk mengatasi masalah ini. Seperti di judul, 1 post bisa memiliki banyak halaman, bisa sampai ratusan, dan ini sepertinya bermasalah dengan crawling yang tidak bisa optimal.

Optimasi uwsgi

Setelah, nginx, django, sekarang kita optimalkan application server, dalam hal ini kita gunakan uwsgi, berikut referensi bagus tentang itu: Getting Every Microsecond Out of uWSGI

Monitor uwsgi dengan uwsgitop

Image
Untuk dapat menggunakan uwsgitop, tambahkan parameter --stats /tmp/stats.socket pada aplikasi uwsgi Anda. Untuk install:

Contoh nginx regex match URL

Contoh: location ~ ^/read/([0-9]+)/([0-9a-z-]+\.png$) { alias /home/kholidfu/awesome/image/$1/$2; } Pola regex akan cocok dengan URL berikut: /read/9999/some-awesome-image.png Dan nginx akan mencari image tersebut di direktori /home/kholidfu/awesome/image/9999/some-awesome-image.png OOT dikit, kenapa menggunakan directive alias bukan root? Jawabannya di sini Nginx — static file serving confusion with root & alias Selamat mencoba...

SSH Lambat Connect di Ubuntu Mate 16.04

Solusinya sunting berkas ini: sudo emacs /etc/ssh/ssh_config Ganti yes menjadi pada no bagian baris berikut: GSSAPIAuthentication no Sekian

Aturan Tentang Tautan Dofollow / Nofollow

Kapan kita harus melakukan dofollow, nofollow terhadap sebuah link? Berdasar yang saya pahami, hanya lakukan nofollow terhadap tautan internal yang tidak penting, seperti halaman about, contact, dan lain sebagainya. Juga, untuk tautan eksternal yang sifatnya kita tidak yakin bisa dipercaya maka lakukan nofollow.

Optimasi SEO Untuk Halaman Paginasi

Image
Menurut moz , beberapa hal yang patut dipertimbangkan dalam menampilkan halaman paginasi agar optimal SEO-nya adalah: Tampilkan di halaman paling atas, link ke post terbaru atau link bagian lain yang jauh lebih penting dari link paginasi. Tampilkan juga di halaman tersebut tautan ke halaman pertama dari paginasi. Tujuan dari kedua hal ini adalah untuk memberikan link-juice ke halaman-halaman penting dari sebuah situs.

Optimasi Django ala Pixabay

Yes, you heard it right, pixabay using django, dan ini ada artikel menarik tentang bagaimana mereka melakukan optimasi terhadap django Django Optimizations and Performance Tips from Pixabay Beberapa catatan dari pixabay: Pelajari teknik optimasi seperti yang disarankan django di dokumentasi resmi Selalu gunakan memcached Kecepatan cache view > cache template, jadi sebisa mungkin gunakan fungsi decorator cache_page Gunakan ujson > json

Tentang TTFB (Time To First Byte)

Image
Jika kita membaca artikel dari Google disini , kita akan dapati bahwa Google menyarankan waktu respon server kita jangan sampai lebih dari 200ms. Karena kecepatan situs merupakan salah satu parameter penilaian SEO, bisa jadi jika waktu respon server lebih dari 200ms akan berpengaruh terhadap posisi kita di mata mesin pencari (utamanya Google).

Mahalnya Query di Django Admin

Temanya yang mahal-mahal karena memang keadaan sedang dalam low budget, hehehe.. Tapi ini pelajaran penting sih, tampilan Django Admin yang menarik dan instan selalu menggoda diri untuk menjejalkan berbagai informasi di dalamnya, judul, pengarang, tanggal lahir, foto, kategori, tag, dan lain sebagainya.