Featured

Kitab Nginx

Nginx – sebuah aplikasi web server yang cepat dan multi-fungsi, saya sendiri sering memanfaatkan nginx untuk web server, http_image_filter, melayani statics file, optimasi kecepatan loading sebuah halaman, cache dan masih banyak lagi. Untuk itu pantas kiranya dibuatkan featured post tersendiri, biar lebih mudah dicari. Seperti biasa, tulisan ini juga bersifat continuously improved.

Continue reading “Kitab Nginx”

Advertisements

Server harus sering-sering ditengok

Awalnya sih tidak ada rasa curiga babarblas, karena memang ketika diakses, si website ya keliatan normal-normal saja. Dan semalam saya coba untuk upload sebuah file, dan hasilnya error 524 timeout (cloudflare). Dugaan saya langsung ke redis, karena memang beberapa saat terakhir ini yang sering bermasalah ada di redisnya.

Sudah coba restart, ternyata tidak ada masalah dengan redis, rqworker juga sudah direstart, bahkan timeout di rq_queues juga sudah ditambah, dari 360 ke 3600. Entaah kenapa, saya coba restart gunicorn dan gunicorn failed to start, katanya failed import module autocomplete_light, padahal si module itu ada di sana, nongkrong dengan manisnya.

Coba uninstall dan install, tetep saja, dan entah setelah restart gunicorn yang keberapa, kok tiba2 saja si aplikasi mau jalan lagi…. what the heck???

Membuat Pagination di Flask + MongoDB

Pertama, kita butuh flask extension yang bernama flask-paginate

https://pythonhosted.org/Flask-paginate/

Kemudian tambahkan baris berikut di route yang mau di-paginasi, misal search result:

from flask_paginate import Pagination, get_page_parameter

@app.route("/search/<keyword>")
def search(keyword):
	page = request.args.get(get_page_parameter(), type=int, default=1)
	per_page = 3
	offset = (page - 1) * per_page
	data = db.product.find({'$text': {'$search': keyword}}, {'score':
		{'$meta':
		'textScore'}}).sort([('score', {'$meta': 'textScore'})]).skip(offset).limit(per_page)

	pagination = Pagination(page=page,
		per_page=per_page,
		total=data.count(),
		css_framework='bootstrap3',
		search=False,
		record_name='products')

	keyword_title = keyword.replace('-', ' ').title()
	return render_template("search.html",
		keyword_title=keyword_title,
		data=data,
		pagination=pagination
	)

Selanjutnya di template search.html:

{% for i in data %}
<p>{{ i['title'] }}</p>
{% endfor %}

{{ pagination.info }}
{{ pagination.links }}

Langkah-langkahnya adalah:

  1. Menentukan per_page (limit di mongo)
  2. Menentukan offset (skip kalau di mongo)
  3. Membuat query ke mongo
  4. Membuat object paginasi
  5. Menampilkan data paginasi

Scraping Tokopedia Menggunakan Python Feedparser

Kali ini saya akan mencontohkan bagaimana kita bisa membuat scraper Tokopedia hanya dengan memanfaatkan Feed URL. Tokopedia memiliki Feed URL untuk setiap kategori yang mereka punya, sebagai contoh kategori Fashion Anak, URL nya adalah:

https://www.tokopedia.com/feed?sc=78

Dengan memanfaatkan library feedparser di Python, kita bisa dengan mudah melakukan scraping terhadap produk-produk terbaru dari Tokopedia. Berikut ini contoh kode-nya:

import feedparser
url = "https://www.tokopedia.com/feed?sc=78"
data = feedparser.parse(url)
data = data['entries']

# selanjutnya tinggal looping, misal kita ingin mendapatkan title:

for i in data:
    print(i['title'])

Jika ingin dikembangkan lagi, kita dapat menggabungkan kode di atas dengan web framework misal Flask atau Django, mongodb untuk menyimpan data, lakukan markup terhadap harga, dan BOOM! Jadilah sebuah aplikasi web dropship instan!!!

Preview Web Dropship Tokopedia Instan

Screen Shot 2017-08-09 at 12.25.04 PM

URL – Sebaiknya Relative atau Absolute?

What? Yah itulah kenyataan di dunia SEO, bagi engineer, penggunaan absolute URL tentu bukan best practices, kenapa? Karena tidak dinamis, jika kita mengganti nama domain, maka perlu penyesuaian di sana sini untuk bisa menyesuaikan dengan domain baru. Ini tentu berarti tambahan pekerjaan…

Tapi dari kacamata SEO, beda lagi… Best practice untuk SEO adalah menggunakan absolute URL, ini terkait dengan utamanya crawler budget. Silakan baca tautan berikut untuk penjelasan lebih lanjut…

Install supervisor – the right way

The right way ini maksudnya mirip-mirip best practice lah.. Yakni dengan tidak menggunakan super user (sudo), caranya bagaimana? Cukup tambahkan parameter –user ke perintah pip Anda…

$ pip install supervisor –user

Instalasi terletak di direktori home Anda

~/.local/bin/

Bagaimana jika meng-install sebagai super user? Tidak ada masalah sih, bisa aja, namun Anda harus tahu bahwa instalasi pip menggunakan sudo tidak disarankan dari sisi keamanan sebuah sistem.

Mudah Mengelola Long-running Processes dengan supervisor

Anda memiliki banyak long-running process dalam satu mesin? Misal running beberapa aplikasi django? Gunakan supervisorctl kalau Anda tidak ingin repot. Setelah terpasang dan konfigurasi berjalan dengan baik, mengelola banyak aplikasi menjadi mudah, cukup dengan reread, stop, start…

reread

Perintah ini untuk membaca ulang isi dari supervisord.conf

update

Perintah ini untuk menambahkan proses baru kedalam supervisord

start/stop

Perintah ini untuk memulai/menghentikan sebuah proses

status

Perintah ini untuk melihat status dari masing-masing proses yang kita miliki.