Membuat bot Telegram

Terinspirasi dari tulisan pak Yohanes, akhirnya tadi malam saya berhasil membuat bot untuk Telegram setelah membaca tutorial yang dibuat oleh pak Yohanes tersebut. Bedanya hanya url webhook-nya saya arahkan ke salah satu endpoint API dari aplikasi saya yang lain yang saya buat dengan SlimFramework dan saya tidak menggunakan stream php://input untuk membaca post data dari telegram tapi langsung menggunakan fungsi dari slim buat baca data

$body = $app->request->getBody();

 

Bot ini berfungsi untuk mendapatkan data hadits dan terjemahnya dari beberapa kitab hadits. command-nya adalah sebagai berikut:

/<periwayat> <nomorhadits>
misalnya:
/ahmad 200
untuk mendapatkan informasi hadits nomor 200 pada kitab musnad Ahmad

dimana nama periwayatnya adalah sebagai berikut:

  1. bukhari untuk kitab shahih bukhari
  2. muslim untuk kitab shahih muslim
  3. ahmad untuk kitab musnad Imam Ahmad
  4. tirmidzi untuk kitab sunan at-tirmidzi
  5. nasai untuk kitab sunan an-nasa’i
  6. darimi untuk kitab sunan ad-darimi
  7. malik untuk kitab al-muwaththa’ karya Imam Malik
  8. ibnumajah untuk kitab sunan Ibnu Majah, dan
  9. abudaud untuk kitab hadits sunan Abu Dawud

silahkan langsung menambahkan bot-nya di sini @hadits_bot

 

semoga bermanfaat. Aamiin

Android Unit: px (pixel), dp/dip (density-independent pixel) dan sp (scale-independent pixels)

tldr;

selalu gunakan sp untuk teks dan dp untuk yang lainnya. Kecuali, benar-benar terpaksa dan tahu benar konsekuensinya, gunakanalah px.

Ekosistem android dikenal dengan fragmentasi spesifikasi device yang sangat bervariasi. Tentunya ini tantangan tersendiri bagi developer. Untungnya, untuk masalah screen density yang bervariasi, sepertinya sudah diantisipasi oleh para pengembang platform Android di Google, dengan memperkenalkan dua unit/satuan baru yaitu dip/dp (density-independent pixel) dan sp (scale-independent pixels).

Misalkan ada dua tablet 7-inch (ukuran diagonal layar), tablet pertama (A) memiliki resolusi layar  1200x1920px 320dpi dan yang lainnya (B) beresolusi 2048x1536px 326dpi. Membuat button dengan ukuran 300x300px mungkin akan tampak normal pada  tablet tapi akan tampak kecil di tablet

Tapi akan berbeda jika kita spesifikasikan ukuran buttonnya dengan ukuran yang bergantung pada density layar alias menggunakan dip misal 300x300dp.

secara fisik ukuran button tersebut akan selalu sama pada ukuran layar yang berbeda.

Perhatikan gambar berikut:

Screen Shot 2015-07-15 at 1.45.58 PM

ukuran 200dp akan dikonversi pada device mdpi (device dengan density 160dpi/dots per inch) menjadi 200px dan menjadi 400px pada device xhdpi (density 420dpi) misal pada nexus 4. Sehingga ukuran tersebut tampak sama dan konsisten secara fisik untuk beragam device dengan ukuran layar yang berbeda.

serupa dengan dp adalah sp (scaled-independent pixels) yang kita gunakan untuk ukuran teks. Perbedaannya, dengan menggunakan satuan sp android akan menscale ukuran teks sesuai dengan setting ukuran teks di device (yang biasa dapat di akses melalui menu settings).

Jadi, selalu gunakan sp untuk teks dan dp untuk yang lainnya. Kecuali, kamu benar-benar terpaksa dan tahu benar konsekuensinya, jangan menggunakan satuan px. Jika kebetulan designer yang bekerja bersama anda belum tahu, beritahukan untuk selau menginformasikan spesifikasi design dengan dp/sp. Beberapa website berikut akan sangat membantu:

  1. http://developer.android.com/guide/practices/screens_support.html
  2. http://developer.android.com/training/multiscreen/screendensities.html
  3. http://dpi.lv/
  4. https://pixplicity.com/dp-px-converter/
  5. https://www.youtube.com/watch?v=zhszwkcay2A

Tulisan ini terinspirasi setelah membaca status path Sidiq (salah satu Android Developer Expert dari Indonesia )

Poor Man’s SSL using Cloudflare service

Saat ini, rasanya makruh hukumnya jika website tidak menggunakan SSL. Dahulu kala mungkin menenkripsi semua trafik website dengan SSL secara komputasi mahal, tapi kini tidak lagi dengan semakin berkembang dan murahnya perangkat keras. Maka, saya memutuskan untuk meng-enable ssl pada dua domain yang saya kelola yaitu: rowahu.info dan hakimlabs.com.

Alhamdulillah, untung bagi saya, karena ada sebuah layanan gratis yang bukan saja menyediakan dynamic ssl gratis tapi juga menjanjikan peningkatan kecepatan website yang kita daftarkan. Layanan tersebut adalah cloudflare.com; mendaftarkan website kita di cloudflare semudah mengganti name server dari manapun (biasanya tempat kita membeli domain) ke name server yang disediakan cloudflare, jadi sangat mudah.

Dan setelah didaftarkan, berikut hasil SSL test dari Qualys SSL Labs:

Screen Shot 2015-07-02 at 1.16.20 PM Screen Shot 2015-07-02 at 1.17.19 PM

yay, dapat Grade A. Awsome!

Alhamdulillah. semoga bermanfaat :)

Hosting website dengan RedHat OpenShift

Weekend lalu, saya memiliki Ide untuk membuat service untuk aplikasi yang saya buat di sini Al-Mishbah. Karena saya lagi belajar menggunakan Lumen, micro-framework yang dibuat oleh Taylor Otwell, empunya Laravel, saya langsung mengembangkannya dengan lumen; setelah selesai protipe website tersebut, saya memutuskan untuk mendeploy web tersebut ke RedHat OpenShift yang menyediakan paket free.

Tapi kemudian saya menyadari, ternyata di OpenShift masih hanya mensupport PHP versi 5.4 (kurang tahu minor versionnya) sedangkan Lumen mensyaratkan PHP 5.5.9; Jadi saya berubah pikiran untuk mengubah framework sekalian dengan menggunakan Laravel mengingat ada tutorial untuk langsung mendeploy-nya di laman berikut https://hub.openshift.com/quickstarts/115-laravel-5-0 . Tapi, karena saya tidak terbiasa dengan Laravel, saya agak kesulitan.

Dan setelah melihat framework laravel-nya sendiri, saya lihat ini framework lumayan gendut, jadi rasanya sayang kalau untuk service yang sederhana menggunakan framework sebesar ini. Kemudian saya teringat dengan SlimFramework yang juga saya gunakan di service saya yang lain. Dan akhirnya, Service tersebut selesai saya deploy di sini: rowahu.info/hadits/bukhari/1 . Pattern url yang digunakan adalah http://rowahu.info/hadits/<nama kitab hadits>/<nomor hadits>.

Menginstall rhc (redhat client) di Mac Os X

  1. Pastikan ruby (gems) sudah terinstall, di OSX biasanya sudah terinstall, update jika diperlukan.
  2. Ketika perintah berikut untuk menginstall rch dengan gem
    $sudo gem install rhc
  3. Jika ada masalah dengan dependency, pastikan untuk mengupdate gem-nya
    $sudo gem update

Setup rhc

setelah rch selesai di install, kita tinggal setup OS kita dengan otentikasi yang dibutuhkan, sehingga nantinya tidak perlu repot saat autentikasi dll.

  1. Mulai dengan mengeksekusi perintah berikut
    $rhc setup
  2. Selanjutnya masukkan username dan password yang digunakan signup di openshift
  3. Nantinya akan ada pilihan untuk menyimpan public key dan mengupload-nya ke server supaya tidak repot lagi memasukkan username dan password saat menggunakan rhc selanjutnya

Membuat aplikasi

Membuat aplikasi di openshift dapat dilakukan di web ataupun melalui console dengan menggunakan rhc yang sudah terinstall tersebut. Untuk membuat aplikasi dengan rhc bisa dengan langkah berikut:

$ rhc create-app rowahu php-5.4 mysql-5.5

untuk mensetup aplikasi dengan nama rowahu dengan spesifikasi (cartridges) php-5.4 dan mysql-5.5
sesaat kemudian nanti akan di dapatkan informasi tentang environment yang sudah terbuat: mysql usrname dan password, mysql connection url URL dari aplikasi dan juga untuk SSH serta alamat URL Git dari server source code yang bisa kita gunakan seperti berikut:

  URL:        http://rowahu-hakimlabs.rhcloud.com/
  SSH to:     xyzabcdefghij@rowahu-hakimlabs.rhcloud.com
  Git remote: ssh://xyzabcdefghij@rowahu-hakimlabs.rhcloud.com/~/git/rowahu.git/

selanjutnya, kita bisa meng-clone source code tersebut dan memodifikasinya sesuai kebutuhan aplikasi yang kita kembangkan.

Screen Shot 2015-06-29 at 3.10.23 PM

Mengubah nama domain

Secara default, kita akan mendapatkan subdomain dari rhcloud.com, tapi kita bisa mengubah nama domain dengan nama domain yang kita beli sendiri (misalnya rowahu.info):

  1. Beli domain dari reseller domain apapun.
  2. Selanjutnya, buat alias di dashboard aplikasi di openshiftScreen Shot 2015-06-29 at 3.12.53 PM
  3. Kemdudian, setting dns host record di tempat anda membeli domain tersebut ke alaman url aplikasi yang dibuatkan oleh rhcloud seperti berikut
  4.  Screen Shot 2015-06-29 at 3.17.17 PM

Sekarang aplikasi web kita sudah bisa diakses dengan custom domain sesuai dengan keinginan kita.

happy coding :)

Berusaha mengupdate keahlian dengan Pet Project: Al-Mishbah Android Application

Akhir tahun yang lalu, agar bisa mengerjakan “pet project” dengan lebih nyaman, saya, dengan izin istri tentunya :), memutuskan membeli laptop. Laptop dengan spesifikasi yang sama dengan laptop yang dipinjami oleh kantor tempat saya bekerja, MacBook Pro 13″. Ini adalah perangkat elektronik paling mahal yang pernah saya beli. Keputusan ini diambil karena keinginan saya untuk mengerjakan kembali beberapa pet project yang dulu sudah pernah saya mulai, agar tidak menggunakan properti kantor untuk keperluan pribadi.

Screenshot_2015-02-04-00-18-36

Alhamdulillah, akhirnya laptop ini berhasil menelurkan satu aplikasi yaitu Al-Mishbah, aplikasi yang berisi al-Qur’an dan hadits beserta terjemahnya. Keinginan untuk mengupdate aplikasi al-Mishbah salah satunya karena kegelisahan saya akan banyaknya aplikasi-aplikasi hadits yang sangat populer namun menempatkan iklan disamping hadits tersebut (atau iklan muncul saat akan membaca hadits), saya merasa sedih dan kurang nyaman karena menurut pendapat pribadi saya ini kurang sopan terhadap isi dari al-Qur’an dan hadits. Oleh karena itu saya membuat aplikasi al-Mishbah tersebut, semoga saja pahala berlimpah terus mengalir dari aplikasi tersebut terhadap saya, keluarga, guru-guru dan orang tua saya.

update terakhir aplikasi  Al-Mishbah tahun 2012
update terakhir aplikasi Al-Mishbah tahun 2012

Konten Berbayar

Dalam aplikasi ini saya juga mencoba hal yang baru bagi saya yaitu, In-App Billing. Sebelumnya saya lebih terbiasa menjual aplikasi secara langsung, namun sepertinya hal tersebut kurang menarik  terutama bagi pengguna smartphone Android, oleh karena itu saya saya memutuskan untuk menggunakan model freemium. Semoga keputusan saya ini tepat. Aamiin

Ada yang bertanya kenapa aplikasi ini sebagian kontennya berbayar, alasannya tentu saja karena saya membutuhkan uang terutama untuk menafkahi keluarga. Dan juga piihan memasang iklan, meskipun sangat menarik bagi saya, di aplikasi Al-Mishbah ini bertentangan dengan prinsip saya yang tidak menghendaki iklan berada di aplikasi al-Qur’an.

Development

Sebagian besar waktu development sebenarnya dilakukan pada akhir tahun 2014 dimana banyak sekali waktu libur. Inspirasi disain dari aplikasi Al-Mishbah di adopsi dari aplikasi Google play books.

IMG_20150207_141810
coret-coret disain aplikasi

Masih banyak fitur yang saya rencanakan untuk ditambahkan, tapi saya memang kurang pandai mengatur waktu :(, sehingga saat rilis masih hanya sedikit peningkatan yang dilakukan. Tapi, Insya Allah kali ini akan lebih sering lagi di update.

Nah, silahkan bagi pembaca yang berminat, langsung download aplikasinya di sini:

berikut sekilas demo videonya:

Semoga bermanfaat :)

1 tahun

Tanggal ini, tepat 1 tahun semenjak istri saya pertama kali masuk rumah sakit dirawat karena meningitisTahun 2014 merupakan tahun yang tidak mudah bagi kami, terutama bagi istri. Karena sakit yang dideritanya, yang sampai sekarang belum sepenuhnya sembuh, aktivitas yang beliau dapat lakukan menjadi sangat terbatas. Banyak agenda tentu saja menjadi tidak tercapai, peluang-peluang yang tidak termanfaatkan.

Tidak dinyana, setelah sekian bulan keluar dari rumah sakit, istri saya harus di rawat sekali lagi di bulan Agustus 2014 selama 30 hari. Dan untuk kedua kalinya beliau harus menjalani operasi di kepala (pertama kali operasi adalah saat kecelakaan di waktu beliau masih SMP), kali ini adalah dengan operasi pemasangan pipa VP Shunt karena ada indikasi hydrochepalus akibat meningitis, pipa shunt akan dipasang mulai darikepala hingga ke perut yang akan beliau bawa seumur hidup :'(. Dan untuk pertama kalinya saya benar-benar terkejut, bagaimana seorang dokter yang hendak mengoperasi meminta uang 5jt di depan ruang operasi.

Selama 30 hari istri di rumah sakit, saya hampir tidak pernah pulang, pagi berangkat ke kantor dan pulang kantor kembali ke rumah sakit. Terasa berat memang, tapi pasti yang dirasakan oleh istri jauh lebih berat berkali lipat. Beruntung saat itu kantor tempat saya bekerja (Kaskus) mengizinkan saya untuk kerja di kantor Bandung.

foto bunda selesai di MRI
bunda selesai di MRI

Beban sakit yang diderita istri, ternyata harus ditambah dengan fakta ternyata istri sedang mengandung anak kami yang kedua. Tentu saja kami sangat terkejut, setelah berkali-kali test selalu negatif meskipun sudah tidak datang bulan semenjak masuk rumah sakit, seminggu setelah pulang dari rumah sakit, karena muntah-muntah masih juga belum berhenti, kami lakukan test lagi dan ternyata hasilnya beliau adalah positif hamil. Setelah dilakukan USG, tampak jelas memang beliau sedang hamil. Meskipun terkejut kami bersyukur dengan anugerah ini.

Seiring dengan kehamilan, berat badan istri semakin bertambah (Alhamdulillah), dan Saat untuk melahirkan semakin dekat (HPL 10 maret 2015), dan tentu saja dengan kondisi beliau saat ini, operasi cessar adalah pilihan yang paling aman. Hal ini berarti istri saya bakal berada di meja operasi sekali lagi :'(.  Salah satu hal yang kami syukuri dengan kehamilan istri adalah berat badannya yang semakin naik, semoga ini juga indikasi semakin baiknya kondisi beliau, sehingga saat melahirkan nanti bisa berjalan dengan lancar, anak dalam kondisi sehat, serta istri sembuh sehat wal afiat. aamiin.

Berkah lain dari kondisi sakit beliau adalah, Alhamdulillah kami sekeluarga semakin memiliki banyak waktu untuk bersama; semoga kami masih bisa bersama lebih lama lagi, minimal 40 tahun lagi, dalam limpahan keberkahan, kebaikan yang terus-menerus bertambah, dan kelak kami bisa berkumpul kembali di surga tertinggi, jannat al-firdaus. Aamiin

Ingin sekali mengutip tulisan Ustadz Salim A Fillah berikut, sebagai pengingat bagi kami:

Hikmah Sakit
By: Salim A Fillah

1. Sakit itu dzikrullah.
Mereka yang menderitanya akan lebih sering dan syahdu menyebut Asma ALLAH di banding ketika dalam sehatnya.

2. Sakit itu istighfar.
Dosa-dosa akan mudah teringat, jika datang sakit. sehingga lisan terbimbing untuk mohon ampun.

3. Sakit itu tauhid.
Bukankah saat sedang hebat rasa sakit,kalimat thoyyibat yang akan terus digetar?

4. Sakit itu muhasabah.
Dia yang sakit akan punya lebih banyak waktu untuk merenungi diri dalam sepi,menghitung-hitung bekal kembali.

5. Sakit itu jihad.
Dia yang sakit tak boleh menyerah kalah,diwajibkan terus berikhtiar,berjuang demi kesembuhannya.

6. Bahkan Sakit itu ilmu.
Bukankah ketika sakit,dia akan memeriksa,berkonsultasi dan pada akhirnya merawat diri untuk berikutnya ada ilmu untuk tidak mudah kena sakit.

7. Sakit itu nasihat.
Yang sakit mengingatkan si sehat untuk jaga diri,yang sehat hibur si sakit agar mau bersabar,ALLAH cinta dan sayang keduanya.

8. Sakit itu silaturrahim.
Saat jenguk, bukankah keluarga yang jarang datang akhirnya datang membesuk,penuh senyum dan rindu mesra? Karena itu pula sakit adalah perekat ukhuwah.

9. Sakit itu penggugur dosa.
Barang haram tercelup di tubuh dilarutkan di dunia, anggota badan yang sakit dinyerikan dan dicuci-Nya.

10. Sakit itu mustajab doa.

Imam As-Suyuthi keliling kota mencari orang sakit lalu minta didoakan oleh yang sakit.

11. Sakit itu salah satu keadaan yang menyulitkan syaitan.
Diajak maksiat tak mampu tak mau dosa,lalu malah disesali kemudian diampuni.

12. Sakit itu membuat sedikit tertawa dan banyak menangis,satu sikap keinsyafan yang disukai Nabi dan para makhluk langit.

13. Sakit meningkatkan kualitas ibadah,rukuk-sujud lebih khusyuk,tasbih-istighfar lebih sering,tahiyyat-doa jadi lebih lama.

14. Sakit itu memperbaiki akhlak,kesombongan terkikis,sifat tamak dipaksa tunduk,pribadi dibiasakan santun,lembut dan tawadhu.

15. Dan pada akhirnya sakit membawa kita untuk selalu ingat mati.

Semoga cepat sembuh bagi yang sedang sakit. Syafakumullah syifaa-an ‘aajilan…

Semoga lekas sembuh wahai istriku, syafakillah syifaa-an taamman, ‘aajilan, I love you so much

Google Apps Script for Fun and Profit

Saya suka membaca, buku, artikel, blog, notes dll, untuk blog saya biasa menggunakan google reader dan setelah di shutdown, saya berpindah menggunakan feedly, ada lebih dari seratus sumber berita saya subscribe (meskipun tidak selalu saya baca semua artikelnya). Saya juga senang sekali kalau ada yang mengirimkan artikel-artikel menarik melalui email karena tentu saja pengirim info tersebut telah memilihkan berita atau informasi yang menarik bagi saya. Hal tersebut yang dilakukan oleh salah seorang manager senior di kantor.

Karena beliau relatif sering mengirimkan artikel tersebut, saya berfikir untuk menyimpan artikel-artikel tersebut di google site saya, sehingga saya bisa mengaksesnya sewaktu-waktu dengan mudah. Oleh karena itu saya membuat script sederhana untuk mengambil artikel tersebut dan menyimpannya di google site dengan menggunakan google apps script. Menggunakan google apps script ternyata sangat mudah, berikut script yang saya buat:

/**
 * Retrieves all inbox and post body email from pak Soegi with subject: "fyi" to google sites
 * https://sites.google.com/a/kaskusnetworks.com/hakim/home/articles
 * For more information on using the GMail API, see
 * https://developers.google.com/apps-script/class_gmailapp
 */
function processInbox() {
  Logger.log("start reading inbox");
  // get top 50 inbox (assuming no more than 50 threads within a day)
  // sort it based on first message date, since sometimes old thread goes up because of new message/reply
  // it make sure that only latest message read and posted to google site
  var threads = GmailApp.getInboxThreads(0, 50).sort(function(thread1, thread2){
    return thread2.getMessages()[0].getDate().getTime() - thread1.getMessages()[0].getDate().getTime();
  });
  
  var day_in_miliseconds = 86400000; // 24*60*60*1000
  if (threads.length > 0){
    for (var i = 0; ; i++) {
      // get all messages in a given thread
      var thread = threads[i];
      var firstmessage = thread.getMessages()[0];
      var firstmessagedate = firstmessage.getDate()
      var now = new Date();
      // only check for past 24 hour email
      if ((now.getTime() - firstmessagedate.getTime()) <= day_in_miliseconds){
        var messages = thread.getMessages();
        // log message subject
        var message = messages[0]; // we only care for the first message
        Logger.log(message.getFrom() + " subject: "+ message.getSubject())
        if (message.getSubject().trim() == "fyi" && message.getFrom().indexOf("soegi") > 0){
          var date = message.getDate()
          // post to google sites
          var fyi = "<strong>" + date.toLocaleDateString() + "</strong><br/>"+message.getBody();
          addArticlesToPage(fyi);
        }
      }else{ // outdated message
        break;
      }
    }  
  }
  
};

function addArticlesToPage(fyi){
  var domain = 'kaskusnetworks.com';
  var sitenya = 'hakim';
  var site = SitesApp.getSite(domain, sitenya);
  var page = SitesApp.getPageByUrl("https://sites.google.com/a/kaskusnetworks.com/hakim/home/articles");
  var content = page.getHtmlContent();
  // append content
  content = content.replace("</div></td>","<br/>"+fyi+"</div></td>");
  page.setHtmlContent(content);
}

selanjutnya saya tinggal menentukan trigger yang akan mengeksekusi fungsi tersebut (semcam membuat cron jobs). akhirnya halaman google sites saya akan selalu terupdate dengan link-link informasi menarik yang dikirimkan kepada saya. Dan di akhir pekan, saya bisa membaca semua link-link tersebut dengan santai.

happy scripting :)