Jekyll2020-03-09T22:32:09+07:00http://localhost:4000/feed.xmlKlise ThemeHe's writing in Bahasa about web technology and experience as a journal for documentation things that he learned, meet him <a href="https://github.com/piharpi" target="_blank" rel="noopener">@github</a>.Klisé Themeyour-email@email.comCara ribet memperbarui forked repo2020-01-29T01:00:00+07:002020-01-29T01:00:00+07:00http://localhost:4000/cara-memperbarui-fork-repository<p>Berawal dari saya pengen memperbarui repo yang tua dari suatu organisasi, niatnya pengen rumat ulang nih, ternyata dari orginal reponya ada update, sekalian buat artikel deh, lebih kurang gambaranya seperti ini.</p>
<figure>
<img src="/cara-memperbarui-fork-repository/repo.png" alt="ilustrasi repo yang mau diupdate" />
<figcaption>Fig 1. Gambaran ribetnya.</figcaption>
</figure>
<p>Ada dua cara untuk memperbarui forked repository menggunakan web interface yang disediakan oleh github tapi ribet, atau melalui terminal yang lebih ribet lagi.</p>
<h3 id="melalui-github-boring-way-">Melalui Github (boring way) 💻</h3>
<ol>
<li>Buka repo yang hasil fork di Github.</li>
<li>Klik <strong>Pull Requests</strong> di sebelah kanan, lalu <strong>New Pull Request</strong>.</li>
<li>Akan memunculkan hasil compare antara repo upstream dengan repo kamu(forked repo), dan jika menyatakan “There isn’t anything to compare.”, tekan link <strong>switching the base</strong>, yang mana sekarang repo kamu(forked repo) akan dibalik menjadi base repo dan repo upstream menjadi head repo.</li>
<li>Tekan <strong>Create Pull Request</strong>, beri judul pull request, Tekan <strong>Send Pull Request</strong>.</li>
<li>Tekan <strong>Merge Pull Request</strong> dan <strong>Confirm Merge</strong>.</li>
</ol>
<p>* <em>pastikan kamu tidak merubah apapun pada forked repo, supaya melakukan merge secara otomatis, kalo tidak ya paling2 konflik.</em></p>
<h3 id="melalui-terminal-️">Melalui terminal ⌨️</h3>
<p>Tambahkan remote alamat repository yang aslinya disini tak beri nama <code class="highlighter-rouge">upstream</code>., ganti <code class="highlighter-rouge">ORIGINAL_OWNER</code> dan <code class="highlighter-rouge">ORIGINAL_REPO</code> dengan alamat repo aslimu.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>git add remote upstream git@github.com:ORIGINAL_OWNER/ORIGINAL_REPO.git
<span class="nv">$ </span>git remote <span class="nt">-v</span>
<span class="o">></span> origin git@github.com:piharpi/www.git <span class="o">(</span>fetch<span class="o">)</span> <span class="c"># forked repo</span>
<span class="o">></span> origin git@github.com:piharpi/www.git <span class="o">(</span>push<span class="o">)</span> <span class="c"># forked repo</span>
<span class="o">></span> upstream git@github.com:ORIGINAL_OWNER/ORIGINAL_REPO.git <span class="o">(</span>fetch<span class="o">)</span> <span class="c"># upstream repo / original repo</span>
<span class="o">></span> upstream git@github.com:ORIGINAL_OWNER/ORIGINAL_REPO.git <span class="o">(</span>push<span class="o">)</span> <span class="c"># upstream repo / original repo</span>
</code></pre></div></div>
<p>Checkout ke local branch <code class="highlighter-rouge">master</code>.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>git checkout master
<span class="o">></span> Switched to branch <span class="s1">'master'</span>
</code></pre></div></div>
<p>Jika sudah, Merge local repo dengan remote <code class="highlighter-rouge">upstream/master</code>.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>git merge upstream/master
</code></pre></div></div>
<p>Terakhir push local repo ke remote <code class="highlighter-rouge">origin</code>.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>git add <span class="nt">-A</span>
<span class="nv">$ </span>git commit <span class="nt">-m</span> <span class="s2">"updating origin repo"</span> <span class="o">&&</span> git push <span class="nt">-u</span> origin master
</code></pre></div></div>
<p>Selamat mencoba cara ribet ini, semoga bisa dipahami, saya sendiri lebih senang melalui terminal, klo ada yang ribet kenapa cari yang mudah.</p>
<h5 id="resources">Resources</h5>
<ul>
<li><a href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork">Syncing a fork</a></li>
<li><a href="https://rick.cogley.info/post/update-your-forked-repository-directly-on-github/#top">Update your fork directly on Github</a></li>
</ul>Klisé Themeyour-email@email.comBerawal dari saya pengen memperbarui repo yang tua dari suatu organisasi, niatnya pengen rumat ulang nih, ternyata dari orginal reponya ada update, sekalian buat artikel deh, lebih kurang gambaranya seperti ini.What is a shell? 🐚 adalah kerang ajaib?2020-01-25T11:58:47+07:002020-01-25T11:58:47+07:00http://localhost:4000/apa-itu-shell<p><a href="http://www.youtube.com/watch?v=tc4ROCJYbm0&t=70" target="_blank" rel="noopener">Dulu</a> Sebelum adanya <abbr title="Graphical User Interface">GUI</abbr> cara user berinteraksi dengan komputer menggunakan <abbr title="Command Line Interface">CLI</abbr> yaitu mengetik baris perintah pada sebuah antarmuka dalam bentuk baris teks seperti 👇.</p>
<figure>
<img src="/apa-itu-shell/terminal_nginx.gif" alt="installing nginx in ubuntu" />
<figcaption>Fig 1. Terminal emulator, instalasi package dan check service.</figcaption>
</figure>
<p>Jika kamu pernah menggunakan unix/linux mungkin pernah menggunakan program diatas, bahkan mungkin setiap hari menggunakannya untuk mengeksekusi suatu perintah melalui <a href="http://en.wikipedia.org/wiki/List_of_terminal_emulators" target="_blank" rel="noopener">terminal emulator</a>.</p>
<p>User<sup id="user"><a href="#user-ref">[1]</a></sup> tidak bisa secara langsung berkomunikasi dengan sebuah hardware komputer, maka dari itu kita membutuhkan sebuah sistem operasi; <strong>Kernel</strong> adalah program yang merupakan inti utama dari sistem operasi komputer.</p>
<figure>
<img src="/apa-itu-shell/kernel.png" alt="kernel central of operating system" />
<figcaption>Fig 2. bagan kernel.</figcaption>
</figure>
<p>Kernel memfasilitasi interaksi antara komponen perangkat keras dan perangkat lunak, berperan untuk menangani permintaan input/ouput dari perangkat lunak, selanjutnya menerjemahkannya ke dalam pemrosesan data untuk diintruksikan ke CPU, sehingga Hardware(cpu, memory, devices) mengerti perintah yang dimaksud dari pengguna.</p>
<p>Ketika kita menginputkan suatu perintah pada terminal emulator, kernel tidak langsung mengerti perintah yang kita ketik, kita membutuhkan suatu interface sebagai perantara menuju kernel yaitu <strong>Shell</strong>.</p>
<figure>
<img src="/apa-itu-shell/shell.png" alt="shell" />
<figcaption>Fig 3. bagan komunikasi shell.</figcaption>
</figure>
<p><mark>Shell adalah sebuah command-line interpreter; program yang berperan sebagai penerjemah perintah yang diinputkan oleh User yang melalui terminal</mark>, sehingga perintah tersebut bisa dimengerti oleh si Kernel.</p>
<p>Login shell biasanya ditetapkan oleh local System Administrator ketika pada saat pertama user kamu dibuat, kamu bisa lihat login shell yang sedang kamu gunakan dengan perintah dibawah ini.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">echo</span> <span class="nv">$SHELL</span>
<span class="c"># atau</span>
<span class="nv">$ </span><span class="nb">echo</span> <span class="nv">$0</span>
</code></pre></div></div>
<p>Setiap shell mempunyai default prompt. beberapa shell yang paling umum:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="o">(</span>dollar sign<span class="o">)</span> <span class="c"># sh, ksh, bash</span>
% <span class="o">(</span>percent sign<span class="o">)</span> <span class="c"># csh, tcsh</span>
</code></pre></div></div>
<h5 id="terminologi-pada-shell-prompt">Terminologi pada shell prompt</h5>
<p>Shell prompt adalah tempat dimana kita menuliskan suatu perintah, berikut adalah terminologinya ini membantu, jika kamu ingin mengetahui bagian-bagianya.</p>
<figure>
<img src="/apa-itu-shell/term_shell_prompt.png" alt="shell" />
<figcaption>Fig 4. bagian-bagin dari shell prompt.</figcaption>
</figure>
<p>Dibawah ini salah satu contoh perintah sederhana untuk menampilkan sebuah arsitektur CPU komputer yang sedang saya gunakan.</p>
<figure>
<img src="/apa-itu-shell/terminal_lscpu.gif" alt="installing nginx in ubuntu" />
<figcaption>Fig 5. menampilkan informasi tentang arsitektur CPU.</figcaption>
</figure>
<p>Dari perintah yang contohkan, ketika user mengetikan suatu inputan perintah di terminal dan menekan <kbd>ENTER</kbd>, maka shell akan mengubah perintah user menjadi bahasa yang bisa dipahami oleh kernel, dan Kernel menerjemahkannya ke dalam pemrosesan data untuk diintruksikan ke Hardware sehingga menghasilkan output yg sesuai dengan perintah user.</p>
<p>Shell mempunyai beberapa macam dan turunan, berikut yang paling umum.</p>
<figure>
<img src="/apa-itu-shell/shell_evolution.png" alt="shell evolution" />
<figcaption>Fig 6. evaluasi shell dari tahun ke tahun.</figcaption>
</figure>
<p>Sedikit penjelasan dari gambar diatas.</p>
<ul>
<li>Bourne shell <code class="highlighter-rouge">sh</code>
Dikembangkan oleh Stephen Bourne di Bell Labs, yang kala itu sebagai pengganti Thompson shell(diciptakan Ken Thompson), banyak sistem unix-like tetap memiliki <code class="highlighter-rouge">/bin/sh</code>—yang mana menjadi symbolic link atau hard link, bahkan ketika shell lain yang digunakan tetap <code class="highlighter-rouge">sh</code> adalah sebagai dasarnya, sebagai kompatibilitas perintah.</li>
<li>Korn shell <code class="highlighter-rouge">ksh</code> Unix shell yang dikembangkan oleh David Korn di Bell Labs,
inisialiasi pengembangan ini berdasar pada source code Bourne shell, namun juga memiliki fitur <code class="highlighter-rouge">csh</code> dan <code class="highlighter-rouge">sh</code>, pengembanganya pun pada saat saya menulis ini pun terus <a href="http://github.com/att/ast" target="_blank" rel="noopener">terawat</a>.</li>
<li>Bourne again shell <code class="highlighter-rouge">bash</code>
adalah proyek ini open source <a href="http://gnu.org/software/bash/" target="_blank" rel="noopener">GNU project</a> memilki kompatibel dengan <code class="highlighter-rouge">sh</code> yang menggabungkan fitur penting dari <code class="highlighter-rouge">ksh</code> dan <code class="highlighter-rouge">csh</code>, dan menjadi salah satu shell yang paling umum digunakan (umumnya menjadi default shell login Linux dan Apple’s macOS Mojave).</li>
<li>Z shell <code class="highlighter-rouge">zsh</code> ini mempunyai wadah komunitasnya disebutnya <a href="http://ohmyz.sh/" target="_blank" rel="noopener">“Oh My Zsh”</a>, plug-in dan theme <code class="highlighter-rouge">zsh</code> bisa kita temukan di komunitas ini, saya saat ini menggunakan <code class="highlighter-rouge">zsh</code>, shell ini juga menjadi default dari sistem operasi macOS Catalina, yang menggantikan bash.</li>
<li>friendly interactive shell <code class="highlighter-rouge">fish</code>
yah sesuai dengan <a href="http://fishshell.com/" target="_blank" rel="noopener">deskripsi</a> di web nya, menurut saya shell ini fun banget, fitur yang saya sukai dari shell ini autosuggestions, dan konfigurasi yang mudah melalui web based.</li>
</ul>
<p>Masih banyak yang belum dijelaskan pada tulisan ini jika masih tertarik, baca lebih <a href="http://en.wikipedia.org/wiki/List_of_command-line_interpreters#Operating_system_shells" target="_blank" rel="noopener">banyak</a> dan juga <a href="http://en.wikipedia.org/wiki/Comparison_of_command_shells" target="_blank" rel="noopener">komparasinya</a> masing-masing shell.</p>
<p>Jika kamu tertarik untuk mengubah default shell login pada sistem operasi, kamu bisa menginstall dengan cara mengikuti didokumentasi/cara penginstallan dimasing-masing shell disini saya tidak membahas karena distro yang kita pakai mungkin berbeda-beda.</p>
<p>Untuk menjadikan default shell login pada OS bisa menggunakan perintah ini.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># command</span>
<span class="nv">$ </span><span class="nb">sudo </span>chsh <span class="o">[</span>options] <span class="o">[</span>LOGIN]
<span class="c"># contoh penggunaan</span>
<span class="nv">$ </span><span class="nb">sudo </span>chsh <span class="nt">-s</span> /user/bin/zsh harpi
<span class="c"># mengubah default shell user harpi menjadi zsh shell.</span>
<span class="nv">$ </span>reboot
<span class="c"># atau kamu juga bisa mengubah file /etc/passwd dan edit secara manual user shellnya.</span>
<span class="c"># jika masih bingung manfaatkan perintah man untuk melihat manual page.</span>
<span class="nv">$ </span>man chsh
</code></pre></div></div>
<p>Terakhir untuk tulisan ini, shell memilki berbagai macam, pilihlah shell yang sesuai dengan keinginanmu untuk menunjang produktivitas dan sesuaikan dengan kebutuhan, terlalu banyak plugin dan kebingungan memilih tema itu buruk 😁.</p>
<p>Terimakasih sudah baca, <em>penulis menerima kritik dan saran.</em></p>
<h5 id="notes">Notes</h5>
<p><small id="user-ref"><sup><a href="#user">[1]</a></sup> Manusia yang mengoperasikan dan mengendalikan sistem komputer.</small></p>
<h5 id="resources">Resources</h5>
<ul>
<li><a href="http://developer.ibm.com/tutorials/l-linux-shells/">Evolution shells in Linux</a></li>
<li><a href="http://www.linfo.org/kernel.html">Kernel Defintion</a></li>
<li><a href="http://www.cis.rit.edu/class/simg211/unixintro/Shell.html">The Shell</a></li>
</ul>Klisé Themeyour-email@email.comDulu Sebelum adanya GUI cara user berinteraksi dengan komputer menggunakan CLI yaitu mengetik baris perintah pada sebuah antarmuka dalam bentuk baris teks seperti 👇.How this site was born 👶2018-09-28T09:45:47+07:002018-09-28T09:45:47+07:00http://localhost:4000/how-this-site-was-made<p>The website was made using Jekyll the one of open source static sites generator, and using my own simple theme, I called <a href="https://github.com/piharpi/klise">klisé</a>.</p>
<hr />
<p>All the services are free, source code the site was placed on my <a href="https://github.com/piharpi/mahendrata.now.sh">github</a> repository and intergration with <del><a href="https://netlify.com">netlify</a></del> service, another service that you can use is <a href="https://pages.github.com/">github page</a> for hosting your own static site.</p>
<hr />
<h4 id="lets-do-this">Let’s do this</h4>
<p>So, before we start create a site, you need some tools, you can self paced for how to installing each tools, on this guide i’m just want to show you how to install jekyll and deploying in netlify, but make sure you have each tools below.</p>
<h4 id="prerequisites">Prerequisites</h4>
<p>Requirements before we doing magic show.</p>
<ul>
<li><a href="https://www.ruby-lang.org/en/downloads/">Ruby</a> programming language</li>
<li><a href="https://git-scm.com">Git</a> (version control)</li>
<li><a href="https://netlify.com">Netlify</a> and <a href="https://github.com">Github</a> account</li>
<li><a href="https://bundler.io">Bundler</a></li>
</ul>
<h4 id="installation">Installation</h4>
<p>First, you need some <a href="https://www.staticgen.com/">SSG</a>, there are many kind ssg, but in case i’m using Jekyll cause i’m already familiar with it, open your terminal and type command on below</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>bundle <span class="nb">install </span>jekyll <span class="c"># installing jekyll in your machine</span>
<span class="nv">$ </span>jekyll new my-site <span class="o">&&</span> <span class="nb">cd </span>my-site <span class="c"># create new jekyll project</span>
<span class="nv">$ </span>jekyll s <span class="c"># run jekyll server</span>
</code></pre></div></div>
<p>Now, jekyll is running on your local machine, open your browser and go to <code class="highlighter-rouge">localhost:4000</code> is default address from jekyll, press <kbd>CTRL</kbd> + <kbd>C</kbd> to stop the jekyll server.</p>
<h4 id="adding-remote-repository">Adding remote repository</h4>
<p>Before we adding remote repository, you must have <a href="https://github.com/new">github</a> repository, if already have repository, just add github remote address to your local folder, with the following commands</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>git init <span class="c"># initializing project folder</span>
<span class="nv">$ </span>git remote add origin https://github.com/YOUR-USERNAME/YOUR-REPO.git <span class="c"># change UPPERCASE with your own!</span>
<span class="nv">$ </span>git add <span class="nt">-A</span> <span class="o">&&</span> git commit <span class="nt">-m</span> <span class="s2">"Initialize"</span> <span class="o">&&</span> git push <span class="nt">-u</span> origin master <span class="c"># push code to github</span>
</code></pre></div></div>
<p>Now check your github repository, make sure the files is uploaded correctly.</p>
<h4 id="deploying-to-netlify">Deploying to netlify</h4>
<p>Go <a href="https://netlify.com">netlify</a> dashboard, and following this step.</p>
<ol>
<li>click <code class="highlighter-rouge">new site from git</code>, then choose <code class="highlighter-rouge">Github</code>.</li>
<li>then choose your repository where is the jekyll sources uploaded.</li>
<li>netlify smart enough to configuring, we just need’s are hosting’s are hosting’s are hosting’s are hosting to click <code class="highlighter-rouge">Deploy site button</code>.</li>
</ol>
<p>Wait for moment, and voila..! your site’s are hosting and using <code class="highlighter-rouge">.netlify.com</code> tld, if your website wants to look professional, just buy a domain from your favorite domain store. or if you the first time, I advice using namecheap.com<em>(isn’t sponsor)</em> *based on my experienced it provides good service and have various TLDs.</p>
<p>So, what you waiting for, just create your own website for free.</p>Klisé Themeyour-email@email.comThe website was made using Jekyll the one of open source static sites generator, and using my own simple theme, I called klisé.Python Notes from Intro to Machine Learning2018-04-14T10:00:00+07:002018-04-14T10:00:00+07:00http://localhost:4000/python-notes-from-Intro-to-machine-learning<h5 id="this-article-is-for-demo-purpose">This article is for Demo purpose</h5>
<p>The article was originally on <a href="https://github.com/risan/risanb.com/blob/master/content/posts/python-notes-from-intro-to-machine-learning/index.md">this repo</a></p>
<p>I rarely use Python. I only have one repository at Github that is written in Python: <a href="https://github.com/risan/iris-flower-classifier">iris-flower-classifier</a>. And it was written two years ago!</p>
<p>A few days ago I took this free course from Udacity: <a href="https://eu.udacity.com/course/intro-to-machine-learning--ud120">Intro to Machine Learning</a>. The machine learning related codes are quite easy to grasp since it simply uses the <a href="http://scikit-learn.org/">scikit-learn</a> modules. But most of the supporting Python modules that are provided by this course were like a black-box to me. I had no idea how to download a file in Python or what’s the difference between a list, a tuple and a dictionary.</p>
<p>That’s why I decided to read all of the provided Python modules and implement it myself. I ended up refactor most of the code so it’s easier to understand: <a href="https://github.com/risan/intro-to-machine-learning">github.com/risan/intro-to-machine-learning</a>.</p>
<p>So here are some notes and snippets of Python that I’ve been collecting so far (I’m not even halfway through the course 😝). Also, note that the codes here are still using Python version 2.7.</p>
<h2 id="table-of-contents">Table of Contents</h2>
<h2 id="modules-classes-and-functions">Modules Classes and Functions</h2>
<h3 id="main-entry-file">Main Entry File</h3>
<p>Suppose our Python project is stored in <code class="highlighter-rouge">/foo/bar</code> directory. And this application has one file that serves as the single entry point. We can name this file <code class="highlighter-rouge">__main__.py</code> so we can run this project simply be referencing its directory path:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Referencing its directory.</span>
<span class="nv">$ </span>python /foo/bar
<span class="c"># It's equivalent to this.</span>
<span class="nv">$ </span>python /foo/bar/__main__.py
</code></pre></div></div>
<h3 id="import-python-module-dynamically">Import Python Module Dynamically</h3>
<p>Suppose we would like to import a Python module dynamically based on a variable value. We can achieve this through the <a href="https://docs.python.org/2/library/functions.html#__import__"><code class="highlighter-rouge">__import__</code></a> function:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">module_name</span> <span class="o">=</span> <span class="s">"numpy"</span>
<span class="nb">__import__</span><span class="p">(</span><span class="n">module_name</span><span class="p">)</span>
</code></pre></div></div>
<h3 id="multiple-returns-in-python">Multiple Returns in Python</h3>
<p>In Python, it’s possible for a function or a method to return multiple values. We can do this simply by separating each return value by a comma:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
<span class="k">return</span> <span class="mi">100</span><span class="p">,</span> <span class="s">"foo"</span>
<span class="n">someNumber</span><span class="p">,</span> <span class="n">someString</span> <span class="o">=</span> <span class="n">test</span><span class="p">()</span>
</code></pre></div></div>
<h3 id="importing-modules-outside-of-the-directory">Importing Modules Outside of the Directory</h3>
<p>In order to import a module from outside of the directory, we need to add that module’s directory path into the current file with <code class="highlighter-rouge">sys.path.append</code>. Suppose we have the following directory structure:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>|--foo
| |-- bar.py
|
|-- tools
| |-- speak_yoda.py
</code></pre></div></div>
<p>If we want to use the <code class="highlighter-rouge">speak_yoda.py</code> module within the <code class="highlighter-rouge">bar.py</code>, we can do the following:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># /foo/bar.py
</span><span class="kn">import</span> <span class="nn">os</span>
<span class="c1"># Use relative path to tools directory.
</span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"../tools"</span><span class="p">)</span>
<span class="kn">import</span> <span class="nn">speak_yoda</span>
</code></pre></div></div>
<p>However, this won’t work if we run the <code class="highlighter-rouge">baz.py</code> file from outside of its <code class="highlighter-rouge">foo</code> directory:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># It works inside of the /foo directory.</span>
<span class="nv">$ </span><span class="nb">cd</span> /foo
<span class="nv">$ </span>python bar.py
<span class="c"># But it won't work if the code runs from outside of /foo directory.</span>
<span class="nv">$ </span>python foo/bar.py
</code></pre></div></div>
<p>To solve this problem we can refer to the <code class="highlighter-rouge">tools</code> directory using its absolute path.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># /foo/bar.py
</span><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="c1"># Get the directory name for this file.
</span><span class="n">current_dirname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="n">__file__</span><span class="p">))</span>
<span class="c1"># Use the absolute path to the tools directory
</span><span class="n">tools_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dirname</span><span class="p">,</span> <span class="s">"../tools"</span><span class="p">))</span>
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tools_path</span><span class="p">)</span>
<span class="kn">import</span> <span class="nn">speak_yoda</span>
</code></pre></div></div>
<h2 id="output">Output</h2>
<h3 id="print-the-emojis">Print The Emojis</h3>
<p>It turns out you can’t just print an emoji or any other Unicode characters to the console. You need to specify the encoding type beforehand:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># coding: utf8
</span>
<span class="k">print</span><span class="p">(</span><span class="s">"😅"</span><span class="p">)</span>
</code></pre></div></div>
<h3 id="pretty-print">Pretty Print</h3>
<p>We can use the <code class="highlighter-rouge">pprint</code> module to pretty-print Python data structure with a configurable indentation:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pprint</span>
<span class="n">pp</span> <span class="o">=</span> <span class="n">pprint</span><span class="o">.</span><span class="n">PrettyPrinter</span><span class="p">(</span><span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">pp</span><span class="o">.</span><span class="n">pprint</span><span class="p">(</span><span class="n">people</span><span class="p">)</span>
</code></pre></div></div>
<h2 id="working-with-pathname">Working with Pathname</h2>
<p>Read more about pathname manipulations in the <a href="https://docs.python.org/2/library/os.path.html"><code class="highlighter-rouge">os.path</code> documentation</a>.</p>
<h3 id="get-filename-from-url">Get Filename From URL</h3>
<p>Suppose the last segment of the URL contains a filename that we would like to download. We can extract this filename with the following code:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">from</span> <span class="nn">urlparse</span> <span class="kn">import</span> <span class="n">urlparse</span>
<span class="n">url</span> <span class="o">=</span> <span class="s">"https://example.com/foo.txt"</span>
<span class="n">url_components</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
<span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">url_components</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> <span class="c1"># foo.txt
</span></code></pre></div></div>
<h3 id="check-if-file-exists">Check if File Exists</h3>
<p>To check whether the given file path exists or not:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="n">is_exists</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="s">"foo.txt"</span><span class="p">)</span>
</code></pre></div></div>
<h3 id="create-a-directory-if-it-does-not-exists">Create a Directory if It Does Not Exists</h3>
<p>To create a directory only if it does not exist:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">errno</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">directory_path</span><span class="p">)</span>
<span class="k">except</span> <span class="nb">OSError</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">errno</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EEXIST</span><span class="p">:</span>
<span class="k">raise</span>
</code></pre></div></div>
<h2 id="working-with-files">Working with Files</h2>
<h3 id="downloading-a-file">Downloading a File</h3>
<p>We can use the <code class="highlighter-rouge">urllib</code> module to download a file in Python. The first argument is the file URL that we would like to download. The second argument is the optional filename that will be used to store the file.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">urllib</span>
<span class="n">urllib</span><span class="o">.</span><span class="n">urlretrieve</span><span class="p">(</span><span class="s">"https://example.com/foo.txt"</span><span class="p">,</span> <span class="s">"foo.txt"</span><span class="p">)</span>
</code></pre></div></div>
<h3 id="extracting-tar-file">Extracting Tar File</h3>
<p>There’s a built-in <code class="highlighter-rouge">tarfile</code> module that we can use to work with Tar file in Python. To extract the <code class="highlighter-rouge">tar.gz</code> file we can use the following code:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">tarfile</span>
<span class="c1"># Open the file.
</span><span class="n">tfile</span> <span class="o">=</span> <span class="n">tarfile</span><span class="o">.</span><span class="nb">open</span><span class="p">(</span><span class="s">"foo.tar.gz"</span><span class="p">)</span>
<span class="c1"># Extract the file to the given path.
</span><span class="n">tfile</span><span class="o">.</span><span class="n">extractall</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
</code></pre></div></div>
<p>We can pass the <code class="highlighter-rouge">mode</code> argument to the <code class="highlighter-rouge">open</code> method. By default, the <code class="highlighter-rouge">mode</code> would be <code class="highlighter-rouge">r</code>—reading mode with transparent compression. There are also other mode options that we can use:</p>
<ul>
<li><code class="highlighter-rouge">r:gz</code>: Reading mode with gzip compression.</li>
<li><code class="highlighter-rouge">r:</code>: Reading mode without compression.</li>
<li><code class="highlighter-rouge">a</code>: Appending mode without compression.</li>
<li><code class="highlighter-rouge">w</code>: Writting mode without compression.</li>
<li>Checkout other available options in <a href="https://docs.python.org/2/library/tarfile.html">tarfile documentation</a>.</li>
</ul>
<h2 id="working-with-list">Working with List</h2>
<h3 id="generate-a-list-of-random-numbers">Generate a List of Random Numbers</h3>
<p>Use the <code class="highlighter-rouge">for..in</code> syntax to generate a list of random numbers in a one-liner style.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">random</span>
<span class="c1"># Initialize internal state of random generator.
</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="c1"># Generate random points.
</span><span class="n">randomNumbers</span> <span class="o">=</span> <span class="p">[</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">)]</span>
<span class="c1"># [0.6394267984578837, 0.025010755222666936, 0.27502931836911926, ...]
</span></code></pre></div></div>
<h3 id="pair-values-from-two-lists">Pair Values from Two Lists</h3>
<p>The built-in <code class="highlighter-rouge">zip</code> function can pair values from two lists. However, this <code class="highlighter-rouge">zip</code> function will return a list of tuples instead. To get a list of value pairs, we can combine it with <code class="highlighter-rouge">for..in</code> syntax:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">coordinates</span> <span class="o">=</span> <span class="p">[[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">([</span><span class="mi">5</span><span class="p">,</span><span class="mi">10</span><span class="p">,</span><span class="mi">15</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">])]</span>
<span class="c1"># [[5, 0], [10, 1], [15, 0]]
</span></code></pre></div></div>
<h3 id="splitting-a-list">Splitting a List</h3>
<p>We can easily split a list in Python by specifying the starting index and it’s ending index. Note that the ending index is excluded from the result.</p>
<p>We can also specify a negative index. And also note that both of these indices are optional!</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">]</span>
<span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span> <span class="c1"># 0,1,2
</span><span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span> <span class="c1"># 1,2
</span><span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">:]</span> <span class="c1"># 2,3,4,5
</span><span class="n">a</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="c1"># 0,1,2
</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># 0,1,2,3
</span><span class="n">a</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">:]</span> <span class="c1"># 4,5
</span><span class="n">a</span><span class="p">[:]</span> <span class="c1"># 0,1,2,3,4,5
</span></code></pre></div></div>
<h3 id="filtering-a-list-in-one-line">Filtering a List In One Line</h3>
<p>We can easily filter a list in Python by combining the <code class="highlighter-rouge">for..in</code> and the <code class="highlighter-rouge">if</code> syntax together:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numbers</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">11</span><span class="p">)</span>
<span class="c1"># Filter even numbers only.
</span><span class="p">[</span><span class="n">numbers</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">numbers</span><span class="p">))</span> <span class="k">if</span> <span class="n">numbers</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
<span class="c1"># [2, 4, 6, 8, 10]
</span></code></pre></div></div>
<h3 id="sorting-a-list-in-ascending-order">Sorting a List in Ascending Order</h3>
<p>In Python, we can sort a list in ascending order simply by calling the <code class="highlighter-rouge">sort</code> method like so:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">people</span> <span class="o">=</span> <span class="p">[</span><span class="s">"John"</span><span class="p">,</span> <span class="s">"Alice"</span><span class="p">,</span> <span class="s">"Poe"</span><span class="p">]</span>
<span class="n">people</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">people</span><span class="p">)</span> <span class="c1"># ["Alice", "John", "Poe"]
</span></code></pre></div></div>
<h3 id="using-filter-function-with-a-list">Using Filter Function with a List</h3>
<p>Just like its name, we can use the <code class="highlighter-rouge">filter</code> function to filter out our list:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numbers</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span>
<span class="n">even_numbers</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">number</span><span class="p">:</span> <span class="n">number</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">,</span> <span class="n">numbers</span><span class="p">)</span>
<span class="c1"># [2, 4, 6, 8, 10]
</span></code></pre></div></div>
<p>We can break the above statement into two parts:</p>
<ul>
<li><code class="highlighter-rouge">lambda number: statement</code>: The first part is the function that we would like to run to every item on the list. <code class="highlighter-rouge">number</code> is the variable name we’d like to use in this function to refer to a single item from the <code class="highlighter-rouge">numbers</code> list. The following function body must evaluate to truthy/falsy value—falsy means the current item will be removed from the final result.</li>
<li><code class="highlighter-rouge">numbers</code>: The second parameter is the list that we’d like to filter.</li>
</ul>
<h3 id="using-reduce-with-a-list-of-dictionary">Using Reduce with a List of Dictionary</h3>
<p>We can use the <code class="highlighter-rouge">reduce</code> function to calculate the total of a particular key in a list of a dictionary:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">items</span> <span class="o">=</span> <span class="p">[{</span><span class="n">value</span><span class="p">:</span><span class="mi">10</span><span class="p">},</span> <span class="p">{</span><span class="n">value</span><span class="p">:</span><span class="mi">20</span><span class="p">},</span> <span class="p">{</span><span class="n">value</span><span class="p">:</span><span class="mi">50</span><span class="p">}]</span>
<span class="c1"># Calculate the total of value key.
</span><span class="n">totalValues</span> <span class="o">=</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">total</span><span class="p">,</span> <span class="n">item</span><span class="p">:</span> <span class="n">total</span> <span class="o">+</span> <span class="n">item</span><span class="p">[</span><span class="s">"value"</span><span class="p">],</span> <span class="n">items</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># 80
</span></code></pre></div></div>
<p>It can be broken down into 4 parts:</p>
<ul>
<li><code class="highlighter-rouge">lambda total</code>: It’s the variable name that we’d like to use in the function body to refer to the carried or the accumulative value that will finally be returned.</li>
<li><code class="highlighter-rouge">item: statement</code>: <code class="highlighter-rouge">item</code> is the name of the variable we’d like to use within the function body to refer to the single item in the <code class="highlighter-rouge">items</code> list. The following function body will be executed in order to define the accumulative value of <code class="highlighter-rouge">total</code> for the next iteration.</li>
<li><code class="highlighter-rouge">items</code>: It’s the list of item that we would like to “reduce”.</li>
<li><code class="highlighter-rouge">0</code>: The last parameter is optional and it’s the initial accumulative value for the first iteration.</li>
</ul>
<p>We can also use this <code class="highlighter-rouge">reduce</code> function to find a single item from the list. Here’s an example of code to find the person with the biggest <code class="highlighter-rouge">total_payments</code> within the given list of <code class="highlighter-rouge">people</code> dictionary.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">people</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"John"</span><span class="p">,</span> <span class="s">"total_payments"</span><span class="p">:</span> <span class="mi">100</span><span class="p">},</span>
<span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"Alice"</span><span class="p">,</span> <span class="s">"total_payments"</span><span class="p">:</span> <span class="mi">1000</span><span class="p">},</span>
<span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"Poe"</span><span class="p">,</span> <span class="s">"total_payments"</span><span class="p">:</span> <span class="mi">800</span><span class="p">}</span>
<span class="p">]</span>
<span class="n">person_biggest_total_payments</span> <span class="o">=</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">paid_most</span><span class="p">,</span> <span class="n">person</span><span class="p">:</span> <span class="n">person</span> <span class="k">if</span> <span class="n">person</span><span class="p">[</span><span class="s">"total_payments"</span><span class="p">]</span> <span class="o">></span> <span class="n">paid_most</span><span class="p">[</span><span class="s">"total_payments"</span><span class="p">]</span> <span class="k">else</span> <span class="n">paid_most</span><span class="p">,</span> <span class="n">people</span><span class="p">,</span> <span class="p">{</span> <span class="s">"total_payments"</span><span class="p">:</span> <span class="mi">0</span> <span class="p">})</span>
<span class="c1"># {'name': 'Alice', 'total_payments': 1000}
</span></code></pre></div></div>
<h2 id="working-with-dictionary">Working with Dictionary</h2>
<h3 id="loop-through-dictionary">Loop Through Dictionary</h3>
<p>We can use the <code class="highlighter-rouge">itervalues</code> method to loop through a dictionary:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">people</span><span class="o">.</span><span class="n">itervalues</span><span class="p">():</span>
<span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">[</span><span class="s">"email_address"</span><span class="p">])</span>
</code></pre></div></div>
<p>We can also use the <code class="highlighter-rouge">iteritems</code> method if we want to access the key too:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">people</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
<span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s">": "</span> <span class="o">+</span> <span class="n">person</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s">"email_address"</span><span class="p">])</span>
</code></pre></div></div>
<h3 id="calculate-total-of-particular-dictionary-key">Calculate Total of Particular Dictionary Key</h3>
<p>Suppose we would like to calculate the total amount of <code class="highlighter-rouge">salary</code> key on a <code class="highlighter-rouge">people</code> dictionary. We can extract the <code class="highlighter-rouge">salary</code> key and use the <code class="highlighter-rouge">sum</code> function to get the total:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">total_salary</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">([</span><span class="n">person</span><span class="p">[</span><span class="s">"salary"</span><span class="p">]</span> <span class="k">for</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">people</span><span class="o">.</span><span class="n">itervalues</span><span class="p">()])</span>
</code></pre></div></div>
<h2 id="working-with-numpy">Working with Numpy</h2>
<h3 id="numpy-create-range-of-values-with-the-given-interval">Numpy Create Range of Values with The Given Interval</h3>
<p>Use the <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html"><code class="highlighter-rouge">arange</code></a> method to create an array with an evenly spaced interval.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># array([0,1,2,3,4])
</span>
<span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
<span class="c1"># array([1. , 1.5, 2. , 2.5, 3. , 3.5])
</span></code></pre></div></div>
<h3 id="numpy-create-coordinate-matrices-from-coordinate-vectors">Numpy Create Coordinate Matrices from Coordinate Vectors</h3>
<p>We can use the Numpy <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html"><code class="highlighter-rouge">meshgrid</code></a> method to make coordinate matrices from one-dimentional coordinate arrays.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">7</span><span class="p">])</span>
<span class="c1"># [
# array([[1,2,3], [1,2,3]]),
# array([[0,0,0], [7,7,7]])
# ]
</span></code></pre></div></div>
<h3 id="flatten-numpy-array">Flatten Numpy Array</h3>
<p>When we have a multi-dimensional Numpy array, we can easily flatten it with the <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html"><code class="highlighter-rouge">ravel</code></a> method:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="n">arr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]])</span>
<span class="n">arr</span><span class="o">.</span><span class="n">ravel</span><span class="p">()</span>
<span class="c1"># array([1, 2, 3, 4])
</span></code></pre></div></div>
<h3 id="pairing-array-values-with-second-axis">Pairing Array Values with Second Axis</h3>
<p>We can use Numpy <code class="highlighter-rouge">c_</code> function to pair array values with another array that will be it’s second axis. Read the <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.c_.html"><code class="highlighter-rouge">numpy.c_</code> documentation</a>.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]</span>
<span class="n">y</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span><span class="mi">20</span><span class="p">]</span>
<span class="n">np</span><span class="o">.</span><span class="n">c_</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span>
<span class="c1"># array([1,10], [2,20])
</span></code></pre></div></div>
<h3 id="generate-coordinates-across-the-grid">Generate Coordinates Across The Grid</h3>
<p>With the knowledge of Numpy <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html"><code class="highlighter-rouge">arange</code></a>, <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html"><code class="highlighter-rouge">meshgrid</code></a>, <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html"><code class="highlighter-rouge">ravel</code></a> and <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.c_.html"><code class="highlighter-rouge">c_</code></a> methods, we can easily generate an evenly spaced coordinates across the grid so we can pass it to the classifier and plot the decision surface.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="c1"># Generate an evenly spaced coordinates.
</span><span class="n">x_points</span><span class="p">,</span> <span class="n">y_points</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">x_min</span><span class="p">,</span> <span class="n">x_max</span><span class="p">,</span> <span class="n">step</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">y_min</span><span class="p">,</span> <span class="n">y_max</span><span class="p">,</span> <span class="n">step</span><span class="p">))</span>
<span class="c1"># Pair the x and y points.
</span><span class="n">test_coordinates</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">c_</span><span class="p">[</span><span class="n">x_points</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">y_points</span><span class="o">.</span><span class="n">ravel</span><span class="p">()]</span>
</code></pre></div></div>
<h2 id="plotting-the-data">Plotting the Data</h2>
<h3 id="plot-the-surface-decision">Plot The Surface Decision</h3>
<p>We can pass an evenly spaced coordinates across the grid to the classifier to predict the output on each of that coordinate. We can then use <a href="https://matplotlib.org/api/pyplot_api.html"><code class="highlighter-rouge">matplotlib.pyplot</code></a> to plot the surface decision.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">import</span> <span class="nn">pylab</span> <span class="k">as</span> <span class="n">pl</span>
<span class="c1"># Pass coordinates across the grid.
</span><span class="n">predicted_labels</span> <span class="o">=</span> <span class="n">classifier</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">test_coordinates</span><span class="p">)</span>
<span class="c1"># Don't forget to reshape the output array dimension.
</span><span class="n">predicted_labels</span> <span class="o">=</span> <span class="n">predicted_labels</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_points</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
<span class="c1"># Set the axes limit.
</span><span class="n">plt</span><span class="o">.</span><span class="n">xlim</span><span class="p">(</span><span class="n">x_points</span><span class="o">.</span><span class="nb">min</span><span class="p">(),</span> <span class="n">x_points</span><span class="o">.</span><span class="nb">max</span><span class="p">())</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylim</span><span class="p">(</span><span class="n">y_points</span><span class="o">.</span><span class="nb">min</span><span class="p">(),</span> <span class="n">y_points</span><span class="o">.</span><span class="nb">max</span><span class="p">())</span>
<span class="c1"># Plot the decision boundary with seismic color map.
</span><span class="n">plt</span><span class="o">.</span><span class="n">pcolormesh</span><span class="p">(</span><span class="n">x_points</span><span class="p">,</span> <span class="n">y_points</span><span class="p">,</span> <span class="n">predicted_labels</span><span class="p">,</span> <span class="n">cmap</span> <span class="o">=</span> <span class="n">pl</span><span class="o">.</span><span class="n">cm</span><span class="o">.</span><span class="n">seismic</span><span class="p">)</span>
</code></pre></div></div>
<p>The classifier output would be a one-dimensional array, so don’t forget to <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html"><code class="highlighter-rouge">reshape</code></a> it back into a two-dimensional array before plotting. The <code class="highlighter-rouge">cmap</code> is an optional parameter for the color map. Here we use the <code class="highlighter-rouge">seismic</code> color map from <code class="highlighter-rouge">pylab</code> module. It has the red-blue colors.</p>
<h3 id="scatter-plot">Scatter Plot</h3>
<p>We need to separate the test points based on its predicted label (the speed). So we can plot the test points with two different colors.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Separate fast (label = 0) & slow (label = 1) test points.
</span><span class="n">grade_fast</span> <span class="o">=</span> <span class="p">[</span><span class="n">features_test</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">features_test</span><span class="p">))</span> <span class="k">if</span> <span class="n">labels_test</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
<span class="n">bumpy_fast</span> <span class="o">=</span> <span class="p">[</span><span class="n">features_test</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">features_test</span><span class="p">))</span> <span class="k">if</span> <span class="n">labels_test</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
<span class="n">grade_slow</span> <span class="o">=</span> <span class="p">[</span><span class="n">features_test</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">features_test</span><span class="p">))</span> <span class="k">if</span> <span class="n">labels_test</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span>
<span class="n">bumpy_slow</span> <span class="o">=</span> <span class="p">[</span><span class="n">features_test</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">features_test</span><span class="p">))</span> <span class="k">if</span> <span class="n">labels_test</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span>
<span class="c1"># Plot the test points based on its speed.
</span><span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">grade_fast</span><span class="p">,</span> <span class="n">bumpy_fast</span><span class="p">,</span> <span class="n">color</span> <span class="o">=</span> <span class="s">"b"</span><span class="p">,</span> <span class="n">label</span> <span class="o">=</span> <span class="s">"fast"</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">grade_slow</span><span class="p">,</span> <span class="n">bumpy_slow</span><span class="p">,</span> <span class="n">color</span> <span class="o">=</span> <span class="s">"r"</span><span class="p">,</span> <span class="n">label</span> <span class="o">=</span> <span class="s">"slow"</span><span class="p">)</span>
<span class="c1"># Show the plot legend.
</span><span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="c1"># Add the axis labels.
</span><span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s">"grade"</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s">"bumpiness"</span><span class="p">)</span>
<span class="c1"># Show the plot.
</span><span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</code></pre></div></div>
<p>If we want to save the plot into an image, we can use the <code class="highlighter-rouge">savefig</code> method instead:</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="s">'scatter_plot.png'</span><span class="p">)</span>
</code></pre></div></div>
<h2 id="dealing-with-data">Dealing with Data</h2>
<h3 id="deserializing-python-object">Deserializing Python Object</h3>
<p>We can use <a href="https://docs.python.org/2/library/pickle.html"><code class="highlighter-rouge">pickle</code></a> module for serializing and deserializing Python object. There’s also the <code class="highlighter-rouge">cPickle</code>—the faster C implementation. We use both of these modules to deserialize the email text and author list.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pickle</span>
<span class="kn">import</span> <span class="nn">cPickle</span>
<span class="c1"># Unpickling or deserializing the texts.
</span><span class="n">texts_file_handler</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">texts_file</span><span class="p">,</span> <span class="s">"r"</span><span class="p">)</span>
<span class="n">texts</span> <span class="o">=</span> <span class="n">cPickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">texts_file_handler</span><span class="p">)</span>
<span class="n">texts_file_handler</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="c1"># Unpickling or deserializing the authors.
</span><span class="n">authors_file_handler</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">authors_file</span><span class="p">,</span> <span class="s">"r"</span><span class="p">)</span>
<span class="n">authors</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">authors_file_handler</span><span class="p">)</span>
<span class="n">authors_file_handler</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</code></pre></div></div>
<h3 id="split-data-for-training-and-testing">Split Data for Training and Testing</h3>
<p>We can use the built-in <a href="http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html"><code class="highlighter-rouge">train_test_split</code></a> function from scikit-learn to split the data both for training and testing.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">sklearn.model_selection</span> <span class="kn">import</span> <span class="n">train_test_split</span>
<span class="n">features_train</span><span class="p">,</span> <span class="n">features_test</span><span class="p">,</span> <span class="n">labels_train</span><span class="p">,</span> <span class="n">labels_test</span> <span class="o">=</span> <span class="n">train_test_split</span><span class="p">(</span><span class="n">texts</span><span class="p">,</span> <span class="n">authors</span><span class="p">,</span> <span class="n">test_size</span> <span class="o">=</span> <span class="mf">0.1</span><span class="p">,</span> <span class="n">random_state</span> <span class="o">=</span> <span class="mi">42</span><span class="p">)</span>
</code></pre></div></div>
<p>The <code class="highlighter-rouge">test_size</code> argument is the proportion of data to split into the test, in our case we split 10% for testing.</p>
<h3 id="vectorized-the-strings">Vectorized the Strings</h3>
<p>When working with a text document, we need to vectorize the strings into a list of numbers so it’s easier and more efficient to process. We can use the <a href="http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html"><code class="highlighter-rouge">TfidfVectorizer</code></a> class to vectorize the strings into a matrix of TF-IDF features.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">sklearn.feature_extraction.text</span> <span class="kn">import</span> <span class="n">TfidfVectorizer</span>
<span class="n">vectorizer</span> <span class="o">=</span> <span class="n">TfidfVectorizer</span><span class="p">(</span><span class="n">sublinear_tf</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">max_df</span> <span class="o">=</span> <span class="mf">0.5</span><span class="p">,</span> <span class="n">stop_words</span> <span class="o">=</span> <span class="s">"english"</span><span class="p">)</span>
<span class="n">features_train_transformed</span> <span class="o">=</span> <span class="n">vectorizer</span><span class="o">.</span><span class="n">fit_transform</span><span class="p">(</span><span class="n">features_train</span><span class="p">)</span>
<span class="n">features_test_transformed</span> <span class="o">=</span> <span class="n">vectorizer</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">features_test</span><span class="p">)</span>
</code></pre></div></div>
<p>Word with a frequency higher than the <code class="highlighter-rouge">max_df</code> will be ignored. Stop words are also ignored—stop words are the most common words in a language (e.g. a, the, has).</p>
<h3 id="feature-selection">Feature Selection</h3>
<p>Text can have a lot of features thus it may slow to compute. We can use scikit <a href="http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectPercentile.html"><code class="highlighter-rouge">SelectPercentile</code></a> class to select only the important features.</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">selector</span> <span class="o">=</span> <span class="n">SelectPercentile</span><span class="p">(</span><span class="n">f_classif</span><span class="p">,</span> <span class="n">percentile</span> <span class="o">=</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">selector</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">features_train_transformed</span><span class="p">,</span> <span class="n">labels_train</span><span class="p">)</span>
<span class="n">selected_features_train_transformed</span> <span class="o">=</span> <span class="n">selector</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">features_train_transformed</span><span class="p">)</span><span class="o">.</span><span class="n">toarray</span><span class="p">()</span>
<span class="n">selected_features_test_transformed</span> <span class="o">=</span> <span class="n">selector</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">features_test_transformed</span><span class="p">)</span><span class="o">.</span><span class="n">toarray</span><span class="p">()</span>
</code></pre></div></div>
<p>The <code class="highlighter-rouge">percentile</code> is the percentage of features that we’d like to select based on its highest score.</p>
<h5 id="this-article-is-for-demo-purpose-1">This article is for Demo purpose</h5>
<p>The article was originally on <a href="https://github.com/risan/risanb.com/blob/master/content/posts/python-notes-from-intro-to-machine-learning/index.md">this repo</a></p>Klisé Themeyour-email@email.comThis article is for Demo purposeReact Component with Dot Notation2018-04-07T23:04:00+07:002018-04-07T23:04:00+07:00http://localhost:4000/react-component-with-dot-notation<h5 id="this-article-is-for-demo-purpose">This article is for Demo purpose</h5>
<p>The article was originally on <a href="https://github.com/risan/risanb.com/blob/master/content/posts/react-component-with-dot-notation/index.md">this repo</a></p>
<p>This is my answer to someone’s question on <a href="https://stackoverflow.com/questions/49256472/react-how-to-extend-a-component-that-has-child-components-and-keep-them/49258038#answer-49258038">StackOverflow</a>. How can we define a React component that is accessible through the dot notation?</p>
<p>Take a look at the following code. We have the <code class="highlighter-rouge">Menu</code> component and its three children <code class="highlighter-rouge">Menu.Item</code>:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">App</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">(</span>
<span class="p"><</span><span class="nc">Menu</span><span class="p">></span>
<span class="p"><</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>Home<span class="p"></</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>
<span class="p"><</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>Blog<span class="p"></</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>
<span class="p"><</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>About<span class="p"></</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>
<span class="p"></</span><span class="nc">Menu</span><span class="p">></span>
<span class="p">);</span>
</code></pre></div></div>
<p>How can we define a component like <code class="highlighter-rouge">Menu</code>? Where it has some kind of “sub-component” that is accessible through a dot notation.</p>
<p>Well, it’s actually a pretty common pattern. And it’s not really a sub-component, it’s just another component being attached to another one.</p>
<p>Let’s use the above <code class="highlighter-rouge">Menu</code> component for example. We’ll put this component to its own dedicated file: <code class="highlighter-rouge">menu.js</code>. First, let’s define these two components separately on this module file:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// menu.js</span>
<span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="s1">'react'</span><span class="p">;</span>
<span class="k">export</span> <span class="kd">const</span> <span class="nx">MenuItem</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">children</span> <span class="p">})</span> <span class="o">=></span> <span class="p"><</span><span class="nt">li</span><span class="p">></span><span class="si">{</span><span class="nx">children</span><span class="si">}</span><span class="p"></</span><span class="nt">li</span><span class="p">>;</span>
<span class="k">export</span> <span class="k">default</span> <span class="kd">const</span> <span class="nx">Menu</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">children</span> <span class="p">})</span> <span class="o">=></span> <span class="p"><</span><span class="nt">ul</span><span class="p">></span><span class="si">{</span><span class="nx">children</span><span class="si">}</span><span class="p"></</span><span class="nt">ul</span><span class="p">>;</span>
</code></pre></div></div>
<p>It’s just a simple functional component. The <code class="highlighter-rouge">Menu</code> is the parent with <code class="highlighter-rouge">ul</code> tag. And the <code class="highlighter-rouge">MenuItem</code> will act as its children. Now we can use these two components like so:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="s2">"react"</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">render</span> <span class="p">}</span> <span class="k">from</span> <span class="s2">"react-dom"</span><span class="p">;</span>
<span class="k">import</span> <span class="nx">Menu</span><span class="p">,</span> <span class="p">{</span> <span class="nx">MenuItem</span> <span class="p">}</span> <span class="k">from</span> <span class="s2">"./menu"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">App</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">(</span>
<span class="p"><</span><span class="nc">Menu</span><span class="p">></span>
<span class="p"><</span><span class="nc">MenuItem</span><span class="p">></span>Home<span class="p"></</span><span class="nc">MenuItem</span><span class="p">></span>
<span class="p"><</span><span class="nc">MenuItem</span><span class="p">></span>Blog<span class="p"></</span><span class="nc">MenuItem</span><span class="p">></span>
<span class="p"><</span><span class="nc">MenuItem</span><span class="p">></span>About<span class="p"></</span><span class="nc">MenuItem</span><span class="p">></span>
<span class="p"></</span><span class="nc">Menu</span><span class="p">></span>
<span class="p">);</span>
<span class="nx">render</span><span class="p">(<</span><span class="nc">App</span> <span class="p">/>,</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">"root"</span><span class="p">));</span>
</code></pre></div></div>
<p>Where’s the dot notation? To make our <code class="highlighter-rouge">MenuItem</code> component accessible through the dot nation, we can simply attach it to the <code class="highlighter-rouge">Menu</code> component as a static property. To do so, we can no longer use the functional component for <code class="highlighter-rouge">Menu</code> and switch to the class component instead:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// menu.js</span>
<span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">Component</span> <span class="p">}</span> <span class="k">from</span> <span class="s1">'react'</span><span class="p">;</span>
<span class="k">export</span> <span class="k">default</span> <span class="kd">const</span> <span class="nx">MenuItem</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">children</span> <span class="p">})</span> <span class="o">=></span> <span class="p"><</span><span class="nt">li</span><span class="p">></span><span class="si">{</span><span class="nx">children</span><span class="si">}</span><span class="p"></</span><span class="nt">li</span><span class="p">>;</span>
<span class="k">export</span> <span class="k">default</span> <span class="kd">class</span> <span class="nx">Menu</span> <span class="kd">extends</span> <span class="nx">Component</span> <span class="p">{</span>
<span class="kr">static</span> <span class="nx">Item</span> <span class="o">=</span> <span class="nx">MenuItem</span><span class="p">;</span>
<span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">(</span>
<span class="p"><</span><span class="nt">ul</span><span class="p">></span><span class="si">{</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">children</span><span class="si">}</span><span class="p"></</span><span class="nt">ul</span><span class="p">></span>
<span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Now we can use the dot notation to declare the <code class="highlighter-rouge">MenuItem</code> component:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="nx">React</span> <span class="k">from</span> <span class="s2">"react"</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">render</span> <span class="p">}</span> <span class="k">from</span> <span class="s2">"react-dom"</span><span class="p">;</span>
<span class="k">import</span> <span class="nx">Menu</span> <span class="k">from</span> <span class="s2">"./menu"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">App</span> <span class="o">=</span> <span class="p">()</span> <span class="o">=></span> <span class="p">(</span>
<span class="p"><</span><span class="nc">Menu</span><span class="p">></span>
<span class="p"><</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>Home<span class="p"></</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>
<span class="p"><</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>Blog<span class="p"></</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>
<span class="p"><</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>About<span class="p"></</span><span class="nc">Menu</span><span class="p">.</span><span class="nc">Item</span><span class="p">></span>
<span class="p"></</span><span class="nc">Menu</span><span class="p">></span>
<span class="p">);</span>
<span class="nx">render</span><span class="p">(<</span><span class="nc">App</span> <span class="p">/>,</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">"root"</span><span class="p">));</span>
</code></pre></div></div>
<p>You can also put the <code class="highlighter-rouge">MenuItem</code> component definition directly within the <code class="highlighter-rouge">Menu</code> class. But this way you can no longer import <code class="highlighter-rouge">MenuItem</code> individually.</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">Component</span> <span class="p">}</span> <span class="k">from</span> <span class="s2">"react"</span><span class="p">;</span>
<span class="k">export</span> <span class="k">default</span> <span class="kd">class</span> <span class="nx">Menu</span> <span class="kd">extends</span> <span class="nx">Component</span> <span class="p">{</span>
<span class="kr">static</span> <span class="nx">Item</span> <span class="o">=</span> <span class="p">({</span> <span class="nx">children</span> <span class="p">})</span> <span class="o">=></span> <span class="p"><</span><span class="nt">li</span><span class="p">></span><span class="si">{</span><span class="nx">children</span><span class="si">}</span><span class="p"></</span><span class="nt">li</span><span class="p">>;</span>
<span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="p"><</span><span class="nt">ul</span><span class="p">></span><span class="si">{</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">children</span><span class="si">}</span><span class="p"></</span><span class="nt">ul</span><span class="p">>;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<h5 id="this-article-is-for-demo-purpose-1">This article is for Demo purpose</h5>
<p>The article was originally on <a href="https://github.com/risan/risanb.com/blob/master/content/posts/react-component-with-dot-notation/index.md">this repo</a></p>Klisé Themeyour-email@email.comThis article is for Demo purpose