content:
Desa Lembang terbentuk sekitar tahun 1891 awalnya merupakan bagian wilayah perkebunan kopi dan tembakau, yang terdiri dari beberapa kampung yang batas-batasnya ditetapkan oleh Pemerintah Kolonial Belanda. Cikal bakal penduduk Desa Lembang adalah beberapa kelompok keluarga yang dulu tinggal di beberapa kampung dan para pendatang yang bekerja di perkebunan yang kemudian menjadi penduduk tetap.
Nama Lembang diambil dari kata “ngalembang” yang berarti genangan air. Hal tersebut dikarenakan pada setiap musim hujan, air selalu menggenang atau tidak dapat mengalir. Namun dalam versi lain disebutkan bahwa kata Lembang berasal dari kata dalam bahasa Belanda yakni landbouw yang berarti pertanian. Hal tersebut merujuk pada kondisi Lembang yang merupakan daerah pertanian.
Seiring dengan perkembangan penduduk yang makin pesat, pada tahun 1980 Desa Lembang dimekarkan menjadi dua desa, yaitu Desa Lembang dan Desa Jayagiri. Di luar sejarah panjang pembagian wilayah dan kekuasan, pemekaran Kabupaten Bandung menjadi beberapa kota dan kabupaten baru, salah satu alasannya biasanya karena pusat pemerintah terlalu jauh dari jangkauan masyarakat. Hal ini terkait dengan beberapa layanan administratif yang dibutuhkan oleh masyarakat.
Kondisi demikian perlu mendapat perhatian pemerintah sejalan dengan kebijakan nasional dalam percepatan pembangunan terutama di Provinsi Jawa Barat. Oleh karena itu diperlukan peningkatan kemampuan penyelenggaraan pemerintahan daerahnya khususnya di Kabupaten Bandung melalui pembentukan daerah.
Berdasarkan hal tersebut di atas dan memperhatikan aspirasi yang berkembang dalam masyarakat, yang selanjutnya dituangkan secara formal dalam Surat keputusan DPRD Kabupaten Bandung Nomor : 11 tahun 2004 tanggal 20 Agustus 2004 tentang persetujuan DPRD Kabupaten Bandung terhadap pembentukan Kabupaten Bandung Barat. Surat usulan Bupati Bandung Nomor : 135/1729/BINPENUM tanggal 23 Agustus 2004 perihal persetujuan DPRD Kabupaten Bandung terhadap pembentukan Kabupaten Bandung Barat. Surat Keputusan DPRD Provinsi Jawa Barat Nomor 135/Kep.DPRD-7/2005 tanggal 22 Maret 2005 tentang persetujuan terhadap pembentukan Kabupaten Bandung Barat. Surat Usulan Gubernur Jawa Barat kepada Menteri Dalam Negeri Nomor 135.1/1197/Desen tanggal 11 April 2005 perihal Usul Pembentukan Kabupaten Bandung Barat di Provinsi Jawa Barat. Surat Keputusan DPRD Kabupaten Bandung Nomor : 07 tahun 2005 tanggal 20 Maret 2005 tentang Persetujuan DPRD Kabupaten Bandung terhadap penetapan Kecamatan NGAMPRAH sebagai calon Ibu Kota Bandung Barat.
Jadi untuk saat ini Bandung Barat juga sudah mulai berkembang dan maju. Dari sisi pemerintahan maupun dari perekonomiannya juga. Pabrik batik sekolah termurah untuk wilayah bandung barat, saat ini dunia pendidikannya juga sudah merambah. Tak lekang maka batik sekolahpun menjadi bisnis yang memang menjanjikan. Seperti pabrik batik sekolah yang satu ini, semoga dapat menjadikan referensi untuk kalian semua www.seragam-batik.com serta nomor telepon 082115069960 ( Andryan ) atau Whatsapp 082320744774 ( Arini )
Author AdminPosted on October 24, 2020 Categories Cetak Batik Printing, Jasa cetak batik, Printing Kain Motif, Seragam BatikTags cetak batik printing, cetak printing batik, Cetak Printing Batik Daerah, Cetak Printing Batik Kantor, Cetak Printing Batik Partai, jasa printing batik murah, JASA PRINTING BATIK SERAGAM, printing batik seragam murah, vendor jasa printing batik bandungLeave a comment on PABRIK BATIK SEKOLAH TERMURAH UNTUK WILAYAH BANDUNG BARAT
JUAL SERAGAM BATIK UNTUK KANTOR DAN SEKOLAH
JUAL SERAGAM BATIK UNTUK KANTOR DAN SEKOLAH
seragam batik kantor / seragam batik sekolah
Singkat sejarah tentang seragam, Sejak jaman dulu tepatnya saat jaman kerajaan mungkin pertama kalinya manusia mengenal seragam. Walaupun namanya mungkin bukan seragam tapi mereka sadar bahwa hal itu adalah seragam. Buktinya mereka mengenakan hal yang sama mulai dari atribut hingga pakaian yang dikenakan oleh dayang, prajurit, pejabat hingga keluarga kerajaan.
Pengertian Seragam Seragam adalah seperangkat pakaian dan atributnya yang dikenakan sama/serupa oleh suatu anggota organiasi atau lembaga pemerintah atau non pemerintah sewaktu berpartisipasi atau melakukan kegiatan aktivitas dalam organisasi tersebut Fungsi dan Manfaat seragam
Seragam sangat bermanfaat untuk meningkatkan keefektifan karyawan dalam bekerja.
Pengertian seragam sekolah adalah baju yang digunakan oleh siswa-siswi suatu sekolah atau lembaga pendidikan tertentu sebagai lambang atau identitas dari suatu sekolah.
Saat ini di berbagai sekolah mempunyai tata-tertib sendiri di dalam pengertian seragam sekolah. Ada beberapa model yang di terapkan seperti seragam sekolah modern dipakai di hari senin-selasa. Seragam batik sekolah dipakai pada hari rabu -kamis dan seragam wajib dipakai pada jumat-sabtu.
Sebagaimana yang telah kita ketahui bersama bahwasannya salah satu atribut yang harus dikenakan para siswa atau siswa ke sekolah adalah seragam sekolah. Menggunakan seragam sekolah merupakan sebuah keharusan bagi pelajar dalam mengenyam pendidikan disekolah, jika tidak maka akan mendapatkan hukuman.
Tentunya tidak semua seragam sama antara satu sekolah dengan sekolah lainnya, ada juga seragam yang berbeda misalnya saja seragam batik atau seragam biasa namun diserta dengan rompi. Biasanya seragam batik dan rompi dibuat berbeda dengan seragam yang lainnya, hal ini agar sekolah tersebut bisa terlihat identitasnya. Kita bisa melihat contohnya dilingkungan sekitar kita, kita bisa mengetahui orang ini dari sekolah mana karena dilihat dari seragam batiknya atau rompi yang dikenakannya.
seragam batik sekarang pun menjadi sesuatu yang wajib juga digunakan dikantor maupun sekolah, Jual seragam batik untuk kantor dan sekolah. dikarenakan batik merupakan ciri pakaian nasional Indonesia, maka untuk saat ini seragam batik menjadi keperluan pakaian bersekolah mapun kerja. jadi untuk kalian yang butuh seragam batik yang berkualitas dan proses yang cepat silahkan visit website www.seragambatik.com serta nomor telepon yang dapat dihubungi di 082115069960 ( Andryan ) atau Whatsapp 082320744774 ( Arini )
Author AdminPosted on October 24, 2020 Categories Cetak Batik Printing, Jasa cetak batik, Printing Kain Motif, Seragam BatikTags cetak batik printing, Cetak kain motif, cetak printing batik, Cetak Printing Batik Kantor, jasa printing batik, JASA PRINTING BATIK SERAGAM, Seragam Batik Kantor, Seragam Batik Partai, Seragam Batik Sekolah Murah, vendor jasa printing batik bandungLeave a comment on JUAL SERAGAM BATIK UNTUK KANTOR DAN SEKOLAH
PRODUKSI SERAGAM BATIK SEKOLAH UNTUK WILAYAH SAMARINDA
PRODUKSI SERAGAM BATIK SEKOLAH UNTUK WILAYAH SAMARINDA
seragam batik sekolah
Kota Samarinda merupakan Ibukota Kalimantan Timur, jika Balikpapan adalah pintu gerbang akses menuju Kalimantan Timur, maka Samarinda adalah pintu gerbang akses menuju pedalaman Kalimantan Timur. Kota Samarinda memiliki sebuah sungai yang membelah kota, namanya adalah Sungai Mahakam. Di bagian seberang sungai dinamakan daerah “Samarinda Seberang”.
Kota Samarinda memiliki kemiripan dengan beberapa kota di Kalimantan Timur, Kota Samarinda kaya akan hasil bumi seperti minyak, tambang batu bara, pasir kuarsa, selain itu pertanian juga tumbuh dengan pesat di kota ini, tidak ketinggalan pariwisata juga mulai digalakkan sebagai salah satu devisa daerah Samarinda.
Samarinda zaman dahulu adalah salah satu wilayah Kesultanan Kutai Kartanegara ing Martadipura. Di wilayah tersebut belum ada desa maupun kota hingga pertengahan abad ke-17, dahulu wilayah Samarinda merupakan lahan persawahan bagi beberapa penduduk. Lahan persawahan dan perladangan hanya berpusat di sepanjang tepi Sungai Karang Mumus dan sungai Karang Asam.
Pada tahun 1668, rombongan orang-orang Bugis Wajo yang dipimpin La Mohang Daeng Mangkona yang bergelar “Pua Ado”. Melakukan perjalanan dari Kesultanan Gowa ke Kesultanan Kutai. Mereka bermaksud untuk pindah menuju Kesultanan Kutai karena mereka tidak mau tunduk dan patuh terhadap Perjanjian Bongaya, tidak lama setelah Kesultanan Gowa kalah akibat diserang oleh pasukan Belanda.
Kota Samarinda terletak di wilayah khatulistiwa dengan koordinat di antara 0°21’81″–1°09’16” Lintang Selatan dan 116°15’16″–117°24’16” Bujur Timur.
Luas wilayah Kota samarinda secara keseluruhan mencapai 718 km² atau 71.800 Ha, dengan ketinggian 10.200 Cm di atas permukaan laut.
Kota Samarinda beriklim tropis basah, hujan sepanjang tahun. Temperatur udara antara 22°C – 32°C dengan curah hujan rata-rata per tahun 2.345 Mm, sedangkan kelembaban udara rata-rata 81,4%. Sesuai dengan kondisi iklim di Kota Samarinda yang tergolong dalam tipe iklim tropika humida, maka jenis-jenis tanah yang terdapat di daerah inipun tergolong ke dalam tanah yang bereaksi masam.
Untuk menikmati wisata budaya, wisatawan bisa mengunjungi Desa Budaya Pampang yang berjarak sekitar 20 km dari pusat kota. Pampang akan menampilkan atraksi budayanya dari suku Dayak Kenyah pada hari minggu.
Produk budaya dari Samarinda berupa ukir-ukiran dan pernak-pernik lainnya yang bisa didapatkan di Citra Niaga. Samarinda juga mempunyai produk tekstil yang bernamaSarung Samarinda dan Batik Ampiek, batik yang bermotif ukiran Dayak.
Produksi seragam batik sekolah untuk wilayah samarinda, untuk kalian yang akan mengorder batik di daerah samarinda, silahkan kunjungni website www.seragambatik.com serta nomor telepon yang dapat dihubungi di 082115069960 ( Andryan ) atau Whatsapp 082320744774 ( Arini )
Author AdminPosted on October 24, 2020 Categories Cetak Batik Printing, Jasa cetak batik, Printing Kain Motif, Seragam BatikTags cetak batik printing, cetak printing batik, CETAK SERAGAM BATIK KABUPATEN, CETAK SERAGAM BATIK ORGANISASI, Jasa Print Tekstil, jasa printing batik, Jasa Printing Batik Sekolah, KONVEKSI SERAGAM BATIK KANTOR, PRINTING KAIN BATIKLeave a comment on PRODUKSI SERAGAM BATIK SEKOLAH UNTUK WILAYAH SAMARINDA
Produksi seragam batik sekolah untuk wilayah jakarta
Produksi seragam batik sekolah untuk wilayah jakarta
Seragam batik pabrik murah
Jakarta adalah ibukota dari Indonesia, banyak orang berbondong-bondong pergi ke Jakarta dengan berbagai tujuan, salah satunya adalah untuk mencari lapangan pekerjaan. Begitu dikenalnya Jakarta sebagai pusat bisnis Indonesia membuat jumlah penduduk di Jakarta dalam setiap tahunnya meningkat dari tahun-tahun sebelumnya. Sedikit melirik sejarah Jakarta, perlu diketahui bahwa dulunya sebelum memakai nama Jakarta, Ibukota Indonesia banyak mengalami perubahan nama dimulai pada abad ke-14 dengan sebutan Sunda Kelapa, kemudian berganti menjadi Jayakarta, Tahun 1961 dibentuk Pemerintah Daerah Khusus Ibukota Jakarta Raya. Pada tanggal 31 Agustus dengan UU No. 10 tahun 1964 dinyatakan Daerah Khusus Ibukota Jakarta Raya tetap sebagai Ibukota Negara Republik Indonesia dengan nama Jakarta. Tahun 1999 sebutan pemerintah daerah berubah menjadi pemerintah provinsi DKI Jakarta.
Kota metropolitan yang tidak pernah sepi dari berbagai macam aktifitas, pariwisata, hiburan, ekonomi, perdagangan, politik sampai kota sebagai pusat pemerintahan Indonesia ini, memang memiliki daya tarik tersendiri, sehingga membuat banyak kalangan, dari berbagai latar suku, kebudayaan, dan daerah datang ke Jakarta dengan berbagai tujuan. Mari kita bahas soal ekonomi dan perdagangan dijakarta, karena dagang sudah pasti ada ekonominya. Dari sisi lapangan usaha, membaiknya konsumsi di ibu kota turut mendorong peningkatan pertumbuhan sektor perdagangan, informasi dan telekomunikasi, transportasi dan pergudangan, serta jasa perusahaan.
Seakrang ini apa sih yang tidak ada di Jakarta, hamper semua dapat ditemukan dengan mudah. Dalam dunia usaha pun hokum alam yang berlaku di Jakarta, siapa yang kuta dia yang akan bertahan. Dikarenakn sudah menjadi rahasia umum bahwa persainganlah yang memang menjadi faktor utama apalagi yang namanya dunia usaha, perdagangan dan ekonnomi.
Produksi seragam batik sekolah untuk wilayah Jakarta, sedikit menggambarkan untuk saat ini saran mencari dunia usaha adalah yang unik, jarang akan tetapi hasil produksi banyak yang membutuhkan. Memang sih kreatifitas harus tinggi dan memang keberanian membaca pergerakan pasarnya juga harus cerdik. Seragam batik contohnya, siapa yang tidak memakai produk satu ini. Semua anak – Aanak sekolah sampai ke gurunya juga pasti menggunakan seragam batik di hari sekolahnya.
Disamping sekolah yang memang diwajibkan oleh pemerintah, pasti juga sekolah adalah rumah kedua untuk para anak – anak yang menimba ilmu demi cita – citanya. Produksi seragam batik sekolah untuk wilayah Jakarta, tidak akan sampai terhitung sekolahan yang berada di Jakarta. Pasti juga tidak akan terhitung juga berapa siswa dan tenaga pengajarnya. Maka dari itu usaha atau bisnis seragam batik sekolah cukup menjanjikan apalagi di daerah ibu kota Jakarta. Tapi jangan sampai salah juga ya untuk memilih tempat produksi seragam batik sekolahnya. Kami kasih super duper kemudahan buat kalian semua, tinggal klik klik dan klik www.seragam-batik.com dan menghubungi nomor telepon 082115069960 ( Andryan ) atau Whatsapp 082320744774 ( Arini )
Author AdminPosted on September 30, 2020 Categories Cetak Batik Printing, Jasa cetak batik, Printing Kain Motif, Seragam BatikTags cetak batik printing, Cetak kain motif, cetak printing batik, Cetak Printing Batik Organisasi, Cetak Printing Batik Sekolah, CETAK SERAGAM BATIK ORGANISASI, vendor printing batik murahLeave a comment on Produksi seragam batik sekolah untuk wilayah jakarta
Produksi seragam batik sekolah untuk wilayah papua
Pulau Papua atau Guinea Baru (bahasa Inggris: New Guinea, bahasa Indonesia: Nugini) atau yang dulu disebut dengan Pulau Irian, adalah pulau terbesar kedua (setelah Tanah Hijau) di dunia yang terletak di sebelah utara Australia. Pulau ini dibagi menjadi dua wilayah yang bagian baratnya dikuasai oleh Indonesia dan bagian timurnya merupakan negara Papua Nugini. Di pulau yang bentuknya menyerupai burung cendrawasih ini terletak gunung tertinggi di Indonesia, yaitu Puncak Jaya (4.884 m). Nama Irian digunakan dalam Bahasa Indonesia untuk mengacu terhadap pulau ini juga terhadap provinsi, sebagaimana “Provinsi Irian Jaya”. Nama ini diusulkan pada tahun 1945 oleh Marcus Kaisiepo, saudara dari Gubernur yang akan datang Frans Kaisiepo. Nama ini diambil dari Bahasa Biak yang berarti beruap, atau semangat untuk bangkit. Nama ini juga digunakan dalam bahasa pribumi lain seperti Bahasa Serui, Bahasa Merauke dan Bahasa Waropen. Nama ini digunakan sampai tahun 2001 di mana pulau beserta provinsinya kembali dinamakan Papua. Nama Irian yang awalnya disukai oleh penduduk asli Papua, sekarang dianggap sebagai nama yang diberikan oleh Jakarta.
Suku – suku di Papua memiliki banyak hal-hal unik, seperti adat istiadat, bahasa, kuliner, hingga pakaian. Salah satu pakaian yang paling menggambarkan kebudayaan Papua secara umum adalah Koteka. Koteka adalah pakaian untuk menutup kemaluan pria dalam kebudayaan asli Papua. Secara harfiah, koteka sendiri bermakna pakaian yang berasal dari bahasa Mee. Suku Dani yang menempati daerah Bukit Balliem, Wamena, Jayawijaya, menyebut pakaian tradisional ini Horim/Holim. Sedangkan suku-suku di daerah lain di Papua memiliki sebutan tersendiri untuk koteka. Namun yang paling familiar adalah koteka. Koteka terbuat dari tumbuhan yang buahnya mirip seperti mentimun dengan bentuk yang agak panjang. lebih tepatnya koteka terbuat dari kulit buah labu-labuan yang berbentuk panjang dan berkulit keras, dan mempunyai nama latin Lagenaria Sicecaria. Orang Mee menyebutnya bobbe. Bobbe biasanya di tanam di kebun atau di halaman rumah. proses pembuatannya, bobbe dipetik (biasanya yang sudah tua) kemudian dimasukkan kedalam pasir halus. Di atas pasir halus tersebut dibuat api yang besar. Setelah panas kulit bobbe akan lembek dan isinya akan mencair, lalu biji-biji beserta cairan akan keluar dari dalam ruas bobbe. Setelah itu, bobbe digantung (dikeringkan) di perapian hingga kering. Setelah kering dilengkapi dengan anyaman khusus dan siap pakai sebagai koteka.
Akana tetapi jaman yang kian modern dan maju, tak semua penduduk atau suku di papua memakai koteka lagi, mereka sudah menggunakan baju – baju modern yang tidak ketinggalan jaman. Salah satunya batik, batik berhasil menembus pasar jual di papua dikarenakan saat ini media sudah mulai merambah di pulau papua sendiri. Produksi seragam batik sekolah untuk wilayah papua, saat ini tidaklah sulit untuk mendapatkan batik di pulau papua sana. Karena memang tesokong jaman dan kecanggihan untuk batik sekarang sudah luas untuk ranah pasanya.
Produksi seragam batik sekolah untuk wilayah papua, kalo tidak percaya silahkan kunjunngi website www.seragam-batik.com dan menghubungi nomor telepon 082115069960 ( Andryan ) atau Whatsapp 082320744774 ( Arini )
Author AdminPosted on September 30, 2020 September 30, 2020 Categories Cetak Batik Printing, Jasa cetak batik, Printing Kain Motif, Seragam BatikTags cetak batik printing, cetak printing batik, Cetak Printing Batik Kantor, Cetak Printing Batik Partai, Cetak Printing Batik Sekolah, Cetak Printing Seragam PNS, CETAK SERAGAM BATIK KABUPATEN, CETAK SERAGAM BATIK ORGANISASI, CETAK SERAGAM BATIK TKLeave a comment on Produksi seragam batik sekolah untuk wilayah papua


content:
Masih melanjutkan sedikit kegalauan. Minggu lalu adalah hari terakhir kita bersama sebelum bunda berangkat ke Jerman. Ada sedikit hikmahnya juga aku MC, setidaknya kita bisa bersama seharian penuh pada hari itu. Sehingga aku juga bisa ikut mengantar bunda ke airport juga.
Pagi-pagi seperti biasa kita sarapan di Geylang Serai. Lalu ke China Town untuk mengambil durian pastry yang ternyata belum ada. Langsung pulang lagi dan menghabiskan waktu sampai sore tanpa ke mana-mana.
Sorenya kita berangkat ke bandara naik MRT. Rasanya sedih sekali waktu itu. Melepas istri tercinta untuk berangkat menuntut ilmu itu sangat berat di hati. Kita naik MRT terus sesampai di airport langsung checkin dan mereimburse GST. Lumayan 11 dollar. Setelah itu kita makan malam bareng.
Tanpa terasa akhirnya aku harus melepas wifey ke pintu keberangkatan. Setahun lebih yang lalu, akhir Maret 2012 kita pernah mengalami momen sama. Namun pada waktu itu rasanya lebih menyedihkan. Yang kita bayangkan pada waktu itu adalah kita baru mungkin berkumpul lagi setelah 2 tahun. Oleh karena itu sehari setelah itu keluarlah email dear wifey yang pertama.
Namun tetap, keberangkatan wifey kali ini pun tetap membuatku sedih. Meski tanpa disangka kita berhasil melewati masa-masa berjauhan sekitar satu tahun, tetap saja sehari tanpamu itu rasanya sangat sepi. Barangkali kita bisa akan bertemu lagi dalam beberapa minggu, atau maksimal dalam beberapa bulan. Aku ingin bisa datang di hari sidang thesismu. Melihat gadis jeniusku mempresentasikan karyanya.
Setelah itu Insya Allah aku sudah meniatkan diri untuk umrah. Pada waktu yang sama aku juga ingin kita bisa segera untuk membuka tabungan haji. Baru kemudian aku ingin menghabiskan waktu beberapa minggu bertualang. Keliling Eropa dan juga mengunjungi beberapa tempat indah di Indonesia.
Oh ya pada waktu yang sama aku juga masih terus akan melamar beasiswa dan pekerjaan. Tak sabar menanti kejutan-kejutan lain dari Allah. Tak sabar untuk terus melakukan banyak petualanganan denganmu.

warc-identified-content-language: ind,eng

content-type: text/plain

warc-type: conversion

label: id


content:
Perkembangan olah raga lepas pantai telah membuka dunia baru bagi orang-orang yang suka judi olahraga. Saat Anda masuk ke situs web olah raga lepas pantai, Anda telah diberi kesempatan untuk menempatkan taruhan Anda dari kenyamanan rumah Anda sendiri atau di mana pun. Tidak masalah olahraga mana yang ingin Anda pertaruhkan, sportsbook yang bagus yang menyediakan banyak variasi untuk dipilih. Anda bisa mendapatkan taruhan dan peluang taruhan terbaru dan tidak ada tekanan untuk bertaruh pada level tertentu dan terkadang untuk bertaruh apa pun. Semua keputusan terserah Anda.
Buku Olahraga asing terbaik akan menyediakan Anda dengan akun yang aman sehingga Anda dapat membuat residu Anda dengan penuh percaya diri. Anda juga bisa menjadi positif privasi Anda dilindungi. Buku Olahraga lepas pantai terbesar juga akan langsung membelanjakan Anda setiap kali Anda menang. Bahwa Anda tidak perlu menunggu uang sama seperti di beberapa situs perjudian. Selain judi yang dilindungi dan suara, Anda bahkan dapat memperoleh kiat dari situs-situs tersebut yang akan memungkinkan Anda membuat pilihan taruhan terbaik bandar bola.
Sportsbook asing terbaik memiliki ahli yang menguji setiap komponen atlet dan tim manusia. Mereka tahu siapa yang panas dan siapa yang tidak. Dalam bisbol seperti mereka akan mengerti jika pemain utama terganggu oleh cedera atau harus hitter datang di tengah kemerosotan batting. Mereka memahami tentang perdagangan yang mungkin mendukung atau merusak tim-tim dengan cara melawan pitcher saling bersaing satu sama lain. Oleh karena itu, Anda dapat mengandalkan rekomendasi yang mereka buat untuk menawarkan Anda kesempatan yang lebih baik. Oleh karena itu mengapa Anda tidak mendaftar menggunakan sportsbook yang bagus hari ini dan tetapkan taruhan Anda.


content:
Cara Menggunakan Kartu Kredit Anda dengan Aman di Situs Taruhan Olahraga Online Liga88 - jordan-11.fr
Skip to content
jordan-11.fr
Abundance Prosperity Blogs Info
Menu
Home
About Us
Contact Us
Privacy Policy
Cara Menggunakan Kartu Kredit Anda dengan Aman di Situs Taruhan Olahraga Online Liga88
April 4, 2019 June 16, 2019 admin Uncategorized
Memberikan nomor kartu kredit Anda ke situs web Internet biasanya agak menakutkan, dan jika Anda menganggap Anda berbicara tentang perjudian, hal-hal yang tampaknya lebih berisiko, tetap saja, tidak perlu panik, Anda hanya perlu tahu cara menggunakan kredit Anda kartu dengan aman di situs taruhan olahraga online. Asalkan beberapa tindakan pencegahan dilakukan, Anda dapat menikmati aktivitas judi Anda dengan aman.
Pertama-tama, Anda harus tahu bahwa Liga88 ketika membuka akun Anda kemungkinan besar akan diminta untuk mengasosiasikan kartu kredit Anda sehingga dapat menyetor dana melalui itu.
Hal pertama yang tidak dapat dihindari untuk dilakukan adalah memverifikasi bahwa Anda berurusan dengan situs yang serius. Ada terlalu banyak buku olahraga penipuan. Jadi jangan ragu menghabiskan waktu mencari informasi, kredensial dan jika mungkin rekomendasi pribadi dari petaruh olahraga online yang berpengalaman. Pengalaman langsung dari seseorang yang Anda percayai akan menjadi sumber informasi terbaik Anda.
Setelah Anda terlibat dengan situs taruhan, nomor kartu kredit Anda akan diminta untuk menyetor uang ke akun Anda dan itu cukup aman. Tetapi, karena beberapa penjahat akan berusaha menghubungi Anda, jangan pernah menjawab email apa pun yang meminta Anda untuk “memasukkan kembali” informasi kartu kredit Anda. Anda mungkin menerima email yang sepertinya berasal dari situs taruhan Anda yang meminta Anda untuk info semacam itu. Itu hanya akan menjadi upaya penipuan untuk mendapatkan data kartu kredit Anda dan menyalahgunakannya.
Hal penting lain yang perlu diperiksa sebelum menggunakan kartu kredit Anda adalah mencari tahu apakah transaksi e-gambling diizinkan. Beberapa bank sangat jelas tentang masalah ini dan akan memblokir transaksi perjudian. Jadi selamatkanlah diri Anda dari kekecewaan dan temukan itu sebelumnya.

label: en


content:
perjudian kasino online, dalam beberapa tahun terakhir, telah menjadi industri multi miliar dolar. perjudian kasino online telah benar-benar mengubah wajah perjudian dan tidak lagi apakah diperlukan bahwa pemain mengunjungi batu bata dan mortir kasino. Dengan popularitas penggemar game internet sekarang dapat menikmati permainan kasino favorit mereka dalam kenyamanan rumah mereka. Seperti tampilan keseluruhan dari kasino telah berubah begitu memiliki ketersediaan pembinaan dan https://sportnet88.online/ pembelajaran untuk pedoman untuk memainkan permainan ini. Beberapa orang berpikir bahwa investasi uang di kasino di Internet tidak aman dan dalam beberapa kasus mereka dapat ditipu. Tetapi kenyataannya adalah kebanyakan situs kasino yang dipantau oleh berbagai asosiasi perjudian untuk memastikan kejujuran mereka. Pembayaran harus memenuhi tingkat yang dapat diterima oleh berbagai komisi gaming. Jika tidak terpenuhi, ini kasino tersangka dengan cepat tercatat sebagai ‘tidak bisa dipercaya’ dan dengan kecepatan internet mereka bahkan lebih cepat keluar dari bisnis. Pelanggan disarankan untuk tetap kasino online terkemuka untuk memastikan permainan yang adil.
Bermain panduan dan aturan:
Tidak ada pemain bisa berhasil dalam proses membuat uang secara langsung tanpa menjadi akrab dengan metode khusus untuk memenangkan permainan. Mengetahui dasar-dasar permainan yang Anda berniat untuk bermain akan pergi jauh dalam menentukan peluang Anda untuk menjadi pemenang. Satu tidak pernah harus berkomitmen untuk kesalahan umum karena mereka pasti akan menyebabkan kerugian yang lebih besar. Salah satu harus selalu mendekati permainan mereka pilihan dengan uang kasino. Hal ini akan mengurangi risiko kehilangan apa yang telah memiliki.
Download Casino Games:
Anda dapat dengan mudah mempelajari permainan pilihan Anda, apakah itu blackjack, poker, dadu atau slot hanya dengan men-download perangkat lunak kasino untuk permainan itu dan berlatih. Kebanyakan perangkat lunak akan menawarkan Anda kesempatan untuk bermain game gratis. Juga, banyak permainan memiliki aturan yang menyertainya dan strategi yang dapat Anda referensi saat Anda pergi. Setelah Anda mendapatkan memahamkan itu dan mempelajari berbagai teknik Anda kemudian dapat mendaftar dan menjadi ‘pemain uang riil’. Kemudian, sama seperti batu bata dan mortir kasino, Anda bermain melawan rumah bersaing untuk hadiah uang tunai dan jackpot.
Tagged as: daftar sbobet, https://sportnet88.online/, link alternatif sbobet, link sbobet, Sbobet, sbobet alternatif, Sbobet Asia, sbobet wap, sportnet88, sportnet88.online


content:
Travelling adalah hal yang menyenangkan bagi setiap orang. Mengunjungi tempat yang sebelumnya belum pernah dikunjungi dan juga mengamati berbagai hal baru di tempat tersebut. Selain itu Indonesia adalah suatu tempat yang kaya akan tempat wisata. Terlebih lagi budaya yang terdapat di Indonesia sangatlah banyak. Karena banyaknya tempat wisata yang ada di Indonesia tersebut maka banyak pula wisatawan asing yang berlibur ke Indonesia. Munculnya berbagai agen travel juga merupakan dampak dari hal tersebut. Travelling sendiri dapat dilakukan sendiri atau bersama keluarga. Namun yang lebih seru apa bila dilakukan bersama keluarga. Selain dapat melaksanakan liburan juga dapat mempererat ikatan keluarga.
Dalam menuju ke tempat travelling sendiri ada berbagai cara yang dapat diambil. Misalnya saja menggunakan alat transportasi pribadi atau menggunakan jasa pihak travel. Pilihan tempat disata juga bebas untuk dipilih dari mulai domesik hingga mancanegara. Namun semua itu tergantung dari dana yang dimiliki. Akan tetapi sebenarnya liburan bukanlah suatu ajang yang membutuhkan dana banyak. Ada berbagai cara yang dapat dilakukan untuk mengepres dana tersebut. Maka dari itu berikut ini adalah 5 tips travel murah dengan kualitas yang bagus untuk dicoba.
Pertama, Minta Rekomendasi Teman Atau Kerabat Dekat Kamu
Hal pertama ini adalah salah satu hal yang harus dicoba. Belajar dari pengalaman adalah suatu hal yang sangat bagus karena kita dapat mempelajari apa yang seharusnya dilakukan dan apa yang seharusnya tidak dilakukan lalu di benarkan agar tidak terulang kembali. Sama halnya jika ingin melakukan travel yang murah sebaiknya mintalah rekomendari kepada teman atau kerabat yang telah berpengalaman banyak di dunia travelling. Dari situlah kita dapat memperkirakan pengeluaran pada saat travelling nanti. Selain itu dari beberapa rekomendari tempat wisata tersebut kita dapat memilih mana yang paling ingin dikunjungi.
Kedua, Cari Tahu Historis Perjalanan Agen Travel Tersebut
Jika memutuskan untuk menggunakan agen travel untuk travelling maka hal yang perlu dilakukan adalah mencari informasi mengenai agen travel tersebut. Informasi tersebut dapat dilihat di internet atau pun review klien yang dimiliki oleh agen tersebut. Hal tersebut penting untuk mengurangi resiko perjalanan travelling yang buruk. Selain itu jika menginginkan agen travel yang menawarkan dengan harga murah dan berkualitas juga sangatlah banyak. Tinggal pintar pintar mencarinya saja.
Ketiga, Bandingkan Dengan Beberapa Agen Travel Lainnya
Setelah mencari berbagai infromasi mengenai beberapa agen travel. Maka langkah selanjutnya adalah membandingkan antara satu dengan yang lainnya. Hal tersbeut juga cukup penting terlebih lagi jika mengalami kebuntuan mengenai persoalan harga. Misalnya saja harga yang ditawarkan oleh suatu agen mahal maka dengan membandingkannya kita dapat mengetahui bahwa harga tersebut standart atau memang agen tersebut memasang terlalu tinggi. Hal tersebut sangat penting jika ingin melaksanakan travelling dengan biaya yang murah. Memang sedikit sulit, tetapi dampak yang dirasakan akan sangat besar.
Keempat, Pilih Dan Ketahui Paket Perjalanan Sesuai Keinginan Kamu
Sebelum melakuka travelling maka hal yang seharusnya dilakukan adalah memilih tempat wisata yang dituju. Lalu mencari agen travelling yang sesuai harganya. Setelah itu baru memilih paket perjalanan yang sesuai. Paket yang ditawarkan oleh agen travel tersebut sangatlah bervariasi dan tergantung dengan pelayanan yang mereka tawarkan seperti lama wisata, penginapan, akomodasi, makanan. Jika memang menginginkan liburan yang murah dapat memilih paket perjalanan wisata saja.
Terakhir, Cari Tahu Promo Yang Sedang Ditawarkan
Promo bagaikan suatu keberuntungan bagi beberapa orang Terlebih lagi jika promo pada perjalanan wisata. Dengan promo tersebut dapat membuat perjalanan yang akan dilaksanakan menjadi lebih hemat dibandingkan biasanya. Maka dari itu carilah beberapa promo yang bisa diperoleh. Tanyakanlah juga rekan atau pun keluarga yang memiliki relasi terhadap beberapa agen travel tersebut mengenai ketersediaan promo. Namun biasanya promo selalu ada di setiap agen travel seperti setiap pendaftaran travel tertentu akan mendapatkan potongan harga tertentu pula.
Dapat travelling dengan harga yang murah adalah keinginan dari kebanyakan orang. Selain itu jika dalam keadaan uang yang sangat mepet bukanlah suatu hambatan untuk travelling jika menerapkan car acara diatas. Biasanya yang menyebabkan boros ketika liburan adalah oleh oleh. Sedangkan yang dibutuhkan pada saat liburan adalah pengalaman ketika disana. Maka dari itu agar travelling menjadi lebih murah dapat melewatkan oleh oleh tersebut. Beberapa cara tersebut juga dapat dilakukan dan tergolong cukup mudah. Hanya saja yang lumayan sulit adalah pada bagian membandingkan agen travel satu dengan yang lainnya. Namun selebihnya masih cukup mudah dilakukan. Untuk travelling dengan biaya yang murah memang memerlukan beberapa hal yang harus dilakukan. Berbeda jika uang yang dimiliki banyak maka tidak perlu melakukan berbagai hal tersebut. Namun travelling dengan uang yang mepet merupakan hal yang cukup seru untuk dilakukan juga.


content:
Perumahan Sukaraja Residence 2 merupakan perumahan milik pengembang (developer) pribadi yang terletak di Kampung Manglayang RT 01, RW 18, Desa Cihanjuang Rahayu, Kecamatan Parongpong, Kabupaten Bandung Barat, Jawa Barat yang sudah berdiri dari tahun 2013. Tema perumahan ini adalah minimalis dengan konsep perumahan cluster dengan hanya beberapa rumah saja, selain itu perumahan ini memiliki akad ‘syariah’ tanpa perantara bank alias proses transaksi dan cicilan (jika mencicil) langsung ke pihak developer. Selain itu pihak pengembang hanya memperbolehkan keluarga yang beragama islam yang boleh membeli rumah di Perumahan tersebut. Suasana di rumahan ini tersasa sejuk karena secara geografis dekat dengan lembang.
Untuk tahap 1 jumlah rumahnya sebanyak 9 unit dan sudah terisi semua, sedangkan untuk tahap 2 ini direncanakan akan membuka kavling sebanyak 13 unit dan baru terbangun dan terisi 2 unit dari yang direncanakan. Adapun harga rumah tahap 2 kurang lebih 600 juta-an dengan spesifikasi rumah 2 lantai, 2 kamar tidur, 2 kamar mandi, 2 ruang tengah, dapur, taman, garasi dan lainnya.
Bagian Dalam Perumahan Sukaraja Residence 2 Tahap 1
Fasilitas:
Taman fasilitas umum, terdapat ruang fasilitas umum yang ditumbuhi sayur-sayuran dan buah-buahan untuk dapat dipetik oleh warga perumahan tersebut seperti tomat, kangkung, cabai, sirsak, pisang dan lainnya. Yang menanam dam memelihara adalah warga perumahan itu juga.
Mesjid, lokasi mesjid memang tidak berada di dalam perumahan, tetapi lokasinya menempel persisi di sebelah kanan perumahan dan menyatu dengan warga sekitar.
Pos Keamanan, terdapat palang pintu untuk masuk ke perumahan ini dimana jika siang hari terbuka bebas dan jika malam hari ada penjaga keamanan yang menjaga keadaan perumahan.
Koneksi Internet, sudah ada jalur internet fiber optik dari penyedia Indihome sehingga memudahkan bagi mereka yang ingin berlangganan internet, tv kabel, telepon rumah dan smart home.
Air PDAM, air yang memasuk ke perumahan ini adalah air yang dikelola oleh perusahaan milik desa dengan konsep mirip dengan PDAM yaitu dengan sistem meteran.
Akses Jalan, untuk akses jalan di dalam perumahan bisa masuk 2 mobil sehingga memudahkan untuk hanya sekedar parkie diluar atau hilir mudik kendaraan lainnya. Namun untuk akses dari jalan utama ada penyempitan jalan menuju perumahan ini dengan jarak kurang lebih 100 meter.
Bagian Dalam Perumahan Sukaraja Residence 2 Tahap 2
Alamat Perumahan:
Perumahan Sukararaja Residence 2: Kp. Manglayang, RT 01 RW 18, Desa Cihanjuang Rahayu, Kecamatan Parongpong, Desa Cihanjuang Rahayu, Kabupaten Bandung Barat, Kode Pos 40559. Dapat mengikuti peta google (google maps) seperti pada dibawah ini:

Akses Transportasi Umum:
Selain dapat mengikuti kontak Google Maps diatas (jika Anda menggunakan kendaraan pribadi), anda juga dapat menggunakan fasilitas umum untuk sampai ke lokasi ini yaitu dengan menggunakan Angkot warna ungu jurusan Parongpong – Cimahi. Anda dapat turun di Perum Katumiri kemudian jalan kaki sejauh 500 M atau naik ojek (ada pangkalan ojek dipemberhentian angkot) dengan membayar Rp. 5.000 rupiah untuk menuju perumahan Sukaraja Residence 2.
Akses Fasilitas Umum:
Terdapat beberapa fasilitas umum yang dekat dengan Perumahan Sukaraja Residence 2 yaitu
Kampus Sekolah Tinggi Kesehatan STIKES Rajawali, kurang lebih 800 Meter.
Kantor Pemerintahan Kota (Pemkot) Cimahi, kurang lebih 4,5 KM.
Tempat Belanja BORMA, kurang lebih 4 KM.
Wisata Curug Panganten, kurang lebih 1,5 KM.
Wisata Curug Cimahi, kurang lebih 5 KM.
Akses jalan alternatif menuju Lembang lebih cepat
Kekurangan:
Beberapa kekurangan yang menjadi pertimbangan penulis adalah sebagai berikut:
Perumahan ini berada di lokasi patahan lempeng Lembang yang merupakan bagian dari patahan gempa apabila terjadi erupsi gunung tangkuban perahu.
Seperti yang sudah dibahas sebelumnya, bahwa akses ke perumahan ini terdapat penyempitan jalan yang memang kalau terdapat 2 mobil besar bertemu menjadi kendala.
Bagi mereka yang memiliki alergi dingin, tidak disarankan mengambil rumah disini, karena cuaca pagi terasa lebih dingain dari kota bandung pada umumnya.

warc-identified-content-language: ind

label: pt


content:
Belum lama ini saya diminta tolong memperbaiki aplikasi lama dalam PHP 5. Aplikasi ini sudah lama dan masih dipakai sampai development aplikasi baru selesai. Aplikasi ditulis dalam PHP dengan framework Code Igniter dengan database MySQL. Deskripsi masalahnya begini: di aplikasi ini setiap hari ada satu halaman yang semakin lambat sampai suatu hari error, tidak bisa diakses lagi.
Pesan popup itu muncul dari komponen datatables.net di browser. Setelah diselidiki: penyebabnya adalah error di sisi server, tepatnya lagi ternyata out of memory di sisi server.
Allowed memory size of 134217728 bytes exhausted (tried to allocate 7077931 bytes) /var/www/html/application/XXX.php
Aplikasi ini meload data dari database menjadi satu file JSON berisi beberapa belas ribu baris. Dari hasil membaca dokumentasi komponen datatables ini, seharusnya mudah membuat paging dengan pemrosesan di sisi server cukup dengan menambah OFFSET dan LIMIT pada query SQL. Tapi ternyata tidak mudah di aplikasi ini.
Kira-kira aplikasinya begini:
$q = "select puluhan_kolom from table where belasan_filter;";
$data=array()
foreach ($rows as $row){
    //isi loop for ini ratusan baris
    //ada beberapa puluh query berdasarkan nilai $row
    //dalam kondisi tertentu data baru ditambahkan ke $data
}
echo json_encode($data);
Jadi untuk tahu berapa jumlah row-nya perlu menjalankan banyak query, bukan hasil count dari query utama. Andaikan tahu jumlah row-nya pun, tetap akan sulit untuk pergi ke halaman-N karena harus memfilter lagi dari awal. Dari berbagai kondisi di dalam loopnya sepertinya banyak hal ad-hoc ditambahkan, atau mungkin juga designnya salah dari awal.
Lalu setelah saya pikirkan lagi: Jika bisa paging pun, fitur lain harus diubah. Datatables menyediakan fitur filtering dan search built in. Jika kita meload data per page, search dan filter ini harus diimplementasikan ulang dengan kode baru di sisi server.
Jadi apa yang bisa saya lakukan? permintaan tolong ini di hari kerja, jadi saya cuma bisa melakukan ini:
menaikkan memory limit PHP
menambah ukuran cache mysql
menginstall PHP opcode cache (APC)
Beberapa hal lain yang tidak saya lakukan:
menginstall PHP 7, karena distribusi Linuxnya terlalu tua. Ribet jika harus menginstall manual
mengubah kode program karena terlalu rumit
Programnya bisa berjalan lagi walau seringkali butuh beberapa menit mendownload JSON sekitar 5.5 MB. Dengan koneksi di indonesia, jika bisa stabil 100 kilobyte/second maka butuh 55 detik untuk mengirim datanya. Itu di luar waktu query, karena transfer data baru bisa dimulai setelah semua data siap. Dari cerita yang saya dapat: Koneksi 100 kilobyte/second (kira-kira 1 Mbit/s) sebenarnya tidak sulit dicapai tapi ketika sambil sharing screen di meeting Zoom, kecepatannya bisa sangat tidak stabil. Belum lagi jika dua orang mengakses halaman yang sama untuk didiskusikan.
Mungkin ada yang heran: memory limit kan 128 MB dan ukuran JSON 5.5MB itu sebenarnya sangat kecil, kenapa bisa out of memory? Struktur internal PHP (terutama PHP versi sebelum 7) sangat tidak efisien, ukuran memori yang dipakai bisa belasan kali lipat dari tipe data dasar di bahasa lain (pernah saya tuliskan di artikel tahun 2009). File JSON itu hanya bentuk akhir saja, array yang menyimpan data sebelum jadi JSON memakai memori besar dan setiap query juga memakan memori.
Quick Fix
Di akhir pekan, saya ubah kodenya seminimal mungkin agar cukup cepat. Pertama yang terlihat jelas adalah mengkompres data. Saya sudah menguji bahwa data JSON hasil aplikasi jika dikompres ukurannya menjadi kurang dari 700kb. Dari kecepatan download saja: data 700 kb bisa didownload dalam 7 detik jika koneksinya 100 kilobyte/second vs 55 detik data aslinya.
Di PHP, kompresi bisa dilakukan dengan:
    ob_start("ob_gzhandler", 16*1024);
    //outputkan data seperti biasa dengan echo
    @ob_end_flush();
Dengan modifikasi kecil ini hasilnya: data bisa diakses kurang dari 7 detik setelah dihasilkan. Masih ada masalah lain: harus menunggu dulu sampai semua query selesai baru bisa dikompresi. Langkah berikutnya adalah mengoutputkan JSON per elemen array. Jadi loopnya diganti kira-kira menjadi seperti ini:
ob_start("ob_gzhandler", 16*1024);
echo '{"data":[';
$first = false;
foreach (/*row*/) {
        if ($data_ok) {
              if ($first)   $first = false; else echo ",";
              echo json_encode($current_data);
        }
}
echo "]}";
@ob_end_flush();
Dengan ini sambil melakukan query, data sudah bisa mulai dikirim ke browser. Aplikasi juga menjadi lebih cepat karena tidak menyimpan data di memori, dan tidak perlu menghasilkan string ukuran besar dengan JSON.
Dengan dua quickfix tersebut plus yang sudah dilakukan sebelumnya (menambah limit memori, memakai cache APC, dan menaikkan limit cache mysql), aplikasi bisa diakses kurang dari 10 detik. Menurut saya ini masih lambat, seharusnya dengan design yang baik, aplikasinya bisa instan menampilkan halaman pertama, dan setiap halaman berikutnya bisa meminta request baru. Tentunya akan lebih banyak kode yang perlu ditulis baik di sisi client maupun server.
Pelajaran
Sebagai catatan: posting ini bukan kritik terhadap PHP. Dalam bahasa manapun kesalahan seperti ini bisa terjadi. Tapi faktor kerakusan memori PHP dan lambatnya PHP versi lama membuat bugnya lebih cepat muncul.
Jika Anda adalah seorang client yang meminta dibuatkan aplikasi: perhatikan ukuran data. Selain menguji bahwa aplikasi sudah berjalan, ujilah juga aplikasi dengan jumlah data yang besarnya sesuai dengan pemakaian. Misalnya ingin membuat aplikasi untuk sekolah offline, jumlah murid mungkin bisa ratusan, atau ribuan sampai beberapa tahun ke depan. Dalam kasus ini jumlah murid tapi tidak akan sampai level jutaan.
Ini juga cerita secara umum: membuat aplikasi sederhana memang tidak sulit, tapi membuat aplikasi yang scalable akan butuh waktu lebih lama dan/atau kode yang lebih banyak. Cerita ini hanya sekedar scaling dari ratusan data (sangat cepat ketika didemokan) sampai ke belasan ribu data (aplikasi sangat lambat lalu mati), belum sampai ke level jutaan atau ratusan juta data yang butuh perencanaan yang lebih matang dan implementasi yang lebih sulit.
This entry was posted in php, umum on July 1, 2020 by admin.
Bahasa Pemrograman BASIC
Leave a reply
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.
Dari keyboard ditekan sampai muncul karakter di layar (bagian 3)
Leave a reply
Di bagian sebelumnya sudah dibahas mengenai bagaimana layout text harus dilakukan. Setelah semuanya selesai, maka teks bisa ditampilkan ke layar. Di level aplikasi biasanya kita hanya perlu memanggil semua fungsi dasar untuk menampilkan teks. Di sisi library dan sistem operasi, masih ada langkah ekstra yang harus dilakukan. Teks perlu digambar ke sebuah buffer dan buffer perlu ditampilkan di sebuah permukaan gambar. Driver grafik akan menampilkan buffer tersebut ke layar.
Untuk aplikasi desktop, proses menampilkan teks ini di sisi programmer semudah memanggil fungsi print (mode teks) atau mengeset property tertenty. Jika kita memprogram microcontroller atau embedded system, akan lebih terasa proses berat yang harus dilakukan ketika menampilkan sesuatu. Contoh paling sederhana adalah 7 segment display.
Programmer perlu menyala matikan tiap garis dalam 7 segment display untuk menampilkan angka tertentu.
Display saat ini biasanya menggunakan akses per piksel. Mungkin yang paling sederhana adalah 8×8 dot matrix. Di sini kita perlu mengontrol tiap titik untuk menampilkan huruf/angka/bentuk yang kita mau.
Semakin canggih hardware, biasanya pekerjaan programmer high level akan semakin mudah. Contohnya adalah display LCD jenis seperti ini:
Jpeg
Demikian seri singkat kali ini. Saya akan berusaha membuat seri baru yang membahas dari segi yang lebih low level lagi.
This entry was posted in hardware, teknis, umum on April 11, 2019 by admin.
Dari keyboard ditekan sampai muncul karakter di layar (bagian 2)
Leave a reply
Meneruskan dari tulisan sebelumnya, sekarang kita ke bagian aplikasi. Pertama aplikasi perlu menerima “event” dari Desktop/Window environment. Event ini bermacam-macam, misalnya permintaan untuk meminimize Window, event gerakan mouse, dan event tombol keyboard ditekan.
Setelah tombol ditekan, maka aplikasi akan melakukan update pada struktur datanya. Sebagai pengingat, contoh aplikasi yang saya berikan ada Word Processor. Ini bergantung dari mode saat ini (apakah mode insert atau overwrite, apakah dokumen sifatnya read only dsb). Struktur data yang digunakan pun bisa sangat beragam, tergantung dari fitur yang dimiliki aplikasi.
Dalam sebuah word processor, berbagai algoritma perlu dijalankan sebelum tampilan diupdate di layar. Beberapa algoritmanya misalnya: hyphenation (pemotongan kata), pemeriksa ejaan (dalam kasus tertentu biasanya nanti kata tersebut perlu digaris bawahi merah), perhitungan jumlah kata.
Ketika data di memori perlu ditampilkan di layar, maka ada banyak langkah lagi yang harus dilakukan. Mulai dari pencarian font, layout setiap karakter, dsb.
Sebuah font perlu diload sebelum bisa ditampilkan di layar. Font jaman dulu merupakan font bitmap biasa, tapi font sekarang biasanya merupakan true type font yang memiliki banyak informasi untuk tiap glyph dalam font tersebut. Jika kita memiliki satu kata yang ingin ditampilkan, maka ada kemungkinan:
Satu huruf dipetakan ke satu glyph
Satu huruf dipetakan ke lebih dari satu glyph, contohnya jika ada diacritic
Dua huruf atau lebih dipetakan menjadi satu glyph (contohnya jika ada ligature)
Jika dokumen terdiri dari lebih dari satu bahasa maka hal ini menjadi lebih kompleks lagi, ada bahasa yang ditulis dari kiri ke kanan dan dari kanan ke kiri. Berbagai hal ini biasanya dilakukan dalam tahap yang dinamakan “text-shaping”. Setelah semuanya siap, maka teks bisa ditampilkan di layar.
Bagian berikutnya akan membahas bagaimana teks ditampilkan di layar.
This entry was posted in teknis, umum on December 30, 2018 by admin.
Dari keyboard ditekan sampai muncul karakter di layar (bagian 1)
Leave a reply
Seri tulisan ini akan mencoba menjelaskan apa yang terjadi dari sejak kita menekan tombol di keyboard sampai muncul huruf di layar. Untuk mempersingkat, saya akan mengambil beberapa asumsi:
Keyboard ditekan di sebuah aplikasi yang terbuka (jadi sudah selesai booting)
Sistem operasi yang dipakai modern (bukan DOS, tapi Windows/Linux/OS X)
Aplikasi yang akan saya contohkan adalah sebuah word processor (supaya sederhana, rencananya saya akan menulis dari mengetik di address bar sampai muncul web page)
Keyboard
Ketika tombol di tekan di keyboard, sebuah saklar akan aktif. Ada banyak jenis saklar ini (bisa dibaca di wikipedia) tapi intinya sebuah sirkuit akan tertutup ketika tombol ditekan. Karena jumlah tombol ada banyak, maka digunakan sirkuit matriks pada keyboard untuk mengurangi jumlah koneksi.
Keyboard tidak tahu apa yang tertulis di atas sebuah tombol. Tombol pertama di keyboard QWERTY adalah huruf ‘Q’, tapi di keyboard AZERTY menjadi ‘A’. Keyboard hanya akan mengirimkan kode sebuah tombol, nanti urusan setting di sistem operasi yang akan menginterpretasikan tombol itu menjadi suatu huruf tertentu.
Sebuah keyboard memiliki prosessor, sebuah chip khusus atau microcontroller yang akan melakukan scanning pada matrix keyboard. Di keyboard lama (PS/2), jika ada tombol ditekan maka akan mengirimkan sebuah interrupt ke PC. Di keyboard USB, PC akan melakukan polling (biasanya 150Hz), artinya dalam 1 detik komputer akan bertanya 150 kali pada keyboard: apakah ada tombol yang sedang ditekan?
Jika ingin mengenal bagian ini lebih dalam, kita bisa membeli Arduino, dan keypad matrix sederhana seperti dalam gambar berikut ini.
Atau seperti ini yang lebih jelas terlihat koneksinya
Kita juga bisa membeli keycap satuan untuk keyboard mekanis, dan bahkan merangkai sendiri circuit boardnya. Microcontroller yang digunakan dalam proyek DIY seperti ini biasanya Atmega32u yang mudah diprogram.
Jika ingin membuat keyboard custom sendiri juga tidak sulit. Misalnya kita bisa membuat keyboard yang mengetik alamat email jika satu tombol ditekan. Atau mungkin kita tidak ingin memakai tombol tapi pedal.
Sistem Operasi
Input dari keyboard akan diterima oleh sistem operasi. Untuk keyboard USB, driver HID (human interface device) akan menerima data dari keyboard. Di titik ini, setiap sistem operasi memiliki jalurnya sendiri dalam menangani keyboard.
Di Linux/Unix, jika kita memakai XWindow, maka X Server akan membaca input dari /dev/input/* dan meneruskan eventnya ke berbagai Window yang muncul. Di Windows driver akan mengirimkan message ke System Message Queue.
Shell/Desktop
Ketika sebuah tombol ditekan, maka ada Desktop manager yang akan mengatur: saat ini aplikasi yang aktif yang mana? mana yang menerima input keyboard? kadang ada lebih dari satu aplikasi yang menerima input keyboard, ada aplikasi yang mendaftarkan diri sebagai shortcut handler (misalnya ketika tombol print screen ditekan, maka isi layar akan disimpan ke DropBox).
Berikutnya …
Di sebuah aplikasi akan ada event handler yang menangani input dari keyboard. Ini akan saya bahas di bagian berikutnya.
This entry was posted in teknis, umum on November 30, 2018 by admin.
Membaca Source Code
Leave a reply
Ada beberapa pertanyaan yang ditujukan ke saya yang jawabannya mudah jika sang penanya bisa membaca source code. Sayangnya skill membaca source code ini sering kali tidak dimiliki, padahal sangat diperlukan oleh programmer dan juga para reverse engineer.
Saat ini mungkin sekitar 90% pertanyaan programming bisa dicari jawabannya dengan Google, dan biasanya jawabannya akan ditemukan di situs stack overflow, di blog seseorang, dan kadang di beberapa situs yang memang membahas topik khusus yang dicari.
Tentunya jawaban-jawaban tersebut bisa ditemukan kalau Anda bisa berbahasa Inggris. Minimal tahu beberapa kata kunci untuk mencari, dan sisanya adalah kemampuan membaca teks berbahasa Inggris. Segala macam pertanyaan sederhana sudah ada yang menanyakan, misalnya “how to split string in <java/c/javascript/..>”. Sering kali jawabannya disertai source code fungsinya, misalnya untuk pertanyaan cara split string di C yang tidak ada di library standar.
Selain berbagai jawaban di stack overflow, dan artikel di berbagai situs, ada juga berbagai buku dan dokumen yang bisa dibaca untuk mencari jawaban. Tapi ada satu sumber yang paling akurat untuk pertanyaan programming: source code. Kadang informasi dari dokumentasi bisa salah atau belum diupdate, tapi informasi dari source code tidak akan salah.
Saat ini sebagian besar software yang dipakai sudah open source. Berbagai sistem operasi sourcenya terbuka (Linux, FreeBSD, OS X, dan masih banyak lagi), compiler dan interpreter (gcc, llvm, go, php, python, dsb), editor text biasa ( emacs, notepad++, vi, dsb) atau bahkan IDE (IntelliJ, Eclipse, Visual Studio Code, dsb). Berbagai game, editor audio, konverter video, dsb semuanya ada versi open sourcenya. Berbagai library sudah ada untuk melakukan hampir apa saja, dari mulai decoding format file sampai mengenali wajah dan suara.
Tidak semua software memiliki dokumentasi yang lengkap. Contohnya: meskipun jutaan orang memakai OS X, dan kernel OS X ini open source, sedikit sekali dokumentasi dan buku mengenai internal kernel OS X. Jika untuk software yang sangat populer saja dokumentasinya tidak banyak, tentunya masih ada ratusan ribu software lain yang dokumentasinya lebih sedikit lagi.
Dokumentasi sebuah fungsi di sebuah bahasa juga sering kali tidak menyebut detail implementasi, yang kadang penting dari sisi security, misalnya dokumentasi mt_rand dan mt_srand di PHP tidak menyebutkan bagaimana proses seeding dilakukan jika tidak dinyatakan secara eksplisit. Tentunya ini bisa ditanyakan ke stack overflow, dan dalam kasus ini ada yang menjawab untuk versi PHP yang spesifik (dan dia mendapatkan jawabannya dari source code).
Dari sisi security, kita bisa menemukan kelemahan dari membaca source code. Dalam kasus mt_rand, sudah pernah ada dua bug ditemukan (tahun 2008 dan 2011). Bug di software yang menggunakan PHP sehubungan dengan penggunaan mt_rand juga masih sering ditemukan (misalnya salah satu yang relatif baru di Oktober 2017).
Membaca source code tanpa alasan yang kuat memang jarang dilakukan orang. Tapi ketika terpaksa, sebaiknya kita mampu membaca kode orang lain. Sering kali kita tidak perlu membaca dalam, biasanya hanya sekedar permukaan saja atau langsung spesifik ke bagian tertentu, tergantung kebutuhan. Membaca source code besar tidak bisa seperti membaca novel dari halaman pertama ke terakhir. Membaca source code besar harus memakai berbagai pendekatan.
Pendekatan pertama adalah skimming, sekedar melihat berbagai file yang ada, lalu membuka file tersebut. Cek apakah ada komentarnya. Hal paling penting adalah mengetahui apakah file tersebut dipakai atau tidak. Sebagian file ternyata tidak dipakai, sebagian ternyata hanya dikompilasi jika fitur tertentu diaktifkan (sedangkan defaultnya fitur tersebut tidak aktif).
Hal penting lain yang bisa didapat dari sekedar skimming adalah: library apa yang dipakai oleh program ini atau program eksternal apa yang dipanggil oleh program ini? Kadang ternyata source code yang kita temukan tidak sesuai harapan karena ternyata hanya membungkus library atau command line lain.
Pendekatan berikutnya adalah menjalankan program tersebut. Ini bisa langsung dilakukan jika program tidak perlu dicompile dan tidak butuh server tertentu (contoh: sebagian program butuh server database). Jika program perlu dicompile, langkah ini juga memberikan banyak informasi. Kita jadi tahu file apa saja yang ternyata dicompile, jadi tahu library apa yang dilink, dsb.
Jika sudah bisa menjalankan program, akan lebih baik lagi jika bisa mendebug program. Beberapa program memang sangat sulit didebug, contohnya kernel Linux di Android butuh setup yang tidak mudah, plus perlu belajar memakai GDB. Tapi jika debugger bisa dipakai, maka ini akan memudahkan pemahaman program. Jika debugger tidak bisa dipakai, maka cara lain adalah menggunakan “print” debugging.
Sebagai catatan: berbagai langkah bisa dilakukan bersamaan. Mengkompilasi source code kadang butuh waktu lama (berjam-jam) atau mendownload requirement (berbagai library yang dibutuhkan) butuh waktu berjam-jam. Sementara kompilasi dilakkan, kode bisa dibaca. Kalau kodenya terlalu besar untuk didownload (contoh: ukuran source code Qt ukurannya ratusan megabyte) bisa source code versi online yang dibaca (misalnya di github).
Sebuah IDE akan sangat membantu untuk membaca program: mencari tahu di mana sebuah fungsi didefinisikan, dari mana saja fungsi dipanggil bisa dialakukan dengan mudah. Untuk memahami program sangat besar (misalnya kernel Linux) biasanya sebuah IDE kurang bisa dipakai (terlalu lambat). Sebagai alternatif, program cross reference (misalnya LXR) bisa dipakai.
Jika program memiliki unit test, maka test ini juga bisa menjadi cara untuk memahami fungsi tertentu. Unit test hanya memanggil satu modul program saja untuk menguji kebenarannya, jadi kita bisa mengerti satu bagian kecil program tersebut.
Perhatikan juga bahwa kadang aplikasi yang populer sudah sangat kompleks karena memiliki banyak optimasi. Contohnya jika hanya ingin memahami membuat web server, maka bisa diawali dengan membaca source code sederhana, lalu kemudian bisa diteruskan dengan membaca yang lebih rumit. Jika Anda belum paham dasar web server, dan langsung membaca source code Apache, maka kemungkinan besar Anda akan bingung.
Beberapa hal butuh dasar teori yang baik, contohnya: memahami source code library kompresi butuh dasar teori mengenai kompresi. Memahami implementasi encoder/decoder MP3 juga akan mustahil jika tidak punya dasar teori mengenai pendengaran manusia (dan banyak konsep matematika).
Hal yang paling penting ketika membaca source code adalah: motivasi. Tanpa motivasi tertentu, membaca source code memang sangat membosankan. Motivasi membaca source code ini bisa banyak, dan tergantung masing-masing orang. Beberapa contoh hal yang pernah memotivasi saya:
Ada konfigurasi yang tidak jalan, dan saya tidak mengerti kenapa, sedangkan dokumentasinya kurang jelas
Saya ingin memahami bug tertentu (misalnya ini)
Saya perlu tahu implementasi algoritma tertentu
Saya perlu mencari bug untuk tujuan pentesting. Misalnya ada software lama tapi tidak menemukan eksploitnya di web
Semoga semua tips di atas bisa membantu Anda mencoba membaca source code orang lain.
This entry was posted in umum on October 2, 2018 by admin.
Code Obfuscation
Leave a reply
Code Obfuscation adalah salah satu bentuk proteksi agar kode sulit dibongkar orang lain. Inti dari obfuscation adalah menyamarkan/membuat kode sulit dibaca. Obfuscation bisa dilakukan manual atau dengan tool yang disebut “obfuscator”. Sementara itu dari sisi reverse engineering, proses mengembalikan dari bentuk samar ini disebut “deobfuscation”.
Arti kata “samar” di KBBI
Meskipun kata “samar” sepertinya cukup berpadanan dengan “obfuscated” saya akan tetap menggunakan istilah inggrisnya di posting ini.
Di posting ini saya hanya ingin memberikan beberapa ilustrasi nyata seperti apa obfuscation ini. Untuk para programmer, ini bisa membantu memproteksi program, dan untuk para reverse engineer bisa berusaha memahami bagaimana obfuscation dilakukan.
Contoh obfuscated code
Obfuscation
Jika kita punya dua fungsi sederhana seperti ini:

int search(int element, int *data, int count)
{
    for (int i =0; i &amp;amp;lt; count; i++) {
          if (data[i] == count)
                return i;
    }
    return -1;
}

int replace_first(int element, int replacement, int *data, int count)
{
    int pos = search(element, data, count);
    if (pos !=-1) {
        data[pos] = replacement;
        return 1;
    }
    return 0;
}

Bentuk obfuscation pertama adalah dengan mengganti nama menjadi nama lain. Ini bisa jadi nama yang sangat singkat misalnya “a”. Pada kode yang dikompilasi menjadi bahasa mesin, nama ini bahkan tidak ada lagi karena tidak diperlukan. Pada bahasa lain yang tidak dicompile jadi bahasa mesin (seperti Java dan Python), nama ini akan tetap ada.
Tanpa membaca kodenya, sudah sulit menebak apa fungsinya ini

int a(int a1, int *a2, int a3);
int b(int a1, int a2, int *a2, int a3)

Bahasa tertentu (seperti Java/C++) mendukung overloading. Beberapa fungsi bisa memiliki nama sama asalkan parameternya berbeda:

int a(int a1, int *a2, int a3);
int a(int a1, int a2, int *a2, int a3)

Cara lain adalah dengan mengubah namanya menjadi menyesatkan, misalnya kedua nama seperti di atas diubah menjadi seperti ini (perhatikan bahwa sengaja count-nya dipindah ke depan untuk menyesatkan pembacanya).

int clear(int count, int *data, int position);
int remove_range(int start, int end, int *data, int element);

Selain penggunaan nama yang menyesatkan, cara lain adalah dengan mengubah control flow program. Contoh sederhananya seperti ini, kita memanggil beberapa fungsi berurutan:

verify_license();
initialize_printer();
initialize_camera();
connect_to_database();

Jika sebuah bahasa mendukung goto maka bentuk obfuscationnya bisa seperti ini:

verify_license();
goto label2;

label1:
initialize_camera();
connect_to_database();
goto label4;

label2:
initialize_printer();
goto label1;

label4:

Jika suatu bahasa tidak mendukung goto urutan operasi bisa disamarkan dengan loop dan switch:
int order[] = {3,1,2,0};
for (int i =0; i &amp;amp;lt; 4; i++) {
   switch (order[i]) {
        case 0: connect_to_database(); break;
        case 1: initialize_printer(); break;
        case 2: initialize_camera(); break;
        case 3: verify_license(); break;
   }
}
Obfuscation kecil seperti contoh di atas masih mudah dimengerti untuk kode yang pendek. Untuk kode yang besar, jumlah “case”-nya bisa puluhan, dan masing-masing nama fungsinya tidak jelas.
Beberapa obfuscation bisa mudah dilihat jika data atau string terlihat jelas, misalnya jika ada kode seperti ini, meskipun kita tidak tahu apa itu kelas x, tapi terlihat bahwa fungsi saat ini berhubungan dengan enkripsi AES:
            throw new x("AES decrypt error");
Jadi bentuk obfuscation berikutnya adalah: string encryption supaya tidak mudah mencari string di dalam program dan mempersulit pemahaman. Tentunya string ini harus bisa didekrip ketika program berjalan, hanya mempersulit pemahaman program.
            throw new x(decrypt(ConstString.ERR1));
Teknik-teknik lain juga bisa ada banyak, saya tidak akan memberikan contoh kode satu persatu. Beberapa yang bisa dilakukan misalnya
Obfuscation di level bahasa mesin/bytecode
Menggunakan exception untuk control flow obfuscation
Menyisipkan kode sampah, misalnya mengurutkan elemen, lalu mencari elemen tengah, menjumlahkan semua elemen, lalu hasilnya tidak dipakai
Menggunakan thread untuk memecah algoritma menjadi beberapa bagian sehingga lebih sulit di mengerti
Mengubah logika program, misalnya menambahkan angka 2312312 di awal, lalu di akhir dikurangi lagi 2312312
Menggunakan enkripsi dan/atau kompresi untuk sebagian kode program yang diload secara dinamis
Memakai custom virtual machine
Perlu diperhatikan bahwa obfuscation tertentu bisa membuat program jadi lebih lambat. Sekedar mengganti nama method tidak akan membuat lebih lambat (bahkan biasanya malah membuat sedikit lebih cepat), tapi mengganti control flow biasanya membuat kode menjadi lebih lambat. Obfuscation juga membuat debugging menjadi lebih sulit (karena memang itu tujuannya). Jadi sebaiknya obfuscation hanya dilakukan di akhir development.
Saya tidak bisa menyarankan tool obfuscator tertentu karena memang jarang melakukan obfuscation pada kode saya, silakan search “obfuscator” dan nama bahasa yang Anda pakai di search engine. Tool obfuscator yang banyak saya temui adalah Proguard (gratis) yang dipakai untuk kode Java/Android.
Di dunia Javascript ada istilah minifier, yaitu tool untuk membuat kode Javascript mejadi lebih kecil. Ini dilakukan dengan mengganti nama variabel, menghapus spasi, komentar dsb. Secara umum ini juga berfungsi sebagai obfuscator sederhana.
Deobfuscation
Secara umum tidak ada cara generik yang membuat obfuscated code bisa dibaca dengan mudah. Tapi ada beberapa tool yang bisa membantu proses deobfuscation spesifik untuk bahasa/teknologi tertentu.
Contohnya jika bertemu dengan kode JavaScript yang sudah minified, maka kita bisa memakai JavaScript beautifier. Ini tidak bisa mengembalikan nama variabel, hanya membuat teks yang sulit dibaca menjadi lebih mudah dibaca (tool beautifier ini sekarang sudah built in di Developer Tools-nya Google Chrome).
Contoh lain: ada yang membuat tool untuk mendekrip String untuk APK yang ditulis dalam Java. Tapi tool ini tidak selalu jalan untuk semua protektor. Setiap kali ada yang membuat tool untuk otomasi sesuatu, pembuat obfuscator menambahkan satu hal kecil sehingga toolnya harus diupdate (atau bahkan ditulis ulang).
Cara yang pasti berhasil adalah kombinasi manual dengan debugger dan sedikit programming. Hal utama adalah memahami obfuscation apa yang dilakukan: apakah stringnya dienkripsi, apakah nama methodnya diubah, apakah control flow-nya berubah, dsb.
Jika sekedar nama methodnya diubah, maka kita harus membaca kodenya dan melakukan renaming untuk mendapatkan nama yang benar. Ini bisa dilakukan berdasarkan beberapa hal, misalnya:
string yang muncul (misalnya “AES Error” mengindikasikan AES)
konstanta yang dipakai (misalnya 0x9E3779B9 mengindikasikan penggunaan enkripsi XTEA)
fungsi yang memanggil. Misalnya jika suatu fungsi dipanggil dari fungsi AES, maka kemungkinan itu hanyalah subrutin AES
fungsi yang dipanggil, misalnya jika aplikasi C memanggil “system” maka kemungkinan ini fungsi menjalankan command line lain
algoritma yang dipakai. Beberapa algoritma sederhana (search, sort, traversal) mudah diidentifikasi
Untuk mendapatkan gambaran sebuah program seperti menyusun sebuah puzzle. Kita bisa mulai dari bagian-bagian yang jelas. Untuk puzzle bagian yang jelas adalah pinggiran puzzle, dan bagian-bagian yang unik. Untuk program kita bisa mulai dari titik awal program (main di sistem POSIX, Activity di Android, dsb), dan titik di mana program memanggil fungsi eksternal.
Jika string dienkripsi, kita bisa membuat breakpoint di method dekrip-nya agar bisa mendapatkan hasil string-nya. Jika control flow-nya obfuscated, kita bisa membuat beberapa breakpoint untuk berhenti di tiap titik, jadi kita bisa mengetahui urutan yang sebenarnya. Selain menggunakan breakpoint dan debugger, kita juga bisa menggunakan Frida atau tool sejenis.
Penutup
Walaupun obfuscator bisa membantu melindungi program, tapi faktor keamanan lain harus tetap diperhatikan. Attacker yang gigih akan bisa membuka segala jenis obfuscation, hanya akan memperlama saja. Di kasus tertentu kombinasi obfuscator dan pentester yang kurang berpengalaman justru bisa membuat aplikasi kurang aman karena testing aplikasi kurang optimal.
Contohnya begini: aplikasi memakai enkripsi, lalu kodenya diobfuscate. Aplikasi ini ditest oleh pentester yang tidak bisa melakukan reverse engineering terhadap kode tersebut, dan pentester menganggap aplikasi tersebut aman karena dia tidak dapat melakukan tampering terhadap nilai yang dikirimkan. Ketika aplikasi dirilis dan dibongkar oleh seorang reverse engineer yang berpengalaman, dia dapat mengubah nilai yang dikirimkan dan ternyata tidak dicek di sisi server (aplikasinya jebol).
Jadi sebaiknya: pentester diberi akses pada kode yang belum obfuscated dan kode final yang sudah. Ini akan lebih optimal karena kerja pentester lebih cepat, tidak perlu membongkar obfuscation dan lebih aman (seluruh fungsi bisa ditest dengan baik). Ini dengan asumsi bahwa pentester memiliki keahlian untuk membaca kode dengan baik.
Semoga artikel singkat ini bisa memberikan gambaran mengenai apa itu code obfuscation dan berbagai batasannya.
This entry was posted in security, teknis, umum on July 23, 2018 by admin.
Mendalami Bahasa C
1 Reply
Saya memberikan saran agar seseorang “mendalami bahasa C” jika ingin belajar reverse engineering. Ada pertanyaan menarik yang diajukan ke saya: sedalam apa belajarnya pak? apa yang harus dipelajari. Sesuai KBBI mendalami di sini berarti: meresapi; menyelami; mempelajari (menelaah, menyelidiki) dalam-dalam.
Saya tidak akan membahas dalam mengenai kenapa seseorang perlu memahami bahasa C, singkatnya: saat ini C masih dipakai di mana-mana, dan akan terus begitu untuk beberapa belas/puluh tahun mendatang. Kernel berbagai sistem operasi ditulis dalam C, berbagai library penting masih ditulis dalam C (library kompresi, enkripsi, image encoding/decoding, dsb), dan bahkan kebanyakan bahasa pemrograman lain diimplementasikan dalam C (misalnya Ruby, Python, dan PHP).
Di awal, pelajarilah dan pahamilah semua konsep dasar dalam bahasa C. Ini seharusnya tidak makan waktu lama. Bahasa C hanya punya beberapa tipe data dasar (void, char, short, int, long, float, dan double) masing-masing bisa signed atau unsigned. Kita bisa mendefinisikan sebuah konstanta dengan const. Tipe data lain adalah enum, union, dan struct (sudah pernah saya bahas di sini) semua tipe data bisa diberi nama dengan typedef.
Hanya ada beberapa sintaks loop (while, do while, dan for, semuanya dengan break dan continue) dan conditional (if/else, goto, dan switch/case/default). Sintaks pembuatan fungsi juga cukup sederhana, hanya perlu mengingat “return” untuk mengembalikan nilai.
Konsep manajemen memori dan string (array of characters) merupakan salah satu hal yang sering membuat pemula bingung. Jika Anda sudah berhasil membuat kode yang selalu lolos valgrind (artinya tanpa warning dan tanpa memory leak), maka Anda sudah lulus dalam pelajaran ini.
Berikutnya buatlah struktur data dalam bahasa C. Mulai dari yang sederhana seperti linked list. Setelah berhasil mencontek buku/website, cobalah menuliskan ulang struktur data tanpa mencontek. Seharusnya kalau sudah paham akan bisa. Lalu cobalah memakai fitur yang lebih rumit seperti function pointer. Pastikan ini juga lolos valgrind.
Cobalah memakai berbagai library C, bisa dimulai dari memakai berbagai fungsi di library C standar. Lalu diteruskan dengan library lain, misalnya zlib untuk kompresi data, expat untuk parsing XML, png untuk dekompresi file PNG.
Cobalah juga untuk memakai lingkungan yang berbeda. Sistem operasi yang berbeda, compiler yang berbeda, IDE yang berbeda. Supaya lebih paham yang mana yang merupakan bagian dari bahasa C, dan yang mana sekedar fitur IDE atau OS yang Anda pakai.
Menurut saya seseorang bisa dianggap cukup memahami bahasa C apabila sudah menyadari bahwa bahasa C itu sangat sederhana. Pertama yang harus disadari adalah ada bahasa C dan ada libray C.
Ketika belajar C, seseorang akan diberikan program “hello world”, seperti ini:
#include <stdio.h>

int main(int argc, char *argv){
   printf("hello world");
}
Tanpa menyadari apa itu gunanya include, dari mana printf berasal, dsb. Ketika baru belajar memang kita tidak perlu tahu itu semua, tapi jika ingin mendalami, kita harus mengerti peran: preprocessor, compiler, assembler, dan linker. Kita juga perlu memahami apa itu library, dan bagaimana membuat library sendiri (pernah saya bahas di sini).
Memprogram sistem embedded tanpa sistem operasi, misalnya microcontroller akan membuat kita sadar mengenai banyak hal yang mungkin tidak terpikirkan di desktop. Misalnya pernyataan sederhana
printf("hello world\n");
Di sistem embedded tanpa layar dan tanpa keyboard, mungkin Anda akan bertanya: ke mana outputnya? bagaimana kita membaca input?. Di sini akan disadari bahwa printf bukanlah bagian dari bahasa C, tapi bagian dari library C. Bahasa C bisa digunakan dengan berbagai library (di Linux saja ada pilihan: GNU LibC, diet libc, musl, dsb).
Di sinilah salah satu kelebihan bahasa C: ketika kita ingin tahu implementasi sebuah fungsi library apapun, kita bisa melihatnya dan biasanya dalam bahasa C juga (hanya sebagian yang memakai assembly). Beda misalnya dengan PHP: jika kita ingin tahu bagaimana fungsi strlen atau split di PHP diimplementasikan, maka yang harus kita baca adalah kode dalam bahasa C (bukan kode PHP, karena fungsi tersebut diimplementasikan dalam interpreter PHP dalam C).
Fungsi printf di atas sudah sangat kompleks untuk dijadikan contoh, jadi saya memakai fungsi sederhana saja: strlen. Ini implemenasi generik paling sederhana dari openbsd:
http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/string/strlen.c?rev=1.9&content-type=text/x-cvsweb-markup
size_t
strlen(const char *str)
{
 const char *s;

 for (s = str; *s; ++s)
 ;
 return (s - str);
}
Tentunya ada ribuan cara untuk mengimplementasikan strlen. dan kadang untuk optimasi digunakan assembly. Saat ini banyak compiler C yang terbuka source codenya (GCC, Clang, Watcom, dsb) dan juga semua librarynya, jadi semua internal C bisa dipelajari.
Khusus untuk yang ingin belajar C untuk reverse engineering. Pelajarilah bahwa biasanya compiler C bisa menghasilkan kode assembly langsung dalam bentuk teks, dan kita bisa membandingkan kode C dengan kode assembly yang dihasilkan compiler. Sebagian informasi mengenai cara menghasilkan teks assembly bisa dibaca di sini.
Sebagai penutup. Jika Anda sudah bisa menganggap bahasa C sebagai bahasa yang sederhana maka kemungkinan Anda sudah mendapatkan pencerahan dan sudah mulai paham bahasa C.
This entry was posted in c, umum on June 20, 2018 by admin.
Matematika dan Programming
2 Replies
Di kala senggang saya masih menjawab pertanyaan via Facebook/Email/Telegram dan banyak calon programmer yang sudah takut sebelum belajar programming: apakah akan butuh matematika? Jawabannya singkatnya tergantung. Tergantung ingin memprogram apa dan sedalam apa.
Matematika dasar tentunya sangat diperlukan, misalnya perkalian, pembagian, penjumlahan pengurangan. Hampir di semua bidang diperlukan ilmu dasar geometri. Misalnya tentang sistem koordinat ketika menggambar grafik (atau sekedar mengatur posisi teks di sebuah halaman web).
Pengetahuan dasar ini penting, dan ini berarti anak yang masih sangat kecil dan belum memiliki dasar matematika harus berhenti dulu belajar di titik tertentu. Ini pengalaman saya dalam mengajari anak saya ketika dulu mengajari dia programming di usia 4 tahun (sekarang sudah 7 tahun). Logika boolean juga perlu dipahami, sekedar AND, OR, dan NOT sudah cukup untuk sebagian besar kasus.
Untuk pemrograman grafik, terutama grafik 3D diperlukan pemahaman matriks dan vektor. Segala operasi matrix akan terlihat secara visual ketika memprogram grafik. Matrik dan vektor juga dipakai di Machine Learning. Jika fokusnya ingin mengolah data besar, maka berbagai ilmu matematika seperti: statistika, linear programming, graph, dan banyak konsep yang rumit akan terpakai.
Kadang hampir semua topik matematika terpakai dalam satu aplikasi. Contohnya untuk membuat game yang kompleks, diperlukan berbagai matematika untuk grafik (matriks, vektor), dibutuhkan AI untuk menggerakkan musuh (yang butuh matriks, vektor, statistika, dsb), dan untuk mencari jalan terpendek atau terbaik kadang dibutuhkan teori graph, dan masih banyak lagi komponen sebuah game.
Saya masih bisa memberikan banyak contoh lain aplikasi matematika dalam programming, tapi hal yang paling penting adalah: matematika (selain topik yang paling dasar) bisa dipelajari selagi kita belajar memprogram.
Sebelum masuk ITB, saya dulu belajar programming otodidak mulai dari SMP. Ketika saya belajar pemrograman sambil belajar matematika SMP/SMU, saya merasa lebih bisa mengerti karena bisa dicoba dalam bentuk program. Contohnya konsep fungsi dan komposisi fungsi. Saya bisa membuat sebuah fungsi di dalam bentuk kode program yang memanggil fungsi lain, dan saya bisa bereksperimen dengan itu. Jadi konsep “fungsi” tidak lagi menjadi hal yang abstrak.
Simbol summation (∑) di kode program hanyalah sebuah loop penjumlahan. Demikian juga dengan ∏ yang hanya loop dengan isi perkalian.
Demikian juga dengan topik matriks dan vektor waktu SMU. Saya mendapatkan banyak ilmu justru dari buku cara membuat game 3D yang saya baca dan saya coba waktu itu. Topik di kelas terasa sangat abstrak, tapi di kode program, bisa terlihat apa gunanya memiliki matriks dan berbagai sifat matriks lainnya.
Kalau Anda tertarik lebih dalam lagi mengenai berbagai topik matematika yang nantinya akan terpakai, silakan baca posting panjang ini (Math for Programmers) yang sudah ditulis seseorang di tahun 2006. Artikel tersebut juga membahas secara detail bagaimana belajar matematika yang lebih baik.
Jadi kesimpulannya adalah: belajar programming bisa dimulai asalkan sudah memiliki pengetahuan matematika yang dasar. Belajar konsep lanjut bisa dilakukan sambil belajar programming, dan bagi sebagian orang belajar dengan cara ini lebih mudah. Tapi jika Anda sudah punya dasar matematika yang bagus tentunya programming akan lebih mudah lagi dan Anda bisa membuat program yang lebih baik lagi. Contohnya: jika Anda punya dasar matematika yang bagus untuk AI, maka Anda bisa membuat game dengan AI yang lebih baik dari yang tanpa AI.
This entry was posted in teknis, umum on May 15, 2018 by admin.
Signature email jaman kuliah
Leave a reply
Dulu waktu kuliah, saya punya signature email seperti ini:
main(i){putchar((i-1)["Xme]i_l"]+(i++))&&(8-i)&&main(i);}
Ternyata masih ada beberapa orang yang ingat, dan masih banyak yang penasaran apa artinya (cuma satu kata: Yohanes) dan kok bisa muncul seperti itu?.
Pertama, menurut standar C lama, sebuah fungsi tanpa kembalian akan mengembalikan sebuah int, dan parameter yang tanpa tipe juga adalah sebuah int, jadi fungsi di atas sama dengan:
int main(int i){
   putchar((i-1)["Xme]i_l"]+(i++))
         &&(8-i)&&
           main(i);
 }
Perhatikan juga bahwa di C, sifat operator && adalah short circuit, artinya dalam A() && B() jika A() mengembalikan false, maka B tidak dieksekusi:
#include <stdio.h>

int A() {
   printf("Fungsi A dipanggil\n");
   return 0;
}

int B() {
   printf("Fungsi B dipanggil\n");
   return 1;
}

int main(int argc, char *argv[])
{
   if (A() && B()) {
           printf("A dan B mengembalikan TRUE\n");
   }
   return 0;
}
Bagian main di atas sama saja dengan ini:
#include <stdio.h>

int main(int argc, char *argv[])
{
   if (A()) {
       if (B()) {
           printf("A dan B mengembalikan TRUE\n");
       }
   }
   return 0;
}
Jadi kode signature saya bisa dijadikan if juga seperti ini:
int main(int i){
   if (putchar((i-1)["Xme]i_l"]+(i++))) {
           if (8-i) {
               if (main(i)) {
               }
           }
   }
 }
Perhatikan beberapa bisa diperjelas, misalnya (8-i) akan true jika (8-i) !=0, atau selama i != 8. Karena if (main()) kosong, maka bisa dihilangkan if-nya.
int main(int i){
   if (putchar((i-1)["Xme]i_l"]+(i++))) {
           if (i!=8) {
              main(i);
           }
   }
 }
Di C, sebuah array adalah sebuah pointer dan sebuah string adalah array of characters. Di C:
    int *array = (int *)malloc(sizeof(int)*10);
    int index = 1;
    array[index] = 10;
    //syntax array access di atas sama dengan:
    *(array + index) = 10;
    //penjumlahan sifatnya komutatif
    *(index + array) = 10;
    //jadi ini juga sama:
    index[array] = 10;
Untuk lebih jelasnya, string saya keluarkan, dan notasinya diperbaiki:
const char *str = "Xme]i_l";
int main(int i){
   if (putchar(str[i-1]+(i++))) {
           if (i!=8) {
              main(i);
           }
   }
 }
Kita lihat fungsi putchar di manual:
fputc, fputs, putc, putchar, puts – output of characters and strings
Di bagian return value:
fputc(), putc() and putchar() return the character written as an unsigned char cast to an int or EOF on
error.
Catatan: karena fungsi putchar tidak dideklarasikan, dan saya tidak menginclude apapun, maka dianggap kembaliannya int, dan ada warning dari compiler.
Dalam kasus saya, putchar ini akan selalu mengembalikan 1, karena saya memprint satu karakter setiap waktu. Jadi kita sederhanakan lagi:
const char *str = "Xme]i_l";
int main(int i){
   putchar(str[i-1]+(i++));
   if (i!=8) {
      main(i);
   }
 }
Operator ++ (post increment) akan dilakukan setelah sebuah ekspresi, jadi dalam kasus ini bisa disederhanakan:
const char *str = "Xme]i_l";
int main(int i){
   putchar(str[i-1]+i);
   i++;
   if (i!=8) {
      main(i);
   }
 }
Sekarang ke bagian “magic”-nya. Di sistem operasi Windows, Linux atau POSIX yang lain, ketika program dijalankan, maka program dalam C akan menerima jumlah parameter dan isi parameternya
int main(int argc, char *argv[])
Jika kita deklarasikan tanpa argv, maka hanya jumlah parameternya yang kita dapatkan. Meskipun biasanya namanya argc dan argv, nama parameternya tentunya boleh apa saja
int main(int jumlah_argumen)
Jika program dijalankan tanpa parameter, maka jumlah argumennya adalah 1, yaitu nama program saat ini (yang tidak kita pedulikan di program ini). Jadi sebenarnya program tersebut dipanggil dengan
main(1);
Perhatikan bahwa “main” adalah sebuah fungsi di C, dan seperti fungsi apapun, bisa dipanggil bebas. Dalam kasus ini, saya memanggil (rekursif) main, dengan nilai i yang ditambahkan terus.
Jika ingin kode yang sangat jelas tiap langkahnya seperti ini:
#include <stdio.h>

const char *str = "Xme]i_l";
int main(int i){
   printf("\ni = %d\n", i);
   printf("str[i-1] = %c +%d = %c\n", str[i-1], i, str[i-1] + i);
   putchar(str[i-1]+i);
   i++;
   if (i!=8) {
      main(i);
   }
}
Dan outputnya:
[email protected]:~$ ./a.out

i = 1
str[i-1] = X +1 = Y
Y
i = 2
str[i-1] = m +2 = o
o
i = 3
str[i-1] = e +3 = h
h
i = 4
str[i-1] = ] +4 = a
a
i = 5
str[i-1] = i +5 = n
n
i = 6
str[i-1] = _ +6 = e
e
i = 7
str[i-1] = l +7 = s

Demikian keisengan jaman kuliah dulu. Sekedar tambahan: dulu terinspirasi dari International Obfuscated C Code Contest, kode saya ini sangat sederhana dibandingkan para pemenang IOCCC.

annotation: short_sentences header footer

label: ceb


content:
Pertanyaan seputar bagaimana cara memilih broker forex yang aman dan terpercaya banyak diajukan oleh para calon trader atau trader pemula. Tanpa pengetahuan yang cukup, calon trader akan kebingungan di tengah banyaknya web review yang tidak semuanya benar. Anda tidak perlu memperhatikan dekat dengan nomor yang dipanggil kecuali Anda bekerja pada strategi. Dalam berbagai kesempatan, Mensos kerap belajar cara membaca candlestick chart pada trading Forex menyatakan, bansos di masa pandemi Covid-19, seperti bansos tunai (BST) memiliki efek langsung dalam menggerakkan perekonomian.
Hal ini terjadi karena memang pasar sedang ramai-ramainya di malam hari untuk daerah Amerika dan London. Namun karena pusat trading sendiri disana, bahkan beberapa top trader ada di Amerika maka pasar malam hari sedikit ramai dan tentu agak memusingkan. Bisnis forex memiliki kelebihan dibanding program-program investasi lain. Kelebihan tersebut terletak antara lain dalam hal. Jika lokasi Anda berada di daerah pemukiman yang cukup padat, maka jualan pulsa dan paket data bisa Anda pertimbangkan.
Belajar cara membaca candlestick chart pada trading Forex - belajar membuat ea Forex
Mengingat skala dan kerumitan datanya, laporan Non Farm Payroll bulan sebelumnya seringkali mengalami revisi besar. Biro Statistik Tenaga Kerja juga merevisi bulan-bulan sebelumnya, yang dikenal sebagai revisi bersih dua bulan. Ada seorang kenalan yang dahulu mempelajari sains di Universitas. Ia nyaris tak pernah bersentuhan dengan hal-hal bisnis, sampai akhirnya mengenal trading forex. Namun, ia tak begitu sukses dalam bertrading, sehingga mencari pilihan pekerjaan lain untuk memperoleh pendapatan tambahan. Kebetulan, beberapa kenalan barunya di lingkungan trading forex juga berinvestasi di saham. Dari situ, ia mengenal trading saham yang lebih cocok untuknya. Cerita-cerita semacam ini sebenarnya cukup banyak terjadi.
Informasi yang mendalam tentang cara trading fbs indonesia risiko, keuangan perilaku, psikologi trading, dan risiko posisi Strategi Perdagangan Untuk Pasar Modal melengkapi opsi biner adalah nyata profesional dan investor dengan referensi berapa banyak saya bisa berdagang opsi biner atap lengkap untuk semua aspek pasar modal modern saat ini yang mencakup strategi perdagangan pemenang untuk memanfaatkan realitas pasar saat ini.
Langkah 3: Bagaimana untuk membuat dagangan yang mudah tetapi efektif di Olymp Trade. Jika syarat-syarat di atas sudah disiapkan, mulailah mengurusnya dengan datang ke kantor BPJS Ketenagakerjaan. Untuk lebih mudahnya di kantor belajar cara membaca candlestick chart pada trading Forex yang masih satu daerah dengan tempat kerja atau perusahaan tempat anda bekerja. Untuk membeli barang dari luar negeri atau men-impor barang. Untuk membayar utang pokok maupun bunga utang luar negeri. Untuk membiayai kegiatan-kegiatan perdagangan yang ada di luar negeri. Untuk membiayai perwakilan yang ada diluar negeri misalnya seperti: duta besar, konsulat dan lain-lain. Untuk membiayai atlit olah raga dalam mengikuti suatu pertandingan, studi banding dan masih banyak lagi yang lainnya.
Komoditas, seperti minyak dan emas juga perdagangkan. Sementara banyak dari ini diklasifikasikan di antara kelompok-kelompok sebagai aset safe haven, Anda dapat menemukan banyak peluang yang dapat diperdagangkan dalam pasar ini. Sesungguhnya, dengan pilihan yang tersedia untuk anda dan penilaian risiko yang rata carta, anda akan melihat bahawa pilihan binari mewakili pilihan pembayaran terbesar serta pelaburan terkecil yang diperlukan. Strategi Pilihan biner Kota Yang merupakan indikator pembalikan tren terbaik untuk forex Analisis teknis volume serupa digunakan yang didasarkan pada asumsi bahwa lonjakan volume yang kuat setelah penurunan yang kuat dapat berarti penjualan yang panik dan dapat menyebabkan kondisi oversold dengan pembalikan lebih lanjut.
Nah Anda bisa mendapatkan uang dari permainan ini hanya belajar cara membaca candlestick chart pada trading Forex jika Anda mampu masuk ke dalam urutan 20 besar di permainan ini. Developer game ini akan memberikan hadiah bitcoin secara cuma-cuma bagi para pemain yang berhasil menduduki urutan 20 besar.
Opsi 2: Trend downward + harga bergerak ke zona resistance = Pasang opsi Down (Kalah 1 pip).
PENDAHULUAN Perdagangan Berjangka Komoditi (PBK) adalah suatu kegiatan bisnis multinasional yang bisa dilakukan dimana saja selama ada fasilitas Internet. Komoditi yang diperdagangkan bisa 'soft commodity' ataupun 'hard commodity'. Yang dimaksud dengan soft commodity adalah komoditi hasil-hasil pertanian / perkebunan, seperti jagung, kedelai, kopi, gula, karet dan lain-lain. Sedangkan yang termasuk hard commodity adalah hasil pertambangan seperti emas, perak, paladium, platinum dan lain-lain. Dasar pendirian usaha seperti ini adalah untuk menjaga kepentingan keduabelah pihak utama yakni produsen / penghasil dan konsumen / pemakai. Bagi produsen hal ini penting untuk menjaga agar pada saat barang tersedia (katakanlah panen, untuk soft commodity) harga tidak jatuh karena banyak barang tersedia, sementara bagi konsumen, PBK dapat menjamin ketersediaan barang di pasar. Saya gunakan contoh ringkasan laporan keuangan dari PT Telekomunikasi Indonesia, Tbk (TLKM) ya.
Memilih Waktu yang tepat dan jam terbaik untuk trading binary option Kapan Waktu Yang Tepat Untuk Trading Forex dan Binary IQ Option Jam terbaik trading binary option trading binary option di Malaysia Mengatur Waktu Trading Binary Options Seputar Forex Jam yang paling nyaman untuk trading Binary Options?Feb 17, 2016 - Hari ini penulis ingin berkongsi waktu terbaik untuk kita trading dalam forex. belajar membuat ea Forex. Kontrak berjangka adalah perjanjian yang sebenarnya sama dengan kontrak serah. Kedua belah pihak bersepakat untuk menyerahkan atau membeli komoditas atau valuta asing dengan harga, jumlah, dan tanggal penyerahan yang sudah ditetapkan sebelumnya. Perbedaannya adalah, kontrak berjangka diperdagangkan secara teratur di bursa berjangka.


content: Mungkin banyak yang asing dengan tanaman miana, tumbuhan ini pada dasarnya berasal dari daratan Afrika. […]