Senin, 01 Februari 2021

Nama Baru, Semangat Baru!

Halo!

Sudah lama sepertinya sejak aku memakai blog ini untuk menulis kisah atau sekadar berbagi informasi (bukan untuk sarana tugas). Aku sempat berencana untuk menulis lagi, khususnya tentang hal-hal yang memang kuminati. Namun, sebelumnya, aku mau ganti nama blog (dan juga alamatnya).

Setelah lama, aku pilih nama Pengembara Kode untuk nama baru. Eh, bukan. Ia justru jadi nama pertama untuk blog ini. Sebelumnya, nama blog ini hanyalah nama lengkapku (dan terlalu panjang). Nama ini muncul setelah melihat kembali sejak pertama kali aku bertemu dengan kode (perintah komputer).

Di antara pengalamanku, ada banyak yang berkaitan dengan dunia ilmu komputer, terutama kode program. Aku merasa mengembara dalam berbagai teknologi dan hasil tulisan-tulisan kode manusia-manusia lain yang telah terlebih dahulu mengetahui, mempelajari, meneliti, dan membagikannya kepada khalayak umum.

Aku melihat bahwa kode program, sependek apa pun, sesederhana apa pun, bisa memiliki pengaruh. Kode program sumber terbuka yang mungkin tidak terlalu terkenal bisa saja membantu menyelamatkan hidup pemrogram lain. Budaya para pemrogram yang turut mendukung sumber terbuka juga menambah ketertarikanku untuk mengembara lebih jauh dalam dunia kode program.

Meski demikian, aku tidak hanya berencana untuk menulis tentang ilmu komputer saja, tetapi juga menulis tentang banyak hal lain yang kuminati. Semoga semua bisa berjalan lancar.

Terima kasih dan selamat datang!

Jumat, 12 Juni 2020

Dunia Sumber Terbuka (Tugas Mata Kuliah Open Source)

Kali ini, saya akan menyampaikan pendapat saya tentang dunia sumber terbuka seusai dengan pertanyaan pada soal UAS mata kuliah Open Source.

1. Ceritakan apa saja yang sudah Anda pelajari mengenai open source!

Di semester empat ini, saya mengambil mata kuliah Open Source. Mata kuliah ini mengajarkan tentang konsep-konsep sumber terbuka dan contoh-contoh aplikasi sumber terbuka beserta cara pakainya.

Kuliah pertama dimulai dengan kontrak kuliah. Seperti mata-mata kuliah yang lain, ada kontrak kuliah yang harus disepakati antara dosen pengajar dengan mahasiswanya.

Dalam mata kuliah ini, dikenalkan tentang konsep sumber terbuka, manfaat sumber terbuka, dan cara-cara berkontribusi dalam dunia sumber terbuka. Manfaat yang bisa diambil antara lain mengasah keterampilan dan menambah portofolio.

Lisensi sumber terbuka juga tak lupa dibahas dalam mata kuliah ini. Lisensi-lisensi inilah yang membuat sumber terbuka ada. Lisensi mengatur cara pemakaian suatu produk sumber terbuka. Lisensi tidak hanya dipakai untuk perangkat lunak, tetapi juga dipakai untuk produk-produk seni yang tidak berupa kode sumber (source code).

Sebagai kernel dan sistem operasi sumber terbuka, dasar-dasar Linux juga diajarkan dalam mata kuliah ini. Penggunaan dasar seperti sistem berkas (file system), editor teks, manajemen pengguna, dan konfigurasi lainnya dibahas.

Aplikasi-aplikasi yang dapat dipakai seperti LibreOffice, OpenOffice, GIMP, dan Inkscape juga dibahas. Empat aplikasi tersebut adalah aplikasi sumber terbuka yang tak kalah saing dengan aplikasi berbayar dan sumber tertutup.

Sempat ada bahasan tentang penggunaan produk Microsoft Office di Indonesia. Masyarakat Indonesia sudah terbiasa dengan produk Microsoft karena pemasarannya cepat dan luas pada awalnya. Instansi pemerintahan pun memakai produk Microsoft Office. Karenanya, banyak kurikulum yang menggunakan Microsoft Office, bahkan meski harus menggunakan yang bajakan.

Git adalah salah satu sistem pengontrol versi (VCS) sumber terbuka yang tak lupa diajarkan dalam mata kuliah ini. Git sudah dipakai secara luas untuk proyek-proyek sumber terbuka dan tertutup.

Tugas besar mata kuliah ini adalah kontribusi ke proyek sumber terbuka. Menurut saya, hal ini bagus untuk melatih diri dalam berkolaborasi dengan orang lain (yang belum tentu kenal pada awalnya). Untuk tugas besar tersebut, saya berkontribusi ke Minetest, salah satu permainan voksel sumber terbuka.

2. Ceritakan apa saja yang sudah Anda lakukan sebagai bentuk dukungan Anda terhadap penggunaan aplikasi open source!

Saya sudah mulai berkontribusi dalam dunia sumber terbuka sejak 2012. Sebagian orang belum tahu bahwa Wikipedia adalah salah satu proyek sumber terbuka. Teks Wikipedia tersedia di bawah lisensi Atribusi-BerbagiSerupa Creative Commons (CC BY-SA 3.0). Di situlah, saya memulai berkontribusi dengan menyunting dan membuat artikel.

Saya turut membuat menyunting artikel-artikel yang menurut saya menarik. Di antaranya, ada “Minetest”, “Peñalara”, “Aturan keterbagian”, “Pepohonan mabuk”, “Daftar rumah sakit rujukan penyakit koronavirus di Indonesia”, dan “Ibun abadi”.

Namun, ada suatu proyek yang benar-benar membuat saya tertarik terhadap dunia sumber terbuka, yaitu Minetest. Minetest adalah suatu permainan video voksel tiga dimensi. Sebagian orang menyebutnya sebagai “plagiat Minecraft”.

Saya mulai bermain Minetest sejak Juni 2014. Kontribusi pertama saya adalah terjemahan dalam bahasa Indonesia (#1751) pada Oktober 2014. Untuk kontribusi kode pertama adalah perbaikan kutu (bugfix) pada Desember 2014 (#1917).

Saya membuat beberapa modifikasi (mod) untuk Minetest. Di antaranya, ada pembuat peta superflat, pemblokiran (ban) tingkat lanjut, dan pembuat peta lain. Semua mod saya dipos ke forum Minetest. Setelah penambahan ContentDB ke dalam Minetest, sebagian mod saya telah dipos ke sana.

Ada beberapa kontribusi fitur yang pernah saya kirim. Tidak semua kontribusi diterima; ada pula kontribusi yang ditolak. Di antara kontribusi fitur yang diterima, ada implementasi konfirmasi registrasi pemain baru ketika menyambung ke server (#6849), implementasi joystick virtual pada layar untuk versi Android (#7126), dan penataan tombol pada layar untuk versi Android (#7240).

Ada pula kontribusi yang masih diulas dan diperiksa oleh para pengembang inti (dan kontributor lain pula). Terkadang, suatu kontribusi butuh waktu beberapa bulan hingga selesai diulas karena keterbatasan pengembang inti. Di antaranya, ada dukungan crosshair untuk versi Android (#7865) serta mode render dengan proyeksi cube map dan equirectangular (#8475).

Pernah pula, saya berkontribusi ke pustaka tiga dimensi three.js pada tahun 2013 dan 2014. Pustaka ini membantu pemrogram JavaScript untuk menggambar citra tiga dimensi dengan mudah. Namun, saya sudah tidak berkontribusi lagi ke pustaka tersebut karena sudah jarang memakai pustaka tersebut.

Menurut saya, kontribusi seiring dengan pemakaian. Saya lebih condong untuk berkontribusi ke proyek-proyek yang memang saya pakai secara aktif, walau saya tidak selalu berkontribusi ke semua proyek yang saya pakai.

3. Apakah Anda masih menggunakan perangkat lunak yang tidak legal? Jelaskan opini Anda mengenai website-website yang menyediakan akses download perangkat lunak bajakan!

Iya, terutama Office.

Menurut saya, situs-situs penyedia perangkat lunak bajakan memang terkesan merugikan pengembang aslinya. Namun, ada hal yang lebih parah, yaitu situs-situs penyedia yang mendistribusikan perangkat lunak secara ilegal, tetapi tetap memasang harga. Sebagian pengembang lebih memilih aplikasinya tersedia gratis secara ilegal daripada membayar ke distributor yang ilegal.

Menurut saya, aplikasi bajakan dapat menjadi dua sisi yang berbeda: menarik perhatian masyarakat atau membuat masyarakat menjauh. Dengan banyak pemakai, suatu perangkat lunak dapat populer. Namun, jika perangkat lunak tersebut kurang matang, masyarakat akan menjauhinya.

Ada dilema untuk situs-situs penyedia perangkat lunak bajakan. Sebagian murid dan mahasiswa membutuhkannya karena tuntutan kurikulum dan dosen. Sebagian program studi memberikan lisensi untuk aplikasi berbayar yang dipakai dalam kurikulum. Namun, tidak sedikit pula yang tidak memiliki anggaran yang cukup untuk melakukannya. Akhirnya, dipakailah perangkat lunak bajakan.

Selasa, 25 Juli 2017

Reviewing my demoscene in JS1k 2015

Untuk versi bahasa Indonesia dari entri ini, klik di sini.

It has been two years, since I know JS1k for first time. I have sent three times, until this year, 2017. This time, I'll discuss about what really happen in my demoscene and how it works.

This is the code:
for(_='er~";Z-1]Xp||W=[]V+1UA[S){QinP0<O14-p]Nstyle "+( Si] 1>h? ") 6<i%8? && ); else C(2 ":" =0; .push( function( 1>h  Sp document.createElement("t = able   for( if( >"+ +"</ === WOh  >i;i++) . .margP= >p)S8*h+7]+=S .Pn~HTML= .appendChild(  1>  j++;6<j  3, b T b Y T Y "autoZvar AV,RV,p=s=h=n=i=j=k=l=m (C= a,cQ a) 20 aQi j="ZkV; m="Z16 l="<td  =\'paddPg:9px;bord~:1px solid #000;background: i p? "cyan red #ff0 +(7>i O ?Zcursor:poPt~;\'onclick=\'C( iU)+ \' ;\' +( "rowspan=2><b b>  td> ,8>i?7>i?j+=l:m=l:k l R[0] k.rev~se().joP(" +m;R[1] j}   21 a)Os?(n=1, =(Oh 6 W 14 p?p+2:pU)%16]++,s--, 0),setTimeout( Q 1)},500)):(n=0,1< ] 7>p%8?C(pU): 2)),Y 0>h?"Reload for new game In hand: "+s+"<br/>  "Your AI\'s +" turnZ   22 aQ 1  ]Q  7> 7<p 15 N,SN   8<p 14> Op 6 pX+ U], X= U]=0} 0  7  15 W(h= 1:0  j=i 7 1 i=8; j 15 2  Oh) ;;) OSi=8+Date.now()%7]QC(iU break}}  23 a?(h=-1,al~t("You  1<c?"wP lose )):1>n (s= =aX, ]=0, 1)  { i 16 A  0:7  i 2 R T  r )  0)}})( ';g=/[^ -MRTY[-}]/.exec(_);)with(_.split(g))_=join(shift());eval(_)
Maybe you're confused with the code above. What is that?

Opening code pack

The code above is the code which has been packaged into small package that will be opened and run automatically. If you see the source code, actually, that is the code when you open the package.

Start to analyse code

// JS1K ENTRY
// Title: Dakon (Javanese Congkak)
// by Muhammad Rifqi Priyo Susanto
First, we make table for container and for information then assign them to some variables while being argument to a function.
b.appendChild(T=document.createElement("table"));
b.appendChild(Y=document.createElement("table"));
Set margin to be auto so that it is at the center of document. Only works for element with CSS display value is table, including table element.
T.style.margin=Y.style.margin="auto";
Variable initialisation, we can use global variable to store it.
var N=[], R=[],
 p=s=h=n=i=j=k=l=m=0;

Entering main function

Z is a main function to do a lot of things in this demo. Z function can do many things, which will explained one by one.
(Z=function(task,param){
  1. Preparing the game.
    Prepare value for each house. Also, prepare tr element for container described above.
    if(!task){
     for(i=0;i<16;i++)N.push(i%8>6?0:7);
     for(i=0;i<2;i++)R.push(T.appendChild(document.createElement("tr")));
     Z(20);
  2. Tell user about now's status, from this on, called "drawing".
    By using created tr element, fill with td elements which already filled with amount of seeds for each houses. If that house is being passed by player, choose another color.
    }else if(task===20){
     for(i=0,j="",k=[],m="";i<16;i++){
      // draw house
      l="<td style='padding:9px;border:1px solid #000;background:"+
       (i===p?(h<1?"cyan":"red"):"#ff0")+
       (i<7&&N[i]>0
        ?";cursor:pointer;'onclick='Z("+(i+1)+")'"
         :";'"
       )+
       (i%8>6?"rowspan=2><b>"+N[i]+"</b>":">"+N[i]+"</td>");
      i<8?i<7?j+=l:m=l:k.push(l);
     }
     R[0].innerHTML=k.reverse().join("")+m;
     R[1].innerHTML=j;
  3. Moves each step.
    }else if(task===21){
     // if there is a seed on hand, go
     if(s>0){
      // declare step activity
      n=1;
      // add 1 to next house
      // move pointer
      N[p=(
       h>0&&p===6 || h<1&&p===14 ?
        p+2:
         p+1
      )%16]++;
      // subtract seed amount on hand
      s--;
      // draw game
      Z(20);
      // set next step
      setTimeout(function(){Z(21)},500)
     // if there is no seed on hand
     }else{
      // stop step activity
      n=0;
      // if seed in pointed house
      // is more than one and
      // not a storehouse
      N[p]>1&&p%8<7?
       // next step
       Z(p+1):
      // else
       // run analyser
       Z(22)
     }
     // tell player
     // if game's over, add notification
     // to refresh for new game
     // if not, tell amount of seed on hand and whose turn is it
     Y.innerHTML=h<0?
      "Reload for new game":
       "In hand: "+s+"<br/>"+(h<1?"Your":"AI's")+" turn"
     ;
  4. Analysing game's condition and computer movement.
    Also will check for special condition, including another rules in game.
    }else if(task===22){
     if(N[p]===1){
      // shooting ("nembak")
      //  if seed amount in pointed house is 1 and the house across is
      //  one of enemy's house then add seed from was house shot to
      //  storehouse and set seed amount in house shot to zero
       if(h<1&&p<7 || h>0&&p>7&&p<15){
        N[h*8+7]+=N[14-p],
        N[14-p]=0
       }
      // bring ("mikul")
      //  if amount of seed in pointed house is 1 and that house is enemy's
      //  and there is seed in left and right houses (not storehouse) then
      //  add seed from those houses to storehouse and set amount of seed
      //  in those houses to zero
       if(h<1&&p>8&&p<14 || h>0&&p>0&&p<6){
        N[h*8+7]+=N[p-1]+N[p+1],
        N[p-1]=N[p+1]=0
       }
     }
     
     // draw game
     Z(20);
     // if pointer is not at storehouse,
     // change player
     !(h<1&&p===7 || h>0&&p===15) && (h=h<1?1:0);
     
     // check player's houses (except storehouse)
     for(i=0,j=0;i<7;i++)N[i]<1&&j++;
     // if all player's houses don't have seed,
     // computer wins!
     j>6&&Z(23,1);
    
     // check computer's houses (except storehouse)
     for(i=8,j=0;i<15;i++)N[i]<1&&j++;
     // if all computer's houses don't have seed,
     // player wins!
     j>6&&Z(23,2);
    
     // if this is computer's turn now
     if(h>0)
      // run
      // Artificial Intelligence
      // by using loop and random select
      for(;;){
       // if sample house is more than zero
       if(N[i=8+Date.now()%7]>0){
        // choose that house
        Z(i+1);
        break;
       }
      }
  5. When game's over.
    }else if(task===23){
     // not anyone's turn
     h=-1;
     // announce who's the winner
     alert("You "+(param>1?"win":"lose"));
  6. Choose house to move next.
    }else{
     // if activity step is NOT running,
     if(n<1)
     // set:
     // - seed amount on hand
     // - pointer
     // - seed amount on hand in pointed house to zero
     s=N[p=task-1],
     N[p]=0,
     // run step activity
     Z(21);
    }

Run this function automatically so that immediately prepare the game.
})();

Last words

Maybe that's what I can tell about how my code works. I remember how happy I was if I could save one byte.