author Ahmad Muhardian

Saya tidak Bisa Bahasa Pemrograman Go, Terpaksa ini yang Saya Lakukan


Ada cerita menarik yang saya alami ketika migrasi Petani Kode dari Blogger ke Hugo. Waktu itu, ketika saya ingin mengimpor konten dari Blogger ke Hugo, ada sesuatu yang kurang dari skrip Go yang disediakan. Kekurangannya tidak mampu membuat atau mengambil gambar (thumbnail) untuk setiap artikel.

Saya kemudian berpikir, mungkin nanti saya bisa edit setiap gambar untuk artikel. Namun, rasanya akan sangat melelahkan melakukannya karena jumlah artikelnya sampai ratusan. Tidak ingin melakukan hal yang berulang-ulang seperti kata orang, Don’t Repeat Yourself di singkat DRY. Saya kemudian membuka isu baru di repositori skrip ini.

Beberapa jam kemudian, Nate Finch membalas isu yang saya buat.

I’d be more than happy to accept a pull request for this, if you want to write it.

Terjemahannya kira-kira begini, “Saya akan sangat senang sekali menerima pull request untuk hal ini, jika anda berkenan menulisnya”

Awalnya saya berharap agar Nate Finch mau meng-update skripnya, tapi malah saya yang disuruh nulis dan saya tidak paham bahasa pemrograman Go sama sekali. Mungkin saja si Nate Finch sedang sibuk, sehingga tidak punya waktu untuk menulis skrip ini lagi.

Karena isu ini adalah kebutuhan saya, maka mau tidak mau saya sendiri yang harus membuatnya.

Gopher

Saya tidak harus belajar bahasa pemrograman Go dari awal. Karena sintaksnya cukup mirip dengan bahasa pemrograman yang pernah saya pelajari. Pertama saya harus pahami dulu skrip yang ditulis Nate Finch.

Pertama, saya menebak-nebak dulu fungsi dari setiap prosedurnya dengan membaca dari bawah ke atas.

Saya kemudian mengetahui, fungsi ini untuk membuat file markdown, meski tidak tahu detail algoritmanya. Saya dapat petunjuk karena melihat ada .md di sana.

func writeEntry(e Entry, dir string) error {
    filename := filepath.Join(dir, makePath(e.Title)+".md")
    f, err := os.OpenFile(filename, os.O_CREATE | os.O_TRUNC | os.O_WRONLY, 0644)
    if err != nil {
        return err
    }
    defer f.Close()

    return t.Execute(f, e)
}

Kemudian naik ke atas, saya menemukan baris kode ini.

if err := writeEntry(entry, dir); err != nil {
    log.Fatalf("Failed writing post %q to disk:\n%s", entry.Title, err)
}

Kode tersebut pasti pemanggilan fungsi yang tadi. Kemudian saya melakukan penelusuran dengan parameternya entry dan dir.

Bolak-balik, atas-bawah. Saya menemukan:

  • parameter dir dari dir := args[1], yaitu argumen yang diberikan ketika menjalankan kode ini. Karena args itu tidak asing bagi pengguna linux seperti saya.
  • parameter entry dari nama alias exp.Entries, karena di sana sepertinya ada perulangan foreach.

Kemudian saya menelusuri asal-usul exp.Entries ini. Ternyata dia barasal dari exp := Export{}. Lalu, Export{} itu berasal dari struk Export.

type Export struct {
    XMLName xml.Name `xml:"feed"`
    Entries []Entry `xml:"entry"`
}

Sampai di sini saya sedikit mengerti algoritma dari skrip ini.

  1. Skrip ini mengubah semua tag XML menjadi struct
  2. Lalu Struct tadi diurai dalam perulangan
  3. Setelah itu, buat file markdown

Kira-kira begitulah yang saya pahami.

Kemudian saya mencoba mengubah atribut yang ada dalam struct. Karena saya kira sudah paham maksud dari struct tersebut. Namun ternyata tidak ada hasil apa-apa.

Saya ingin mengambil URL dari elemen XML ini.

<media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://1.bp.blogspot.com/--fpRGkVGPlg/WGles2AqX4I/AAAAAAAADlM/tJInI6oI6Wo-M0WfJE2aHk1neuIZ3xy0wCK4B/s72-c/thumbnail-image.png' height='72' width='72'/>

Terlihat di sana ada penggunaan namespace untuk elemen tersebut. Kemudian saya mencari dan menemukan jawaban di Stack Overflow.

Setelah mencoba dan berhasil mendapatkan URL-nya, yay!

Penulisan Artikel Hugo di Atom

Namun, ukuran gambar dari URL tersebut adalah 72x72 piksel. Lalu, selanjutnya saya menginginkan gambar yang lebih besar.

Ketemu masalah lagi, gambar tidak bisa diperbesar. Karena tidak ada fungsi untuk replace string pada template Go. Tidak lama kemudian, saya berhasil menyelesaikannya.

Baca juga: Cara Replace String pada Template Go

Setelah semuanya beres, saya kemudian melakukan pull request ke repositori milik Nate Finch. Saat ini masih belum di-review, diterima atau ditolak terserah Nate Finch.

Saya hanya butuh untuk masalah saya saja. Namun, jika anda juga membutuhkannya bisa klon atau fork repositori dari saya.

Luar biasa, tidak pernah belajar bahasa pemrograman Go sama sekali, malah melakukan pull request ke proyek yang menggunakan bahasa pemrograman Go.