content:
Di sela-sela jam kantor waktu istirahat makan siang sempetin dulu buat posting kelanjutan cerpen cinta love at first sighn yang entah dari kapan tau enggak kelar-kelar ini.
Yah berhubung Daftar isi nya secara manual jadi kudu di tambahin lagi untuk updatednya. Dan yang udah penasaran sama kelanjutan dari cerpen ini langsung aja disimak, untuk yang lupa sama part sebelumnya klik aja disini.
Cerpen cinta Love at First Sighn part ~ 08
Love at First Sighn
“Pulang sendiri?” tanya seseorang disampingku, aku menoleh dan mendapati David sedang duduk dimotornya tidak jauh dariku yang sedang menunggu angkutan umum untuk pulang kerumah, hari ini Revan sedang mengikuti latihan sepak bola dan akan pulang terlambat, sementara ibu baru saja telefon dan memintanyya untuk pulang lebih cepat.
“Apa yang kamu lakukan disini?” tanyaku tanpa perlu menunjukkan wajah senang sedikit pun. Toh pria ini juga tidak akan perduli dengan apapun yang akan aku lakukan.
“Pacarmu mana? Bagaimana bisa dia membiarkanmu pulang sendiri seperi ini?” tanya David sambil turun dari motornya dan melangkah mendekat kearahku.
“Bukan urusanmu bukan?” balasku sinis agar sedikit terdengar formal, yang aku yakini itu tidak berpengaruh untuknya.
“Yahh setidaknya aku akan berterimakasih karena dia membiarkanmu untuk pulang bersamaku,” Jawab David sambil tersenyum manis, nah aku bilang juga apa. Pria ini sedikit pun tidak terganggu dengan kalimat dan nada bicaraku, jadi percuma saja untuk marah-marah dengannya.
“Aku tidak pernah mengatakan kalau aku akan pulang denganmu,” balasku cepat.
“Oh ayolah, aku bukan anak kecil lagi. Kalau kamu tidak ingin pulang denganku, biar aku saja yang pulang denganmu, bagaimana?” tanya David dengan ide konyolnya. Sebelum aku sempat membalas, sebuah bus yang akan membawaku pulang berhenti didepanku, beberapa orang yang ikut menunggu di haltle memasuki nya, dan tentu saja aku tidak perlu untuk menjawab pertanyaan dari konyol dari pria itu dan melangkah memasuki bus berniat meninggalkannya.
Dan entah bagaimana bisa, saat aku duduk disalah satu kursi yang ada di bus itu, pria menjengkelkan itu juga duduk disampingku, kaget karena denganseenaknya ia mengikutiku dan dengan seenaknya juga duduk disampingku.
“Hei, apa yang kamu lakukan disini?” tanyaku sebel.
“Mengikutimu, tentu saja. Aku sudah bilang bukan, kalau kamu tidak mau pulang bersamaku, ya itu artinya aku yang harus pulang bersamaku. Tidak ada yang sulit,” jawab David dengan santai.
“Gila, bagaimana dengan motormu?” tanyaku sambil melongok keluar jendela mobil untuk melihat tepat ditempat motor yang tadi di tinggalkan David.
“Kamu yang membuatku gila, dan untuk motorku tenang saja. Aku tidak tinggal di planet pluto tanpa seorang teman,” Balas David dengan santai sambil menunjukkan layar hape nya yang sedang menelfon seseorang, aku menggeleng tidak habis fikir dengan apa yang ada dalam pemikiran pria itu.
Dan selagi aku diam tanpa suara, menebak apa yang ada dalam fikirannya, pria itu sendiri dengan santai mengatakan pada orang yang di telefonnya untuk menjemput motornya yang ada di haltle tidak jauh dari sekolahnya. Terlihat jelas, bahwa pria ini bukan salah satu pria yang bisa ia dapatkan dengan mudah, ralat. Bukan pria yang bisa ia abaikan dengan mudah.
Mungkin memang sebaiknya diam dan mengabaikannya adalah pilihan yang tepat, setelah berfikir demikian, aku langsung memasang handset ketelinga dan menyenderkan kepalaku di sisi jendela, perlahan menutup mataku. Lebih baik aku mengabaikannya saja, entah tindakan apa lagi yang akan pria itu lakukan untuknya.
Perlahan aku merasakan seseorang yang menutupi tubuhku dengan sesuatu dan sebelah mataku mengintip dari balik kepala yang bersender di jendela, tampak David yang masih duduk disamping ku dengan handphone ditangan dan tubuhku tertutupi jaket miliknya, tidak mau berdebat aku hanya terdiam dan membiarkan, ternyata baik juga ini anak fikirku dalam hati.
Love at First Sighn
“Apa yang kamu lakukan disini sendirian?” pertanyaan dari arrah samping itu membuat ku menoleh kaget kearah suara, Revan menyodorkan air mineral kearahku dan tersenyum lembut. Aku membalas senyumannya dan menerima air yang disodorkan kearahku.
“Tidak ada, hanya menghabiskan waktu istirahat saja,” jawabku sekenanya, Revan duduk disampingku dan saat ini aku memang sedang sendiri, karena sahabatku sendiri sedang libur. Sepertinya akhir-akhir ini, aku jarang melihatnya. Apakah sakit yang dideritanya parah.
“Emm, bagaimana dengan David, apakah dia masih mengganggumu. Aku dengar, sekolah mereka tidak jauh dari sini, dan kemarin sepulang sekolah dia mengikutimu sampai dirumah. Aku minta maaf tidak bisa mengantarmu karena ada latihan sepakbola, minggu nanti ada pertandingan persahabatan dengan sekolahnya,” kata Revan tampak merasa bersalah.
“Yaahh, aku tidak heran bagaimana kamu bisa tau. Secara cowok sepopuler kamu tentunya punya banyak menggemar, dan aku bisa menebak dengan pasti apa yang....”
“Aku percaya padamu,” potong Revan sebelum aku menyelesaikan ucapanku, dan dia mengatakan dengan sangat cepat sehingga aku sendiri langsung menatap kearahnya, entah itu memang percaya atau karena ada sesuatu yang ia sembunyikan, tapi melihat dari tatapan tulus yang ia berikan, aku percaya kalau dia memang mempercayaiku.
“Yahh, aku berniat menunggumu selesai bermain, tapi tiba-tiba ibuku menelfon dan memintaku untuk segera pulang lebih cepat, dan saat aku sedang menunggu angkutan umum, David datang menawarkan tumpangan, aku menolaknya dan lebih memilih menggunakan angkutan umum, dan sama sekali tidak menduga kalau pria itu nekat meninggalkan motornya dan mengikutiku menaiki angkutan umum hingga didepan rumahku,” jawab ku sambil menunduk sendikit merasa bersalah.
“Aku senang karena kamu baik-baik saja,” ucap Revan tulus, aku menoleh menatap kerahnya dan tampak senyuman revan membuatku merasa lebih baik, aku tentu saja makin menyukai pria ini. Benarkah jika dia juga merasakan hal yang sama untukku? Pertanyaan itu entah kenapa sering menghantuiku akhir-akhir ini, bagaimana bisa pria sepopuler Revan bisa mengatakan kalau ia menyukaiku.
“Terimakasih, dan aku lebih senang karena kamu bersamaku saat ini,” balasku sambil tersenyum “Terimakasih karena percaya kepadaku,” lanjutku.
“Tentu saja, aku akan mempercayaimu. Dan jangan berfikir aku tidak kesal, aku kesal pada pria itu dan berjanji akan membalasnya,” kata Revan dengan nada serius, aku langsung menoleh kaget kerahnya, dia tidak bermaksud untuk melukai David bukan?
“Mem... balasnya?” tanyaku kaget.
“Emm, iya. Aku akan membalasnya dengan memenangkan pertandingan persahabatan nanti, aku dengar dia juga salah satu pemain sepak bola,” jawab Revan yang membuatku menghembuskan nafas lega, dan lagi. Untuk kesekian kalinya, aku yakin pilihanku mennyukai pria ini tidak salah. Bahkan ia bisa bersikap dewasa, berbanding balik dengan sikap kekanak-kanakan yang David lakukan, benar-benar berbanding balik.
To be continue
Berlanjut ke cerpen cinta love at first sight part 08
Detail cerpen Love at First Sighn
Judul cerpen : Love at First Sighn
Penulis : Mia mulyani
Panjang : 924 word
Serial : Cerbung
Genre : Romantis
Share on: Facebook Twitter Google+ Linkedin Technorati Digg LintasMe
Cerpen cinta Love at first sight part ~ 08
Reviewed by Mia Mulyani
Published: 2016-11-14T21:26:00-08:00
Rating : 4.5
1 komentar:
Leanita QQ mengatakan...
Waaah.... sengaja baca di tengah, untuk lihat kisahnya.. dan bener aja, jadi penasaran untuk baca dari awal.. :)
18 Februari 2017 19.05
Posting Komentar
Posting Lebih Baru Posting Lama Beranda
IBX5A054D4B0EB4C
Favorit Reader
Sinopsis Terlengkap K Movie Hot Young Bloods
Berbicara tentang serial drama terpopuler asal negeri Ginseng, Korea Selatan yang sangat laris di pasaran Indonesia. Tentunya para pencinta ...
Cintaku nyasar di Asus Zenbook #2019PakaiAsus
Hujan. Apa sih yang terfikirkan saat seseorang mengatakan ini. Kenangan? Mantan? Makan? Atau kayak gue yang justru malah keinget jemuran? Na...
Cerpen Cinta My Idola ~01
Ehem, ceritanya sih lagi ngerapiin cerpen sebelum-sebelumnya yang ternyata typo bertebaran dimana-mana. Jadi kali ini paling nggak bisa lebi...
Daftar Isi Cerpen Mia Mulyani
Iseng bongkar-bongkar karya terdahalu, ternyata susah juga nyari ngumpulin cerpen koleksi yang sudah pernah dibikin, untuk itulah akhirnya a...
Cerpen Cinta Love at First Sight Part ~ 17
Wahhh love at First sight nggak nyangka udah panjang banget ya. Kali ini lanjut ke Love at First sight part 17 dan sepertinya masih nggak...
Cinta Ku di Sia-sia
Haaiiii... datang lagi nih dengan cerpen cinta barunya. Wkwkkw, bukannya menyelesaikan I am Falling in love With you nya malah muncul denga...
Cerbung Romantis Mr Hero vs Mrs Zero ~ 30 {END}
Prok prok prok... Ayo mari kita bertepuk tangan bersama, akhirnya ketemu yang namanya Ending juga ini cerbung romantis Mr Hero vs Mrs Zero ...
Cerita Misteri Prince and Princess ~ 01
Cerpen Misteri Prince and Princess _ cerita pertama yang akan Mia post di blog ini. Nggak tau si, menurut reader semua cerita ini bagus ata...
Cerbung Romantis Mr Hero vs Mrs Zero Part ~ 20
Mumpung masih ada waktu luang, admin posting dulu deh ini lanjutan Mr Hero vs Mrs Zero nya ya. Buat yang sudah penasaran bagaimana kelanjut...
Kemeriahan Grand Opening Bolu Awak
Siapa sangka siapa duga, kenikmatan dipenghujung akhir tahun ini begitu banyak yang dirasa (Rezeki Anak Solehah). Terbukti dengan diawal b...
Copyright © Mia Mulyani. All Right Reserved. Designed By Templatoid Published By Kaizen Template - Powered By Blogger


content:
Tentu sekarang ini situs judi bola di Indonesia semakin bertaburan dan mudah di cari secara online. Tinggal mengetikan saja situs judi bola nanti akan keluar semua pilihan yang dapat kalian pilih. Tetapi yah seperti yang diketahui tidak semuanya terpercaya dan sebaiknya kalian jangan sembarangan memilihyah. Salah satu yang menentukan sebuah situs adalah terpercaya atau tidak adalah dengan metode transaksi depo dan wd yang tersedia di situs tersebut. Karena tidak semua situs judi bola tersebut aman dalam melakukan transaksi dan menyediakan banyak metode yang berbeda.
Karena itu lah sebaiknya sebelum memilih situs judi bola yang ingin kalian mainkan di Indonesia pelajari terlebih dahulu situs tersebut dan metode depo dan wd apa saja yang tersedia. Tentu pastinya kalian juga harus pelajari cara dalam melakukan metode transaksi tersebut dengan baik. Karena itulah kami ingin sedikit membagikan tentang cara transaksi depo dan wd di situs judi bola Indonesia dan dengan cepat menentukan pilihan mu.
Untuk metode transaksi situs judi bola Indonesia dahulu masih kerap menggunakan transaksi bank lokal. Tetapi sekarang ini semakin banyak metode depo dan wd yang tersedia yang dimana dengan menggunakan aplikasi dari smartphone anda. Dimana metode pembayaran yang di tambahkan adalah seperti Ovo, Gopay, dan beberapa juga ada yang bisa melalui pulsa.
Dalam melakukan transaksi menggunakan OVO yang pertama perlu kalian ketahui adalah beberapa info berikut ini :
Saldo Maksimum / Limit : Rp 2.000.000,- (OVO Club) / Rp 5.000.000,- (OVO Premier)
Minimum Jumlah Top Up : Rp 10.000,-
Maksimal Top Up per bulan : Rp 1.000.000,- (OVO Club) / Rp 10.000.000,- (OVO Premier)
Masa Berlaku : Tidak Terbatas
Setelah itu untuk melakukan Deposit adalah dengan melakukan transfer dengan menggunakan aplikasi OVO. Ikutin beberapa langkah berikut yang telah kami rangkum untuk anda :
Buka aplikasi OVO lalu login masuk ke akun kamu.
Tap menu Transfer lalu pilih opsi Rekening Bank.
Masukkan jumlah nominal uang deposit yang akan kamu transfer.
Pilih bank tujuan transfer lalu masukkan nomor rekening situs poker online tempat kamu bermain. Untuk pesan, kamu bisa mengisinya atau biarkan kosong.
Jika semua sudah terisi, tap Transfer.
Cek ulang data transfer kamu seperti nama bank, nomor rekening dan jumlah nominal transfer. Jika sudah benar, tap Konfirmasi.
Masukkan kode keamanan akun OVO kamu dan tunggu transaksi diproses sampai selesai.
Biasanya dengan menggunakan metode transaksi OVO ini dalam hitungan detik saja dana akan sudah masuk kedalam akun judi bola anda. Semoga yang kami berikan informasi mengenai cara deposit melalu ini dapat berguna untuk anda Selamat Bermain.
work_outlinePosted in Bloglabel_outlineTagged cara transaksi lewat ovo, deposit lewat ovo, judi bola deposit ovoforumLeave a Comment on Cara Transaksi Depo dan WD di Situs Judi Bola Indonesia

content-type: text/plain

warc-identified-content-language: ind,eng

warc-type: conversion

label: id


content:
Bonus New Member Situs Agen Judi Online Pokerjon – Judi online memang merupakan aktivitas yang tidak bisa lepas dari masyarakat Indonesia. Masyarakat Indonesia bahkan penduduk dunia sudah menjadikan aktivitas perjudian menjadi sesuatu yang sangat menghasilkan. Selain sangat menghasilkan ternyata memainkan permainan judi sangat menyenangkan apalagi jika dimainkan bersama teman.
Sudah banyak orang bermain judi karena sudah terbukti menghasilkan, bahkan sebelum adanya judi online seperti sekarang. Dengan adanya agen judi online seperti pokerjon di masa sekarang, tentunya akan semakin bisa menambah keuntungan serta kenyamanan anda pada saat bermain. Bermain judi secara online memang nyatanya dapat memberikan kemudahan para pemain judi untuk bermain dari mana saja dan kapan saja.
Bonus New Member Situs Agen Judi Online Pokerjon
Seperti yang sudah dijelaskan diatas yang menyatakan bermain poker online dan sebagainya sangat jelas bila kita bermain di situs agen judi online pokerjon. Mengapa demikian? Ya, karena sudah sangat jelas beberapa keutungan yang hanya bisa kalian temukan di pokerjon. Untung bermain di pokerjon bisa kita buktikan langsung bahkan ketika anda baru saja membuat akun baru disana.
Setelah membuat akun baru di pokerjon maka anda akan mendapatkan bonus new member. Apa itu bonus new member? Bonus new member merupakan bonus yang diberikan oleh pihak agen situs judi online kepada para New Member saja. Para bettor yang baru saja membuat akun bersama pokerjon kami sangat menyarankan untuk memaksimalkan bonus new member ini karena ini merupakan sesuatu yang hanya diperuntukan untuk para member baru saja.
Ketentuan bonus new member di pokerjon adalah dimana bonus ini terbagi menjadi 2x transaksi. Simulasinya adalah anda akan mendapatkan bonus 20% pada saat deposit pertama dan 30% nya lagi ketika deposit kedua. Jadi total dari akumulasi bonus new member ini adalah 50%, ini merupakan bonus yang luar biasa dan wajib kalian dapatkan. Selain itu juga banyak bonus lainnya yang tidak kalah dari new member ini, seperti ada bonus turn over, referral dan masih banyak lagi.
Artikel Lain : Slot Online Indonesia Ternama
Bonus – Bonus Menarik yang Hanya Ada di Pokerjon
Bonus new member merupakan bonus yang sangat menarik tetapi selain itu ada bonus menarik lainnya. Jadi untuk para member yang sudah bermain lama di pokerjon masih juga bisa menikmati bonus – bonus menariknya. Seperti bonus referral yang bisa anda gunakan terus menerus seumur hidup dan sangat mudah sekali mendapatkan bonus yang satu ini dimana kita hanya perlu menyebarkan kode referral yang anda dapatkan di pokerjon.
Semakin banyak orang yang menggunakan kode referral yang telah disebarkan maka semakin banyak pula yang akan anda dapatkan dan ini bisa dimanfaatkan seumur hidup bonusnya bisa sampai dengan 15%.Tentu sangat menguntungkan kan? apalagi ditambah fasilitas – fasilitas lainnya yang akan membuat keseruan anda semakin bertambah ketika bermain bersama pokerjon.
Dengan bermain bersama pokerjon maka ada akan mendapatkan semua keunggulan dari agen idn poker terbaik dan terpercaya seperti bonus, tampilan situs , customer service 24 jam dan masih banyak lagi. Pastinya semua orang pasti menginginkan hal tersebut, maka dari itu daftarkan diri anda sekarang juga dan claim bonus new membernya sekarang juga.
Sekian dari pembahasan kali ini tentang bonus new member di pokerjon. Semoga bisa menjadi masukan dan ilmu untuk anda semuanya, terima kasih.
Posting pada InformasiDitag agen idn poker, agen judi online, pokerjon, situs judi online, situs judi online bonus new member


content:
Setelah membahas Forth dan juga Lua, kali ini saya akan membahas bahasa BASIC (Beginners’ All-purpose Symbolic Instruction Code). Bahasa BASIC ini merupakan bahasa yang sudah ada lama sekali (sejak 1964), tapi ada beberapa hal yang baru-baru ini terjadi yang membuat saya ingin menuliskan tentang bahasa BASIC:
Smile Basic 4 baru dirilis untuk game console Nintendo Switch
Saya melihat seseorang di kontak Facebook yang sedang memberikan pelatihan bahasa BASIC dengan Just BASIC dan banyak peminatnya
Programmer COBOL kembali dibutuhkan di masa Covid-19
BASIC berulang tahun yang ke 56 tanggal 1 Mei
Tiga hal pertama tersebut menunjukkan bahwa:
Minat terhadap bahasa lama (BASIC dan COBOL) ternyata masih cukup besar
Bahasa-bahasa lama ini masih terpakai (tapi dalam artikel ini saya hanya membahas BASIC)
Setelah membaca mengenai SmileBASIC 4, saya segera membeli softwarenya dari Nintendo Shop. Harga softwarenya 25 USD (masih lebih murah dari kebanyakan game di Nintendo Shop), plus harus membeli slot upload seharga 5 USD jika kita ingin mengupload program kita ke server SmileBASIC.
Setelah mencoba-coba lagi Smile BASIC, ternyata memang bahasa BASIC ini masih bisa membuat saya tersenyum Saya masih bisa membuat program dalam bahasa ini dengan cepat, dan bisa membuat animasi sederhana untuk Joshua dalam waktu sangat sebentar (dalam hitungan menit). Saya juga teringat dulu masa-masa saya belajar sendiri bahasa BASIC. Jadi saya ingin bercerita lebih jauh mengenai bahasa BASIC ini.
Animasi huruf yang dibuat hanya dalam beberapa menit
Di masa kejayaannya, BASIC ada di mana-mana:
Ada novel petualangan yang di dalamnya ada kode bahasa BASIC (pernah saya tulis di sini)
Berbagai majalah memberikan listing program bahasa BASIC
Berbagai buku teks mahasiswa juga diberi kode dalam bahasa BASIC untuk bisa langsung dicoba
Banyak orang menghindari bahasa BASIC karena sifatnya yang tidak terstruktur. Ini memang benar untuk BASIC generasi pertama. Ilmuan komputer Djikstra sering dikutip karena mengkritik BASIC, begini katanya:
“It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration”,
Edsger W. Dijkstra – “How do we tell truths that might hurt” . Selected Writings on Computing: A Personal Perspective
Tapi sebenarnya di tulisan lengkapnya, Djikstra tidak cuma mengkritik BASIC, tapi juga bahasa lain seperti FORTRAN dan COBOL yang sampai saat ini masih dipakai.
Setelah kritiknya itu, sebenarnya bahasa BASIC masih berkembang dan generasi berikutnya sebenarnya sudah cocok menjadi bahasa pemula dan bisa digunakan untuk mengajarkan berbagai konsep pemrograman yang baik.
Beberapa Generasi
Bahasa generasi pertama memakai nomor baris, konsep fungsi dan subrutinnya terbatas, dan sulit membuat struktur data kompleks. Contoh keterbatasan adalah: fungsi hanya sekedar formula, tidak bisa membuat fungsi rekursif. Subrutin memakai nomor baris (tidak memakai nama) dan tidak memiliki variabel lokal. Beberapa implementasi bahkan tidak memiliki DEF untuk membuat fungsi. Contoh versi BASIC ini adalah yang ada pada ROM PC XT, dan ROM berbagai hardware komputer rumah tahun 80an.
Seperti apa sih program BASIC ini? ini adalah program sangat sederhana yang tidak berhenti menampilkan “HELLO WORLD”. Programnya mudah dimengerti: cetak tulisan hello world, dan berikutnya GOTO 10, artinya ulangi lagi baris 10, dst.
10 PRINT "HELLO WORLD"
20 GOTO 10
BASIC sangat populer sehingga pernah dibuat dua standard (ISO/ANSI) tentang bahasa BASIC (yang core dan yang full). Kedua standardnya hanya mencakup generasi pertama yang masih menggunakan nomor baris. Bahasa BASIC juga masuk ke banyak device yang bukan PC, misalnya game console dan juga kalkulator.
Saya program HP 39gs untuk menampilkan hari pasaran dari sebuah tanggal
BASIC generasi kedua (Structured Basic) tidak lagi memakai nomor baris (walau beberapa versi secara opsional membolehkan nomor baris), mendukung fungsi dan subrutin dengan variabel lokal, dan mendukung user defined type (struct/record). Contoh BASIC generasi kedua adalah Microsoft QuickBasic.
Tanpa nomor baris, program hello world bisa mirip Python 2 (Python 3 mewajibkan kurung). Apalagi BASIC ini sifatnya tidak case sensitive, jadi PRINT sama dengan print.
print "hello world"
BASIC generasi ketiga sudah seperti bahasa pemrograman lainnya yang berbasis objek, hanya saja syntax-nya meniru BASIC yang lama. Contoh BASIC generasi ketiga ini adalah Visual Basic .NET. Tapi saat ini minat bahasa BASIC generasi terbaru sudah mulai berkurang, bahkan Microsoft sudah tidak akan menambah lagi fitur di Visual Basic.NET.
Menurut saya sendiri, BASIC generasi kedua ini sudah cukup ideal untuk berbagai aplikasi kecil dan program ukuran kecil yang fun. Jika ingin memprogram berorientasi objek, sekalian saja pakai Java/C#/Python atau bahasa lain.
Sederhana
Kenapa bahasa BASIC sempat populer dibandingkan bahasa lain? menurut saya ini gabungan beberapa hal. Masalah utama adalah Keterbatasan hardware: sulit membuat compiler dengan memori terbatas di hardware awal masa komputer personal (awal 1980an). Jadi alternatifnya adalah: memprogram dalam assembly, atau dalam bahasa lain yang sederhana. BASIC menang dibandingkan bahasa lain (misalnya FORTH yang pernah saya bahas di sini), karena sangat mudah dimengerti walaupun baik BASIC maupun FORTH keduanya merupakan bahasa yang interaktif.
Cassette Basic. Pengguna PC XT dulu akan ingat ini. Memori yang bisa diakses kurang dari 64kb
Kesederhanaan Bahasa BASIC ini bisa dilihat dari jumlah statement dasar yang dimiliki. Versi awal yang dikembangkan pencipta BASIC: John G. Kemeny dan Thomas E. Kurtz (disebut Darmouth BASIC) hanya punya 15 statement (LET, PRINT, END, DATA, READ, GOTO, IF, FOR/NEXT, GOSUB, RETURN, DIM, REM, STOP, DEF). Plus ada beberapa fungsi built in seperti misalnya ABS untuk mendapatkan nilai absolute atau SIN/COS/TAN untuk trigonomoetri.
Dengan kesederhanaan ini, mengimplementasikan interpreter BASIC bisa dilakukan dengan memori kecil. Salah satu kesuksesan awal Microsoft (waktu itu namanya masih Micro Soft, bukan satu kata) adalah produk interpeter BASIC yang ditulis oleh Bill Gates dalam assembly (kodenya sudah dibuka, ada di github). Bahkan di kode assembly yang relatif kecil, Bill Gates bisa menyembunyikan Easter Egg.
Kesederhanaan bahasa BASIC juga bisa digunakan sebagai latihan ketika mengimplementasikan sebuah interpreter. Saya sendiri pernah mengimplementasikan interpreter BASIC dalam JavaScript 10 tahun yang lalu (masih berfungsi ada sampai sekarang).
Instan
Kebanyakan implementasi BASIC, bahkan dari jaman PC XT dulu, eksekusinya hampir instan. Dari mengetik kode hingga berjalan tidak dibutuhkan waktu berdetik-detik atau bermenit-menit. Selain itu hampir semua implementasi BASIC menggabungkan editor dan interpreter, jadi mengetik, menjalankan program, dan bahkan mendebug bisa dilakukan di environment yang sama.
Experience memprogram BASIC ini menurut saya masih sulit ditemui di sistem lain, kecuali jika kita mendownload IDE super lengkap dengan ukuran besar. Bahkan berbagai IDE modern dengan fitur lengkap sering sulit dikonfigurasi.
Meskipun cycle untuk mengedit dan menjalankan program bisa cepat, tapi program yang ditulis dalam BASIC relatif lambat. Untungnya sejak awal sebagian besar implementasi BASIC bisa memanggil kode mesin.
Kode dalam bahasa BASIC umumnya dijalankan dalam sebuah interpreter, tapi sejak puluhan tahun yang lalu sudah ada banyak compiler Bahasa BASIC yang bisa menghasilkan native code. Jadi tidak benar jika bahasa BASIC pasti harus diinterpretasi.
Menengok implementasi BASIC Modern
Saat ini ada banyak implementasi BASIC modern, dan saya sudah mencoba cukup banyak. Saya tidak akan membahas semuanya, dan hanya yang menurut saya menarik saja.
QB64
QB64 ini open source dan meniru user interface QBasic/QuickBasic. QB64 tersedia untuk multi platform. Meskipun meniru QBasic, fitur-fitur baru yang dimiliki sangat banyak, termasuk untuk membuat aplikasi serius atau game 3D dan bahkan aplikasi Android. Sayangnya saya tidak suka implementasinya: kode ditranslasikan ke C, alalu dicompile dengan compiler C. Hasilnya: waktu kompilasinya lama, tidak bisa menjalankan program dengan instan seperti QBasic/QuickBasic. Bahkan saat ini versi terbaru dari github yang saya download gagal menjalankan aplikasi hello world.
Just BASIC
Just BASIC ini hanya tersedia di Windows, gratis tapi tidak open source. Kelebihannya dibandingkan solusi yang lain adalah: bisa digunakan untuk membuat aplikasi Windows yang memakai native control di Windows. Just BASIC memakai pendekatan interpreter, dan eksekusinya instan, ketika mengklik RUN, program akan langsung berjalan.
AppGameKit Classic
AppGameKit Classic adalah implementasi BASIC berbayar untuk membuat game. Saya mengenal AppGameKit ini dari Humble Bundle beberapa tahun lalu dan ternyata sampai saat ini masih terus diupdate. Harga penuh aplikasi AppGameKit relatif mahal, tapi sering bisa dibeli murah dengan berbagai diskon dan bundle dari berbagai situs. AppGameKit dapat dipakai untuk membuat game, baik desktop, web, maupun mobile.
Engine utama AppGameKit ini ditulis dalam C++, dan bisa dipanggil langsung dari C++ jika kita mau, tapi mode untuk menjalankan kode BASIC adalah interpretasi. Bahasa BASIC yang didukung adalah generasi 2, jadi kita bisa membuat tipe data sendiri, tapi tidak bisa memakai OOP.
Beberapa tahun lalu ketika mencoba ini, rasanya cukup fun. Cukup mudah membuat game sederhana. Bahkan ada mode sangat bagus untuk membuat game mobile: mode broadcast. Asalkan device Android kita ada di subnet yang sama, kita cukup menjalankan AppGameKit Player di Android, tekan Broadcast di PC, dan akan muncul gamenya di device Androidnya, instan.
SmileBASIC 4
Saya mendengar berita rilis SmileBASIC di Hacker News, jadi ini relatif baru buat saya. SmileBASIC ini juga tersedia untuk game console Nintendo 3DS. Walaupun sulit sekali memprogram dengan layar kecil 3DS, ternyata aplikasi ini cukup populer sehingga mereka membuat versi Nintendo Switchnya.
Bandingkan jumlah memorinya dengan PC XT
Nintendo Switch bisa dihubungkan ke monitor dengan HDMI dan bisa dihubungkan juga ke keyboard dan mouse USB (dan bahkan juga headset USB). Tanpa keyboard USB, kita bisa memprogram dengan keyboard di layar sentuh, tapi ini kurang efisien. Jadi selama saya mencoba SmileBASIC, saya selalu menggunakan keyboard dan mouse dan layar besar (SmileBASIC mendukung sampai dengan resolusi 1280×720).
AppGameKit mudah diprogram, tapi memiliki kelemahan: kita harus mencari sendiri asset (gambar, musik, efek suara) untuk game atau membeli pack terpisah. Sedangkan SmileBASIC memiliki ratusan sprite built in, puluhan music background built in, dan juga puluhan sound effect. Tersedia juga editor bitmap built in jika gambar yang ada tidak seperti yang kita mau.
Tapi SmileBASIC memiliki kelemahan dari segi fitur bahasa BASIC-nya. Meskipun menggunakan BASIC generasi 2 (tanpa line number), tapi SmileBASIC tidak mendukung user defined type.
Penutup
Bahasa BASIC memang sudah tidak terlalu banyak dipakai dibandingkan masa kejayaannya, tapi belajar bahasa ini cukup menyenangkan. Masih ada orang yang bisa mendapatkan uang dari memprogram BASIC. Beberapa game ditulis dalam bahasa BASIC, demikian juga banyak aplikasi sederhana ditulis dalam BASIC. Beberapa aplikasi dalam berbagai bank masih ditulis dengan Visual Basic 6. Meski demikian, jika Anda pemula dan baru mulai belajar pemrograman sebaiknya belajar bahasa lain saja, seperti Python atau PHP.
Belajar bahasa BASIC bisa dipelajari sekedar untuk iseng. Bahasanya sederhana, tidak butuh banyak waktu untuk belajar, tidak seperti belajar Rust, Haskell atau Scala. Bisa juga belajar BASIC supaya bisa belajar membuat interpreter atau compilernya.
This entry was posted in bahasa, umum on May 1, 2020 by admin.
Multithreading dan Multiprocessing di Python
2 Replies
Python adalah salah satu bahasa yang sangat saya sukai, tapi bukan berarti bahasa ini tidak memiliki kekurangan, di tulisan ini saya ingin menunjukkan kekurangan Python dalam memproses data kompleks dengan Python murni (pemrosesan tidak dilakukan di modul native). Kompleks di sini maksudnya pemrosesannya CPU bound (batasan programnya adalah kemampuan CPU, bukan memori atau I/O).
Kelebihan python jelas sangat banyak: mudah dipakai, librarynya banyak, sintaksnya bersih dan mudah dibaca. Library Python untuk berbagai hal (terutama AI) sudah sangat banyak dan banyak yang ditulis dalam native code (C/C++). Dengan library eksternal yang ditulis dalam bahasa C/C++ (kebanyakan library AI), kita tidak perlu memikirkan apapun dalam hal pemrosesan data besar dan kompleks, karena itu dilakukan di level native code.
Multithreading dan Global Interpreter Lock
Dalam banyak bahasa (misalnya C atau Java): jika saya punya algoritma yang lambat untuk data besar, dan datanya masih masuk memori, saya biasanya bisa menyelesaikannya dengan thread. Saya hanya perlu mempartisi data, membuat banyak thread dan mengolah tiap potongan data di thread yang berbeda. Partisi data di sini biasanya mudah: jika bentuknya array, tinggal dibagi saja per N element.
Di Python, solusi dengan multithreading tidak akan berjalan baik karena adanya Global Interpreter Lock. Atau tepatnya lagi: bisa jalan, tapi tidak lebih cepat dari single thread. Adanya GIL berarti di kebanyakan kasus beberapa thread di Python tidak bisa jalan berbarengan. Threading di Python hanya berguna untuk proses yang menunggu I/O (akses file, akses socket, dsb). Jadi jika kita punya prosessor 32 core sekalipun, Python tidak bisa optimal memakai semua core tersebut dengan module threading.
Kadang-kadang mengganti interpreter dengan pypy sudah cukup menyelesaikan masalah komputasi yang berat. Pypy adalah implementasi interpreter Python yang memakai teknologi JIT (Just In Time Compiler), jadi lebih efisien walaupun tetap satu thread saja. Tapi Pypy ini tidak selalu berhasil:
Pypy tidak 100% kompatibel dengan Python
Ada modul-modul yang tidak bisa dipakai di Pypy
Versi Pypy ketinggalan dibandingkan versi Python resmi
Solusi lain seperti Cython juga bisa dipakai, tapi lebih rumit dari sekedar mengganti interpreter.
Multiprocessing
Python memiliki modul multiprocessing, artinya kita bisa menjalankan sebuah fungsi di subproses baru. Overhead untuk memulai proses baru cukup besar, jadi ada kita bisa juga memakai process Pool supaya lebih optimal. Di titik ketika kita membuat subprocess, isi memori saat ini di proses utama akan di-clone ke memori yang sifatnya copy-on-write (COW). Artinya: selama memori tersebut tidak diubah, maka tidak akan dibuat salinannya, hanya akan dishare (dipakai bersama).
Lalu bagaimana kita bisa memanggil fungsi di proses baru dan mendapatkan hasilnya di proses utama? jawabannya adalah: setiap parameter akan di-serialize dan dikirim ke subproses baru. Hasil kembalian fungsi diserialize oleh subproses dan dikembalikan ke proses utama. Ini cukup untuk menyelesaikan banyak masalah. Tapi pendekatan ini tidak sempurna. Proses serialization dilakukan menggunakan modul pickle. Ini titik yang harus diwaspadai, perhatikan contoh kecil ini di mana kita memproses XML dengan minidom.
from xml.dom import minidom
import pickle

myxml = """<?xml version="1.0"?>
<test>
	<item id="11">
		<name>red thing </name>
		<price>100</price>
	</item>
	<item id="12">
		<name>blue thing</name>
		<price>200</price>
	</item>
</test>
"""

doc = minidom.parseString(myxml)

items = doc.getElementsByTagName("item")

firstitem = items[0]

print(firstitem.toxml())

with open("test.bin", "wb") as f:
    f.write(pickle.dumps(firstitem))
Hasil dari pickle bisa dilihat di file test.bin dan jika dilihat dengan editor akan terlihat bahwa ada ‘blue thing’, padahal tidak ada di firstitem. Modul pickle akan melihat semua atribut yang dimiliki oleh sebuah node dan mempickle semuanya, dalam hal ini: parent-nya juga, dan karena parent memiliki semua child, maka semua child-nya juga ikut.
Jika kita menggunakan modul multiprocessing dan mengirimkan satu node ke subprocess, maka yang niatnya hanya mengirimkan satu node, ternyata mengirimkan seluruh DOM ke subprocess. Secara umum, ketika mengirimkan objek apapun, maka kita mulai harus memikirkan: ketika serialisasi dilakukan, apa saja yang akan dibawa oleh objek tersebut.
Objek yang diserialize ini tidak masuk ke memori COW, tapi Python akan mengalokasikan memori baru. Bayangkan jika kita mengirimkan copy seluruh DOM ke semua subprocess (misalnya ada 10 subprocess), hasilnya: penggunaan memori jadi sangat besar. Jika DOM-nya besar, proses serialisasi dan deserialisasi ini juga sangat lambat.
Dalam kasus tertentu, cara yang lebih efisien adalah: kita letakkan apa yang ingin kita proses di objek global, objek global ini akan di-clone ke proses baru (tidak melalui serialization). Ketika kita memanggil subprocess, kita hanya mengirimkan string atau bilangan yang berupa ID. Subprocess kemudian bisa mengakses variabel global berdasarkan ID tersebut. Cara ini efisien dalam mentransfer data dari proses utama ke subprocess, tapi tidak bisa dilakukan untuk sebaliknya. Ketika mengembalikan hasil proses, kita tetap harus memikirkan objek yang kita kembalikan. Untuk nilai kembalian ini, tidak ada trik yang mudah, kita harus berhati-hati agar serialisasi tidak berjalan liar.
Modul multiprocessing juga memiliki beberapa kelas khusus supaya kita bisa mentransfer data dengan lebih efisien antar proses (Queue, Pipe, Manager), tapi penggunaanna cukup rumit dan tidak intuitif, dan rawan salah. Ini juga tidak menyelesaikan masalah serialisasi data kompleks.
Mungkin sebagian orang akan bilang: ah kan gampang, cukup kita lihat setiap kelas yang kita miliki dan cek satu persatu membernya supaya jelas apa yang diserialisasi. Ada beberapa masalah:
Kode kadang ditulis anggota team lain, dan tidak jelas tipe data sebuah variabel member, lebih sulit lagi jika ada list atau dictionary yang tipe datanya tidak jelas
Kadang kita memakai library orang lain (contoh kecil: XML, Graph), yang tidak mudah untuk dimodifikasi. Andaikan bisa dimodifikasi: kita harus memaintain library itu jika ada versi baru
Untuk masalah pertama: Python saat ini memiliki type hint, kita bisa memberikan hint apa tipe sebuah variabel/member. Tipe data tidak akan dicek oleh interpreter python, tapi IDE yang kita pakai bisa membantu mengecek tipe data. Untuk masalah kedua: ini lebih sulit, kita bisa menulis serializer/pickler khusus untuk object tertentu (bisa dibaca di dokumentasi Python), atau menggunakan setstate__ dan __getstate untuk memproses secara khusus member variable tertentu.
Solusi Third Party
Dulu orang menyarankan: pakai saja Jython (implementasi Python dalam Java) atau IronPython (implementasi Python dalam .NET), keduanya tidak memakai Global Interpreter Lock, jadi thread bisa berjalan cepat. Tapi masalah dengan solusi dari pihak lain adalah: maintenance. Sekarang ini baik Jython maupun IronPython tidak dimaintain lagi. Belum lagi dukungan modul yang kurang lengkap.
Saat ini ada beberapa pendekatan lain untuk memudahkan masalah multithread/multiprocess, misalnya Ray, tapi ini masih kurang populer dan kode kita harus diubah untuk mengikuti model komputasi Ray, library ini pun punya masalahnya sendiri. Tentunya saya tetap khawatir dengan library apa saja dari 3rd party bahwa proyek semacam ini tidak bertahan lama.
Data Ukuran Sedang
Masalah yang saya contohkan di atas itu adalah kasus yang sudah saya temui beberapa kali. Jika dari awal diketahui bahwa data akan sangat besar, saya akan memecah data menjadi banyak bagian, lalu membuat proses khusus yang bisa memproses data yang sudah dipecah, atau bahkan menggunakan sistem terdistribusi. Jika data sangat kecil, saya juga tidak akan menggunakan threading sama sekali, cukup satu proses.
Perlu dicatat bahwa jika kita terlalu buru-buru berusaha memakai sistem terdistribusi untuk data yang masih muat di memori, performancenya justru tidak bagus (belum lagi biaya ekstra yang dikeluarkan untuk banyak server). Artikel tahun 2014 ini merupakan contoh yang bagus bahwa kadang command line tools bisa 235 kali lebih cepat dari Hadoop. Ini kasus yang sangat ekstrem, tapi pelajaran yang bisa dipetik adalah: kalau datanya kurang besar, overhead memakai Hadoop atau sistem lain kadang sangat besar.
Contoh yang biasa saya temui adalah: ada program yang hanya memproses sebuah file, biasanya ukurannya puluhan megabyte, tapi kemudian filenya bertumbuh jadi beberapa gigabyte, nilai ini besar (beberapa puluh kali lebih besar dari input biasanya) tapi masih jauh di bawah memori yang tersedia (misalnya server dengan memori 16-256 GB). Program yang tadinya butuh beberapa detik menjadi beberapa menit atau bahkan puluhan menit, sedangkan ketika diubah menjadi multiprocess, tiba-tiba pemakaian memori Python menjadi beberapa puluh gigabyte (karena masalah serialization) dan malah lebih lambat lagi. Memperbaiki skrip seperti ini bisa butuh waktu yang cukup lama.
Secara umum saya tidak suka dengan pendekatan multiprocessing ini: saya memakai bahasa yang managemen memorinya otomatis (contoh: java, C#, Python, Javascript) karena ingin memori diatur otomatis oleh sistem. Kalau memang ingin mengatur memori manual sendiri, lebih baik saya memakai C/C++ sekalian.
Penutup
Python tetap merupakan salah satu bahasa yang saya sukai dan saya tetap akan memakainya untuk berbagai hal. Posting ini hanya untuk menunjukkan bahwa Python juga memiliki keterbatasan. Dengan memahami batasan ini, kita bisa mempertimbangkan:menggunakan pendekatan lain dalam memproses data dengan Python atau memakai bahasa lain yang lebih cocok untuk masalah tersebut.
Perlu dicatat juga bahwa tiap bahasa bisa berubah, baik sintaksnya maupun implementasinya. Contohnya: NodeJS baru punya Worker Thread di Node JS 10 sebagai fitur experimental dan harus diaktifkan dengan flag khusus. Baru pada Node JS 12 yang baru dirilis April tahun 2019 API Worker Thread dianggap stabil dan layak dipakai produksi. Jadi mungkin saja suatu saat masalah multithread ini akan berubah di Python.
This entry was posted in bahasa, python on November 26, 2019 by admin.
Mengenal Bahasa Pemrograman Lua
Leave a reply
Di kesempatan kali ini saya akan memperkenalkan bahasa Lua. Bahasa ini sebenarnya sudah ada cukup lama (sejak 1993), tapi kurang terkenal secara umum. Lua lebih sering dijadikan bahasa scripting untuk aplikasi dan sering kali nama Lua tidak disebut sama sekali. Lua artinya “Bulan” (moon) dalam bahasa portugis. Lua diciptakan oleh Roberto Ierusalimschy, Luiz Henrique de Figueiredo, dan Waldemar Celes, anggota dari Computer Graphics Technology Group (Tecgraf) di Pontifical Catholic University of Rio de Janeiro, di Brazil.
Lua bisa dipakai untuk membuat program/aplikasi seperti bahasa lain, tapi kelebihan bahasa ini adalah dari awal dirancang untuk diembed dalam sebuah aplikasi lain (terutama dalam bahasa sejenis C). Di-embed ini artinya bisa bisa dipakai untuk sistem plugin atau bisa dipakai untuk mengontrol bagian business/game/app logic sementara bagian yang butuh performance tinggi memakai C atau bahasa lain. Lua juga bisa jadi file konfigurasi yang sangat fleksibel.
Lua dipakai di banyak software misalnya Adobe Lightroom, Nmap, Wireshark, dan lighttpd. Seperti saya sebutkan di awal, sering kali berbagai aplikasi menyebutkan bahasa Lua ini hanya sekilas, dan fitur aplikasinya yang lebih ditekankan dengan nama lain, misalnya dokumentasi Nmap menyebutkan tentang Nmap Scripting Engine (NSE) tapi Lua hanya disebut sekilas di tengah. Lua juga banyak dipakai di berbagai game (misalnya World Of Warcraft, Angry Birds) dan game engine. Interpreter Lua ukurannya sangat kecil sehingga bisa dipakai untuk embedded system/IOT (misalnya NodeMCU dan eLua).
Bahasa Lua
Bahasa Lua menurut saya relatif sederhana, tapi juga sangat fleksibel. Sintaksnya tidak aneh, sedikit mirip BASIC atau pascal. Contohnya seperti ini:
print "hello, berapa umur kamu?"
umur = io.read("*n")
if umur >= 17 then
   print("Halo kakak")
else
   print("Halo adik")
end
Bagi sebagian orang mungkin ini agak aneh mengingat bahasa sekarang sudah tidak lagi memakai kata-kata (“then”, “end”) tapi lebih memakai simbol ({} di C/C++/Java/.NET, indentasi di Python), tapi untuk yang dulu memakai Pascal dan BASIC ini terasa cukup wajar. Sebagian besar syntax Lua mirip dengan bahasa lain, tapi ada beberapa hal yang agak aneh. Di Lua, operator kurang dari, lebih besar, sama dengan, semuanya sama dengan bahasa lain (<, >, =) tapi untuk tidak sama dengan, syntax yang dipakai adalah ~=. Syntax untuk komentar juga agak kurang standar, memakai “–” untuk satu baris, dan memakai –[[ untuk komentar multi baris –]].
Secara umum bahasa Lua cukup mudah dibaca bahkan oleh pemula, tidak seperti bahasa Forth (yang saya bahas sebelumnya) atau bahasa fungsional seperti Scala.
Tipe primitif yang didukung Lua adalah: string, number, dan integer. Struktur data utama di Lua adalah table. Secara umum: tabel memetakan sesuatu ke sesuatu yang lain (seperti Map/Dictionary di bahasa lain). Hampir semua hal di Lua diimplementasikan dengan table. Sebuah array di Lua juga adalah tabel yang memetakan indeks dengan sebuah nilai, dengan nilai index awal default adalah 1. Masalah index ini agak mengganggu bagi saya, karena di bahasa lain biasanya array berbasis 0. Sebuah tabel bisa berisi tabel lain untuk merepresentasikan array multi dimensi.
Sebuah struktur (struct) juga bisa direpresentasikan dalam bentuk tabel (memetakan nama field sebagai string ke nilainya). Di Lua, sebuah fungsi juga bisa masuk ke dalam tabel. Contohnya kita bisa saja membuat tabel yang berisi berbagai operasi matriks yang berisi pemetaan nama operasi, misalnya “multiply” dengan implementasi fungsi perkalian matriks.
Lua juga memiliki konsep metatable, yang bisa digunakan untuk mendefinisikan operasi terhadap sebuah variabel. Dengan setmetatable(variabel, sebuahtabel), kita bisa mendefinisikan berbagai operator dan fungsi yang berlaku untuk variabel tersebut. Jadi jika kita ingin membuat sebuah variabel menjadi sebuah tipe matriks, kita bisa membuatnya dengan setmetatable(variabel1, tabel_operasi_matriks).
Lua tidak memiliki konsep OOP tapi dengan menggunakan berbagai trik table, metatable dan fleksibilitas function di Lua, kita bisa mengimplementasikan Object Oriented Programming. Saya sendiri kurang menyukai ini, kalau saya ingin memprogram dengan paradigma OO, saya akan memilih bahasa lain.
Fitur Lua lain yang menarik adalah coroutine, generalisasi dari subrutin, tapi fitur ini jarang saya pakai. Sebenarnya fitur ini powerful, tapi ketika melakukan embeding Lua ke bahasa lain (terutama C), fitur ini cukup merepotkan karena tidak mudah dipetakan ke C.
Embeding Lua ke bahasa C
Seperti sudah saya sebutkan di atas, fitur Lua adalah sangat cocok untuk diembed ke sebuah aplikasi. Sebenarnya bahasa lain seperti Python dan Ruby juga bisa diembed ke bahasa lain (misalnya C), tapi ada banyak kelebihan Lua:
Ukurannya sangat kecil, ratusan kilobyte. Python butuh minimal beberapa megabyte (disk space dan memori)
Mendukung multi thread (satu thread menjalankan instance Lua terpisah). Untuk embedding multi thread di Python sangat sulit, dan Python memiliki Global Interpreter Lock
Interfacing sangat mudah, baik coding manual atau dengan bantuan SWIG
Implementasi utama Lua adalah dalam bahasa C, walau ada juga Lua untuk Java. Kebanyakan bahasa memiliki build system yang kompleks dan butuh banyak library tambahan. Dalam kasus Lua: kita cuma perlu copy paste semua file .c (kecuali lua.c) ke project kita dan itu sudah cukup. Sebagai catatan: selain implementasi utama Lua, ada juga LuaJIT yang sangat cepat namun memiliki banyak batasan terutama di sistem 64 bit.
Setelah memasukkan semua file C dalam project kita, di bagian program yang butuh Lua, kita perlu menginclude beberapa file:

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

Lalu kita bisa menginstansiasi interpreter Lua. Jika diperlukan, kita bisa membuat banyak instance (misalnya satu di setiap thread). Setelah itu biasanya kita ingin agar library standar Lua diaktifkan, jadi kita memakai luaL_openlibs.
lua_State *L = luaL_newstate();
luaL_openlibs(L);
Biasanya skrip Lua akan diletakkan di luar program, supaya bisa diubah dengan mudah tanpa rekompilasi. Untuk meload dari file, kita bisa memakai luaL_loadfile atau luaL_loadstring jika ingin memakai string. Di banyak Game, file lua dienkrip di file (agar tidak mudah dimodifikasi), lalu didekrip dimemor, dan diload menggunakan luaL_loadstring.

int err = luaL_loadfile(L, "myscript.lua");
if (err) {
       fprintf(stderr, "Failed loading file: %s\n", lua_tostring(L, -1));
       exit(1);
}
Dalam passing parameter ke Lua dan dari Lua, kita menggunakan konsep stack. Kita bisa memasukkan nilai ke stack dengan lua_pushstring/lua_pushnumber/lua_pushinteger, dan bisa mengambil nilai di stack dengan lua_tointeger, lua_tostring, lua_tonumber dan beberapa fungsi lain. Jadi ketika memanggil fungsi di Lua: kita melakukan push value ke stack, dan untuk mengambil nilai dari lua kita akses hasilnya di stack juga.
Kita bisa mencari fungsi yang diimplementasikan di Lua dengan lua_getglobal(L, "namafungsi"), ini akan mempush reference fungsi ke stack. Setelah itu kita bisa mempush nilai parameter untuk fungsi, memanggil fungsinya, dan mendapatkan hasilnya di stack.

lua_getglobal(L, "myfunction");
lua_pushinteger(L, 1); //param 1
lua_pushinteger(L, 2);  //param 2
int err = lua_pcall(L,
    2 /*number of arguments*/,
    1 /*number of result*/,
    0 /*indeks ke error handler, jika 0 maka error akan dipush ke stack*/);
Membuat fungsi di C yang bisa dipanggil oleh Lua juga sangat mudah. Misalnya kita ingin membuat fungsi max yang menerima 2 double dari Lua dan mengembalikan angka terbesar, maka kita cukup membuat ini:

int max_for_lua(lua_State *L)
{
  double num1 = lua_tointeger(L, 1); //param 1 dari Lua
  double num2 = lua_tointeger(L, 2); //param 2 dari Lua

  double max = num1>num2?num1:num2; //logika utama

  lua_pushnumber(L, max); //push ke stack Lua
  return 1; //hanya ada satu nilai kembalian
}
Tentunya keberadaan fungsi ini perlu diberitahukan ke Lua agar bisa diakses oleh skrip Lua. Nama fungsi di C dan Lua bisa berbeda, contohnya fungsi max_for_lua di atas bisa didaftarkan menjadi “my_max” seperti ini:

lua_pushcfunction(lua_state, max_for_lua);
lua_setglobal(lua_state, "my_max");
Penutup
Sering kali saya menemukan di mana saya butuh eksperimen cepat dan tidak ingin sering mengcompile ulang kode program saya. Contoh penggunaan yang baru-baru ini saya lakukan adalah ketika eksplorasi fitur tertentu di iOS. Jika saya mengandalkan objective C atau Swift saja, tiap kali saya mengubah kode (biasanya hanya logic tertentu), akan butuh beberapa detik sampai beberapa puluh detik sampai bisa menjalankan ulang aplikasinya. Walau hanya menekan tombol “run” di XCode yang terjadi di latar belakang adalah: kodenya harus dicompile, dilink, ditandangani secara digital, dicopy ke device, lalu dijalankan. Dengan memindahkan logic ke Lua, saya hanya perlu me-mount direktori dokumen aplikasi dengan ifuse, mengedit file Lua, lalu merestart aplikasinya.
Menambahkan sebuah scripting ke language ke aplikasi memang butuh waktu tapi di sisi lain juga sangat fleksibel karena skrip bisa dimodifikasi dengan cepat dan tidak seperti kode C, tidak perlu dikompilasi ulang. Jika Anda sudah beberapa kali menambahkan fitur scripting ke sebuah aplikasi, menambahkan ke aplikasi berikutnya tidak butuh waktu lama. Untuk aplikasi kompleks kita bisa memakai Simplified Wrapper and Interface Generator (SWIG) untuk mempercepat membuat interface dari C/C++ ke Lua.
Semoga tulisan singkat ini cukup untuk memperkenalkan bahasa Lua dan mungkin juga membuat Anda tertarik untuk menambahkan Lua ke aplikasi yang Anda buat.
This entry was posted in bahasa, lua, teknis on August 3, 2019 by admin.
Mengapa memakai bahasa pemrograman tertentu?
Leave a reply
Mengapa seseorang memilih suatu bahasa tertentu untuk menyelesaikan suatu masalah atau membuat aplikasi tertentu? Ternyata jawabannya bisa banyak. Kebanyakan pilihan intinya adalah keterpaksaan dan terakhir baru faktor kenyamanan.
Keterpaksaan pertama dari non teknis, misalnya dari permintaan atasan atau permintaan client. Hal ini sering kali tidak bisa ditawar lagi, terutama jika sudah melibatkan kontrak legal. Paksaan ini sering menghasilkan kode yang aneh atau tidak menggunakan fitur yang tepat dari sebuah bahasa, karena programmer dipaksa menggunakan bahasa lain, dan karena harus buru-buru mereka akan menggunakan gaya bahasa X di bahasa Y.
Sebuah teknologi tertentu kadang hanya bisa diprogram dengan satu bahasa. Misalnya dulu ponsel cuma bisa diprogram dengan Java (J2ME) jadi ya terpaksa harus memakai bahasa Java. Microcontroller tertentu perlu memakai assembly karena ukuran ROMnya sangat kecil dan tidak ada compiler C yang bisa menghasilkan kode sekecil itu.
Sekarang ini jumlah memori dan kecepatan berbagai device sudah sangat tinggi, sehingga memungkinkan interpreter berjalan di platform apa saja. Ini memberi kebebasan memilih bahasa. Contohnya: dulu microcontroller CPU dan RAMnya sangat kecil sehingga tidak cukup untuk menjalankan interpreter Python. Sekarang sudah banyak microcontroller yang bisa menjalankan MicroPython.
Bahasa tertentu dipilih karena masalah kinerja (performance). Meskipun Python bisa berjalan di microcontroller, tapi kecepatannya jauh lebih lambat dibandingkan C/C++ (karena interpreted). Faktor kecepatan ini sangat terasa untuk keperluan tertentu, misalnya untuk membuat animasi lampu yang jumlahnya banyak. Di dalam konteks lain juga sama: bahasa tertentu dipilih karena masalah performance.
Berbagai bahasa memiliki tingkat strictness yang berbeda, dan mulai masalah sintaks sampai tipe data. Sebagian bahasa memungkinkan kecerobohan yang sulit dilakukan di bahasa lain. Contoh sederhana, dalam JavaScript kita bisa membuat kode seperti ini dan akan berjalan, walau hasilnya mungkin tidak seperti yang diharapkan.
Tipe a adalah Number dan b adalah String, tapi keduanya bisa dioperasikan
Pemula Ruby yang beralih dari bahasa tertentu (misalnya C) mungkin akan bingung dengan sifat Ruby di mana 0 dianggap true. Alasannya: 0 adalah object yang valid, dan nilainya dianggap true.
Untuk bahasa yang sangat dinamik, dibutuhkan banyak test case untuk banyak hal sederhana, sedangkan di bahasa yang tipenya dicek oleh compiler, jumlah test bisa dikurangi. Ada bahasa yang lebih strict lagi, misalnya bahasa ADA yang sempat jadi bahasa wajib oleh Department of Defense Amerika. Secara umum: bahasa tertentu mengurangi kesalahan programmer (baik dari syntax, dari compiler), sehingga bahasa tersebut dipilih untuk tujuan tertentu.
Beberapa masalah mudah diselesaikan menggunakan library yang sudah ada. Ketersediaan library ini menjadi alasan kenapa memilih sebuah bahasa. Misalnya sudah ada library OpenCV (Open computer vision) untuk memproses video secara realtime (misalnya face recognition). OpenCV ditulis dalam C++ dan ada banyak binding sehingga fungsi-fungsi C++ ini bisa diakses dari bahasa lain (misalnya Python, Java, C#, NodeJS) tapi tidak semua binding ini sempurna, dan sebagian ketinggalan versinya. Misalnya saat tulisan ini dibuat, binding OpenCV untuk JavaScript/NodeJS versi 3 belum ada.
Jika tidak ada batasan keterpaksaan, maka alasan berikutnya adalah kenyamanan. Beberapa aplikasi bisa ditulis dalam bahasa apapun karena tidak tidak keterpaksaan tertentu. Dalam kasus seperti ini, orang bisa memilih bahasa sesuai dengan familiaritas dengan bahasa tersebut. Sebagian programmer yang menguasai banyak bahasa akan memilih bahasa yang ternyaman (dan kalau bisa yang terbaik) untuk menyelesaikan suatu masalah.
Jangan heran kalau dalam sebagian masalah, C bisa lebih nyaman dari Java atau bahasa lain. Contoh kecil: sering kali dalam memprogram hardware kita membutuhkan array of bytes (misalnya Protocol Data Unit pada NFC). Inisialisasi array of byte di Java jika nilainya kurang dari 127 bisa dilakukan seperit ini:
byte b [] = new byte[] {1, 127};
Tapi jika nilainya lebih dari 127 tiba-tiba kodenya tidak bisa dicompile:
byte b [] = new byte[] {1, 128};
Dengan error:
incompatible types: possible lossy conversion from int to byte
Cara yang benar adalah dengan menggunakan casting ke byte:
byte b [] = new byte[] {1, (byte)128};
Sedangkan di C, dengan tipe uint8_t (dari header stdint.h) kita tidak perlu memperdulikan hal kecil seperti itu. C juga mendukung bit fields yang bisa membuat manipulasi bit tidak diperlukan (karena dilakukan oleh compiler).
Di sisi lain: membuat aplikasi web lebih sulit dilakukan dengan C. Bereksperimen dengan bilangan integer yang besar (ratusan digit, misalnya untuk operasi RSA) jauh lebih mudah dilakukan di Python dibandingkan Javascript (big integer sudah built in di Python).
Perlu dicatat bahwa bahasa pemrograman yang populer juga masih terus berkembang. Dulu untuk melakukan iterasi list di Java butuh kode yang cukup panjang, tapi kemudian syntax for ditambahkan yang memudahkan ini. Ini hanyalah syntactic sugar alias pemanis saja, di dalamnya implementasinya masih sama. Sebagian bahasa memiliki sintaks yang sudah manis dari sejak dirancang sehingga kadang seseorang lebih memilih bahasa lain.
Kadang tool yang tersedia untuk sebuah bahasa juga menjadi faktor penting dalam memilih sebuah bahasa. Tools ini bisa berupa: compiler, debugger, IDE, dll. Compiler yang lambat bisa membuat frustrasi, jika debugger tidak tersedia akan membuat development lebih lama, IDE yang jelek bisa memperlama coding (apalagi jika sering error/hang) tapi IDE yang bagus bisa mempercepat coding.
Semoga sekarang cukup jelas kenapa ada banyak bahasa, kenapa seseorang perlu mempelajari banyak bahasa, dan kenapa bahasa tertentu dipilih untuk menyelesaikan masalah tertentu.
This entry was posted in bahasa, umum on February 11, 2018 by admin.
Programming dan Penetration Testing
2 Replies
Pentest adalah kegiatan menyerang sistem komputer untuk mencari kelemahan security, atau dari Wikipedia:
A penetration test, or the short form pentest, is an attack on a computer system with the intention of finding security weaknesses, potentially gaining access to it, its functionality and data.
Pentesting dilakukan atas permintaan client, jadi bukan hacking ke sembarang website. Contoh sederhana pentesting seperti ini: coba jebol website perusahaan kami, apakah ada bug securitinya? atau: coba pergi ke lobi atau tempat parkir perusahaan kami, apakah ada WIFI terbuka, apakah dari situ bisa masuk ke sistem internal perusahaan kami?. Kami punya app mobile, apakah bisa “dijebol” (misalnya apakah kita bisa membuat request ke server supaya memberikan data user lain).
Karena ini blog mengenai programming, saya tidak akan membahas banyak mengenai pentesting, hanya ingin menunjukkan betapa keahlian programming bisa sangat berguna untuk pentesting. Dari contoh yang saya sebutkan di atas, scope dari pentesting bisa sangat banyak, mulai dari yang on site: datang dan mengecek kabel, wireless network, dsb, sampai ke level network dan aplikasi (baik web, desktop, mobile). Saya hanya ingin membahas aspek programming, untuk mendorong peminat bidang security agar mau belajar programming.
Perkiraan saya mungkin sekitar 70% pekerjaan pentesting bisa dilakukan dengan tools yang sudah tersedia, baik yang open source maupun komersial, tanpa butuh keahlian scripting ataupun programming. Sisanya bakal butuh programming. Bahkan saya yakin 100% beberapa jenis bug tidak bisa ditemukan tanpa keahlian programming.
Kemampuan programming minimal yang dibutuhkan adalah bisa mengcompile atau menjalankan program dalam berbagai bahasa. Kadang di sebuah server tidak tersedia tool tertentu, jadi kita perlu mengcompile dari source karena OS di server itu sudah terlalu lama (misalnya masih banyak yang memakai RHEL 4). Jika tidak tahu bagaimana menjalankan sesuatu, maka sudah game over di titik ini. Pernah saya baca di blog pak Budi Rahardjo mengenai kompetisi CDC (Cyber Defense Competition):
Salah satu soal yang disampaikan adalah men-decode data base64 yang kemudian menjadi skrip Python, yang tinggal dijalankan. Lucunya ada banyak yang gak tahu Python. ha ha ha. Mereka kebingungan menjalankannya. Padahal tinggal “python namaskrip.py”. Mereka tidak perlu tahu bahasanya. hi hi hi. Ada yang pura-pura tahu dan me-rename menjadi bahasa C, menambahkan “#include ” dibagian awalnya, kemudian mencoba compile. Ya gak bakalan jalanlah. he he he.
Kejadian semacam di atas itu yang mendorong saya menulis tulisan seperti ini.
Keahlian lain adalah mencari program atau menulis program kecil dalam bahasa tertentu yang kadang tidak terlalu umum atau sudah kuno. Contoh: jika sebuah web server bisa menerima upload file, dan web server itu hanya bisa menjalankan ASP versi klasik, ya kita harus bisa mencari shell dalam ASP Classic (bukan ASP.NET). Berbeda dengan software development biasa di mana kita bisa memilih bahasa pemrograman atau teknologi yang ingin kita pakai, di sini kita dipaksa mengikuti apa yang tersetup di server.
Jika beruntung, sudah ada orang yang menuliskan program standar (web shell) yang memiliki fungsi seperti “file manager/file upload” (untuk mengupload tool tambahan), “shell” (untuk mengeksekusi command apapun di sisi server), dan “database shell” (untuk mengirimkan query apapun ke database). Jika tidak beruntung, atau ada batasan tertentu di server, mungkin kita perlu membuat tool baru. Contoh sederhana: jika server membatasi upload hanya 100 KB saja, sementara binary nmap yang ingin diupload (plus librarnya) besarnya beberapa megabyte, maka kita perlu membuat program kecil untuk mengupload parsial lalu menggabungkan hasil uploadnya.
Keahlian membaca kode dalam berbagai bahasa juga diperlukan. Dalam beberapa kasus, kita bisa mendapatkan akses ke source code aplikasi web (karena bug, karena salah konfigurasi, karena lupa ikut mengupload direktori “.git”, dsb). Setelah punya source code, kita bisa menemukan bug tambahan dengan membaca kodenya. Sebagai pentester, tentunya Anda tidak akan bilang: wah ternyata dia pake Python, saya nggak tau cara ngehack aplikasi web dengan Python.
Dengan membaca source code, hal paling minimal adalah mengerti di mana file konfigurasi supaya bisa mengekstrasi user/password database, berikutnya adalah mencari bug-bug tambahan seperti SQL Injection, hidden functionality, dsb.
Dengan maraknya OS Mobile, sekarang pentesting juga masuk ke ranah mobile. Di sini ilmu reverse engineering sangat diperlukan. Untuk OS Android, reverse engineering bisa dilakukan dengan decompiler yang bisa mengembalikan kode Java ke bentuk semula (kecuali sudah diobfuscate), jadi kembali keahlian membaca kode diperlukan.
Setelah mengetahui kodenya, biasanya kita perlu melakukan fuzzing request, alias mencoba-coba berbagai kemungkinan request. Untuk aplikasi berbasis HTTP, kita masih bisa memakai proxy (misalnya ZAP) dan mengubah-ubah request untuk tahu reaksi server (bagaimana jika nilaiya negatif, bagaimana jika nama file mengandung “../”, dsb). Tapi untuk aplikasi yang memakai protokol khusus via SSL, kita perlu memahami, lalu mengimplementasikan ulang client sendiri yang bisa melakukan fuzzing.
Pengetahuan mengenai best practice dalam sebuah bahasa juga diperlukan dalam membuat aplikasi yang aman. Contoh: untuk menghasilkan bilangan random untuk kriptografi di Java gunakan SecureRandom (jangan Random). Di Android untuk melakukan koneksi SSL menggunakan socket, jangan gunakan SSLFactory tapi gunakan SSLCertificateSocketFactory, dsb. Pekerjaan pentester cukup mudah di sini, hanya menyarankan saja, dan programmer yang akan mengimplementasikan saran tersebut.
Saya sudah banyak menemukan bug yang memerlukan banyak coding. Ada bug yang terkait dengan penyimpanan password (terenkripsi) yang disimpan lokal di device yang seharusnya aman, tapi ternyata saya bisa membuat tool yang cukup optimal untuk bisa mengcrack dalam 1 jam karena banyak hal kecil yang lupa dilakukan oleh programmer (lupa menginisialisasi IV, memakai EBC). Saya pernah menemukan bug fatal yang berhubungan dengan menggunakan algoritma hashing yang tidak aman (tidak memakai Cryptographic Hash Function). Dengan tools yang tersedia saja, tanpa pengetahuan programming (dan kriptografi), kedua bug itu tidak akan bisa ditemukan.
Jadi saran saya: untuk mereka yang tertarik di bidang security, pelajari juga bagian programmingnya. Ini saya masih bicara level pentesting yang kebutuhkan programmingnya masih minimal. Di bagian lagin security, keahlian programming lebih dibutuhkan lagi, misalnya membuat exploit butuh pemahaman yang lebih mendalam tentang sistem dan low level programming.
Dalam full security audit, selain pentesting kadang client menginginkan juga review kode mereka, jadi kita perlu bisa membaca, menjalankan, dan memberi saran yang berkaitan dengan security.
Buat saya sendiri sebagai programmer, saya jadi rajin membaca mengenai best security practice untuk berbagai bahasa dan framework. Jika ada yang bertanya: buat apa sih belajar bahasa X atau teknologi Y, saya bisa bilang: mungkin suatu saat ada sistem yang memakai teknologi itu yang perlu saya test.
This entry was posted in bahasa, security, umum on May 14, 2015 by admin.
Jangan Fanatik Teknologi Tertentu
Leave a reply
Setiap waktu, selalu ada orang yang fanatik menggunakan teknologi tertentu untuk menyelesaikan semua masalah. Karena ini blog “Cinta Programming”, pembahasannya tentunya adalah teknologi pemrograman. Lebih spesifiknya lagi: bahasa tertentu. Sekarang ini aplikasi web sedang sangat populer, dan orang-orang pun ingin memanfaatkan 100% teknologi HTML dan JavaScript untuk melakukan semua hal. Bahkan bukan cuma aplikasi web, tapi aplikasi desktop dan mobile.
Saya hanya ingin menunjukkan bahwa kadang tidak semuanya bisa dilakukan oleh satu teknologi seratus persen. Seperti Anda lihat di posting-posting sebelumnya, saya sudah membuat beberapa aplikasi dengan HTML5 (dan bahkan sudah ada yang saya jual), tapi meski demikian saya masih sering “gemes” dengan orang yang terpaku pada HTML dan JS dan menganggap itu teknologi terbaik untuk semua hal (termasuk juga aplikasi mobile).
Teknologi sering harus dicampur-campur untuk membuat aplikasi terbaik. Twitter dua tahun yang lalu (2010) yakin bahwa rendering di sisi client dengan JavaScript adalah cara terbaik. Baru-baru ini disadari bahwa HTML5 masih terlalu lambat dan Twitter kembali melakukan rendering di sisi server. Twitter tentunya tidak membuang 100% Javascript, tapi sebagian besar pemrosesan dipindahkan ke server.
Di sisi mobile, Facebook membuat aplikasi untuk iOS (iPhone/iPad) menggunakan HTML5 sejak bertahun-tahun yang lalu. Semua orang komplain: aplikasinya terlalu lambat. Akhirnya Facebook menulis ulang aplikasinya dalam native code (dalam kasus ini native adalah Objective C) supaya dua kali lebih cepat. Tapi Facebook juga tidak membuang HTML5 seluruhnya, sebagian aplikasinya masih memakai HTML5.
Pelajaran yang bisa dipetik dari dua hal tersebut adalah: belajarlah banyak teknologi, supaya bisa tahu teknologi yang terbaik, dan jika memang ada yang lebih baik: jangan takut berpindah dari satu teknologi ke teknologi yang lain. Sekali lagi: jangan terpaku pada satu teknologi saja:
if all you have is a hammer, everything looks like a nail
This entry was posted in bahasa, html5, javascript on August 31, 2012 by admin.
Manipulasi bit bagian 3: bit shift
Leave a reply
Di bagian ini saya akan menunjukkan apa artinya menggeser bit ke kiri dan ke kanan. Waktu saya belajar konversi biner, saya mendapati bahwa cara paling mudah bagi saya dalam konversi desimal dan biner adalah dengan membayangkan “tabel” seperti ini:
128 64 32 16 8 4 2 1
Misalnya saya ingin mengkonversi 1001 menjadi desimal, maka saya letakkan angka 1001 tersebut di bawah tabel:
128 64 32 16 8 4 2 1
1 0 0 1
Kita lihat bit mana saja yang nilainya satu, lalu lihat angka di atas, dalam hal ini 8 dan 1, jika dijumlahkan, hasilnya adalah 9. Jadi 1001 biner = 9 desimal.
Dengan melihat tabel seperti itu, bisa kita bayangkan apa yang terjadi jika bit-bit biner semua digeser ke kiri satu posisi. Karena di geser satu posisi, maka kita menambahkan satu digit 0 di sebelah kanan, jadi 10010.
128 64 32 16 8 4 2 1
1 0 0 1 0
Nilainya sekarang menjadi 16 + 2 = 18 atau dua kali 9. Cara lain untuk memahami ini adalah dalam desimal (basis 10), jika kita menambahkan 0 di kanan maka nilainya menjadi 10 kali lipat, misalnya 18 menjadi 180 menjadi 1800. Demikian juga dalam biner, jika kita menggeser bit ke kiri, artinya kita menambahkan digit 0 di kanan, dan nilainya menjadi dua kalinya.
Proses di atas bisa diulangi berkali-kali. Dan proses tersebut tentunya bisa dibalik, menggeser ke kanan, dalam desimal, jika kita potong satu digit terakhir, maka nilainya akan menjadi sepersepuluhnya, misalnya 180 menjadi 18. Atau tepatnya, sepersepuluh dengan pembulatan ke bawah, karena jika kita buang angka 5 dari 185 hasilnya adalah 18. Dalam notasi biner, jika kita geser ke kanan, maka nilainya akan menjadi setengahnya (juga dengan pembulatan ke bawah).
Jadi apa kegunaan bit shifting? Salah satu kegunaannya adalah untuk perkalian dan pembagian dengan dua. Kegunaan lainnya adalah untuk ekstraksi bit (mengambil bagian bit tertentu). Mengenai ekstraksi bit, akan saya bahas di bagian berikutnya.
This entry was posted in bahasa, bit on January 23, 2012 by admin.
Manipulasi bit bagian 1: representasi biner
1 Reply
Kemarin buku yang saya tunggu-tunggu akhirnya tiba juga: The Art of Computer Programming, Volumes 1-4A Boxed Set (Box Set) . Dulu waktu kuliah, saya sudah membaca sebagian buku ini, tapi buku ini berat di matematika, jadi kebanyakan saya hanya membaca bagian algoritmanya saja, sambil mencoba-coba sedikit latihannya. Terinspirasi dari banyak programmer di buku Coders at work yang menyukai buku ini, dan minimal memakai buku ini sebagai referensi, maka saya sekarang berusaha membaca ulang koleksi buku Knuth, plus membaca volume yang baru: Volume 4a.
Sebagai catatan: dalam wawancara Knuth sendiri tidak menyarankan seseorang membaca buku ini dari sampul ke sampul sampai habis. Saya membaca buku ini pertama skimming dulu, mencari topik menarik, setelah itu baru saya baca teliti bagian-bagian yang saya perlukan. Jadi jika Anda merasa berat membaca buku ini: coba langsung skip ke bagian yang menarik.
Continue reading →
This entry was posted in bahasa, bit, teknis on January 8, 2012 by admin.
Mengenal berbagai bahasa
1 Reply
Anda mungkin sering membaca di berbagai buku, kalimat-kalimat semacam ini: “Prolog itu bagus untuk Artificial Intelligence”, “LISP bagus untuk AI”, “Fortran bagus untuk aplikasi numerik”, “C bagus untuk pemrograman sistem”. Tapi biasanya penulisnya tidak mendeskripsikan lebih lanjut apa maksud dari kalimat-kalimat tersebut, dan apa contohnya. Bukankah semua bahasa yang turing complete itu sama saja?. Setelah lulus dari kuliah pun, banyak yang masih belum tahu: apakah pernyataan-pernyataan tersebut benar? kalau salah, yang benar seperti apa? apa contoh aplikasi di mana memprogram dengan Lisp/Prolog/Fortan akan lebih mudah atau lebih baik dari memprogram dengan bahasa lain?
Ketika orang diperkenalkan pada suatu bahasa, kebanyakan caranya adalah melalui pengenalan sintaks, lalu kemudian membuat aplikasi kecil dalam bahasa tersebut. Jika Anda belajar bahasa yang paradigmanya sama atau mirip, cara ini memang akan berhasil, tapi tidak jika paradigmanya berbeda. Saya contohkan sedikit mengenai Lisp. Kebanyakan orang akan belajar mengenai apa itu atom, apa itu list, lalu operasi terhadap atom dan list (car, cdr, cons, list, dsb). Setelah itu kebanyakan akan membuat program manipulasi list sederhana. Di titik ini sebagian orang akan bertanya: di mana bagusnya Lisp, bagian mana yang membuat ini cocok untuk aplikasi AI?
Continue reading →
This entry was posted in bahasa, Uncategorized on January 7, 2012 by admin.
Tools untuk debugging
2 Replies
Di posting ini saya sekedar ingin sharing metode dan tools yang biasa saya pakai untuk debugging program. Di lingkungan yang ideal, kita seharusnya punya debugger yang canggih, cepat dan reliable, tapi sayangnya sering kali ini tidak tersedia. Ini contoh beberapa lingkungan pengembangan yang “mengesalkan” yang pernah saya jumpai:
Symbian versi awal (versi 6): untuk bisa mendebug, perlu IDE khusus dengan license khusus yang mahal. Symbian versi terbaru sudah semakin baik (tapi sekarang ini Symbian sudah akan berakhir).
BlackBerry: startup time debugger sangat lama, dan debugger sering error. Setiap kali menginstall versi program baru di BlackBerry, perlu restart (butuh sekitar 5 menit tiap kali restart).
Mendebug aplikasi Android di emulator. Startup emulator sangat lambat (bahkan di processor AMD quad core 3 ghz memori 16 GB) , lebih cepat mencoba langsung di HP. Masalahnya adalah ketika ada laporan: ada bug kecil di Android versi 2.2, tapi HP saya memakai Android 2.3
Debugging PHP di web hosting. Kadang ada masalah yang hanya muncul di web hosting, tapi tidak muncul ketika dicoba di server sendiri. Beberapa kemungkinan adalah karena versi PHP yang tidak sama, versi library yang tidak sama. Di server sendiri bisa mudah menginstall Xdebug, tapi tidak tersedia di tempat hosting.
Nurit Point Of Sales. Device ini banyak bugnya, tidak tersedia debugger, dan jika crash, akan memprint isi memori di atas kertas thermal sekitar 1/2 meter.
Kernel FreeBSD. Ketika porting tahap awal, sangat sulit mendebug apa yang terjadi di level CPU. Masalahnya karena saya tidak menggunakan development board yang memiliki JTAG.
Sebenarnya tidak semua lingkungan itu benar-benar mengesalkan jika kita punya uang, contohnya: jika saya punya uang beberapa ribu dollar, saya akan bisa mendebug Symbian dengan mudah. Jika saya punya beberapa HP Android berbagai versi, debugging Android juga lebih mudah. Jika saya punya development board resmi dengan JTAG, porting kernel akan lebih mudah. Jika saya hosting VPS dengan versi PHP saya sendiri, maka tidak akan ada masalah dengan PHP, dan andaikan ada masalah, saya bisa menginstall XDebug. Pada kenyataannya seringkali tidak tersedia dana untuk menyelesaikan berbagai masalah tersebut.

label: en

label: ceb


content:
Dalam era globalisasi ini masyarakat dituntut untuk selalu siap dalam menghadapi perubahan yang begitu cepat dalam segala bidang. Perubahan yang begitu cepat akan mempengaruhi pola pikir dan semua aktivitas masyarakat.
Dalam rangka mempersiapkan kondisi tersebut perlu diupayakan untuk dapat mengembangkan potensi ekonomi masyarakat di sekitar lingkungan tempat tinggalnya. Pengembangan poteni ekonomi dengan masyarakat sebagai pelaku utamanya akan meningkatkan kualitas hidupnya serta menumbuhkan kepercayaan diri dalam menghadapi perubahan yang begitu cepat.
Pemberdayaan masyarakat yang bertempat tinggal di sekitar waduk diharapkan akan meningkatkan kualitas hidupnya dimana masyarakat tersebut yang secara langung tidak mendapatkan manfaat dari adanya pembangunan bendungan. Dengan adanya pemberdayaan perekonomian masyarakat di sekitar waduk ini diharapkan juga masyarakat ikut serta berperan dalam menjaga dan memelihara bendungan baik secara langung maupun tidak langsung.
Pemberdayaan ekonomi masyarakat ini dalam kegiatannya melibatkan partisipasi aktif dari mayarakat dan memanfaatkan aset waduk yang berupa air, lahan, serta sumber daya alam lainnya yang mungkin dapat diberdayakan untuk kepentingan ekonomi masyarakat. Dengan pemberdayaan ekonomi masyarakat yang memanfaatkan aset bendungan, diharapkan membangun mayarakat untuk merasa memiliki, menjaga dan memelihara bendungan serta prasarana lainnya.
Masyarakat dilibatkan secara aktif dalam proses pemberdayaan ekonomi ini mulai dari awal hingga terbentuknya jenis usaha yang telah diepakati. Dengan demikian mayarakat akan merasa memiliki dan ikut bertanggung jawab terhadap keberhasilan usaha tersebut.
Jenis kegiatan yang akan dilaksanakan haruslah bersifat sederhana, tidak rumit, dikelola secara transparan, diatur dan dimonitor oleh masyarakat itu sendiri. Jenis kegiatan ini harus dipertimbangkan kondisi sosial dan budaya setempat agar dapat berjalan dengan baik dan berkesinambungan. Selain itu harulah dipertimbangan dampak terhadap lingkungannya agar kondisi di sekitar bendungan dan waduk tetap terjaga.
Proses pemberdayaan masyarakat ini harus dilakukan secara bertahap agar masyarakat tidak merasa terpaksa sehingga program ini dapat berjalan dengan baik dan berkesinambungan. Dengan demikian masyarakat akan merasa memiliki dan berusaha untuk mempertahankan jenis usaha tersebut.
Tujuan utama dari pemberdayaan ekonomi masyarakat di sekitar waduk ini adalah untuk melatih masyarakat berwira usaha untuk meningkatkan kualitas hidupnya dengan segenap kemampuan yang ada


content:
Kumpulan Kata Motivasi Pendidikan yang Penting Diterapkan – Pendidikan adalah hal yang penting yang harus dimiliki setiap insan. Pendidikan seperti sebuah lentera yang menerangi kegelapan. Sayangnya, meski ini adalah hal yang penting namun sebagian orang masih meremehkan pendidikan. Nah, dibawah ini mari kita simak kumpulan kata motivasi pendidikan yang penting diterapkan.
Pendidikan adalah kunci dari sebuah kesuksesan sebab untuk menggapai kesuksesan seseorang perlu dibekali dengan ilmu pengetahuan. Dari sinilah, seseorang yang sebelumnya tidak tahu menjadi tahu, orang bodoh pun akan menjadi pintar ketika dididik dengan benar.
Akan tetapi, sejatinya pendidikan bukan hanya tentang menyampaikan informasi dan ilmu pengetahuan saja. Sebab konteks dari pendidikan itu sendiri luas maknanya. Mendidik seorang anak bukan hanya tentang memberikan mereka ilmu akademik, namun pendidikan moral dan etika pun menjadi hal penting yang menjadi pembeda antara manusia dengan binatang.
Adanya pendidikan moral dan etika membuat seorang manusia memiliki adab dan tatakrama. Untuk memberikan motivasi guna memberikan pendidikan penting. Mari simak kumpulan kata motivasi pendidikan dibawah ini. Baca juga: Nasihat Kata Pendidikan yang Bijak dan Memotivasi
Kumpulan Kata Motivasi Pendidikan yang Penting Diterapkan
Ada cukup banyak rangkaian kata motivasi pendidikan yang akan kami sajikan kali ini. Tujuannya tentu saja untuk memberikan semangat bagi kita dalam memberikan didikan yang baik untuk anak-anak dan generasi muda yang akan datang.
Akar Pendidikan Itu…
Mendidik dan memberikan pendidikan pada seseorang memang tidaklah mudah dan dibutuhkan waktu yang tidak sedikit untuk bisa menyampaikan sesuatu pada seseorang. Proses yang panjang dan melelahkan mungkin dilalui dan terkadang terbersit pikiran untuk menyerah dan berhenti.
Atau bahkan sebaliknya, kita yang menerima pendidikan itu sendiri karena kekurangan dan hambatan dalam diri kita. Membuat apa yang orang lain coba sampaikan pada kita sulit untuk kita pahami. Namun mau tidak mau ketika apa yang kita pilih sudah menjadi tanggung jawab untuk kita pahami. Maka memahami suatu pendidikan dengan baik adalah kewajiban.
Memang tidak dipungkiri bahwa akar dari pendidikan itu akan terasa pahit. Namun buahnya akan tentu terasa lebih manis. Pendidikan yang baik akan mengantarkan seseorang pada tempat yang baik dan kesuksesan akan dapat digenggamnya ketika ia terdidik dengan baik.
Tujuan dari Pendidikan
Seringkali seseorang yang tidak terdidik atau tidak memiliki ilmu pengetahuan akan cenderung arogan, brutal dan bahkan mungkin ia bertindak semena-mena. Hal ini dikarenakan pikiran mereka kosong dan tidak diisi dengan sesuatu yang baik. Bahkan sebaliknya, segala informasi baik yang buruk atau yang baik tidak bisa mereka filter dengan baik.
Sehingga hasilnya segala hal yang mereka dapatkan dimasukkan dalam kepalanya. Akhirnya perlahan mereka akan mendapatkan kebingungan dari informasi yang mereka serap. Itulah mengapa sebuah pendidikan yang baik dan terarah adalah hal penting yang harus diberikan.
Seorang Anak yang Dididik Hanya di Sekolah
Pada dasarnya anak-anak adalah peniru yang ulung. Mereka akan cenderung berusaha meniru apa yang orang dewasa lakukan. Itulah mengapa penting sekali menerapkan pendidikan yang baik pada anak-anak sejak mereka usia dini. Akan tetapi, untuk bisa mengakses pendidikan akademik di sekolah biasanya adalah persyaratan usia yang memungkinkan seorang anak bisa bersekolah.
Padahal pendidikan menjadi hal penting yang harusnya diberikan pada si kecil sejak mereka bisa memahami lingkungan sekitarnya. Nah, dari sinilah tugas penting orang tua dalam memberikan pendidikan yang baik. Sebelum si kecil diperkenalkan pada pendidikan akademik. Moral dan etikanya perlu dididik dengan baik.
Agar demikian, ia mampu memilah sikap dan perilaku orang dewasa mana yang baik untuk ditirunya. Dan mana yang tidak boleh ia lakukan.
Masyarakat yang Berpendidikan
Seseorang yang berpendidikan akan lebih cenderung mudah diarahkan dan diatur dengan baik. Lain halnya dengan mereka yang tidak terdidik dimana mereka akan cenderung bertindak semaunya dan sesukanya. Hal yang sama mungkin kita lihat dari sekelompok binatang. Dimana ketika seorang pengembara hendak mengatur binatang liar dengan binatang ternak. Maka mungkin kita mendapati binatang ternak lebih mudah diatur.
Kita umpakan bahwa binatang ternak yang kesehariannya diurus dan diatur oleh seorang pengembara membuat mereka terbiasa diberikan aturan dan batasan. Lain halnya dengan binatang liar yang akan mungkin terdengar suara gaduh ketika berusaha diatur atau diamankan.
Begitupun yang terjadi dengan seorang manusia yang tidak berpendidikan. Mereka yang tidak terdidik akan cenderung lebih vocal dan gaduh ketika diatur. Namun mereka yang berpendidikan akan terlihat lebih tenang.
Tujuan Pendidikan Bukan Hanya Ilmu Pengetahuan
Bebricara mengenai pendidikan, bukan hanya seputar menyampaikan ilmu pengetahuan dan diserap dengan baik. Namun sebuah pendidikan harus mampu mengubah sikap seseorang dan moralnya menjadi lebih baik.
Karena ilmu hadir memberikan batasan dan aturan dalam kehidupan seseorang sehingga mereka tidak bertindak semaunya.
Maka dari itu, selain ilmu akademik ilmu tentang etika dan moral pun penting dipelajari dengan baik. Karena sebagai manusia yang hidup berdampingan dengan manusia lainnya. Dalam menjaga kedamaian kita perlu menggalakan adanya sikap saling menghormati dengan menjunjung adab yang baik.
Pendidikan Adalah
Tujuan dari sebuah pendidikan adalah menyebarkan peradaban pada setiap lapisan manusia. Kita bisa melihat bagaimana kejamnya kehidupan sebelum adanya peradaban. Manusian bertindak seperti hewan dimana yang paling kuatlah yang paling berkuasa dan membuat mereka yang lemah semakin tertindas.
Kedamaian sulit didapatkan pada masyarakat yang tidak memiliki adab. Sebab mereka senantiasa berperilaku berlandaskan keinginan dan nafsu mereka semata. Maka tak heran bila perseteruan akan lebih mudah terjadi pada masyarakat yang menghilangkan adabnya.
Untuk itulah, penting sekali untuk senantiasa menjunjung tinggi adab dan etika yang baik dalam diri kita sebab dari adab muncul rasa saling menghormati dan menghargai satu dengan yang lainnya. Dengan demikian, perdamaian akan semakin terasa nyata.
Pembelajaran
Ilmu dan pengetahuan yang didapatkan oleh seseorang tentu tidak didapatkan dari sebuah kebetulan semata. Namun hal ini didapatkan dari usaha dan menyengaja mencari. Namanya saja menuntut ilmu maka ada usaha yang perlu dilakukan untuk bisa mendapatkan semua ini.
Untuknya, maka penting sekali untuk memahami dengan baik dan menghargai bahwa proses dari mencari ilmu adalah hal yang penting. Jadi demikian, tidak dapat dipungkiri bahwa mencari ilmu adalah bagian penting dalam hidup ini.

warc-identified-content-language: ind


content:
Kata Kata Cinta Jarak Jauh – Cinta hadir dalam hidup kita tanpa alasan, tanpa mengenal waktu dan tempat. Cinta menyatukan dua insan yang berbeda, berbeda sifat, berbeda tujuan dan berbeda pandangan dalam satu hubungan atas nama cinta. Cinta membangun kedekatan di antara mereka, saling berbagi perasaan dan mencurahkan kasih sayang.
Saat cinta hadir, perasaan bahagia dan rasa rindu akan menggebu-gebu. Namun, rasa rindu tersebut hanyalah penantian untuk pasangan yang menjalankan hubungan jarak jauh atau LDR. Pasangan yang menjalankan hubungan jarak jauh memiliki banyak tantangan dan rintangan dalam hubungannya. Namun, meskipun begitu hubungan jarak jauh bukan untuk ditakuti, melainkan untuk disyukuri. Dengan hubungan jarak jauh banyak hal-hal positif yang akan didapatkan. Kita akan mengenal seperti apa arti kesabaran, setia dan kedewasaan.
Pasangan yang menjalankan hubungan jarak jauh terpisah oleh jarak yang membentang, beda kota, beda pulau atau bahkan beda negara. Meskipun terkadang perasaan ragu muncul, tetapi bukan berati kita harus menyerah akan cinta yang sudah terjalin sejauh ini. Jarak bukan lagi menjadi arti, jarak bukan menjadi alasan mengapa perpisahan haru terjadi. Saat ini zaman semakin modern yang diikuti dengan kemajuan teknologi. Meskipun jarak memisahkan, tetapi kita tetap bisa berhubungan dengan pasangan kita yang berada jauh disana.
Untuk anda yang saat ini sedang menjalankan hubungan jarak jauh atau LDR bersama pasangan, tentu anda membutuhkan motivasi dan semangat dalam menjalankannya. Anda bisa mendapatkannya dari kata kata cinta jarak jauh. Kutipan kata kata cinta yang dapat menguatkan anda. Selain itu, anda juga bisa mengungkapan perasaan anda dengan kata kata cinta jarak jauh. Nah, kali ini kami hadirkan kata kata cinta jarak jauh beserta maknanya untuk anda semua. Silahkan simak kata kata cinta jarak jauh yang kami sajikan di bawah ini.
Kumpulan Kata Kata Cinta Jarak Jauh (LDR) yang Bijak dan Romantis
Menjalankan hubungan jarak jauh atau LDR tentu bukan menjadi keinginan setiap pasangan. Namun, keadaan terkadang memaksa kita untuk melakukan hal itu. Demi cinta, tentu kita harus kuat dalam menjalankan dan melewati segala tantangannya. Untuk itu, hadir kata kata cinta jarak jauh yang dapat dijadikan sebagai motivasi. ( Baca juga : Kata-Kata Motivasi Hidup )
Jarak Bukanlah Alasan
Sejauh apapun jarak yang memisahkan, tetapi itu bukanlah alasan bagi pasangan untuk berpisah. Cinta tidak ditentukan oleh jarak dan cinta tidak bisa diukur oleh apapun. Meskipun dia di sana dan kamu di sini, tetapi bukan berarti cinta kalian tidak bisa bersatu.
Cinta adalah soal kepercayaan, jika kamu percaya pada pasanganmu yang jauh di sana dan sebaliknya, maka cinta kalian akan tetap terjaga. Jarak seharusnya menguatkan cinta yang ada di antara kalian, bukan justru melemahkan. Percayalah akan ada hadiah terindah dari penantian dan kesabaran kalian selama ini. Akan ada saatnya kalian kembali bersatu tanpa ada jarak lagi yang memisahkan.
Jarak Adalah Ujian Tuhan
Cinta yang terhalang oleh jarak bukan untuk ditakuti atau pun disesali. Jarak hanya memisahkan raga kalian berdua, tetapi tidak memisahkan cinta yang sudah kalian jalin saat ini. Percayalah, sejauh apapun jarak yang memisahkan jika kalian yakin pada cinta maka cinta itu akan selalu ada, bahkan akan terus tumbuh.
Janganlah pernah menyalahkan takdir mengapa kalian harus terpisah oleh jarak. Anggaplah hubungan yang kalian jalankan saat ini merupakan ujian yang diberikan oleh Allah. Allah sengaja menciptakan jarak di antara kalian berdua agar kamu dan pasanganmu tahu bahwa kesetiaan adalah tujuan dari rasamu dan rasanya.
Tidak Ragu Untuk Berjalan Bersama
Jarak memang memisahkan kamu dan pasangan, namun bukan berarti keberadaan jarak membuat kalian ragu antara satu sama lain. Meskipun kalian tidak bisa berjalan bersama, tidak bisa saling menggenggam seperti pasangan yang lainnya, tapi bukan berarti cinta kalian lemah. Jarak yang ada di antara kalian justru seharusnya menguatkan cinta kalian. Jarak seharusnya tidak membuat kalian ragu justru semakin yakin. Dengan jarak kamu bisa lebih yakin bahwa pasangan kamu memang benar-benar setia.
Yang Aku Takutkan Bukanlah Jarak
Memang benar, terkadang dalam menjalankan hubungan jarak jauh hal yang paling ditakutkan selain jarak yaitu kesabaran. Tidak semua orang bisa bertahan dalam menjalankan hubungan jarak jauh karena kurangnya kesabaran yang dimiliki. Menjalankan hubungan jarak jauh memang banyak tantangan yang tidak mudah dilewati.Tantangan yang paling berat mungkin yaitu ketika mempertahankan kesabaran yang mulai berkurang. Kesabaran yang mudah sekali menghilang.
Tidak Tahu Rasanya Menunggu
Kutipan kata kata cinta jarak jauh di atas merupakan ungkapan perasaan seseorang. Seseorang yang mungkin telah lama menunggu pasangannya, menunggu pasangan yang tak kunjung kembali. Dalam penantian tersebut terdapat rindu yang menggebu, rindu untuk saling bertemu dan bertatap muka. Meskipun ia memiliki harapan tetapi harapannya tersebut dianggap hanyalah harapan semu.
Nah, kamu juga bisa menuangkan semua perasaan dan isi hati kamu dengan kata kata cinta jarak jauh kali ini. Diharapkan pasangan kamu mengerti dan menyempatkan waktunya untuk datang menemui kamu.
Cinta Tidak Mengenal Hambatan
Memang benar, cinta tidak pernah mengenal hambatan. Dan itu menjadi bukti bahwa pengaruh cinta begitu besar. Cinta mampu membuat hal yang mustahil menjadi mungkin untuk dilakukan. Cinta pula dapat merubah seseorang, cinta dapat membuat seseorang menjadi lebih penyabar.
Ketika hambatan datang, ketika jarak memisahkan, cinta tidak lekas menyerah dan putus asa. Cinta akan mendorong seseorang untuk selalu dan terus berjuang demi harapan. Cinta adalah satu-satunya motivasi ketika jarak membentang memisahkan. Cinta menjadi satu-satunya alasan untuk bertahan.
Jarak Tidak Pernah Melemahkan
Untuk pasangan yang sedang menjalankan hubungan jarak jauh atau LDR, jarak bukan lagi penghalang. Bagi mereka jarak sudah menjadi teman. Jarak justru menjadi kekuatan mereka untuk bertahan. Jarak yang membentang tidak pernah melemahkan. Jarak justru menjadikan mata lebih terbuka. Dengan jarak kita mampu melihat seberapa kuat perasaan yang kita miliki untuk pasangan. ( Artikel menarik lainnya : Kata Kata Cinta Sedih Terbaik yang Mengoyak Perasaan )
Menjalankan hubungan jarak jauh memang tidak semudah menjalankan hubungan pacaran seperti pada umumnya. Rintangan dan tantangan selalu ada yang setiap saat akan menghancurkan hubungan yang sudah lama terjalin. Jarak memang memisahkan raga kamu dan pasangan, namun jarak tidak pernah memisahkan perasaan kalian. Jangan pernah kalah oleh jarak, bertahanlah dengan cinta yang sudah kamu bangun selama ini. Ingatlah dibalik penantian dan perasaan yang anda korbankan selama ini dalam menjalankan hubungan jarak jauh akan terbayar dengan kebahagiaan besar ketika kalian bersama. Kata kata cinta jarak jauh kali ini dapat anda jadikan sebagai motivasi dalam menjalankan hubungan jarak jauh.
Anda punya kata kata cinta jarak jauh yang lebih bermakna lainnya? Mari berbagi bersama kami dan para pembaca yang lainnya di sini. Anda bisa sisipkan kata kata cinta jarak jauh pada kolom komentar yang sudah kami sediakan di bawah ini. Terimakasih.


content:
KUPANG. Kepala Dinas Pariwisata dan Ekonomi Kreatif Nusa Tenggara Timur Marius Ardu Jelamu mengatakan Desa Waturaka di Kabupaten Ende, Flores, meraih penghargaan sebagai desa wisata terbaik kategori alam.
Penghargaan itu diberikan oleh Menteri Desa, Pembangunan Daerah Tertinggal dan Transmigrasi Eko Sandjojo kepada sepuluh desa yang berhasil mengelola potensi pariwisata untuk memajukan ekonomi, dan satu di antaranya adalah Desa Waturaka di Kabupaten Ende, katanya di Kupang, Selasa (16/5).
Ia mengapresiasi penghargaan itu karena menunjukkan bahwa desa mampu berkembang dan berprestasi, terutama dalam mengoptimalkan keunggulan-keunggulan objek wisata dan destinasi yang dimiliki untuk meningkatkan kesejahteraan.
"Kami mengapresiasi penghargaan ini dan berterima kasih kepada Menteri Desa, Pembangunan Daerah Tertinggal dan Transmigrasi Eko Sandjojo yang memberikan penghargaan kepada sepuluh desa berhasil mengelola potensi pariwisata untuk memajukan ekonomi," katanya lagi.
Sepuluh desa penerima penghargaan itu terdiri dari sepuluh kategori, di antaranya yaitu pertama Nagari (Desa Adat) Sungai Nyalo di Kabupaten Pesisir Selatan, Sumatera Barat terpilih sebagai desa wisata terbaik untuk kategori perkembangan tercepat.
Kedua, Desa Madobak di Kepulauan Mentawai, Sumatera Barat sebagai desa adat terbaik. Ketiga Desa Tamansari di Banyuwangi, Jawa Timur sebagai desa wisata terbaik kategori jejaring bisnis.
Berikutnya, Desa Ubud di Gianyar, Bali sebagai desa wisata terbaik kategori budaya.
Selanjutnya keempat, Desa Pujon Kidul di Malang, Jawa Timur sebagai desa wisata terbaik kategori agrowisata. Lalu kelima, Desa Seigentung, Gunung Kidul, Daerah Istimewa Yogyakarta sebagai desa wisata terbaik kategori ilmu pengetahuan dan teknologi, dan beberapa desa penerima penghargaan lainnya.
Pemberian anugerah bagi sepuluh desa wisata terbaik ini dilaksanakan dalam rangka mendukung visi pemerintah untuk memajukan daerah melalui pariwisata karena sektor tersebut dinilai cepat dan mudah dikembangkan.
Ardu Jelamu menyebutkan di NTT saat ini memiliki ratusan desa wisata, dan ditargetkan hingga 2018 nanti akan ada 273 desa wisata di daerah yang kaya dengan potensi pariwisata bahari, air terjun, wisata alam, wisata budaya, dan wisata relijius.
Dalam RPJMD NTT pada periode kedua kepemimpinan Gubernur Frans Lebu Raya (2013-2018) ditargetkan hingga akhir 2018 ada 273 desa wisata di NTT.
"Target ini telah dicanangkan oleh Gubernur Frans Lebu Raya, setelah melihat potensi yang ada sejak awal 2008 memimpin daerah ini dengan 73 desa wisata dan terus bertambah dari tahun ke tahun selama ini," katanya lagi.
Penambahan jumlah desa wisata tersebut merupakan bagian dari komitmen pemerintah untuk mendorong pertumbuhan ekonomi masyarakat NTT, khususnya di perdesaan.
"Pemerintah berkeyakinan bahwa desa wisata akan mendorong pertumbuhan ekonomi dan meningkatkan kesejahteraan rakyat," katanya lagi.
Desa-desa wisata saat ini, antara lain desa wisata Wae Sano, Cunca Lolos, dan Liang Dara di Kecamatan Sano Nggoang, Kabupaten Manggarai.
Kemudian desa wisata Labuan Bajo, Komodo, Pasir Panjang, Desa Batu Cermin di Kecamatan Komodo, Kabupaten Manggarai Barat.
Selanjutnya Desa Satarlenda, Kecamatan Satarmese, Kabupaten Manggarai, dan Desa Nangalabang, Kecamatan Borong, Kabupaten Manggarai Timur, serta desa wisata perkampungan tradisional Bena di Kabupaten Ngada dan perkampungan tradisional Boti di Kabupaten Timor Tengah Selatan.
Sebelumnya, Kementerian Desa Pembangunan Daerah Tertinggal dan Transmigrasi Republik Indonesia memberikan penghargaan kepada sepuluh desa yang berhasil mengelola potensi pariwisata untuk memajukan ekonomi dalam kegiatan Expo BUMDes 2017 di Bukittinggi, Sumatera Barat.


content:
Natasha Angel – Hp sudah menjadi salah satu perangkat elektronik yang dimiliki hampir oleh semua orang mulai dari anak-anak hingga orang dewasa. Banyak yang menginginkan hp bagus namun memiliki harga terjangkau membuat banyak produsen hp mulai mengeluarkan hp dengan harga terjangkau. Sehingga bukan tidak mungkin lagi anda bisa memiliki hp bagus dengan harga murah salah…
Read More
Maksimalkan Fotografi Dengan Kamera Beresolusi Terbaik
Posted on December 8, 2019 December 9, 2019
Natasha Angel – Smartphone dikenal sebagai teknologi canggih, yang bisa memenuhi berbagai kebutuhan penggunanya. Mengabadikan momen, menjadi salah satu kebutuhan sekaligus gaya hidup anak milenial. Ingin memberikan kepuasan kepada pelanggannya, berbagai vendor smartphone tengah mengembangnkan kamera pada produknya. Semakin unjuk gigi di pasaran, berikut beberapa smartphone dengan kamera beresolusi terbaik. Perkembangan kamera pada smartphone Berbagai…
Read More
Alasan Phablet Lebih Nyaman Digunakan Daripada Ponsel Biasa
Posted on August 14, 2019 September 7, 2019
Phablet? Terdengar unik–seperti namanya, kata ini merupakan singkatan dari ‘phone’ dan ‘tablet’, yaitu ponsel yang ukurannya lebih dari 5 inci, sehingga analoginya adalah ponsel yang ukurannya mendekati tablet. Kehadiran phablet merupakan fenomena yang luar biasa karena keberadaan ponsel yang memiliki citra simple dan “cukup hanya digenggam dengan satu tangan” menjadi perangkat yang tidak begitu pas…


content:
Meskipun demikian, pada dasarnya, setiap sesi bisa menghasilkan keuntungan cukup besar jika trader menerapkan strategi yang sesuai. Oleh karena itu, Anda deposit pertama di Binomo dapat mencocokkan waktu trading dengan karakter risiko dan gaya trading Anda sendiri. Bagaimana caranya? Berikut beberapa contohnya. Selalu ingat bahwa trading forex sama seperti investasi lainnya, kita mencari keuntungan dalam jangka panjang. Adalah normal mengalami kerugian bertubi-tubi, tetapi selama metode perdagangan Anda terbukti, peluang akan berpihak pada Anda di masa yang akan datang. Seseorang dapat mengalami kerugian 60-70% dari perdagangan mereka tetapi masih untung dalam jangka panjang, yang membawa saya ke poin berikutnya. Umumnya broker mampu memberikan leverage sampai 1:100, maka Anda bisa mentradingkan USD 1,000 tadi dengan ketahanan modal hingga 100 pip jika membatasi lot hanya 0.5/posisi. Jika Anda menggunakan lot penuh maka 1 poin pergerakan melawan posisi akan langsung memicu margin stop/margin call (karena broker membutuhkan min. USD 1,000 sebagai margin), sedangkan jika lot sebesar 0.5 broker hanya akan membutuhkan margin sebesar USD 500, sehingga sisanya atau USD 500 mewakili batas margin stop sebesar 100 pip (di mana setiap pip bernilai USD 5 dengan lot 0.5).
Layanan gratis atau salah satu yang telah diabaikan biaya hanya mungkin menjadi pilihan yang lebih perdagangan biner 2019 dalam beberapa kasus. Ini hanyalah seperangkat alat yang menentukan entri Anda, kriteria pusat pelatihan forex di india terlibat dalam pengelolaan uang Anda, dan jalan keluar Anda. Apabila saldo masih tetap dan tidak bertambah, satu-satunya opsi yang bisa dilakukan adalah menghubungi staff Namecheap melalui email atau Live Chat. Mereka akan bertanya mengenai ID transaksi dan beberapa hal penting lainnya.
Karena sifat perdagangan opsi biner, perdagangan tanpa sistem yang teruji dan terbukti tidak pernah benar-benar memiliki peluang untuk menghasilkan keuntungan yang konsisten dalam jangka panjang. Tentu, varians jangka pendek dapat memberi imbalan kepada beberapa penjudi ini setiap sekarang dan kemudian, tetapi karena selama jangka panjang harapan matematis mereka negatif, mereka tetap terkutuk. Intinya: penggunaan sistem perdagangan tidak opsional. Itu suatu keharusan. Sistem perdagangan terdiri dari beberapa komponen yang berbeda, dan salah satunya bisa menjadi Tweezer, strategi berdasarkan pola kandil yang dikenal sebagai penjepit. Seperti sistem perdagangan berbasis bagan pola apa pun untuk Pilihan binerTweezer memiliki kelebihan dan kerentanan, salah satunya adalah sifat identifikasi pola yang relatif sulit. Untungnya, dalam kasus penjepit, ada beberapa cara untuk mengalahkan masalah yang terkait dengan identifikasi pola - dan saya akan membahasnya di bagian akhir artikel. Jadi, kita tidak perlu pusing pusing membuat garis secara manual untuk menentukan titik support dan resistance dimana, karena indikator ini akan bekerja dengan algoritmanya sehingga level level S&R nya akan terbentuk secara otomatis.
Untuk trader di Indonesia, metode deposit yang tersedia adalah AdvCash, AstroPay, Kartu Bank, Neteller, Perfect Money, Skrill, dan Webmoney. Metode penarikan yang tersedia termasuk Kartu Bank, Neteller, Skrill, Webmoney.
Doji dapat menjadi bagian dari pola kelanjutan tren atau pola pembalikan tren. Bagaimana Anda menafsirkannya akan didasarkan pada candle sebelumnya. Ambil posisi di chart 1 menit ketika trading dengan periode opsi 1 menit. Kalkulator ini strategi perdagangan teknis deposit pertama di Binomo saham membiarkan Anda menghitung kutipan harian historis untuk ADX dan ADXR, jadi, Anda dapat menguji sistem perdagangan pribadi Anda dan menerapkannya pada indeks dan grafik saham kami. Setelah membaca panduan ini, Anda akan dapat menjawab pertanyaan-pertanyaan penting tentang Olymp Trade berikut ini.
Pada perdagangan semalam (03/10) bursa saham Wall Street kompak ditutup rebound, dimana Nasdaq memimpin penguatan tertinggi sebesar 1.12% kemudian S&P 500 dan Dow Jones naik masing-masing sebesar 0.80% dan 0.47%. Bagaimana jika dalam menemukan blok, ternyata membutuhkan waktu rata-rata lebih dari 10 menit? . Sudah dengan penentuan kapan dan dimana Anda masuk pasar, kini saatnya Anda belajar kapan dan dimana Anda keluar dari pasar atau tutup transaksi. Anda kembali perlu memahami sistem momentum, kapan pasar mulai jenuh dengan trend.
Anda harus siap secara mental untuk menerima kerugian dan belajar dari setiap kegagalan sebagai proses untuk merancang rencana trading yang lebih baik. Miliki rencana yang solid dengan strategi ampuh deposit pertama di Binomo untuk tetap membumi dan membantu Anda membuat keputusan yang disiplin sesuai dengan rencana awal.
Dengan Multiterminal anda dapat bekerja dengan beberapa akun trading di InstaForex di saat yang sama, dengan mengelolanya dalam satu terminal. Multiterminal merupakan instrumen trading yang ideal untuk para trader yang melakukan investasi dan trading di akun klien mereka.(Account Management).
Cara trading forex tanpa modal sepeserpun benar benar ada. Misalnya dengan mengikuti kontes trading forex yang rutin diselenggarakan oleh broker forex setiap bulannya. Dengan ini anda tidak hanya akan bermain forex dengan gratis, tapi jika anda menang anda bisa mendapatkan hadiah uang dolar dengan nominal yang lumayan. Fundamentalist adalah trader yang mengandalkan kemampuan menganalisa berita pasar. Selain laporan keuangan dan index kerja departement kerja sebuah negara, fundamentalist juga menganalisa isu - isu yang beredar di pasar dan mencoba menterjemahkannya ke dalam nilai ekonomi. Seorang fundamentalist umumnya adalah trader yang mengambil keuntungan yang besar. Seseorang yang menguasai tehnik ini, umumnya mudah menentukan trend yang sedang berlaku di pasar dan berbagai bentuk manuvernya. Namun yang perlu di mengerti adalah, tidaklah mudah untuk menterjemahkan berita & sentimen pasar ke dalam bentuk angka-angka. Inilah yang menyebabkan seorang fundamentalist membutuhkan mentor yang kompeten. Secara autodidak, seorang fundamentalis membutuhkan waktu terbang dan kedisiplinan yang cukup tinggi.