• Filsafat,  Omong Kosong,  Opini,  Perspektif

    Out of This World

    Beberapa minggu terakhir istri saya senang banget nonton youtube, ada 1 channel yang dia suka tonton: Gus Samsudin. Dia seneng banget saat Gus Samsudin beraksi men-dhohirkan yg gaib, atau sewaktu dia adu tenaga dalam melawan banyak orang sekaligus.

    Tapi yang menarik perhatian saya justru hal yg lain, bukan aksi Gus Samsudin mengobati pasien, yang saya perhatikan justru keterangannya tentang Nur Muhammad. Saya ingat saat pertama kali saya dengar kata-kata “Nur Muhammad” waktu nonton video Mbah Nun (Emha Ainun Nadjib).

    Saya penasaran, apa sih “Nur Muhammad”? Dan seperti semua orang, kalau saya penasaran saya pasti buka Google. Hasil penelusuran google membawa saya ke artikel tentang Nur Muhammad yang ditulis oleh Prof. Dr. Nasaruddin Umar, Imam Besar Masjid Istiqlal Jakarta, seorang yang (menurut saya) apabila memberikan keterangan tidak memihak dan tidak menghakimi.

    Secara umum istilah-istilah itu berarti makhluk Allah yang paling tinggi, mulia, paling pertama dan utama. Seluruh makhluk berasal dan melalui dirinya. Itulah sebabnya Nur Muhammad pun disebut al-haq al-makhluq bih atau al-syajarah al-baidha’ karena seluruh makhluk memancar darinya.

    https://republika.co.id/berita/dunia-islam/tasawuf/12/03/20/m16m7j-apa-itu-nur-muhammad-1

    Sebelum Allah menciptakan yang lain, terlebih dahulu Ia menciptakan nur nabimu (Nur Muhammad). Waktu itu belum ada lauh al-mahfuz, pena (qalam), neraka, malaikat, langit, bumi, matahari, bulan, bintang, jin, dan manusia.

    https://republika.co.id/berita/dunia-islam/tasawuf/12/03/21/m18eno-apa-itu-nur-muhammad-2

    Sesudah saya baca, otomatis saya teringat keterangan seseorang tentang Atman (Atma) dalam agama Hindu. Dan karena pengetahuan saya amat minim tentang Kejawen, saya tidak tahu padanannya. Jangankan padanan Atman, tentang yg mana ajaran Kejawen saja saya tidak tahu persis karena banyak yang bercampur, apalagi sesudah “Islamisasi” Kejawen oleh Sunan Kalijaga, jadi ada banyak versi Kejawen.

    Saya kenal banyak orang muslim yang “mengharamkan” ilmu-ilmu yang menyangkut hal-hal gaib (ilmu kebatinan) karena menurut mereka hal-hal seperti itu selalu meminta bantuan kepada jin. Tapi ada salah satu praktisi ilmu kebatinan yang bilang kepada saya untuk mencari ayat dalam Al Quran yang bercerita tentang Nabi Sulaiman. Teringat kata-kata orang itu, saya cari lagi di google dan ketemu surat An-Naml (27) ayat 38-40. Saya kutip terjemahannya:

    Dia (Sulaiman) berkata, “Wahai para pembesar! Siapakah di antara kamu yang sanggup membawa singgasananya kepadaku sebelum mereka datang kepadaku menyerahkan diri?” (38)

    ‘Ifrit dari golongan jin berkata, “Akulah yang akan membawanya kepadamu sebelum engkau berdiri dari tempat dudukmu; dan sungguh, aku kuat melakukannya dan dapat dipercaya.” (39)

    Seorang yang mempunyai ilmu dari Kitab berkata, “Aku akan membawa singgasana itu kepadamu sebelum matamu berkedip.” Maka ketika dia (Sulaiman) melihat singgasana itu terletak di hadapannya, dia pun berkata, “Ini termasuk karunia Tuhanku untuk mengujiku, apakah aku bersyukur atau mengingkari (nikmat-Nya). Barangsiapa bersyukur, maka sesungguhnya dia bersyukur untuk (kebaikan) dirinya sendiri, dan barangsiapa ingkar, maka sesungguhnya Tuhanku Mahakaya, Mahamulia.” (40)

    Al Quran Surat An-Naml (27) Ayat 38-40

    Saya tidak memiliki ilmu yang cukup untuk menafsirkan Al Quran, tapi setidaknya untuk ayat-ayat yang berisi kisah para Nabi terdahulu tidak terlalu banyak yg bisa ditafsirkan, dan dari terjemahan Kementrian Agama RI sudah cukup jelas bahwa saat Nabi Sulaiman bertanya siapa yang sanggup memindahkan singgasana Ratu Balqis sebelum Ratu itu sampai di Istana Nabi Sulaiman, yang pertama menjawab adalah jin ‘Ifrit yang katanya bisa memindahkan sebelum Nabi Sulaiman berdiri, tapi kemudian ada “seorang yang mempunyai ilmu dari kitab” yang bisa membawa singgasana hanya sekedipan mata.

    Siapa “seorang” itu? Yang pasti dia dari golongan manusia, yang juga berarti bahwa ada manusia yang sanggup (diberikan anugerah oleh Allah) melakukan hal-hal yang bahkan jin ‘Ifrit tidak sanggup melakukannya. Jadi tidak semua ilmu kebatinan itu menggunakan bantuan golongan jin, seperti yang disangkakan oleh banyak orang. Dan yang lebih penting lagi adalah kata-kata Nabi Sulaiman sesudah itu, bahwa semua itu adalah karunia dari Allah sekaligus ujian apakah kita akan bersyukur atau ingkar atas nikmat dari-Nya.

    Lalu apa itu “ilmu dari kitab”? Sudah banyak ahli tafsir yang menafsirkannya, jadi silakan google sendiri. Jadi, bagi saya pribadi, saya tidak akan menghakimi para praktisi ilmu kebatinan, saya tidak akan sok tahu untuk hal-hal yang saya tidak tahu (misalnya tentang ilmu kebatinan). Yang saya bisa hanya menilai luarnya saja, apakah perbuatannya itu positif atau negatif. Ilmu hanya alat, tidak ada yang baik dan buruk, perbuatan manusia atas ilmu itulah yang menentukan baik atau buruknya.

    Dan walaupun saya tidak tau kedua nama “udin” yang saya sebut di atas masuk ke golongan “udin sedunia” yang mana, saya yakin dan percaya keduanya termasuk orang baik.

  • Komputer,  Programming,  Software

    OCR

    Beberapa waktu lalu sempet ngasih komentar di twitter atas postingan orang yang isinya protes atas data dari website Kementrian Kesehatan tentang vaksinasi Covid-19. Protes karena data yang disajikan berupa image (gambar) dan menurut orang yg posting data yang disajikan tidak “properly consumable by the public?”

    Saya pikir kalau orang gak suka data ditampilkan dalam bentuk image, berarti orang itu mau “mengambil” data itu lalu (mungkin) diolah dan disajikan dalam bentuk lain. Otomatis saya kasih tanggapan “Coba ambil gambarnya, split utk di-OCR utk dapet teksnya”. Jawaban khas “data scraper” 🙂

    Eh ternyata orangnya gak suka jawaban saya, dia bales lagi “The point is that the public *don’t* have to do the things you mentioned”. Saya setuju, masyarakat umum (“the public”) gak mungkin harus nge-OCR data dalam bentuk image. “The public” cukup lihat saja langsung image-nya, dan harusnya gak peduli tentang bagaimana data ditampilkan, yang penting kelihatan pake mata. Intinya bagi saya, orang yang peduli dengan bagaimana data ditampilkan bukan bagian dari “the public”.

    Terlepas dari perdebatan di atas, jiwa programmer saya terus tergelitik untuk nyoba bikin program yang melakukan OCR ke data vaksinasi covid-19 yang disebut di atas. Langkah pertama yg saya lakukan adalah: cari pake google dengan kata kunci “javascript ocr“.

    Yang muncul paling atas tentu saja “Tesseract.js“, proyek tesseract memang ngerajain bidang OCR. Tapi saya mau nyari OCR yg “slim”, yang cukup dengan 1 file js dan sangat mudah digunakan. Dan ternyata apa yg saya mau muncul di halaman pertama juga, namanya Ocrad.js.

    Ocrad.js sebenernya bukan benar2 implementasi teknik OCR pake javascript, karena menurut yang buat, Ocrad.js itu hasil konversi program Ocrad yang dibuat pake C++ ke WebAssembly pake Emscripten. Jadi jangan harap bisa “ngintip” cara OCR pake Javascript murni di Ocrad.js.

    Oke, langsung aja, ini langkah2 bikin program OCR untuk nge-scrap data image dari Kemenkes tentang vaksinasi covid-19.

    1. Install Node.js
    2. Clone Ocrad.js dari github. Sebenernya yang dibutuhkan cuma 1 file, yaitu file ocrad.js, tapi ada baiknya kalo di-clone semua aja karena ada contoh2nya yang bisa dipelajari.
    3. Buat 1 folder untuk programnya, lalu buat dua file (yang saya sertakan di bawah) di dalam folder tsb. Sebenernya yang paling penting cuma file vaksinasi.js, file package.json cuma untuk mempermudah instalasi node-module yang dibutuhkan.
    4. Buka command prompt, ganti folder aktif ke folder program di atas, terus ketik perintah:
      • Kalau ada file package.json, cukup pake 1 perintah: npm install
      • Kalau tidak ada file package.json ada dua perintah:
        • npm i canvas
        • npm i request
    5. Sesudah itu tinggal jalankan script-nya: node vaksinasi.js

    File: package.json

    {
      "name": "vaksinasi-covid19",
      "version": "1.0.0",
      "description": "OCR image data vaksinasi covid-19 dari Kemenkes RI ",
      "main": "vaksinasi.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "Ureh",
      "license": "ISC",
      "dependencies": {
        "canvas": "^2.7.0",
        "request": "^2.88.2"
      }
    }

    File: vaksinasi.js

    var OCRAD = require('./ocrad.js');
    var Canvas = require('canvas');
    var fs = require('fs');
    var request = require('request');
    
    var Image = Canvas.Image;
    var png = "https://www.kemkes.go.id/web/assets/images/infografis/vaksin/VAKSINASI-Infografis.png";
    png = "http://localhost/infografis.png"; // for local testing
    
    function downloadFile(url, dest, cb) {
      console.log('Downloading %s', url);
      var file = fs.createWriteStream(dest);
    
      var req = request.get(url);
      req.pipe(file).on('error', function(err) { // Handle errors
        fs.unlink(dest); // Delete the file async. (But we don't check the result)
        if (cb) cb(err.message);
      });
    
      file.on('finish', function() {
        file.close(cb);  // close() is async, call cb after close completes.
      });
    }
    
    console.log('Starting OCR');
    
    downloadFile(png, 'infografis.png', function(){
    	fs.readFile(__dirname + '/infografis.png', function(err, src) {
    	  if (err) {
    		throw err;
    	  }
    
    	  var dw = 383; // lebar panel
    	  var dh = 439; // tinggi panel
    	  var xl = 4;   // faktor pengali utk memperbesar image
    
          var img = new Image();
    	  img.src = src;
    
    // JUDUL ATAS
    	  console.log('\n');
    	  var c0 = new Canvas.createCanvas(1280*xl, 195*xl);
    	  var x0 = c0.getContext('2d');
    	  x0.drawImage(img, 0,0,1280,195, 0,0,1280*xl,195*xl);
    	  console.log(OCRAD(c0));
    
    // PANEL KIRI
    	  console.log('\n');
    	  var c1 = new Canvas.createCanvas(dw*xl, dh*xl);
    	  var x1 = c1.getContext('2d');
    	  x1.drawImage(img, 35,207,dw,dh, 0,0,dw*xl,dh*xl);
    	  console.log(OCRAD(c1));
    
    // PANEL TENGAH
    	  console.log('\n');
    	  var c2 = new Canvas.createCanvas(dw*xl, dh*xl);
    	  var x2 = c2.getContext('2d');
    	  //x2.filter = 'grayscale(1) invert(1)';
    	  x2.drawImage(img, 447,207,dw,dh, 0,0,dw*xl,dh*xl);
    
    	  // konversi ke hitam-putih dan di invert
    	  // karena text putih gak kebaca
    	  // filter di canvas context gak jalan
    	  const imgData = x2.getImageData(0, 0, dw*xl, dh*xl);
    	  for (i = 0; i < imgData.data.length; i += 4) {
    	  	let count = imgData.data[i] + imgData.data[i + 1] + imgData.data[i + 2];
    		let colour = 255;
    		if (count > 500) colour = 0;
    
    		imgData.data[i] = colour;		// red
    		imgData.data[i + 1] = colour;	// green
    		imgData.data[i + 2] = colour;	// blue
    		imgData.data[i + 3] = 255;		// alpha
    	  }
    	  x2.putImageData(imgData, 0,0);
    	  console.log(OCRAD(c2));
    
    // PANEL KANAN
    	  console.log('\n');
    	  var c3 = new Canvas.createCanvas(dw*xl, dh*xl);
    	  var x3 = c3.getContext('2d');
    	  x3.drawImage(img, 859,207,dw,dh, 0,0,dw*xl,dh*xl);
    
    	  // konversi ke hitam-putih tdk mempengaruhi output OCR
    	  /*
    	  const imgData3 = x3.getImageData(0, 0, dw*xl, dh*xl);
    	  for (i = 0; i < imgData3.data.length; i += 4) {
    	  	let count = imgData3.data[i] + imgData3.data[i + 1] + imgData3.data[i + 2];
    		let colour = 0;
    		if (count > 300) colour = 255;
    
    		imgData3.data[i] = colour;
    		imgData3.data[i + 1] = colour;
    		imgData3.data[i + 2] = colour;
    		imgData3.data[i + 3] = 255;
    	  }
    	  x3.putImageData(imgData3, 0,0);
    	  */
    	  console.log(OCRAD(c3));
    
    	});
    });

    Sekarang kita bahas programnya, program ini adalah hasil modifikasi dari contoh Ocrad.js.

    Baris 1 s.d. 8 adalah inisialisasi variabel, dimana di baris ke-8 saya set ulang variabel png supaya program mengambil gambar dari localhost, karena saya akan mencoba mengulang-ulang program dengan image yang sama biar gak membebani servernya kemenkes.

    Baris 10 s.d. 23 adalah fungsi untuk mengunduh file lalu menjalankan callback saat proses pengunduhan selesai. Fungsinya dapet dari codota.com.

    Detail ukuran image untuk dipotong-potong.

    Baris 27 mendownload file image.

    Baris 28 callback sesudah image di download yang isinya membaca file image hasil download.

    Kaya’nya selebihnya bisa dibaca sendiri di source-codenya.

    Ini saya kasih contoh hasilnya, memang agak kurang bagus, mungkin karena 1 panel ukuran tulisannya beda-beda.

    Downloading http://localhost/infografis.png
    
    
    SITUASI VAKSINASI COVID-19
    6 Maret 2021
    Update 14:00 wlB
    
    
    
    TargetSasaranVaksinasi
    40.349.051
    Tahapl
    SDM Kesehatan 1 .468.764
    Tahap II
    Petugas Publik 17.327.169
    Lansia 21.553.118
    
    
    
    Status Vaksinasi
    
    Vaksinasi-1 Vaksinasi-2
    2,552,265 l,v3o,52q
    
    Tahapl 1 2
    
    SDM Kesehatan 2.042.267 1.135.369
    Sudah Divaksin 1.741.784 1.126.353
    Tunda 300.483 9.016
    Tahapll 1 2
    
    PetugasPublik 629.157 4.179
    Sudah Divaksin 604.456 4.169
    Tunda 24.701 10
    Lansia 211.350 2
    Sudah Divaksin 206.025 2
    _unda 5.325 o
    
    
    
    CakupanVaksinasi
    (sudan d_aksinttarget sasaran vaksinasi)
    Vaksinasi-1 Vaksinasi-2
    6.33°o 2.80°/
    / o
    
    Tahapl 1 2
    
    SDMKesehatan 118.59% 76.69°/
    o
    
    Tahap II 1 2
    
    Petugas Publik 3.49% o.oo°/
    o
    Lansia 0.96% O.OO°/
    o
    

    Udah ah. That’s all folks.

  • Text File
    Komputer,  Software

    All in one

    Entri blog saya sebelumnya yg judulnya “Demam Text“, saya nemuin TiddlyWiki. Program yg keren banget walaupun ada beberapa kekurangan (menurut saya). Yang saya pasang itu versi nodejs, bisa dibilang harus ada server biarpun sederhana.

    Karena ternyata pake TiddlyWiki tidak sesederhana yang saya mau, akhirnya saya bikin deh yg 1 file teks isinya semua catetan saya. Nah, yg ini ada beberapa hal yang agak maksa, saya tambah beberapa catatan “meta” yg menurut saya berguna.

    Yang pertama adalah tiap bagian pasti saya kasih “Judul”. Tiap judul punya 1 entri, untuk yang entri-nya mirip2 saya kelompokin lagi jadi punya “Judul” dan “Sub Judul”. Selain itu saya punya entri “Index” di posisi teratas yang sebenernya “daftar isi” dari semua judul dan sub-judul yg ada.

    Oh iya, untuk data2 sensitif (password dkk) dicatat dalam kondisi terenkripsi. Awalnya pake Notepad++ dengan plugin yang bisa enkrip/dekrip teks yang diblok, tapi karena gak ada fasilitas “split window” (biar gampang edit index dan isinya) akhirnya saya pake Atom.

    Sebenernya udah punya rencana untuk bikin kaya NoteJS tapi yg fleksibel, 1 html (dengan semua JavaScript di-embed) dengan data tetep pake LocalStorage, tapi data gak semuanya di-enkrip, jadi kalo ada entri2 yg sensitif aja yg di-enkrip. Dan seperti NoteJS, data bisa diunduh dalam bentuk JSON.

    Kaya’nya itu nanti deh, untuk NoteJS versi 2.

    Udah ah.

  • Hardware,  Komputer,  Software,  Teknologi

    Kembali Ke Asal

    Gak usah ribet dan ribut mengartikan judul blog ini, setiap saya tulis entri blog baru lebih dari 50% kemungkinannya tentang teknologi komputer. Termasuk entri blog ini.

    Sebelumnya, saya memakai Raspberry Pi untuk CCTV dan OrangePi untuk nyoba berbagai server. Tapi sekarang saya nyoba-nyoba OrangePi untuk sesuatu yang memang tugasnya: connect ke hardware. Hardware yang saya colokin juga bukan yang aneh-aneh, cuma layar dot-matrix dengan backlight yg dibuat untuk Nokia 5110. Layar yang cuma 1,5″ dan punya resolusi 84×48 pixel, monokrom.

    Saya coba berbagai module python, tapi gak ada yang cocok. Bahkan sampai nyoba install Armbian versi lawas karena rata-rata softwarenya juga udah berumur 2 sampai 5 tahun yang lalu.

    Sebenernya sebelum softwarenya, saya juga pusing masalah nyambungin pin-pin layar ke pin yg di OrangePi. Akhirnya, sesudah beberapa kali begadang dapet juga konfigurasi yang pas.

    LCD Nokia 5110OrangePi Lite
    RSTGPIO 24 (pin ke-18)
    CECS0 (pin ke-24)
    DCGPIO 23 (pin ke-16)
    DINMOSI (pin ke-19)
    CLKSCLK (pin ke-23)
    VCC3.3V (pin ke-1)
    BL (backlight)GPIO 22 (pin ke-15)
    GNDGround (pin ke-6)

    Bagi yang nyari-nyari referensi pin OrangePi seperti saya, bisa lihat di https://github.com/leech001/Temp_control

    Kenapa sampai lama? Karena pada saat programnya jalan dan di layar tidak ada yang tampil, saya tidak tau itu dari wiring atau dari programnya. Dan sesudah mencoba berbagai konfigurasi kabel, akhirnya saya berhasil menghidupkan layar kecil itu pake program dari https://github.com/bitbank2/nokia5110

    Satu masalah selesai, saya sudah bisa nulis ke layar, terus apa yang harus saya tulis? Sesudah mikir sebentar saya putuskan untuk menampilkan informasi sistem sederhana.

    Nah, informasi sederhana yang mau ditampilkan ini jadi masalah karena si program ditulis pake bahasa C dan kemampuan bahasa C saya minim banget, padahal kalo saya bisa nulis pake bash script enak banget, karena saya bisa nyari berbagai informasi sistem pake bash script (– di sini ada jeda sedikit sampe “lampu” ide saya nyala –).

    Ternyata solusinya sederhana, tinggal buat program yang menampilkan tulisan dari parameter saat eksekusi. Gak sampe 10 menit akhirnya programnya jadi.

    Dan ternyata, apa yang saya lakukan sudah dilakukan oleh orang lain: https://github.com/nopnop2002/Raspberry-pcd8544

    Mungkin nanti saya coba-coba itu program. Untuk sementara case closed. Eh, to be continued…

  • Komputer,  Software

    Remote Android from Computer

    To the point aja, abis nyari-nyari cara ngeremote hape android dari komputer, soalnya kaya’nya susah deh nyari di playstore, biarpun ada nanti harus lewat 3rd party server kaya Team Viewer.

    Tapi dapet juga scrcpy yang open source dan gratis. Bisa dipake tanpa setting macem2, cuma aktifkan adb debugging. Terus dobel-klik file .exe nya langsung jalan, jangan lupa colokin dulu hapenya pake kabel usb ke komputer. Di websitenya dibilang bisa juga pake WiFi, tapi saya pernah nyoba dan gak stabil, lambat banget. Gak tau juga sih, siapa tau aja itu masalahnya cuma ada di device saya aja.

    Dan sempet bingung waktu kondisi hape lagi pas layarnya mati, kan ada lock screen, nah itu di klik atau digeser ke atas gak bisa2. Ternyata harus klik kanan dulu baru bisa drag layar ke atas.

    Lihat videonya aja:

    Keren. Main game Merge Dragons! di komputer pake mouse enak juga, apalagi kalo dimainin full-screen (tekan Ctrl+F). Mantap.

    Udah ah.