Category: Uncategorized

Working From H

I live in a village. See a mountain range view with unfinished high-speed rail almost every day. With often quiet neighbors and less noisy highway car volume. It’s a good place for WFH

On the contrary, if I get bored, the first place that comes to my mind is a city. A place is full of fast-walking people minding their own business. Line of buildings that compete to be seen as the grandest. With a lot of people inside them who seem to be working hard.

Sometimes it’s nice to work in a city designed for people to work. But only sometimes, and it all depends.

Nostalgia with Pascal

Pascal is my first programming language. I started learning it in my first year of senior high school. I remember I wrote a code to print “Hello World” in my first class, then my teacher give me a list of reserved words in Pascal to remember. Since then, I learn a lot about programming language.

Back then, I don’t know what I can be by learning computer programming. There was no software company in the province where I live and the capital city is so far away. So I don’t know if a profession called software engineer exists.

I keep playing around with it because it was cool and I also participated in the National Olympiad of Informatics in my country, so I always practice math and programming every Tuesday and Thursday afternoon in my school. But my dream was to graduate from college and become a teacher, which I regretted later in college when I join a teacher training program in a high school in Bandung.

I created a lot of small programs and games with pascal, but sadly I don’t know about GitHub back then so none of those codes got backed up. This week, when I was feeling nostalgic with Pascal, I decided to create one simple game with it. And here it is, Katla (Wordle clone in Indonesian) written in Pascal

https://github.com/afief/katla-pascal

Trapped in ES5

One of the platform that I develop and maintain for my current employer is LG SmartTV App and the oldest TV version we support is LG TV with webOS 3.5. Most of the TVs with this OS were released in 2017, but the OS itself is based on Chromium 38 which was released in August 2014, ~3 years before.

Everything is fine since we transpile our code into ES5 using Babel. But, when I need to update the legacy scripts inside index.html that is not transpiled, something surprised me.

I put a default parameter into a javascript function and it makes the app won’t run on that webOS version. I realized a default parameter is part of ES6 and available since Chromium 49. Luckily we managed to fixed that before it released to production.

It’s funny, I thought that feature was already available for a long time but apparently the OS cannot handle it. As a programmer who’s been coding javascript before the ES6 existence, I already forgot the excitement when welcoming the ES6 features so I thought its released a decade ago. Thanks to caniuse.com we can always check the browser/engine support.

Ngelanturin Minat Baca

Kalian suka kangen enggak si, dengan memori ketika kalian enggak punya agenda lain selain baca komik Doraemon yang baru dibeli dari Gramedia di siang harinya. Dibaca setiap halaman dengan pelan, dinikmati setiap gambarnya, sambil berimajinasi apa yang sedang terjadi dengan Nobita di Jepang sana.

Trus kalian nemu satu halaman yang cukup relate. Seperti ketika mereka membahas tentang Ensiklopedi, dan kalian punya ensiklopedi sendiri di rumah.

Trus kalian berhenti sejenak dari baca komik, untuk coba liat ada apa aja di ensiklopedi. Buka halaman secara acak dan menemukan kalimat yang belum pernah kalian tau, beserta penjelasannya.


Dulu gue punya banyak komik, dari Doraemon sampe Dragon Ball, komplit. Komik – komik itu yang mungkin membuat gue waktu kecil jadi rajin baca. Mulai dari baca ensiklopedi hingga biografi Presiden Suharto.

Tapi entah kenapa gue ngerasa minat baca gue sekarang berkurang. Gue lebih suka nonton tutorial berupa video ketimbang baca tutorial berformat teks secara runut. Kalaupun gue mencari suatu informasi dan ketemu artiket yang berkaitan, gue cenderung untuk hanya mencari informasi yang gue butuhkan di artiket tersebut, tanpa baca secara hati-hati dari kalimat pertama. Dan kadang itu membuat gue kehilangan konteks dari artikel yang gue temukan.

Gue ngerasa gue selalu dikejar waktu. Sehingga informasi yang gue butuhkan harus didapat secepat mungkin, tanpa mempelajari hal lain yang mungkin berkaitan dengan informasi tersebut. Padahal kalo ngomongin waktu, gue cukup rajin buka twitter atau scroll instagram, dan itu justru lebih membuang waktu.

Sampe sekarang gue belum menemukan teknik yang manjur buat mengurangi kebiasaan itu. Yang bisa gue lakukan sekarang adalah cek screen time di iphone untuk lihat persentase aplikasi yang gue buka. Antara Social Networking, Productivity, atau Entertainment. Selama ini Social Networking masih merajai, namun berprogress meskipun lambat berkurang. Semoga gak kecanduan sosmed lagi.

Generator Bilangan Prima

Ini hanyalah contoh tambahan dari tulisan yang gue tulis sebelumnya disini https://afief.net/iterables-iterator-generator.

Untuk membuat 15 bilangan prima, cukup dengan

Iterables, iterator, dan generator function

Ribuan programmer mungkin tidak menyadari bahwa Array di Javascript bukanlah Array yang seutuhnya tanpa Symbol.iterator. Misal, kita punya array

Lalu, dengan for...of..., kita akan lihat value dari variable tersebut satu per satu.

Nilai dari variable tersebut ditampilkan sesuai ekspektasi. Hal itu bisa terjadi karena Array yang kita kenal merupakan iterables. Iterables memiliki fungsi yang membuat nilai-nilai di data tersebut dapat dilihat secara berurutan. Bisa dengan menggunakan statemen for...of..., bisa juga dengan spread operator (...).

Salah satu ciri dari iterables adalah memuat property [Symbol.iterator] yang merupakan function. Secara default property tersebut ada di variable yang memuat Array, String, Set, Map, atau TypedArray. Nah, apa yang terjadi kalau kita ubah Symbol.iterator di itarables menjadi bukan function?

Statement diatas akan melempar error karena for...of... membutuhkan dan memanggil iterable property—Symbol.iterator—agar mendapatkan iterator yang berfungsi untuk mengatur nilai-nilai yang akan diberikan ke variable v.

Membuat Non-Iterable Object menjadi Iterable

Untuk membuat object biasa menjadi iterable, kita perlu menambahkan Symbol.iterator ke dalam object tersebut. Symbol.iterator harus berupa function yang mengembalikan iterator. Iterator harus memuat function next() yang akan dipanggil beberapa kali dan mengatur nilai yang akan dikeluarkan setiap pemanggilan function tersebut.

Misal, kita mempunyai object berupa data member yang dikelompokkan berdasarkan ranking.

Lalu kita perlu membuat object tersebut menjadi iterables agar kita dapat menggunakan Spread Operator untuk membuat array yang berisi semua member yang belum retired. Maka, kita bisa menambahkan Symbol.iterator ke dalam object tersebut sebagai berikut

Kini, setiap kali object members tersebut digunakan di for...of... loop atau di spread operator, variabel rankIndex dan userIndex di set menjadi 0 dan berfungsi sebagai “cursor” yang mengatur nilai mana yang akan dikeluarkan di setiap pemanggilan next().

Tanpa menggunakan spread operator, kita juga bisa mengambil satu per satu nilai dari variable members diatas dengan memanggil function next() melalui iteratornya.

Generator Function

Generator function adalah function yang menghasilkan iterator. Ciri dari function ini adalah adanya tambahan asterik * pada setiap deklarasinya. Di generator function, kita juga menggunakan yield untuk mengembalikan nilai yang dibutuhkan pada setiap iterasi. yield hanya perlu mengembalikan nilai tanpa perlu menambahkan property done.

Berikut contoh pernggunaan generator function menggantikan function iterator manual pada object member

Loop while akan terus berputar sampai kondisi rankIndex >= usersByRanks.length terpenuhi. Dan apabila kondisi usersByRanks[rankIndex][userIndex].retired tidak terpenuhi, maka keyword yield akan digunakan untuk mengeluarkan nilai user selanjutnya.

Selain membuat object menjadi iterables, generator function juga dapat digunakan secara mandiri untuk membuat sebuah iterator. Berikut adalah generator function yang menghasilkan iterator untuk bilangan fibonacci

Generator function diatas menerima satu argumen sebagai jumlah maksimal bilangan fibonacci yang akan dihasilkan.

Blog usang yang “hampir” terlupakan

Kemarin pagi, saat iseng cari nama lengkap sendiri di google, yang muncul di halaman pertama hanyalah beberapa sosial media dan tautan – tautan di website pemerintah dan kampus. Blog dan landing page dengan nama sendiri malah hanya ada di halaman kedua.

Tulisan terakhir di blog ini pun hampir dua tahun lalu. Sungguh sebagai seorang suami yang bertemu istrinya pertama kali di komunitas blogger kampus, ini adalah sebuah wanprestasi.

Blog yang—setelah gue coba kembali login—memunculkan banyak notifikasi update pun kembali gue ulik. Dan gue pun menemukan Block Editor.

Editor wordpress yang masih baru buat gue ini terlihat lebih bersih dari editor sebelumnya. Tak perlu enter dua kali untuk membuat paragraf baru. Cukup enter sekali akan terlihat perbedaan antar paragraf. Kita juga bisa ganti style setiap block di menu yang muncul di block tersebut.

Setiap block juga gampang untuk digeser ke atas maupun ke bawah. Ini berguna banget kalo kita mau sisipin gambar, lalu pindahin gambar itu ke atas / bawah paragraf tertentu.

Kira – kira, apalagi ya fitur di WordPress baru yang belum gue tau dan bikin semangat nulis lagi? 😅

Await loop over an object

I always rely on bluebird each / all to loop over an array. Until someday I meet the case where I need to use await loop over an object. Surprisingly, after trying on chrome inspector, for loop on object is very doable :

Above codes will print a text on variable k with delay every 1 second.

Bekraf Developer Conference

Bekraf Developer Conference

Minggu – Senin kemarin dateng ke salah satu acara dari Bekraf di Aston Simatupang Jakarta Selatan, Bekraf Developer Conference. Ini acara puncak dari rangkaian acara Bekraf Developer Day yang diadakan di beberapa kota sebelumnya.

Selayaknya sebuah konferensi, goal dari acaranya ini adalah merumuskan tantangan para developer dan solusi yang bisa disampaikan ke para pemangku kebijakan. Dari konferensi yang diadakan hingga jam 10 malam tsb, dirumuskan banyak tantangan dan solusi yang dapat kalian lihat disini.

Jadi Fasilitator di Indonesia Android Kejar

Google melalui Google Developers akhir tahun ini mengadakan Google Indonesia Android Kejar (page). Sebagai sarjana kurang ngajar dan developer yang pertengahan Oktober lalu sudah tidak di Inmotion lagi, gue gabung sebagai fasilitator.

Ini jadi pengalaman baru dan berbeda setelah sekian lama gak berada di depan kelas. Kalau di kesempatan lain diundang untuk mengisi workshop dengan kelas yang sudah disediakan, peserta yang jumlahnya sudah fix, dan amplop (ehem) yang jumlah isinya belum pasti namun bisa dipastikan ada isinya. Disini, setiap fasilitator mencari dan mengkoordinasi tempat untuk offline study group, menghubungi peserta untuk join di group whatsapp dan standby dengan problem mereka, serta sedari awal disebutkan rewardnya tidak disebutkan dalam mata uang.

Namun apa yang gue dapet disini jelas gak bisa dibandingkan dengan menjadi fasilitator di tempat lain pada tahun-tahun sebelumnya. Di program ini, gue yang lebih banyak bersentuhan dengan teknologi web, mau gak mau harus belajar Android Studio dengan java-nya yang amat kental. Dengan begitu, motifasi gue sejak tahun 2011 belajar development native android sedikit dipaksakan dan itu bener-bener berhasil bikin gue fasih dan pede untuk lebih dalem di development native android.

Sebelumnya, gue lebih banyak membuat dan mempublish aplikasi mobile dengan Ionic Framework ke playstore. Hanya ada satu aplikasi yang gue develop dengan Android Studio, aplikasi untuk event Google MakeTimeFly (contoh hasilnya) yang di develop selama dua minggu. Sebenernya gue cukup puas dengan aplikasi itu, namun karna waktu development yang cukup singkat, gak banyak konsep dasar yang gue pelajari.