<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Galih Hermawan's Blog]]></title><description><![CDATA[Lecturer and Researcher. Informatics Engineering. UNIKOM.

Bandung. Indonesia]]></description><link>https://blog.galih.eu</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 14:01:46 GMT</lastBuildDate><atom:link href="https://blog.galih.eu/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Mencoba google.colab.ai: Akses Gemini Gratis di Google Colab]]></title><description><![CDATA[Bismillah walhamdulillah.
Bagaimana memanfaatkan library google.colab.ai untuk tanya jawab, Text2SQL, NER, analisis sentimen, hingga penilaian jawaban — langsung dari Colab, bahkan untuk pengguna gratis.
Pendahuluan
Model bahasa generatif seperti Gem...]]></description><link>https://blog.galih.eu/use-case-google-colab-ai-free</link><guid isPermaLink="true">https://blog.galih.eu/use-case-google-colab-ai-free</guid><category><![CDATA[Google]]></category><category><![CDATA[colab]]></category><category><![CDATA[gemini]]></category><category><![CDATA[Google Colab]]></category><category><![CDATA[Python]]></category><category><![CDATA[Jupyter Notebook ]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Fri, 14 Nov 2025 04:01:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1763092659163/8e6010ab-a82e-4ed4-8b5c-5de823eab4e5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Bismillah walhamdulillah.</p>
<p>Bagaimana memanfaatkan library <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a> untuk tanya jawab, Text2SQL, NER, analisis sentimen, hingga penilaian jawaban — langsung dari Colab, bahkan untuk pengguna gratis.</p>
<h2 id="heading-pendahuluan">Pendahuluan</h2>
<p>Model bahasa generatif seperti Gemini dari Google makin mudah diakses. Jika dulu perlu menyiapkan API key, mengatur billing, dan menginstal library tambahan, sekarang Google menyediakan cara yang jauh lebih praktis: cukup buka Google Colab dan gunakan satu baris kode:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai
</code></pre>
<p>Kabar baiknya, fitur ini bisa dinikmati oleh <strong>pengguna gratis</strong> Colab. Artinya, siapa pun yang punya akun Google bisa mencoba model Gemini tanpa ribet konfigurasi.</p>
<p>Tulisan ini merangkum beberapa eksperimen dengan <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a> di Google Colab, mulai dari:</p>
<ul>
<li><p>Melihat daftar model Gemini yang tersedia</p>
</li>
<li><p>Tanya jawab sederhana dan penjelasan konsep</p>
</li>
<li><p>Text2SQL untuk skema database</p>
</li>
<li><p>Named Entity Recognition (NER) berbasis prompt</p>
</li>
<li><p>Question Answering dan generasi soal otomatis</p>
</li>
<li><p>Analisis sentimen (termasuk aspect-based sentiment)</p>
</li>
<li><p>Penilaian jawaban berbasis rubrik</p>
</li>
</ul>
<p>Semua contoh diambil dari satu notebook praktis, dan bisa langsung diadaptasi untuk eksperimen pribadi, pembuatan konten, prototyping produk, maupun riset ringan.</p>
<hr />
<h2 id="heading-persiapan-lingkungan-di-google-colab">Persiapan Lingkungan di Google Colab</h2>
<p>Langkah awalnya sangat sederhana:</p>
<ol>
<li><p>Buka <a target="_blank" href="https://colab.research.google.com">Google Colab</a>.</p>
</li>
<li><p>Buat notebook baru (runtime Python standar).</p>
</li>
<li><p>Tambahkan import berikut di salah satu sel kode:</p>
</li>
</ol>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai
</code></pre>
<p>Tidak perlu <code>pip install</code>, tidak perlu API key. Selama menggunakan build Colab yang sudah mendukung <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a>, kode ini akan langsung berjalan dan siap memanggil model Gemini di belakang layar.</p>
<hr />
<h2 id="heading-fungsi-dasar-googlecolabaihttpgooglecolabai">Fungsi Dasar <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a></h2>
<p>Bagian ini merangkum beberapa fungsi dasar yang digunakan di notebook: <code>ai.list_models()</code> dan <code>ai.generate_text()</code>.</p>
<h3 id="heading-1-melihat-daftar-model-gemini-yang-tersedia">1. Melihat daftar model Gemini yang tersedia</h3>
<p>Sebelum mulai, ada baiknya melihat dulu model apa saja yang bisa dipakai. Di notebook, hal ini dilakukan dengan kode:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai
ai.list_models()
</code></pre>
<p>Perintah ini menampilkan daftar model seperti <code>gemini-2.5-flash</code>, <code>gemini-2.5-flash-lite</code>, dan lain-lain. Dari sini bisa dipilih:</p>
<ul>
<li><p>Model yang ringan dan cepat untuk eksperimen.</p>
</li>
<li><p>Model yang lebih besar untuk kualitas jawaban yang lebih baik.</p>
</li>
</ul>
<p>Daftar model ini juga membantu jika ingin mengunci eksperimen ke satu model tertentu demi konsistensi hasil.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763088040575/a1f4a717-d6f2-4228-9577-f6eb3afd0fce.png" alt /></p>
</blockquote>
<h3 id="heading-2-tanya-jawab-sederhana-dengan-aigeneratetext">2. Tanya jawab sederhana dengan <code>ai.generate_text</code></h3>
<p>Contoh paling dasar adalah tanya jawab. Di notebook, digunakan kode berikut:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai
respons = ai.generate_text(<span class="hljs-string">"Sebutkan 5 sila dalam Pancasila!"</span>)
print(respons)
</code></pre>
<p>Dengan satu prompt singkat, model mengembalikan jawaban lengkap. Pola ini bisa digunakan untuk banyak hal:</p>
<ul>
<li><p>Meminta penjelasan konsep tertentu.</p>
</li>
<li><p>Menghasilkan contoh-contoh tambahan.</p>
</li>
<li><p>Membuat ringkasan atau penjelasan singkat.</p>
</li>
</ul>
<p>Cara termudah bereksperimen adalah dengan mengubah teks prompt dan mengamati bagaimana respons model berubah.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763088226210/b9530dc2-e197-4b7e-8917-f11aae3e0458.png" alt /></p>
</blockquote>
<h3 id="heading-3-memilih-model-tertentu-googlegemini-25-flash-lite">3. Memilih model tertentu: <code>google/gemini-2.5-flash-lite</code></h3>
<p>Terkadang perlu mengontrol model yang digunakan, misalnya demi kecepatan respons. Di notebook, hal ini dilakukan dengan menambahkan parameter <code>model_name</code>:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai

respons = ai.generate_text(
    <span class="hljs-string">"Sebutkan rukum iman dalam agama Islam!"</span>,
    model_name=<span class="hljs-string">"google/gemini-2.5-flash-lite"</span>
)
print(respons)
</code></pre>
<p>Model <em>flash-lite</em> biasanya lebih hemat sumber daya dan cukup untuk tugas-tugas ringan seperti tanya jawab singkat. Untuk tugas yang membutuhkan penalaran lebih dalam, bisa mencoba model lain yang tersedia di hasil <code>ai.list_models()</code>.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763088678556/a4b5108c-230c-48ec-8771-7b97fc3f1893.png" alt /></p>
</blockquote>
<h3 id="heading-4-menampilkan-jawaban-secara-streaming">4. Menampilkan jawaban secara streaming</h3>
<p>Untuk jawaban yang lebih panjang, <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a> mendukung mode streaming sehingga teks muncul sedikit demi sedikit seperti sedang diketik. Contoh di notebook:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai

stream = ai.generate_text(
    <span class="hljs-string">"Jelaskan secara singkat tentang Large Language Models"</span>,
    stream=<span class="hljs-literal">True</span>
)
<span class="hljs-keyword">for</span> teks <span class="hljs-keyword">in</span> stream:
  print(teks)
</code></pre>
<p>Mode ini terasa lebih interaktif, terutama saat mendemonstrasikan konsep atau ketika ingin melihat proses terbentuknya jawaban secara bertahap, bukan langsung satu blok teks panjang.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763090399976/ee0386b8-3fe0-48dc-8ea9-d673d4a93697.png" alt /></p>
</blockquote>
<hr />
<h2 id="heading-use-case-1-text2sql-untuk-skema-database-sederhana">Use Case 1 – Text2SQL untuk Skema Database Sederhana</h2>
<p>Bagian berikut memperlihatkan bagaimana <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a> dapat menghubungkan bahasa alami dengan SQL. Ini sangat berguna untuk eksperimen dengan basis data.</p>
<p>Di notebook, didefinisikan skema database sederhana bernama <code>hobimahasiswa</code> dengan tabel <code>mahasiswa</code>, <code>hobi</code>, dan <code>mhshobi</code>. Lalu dibuat fungsi <code>text2sql(question)</code> yang menerima pertanyaan dalam bahasa Indonesia dan mengembalikannya sebagai query SQL.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai

schema = <span class="hljs-string">"""
Database: hobimahasiswa

Tabel: mahasiswa
- nim (PRIMARY KEY)
- nama

Tabel: hobi
- kode_hobi (PRIMARY KEY)
- nama_hobi

Tabel: mhshobi
- nim (FOREIGN KEY ke mahasiswa.nim)
- kode_hobi (FOREIGN KEY ke hobi.kode_hobi)
"""</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">text2sql</span>(<span class="hljs-params">question</span>):</span>
    prompt = <span class="hljs-string">f"""
Kamu adalah asisten pembuat SQL.

Gunakan skema berikut:
<span class="hljs-subst">{schema}</span>

Tugas:
- Terjemahkan pertanyaan berikut menjadi SQL query valid.
- Jangan berikan penjelasan, hanya SQL saja.

Pertanyaan:
<span class="hljs-subst">{question}</span>
"""</span>
    sql = ai.generate_text(prompt)
    <span class="hljs-keyword">return</span> sql

print(text2sql(<span class="hljs-string">"Tampilkan nama mahasiswa yang memiliki hobi Memasak."</span>))
</code></pre>
<p>Prompt memberikan konteks berupa skema database serta instruksi yang tegas: model hanya boleh mengembalikan SQL, tanpa penjelasan tambahan. Hasilnya adalah query SQL yang secara umum sudah cukup baik untuk dijalankan di sistem basis data (tetap disarankan untuk meninjau ulang sebelum digunakan di sistem produksi).</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763090495415/46e776cd-ae91-46d4-a25d-a0267e8d56df.png" alt /></p>
</blockquote>
<hr />
<h2 id="heading-use-case-2-named-entity-recognition-ner-dengan-prompt">Use Case 2 – Named Entity Recognition (NER) dengan Prompt</h2>
<p>Untuk teks panjang, kadang perlu mengekstrak entitas penting seperti nama orang, organisasi, lokasi, atau tanggal. Di sini <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a> digunakan sebagai “NER on demand” tanpa perlu melatih model khusus.</p>
<p>Contoh di notebook menggunakan paragraf tentang seminar kecerdasan buatan di UNIKOM:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai

paragraph = <span class="hljs-string">"""
Pada tanggal 15 Januari 2023, Universitas Komputer Indonesia (UNIKOM) di Bandung
mengadakan seminar mengenai pemanfaatan kecerdasan buatan. Seminar tersebut
dihadiri oleh para dosen seperti Galih Hermawan serta beberapa perwakilan
dari Kementerian Pendidikan dan Kebudayaan. Acara ini juga bekerja sama dengan
Google Indonesia.
"""</span>

prompt = <span class="hljs-string">f"""
Lakukan Named Entity Recognition (NER) pada paragraf berikut.

Tampilkan hasil dalam format JSON dengan struktur:
- person
- organization
- location
- date

Paragraf:
<span class="hljs-subst">{paragraph}</span>
"""</span>

response = ai.generate_text(prompt)
print(response)
</code></pre>
<p>Model akan mencoba mengembalikan daftar entitas, misalnya:</p>
<ul>
<li><p><strong>person</strong>: daftar nama orang</p>
</li>
<li><p><strong>organization</strong>: nama organisasi yang muncul</p>
</li>
<li><p><strong>location</strong>: lokasi acara</p>
</li>
<li><p><strong>date</strong>: tanggal kegiatan</p>
</li>
</ul>
<p>Hasil ini bisa digunakan untuk analisis teks lebih lanjut, pembuatan ringkasan, atau sekadar eksplorasi data teks berbahasa Indonesia.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763090602534/dd8e52b4-d0b5-4d62-9954-d46e8cf59ad1.png" alt /></p>
</blockquote>
<hr />
<h2 id="heading-use-case-3-question-answering-dan-generasi-soal-otomatis">Use Case 3 – Question Answering dan Generasi Soal Otomatis</h2>
<p>Bagian berikut berfokus pada <strong>Question Answering (QA)</strong> dan pembuatan soal otomatis dari teks konteks.</p>
<h3 id="heading-31-qa-berdasarkan-paragraf-konteks">3.1 QA berdasarkan paragraf konteks</h3>
<p>Pertama, disiapkan paragraf tentang sejarah Google, lalu diajukan pertanyaan yang jawabannya ada di dalam paragraf tersebut:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai

context = <span class="hljs-string">"""
Google didirikan pada tahun 1998 oleh Larry Page dan Sergey Brin ketika keduanya
masih menjadi mahasiswa PhD di Stanford University. Perusahaan ini berkembang
pesat seiring dengan popularitas mesin pencariannya. Saat ini, Google menjadi
bagian dari Alphabet Inc. dan berfokus pada berbagai bidang seperti kecerdasan
buatan, komputasi awan, perangkat keras, dan layanan digital.
"""</span>

question = <span class="hljs-string">"Kapan Google didirikan dan siapa pendirinya?"</span>

prompt = <span class="hljs-string">f"""
Jawab pertanyaan berikut berdasarkan konteks yang diberikan.

Konteks:
<span class="hljs-subst">{context}</span>

Pertanyaan:
<span class="hljs-subst">{question}</span>

Berikan jawaban yang singkat dan langsung ke inti.
"""</span>

response = ai.generate_text(prompt)
print(response)
</code></pre>
<p>Model diminta secara eksplisit untuk menjawab berdasarkan konteks yang diberikan. Pola ini mirip dengan tugas <em>reading comprehension</em> di berbagai aplikasi QA berbasis dokumen.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763090664254/683b9232-1c10-4a1c-81b8-231027a74c4a.png" alt /></p>
</blockquote>
<h3 id="heading-32-membuat-pertanyaan-dan-jawaban-otomatis-dari-paragraf">3.2 Membuat pertanyaan dan jawaban otomatis dari paragraf</h3>
<p>Selanjutnya, model diminta menyusun soal sendiri dari sebuah paragraf. Contoh di notebook menggunakan konteks tentang UNIKOM:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai

context = <span class="hljs-string">"""
UNIKOM (Universitas Komputer Indonesia) adalah salah satu perguruan tinggi
swasta terkemuka di Bandung yang berfokus pada teknologi informasi, desain,
dan bisnis. Kampus ini didirikan pada tahun 2000 dan terus berkembang sebagai
pusat pendidikan inovatif di bidang informatika.
"""</span>

prompt = <span class="hljs-string">f"""
Buat satu pertanyaan dan jawabannya berdasarkan paragraf berikut.

Konteks:
<span class="hljs-subst">{context}</span>

Format output:
Q: &lt;pertanyaan&gt;
A: &lt;jawaban&gt;
"""</span>

response = ai.generate_text(prompt)
print(response)
</code></pre>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763090715870/b2195c04-1c97-45aa-9c10-60de0f66b81a.png" alt /></p>
</blockquote>
<p>Ada pula variasi lain yang menghasilkan <strong>lima pasang pertanyaan dan jawaban</strong> dengan format bernomor, serta versi yang menghasilkan <strong>output JSON</strong> dengan struktur:</p>
<pre><code class="lang-json">[
  {<span class="hljs-attr">"question"</span>: <span class="hljs-string">"..."</span>, <span class="hljs-attr">"answer"</span>: <span class="hljs-string">"..."</span>},
  {<span class="hljs-attr">"question"</span>: <span class="hljs-string">"..."</span>, <span class="hljs-attr">"answer"</span>: <span class="hljs-string">"..."</span>},
  {<span class="hljs-attr">"question"</span>: <span class="hljs-string">"..."</span>, <span class="hljs-attr">"answer"</span>: <span class="hljs-string">"..."</span>}
]
</code></pre>
<p>Teknik seperti ini berguna untuk membuat bank soal, kuis, atau daftar pertanyaan wawancara dari satu paragraf sumber tanpa menulis semuanya secara manual. Berikut contoh kode dan luaran yang menghasilkan pertanyaan dan jawaban yang dibuat oleh model berdasarkan konteks berbeda dengan sebelumnya, yaitu tentang sejarah perjuangan bangsa Indonesia.</p>
<pre><code class="lang-python">context = <span class="hljs-string">"""
Selama lebih dari tiga setengah abad, bangsa Indonesia ...
"""</span>

prompt = <span class="hljs-string">f"""
Buatkan 3 pertanyaan dan jawabannya berdasarkan paragraf berikut.
Hasilkan dalam format JSON seperti:

[
  {{"question": "...", "answer": "..."}},
  {{"question": "...", "answer": "..."}},
  {{"question": "...", "answer": "..."}}
]

Paragraf:
<span class="hljs-subst">{context}</span>
"""</span>

print(ai.generate_text(prompt))
</code></pre>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763091045150/cb190ce6-2d21-46cb-a995-51334f87acb1.png" alt /></p>
</blockquote>
<hr />
<h2 id="heading-use-case-4-analisis-sentimen">Use Case 4 – Analisis Sentimen</h2>
<p>Notebook juga memuat dua jenis analisis sentimen: <strong>sentimen per kalimat</strong> dan <strong>sentimen berbasis aspek (Aspect-Based Sentiment Analysis / ABSA)</strong>.</p>
<h3 id="heading-41-analisis-sentimen-kalimat-per-kalimat">4.1 Analisis sentimen kalimat per kalimat</h3>
<p>Contoh pertama menggunakan beberapa kalimat ulasan dalam bahasa Indonesia. Model diminta mengklasifikasikan sentimen setiap kalimat sebagai “positif”, “netral”, atau “negatif” dan mengembalikan hasilnya dalam format JSON:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai

texts = [
    <span class="hljs-string">"Pelayanan di restoran ini sangat ramah dan makanannya enak sekali!"</span>,
    <span class="hljs-string">"Pengiriman barangnya terlambat dua hari dan tanpa konfirmasi. Mengecewakan."</span>,
    <span class="hljs-string">"Aplikasinya cukup bagus, tapi kadang masih ada bug yang mengganggu."</span>,
    <span class="hljs-string">"Saya sangat puas dengan kualitas produk ini. Recommended!"</span>,
    <span class="hljs-string">"Tempatnya sulit dicari, tapi suasananya nyaman."</span>
]

prompt = <span class="hljs-string">f"""
Lakukan analisis sentimen pada daftar kalimat berikut.
Kelas sentimen: "positif", "netral", atau "negatif".

Berikan hasil dalam format JSON list seperti:
[
  {{"text": "...", "sentiment": "..."}},
  ...
]

Daftar kalimat:
<span class="hljs-subst">{texts}</span>
"""</span>

response = ai.generate_text(prompt)
print(response)
</code></pre>
<p>Output JSON ini dapat diproses lebih lanjut, misalnya diubah menjadi DataFrame untuk visualisasi atau analisis statistik sederhana terhadap opini pengguna.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763090994908/1ce2e955-f5e0-470c-9343-32c8993e860c.png" alt /></p>
</blockquote>
<h3 id="heading-42-aspect-based-sentiment-analysis-absa">4.2 Aspect-Based Sentiment Analysis (ABSA)</h3>
<p>Contoh berikutnya melangkah lebih jauh dengan melakukan analisis sentimen berbasis aspek. Setiap ulasan bisa memuat beberapa aspek sekaligus (makanan, pelayanan, harga, tampilan aplikasi, performa, lokasi, dll.). Model diminta untuk:</p>
<ol>
<li><p>Menemukan aspek-aspek penting dalam tiap ulasan.</p>
</li>
<li><p>Menentukan sentimen untuk tiap aspek.</p>
</li>
<li><p>Mengembalikan hasil dalam format JSON.</p>
</li>
</ol>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> google.colab <span class="hljs-keyword">import</span> ai

reviews = [
    <span class="hljs-string">"Makanannya enak tapi pelayanannya lambat, dan harganya agak mahal."</span>,
    <span class="hljs-string">"Aplikasi ini tampilannya bagus dan mudah dipakai, tapi sering crash."</span>,
    <span class="hljs-string">"Hotel nyaman dan lokasinya strategis, tapi kebersihannya kurang."</span>,
    <span class="hljs-string">"Kualitas produk sangat baik, pengemasan rapi, dan harga cukup terjangkau."</span>,
    <span class="hljs-string">"Tempatnya luas dan parkirnya gampang, tapi antriannya panjang sekali."</span>
]

prompt = <span class="hljs-string">f"""
Lakukan Analisis Sentimen Multi-Aspek (Aspect-Based Sentiment Analysis)
 pada daftar ulasan berikut.

Instruksi:
1. Temukan aspek-aspek penting dalam tiap ulasan (misalnya: makanan, pelayanan,
   harga, kualitas, kebersihan, tampilan aplikasi, performa, lokasi, dll.)
2. Tentukan sentimen untuk tiap aspek: "positif", "netral", atau "negatif".
3. Keluarkan hasil dalam format JSON list, struktur:

[
  {{
    "text": "...",
    "aspects": [
      {{"aspect": "...", "sentiment": "..."}},
      ...
    ]
  }},
  ...
]

Daftar ulasan:
<span class="hljs-subst">{reviews}</span>
"""</span>

response = ai.generate_text(prompt)
print(response)
</code></pre>
<p>Pendekatan ini cukup dekat dengan kebutuhan dunia nyata, misalnya untuk menganalisis ulasan restoran, hotel, aplikasi, atau produk. Hasilnya bisa dipakai untuk melihat aspek mana yang paling sering dipuji atau dikritik.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763091156331/6ca069be-82f0-456c-895a-84b88bb82032.png" alt /></p>
</blockquote>
<hr />
<h2 id="heading-use-case-5-penilaian-jawaban-dengan-gemini">Use Case 5 – Penilaian Jawaban dengan Gemini</h2>
<p>Bagian terakhir notebook memperlihatkan bagaimana <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a> dapat membantu menilai jawaban berbentuk teks. Di sini model diposisikan sebagai evaluator yang memberikan penilaian awal dan komentar, sementara keputusan akhir tetap berada di tangan pengguna.</p>
<h3 id="heading-51-penilaian-multi-soal-dan-multi-jawaban">5.1 Penilaian multi-soal dan multi-jawaban</h3>
<p>Di notebook, disiapkan beberapa soal tentang machine learning beserta jawaban dari beberapa orang. Prompt kemudian meminta model untuk:</p>
<ul>
<li><p>Menilai setiap jawaban berdasarkan ketepatan konsep, kejelasan, dan relevansi.</p>
</li>
<li><p>Memberikan skor 0–100 untuk setiap soal.</p>
</li>
<li><p>Menulis komentar singkat per soal.</p>
</li>
<li><p>Menghasilkan ringkasan nilai akhir dalam format JSON.</p>
</li>
</ul>
<p>Dengan cara ini, AI dapat membantu memberi gambaran awal kualitas jawaban. Output-nya bisa dipakai untuk diskusi, review, atau sekadar bahan refleksi pribadi bagi penjawab.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763091231078/02216a7e-e967-4e32-9588-a3255e6002ef.png" alt /></p>
</blockquote>
<h3 id="heading-52-penilaian-dengan-rubrik-terstruktur-3-aspek">5.2 Penilaian dengan rubrik terstruktur (3 aspek)</h3>
<p>Versi lanjutan di notebook menggunakan rubrik yang lebih jelas: <strong>Ketepatan Konsep</strong>, <strong>Kejelasan Penjelasan</strong>, dan <strong>Relevansi</strong>. Model diminta untuk:</p>
<ul>
<li><p>Memberikan nilai 0–100 untuk setiap aspek.</p>
</li>
<li><p>Menghitung skor per soal sebagai rata-rata dari tiga aspek.</p>
</li>
<li><p>Menghitung skor total sebagai rata-rata seluruh soal.</p>
</li>
<li><p>Menyertakan komentar singkat untuk setiap jawaban.</p>
</li>
</ul>
<p>Luarannya berupa JSON yang cukup informatif, sehingga mudah dibaca maupun diproses lebih lanjut (misalnya untuk membuat laporan atau visualisasi). Pendekatan ini menunjukkan bagaimana AI dapat membantu menerapkan rubrik penilaian dengan cara yang konsisten dan terstruktur.</p>
<blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763091274784/dfcd4c5f-411d-46cb-8436-40159ce7bf13.png" alt /></p>
</blockquote>
<hr />
<h2 id="heading-tips-praktis-menggunakan-googlecolabaihttpgooglecolabai">Tips Praktis Menggunakan <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a></h2>
<p>Beberapa tips praktis saat bereksperimen dengan <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a> di Google Colab:</p>
<ul>
<li><p><strong>Mulai dari contoh yang dekat dengan konteks sehari-hari.</strong> Misalnya Pancasila, sejarah Indonesia, atau kasus di sekitar lingkungan sendiri.</p>
</li>
<li><p><strong>Eksperimen dengan berbagai prompt.</strong> Ubah instruksi, gaya bahasa, atau format luaran, lalu lihat bagaimana hasilnya berubah.</p>
</li>
<li><p><strong>Selalu lakukan pengecekan kritis.</strong> Luaran model bisa keliru, bias, atau terlalu percaya diri. Anggap sebagai asisten yang membantu, bukan sumber kebenaran mutlak.</p>
</li>
<li><p><strong>Manfaatkan format terstruktur.</strong> Saat memungkinkan, minta luaran dalam bentuk terstruktur, misal JSON, agar mudah diolah lebih lanjut di Python atau aplikasi lain.</p>
</li>
</ul>
<hr />
<h2 id="heading-kesimpulan">Kesimpulan</h2>
<p>Library <a target="_blank" href="http://google.colab.ai"><code>google.colab.ai</code></a> membuka peluang besar untuk memanfaatkan model Gemini langsung dari Google Colab, bahkan bagi pengguna gratis. Dengan satu baris import, berbagai skenario dapat dicoba, antara lain:</p>
<ul>
<li><p>Tanya jawab dan penjelasan konsep</p>
</li>
<li><p>Konversi bahasa alami ke SQL (Text2SQL)</p>
</li>
<li><p>Named Entity Recognition dan Question Answering berbasis konteks</p>
</li>
<li><p>Analisis sentimen dan aspect-based sentiment</p>
</li>
<li><p>Penilaian jawaban teks dengan rubrik terstruktur</p>
</li>
</ul>
<p>Notebook contoh yang menjadi dasar tulisan ini dapat dikembangkan menjadi berbagai eksperimen lain: integrasi dengan aplikasi web, analisis data teks, pembuatan konten otomatis, dan banyak lagi. Dengan pendekatan ini, AI bukan hanya topik yang dibicarakan, tetapi juga alat praktis yang membantu menyelesaikan pekerjaan sehari-hari.</p>
<blockquote>
<p>Fail notebook dapat diakses dan dijalankan di tautan berikut:</p>
<p><a target="_blank" href="https://colab.research.google.com/drive/1qA-b1gRhVereJAmWbOmKlHrPqytLg9ND?usp=sharing">https://colab.research.google.com/drive/1qA-b1gRhVereJAmWbOmKlHrPqytLg9ND?usp=sharing</a></p>
<p>Repository:</p>
<p><a target="_blank" href="https://github.com/Galih-Hermawan-Unikom/google-colab-ai">https://github.com/Galih-Hermawan-Unikom/google-colab-ai</a></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Memanfaatkan API Google Gemini untuk Membangun Dialog Interaktif: Panduan untuk Pemula]]></title><description><![CDATA[Bismillah walhamdulillah.

💡
Artikel ini ditujukan untuk membantu pemula memahami dan memanfaatkan Google Gemini API untuk membangun aplikasi berbasis dialog interaktif. Anda akan diajak untuk mengenal berbagai fitur utama dari API ini, serta bagaim...]]></description><link>https://blog.galih.eu/memanfaatkan-api-google-gemini-untuk-membangun-dialog-interaktif-panduan-untuk-pemula</link><guid isPermaLink="true">https://blog.galih.eu/memanfaatkan-api-google-gemini-untuk-membangun-dialog-interaktif-panduan-untuk-pemula</guid><category><![CDATA[interactive dialog]]></category><category><![CDATA[llm]]></category><category><![CDATA[gemini]]></category><category><![CDATA[chatbot]]></category><category><![CDATA[Python]]></category><category><![CDATA[ai text generator]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Wed, 20 Nov 2024 13:27:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/gHugF-qvjUE/upload/c7833c2fc56015c603bb85bee94afab4.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Bismillah walhamdulillah.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Artikel ini ditujukan untuk membantu pemula memahami dan memanfaatkan Google Gemini API untuk membangun aplikasi berbasis dialog interaktif. Anda akan diajak untuk mengenal berbagai fitur utama dari API ini, serta bagaimana cara mengintegrasikannya dalam proyek Anda. Selain itu, artikel ini juga akan memberikan langkah-langkah praktis yang mudah diikuti, sehingga Anda bisa segera mulai membuat aplikasi yang menarik dan canggih dengan menggunakan teknologi terbaru dari Google.</div>
</div>

<h2 id="heading-1-pendahuluan">1. <strong>Pendahuluan</strong></h2>
<h3 id="heading-apa-itu-google-gemini">Apa itu Google Gemini?</h3>
<p><strong>Google Gemini</strong> adalah model AI terbaru dari Google yang dirancang untuk mempermudah pengembangan interaksi berbasis teks dan multimedia di berbagai aplikasi. Dengan Gemini API, yang terintegrasi dalam layanan Vertex AI, Anda dapat membuat aplikasi canggih yang mendukung dialog interaktif, seperti percakapan berlanjut serta kemampuan menerima masukan dalam berbagai format, mulai dari teks, gambar, hingga audio, dan menghasilkan luaran yang relevan [1][5].</p>
<h3 id="heading-keunggulan-api-google-gemini-untuk-dialog-interaktif">Keunggulan API Google Gemini untuk Dialog Interaktif.</h3>
<ol>
<li><p><strong>Percakapan yang Lebih Alami</strong>: Gemini API memungkinkan pembuatan percakapan yang terasa lebih alami dan dinamis dengan mengelola status percakapan secara otomatis. Pengembang tidak perlu lagi repot menyimpan riwayat percakapan secara manual, sehingga lebih efisien [2][5].</p>
</li>
<li><p><strong>Dukungan Multimodal</strong>: Dengan kemampuan untuk menerima masukan dalam berbagai format, Gemini API memungkinkan pengguna berinteraksi melalui teks, gambar, atau fail multimedia lainnya. Hal ini membuat pengalaman interaksi menjadi lebih kaya dan variatif [3][5][7].</p>
</li>
<li><p><strong>Integrasi yang Mudah</strong>: Gemini API dilengkapi dengan SDK untuk berbagai platform seperti Android, iOS, dan web, memudahkan pengembang untuk mengintegrasikan fungsionalitas canggih ini ke dalam aplikasi mereka. Juga mendukung panggilan fungsi untuk menghubungkan model AI dengan sistem eksternal lainnya [2][5][8].</p>
</li>
<li><p><strong>Kemampuan Penyesuaian yang Fleksibel</strong>: Pengembang dapat menyesuaikan berbagai pengaturan model, seperti temperatur dan batas <em>token</em> luaran, serta mengatur opsi keamanan untuk memastikan respons yang lebih sesuai dengan kebutuhan aplikasi [2][5].</p>
</li>
</ol>
<h3 id="heading-manfaat-bagi-pembelajar-pemula">Manfaat bagi Pembelajar Pemula.</h3>
<ol>
<li><p><strong>Akses ke Teknologi Terkini</strong>: Dengan mempelajari Google Gemini, pemula mendapatkan kesempatan untuk mengenal dan memanfaatkan teknologi AI generatif terbaru yang sangat relevan dengan perkembangan industri saat ini [1][6].</p>
</li>
<li><p><strong>Pengembangan Keterampilan Praktis</strong>: Menggunakan API ini, pemula bisa belajar cara membuat aplikasi interaktif yang menarik, sekaligus meningkatkan keterampilan pemrograman mereka lewat proyek nyata yang dapat langsung diterapkan [3][6].</p>
</li>
<li><p><strong>Dukungan Komunitas dan Sumber Daya</strong>: Google menyediakan dokumentasi yang lengkap dan contoh kode yang jelas, sehingga memudahkan pemula untuk mulai belajar dan mendapatkan bantuan jika diperlukan [4][5].</p>
</li>
<li><p><strong>Peluang Karier</strong>: Menguasai teknologi seperti Gemini API bisa membuka berbagai peluang karier di dunia pengembangan perangkat lunak, terutama di bidang aplikasi berbasis AI dan pembelajaran mesin [6].</p>
</li>
</ol>
<h2 id="heading-2-persiapan-awal">2. <strong>Persiapan Awal</strong></h2>
<p>Sebelum mulai menggunakan Google Gemini API, ada beberapa langkah persiapan yang perlu Anda lakukan:</p>
<ol>
<li><p><strong>Membuat Akun Google Cloud Platform (GCP).</strong></p>
<ul>
<li><p>Kunjungi situs <a target="_blank" href="https://cloud.google.com/">Google Cloud</a>.</p>
</li>
<li><p>Daftar atau masuk dengan akun Google Anda.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732087346891/1e9ff38b-41c8-4dfa-8f81-44e7b31a4120.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Jika belum memiliki akun GCP, Anda akan diminta untuk memasukkan informasi pembayaran. Google memberikan kredit gratis untuk pemula, yang bisa digunakan untuk mencoba layanan mereka.</p>
</li>
<li><p>Setelah masuk, buka <a target="_blank" href="https://console.cloud.google.com">Google Cloud Console</a>.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732087621562/0b8bbb76-7835-4202-b21d-bee57b839175.png" alt class="image--center mx-auto" /></p>
<p>  Di sini saya menggunakan akun alter Gmail (<em>Iron Man</em>) untuk memulai dari awal, dikarenakan akun utama sudah terdaftar dan punya proyek di GCP.</p>
</li>
</ul>
</li>
<li><h4 id="heading-membuat-proyek-baru">Membuat Proyek Baru</h4>
<ol>
<li><p>Di halaman Google Cloud Console, klik menu <em>dropdown</em> <strong><em>Select a Project</em></strong> di bagian atas.</p>
</li>
<li><p>Pilih <strong><em>New Project</em></strong>.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732088102428/7350a974-2015-42e8-bda3-3e8a2b4582ba.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Isi nama proyek sesuai kebutuhan Anda (misalnya, "Proyek Gemini API").</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732088186964/d7d52e4d-6069-472d-a485-f75f327bf3d0.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Klik <strong><em>Create</em></strong> untuk membuat proyek baru. Tunggu beberapa saat hingga proyek selesai dibuat, lalu pastikan proyek tersebut terpilih di <em>dropdown</em> proyek.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732088282665/ce91215e-5404-455d-b07b-02b85cfc1208.png" alt class="image--center mx-auto" /></p>
</li>
</ol>
</li>
</ol>
<ol start="3">
<li><p><strong>Mengaktifkan API Google Gemini.</strong></p>
<ul>
<li><p>Pastikan proyek baru Anda sudah dipilih di Google Cloud Console.</p>
</li>
<li><p>Di menu sebelah kiri, buka <strong>API &amp; Services</strong>, lalu klik <strong>Library</strong>.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732088494308/fcb87667-23c3-40c8-bc8f-383cd7c4b012.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Ketik "Google Gemini API" di kolom pencarian dan tekan <em>Enter</em>.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732088576525/1f78730e-a883-4a12-bcc9-99a339962a77.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Pilih <strong>Google Gemini API</strong> dari hasil pencarian, lalu klik tombol <strong><em>Enable</em></strong> untuk mengaktifkan API.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732088614759/85dc10ab-2df7-42e6-bc10-0a425cf37d59.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
</li>
<li><p><strong>Menyiapkan Kredensial API (API <em>Key</em>).</strong></p>
<ul>
<li><p>Setelah API diaktifkan, buka menu "API &amp; Services" dan pilih "Credentials".</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732089035634/d1261e12-df7d-4c85-b519-c3e311f83486.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Klik tombol "Create Credentials" dan pilih "API Key".</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732089102416/2e06cb4c-0492-4d08-90e1-8d411ff2309f.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Salin <strong><em>API Key</em></strong> yang dihasilkan dan simpan dengan aman, karena Anda akan menggunakannya untuk mengakses API Google Gemini dalam aplikasi Anda.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732089193888/86852a3a-ee8a-450c-84e6-fcf1829e6b9e.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
</li>
</ol>
<p>Dengan langkah-langkah ini selesai, Anda sudah siap untuk mulai mengintegrasikan Google Gemini API ke dalam proyek Anda.</p>
<h2 id="heading-3-dasar-pemrograman-api-google-gemini">3. <strong>Dasar Pemrograman API Google Gemini</strong></h2>
<ol>
<li><p><strong>Instalasi Perangkat Lunak yang Diperlukan.</strong></p>
<ul>
<li><p><strong>Python</strong>: Pastikan Python versi terbaru (minimal versi 3.8) telah terinstal di sistem Anda. Jika belum, Anda dapat mengunduhnya dari <a target="_blank" href="http://python.org">python.org</a><a target="_blank" href="https://www.python.org/">.</a></p>
</li>
<li><p><strong>Pustaka</strong> <code>google-generativeai</code>:<br />  Pustaka ini dirancang khusus untuk berinteraksi dengan layanan model generatif seperti Google Gemini. Instal pustaka ini dengan perintah berikut di terminal:</p>
<pre><code class="lang-plaintext">  pip install -q -U google-generativeai
</code></pre>
</li>
<li><p>Perintah <code>pip install -q -U google-generativeai</code> digunakan untuk menginstal atau memperbarui paket Python bernama <code>google-generativeai</code> ke versi terbaru. Opsi <code>-q</code> membuat proses instalasi berjalan dengan luaran minimal, sementara <code>-U</code> memastikan paket diperbarui jika versi yang lebih baru tersedia.</p>
</li>
</ul>
</li>
<li><p><strong>Kode Dasar untuk Koneksi</strong>.</p>
<ul>
<li><p>Berikut adalah contoh sederhana membuat koneksi ke Gemini API dan mengirim permintaan untuk menghasilkan teks:</p>
<pre><code class="lang-python">  <span class="hljs-keyword">import</span> google.generativeai <span class="hljs-keyword">as</span> genai  

  <span class="hljs-comment"># Token API ditulis langsung di sini untuk kemudahan (tidak disarankan untuk produksi)  </span>
  API_KEY = <span class="hljs-string">"API_KEY_ANDA"</span>  

  <span class="hljs-comment"># Konfigurasikan API Key Anda</span>
  genai.configure(api_key=API_KEY)

  <span class="hljs-comment"># Inisialisasi model</span>
  model = genai.GenerativeModel(<span class="hljs-string">'gemini-1.5-flash'</span>)

  <span class="hljs-comment"># Pertanyaan atau instruksi</span>
  prompt = <span class="hljs-string">"Jelaskan tentang kecerdasan buatan secara singkat!"</span>

  <span class="hljs-comment"># Mendapatkan respons</span>
  respons = model.generate_content(prompt)

  <span class="hljs-comment"># Menampilkan hasilnya</span>
  print(<span class="hljs-string">"Prompt:"</span>, prompt)
  print(<span class="hljs-string">"\nJawaban:"</span>, respons.text)
</code></pre>
</li>
<li><p>Berikut contoh luaran dari kode di atas:</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732102410603/211c1d37-dae1-4386-bde0-519210a65b6e.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
</li>
<li><p><strong>Saran Keamanan</strong></p>
</li>
</ol>
<ul>
<li><p>Menyertakan API <em>Key</em> secara langsung dalam kode adalah metode yang praktis untuk belajar, tetapi kurang aman jika proyek ini dipublikasikan, misalnya ke GitHub.<br />  Untuk praktik yang lebih baik, pertimbangkan menyimpan API <em>Key</em> di tempat aman seperti:</p>
<ul>
<li><p><strong>File konfigurasi</strong> yang tidak diunggah ke repositori (misalnya <code>.env</code>).</p>
</li>
<li><p><strong>Parameter lingkungan</strong> (environment variables).</p>
</li>
<li><p><strong>Layanan penyimpanan rahasia</strong>, seperti <strong>Google Secret Manager</strong> atau <strong>AWS Secrets Manager</strong>.</p>
</li>
</ul>
</li>
<li><p>Dengan cara ini, API <em>Key</em> Anda akan terlindungi dari risiko akses yang tidak diinginkan.</p>
</li>
</ul>
<h2 id="heading-4-kemampuan-gemini-ai-lainnya">4. <strong>Kemampuan Gemini AI Lainnya.</strong></h2>
<ul>
<li><h3 id="heading-membuat-teks-dari-masukan-berupa-teks-dan-gambar">Membuat teks dari masukan berupa teks dan gambar.</h3>
<p>  Mengacu ke halaman <a target="_blank" href="https://ai.google.dev/gemini-api/docs/text-generation?hl=id&amp;lang=python">Gemini Api Docs</a>, disebutkan bahwa Gemini API mendukung data masukan multimodal yang menggabungkan teks dengan fail media.</p>
</li>
<li><p>Pertama-tama, Instal modul <code>pillow</code> untuk keperluan pengolahan citra.</p>
</li>
</ul>
<pre><code class="lang-plaintext">pip install pillow
</code></pre>
<ul>
<li><p>Siapkan gambar dalam sebuah folder, misal: folder <code>gambar</code>, di dalamnya ada fail <code>kabah.jpg</code>.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732104760793/75739ea5-05f7-48e8-aef7-4dfc5d64f820.jpeg" alt class="image--center mx-auto" /></p>
<p>  Sumber gambar: <a target="_blank" href="https://unsplash.com/photos/kaaba-praying-ground-JFirQekVo3U">https://unsplash.com/photos/kaaba-praying-ground-JFirQekVo3U</a></p>
</li>
<li><p>Berikut ini contoh kodenya:</p>
</li>
<li><pre><code class="lang-python">    <span class="hljs-keyword">import</span> google.generativeai <span class="hljs-keyword">as</span> genai  
    <span class="hljs-keyword">import</span> PIL.Image

    <span class="hljs-comment"># Token API ditulis langsung di sini untuk kemudahan (tidak disarankan untuk produksi)  </span>
    API_KEY = <span class="hljs-string">"API_KEY_ANDA"</span>  

    <span class="hljs-comment"># Konfigurasikan API Key Anda</span>
    genai.configure(api_key=API_KEY)

    <span class="hljs-comment"># Inisialisasi model</span>
    model = genai.GenerativeModel(<span class="hljs-string">'gemini-1.5-flash'</span>)

    <span class="hljs-comment"># Tentukan alamat dan nama fail gambar (Perhatikan penulisan alamat relatif atau absolut).</span>
    <span class="hljs-comment"># Fungsi PIL di sini digunakan untuk membuka gambar dari file.</span>
    gambar = PIL.Image.open(<span class="hljs-string">"./gambar/kabah.jpg"</span>)

    <span class="hljs-comment"># Fungsi ini digunakan untuk menghasilkan konten berdasarkan input yang diberikan.</span>
    response = model.generate_content([<span class="hljs-string">"Buatlah deskripsi mengenai gambar ini!"</span>, gambar])

    print(response.text)
</code></pre>
</li>
<li><p>Dan ini adalah luaran yang dihasilkan:</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732104811641/462e9281-875d-47b5-b45b-45fc9d79ce37.png" alt class="image--center mx-auto" /></p>
<p>  <strong>Catatan</strong>: Fitur ini mengandalkan kemampuan model untuk menggabungkan pengolahan bahasa alami dan pengenalan gambar, meskipun di dokumentasi resmi Google Gemini lebih fokus pada generasi teks dan bukan pengolahan gambar langsung (sehingga penanganan gambar secara eksplisit mungkin memerlukan langkah-langkah tambahan).</p>
</li>
<li><h3 id="heading-dialog-interaktif">Dialog Interaktif.</h3>
<p>  Dialog interaktif memanfaatkan kemampuan Gemini AI untuk mempertahankan konteks percakapan, memungkinkan pengembang membuat aplikasi yang dapat berkomunikasi secara berkesinambungan dengan memori dialog yang dinamis.</p>
</li>
<li><p>Contoh kode:</p>
<pre><code class="lang-python">  <span class="hljs-keyword">import</span> google.generativeai <span class="hljs-keyword">as</span> genai

  <span class="hljs-comment"># Token API ditulis langsung di sini untuk kemudahan (tidak disarankan untuk produksi)  </span>
  API_KEY = <span class="hljs-string">"API_KEY_ANDA"</span>  

  <span class="hljs-comment"># Konfigurasikan API Key Anda</span>
  genai.configure(api_key=API_KEY)

  <span class="hljs-comment"># Inisialisasi model</span>
  model = genai.GenerativeModel(<span class="hljs-string">'gemini-1.5-pro'</span>)

  <span class="hljs-comment"># Memulai chat dengan history kosong</span>
  chat = model.start_chat(history=[])

  <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">lakukan_dialog</span>():</span>
      print(<span class="hljs-string">"Mulai dialog dengan Gemini AI (ketik 'keluar' untuk mengakhiri)"</span>)

      <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
          <span class="hljs-comment"># Input pengguna</span>
          pertanyaan = input(<span class="hljs-string">"\nAnda: "</span>)

          <span class="hljs-comment"># Cek apakah ingin keluar</span>
          <span class="hljs-keyword">if</span> pertanyaan.lower() == <span class="hljs-string">'keluar'</span>:
              print(<span class="hljs-string">"Dialog berakhir."</span>)
              <span class="hljs-keyword">break</span>

          <span class="hljs-comment"># Kirim pertanyaan dan dapatkan respons</span>
          respons = chat.send_message(pertanyaan)

          <span class="hljs-comment"># Tampilkan respons</span>
          print(<span class="hljs-string">"\nGemini:"</span>, respons.text)

  <span class="hljs-comment"># Jalankan dialog</span>
  <span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
      lakukan_dialog()
</code></pre>
</li>
<li><p>Berikut ini contoh luaran kode dan sedikit dialog yang saya lakukan.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1732108182933/11b32c5d-82e5-48e3-84c2-899bb95e485b.png" alt class="image--center mx-auto" /></p>
<p>  <strong>Catatan Penting:</strong> Kode-kode sebelumnya sengaja dibuat sederhana dan belum mencakup praktik terbaik seperti penanganan kesalahan (<em>error handling</em>), validasi input, atau konfigurasi lanjutan. Dalam pengembangan aplikasi nyata, Anda perlu menambahkan mekanisme:</p>
<ul>
<li><p>Penanganan exception.</p>
</li>
<li><p>Validasi API <em>key.</em></p>
</li>
<li><p>Pembatasan <em>token.</em></p>
</li>
<li><p>Penanganan <em>timeout.</em></p>
</li>
<li><p><em>Logging</em> kesalahan.</p>
</li>
</ul>
</li>
</ul>
<h2 id="heading-8-kesimpulan-dan-langkah-lanjutan">8. <strong>Kesimpulan dan Langkah Lanjutan</strong></h2>
<ul>
<li><p>Google Gemini API membuka pintu lebar bagi pengembang untuk memanfaatkan kecerdasan buatan mutakhir dalam berbagai aplikasi. Dari dialog interaktif hingga pengolahan kompleks, API ini menawarkan fleksibilitas dan kemampuan yang luar biasa. Dengan terus berkembangnya teknologi AI, Gemini API memberikan fondasi kuat bagi inovasi di bidang pemrosesan bahasan, analisis, dan interaksi cerdas. Pengembang disarankan untuk terus mengeksplorasi kemampuan API, mengikuti perkembangan terbaru, dan secara kreatif menerapkannya dalam berbagai solusi teknologi.</p>
</li>
<li><p><strong>Kesimpulan ini mencakup beberapa poin penting:</strong></p>
<ul>
<li><p>Potensi luas Google Gemini API</p>
</li>
<li><p>Fleksibilitas teknologi</p>
</li>
<li><p>Anjuran untuk eksplorasi berkelanjutan</p>
</li>
<li><p>Perspektif optimistis tentang masa depan teknologi AI.</p>
</li>
</ul>
</li>
</ul>
<h2 id="heading-9-lampiran">9. <strong>Lampiran</strong></h2>
<ul>
<li><h3 id="heading-kode-sumber-lengkap-proyek">Kode sumber lengkap proyek.</h3>
<p>  <a target="_blank" href="https://github.com/galihboy/Proyek_Gemini_Api">https://github.com/galihboy/Proyek_Gemini_Api</a></p>
</li>
<li><h3 id="heading-referensi">Referensi.</h3>
<p>  [1] <a target="_blank" href="https://cloud.google.com/vertex-ai/generative-ai/docs/samples/generativeaionvertexai-gemini-multiturn-chat?hl=id">https://cloud.google.com/vertex-ai/generative-ai/docs/samples/generativeaionvertexai-gemini-multiturn-chat?hl=id</a></p>
<p>  [2] <a target="_blank" href="https://firebase.google.com/docs/vertex-ai/chat?hl=id">https://firebase.google.com/docs/vertex-ai/chat?hl=id</a></p>
<p>  [3] <a target="_blank" href="https://codelabs.developers.google.com/codelabs/gemini-workspace?hl=id">https://codelabs.developers.google.com/codelabs/gemini-workspace?hl=id</a></p>
<p>  [4] <a target="_blank" href="https://developers.google.com/idx/support/release-notes?hl=id">https://developers.google.com/idx/support/release-notes?hl=id</a></p>
<p>  [5] <a target="_blank" href="https://firebase.google.com/docs/vertex-ai/gemini-api?hl=id">https://firebase.google.com/docs/vertex-ai/gemini-api?hl=id</a></p>
<p>  [6] <a target="_blank" href="https://ai.google.dev/competition/projects/slovo-ai?hl=id">https://ai.google.dev/competition/projects/slovo-ai?hl=id</a></p>
<p>  [7] <a target="_blank" href="https://developers.google.com/workspace/chat/tutorial-contact-app?hl=id">https://developers.google.com/workspace/chat/tutorial-contact-app?hl=id</a></p>
<p>  [8] <a target="_blank" href="https://cloud.google.com/vertex-ai/generative-ai/docs/samples/generativeaionvertexai-gemini-function-calling-chat?hl=id">https://cloud.google.com/vertex-ai/generative-ai/docs/samples/generativeaionvertexai-gemini-function-calling-chat?hl=id</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Mengolah Data JSON Menggunakan Python]]></title><description><![CDATA[Sekilas JSON
JSON adalah singkatan dari JavaScript Object Notation. JSON adalah format data yang populer untuk pertukaran data antar aplikasi. JSON adalah format data yang ringan dan mudah dibaca oleh manusia, dan dapat dengan mudah dikonversi ke for...]]></description><link>https://blog.galih.eu/mengolah-data-json-menggunakan-python</link><guid isPermaLink="true">https://blog.galih.eu/mengolah-data-json-menggunakan-python</guid><category><![CDATA[json]]></category><category><![CDATA[Python]]></category><category><![CDATA[filemanagement ]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Mon, 06 Nov 2023 12:56:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/HfFoo4d061A/upload/3759cb082053392ad597cf53b7f5fdb1.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-sekilas-json">Sekilas JSON</h1>
<p>JSON adalah singkatan dari <em>JavaScript Object Notation</em>. JSON adalah format data yang populer untuk pertukaran data antar aplikasi. JSON adalah format data yang ringan dan mudah dibaca oleh manusia, dan dapat dengan mudah dikonversi ke format data lain seperti XML atau CSV.</p>
<p><strong>Keuntungan menggunakan JSON sebagai media penyimpanan</strong></p>
<p>Ada beberapa keuntungan menggunakan JSON sebagai media penyimpanan, antara lain:</p>
<ul>
<li><p>Ringkas dan mudah dibaca</p>
</li>
<li><p>Terstruktur</p>
</li>
<li><p>Lebih mudah diakses oleh aplikasi</p>
</li>
<li><p>Dapat dikonversi ke format data lain</p>
</li>
</ul>
<p><strong>Contoh penggunaan JSON sebagai media penyimpanan</strong></p>
<p>JSON dapat digunakan untuk menyimpan berbagai jenis data, seperti:</p>
<ul>
<li><p>Data pengguna</p>
</li>
<li><p>Data barang</p>
</li>
<li><p>Data transaksi</p>
</li>
<li><p>Data konfigurasi</p>
</li>
<li><p>Data log</p>
</li>
</ul>
<p><strong>Kelemahan menggunakan JSON sebagai media penyimpanan</strong></p>
<p>Ada beberapa kelemahan menggunakan JSON sebagai media penyimpanan, antara lain:</p>
<ul>
<li><p>Tidak dapat menyimpan data biner</p>
</li>
<li><p>Tidak dapat menyimpan data yang sangat kompleks</p>
</li>
</ul>
<p>Secara keseluruhan, JSON adalah format data yang baik untuk digunakan sebagai media penyimpanan. JSON adalah format data yang ringkas, mudah dibaca, dan terstruktur. JSON juga lebih mudah diakses oleh aplikasi dan dapat dikonversi ke format data lain.</p>
<h1 id="heading-contoh-data-json">Contoh Data JSON</h1>
<p>Berikut adalah contoh data format JSON yang sederhana:</p>
<pre><code class="lang-json">{
  <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Fulan Fulanah"</span>,
  <span class="hljs-attr">"usia"</span>: <span class="hljs-number">20</span>,
  <span class="hljs-attr">"alamat"</span>: <span class="hljs-string">"Jl. Jendral Sudirman No. 1, Bandung"</span>
}
</code></pre>
<p>Data JSON ini menggambarkan informasi pribadi seseorang. Data ini terdiri dari tiga properti:</p>
<ul>
<li><p><strong>nama</strong> adalah properti string yang menyimpan nama seseorang.</p>
</li>
<li><p><strong>usia</strong> adalah properti integer yang menyimpan usia seseorang.</p>
</li>
<li><p><strong>alamat</strong> adalah properti string yang menyimpan alamat seseorang.</p>
</li>
</ul>
<p>Berikut adalah contoh lain dari data format JSON yang sederhana dan mudah dipahami:</p>
<pre><code class="lang-json">[
  {
    <span class="hljs-attr">"kode"</span>: <span class="hljs-number">1</span>,
    <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Pensil"</span>,
    <span class="hljs-attr">"harga"</span>: <span class="hljs-number">2000</span>
  },
  {
    <span class="hljs-attr">"kode"</span>: <span class="hljs-number">2</span>,
    <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Penghapus"</span>,
    <span class="hljs-attr">"harga"</span>: <span class="hljs-number">1000</span>
  },
  {
    <span class="hljs-attr">"kode"</span>: <span class="hljs-number">3</span>,
    <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Penggaris"</span>,
    <span class="hljs-attr">"harga"</span>: <span class="hljs-number">1500</span>
  },
  {
    <span class="hljs-attr">"kode"</span>: <span class="hljs-number">4</span>,
    <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Ballpoint"</span>,
    <span class="hljs-attr">"harga"</span>: <span class="hljs-number">5000</span>
  }
]
</code></pre>
<p>Data JSON ini menggambarkan daftar barang. Data ini terdiri dari <em>array</em> (larik) yang berisi empat objek JSON. Setiap objek JSON memiliki tiga properti:</p>
<ul>
<li><p><strong>kode</strong> adalah properti integer yang menyimpan kode barang.</p>
</li>
<li><p><strong>nama</strong> adalah properti string yang menyimpan nama barang.</p>
</li>
<li><p><strong>harga</strong> adalah properti integer yang menyimpan harga barang.</p>
</li>
</ul>
<p>Untuk selanjutnya kita anggap data ini disimpan dalam sebuah fail bernama <strong><mark>barang.json</mark></strong>.</p>
<p>Berikut contoh data JSON terkait informasi pribadi yang sedikit lebih rumit.</p>
<pre><code class="lang-json">[
  {
    <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Fulan Fulanah"</span>,
    <span class="hljs-attr">"usia"</span>: <span class="hljs-number">30</span>,
    <span class="hljs-attr">"alamat"</span>: {
      <span class="hljs-attr">"jalan"</span>: <span class="hljs-string">"Jl. Jendral Sudirman No. 1"</span>,
      <span class="hljs-attr">"kota"</span>: <span class="hljs-string">"Bandung"</span>,
      <span class="hljs-attr">"provinsi"</span>: <span class="hljs-string">"Jawa Barat"</span>
    },
    <span class="hljs-attr">"hobi"</span>: [<span class="hljs-string">"Membaca"</span>, <span class="hljs-string">"Menulis"</span>, <span class="hljs-string">"Bermain Gitar"</span>]
  },
  {
    <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Asep"</span>,
    <span class="hljs-attr">"usia"</span>: <span class="hljs-number">25</span>,
    <span class="hljs-attr">"alamat"</span>: {
      <span class="hljs-attr">"jalan"</span>: <span class="hljs-string">"Jl. Medan Merdeka Barat No. 1"</span>,
      <span class="hljs-attr">"kota"</span>: <span class="hljs-string">"Jakarta"</span>,
      <span class="hljs-attr">"provinsi"</span>: <span class="hljs-string">"DKI Jakarta"</span>
    },
    <span class="hljs-attr">"hobi"</span>: [<span class="hljs-string">"Olahraga"</span>, <span class="hljs-string">"Memasak"</span>, <span class="hljs-string">"Wisata"</span>]
  }
]
</code></pre>
<p>Dalam contoh di atas, saya menyimpan data untuk dua orang dalam bentuk larik (<em>array</em>). Setiap objek dalam <em>array</em> mewakili satu orang dengan properti "nama", "usia", "alamat", dan "hobi" yang sesuai.</p>
<p>Dalam struktur JSON yang diberikan, "jalan", "kota", dan "provinsi" adalah bagian dari properti "alamat". Item-item ini merupakan kunci atau nama properti yang mewakili informasi tentang alamat seseorang.</p>
<p>Untuk selanjutnya kita anggap data ini disimpan dalam sebuah fail bernama <strong><mark>orang.json</mark></strong>.</p>
<p>Secara umum, data JSON ini mudah dipahami karena strukturnya sederhana dan mudah dibaca. Data JSON ini juga mudah diakses oleh aplikasi karena menggunakan format data yang standar.</p>
<h1 id="heading-pemrograman-mengakses-data">Pemrograman: Mengakses Data</h1>
<p>Baiklah, berikut adalah kode Python secara bertahap untuk membaca data fail JSON:</p>
<p><strong>Tahap 1: Mengimpor modul JSON</strong></p>
<p>Pertama-tama, kita perlu mengimpor modul JSON ke dalam kode kita. Modul JSON menyediakan fungsi-fungsi untuk membaca dan menulis data JSON.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json
</code></pre>
<p><strong>Tahap 2: Membuka fail JSON</strong></p>
<p>Selanjutnya, kita perlu membuka fail JSON yang ingin kita baca. Kita dapat menggunakan fungsi <code>open()</code> untuk membuka fail JSON.</p>
<pre><code class="lang-python"><span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
</code></pre>
<p>Argumen pertama dari fungsi <code>open()</code> adalah nama fail JSON yang ingin kita buka. Argumen kedua adalah mode <code>r</code> yang berarti kita akan membuka fail JSON dalam mode baca.</p>
<p><strong>Tahap 3: Membaca data JSON</strong></p>
<p>Setelah fail JSON dibuka, kita dapat membaca data JSON menggunakan fungsi <code>json.load()</code>. Fungsi <code>json.load()</code> mengembalikan objek Python yang berisi data JSON.</p>
<pre><code class="lang-python">barang = json.load(f)
</code></pre>
<p><strong>Tahap 4: Mencetak data JSON</strong></p>
<p>Setelah data JSON dibaca, kita dapat mencetak data JSON menggunakan fungsi <code>print()</code>.</p>
<pre><code class="lang-python">print(barang)
</code></pre>
<p>Output dari kode Python tersebut adalah sebagai berikut:</p>
<pre><code class="lang-json">[{'kode': <span class="hljs-number">1</span>, 'nama': 'Pensil', 'harga': <span class="hljs-number">2000</span>}, {'kode': <span class="hljs-number">2</span>, 'nama': 'Penghapus', 'harga': <span class="hljs-number">1000</span>}, {'kode': <span class="hljs-number">3</span>, 'nama': 'Penggaris', 'harga': <span class="hljs-number">1500</span>}, {'kode': <span class="hljs-number">4</span>, 'nama': 'Ballpoint', 'harga': <span class="hljs-number">5000</span>}]
</code></pre>
<p>Jika ingin menampilkan data dengan format lebih rapi, bisa dicoba dengan memberikan indentasi dari setiap objek dan itemnya. Contohnya seperti ini.</p>
<pre><code class="lang-python">print(json.dumps(barang, indent=<span class="hljs-number">4</span>))
</code></pre>
<p>Baris kode tersebut akan mencetak data JSON dalam format yang lebih mudah dibaca. Fungsi <code>json.dumps()</code> digunakan untuk mengkonversi data Python ke format JSON. Argumen pertama dari fungsi <code>json.dumps()</code> adalah data Python yang ingin dikonversi. Argumen kedua adalah opsi <code>indent</code>, yang menentukan jumlah spasi yang digunakan untuk indentasi data JSON.</p>
<p>Dalam kasus ini, kita menggunakan opsi <code>indent=4</code> untuk membuat indentasi dengan empat spasi.</p>
<p>Luarannya seperti ini.</p>
<pre><code class="lang-json">[
    {
        <span class="hljs-attr">"kode"</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Pensil"</span>,
        <span class="hljs-attr">"harga"</span>: <span class="hljs-number">2000</span>
    },
    {
        <span class="hljs-attr">"kode"</span>: <span class="hljs-number">2</span>,
        <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Penghapus"</span>,
        <span class="hljs-attr">"harga"</span>: <span class="hljs-number">1000</span>
    },
    {
        <span class="hljs-attr">"kode"</span>: <span class="hljs-number">3</span>,
        <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Penggaris"</span>,
        <span class="hljs-attr">"harga"</span>: <span class="hljs-number">1500</span>
    },
    {
        <span class="hljs-attr">"kode"</span>: <span class="hljs-number">4</span>,
        <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Ballpoint"</span>,
        <span class="hljs-attr">"harga"</span>: <span class="hljs-number">5000</span>
    }
]
</code></pre>
<p><strong>Tahap 5: Menyaring barang dengan harga di atas 2000</strong></p>
<p>Kita dapat menggunakan kode Python berikut untuk menyaring barang dengan harga lebih besar atau sama dengan 2000:</p>
<pre><code class="lang-python"><span class="hljs-comment"># Cari semua barang dengan harga lebih besar atau sama dengan 2000</span>
barang_mahal = []
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> barang:
    <span class="hljs-keyword">if</span> item[<span class="hljs-string">"harga"</span>] &gt;= <span class="hljs-number">2000</span>:
        barang_mahal.append(item)

<span class="hljs-comment"># Cetak daftar barang mahal</span>
print(barang_mahal)
</code></pre>
<p>Luaran dari kode Python tersebut adalah sebagai berikut:</p>
<pre><code class="lang-json">[
    {
        <span class="hljs-attr">"kode"</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Pensil"</span>,
        <span class="hljs-attr">"harga"</span>: <span class="hljs-number">2000</span>
    },
    {
        <span class="hljs-attr">"kode"</span>: <span class="hljs-number">4</span>,
        <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Ballpoint"</span>,
        <span class="hljs-attr">"harga"</span>: <span class="hljs-number">5000</span>
    }
]
</code></pre>
<p>Kode Python ini menggunakan perulangan <code>for</code> untuk iterasi melalui semua objek JSON dalam daftar <code>barang</code>. Untuk setiap objek JSON, kode ini memeriksa properti <code>harga</code>. Jika nilai properti <code>harga</code> lebih besar atau sama dengan 2000, maka kode ini menambahkan objek JSON tersebut ke dalam daftar <code>barang_mahal</code>.</p>
<p><strong>Kode Python lengkap</strong></p>
<p>Berikut adalah kode Python lengkap untuk membaca data fail JSON:</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json

<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
    barang = json.load(f)

<span class="hljs-comment"># Tampilan standar</span>
print(barang)

<span class="hljs-comment"># Tampilan yang lebih rapi/cantik dengan indentasi 4</span>
print(json.dumps(barang, indent=<span class="hljs-number">4</span>))

<span class="hljs-comment"># Cari semua barang dengan harga di atas 2000</span>
barang_mahal = []
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> barang:
    <span class="hljs-keyword">if</span> item[<span class="hljs-string">"harga"</span>] &gt;= <span class="hljs-number">2000</span>:
        barang_mahal.append(item)

<span class="hljs-comment"># Cetak daftar barang mahal</span>
<span class="hljs-comment">#print(barang_mahal)</span>
print(json.dumps(barang_mahal, indent=<span class="hljs-number">4</span>))
</code></pre>
<p>Kode Python ini adalah gabungan dari semua tahap yang telah kita bahas sebelumnya.</p>
<h1 id="heading-pemrograman-menambah-data">Pemrograman: Menambah Data</h1>
<p>Untuk melakukan penambahan data, pertama-tama kita siapkan sebuah contoh data (objek) sebagai berikut.</p>
<pre><code class="lang-json">{
    <span class="hljs-attr">"kode"</span>: <span class="hljs-number">5</span>,
    <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Buku"</span>,
    <span class="hljs-attr">"harga"</span>: <span class="hljs-number">10000</span>
}
</code></pre>
<p>Kode Python untuk menambah data secara lengkap adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json

<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
    barang = json.load(f)

<span class="hljs-comment"># Tambahkan data barang baru</span>
barang.append({
    <span class="hljs-string">"kode"</span>: <span class="hljs-number">5</span>,
    <span class="hljs-string">"nama"</span>: <span class="hljs-string">"Buku"</span>,
    <span class="hljs-string">"harga"</span>: <span class="hljs-number">10000</span>
})

<span class="hljs-comment"># Simpan data barang yang telah diubah</span>
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
    json.dump(barang, f)
</code></pre>
<p>Kode Python ini akan menambah data barang baru ke fail JSON <code>barang.json</code>. Data barang baru memiliki kode 5, nama "Buku", dan harga 10000.</p>
<p>Beberapa kode yang perlu dijelaskan selain yang pernah dibahas sebelumnya adalah:</p>
<ul>
<li><p><code>barang.append({}</code>): digunakan untuk menambahkan data barang baru ke daftar <code>barang</code>.</p>
</li>
<li><p><code>{ "kode": 5, "nama": "Buku", "harga": 10000 }</code> adalah data barang baru yang akan ditambahkan.</p>
</li>
<li><p><code>with open("barang.json", "w") as f:</code> digunakan untuk membuka fail JSON <code>barang.json</code> dalam mode tulis.</p>
</li>
<li><p><code>json.dump(barang, f):</code> digunakan untuk menulis data JSON dari variabel <code>barang</code> ke fail <code>barang.json</code>.</p>
</li>
</ul>
<p>Jika fail json dibaca dan ditampilkan secara keseluruhan akan memunculkan lima objek, dengan tambahan barang terbaru yang baru saja ditambahkan.</p>
<h1 id="heading-pemrograman-mencari-data">Pemrograman: Mencari Data</h1>
<p>Dalam bagian akan menambahkan contoh pencarian data barang berdasarkan kode dan nama. Untuk pencarian harga sudah dicontohkan dalam bagian akhir Membaca Data.</p>
<p>Berikut adalah contoh kode untuk mencari data barang berdasarkan kode:</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json

<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
    barang = json.load(f)

<span class="hljs-comment"># Cari barang dengan kode 1</span>
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> barang:
    <span class="hljs-keyword">if</span> item[<span class="hljs-string">"kode"</span>] == <span class="hljs-number">1</span>:
        print(item)
</code></pre>
<p>Adapun untuk mencari barang berdasarkan nama, potongan kodenya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-comment"># Cari barang dengan nama "Pensil"</span>
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> barang:
    <span class="hljs-keyword">if</span> item[<span class="hljs-string">"nama"</span>] == <span class="hljs-string">"Pensil"</span>:
        print(item)
</code></pre>
<p>Untuk membuat pencarian nama barang lebih dinamis, potongan kodenya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json

<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
    barang = json.load(f)

<span class="hljs-comment"># Cari barang yang namanya mengandung huruf/kata "peng" (tanpa memperhatikan huruf besar atau kecil)</span>
barang_cari = []
kataCari = <span class="hljs-string">"peng"</span>

<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> barang:
    <span class="hljs-keyword">if</span> kataCari.lower() <span class="hljs-keyword">in</span> item[<span class="hljs-string">"nama"</span>].lower():
        barang_cari.append(item)

<span class="hljs-comment"># Cetak daftar barang pensil</span>
print(barang_cari)
</code></pre>
<p>Sedikit penjelasan beberapa bagian dari kode tersebut adalah:</p>
<ul>
<li><p><code>barang_cari = []:</code> digunakan untuk membuat daftar barang yang namanya mengandung huruf atau kata "peng".</p>
</li>
<li><p><code>kataCari = "peng":</code> digunakan untuk menentukan huruf atau kata yang akan dicari.</p>
</li>
<li><p><code>for item in barang:</code> digunakan untuk iterasi melalui semua data barang dalam variabel <code>barang</code>.</p>
</li>
<li><p><code>kataCari.lower() in item["nama"].lower()</code> digunakan untuk memeriksa apakah huruf atau kata "peng" terdapat di dalam nama barang, dengan huruf kecil.</p>
</li>
<li><p><code>barang_cari.append(item):</code> digunakan untuk menambahkan data barang tersebut ke dalam daftar <code>barang_cari</code>.</p>
</li>
<li><p><code>print(barang_cari):</code> digunakan untuk mencetak daftar barang yang namanya mengandung huruf atau kata "peng".</p>
</li>
</ul>
<p>Contoh luaran dari kode tersebut di atas adalah:</p>
<pre><code class="lang-json">[
    {
        <span class="hljs-attr">"kode"</span>: <span class="hljs-number">2</span>,
        <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Penghapus"</span>,
        <span class="hljs-attr">"harga"</span>: <span class="hljs-number">1000</span>
    },
    {
        <span class="hljs-attr">"kode"</span>: <span class="hljs-number">3</span>,
        <span class="hljs-attr">"nama"</span>: <span class="hljs-string">"Penggaris"</span>,
        <span class="hljs-attr">"harga"</span>: <span class="hljs-number">1500</span>
    }
]
</code></pre>
<h1 id="heading-pemrograman-mengubah-data">Pemrograman: Mengubah Data</h1>
<p>Untuk mencontohkan pengubahan atau pembaruan data, kita buat contoh mengubah data barang yang kodenya 5, nama "Buku", harga 10000 menjadi nama baru "Buku Tulis", harga baru 15000.</p>
<p>Kodenya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json

<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
    barang = json.load(f)

<span class="hljs-comment"># Cari data barang dengan kode 5</span>
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> barang:
    <span class="hljs-keyword">if</span> item[<span class="hljs-string">"kode"</span>] == <span class="hljs-number">5</span>:
        <span class="hljs-comment"># Ubah nama dan harga</span>
        item[<span class="hljs-string">"nama"</span>] = <span class="hljs-string">"Buku Tulis"</span>
        item[<span class="hljs-string">"harga"</span>] = <span class="hljs-number">15000</span>

<span class="hljs-comment"># Simpan data barang yang telah diubah</span>
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
    json.dump(barang, f)

<span class="hljs-comment"># Cetak daftar barang</span>
print(barang)
</code></pre>
<p>Beberapa penjelasan hanya di bagian penting:</p>
<ul>
<li><p><code>for item in barang:</code> digunakan untuk iterasi melalui semua data barang dalam variabel <code>barang</code>.</p>
</li>
<li><p><code>if item["kode"] == 5:</code> digunakan untuk memeriksa apakah kode barang yang sedang diproses sama dengan 5.</p>
</li>
<li><p><code>item["nama"] = "Buku Tulis"</code> digunakan untuk mengubah nama barang.</p>
</li>
<li><p><code>item["harga"] = 15000</code> digunakan untuk mengubah harga barang.</p>
</li>
<li><p><code>with open("barang.json", "w") as f:</code> digunakan untuk membuka file <code>barang.json</code> dalam mode penulisan.</p>
</li>
<li><p><code>json.dump(barang, f)</code> digunakan untuk menyimpan data barang ke file <code>barang.json</code>.</p>
</li>
<li><p><code>print(barang):</code> digunakan untuk mencetak daftar barang.</p>
</li>
</ul>
<p>Kode alternatif untuk mengubah data barang adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json

<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
    barang = json.load(f)

<span class="hljs-comment"># Cari data barang dengan kode 5</span>
data_barang = barang[barang.index({<span class="hljs-string">"kode"</span>: <span class="hljs-number">5</span>})]

<span class="hljs-comment"># Ubah nama dan harga</span>
data_barang[<span class="hljs-string">"nama"</span>] = <span class="hljs-string">"Buku Tulis"</span>
data_barang[<span class="hljs-string">"harga"</span>] = <span class="hljs-number">15000</span>

<span class="hljs-comment"># Ganti data barang yang telah diubah</span>
barang[barang.index({<span class="hljs-string">"kode"</span>: <span class="hljs-number">5</span>})] = data_barang

<span class="hljs-comment"># Simpan data barang yang telah diubah</span>
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
    json.dump(barang, f)

<span class="hljs-comment"># Cetak daftar barang</span>
print(barang)
</code></pre>
<p>Kode ini akan melakukan langkah-langkah yang sama dengan kode sebelumnya, tetapi dengan cara yang lebih singkat.</p>
<p>Berikut adalah penjelasan lebih rinci tentang kode tersebut:</p>
<ul>
<li><p><code>barang[barang.index({"kode": 5})]</code> digunakan untuk mengambil data barang dengan kode 5.</p>
</li>
<li><p><code>data_barang["nama"] = "Buku Tulis"</code> digunakan untuk mengubah nama barang.</p>
</li>
<li><p><code>data_barang["harga"] = 15000</code> digunakan untuk mengubah harga barang.</p>
</li>
<li><p><code>barang[barang.index({"kode": 5})] = data_barang</code> digunakan untuk mengganti data barang yang telah diubah.</p>
</li>
</ul>
<p>Output dari kode tersebut adalah sebagai berikut:</p>
<pre><code class="lang-json">[{'kode': <span class="hljs-number">1</span>, 'nama': 'Pensil', 'harga': <span class="hljs-number">2000</span>}, {'kode': <span class="hljs-number">2</span>, 'nama': 'Penggaris', 'harga': <span class="hljs-number">5000</span>}, {'kode': <span class="hljs-number">3</span>, 'nama': 'Rautan', 'harga': <span class="hljs-number">1000</span>}, {'kode': <span class="hljs-number">4</span>, 'nama': 'Ballpoint', 'harga': <span class="hljs-number">5000</span>}, {'kode': <span class="hljs-number">5</span>, 'nama': 'Buku Tulis', 'harga': <span class="hljs-number">15000</span>}]
</code></pre>
<h1 id="heading-pemrograman-menghapus-data">Pemrograman: Menghapus Data</h1>
<p>Untuk menghapus data, mekanismenya mirip dengan mengubah data. Bedanya, data barang yang dicari akan dihapus dari fail JSON.</p>
<p>Berikut contoh kode untuk menghapus data barang dengan kode 5.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> json

<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"r"</span>) <span class="hljs-keyword">as</span> f:
    barang = json.load(f)

<span class="hljs-comment"># Cari data barang dengan kode 5</span>
<span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> barang:
    <span class="hljs-keyword">if</span> item[<span class="hljs-string">"kode"</span>] == <span class="hljs-number">5</span>:
        <span class="hljs-comment"># Hapus data barang</span>
        barang.remove(item)

<span class="hljs-comment"># Simpan data barang yang telah dihapus</span>
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"barang.json"</span>, <span class="hljs-string">"w"</span>) <span class="hljs-keyword">as</span> f:
    json.dump(barang, f)

<span class="hljs-comment"># Cetak daftar barang</span>
print(barang)
</code></pre>
<p>Poin penting menghapus data adalah pada kode ini.</p>
<ul>
<li><code>barang.remove(item):</code> digunakan untuk menghapus data barang dari daftar.</li>
</ul>
<p>Alternatif lainnya seperti pada kode mengubah data sebelumnya adalah:</p>
<pre><code class="lang-python"><span class="hljs-comment"># Cari data barang dengan kode 5</span>
data_barang = barang[barang.index({<span class="hljs-string">"kode"</span>: <span class="hljs-number">5</span>})]

<span class="hljs-comment"># Hapus data barang</span>
barang.remove(data_barang)
</code></pre>
<h1 id="heading-penutup">Penutup</h1>
<p>Selamat, Anda telah menyelesaikan tutorial tentang membaca, mencari, menambah, mengubah, dan menghapus data di file JSON menggunakan Python. Sekarang, Anda dapat menggunakan keterampilan ini untuk mengembangkan berbagai aplikasi yang membutuhkan penyimpanan dan pengelolaan data dalam format JSON.</p>
<p>Berikut adalah beberapa tips untuk mengembangkan aplikasi berbasis JSON:</p>
<ul>
<li><p>Gunakan struktur JSON yang sesuai dengan kebutuhan aplikasi Anda.</p>
</li>
<li><p>Gunakan metode JSON yang tepat untuk membaca dan menulis data JSON.</p>
</li>
<li><p>Validasi data JSON sebelum menggunakannya.</p>
</li>
<li><p>Gunakan library JSON pihak ketiga untuk memudahkan pengembangan aplikasi Anda.</p>
</li>
</ul>
<p>Berikutnya akan saya tuliskan tutorial mengemas aplikasi pengelolaan fail JSON dalam format online atau versi <em>website</em>.</p>
<p>Repositori kode dalam tutorial ini ada di:<br /><a target="_blank" href="https://github.com/galihboy/json_crud">https://github.com/galihboy/json_crud</a></p>
<p>Semoga tutorial ini bermanfaat bagi Anda. Tetap semangat belajar dan mengembangkan aplikasi yang bermanfaat!</p>
]]></content:encoded></item><item><title><![CDATA[Berkenalan dengan Pillow - Library untuk Pengolahan Citra dalam Python]]></title><description><![CDATA[Bahasa pemrograman Python memiliki ribuan paket modul (library) yang dapat Anda gunakan untuk melakukan banyak hal. Terdapat modul yang khusus dimanfaatkan untuk mengolah citra atau gambar, mulai dari sekadar menampilkan gambar, membaca nilai piksel ...]]></description><link>https://blog.galih.eu/berkenalan-dengan-pillow-library-untuk-pengolahan-citra-dalam-python</link><guid isPermaLink="true">https://blog.galih.eu/berkenalan-dengan-pillow-library-untuk-pengolahan-citra-dalam-python</guid><category><![CDATA[Python]]></category><category><![CDATA[Pixels Art]]></category><category><![CDATA[image processing]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[python beginner]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Tue, 01 Feb 2022 16:12:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/iVfOFaEghqU/upload/v1643706505350/ncoDq2j_M.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Bahasa pemrograman Python memiliki ribuan paket modul (<em>library</em>) yang dapat Anda gunakan untuk melakukan banyak hal. Terdapat modul yang khusus dimanfaatkan untuk mengolah citra atau gambar, mulai dari sekadar menampilkan gambar, membaca nilai piksel gambar dan mengubah gambar berwarna menjadi warna abu-abu (<em>grayscale</em>) atau warna lain, mengubah ukuran gambar, mengubah format gambar disertai pengubahan kualitasnya, mengekstraksi fitur, hingga tingkat lebih tinggi seperti mendeteksi obyek dan lain sebagainya.</p>
<p>Ada banyak paket (modul) populer untuk bekerja dengan gambar dalam Python, seperti <a target="_blank" href="https://scikit-image.org/">scikit-image</a>, <a target="_blank" href="https://opencv.org/">OpenCV</a>, <a target="_blank" href="https://numpy.org/">NumPy</a>, <a target="_blank" href="https://python-pillow.org/">Pillow</a> (PIL), dan lain sebagainya. Dalam artikel ini akan disajikan tutorial pendahuluan dalam menggunakan modul <strong><em>Pillow</em></strong> sering disebut <strong><em>PIL</em></strong>, yang kepanjangan dari <em>Python Imaging LIbrary</em>. Panduan lengkap penggunaan PIL dapat Anda temukan di laman web <a target="_blank" href="https://pillow.readthedocs.io/en/stable/">Pillow ReadTheDocs</a>.</p>
<h2 id="heading-1-instalasi">1. Instalasi</h2>
<p>Jika Anda belum memasang modul PIL di lingkungan pengembangan Python, maka Anda dapat melakukan pemasangan terlebih dahulu. Berikut ini perintahnya.</p>
<blockquote>
<p>python3 -m pip install --upgrade pip<br />
python3 -m pip install --upgrade Pillow</p>
</blockquote>
<p>Saat artikel ini ditulis, saya menggunakan Python 3.9 dan Pillow 8.4.0.</p>
<h2 id="heading-2-menampilkan-gambar">2. Menampilkan Gambar</h2>
<p>Dalam bagian ini akan saya demokan cara menampilkan gambar dengan 3 cara berbeda.
Terdapat 3 urutan utama yang yang harus dilakukan, yaitu (1) impor metode atau fungsi <code>Image</code> pada modul <code>PIL</code>, (2) memuatkan fail gambar pada sebuah variabel, dan (3) menampilkan isi variabel (data gambar) ke layar.</p>
<p>Gambar yang saya gunakan diambil dari <a target="_blank" href="https://unsplash.com/photos/iMdsjoiftZo">Unsplash@sharonp</a>. </p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image
gambar = Image.open(<span class="hljs-string">'sharon-pittaway-iMdsjoiftZo-unsplash.jpg'</span>)
</code></pre>
<p>Anda juga dapat meletakkan nama fail gambar dalam sebuah variabel.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image
nama_fail = <span class="hljs-string">'sharon-pittaway-iMdsjoiftZo-unsplash.jpg'</span>
gambar = Image.open(nama_fail)
</code></pre>
<p>Penulisan nama fail yang disertai alamat jalur (<em>path</em>) lengkap sebaiknya disertai  karakter "<strong>r</strong>" yang berarti "<em>raw string</em>". Hal ini umum digunakan untuk menghindari pembacaan karakter tertentu yang dianggap sebagai bagian dari kode (perintah) dalam Python. Contoh penggunaannya adalah sebagai berikut.</p>
<pre><code>gambar = Image.open(<span class="hljs-string">r'D:\PythonKu\computer_vision\pil_tuts\sharon-pittaway-iMdsjoiftZo-unsplash.jpg'</span>)
</code></pre><p>Berikutnya adalah cara menampilkan isi variabel ke layar.</p>
<p>a) Menggunakan perintah <strong><em>show</em></strong>.</p>
<pre><code>gambar.show()
</code></pre><p>Perintah ini akan membuka gambar pada perangkat lunak penampil gambar bawaan (<em>default</em>) di sistem operasi Anda.
Kode ini memiliki perilaku yang sama ketika dijalankan di PyCharm, Visual Studio, dan Jupyter Notebook. Khusus untuk PyCharm, di bagian console ternyata menampilkan pesan kesalahan seperti pada gambar ini.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643710307196/CHMwKtixY.png" alt="image.png" />
Untuk menanganinya adalah dengan menambahkan perintah <code>import pylab</code> di bagian atas.</p>
<p>b) Menampikan via modul <a target="_blank" href="https://matplotlib.org/">matplotlib</a>.</p>
<p>Jika Anda sudah memasang modul <strong><em>matplotlib</em></strong>, caranya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> matplotlib <span class="hljs-keyword">import</span> pyplot <span class="hljs-keyword">as</span> plt
<span class="hljs-comment"># . . .</span>
plt.imshow(gambar)
plt.show()
</code></pre>
<p>Luaran gambar adalah sebagai berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643709396909/vr1c2_yOD.png" alt="image.png" /></p>
<p>Jika Anda ingin menghilangkan tampilan sumbu horizontal dan vertikalnya, tambahkan perintah <code>plt.axis(False)</code> sebelum menampilkan gambar.</p>
<p>c) Menggunakan perintah <strong><em>Display</em></strong>.
Perintah <strong><em>display</em></strong> dapat digunakan khusus dalam <em>Jupyter Notebook</em>. Gambar akan ditampilkan di bagian bawah sel kode.</p>
<pre><code><span class="hljs-selector-tag">display</span>(gambar)
</code></pre><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643709163213/FE_mWtAPp.png" alt="image.png" /></p>
<h2 id="heading-3-menampilkan-informasi-gambar">3. Menampilkan Informasi Gambar</h2>
<p>Beberapa informasi gambar yang dapat Anda lihat adalah ukuran (lebar dan tinggi), mode, format, dan lain-lain. Berikut ini contohnya.</p>
<pre><code class="lang-python">ukuran = gambar.size
print(<span class="hljs-string">f'Ukuran gambar: <span class="hljs-subst">{ukuran}</span>'</span>)
lebar, tinggi = ukuran
print(<span class="hljs-string">f'Lebar: <span class="hljs-subst">{lebar}</span>, Panjang: <span class="hljs-subst">{tinggi}</span>'</span>)
print(<span class="hljs-string">f'Mode: <span class="hljs-subst">{gambar.mode}</span>'</span>)
print(<span class="hljs-string">f'Nama fail: <span class="hljs-subst">{gambar.filename}</span>'</span>)
print(<span class="hljs-string">f'Format: <span class="hljs-subst">{gambar.format}</span>'</span>)
print(<span class="hljs-string">f'Deskripsi format: <span class="hljs-subst">{gambar.format_description}</span>'</span>)
</code></pre>
<p>Contoh luarannya adalah:</p>
<blockquote>
<p>Ukuran gambar: (640, 640)<br />
Lebar: 640, Panjang: 640<br />
Mode: RGB<br />
Nama fail: sharon-pittaway-iMdsjoiftZo-unsplash.jpg<br />
Format: JPEG<br />
Deskripsi format: JPEG (ISO 10918)</p>
</blockquote>
<h2 id="heading-4-membaca-nilai-warna-piksel">4. Membaca Nilai Warna (Piksel)</h2>
<p>Dalam mode RGB (Red, Green, Blue), setiap piksel akan mengandung 3 buah nilai warna merah (<em>red</em>), hijau (<em>green</em>), dan biru (<em>blue</em>). Sebagai pengingat, bawah kombinasi nilai (0, 0, 0) adalah warna hitam, nilai (255, 255, 255) adalah warna putih, nilai (255, 0, 0) warna merah, nilai (0, 255, 0) warna hijau, nilai (0, 0, 255) warna biru, dan seterusnya.</p>
<p>Perintah utama untuk membaca nilai warna (piksel) pada gambar adalah dengan menggunakan perintah <code>getpixel((i, j))</code>, di mana variabel <strong>i</strong> menunjukkan baris, dan <strong>j</strong> adalah kolom.</p>
<p>Jadi, yang kita lakukan berikutnya adalah membaca piksel untuk setiap baris dan kolom dari gambar. Dikarenakan ukuran gambar adalah 640x640, di mana terdapat 640 baris dan 640 kolom, maka akan mengeluarkan 25.600 nilai RGB. Berikut adalah contoh kodenya.</p>
<pre><code><span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image

gambar = Image.<span class="hljs-keyword">open</span>(<span class="hljs-string">'sharon-pittaway-iMdsjoiftZo-unsplash.jpg'</span>)
lebar, tinggi = gambar.size
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(lebar):
    <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> range(tinggi):
        nilai_piksel = gambar.getpixel((i, j))
        print(nilai_piksel)
</code></pre><p>Contoh sebagian isi piksel ada pada gambar berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643711596541/TVAoyH2gG.png" alt="image.png" /></p>
<h2 id="heading-5-modifikasi-nilai-piksel">5. Modifikasi Nilai Piksel</h2>
<p>Setelah berhasil membaca nilai warna setiap piksel pada gambar, berikutnya kita dapat melakukan manipulasi atau modifikasi nilai sesuai keinginan. Berikut ini akan saya contohkan mengubah nilai warna yang tadinya berwarna (RGB) menjadi warna abu-abu.</p>
<p>Rumus untuk mendapatkan warna abu-abu adalah sebagai berikut.</p>
<blockquote>
<p>nilai_abu = (0.299 x red) + (0.587 x green) + (0.114 x blue)</p>
</blockquote>
<p>Jadi, nilai warna abu-abu hasil penghitungan rumus di atas akan disimpan di tiga kolom RGB, yang berarti:</p>
<blockquote>
<p>nilai_baru = ( int(nilai_abu), int(nilai_abu), int(nilai_abu) )</p>
</blockquote>
<p>Fungsi <strong><em>int</em></strong> digunakan untuk memastikan <code>nilai_abu</code> tetap dalam format bilangan genap atau integer.
Berikut ini adalah kodenya.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image

gambar = Image.open(<span class="hljs-string">'sharon-pittaway-iMdsjoiftZo-unsplash.jpg'</span>)
lebar, tinggi = gambar.size

<span class="hljs-comment"># masukkan isi piksel ke dalam daftar_piksel_gambar - format baris x kolom - tuple RGB</span>
daftar_piksel_gambar = gambar.load()

<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(lebar):
    <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> range(tinggi):
        <span class="hljs-comment"># baca piksel dalam format RGB</span>
        r, g, b = gambar.getpixel((i, j))
        <span class="hljs-comment"># setiap nilai di kolom RGB diubah ke warna keabuan sesuai rumus</span>
        nilai_abu = (<span class="hljs-number">0.299</span>*r + <span class="hljs-number">0.587</span>*g + <span class="hljs-number">0.114</span>*g)
        <span class="hljs-comment"># masukkan warna baru keabuan dalam tuple</span>
        daftar_piksel_gambar[i, j] = (int(nilai_abu), int(nilai_abu), int(nilai_abu))

fail_abu = <span class="hljs-string">"gambar_abu-abu.jpg"</span>
<span class="hljs-comment"># simpan gambar abu-abu ke fail baru</span>
gambar.save(fail_abu)
<span class="hljs-comment"># tampilkan gambar abu-abu</span>
gambar_abu = Image.open(<span class="hljs-string">rf'<span class="hljs-subst">{fail_abu}</span>'</span>)
display(gambar_abu)
<span class="hljs-comment"># gambar_abu.show()</span>
</code></pre>
<p>Contoh luarannya adalah:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643712590750/v8HIuY8Os.png" alt="image.png" /></p>
<p>Jika Anda tidak menggunakan Jupyter Notebook, gunakan cara penampilan gambar (a) atau (b) pada bahasan nomor 1 sebelumnya.</p>
<p>Cara cepat atau instan adalah dengan mengonversi gambar dari mode '<strong>RGB</strong>' ke '<strong>L</strong>' (<em>luminance</em>), yang berarti hanya terdiri dari 1 kanal warna saja. Rumus untuk mendapat nilai dalam mode L adalah sebagai berikut [<a target="_blank" href="https://pillow.readthedocs.io/en/stable/reference/Image.html">laman web Pillow</a>].</p>
<blockquote>
<p>L = R <em> 299/1000 + G </em> 587/1000 + B * 114/1000</p>
</blockquote>
<h2 id="heading-6-mengonversi-gambar-ke-hitam-putih">6. Mengonversi Gambar ke Hitam Putih</h2>
<p>Melanjutkan penjelasan konversi gambar berwarna ke format abu-abu cara instan sebelumnya, yaitu dengan cara menyesuaikan kanal 3 warna (RGB) menjadi 1 warna (L).
Kodenya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image

gambar = Image.open(<span class="hljs-string">'sharon-pittaway-iMdsjoiftZo-unsplash.jpg'</span>)
gambar_abu = gambar.convert(<span class="hljs-string">'L'</span>)
<span class="hljs-comment"># gambar_abu.show()</span>
display(gambar_abu)
</code></pre>
<p>Hasil dari kode tersebut di atas sama dengan cara manipulasi nilai piksel secara manual pada penjelasan di nomor 5 sebelumnya. Hanya saja, nilai piksel hanya berupa satu nilai mulai dari 0 (menunjukkan warna hitam) s/d 255 (menunjukkan warna putih).</p>
<p>Berikutnya, kita akan membuat gambar yang benar-benar hanya berisi warna hitam atau putih, yaitu 0 atau 255. Kita buat dulu batas ambangnya adalah setengah nilai dari 255, misalnya 128. Jika ada nilai piksel yang di bawah 128, maka kita anggap berwarna hitam (nilai 0). Sebaliknya, jika nilainya lebih besar atau sama dengan 128, maka kita anggap putih (nilai 255). Kodenya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image

gambar = Image.open(<span class="hljs-string">'sharon-pittaway-iMdsjoiftZo-unsplash.jpg'</span>)
gambar_abu = gambar.convert(<span class="hljs-string">'L'</span>)
daftar_piksel_gambar = gambar_abu.load()
batas = <span class="hljs-number">128</span>

<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(gambar_abu.size[<span class="hljs-number">0</span>]):
    <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> range(gambar_abu.size[<span class="hljs-number">1</span>]):
        <span class="hljs-keyword">if</span> gambar_abu.getpixel((i, j)) &lt; <span class="hljs-number">128</span>:
            nilai_baru = <span class="hljs-number">0</span>
        <span class="hljs-keyword">else</span>:
            nilai_baru = <span class="hljs-number">255</span>
        daftar_piksel_gambar[i, j] = nilai_baru

fail_hp = <span class="hljs-string">"gambar_hitam_putih.jpg"</span>
gambar_abu.save(fail_hp)
gambar_hp = Image.open(fail_hp)
display(gambar_hp)
<span class="hljs-comment"># gambar_hp.show()</span>
</code></pre>
<p>Setelah dilakukan pengubahan nilai piksel, dari daftar piksel gambar selanjutnya disimpan dalam sebuah fail gambar baru yang disimpan dalam variabel <code>fail_hp</code>. Luarannya adalah sebagai berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643730396289/H8hTVjlOe.png" alt="image.png" /></p>
<p>Cara lain yang sedikit lebih pendek adalah sebagai berikut.</p>
<pre><code>gambar_hitam_putih <span class="hljs-operator">=</span> gambar_abu.point(lambda x: <span class="hljs-number">0</span> <span class="hljs-keyword">if</span> x<span class="hljs-operator">&lt;</span><span class="hljs-number">128</span> <span class="hljs-keyword">else</span> <span class="hljs-number">255</span>, <span class="hljs-string">'1'</span>)
gambar_hitam_putih.save(<span class="hljs-string">"gambar_hitam_putih.jpg"</span>)
display(gambar_hitam_putih)
</code></pre><p>Penentuan nilai piksel dapat dilakukan melalui fungsi <code>.poin</code> di mana di dalamnya disertai fungsi <em>lambda</em> yang bertugas menyeleksi jika suatu nilai di bawah atau di atas batas ambang yang ditentukan, dalam hal ini nilai 128. Langkah berikutnya sama dengan kode sebelumnya, yaitu menyimpan data piksel ke dalam gambar baru.</p>
<p>Selanjutnya, Anda dapat bereksperimen dengan penentuan batas ambang yang berbeda untuk mendapatkan porsi warna hitam dan putih yang lebih sesuai.</p>
<p>Kode sumber dalam format Jupyter Notebook tersedia di repositori.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/galihboy/pil_tutorial">https://github.com/galihboy/pil_tutorial</a></div>
<hr />
<p>Untuk sementara sampai di sini pembahasan pengenalan modul PIL dalam Python. Di artikel berikutnya akan kita bahas lebih banyak lagi hal-hal yang bisa kita lakukan untuk pengolahan citra dan contoh nyatanya.</p>
<p>Semoga bermanfaat.</p>
]]></content:encoded></item><item><title><![CDATA[15 Bidang Ilmu untuk Menafsirkan Al Quran]]></title><description><![CDATA[Sayyidina lbnu Mas'ud Radhiyallahu 'anhu berkata, "Jika kalian menginginkan ilmu, maka pikirkanlah dan renungkanlah makna-makna Al Quran, karena di dalamnya terkandung ilmu orang-orang dahulu dan sekarang. Namun, untuk dapat memahami maknanya, kita m...]]></description><link>https://blog.galih.eu/15-bidang-ilmu-untuk-menafsirkan-al-quran</link><guid isPermaLink="true">https://blog.galih.eu/15-bidang-ilmu-untuk-menafsirkan-al-quran</guid><category><![CDATA[blog]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Mon, 24 Jan 2022 09:55:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/ign4ES0eY0Q/upload/v1643011398250/DjHPodBl7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sayyidina lbnu Mas'ud Radhiyallahu 'anhu berkata, "Jika kalian menginginkan ilmu, maka pikirkanlah dan renungkanlah makna-makna Al Quran, karena di dalamnya terkandung ilmu orang-orang dahulu dan sekarang. Namun, untuk dapat memahami maknanya, kita mesti menunaikan syarat dan adab-adabnya terlebih dahulu." </p>
<p>Jangan seperti zaman kita sekarang ini, hanya bermodalkan pengetahuan tentang beberapa lafaz bahasa Arab, bahkan yang lebih parah lagi hanya sekadar melihat terjemahan Al Quran, seseorang berani berpendapat mengenai Al Quran. </p>
<p>Para ulama berkata, "Dalam menafsirkan Al Quran diperlukan keahlian dalam lima belas bidang ilmu." Saya akan meringkas kelima belas bidang ilmu tersebut semata-mata agar orang mengetahui bahwa tidak setiap orang dapat memahami makna batin Al Quran ini.</p>
<p><strong>1.    Ilmu Lughat</strong>, (ilmu untuk mengetahui makna setiap kata dalam bahasa Arab). Syaikh Mujahid Rahmatullah 'alaih berkata, "Barang siapa beriman kepada Allah Subhaanahu wata'ala dan hari akhir, ia tidak layak berkomentar tentang ayat-ayat Al Quran tanpa mengetahui ilmu lughat. Sedikit pengetahuan tentang ilmu lughat tidaklah cukup. Karena kadang kala satu lafaz mengandung beberapa makna, sedangkan jika seseorang hanya mengetahui satu atau dua makna saja, padahal kenyataannya, yang dimaksud adalah makna yang lain, maka tentu dia akan salah memahaminya.</p>
<p><strong>2.    Ilmu Nahwu</strong> (yaitu ilmu untuk mengetahui makna dan bentuk susunan kalimat dalam bahasa Arab). Amat penting mengetahui ilmu Nahwu, karena sedikit saja i'rab (bacaan akhir kata) berubah, akan mengubah arti kata tersebut. Sedangkan pengetahuan tentang i'rab hanya didapat dalam ilmu Nahwu. </p>
<p><strong>3.    Ilmu Sharaf</strong> (ilmu untuk mengetahui perubahan suatu kata dalam bahasa Arab dan keadaannya sebelum tersusun). Mengetahui ilmu sharaf penting sekali, sebab perubahan sedikit bentuk suatu kata akan mengubah maknanya. Syaikh lbnu Faris Rahmatullah 'alaih berkata, "Jika seseorang tidak mendapatkan ilmu Sharaf, berarti ia telah kehilangan banyak sekali." Dalam Kitab Ujubatut Tafsir, Syaikh Zamakhsyari Rahmatullah 'alaih menulis bahwa ada seseorang yang menerjemahkan ayat Al Quran yang berbunyi:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643017976945/l9wAnUXc5.png" alt="image.png" />
"(Ingatlah), pada hari (ketika) Kami panggil setiap umat dengan pemimpinnya." (Q.S. Al-Isra': 71)</p>
<p>Karena ketidaktahuannya dalam ilmu Sharaf, ia mengartikan ayat tersebut seperti ini: "Pada hari ketika manusia dipanggil dengan ibu-ibu mereka." Kata imam' (pemimpin) adalah bentuk mufrad (tunggal), tetapi orang tersebut mengira bahwa kata "imam' merupakan bentuk jamak dari kata 'umm' (ibu). Jika ia memahami ilmu Sharaf, ia tidak akan memahami bahwa bentuk jamak 'umm' adalah 'imam'.</p>
<p><strong>4.    Ilmu Isytiqaq</strong> (yaitu ilmu tentang asal usul kata). Mengetahui ilmu Isytiqaq sangat penting. Dengan ilmu tersebut dapat diketahui asal-usul kata. Ada beberapa kata yang berasal dari dua kata yang berbeda, sehingga berbeda maknanya. Seperti kata 'masiih' berasal dari kata 'mash' yang artinya mengusapkan tangan yang basah ke atas sesuatu. Bisa juga kata masih berasal dari kata 'misaahah' yang berarti ukuran.</p>
<p><strong>5.    Ilmu Ma'ani </strong>(ilmu tentang susunan kalimat dari segi maknanya). lImu Ma'ani amat penting diketahui. Dengan ilmu ini susunan kalimat dapat dipahami maknanya.</p>
<p><strong>6.    Ilmu Bayaan</strong>, yaitu ilmu yang mempelajari makna kata yang zhahir dan tersembunyi. Ilmu ini juga mempelajari kiasan dan pemisalan kata.</p>
<p><strong>7.    Ilmu Badi</strong>, yaitu ilmu yang mempelajari keindahan bahasa. Ketiga bidang ilmu di atas (Ilmu Ma'ani, Bayaan, dan Badi) disebut juga sebagai cabang ilmu Balaghah. Ilmu ini sangat penting dikuasai oleh para ahli tafsir karena Al Quran adalah mukjizat yang agung. Dengan ilmu-ilmu di atas, kemukjizatan Al Quran dapat dipahami.</p>
<p><strong>8.    Ilmu Qira'at</strong> (ilmu yang mempelajari tentang macam-macam bacaan Al Quran). Ilmu ini sangat penting dipelajari, karena perbedaan bacaan dapat mengubah makna ayat. Ilmu ini membantu menentukan makna yang paling tepat di antara makna-makna suatu kata.</p>
<p><strong>9.    Ilmu Aqa'id</strong>, yaitu ilmu yang mempelajari dasar-dasar keimanan. Mempelajari ilmu ini sangat penting karena kadang kala ada satu ayat Al Quran yang arti zhahirnya tidak layak diperuntukkan bagi Allah Subhaanahu wata'ala. Untuk memahaminya, diperlukan takwil ayat tersebut, seperti ayat: </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643017916814/QDkbvR_Qw.png" alt="image.png" />
"Tangan Allah di atas tangan mereka." (Q.S AL-Fath: 10)</p>
<p>Takwilnya, orang yang berjanji kepada Baginda Rasulullah Shallallahu 'alaihi wasallam, sama juga dengan berjanji kepada Allah Subhaanahu wata'ala. </p>
<p><strong>10. Ilmu Ushul Fiqih</strong> (ilmu yang mempelajari cara pengambilan hukum dalil-dalil syariat secara garis besar). Mempelajari ilmu Ushul Fiqih sangat penting. Dengan ilmu ini dapat diambil kesimpulan hukum dari suatu ayat.</p>
<p><strong>11.    Ilmu Asbabun Nuzul</strong>, yaitu ilmu untuk mengetahui sebab-sebab turunnya ayat Al Quran. Dengan mengetahui sebab-sebabnya, maksud suatu ayat menjadi lebih jelas. </p>
<p><strong>12.    Ilmu Nasikh Mansukh</strong> (ilmu untuk mengetahui hukum-hukum yang telah dihapus dan hukum-hukum yang berlaku). Dengan ilmu ini dapat dipelajari suatu hukum yang sudah dihapus dan hukum yang masih tetap berlaku. </p>
<p><strong>13.    Ilmu Fiqih </strong>(ilmu yang mempelajari hukum-hukum dalam syariat). Ilmu ini penting sekali dipelajari. Karena dengan mengetahui hukum-hukum Fiqih secara rinci, akan mudah dipahami kaidah-kaidah umum yang ada dalam Al Quran yang menjadi dasar hukum tersebut. </p>
<p><strong>14.    Ilmu Hadits</strong>. Ilmu sangat penting dipelajari untuk mengetahui hadis-hadis yang menafsirkan ayat-ayat Al Quran. </p>
<p><strong>15.    Ilmu Wahbi</strong>, yaitu ilmu khusus yang diberikan Allah Subhaanahu wata'ala kepada hamba-Nya yang istimewa, sebagaimana sabda Baginda Nabi Shallallahu 'alaihi wasallam:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643017820062/RWY8KH7v9.png" alt="image.png" />
“Barang siapa mengamalkan apa yang ia ketahu, maka Allah Subhaanahu wata'ala akan memberikan kepadanya ilmu yang tidak ia ketahu.”</p>
<p>Sebagaimana dalam satu riwayat, ketika Sayyidina Ali Radhiyallahu 'anhu ditanya oleh seseorang, "Apakah Baginda Rasulullah Shallallahu 'alaihi wasallam telah memberimu suatu ilmu atau nasihat khusus yang tidak diberikan kepada orang lain?" Ia berkata, "Demi Allah, demi Yang menciptakan surga dan jiwa. Aku tidak memiliki sesuatu yang khusus kecuali pemahaman Al Quran yang Allah Subhaanahu wata'ala berikan kepada hamba-Nya." Syaikh lbnu Abi Dunya Rahmatullah 'alaih berkata, "Ilmu Al Quran dan pengetahuan yang didapat darinya seperti lautan yang tak bertepi."</p>
<p>Cabang-cabang ilmu di atas adalah sebagai alat dan syarat-syarat yang penting bagi seorang penafsir. Penafsiran dari seseorang yang tidak benar-benar mahir dengan cabang-cabang ilmu ini dan hanya berdasarkan pendapatnya sendiri harus dicegah. Para sahabat Radhiyallahu 'anhum memperoleh ilmu bahasa Arab secara kebetulan karena merupakan bahasa ibu mereka, sedangkan ilmu lainnya mereka mempelajarinya secara mendalam melalui Rasulullah Shallallahu 'alaihi wasallam. </p>
<p>Allamah Suyuti Rahmatullah 'alaih berkata, "Orang-orang yang mengatakan bahwa untuk mendapatkan ilmu Wahbi adalah di luar kemampuan manusia, pendapat itu tidak benar. Karena cara untuk mendapatkan pengetahuan langsung dari Allah tanpa belajar telah ditunjukkan oleh Allah sendiri, yaitu dengan mengamalkan ilmu yang telah diperolehnya dan tidak mencintai keduniaan. </p>
<p>Seperti ditulis dalam Kitab Kimiya Sa'adat, ''Tiga golongan orang berikut ini tidak akan berhasil menafsirkan Al Quran, yaitu: (1) seorang yang tidak mahir dalam bahasa Arab, (2) orang yang selalu membuat dosa-dosa besar atau orang yang membuat bid'ah karena perbuatan ini dapat menggelapkan hatinya dan menghalanginya dari memahami Al Quran, dan (3) seorang yang menggunakan alasan-alasan rasional (pikiran) semata walaupun dalam hal keimanan, ia merasa tidak suka apabila ia membaca satu ayat Al Quran yang tidak sesuai dengan akal pikirannya. Orang-orang seperti ini tidak akan mampu memahami Al Quran dengan benar. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643017857367/d2da89zpN.png" alt="image.png" />
"Ya Allah peliharalah kami dari perbuatan yang demikian."</p>
<hr />
<p><strong>Sumber.</strong></p>
<p>Zakariyya Al Kandahlawi, M. (2011) ‘Fadhilah Al Quran’, in Fadhilah Amal. Bandung: Pustaka Ramadhan. pp. 609–6012</p>
]]></content:encoded></item><item><title><![CDATA[Faktorisasi atau Penguraian Bilangan Prima dalam Python]]></title><description><![CDATA[Bismillah Alhamdulillah,
Dalam artikel ini akan dibahas bagaimana cara mendapatkan faktorisasi atau penguraian bilangan prima dari sebuah bilangan. 
1. Pendahuluan
Faktor adalah pembagi suatu bilangan yang dapat membagi habis bilangan tersebut. Kalau...]]></description><link>https://blog.galih.eu/faktorisasi-atau-penguraian-bilangan-prima-dalam-python</link><guid isPermaLink="true">https://blog.galih.eu/faktorisasi-atau-penguraian-bilangan-prima-dalam-python</guid><category><![CDATA[Python]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[Mathematics]]></category><category><![CDATA[python beginner]]></category><category><![CDATA[Math]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Tue, 30 Nov 2021 19:00:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/unsplash/qXn5L9BqRbE/upload/v1638298539080/fQjS5-SOvB.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillah Alhamdulillah,</em></p>
<p>Dalam artikel ini akan dibahas bagaimana cara mendapatkan <em>faktorisasi</em> atau penguraian bilangan prima dari sebuah bilangan. </p>
<h2 id="heading-1-pendahuluan">1. Pendahuluan</h2>
<p>Faktor adalah pembagi suatu bilangan yang dapat membagi habis bilangan tersebut. Kalau saya punya sebuah angka <code>6</code>, maka faktor bilangannya adalah: <code>1, 2, 3, 6</code>. Yaitu hasil perkalian dari:</p>
<blockquote>
<p>1 x 6<br />
2 x 3</p>
</blockquote>
<p>Berikutnya, kita membahas pengertian faktorisasi dan faktorisasi prima.</p>
<blockquote>
<p><strong><em>Faktorisasi</em></strong> dalam matematika adalah dekomposisi suatu objek (misalnya, suatu bilangan, polinomial, atau matriks) menjadi suatu produk objek lain, atau faktor, yang ketika dikalikan bersama menghasilkan bilangan asalnya. Contohnya, bilangan 15 difaktorkan menjadi bilangan prima sebagai 3 × 5, dan polinomial x2 − 4 difaktorkan menjadi (x − 2)(x + 2). Dalam segala kasus, diperoleh suatu produk dari objek yang lebih sederhana -  <a target="_blank" href="https://id.wikipedia.org/wiki/Faktorisasi">Wikipedia</a> .</p>
<p><strong><em>Faktorisasi prima</em></strong> adalah pecahan bilangan komposit yang terdiri dari bilangan-bilangan pembagi yang lebih kecil, dan hasil perkalian dari bilangan-bilangan tersebut sama dengan bilangan komposit yang disebutkan. Contohnya, faktorisasi prima bilangan 84 adalah 2x2x3x7, di mana bilangan 2, 3 dan 7 adalah bilangan prima dan bilangan pembagi 84 -  <a target="_blank" href="https://id.wikipedia.org/wiki/Faktorisasi_prima">Wikipedia</a>.</p>
</blockquote>
<hr />
<h2 id="heading-2-pembahasan">2. Pembahasan</h2>
<p>Dalam bagian pembahasan ini akan saya jabarkan langkah per langkah cara membangkitkan faktor bilangan menggunakan bahasa pemrograman <strong><em>Python</em></strong>.</p>
<h3 id="heading-a-faktor-bilangan">a. Faktor bilangan</h3>
<p>Pertama-tama, kita akan tampilkan sisa hasil pembagian dari sebuah bilangan dengan angka 1 s/d bilangan itu sendiri. </p>
<pre><code>angka = <span class="hljs-number">6</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1</span>, angka + <span class="hljs-number">1</span>):
    print(<span class="hljs-string">f"<span class="hljs-subst">{angka}</span> % <span class="hljs-subst">{i}</span> = <span class="hljs-subst">{angka%i}</span>"</span>)
</code></pre><p>Luaran dari kode tersebut di atas adalah:</p>
<blockquote>
<p>6 % 1 = 0<br />
6 % 2 = 0<br />
6 % 3 = 0<br />
6 % 4 = 2<br />
6 % 5 = 1<br />
6 % 6 = 0</p>
</blockquote>
<p>Dari sini kita dapat modifikasi kode untuk dapat menampilkan bilangan yang sisa hasil baginya nol saja.</p>
<pre><code><span class="hljs-attribute">angka</span> = <span class="hljs-number">6</span>
<span class="hljs-attribute">for</span> i in range(<span class="hljs-number">1</span>, angka + <span class="hljs-number">1</span>):
    <span class="hljs-attribute">if</span> angka % i == <span class="hljs-number">0</span>:
        <span class="hljs-attribute">print</span>(i, end=<span class="hljs-string">" "</span>)

<span class="hljs-comment"># luaran = 1 2 3 6</span>
</code></pre><p>Bahkan dapat kita kompres lagi kodenya dan memasukkan datanya ke dalam sebuah <em>list</em>.</p>
<pre><code>faktor = [i <span class="hljs-keyword">for</span> i in range(<span class="hljs-number">1</span>,angka+<span class="hljs-number">1</span>) <span class="hljs-keyword">if</span> angka%i==<span class="hljs-number">0</span>]
<span class="hljs-keyword">print</span>(faktor)

<span class="hljs-comment"># luaran = [1, 2, 3, 6]</span>
</code></pre><h3 id="heading-b-hasil-perkalian">b. Hasil perkalian</h3>
<p>Berikutnya, kita akan mencoba menampilkan detail hasil perkalian dari faktor bilangan yang diperoleh.
Hasil perkalian dalam faktor bilangan melibatkan minimal 2 angka. Sebelum membahas lebih lanjut ke menampilkan hasil perkalian, berikut ini contoh faktor bilangan pada beberapa angka.</p>
<blockquote>
<p>6     = [1, 2, 3, 6] ➡️ 4 angka<br />
20   = [1, 2, 4, 5, 10, 20] ➡️ 6 angka<br />
100 = [1, 2, 4, 5, 10, 20, 25, 50, 100] ➡️ 9 angka</p>
</blockquote>
<p>Cara menemukan hasil perkalian yang paling mudah dapat dilihat pada ilustrasi berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638290275597/UrYdepfMS.png" alt="image.png" /></p>
<p>Kodenya adalah sebagai berikut.</p>
<pre><code class="lang-python">angka = <span class="hljs-number">6</span>
listOutput = []
faktor = [i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1</span>,angka+<span class="hljs-number">1</span>) <span class="hljs-keyword">if</span> angka%i==<span class="hljs-number">0</span>]
jml = len(faktor)//<span class="hljs-number">2</span> + len(faktor)%<span class="hljs-number">2</span>
<span class="hljs-keyword">for</span> i, data <span class="hljs-keyword">in</span> enumerate(faktor):
    <span class="hljs-keyword">if</span> i==jml: <span class="hljs-keyword">break</span>
    listOutput.append((faktor[i], faktor[<span class="hljs-number">-1</span>-i]))

print(listOutput)
</code></pre>
<p>Kalau variabel <code>angka</code> diisi dengan angka 6 dan 100 secara bergantian, maka luarannya adalah:</p>
<blockquote>
<p><code>#</code> angka = 6<br />
[(1, 6), (2, 3)]<br />
<br />
<code>#</code> angka = 100<br />
[(1, 100), (2, 50), (4, 25), (5, 20), (10, 10)]</p>
</blockquote>
<p>Untuk kemudahan pemanfaatan fungsional pembangkitan faktor bilangan dan menampilkan hasil perkalian, kode di atas dapat kita buat dalam bentuk fungsi.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">faktor_bilangan</span>(<span class="hljs-params">angka</span>):</span>
    listOutput = []
    faktor = [i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1</span>,angka+<span class="hljs-number">1</span>) <span class="hljs-keyword">if</span> angka%i==<span class="hljs-number">0</span>]
    jml = len(faktor)//<span class="hljs-number">2</span> + len(faktor)%<span class="hljs-number">2</span>
    <span class="hljs-keyword">for</span> i, data <span class="hljs-keyword">in</span> enumerate(faktor):
        <span class="hljs-keyword">if</span> i==jml: <span class="hljs-keyword">break</span>
        listOutput.append((faktor[i], faktor[<span class="hljs-number">-1</span>-i]))
    <span class="hljs-keyword">return</span> faktor, listOutput

angka = <span class="hljs-number">100</span>
bilFaktor, hasilKali =  faktor_bilangan(angka)
print(<span class="hljs-string">f"Bilangan faktor dari <span class="hljs-subst">{angka}</span> adalah <span class="hljs-subst">{bilFaktor}</span>"</span>)
print(<span class="hljs-string">f"Hasil perkalian = <span class="hljs-subst">{hasilKali}</span>"</span>)
</code></pre>
<p>Contoh luarannya adalah:</p>
<blockquote>
<p>Bilangan faktor dari 100 adalah [1, 2, 4, 5, 10, 20, 25, 50, 100]<br />
Hasil perkalian = [(1, 100), (2, 50), (4, 25), (5, 20), (10, 10)]</p>
</blockquote>
<h3 id="heading-c-pemeriksaan-akar-kuadrat">c. Pemeriksaan akar kuadrat</h3>
<p>Untuk membantu mempercepat penemuan faktor bilangan prima, kita harus memeriksa apakah bilangan yang ada dalam <em>list</em> faktor bilangan memilik akar kuadrat atau tidak.</p>
<p>Misalkan kita punya angka <strong>100</strong>, memiliki faktor bilangan <code>1, 2, 4, 5, 10, 20, 25, 50, 100</code>.
Dari daftar faktor bilangan tersebut, kita dapat memeriksa apakah bilangan di dalamnya ada yang memiliki akar kuadrat atau tidak. Berikut ini kodenya.</p>
<pre><code><span class="hljs-keyword">import</span> math
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">punya_akar_kuadrat</span>(<span class="hljs-params">angka</span>):</span>
    akar = math.sqrt(angka)
    kuadrat = (int(akar+<span class="hljs-number">0.5</span>) ** <span class="hljs-number">2</span> == angka)
    <span class="hljs-keyword">return</span> kuadrat

angka = <span class="hljs-number">9</span>
print(punya_akar_kuadrat(angka))
<span class="hljs-comment"># angka 9 -&gt; luaran = True</span>
<span class="hljs-comment"># angka 10 -&gt; luaran = False</span>
</code></pre><p>Untuk keperluan faktorisasi prima, fungsi akar kuadrat dimodifikasi sedemikian rupa agar dapat menampilkan nilai akarnya jika bilangan tersebut memiliki akar kuadrat. Sebaliknya, akan mengembalikan nilai <code>None</code>. Kode adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">akar_kuadrat</span>(<span class="hljs-params">angka</span>):</span>
    akar = math.sqrt(angka)
    <span class="hljs-keyword">if</span> int(akar+<span class="hljs-number">0.5</span>) ** <span class="hljs-number">2</span> == angka:
        <span class="hljs-keyword">return</span> int(akar)
    <span class="hljs-keyword">else</span>:
        <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</code></pre>
<h3 id="heading-d-faktorisasi-prima">d. Faktorisasi prima</h3>
<p>Alur proses dari faktorisasi prima adalah sebagai berikut.</p>
<ul>
<li>Masukkan angka ke <em>list</em> penampung, tetapkan <em>list</em> indeks ke nol sebagai angka masukan;</li>
<li>Cari akar kuadrat dari angka masukan jika ditemukan, kemudian dua akar diletakkan dalam sebuah <em>list</em> penampung. Misal angka masukan adalah 9, maka isi <em>list</em> penampung adalah <code>[3, 3]</code>. Kemudian, hapus data angka masukan yang pertama tadi dari <em>list</em> penampung. 
Jika tidak ditemukan akar kuadratnya, menuju langkah berikutnya;</li>
<li>Bangkitkan faktor bilangan dari angka masukan, periksa jumlah bilangan yang ada di dalamnya. Jika jumlah bilangan ada 2, berarti angka tersebut merupakan bilangan prima. Misalnya, angka 2 memiliki faktor bilangan <code>[1, 2]</code>, angka 3 memiliki faktor bilangan <code>[1, 3]</code>, dan seterusnya sesuai definisi bilangan prima. Angka tersebut selanjutnya ditambahkan ke <em>list</em> luaran akhir.</li>
<li>Jika jumlah bilangan lebih dari 2 -- yang tidak termasuk dalam bilangan prima -- maka, <em>list</em> faktor bilangan sepenuhnya ditambahkan ke <em>list</em> penampung dan hapus data angka masukan dari <em>list</em> penampung.</li>
<li>Langkah-langkah ini diulangi terus hingga <em>list</em> penampung kosong.</li>
<li>Luaran akhir akan berisi daftar hasil faktorisasi bilangan prima.</li>
</ul>
<p>Berikut ini kodenya.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">faktorisasi_prima</span>(<span class="hljs-params">angka</span>):</span>
    lstFaktorisasiPrima = []
    lstTemp = [angka]

    <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
        angka = lstTemp[<span class="hljs-number">0</span>]
        akar = akar_kuadrat(angka)
        <span class="hljs-keyword">if</span> akar:
            lstTemp.remove(angka)
            lstTemp.extend([akar, akar])
        <span class="hljs-keyword">else</span>:
            _, lstFaktor = faktor_bilangan(angka)
            <span class="hljs-keyword">if</span> len(lstFaktor)&gt;<span class="hljs-number">1</span>:
                lstTemp.remove(angka)
                lstTemp.extend(lstFaktor[<span class="hljs-number">1</span>])
            <span class="hljs-keyword">else</span>: <span class="hljs-comment"># prima</span>
                lstTemp.remove(angka)
                lstFaktorisasiPrima.append(angka)

        <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> lstTemp: <span class="hljs-keyword">break</span>
    <span class="hljs-keyword">return</span> lstFaktorisasiPrima
</code></pre>
<p>Berikut ini contoh hasil faktorisasi bilangan prima dengan angka masukan yang berbeda-beda.</p>
<blockquote>
<p>6 ➡️ [2, 3]<br />
50 ➡️ [2, 5, 5]<br />
84 ➡️ [2, 2, 3, 7]<br />
100 ➡️ [2, 5, 2, 5]<br />
1224 ➡️ [2, 2, 2, 3, 3, 17]</p>
</blockquote>
<h3 id="heading-e-penyederhanaan-hasil-faktorisasi-prima">e. Penyederhanaan hasil faktorisasi prima</h3>
<p>Inti dari faktorisasi prima sebenarnya sudah selesai, tinggal menyederhanakan tampilan dengan menggunakan tanda pangkat pada bilangan yang sama berulang lebih dari satu kali. Misalnya, angka masukan 1224, yang memiliki bilangan faktor prima <code>[2, 2, 2, 3, 3, 17]</code>; bentuk sederhananya adalah <code>2^3 x 3^2 x 17^1</code> atau <strong>2<sup>3</sup> x 3<sup>2</sup> x 17<sup>1</sup></strong>.
Kodenya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">kamus_penyederhanaan</span>(<span class="hljs-params">listFaktorPrima</span>):</span>
    kamus = Counter(listFaktorPrima)
    lst = []
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> kamus:
        lst.append(<span class="hljs-string">f"<span class="hljs-subst">{i}</span>^<span class="hljs-subst">{kamus[i]}</span>"</span>)
    <span class="hljs-keyword">return</span> lst
</code></pre>
<p>Dari hasil penggabungan fungsi-fungsi yang sudah dibuat sebelumnya, kode pemanggilannya adalah sebagai berikut.</p>
<pre><code class="lang-python">angka = <span class="hljs-number">100</span>
hasil = faktorisasi_prima(angka) 

print(<span class="hljs-string">f"Hasil faktorisasi prima dari angka <span class="hljs-subst">{angka}</span> adalah <span class="hljs-subst">{hasil}</span>"</span>)

strSederhana = <span class="hljs-string">" x "</span>.join(kamus_penyederhanaan(hasil))
print(<span class="hljs-string">f"Bentuk sederhana: <span class="hljs-subst">{strSederhana}</span>"</span>)
</code></pre>
<p>Contoh luarannya adalah:</p>
<blockquote>
<p>Hasil faktorisasi prima dari angka 100 adalah [2, 5, 2, 5]<br />
Bentuk sederhana: 2^2 x 5^2</p>
</blockquote>
<h3 id="heading-f-versi-penelusuran-pohon-faktor-rekursif">f. Versi penelusuran pohon faktor - rekursif</h3>
<p>Untuk menentukan faktorisasi prima dari suatu bilangan, kita juga dapat menggunakan sebuah alat bantu bernama pohon faktor. Mekanismenya adalah dengan membagi bilangan tersebut berturut-turut dengan bilangan prima dari yang paling kecil terlebih dahulu. Ilustrasi penelusuran pencarian faktor bilangan prima dari angka <strong>100</strong> dapat dilihat pada gambar berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1638295867661/98hxv1CYg.png" alt="image.png" /></p>
<p>Alur prosesnya adalah:</p>
<ul>
<li>Cari bilangan faktor terkecil dari angka masukan.</li>
<li>Temukan pengalinya, yang mana pengali adalah hasil pembagian antara angka masukan dan bilangan faktor pembagi.</li>
<li>Langkah-langkah ini diulang terus menerus hingga ditemukan pengali yang termasuk dalam bilangan prima. Hal ini berarti faktor bilangan terkecilnya adalah dirinya sendiri.</li>
</ul>
<p>Urutan proses penguraiannya adalah sebagai berikut.</p>
<blockquote>
<p>🟢MULAI 🟢<br />
✅angka = 100<br />
➜ faktor bilangan terkecil = 2<br />
➜ pengali = 50<br />
✅angka = 50<br />
➜ faktor bilangan terkecil = 2<br />
➜ pengali = 25<br />
✅angka = 25<br />
➜ faktor bilangan terkecil = 5<br />
➜ pengali = 5<br />
🔴STOP🔴<br />
➜ Kumpulkan semua bilangan terkecil sebelumnya ditambah pengali paling akhir.<br />
☑️Luaran = [2, 2, 5, 5]</p>
</blockquote>
<p>Fungsi rekursif diterapkan pada tahapan pencarian faktor bilangan prima terkecil.
Kode lengkapnya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">faktor_prima_rekursif</span>(<span class="hljs-params">angka, lst=[]</span>):</span>
    <span class="hljs-comment"># jika list kosong</span>
    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> lst:
        <span class="hljs-keyword">if</span> angka == <span class="hljs-number">1</span>:
            <span class="hljs-keyword">return</span> [angka]
        <span class="hljs-keyword">elif</span> angka &lt; <span class="hljs-number">1</span>:
            <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>

    <span class="hljs-comment"># pembagi adalah faktor bilangan terkecil di atas angka 1</span>
    pembagi = next(i <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">2</span>, angka+<span class="hljs-number">1</span>) <span class="hljs-keyword">if</span> angka % i == <span class="hljs-number">0</span>)

    <span class="hljs-keyword">if</span> angka == pembagi:
        lst.append(angka)
        <span class="hljs-keyword">return</span> lst

    pengali = angka // pembagi
    print(<span class="hljs-string">f"Perkalian tingkat <span class="hljs-subst">{len(lst) + <span class="hljs-number">1</span>}</span> = <span class="hljs-subst">{pembagi}</span> x <span class="hljs-subst">{pengali}</span>"</span>)

    <span class="hljs-keyword">if</span> pembagi != pengali:
        lst.append(pembagi)
        <span class="hljs-keyword">return</span> faktor_prima_rekursif(pengali)
    <span class="hljs-keyword">else</span>:
        lst.extend([pembagi, pengali])
        <span class="hljs-keyword">return</span> lst
</code></pre>
<p>Contoh luarannya (dengan ditambah pemrosesan ke bentuk sederhana seperti di bagian sebelumnya) adalah:</p>
<blockquote>
<p>Perkalian tingkat 1 = 2 x 50<br />
Perkalian tingkat 2 = 2 x 25<br />
Perkalian tingkat 3 = 5 x 5<br />
Hasil:  [2, 2, 5, 5]<br />
Bentuk sederhana: 2^2 x 5^2</p>
</blockquote>
<hr />
<h2 id="heading-3-penutup">3. Penutup</h2>
<p>Dalam bidang ilmu Matematika, bilangan prima erat kaitannya dengan tingkat pembelajaran yang lebih tinggi, seperti mencari faktor persekutuan terbesar (FPB), menyederhanakan pecahan, dan lain-lain.
Bilangan prima juga digunakan dalam ilmu kriptografi untuk melakukan enkripsi atau penyamaran data. Penerapan konsep ini memegang peranan penting dalam keamanan data, misalnya keamanan akun untuk <em>login</em> sistem, keamanan jaringan komputer, sistem keamanan bidang perbankan, dan lain sebagainya.</p>
<p>Semoga bermanfaat.</p>
<p>Terima kasih.</p>
<hr />
<p>Cek repositori di tautan berikut atau cek  <a target="_blank" href="https://galihboy.github.io/mini_projects/">demo secara daring</a> .</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/galihboy/py-mini-projects/tree/main/Faktor_Bilangan">https://github.com/galihboy/py-mini-projects/tree/main/Faktor_Bilangan</a></div>
<hr />
<p><strong><em>Catatan revisi tulisan.</em></strong></p>
<blockquote>
<p>✏️[2-12-2021]<br />
Penambahan tulisan metode penelusuran pohon faktor - rekursif.<br /><br />
✏️[1-12-2021]<br />
Metode alternatif yang sebelumnya ditulis ternyata mengandung bugs. Hal ini menyebabkan kesalahan hitungan pada angka masukan berukuran besar. Sementara saya hapus dahulu.</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[5 Metode Menghitung Jumlah Jabat Tangan (Salaman) menggunakan Python]]></title><description><![CDATA[Bismillaah Alhamdulillah,
Pada suatu waktu, saya melihat contoh soal pelajaran Matematika di internet seperti ini:

Di dalam sebuah ruangan terdapat 46 orang yang mengadakan sebuah kegiatan, selesai kegiatan mereka saling berjabat tangan. Berapa kali...]]></description><link>https://blog.galih.eu/5-metode-menghitung-jumlah-jabat-tangan-salaman-menggunakan-python</link><guid isPermaLink="true">https://blog.galih.eu/5-metode-menghitung-jumlah-jabat-tangan-salaman-menggunakan-python</guid><category><![CDATA[Python]]></category><category><![CDATA[python beginner]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[Mathematics]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Fri, 19 Nov 2021 12:58:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/9cd8qOgeNIY/upload/f12cdc6360f882cdd7dd0b54896e1784.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillah</em>,</p>
<p>Pada suatu waktu, saya melihat contoh soal pelajaran Matematika di internet seperti ini:</p>
<blockquote>
<p><em>Di dalam sebuah ruangan terdapat 46 orang yang mengadakan sebuah kegiatan, selesai kegiatan mereka saling berjabat tangan. Berapa kalikah terjadi jabat tangan atau bersalaman di antara keduanya tanpa pernah bersalaman 2 kali pada orang yang sama?</em></p>
</blockquote>
<p>Model soal seperti ini sering dibahas penyelesaiannya menggunakan teori penyelesaian barisan bilangan (barisan aritmetika) dan kombinasi. Merupakan bagian dari pelajaran Matematika di kelas 7-8 (SMP) dan/atau di tingkat SMA untuk tingkat lanjut.</p>
<p>Dalam artikel ini akan saya bahas penyelesaiannya menggunakan bahasa pemrograman <em>Python</em> melalui 5 metode berbeda, yaitu (1) <em>iterative</em>, (2) <em>recursive</em>, (3) barisan aritmetika, (4) deret aritmetika, dan (5) kombinasi.</p>
<hr />
<h1 id="heading-1-pendahuluan-jabat-tangan">1. Pendahuluan Jabat Tangan</h1>
<p>Jabat tangan dapat terjadi minimal oleh 2 orang, serta cukup dilakukan 1 kali saja. Jika dimisalkan terdapat dua orang A dan B, maka jabat tangan dapat disimbolkan dengan A-B. Dan tidak perlu disimbolkan sebaliknya, seperti B-A, karena hal ini sudah diwakili oleh A-B. Dan jika terdapat 3 orang A,B, dan C (disingkat ABC), maka jabat tangan yang terjadi sebanyak 3 kali, yaitu A-B (A dengan B), A-C (A dengan C), dan B-C (B dengan C). Bagaimana kalau 4 orang? Maka, jabat tangan yang terjadi adalah A-B, A-C, A-D, B-C, B-D, dan C-D; dengan total sebanyak 6 kali.</p>
<p>Jadi, kalau kita ringkas jumlah orang dan jabat tangan yang terjadi adalah sebagai berikut.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Jumlah orang</td><td>Simbol</td><td>Jabat tangan</td><td>Jumlah</td></tr>
</thead>
<tbody>
<tr>
<td>2</td><td>AB</td><td>A-B</td><td>1</td></tr>
<tr>
<td>3</td><td>ABC</td><td>A-B, A-C, B-C</td><td>3</td></tr>
<tr>
<td>4</td><td>ABCD</td><td>A-B, A-C, A-D, B-C, B-D, C-D</td><td>6</td></tr>
<tr>
<td>5</td><td>ABCDE</td><td>A-B, A-C, A-D, A-E, B-C, B-D, B-E, C-D, C-E, D-E</td><td>10</td></tr>
</tbody>
</table>
</div><p>Penerapan dalam pemrograman mengikuti simulasi pada gambar berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1637304235741/8zOBzvVNl.gif" alt="jml_salaman_1.gif" /></p>
<p>Dalam gambar tersebut di atas menyimulasikan relasi terjadinya jabat tangan dalam 2, 3, dan 4 orang. Kode utamanya adalah seperti ini.</p>
<pre><code class="lang-python">jml_orang = <span class="hljs-number">4</span>
jml_salaman = <span class="hljs-number">0</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1</span>, jml_orang):
    <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> range(i + <span class="hljs-number">1</span>, jml_orang + <span class="hljs-number">1</span>):
        jml_salaman += <span class="hljs-number">1</span>
        print(i,j)
print(jml_salaman)
</code></pre>
<p>Pasangan jabat tangan adalah <code>1 2, 1 3, 1 4, 2 3, 2 4, 3 4</code> dan isi jumlah salaman adalah <code>6</code>. Adapun dalam kode berikut dimodifikasi sedemikian rupa agar tampilan jabat tangan sesuai dengan rencana awal, yaitu simbol huruf abjad A, B, C, dan seterusnya.</p>
<pre><code class="lang-python"><span class="hljs-comment"># inisialisasi jumlah orang</span>
jml_orang = <span class="hljs-number">4</span>
<span class="hljs-comment"># inisialisasi simbol orang</span>
simbol_A = <span class="hljs-number">65</span>  <span class="hljs-comment"># karakter ASCII A:65, Z:91</span>
simbol_akhir = simbol_A+jml_orang<span class="hljs-number">-1</span>
<span class="hljs-comment"># jumlah orang harus lebih dari 1 dan kurang dari 27 (simbol A-Z)</span>
<span class="hljs-keyword">assert</span> <span class="hljs-number">1</span> &lt; jml_orang &lt; <span class="hljs-number">27</span>
<span class="hljs-comment"># penampung jumlah salaman, inisialisasi 0</span>
jml_salaman = <span class="hljs-number">0</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(simbol_A, simbol_akhir):
    <span class="hljs-keyword">for</span> j <span class="hljs-keyword">in</span> range(i + <span class="hljs-number">1</span>, simbol_akhir + <span class="hljs-number">1</span>):
        jml_salaman += <span class="hljs-number">1</span>
        print(<span class="hljs-string">f"<span class="hljs-subst">{chr(i)}</span>-<span class="hljs-subst">{chr(j)}</span>"</span>)

print(<span class="hljs-string">f"\nJumlah salaman yang terjadi dalam <span class="hljs-subst">{jml_orang}</span> orang = <span class="hljs-subst">{jml_salaman}</span> kali"</span>)
</code></pre>
<p>Luarannya adalah:</p>
<blockquote>
<p>A-B<br />A-C<br />A-D<br />B-C<br />B-D<br />C-D</p>
<p>Jumlah salaman yang terjadi dalam 4 orang = 6 kali</p>
</blockquote>
<p>Berikutnya kita coba bahas penyelesaian persoalan jumlah jabat tangan (salaman) ini melalui metode yang berbeda-beda.</p>
<hr />
<h1 id="heading-2-metode-penyelesaian">2. Metode Penyelesaian</h1>
<p>Terdapat 5 metode yang akan dibahas dalam hal ini, meliputi: (1) <em>iterative</em>, (2) <em>recursive</em>, (3) barisan aritmetika, (4) deret aritmetika, dan (5) kombinasi. Beberapa metode akan disampaikan teori dasar yang digunakan, dan kemudian ditambahkan contoh kode yang dapat digunakan.</p>
<h3 id="heading-a-iterative">a. <em>Iterative</em></h3>
<p>Metode <em>iterative</em> ini sebenarnya hanya memanfaatkan perulangan (atau iterasi) seperti biasa. Skema perulangan mengacu pada mekanisme penjumlahan data seperti terlihat pada tabel berikut.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Jumlah orang</td><td>Cara menjumlahkan</td><td>Jumlah jabat tangan</td></tr>
</thead>
<tbody>
<tr>
<td>2</td><td>tidak ada penjumlahan</td><td>1</td></tr>
<tr>
<td>3</td><td>1 + 2</td><td>3</td></tr>
<tr>
<td>4</td><td>1 + 2 + 3</td><td>6</td></tr>
<tr>
<td>5</td><td>1 + 2 + 3 + 4</td><td>10</td></tr>
</tbody>
</table>
</div><p>Kodenya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">Hitung_Jumlah_Salaman</span>(<span class="hljs-params">jml_orang</span>):</span>
    total = <span class="hljs-number">0</span>
    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">1</span>, jml_orang):
        total += i
    <span class="hljs-keyword">return</span> total
</code></pre>
<p>Kode tersebut dapat diringkas lagi dengan meniadakan perulangan, yaitu memanfaatkan fungsi bawaan <strong><em>sum</em></strong> untuk menghitung total nilai dari sekumpulan data nilai. Sehingga, hasil akhirnya cukup <code>total = sum(range(1, jml_orang))</code> dengan menghilangkan inisiasi peubah total dan perulangan.</p>
<h3 id="heading-b-recursive">b. Recursive</h3>
<p>Dalam metode <em>recursive</em> atau rekursif ini, kita dapat membuat fungsi yang dapat memanggil dirinya sendiri. Hal ini dapat menyederhanakan kode, walaupun akan memakan memori lebih besar untuk pemrosesan data yang besar <a target="_blank" href="https://id.wikipedia.org/wiki/Rekursi"><sup>1</sup></a> .</p>
<p>Mari kita anggap bahwa terdapat sebuah fungsi <strong>F(x)</strong> yang menerima data (parameter) masukan berupa <strong>x</strong>, yaitu jumlah orang. Jika jumlah orang diisi dengan angka 2 atau <strong>F(2)</strong>, maka luaran jumlah jabat tangan adalah 1. Jika diisi 3 atau <strong>F(3)</strong>, luarannya 3, dan seterusnya. Selanjutnya, mari kita periksa pola penghitungannya dalam tabel berikut.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Jumlah orang</td><td>Fungsi rekursif</td><td>Penjumlahan</td><td>Jumlah jabat tangan</td></tr>
</thead>
<tbody>
<tr>
<td>2</td><td>F(2)</td><td>tidak ada penjumlahan</td><td>1</td></tr>
<tr>
<td>3</td><td>F(3)</td><td>F(2) + 2 = 1 + 2</td><td>3</td></tr>
<tr>
<td>4</td><td>F(4)</td><td>F(3) + 3 = 3 + 3</td><td>6</td></tr>
<tr>
<td>5</td><td>F(5)</td><td>F(4) + 4 = 6 + 4</td><td>10</td></tr>
<tr>
<td>...</td><td></td><td></td></tr>
</tbody>
</table>
</div><p>Dari pola tersebut, kita mengetahui bahwa dengan jumlah orang sebanyak <strong>x</strong> , maka rumusnya adalah <code>F(x) = F(x-1) + (x-1)</code>. Berikut ini kodenya.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">Rekursif_Jumlah_Salaman</span>(<span class="hljs-params">jml_orang</span>):</span>
    <span class="hljs-keyword">if</span> jml_orang == <span class="hljs-number">2</span>:
        <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>
    <span class="hljs-keyword">else</span>:
        <span class="hljs-keyword">return</span> Rekursif_Jumlah_Salaman(jml_orang - <span class="hljs-number">1</span>) + (jml_orang - <span class="hljs-number">1</span>)
</code></pre>
<p>Mekanisme kerjanya dapat dilihat pada gambar berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1637307727371/Ac7xBdzXl.png" alt="image.png" /></p>
<p>Hal pengulangan fungsi yang terus-menerus inilah yang dapat menyebabkan membengkaknya kebutuhan memori seiring dengan jumlah data (dalam hal ini <em>jumlah orang</em>) yang harus diproses.</p>
<hr />
<h3 id="heading-c-barisan-aritmetika">c. Barisan Aritmetika</h3>
<p>Barisan aritmetika merupakan barisan bilangan yang mempunyai beda (selisih) yang tetap di antara suku-sukunya yang saling berdekatan, sedangkan deret aritmetika merupakan jumlah suku ke- n pertama pada barisan aritmetika <a target="_blank" href="https://www.ruangguru.com/blog/barisan-aritmatika-bertingkat-konsep-dasar-rumus-dan-contoh-soal"><sup>2</sup></a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1637308781725/cxmkWm6cU.png" alt="image.png" /></p>
<p>Jika melihat pada permasalahan menghitung jumlah jabat tangan ini, maka pendekatan yang lebih sesuai adalah pola barisan bilangan bertingkat, yaitu tingkat 2. Rumusnya adalah sebagai berikut.</p>
<blockquote>
<p>Un = an<sup>2</sup> + bn + c</p>
</blockquote>
<p>Jadi, kalau diuraikan hingga tuntas, pola barisan yang diperoleh adalah sebagai berikut. Detail teori cara penurunan (atau penguraian) rumus sila merujuk ke <a target="_blank" href="https://www.ruangguru.com/blog/barisan-aritmatika-bertingkat-konsep-dasar-rumus-dan-contoh-soal">laman web ini</a> .</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1637322324307/NT3nEC7en.png" alt="image.png" /></p>
<p>Setelah dilakukan substitusi, diperoleh nilai <code>a=0.5, b=0.5, c=0</code>. Sehingga, kalau dikembalikan ke rumus <code>Un</code> sebelumnya, dapat kita buat kodenya sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">Barisan_Aritmetika_Tingkat_2</span>(<span class="hljs-params">jml_orang</span>):</span>
    n = jml_orang - <span class="hljs-number">1</span>
    a, b, c = <span class="hljs-number">0.5</span>, <span class="hljs-number">0.5</span>, <span class="hljs-number">0</span>
    Un = a*(n**<span class="hljs-number">2</span>) + (b*n) + c
    <span class="hljs-keyword">return</span> Un
</code></pre>
<p>Nilai <strong>a</strong>, <strong>b</strong>, dan <strong>c</strong> harus selalu dihitung dan disesuaikan dengan pola baris soal yang kita miliki.</p>
<h3 id="heading-d-deret-aritmetika">d. Deret Aritmetika</h3>
<p>Untuk metode deret aritmetika ini mirip dengan penyelesaian pada metode rekursif, yaitu melihat pola penjumlahan yang menghasilkan jumlah jabat tangan.</p>
<blockquote>
<p><em>2 orang = 1<br />3 orang = 3 = (1 + 2)<br />4 orang = 6 = (1 + 2 + 3)<br />5 orang =10 = (1 + 2 + 3 + 4)<br />...<br />n orang = (1 + 2 + 3 + … + (n – 1))</em></p>
</blockquote>
<p>Dalam hal ini kita menggunakan rumus untuk menentukan jumlah bilangan pada suku ke- n.</p>
<blockquote>
<p>Sn = n/2 . (a + Un)<br />di mana:</p>
<ul>
<li><p><em>n = Un = n-1</em></p>
</li>
<li><p><em>a = suku pertama = 1</em></p>
</li>
</ul>
</blockquote>
<p>Sehingga, dapat dituliskan kodenya adalah sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">Deret_Aritmetika</span>(<span class="hljs-params">jml_orang</span>):</span>
    n = jml_orang<span class="hljs-number">-1</span>
    <span class="hljs-keyword">return</span> (n / <span class="hljs-number">2</span>) * (<span class="hljs-number">1</span> + n)
</code></pre>
<p>Rumus lain yang menghasilkan nilai yang sama adalah <code>(jml_orang**2-jml_orang)/2</code>.</p>
<h3 id="heading-e-kombinasi">e. Kombinasi</h3>
<p>Topik <em>permutasi</em> dan <em>kombinasi</em> dipelajari untuk menghitung peluang, dan sudah diajarkan untuk siswa kelas menengah atas. Teori lengkap dapat dibaca di <a target="_blank" href="https://www.zenius.net/blog/rumus-kombinasi-dan-permutasi">laman web ini</a>. Untuk menyelesaikan kasus menghitung jumlah jabat tangan, dikarenakan tidak diperlukan memperhatikan urutan siapa yang melakukan jabat tangan terlebih dahulu, maka kita akan selesaikan menggunakan metode <strong>kombinasi</strong>.</p>
<p>Rumus kombinasi:</p>
<blockquote>
<p>C(n, r) = n!/(r! (n – r)!)<br />dimana:</p>
</blockquote>
<ul>
<li><p>C(n, r) : permutasi r objek dari n objek yang ada</p>
</li>
<li><p>n : banyaknya objek keseluruhan</p>
</li>
<li><p>r : banyaknya objek yang diamati/diberi perlakuan</p>
</li>
</ul>
<p>Dalam kasus jabat tangan, <strong>n</strong> adalah jumlah orang, dan <strong>r</strong> adalah jumlah orang minimal terjadinya jabat tangan, yaitu 2 orang. Sehingga, untuk menghitung jumlah jabat tangan yang terjadi dalam 5 orang, persamaannya dapat kita tulis sebagai berikut.</p>
<blockquote>
<p>C(5,2) = 5! / (5!x3!) = 10</p>
</blockquote>
<p>Jika kita tuliskan ke bentuk kode:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> math <span class="hljs-keyword">import</span> factorial
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">Kombinasi_Salaman</span>(<span class="hljs-params">jml_orang</span>):</span>
    <span class="hljs-keyword">return</span> factorial(jml_orang) / (factorial(jml_orang - <span class="hljs-number">2</span>) * factorial(<span class="hljs-number">2</span>))
</code></pre>
<p>Fungsi <strong>factorial</strong> diimpor dari paket modul <strong>math</strong> bawaan <em>Python</em>, lebih efektif dibanding membuat fungsi faktorial sendiri walaupun memungkinkan.</p>
<hr />
<h1 id="heading-3-penutup">3. Penutup</h1>
<p>Dari kelima metode ini, setelah diterapkan dalam bahasa pemrograman <em>Python</em>, penggunaan metode jenis penerapan rumus seperti baris dan deret aritmetika dipastikan lebih cepat dibandingkan metode lain. Hal ini disebabkan pemrosesan dilakukan hanya menghitung parameter masukan pada rumus yang diacu. Hanya saja, penentuan rumus harus dicari terlebih dahulu sebelum dapat diterapkan pada kode. Sedangkan metode selainnya, di dalamnya terdapat berbagai macam komputasi yang sering kali dilakukan perulangan lebih dari satu kali.</p>
<p>Namun dengan adanya perangkat modern saat ini, perbedaan waktu komputasi belum terlalu signifikan, hanya dalam satuan mikrodetik. Berikut ini contoh hasil pengujian waktu komputasi dengan nilai jumlah orang 2000, jumlah pengujian masing-masing metode 10 kali, yang menghasilkan jumlah jabat tangan: 1999000.</p>
<blockquote>
<p>Metode 1 - Iterative<br />Waktu: [176.5 162.4 155.3 207.9 141.8 158.1 161. 160.5 158.7 160.3] mikrodetik<br />Max: 207.9, Min: 141.8, Avg: 164.25</p>
<p>Metode 2 - Rekursif<br />Waktu: [1885.1 651.5 613.2 609.7 826.7 623. 610.9 605.8 607.5 587.1] mikrodetik<br />Max: 1885.1, Min: 587.1, Avg: 762.05</p>
<p>Metode 3 - Barisan Aritmetika Bertingkat Dua<br />Waktu: [4.7 1.3 1.1 0.9 0.9 0.9 0.8 0.8 0.9 0.9] mikrodetik<br />Max: 4.7, Min: 0.8, Avg: 1.32</p>
<p>Metode 4 - Deret Aritmetika (Jumlah Suku)<br />Waktu: [2.1 1. 0.7 0.7 0.7 0.8 0.7 0.7 0.7 0.8] mikrodetik<br />Max: 2.1, Min: 0.7, Avg: 0.89</p>
<p>Metode 5 - Kombinasi (Faktorial)<br />Waktu: [518.1 495.1 488.5 489.5 485.8 487.5 487.7 488.4 447.2 356.8] mikrodetik<br />Max: 518.1, Min: 356.8, Avg: 474.46000000000004</p>
<p>Waktu tercepat: 0.700 mikrodetik, Metode: Deret Aritmetika.<br />Waktu tercepat rata-rata: 0.890 mikrodetik, Metode: Deret Aritmetika.</p>
</blockquote>
<p>Dan grafiknya adalah sebagai berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1637326309561/CJ58PUIBu.png" alt="image.png" /></p>
<p>Demikian tutorial menyelesaikan kasus menghitung jumlah jabat tangan dari sejumlah orang menggunakan 5 metode berbeda dalam <em>Python</em>. Semoga bermanfaat.</p>
<p>Terima Kasih.</p>
<hr />
<p>Kode sumber lengkap tersedia di <em>repo github</em>.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/galihboy/py-mini-projects/tree/main/Jumlah_Jabat_Tangan">https://github.com/galihboy/py-mini-projects/tree/main/Jumlah_Jabat_Tangan</a></div>
<p> </p>
<p>Demo online.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://galihboy.github.io/mini_projects/">https://galihboy.github.io/mini_projects/</a></div>
<p> </p>
<hr />
]]></content:encoded></item><item><title><![CDATA[Kuliah Machine Learning di Coursera - Seri 1. Pendahuluan]]></title><description><![CDATA[Bismillaah Alhamdulillah, 
Kuliah daring saat ini sudah banyak ditemukan di dunia maya, baik itu yang gratis maupun yang berbayar. Salah satu penyedia layanan kuliah daring yang terkenal adalah Coursera.org (untuk selanjutnya ditulis Coursera.)
Mata ...]]></description><link>https://blog.galih.eu/kuliah-machine-learning-di-coursera-seri-1-pendahuluan</link><guid isPermaLink="true">https://blog.galih.eu/kuliah-machine-learning-di-coursera-seri-1-pendahuluan</guid><category><![CDATA[Machine Learning]]></category><category><![CDATA[course]]></category><category><![CDATA[learning]]></category><category><![CDATA[Learning Journey]]></category><category><![CDATA[Self Improvement ]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Mon, 15 Nov 2021 17:28:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636983705781/S7vKaBHcb.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillah</em>, </p>
<p>Kuliah daring saat ini sudah banyak ditemukan di dunia maya, baik itu yang gratis maupun yang berbayar. Salah satu penyedia layanan kuliah daring yang terkenal adalah <strong><em>Coursera.org</em></strong> (untuk selanjutnya ditulis <strong>Coursera</strong>.)</p>
<p>Mata kuliah <a target="_blank" href="https://www.coursera.org/learn/machine-learning"><em>Machine Learning</em></a> adalah salah satu mata kuliah yang disediakan secara gratis oleh <strong>Coursera</strong>. Kuliah yang dipandu langsung oleh <em>Assoc</em>. Prof. Andrew Ng ini telah diikuti oleh 4 juta lebih siswa, dengan skor kuliah 4,9 dari 5, serta nilai silabus kuliah 97%.</p>
<p>Bahasan yang akan saya sampaikan di artikel ini adalah sebagai berikut.</p>
<ul>
<li>Pendahuluan Coursera </li>
<li>Pengenalan Mata Kuliah Machine Learning di Coursera</li>
<li>Pengajar</li>
<li>Silabus</li>
<li>Struktur Laman Web</li>
<li>Metode Pembelajaran</li>
</ul>
<hr />
<h1 id="1-pendahuluan-coursera">1. Pendahuluan Coursera</h1>
<p><strong>Coursera</strong> bermitra dengan lebih dari 200 universitas dan perusahaan terkemuka untuk menghadirkan pembelajaran daring yang fleksibel, terjangkau, dan relevan dengan pekerjaan kepada individu maupun organisasi di seluruh dunia. <strong>Coursera</strong> menawarkan berbagai kesempatan belajar—dari proyek dan kursus langsung hingga sertifikat siap kerja dan program gelar <sup> <a target="_blank" href="https://about.coursera.org/">1</a> </sup>.
Hingga saat ini terdapat sekira 82 juta siswa dari seluruh dunia yang pernah mengikuti kuliah daring di <strong>Coursera</strong>.</p>
<h3 id="a-jenis-kuliah">a)    Jenis Kuliah</h3>
<p>Terdapat 6 jenis kuliah dengan target, waktu, dan biaya yang berbeda-beda <sup> <a target="_blank" href="https://about.coursera.org/how-coursera-works/">2</a> </sup> .</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Jenis</td><td>Target</td><td>Waktu</td><td>Biaya (Dollar US)</td></tr>
</thead>
<tbody>
<tr>
<td>Proyek Terbimbing <br />(<em>Guided Projects</em>)</td><td>Mempelajari kemampuan bekerja perangkat industri secara cepat</td><td>1-2 jam</td><td>Mulai dari $9,99</td></tr>
<tr>
<td>Kuliah Umum <br />(<em>Courses</em>)</td><td>Memperoleh ilmu pengetahuan baru</td><td>4-12 jam</td><td>Gratis dan berbayar (mulai dari $29)</td></tr>
<tr>
<td>Spesialisasi <br />(<em>Specializations</em>)</td><td>Menguasai kemampuan spesifik</td><td>1-3 bulan</td><td>Mulai dari $39 per bulan</td></tr>
<tr>
<td>Sertifikat Profesional <br /> (<em>Professionals Certificate</em>)</td><td>Siap mendapatkan pekerjaan untuk karir yang sesuai permintaan</td><td>1-6 bulan</td><td>Mulai dari $39 per bulan</td></tr>
<tr>
<td>Sertifikat MasterTrack® <br /> (<em>MasterTrack® Certificates</em>)</td><td>Mendapatkan sertifikat dan kredit yang dikeluarkan universitas untuk mendapatkan gelar</td><td>4-7 bulan</td><td>Mulai dari $2000</td></tr>
<tr>
<td>Gelar <br />(<em>Degree</em>)</td><td>Memperoleh gelar sarjana atau magister (<em>master</em>)</td><td>2-4 tahun</td><td>Mulai dari $9000</td></tr>
</tbody>
</table>
</div><h3 id="b-coursera-plus">b)    Coursera Plus</h3>
<p><strong>Coursera</strong> juga menawarkan akses tak terbatas ke 3.000+ kursus kelas dunia, proyek langsung, dan program sertifikat siap kerja, dengan satu harga berlangganan yang sudah termasuk semua <sup> <a target="_blank" href="https://www.coursera.org/courseraplus">3</a> </sup>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636985187718/zEJ2RKZdu.png" alt="image.png" /></p>
<h3 id="c-kuliah-di-tingkatan-organisasi">c)    Kuliah di Tingkatan Organisasi</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Tipe</td><td><a target="_blank" href="https://www.coursera.org/business/">Bisnis</a></td><td><a target="_blank" href="https://www.coursera.org/campus/">Kampus</a></td><td><a target="_blank" href="https://www.coursera.org/government">Pemerintahan</a></td></tr>
</thead>
<tbody>
<tr>
<td>Deskripsi</td><td>Solusi pengembangan keterampilan transformatif untuk memberdayakan tim dalam organisasi dengan keterampilan berdampak tinggi yang mendorong inovasi, daya saing, dan pertumbuhan.</td><td>Memberdayakan universitas mana pun untuk menawarkan pendidikan daring yang relevan dengan pekerjaan dan tersedia kredit (sks)* kepada mahasiswa, dosen, dan staf.</td><td>Membantu pemerintah dan organisasi menyediakan keterampilan yang dibutuhkan dan jalur pembelajaran untuk pekerjaan baru bagi seluruh angkatan kerja, dan mengimplementasikan program pembelajaran skala nasional.</td></tr>
<tr>
<td>Manfaat</td><td>·) memberikan pembelajaran transformatif dengan program pembelajaran berbasis AI yang dikuratori oleh pakar. <br />·) mengaktifkan pembelajaran langsung untuk mendorong perolehan keterampilan yang cepat.<br />·) melacak dan mengukur pengembangan keterampilan dan tolok ukur kemahiran terhadap rekan-rekan industri.</td><td>·) mempromosikan kemampuan kerja siswa dengan mengajarkan keterampilan yang dibutuhkan untuk bidang dengan pertumbuhan tinggi. <br />·) membantu siswa menguasai keterampilan siap kerja dengan Proyek Terpandu, tugas pemrograman, dan penilaian dalam kursus daring, luring, dan melalui seluler. <br />·) memungkinkan pengajar untuk membuat proyek, penilaian, dan kursus yang disesuaikan dengan kebutuhan pelajar.</td><td>·) mengembangkan jalur karir yang relevan secara lokal dan menghubungkan pelajar dengan pemberi kerja regional. <br />·) membangun ekosistem perekrutan sendiri dengan menulis konten. <br />·) meningkatkan kemampuan tenaga kerja agar siap kerja.</td></tr>
</tbody>
</table>
</div><h1 id="2-pengenalan-mata-kuliah-machine-learning-di-coursera">2. Pengenalan Mata Kuliah Machine Learning di Coursera</h1>
<p><em>Machine Learning</em> atau pembelajaran mesin adalah ilmu untuk membuat komputer bertindak tanpa diprogram secara eksplisit. Dalam dekade terakhir, pembelajaran mesin telah memberi kita mobil <em>self-driving</em>, pengenalan ucapan praktis, pencarian web yang efektif, dan pemahaman yang jauh lebih baik tentang genom manusia. Pembelajaran mesin begitu meresap hari ini sehingga kita mungkin menggunakannya puluhan kali sehari tanpa menyadarinya. Banyak peneliti juga berpikir ini adalah cara terbaik untuk membuat kemajuan menuju kecerdasan buatan setingkat manusia. </p>
<p>Di kelas ini, siswa akan belajar tentang teknik pembelajaran mesin yang paling efektif, dan berlatih menerapkannya dan membuatnya bekerja untuk kepentingan siswa itu sendiri. Lebih penting lagi, siswa akan belajar tentang tidak hanya dasar-dasar teoritis pembelajaran, tetapi juga mendapatkan pengetahuan praktis yang diperlukan untuk menerapkan teknik ini dengan cepat dan kuat pada masalah baru. Terakhir, siswa akan belajar tentang beberapa praktik terbaik di <em>Silicon Valley</em> dalam inovasi yang berkaitan dengan pembelajaran mesin dan kecerdasan buatan.</p>
<p>Kursus yang ditawarkan oleh Universitas Stanford di Amerika Serikat ini memberikan pengantar yang luas untuk pembelajaran mesin, penggalian data (<em>data mining</em>), dan pengenalan pola (<em>pattern recognition</em>) statistik. Topik yang diajarkan meliputi: </p>
<ol>
<li><em>Supervised Learning</em> atau pembelajaran yang diawasi, seperti: algoritma parametrik / non-parametrik, mesin vektor pendukung (<em>support vector machine</em>), <em>kernel</em>, jaringan saraf tiruan (<em>artificial neural networks</em>). </li>
<li><em>Unsupervised Learning</em> atau pembelajaran tanpa pengawasan, seperti: pengelompokan (<em>clustering</em>), pengurangan dimensi (<em>dimensionality reduction</em>), sistem rekomendasi, pembelajaran mendalam (<em>deep learning</em>). </li>
<li>Praktik terbaik dalam pembelajaran mesin (teori bias/varians; proses inovasi dalam pembelajaran mesin dan kecerdasan buatan). Kursus ini juga akan diambil dari berbagai studi kasus dan aplikasi, sehingga siswa juga akan belajar bagaimana menerapkan algoritma pembelajaran untuk membangun robot pintar (persepsi, kontrol), pemahaman teks (pencarian web, anti-spam), visi komputer, informatika medis , audio, penambangan basis data, dan area lainnya.</li>
</ol>
<p>Dalam video terdapat fitur pengaturan teks <em>subtitle</em>, seperti bahasa Inggris, Indonesia (sebagian), Arab, dan lain-lain.</p>
<h1 id="3-pengajar">3. Pengajar</h1>
<p>Dipandu langsung oleh <em>Adjunct Professor</em> dari Universitas Stanford.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636986192844/6Tuxg63gg.png" alt="image.png" /></p>
<h1 id="4-silabus">4. Silabus</h1>
<p>Silabus lengkap ada di  <a target="_blank" href="https://www.coursera.org/learn/machine-learning#syllabus">laman web</a> . Garis besarnya adalah sebagai berikut.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Pekan</td><td>Topik</td><td>Bahan Kuliah</td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td>Pendahuluan</td><td>5 video, 9 bacaan, 1 kuis</td></tr>
<tr>
<td></td><td>Regresi linier dengan satu peubah (<em>variable</em>)</td><td>7 video, 8 bacaan, 1 kuis</td></tr>
<tr>
<td></td><td>Ulasan aljabar linier</td><td>6 video, 7 bacaan, 1 kuis</td></tr>
<tr>
<td>2</td><td>Regresi linier dengan banyak peubah (<em>variable</em>)</td><td>8 video, 16 bacaan, 1 kuis</td></tr>
<tr>
<td></td><td>Tutorial  <a target="_blank" href="https://www.gnu.org/software/octave/index">Octave</a> / <a target="_blank" href="https://www.mathworks.com/products/matlab.html">Matlab </a></td><td>6 video, 2 bacaan, 1 kuis, 1 tugas pemrograman</td></tr>
<tr>
<td>3</td><td>Regresi logistik</td><td>7 video, 8 bacaan, 1 kuis</td></tr>
<tr>
<td></td><td>Regularization</td><td>4 video, 5 bacaan, 1 kuis, 1 tugas pemrograman</td></tr>
<tr>
<td>4</td><td><em>Neural Networks: Representation</em></td><td>7 video, 6 bacaan, 1 kuis, 1 tugas pemrograman</td></tr>
<tr>
<td>5</td><td><em>Neural Networks: Learning</em></td><td>8 video, 8 bacaan, 1 kuis, 1 tugas pemrograman</td></tr>
<tr>
<td>6</td><td>Nasehat dalam penerapan pembelajaran mesin</td><td>7 video, 7 bacaan, 1 kuis, 1 tugas pemrograman</td></tr>
<tr>
<td></td><td>Desain sistem pembelajaran mesin</td><td>5 video, 3 bacaan, 1 kuis</td></tr>
<tr>
<td>7</td><td><em>Support Vector Machines</em></td><td>6 video, 1 bacaan, 1 kuis, 1 tugas pemrograman</td></tr>
<tr>
<td>8</td><td><em>Unsupervised Learning</em></td><td>5 video, 1 bacaan, 1 kuis</td></tr>
<tr>
<td></td><td><em>Dimensionality Reduction</em></td><td>7 video, 1 bacaan, 1 kuis, 1 tugas pemrograman</td></tr>
<tr>
<td>9</td><td><em>Anomaly Detection</em></td><td>8 video, 1 bacaan, 1 kuis</td></tr>
<tr>
<td></td><td><em>Recommender Systems</em></td><td>6 video, 1 bacaan, 1 kuis, 1 tugas pemrograman</td></tr>
<tr>
<td>10</td><td>Pembelajaran mesin skala besar</td><td>6 video, 1 bacaan, 1 kuis</td></tr>
<tr>
<td>11</td><td>Aplikasi OCR (<em>optical character recognition</em>)</td><td>5 video, 1 bacaan, 1 kuis</td></tr>
</tbody>
</table>
</div><h1 id="5-struktur-laman-web">5. Struktur Laman Web</h1>
<p>Setelah memasuki laman web perkuliahan, di bagian sebelah kiri halaman ada menu seperti pada gambar berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636987340665/q3YmSB1Yk.png" alt="image.png" /></p>
<ul>
<li><strong><em>Overview</em></strong>, menampilkan daftar perkembangan belajar di tiap pekan. Termasuk pencatatan menonton video, membaca (atau unduh bacaan), kuis, dan (jika ada) tugas pemrograman. Terdapat juga informasi batas waktu pengerjaan kuis dan tugas pemrograman, serta nilai (<em>grade</em>) yang diperoleh jika sudah mengerjakan.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636987617591/YY_xAunto.png" alt="image.png" />
<strong>Catatan</strong>: kuis dapat diulang sebanyak 3x setiap 8 jam dengan syarat lulus dapat nilai minimal 80%, tugas pemrograman dapat diunggah ulang untuk revisi (nilai diambil dari tugas dengan nilai tertinggi), dan batas waktu pengumpulan tugas biasanya setiap hari Senin, 13.59 WIB.</li>
<li><strong><em>Grades</em></strong>, menyimpan data nilai dan status kelulusan di setiap materi yang ada di tiap pekannya. Nilai diambil dari kuis dan tugas pemrograman yang masing-masing punya bobot tertentu. Serta ada juga informasi batas waktu pengumpulan atau pengerjaan tugasnya. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636990643482/BJ8sB9PyF.png" alt="image.png" />
Jika karena sesuatu hal tidak mampu mengerjakan (atau mengumpulkan) tugas tepat pada waktunya, sebaiknya batas waktu pengumpulan di-<em>reset</em> atau disetel ulang. </li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636990928654/ajFom3W2X.jpeg" alt="Grade - reset deadline tombol.jpg" />
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636990712540/k2SfecwUp.jpeg" alt="Grade - reset deadline.jpg" /></p>
<ul>
<li><strong><em>Notes</em></strong>, menyimpan data catatan atau coretan kita ketika menonton video tertentu pada waktu tertentu. Hal ini dapat dilakukan ketika kita menemukan materi dalam video dan kita ingin menandainya dengan catatan yang kita anggap penting.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636991176708/cxAKIY_53.png" alt="image.png" /></li>
<li><strong><em>Discussion Forums</em></strong>, merupakan wadah diskusi atau tanya jawab terkait kegiatan perkuliahan. Misalnya, bertanya materi tertentu yang butuh penjelasan lebih lanjut, menanyakan soal dalam kuis/tugas yang masih belum dimengerti, gagal dalam unggah tugas, dan lain-lain. Bagusnya membaca dulu diskusi-diskusi sebelumnya sebelum melontarkan pertanyaan baru. Biasanya permasalahan yang dihadapi siswa sudah pernah terjadi dan sudah ada jawabannya di situ.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636991422087/OvGWrz6lo.png" alt="image.png" />
Contoh diskusi.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636991647881/QpOb3-x2R.png" alt="image.png" /></li>
<li><strong><em>Messages</em></strong>, merupakan arsip pesan masuk dari Coursera ke siswa.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636991738734/Pe03u1PPo.png" alt="image.png" /></li>
<li><strong><em>Resources</em></strong>, menampung informasi beraneka ragam, seperti: tips dan trik pengerjaan tugas, catatan tambahan materi pekanan, revisi materi, tutorial pemrograman, dll.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636991961596/tGZo4L_75.jpeg" alt="resources.jpg" /></li>
<li><strong><em>Course Info</em></strong>, berisi informasi dasar terkait kursus yang diberikan, pertanyaan dan jawaban (<em>FAQs</em>) terkait kuliah dan pengerjaan (atau pengumpulan) tugas.</li>
</ul>
<h1 id="6-metode-pembelajaran">6. Metode Pembelajaran</h1>
<p>Dalam setiap pekannya, siswa akan mendapat materi video, bacaan (fail presentasi), kuis, dan/atau tugas pemrograman sesuai dengan materi tertentu yang diajarkan.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636992536278/03y8Sbhpa.png" alt="image.png" />
Jika video sudah ditonton, fail presentasi sudah diunduh (dan dibaca); maka, status perkembangan belajar menjadi "<strong><em>Done</em></strong>." Dan untuk kuis dan/atau tugas pemrograman yang mendapat nilai minimal 80% akan mendapat tanda centang hijau yang berarti lulus dan dapat melanjutkan ke materi (pekan) berikutnya.</p>
<ul>
<li><h3 id="video-belajar">Video belajar.</h3>
Selain menonton video, siswa dapat menyetel ukuran kualitas video, kecepatan pemutaran, <em>subtitle</em>, melihat transkrip, unduh video (dan <em>subtitle</em>), maupun membuat catatan.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636993102523/ws1mlmNXK.jpeg" alt="video belajar.jpg" />
<strong>Catatan</strong>: tidak setiap materi tersedia <em>subtitle</em> bahasa Indonesia; munculnya <em>subtitle</em> sering kali memotong (makan tempat) video tutorial bagian bawah, sehingga tulisan/coretan <em>presenter</em> jadi tertutupi.</li>
<li><h3 id="kuis-kecil">Kuis kecil.</h3>
Di setiap video selalu ada kuis kecil di tengah-tengah atau menjelang akhir tutorial. Yaitu berupa pilihan ganda yang muncul 1 atau 2 kali, tergantung materi. Tidak berpengaruh ke nilai akhir, dan dapat diperbaiki terus menerus jika jawaban salah; atau bahkan dilewati (<em>skip</em>). Baiknya dijawab saja sampai betul dan dimengerti jawabannya.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636993591946/nGW0gnTJM.png" alt="image.png" /></li>
<li><h3 id="kuis-pekanan">Kuis pekanan.</h3>
Setiap pekan selalu disertai 1 atau 2 kali kuis, tergantung banyaknya materi yang diajarkan. Tipe kuis berupa (a) pilihan ganda (pilih satu jawaban benar/salah); (b) <em>multiple checkbox</em> (banyak pilihan); (c) isian sederhana berupa (<em>textbox</em>) yang hanya bisa diisi angka, misalnya jumlah item, jumlah <em>hidden layer</em>, dan sejenisnya.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636994388341/BjtrMnFDd.png" alt="image.png" />
Kuis dapat dilakukan ulang jika belum memenuhi syarat lulus atau sekadar ingin memperbaiki nilai. Dan jangan lupa baca <em>feedback</em>-nya dulu sebelum mengulang kuis.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636994520936/l4WsSz0wk.png" alt="image.png" /></li>
<li><h3 id="tugas-pemrograman">Tugas pemrograman.</h3>
Tugas yang diberikan adalah berupa kode sumber (dan data set untuk materi tertentu) dalam format file <strong>.m</strong> yang dapat dieksekusi dalam aplikasi <a target="_blank" href="https://www.gnu.org/software/octave/index">Octave</a> atau <a target="_blank" href="https://www.mathworks.com/products/matlab.html">Matlab </a>. <em>Octave</em> adalah aplikasi yang menyerupai <em>Matlab</em> tapi versi gratis.
Unduh dulu failnya di tautan yang diberikan.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636994966705/7GJhwIhZt.png" alt="image.png" />
Soal ditulis di fail <strong>.pdf</strong>, dalam hal ini contohnya adalah: <strong>ex6.pdf</strong>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636995223499/Q-8mc_WjDd.png" alt="image.png" />
Berikut ini contoh potongan isi file <strong>.pdf</strong> tersebut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636995442589/0q94tY3Od.jpeg" alt="tugas pemrograman.jpg" />
Fail yang bertanda <strong>[*]</strong> itulah yang harus dimodifikasi kode sumber di dalamnya, dilengkapi sesuai petunjuk soal, dan dikumpulkan.
Jika merasa sudah lengkap, jalankan perintah <strong>submit</strong> (yakni mengeksekusi fail <strong>submit.m</strong>), nanti otomatis akan ditanya email dan tokennya.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636995988643/9BsuFnb8T.png" alt="image.png" />
<em>Token</em> dapat dibuat di halaman instruksi tugas pemrograman sebelumnya.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636996160804/qj-k2gFQx.png" alt="image.png" />
Kalau sudah melakukan <strong><em>submission</em></strong>, coba cek di halaman tugas pemrograman pada menu tab <code>My submissions</code>, apakah unggahannya sudah lengkap atau belum. Begitu juga skor perolehan dan status lulus atau tidaknya.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636996517561/08wTBJnEP.png" alt="image.png" /></li>
</ul>
<p>Status tugas pemrograman lengkapnya dapat dilihat pada gambar berikut. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636996917234/Qo7BC0K3Dg.jpeg" alt="status tugas.jpg" /></p>
<p>Demikian metode pembelajaran yang ditemui di kuliah <em>Machine Learning</em>, <strong>Coursera</strong>.</p>
<hr />
<p>Di seri 2 nanti akan saya tuliskan tips dan trik menyelesaikan kuliah dan mengerjakan tugas dengan sukses, serta bagaimana cara mendapatkan bantuan keuangan (<em>financial aid</em>) untuk mendapatkan sertifikat kelulusan secara gratis.</p>
<p>Terima kasih.</p>
]]></content:encoded></item><item><title><![CDATA[Pindah Blog dari Medium ke Hashnode]]></title><description><![CDATA[Bismillaah Alhamdulilllah,
Akhirnya saya memutuskan memindahkan dari Medium ke Hashnode dengan berbagai macam pertimbangan, sebagaimana yang sudah saya tulis di tulisan awal.
https://blog.galih.eu/mencoba-hashnode-untuk-pertama-kali
Untuk memindahkan...]]></description><link>https://blog.galih.eu/pindah-blog-dari-medium-ke-hashnode</link><guid isPermaLink="true">https://blog.galih.eu/pindah-blog-dari-medium-ke-hashnode</guid><category><![CDATA[medium]]></category><category><![CDATA[Hashnode]]></category><category><![CDATA[blog]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Sat, 13 Nov 2021 12:50:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636805063745/_2pY0nFwa.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulilllah,</em></p>
<p>Akhirnya saya memutuskan memindahkan dari <em>Medium</em> ke <em>Hashnode</em> dengan berbagai macam pertimbangan, sebagaimana yang sudah saya tulis di tulisan awal.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://blog.galih.eu/mencoba-hashnode-untuk-pertama-kali">https://blog.galih.eu/mencoba-hashnode-untuk-pertama-kali</a></div>
<p>Untuk memindahkan tulisan dari platform Medium ke Hashnode sudah disediakan alatnya oleh pihak Hashnode. Garis besarnya adalah:</p>
<ol>
<li>Ekspor data tulisan di Medium</li>
<li>Impor data tulisan di Hashnode</li>
</ol>
<hr />
<h2 id="1-ekspor-data">1. Ekspor data</h2>
<ul>
<li>Login di Medium.</li>
<li><p>Pergi ke bagian Settings.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636805905499/94dDa5bzD.png" alt="image.png" /></p>
</li>
<li><p>Klik submenu <em>Account</em> di bagian kiri halaman atau digeser ke bawah hingga menemukan informasi <code>Download your information</code>. Tekan tombol <code>Download .zip</code>. Nanti akan dikirimkan failnya ke email kita.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636805814390/tacxZLe-x.png" alt="image.png" /></p>
</li>
<li><p>Ini contoh data yang dikirim ke email.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636806116649/wkc71iPPj.png" alt="image.png" /></p>
</li>
<li><p>Unduh dan simpan failnya, tidak perlu diekstrak.</p>
<pre><code class="lang-text">medium-export-2de80ec2c...zip
</code></pre>
</li>
</ul>
<hr />
<h2 id="2-impor-data">2. Impor data</h2>
<ul>
<li>Login ke Hashnode</li>
<li>Masuk ke <code>Blog Dashboard</code></li>
<li><p>Pilih menu <code>Import</code>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636806417336/wK64XqWno.png" alt="image.png" /></p>
</li>
<li><p>Pilih menu <code>Medium Importer</code> dan unggah fail <strong><em>.zip</em></strong> yang sudah diunduh sebelumnya.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636806515406/gJkgNG_pg.png" alt="image.png" /></p>
<ul>
<li>Berdasarkan info di  <a target="_blank" href="https://hashnode.com/post/import-your-medium-stories-to-hashnode-in-5-steps-ckmahbxl4008bubs1e2ff1pj7">laman web ini</a>, kalau berhasil akan muncul tampilan seperti berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1615804317252/wHz9wB6-m.png?auto=compress" alt="image.png" /></li>
</ul>
</li>
<li><p>Punya saya gagal, sehingga memunculkan gambar seperti ini.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636806769818/WGTw8Q9Mc.png" alt="image.png" /></p>
</li>
</ul>
<hr />
<h2 id="3-impor-via-rss">3. Impor via RSS</h2>
<ul>
<li><p>Di halaman <code>Import</code>, pilih menu <code>RSS Importer</code>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636806882173/A9vMondUi.png" alt="image.png" /></p>
</li>
<li><p>Siapkan alamat <em>feed</em> (RSS) di blog Medium yang lama. Berdasarkan informasi di  <a target="_blank" href="https://help.medium.com/hc/en-us/articles/214874118-Using-RSS-feeds-of-profiles-publications-and-topics">laman web ini</a>, blog medium kita juga punya RSS.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636806974548/aBWD_vWbU.png" alt="image.png" /> </p>
</li>
</ul>
<p>Kalau punya saya ada di sini <code>https://masgalih.medium.com/feed</code>.</p>
<ul>
<li><p>Alamat RSS itu yang digunakan untuk impor data.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636807267152/Ew0O29oOX.png" alt="image.png" /></p>
</li>
<li><p>Dan akhirnya tulisan saya di Medium berhasil dibaca.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636807335416/6s4Nb7_uh.png" alt="image.png" />
Pilih <code>Publish to Blog</code> kalau ingin langsung diterbitkan di blog Hashnode kita, atau pilih <code>Import as Drafts</code> jika disimpan dulu sebagai draf tulisan yang nantinya dapat diubah lagi sebelum diterbitkan.</p>
</li>
<li><p>Saya mencontohkan pilih yang <code>Import as Drafts</code>. Hasilnya seperti pada gambar berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636807575120/9zhal6BJb.png" alt="image.png" /></p>
</li>
<li><p>Selanjutnya dapat dicek setiap tulisan tersebut sebagai draf.</p>
</li>
</ul>
<hr />
<p>Video tutorial dapat dilihat di sini.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/dVfyrI7TZtM">https://youtu.be/dVfyrI7TZtM</a></div>
<hr />
<p>Demikian cerita pengalaman memindahkan data tulisan dari <strong>Medium</strong> ke <strong>Hashnode</strong>.</p>
<p>Semoga Bermanfaat!</p>
<p>Terima kasih.</p>
]]></content:encoded></item><item><title><![CDATA[Mendaftarkan Web di Google Search Console]]></title><description><![CDATA[Bismillaah Alhamdulillah,
Setelah melakukan pengaturan custom domain pada tutorial sebelumnya, kita dapat langsung mendaftarkan blog kita ke perangkat Webmaster kepunyaan Google yang sering disebut dengan  Webmaster Tools. Salah satu fitur yang dised...]]></description><link>https://blog.galih.eu/mendaftarkan-web-di-google-search-console</link><guid isPermaLink="true">https://blog.galih.eu/mendaftarkan-web-di-google-search-console</guid><category><![CDATA[Google]]></category><category><![CDATA[cloudflare]]></category><category><![CDATA[Hashnode]]></category><category><![CDATA[search]]></category><category><![CDATA[web]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Thu, 11 Nov 2021 16:36:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636641291573/4HKmv-e18.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillah,</em></p>
<p>Setelah melakukan pengaturan <em>custom domain</em> pada tutorial sebelumnya, kita dapat langsung mendaftarkan blog kita ke perangkat <em>Webmaster</em> kepunyaan <em>Google</em> yang sering disebut dengan  <a target="_blank" href="https://www.google.com/intl/id_id/webmasters/">Webmaster Tools</a>. Salah satu fitur yang disediakan adalah <a target="_blank" href="https://search.google.com/search-console?hl=id"><em>Google Search Console</em></a>, yang berkaitan dengan pengindeksan alamat tautan artikel yang ada dalam sebuah <em>website</em>.</p>
<blockquote>
<p>Google Search Console adalah layanan gratis yang ditawarkan oleh Google untuk membantu Anda memantau, mempertahankan, dan memecahkan masalah kehadiran situs Anda di hasil Google Penelusuran. Anda tidak harus mendaftar ke Search Console agar situs Anda dicantumkan di hasil Google Penelusuran, namun Search Console dapat membantu Anda memahami dan meningkatkan cara Google melihat situs Anda.</p>
<p>Search Console menawarkan fitur dan laporan untuk tindakan berikut:</p>
<ul>
<li>Memastikan bahwa Google dapat menemukan dan meng-crawl situs Anda.</li>
<li>Memperbaiki masalah pengindeksan dan meminta pengindeksan ulang untuk konten baru atau yang diperbarui.</li>
<li>Melihat data traffic Google Penelusuran untuk situs Anda: seberapa sering situs Anda muncul di Google Penelusuran, kueri penelusuran mana yang memunculkan situs Anda, seberapa sering penelusur mengklik untuk kueri tersebut, dan banyak lagi.</li>
<li>Menerima pemberitahuan saat Google menemukan masalah pengindeksan, spam, atau masalah lainnya di situs Anda.</li>
<li>Menampilkan situs mana saja yang menaut ke situs Anda.</li>
<li>Memecahkan masalah terkait AMP, kegunaan seluler, dan fitur Penelusuran lainnya.</li>
</ul>
</blockquote>
<h2 id="berikut-ini-langkah-langkah-pendaftaran-laman-web-ke-google-search-console">Berikut ini langkah-langkah pendaftaran laman web ke <em>Google Search Console</em>.</h2>
<ul>
<li><p>Buka laman web <a target="_blank" href="https://search.google.com/search-console?hl=id"><em>Google Search Console</em></a> dan silakan login menggunakan akun <em>Google</em> yang sudah dimiliki.</p>
</li>
<li><p>Di bagian kiri atas halaman dapat diklik untuk mendaftarkan alamat web baru, dengan mengklik tautan <code>+ Tambahkan properti</code>. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636642668800/KZfRiYJVC.jpeg" alt="2. tambah properti.jpg" /></p>
</li>
<li><p>Berikutnya, akan muncul form pengisian jenis properti. Kalau Anda ingin mendaftarkan semua subdomain dari domain utama, pilih form <strong>Domain (baru)</strong> yang ada di sebelah kiri. Sedangkan jika hanya ingin mendaftarkan sebuah subdomain saja, maka pilih form sebelah kanan. Untuk kasus yang saya miliki lebih sesuai memilih form yang kanan, yaitu <strong>Awalan URL</strong>. Selanjutnya, saya tuliskan nama tautan lengkap yang saya inginkan, yaitu <code>https://blog.galih.eu/</code>. Klik tombol <strong>Terus</strong>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636646363795/ltNyWhCDm.jpeg" alt="3. pilih jenis properti.jpg" /></p>
</li>
<li><p>Setelah itu, akan muncul halaman tata cara melakukan verifikasi. Terdapat 6 cara melakukan verifikasi yang dapat dilakukan. Pada umumnya yang paling mudah adalah cara nomor 1 dan 2. Sedangkan untuk model hosting blog di Hashnode, yang lebih sesuai adalah cara nomor 6.
Daftar cara verifikasi secara lengkap berdasarkan laman  <a target="_blank" href="https://support.google.com/webmasters/answer/9008080?hl=id">dukungan Google</a>  dapat dilihat pada tabel berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636646855795/92l-pO33l.png" alt="image.png" /></p>
</li>
<li><p>Verifikasi kepemilikan yang akan saya lakukan adalah mengikuti cara nomor 6, yaitu <strong>Penyedia nama domain</strong>. Berikut ini informasi yang tersedia. Jangan dahulu tekan tombol verifikasi. Lakukan langkah selanjutnya terlebih dahulu.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636647342026/ImrIOqvY9.jpeg" alt="4. verifikasi kepemilikan.jpg" /></p>
</li>
<li><p>Selanjutnya, saya lakukan penambahan rekaman <strong>DNS</strong> tipe <strong>TXT</strong> melalui laman web <em>Cloudflare.com</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636647352974/YOoKa0gX7.jpeg" alt="5. dns management.jpg" /></p>
</li>
<li><p>Langkah berikutnya adalah kembali ke halaman verifikasi kepemilikan di Google, kemudian tekan tombol <strong>VERIFIKASI</strong>. Jika sukses akan muncul tampilan seperti pada gambar berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636647581703/-oB1I7YsD.jpeg" alt="6. verifikasi kepemilikan ok.jpg" /></p>
</li>
<li><p>Berikutnya, kita akan mendaftarkan peta situs ke <em>Google Search Console</em>. Pertama-tama, buka halaman <em>dashboard</em> di <em>Hashnode</em>, pilih menu <strong>SEO</strong>. Salin alamat peta situs (<em>sitemap</em>) tersebut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636647765650/4MmoEtAW4.jpeg" alt="7. blog sitemap.jpg" /></p>
</li>
<li><p>Buka lagi halaman <em>Google Search Console</em>, klik pada menu <strong>Peta Situs</strong> yang ada di bagian kiri halaman. Masukkan alamat tautan yang tadi disalin (bagian fail <strong>.XML</strong>) di kotak teks <strong>Tambahkan peta situs baru</strong>. Dan tekan tombol <strong>Kirim</strong>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636648048920/RuFs5aPiQ.jpeg" alt="8. google - peta situs - sitemap.jpg" /></p>
</li>
<li><p>Selanjutnya, akan muncul tampilan seperti pada gambar berikut. Menunjukkan peta situs berhasil dibaca dan sudah terdaftar.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636648134183/GyaC42JR_.jpeg" alt="9. google - peta situs - terkirim.jpg" /></p>
</li>
<li><p>Dan terakhir, kalau kita klik tautan fail tersebut, akan muncul informasi seperti pada gambar berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636648213510/g4bjVIRdp.jpeg" alt="10. google - peta situs - terproses.jpg" /></p>
</li>
</ul>
<p>Seluruh tahap pendaftaran laman web di <em>Google Search Console</em> sudah selesai. Selanjutnya, di masa mendatang Anda dapat memeriksa laman ini untuk memeriksa kinerja penelusuran pada web yang dimiliki.</p>
<p>Semoga bermanfaat.</p>
<p>Terima kasih.</p>
<p><a target="_blank" href="https://galih.eu">Web Utama</a> <strong>·</strong>  <a target="_blank" href="https://blog.galih.eu">Blog</a>  <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/">Github Pages</a> <strong>·</strong> <a target="_blank" href="https://masgalih.medium.com/">Medium</a></p>
]]></content:encoded></item><item><title><![CDATA[Pengaturan Custom Domain Hashnode Via Cloudflare]]></title><description><![CDATA[Bismillah Alhamdulillaah,
Pembuatan blog di Hashnode secara default memungkinkan pengguna memiliki halaman web dengan nama sub domain yang menempel di TLD (top level domain) Hashnode.dev, misalnya: namaBlog.hashnode.dev. Bagaimana kalau kita ingin me...]]></description><link>https://blog.galih.eu/pengaturan-custom-domain-hashnode-via-cloudflare</link><guid isPermaLink="true">https://blog.galih.eu/pengaturan-custom-domain-hashnode-via-cloudflare</guid><category><![CDATA[Hashnode]]></category><category><![CDATA[domain]]></category><category><![CDATA[cloudflare]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Thu, 11 Nov 2021 13:25:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636637814997/42j7bSRZM.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillah Alhamdulillaah,</em></p>
<p>Pembuatan blog di <em>Hashnode</em> secara <em>default</em> memungkinkan pengguna memiliki halaman web dengan nama sub domain yang menempel di <strong><em>TLD</em></strong> (<em>top level domain</em>) <strong>Hashnode.dev</strong>, misalnya: <code>namaBlog.hashnode.dev</code>. Bagaimana kalau kita ingin memberikan atau mengganti alamat web tersebut dengan domain <em>TLD</em> yang kita miliki, seperti: <code>galih.eu</code> atau menjadi sebuah sub domain di halaman web utama yang sudah kita miliki, misalnya: <code>blog.galih.eu</code> ? Hal ini dapat dilakukan melalui sebuah pengaturan bernama <strong><em>Custom Domain</em></strong> yang merupakan salah satu fitur gratis yang disediakan oleh <em>Hashnode</em>.</p>
<p>Jadi, materi tutorial yang akan dibahas dalam artikel ini mencakup:</p>
<ol>
<li>Pengaturan <em>custom domain</em> di <em>Hashnode</em>,</li>
<li>Pengaturan penambahan rekaman DNS di <em>Cloudflare</em>,</li>
<li>Pemeriksaan propagasi <strong><em>DNS</em></strong> melalui <em>Whatsmydns.net</em>, dan</li>
<li>Uji coba buka blog baru.</li>
</ol>
<hr />
<h1 id="1-pengaturan-custom-domain-di-hashnode">1. Pengaturan <em>custom domain</em> di <em>Hashnode</em>.</h1>
<ul>
<li>Pertama-tama lakukan <em>login</em> di halaman web <em>Hashnode.com</em></li>
<li><p>Jika sudah masuk, klik foto profil di bagian bawah kiri halaman, nanti akan memunculkan sebuah menu. Pilih menu <em>Blog Dashboard</em>. 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636632925373/HOLryuCxg.png" alt="image.png" /></p>
</li>
<li><p>Di bagian kiri halaman halaman, agak bawah klik menu <em>Domain</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636633106507/uoa_agve1.png" alt="image.png" /></p>
</li>
<li><p>Tampilan awal berupa pengaturan nama sub domain kita sebelumnya, dan selanjutnya klik tab menu <em>Custom Domain</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636633440849/wNq1j0VoC.png" alt="image.png" /></p>
</li>
<li><p>Kemudian tuliskan nama lengkap blog baru kita (baik itu merupakan domain TLD atau sub domain). Dalam hal ini saya contohkan sebuah sub domain <code>blog.galih.eu</code>. Selanjutnya klik tombol <em>Update</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636633759816/JBDgJtVce.png" alt="image.png" /></p>
</li>
<li><p>Kondisi awal adalah ketiga indikator yang meliputi <code>DNS config, SSL, dan Status</code> masih tidak aktif.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636633904889/pSdqsWMW3.png" alt="image.png" /></p>
</li>
</ul>
<p>Ketiga indikator akan aktif setelah pengaturan <em>DNS</em> (<em>domain name system</em>) di <em>Cloudflare</em> berhasil.</p>
<hr />
<h1 id="2-pengaturan-penambahan-rekaman-dns-di-cloudflare">2. Pengaturan penambahan rekaman <em>DNS</em> di <em>Cloudflare</em>.</h1>
<ul>
<li><p>Login ke website <em>Cloudflare.com</em>, kemudian pilih domain yang sudah ditaruh di sana.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636634149951/KajCf3zbF.png" alt="image.png" /></p>
</li>
<li><p>Setelah masuk ke halaman pengaturan domain bersangkutan, di bagian kiri halaman ada beberapa menu, pilih menu <em>DNS</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636634246194/W2yOTjfQx.png" alt="image.png" /></p>
</li>
<li><p>Berikutnya akan muncul halaman pengaturan <em>DNS</em>, dimana contoh kondisi rekaman dalam <code>DNS management</code> dari domain <code>galih.eu</code> yang saya miliki adalah sebagai berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636634376921/ZOkfaPjA_.png" alt="image.png" /></p>
</li>
<li><p>Klik tombol <em>Add record</em>, dan isikan data berikut:<br />
a. pilih <code>CNAME</code> dalam pilihan <em>Type</em>, <br />
b. isi nama sub domain <code>blog</code>,<br />
c. isi target dengan <code>hashnode.network</code>,<br />
d. klik tombol di <em>Proxy status</em> untuk menonaktifkan status <code>Proxied</code> menjadi <code>DNS only</code>, <br />
e. isi <em>TTL</em> (<em>time to live</em>) dibiarkan <code>auto</code> saja, dan terakhir<br />
f. tekan tombol <em>Save</em>.</p>
</li>
<li><p>Hasil akhir konfigurasi di <em>DNS management</em> adalah sebagai berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636635198131/FJkbO1IS7.png" alt="image.png" /></p>
</li>
</ul>
<p>Konfigurasi di <em>Cloudflare</em> selesai.</p>
<hr />
<h1 id="3-pemeriksaan-propagasi">3. Pemeriksaan <em>propagasi</em>.</h1>
<p>Berikutnya, kita cek status domain di halaman pengaturan <em>Domain</em> di <em>Hashnode</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636635420453/yKnsU_b8a.png" alt="image.png" /></p>
<p><code>DNS Config</code> sudah aktif, namun untuk <code>SSL</code> dan <code>Status</code> masih belum aktif.</p>
<p>Jika kita mencoba membuka halaman web blog baru kita, maka akan muncul kesalahan seperti pada gambar berikut. Hal ini dikarenakan <em>propagasi</em> belum sukses 100%.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636635607904/AW96_xG2c.png" alt="image.png" /></p>
<p><em>Propagasi</em> adalah tahap pembaruan <em>nameserver</em> di internet yang menunjukkan pengubahan rekaman DNS dari domain bersangkutan. Waktu <em>propagasi</em> selambat-lambatnya dapat mencapai 24 jam, namun sering kali lebih cepat.</p>
<p>Kita dapat memeriksa <em>propagasi</em> <em>DNS</em> melalui website <em>Whatsmydns.net</em>.</p>
<ul>
<li>Buka halaman web whatmydns.net,</li>
<li>Masukkan alamat web yang kita ingin periksa, misalnya <code>blog.galih.eu</code>, dan pilih jenis rekaman <em>DNS</em> <code>CNAME</code>. Kemudian tekan tombol <em>Search</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636636084784/dZNQ6famy.png" alt="image.png" /></li>
<li>Deteksi dilakukan melalui berbagai server yang berada di berbagai negara. Tanda centang warna hijau berarti berhasil terdeteksi, dan tanda <strong>x</strong> warna merah menunjukkan belum terdeteksi.</li>
</ul>
<p>Jika mayoritas server di berbagai negara sudah berhasil mendeteksi pembaruan <em>DNS</em> domain kita, berarti sudah aman.</p>
<hr />
<h1 id="4-uji-coba-nama-blog-baru">4. Uji coba nama blog baru.</h1>
<p>Setelah menunggu masa propagasi beberapa saat, kalau kita periksa lagi di halaman domain <em>Hashnode</em>, semua indikator status akan berwarna hijau atau aktif.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636636424747/fZ0PG0Osu.png" alt="image.png" /></p>
<p>Hal ini menunjukkan blog dengan nama alamat baru sudah dapat diakses. Contohnya adalah sebagai berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636636508380/vOVqoc1MW.png" alt="image.png" /></p>
<p>Dan kalau diklik pada salah satu artikel, alamat tautan artikel pun sudah menyesuaikan.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636636585787/HLt75DQcE7.png" alt="image.png" /></p>
<p>Hal ini menunjukkan bahwa pengaturan <em>Custom Domain</em> sudah berhasil.</p>
<hr />
<p>Tutorial ini juga tersedia di kanal Youtube saya.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=kFsVRtwZyXY">https://www.youtube.com/watch?v=kFsVRtwZyXY</a></div>
<p>Semoga bermanfaat. Terima kasih.</p>
<p><a target="_blank" href="https://galih.eu">Web Utama</a> <strong>·</strong>  <a target="_blank" href="https://blog.galih.eu">Blog</a>  <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/">Github Pages</a> <strong>·</strong> <a target="_blank" href="https://masgalih.medium.com/">Medium</a></p>
]]></content:encoded></item><item><title><![CDATA[Melihat Statistik Repository Github Menggunakan Python dan PyGithub]]></title><description><![CDATA[Bismillaah Alhamdulillaah,
Apakah Anda memiliki repositori di Github? Ingin tahu data statistik dari setiap repositori yang Anda miliki? Yuk, ikuti tutorial berikut ini.


1. Pendahuluan

GitHub adalah platform khusus developer yang dibuat karena ter...]]></description><link>https://blog.galih.eu/melihat-statistik-repository-github-menggunakan-python-dan-pygithub</link><guid isPermaLink="true">https://blog.galih.eu/melihat-statistik-repository-github-menggunakan-python-dan-pygithub</guid><category><![CDATA[GitHub]]></category><category><![CDATA[Python]]></category><category><![CDATA[repository]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[statistics]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Wed, 10 Nov 2021 18:37:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636560410279/tbUXolsoR9.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillaah,</em></p>
<p>Apakah Anda memiliki repositori di <strong><em>Github</em></strong>? Ingin tahu data statistik dari setiap repositori yang Anda miliki? Yuk, ikuti tutorial berikut ini.</p>
<hr />

<h1 id="1-pendahuluan">1. Pendahuluan</h1>
<blockquote>
<p><strong><em>GitHub</em></strong> adalah platform khusus <em>developer</em> yang dibuat karena terinspirasi dari cara bekerja para <em>programmer</em>. Dari <em>open source</em> ke bisnis, kita bisa meng-<em>host</em> dan meninjau sebuah kode, mengelola proyek, dan membangun perangkat lunak bersama 56 juta lebih pengguna di seluruh dunia.</p>
<p>Gampangnya, <strong><em>GitHub</em></strong> merupakan manajemen proyek, sistem <em>versioning code</em>, sekaligus <em>platform</em> jaringan sosial bagi para <em>developer</em> seluruh dunia. Banyak sekali fungsi yang bisa digunakan oleh para <em>developer</em>, sehingga melalui platform ini memudahkan <em>developer</em> dalam mengembangkan sebuah karya -  <a target="_blank" href="https://www.dicoding.com/blog/apa-itu-github/">Dicoding.com</a> .</p>
</blockquote>
<p>Untuk melihat data statistik di sebuah repositori dalam Github - setelah <em>login</em> - kita dapat memilih salah satu repositori dari daftar repositori yang kita miliki. Cara paling mudah adalah dengan membukanya melalui menu <strong><em>Repositories</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636561593032/MulR7waXb.png" alt="image.png" /></p>
<p>Setelah halaman repositori terbuka, pilih menu <strong><em>Insights</em></strong>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636561725445/UzLT4eU46.png" alt="image.png" /></p>
<p>Di bagian kiri halaman ada daftar submenu, pilih menu <strong><em>Traffic</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636561851109/d_VbSF_Rl.png" alt="image.png" /></p>
<p>Datanya akan terlihat di bagian kanan halaman, contohnya seperti terlihat pada gambar berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636561998546/bhFdB0aHy.png" alt="image.png" />
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636562019626/SCn_8pNmQ.png" alt="image.png" /></p>
<p>Dan sayangnya belum ada fasilitas bawaan untuk melihat data statistik dari seluruh repositori sekaligus. Nah, dalam artikel ini akan disajikan bagaimana cara mengakses data statistik dari keseluruhan repositori yang sudah kita miliki di <strong><em>Github</em></strong>.</p>
<hr />

<h1 id="2-instalasi-pygithub">2. Instalasi PyGithub</h1>
<p>Untuk mengakses data statistik repositori dalam <strong><em>Github</em></strong> dapat dilakukan melalui <strong><em>REST API</em></strong> (<em>application programming interface</em>) yang sudah disediakan.</p>
<blockquote>
<p>API, atau antarmuka pemrograman aplikasi, adalah seperangkat aturan yang menentukan bagaimana aplikasi atau perangkat dapat terhubung dan berkomunikasi satu sama lain. REST API adalah API yang sesuai dengan prinsip desain REST (representational state transfer), atau gaya arsitektur transfer status representasional. Untuk alasan ini, REST API terkadang dirujuk ke RESTful API -  <a target="_blank" href="https://www.ibm.com/cloud/learn/rest-apis">IBM.com</a>.</p>
</blockquote>
<p>Dokumen terkait <em>REST API</em> dapat ditemukan di halaman web <a target="_blank" href="https://docs.github.com/en/rest">Github Docs</a>.
Adapun kali ini, kita akan menggunakan paket <em>library</em>  <a target="_blank" href="https://pypi.org/project/PyGithub/"><strong><em>PyGithub</em></strong></a> untuk memudahkan pengaksesan <em>REST API</em> yang tersedia.</p>
<p>Kode sumber <strong><em>PyGithub</em></strong> ada di  <a target="_blank" href="https://github.com/PyGithub/PyGithub">sini</a> , dan panduan lengkap penggunaannya ada di  <a target="_blank" href="https://pygithub.readthedocs.io/en/latest/introduction.html">sini</a>.</p>
<ul>
<li>Instalasi paket.</li>
</ul>
<pre><code>$ pip install PyGithub
</code></pre><ul>
<li>Uji coba pertama adalah menampilkan semua nama repositori yang sudah dimiliki dengan menggunakan <em>template</em> kode berikut.</li>
</ul>
<pre><code><span class="hljs-keyword">from</span> github <span class="hljs-keyword">import</span> Github

<span class="hljs-comment"># First create a Github instance:</span>

<span class="hljs-comment"># using an access token</span>
g = Github(<span class="hljs-string">"access_token"</span>)

<span class="hljs-comment"># Github Enterprise with custom hostname</span>
g = Github(base_url=<span class="hljs-string">"https://{hostname}/api/v3"</span>, login_or_token=<span class="hljs-string">"access_token"</span>)

<span class="hljs-comment"># Then play with your Github objects:</span>
<span class="hljs-keyword">for</span> repo <span class="hljs-keyword">in</span> g.get_user().get_repos():
    print(repo.name)
</code></pre><hr />

<h1 id="3-membuat-token-akses">3. Membuat Token Akses</h1>
<p>Untuk dapat mengakses <em>REST API</em> diperlukan semacam <em>token</em> akses yang dapat kita buat melalui pengaturan dalam <strong><em>Github</em></strong>. </p>
<ul>
<li><p>Klik foto profil di bagian kanan atas, dan pilih <em>Settings</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636563686272/IWoeYeAsy.jpeg" alt="github settings.jpg" /></p>
</li>
<li><p>Berikutnya adalah memilih submenu <em>Developer Settings</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636563735264/kFuYPWd_Q.jpeg" alt="github settings - developer settings.jpg" /></p>
</li>
<li><p>Pilih submenu <em>Personal access tokens</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636563831574/Wnyk2grKP.jpeg" alt="github settings - developer settings - personal access tokens.jpg" /></p>
</li>
<li><p>Tekan tombol <em>Generate new token</em> untuk membuat <em>token</em> akses baru.</p>
</li>
<li><p>Berikutnya adalah isi <em>note</em> (keterangan), masa kadaluwarsa <em>token</em>, dan pilihan <em>scope</em> (jangkauan) hak akses. Dan tekan tombol <em>Generate token</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636564154104/C20cUjdAJ.jpeg" alt="github settings - developer settings - generate token.jpg" />
Dalam hal ini saya contohkan isi masa kadaluwarsanya 30 hari, dan <em>scope</em>-nya cukup dipilih yang <strong><em>repo</em></strong> saja.</p>
</li>
<li><p>Jika berhasil, akan memunculkan semacam kode yang merupakan <em>token</em> akses yang baru saja dibuat. Simpan baik-baik kode tersebut, karena halaman yang memunculkan <em>token</em> ini tidak akan dapat dilihat lagi.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636564357389/P9EBFU7NQ.jpeg" alt="github settings - developer settings - generate token muncul.jpg" /></p>
</li>
<li><p>Jika kembali ke halaman <em>Personal access tokens</em>, maka akan memunculkan isi halaman yang contohnya seperti terdapat pada potongan gambar berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636564518667/7c99YgBIJ.jpeg" alt="github settings - developer settings - generate token expiration.jpg" /></p>
</li>
<li><p>Kita juga dapat membangkitkan <em>token</em> akses baru lagi jika <em>token</em> sebelumnya terlupakan. Yaitu dengan cara klik tautan nama <em>token</em> tersebut. Anda juga dapat mengubah spesifikasi lainnya dan selanjutnya klik tombol <em>Regenerate token</em>.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636564625461/YEKg3YHEs.jpeg" alt="github settings - developer settings - generate token regeneration.jpg" /></p>
</li>
</ul>
<hr />

<h1 id="4-uji-coba-pygithub">4. Uji Coba PyGithub</h1>
<p>Dalam tutorial kali ini saya akan mendemokan 5 tugas untuk mengakses data statistik repositori dalam <strong><em>Github</em></strong>, yaitu:</p>
<ul>
<li>Melihat daftar nama repositori.</li>
<li>Memeriksa tipe repositori, yaitu antara tipe <em>Private</em> dan <em>Public</em>.</li>
<li>Melihat data jumlah <em>cloning</em> (salinan) repositori secara mentah.</li>
<li>Melihat data pekanan jumlah salinan dan jumlah <em>view</em> (tampilan) dari masing-masing repositori dengan data yang sudah agak dirapikan.</li>
<li>Melihat data statistik repositori harian agak lengkap, mencakup: nama, tipe, jumlah bintang, data <em>clone</em>, data <em>view</em>, data konten (<em>path</em>) populer, dan data <em>referrer</em> (perujuk).</li>
</ul>
<p><strong>a. Melihat daftar nama repositori.</strong><br />
Sintaks utamanya adalah pada kode berikut.</p>
<pre><code><span class="hljs-comment"># import library</span>
<span class="hljs-keyword">from</span> github <span class="hljs-keyword">import</span> Github
<span class="hljs-comment"># masukkan token akses</span>
g = Github(<span class="hljs-string">"token"</span>)
<span class="hljs-comment"># telusuri setiap repositori</span>
<span class="hljs-keyword">for</span> repo <span class="hljs-keyword">in</span> g.get_user().get_repos():
    print(repo.name)
</code></pre><p>Contoh luarannya adalah:</p>
<pre><code class="lang-text">Baca_Tulis_Bilangan
Cari_Buku
...
vb6-pencari-file
VB6_MySQL
</code></pre>
<p><strong>b. Memeriksa tipe repositori.</strong><br />
Kode utamanya adalah:</p>
<pre><code><span class="hljs-comment"># inisialisasi jml repo berdasarkan tipe (private atau public)</span>
jmlRepoPrivate = <span class="hljs-number">0</span>
jmlRepoPublic = <span class="hljs-number">0</span>

<span class="hljs-comment"># akses repository</span>
aksesRepo = g.get_user().get_repos()

<span class="hljs-comment"># menelusuri semua repo</span>
<span class="hljs-keyword">for</span> no, repo <span class="hljs-keyword">in</span> enumerate(aksesRepo):
    <span class="hljs-keyword">if</span> repo.private:
        jmlRepoPrivate += <span class="hljs-number">1</span>
        tipe = <span class="hljs-string">"Private"</span>
    <span class="hljs-keyword">else</span>:
        jmlRepoPublic += <span class="hljs-number">1</span>
        tipe = <span class="hljs-string">"Public"</span>

    print(<span class="hljs-string">f"Repository ke-<span class="hljs-subst">{no+<span class="hljs-number">1</span>}</span>: <span class="hljs-subst">{repo.name}</span>, tipe: <span class="hljs-subst">{tipe}</span>"</span>)

print(<span class="hljs-string">f"\nJumlah repository tipe Private: <span class="hljs-subst">{jmlRepoPrivate}</span>, "</span>
      <span class="hljs-string">f"Public: <span class="hljs-subst">{jmlRepoPublic}</span>, "</span>
      <span class="hljs-string">f"total: <span class="hljs-subst">{aksesRepo.totalCount}</span>"</span>)
</code></pre><p>Contoh luarannya adalah:</p>
<pre><code class="lang-text">Repository ke-1: Baca_Tulis_Bilangan, tipe: Public
Repository ke-2: Cari_Buku, tipe: Public
...
Repository ke-14: vb6-pencari-file, tipe: Public
Repository ke-15: VB6_MySQL, tipe: Public

Jumlah repository tipe Private: 3, Public: 12, total: 15
</code></pre>
<p><strong>c. Melihat data jumlah <em>clone</em> pekanan.</strong><br />
Kode utamanya adalah:</p>
<pre><code><span class="hljs-keyword">for</span> no, repo <span class="hljs-keyword">in</span> enumerate(aksesRepo):
    print(<span class="hljs-string">f"\nRepository ke-<span class="hljs-subst">{no + <span class="hljs-number">1</span>}</span>: <span class="hljs-subst">{repo.name}</span>"</span>)
    data_clone = repo.get_clones_traffic(per=<span class="hljs-string">"week"</span>)
    print(data_clone)
</code></pre><p>Contoh luarannya:</p>
<pre><code class="lang-text">...
Repository ke-13: vb6-mini-projects
{'count': 0, 'uniques': 0, 'clones': []}

Repository ke-14: vb6-pencari-file
{'count': 1, 'uniques': 1, 'clones': [Clones(uniques=1, timestamp=2021-11-08 00:00:00, count=1)]}

Repository ke-15: VB6_MySQL
{'count': 6, 'uniques': 4, 'clones': [Clones(uniques=3, timestamp=2021-11-01 00:00:00, count=3), Clones(uniques=2, timestamp=2021-11-08 00:00:00, count=3)]}
</code></pre>
<p><strong>d. Melihat data pekanan jumlah <em>clone</em> dan <em>view</em>.</strong><br />
Kode utamanya (untuk <em>view</em>):</p>
<pre><code><span class="hljs-keyword">for</span> no, repo <span class="hljs-keyword">in</span> enumerate(aksesRepo):
    data_view = repo.get_views_traffic(per=<span class="hljs-string">"week"</span>)
    print(<span class="hljs-string">"Data View."</span>)
    print(<span class="hljs-string">f"  Jumlah view total: <span class="hljs-subst">{data_view[<span class="hljs-string">'count'</span>]}</span>"</span>)
    print(<span class="hljs-string">f"  Jumlah view unik: <span class="hljs-subst">{data_view[<span class="hljs-string">'uniques'</span>]}</span>"</span>)
    <span class="hljs-keyword">if</span> data_view:
        <span class="hljs-keyword">for</span> i, data <span class="hljs-keyword">in</span> enumerate(data_view[<span class="hljs-string">'views'</span>]):
            print(<span class="hljs-string">f"    View ke-<span class="hljs-subst">{i + <span class="hljs-number">1</span>}</span> = tanggal: <span class="hljs-subst">{data.timestamp}</span>, total: <span class="hljs-subst">{data.count}</span>, jumlah unik: <span class="hljs-subst">{data.uniques}</span>"</span>)
</code></pre><p>Contoh luarannya (<em>clone</em> dan <em>view</em>):</p>
<pre><code class="lang-text">...
Repository ke-11: python_list
Data Clone.
  Jumlah clone total: 13
  Jumlah clone unik: 10
    Clone ke-1 = tanggal: 2021-10-25 00:00:00, total: 12, jumlah unik: 9
    Clone ke-2 = tanggal: 2021-11-01 00:00:00, total: 1, jumlah unik: 1
Data View.
  Jumlah view total: 52
  Jumlah view unik: 6
    View ke-1 = tanggal: 2021-10-25 00:00:00, total: 45, jumlah unik: 5
    View ke-2 = tanggal: 2021-11-01 00:00:00, total: 4, jumlah unik: 2
    View ke-3 = tanggal: 2021-11-08 00:00:00, total: 3, jumlah unik: 1
...
</code></pre>
<p><strong>e. Melihat data statistik harian agak lengkap.</strong><br />
Kode utamanya:</p>
<pre><code><span class="hljs-comment"># jumlah bintang</span>
print(f<span class="hljs-string">"  Jumlah bintang: {repo.stargazers_count}"</span>)
<span class="hljs-comment"># sumber data clone harian</span>
data_clone = repo.get_clones_traffic(per=<span class="hljs-string">"day"</span>)
<span class="hljs-comment"># sumber data view harian</span>
data_view = repo.get_views_traffic(per=<span class="hljs-string">"day"</span>)
<span class="hljs-comment"># data populer</span>
data_populer = repo.get_top_paths()
<span class="hljs-comment"># top data referrer</span>
data_referrer = repo.get_top_referrers()
</code></pre><p>Contoh luarannya.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636568901707/bMZHUInfy.gif" alt="tugas_5.gif" /></p>
<hr />
<p>Demikian tutorial mengakses data statistik repositori di <em>Github</em> menggunakan <strong><em>PyGithub</em></strong>. Selanjutnya dapat dikembangkan dalam bentuk antarmuka yang lebih <em>user friendly</em> dan enak dipandang. </p>
<p>Kode sumber selengkapnya dapat di cek di repositori <em>Github</em> saya.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/galihboy/Github_Repo_Stats">https://github.com/galihboy/Github_Repo_Stats</a></div>
<p>Semoga bermanfaat.
Terima kasih.</p>
<p><a target="_blank" href="https://galih.eu">Web Utama</a> <strong>·</strong>  <a target="_blank" href="https://blog.galih.eu">Blog</a>  <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/">Github Pages</a> <strong>·</strong> <a target="_blank" href="https://masgalih.medium.com/">Medium</a></p>
]]></content:encoded></item><item><title><![CDATA[Menyunting Teks Menggunakan Aplikasi SIPEBI]]></title><description><![CDATA[Bismillaah Alhamdulillaah,
Kegiatan menyunting teks dengan menggunakan bahasa baku yang sesuai kaidah itu membutuhkan tambahan tenaga dan waktu. Sering kali kita juga bingung dalam memilih mana kata yang dianggap baku dan mana yang sudah tidak diangg...]]></description><link>https://blog.galih.eu/menyunting-teks-menggunakan-aplikasi-sipebi</link><guid isPermaLink="true">https://blog.galih.eu/menyunting-teks-menggunakan-aplikasi-sipebi</guid><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Mon, 08 Nov 2021 17:58:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636392621538/ZV3MkB0nL.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillaah</em>,</p>
<p>Kegiatan menyunting teks dengan menggunakan bahasa baku yang sesuai kaidah itu membutuhkan tambahan tenaga dan waktu. Sering kali kita juga bingung dalam memilih mana kata yang dianggap baku dan mana yang sudah tidak dianggap baku lagi, seperti: <em>kuintal </em>atau <em>kwintal</em>, <em>analisis </em>atau <em>analisa</em>, dan sejenisnya.</p>
<p>Penulisan kata-kata yang baku pada kalimat dengan struktur yang benar diperlukan dalam menulis karya ilmiah, laporan penelitian, berita (formal), dan lain sebagainya. Untungnya saat ini untuk mencari kata-kata baku sudah tersedia di situs web <a target="_blank" href="https://kbbi.kemdikbud.go.id/">KBBI</a>. Dan yang terbaru yang patut diapresiasi adalah diluncurkannya aplikasi <strong><em>Sipebi</em></strong> (Aplikasi Penyuntingan Ejaan Bahasa Indonesia).</p>
<blockquote>
<p>Merupakan aplikasi yang berfungsi untuk melakukan perbaikan/penyuntingan teks bahasa Indonesia secara otomatis. Aplikasi ini menggunakan pangkalan data KBBI termutakhir (keluaran April 2021) dan masukan para ahli bahasa sebagai basis datanya. </p>
<p>Badan Bahasa berkomitmen untuk senantiasa mengembangkan dan memutakhirkan <strong><em>Sipebi</em></strong> agar makin banyak jenis kesalahan penulisan teks dalam bahasa Indonesia yang dapat diperbaiki secara otomatis oleh <strong><em>Sipebi</em></strong>. </p>
</blockquote>
<hr />

<h1 id="instalasi-sipebi">✔️ Instalasi <em>Sipebi</em></h1>
<p>Sebelum melakukan instalasi, unduh dulu aplikasi <strong><em>Sipebi</em></strong> di website <a target="_blank" href="https://kbbi.kemdikbud.go.id/">KBBI</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636390930549/FibdEZTrC.jpeg" alt="01 web kbbi.jpg" /></p>
<p>Kemudian klik tautan pada tulisan setelah <strong><em>Sipebi</em></strong>, nanti akan diarahkan ke  <a target="_blank" href="https://kbbi.kemdikbud.go.id/Aplikasi">halaman web</a>  khusus unduh aplikasi.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636391072089/fvw2COAIe.jpeg" alt="02 web sipebi.jpg" /></p>
<p>Jika merasa belum memiliki <strong><em>.NET Framework 4.6.2</em></strong> di sistem operasinya, bisa langsung unduh di  <a target="_blank" href="https://dotnet.microsoft.com/download/dotnet-framework/net462">halaman web ini</a>.</p>
<p>Pilih fail instalasi yang <em>offline</em> untuk <em>runtime</em> saja.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636391241048/FG7usHVTW.jpeg" alt="03. web dot net 4.6.2.jpg" /></p>
<p>Berikutnya <em>install</em> <strong><em>.NET Framework 4.6.2</em></strong> dan kemudian ekstrak unduhan fail <strong><em>Sipebi</em></strong> di folder yang diinginkan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636391452463/ewcc66VdE.jpeg" alt="fail sipebi.jpg" /></p>
<hr />

<h1 id="eksperimen-aplikasi">✔️ Eksperimen Aplikasi</h1>
<p>🎖a. Buka aplikasi <strong><em>Sipebi</em></strong>, nanti akan muncul tampilan seperti ini.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636392053470/xtmtNu1AzR.jpeg" alt="04. sipebi depan.jpg" /></p>
<p>🎖b. Klik tombol Masuk untuk menuju tampilan utama.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636392187132/xOFM9IXmK.jpeg" alt="05. sipebi home.jpg" /></p>
<p>Keterangan menu dan ikon tertera pada gambar.</p>
<p>🎖c. Buka fail teks contoh dan tekan tombol di menu untuk sunting teks.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636392346376/-XBLoxOju.jpeg" alt="06. penyuntingan.jpg" /></p>
<p>Teks asli ada di sebelah kiri, dan hasil penyuntingan ada di sebelah kanan. Dan akan memunculkan laporan hasil penyuntingan seperti pada gambar berikut.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636392431222/-t3D_YUPq.jpeg" alt="07. Laporan hasil penyuntingan.jpg" /></p>
<p>🎖d. Tekan tombol menu buka hasil analisis teks, nanti akan muncul detail informasi hasil analisis.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636392531615/ug3INn6e5.jpeg" alt="08. hasil analisis + ket.jpg" /></p>
<p>🎖e. Terakhir, kita coba buka menu <em>Pengaturan</em>, kemudian pada bagian tulisan yang ada kata "ambigu" pilih "Gunakan", kemudian simpang pengaturan. </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636392761104/olXDcf94gI.jpeg" alt="05b. halaman pengaturan.jpg" /></p>
<p>Kembali lagi ke ruang kerja dan coba tes manual memasukkan kalimat ambigu di dalamnya yang saya ambil dari halaman web  <a target="_blank" href="https://www.dosenpendidikan.co.id/contoh-kalimat-ambigu/">dosen pendidikan</a> . Dan hasilnya seperti ini.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636393053774/WQXXHtq9p.jpeg" alt="10. ambigu.jpg" /></p>
<p>Tadinya saya kira fitur ini untuk mendeteksi kata/kalimat ambigu, tapi kok tidak muncul hasil analisisnya. Atau mungkin saya salah paham terhadap fitur ini. Mungkin pengembangnya dapat memberikan buku petunjuk penggunaan yang lebih lengkap.</p>
<hr />

<p><em>Btw</em>, aplikasi ini sangat membantu buat saya dan Anda jika ingin menyunting teks menggunakan bahasa baku sesuai kaidah yang berlaku. </p>
<p>Terima kasih pada tim pengembang aplikasi di Badan Pengembangan dan Pembinaan Bahasa, Kementerian Pendidikan, Kebudayaan, Riset, dan Teknologi Republik Indonesia 💙🇮🇩.</p>
<p>Semoga bermanfaat! 🙏☕️</p>
<p><a target="_blank" href="https://galih.eu">Web Utama</a> <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/">Github Pages</a> <strong>·</strong> <a target="_blank" href="https://masgalih.medium.com/">Medium</a> <strong>·</strong> <a target="_blank" href="https://galih.hashnode.dev/">Hashnode</a> </p>
]]></content:encoded></item><item><title><![CDATA[Mencoba Hashnode untuk Pertama Kali]]></title><description><![CDATA[Bismillaah Alhamdulillaah,
Assalamu'alaikum Wr. Wb.,
Setelah kurang lebih satu bulan saya memuat tulisan di blog  Medium , dan mencoba menelusuri penyedia layanan blog sejenis, akhirnya ketemu Hashnode. Untuk menulis konten di sini menggunakan markdo...]]></description><link>https://blog.galih.eu/mencoba-hashnode-untuk-pertama-kali</link><guid isPermaLink="true">https://blog.galih.eu/mencoba-hashnode-untuk-pertama-kali</guid><category><![CDATA[Hashnode]]></category><category><![CDATA[medium]]></category><category><![CDATA[Testing]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Sun, 07 Nov 2021 19:16:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636308502066/DcCdVCAjj.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillaah</em>,
<em>Assalamu'alaikum Wr. Wb.</em>,</p>
<p>Setelah kurang lebih satu bulan saya memuat tulisan di blog  <a target="_blank" href="https://masgalih.medium.com/">Medium</a> , dan mencoba menelusuri penyedia layanan blog sejenis, akhirnya ketemu <em>Hashnode</em>. Untuk menulis konten di sini menggunakan <em><a target="_blank" href="https://id.wikipedia.org/wiki/Markdown">markdown</a></em> sebagaimana biasa saya lakukan ketika membuat isian fail <em>README.md</em> di <em>repository  <a target="_blank" href="https://github.com/galihboy">Github</a></em>.</p>
<blockquote>
<p><em>Markdown</em> adalah perangkat konversi teks ke HTML untuk penulis konten web. <em>Markdown</em> memungkinkan Anda menulis format teks yang mudah dibaca dan ditulis, kemudian mengonversinya ke bentuk XHTML (atau HTML) yang secara terstruktur valid - <a target="_blank" href="https://daringfireball.net/projects/markdown/">Daringfireball</a>.</p>
</blockquote>
<p>Dalam tulisan di <a target="_blank" href="https://hashnode.com/vs/medium">sini</a> diterangkan perbandingan antara <em>Hashnode</em> dan <em>Medium</em>, yang beberapa di antaranya adalah sebagai berikut.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Hal</td><td>Medium</td><td>Hashnode</td></tr>
</thead>
<tbody>
<tr>
<td>Biaya</td><td>Gratis untuk beberapa artikel, bayar untuk baca tanpa batas</td><td>Gratis</td></tr>
<tr>
<td>Setelan Domain</td><td>Ada untuk anggota berbayar</td><td>Ada dan gratis</td></tr>
<tr>
<td>Sorot Sintak</td><td>Tidak ada sorot sintak mandiri</td><td>Otomatis mendeteksi teks dalam blok <em>code</em> sesuai sintaknya</td></tr>
<tr>
<td>Pengelompokan Tulisan Terkait</td><td>Tidak ada</td><td>Ada</td></tr>
<tr>
<td>Halaman Statis</td><td>Tidak Ada</td><td>Ada</td></tr>
<tr>
<td>Penyetelan Tautan</td><td>Tidak ada</td><td>Ada</td></tr>
</tbody>
</table>
</div><p>Saya pertama kali tertarik dengan <em>Medium</em> karena format tulisan, jenis <em>font</em>, gaya CSS-nya membuat nyaman mata untuk melihat dan membaca teks panjang. Tapi karena ada batasan <em>paywall</em> bagi pembaca untuk dapat membaca keseluruhan artikel jadi membuat saya mulai mencari <em>platform</em> alternatif sejenis.</p>
<p>Sementara ini mungkin saya akan mencoba menulis di kedua <em>platform</em> ini sambil beradaptasi dulu dengan lingkungan penulisannya. Apalagi di <em>Hashnode</em> ini menawarkan untuk bisa mengimpor tulisan yang ada di <em>Medium</em>.</p>
<blockquote>
<p>If you’re already on Medium, we’ve made it easy for you to switch.</p>
<p>Hashnode's Medium Importer enables you to migrate your entire back catalog over to our platform in a matter of minutes.</p>
</blockquote>
<p><em>Btw</em>, saya menulis <em>markdown</em> ini sambil melihat <em>cheatsheet</em> di  <a target="_blank" href="https://laasyasettyblog.hashnode.dev/markdown-cheatsheet-to-write-a-stunning-article">sini</a>  yang cukup membantu saya untuk adaptasi dalam format penulisan artikel 😃.</p>
<p>Penulisan kode dengan sorotan sintak bawaan juga cukup memudahkan, seperti contoh berikut.</p>
<pre><code class="lang-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Prima</span>():</span>
  <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span>(<span class="hljs-params">self</span>):</span>
    <span class="hljs-keyword">pass</span>

  <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">CekPrima</span>(<span class="hljs-params">self, angka</span>):</span>
    <span class="hljs-keyword">if</span> angka &lt; <span class="hljs-number">1</span>: <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span>
    <span class="hljs-keyword">else</span>:
      <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">2</span>, angka):
        <span class="hljs-keyword">if</span> angka % i == <span class="hljs-number">0</span>: <span class="hljs-keyword">return</span> <span class="hljs-literal">False</span>
      <span class="hljs-keyword">else</span>: <span class="hljs-keyword">return</span> <span class="hljs-literal">True</span>

  <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">DeretPrima</span>(<span class="hljs-params">self, min, maks</span>):</span>
      lstPrima = []
      <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(min, maks+<span class="hljs-number">1</span>):
          <span class="hljs-keyword">if</span> self.CekPrima(i):
              lstPrima.append(i)
              <span class="hljs-comment">#print(i)</span>
      <span class="hljs-keyword">return</span> lstPrima

o = Prima()
min = <span class="hljs-number">2</span>
maks = <span class="hljs-number">50000</span>

mulai = time.perf_counter()
print(o.DeretPrima(min, maks))
akhir = time.perf_counter()-mulai
print(<span class="hljs-string">f"Waktu: <span class="hljs-subst">{akhir}</span> detik"</span>)
</code></pre>
<p>Potongan kode tersebut di atas untuk menampilkan deret prima di antara dua bilangan.
Hasil eksekusinya seperti terlihat pada gambar berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636311624146/GoTSoMr0z.png" alt="image.png" /></p>
<p>Untuk meletakkan gambar juga sama dengan yang ada di <em>Medium</em>, yaitu tinggal <em>copy/paste</em> dari hasil <em>screenshot</em> atau unggah fail gambar.</p>
<p>Sementara ini dulu artikel perdana di <em>Hashnode</em>, semoga betah dan rajin menulis 😉.</p>
<p>Semoga berkenan 💝.</p>
<p><a target="_blank" href="https://galih.eu">Web Utama</a> <strong>·</strong>  <a target="_blank" href="https://blog.galih.eu">Blog</a>  <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/">Github Pages</a> <strong>·</strong> <a target="_blank" href="https://masgalih.medium.com/">Medium</a></p>
]]></content:encoded></item><item><title><![CDATA[Visual Basic 6 dan MySQL/MariaDB]]></title><description><![CDATA[Bismillah Alhamdulillah.
Artikel ini dibuat sekadar untuk mengenang bagaimana dahulu Visual Basic 6 (VB6) merupakan salah satu pemrograman berbasis Graphical User Interface (GUI) yang cukup populer dan andal di masa jayanya. Visual Basic (juga disebu...]]></description><link>https://blog.galih.eu/visual-basic-6-dan-mysqlmariadb</link><guid isPermaLink="true">https://blog.galih.eu/visual-basic-6-dan-mysqlmariadb</guid><category><![CDATA[visual studio]]></category><category><![CDATA[basics]]></category><category><![CDATA[GUI]]></category><category><![CDATA[MySQL]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Sat, 06 Nov 2021 19:24:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636845256375/aXO_mTrJi.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillah Alhamdulillah.</em></p>
<p>Artikel ini dibuat sekadar untuk mengenang bagaimana dahulu <strong><em>Visual Basic 6</em> (<em>VB6</em>)</strong> merupakan salah satu pemrograman berbasis <em>Graphical User Interface</em> (GUI) yang cukup populer dan andal di masa jayanya. Visual Basic (juga disebut sebagai <em>Classic Visual Basic</em>) adalah bahasa pemrograman <em>event-driven</em> (berbasis kejadian) generasi ketiga dari <em>Microsoft</em> yang dikenal dengan model pemrograman <em>Component Object Model</em> (COM) yang pertama kali dirilis pada tahun 1991 dan dinyatakan sebagai warisan pada tahun 2008 <a target="_blank" href="https://en.wikipedia.org/wiki/Visual_Basic_(classic">¹</a>). Walaupun <strong><em>VB6</em></strong> sudah dijadikan warisan oleh <em>Microsoft</em>, namun masih dapat digunakan di sistem operasi <em>Windows 11</em> <a target="_blank" href="https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-basic-6/visual-basic-6-support-policy">²</a>.</p>
<p>Untuk mengakses aplikasi database di luar pemrograman <strong><em>VB6</em></strong>, biasanya melalui suatu penghubung yang disebut <strong><em>Open Database Connectivity</em> (<em>ODBC</em>)</strong>. Namun, dalam tutorial kali ini saya tidak akan menggunakan <strong><em>ODBC</em></strong> sebagai penghubung, melainkan <strong><em>VBMySQLDirect</em></strong> yang saya rasa lebih mudah penggunaannya. <strong><em>VBMySQLDirect</em></strong> adalah sebuah pembungkus MySQL C API yang ditulis oleh seorang kontributor dalam proyek <em>VB-MySQL</em> bernama Robert Rowe pada tahun 2001.</p>
<blockquote>
<p><strong><em>VBMySQLDirect</em></strong> adalah cabang dari MyVbQl API dan tersedia untuk pengembang Visual Basic dan semua pengembang Windows yang memiliki akses ke objek COM. <strong><em>VBMySQLDirect</em></strong> menawarkan peningkatan kinerja melalui ODBC, dan juga menawarkan peningkatan dari API MyVbQl sebelumnya dalam hal manajemen memori yang lebih baik, dukungan BLOB, dan kompatibilitas ADO yang lebih baik. <strong><em>VBMySQLDirect</em></strong> menggunakan API MySQL yang lebih baru sebagai basisnya juga dan karenanya mendukung fungsionalitas yang lebih baru daripada MyVbQl <a target="_blank" href="https://marc.info/?l=mysql-win32&amp;m=107886479703458&amp;w=2">³</a>.</p>
</blockquote>
<p>Dalam artikel ini akan dibagi dalam beberapa tahap, yaitu:</p>
<ol>
<li>Instalasi fail <em>library</em> <strong><em>VBMySQLDirect</em></strong></li>
<li>Penerapan pemanggilan <em>API</em> di <strong><em>VB6</em></strong></li>
<li>Contoh penerapan uji koneksi dalam <em>GUI</em> versi kustom</li>
<li>Contoh aplikasi membaca data</li>
</ol>
<p>Dalam pembuatan artikel ini beberapa hal penting yang harus disiapkan adalah:</p>
<ul>
<li><strong><em>VB6</em></strong> sudah dipasang. Saat ini saya menggunakan <strong><em>VB6</em></strong> versi <strong><em>SP6</em></strong>. Yang ingin melakukan instalasi di <em>Windows 10</em> (atau <em>Windows 11</em>) ikuti tutorial di <a target="_blank" href="https://www.fortypoundhead.com/showcontent.asp?artid=23993">sini</a>.</li>
<li><a target="_blank" href="https://www.mysql.com/"><em>MySQL</em></a> atau <a target="_blank" href="https://mariadb.org/"><em>MariaDB</em></a> sudah dipasang dengan benar di sistem operasi <em>Windows</em> (saat ini saya menggunakan <strong><em>Windows 11</em></strong>). Dapat juga menggunakan aplikasi versi terintegrasi seperti <a target="_blank" href="https://www.wampserver.com/en/"><strong><em>WAMP</em></strong></a>.</li>
</ul>
<h3 id="1-instalasi-fail-library-vbmysqldirect">1. Instalasi fail library VBMySQLDirect</h3>
<p>Fail <em>library</em> <strong><em>VBMySQLDirect</em></strong> berupa fail <strong><em>.dll</em></strong> yang harus diregistrasikan terlebih dahulu ke sistem operasi <em>Windows</em> sebelum dapat dipakai. <em>DLL</em> adalah singkatan dari <em>Dynamic-Link Library</em>. <em>DLL</em> adalah fail <em>library</em> dalam sistem operasi <em>Windows</em> yang berisi “arahan” untuk program lain dalam melakukan suatu pekerjaan. Fail ini bernama <strong><em>VBMySQLDirect.dll</em></strong> yang dapat diunduh di <em>repository github</em> saya. Langkah selanjutnya adalah sebagai berikut.</p>
<ul>
<li>Letakkan fail <strong><em>VBMySQLDirect.dll</em></strong> di sebuah direktori,</li>
<li>Buka <em>command prompt</em> (jalankan sebagai <strong><em>Administrator</em></strong>),</li>
<li>Eksekusi perintah registrasi berikut hingga muncul notifikasi sukses.</li>
</ul>
<blockquote>
<p>regsvr32 "nama_dan_alamat_fail_dll"</p>
</blockquote>
<p>Berikut ini contoh potongan gambar hasil registrasi yang sudah berhasil.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796948803/I5cMSEKQ9.png" alt /></p>
<hr />
<h3 id="2-penerapan-pemanggilan-api-di-vb6">2. Penerapan pemanggilan <em>API</em> di <strong><em>VB6</em></strong></h3>
<p><em>Application Programming Interface</em> (<strong><em>API</em></strong>) atau antarmuka pemrograman aplikasi adalah sekumpulan definisi dan protokol untuk membangun dan mengintegrasikan perangkat lunak aplikasi. <strong><em>API</em></strong> memungkinkan sebuah produk atau layanan dapat berkomunikasi dengan produk dan layanan lain tanpa harus mengetahui bagaimana cara penerapannya.</p>
<p>Sebelum menggunakan <em>API</em> <strong><em>VBMySQLDirect</em></strong> ini, yang harus dilakukan pertama kali adalah memuatkan referensi ke fail <em>library</em> bersangkutan. Caranya adalah:</p>
<p>a. Buka IDE VB6, pilih <strong><em>Standard Exe</em></strong>, dan tekan tombol <strong><em>Open</em></strong>.<br />b. Simpan <strong><em>project</em></strong> (dan <em>form</em> baru) di folder yang dikehendaki.</p>
<blockquote>
<p>tambahkan fail <strong><em>libmySQL.dll</em></strong> di setiap folder <em>project</em> yang dimiliki.</p>
</blockquote>
<p>Jika mengalami <em>error</em> terkait belum terdeteksinya fail <em>libmySQL.dll</em>, silakan <em>project</em>-nya ditutup dahulu, dan dibuka lagi.</p>
<p>c. Dalam menu tab <strong><em>Project</em></strong>, pilih submenu <strong><em>References</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796950393/hqEtkiTDM.png" alt /></p>
<p>d. Geser ke bawah hingga menemukan <strong><em>VB MySQL Direct v1.0</em></strong>, dan centang. Kemudian, klik tombol <strong><em>OK</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796951878/OYXg5f6b4.png" alt /></p>
<p>Untuk mengetahui ada <em>API</em> apa saja di <em>library</em> <strong><em>VBMySQLDirect</em></strong> dapat membuka menu <strong><em>View &gt; Object Browser</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796953431/i98EvLmWY.png" alt /></p>
<p>Untuk membuat koneksi baru dapat menggunakan <em>class</em> <strong>_MYSQL_CONNECTION_</strong> sekaligus dilakukan inisialisasi <em>variable</em> baru.</p>
<pre><code>Dim koneksi <span class="hljs-keyword">As</span> MYSQL_CONNECTION  
<span class="hljs-keyword">Set</span> koneksi = <span class="hljs-built_in">New</span> MYSQL_CONNECTION
</code></pre><p>Parameter koneksi dapat dilihat pada fungsi <strong><em>OpenConnection</em></strong> sebagai berikut.</p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">Function</span> <span class="hljs-title">OpenConnection</span>(<span class="hljs-params">[sHostName <span class="hljs-keyword">As</span> <span class="hljs-keyword">String</span>], [sUserName <span class="hljs-keyword">As</span> <span class="hljs-keyword">String</span>], [sPassword <span class="hljs-keyword">As</span> <span class="hljs-keyword">String</span>], [sDbName <span class="hljs-keyword">As</span> <span class="hljs-keyword">String</span>], [lPortNum <span class="hljs-keyword">As</span> Long = <span class="hljs-number">3306</span>]</span>) <span class="hljs-title">As</span> <span class="hljs-title">MYSQL_CONNECTION_STATE</span></span>
</code></pre><p>Contoh pengunaannya adalah sebagai berikut.</p>
<pre><code><span class="hljs-keyword">Const</span> host = <span class="hljs-string">"localhost"</span>  
<span class="hljs-keyword">Const</span> user = <span class="hljs-string">"root"</span>  
<span class="hljs-keyword">Const</span> passw = <span class="hljs-string">""</span>  
<span class="hljs-keyword">Const</span> port = <span class="hljs-number">3306</span>

<span class="hljs-string">' parameter setelah _passw_ dan sebelum _port_ adalah nama database  
'</span> dapat dikosongkan  
koneksi.OpenConnection host, user, passw, , port
</code></pre><p>Hasil koneksi adalah status <strong>_MY_CONN_OPEN_</strong> jika tersambung atau <strong>_MY_CONN_CLOSED_</strong> jika tertutup. Dan jika koneksi tidak berhasil dilakukan akan otomatis membangkitkan pesan kesalahan yang sesuai dengan jenis kesalahan yang sudah terinventarisasi di <em>class</em> <strong>_MYSQL_ERR_</strong>.</p>
<p>Eksekusi perintah (<em>query</em>) dapat dilakukan melalui fungsi <strong><em>Execute</em></strong>. Misalnya dalam perintah berikut:</p>
<pre><code>Dim status  
Dim isi  
<span class="hljs-keyword">Set</span> status = koneksi.<span class="hljs-keyword">Execute</span>("SELECT version()")  
isi = status.GetString(, "")
</code></pre><p><em>Variable</em> <strong>status</strong> menyimpan hasil eksekusi <em>query</em> “<strong><em>SELECT version()</em></strong>” yang digunakan untuk mengetahui versi <em>database</em> (<em>MySQL</em>/<em>MariaDB</em>) yang digunakan. Dan <em>variable</em> <strong>isi</strong> melalui fungsi <strong><em>GetString</em></strong> mengambil hasil eksekusi berupa data <em>string</em>.</p>
<p>Dan terakhir untuk menghapus <em>object</em> koneksi dari memori adalah dengan menyetel “<strong><em>Set koneksi = Nothing</em></strong>”.</p>
<p>d. Sebelum memasukkan kode di <em>form code</em>, di mode <strong><em>Design</em></strong> disiapkan dahulu satu buah tombol dengan nama <em>default</em> <strong><em>Command1</em></strong>, <em>caption</em> misalnya “<strong><em>Tes Koneksi</em></strong>”.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796955039/sw3L-wsM2.png" alt /></p>
<p>e. Lakukan klik ganda pada area <em>form</em> atau tombol, dan lengkapi kodenya.</p>
<p>Kode sumber lengkapnya adalah sebagai berikut.</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="267b82956f90d20be32fbe9e33f8497d"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/galihboy/267b82956f90d20be32fbe9e33f8497d" class="embed-card">https://gist.github.com/galihboy/267b82956f90d20be32fbe9e33f8497d</a></div><p>Hasil eksekusi dengan mengubah <em>port</em> <strong>3306</strong> (<em>MySQL</em>) dan <strong>3307</strong> (<em>MariaDB</em>) adalah sebagai berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796956483/UMF12GIbM.png" alt /></p>
<p>Berikut contoh tampilan kalau <em>password</em> diisi “<em>abc</em>” (data salah) dimana seharusnya kosong.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796957978/uw8oMYlE5.png" alt /></p>
<p>Jika Anda lupa port number dari <em>MySQL</em> atau <em>MariaDB</em>, silakan buka <strong><em>mysql</em></strong>/<strong><em>mariadb</em></strong> <em>console</em> (<em>command line client</em>) dan setelah berhasil <em>login</em>, ketikkan perintah “<strong><em>status</em></strong>”. Berikut contoh tampilannya.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796959839/m8O4jhTZG.png" alt /></p>
<hr />
<h3 id="3-contoh-penerapan-uji-koneksi-dalam-gui-versi-kustom">3. Contoh penerapan uji koneksi dalam GUI versi kustom</h3>
<p>Dalam antarmuka yang akan dibuat ini terdapat empat fungsional utama, yaitu (1) tes koneksi, (2) menampilkan database, (3) menampilkan tabel dari database yang dipilih, dan (4) menampilkan atribut dari tabel yang dipilih.</p>
<p>Kode untuk fungsional tes koneksi menyerupai kode sebelumnya, hanya saja data masukan parameter diambil dari <em>textbox</em> yang menerima masukan dari pengguna. Untuk fungsional menampilkan database, dengan membangkitkan kode untuk <em>list database</em> dari server yang sedang terhubung. Data berupa <em>list</em> yang disimpan dalam <em>listbox</em>. Untuk fungsional menampilkan data tabel dipengaruhi oleh data <em>database</em> yang dipilih dalam <em>listbox database</em>. Dan terakhir untuk fungsional menampilkan tabel, dipengaruhi oleh data tabel yang dipilih pengguna dalam <em>listbox</em> tabel. Desain antarmukan adalah sebagai berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796961622/Q03KB3VUn.png" alt /></p>
<p>Potongan kode utama untuk menampilkan <em>database</em> adalah:</p>
<pre><code>Dim MyRS <span class="hljs-keyword">As</span> MYSQL_RS  
Dim theTemp <span class="hljs-keyword">As</span> String, tempArray() <span class="hljs-keyword">As</span> String  
<span class="hljs-keyword">Set</span> MyRS = <span class="hljs-built_in">New</span> MYSQL_RS  
<span class="hljs-keyword">Set</span> MyRS = koneksi.<span class="hljs-keyword">Show</span>(MY_SHOW_DATABASES)

<span class="hljs-keyword">If</span> <span class="hljs-keyword">Not</span> MyRS.EOF <span class="hljs-keyword">Then</span>  
    theTemp = Trim$(MyRS.GetString(, ""))  
    <span class="hljs-keyword">If</span> theTemp &lt;&gt; "" <span class="hljs-keyword">Then</span>  
        Dim i <span class="hljs-keyword">As</span> <span class="hljs-type">Integer</span>  
        tempArray = Split(theTemp, vbCrLf)  
        <span class="hljs-keyword">For</span> i = LBound(tempArray) <span class="hljs-keyword">To</span> UBound(tempArray) - <span class="hljs-number">1</span>  
            lstDatabase.AddItem tempArray(i)  
        Next  
    <span class="hljs-keyword">End</span> <span class="hljs-keyword">If</span>  
<span class="hljs-keyword">End</span> <span class="hljs-keyword">If</span>
</code></pre><p>Potongan kode utama untuk menampilkan tabel dari suatu <em>database</em> adalah:</p>
<pre><code>Dim MyRS <span class="hljs-keyword">As</span> MYSQL_RS  
Dim theTemp <span class="hljs-keyword">As</span> String, tempArray() <span class="hljs-keyword">As</span> String  

<span class="hljs-keyword">Set</span> MyRS = <span class="hljs-built_in">New</span> MYSQL_RS  
<span class="hljs-keyword">Set</span> MyRS = koneksi.<span class="hljs-keyword">Show</span>(MY_SHOW_TABLES)

<span class="hljs-keyword">If</span> <span class="hljs-keyword">Not</span> MyRS.EOF <span class="hljs-keyword">Then</span>  
    theTemp = Trim$(MyRS.GetString(, ""))  
    <span class="hljs-keyword">If</span> theTemp &lt;&gt; "" <span class="hljs-keyword">Then</span>  
        Dim i <span class="hljs-keyword">As</span> <span class="hljs-type">Integer</span>  
        tempArray = Split(theTemp, vbCrLf)  
        <span class="hljs-keyword">For</span> i = LBound(tempArray) <span class="hljs-keyword">To</span> UBound(tempArray) - <span class="hljs-number">1</span>  
            lstTabel.AddItem tempArray(i)  
        Next  
    <span class="hljs-keyword">End</span> <span class="hljs-keyword">If</span>  
<span class="hljs-keyword">End</span> <span class="hljs-keyword">If</span>
</code></pre><p>Dan potongan kode utama untuk menampilkan atribut dari suatu tabel adalah:</p>
<pre><code><span class="hljs-keyword">Set</span> MyRS = koneksi.<span class="hljs-keyword">Execute</span>("SELECT * FROM " &amp; namaTabel)  
<span class="hljs-keyword">If</span> <span class="hljs-keyword">Not</span> MyRS.EOF <span class="hljs-keyword">Then</span>  
    Dim i <span class="hljs-keyword">As</span> <span class="hljs-type">Integer</span>  
    <span class="hljs-keyword">For</span> i = <span class="hljs-number">0</span> <span class="hljs-keyword">To</span> MyRS.FieldCount - <span class="hljs-number">1</span>  
        lstAtribut.AddItem MyRS.Fields(i).Name  
    Next i  
<span class="hljs-keyword">End</span> <span class="hljs-keyword">If</span>
</code></pre><p>Hasil akhir setelah eksekusi program adalah sebagai berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796963055/kNUzkQyDU.png" alt /></p>
<hr />
<h3 id="4-contoh-aplikasi-membaca-data">4. Contoh aplikasi membaca data</h3>
<p>Pada bagian ini akan membahas cara membaca data dari suatu tabel disertai fitur pencarian data. Dimana pencarian data akan dilakukan pembandingan antara nilai masukan (data yang dicari) dengan semua atribut dalam tabel yang dipilih. Jadi jika diumpamakan terdapat parameter masukan dengan nilai “abc”. Maka <em>string</em> SQL secara keseluruhan adalah:</p>
<pre><code><span class="hljs-keyword">SELECT</span> atribut1, atribut2, dst  
<span class="hljs-keyword">FROM</span> namaTabel  
<span class="hljs-keyword">WHERE</span> atribut1 <span class="hljs-keyword">LIKE</span> <span class="hljs-string">"%abc%"</span> <span class="hljs-keyword">OR</span> atribut2 <span class="hljs-keyword">LIKE</span> <span class="hljs-string">"%abc%"</span> <span class="hljs-keyword">OR</span> dst...
</code></pre><p>Hasil pencarian sementara ini hanya disimpan dalam sebuah komponen <em>textbox</em> dimana data yang ditemukan akan disusun secara vertikal. Untuk tutorial lanjutan akan disertakan penyajian data dalam bentuk tabel menggunakan komponen <strong><em>listview</em></strong>.</p>
<p>Berikut ini contoh hasil eksekusi program disertai pencarian data.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796964815/ZWbhArJdD.png" alt /></p>
<p>Untuk selanjutnya akan dibuatkan tutorial penerapan aplikasi CRUD.</p>
<p>Semoga Bermanfaat.</p>
<p>Terima kasih.</p>
<hr />
<p>Kode sumber dapat diperoleh di github.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/galihboy/VB6_MySQL">https://github.com/galihboy/VB6_MySQL</a></div>
<p><a target="_blank" href="https://galih.eu/"><strong>Website</strong></a> <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/"><strong>Github Pages</strong></a> <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/mini_projects/"><strong>Demo Mini Projects</strong></a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796966292/TMdeZQn75.gif" alt /></p>
]]></content:encoded></item><item><title><![CDATA[Tips Menggunakan Array [List] dalam Python]]></title><description><![CDATA[Bismillaah Alhamdulillaah.
List merupakan tipe bawaan (built-in) dalam bahasa pemrograman Python yang dapat digunakan untuk menampung lebih dari satu buah data dengan tipe yang berbeda-beda. Data dalam list memiliki nomor urut (indeks) dari 0 dan set...]]></description><link>https://blog.galih.eu/tips-menggunakan-array-list-dalam-python</link><guid isPermaLink="true">https://blog.galih.eu/tips-menggunakan-array-list-dalam-python</guid><category><![CDATA[Python]]></category><category><![CDATA[Programming Tips]]></category><category><![CDATA[python beginner]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[arrays]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Wed, 27 Oct 2021 20:43:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636843549910/F0dMvB4cP.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillaah</em>.</p>
<p><strong><em>List</em></strong> merupakan tipe bawaan (<em>built-in</em>) dalam bahasa pemrograman Python yang dapat digunakan untuk menampung lebih dari satu buah data dengan tipe yang berbeda-beda. Data dalam <em>list</em> memiliki nomor urut (indeks) dari 0 dan seterusnya hingga sebanyak jumlah data seluruhnya dalam <em>list</em> tersebut.</p>
<p>Struktur data berupa rangkaian data atau larik (<em>array</em>) yang mirip dengan list adalah <em>tuple</em>. Kalau <em>list</em> isinya dapat diubah, sedangkan data dalam <em>tuple</em> tidak dapat diubah (<em>immutable</em>).</p>
<p>Panduan penggunaan tipe data <em>list</em> dapat ditelusuri di website <a target="_blank" href="https://docs.python.org/3/tutorial/datastructures.html"><em>Python</em></a>. Dalam artikel ini saya akan berbagi beberapa tips dan trik penggunaan <em>list</em> yang dapat membantu mempercepat atau memudahkan dalam pemrosesan data lebih lanjut. Penggunaan dasar terkait <em>list</em> lebih lengkap dapat dicek di website lain yang akan saya cantumkan di bagian bawah artikel.</p>
<h3 id="1-membuat-sebuah-teks-string-dari-isi-list">1. Membuat sebuah teks (<em>string</em>) dari isi <em>list</em>.</h3>
<p>Isi <em>list</em> digabung menggunakan fungsi <em>join string</em>, dimana <em>separator</em> (pemisah) antar nilai adalah menggunakan <em>spasi</em>.</p>
<pre><code class="lang-python">daftar = [<span class="hljs-string">'aku'</span>, <span class="hljs-string">'cinta'</span>, <span class="hljs-string">'indonesia'</span>]  
teks = <span class="hljs-string">" "</span>.join(daftar)  
print(teks)

<span class="hljs-comment">#output: "aku cinta indonesia"</span>
</code></pre>
<h3 id="2-pemeriksaan-list-kosong-atau-tidak">2. Pemeriksaan <em>list</em> kosong atau tidak.</h3>
<p>Untuk memeriksa sebuah <em>list</em> ada isinya atau tidak, biasanya dilakukan dengan cara memeriksa jumlah data dalam <em>list</em>.</p>
<p><code>len(daftar) == 0</code></p>
<p>Pernyataan di atas mengeluarkan nilai <em>True</em>, jika panjang atau jumlah data dalam <em>list daftar</em> kosong (atau tidak ada isinya). Sebaliknya, bernilai <em>False</em> jika ada isinya (minimal satu buah data).</p>
<p>Dalam python, sebuah <em>list</em> yang ada isinya, akan mengeluarkan nilai <em>True</em> jika dilakukan pembandingan dalam sebuah kondisi.</p>
<pre><code><span class="hljs-comment"># jika ingin memeriksa apakah list daftar ada isinya  </span>
<span class="hljs-keyword">if</span> daftar:  
   <span class="hljs-keyword">...</span>

<span class="hljs-comment"># jika ingin memeriksa apakah list daftar tidak ada isinya  </span>
<span class="hljs-keyword">if</span> not daftar:  
   <span class="hljs-keyword">...</span>
</code></pre><p>Contoh penggunaannya adalah sebagai berikut.</p>
<pre><code class="lang-python">keranjang1 = [<span class="hljs-string">"jeruk"</span>, <span class="hljs-string">"anggur"</span>, <span class="hljs-string">"manggis"</span>]  
keranjang2 = []

<span class="hljs-keyword">if</span> keranjang1:   
    print(<span class="hljs-string">"Keranjang 1 ada isinya"</span>)  
<span class="hljs-keyword">else</span>:  
    print(<span class="hljs-string">"Keranjang 1 kosong"</span>)

<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> keranjang2:   
    print(<span class="hljs-string">"Keranjang 2 kosong"</span>)  
<span class="hljs-keyword">else</span>:  
    print(<span class="hljs-string">"Keranjang 2 ada isinya"</span>)

<span class="hljs-comment"># output:  </span>
<span class="hljs-comment"># Keranjang 1 ada isinya  </span>
<span class="hljs-comment"># Keranjang 2 kosong</span>
</code></pre>
<h3 id="3-menggabung-isi-list">3. Menggabung isi <em>list</em></h3>
<p>Ada dua konsep dalam menggabung isi list, yaitu (1) menggabung dengan model ditumpuk,</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796972403/-MuqrI1Xn.png" alt /></p>
<pre><code class="lang-python">listBenda = [<span class="hljs-string">"Daun"</span>, <span class="hljs-string">"Rambut"</span>, <span class="hljs-string">"Langit"</span>]  
listWarna = [<span class="hljs-string">"Hijau"</span>, <span class="hljs-string">"Hitam"</span>, <span class="hljs-string">"Biru"</span>]

listGabungan = listBenda + listWarna

print(listGabungan)  
<span class="hljs-comment">#output = ['Daun', 'Rambut', 'Langit', 'Hijau', 'Hitam', 'Biru']</span>
</code></pre>
<p>dan cara (2) adalah dengan menggabungkan setiap data di <em>list</em> A dan B secara berdampingan (per item).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796974034/5ZoqbRuCl.png" alt /></p>
<p>Sebelum menerapkan cara kedua, yang perlu diketahui adalah terdapat fungsi bawaan bernama <strong><em>zip</em></strong> yang dapat digunakan untuk menggabung dua <em>list</em> secara berdampingan (per item), hanya saja bentuknya bukan <em>list</em> murni, melainkan <em>object</em>.</p>
<pre><code class="lang-python"><span class="hljs-comment"># hasil gabungan berupa _object_  </span>
listGabungan2 = zip(listBenda, listWarna)

<span class="hljs-comment"># cara akses  </span>
<span class="hljs-keyword">for</span> benda, warna <span class="hljs-keyword">in</span> listGabungan2:  
    print(benda,warna)

<span class="hljs-comment"># output:  </span>
<span class="hljs-comment"># Daun Hijau  </span>
<span class="hljs-comment"># Rambut Hitam  </span>
<span class="hljs-comment"># Langit Biru</span>
</code></pre>
<p>Atau dengan mengkonversi <em>object</em> tersebut ke bentuk <em>list</em>.</p>
<pre><code class="lang-python">listGabungan3 = list(zip(listBenda, listWarna))  
print(listGabungan3)

<span class="hljs-comment"># output: [('Daun', 'Hijau'), ('Rambut', 'Hitam'), ('Langit', 'Biru')]</span>
</code></pre>
<p>Biasanya untuk penggabungan model seperti ini lebih sesuai dikonversi ke bentuk kamus (<em>dictionary</em>).</p>
<pre><code class="lang-python">kamus = dict(zip(listBenda, listWarna))  
print(kamus)

<span class="hljs-comment"># output: {'Daun': 'Hijau', 'Rambut': 'Hitam', 'Langit': 'Biru'}</span>
</code></pre>
<p>Adapun kalau ingin dibentuk dalam format list seperti biasanya, dapat memanfaatkan <em>list extend</em>. Fungsi <em>list.extend</em> ini digunakan untuk menambah (atau menggabung) isi <em>list</em> dari <em>list</em> lain.</p>
<pre><code class="lang-python">listGabungan4 = []  
<span class="hljs-keyword">for</span> benda, warna <span class="hljs-keyword">in</span> zip(listBenda, listWarna):  
    listGabungan4.extend((benda, warna))  

print(listGabungan4)

<span class="hljs-comment"># output: ['Daun', 'Hijau', 'Rambut', 'Hitam', 'Langit', 'Biru']</span>
</code></pre>
<h3 id="4-mengembalikan-nomor-indeks-dari-nilai-yang-dicari-dalam-list">4. Mengembalikan nomor indeks dari nilai yang dicari dalam <em>list</em></h3>
<p>Dalam contoh ini kita ingin mencari sebuah nilai dalam sebuah <em>list</em>, serta ingin mengetahui posisi indeks dari nilai tersebut jika memang ditemukan. Untuk mengembalikan nilai indeks dari suatu nilai dalam <em>list</em> sebenarnya sudah ada fungsinya, yaitu <em>list index</em>. Fungsi ini akan mengembalikan pesan kesalahan <strong><em>ValueError</em></strong> jika nilai yang dicari tidak ditemukan.</p>
<pre><code class="lang-python">angkaAcak = [<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">6</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">2</span>,<span class="hljs-number">7</span>,<span class="hljs-number">9</span>,<span class="hljs-number">7</span>,<span class="hljs-number">2</span>]  
angkaCari = <span class="hljs-number">2</span>

print(angkaAcak.index(angkaCari)) <span class="hljs-comment"># output = 0  </span>
print(angkaAcak.index(<span class="hljs-number">10</span>)) <span class="hljs-comment"># output = ValueError: 10 is not in list</span>

<span class="hljs-comment"># mencari angka 2 mulai dari indeks ke-1  </span>
print(angkaAcak.index(angkaCari,<span class="hljs-number">1</span>)) <span class="hljs-comment"># output = 6</span>

<span class="hljs-comment"># mencari angka 2 mulai dari indeks ke-7  </span>
print(angkaAcak.index(angkaCari,<span class="hljs-number">7</span>)) <span class="hljs-comment"># output = 10</span>
</code></pre>
<p>Solusi alternatif untuk menghindari <strong><em>ValueError</em></strong> adalah dengan melakukan pencarian secara manual melalui perulangan.</p>
<pre><code class="lang-python"><span class="hljs-keyword">for</span> idx,angka <span class="hljs-keyword">in</span> enumerate(angkaAcak):  
    <span class="hljs-keyword">if</span> angka == angkaCari:  
        print(idx)

<span class="hljs-comment"># output:   </span>
<span class="hljs-comment"># 0   </span>
<span class="hljs-comment"># 6   </span>
<span class="hljs-comment"># 10</span>
</code></pre>
<p>Adapun solusi yang lebih pendek, dimana sering disebut dengan istilah <strong><em>list comprehension</em></strong> adalah sebagai berikut.</p>
<pre><code class="lang-python">lstCari = [idx <span class="hljs-keyword">for</span> idx,angka <span class="hljs-keyword">in</span> enumerate(angkaAcak) <span class="hljs-keyword">if</span> angka == angkaCari]  
print(lstCari)

<span class="hljs-comment"># output: [0, 6, 10]</span>
</code></pre>
<h3 id="5-menghitung-jumlah-kemunculan-dari-suatu-nilai">5. Menghitung jumlah kemunculan dari suatu nilai</h3>
<p>Untuk menghitung kemunculan sebuah nilai dalam sebuah <em>list</em> yang paling sederhana adalah dengan menggunakan fungsi <strong><em>list count</em></strong>.</p>
<pre><code class="lang-python">angkaAcak = [<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">6</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">2</span>,<span class="hljs-number">7</span>,<span class="hljs-number">9</span>,<span class="hljs-number">7</span>,<span class="hljs-number">2</span>]  
angkaCari = <span class="hljs-number">2</span>

jml = angkaAcak.count(angkaCari)  
print(<span class="hljs-string">f"Angka <span class="hljs-subst">{angkaCari}</span> ditemukan sejumlah <span class="hljs-subst">{jml}</span> kali"</span>)

<span class="hljs-comment"># output: Angka 2 ditemukan sejumlah 3 kali</span>
</code></pre>
<p>Bagaimana jika pencarian nilai berdasarkan kondisi tertentu? Misal mencari nilai ganjil atau menghitung kemunculan angka ganjil. Caranya dapat menggunakan kombinasi <em>list comprehension</em> pada tips 4 sebelumnya.</p>
<pre><code class="lang-python">angkaGanjil = [angka <span class="hljs-keyword">for</span> angka <span class="hljs-keyword">in</span> angkaAcak <span class="hljs-keyword">if</span> angka % <span class="hljs-number">2</span> == <span class="hljs-number">1</span>]  
print(angkaGanjil) <span class="hljs-comment"># output: [3, 5, 7, 9, 7]  </span>
print(<span class="hljs-string">f"Jumlah: <span class="hljs-subst">{len(angkaGanjil)}</span>"</span>) <span class="hljs-comment"># output: "Jumlah: 5"</span>
</code></pre>
<h3 id="6-menampilkan-data-secara-unik">6. Menampilkan data secara unik</h3>
<p>Dalam sebuah <em>list</em> dapat saja ditemukan sebuah nilai yang muncul lebih dari satu kali atau nilai kembar. Kadang-kadang kita membutuhkan nilai yang benar-benar unik, yaitu dengan cara mengeliminasi data kembarannya tersebut. Salah satu solusinya adalah dengan mengkonversi data <em>list</em> ke data <strong><em>set</em></strong>. Tipe data <strong><em>set</em></strong> hanya menerima sekumpulan nilai yang bersifat unik, sehingga jika ada yang kembar akan otomatis dihilangkan.</p>
<pre><code class="lang-python">angkaAcak = [<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">6</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">2</span>,<span class="hljs-number">7</span>,<span class="hljs-number">9</span>,<span class="hljs-number">7</span>,<span class="hljs-number">2</span>]  
angkaUnik = set(angkaAcak)

<span class="hljs-comment"># luaran berupa tipe data set </span>
print(angkaUnik) <span class="hljs-comment"># output: {2, 3, 4, 5, 6, 7, 9}</span>

<span class="hljs-comment"># luaran hasil konversi tipe data set ke list</span>
print(list(angkaUnik)) <span class="hljs-comment"># output: [2, 3, 4, 5, 6, 7, 9]</span>
</code></pre>
<h3 id="7-menampilkan-isi-list-yang-ada-pada-list-lain">7. Menampilkan isi <em>list</em> yang ada pada <em>list</em> lain</h3>
<p>Kadang kita ingin mengetahui apakah ada isi dari sebuah <em>list</em> yang juga terdapat pada isi <em>list</em> lainnya atau istilahnya beririsan. Dalam hal ini kita manfaatkan lagi <strong><em>list comprehension</em></strong> dengan cara membandingkan isi dari masing-masing (kedua <em>list</em>) dalam sebuah perulangan.</p>
<pre><code class="lang-python">barang1 = [<span class="hljs-string">'buku'</span>, <span class="hljs-string">'pensil'</span>, <span class="hljs-string">'penggaris'</span>]  
barang2 = [<span class="hljs-string">'penghapus'</span>, <span class="hljs-string">'kertas'</span>, <span class="hljs-string">'buku'</span>]

barangSama = [b <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> barang1 <span class="hljs-keyword">for</span> b2 <span class="hljs-keyword">in</span> barang2 <span class="hljs-keyword">if</span> b==b2]  
print(barangSama) <span class="hljs-comment">#output: ['buku']</span>
</code></pre>
<h3 id="8-menampilkan-isi-dari-dua-list-yang-tidak-beririsan">8. Menampilkan isi dari dua <em>list</em> yang tidak beririsan</h3>
<p>Tips ini kebalikan dari tips no. 7 sebelumnya. Yaitu menemukan data dalam kedua list yang tidak saling beririsan. Solusinya adalah dengan memanfaatkan fungsi <strong><em>symmetric difference</em></strong> pada tipe data <em>set</em>, yang berfungsi untuk mencari perbedaan nilai dari dua <em>set</em> yang dibandingkan.</p>
<pre><code class="lang-python">barang1 = [<span class="hljs-string">'buku'</span>, <span class="hljs-string">'pensil'</span>, <span class="hljs-string">'penggaris'</span>]  
barang2 = [<span class="hljs-string">'penghapus'</span>, <span class="hljs-string">'kertas'</span>, <span class="hljs-string">'buku'</span>]

set_barang1 = set(barang1)  
set_barang2 = set(barang2)

listBarang = list(set_barang1.symmetric_difference(set_barang2))  
print(listBarang) 

<span class="hljs-comment"># output: ['kertas', 'penghapus', 'penggaris', 'pensil']</span>
</code></pre>
<h3 id="9-mengurutkan-data">9. Mengurutkan data</h3>
<p>Pengurutan data dapat dilakukan secara <em>ascending</em> maupun <em>descending</em>. Fungsi bawaan yang tersedia adalah <strong><em>sorted</em></strong>.</p>
<pre><code class="lang-python">angkaAcak = [<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">6</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">2</span>,<span class="hljs-number">7</span>,<span class="hljs-number">9</span>,<span class="hljs-number">7</span>,<span class="hljs-number">2</span>]

dataUrutAsc = sorted(angkaAcak)  
dataUrutDesc = sorted(angkaAcak,reverse=<span class="hljs-literal">True</span>)

print(dataUrutAsc) <span class="hljs-comment"># output: [2, 2, 2, 3, 4, 4, 5, 6, 7, 7, 9]  </span>
print(dataUrutDesc) <span class="hljs-comment"># output: [9, 7, 7, 6, 5, 4, 4, 3, 2, 2, 2]  </span>
print(angkaAcak) <span class="hljs-comment"># output: [2, 3, 4, 6, 4, 5, 2, 7, 9, 7, 2]</span>
</code></pre>
<p>Perhatikan bahwa fungsi <em>sorted</em> tidak memodifikasi isi dari <em>list</em> yang diurutkan, sehingga isi <em>list angkaAcak</em> tidak berubah. Jika ingin sekaligus mengubah isi <em>list</em> yang dituju, maka dapat menggunakan fungsi <strong><em>list sort</em></strong>.</p>
<pre><code class="lang-python">angkaAcak.sort()  
print(angkaAcak) <span class="hljs-comment"># output: [2, 2, 2, 3, 4, 4, 5, 6, 7, 7, 9]</span>
</code></pre>
<p>Sekedar mengingatkan, konversi data <em>list</em> ke tipe data <em>set</em> selain berguna untuk mengeliminasi data kembar juga secara otomatis mengurutkan data di dalamnya.</p>
<pre><code class="lang-python">angkaAcakDua = [<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">6</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">2</span>,<span class="hljs-number">7</span>,<span class="hljs-number">9</span>,<span class="hljs-number">7</span>,<span class="hljs-number">2</span>]  
dataUrutUnik = list(set(angkaAcakDua))  
print(dataUrutUnik) <span class="hljs-comment"># output: [2, 3, 4, 5, 6, 7, 9]</span>
</code></pre>
<h3 id="10-membongkar-elemen-list-dengan">10. Membongkar elemen <em>list</em> dengan <strong>*</strong></h3>
<p>Dalam tips ke-1 di atas, data <em>list</em> yang bisa diubah ke bentuk gabungan dalam sebuah <em>string</em> adalah isi <em>list</em> yang juga berupa <em>string</em>. Jika isi list berupa bilangan, misalnya <em>integer</em>, akan menyebabkan kesalahan.</p>
<pre><code class="lang-python">angkaAcak = [<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">6</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">2</span>,<span class="hljs-number">7</span>,<span class="hljs-number">9</span>,<span class="hljs-number">7</span>,<span class="hljs-number">2</span>]

strAngka = <span class="hljs-string">" "</span>.join(angkaAcak)  
print(angkaAcak)

<span class="hljs-comment"># TypeError: sequence item 0: expected str instance, int found</span>
</code></pre>
<p>Solusinya adalah dengan menempatkan karakter <strong>*</strong> yang diletakkan sebelum <em>list</em>, yang digunakan untuk membongkar elemen <em>list</em>.</p>
<pre><code class="lang-python">print(angkaAcak) <span class="hljs-comment"># output: "2 3 4 6 4 5 2 7 9 7 2"</span>

print(set(angkaAcak)) <span class="hljs-comment"># output: "2 3 4 5 6 7 9"</span>
</code></pre>
<p>Kegunaan lain tanda <strong>*</strong> dalam sebuah <em>variable</em> adalah menampung data list “<em>sisa</em>” atau dikenal dengan istilah <strong><em>partial assignments</em></strong>.</p>
<pre><code class="lang-python">buah = [<span class="hljs-string">'jeruk'</span>, <span class="hljs-string">'mangga'</span>, <span class="hljs-string">'nanas'</span>, <span class="hljs-string">'apel'</span>, <span class="hljs-string">'manggis'</span>]  
print(buah)  
<span class="hljs-comment"># output: "jeruk mangga nanas apel manggis"</span>

b_satu, *b_sisa = buah

print(b_satu) <span class="hljs-comment"># output: "jeruk"  </span>
print(b_sisa) <span class="hljs-comment"># output: ['mangga', 'nanas', 'apel', 'manggis']</span>
</code></pre>
<p>Perhatikan bahwa pada dasarnya, jika ditemukan tanda * sebelum nama <em>variable</em>, itu bermakna mengambil semua isi data <em>list</em>. Contoh pada <em>variable</em> *<strong>b_sisa</strong>, karena didahului dengan <em>variable</em> <strong>b_satu</strong>, maka <strong>b_satu</strong> hanya dialokasikan isi <em>list</em> pada indeks nol, dan sisa isi <em>list</em> dialokasikan pada <em>variable</em> <strong>b_sisa</strong>. Kita coba eksperimen lain sebagai berikut.</p>
<pre><code class="lang-python">b_satu, *b_tengah, b_akhir = buah

print(b_satu) <span class="hljs-comment"># output: "jeruk"  </span>
print(b_tengah) <span class="hljs-comment"># output: ['mangga', 'nanas', 'apel']  </span>
print(b_akhir) <span class="hljs-comment"># output: "manggis"</span>
</code></pre>
<p><em>Variable</em> <strong>b_satu</strong> dan <strong>b_akhir</strong> mendapat alokasi isi <em>list</em> pertama dan terakhir (satu buah nilai), sisanya diberikan pada <strong>b_tengah</strong>.</p>
<p><strong>11. Mengiris (<em>slicing</em>) data</strong></p>
<p><em>Slicing</em> merupakan fitur bawaan untuk mengambil isi dalam <em>list</em> sesuai nomor indeks dan jumlah data yang telah ditentukan.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796975450/fxpm3jOnd.png" alt /></p>
<p>Berikut ini contoh <em>slicing</em> data dalam berbagai cara.</p>
<pre><code class="lang-python">data = [<span class="hljs-string">'budi'</span>, <span class="hljs-number">20</span>, <span class="hljs-string">'andi'</span>, <span class="hljs-number">21</span>, <span class="hljs-string">'indah'</span>, <span class="hljs-number">19</span>, <span class="hljs-string">'arman'</span>, <span class="hljs-number">21</span>]

<span class="hljs-comment"># mengambil data pada indeks ke-0 (atau pertama)  </span>
print(data[<span class="hljs-number">0</span>]) <span class="hljs-comment"># output: budi</span>

<span class="hljs-comment"># indeks terakhir disimbolkan dengan angka "-1"  </span>
print(data[<span class="hljs-number">-1</span>]) <span class="hljs-comment"># output: 21</span>

<span class="hljs-comment"># mengambil data pertama hingga sebelum indeks ke-2  </span>
print(data[:<span class="hljs-number">2</span>]) <span class="hljs-comment"># output: ['budi', 20]</span>

<span class="hljs-comment"># mengambil data pada indeks -2 hingga terakhir  </span>
print(data[<span class="hljs-number">-2</span>:]) <span class="hljs-comment"># output: ['arman', 21]</span>

<span class="hljs-comment"># mengambil data dari indeks ke-0 hingga akhir dengan 2 langkah  </span>
<span class="hljs-comment"># indeks: 0, 2, 4, 6  </span>
print(data[::<span class="hljs-number">2</span>]) <span class="hljs-comment"># output: ['budi', 'andi', 'indah', 'arman']</span>

<span class="hljs-comment"># mengambil data dari indeks ke-1 hingga akhir dengan 2 langkah  </span>
<span class="hljs-comment"># indeks: 1, 3, 5, 7  </span>
print(data[<span class="hljs-number">1</span>::<span class="hljs-number">2</span>]) <span class="hljs-comment"># output: [20, 21, 19, 21]</span>

<span class="hljs-comment"># mengambil data list secara terbalik  </span>
print(data[::<span class="hljs-number">-1</span>])  
<span class="hljs-comment"># output: [21, 'arman', 19, 'indah', 21, 'andi', 20, 'budi']</span>
</code></pre>
<p>Fungsi bawaan dari tipe data <em>list</em> sebenarnya cukup banyak. Beberapa website yang bisa dijadikan sumber belajar adalah <a target="_blank" href="https://docs.python.org/3/tutorial/datastructures.html">Python Docs</a>, <a target="_blank" href="https://belajarpython.com/tutorial/list-python">Belajar Python</a>, dan <a target="_blank" href="https://jagongoding.com/python/dasar/list/">Jago Ngoding</a>.</p>
<p>Demikian tips dan trik terkait pemanfaatan tipe data <em>list</em> dalam <em>Python</em>. 
Semoga bermanfaat. </p>
<p>Terima kasih.</p>
<hr />
<p>Kode sumber dari tutorial ada di github repo. Cek juga versi notebook statis di <a target="_blank" href="https://github.com/galihboy/python_list/blob/main/list_tips_n_tricks.ipynb">Github</a> [<em>up-to-date</em>], <a target="_blank" href="https://datalore.jetbrains.com/view/notebook/nQSEKFFpuveXre3AWXeaPU">Datalore</a> atau yang versi interaktif di <a target="_blank" href="https://mybinder.org/v2/gh/galihboy/python_list/ac5caee1eaeb8de324bc220b1e13564568c758bb?urlpath=lab%2Ftree%2Flist_tips_n_tricks.ipynb">MyBinder</a>.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/galihboy/python_list">https://github.com/galihboy/python_list</a></div>
<p><a target="_blank" href="https://galih.eu/"><strong>Website</strong></a> <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/"><strong>Github Pages</strong></a> <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/mini_projects/"><strong>Demo Mini Projects</strong></a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796976894/HsAZE2YIx.gif" alt /></p>
]]></content:encoded></item><item><title><![CDATA[Instalasi dan Konfigurasi Python Multi Versi + Virtual Environment di Windows 11]]></title><description><![CDATA[Bismillaah Alhamdulillah. 
Buat apa install banyak Python dengan beda versi, kalau satu saja sudah cukup? 😊
Ceritanya begini, instalasi Python di OS Windows 11 saya semula melalui aplikasi Anaconda. Warisan dari instalasi lama di Windows 10 selumnya...]]></description><link>https://blog.galih.eu/instalasi-dan-konfigurasi-python-multi-versi-virtual-environment-di-windows-11</link><guid isPermaLink="true">https://blog.galih.eu/instalasi-dan-konfigurasi-python-multi-versi-virtual-environment-di-windows-11</guid><category><![CDATA[virtual environment]]></category><category><![CDATA[Python]]></category><category><![CDATA[Windows]]></category><category><![CDATA[setup]]></category><category><![CDATA[python beginner]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Mon, 25 Oct 2021 14:34:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636841758285/7AxviLSud.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillah.</em> </p>
<p>Buat apa <em>install</em> banyak Python dengan beda versi, kalau satu saja sudah cukup? 😊</p>
<p>Ceritanya begini, instalasi <em>Python</em> di <em>OS</em> Windows 11 saya semula melalui aplikasi <em>Anaconda</em>. Warisan dari instalasi lama di Windows 10 selumnya. Setelah sekian lama <em>install</em>, <em>uninstall</em>, <em>update</em>/<em>upgrade</em> aplikasi atau paket <em>library</em> di dalamnya — di berbagai <em>virtual environment</em> berbeda — akhirnya ada konflik antar paket di <em>anaconda</em>-nya.</p>
<p>Sudah saya coba melakukan <em>update</em> semua paket ke <em>anaconda</em> terbaru atau coba <em>reset</em> (<em>rollback</em>) ke versi yang lama, tapi masih bermasalah. Coba <em>uninstall anaconda</em>, hapus semua direktori terkait <em>anaconda</em>, bahkan sampai ke <em>registry</em>-nya, kemudian <em>install</em> ulang <em>fresh</em>, juga belum mempan.</p>
<p>Akhirnya ambil keputusan buat <em>uninstall anaconda</em> dan coba <em>install python</em> yang versi asli (atau <em>standalone</em>). Pilihan pertama ingin mencoba <em>python</em> versi terbaru yaitu versi <strong>3.10</strong>, langsung unduh di <a target="_blank" href="https://www.python.org/downloads/">websitenya</a>.</p>
<hr />
<h3 id="1-instalasi-awal">1. Instalasi Awal</h3>
<p>Setelah unduh file <strong><em>python-3.10.0-amd64.exe</em></strong>, langsung buka untuk melakukan instalasi. Tutorial instalasi sudah tersedia di <a target="_blank" href="https://docs.python.org/3/using/windows.html">websitenya</a> juga.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796983709/q2c2dM7Bs.png" alt /></p>
<p>Untuk setelan di gambar sebelah kiri dicentang semua pilihannya, dan sebelah kanan juga begitu (sebagian saja, lihat gambar). Untuk alamat direktori instalasi saya pilih di direktori <em>user</em> dan nama <em>folder</em>-nya <em>Python310</em>. Di halaman instalasi awal (tidak saya <em>screenshot</em>), terdapat opsi: <strong><em>Add Python 3.10 to PATH</em></strong>, dicentang saja biar nanti dapat otomatis dipanggil melalui <em>windows console</em> di direktori manapun. Hal ini juga berlaku untuk <em>python</em> versi <strong><em>3.8</em></strong> dan <strong><em>3.9</em></strong>.</p>
<p>Jika instalasi dan konfigurasi berhasil, kita dapat langsung mengujinya dengan membuka <em>command prompt</em>, dan mengetikkan <em>python [tekan ENTER]</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796985400/fh3tmIwbV.png" alt /></p>
<p>Untuk memeriksa alamat direktori instalasi, kita dapat menggunakan perintah: <code>pip -V</code>. Sebenarnya perintah ini digunakan untuk memeriksa versi dari aplikasi <em>pip</em> dan alamat direktori paket <em>library</em> dari <em>python</em> yang diinstal.</p>
<blockquote>
<p>C:\Users\galih-hermawan&gt;<strong>pip -V</strong><br />pip 21.3.1 from C:\Users\galih-hermawan\Python310\lib\site-packages\pip (python 3.10)</p>
</blockquote>
<p>Sebagai tambahan info, salah satu tempat untuk menyimpan hasil konfigurasi agar aplikasi <em>python</em> dapat dipanggil langsung di <em>command prompt</em> adalah berada di :</p>
<blockquote>
<p>System Properties &gt;Advanced &gt; Environment Variables</p>
</blockquote>
<p>Kalau di Windows, cukup ketik kata “<em>env</em>” di kotak pencarian langsung otomatis muncul tautan programnya.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796986897/EcVyvnETQ.png" alt /></p>
<p>Setelah tombol “<strong><em>Environment Variables</em></strong>” diklik, akan muncul halaman berikut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796988471/UEfkrgE4U-.png" alt /></p>
<p>Klik ganda atau tekan tombol <strong><em>Edit</em></strong>, setelah menyorot pada pilihan (kolom) <strong><em>Variable</em></strong>, berisi <strong><em>Path</em></strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796989935/ufgbuChXZ.png" alt /></p>
<p>Selama terdapat isian alamat direktori <em>python</em> di sini, maka semua aplikasi yang ada di direktori tersebut akan dapat dipanggil di <em>command prompt</em> secara langsung. Jika tidak ada, dapat dibuatkan <em>path</em> barunya dengan cara tekan tombol <strong><em>New</em></strong>, dan masukkan alamat direktori instalasi dari Python yang diinginkan.</p>
<hr />
<h3 id="2-instalasi-paket-library-dan-pembuatan-virtual-environment">2. Instalasi Paket Library dan Pembuatan Virtual Environment</h3>
<p>Penjelasan terkait apa pentingnya dan tutorial dasar penggunaannya dapat melihat di <a target="_blank" href="https://docs.python.org/3/tutorial/venv.html">website resminya</a> atau di <a target="_blank" href="https://realpython.com/python-virtual-environments-a-primer/">Real Python</a>.</p>
<p>Singkatnya, jika tidak menggunakan <em>virtual environment</em> (<strong><em>venv</em></strong>), semua aplikasi paket library akan disimpan di direktori <code>Lib\site-packages\</code> dalam direktori instalasi <em>python</em> kita sebelumnya. Jika menggunakan <strong><em>venv</em></strong>, tempat penyimpanan paket dapat diletakkan di mana saja selain di direktori instalasi.</p>
<p>Misalnya, <strong><em>venv</em></strong> untuk mengembangkan aplikasi berbasis GUI (<em>graphical user interface</em>) dibedakan dengan <strong><em>venv</em></strong> <em>untuk</em> aplikasi berbasis website, atau <em>mobile</em>.</p>
<p>Sebelum melakukan instalasi <em>virtual environment</em> (<strong><em>venv</em></strong>), sebaiknya kita juga memeriksa jika ada pembaruan pada aplikasi-aplikasi yang terlibat dalam melakukan instalasi, yaitu: <em>pip</em>, <em>setuptools</em>, dan <em>wheel</em>. Berikut perintah melakukan <em>upgrade</em> aplikasi jika tersedia.</p>
<pre><code class="lang-command">pip install --upgrade pip setuptools wheel
</code></pre>
<p>Berikutnya kita lakukan instalasi <strong><em>venv</em></strong> dengan mengeksekusi perintah berikut ini.</p>
<pre><code class="lang-shell">pip install virtualenv
</code></pre>
<p>Jika instalasi berhasil, berikutnya adalah kita dapat membuat <strong><em>venv</em></strong> dengan nama bebas. Aturan perintah dalam pembuatan <strong><em>venv</em></strong> adalah:</p>
<pre><code class="lang-console">python -m venv nama_venv
</code></pre>
<p>Pertama-tama adalah menetapkan dulu alamat direktori <strong><em>venv</em></strong>. Misalkan dalam contoh ini saya gunakan alamat berikut.</p>
<blockquote>
<p>D:\PythonKu\#venv\</p>
</blockquote>
<p>Misal kita akan membuat <strong><em>venv</em></strong> dengan nama <em>WebApps</em>. Cara pertama, dalam jendela <em>command prompt</em>, kita langsung dapat mengetikkan perintah berikut:</p>
<pre><code class="lang-command">python -m venv D:\PythonKu\#venv\WebApps
</code></pre>
<p>Isian <em>nama_venv</em> adalah nama <strong><em>venv</em></strong> disertai alamat direktori penyimpanan <strong><em>venv</em></strong> yang kita tetapkan. Dalam alamat <strong><em>venv</em></strong> tersebut akan otomatis dibuatkan folder baru bernama <em>WebApps</em> yang sudah ada isinya.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796991301/ErGtb5gPJ.png" alt /></p>
<p>Cara kedua, dari jendela <em>command prompt</em>, kita lakukan perintah pindah direktori ke direktori <strong><em>venv</em></strong>, kemudian buat <strong><em>venv</em></strong> baru dengan nama misalnya <em>WebAppsDua</em>.</p>
<blockquote>
<p>C:\Users\galih-hermawan&gt;<strong>cd D:\PythonKu\#venv\  
</strong>C:\Users\galih-hermawan&gt;<strong>d:  
</strong>D:\PythonKu\#venv&gt;<strong>python -m venv WebAppsDua</strong></p>
</blockquote>
<hr />
<h3 id="3-mengaktifkan-dan-menggunakan-virtual-environment">3. Mengaktifkan dan Menggunakan <em>Virtual</em> E<em>nvironment</em></h3>
<p>Setelah berhasil membuat <strong><em>venv</em></strong>, kita coba melakukan aktifasi <strong><em>venv</em></strong> dan bekerja di dalamnya. Untuk mengkatifkan <strong><em>venv</em></strong> kita ketikkan perintah dengan ketentuan berikut.</p>
<blockquote>
<p><strong>nama_venv</strong>\Scripts\activate</p>
</blockquote>
<p>Jika posisi direktori <em>default</em> di <em>command prompt</em> ada di luar alamat direktori <strong><em>venv</em></strong>, maka kita cukup mengetikkan alamat direktori lengkap dari nama <strong>venv</strong> (contoh kasus <strong><em>venv</em></strong> <em>WebApps</em>) disertai dengan tambahan perintah “<strong><em>\Scripts\activate</em></strong>”.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796992741/iv66MSgQY.png" alt /></p>
<p>Cara lain adalah dengan pindah direktori dulu ke alamat <strong>#venv</strong> kemudian mengetikkan perintah sebagaimana ada dalam ketentuan di atas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796994133/O4DMynnNP.png" alt /></p>
<p><em>Nah</em>, setelah behasil mengaktifkan <strong><em>venv</em></strong>, kita dapat melakukan instalasi paket <em>library</em> dan bekerja menggunakan lingkungan <strong><em>venv</em></strong> ini. Misal, kita lakukan instalasi paket bernama: <strong>numpy</strong>.</p>
<pre><code class="lang-command">pip install numpy  
...  
Successfully installed numpy-1.21.3
</code></pre>
<p>Paket ini akan disimpan di direktori <strong><em>venv</em></strong> <em>WebApps</em>, pada folder “<strong><em>Lib\site-packages</em></strong>”.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796995507/w_b8vYbk0.png" alt /></p>
<p>Untuk keluar dari <strong><em>venv</em></strong> cukup mengetikkan perintah: <strong><em>deactivate</em></strong>.</p>
<hr />
<h3 id="4-instalasi-dan-konfigurasi-python-versi-38-dan-39">4. Instalasi dan Konfigurasi Python Versi 3.8 dan 3.9</h3>
<p>Sebelum dilanjutkan instalasi, ada cerita sedikit pengalaman menggunakan python 3.10. Waktu saya akan instal paket <a target="_blank" href="https://pypi.org/project/scikit-learn/"><strong><em>Scikit-Learn</em></strong></a> versi 1.0.1 dan <a target="_blank" href="https://pypi.org/project/scipy/"><strong><em>Scipy</em></strong></a> versi 1.7.1 (versi terakhir hingga tanggal artikel ini diterbitkan), ternyata paket tersebut baru mendukung hingga python versi 3.9.</p>
<p>Dan ketika akan memasang paket <a target="_blank" href="https://pypi.org/project/tensorflow/"><strong><em>Tensorflow</em></strong></a>, instalasi berhasil tapi <a target="_blank" href="https://developer.nvidia.com/cuda-gpus"><strong><em>Cuda (GPU)</em></strong></a> saya tidak terdeteksi. Ketika dilakukan uji coba, modul <em>tensorflow</em> ini meminta sebuah file <strong><em>.dll</em></strong> (<em>library</em>) yang terdapat pada <em>Cuda</em> versi terbaru, — yaitu versi 11 — sedangkan milik saya masih versi 10.2. Versi ini memang sesuai dengan driver GPU Nvidia saya.</p>
<p>Setelah mencari informasi di internet <a target="_blank" href="https://github.com/tensorflow/tensorflow/issues/38194">¹</a> <a target="_blank" href="https://www.tensorflow.org/install/source#gpu">²</a> <a target="_blank" href="https://forums.developer.nvidia.com/t/cuda-10-2-tensorflow-2-0-getting-an-error-when-testing-tensorflow/109712/2">³</a>, ditemukan bahwa <em>Cuda-GPU</em> versi 10.2 dapat disandingkan dengan <em>Tensorflow</em> versi 2.2.0, <em>Keras</em> versi 2.3.0, tapi harus dengan <em>Python</em> 3.8 😔. Dikarenakan belum berhasil untuk <a target="_blank" href="https://www.tensorflow.org/install/source_windows">instalasi <em>tensorflow</em> dari <em>source</em></a>, terpaksa harus <em>install python</em> versi 3.8.</p>
<p>Jadi, saat ini saya memiliki instalasi dari tiga <em>python</em> dengan versi <strong><em>3.8</em></strong>, <strong><em>3.9</em></strong>, dan <strong><em>3.10</em></strong>. Alamat direktori instalasi saya buat pada alamat direktori <em>root</em> yang sama, hanya beda nama.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796997001/DwfWYOgvI.png" alt /></p>
<p>Kemudian untuk alamat direktori <strong><em>venv</em></strong> juga dibuat dengan kondisi serupa.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796998447/1LDa-VSpGU.png" alt /></p>
<p>Untuk konfigurasi <strong><em>Path</em></strong> <em>—</em> <strong><em>Environment Variables</em></strong>, saya masukkan alamat direktori dari ketiga versi <em>python</em>. <em>Python</em> default yang akan digunakan adalah yang berada pada urutan teratas, dalam hal ini saya pilih yang versi <strong><em>3.8</em></strong>. Urutan ini dapat diganti dengan menekan tombol <strong><em>Move Up</em></strong> atau <strong><em>Move Down</em></strong> di menu sebelah kanan (dalam gambar terpotong).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636796999839/QVGQEpQKj.png" alt /></p>
<p>Selanjutnya saya buat <strong><em>venv</em></strong> sesuai kebutuhan pada masing-masing versi <em>python</em>.</p>
<hr />
<h3 id="5-penutup">5. Penutup</h3>
<p>Pada bagian penutup ini saya ingin memberikan tips bagaimana cara mengakses <em>python</em> sesuai versinya dengan mudah.</p>
<p>1. Mengubah nama file <em>python</em> yang ada di direktori instalasi dengan tambahan nomor versi. Jika yang diprioritaskan adalah <em>python</em> 3.8, maka yang versi lain nama aplikasinya dapat diubah, misal:</p>
<blockquote>
<p>Di direktori instalasi "<strong>Python39</strong>"<br />python.exe -&gt; python39.exe</p>
<p>Di direktori instalasi "<strong>Python310</strong>"<br />python.exe -&gt; python310.exe</p>
</blockquote>
<p>Untuk selanjutnya, kita cukup memanggil dengan <em>python39</em> atau <em>python310</em> jika ingin memilih versi selain <em>python</em> 3.8. Dan untuk mengakses aplikasi <em>pip</em>, khusus versi 3.9 dan 3.10, kita tidak bisa lagi sekedar dengan menulis perintah ‘<em>pip’</em>. Tapi harus disertakan nama aplikasi <em>python</em>-nya. Misalkan untuk melakukan instalasi paket (di luar <strong><em>venv</em></strong>) sesuai versi <em>python</em> adalah:</p>
<blockquote>
<p>python39 -m pip install nama_paket<br />python310 -m pip install nama_paket</p>
</blockquote>
<p>2. Tips berikutnya adalah mengkases cepat <strong><em>venv</em></strong> (dengan versi <em>python</em> berapapun) melalui <em>file</em> <strong><em>batch</em></strong> (<strong>.bat</strong>).</p>
<ul>
<li>Siapkan folder khusus untuk menyimpan <em>file batch</em>, misalnya: “<strong><em>D:\PythonKu\#bat\</em></strong>”.</li>
<li><p>Buka aplikasi <em>text editor</em> (notepad, dan sejenisnya), isi dengan:</p>
<pre><code class="lang-batch">start D:\PythonKu\#venv\py39_WebApps\Scripts\activate
</code></pre>
<p>Kode tersebut bertujuan untuk membuka <em>command prompt</em> dan mengeksekusi perintah yang mengaktifkan <strong><em>venv</em></strong> <em>WebApps</em> yang sudah dibuat di <em>Python 3.9.</em> Silakan sesuaikan sesuai dengan alamat direktori <strong><em>venv</em></strong> dan nama <strong><em>venv</em></strong> yang sudah dimiliki.</p>
</li>
<li><p>Berikutnya simpan file tersebut dengan nama yang mudah diingat, misal dalam kasus di atas adalah: <strong>py39_WebApps.bat</strong> (nama yang mewakili nama <strong><em>venv</em></strong> dan versi <em>python</em> yang dipilih.)</p>
</li>
<li>File <strong>.bat</strong> ini dapat dibuat sejumlah <strong><em>venv</em></strong> yang dimiliki sesuai dengan versi <em>python</em> masing-masing.</li>
<li>Terakhir, buat <em>shortcut</em> dari file <strong><em>.bat</em></strong> tersebut, dan kirim ke <em>Desktop</em>.</li>
</ul>
<p>Demikian cerita pengalaman kenapa dan bagaimana cara melakukan instalasi <em>python</em> dengan versi yang berbeda-beda. Semoga bermanfaat.</p>
<p><a target="_blank" href="https://galih.eu"><strong>Website</strong></a> <strong>·</strong> <a target="_blank" href="https://galihboy.github.io"><strong>Github Pages</strong></a> <strong>·</strong> <a target="_blank" href="https://galihboy.github.io/mini_projects/"><strong>Demo Mini Projects</strong></a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797001232/8TREDh8A9B.gif" alt /></p>
]]></content:encoded></item><item><title><![CDATA[Ayat-ayat Al-Qur’an yang Memerintahkan agar Taat kepada Allah ﷻ dan Rasulullah ﷺ]]></title><description><![CDATA[Bismillah Alhamdulillaah.

Dengan nama Allah Yang Maha Pengasih, Maha Penyayang. Segala puji bagi Allah, Tuhan seluruh alam, Yang Maha Pengasih, Maha Penyayang, Pemilik hari pembalasan. Hanya kepada Engkaulah kami menyembah dan hanya kepada Engkaulah...]]></description><link>https://blog.galih.eu/ayat-ayat-al-quran-yang-memerintahkan-agar-taat-kepada-allah-dan-rasulullah</link><guid isPermaLink="true">https://blog.galih.eu/ayat-ayat-al-quran-yang-memerintahkan-agar-taat-kepada-allah-dan-rasulullah</guid><category><![CDATA[Quran]]></category><category><![CDATA[education]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Mon, 18 Oct 2021 03:08:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797041588/UaUTG3QPk.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillah Alhamdulillaah</em>.</p>
<blockquote>
<p>Dengan nama Allah Yang Maha Pengasih, Maha Penyayang. Segala puji bagi Allah, Tuhan seluruh alam, Yang Maha Pengasih, Maha Penyayang, Pemilik hari pembalasan. Hanya kepada Engkaulah kami menyembah dan hanya kepada Engkaulah kami mohon pertolongan. Tunjukilah kami jalan yang lurus, (yaitu) jalan orang-orang yang telah Engkau beri nikmat kepadanya; bukan (jalan) mereka yang dimurkai, dan bukan (pula jalan) mereka yang sesat.<br /><strong>(QS. Al-Fatihah [1]: 1–7)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797009544/sCVb8ymQX.png" alt /></p>
<blockquote>
<p>Sesungguhnya Allah itu Tuhanku dan Tuhanmu, karena itu sembahlah Dia. Inilah jalan yang lurus.”<br /><strong>(QS. Ali Imran [3]: 51)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797010952/rmYj1rP7q.png" alt /></p>
<blockquote>
<p>Katakanlah (Muhammad), “Sesungguhnya Tuhanku telah memberiku petunjuk ke jalan yang lurus, agama yang benar, agama Ibrahim yang lurus. Dia (Ibrahim) tidak termasuk orang-orang musyrik.” Katakanlah (Muhammad), “Sesungguhnya salatku, ibadahku, hidupku dan matiku hanyalah untuk Allah, Tuhan seluruh alam, tidak ada sekutu bagi-Nya; dan demikianlah yang diperintahkan kepadaku dan aku adalah orang yang pertama-tama berserah diri (muslim).”<br /><strong>(QS. Al-An’am [6]: 161–163)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797012419/ppLXDACfd.png" alt /></p>
<blockquote>
<p>Katakanlah (Muhammad), “Wahai manusia! Sesungguhnya aku ini utusan Allah bagi kamu semua, Yang memiliki kerajaan langit dan bumi; tidak ada tuhan (yang berhak disembah) selain Dia, Yang menghidupkan dan mematikan, maka berimanlah kamu kepada Allah dan Rasul-Nya, (yaitu) Nabi yang ummi yang beriman kepada Allah dan kepada kalimat-kalimat-Nya (kitab-kitab-Nya). Ikutilah dia, agar kamu mendapat petunjuk.”<br /><strong>(QS. Al-A’raf [7]: 158)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797014039/J4_n0Q_3g.png" alt /></p>
<blockquote>
<p>Dan Kami tidak mengutus seorang rasul melainkan untuk ditaati dengan izin Allah. Dan sungguh, sekiranya mereka setelah menzalimi dirinya datang kepadamu (Muhammad), lalu memohon ampunan kepada Allah, dan Rasul pun memohonkan ampunan untuk mereka, niscaya mereka mendapati Allah Maha Penerima tobat, Maha Penyayang.<br /><strong>(QS An-Nisa’ [4]: 64)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797015468/L0-LwLFxB.png" alt /></p>
<blockquote>
<p>Wahai orang-orang yang beriman! Taatlah kepada Allah dan Rasul-Nya, dan janganlah kamu berpaling dari-Nya, padahal kamu mendengar (perintah-perintah-Nya),<br /><strong>(QS. Al-Anfal [8]: 20)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797016929/WCCu4JB94.png" alt /></p>
<blockquote>
<p>Dan taatlah kepada Allah dan Rasul (Muhammad), agar kamu diberi rahmat.<br /><strong>(QS. Ali Imran [3]: 132)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797018310/KGJpFrlco.png" alt /></p>
<blockquote>
<p>Dan taatilah Allah dan Rasul-Nya dan janganlah kamu berselisih, yang menyebabkan kamu menjadi gentar dan kekuatanmu hilang dan bersabarlah. Sungguh, Allah beserta orang-orang sabar.<br /><strong>(QS. Al-Anfal [8]: 46)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797019780/o2a9Kx_6Y.png" alt /></p>
<blockquote>
<p>Wahai orang-orang yang beriman! Taatilah Allah dan taatilah Rasul (Muhammad), dan Ulil Amri (pemegang kekuasaan) di antara kamu. Kemudian, jika kamu berbeda pendapat tentang sesuatu, maka kembalikanlah kepada Allah (Al-Qur’an) dan Rasul (sunnahnya), jika kamu beriman kepada Allah dan hari kemudian. Yang demikian itu lebih utama (bagimu) dan lebih baik akibatnya.<br /><strong>(QS. An-Nisa’ [4]: 59)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797021457/VuUK5P0TI.png" alt /></p>
<blockquote>
<p>Hanya ucapan orang-orang mukmin, yang apabila mereka diajak kepada Allah dan Rasul-Nya agar Rasul memutuskan (perkara) di antara mereka, mereka berkata, “Kami mendengar, dan kami taat.” Dan mereka itulah orang-orang yang beruntung.<br />Dan barang siapa taat kepada Allah dan Rasul-Nya serta takut kepada Allah dan bertakwa kepada-Nya, mereka itulah orang-orang yang mendapat kemenangan.<strong><br />(QS. An-Nur [24]: 51–52)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797022933/Oax_q4vdW.png" alt /></p>
<blockquote>
<p>Katakanlah, “Taatlah kepada Allah dan taatlah kepada Rasul; jika kamu berpaling, maka sesungguhnya kewajiban Rasul (Muhammad) itu hanyalah apa yang dibebankan kepadanya, dan kewajiban kamu hanyalah apa yang dibebankan kepadamu. Jika kamu taat kepadanya, niscaya kamu mendapat petunjuk. Kewajiban Rasul hanyalah menyampaikan (amanat Allah) dengan jelas.”<br />Allah telah menjanjikan kepada orang-orang di antara kamu yang beriman dan yang mengerjakan kebajikan, bahwa Dia sungguh, akan menjadikan mereka berkuasa di bumi, sebagaimana Dia telah menjadikan orang-orang sebelum mereka berkuasa, dan sungguh, Dia akan meneguhkan bagi mereka dengan agama yang telah Dia ridai. Dan Dia benar-benar mengubah (keadaan) mereka, setelah berada dalam ketakutan menjadi aman sentosa. Mereka (tetap) menyembah-Ku dengan tidak menyekutukan-Ku dengan sesuatu apa pun. Tetapi barang siapa (tetap) kafir setelah (janji) itu, maka mereka itulah orang-orang yang fasik.<br />Dan laksanakanlah salat, tunaikanlah zakat, dan taatlah kepada Rasul (Muhammad), agar kamu diberi rahmat.<br /><strong>(QS. An-Nur [24]: 54–56)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797024452/l2-FTvivi.png" alt /></p>
<blockquote>
<p>Wahai orang-orang yang beriman! Bertakwalah kamu kepada Allah dan ucapkanlah perkataan yang benar, niscaya Allah akan memperbaiki amal-amalmu dan mengampuni dosa-dosamu. Dan barang siapa menaati Allah dan Rasul-Nya, maka sungguh, dia menang dengan kemenangan yang agung.<br /><strong>(QS. Al-Ahzab [33]: 70–71)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797025745/Oik9otWEr.png" alt /></p>
<blockquote>
<p>Wahai orang-orang yang beriman! Penuhilah seruan Allah dan Rasul, apabila dia menyerumu kepada sesuatu yang memberi kehidupan kepadamu, dan ketahuilah bahwa sesungguhnya Allah membatasi antara manusia dan hatinya dan sesungguhnya kepada-Nyalah kamu akan dikumpulkan.<strong><br />(QS. Al-Anfal [8]: 24)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797027078/VJr7YAHvD.png" alt /></p>
<blockquote>
<p>Katakanlah (Muhammad), “Taatilah Allah dan Rasul. Jika kamu berpaling, ketahuilah bahwa Allah tidak menyukai orang-orang kafir.”<br /><strong>(QS. Ali Imran [3]: 32)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797028466/fnHGjj93B.png" alt /></p>
<blockquote>
<p>Barang siapa menaati Rasul (Muhammad), maka sesungguhnya dia telah menaati Allah. Dan barang siapa berpaling (dari ketaatan itu), maka (ketahuilah) Kami tidak mengutusmu (Muhammad) untuk menjadi pemelihara mereka.<br /><strong>(QS. An-Nisa’ [4]: 80)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797029875/JUpSX7DtC.png" alt /></p>
<blockquote>
<p>Dan barang siapa menaati Allah dan Rasul (Muhammad), maka mereka itu akan bersama-sama dengan orang yang diberikan nikmat oleh Allah, (yaitu) para nabi, para pencinta kebenaran, orang-orang yang mati syahid dan orang-orang saleh. Mereka itulah teman yang sebaik-baiknya.<br />Yang demikian itu adalah karunia dari Allah, dan cukuplah Allah yang Maha Mengetahui.<br /><strong>(QS. An-Nisa’ [4]: 69–70)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797031335/FLPkY_YuJ.png" alt /></p>
<blockquote>
<p>… Barang siapa taat kepada Allah dan Rasul-Nya, Dia akan memasukkannya ke dalam surga-surga yang mengalir di bawahnya sungai-sungai, mereka kekal di dalamnya. Dan itulah kemenangan yang agung.<br />Dan barang siapa mendurhakai Allah dan Rasul-Nya dan melanggar batas-batas hukum-Nya, niscaya Allah memasukkannya ke dalam api neraka, dia kekal di dalamnya dan dia akan mendapat azab yang menghinakan.<br /><strong>(QS. An-Nisa’ [4]: 13–14)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797032805/KoeGlUyKV.png" alt /></p>
<blockquote>
<p>Mereka menanyakan kepadamu (Muhammad) tentang (pembagian) harta rampasan perang. Katakanlah, “Harta rampasan perang itu milik Allah dan Rasul (menurut ketentuan Allah dan Rasul-Nya), maka bertakwalah kepada Allah dan perbaikilah hubungan di antara sesamamu, dan taatlah kepada Allah dan Rasul-Nya jika kamu orang-orang yang beriman.”<br />Sesungguhnya orang-orang yang beriman adalah mereka yang apabila disebut nama Allah gemetar hatinya, dan apabila dibacakan ayat-ayat-Nya kepada mereka, bertambah (kuat) imannya dan hanya kepada Tuhan mereka bertawakal, (Yaitu) orang-orang yang melaksanakan salat dan yang menginfakkan sebagian dari rezeki yang Kami berikan kepada mereka.<br />Mereka itulah orang-orang yang benar-benar beriman. Mereka akan memperoleh derajat (tinggi) di sisi Tuhannya dan ampunan serta rezeki (nikmat) yang mulia.<br /><strong>(QS. Al-Anfal [8]: 1–4)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797034414/Yvz0gGhP7.png" alt /></p>
<blockquote>
<p>Dan orang-orang yang beriman, laki-laki dan perempuan, sebagian mereka menjadi penolong bagi sebagian yang lain. Mereka menyuruh (berbuat) yang makruf, dan mencegah dari yang mungkar, melaksanakan salat, menunaikan zakat, dan taat kepada Allah dan Rasul-Nya. Mereka akan diberi rahmat oleh Allah. Sungguh, Allah Maha Perkasa, Maha Bijaksana.<br /><strong>(QS. At-Taubah [9]:71)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797035996/hS3gX8YDK.png" alt /></p>
<blockquote>
<p>Katakanlah (Muhammad), “Jika kamu mencintai Allah, ikutilah aku, niscaya Allah mencintaimu dan mengampuni dosa-dosamu.” Allah Maha Pengampun, Maha Penyayang.<br /><strong>(QS. Ali Imran [3]: 31)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797037441/7rB-EybKZ.png" alt /></p>
<blockquote>
<p>Sungguh, telah ada pada (diri) Rasulullah itu suri teladan yang baik bagimu (yaitu) bagi orang yang mengharap (rahmat) Allah dan (kedatangan) hari Kiamat dan yang banyak mengingat Allah.<strong><br />(Q5. Al-Ahzab [33]: 21)</strong></p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797038806/kcYUiSv-q.png" alt /></p>
<blockquote>
<p>… Apa yang diberikan Rasul kepadamu maka terimalah. Dan apa yang dilarangnya bagimu maka tinggalkanlah.<br /><strong>(QS. Al-Hasyr [59]: 7)</strong></p>
</blockquote>
<p><strong>Catatan.</strong></p>
<ul>
<li>Susunan ayat (surat) Al-Qur’an dan terjemahan mengikuti susunan pada buku <strong><em>Kisah Para Sahabat</em></strong> <sup>1</sup> dengan judul bab yang sama pada judul artikel.</li>
<li>Khat ayat Al-Qur’an dan terjemahan diambil dari website <strong><em>Qur’an Kemenag</em></strong> <a target="_blank" href="https://quran.kemenag.go.id"><sup>2</sup></a>.</li>
<li>Beberapa kata dalam terjemahan diubah untuk disesuaikan dengan ejaan yang ada di <strong><em>Kamus Besar Bahasa Indonesia (KBBI), Kemdikbudristek</em></strong> <a target="_blank" href="https://kbbi.kemdikbud.go.id/"><sup>3</sup></a> <a target="_blank" href="https://kbbi.web.id/"><sup>4</sup></a> tanpa mengubah makna dari kata terjemahan yang asli.</li>
<li>Dikarenakan blog Medium belum mendukung penulisan <em>right-to-left (RTL</em>), teks khat ayat Al-Qur’an yang sudah penulis kumpulkan di <em>office editor</em> harus di-<em>screenshot</em> dan ditempel di artikel ini.</li>
</ul>
<p><strong>Referensi.</strong></p>
<ol>
<li>Al Kandhalawi, M. Y., &amp; Syaifuddin, M. A., 2003. <em>Kehidupan para sahabat</em>. 1st ed. Bandung: Pustaka Zaadul Ma’aad.</li>
<li>Kementerian Agama Republik Indonesia. (2021). <em>Qur’an Kemenag</em>. Retrieved from <a target="_blank" href="https://quran.kemenag.go.id/">https://quran.kemenag.go.id/</a></li>
<li>Kementerian Pendidikan, Kebudayaan, Riset, dan Teknologi Republik Indonesia. (2021). K<em>amus Besar Bahasa Indonesia (KBBI) Daring</em>. Retrieved from <a target="_blank" href="https://kbbi.kemdikbud.go.id/">https://kbbi.kemdikbud.go.id/</a></li>
<li>Ebta Setiawan. (2021). <em>KBBI Online</em>. Retrieved from <a target="_blank" href="https://kbbi.web.id/">https://kbbi.web.id/</a></li>
</ol>
<hr />
<p>Cover Photo by <a target="_blank" href="https://unsplash.com/@adliwahid">Adli Wahid</a> on <a target="_blank" href="https://unsplash.com">Unsplash</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797040256/ubMs0wxSR.gif" alt /></p>
]]></content:encoded></item><item><title><![CDATA[Pembangkit Nama Acak Otomatis Berbasis Aturan Menggunakan Python]]></title><description><![CDATA[Bismillaah Alhamdulillah. 
Deretan nama dalam gambar di atas merupakan hasil pembangkitan otomatis yang disusun secara acak dari gabungan beberapa fail teks yang berisi nama.
Apa maksudnya berbasis aturan?
Bahwa pemerolehan nama tidak serta merta dil...]]></description><link>https://blog.galih.eu/pembangkit-nama-acak-otomatis-berbasis-aturan-menggunakan-python</link><guid isPermaLink="true">https://blog.galih.eu/pembangkit-nama-acak-otomatis-berbasis-aturan-menggunakan-python</guid><category><![CDATA[Python]]></category><category><![CDATA[python beginner]]></category><category><![CDATA[Tutorial]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Sat, 16 Oct 2021 18:40:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636839661269/ZtK5Yml_8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillah</em>. </p>
<p>Deretan nama dalam gambar di atas merupakan hasil pembangkitan otomatis yang disusun secara acak dari gabungan beberapa fail teks yang berisi nama.</p>
<p><strong>Apa maksudnya berbasis aturan?</strong></p>
<p>Bahwa pemerolehan nama tidak serta merta dilakukan hanya dengan sekadar mengacak data dari daftar nama, tapi ada nama-nama tertentu yang dalam penyusunannya mengikuti aturan yang telah ditetapkan. Begitu juga dalam pembangkitan nama dapat disesuaikan dengan aturan sendiri dari pengguna, jumlah kata (nama) yang diinginkan, apakah nama acak semua atau disertai nama permanen (atau tetapan).</p>
<p>Dalam artikel ini selanjutnya akan saya sampaikan pembahasan dari tahap paling dasar hingga jadi seperti aplikasi utuh yang siap digunakan.</p>
<hr />
<h3 id="tahap-1-tutorial-dasar-penggunaan-fungsi-random">Tahap 1. Tutorial dasar penggunaan fungsi <em>Random</em></h3>
<p>Salah satu paket (<em>library</em>) dalam <em>Python</em> untuk mengambil data secara acak dari sekumpulan data bernama <strong><em>Random</em></strong>. Berikut potongan kode untuk mengimpor <em>library</em> dan membuat contoh data (<em>tuple</em>) berisi nama.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> random
daftarNama = (<span class="hljs-string">"andi"</span>, <span class="hljs-string">"budi"</span>, <span class="hljs-string">"gunawan"</span>, <span class="hljs-string">"tanto"</span>, <span class="hljs-string">"rudi"</span>, <span class="hljs-string">"yanto"</span>, <span class="hljs-string">"sugeng"</span>)
</code></pre>
<p>Contoh pemanggilan pertama adalah mengambil satu nama secara acak dari <em>daftarNama</em>. Luaran yang dihasilkan bertipe <em>string</em>.</p>
<pre><code class="lang-python">stringNama = random.choice(daftarNama)  
<span class="hljs-comment"># stringNama berisi (contoh): 'andi'</span>
</code></pre>
<p>Yang kedua adalah mengambil nama dari <em>daftarNama</em> dengan tipe luaran berupa <em>list</em>. Pemanggilan dapat dilakukan beberapa kali yang jumlahnya diletakkan setelah parameter ‘<em>k</em>’. Luaran berupa <em>list</em>.</p>
<pre><code class="lang-python">lstNama = random.choices(daftarNama, k=<span class="hljs-number">3</span>)  
<span class="hljs-comment"># lstNama berisi (contoh): ['rudi', 'gunawan', 'gunawan']</span>
</code></pre>
<p>Pada contoh di atas, isi <em>list</em> bisa jadi berisi data kembar dikarenakan <em>method</em> <strong><em>random.choices</em></strong> dengan <strong>k=3</strong> itu bermakna jumlah pengacakan dilakukan sebanyak 3 kali. Serta tidak menjamin data yang diperolehnya acak (unik). Adapun untuk memperoleh sejumlah data secara unik adalah dengan menggunakan method <strong><em>random.sample</em></strong>, contohnya adalah sebagai berikut.</p>
<pre><code class="lang-python">jmlNama = <span class="hljs-number">3</span>  
lstNama = random.sample(daftarNama, jmlNama)  
<span class="hljs-comment"># lstNama berisi (contoh): ['tanto', 'sugeng', 'budi']</span>
</code></pre>
<p>Kode sumber untuk penerapan tutorial di atas adalah sebagai berikut.</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="0d6318c54ff984e9f9743c6a59f7633b"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/galihboy/0d6318c54ff984e9f9743c6a59f7633b" class="embed-card">https://gist.github.com/galihboy/0d6318c54ff984e9f9743c6a59f7633b</a></div><p>Penggunaan <em>library</em> <strong><em>random</em></strong> cukup mudah, dan masih ada fitur lain yang bisa dipelajari dan siapa tahu berguna buat Anda nantinya, silakan cek di laman web Python <a target="_blank" href="https://docs.python.org/3/library/random.html">¹</a>.</p>
<hr />
<h3 id="tahap-2-contoh-pemrosesan-nama-berbasis-aturan">Tahap 2. Contoh pemrosesan nama berbasis aturan</h3>
<p>Dalam agama Islam, terdapat beberapa panduan dalam memberikan nama pada seseorang. Beberapa di antaranya adalah memberikan nama harus dengan nama yang (mengandung arti) baik, mengandung do’a kebaikan, terdapat nama yang bermakna hamba Tuhan Allah S<em>ubhanahu wa Ta’ala</em> (misal; nama ‘<em>Abdul’</em> ditambah nama Allah yang baik atau <em>asmaul husna</em>), nama Nabi, sahabat Nabi, atau orang-orang shalih zaman dahulu dengan harapan supaya bisa menjadi orang baik sesuai nama yang disandangnya, dan berbagai panduan lainnya. Terdapat berbagai sumber jika kita mau menelusurinya <a target="_blank" href="https://islam.nu.or.id/post/read/103702/ketentuan-pemberian-nama-anak-selain-nama-arab">²</a> <a target="_blank" href="https://rumaysho.com/11876-hadiah-di-hari-lahir-15-bolehkah-memakai-nama-nabi-dan-malaikat.html">³</a>. Untuk kebiasaan atau tata tertib pemberian nama di agama lain, kebudayaan, atau daerah lain mungkin juga ada; hal ini dapat disesuaikan nantinya.</p>
<p>Salah satu aturan yang akan coba kita terapkan di sini adalah penggunaan nama “<em>Abdul</em>” yang berarti ‘<em>hamba’</em>. Penggunaan nama “Abdul” yang paling sesuai adalah dengan disandingkan dengan “<em>asmaul husna</em>”, contohnya adalah sebagai berikut.</p>
<blockquote>
<p># sebelah kiri panah adalah nama <strong><em>asmaul husna</em></strong> dan artinya<br /># sebelah kanan panah adalah contoh penggunaan untuk nama orang</p>
<p>Ar Rahman (Yang Maha Pengasih) <strong>-&gt;</strong> Abdul Rahman atau Abdurrahman<br />Ar Rahim (Yang Maha Penyayang) <strong>-&gt;</strong> Abdul Rahim atau Abdurrahim<br />Al Wahhab (Yang Maha Pemberi Karunia) <strong>-&gt;</strong> Abdul Wahhab<br />As Salam (Yang Maha Pemberi Kesejahteraan) <strong>-&gt;</strong> Abdul Salam atau Abdussalam<br />... dst.</p>
</blockquote>
<p>Artikel daring yang membahas “<em>asmaul husna</em>” cukup banyak ditemukan <a target="_blank" href="https://katadata.co.id/muchamadnafi/berita/60ae08b006237/asmaul-husna-99-arti-nama-nama-baik-allah-swt">⁴</a> <a target="_blank" href="https://kangsantono.wordpress.com/2014/12/09/nama-islami-dari-asmaul-husna-dengan-penambahan-kata-abd-%D8%B9%D8%A8%D8%AF-untuk-bayi-laki-laki/">⁵</a> <a target="_blank" href="https://alquran-indonesia.com/makna-asma-ul-husna-99-nama-allah/">⁶</a>. Anda dapat menelusuri dan mengkajinya lebih lanjut.</p>
<p>Nama “<em>Abdul</em>” tidak dapat berdiri sendiri, ini salah satu aturan yang akan kita gunakan. Kemudian juga tidak dapat dipasangkan dengan nama biasa yang tidak mencirikan sifat Allah yang agung. Jadi, aturan dasarnya sebagai berikut.</p>
<blockquote>
<p><strong># aturan 1  
</strong>nama = hasil pengacakan dengan jumlah 1 kata (nama)<br />jika nama yang ditemukan mengandung kata "abdul", lakukan pengacakan lagi</p>
<p><strong># aturan 2  
</strong>nama = hasil pengacakan dengan jumlah 2 kata (nama)<br />- jika ditemukan nama "<em>abdul</em>" pada kata terakhir, ikuti aturan 1<br />- sebaliknya, jika ditemukan pada kata pertama, maka kata pertama diisi "<em>abdul</em>" dan kata kedua diambil dari nama acak yang terdapat dalam daftar nama <em>asmaul husna</em>.</p>
</blockquote>
<p>Berikutnya adalah aturan penggabungan nama “<em>abdul</em>” dengan “<em>asmaul husna</em>”. Contoh nama yang dapat digabung adalah: <em>Abdul Rahim</em> menjadi <em>Abdurrahim</em>, <em>Abdul Rahman</em> menjadi <em>Abdurrahman</em>, dst. Tapi ada juga yang tidak dapat digabung, seperti: <em>Abdul Wahhab</em>, <em>Abdul Ghaniy</em>, dst.</p>
<p>Sementara ini, aturan yang dapat kita terapkan adalah nama <em>asmaul husna</em> yang berawalan karakter atau string berikut, ada kemungkinan digabung menjadi satu kata (nama) “<em>bagi yang mau</em>”. Kenapa begitu? Karena dalam kenyataannya penggunaan nama ini tergantung selera masing-masing orang.</p>
<pre><code class="lang-python"><span class="hljs-comment"># huruf (string) awal nama asmaul husna yang dapat digabung  </span>
karGabung = (<span class="hljs-string">"dh"</span>, <span class="hljs-string">"n"</span>, <span class="hljs-string">"r"</span>, <span class="hljs-string">"s"</span>, <span class="hljs-string">"sh"</span>, <span class="hljs-string">"sy"</span>, <span class="hljs-string">"t"</span>, <span class="hljs-string">"z"</span>)
</code></pre>
<p>Kode sumber lengkapnya adalah sebagai berikut.</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="4098be912ed7f3ac0be4ebc049d07bc0"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/galihboy/4098be912ed7f3ac0be4ebc049d07bc0" class="embed-card">https://gist.github.com/galihboy/4098be912ed7f3ac0be4ebc049d07bc0</a></div><p>Dari kode tersebut di atas, kita sudah dapat membangkitkan nama acak sejumlah yang kita inginkan berdasarkan daftar nama yang kita punyai.</p>
<hr />
<p><strong>Tahap 3. Kustomisasi pembangkitan nama acak</strong></p>
<p>Pada bagian ketiga ini, kita ingin membuat pembangkitan nama lebih dapat disetel (<em>customize</em>) sedemikian rupa sesuai dengan aturan yang kita buat sendiri. Misalkan kita ingin membangkitkan nama berisi 3 (kata) nama, dimana kata pertama harus berisi “<strong><em>Muhammad</em></strong>”, kata kedua dan kata ketiga bebas. Atau contoh lain, kita ingin membangkitkan 4 (kata) nama, dimana kata pertama bebas, kata kedua harus berisi “<em>Abdul</em>”, kata ketiga bebas, dan kata keempat berisi “<em>Hermawan</em>”.</p>
<p>Kalau kita tetapkan misalnya sebuah parameter yang mewakili nama acak adalah karakter (<em>string</em>) “<strong><em>x</em></strong>”, maka desain atau format nama lengkapnya adalah sebagai berikut.</p>
<pre><code class="lang-python">strFormat_contoh_1 = <span class="hljs-string">"Muhammad X X"</span>

strFormat_contoh_2 = <span class="hljs-string">"X Abdul X Hermawan"</span>
</code></pre>
<p><strong>Langkah-langkahnya adalah:</strong></p>
<p>a. Menginventarisir nama sesuai (dalam) format.</p>
<p>Nama selain “<em>X</em>” kita anggap sebagai suatu tetapan yang tidak bisa diubah. Kita dapat masukkan ke penyimpanan khusus nama-nama yang tidak bisa diubah dan jangan sampai dibangkitkan jika terdapat dalam daftar nama. Misalkan kita beri nama <strong>lstBlokir</strong> (<em>list</em> blokir). Sedangkan untuk nama dalam posisi “<em>X</em>”, kita hafal dan simpan nomor indeksnya.</p>
<pre><code class="lang-python">strFormat_1 = <span class="hljs-string">"Muhammad X X"</span>  
lstBlokir_1 = [<span class="hljs-string">'Muhammad'</span>]  
lstIndeks_X_1 = [[<span class="hljs-number">1</span>,<span class="hljs-number">1</span>], [<span class="hljs-number">2</span>,<span class="hljs-number">0</span>]]

strFormat_2 = <span class="hljs-string">"X Abdul X Hermawan"</span>  
lstBlokir_2 = [<span class="hljs-string">'Abdul'</span>, <span class="hljs-string">'Hermawan'</span>]  
lstIndeks_X_2 = [[<span class="hljs-number">0</span>,<span class="hljs-number">2</span>], [<span class="hljs-number">2</span>,<span class="hljs-number">0</span>]]
</code></pre>
<p>Perhatikan isi dari peubah (<em>variable</em>) <strong>lstIndeks_X_1</strong> dan <strong>lstIndeks_X_2</strong> yang digunakan untuk menampung dua hal, yaitu nomor indeks ‘X’ dan jarak dengan ‘<em>X</em>’ berikutnya. Untuk <strong>lstIndeks_X_1</strong> dengan nilai [[1,1], [2,0]] berarti ‘<em>X</em>’ ditemukan pada indeks ke-1 dengan jarak ke indeks ‘<em>X</em>’ berikutnya adalah 1. Dan juga ditemukan pada indeks ke-2 dengan jarak dengan ‘<em>X</em>’ berikutnya 0 (karena tidak ditemukan).</p>
<p>Sedangkan pada <strong>lstIndeks_X_2</strong> dengan nilai [[0,2], [2,0]] berarti ‘<em>X</em>’ ditemukan pada indeks ke-0 dengan jarak ke indeks ‘<em>X</em>’ berikutnya adalah 2. Dan juga ditemukan pada indeks ke-2 dengan jarak dengan ‘<em>X</em>’ berikutnya 0 (karena tidak ditemukan).</p>
<p>b. Berikutnya adalah kita evaluasi atau hitung mana nama dalam ‘X’ yang berkumpul, dan mana dipisahkan oleh nama tetapan. Misal kita simpan dalam sebuah <strong>lstJarak</strong> (<em>list</em> jarak)</p>
<pre><code class="lang-python">strFormat_1 = <span class="hljs-string">"Muhammad X X"</span>  
lstIndeks_X_1 = [[<span class="hljs-number">1</span>,<span class="hljs-number">1</span>], [<span class="hljs-number">2</span>,<span class="hljs-number">0</span>]]  
lstJarak_1 = [[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>]]

strFormat_2 = <span class="hljs-string">"X Abdul X Hermawan"</span>  
lstIndeks_X_2 = [[<span class="hljs-number">0</span>,<span class="hljs-number">2</span>], [<span class="hljs-number">2</span>,<span class="hljs-number">0</span>]]  
lstJarak_2 = [[<span class="hljs-number">0</span>,<span class="hljs-number">1</span>], [<span class="hljs-number">2</span>,<span class="hljs-number">1</span>]]
</code></pre>
<p>Dalam <strong>lstJarak<em>1 = [[1, 2]]</em></strong> bermakna ‘<em>X</em>’ ditemukan 2 kali berturut-turut dari indeks ke-1, yaitu indeks 1 dan 2. Sedangkan dalam <strong>lstJarak_2 = [[0,1], [2,1]]</strong> ditemukan ‘<em>X</em>’ pada indeks ke-0 hanya 1 buah saja, dan pada indeks ke-2 juga hanya 1 buah saja.</p>
<p>Jadi logikanya, berdasarkan rekaman jarak indeks tersebut, kita dapat membangkitkan nama acak serta menempatkan kembali sesuai dengan alamat indeks yang sudah kita simpan. Berikut adalah gambarannya.</p>
<pre><code class="lang-python">strFormat_1 = <span class="hljs-string">"Muhammad X X"</span>  
lstJarak_1 = [[<span class="hljs-number">1</span>, <span class="hljs-number">2</span>]]  
<span class="hljs-comment"># ... bangkitkan 2 nama acak dan letakkan pada indeks 1 dan 2</span>

strFormat_2 = <span class="hljs-string">"X Abdul X Hermawan"</span>  
lstJarak_2 = [[<span class="hljs-number">0</span>,<span class="hljs-number">1</span>], [<span class="hljs-number">2</span>,<span class="hljs-number">1</span>]]  
<span class="hljs-comment"># ... bangkitkan 2 nama acak dan letakkan satu nama pada indeks 0 dan satu nama pada indeks 2</span>
</code></pre>
<p>Selain mendesain metode pembangkitan nama, inventarisasi indeks, dan lain sebagainya; urutan peletakan metode juga sangat penting diperhatikan. Dalam hal ini saya akan memodifikasi urutan penerapan metode serta mengubah cara validasi nama yang mengandung nama “<em>abdul</em>”.</p>
<ul>
<li>pembangkitan nama acak dengan jumlah tertentu,</li>
<li>cek ke daftar nama yang diblokir, ulangi ke poin pertama jika ditemukan nama yang terblokir,</li>
<li>inventarisasi nilai indeks nama berdasarkan daftar nama yang dibangkitkan,</li>
<li>keluarkan nama yang sudah dibangkitkan,</li>
<li>cek nama dengan mengikuti aturan validasi nama “<em>abdul</em>”,</li>
<li>keluarkan nama final yang sudah <em>fixed.</em></li>
</ul>
<hr />
<h3 id="tahap-4-pemanggilan-nama-dari-daftar-nama-yang-tersimpan-di-fail-eksternal">Tahap 4. Pemanggilan nama dari daftar nama yang tersimpan di fail eksternal</h3>
<p>Sebelum melampirkan kode sumber lengkap, pada tahap terakhir ini saya ingin memberikan contoh pengaksesan data dari fail eksternal. Saya siapkan 5 fail sebagai berikut.</p>
<pre><code class="lang-python">namaFileAsmaulHusna = <span class="hljs-string">"nama_asmaul_husna.txt"</span>  
namaFileLaki = <span class="hljs-string">"nama_laki.txt"</span>  
namaFileNabi = <span class="hljs-string">"nama_nabi.txt"</span>  
namaFileSahabat = <span class="hljs-string">"nama_sahabat_nabi.txt"</span>  
namaFileIslam = <span class="hljs-string">"nama_islam.txt"</span>
</code></pre>
<p>Penjelasan dari file di atas adalah:</p>
<ul>
<li><strong>nama_asmaul_husna.txt</strong> → terdapat 99 data nama asmaul husna,</li>
<li><strong>nama_laki.txt</strong> → contoh data nama laki-laki pada umumnya,</li>
<li><strong>nama_nabi.txt</strong> = terdapat 25 data nama nabinya yang umum dikenal oleh ummat Islam,</li>
<li><strong>nama_sahabat_nabi.txt</strong> → terdapat sedikit contoh nama sahabat nabi,</li>
<li><strong>nama_islam.txt</strong> → terdapat sedikit contoh nama-nama Islami</li>
</ul>
<p>Berikutnya saya manfaatkan <em>library</em> membaca <em>file</em> dari proyek-proyek kecil terdahulu yang juga ada di <em>repository Github</em>, bernama <code>libBerkas.py</code>.</p>
<pre><code class="lang-python">daftarAsmaulHusna = BacaBerkas(namaFileAsmaulHusna)  
daftarNamaLaki = BacaBerkas(namaFileLaki)  
daftarNamaNabi = BacaBerkas(namaFileNabi)  
daftarNamaSahabat = BacaBerkas(namaFileSahabat)  
daftarNamaIslam =  BacaBerkas(namaFileIslam)
</code></pre>
<p>Untuk menjadikan daftar nama tersebut di atas sebagai sumber referensi data adalah contohnya sebagai berikut.</p>
<pre><code class="lang-python"><span class="hljs-comment"># contoh penetapan dari satu sumber data  </span>
<span class="hljs-comment"># sumber = daftarNamaLaki  </span>
<span class="hljs-comment"># sumber = daftarNamaIslam  </span>

<span class="hljs-comment"># contoh sumber data gabungan  </span>
<span class="hljs-comment"># sumber = daftarNamaNabi + daftarNamaIslam  </span>
sumber = daftarNamaLaki + daftarNamaSahabat + daftarNamaIslam
</code></pre>
<p>Pilih salah satu saja, atau silakan meramu data sumber sendiri sesuai keinginan.</p>
<p>Dan terakhir memanfaatkan metode pengambilan nama acak, misalnya:</p>
<pre><code>nama = CetakNama(sumber, strFormat, charAcak)  
namaBaru = ValidasiAbdul(sumber, nama, strFormat, charAcak, <span class="hljs-literal">True</span>)  
print(<span class="hljs-string">f"<span class="hljs-subst">{i+<span class="hljs-number">1</span>}</span>. <span class="hljs-subst">{namaBaru}</span>"</span>)
</code></pre><p>Berikut ini contoh kode sumber yang sudah menerapkan metode dan aturan-aturan yang sudah kita bahas sebelumnya. Dibuat sedemikian rupa agar dapat dipanggil secara mandiri (<em>standalone</em>) maupun sebagai <em>library</em>.</p>
<div class="gist-block embed-wrapper" data-gist-show-loading="false" data-id="172f86c3f60f74807a154e48ddc99ab3"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a href="https://gist.github.com/galihboy/172f86c3f60f74807a154e48ddc99ab3" class="embed-card">https://gist.github.com/galihboy/172f86c3f60f74807a154e48ddc99ab3</a></div><p>Contoh <em>screenshot</em> dari hasil eksekusi kode sumber tersebut adalah sebagaimana terlihat pada gambar di bagian paling atas yang saya jadikan <em>cover image</em>.</p>
<p>Contoh variasi lain seperti terlihat pada gambar di bawah ini dapat dilihat di <em>repository Github</em>.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/galihboy/Nama_Acak">https://github.com/galihboy/Nama_Acak</a></div>
<p>Berikut contoh luaran aplikasi.
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797046233/nrttEVE0K.jpeg" alt /></p>
<p>Bagi yang ingin mencoba aplikasi secara langsung (online) silakan cek di sini.</p>
<p><a target="_blank" href="https://galihboy.github.io/mini_projects/">https://galihboy.github.io/mini_projects/</a></p>
<p>Demikian tutorial pembangkitan nama secara otomatis dan berbasis aturan. Semoga bermanfaat.</p>
<p>Terima kasih.</p>
<p>😉🙏❤️</p>
<p><strong>Bacaan</strong></p>
<ol>
<li><a target="_blank" href="https://docs.python.org/3/library/random.html">https://docs.python.org/3/library/random.html</a></li>
<li><a target="_blank" href="https://islam.nu.or.id/post/read/103702/ketentuan-pemberian-nama-anak-selain-nama-arab">https://islam.nu.or.id/post/read/103702/ketentuan-pemberian-nama-anak-selain-nama-arab</a></li>
<li><a target="_blank" href="https://rumaysho.com/11876-hadiah-di-hari-lahir-15-bolehkah-memakai-nama-nabi-dan-malaikat.html">https://rumaysho.com/11876-hadiah-di-hari-lahir-15-bolehkah-memakai-nama-nabi-dan-malaikat.html</a></li>
<li><a target="_blank" href="https://katadata.co.id/muchamadnafi/berita/60ae08b006237/asmaul-husna-99-arti-nama-nama-baik-allah-swt">https://katadata.co.id/muchamadnafi/berita/60ae08b006237/asmaul-husna-99-arti-nama-nama-baik-allah-swt</a></li>
<li><a target="_blank" href="https://kangsantono.wordpress.com/2014/12/09/nama-islami-dari-asmaul-husna-dengan-penambahan-kata-abd-%D8%B9%D8%A8%D8%AF-untuk-bayi-laki-laki/">https://kangsantono.wordpress.com/2014/12/09/nama-islami-dari-asmaul-husna-dengan-penambahan-kata-abd-%D8%B9%D8%A8%D8%AF-untuk-bayi-laki-laki/</a></li>
<li><a target="_blank" href="https://alquran-indonesia.com/makna-asma-ul-husna-99-nama-allah/">https://alquran-indonesia.com/makna-asma-ul-husna-99-nama-allah/</a></li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797047935/5r0J_UVsM.gif" alt /></p>
]]></content:encoded></item><item><title><![CDATA[Nabi Muhammad ﷺ dan Sahabat Disebut dalam Kitab Terdahulu]]></title><description><![CDATA[Bismillaah Alhamdulillah.

Kali ini saya akan menulis artikel yang tidak berkaitan dengan pemrograman sebagaimana biasanya. Tulisan ini saya sadur dari kitab terjemahan berjudul Kehidupan Para Sahabat yang disusun oleh Maulana Muhammad Yusuf al Kandh...]]></description><link>https://blog.galih.eu/nabi-muhammad-dan-sahabat-disebut-dalam-kitab-terdahulu</link><guid isPermaLink="true">https://blog.galih.eu/nabi-muhammad-dan-sahabat-disebut-dalam-kitab-terdahulu</guid><category><![CDATA[education]]></category><dc:creator><![CDATA[Galih Hermawan]]></dc:creator><pubDate>Wed, 13 Oct 2021 17:46:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1636836491882/UZCijaf5Os.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Bismillaah Alhamdulillah</em>.</p>
<blockquote>
<p>Kali ini saya akan menulis artikel yang tidak berkaitan dengan pemrograman sebagaimana biasanya. Tulisan ini saya sadur dari kitab terjemahan berjudul <strong>Kehidupan Para Sahabat</strong> yang disusun oleh Maulana Muhammad Yusuf al Kandhalawi rahimahullah, serta diterjemahkan oleh Maulana Ahmad Syaifuddin, M.A.</p>
</blockquote>
<hr />
<p>Dari Atha bin Yasar, dia berkata, “Aku bertemu dengan Abdullah bin Amr bin Ash <em>radhiyallâhu ‘anhu</em>, lalu aku menanyakan kepadanya, ‘Terangkanlah kepadaku mengenai sifat-sifat Rasulullah ﷺ yang tertulis di dalam kitab Taurat!’ Maka dia menjawab, “Baiklah. Demi Allah, sesungguhnya Nabi ﷺ telah diterangkan sifat-sifatnya di dalam kitab Taurat sebagaimana diterangkan di dalam al-Quran.” (Tertulis dalam Taurat), “Wahai Nabi, sesungguhnya, Kami mengutus engkau untuk menjadi saksi, pembawa kabar gembira, dan pemberi peringatan, juga untuk menjaga orang-orang (Arab) yang <em>ummi</em>. Engkau adalah hamba-Ku dan Rasul-Ku. Aku namai engkau dengan sebutan <em>mutawakkil</em>. Engkau bukan seorang yang kasar dan keras hati, dan engkau bukan pula seorang yang suka membalas kejahatan dengan kejahatan, melainkan engkau selalu memaafkan dan mengampuni. Dan sekali-kali engkau tidak akan diwafatkan oleh Allah, sehingga orang-orang memeluk agama ini dengan mengucapkan kalimah <strong><em>laa ilaaha illallaah</em></strong> yang dengannya Allah membukakan mata yang buta, telinga yang tuli, dan hati yang tertutup.” (Hr. Ahmad)</p>
<p>Hadits ini telah diriwayatkan juga oleh Bukhari dari Abdullah, Baihaqi dari Ibnu Salam, Ibnu Ishaq dari Ka’ab Ahbar yang semakna dengan hadits di atas, juga oleh Baihaqi dari Aisyah <em>radhiyallâhu ‘anha</em> secara ringkas.</p>
<p>Wahab bin Munabbih mengatakan bahwa Allah <em>Subhanahu wa ta’ala</em> telah berfirman kepada Nabi Daud di dalam kitab Zabur, “Wahai Daud, sesungguhnya kelak sesudahmu akan datang seorang Nabi yang bernama Ahmad (Muhammad), seorang Nabi yang dipercaya dan sebagai penghulu dari sekalian para Nabi. Aku sekali-kali tidak akan marah kepadanya dan dia juga tidak akan pernah membuat Aku marah sedikit pun. Dan sesungguhnya Aku telah mengampuninya sebelum dia berbuat maksiat (dosa) kepada-Ku, yakni dosa-dosanya yang terdahulu dan dosa-dosanya yang kemudian. Dan umatnya adalah umat yang dirahmati (oleh Allah). Aku berikan kepada umatnya amalan-amalan nafil (sunnah) seperti yang telah Aku berikan kepada para Rasul; dan Aku telah wajibkan kepada umatnya amalan-amalan fardhu seperti yang telah Aku wajibkan kepada para Nabi dan Rasul. Sampai mereka menghadap kepada-Ku di hari Kiamat sedang cahaya mereka seperti cahaya para Nabi — sampai pada firman-Nya — “Wahai Daud, sesungguhnya Aku telah memuliakan Muhammad dan umatnya dari seluruh umat-umat yang lain.”<br />(Demikian disebutkan dalam <strong><em>al-Bidayah</em></strong> jilid II halaman 326)</p>
<p>Abdullah bin Amar <em>radhiyallâhu ‘anhu</em> pernah berkata kepada Ka’ab Ahbar <em>radhiyallâhu ‘anhu</em>, “Terangkanlah kepadaku mengenai sifat-sifat Nabi ﷺ dan umatnya!” Maka dia menjawab, “Aku temukan sifat-sifat mereka di dalam kitab Allah Subhanahu wa ta’ala (Taurat), bahwa sesungguhnya Ahmad (ﷺ) dan umatnya adalah orang-orang yang selalu memuji Allah <em>Subhanahu wa ta’ala</em> baik dalam keadaan senang maupun dalam keadaan susah (misalnya mereka mengucapkan <em>alhamdulillah ‘alaa kulli haal</em>), mengucapkan takbir <em>Allaahu Akbar</em> setiap kali mereka berjalan naik, dan mereka selalu mengucapkan <em>subhaanallaah</em> setiap kali mereka berjalan menurun. Seruan adzan mereka bergema hingga ke langit. Jika mereka dalam shalat, sayup-sayup terdengar dengungan bagaikan dengungan lebah di atas batu. Mereka berbaris dalam shalat seperti barisan para malaikat, dan mereka berbaris di medan perang seperti berbaris dalam shalat. Apabila mereka berperang (berjihad) di jalan Allah <em>Subhanahu wa ta’ala</em> maka para malaikat dengan tombak yang kuat senantiasa berada di depan dan di belakang mereka. Apabila mereka telah masuk di barisan (kancah) peperangan, maka Allah <em>Subhanahu wa ta’ala</em> akan hadir untuk menaungi mereka — Ka’ab berisyarat dengan tangannya — seperti burung nasar melingkupi sarangnya. Dan sekali-kali mereka tidak akan pernah mundur dari medan perang.”<br />(Hr. Abu Nu’aim dari Sa’id bin Abi Hilal dalam <strong><em>al-Hilyah</em></strong> jilid V halaman 386)</p>
<p>Hadits ini juga telah diriwayatkan oleh Abu Nu’aim dari Ka’ab Ahbar dengan sanad yang lain secara panjang lebar isinya ada sedikit perbedaan, yaitu: “Umat Muhammad ﷺ adalah umat yang banyak memuji Allah <em>Subhanahu wa ta’ala</em> (dengan ucapan <em>alhamdulillah</em>) dalam setiap keadaan, selalu mengucapkan <em>Allaahu Akbar</em> dalam setiap ketinggian, selalu mengawasi peredaran matahari untuk mengetahui waktu shalat mereka dengan tepat, mereka selalu mengerjakan shalat lima waktu tepat pada waktunya walaupun mereka sedang berada di tempat sampah, mereka selalu memakai kain sarung (celana) di tengah-tengah betis mereka, dan mereka selalu membersihkan anggota-anggota badan mereka dengan berwudhu.”</p>
<p><strong>Sumber.</strong></p>
<p>Al Kandhalawi, M. and Syaifuddin, M., 2003. <em>Kehidupan para sahabat</em>. 1st ed. Bandung: Pustaka Zaadul Ma’aad.</p>
<hr />
<p>Cover photo by <a target="_blank" href="https://unsplash.com/@abdullahoguk">Abdullah Öğük</a> on <a target="_blank" href="https://unsplash.com/">Unsplash</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1636797054220/GW6Ve4vwS.gif" alt /></p>
]]></content:encoded></item></channel></rss>