Aug 26 2011

nggumun

Sebenarnya lagi males posting, tapi setelah membaca salah satu berita di detik beberapa waktu lalu, pengen berpendapat juga.

http://www.detikinet.com/read/2011/08/23/130241/1709179/398/beli-ponsel-bekas-bonus-ratusan-pornografi

Apa yang kita lakukan jika hal itu terjadi pada kita? Jujur saya merasa kalah dengan bule itu.


Jun 27 2011

Facebook FBML W3C Invalid

Beberapa waktu yang lalu, ketika saya mencoba menambahkan facebook like / ‘fb like’, pada halaman web. Terjadi error ketika di validasi di http://validator.w3.org. Setelah browsing-browsing kesana kemari, akhirnya hal tersebut dapat diatasi dengan cara tag tersebut ditulis pada sebuah script javascript.

Berikut ini adalah contohnya.

function coba() {
	//fb:like ditaruh disini, biar validasi sukses
	var tombol = '<fb:like href="http://pujianto.net" '
	+ 'send="true" width="480"'
	+'show_faces="true" font="lucida grande"></fb:like>';

	//menulis var tombol tadi pada element yg ber id fesbuk
	return document.getElementById('fesbuk').innerHTML = tombol;
}

Untuk lebih, lengkapnya bisa dilihat di  http://tinypaste.com/f1815. Klik disini untuk cek validasi w3c, klik disini untuk melihat tampilannya.


Jun 22 2011

cron di appengine

Assalamualaikum Wr,wb.

Saat pilkada bupati kulon progo kemarin, coba cari info update hasil pemilihan suara di internet. akhirnya menemukan sebuah website tentang info pilkada tersebut. Dan update statistik hasilnya cukup up to date.

Kemudian kepikiran untuk membuat sebuah akun microblog (twitter), yang berisi update hasil pemilu. Kan kalo sewaktu-waktu ada update hasil pemilu sudah muncul sendiri di timeline saya, dan tidak perlu mengunjungi situs2 tersebut.

Jadi teringat, google appengine menyediakan layanan schedule task (sejenis cronjob), yang mana dalam interval waktu tertentu server akan mengeksekusi perintah yang kita inginkan. Tetapi muncul sedikit kendala, ketika program dideploy ke server google dan dijalankan, muncul DeadlineExceededError:   ApplicationError: 5. Ternyata hal tersebut diakibatkan ketika fetching content dari web yang kita baca, melebihi batas waktu yang ditentukan oleh google (10 detik).

Akhirnya saya asumsikan, proses tersebut lama disebabkan karena pada page yang kita baca tersebut ada social plugin facebook, yang mana proses loading halaman menjadi lebih lama. Karena konten tersebut menggunakan teknologi ajax, trus diview source dan ditemukan dimana tempat mengambil sumber datanya tersebut.masalah itupun teratasi :D

Kemudian set interval cronjobnya 5 menit sekali. Mungkin kalo kita terapkan di hostingan berbayar, masang kron diset seperti ini bisa cukup menguras resource server & bisajadi disuspend :O . Dan sampai saat ini, pas cek log.. time out sudah jarang.

Oiya, kalau mau lihat hasilnya bisa dicek di http://twitter.com/pbkp2011. Jangan lupa follow lho :D . Contohnya bisa dilihat di https://github.com/Pujianto/pilbupkp2011.

Demikian postingan hari ini, semoga bermanfaat. :)


Apr 6 2011

Menambahkan feed info kampus

Assalamualaikum Wr.Wb,

Ternyata setelah the daftar tugas di set sebagai home page ada sedikit kemajuan, dimana setiap pertama kali membuka browser langsung muncul tumpukan tugas kampus yang mesti segera diselesaiken. :)

Oke, kali ini akan membahas seputar sesuatu yang baru ditambahkan pada projek ini. #halah. Yaitu feed seputar info-info dari kampus. Dan setelah coba-coba cari cara bagemana untuk memparsing file xml di python akhirnya menemukan sebuah library yang simple dan mudah digunakan. Yups ini dia, menggunakan Universal Feed Parser, selain itu dokumentasinya juga lengkap.

Berikut contoh simpel penggunaan feed parser ini.

#import feedparser.py
import feedparser

#buat variabel untuk menyimpan hasilnya
data = []

xml = feedparser.parse(&quot;http://www.amikom.ac.id/index.php/feed/info_kampus&quot;)
for a in xml:
     data.append('&lt;a href=\&quot;'+a.link+'\&quot; target=\&quot;_blank\&quot;&gt;'+a.title+'&lt;/a&gt;'&quot;)

#variabel data sudah ada isi judul berita &amp; linknya.

Apr 2 2011

The Daftar Tugas

Lama nggak posting dimari nih. Memasuki semester yang ke-empat ini emang jadwal kuliah rada dipadatkan. #halah. Terus ditambah aktifitas lainnya ….*plaak*.. *kepanjangan*.

Oke, mari kita berserius.hihhi. Tak terasa sekarang sudah ke semester 4 dalam berkuliah. Jadi 3 semester sudah terlewati & seiring dengan bertambahnya waktu perjalanan ini, tentunya harus semakin serius dalam belajar :) .  Wis pokoknya aku butuh sebuah perbedaan dan peningkatan, yang waktu dulu ngerjain tugas sering telat kini harus lebih disiplin. *yah.., ketrampilanku dalam membagi waktu itu emang rada rendah*.

Oke salah satu usahanya, kemarin coba-coba iseng buat aplikasi web sederhana tentang ‘the jadwal tugas’ itu. Pokoknya semua tugas-tugas di list disitu. Dan kalau progress sudah 100%, maka otomatis tugas tersebut ter-close sendiri.

the daftar tugas
Technically, seperti biasa.. pake google appengine yang python version & tornadoweb sebagai web frameworknya. Untuk mempercantik tampilan coba pake library jqueryui. Terdiri atas 3 entitas di datastorenya, yaitu semester, makul dan tasklist. *saat ini yg semester belum digabungin*.

Untuk yang akan datang,

Pengennya sih dikembangin lagi biar semua orang bisa memanfaatkan. Ya mari kita liat setelah pake aplikasi ini apakah ‘disiplinku’ semakin meningkat, kalo iya berarti ini cara efektif biar kita tambah rajin.hehehe. Ya insya Allah nanti kalo ini sukses, bisa dikembangkan untuk versi umum. Dan tentunya ditambah fitur lain biar lebih menarik.

Ada pemikiran …agak lebay sih.. yaitu fitur yang bila tugas sudah mendekati deadline dan progressnya belum 100%, otomatis posting pengingat untuk ngerampungin tugas ke twitter atau wall facebook atau situs jejaring sosial lainnya. Begitu bunyinya.

Demikian postingan hari ini. jangan lupa, buka http://kuliah.pujianto.net & set as homepage. :) )

Feb 27 2011

aplikasi sederhana dengan tornado #1

Oke. Sekarang kita coba belajar tornadoweb. Sebelume, tornado itu adalah web framework pada python dan bisa juga dijadikan sebagai web server. Eh info juga, ternyata tornado web sekarang sudah versi 1.2, entah kapan tanggal rilisnya. Karena yang tak download dulu yang versi 0.2. Lebih lanjut tentang tornado, bisa kita lihat di official website nya

Oiya, dalam percobaan kali ini kita akan menggunakan database MySQL pada lampp (xampp versi linux) sebagai backend nya #halah.

Pertama kita buat database & tabelnya

create database percobaan;
use percobaan;
create table anggota (
id int not null primary key auto_increment,
nama varchar (30)not null,
alamat varchar (50)not null,
pekerjaan varchar (40)not null
);

contoh kita mbuat tabel anggota kelompok ronda. :D .

Setelah buat database sekarang kita buat aplikasinya, buat sebuah direktori tempat kita membuat direktori tempat meletakkan aplikasinya. *dan didalam direktori tersebut kita masukan juga direktori tornadonya.*. Eh tapi sebelumnya buat install dulu MySQL-Python di komputer. untuk detail instalasinya cari sendiri yee. :) .  Untuk ngetes apakah mysql-python sudah berjalan jalankan python, terus import  _mysql. Kalo lancar berarti sudah sip.

contoh hirarki direktorinya:

- appsku:

- tornado

- app.py

Karena dalam tulisan di atas python scriptnya kita namai app.py, maka buat file app.py di direktori appsku. Terus buka file app.py & mari kita mulai :

#!/usr/bin/env python
# nama filenya app.py

#import modul2 yang dibutuhkan
import tornado.database
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

#definisikan pada port berapa aplikasi kita berjalan
from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)

#sekarang kita buat class untuk halaman utamanya
class MainHandler(tornado.web.RequestHandler):
    def get(self):

		konek = tornado.database.Connection("/opt/lampp/var/mysql/mysql.sock","percobaan",user="root")
		self.write("""
		<html><head><title>Daftar Anggota Kelompok Ronda RT 43 </title></head>
		<body><div align="center"><h3>Daftar anggota kelompok ronda RT 43</h3>
		<table name="listanggota" border="1" ><tr>
		<td>No</td><td>Nama</td>
		<td>Alamat</td><td>Pekerjaan</td>
		</tr>

		""")
		if len(konek.query("SELECT * from anggota")) < 1:
			self.write("data masih kosong!")

		for a in konek.query("SELECT * FROM anggota"):
			self.write("<tr><td>" )
			self.write(str(a.id))
			self.write("</td><td>" )
			self.write(a.nama)
			self.write(" </td><td>")
			self.write(a.alamat)
			self.write("</td><td>")
			self.write(a.pekerjaan)
			self.write("</td></tr>")

		self.write("</table>")
		self.write("<br/> <a href=/insert>tambah</a> anggota")
		self.write("	</div> </body></html>")

#sekarang	class untuk tambah data dan post tambahan data
class Isi(tornado.web.RequestHandler):
	def get(self):
		self.write("<html><head><title>Tambah Anggota Baru </title></head><body>")

		self.write("""<div align="center">
		<h3>Tambahkan Anggota Baru: </h3>
		<form method="post" action="/insert">
		<table name="form-input" border="0">
		<tr><td><label for="nama">Nama:  </label></td>
		<td><input type="text" name="nama"><br /></td></tr>
		<tr><td><label for="alamat">Alamat:</label></td>
		<td><input type="text" name="alamat"><br /></td></tr>
		<tr><td><label for="pekerjaan">Pekerjaan:</label></td>
		<td><input type="text" name="pekerjaan"><br /></td></tr></table>
		<input type="submit" value="send">
		<input type="reset" value="clear">
		<a href="/"><input type="button" value="batal"></a>
		</form>
		</body></div>
		</html>""")

	def post(self):
		nama = self.get_argument("nama",None)
		alamat = self.get_argument("alamat",None)
		pekerjaan = self.get_argument("pekerjaan",None)
		if not nama or not alamat or not pekerjaan:
			self.write("data tidak lengkap, silakan diulang kembali. Klik back pada browser")
		else:
			konek = tornado.database.Connection("/opt/lampp/var/mysql/mysql.sock","percobaan",user="root")
			konek.execute(u'''insert into anggota(nama,alamat,pekerjaan) values (%s,%s,%s)''',nama,alamat,pekerjaan)
			self.redirect("/")

#kita buat fungsi utamanya
def main():
    tornado.options.parse_command_line()
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/insert", Isi)
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

Eh iya, itu karena kita MySQLnya berada di lampp / xampp. maka yang kita isikan bukan localhost, tapi ‘/pathlokasilampp/var/mysql/mysql.sock’.

Dan, err sori itu kode htmlnya rada membuat berantakan ya? :D . Kan ini baru versi 1, jadi kita belum pake template dll.:))

Jalankan file app.py tadi ($python app.py), karena dalam pengaturan port untuk  httpnya 8888, maka setelah dijalankan url di browser adalah http://localhost:8888 . Mari kita lihat hasilnya :D

http://localhost:8888

http://localhost:8888/insert

list anggota yang sudah lumayan banyak..

Oke, mungkin itu dulu sodara2 sekalian. mohon maaf kalo masih banyak salah2.hihi.


Feb 21 2011

how to bypass err…’pake dasi’

Hmm.. postingan yang sangat aneh. Nonton judule wae agak piye gitu. Sebenarnya pengen posting seputar tips & trik aja sih. #halah. Seputar pengalaman kuliah di tempat yang berdasi.hihihi.

Ceritanya gini,  berkuliah di tempat saya kuliah itu kalo pria harus berdasi, terutama pada waktu-waktu tertentu. Misal pas ujian.  Memang sih, dasi itu melambangkan profesionalitas kerja. Mungkin agar kita terbiasa untuk bersikap profesional sejak masih kuliah. Tapi apabila kita dalam kondisi ‘darurat’ dan tidak ada dasi. ya, .. gimana ya.

Misale akan ujian, terus dasi ketlingsut atau hilang atau … intinya dasinya nggak ada. Dan kalo kita ingin masuk ujian dan persayaratannya harus pake dasi. Repotkan!

Ada sebuah tips nih biar tetap bisa masuk kelas. Pertama, Tentu saja. cari pinjaman dasi pada teman-teman di sekitar. Kalo itu step itu masih belum dapat dasi juga. pake cara kedua, yaitu pake baju batik. :D .


Feb 17 2011

Seputar Google Appengine

Google maning-google maning. Ya.. memang sebagian besar aktifitas ngonline saya ini selalu bersinggungan dengan produk dari google ini. Dari email, nyimpan dokumen, web browser, hosting dsb.dsb.. Ya karena layanan google ini memang paling top untuk saat ini.

Oke kita ke tujuan inti dari postingan ini, #halah. Yaitu membahas seputar Google Appengine.  Menurut wikipedia, App Engine merupakan platform yang memungkinkan pengembang untuk membuat dan menjalankan aplikasi-aplikasi web dengan fasilitas hosting di server Google. Pokoknya ya semacam itulah. Dan bahasa yang didukung untuk saat ini adalah python dan java. *yang akan kita bahas adalah yang versi python lo*.

Untuk memulai membuat aplikasi dengan platform ini, terlebih dahulu download dulu sdk-nya. Dan jangan lupa, pythonnya juga harus terinstal di komputer. Untuk pengguna windows, yang belum punya python bisa didownload di sini. kalo nggak salah sih, versi python yang didukung GAE ini yang 2.5 ke atas. Biar lebih jelas, bisa dibaca sendiri / didownload dokumentasinya  platform ini :D . Baiklah, tak asumsikan kita sudah paham mengenai dasar-dasar mengenai appengine ini.

Coba kita belajar membuat hello world. Dan web framework yang digunakan yaitu pake yang bawaan dari GAE ini, yups… webapp. *dan contoh aplikasi berikut dibuat sama plek dengan yang ada di contoh di dokumentasi*

Kita buat file konfigurasinya, namanya adalah app.yaml dan diletakkan di direktori utama dari aplikasinya, contoh buat direktori aplikasi dengan nama appku. Berikut adalah contoh konfigurasi aplikasinya:

application: helloworld
version: 1
runtime: python
api_version: 1
handlers:
- url: /.*
  script: helloworld.py

lalu simpan konfigurasi di atas dengan nama app.yaml

Terus, buat file helloworld.py dan isinya seperti berikut.

yang from-from itu untuk import web frameworknya (webapp) beserta kebutuhan lainnya.

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class Hello(webapp.RequestHandler):
	def get(self):
		self.response.headers['Content-Type'] = 'text/plain'
		self.response.out.write('Hello, webapp World!')

application = webapp.WSGIApplication([('/',Hello)],debug=True)

def main():
	run_wsgi_app(application)
if __name__ == "__main__":
	main()

Lalu jalankan aplikasi tersebut, dengan perintah :

 appengine_sdk/dev_appserver.py appku/

Dan hasilnya adalah kurang lebih seperti ini.

Woke, itu dulu tuips.. mengenai appengine kali ini . Mungkin nanti coba post lagi tentang mbuat aplikasi sederhana lain menggunakan platform ini. :D


Feb 15 2011

Membaca Google Books

Google Books.  Sebuah layanan dari Google yang memungkinkan kita untuk membaca-baca buku secara online tanpa perlu membeli buku. Beragam kategori buku yang ada di  google books ini. Ada seputar kesehatan, humor, masak, desain, dll.

Ya, sejenis sebuah perpustakaan virtual yang di dalamnya terdapat ribuan koleksi yang siap untuk disimak. Dan menurut pendapat saya, google books ini kurang begitu dikenal oleh orang-orang di sekitar kita. *tadi coba tanya salah satu teman apakah pernah nyoba google books, eh ternyata belum*.
Oke, coba kita coba praktekkan. Dan karena kebetulan saya tinggal di desa, coba cari buku dengan kata kunci“budidaya”.


Meskipun kalau yang versi free halaman yang ditampilkan dibatasi, tapi setidaknya kita dapat memperoleh pengalaman baru dari buku yang  kita baca. Bingung dengan uraian saya? monggo silakan ke tkp sendiri. :) ))

Feb 13 2011

Hello world!

Assalamualaikum Wr Wb,

Entah ini Hello World yang keberapa :D . Yang jelas mulai hari ini kembali menggunakan wordpress engine blognya, setelah sempat beberapa saat lalu mencoba blogging menggunakan google appengine. Sebenernya pas beli domain ini dulu ngeblognya juga pake wordpress sih, tapi berhubung nggak diperpanjang hostingannya..ya suspended deh..

Oh iya, tentu saja blog yang versi appengine masih kok, tak pindah ke http://changelog.pujianto.net. Alesan menggunakan nama itu, ya..cuma asal aja. bingung milih nama-namanya.

Oke, di blog yang baru ini semoga tulisan menjadi lebih rapi & memberikan manfaat tentunya :) .