<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>No Programming, No Life!</title>
  
  <subtitle>I really love programming with Ruby, Java and JavaScript.</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://blog.morizyun.com/"/>
  <updated>2020-02-09T07:28:44.819Z</updated>
  <id>https://blog.morizyun.com/</id>
  
  <author>
    <name>morizyune</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Effective Procedures to Setup new Mac Majove For JSer/Rubyist</title>
    <link href="https://blog.morizyun.com/blog/setup-procedure-develop-ruby-rails-mac-mojave/"/>
    <id>https://blog.morizyun.com/blog/setup-procedure-develop-ruby-rails-mac-mojave/</id>
    <published>2019-12-01T05:00:00.000Z</published>
    <updated>2020-02-09T07:28:44.819Z</updated>
    
    <content type="html"><![CDATA[<p>This article describes effective procedures for developer with Ruby/Java/JavaScript to setup Mac Majove.</p><a id="more"></a><h2 id="Install-some-applications"><a href="#Install-some-applications" class="headerlink" title="Install some applications"></a>Install some applications</h2><h3 id="For-development"><a href="#For-development" class="headerlink" title="For development"></a>For development</h3><ul><li><strong><a href="https://docs.docker.com/docker-for-mac/install/" target="_blank" rel="noopener">Docker for mac</a></strong> : Installer for docker tools</li><li><strong><a href="https://mac.filehorse.com/download-insomniax/" target="_blank" rel="noopener">InsomniaX</a></strong> : Manage sleep mode on macOS</li><li><strong><a href="https://www.iterm2.com/" target="_blank" rel="noopener">iTerm</a></strong> : Modern and functional terminal app</li><li><strong><a href="https://www.jetbrains.com/toolbox/app" target="_blank" rel="noopener">JetBrains Toolbox App</a></strong> : Install IntelliJ, RubyMine, Webstorm, DataGrid</li><li><strong><a href="https://www.getpostman.com/" target="_blank" rel="noopener">Postman</a></strong></li><li><strong><a href="https://www.sourcetreeapp.com/" target="_blank" rel="noopener">SourceTree</a></strong> : Free Git Client</li><li><strong><a href="https://trello.com/en/platforms" target="_blank" rel="noopener">Trello</a></strong>: Task Management Board</li><li><strong><a href="https://code.visualstudio.com/docs/editor/setup" target="_blank" rel="noopener">Visual Studio Code</a></strong> : Editor for programmer</li><li><strong><a href="https://developer.apple.com/xcode/" target="_blank" rel="noopener">XCode</a></strong> : IDE for Swift and Objective-C</li></ul><h3 id="For-productivity"><a href="#For-productivity" class="headerlink" title="For productivity"></a>For productivity</h3><ul><li><strong><a href="https://freemacsoft.net/appcleaner/" target="_blank" rel="noopener">AppCleaner</a></strong> : Uninstaller for unwanted apps</li><li><strong><a href="https://www.google.co.jp/intl/ja/chrome/browser/" target="_blank" rel="noopener">Chrome</a></strong> : Effective browser</li><li><strong><a href="https://evernote.com/?var=2&amp;noredirect" target="_blank" rel="noopener">Evernote</a></strong> : Simplify cloud text editor</li><li><strong><a href="https://meetfranz.com/" target="_blank" rel="noopener">Franz</a></strong> : your messaging app for many apps</li><li><strong><a href="https://www.google.co.jp/ime/" target="_blank" rel="noopener">Google Japanese Input</a></strong> : IME for Japanese</li><li><strong><a href="http://magnet.crowdcafe.com/" target="_blank" rel="noopener">Magnet</a></strong> : Window manager for Mac</li><li><strong><a href="https://www.spotify.com/jp/download/other/" target="_blank" rel="noopener">Spotify</a></strong> : Music subscription service</li><li><strong><a href="https://www.tripmode.ch/" target="_blank" rel="noopener">TripMode</a></strong> : Reduce your mobile data consumption</li></ul><h2 id="Homebrew"><a href="#Homebrew" class="headerlink" title="Homebrew"></a>Homebrew</h2><p>Before any installation, you should approve Xcode license agreement by the following command:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sudo xcodebuild -license</span><br></pre></td></tr></table></figure><p>You should execute the following command to install <strong><a href="http://brew.sh/" target="_blank" rel="noopener">Homebrew</a></strong>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">/usr/bin/ruby -e <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span></span><br></pre></td></tr></table></figure><p>If you are asked about Xcode Command line tool while installing with Homebrew, please install it.</p><h2 id="Oh-my-zsh"><a href="#Oh-my-zsh" class="headerlink" title="Oh-my-zsh"></a>Oh-my-zsh</h2><p>If you want to use a coftable Zsh customized by the community, let’s install<br><strong><a href="https://github.com/robbyrussell/oh-my-zsh" target="_blank" rel="noopener">robbyrussell/oh-my-zsh</a></strong>.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sh -c <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)</span>"</span></span><br></pre></td></tr></table></figure><h2 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h2><p>You should install Git command line tool:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install git</span><br><span class="line">git config --global user.name <span class="string">"USER_NAME"</span></span><br><span class="line">git config --global user.email email@example.com</span><br><span class="line">git config --global tag.sort version:refname</span><br></pre></td></tr></table></figure><p>After installing Git, we recommend to set global <code>.gitignore</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># install generator for .gitignore</span></span><br><span class="line">brew install gibo</span><br><span class="line"></span><br><span class="line"><span class="comment"># Set some unnecessary files of JetBrains and Mac to .gitignore</span></span><br><span class="line">gibo dump JetBrains macOS Ruby Rails Node &gt; ~/.gitignore</span><br><span class="line"></span><br><span class="line"><span class="comment"># Set the .gitignore to set git global setting</span></span><br><span class="line">git config --global --add core.excludesfile <span class="string">"<span class="variable">$HOME</span>/.gitignore"</span></span><br></pre></td></tr></table></figure><p>You should set basic passwords to skip filling password by <code>vi ~/.netrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">machine github.com</span><br><span class="line">login USERNAME</span><br><span class="line">password PASSWORD</span><br></pre></td></tr></table></figure><p>In addition, please add a alias <code>git push-f</code> to <code>vi ~/.gitconfig</code></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[<span class="built_in">alias</span>]</span><br><span class="line">  push<span class="_">-f</span> = push --force-with-lease</span><br></pre></td></tr></table></figure><h2 id="autojump"><a href="#autojump" class="headerlink" title="autojump"></a>autojump</h2><p>If you want to fill a path more quickly,<br><strong><a href="https://github.com/wting/autojump" target="_blank" rel="noopener">wting/autojump</a></strong> is one of the greatest solutions.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install autojump</span><br></pre></td></tr></table></figure><p>After installing, set the following setting by <code>vi ~/.zshrc</code></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># autojump</span></span><br><span class="line">[[ -s $(brew --prefix)/etc/profile.d/autojump.sh ]] &amp;&amp; . $(brew --prefix)/etc/profile.d/autojump.sh</span><br></pre></td></tr></table></figure><p>After the setting, execute the following command to reflect the setting:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="fzf"><a href="#fzf" class="headerlink" title="fzf"></a>fzf</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install fzf</span><br></pre></td></tr></table></figure><p>After installing, set the following setting by <code>vi ~/.zshrc</code></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># fzf</span></span><br><span class="line"><span class="function"><span class="title">br</span></span>() &#123;</span><br><span class="line">  git checkout $(git branch --format <span class="string">'%(refname:short)'</span> | fzf --layout=reverse)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>After the setting, execute the following command to reflect the setting:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="Font-HackGen"><a href="#Font-HackGen" class="headerlink" title="Font HackGen"></a>Font HackGen</h2><p>Ricty is a fonts for programming, if you want to try it, please set the following command:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Installing HackGen</span></span><br><span class="line">brew tap homebrew/cask-fonts</span><br><span class="line">brew cask install font-hackgen</span><br><span class="line"></span><br><span class="line"><span class="comment"># Setting about anti-alias</span></span><br><span class="line">defaults -currentHost write -globalDomain AppleFontSmoothing -int 2</span><br></pre></td></tr></table></figure><h2 id="rbenv"><a href="#rbenv" class="headerlink" title="rbenv"></a>rbenv</h2><p>To avoid installing unnecessary documents, add the following setting <code>vim ~/.gemrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">install: --no-document</span><br><span class="line">update: --no-document</span><br></pre></td></tr></table></figure><p>After the above setting, let’s install the following rbenv and Ruby-build:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># installing rbenv / ruby-build</span></span><br><span class="line">brew install rbenv ruby-build</span><br><span class="line"></span><br><span class="line"><span class="comment"># Setting to installing gems when introducing new version</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/sstephenson/rbenv-default-gems.git ~/.rbenv/plugins/rbenv-default-gems</span><br><span class="line"></span><br><span class="line"><span class="comment"># Setting default install gems</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">'bundler\nrails\npg\npry'</span> &gt; ~/.rbenv/default-gems</span><br></pre></td></tr></table></figure><p>Edit the following setting by <code>vi ~/.zshrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># rbenv</span></span><br><span class="line">[[ -d ~/.rbenv  ]] &amp;&amp; \</span><br><span class="line">  <span class="built_in">export</span> PATH=<span class="variable">$&#123;HOME&#125;</span>/.rbenv/bin:<span class="variable">$&#123;PATH&#125;</span> &amp;&amp; \</span><br><span class="line">  <span class="built_in">eval</span> <span class="string">"<span class="variable">$(rbenv init -)</span>"</span></span><br></pre></td></tr></table></figure><p>The setting is reflected by the following command:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><p>Install Ruby by rbenv:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># show list of ruby versions which is able to install</span></span><br><span class="line">rbenv install -l</span><br><span class="line"></span><br><span class="line"><span class="comment"># Install latest ruby version(e.g. 2.5.0)</span></span><br><span class="line">rbenv install 2.5.0</span><br><span class="line">rbenv global 2.5.0</span><br></pre></td></tr></table></figure><h2 id="Node-Version-Manager"><a href="#Node-Version-Manager" class="headerlink" title="Node Version Manager"></a>Node Version Manager</h2><p>Please refer to <strong><a href="https://blog.morizyun.com/javascript/library-nvm.html">nvm: Node Version Manager</a></strong> and install it.</p><h2 id="Install-Yarn"><a href="#Install-Yarn" class="headerlink" title="Install Yarn"></a>Install Yarn</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install yarn</span><br></pre></td></tr></table></figure><h2 id="PostgreSQL"><a href="#PostgreSQL" class="headerlink" title="PostgreSQL"></a>PostgreSQL</h2><p>Install PostgreSQL:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install postgresql</span><br><span class="line">brew services start postgresql</span><br></pre></td></tr></table></figure><h2 id="Docker-Optional"><a href="#Docker-Optional" class="headerlink" title="Docker (Optional)"></a>Docker (Optional)</h2><p>Please set alias to <code>vi .zshrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Docker</span></span><br><span class="line"><span class="built_in">alias</span> d=<span class="string">'docker'</span></span><br><span class="line"><span class="built_in">alias</span> dc=<span class="string">'docker-compose'</span></span><br><span class="line"><span class="built_in">alias</span> dm=<span class="string">'docker-machine'</span></span><br></pre></td></tr></table></figure><p>After setting, reflect the upper settings:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="Optional"><a href="#Optional" class="headerlink" title="Optional"></a>Optional</h2><h3 id="Java"><a href="#Java" class="headerlink" title="Java"></a>Java</h3><p>Download JDK from <strong><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank" rel="noopener">Java SE - Downloads / Oracle</a></strong> and install it.</p><p>After install JDK, you should install Maven &amp; gradle too.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install maven32 gradle</span><br></pre></td></tr></table></figure><p>After that, please write the bellow code in <code>.zshrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Java</span></span><br><span class="line"><span class="built_in">export</span> JAVA_HOME=`/usr/libexec/java_home -v 10.0.2`</span><br></pre></td></tr></table></figure><h3 id="Google-Cloud-Platform-SDK"><a href="#Google-Cloud-Platform-SDK" class="headerlink" title="Google Cloud Platform SDK"></a>Google Cloud Platform SDK</h3><p>Please refer to <strong><a href="https://cloud.google.com/sdk/" target="_blank" rel="noopener">Cloud SDK | Cloud SDK</a></strong> and install it.</p><h3 id="Heroku-CLI"><a href="#Heroku-CLI" class="headerlink" title="Heroku CLI"></a>Heroku CLI</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install heroku/brew/heroku</span><br></pre></td></tr></table></figure><h3 id="Chromedriver"><a href="#Chromedriver" class="headerlink" title="Chromedriver"></a>Chromedriver</h3><p>If you use Chromedriver for selenium test or etc, please execute the follows:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew tap homebrew/cask</span><br><span class="line">brew cask install chromedriver</span><br></pre></td></tr></table></figure><h3 id="IntelliJ"><a href="#IntelliJ" class="headerlink" title="IntelliJ"></a>IntelliJ</h3><p>Please refer to the following articles and configure it.</p><ul><li><strong><a href="http://stackoverflow.com/questions/31215452/intellij-idea-importing-gradle-project-getting-java-home-not-defined-yet" target="_blank" rel="noopener">IntelliJ Idea: Importing Gradle project - getting JAVA_HOME not defined yet</a></strong></li><li><strong><a href="https://stackoverflow.com/questions/13578062/how-to-increase-ide-memory-limit-in-intellij-idea-on-mac" target="_blank" rel="noopener">How to increase IDE memory limit in IntelliJ IDEA on Mac?</a></strong></li></ul><h3 id="Shortcut-for-Ruby-dev"><a href="#Shortcut-for-Ruby-dev" class="headerlink" title="Shortcut for Ruby dev"></a>Shortcut for Ruby dev</h3><p>Please write the bellow code in <code>.zshrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># nodebrew(Node.js)</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$HOME</span>/.nodebrew/current/bin:<span class="variable">$PATH</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Rails</span></span><br><span class="line"><span class="built_in">alias</span> rspec=<span class="string">"bundle exec rspec"</span></span><br><span class="line"><span class="built_in">alias</span> rake=<span class="string">"bundle exec rake"</span></span><br><span class="line"><span class="built_in">alias</span> rubocop=<span class="string">"bundle exec rubocop"</span></span><br></pre></td></tr></table></figure><h3 id="Shortcut-for-Source-Tree"><a href="#Shortcut-for-Source-Tree" class="headerlink" title="Shortcut for Source Tree"></a>Shortcut for Source Tree</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ln -s /Applications/SourceTree.app/Contents/Resources/stree /usr/<span class="built_in">local</span>/bin/</span><br></pre></td></tr></table></figure><h3 id="Change-shortcut-to-change-active-window"><a href="#Change-shortcut-to-change-active-window" class="headerlink" title="Change shortcut to change active window"></a>Change shortcut to change active window</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Keybord &gt; Shortcut &gt; Keybord &gt; Move focus next window</span><br></pre></td></tr></table></figure><h3 id="Change-shortcut-for-select-the-previous-source"><a href="#Change-shortcut-for-select-the-previous-source" class="headerlink" title="Change shortcut for select the previous source"></a>Change shortcut for select the previous source</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Keybord &gt; Shortcut &gt; Input Source &gt; Select the previous <span class="built_in">source</span> &gt; <span class="built_in">command</span> + space</span><br></pre></td></tr></table></figure><h3 id="Change-shortcut-for-show-spotlight-search"><a href="#Change-shortcut-for-show-spotlight-search" class="headerlink" title="Change shortcut for show spotlight search"></a>Change shortcut for show spotlight search</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Keybord &gt; Shortcut &gt; Spotlight &gt; Show spotlight search &gt; control + space</span><br></pre></td></tr></table></figure><h3 id="Change-computer-name"><a href="#Change-computer-name" class="headerlink" title="Change computer name"></a>Change computer name</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Sharing &gt; Computer Name</span><br></pre></td></tr></table></figure><h3 id="Change-cursor-speed"><a href="#Change-cursor-speed" class="headerlink" title="Change cursor speed"></a>Change cursor speed</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Mouse &gt; Tracking Speed</span><br></pre></td></tr></table></figure><h3 id="Improve-Sound-Quality"><a href="#Improve-Sound-Quality" class="headerlink" title="Improve Sound Quality"></a>Improve Sound Quality</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sudo defaults write bluetoothaudiod <span class="string">"Enable AptX codec"</span> -bool <span class="literal">true</span></span><br><span class="line">sudo defaults write bluetoothaudiod <span class="string">"Enable AAC codec"</span> -bool <span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="Keytype-speed"><a href="#Keytype-speed" class="headerlink" title="Keytype speed"></a>Keytype speed</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">defaults write -g KeyRepeat -int 2</span><br><span class="line">defaults write -g InitialKeyRepeat -int 12</span><br></pre></td></tr></table></figure><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="https://community.atlassian.com/t5/Sourcetree-questions/SourceTree-command-line-tools-installation-failed/qaq-p/85023" target="_blank" rel="noopener">https://community.atlassian.com/t5/Sourcetree-questions/SourceTree-command-line-tools-installation-failed/qaq-p/85023</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;This article describes effective procedures for developer with Ruby/Java/JavaScript to setup Mac Majove.&lt;/p&gt;
    
    </summary>
    
      <category term="Mac" scheme="https://blog.morizyun.com/categories/Mac/"/>
    
    
  </entry>
  
  <entry>
    <title>Effective Procedures to Setup new Mac High Sierra For JSer/Rubyist</title>
    <link href="https://blog.morizyun.com/blog/setup-procedure-develop-ruby-rails-mac-sierra/"/>
    <id>https://blog.morizyun.com/blog/setup-procedure-develop-ruby-rails-mac-sierra/</id>
    <published>2018-09-14T04:00:00.000Z</published>
    <updated>2018-10-01T13:29:05.000Z</updated>
    
    <content type="html"><![CDATA[<p>This article describes effective procedures for JSer / Rubyists to setup High Sierra of macOS.</p><a id="more"></a><h2 id="Install-some-applications"><a href="#Install-some-applications" class="headerlink" title="Install some applications"></a>Install some applications</h2><h3 id="For-development"><a href="#For-development" class="headerlink" title="For development"></a>For development</h3><ul><li><strong><a href="https://atom.io/" target="_blank" rel="noopener">Atom</a></strong> : Editor for programmer</li><li><strong><a href="https://kapeli.com/dash" target="_blank" rel="noopener">Dash for macOS</a></strong> : API Documentation Browser</li><li><strong><a href="https://docs.docker.com/docker-for-mac/install/" target="_blank" rel="noopener">Docker for mac</a></strong> : Installer for docker tools</li><li><strong><a href="https://insomnia.rest/" target="_blank" rel="noopener">Insomnia</a></strong> : HTTP and GraphQL Client</li><li><strong><a href="https://www.jetbrains.com/idea/" target="_blank" rel="noopener">IntelliJ IDEA the Java IDE</a></strong> : Capable and Ergonomic IDE for a lot of languages</li><li><strong><a href="https://www.iterm2.com/" target="_blank" rel="noopener">iTerm</a></strong> : Modern and functional terminal app</li><li><strong><a href="https://www.sourcetreeapp.com/" target="_blank" rel="noopener">SourceTree</a></strong> : Free Git Client</li><li><strong><a href="https://code.visualstudio.com/docs/editor/setup" target="_blank" rel="noopener">Visual Studio Code</a></strong> : Editor for programmer</li><li><strong><a href="https://developer.apple.com/xcode/" target="_blank" rel="noopener">XCode</a></strong> : IDE for Swift and Objective-C</li></ul><h3 id="For-productivity"><a href="#For-productivity" class="headerlink" title="For productivity"></a>For productivity</h3><ul><li><strong><a href="https://freemacsoft.net/appcleaner/" target="_blank" rel="noopener">AppCleaner</a></strong> : Uninstaller for unwanted apps</li><li><strong><a href="https://getbitbar.com/" target="_blank" rel="noopener">BitBar</a></strong> : Put anything in your Mac OS X menu bar</li><li><strong><a href="https://www.google.co.jp/intl/ja/chrome/browser/" target="_blank" rel="noopener">Chrome</a></strong> : Effective browser</li><li><strong><a href="https://evernote.com/?var=2&amp;noredirect" target="_blank" rel="noopener">Evernote</a></strong> : Simplify cloud text editor</li><li><strong><a href="https://meetfranz.com/" target="_blank" rel="noopener">Franz</a></strong> : your messaging app for many apps</li><li><strong><a href="https://www.google.co.jp/ime/" target="_blank" rel="noopener">Google Japanese Input</a></strong> : IME for Japanese</li><li><strong><a href="http://magnet.crowdcafe.com/" target="_blank" rel="noopener">Magnet</a></strong> : Window manager for Mac</li><li><strong><a href="https://getstation.com/" target="_blank" rel="noopener">Station</a></strong> : Smart workstation for busy people</li><li><strong><a href="https://www.tripmode.ch/" target="_blank" rel="noopener">TripMode</a></strong> : Reduce your mobile data consumption</li></ul><h2 id="Homebrew"><a href="#Homebrew" class="headerlink" title="Homebrew"></a>Homebrew</h2><p>Before any installation, you should approve Xcode license agreement by the following command:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sudo xcodebuild -license</span><br></pre></td></tr></table></figure><p>You should execute the following command to install <strong><a href="http://brew.sh/" target="_blank" rel="noopener">Homebrew</a></strong>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ruby -e <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span></span><br></pre></td></tr></table></figure><p>If you are asked about Xcode Command line tool while installing with Homebrew, please install it.</p><h2 id="Oh-my-zsh"><a href="#Oh-my-zsh" class="headerlink" title="Oh-my-zsh"></a>Oh-my-zsh</h2><p>If you want to use a coftable Zsh customized by the community, let’s install<br><strong><a href="https://github.com/robbyrussell/oh-my-zsh" target="_blank" rel="noopener">robbyrussell/oh-my-zsh</a></strong>.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sh -c <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)</span>"</span></span><br></pre></td></tr></table></figure><h2 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h2><p>You should install Git command line tool:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install git</span><br><span class="line">git config --global user.name <span class="string">"USER_NAME"</span></span><br><span class="line">git config --global user.email email@example.com</span><br><span class="line">git config --global tag.sort version:refname</span><br></pre></td></tr></table></figure><p>After installing Git, we recommend to set global <code>.gitignore</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># install generator for .gitignore</span></span><br><span class="line">brew install gibo</span><br><span class="line"></span><br><span class="line"><span class="comment"># Set some unnecessary files of JetBrains and Mac to .gitignore</span></span><br><span class="line">gibo dump JetBrains macOS Ruby Rails Node &gt; ~/.gitignore</span><br><span class="line"></span><br><span class="line"><span class="comment"># Set the .gitignore to set git global setting</span></span><br><span class="line">git config --global --add core.excludesfile <span class="string">"<span class="variable">$HOME</span>/.gitignore"</span></span><br></pre></td></tr></table></figure><p>You should set basic passwords to skip filling password by <code>vi ~/.netrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">machine github.com</span><br><span class="line">login USERNAME</span><br><span class="line">password PASSWORD</span><br></pre></td></tr></table></figure><p>In addition, please add a alias <code>git push-f</code> to <code>vi ~/.gitconfig</code></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">[<span class="built_in">alias</span>]</span><br><span class="line">  push<span class="_">-f</span> = push --force-with-lease</span><br></pre></td></tr></table></figure><h2 id="autojump"><a href="#autojump" class="headerlink" title="autojump"></a>autojump</h2><p>If you want to fill a path more quickly,<br><strong><a href="https://github.com/wting/autojump" target="_blank" rel="noopener">wting/autojump</a></strong> is one of the greatest solutions.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install autojump</span><br></pre></td></tr></table></figure><p>After installing, set the following setting by <code>vi ~/.zshrc</code></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># autojump</span></span><br><span class="line">[[ -s $(brew --prefix)/etc/profile.d/autojump.sh ]] &amp;&amp; . $(brew --prefix)/etc/profile.d/autojump.sh</span><br></pre></td></tr></table></figure><p>After the setting, execute the following command to reflect the setting:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="Font-Ricty"><a href="#Font-Ricty" class="headerlink" title="Font Ricty"></a>Font Ricty</h2><p>Ricty is a fonts for programming, if you want to try it, please set the following command:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Installing Ricty</span></span><br><span class="line">brew install automake</span><br><span class="line">brew tap sanemat/font</span><br><span class="line">brew install Caskroom/cask/xquartz</span><br><span class="line">brew install ricty</span><br><span class="line"></span><br><span class="line"><span class="comment"># Copy generated font information</span></span><br><span class="line">cp -f /usr/<span class="built_in">local</span>/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/</span><br><span class="line"><span class="built_in">fc</span>-cache -vf</span><br><span class="line"></span><br><span class="line"><span class="comment"># Setting about anti-alias</span></span><br><span class="line">defaults -currentHost write -globalDomain AppleFontSmoothing -int 2</span><br></pre></td></tr></table></figure><h2 id="rbenv"><a href="#rbenv" class="headerlink" title="rbenv"></a>rbenv</h2><p>To avoid installing unnecessary documents, add the following setting <code>vim ~/.gemrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">install: --no-document</span><br><span class="line">update: --no-document</span><br></pre></td></tr></table></figure><p>After the above setting, let’s install the following rbenv and Ruby-build:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># installing rbenv / ruby-build</span></span><br><span class="line">brew install rbenv ruby-build</span><br><span class="line"></span><br><span class="line"><span class="comment"># Setting to installing gems when introducing new version</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/sstephenson/rbenv-default-gems.git ~/.rbenv/plugins/rbenv-default-gems</span><br><span class="line"></span><br><span class="line"><span class="comment"># Setting default install gems</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">'bundler\nrails\npg\npry'</span> &gt; ~/.rbenv/default-gems</span><br></pre></td></tr></table></figure><p>Edit the following setting by <code>vi ~/.zshrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># rbenv</span></span><br><span class="line">[[ -d ~/.rbenv  ]] &amp;&amp; \</span><br><span class="line">  <span class="built_in">export</span> PATH=<span class="variable">$&#123;HOME&#125;</span>/.rbenv/bin:<span class="variable">$&#123;PATH&#125;</span> &amp;&amp; \</span><br><span class="line">  <span class="built_in">eval</span> <span class="string">"<span class="variable">$(rbenv init -)</span>"</span></span><br></pre></td></tr></table></figure><p>The setting is reflected by the following command:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><p>Install Ruby by rbenv:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># show list of ruby versions which is able to install</span></span><br><span class="line">rbenv install -l</span><br><span class="line"></span><br><span class="line"><span class="comment"># Install latest ruby version(e.g. 2.5.0)</span></span><br><span class="line">rbenv install 2.5.0</span><br><span class="line">rbenv global 2.5.0</span><br></pre></td></tr></table></figure><h2 id="PostgreSQL"><a href="#PostgreSQL" class="headerlink" title="PostgreSQL"></a>PostgreSQL</h2><p>Install PostgreSQL:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install postgresql</span><br><span class="line">brew services start postgresql</span><br></pre></td></tr></table></figure><h2 id="Docker-Optional"><a href="#Docker-Optional" class="headerlink" title="Docker (Optional)"></a>Docker (Optional)</h2><p>Please set alias to <code>vi .zshrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Docker</span></span><br><span class="line"><span class="built_in">alias</span> d=<span class="string">'docker'</span></span><br><span class="line"><span class="built_in">alias</span> dc=<span class="string">'docker-compose'</span></span><br><span class="line"><span class="built_in">alias</span> dm=<span class="string">'docker-machine'</span></span><br></pre></td></tr></table></figure><p>After setting, reflect the upper settings:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h2 id="Node-Version-Manager"><a href="#Node-Version-Manager" class="headerlink" title="Node Version Manager"></a>Node Version Manager</h2><p>Please refer to <strong><a href="https://blog.morizyun.com/javascript/library-nvm.html">nvm: Node Version Manager</a></strong> and install it.</p><h2 id="Optional"><a href="#Optional" class="headerlink" title="Optional"></a>Optional</h2><h3 id="Java"><a href="#Java" class="headerlink" title="Java"></a>Java</h3><p>Download JDK from <strong><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank" rel="noopener">Java SE - Downloads / Oracle</a></strong> and install it.</p><p>After install JDK, you should install Maven &amp; gradle too.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install maven32</span><br><span class="line">brew install gradle</span><br></pre></td></tr></table></figure><p>After that, please write the bellow code in <code>.zshrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Java</span></span><br><span class="line"><span class="built_in">export</span> JAVA_HOME=`/usr/libexec/java_home -v 10.0.2`</span><br></pre></td></tr></table></figure><p>.</p><h3 id="Google-Cloud-Platform-SDK"><a href="#Google-Cloud-Platform-SDK" class="headerlink" title="Google Cloud Platform SDK"></a>Google Cloud Platform SDK</h3><p>Please refer to <strong><a href="https://cloud.google.com/sdk/" target="_blank" rel="noopener">Cloud SDK | Cloud SDK</a></strong> and install it.</p><h3 id="Heroku-CLI"><a href="#Heroku-CLI" class="headerlink" title="Heroku CLI"></a>Heroku CLI</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew install heroku/brew/heroku</span><br></pre></td></tr></table></figure><h3 id="Chromedriver"><a href="#Chromedriver" class="headerlink" title="Chromedriver"></a>Chromedriver</h3><p>If you use Chromedriver for selenium test or etc, please execute the follows:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew tap homebrew/cask</span><br><span class="line">brew cask install chromedriver</span><br></pre></td></tr></table></figure><h3 id="IntelliJ"><a href="#IntelliJ" class="headerlink" title="IntelliJ"></a>IntelliJ</h3><p>Please refer to the following articles and configure it.</p><ul><li><strong><a href="http://stackoverflow.com/questions/31215452/intellij-idea-importing-gradle-project-getting-java-home-not-defined-yet" target="_blank" rel="noopener">IntelliJ Idea: Importing Gradle project - getting JAVA_HOME not defined yet</a></strong></li><li><strong><a href="https://stackoverflow.com/questions/13578062/how-to-increase-ide-memory-limit-in-intellij-idea-on-mac" target="_blank" rel="noopener">How to increase IDE memory limit in IntelliJ IDEA on Mac?</a></strong></li></ul><h3 id="Shortcut-for-Ruby-dev"><a href="#Shortcut-for-Ruby-dev" class="headerlink" title="Shortcut for Ruby dev"></a>Shortcut for Ruby dev</h3><p>Please write the bellow code in <code>.zshrc</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># nodebrew(Node.js)</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$HOME</span>/.nodebrew/current/bin:<span class="variable">$PATH</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Rails</span></span><br><span class="line"><span class="built_in">alias</span> rspec=<span class="string">"bundle exec rspec"</span></span><br><span class="line"><span class="built_in">alias</span> rake=<span class="string">"bundle exec rake"</span></span><br><span class="line"><span class="built_in">alias</span> rubocop=<span class="string">"bundle exec rubocop"</span></span><br></pre></td></tr></table></figure><h3 id="Shortcut-for-Source-Tree"><a href="#Shortcut-for-Source-Tree" class="headerlink" title="Shortcut for Source Tree"></a>Shortcut for Source Tree</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ln -s /Applications/SourceTree.app/Contents/Resources/stree /usr/<span class="built_in">local</span>/bin/</span><br></pre></td></tr></table></figure><h3 id="Change-function-keys"><a href="#Change-function-keys" class="headerlink" title="Change function keys"></a>Change function keys</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Keybord &gt; Use all F1, F2, etc...</span><br></pre></td></tr></table></figure><h3 id="Change-shortcut-to-change-active-window"><a href="#Change-shortcut-to-change-active-window" class="headerlink" title="Change shortcut to change active window"></a>Change shortcut to change active window</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Keybord &gt; Shortcut &gt; Keybord &gt; Move focus next window</span><br></pre></td></tr></table></figure><h3 id="Change-shortcut-for-select-the-previous-source"><a href="#Change-shortcut-for-select-the-previous-source" class="headerlink" title="Change shortcut for select the previous source"></a>Change shortcut for select the previous source</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Keybord &gt; Shortcut &gt; Input Source &gt; Select the previous <span class="built_in">source</span> &gt; <span class="built_in">command</span> + space</span><br></pre></td></tr></table></figure><h3 id="Change-shortcut-for-show-spotlight-search"><a href="#Change-shortcut-for-show-spotlight-search" class="headerlink" title="Change shortcut for show spotlight search"></a>Change shortcut for show spotlight search</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Keybord &gt; Shortcut &gt; Spotlight &gt; Show spotlight search &gt; control + space</span><br></pre></td></tr></table></figure><h3 id="Change-computer-name"><a href="#Change-computer-name" class="headerlink" title="Change computer name"></a>Change computer name</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Sharing &gt; Computer Name</span><br></pre></td></tr></table></figure><h3 id="Change-cursor-speed"><a href="#Change-cursor-speed" class="headerlink" title="Change cursor speed"></a>Change cursor speed</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Application &gt; System Preferences &gt; Mouse &gt; Tracking Speed</span><br></pre></td></tr></table></figure><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="https://community.atlassian.com/t5/Sourcetree-questions/SourceTree-command-line-tools-installation-failed/qaq-p/85023" target="_blank" rel="noopener">https://community.atlassian.com/t5/Sourcetree-questions/SourceTree-command-line-tools-installation-failed/qaq-p/85023</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;This article describes effective procedures for JSer / Rubyists to setup High Sierra of macOS.&lt;/p&gt;
    
    </summary>
    
      <category term="Mac" scheme="https://blog.morizyun.com/categories/Mac/"/>
    
    
  </entry>
  
  <entry>
    <title>Basic tutorial for Scrapy [Scraping framework]</title>
    <link href="https://blog.morizyun.com/blog/scrapy-scraping-crawler-python-library/"/>
    <id>https://blog.morizyun.com/blog/scrapy-scraping-crawler-python-library/</id>
    <published>2018-07-25T04:00:00.000Z</published>
    <updated>2018-07-19T22:36:54.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong><a href="https://scrapy.org/" target="_blank" rel="noopener">Scrapy</a></strong> is scrapying OSS tool for extracting the data you need from websites. In addition, <strong><a href="https://scrapinghub.com/scrapy-cloud" target="_blank" rel="noopener">Scrapy Cloud - Scrapyinghub</a></strong> is a powerful and useful platform to run Scrapy cralwer. This article describes basic tutorial for Scrapy.</p><h2 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h2><p>Install Scrapy and Scrapyinghub library at the first time:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pip install scrapy shub</span><br></pre></td></tr></table></figure><p>After then, please create a new project for Scrapy:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">scrapy startproject PROJECT_NAME</span><br><span class="line"><span class="built_in">cd</span> PROJECT_NAME</span><br></pre></td></tr></table></figure><h2 id="Create-Spider"><a href="#Create-Spider" class="headerlink" title="Create Spider"></a>Create Spider</h2><p>In scrapy, you create some spiders which is crawler in a project. You can create the spider by the following command:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Generate code to scrape a new site</span></span><br><span class="line">scrapy genspider blogsider blog.scrapinghub.com</span><br></pre></td></tr></table></figure><p>After the above command, please change <code>spiders/blogsider.py</code>:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> scrapy</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">BlogSpider</span><span class="params">(scrapy.Spider)</span>:</span></span><br><span class="line">    name = <span class="string">'blogspider'</span></span><br><span class="line">    allowed_domains = [<span class="string">'blog.scrapinghub.com'</span>]</span><br><span class="line">    start_urls = [<span class="string">'https://blog.scrapinghub.com'</span>]</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">parse</span><span class="params">(self, response)</span>:</span></span><br><span class="line">        <span class="keyword">for</span> title <span class="keyword">in</span> response.css(<span class="string">'h2.entry-title'</span>):</span><br><span class="line">            <span class="keyword">yield</span> &#123;<span class="string">'title'</span>: title.css(<span class="string">'a ::text'</span>).extract_first()&#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> next_page <span class="keyword">in</span> response.css(<span class="string">'div.prev-post &gt; a'</span>):</span><br><span class="line">            <span class="keyword">yield</span> response.follow(next_page, self.parse)</span><br></pre></td></tr></table></figure><p>So, your spider can get title in entry list.</p><h2 id="Run-the-cawler-in-local"><a href="#Run-the-cawler-in-local" class="headerlink" title="Run the cawler in local"></a>Run the cawler in local</h2><p>You can execute your crawler on local:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Execute scraping in local</span></span><br><span class="line">scrapy crawl blogspider</span><br></pre></td></tr></table></figure><h2 id="Get-API-Key-on-Scrapinghub"><a href="#Get-API-Key-on-Scrapinghub" class="headerlink" title="Get API Key on Scrapinghub"></a>Get API Key on Scrapinghub</h2><p>If you create an account on <strong><a href="https://scrapinghub.com/scrapy-cloud#" target="_blank" rel="noopener">Scrapy Cloud - Scrapyinghub</a></strong>, you can deloy your code to there and execute it on theere.</p><p><img src="/img/2018-06-28-scraping-hub-sign-in.png" alt></p><p>After creating the account, please create project and confirm API key and Project Id.</p><p><img src="/img/scrapinghub-scrapy-cloud-create-project.png" alt></p><p><img src="/img/scrapinghub-scray-cloud-how-to-deploy.png" alt></p><h2 id="Create-Scrapyinghub-Configuration"><a href="#Create-Scrapyinghub-Configuration" class="headerlink" title="Create Scrapyinghub Configuration"></a>Create Scrapyinghub Configuration</h2><p>Create <code>scrapinghub.yml</code>:</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">projects:</span></span><br><span class="line"><span class="attr">  default:</span> <span class="string">YOUR_PROJECT_ID</span></span><br><span class="line"><span class="attr">stack:</span> <span class="attr">scrapy:1.5-py3</span></span><br></pre></td></tr></table></figure><p>Please set your project id and stack information which you want to use. If you want to know more detail of stack information, please see <strong><a href="https://github.com/scrapinghub/shub/blob/master/docs/deploying.rst" target="_blank" rel="noopener">shub/deploying</a></strong>.</p><h2 id="Deploy-to-Scrapyinghub"><a href="#Deploy-to-Scrapyinghub" class="headerlink" title="Deploy to Scrapyinghub"></a>Deploy to Scrapyinghub</h2><p>Let’s deply your code to Scrapyinghub with the API key:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Install a library for scrapying hub</span></span><br><span class="line">pip install shub</span><br><span class="line"></span><br><span class="line"><span class="comment"># Logging in Scrapinghub with &lt;API Key&gt;</span></span><br><span class="line">shub login</span><br><span class="line"></span><br><span class="line"><span class="comment"># Deploy to Scrapinghub</span></span><br><span class="line">shub deploy <span class="comment"># Deploy the spider to Scrapy Cloud</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Execute spider on Scrapinghub</span></span><br><span class="line">shub schedule blogspider</span><br></pre></td></tr></table></figure><p>After then, you can confirm the result items by Scrapyinghub screen.</p><p><img src="/img/2018-06-28-scrapyinghub-scrapy-cloud-job-finsihed-items.png" alt></p><h2 id="How-to-access-settings"><a href="#How-to-access-settings" class="headerlink" title="How to access settings"></a>How to access settings</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">print(<span class="string">"Existing settings: %s"</span> % self.settings.attributes.keys())</span><br></pre></td></tr></table></figure><p>If you want to know more detail, please see <a href="https://doc.scrapy.org/en/latest/topics/settings.html" target="_blank" rel="noopener">https://doc.scrapy.org/en/latest/topics/settings.html</a> .</p><h2 id="Appendix"><a href="#Appendix" class="headerlink" title="Appendix"></a>Appendix</h2><h3 id="Scrapy-Cloud-API"><a href="#Scrapy-Cloud-API" class="headerlink" title="Scrapy Cloud API"></a>Scrapy Cloud API</h3><p>Scrapy Cloud on Scrapyinghub has useful API. Please confirm as follows:</p><p><a href="https://doc.scrapinghub.com/scrapy-cloud.html" target="_blank" rel="noopener">https://doc.scrapinghub.com/scrapy-cloud.html</a></p><h3 id="Downloading-and-processing-files-and-images"><a href="#Downloading-and-processing-files-and-images" class="headerlink" title="Downloading and processing files and images"></a>Downloading and processing files and images</h3><p>Scrapy provides reusable item pipelines for downloading files attached to a particular item.</p><ul><li>Download their images</li><li>Create thumbnail</li></ul><p>If you want to know more detail, please see official document: <strong><a href="https://doc.scrapy.org/en/latest/topics/media-pipeline.html" target="_blank" rel="noopener">Downloading and processing files and images</a></strong>.</p><h3 id="Scrapy-Configuration"><a href="#Scrapy-Configuration" class="headerlink" title="Scrapy Configuration"></a>Scrapy Configuration</h3><p>About <code>settings.py</code>:</p><ul><li><code>DEPTH_LIMIT</code> : Depth to scrape</li><li><code>DOWNLOAD_DELAY</code> : Intervals for downloading data in scraping</li></ul><h3 id="Sentry"><a href="#Sentry" class="headerlink" title="Sentry"></a>Sentry</h3><h4 id="Installation-1"><a href="#Installation-1" class="headerlink" title="Installation"></a>Installation</h4><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pip install scrapy-sentry</span><br></pre></td></tr></table></figure><h4 id="Configuration"><a href="#Configuration" class="headerlink" title="Configuration"></a>Configuration</h4><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># sentry dsn</span></span><br><span class="line">SENTRY_DSN = <span class="string">'http://public:secret@example.com/1'</span></span><br><span class="line">EXTENSIONS = &#123;</span><br><span class="line">    <span class="string">"scrapy_sentry.extensions.Errors"</span>:<span class="number">10</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="Addons"><a href="#Addons" class="headerlink" title="Addons"></a>Addons</h3><h4 id="Magic-Fields"><a href="#Magic-Fields" class="headerlink" title="Magic Fields"></a>Magic Fields</h4><ul><li><a href="https://github.com/scrapy-plugins/scrapy-magicfields" target="_blank" rel="noopener">https://github.com/scrapy-plugins/scrapy-magicfields</a></li><li>It can add job_id, spider_name, created_at, etc to items.</li></ul><h4 id="Monitoring"><a href="#Monitoring" class="headerlink" title="Monitoring"></a>Monitoring</h4><ul><li>Monitor spiders and item validation check</li><li>Enable to define scrapy stats values</li><li>Get email and slack notifications</li></ul><h4 id="DotScrapy-Persistence"><a href="#DotScrapy-Persistence" class="headerlink" title="DotScrapy Persistence"></a>DotScrapy Persistence</h4><ul><li>Allows the crawler to access a persistent storage and share data among different runs of a spider by S3</li><li>It ignore duplicated URL among some jobs of a spider.</li><li>It is difficult to recover error sometimes, so please be careful to use it.</li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://scrapy.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Scrapy&lt;/a&gt;&lt;/strong&gt; is scrapying OSS tool for extracting the data yo
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Grammer Tips for Python 3</title>
    <link href="https://blog.morizyun.com/blog/python-basic-grammer-tips/"/>
    <id>https://blog.morizyun.com/blog/python-basic-grammer-tips/</id>
    <published>2018-07-23T04:00:00.000Z</published>
    <updated>2018-07-26T06:16:59.000Z</updated>
    
    <content type="html"><![CDATA[<p>In this article, I would like to share some Python Grammer tips for beginner.</p><h2 id="String"><a href="#String" class="headerlink" title="String"></a>String</h2><p>In Python, there are two type of string.</p><ul><li><code>str = u&#39;...&#39;</code><ul><li>A sequence of Unicode characters (UTF-16 or UTF-32). It can recognize one character as one character.</li></ul></li><li><code>bytes = b&#39;...&#39;</code><ul><li>A sequence of one byte data (integers between 0 and 255)</li></ul></li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># str =&gt; byte</span></span><br><span class="line"><span class="string">'あ'</span>.encode() <span class="comment">#=&gt; b'\xe3\x81\x82'</span></span><br><span class="line"><span class="string">'\uFEFF'</span>.encode(<span class="string">'UTF-8'</span>) <span class="comment">#=&gt; b'\xef\xbb\xbf'</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># byte =&gt; str</span></span><br><span class="line"><span class="string">b'\xe3\x81\x82'</span>.decode(<span class="string">'UTF-8'</span>) <span class="comment">#=&gt; 'あ'</span></span><br><span class="line"><span class="string">b'\xE2\x82\xAC'</span>.decode(<span class="string">'UTF-8'</span>) <span class="comment"># =&gt; '€'</span></span><br></pre></td></tr></table></figure><h3 id="Search-substring"><a href="#Search-substring" class="headerlink" title="Search substring"></a>Search substring</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">s = <span class="string">"This be a string"</span></span><br><span class="line"><span class="keyword">if</span> s.find(<span class="string">"is"</span>) == <span class="number">-1</span>:</span><br><span class="line">    <span class="keyword">print</span> <span class="string">"No 'is' here!"</span></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="keyword">print</span> <span class="string">"Found 'is' in the string."</span></span><br></pre></td></tr></table></figure><h3 id="Check-whether-string-starts"><a href="#Check-whether-string-starts" class="headerlink" title="Check whether string starts"></a>Check whether string starts</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">str = <span class="string">"this is string example....wow!!!"</span>;</span><br><span class="line"><span class="keyword">print</span> str.startswith( <span class="string">'this'</span> ) <span class="comment">#=&gt; True</span></span><br></pre></td></tr></table></figure><h3 id="Convert-string-to-lowercase"><a href="#Convert-string-to-lowercase" class="headerlink" title="Convert string to lowercase"></a>Convert string to lowercase</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">s = <span class="string">"Kilometer"</span></span><br><span class="line">print(s.lower()) <span class="comment">#=&gt; kilometer</span></span><br></pre></td></tr></table></figure><h3 id="Split-string-to-list"><a href="#Split-string-to-list" class="headerlink" title="Split string to list"></a>Split string to list</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">x = <span class="string">'blue,red,green'</span></span><br><span class="line">x.split(<span class="string">','</span>) <span class="comment">#=&gt; ['blue', 'red', 'green']</span></span><br></pre></td></tr></table></figure><h3 id="Remove-all-line-breaks-from-a-long-string-of-text"><a href="#Remove-all-line-breaks-from-a-long-string-of-text" class="headerlink" title="Remove all line breaks from a long string of text"></a>Remove all line breaks from a long string of text</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="string">'test\n\r'</span>.replace(<span class="string">'\n'</span>, <span class="string">' '</span>).replace(<span class="string">'\r'</span>, <span class="string">''</span>) <span class="comment">#=&gt; 'test'</span></span><br></pre></td></tr></table></figure><h3 id="Variable-expansion-in-String"><a href="#Variable-expansion-in-String" class="headerlink" title="Variable expansion in String"></a>Variable expansion in String</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">number=<span class="number">5</span></span><br><span class="line">text=<span class="string">'test'</span></span><br><span class="line"><span class="string">'Number is &#123;0&#125;、text is &#123;1&#125;'</span>.format(number, text)</span><br></pre></td></tr></table></figure><h3 id="Search-a-substring"><a href="#Search-a-substring" class="headerlink" title="Search a substring"></a>Search a substring</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">s = <span class="string">"This be a string"</span></span><br><span class="line"><span class="keyword">if</span> s.find(<span class="string">"is"</span>) == <span class="number">-1</span>:</span><br><span class="line">  <span class="keyword">print</span> <span class="string">"No 'is' here!"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="string">"is"</span> <span class="keyword">in</span> s:</span><br><span class="line">  <span class="keyword">print</span> <span class="string">"No 'is' here!"</span></span><br></pre></td></tr></table></figure><h3 id="Replace-substring"><a href="#Replace-substring" class="headerlink" title="Replace substring"></a>Replace substring</h3><p>This method returns a copy of the string with all occurrences of substring old replaced by new.</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">str = <span class="string">"this is string example....wow!!! this is really string"</span></span><br><span class="line"><span class="keyword">print</span> str.replace(<span class="string">"is"</span>, <span class="string">"was"</span>) <span class="comment">#=&gt; thwas was string example....wow!!! thwas was really string</span></span><br><span class="line"><span class="keyword">print</span> str.replace(<span class="string">"is"</span>, <span class="string">"was"</span>, <span class="number">3</span>) <span class="comment">#=&gt; thwas was string example....wow!!! thwas is really string</span></span><br></pre></td></tr></table></figure><h3 id="Trim-whitespace"><a href="#Trim-whitespace" class="headerlink" title="Trim whitespace"></a>Trim whitespace</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="string">' Hello '</span>.strip() <span class="comment">#=&gt; 'Hello'</span></span><br><span class="line"><span class="string">' Hello'</span>.strip() <span class="comment">#=&gt; 'Hello'</span></span><br><span class="line"><span class="string">'Bob has a cat'</span>.strip() <span class="comment">#=&gt; 'Bob has a cat'</span></span><br></pre></td></tr></table></figure><h3 id="Embedding-variable-in-Python-3-6-or-later"><a href="#Embedding-variable-in-Python-3-6-or-later" class="headerlink" title="Embedding variable in Python 3.6 or later"></a>Embedding variable in Python 3.6 or later</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">a = <span class="string">'sample'</span></span><br><span class="line">print(<span class="string">f'<span class="subst">&#123;a&#125;</span>'</span>) <span class="comment">#=&gt; 'sample'</span></span><br></pre></td></tr></table></figure><h2 id="List-Array"><a href="#List-Array" class="headerlink" title="List/Array"></a>List/Array</h2><h3 id="List-comprehension"><a href="#List-comprehension" class="headerlink" title="List comprehension"></a>List comprehension</h3><p>A list comprehension consists of the following parts:</p><ul><li>An Input Sequence.</li><li>A Variable representing members of the input sequence.</li><li>An Optional Predicate expression.</li></ul><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">[i <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">10</span>)] <span class="comment">#=&gt; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</span></span><br><span class="line">[i <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">10</span>) <span class="keyword">if</span> i%<span class="number">2</span>==<span class="number">0</span>] <span class="comment">#=&gt; [0, 2, 4, 6, 8]</span></span><br><span class="line">[ i <span class="keyword">if</span> i%<span class="number">2</span>==<span class="number">0</span> <span class="keyword">else</span> str(i) <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">10</span>)]  <span class="comment">#=&gt; [0, '1', 2, '3', 4, '5', 6, '7', 8, '9']</span></span><br></pre></td></tr></table></figure><h3 id="Append-element"><a href="#Append-element" class="headerlink" title="Append element"></a>Append element</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">lst = [<span class="string">'a'</span>]</span><br><span class="line">lst.append(<span class="string">'b'</span>) <span class="comment">#=&gt; ['a', 'b']</span></span><br></pre></td></tr></table></figure><h3 id="Get-the-number-of-elements-in-a-list"><a href="#Get-the-number-of-elements-in-a-list" class="headerlink" title="Get the number of elements in a list"></a>Get the number of elements in a list</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">&gt;&gt; len([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]) <span class="comment">#=&gt; 3</span></span><br></pre></td></tr></table></figure><h3 id="Convert-list-to-string"><a href="#Convert-list-to-string" class="headerlink" title="Convert list to string"></a>Convert list to string</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">list1 = [<span class="string">'1'</span>, <span class="string">'2'</span>, <span class="string">'3'</span>]</span><br><span class="line">str1 = <span class="string">', '</span>.join(list1) <span class="comment">#=&gt; '1, 2, 3'</span></span><br></pre></td></tr></table></figure><h3 id="Flatten"><a href="#Flatten" class="headerlink" title="Flatten"></a>Flatten</h3><p>Converting multi dimensional array to flatten array is as follows:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">l = [[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>], [<span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>], [<span class="number">7</span>], [<span class="number">8</span>, <span class="number">9</span>]]</span><br><span class="line"><span class="keyword">for</span> sublist <span class="keyword">in</span> l:</span><br><span class="line">    <span class="keyword">for</span> item <span class="keyword">in</span> sublist:</span><br><span class="line">        flat_list.append(item)</span><br></pre></td></tr></table></figure><h3 id="How-to-make-a-comma-separated-string-from-a-list-of-strings"><a href="#How-to-make-a-comma-separated-string-from-a-list-of-strings" class="headerlink" title="How to make a comma-separated string from a list of strings"></a>How to make a comma-separated string from a list of strings</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">myList = [<span class="string">'a'</span>,<span class="string">'b'</span>,<span class="string">'c'</span>,<span class="string">'d'</span>]</span><br><span class="line">myString = <span class="string">','</span>.join(myList)</span><br></pre></td></tr></table></figure><h3 id="Convert-list-to-set"><a href="#Convert-list-to-set" class="headerlink" title="Convert list to set"></a>Convert list to set</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">lst = [<span class="string">'a'</span>, <span class="string">'b'</span>, <span class="string">'b'</span>, <span class="string">'c'</span>]</span><br><span class="line">s = set(lst) <span class="comment">#=&gt; &#123;'a', 'b', 'c'&#125;</span></span><br></pre></td></tr></table></figure><h2 id="Dict"><a href="#Dict" class="headerlink" title="Dict"></a>Dict</h2><h3 id="Wether-find-key"><a href="#Wether-find-key" class="headerlink" title="Wether find key"></a>Wether find key</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">if</span> <span class="string">"key"</span> <span class="keyword">in</span> dict:</span><br><span class="line">  <span class="comment"># do something</span></span><br></pre></td></tr></table></figure><h2 id="Float-Decimal"><a href="#Float-Decimal" class="headerlink" title="Float/Decimal"></a>Float/Decimal</h2><h3 id="Convert-float-to-Decimal"><a href="#Convert-float-to-Decimal" class="headerlink" title="Convert float to Decimal"></a>Convert float to Decimal</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">format(f, <span class="string">".15g"</span>)</span><br></pre></td></tr></table></figure><h2 id="Tuple"><a href="#Tuple" class="headerlink" title="Tuple"></a>Tuple</h2><h3 id="Add-variable-to-tuple"><a href="#Add-variable-to-tuple" class="headerlink" title="Add variable to tuple"></a>Add variable to tuple</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">a = (<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>)</span><br><span class="line">b = a + (<span class="number">4</span>,) <span class="comment">#=&gt; (1, 2, 3, 4)</span></span><br></pre></td></tr></table></figure><h2 id="Regex"><a href="#Regex" class="headerlink" title="Regex"></a>Regex</h2><h3 id="Extract-pattern-matches"><a href="#Extract-pattern-matches" class="headerlink" title="Extract pattern matches"></a>Extract pattern matches</h3><p><code>r&#39;...&#39;</code> is literal for Regex. It is better to use it for Regex.</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line">m = re.search(<span class="string">r'(?&lt;=-)\w+'</span>, <span class="string">'spam-egg'</span>)</span><br><span class="line">m.group(<span class="number">0</span>) <span class="comment">#=&gt; 'egg'</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">p = re.compile(<span class="string">'name (.*) is valid'</span>)</span><br><span class="line">s = <span class="string">"""</span></span><br><span class="line"><span class="string">someline abc</span></span><br><span class="line"><span class="string">someother line</span></span><br><span class="line"><span class="string">name my_user_name is valid</span></span><br><span class="line"><span class="string">some more lines"""</span></span><br><span class="line">p.findall(s) <span class="comment">#=&gt; ['my_user_name']</span></span><br></pre></td></tr></table></figure><h3 id="string-replace-with-regular-expression"><a href="#string-replace-with-regular-expression" class="headerlink" title="string.replace with regular expression"></a>string.replace with regular expression</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line">line = re.sub(</span><br><span class="line">           <span class="string">r"(?i)^.*interfaceOpDataFile.*$"</span>,</span><br><span class="line">           <span class="string">"interfaceOpDataFile %s"</span> % fileIn,</span><br><span class="line">           line</span><br><span class="line">       )</span><br></pre></td></tr></table></figure><h3 id="Remove-specific-pattern-from-text"><a href="#Remove-specific-pattern-from-text" class="headerlink" title="Remove specific pattern from text"></a>Remove specific pattern from text</h3><p>This is example for removing HTML tags/formatting from a string:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">strip_html_tag</span><span class="params">(data)</span>:</span></span><br><span class="line">    p = re.compile(<span class="string">r'&lt;.*?&gt;'</span>)</span><br><span class="line">    <span class="keyword">return</span> p.sub(<span class="string">''</span>, data)</span><br><span class="line"></span><br><span class="line">strip_html_tag(<span class="string">'&lt;a href="foo.com" class="bar"&gt;I Want This &lt;b&gt;text!&lt;/b&gt;&lt;/a&gt;'</span>)</span><br><span class="line"><span class="comment">#=&gt; 'I Want This text!'</span></span><br></pre></td></tr></table></figure><h2 id="Datetime"><a href="#Datetime" class="headerlink" title="Datetime"></a>Datetime</h2><h3 id="Now"><a href="#Now" class="headerlink" title="Now"></a>Now</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line">datetime.datetime.now()</span><br></pre></td></tr></table></figure><h3 id="String-to-Datetime"><a href="#String-to-Datetime" class="headerlink" title="String to Datetime"></a>String to Datetime</h3><p><code>pip install dateutil</code> and add the following code:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> dateutil <span class="keyword">import</span> parser</span><br><span class="line">dt = parser.parse(<span class="string">"Aug 28 1999 12:00AM"</span>)</span><br></pre></td></tr></table></figure><h3 id="Convert-unix-timestamp-to-readable-date"><a href="#Convert-unix-timestamp-to-readable-date" class="headerlink" title="Convert unix timestamp to readable date"></a>Convert unix timestamp to readable date</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line"><span class="comment"># No miliseconds</span></span><br><span class="line">datetime.fromtimestamp(<span class="number">1172969203.1</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># With miliseconds</span></span><br><span class="line">s = <span class="number">1236472051807</span> / <span class="number">1000.0</span></span><br><span class="line">datetime.fromtimestamp(s).strftime(<span class="string">'%Y-%m-%d %H:%M:%S.%f'</span>) <span class="comment">#=&gt; '2009-03-08 09:27:31.807000'</span></span><br></pre></td></tr></table></figure><h3 id="Get-current-time-in-milliseconds"><a href="#Get-current-time-in-milliseconds" class="headerlink" title="Get current time in milliseconds"></a>Get current time in milliseconds</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> time</span><br><span class="line">millis = int(round(time.time() * <span class="number">1000</span>))</span><br><span class="line"><span class="keyword">print</span> millis</span><br></pre></td></tr></table></figure><h3 id="Convert-datetime-to-unix-time"><a href="#Convert-datetime-to-unix-time" class="headerlink" title="Convert datetime to unix time"></a>Convert datetime to unix time</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">datetime.datetime(<span class="number">2012</span>,<span class="number">4</span>,<span class="number">1</span>,<span class="number">0</span>,<span class="number">0</span>).timestamp()</span><br></pre></td></tr></table></figure><h2 id="Number-Float-Int"><a href="#Number-Float-Int" class="headerlink" title="Number(Float/Int)"></a>Number(Float/Int)</h2><h3 id="convert-x-to-a-plain-integer"><a href="#convert-x-to-a-plain-integer" class="headerlink" title="convert x to a plain integer"></a>convert x to a plain integer</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">int(x)</span><br></pre></td></tr></table></figure><h2 id="Grammar"><a href="#Grammar" class="headerlink" title="Grammar"></a>Grammar</h2><h3 id="Structure-for-sub-package"><a href="#Structure-for-sub-package" class="headerlink" title="Structure for sub package"></a>Structure for sub package</h3><p>The following code is little strange:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">sys.path.append(os.path.dirname(os.path.abspath(__file__)) + <span class="string">'/../sub_package1'</span>)</span><br><span class="line"><span class="keyword">import</span> utils</span><br></pre></td></tr></table></figure><p>Installing the whole root package and placing the sub packages under it will make the loading of the module natural.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mkdir sample_project/root_package</span><br><span class="line">touch sample_project/root_package/__init__.py</span><br><span class="line">mv sample_project/&#123;sub_package1, sub_package2&#125;</span><br></pre></td></tr></table></figure><p>The the above directory structure supports the following loading pattern.</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> root_package.sub_package1 <span class="keyword">import</span> SubPackage1</span><br></pre></td></tr></table></figure><h3 id="classmethod"><a href="#classmethod" class="headerlink" title="@classmethod"></a><code>@classmethod</code></h3><p>With <code>@classmethod</code>, we don’t have to specify the class name internally.</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="meta">@classmethod</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">create_table</span><span class="params">(cls, lambda_name)</span>:</span></span><br><span class="line">    Base._create_table(</span><br><span class="line">        cls.__table_name(lambda_name),</span><br><span class="line">        cls.KEY_SCHEMA,</span><br><span class="line">        cls.ATTRIBUTE_DEFINITION</span><br><span class="line">    )</span><br></pre></td></tr></table></figure><h3 id="None-is-instead-of-null"><a href="#None-is-instead-of-null" class="headerlink" title="None is instead of null"></a>None is instead of null</h3><p>In Python, the <code>null</code> object is the singleton <code>None</code>.</p><h3 id="Ternary-operator"><a href="#Ternary-operator" class="headerlink" title="Ternary operator"></a>Ternary operator</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">x = <span class="string">"OK"</span> <span class="keyword">if</span> n == <span class="number">10</span> <span class="keyword">else</span> <span class="string">"NG"</span></span><br></pre></td></tr></table></figure><h3 id="Throw-Raise-Error"><a href="#Throw-Raise-Error" class="headerlink" title="Throw/Raise Error"></a>Throw/Raise Error</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">raise</span> RuntimeError(<span class="string">'specific message'</span>) <span class="keyword">from</span> error</span><br></pre></td></tr></table></figure><h3 id="super-init-methods"><a href="#super-init-methods" class="headerlink" title="super().__init__() methods"></a><code>super().__init__()</code> methods</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Polygon</span><span class="params">(object)</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, id)</span>:</span></span><br><span class="line">        self.id = id</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Rectangle</span><span class="params">(Polygon)</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, id, width, height)</span>:</span></span><br><span class="line">        super(self.__class__, self).__init__(id)</span><br><span class="line">        self.shape = (width, height)</span><br></pre></td></tr></table></figure><h3 id="Keyword-argument-for-method"><a href="#Keyword-argument-for-method" class="headerlink" title="Keyword argument for method"></a>Keyword argument for method</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">func</span><span class="params">(a, b, *, option1=<span class="number">1</span>, option2=<span class="number">2</span>)</span>:</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line">func(a, b, option1=<span class="number">10</span>, option2=<span class="number">20</span>)</span><br><span class="line">func(a, b, c) <span class="comment"># エラー 固定変数は２つ</span></span><br><span class="line">func(a, b, opton1=<span class="number">10</span>) <span class="comment"># エラー 存在しないキーワード</span></span><br></pre></td></tr></table></figure><h3 id="How-to-import-the-class-in-same-dir"><a href="#How-to-import-the-class-in-same-dir" class="headerlink" title="How to import the class in same dir"></a>How to import the class in same dir</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> .user <span class="keyword">import</span> User</span><br></pre></td></tr></table></figure><h3 id="Import-a-module-given-the-full-path"><a href="#Import-a-module-given-the-full-path" class="headerlink" title="Import a module given the full path"></a>Import a module given the full path</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line">sys.path.append(<span class="string">'/foo/bar/mock-0.3.1'</span>)</span><br><span class="line"><span class="keyword">import</span> Mock</span><br></pre></td></tr></table></figure><h3 id="Get-type-information-of-object"><a href="#Get-type-information-of-object" class="headerlink" title="Get type information of object"></a>Get type information of object</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">isinstance([<span class="number">0</span>, <span class="number">10</span>, <span class="number">20</span>, <span class="number">30</span>], list) <span class="comment">#=&gt; True</span></span><br><span class="line">isinstance(<span class="number">50</span>, list) <span class="comment">#=&gt; False</span></span><br><span class="line"></span><br><span class="line">type([]) <span class="keyword">is</span> list <span class="comment">#=&gt; True</span></span><br><span class="line">type(&#123;&#125;) <span class="keyword">is</span> dict <span class="comment">#=&gt; True</span></span><br><span class="line"></span><br><span class="line">str = <span class="string">"test"</span></span><br><span class="line">type(str)</span><br></pre></td></tr></table></figure><h3 id="Object-unique-identifier"><a href="#Object-unique-identifier" class="headerlink" title="Object unique identifier"></a>Object unique identifier</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">id(x)</span><br></pre></td></tr></table></figure><h2 id="Etc"><a href="#Etc" class="headerlink" title="Etc"></a>Etc</h2><h3 id="Load-multiple-JSON-object"><a href="#Load-multiple-JSON-object" class="headerlink" title="Load multiple JSON object"></a>Load multiple JSON object</h3><p>JSON decoder can not load multiple JSON object like this:</p><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">&#123;<span class="attr">"name"</span>: <span class="string">"foo"</span>&#125;</span><br><span class="line">&#123;<span class="attr">"name"</span>: <span class="string">"bar"</span>&#125;</span><br></pre></td></tr></table></figure><p>It makes some error <code>json.decoder.JSONDecodeError: Extra data..</code></p><p>If you want to load multiple JSON object, please use as follows:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> json.decoder <span class="keyword">import</span> WHITESPACE</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">loads_iter</span><span class="params">(s)</span>:</span></span><br><span class="line">    size = len(s)</span><br><span class="line">    decoder = json.JSONDecoder()</span><br><span class="line"></span><br><span class="line">    end = <span class="number">0</span></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        idx = WHITESPACE.match(s[end:]).end()</span><br><span class="line">        i = end + idx</span><br><span class="line">        <span class="keyword">if</span> i &gt;= size:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        ob, end = decoder.raw_decode(s, i)</span><br><span class="line">        <span class="keyword">yield</span> ob</span><br></pre></td></tr></table></figure><h3 id="Generate-CSV-file"><a href="#Generate-CSV-file" class="headerlink" title="Generate CSV file"></a>Generate CSV file</h3><p>Generate CSV file from list(array):</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"></span><br><span class="line">items = [</span><br><span class="line">    [<span class="string">'John'</span>, <span class="number">28</span>],</span><br><span class="line">    [<span class="string">'Sara'</span>, <span class="number">22</span>]</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'/app/job_items.csv'</span>, <span class="string">'w'</span>, encoding=<span class="string">'utf8'</span>) <span class="keyword">as</span> f:</span><br><span class="line">    wr = csv.writer(f, quoting=csv.QUOTE_ALL, lineterminator=<span class="string">'\n'</span>)</span><br><span class="line">    wr.writerow([<span class="string">'name'</span>, <span class="string">'age'</span>])</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> items:</span><br><span class="line">        wr.writerow(i)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># Write string data as CSV</span></span><br><span class="line">        <span class="comment"># csvwriter.writerow([i])</span></span><br></pre></td></tr></table></figure><h3 id="Write-data-to-file"><a href="#Write-data-to-file" class="headerlink" title="Write data to file"></a>Write data to file</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">file = open(“testfile.txt”, ”w”)  </span><br><span class="line">file.write(“Hello World”)</span><br><span class="line">file.close()</span><br></pre></td></tr></table></figure><h3 id="How-to-access-environment-variables"><a href="#How-to-access-environment-variables" class="headerlink" title="How to access environment variables"></a>How to access environment variables</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line">print(os.environ[<span class="string">'HOME'</span>])</span><br></pre></td></tr></table></figure><h3 id="Check-existence-of-an-environment-variable"><a href="#Check-existence-of-an-environment-variable" class="headerlink" title="Check existence of an environment variable"></a>Check existence of an environment variable</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">if</span> os.environ.get(<span class="string">'abc'</span>):</span><br><span class="line">    <span class="comment">#abc is set to True</span></span><br></pre></td></tr></table></figure><h3 id="Memoization"><a href="#Memoization" class="headerlink" title="Memoization"></a>Memoization</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> functools <span class="keyword">import</span> lru_cache</span><br><span class="line"></span><br><span class="line"><span class="meta">@lru_cache(maxsize=1000)</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fib_memoized</span><span class="params">(n)</span>:</span></span><br><span class="line">    <span class="keyword">if</span> n &lt; <span class="number">2</span>:</span><br><span class="line">        <span class="keyword">return</span> n</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        <span class="keyword">return</span> fib(n - <span class="number">1</span>) + fib(n - <span class="number">2</span>)</span><br></pre></td></tr></table></figure><h3 id="Convert-generator-object-to-list"><a href="#Convert-generator-object-to-list" class="headerlink" title="Convert generator object to list"></a>Convert generator object to list</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">lst = list(gen)</span><br></pre></td></tr></table></figure><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="https://stackoverflow.com/questions/1712227/how-to-get-the-number-of-elements-in-a-list-in-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/1712227/how-to-get-the-number-of-elements-in-a-list-in-python</a></li><li><a href="https://stackoverflow.com/questions/5618878/how-to-convert-list-to-string" target="_blank" rel="noopener">https://stackoverflow.com/questions/5618878/how-to-convert-list-to-string</a></li><li><a href="https://stackoverflow.com/questions/16566268/remove-all-line-breaks-from-a-long-string-of-text" target="_blank" rel="noopener">https://stackoverflow.com/questions/16566268/remove-all-line-breaks-from-a-long-string-of-text</a></li><li><a href="https://stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method" target="_blank" rel="noopener">https://stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method</a></li><li><a href="https://tonari-it.com/python-str-format/" target="_blank" rel="noopener">https://tonari-it.com/python-str-format/</a></li><li><a href="https://qiita.com/junkoda/items/bfd35793c5cd33c600bc" target="_blank" rel="noopener">https://qiita.com/junkoda/items/bfd35793c5cd33c600bc</a></li><li><a href="https://note.nkmk.me/python-type-isinstance/" target="_blank" rel="noopener">https://note.nkmk.me/python-type-isinstance/</a></li><li><a href="https://stackoverflow.com/questions/15340582/python-extract-pattern-matches" target="_blank" rel="noopener">https://stackoverflow.com/questions/15340582/python-extract-pattern-matches</a></li><li><a href="https://stackoverflow.com/questions/2052390/manually-raising-throwing-an-exception-in-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/2052390/manually-raising-throwing-an-exception-in-python</a></li><li><a href="https://stackoverflow.com/questions/6269765/what-does-the-b-character-do-in-front-of-a-string-literal" target="_blank" rel="noopener">https://stackoverflow.com/questions/6269765/what-does-the-b-character-do-in-front-of-a-string-literal</a></li><li><a href="https://stackoverflow.com/questions/31019854/typeerror-cant-use-a-string-pattern-on-a-bytes-like-object-in-re-findall" target="_blank" rel="noopener">https://stackoverflow.com/questions/31019854/typeerror-cant-use-a-string-pattern-on-a-bytes-like-object-in-re-findall</a></li><li><a href="https://stackoverflow.com/questions/1380860/add-variables-to-tuple" target="_blank" rel="noopener">https://stackoverflow.com/questions/1380860/add-variables-to-tuple</a></li><li><a href="https://stackoverflow.com/questions/3289601/null-object-in-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/3289601/null-object-in-python</a></li><li><a href="https://qiita.com/howmuch515/items/bf6d21f603d9736fb4a5" target="_blank" rel="noopener">https://qiita.com/howmuch515/items/bf6d21f603d9736fb4a5</a></li><li><a href="https://stackoverflow.com/questions/12451431/loading-and-parsing-a-json-file-with-multiple-json-objects-in-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/12451431/loading-and-parsing-a-json-file-with-multiple-json-objects-in-python</a></li><li><a href="https://pod.hatenablog.com/entry/2017/08/31/035140" target="_blank" rel="noopener">https://pod.hatenablog.com/entry/2017/08/31/035140</a></li><li><a href="https://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python</a></li><li><a href="http://www.pythonforbeginners.com/files/reading-and-writing-files-in-python" target="_blank" rel="noopener">http://www.pythonforbeginners.com/files/reading-and-writing-files-in-python</a></li><li><a href="https://stackoverflow.com/questions/17053099/how-to-print-current-date-on-python3" target="_blank" rel="noopener">https://stackoverflow.com/questions/17053099/how-to-print-current-date-on-python3</a></li><li><a href="https://stackoverflow.com/questions/3790848/fastest-way-to-convert-an-iterator-to-a-list" target="_blank" rel="noopener">https://stackoverflow.com/questions/3790848/fastest-way-to-convert-an-iterator-to-a-list</a></li><li><a href="https://stackoverflow.com/questions/1816880/why-does-csvwriter-writerow-put-a-comma-after-each-character" target="_blank" rel="noopener">https://stackoverflow.com/questions/1816880/why-does-csvwriter-writerow-put-a-comma-after-each-character</a></li><li><a href="https://stackoverflow.com/questions/466345/converting-string-into-datetime" target="_blank" rel="noopener">https://stackoverflow.com/questions/466345/converting-string-into-datetime</a></li><li><a href="https://stackoverflow.com/questions/4142151/how-to-import-the-class-within-the-same-directory-or-sub-directory" target="_blank" rel="noopener">https://stackoverflow.com/questions/4142151/how-to-import-the-class-within-the-same-directory-or-sub-directory</a></li><li><a href="https://stackoverflow.com/questions/4906977/how-do-i-access-environment-variables-from-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/4906977/how-do-i-access-environment-variables-from-python</a></li><li><a href="https://stackoverflow.com/questions/44778/how-would-you-make-a-comma-separated-string-from-a-list-of-strings" target="_blank" rel="noopener">https://stackoverflow.com/questions/44778/how-would-you-make-a-comma-separated-string-from-a-list-of-strings</a></li><li><a href="https://stackoverflow.com/questions/44505457/checking-if-an-environment-variable-exists-and-is-set-to-true" target="_blank" rel="noopener">https://stackoverflow.com/questions/44505457/checking-if-an-environment-variable-exists-and-is-set-to-true</a></li><li><a href="https://stackoverflow.com/questions/3682748/converting-unix-timestamp-string-to-readable-date" target="_blank" rel="noopener">https://stackoverflow.com/questions/3682748/converting-unix-timestamp-string-to-readable-date</a></li><li><a href="https://stackoverflow.com/questions/21787496/converting-epoch-time-with-milliseconds-to-datetime" target="_blank" rel="noopener">https://stackoverflow.com/questions/21787496/converting-epoch-time-with-milliseconds-to-datetime</a></li><li><a href="https://stackoverflow.com/questions/316238/python-float-to-decimal-conversion" target="_blank" rel="noopener">https://stackoverflow.com/questions/316238/python-float-to-decimal-conversion</a></li><li><a href="https://stackoverflow.com/questions/1252357/is-there-an-object-unique-identifier-in-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/1252357/is-there-an-object-unique-identifier-in-python</a></li><li><a href="https://stackoverflow.com/questions/5998245/get-current-time-in-milliseconds-in-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/5998245/get-current-time-in-milliseconds-in-python</a></li><li><a href="https://qiita.com/alchemist/items/c75174c41b0bcd31ecc6" target="_blank" rel="noopener">https://qiita.com/alchemist/items/c75174c41b0bcd31ecc6</a></li><li><a href="https://docs.python.org/3/tutorial/datastructures.html" target="_blank" rel="noopener">https://docs.python.org/3/tutorial/datastructures.html</a></li><li><a href="https://stackoverflow.com/questions/15768757/how-to-construct-a-set-out-of-list-items-in-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/15768757/how-to-construct-a-set-out-of-list-items-in-python</a></li><li><a href="https://stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method" target="_blank" rel="noopener">https://stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method</a></li><li><a href="https://stackoverflow.com/questions/6797984/how-to-convert-string-to-lowercase-in-python" target="_blank" rel="noopener">https://stackoverflow.com/questions/6797984/how-to-convert-string-to-lowercase-in-python</a></li><li><a href="https://www.tutorialspoint.com/python/string_replace.htm" target="_blank" rel="noopener">https://www.tutorialspoint.com/python/string_replace.htm</a></li><li><a href="https://stackoverflow.com/questions/761804/how-do-i-trim-whitespace-from-a-python-string" target="_blank" rel="noopener">https://stackoverflow.com/questions/761804/how-do-i-trim-whitespace-from-a-python-string</a></li><li><a href="https://docs.python.org/3.6/library/re.html#module-re" target="_blank" rel="noopener">https://docs.python.org/3.6/library/re.html#module-re</a></li><li><a href="https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7" target="_blank" rel="noopener">https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7</a></li><li><a href="https://www.tutorialspoint.com/python/python_numbers.htm" target="_blank" rel="noopener">https://www.tutorialspoint.com/python/python_numbers.htm</a></li><li><a href="https://stackoverflow.com/questions/24130745/convert-generator-object-to-list-for-debugging" target="_blank" rel="noopener">https://stackoverflow.com/questions/24130745/convert-generator-object-to-list-for-debugging</a></li><li><a href="https://stackoverflow.com/questions/11743019/convert-python-datetime-to-epoch-with-strftime" target="_blank" rel="noopener">https://stackoverflow.com/questions/11743019/convert-python-datetime-to-epoch-with-strftime</a></li><li><a href="https://qiita.com/miyagaw61/items/0e8cc40d95bf6236729e" target="_blank" rel="noopener">https://qiita.com/miyagaw61/items/0e8cc40d95bf6236729e</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;In this article, I would like to share some Python Grammer tips for beginner.&lt;/p&gt;
&lt;h2 id=&quot;String&quot;&gt;&lt;a href=&quot;#String&quot; class=&quot;headerlink&quot; ti
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Basic tutorial for Django with Docker[Python3]</title>
    <link href="https://blog.morizyun.com/blog/python-library-django-docker-basic-tutorial/"/>
    <id>https://blog.morizyun.com/blog/python-library-django-docker-basic-tutorial/</id>
    <published>2018-07-07T04:00:00.000Z</published>
    <updated>2018-07-27T07:23:29.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong><a href="https://www.djangoproject.com/" target="_blank" rel="noopener">Django</a></strong> is the most famous web framework for Python.<br>In this article, I would like to share basic tutorial of Django for beginner.</p><h2 id="Create-Project-Directory"><a href="#Create-Project-Directory" class="headerlink" title="Create Project Directory"></a>Create Project Directory</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mkdir PROJECT_DIR</span><br><span class="line"><span class="built_in">cd</span> PROJECT_DIR</span><br></pre></td></tr></table></figure><h2 id="Create-requirements-txt"><a href="#Create-requirements-txt" class="headerlink" title="Create requirements.txt"></a>Create requirements.txt</h2><p>Create <code>requirements.txt</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Django==2.0.7</span><br><span class="line">django-bootstrap4==0.0.6</span><br></pre></td></tr></table></figure><p>You will install following libraries:</p><ul><li><a href="https://pypi.org/project/Django/" target="_blank" rel="noopener">https://pypi.org/project/Django/</a></li><li><a href="https://pypi.org/project/django-bootstrap4/" target="_blank" rel="noopener">https://pypi.org/project/django-bootstrap4/</a></li></ul><h2 id="Dockerfile"><a href="#Dockerfile" class="headerlink" title="Dockerfile"></a>Dockerfile</h2><p>Add <code>Dockerfile</code>:</p><figure class="highlight dockerfile"><table><tr><td class="code"><pre><span class="line"><span class="keyword">FROM</span> python</span><br><span class="line"></span><br><span class="line"><span class="comment"># Environment variable</span></span><br><span class="line"><span class="keyword">ENV</span> PYTHONUNBUFFERED <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># update apt-get</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update -y &amp;&amp; apt-get upgrade -y</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># install libraries</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get install -y groff-base</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># change work directory</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> mkdir -p /app</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /app</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">ADD</span><span class="bash"> requirements.txt /app/</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> pip install -r requirements.txt</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">EXPOSE</span> $PORT</span><br><span class="line"></span><br><span class="line"><span class="keyword">CMD</span><span class="bash"> [<span class="string">"manage.py runserver 0.0.0.0:<span class="variable">$PORT</span>"</span>]</span></span><br></pre></td></tr></table></figure><h2 id="docker-compose-yml"><a href="#docker-compose-yml" class="headerlink" title="docker-compose.yml"></a>docker-compose.yml</h2><p>Add <code>docker-compose.yml</code>:</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">'3.5'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line"><span class="attr">  app:</span></span><br><span class="line"><span class="attr">    build:</span> <span class="string">.</span></span><br><span class="line"><span class="attr">    tty:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">    stdin_open:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">    restart:</span> <span class="string">always</span></span><br><span class="line"><span class="attr">    expose:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">"8000"</span></span><br><span class="line"><span class="attr">    ports:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">"8000:8000"</span></span><br><span class="line"><span class="attr">    links:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">db</span></span><br><span class="line"><span class="attr">    working_dir:</span> <span class="string">/app</span></span><br><span class="line"><span class="attr">    volumes:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">.:/app</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">./ssh:/root/.ssh</span></span><br><span class="line"><span class="attr">    command:</span> <span class="string">./manage.py</span> <span class="string">runserver</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span><span class="string">:8000</span></span><br><span class="line"></span><br><span class="line"><span class="attr">  db:</span></span><br><span class="line"><span class="attr">    image:</span> <span class="attr">postgres:10.4</span></span><br></pre></td></tr></table></figure><h2 id="Start-Docker-container"><a href="#Start-Docker-container" class="headerlink" title="Start Docker container"></a>Start Docker container</h2><p>Start a Docker container and use bash in the container by the following terminal commands:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">docker-compose up -d</span><br><span class="line">docker-compose <span class="built_in">exec</span> app /bin/bash</span><br></pre></td></tr></table></figure><p>If you want to stop the docker containers, please execute <code>docker-compose down</code>.</p><h2 id="Create-Django-project"><a href="#Create-Django-project" class="headerlink" title="Create Django project"></a>Create Django project</h2><p>In docker container, please execute it:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">django-admin.py startproject myapp</span><br><span class="line"><span class="built_in">cd</span> myapp</span><br></pre></td></tr></table></figure><h2 id="Create-Application-in-the-Project"><a href="#Create-Application-in-the-Project" class="headerlink" title="Create Application in the Project"></a>Create Application in the Project</h2><p>Create new application in your project:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">python manage.py startapp cms</span><br></pre></td></tr></table></figure><h2 id="Initial-configuration"><a href="#Initial-configuration" class="headerlink" title="Initial configuration"></a>Initial configuration</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">python manage.py migrate</span><br></pre></td></tr></table></figure><h2 id="Start-server"><a href="#Start-server" class="headerlink" title="Start server"></a>Start server</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">python manage.py runserver</span><br></pre></td></tr></table></figure><p>After then, please execute <code>open http://$(docker-machine ip):8000/</code> in your local terminal(not docker container).</p><h2 id="Configuration-for-project"><a href="#Configuration-for-project" class="headerlink" title="Configuration for project"></a>Configuration for project</h2><p>Configure <code>myapp/setting.py</code>:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">ALLOWED_HOSTS = [<span class="string">'DOCKER_MACHINE_IP'</span>] <span class="comment"># Please add docker machine ip</span></span><br><span class="line"></span><br><span class="line">INSTALLED_APPS = [</span><br><span class="line">    <span class="string">'django.contrib.admin'</span>,</span><br><span class="line">    <span class="string">'django.contrib.auth'</span>,</span><br><span class="line">    <span class="string">'django.contrib.contenttypes'</span>,</span><br><span class="line">    <span class="string">'django.contrib.sessions'</span>,</span><br><span class="line">    <span class="string">'django.contrib.messages'</span>,</span><br><span class="line">    <span class="string">'django.contrib.staticfiles'</span>,</span><br><span class="line">    <span class="string">'cms'</span>, <span class="comment"># your application</span></span><br><span class="line">    <span class="string">'bootstrap4'</span>, <span class="comment"># django-bootstrap4</span></span><br><span class="line">]</span><br></pre></td></tr></table></figure><h2 id="Create-superuser-and-logging-into-admin"><a href="#Create-superuser-and-logging-into-admin" class="headerlink" title="Create superuser and logging into admin"></a>Create superuser and logging into admin</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Input user id and password</span></span><br><span class="line">python manage.py createsuperuser</span><br></pre></td></tr></table></figure><p>You can logging into admin by <code>open http://$(docker-machine ip):8000/admin</code> with the above user id and password</p><h2 id="Admin-configuration"><a href="#Admin-configuration" class="headerlink" title="Admin configuration"></a>Admin configuration</h2><p>Modify <code>cms/admin.py</code>:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.contrib <span class="keyword">import</span> admin</span><br><span class="line"><span class="keyword">from</span> cms.models <span class="keyword">import</span> Book, Impression</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">BookAdmin</span><span class="params">(admin.ModelAdmin)</span>:</span></span><br><span class="line">    list_display = (<span class="string">'id'</span>, <span class="string">'name'</span>, <span class="string">'publisher'</span>, <span class="string">'page'</span>,)</span><br><span class="line">    list_display_links = (<span class="string">'id'</span>, <span class="string">'name'</span>,)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ImpressionAdmin</span><span class="params">(admin.ModelAdmin)</span>:</span></span><br><span class="line">    list_display = (<span class="string">'id'</span>, <span class="string">'comment'</span>,)</span><br><span class="line">    list_display_links = (<span class="string">'id'</span>, <span class="string">'comment'</span>,)</span><br><span class="line">    raw_id_fields = (<span class="string">'book'</span>,)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">admin.site.register(Book, BookAdmin)</span><br><span class="line">admin.site.register(Impression, ImpressionAdmin)</span><br></pre></td></tr></table></figure><h2 id="Model"><a href="#Model" class="headerlink" title="Model"></a>Model</h2><p>Modify <code>cms/models.py</code>:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.db <span class="keyword">import</span> models</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Book</span><span class="params">(models.Model)</span>:</span></span><br><span class="line">    name = models.CharField(<span class="string">'title'</span>, max_length=<span class="number">255</span>)</span><br><span class="line">    publisher = models.CharField(<span class="string">'publisher'</span>, max_length=<span class="number">255</span>, blank=<span class="literal">True</span>)</span><br><span class="line">    page = models.IntegerField(<span class="string">'page_number'</span>, blank=<span class="literal">True</span>, default=<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__str__</span><span class="params">(self)</span>:</span></span><br><span class="line">        <span class="keyword">return</span> self.name</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Impression</span><span class="params">(models.Model)</span>:</span></span><br><span class="line">    book = models.ForeignKey(Book, verbose_name=<span class="string">'book'</span>, related_name=<span class="string">'impressions'</span>, on_delete=models.CASCADE)</span><br><span class="line">    comment = models.TextField(<span class="string">'comment'</span>, blank=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__str__</span><span class="params">(self)</span>:</span></span><br><span class="line">        <span class="keyword">return</span> self.comment</span><br></pre></td></tr></table></figure><h2 id="Execute-migration"><a href="#Execute-migration" class="headerlink" title="Execute migration"></a>Execute migration</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Create migration file</span></span><br><span class="line">python manage.py makemigrations cms</span><br><span class="line"></span><br><span class="line"><span class="comment"># Confirm SQL of the migration</span></span><br><span class="line">python manage.py sqlmigrate cms 0001</span><br><span class="line"></span><br><span class="line"><span class="comment"># Execute the Migration</span></span><br><span class="line">python manage.py migrate cms</span><br></pre></td></tr></table></figure><h2 id="Views"><a href="#Views" class="headerlink" title="Views"></a>Views</h2><p>Modify <code>cms/views.py</code>:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.shortcuts <span class="keyword">import</span> render, get_object_or_404, redirect</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> cms.models <span class="keyword">import</span> Book</span><br><span class="line"><span class="keyword">from</span> cms.forms <span class="keyword">import</span> BookForm</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">book_list</span><span class="params">(request)</span>:</span></span><br><span class="line">    books = Book.objects.all().order_by(<span class="string">'id'</span>)</span><br><span class="line">    <span class="keyword">return</span> render(request,</span><br><span class="line">                  <span class="string">'cms/book_list.html'</span>,</span><br><span class="line">                  &#123;<span class="string">'books'</span>: books&#125;)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">book_edit</span><span class="params">(request, book_id=None)</span>:</span></span><br><span class="line">    <span class="keyword">if</span> book_id:</span><br><span class="line">        book = get_object_or_404(Book, pk=book_id)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        book = Book()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> request.method == <span class="string">'POST'</span>:</span><br><span class="line">        form = BookForm(request.POST, instance=book)</span><br><span class="line">        <span class="keyword">if</span> form.is_valid():</span><br><span class="line">            book = form.save(commit=<span class="literal">False</span>)</span><br><span class="line">            book.save()</span><br><span class="line">            <span class="keyword">return</span> redirect(<span class="string">'cms:book_list'</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        form = BookForm(instance=book)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> render(request, <span class="string">'cms/book_edit.html'</span>, dict(form=form, book_id=book_id))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">book_del</span><span class="params">(request, book_id)</span>:</span></span><br><span class="line">    book = get_object_or_404(Book, pk=book_id)</span><br><span class="line">    book.delete()</span><br><span class="line">    <span class="keyword">return</span> redirect(<span class="string">'cms:book_list'</span>)</span><br></pre></td></tr></table></figure><p>Create <code>cms/templates/cms/base.html</code>:</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;% load i18n static %&#125;</span><br><span class="line"><span class="meta">&lt;!DOCTYPE html&gt;</span>&#123;% get_current_language as LANGUAGE_CODE %&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"&#123;&#123; LANGUAGE_CODE|default:"</span><span class="attr">en-us</span>" &#125;&#125;"&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1, shrink-to-fit=no"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"</span>&gt;</span></span><br><span class="line">  &#123;% block extra_css %&#125;&#123;% endblock %&#125;</span><br><span class="line">  <span class="tag">&lt;<span class="name">title</span>&gt;</span>&#123;% block title %&#125;My books&#123;% endblock %&#125;<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"container"</span>&gt;</span></span><br><span class="line">  &#123;% block content %&#125;</span><br><span class="line">  &#123;&#123; content &#125;&#125;</span><br><span class="line">  &#123;% endblock %&#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://code.jquery.com/jquery-3.3.1.min.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.bundle.min.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">&#123;% block extra_js %&#125;&#123;% endblock %&#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>Create <code>cms/templates/cms/book_list.html</code>:</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;% extends "cms/base.html" %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% block title %&#125;List of books&#123;% endblock title %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% block content %&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">h4</span> <span class="attr">class</span>=<span class="string">"mt-4 border-bottom"</span>&gt;</span>List of books<span class="tag">&lt;/<span class="name">h4</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">"&#123;% url 'cms:book_add' %&#125;"</span> <span class="attr">class</span>=<span class="string">"btn btn-primary btn-sm my-3"</span>&gt;</span>Add<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">table</span> <span class="attr">class</span>=<span class="string">"table table-striped table-bordered"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">thead</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">tr</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">th</span> <span class="attr">scope</span>=<span class="string">"col"</span>&gt;</span>ID<span class="tag">&lt;/<span class="name">th</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">th</span> <span class="attr">scope</span>=<span class="string">"col"</span>&gt;</span>Title<span class="tag">&lt;/<span class="name">th</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">th</span> <span class="attr">scope</span>=<span class="string">"col"</span>&gt;</span>Publisher<span class="tag">&lt;/<span class="name">th</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">th</span> <span class="attr">scope</span>=<span class="string">"col"</span>&gt;</span>Page number<span class="tag">&lt;/<span class="name">th</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">th</span> <span class="attr">scope</span>=<span class="string">"col"</span>&gt;</span>Control<span class="tag">&lt;/<span class="name">th</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">thead</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">tbody</span>&gt;</span></span><br><span class="line">  &#123;% for book in books %&#125;</span><br><span class="line">  <span class="tag">&lt;<span class="name">tr</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">th</span> <span class="attr">scope</span>=<span class="string">"row"</span>&gt;</span>&#123;&#123; book.id &#125;&#125;<span class="tag">&lt;/<span class="name">th</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">td</span>&gt;</span>&#123;&#123; book.name &#125;&#125;<span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">td</span>&gt;</span>&#123;&#123; book.publisher &#125;&#125;<span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">td</span>&gt;</span>&#123;&#123; book.page &#125;&#125;<span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">td</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">"&#123;% url 'cms:book_mod' book_id=book.id %&#125;"</span> <span class="attr">class</span>=<span class="string">"btn btn-outline-primary btn-sm"</span>&gt;</span>Edit<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">button</span> <span class="attr">class</span>=<span class="string">"btn btn-outline-danger btn-sm del_confirm"</span> <span class="attr">data-toggle</span>=<span class="string">"modal"</span> <span class="attr">data-target</span>=<span class="string">"#deleteModal"</span> <span class="attr">data-pk</span>=<span class="string">"&#123;&#123; book.id &#125;&#125;"</span> <span class="attr">data-url</span>=<span class="string">"&#123;% url 'cms:book_del' book_id=book.id %&#125;"</span>&gt;</span>Delete<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><br><span class="line">  &#123;% endfor %&#125;</span><br><span class="line"></span><br><span class="line">  &#123;# Confirmation dialog #&#125;</span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"modal fade"</span> <span class="attr">id</span>=<span class="string">"deleteModal"</span> <span class="attr">tabindex</span>=<span class="string">"-1"</span> <span class="attr">role</span>=<span class="string">"dialog"</span> <span class="attr">aria-labelledby</span>=<span class="string">"deleteModalLabel"</span> <span class="attr">aria-hidden</span>=<span class="string">"true"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"modal-dialog"</span> <span class="attr">role</span>=<span class="string">"document"</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"modal-content"</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"modal-header"</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">h5</span> <span class="attr">class</span>=<span class="string">"modal-title"</span> <span class="attr">id</span>=<span class="string">"deleteModalLabel"</span>&gt;</span>Confirmation<span class="tag">&lt;/<span class="name">h5</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">"button"</span> <span class="attr">class</span>=<span class="string">"close"</span> <span class="attr">data-dismiss</span>=<span class="string">"modal"</span> <span class="attr">aria-label</span>=<span class="string">"Close"</span>&gt;</span><span class="tag">&lt;<span class="name">span</span> <span class="attr">aria-hidden</span>=<span class="string">"true"</span>&gt;</span>&amp;times;<span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"modal-body"</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">p</span>&gt;</span>Delete ID: <span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">"del_pk"</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span>?<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"modal-footer"</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">"#"</span> <span class="attr">class</span>=<span class="string">"btn btn-primary"</span> <span class="attr">id</span>=<span class="string">"del_url"</span>&gt;</span>OK<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">"button"</span> <span class="attr">class</span>=<span class="string">"btn btn-secondary"</span> <span class="attr">data-dismiss</span>=<span class="string">"modal"</span>&gt;</span>Cancel<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">tbody</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">table</span>&gt;</span></span><br><span class="line">&#123;% endblock content %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% block extra_js %&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="javascript">  $(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">    $(<span class="string">'.del_confirm'</span>).on(<span class="string">'click'</span>, <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">      $(<span class="string">"#del_pk"</span>).text($(<span class="keyword">this</span>).data(<span class="string">"pk"</span>));</span></span><br><span class="line"><span class="javascript">      $(<span class="string">'#del_url'</span>).attr(<span class="string">'href'</span>, $(<span class="keyword">this</span>).data(<span class="string">"url"</span>));</span></span><br><span class="line"><span class="undefined">    &#125;);</span></span><br><span class="line"><span class="undefined">  &#125;);</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">&#123;% endblock %&#125;</span><br></pre></td></tr></table></figure><p>Create <code>cms/templates/cms/book_edit.html</code>:</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line">&#123;% extends "cms/base.html" %&#125;</span><br><span class="line">&#123;% load bootstrap4 %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% block title %&#125;Edit book&#123;% endblock title %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% block content %&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">h4</span> <span class="attr">class</span>=<span class="string">"mt-4 mb-5 border-bottom"</span>&gt;</span>Edit book<span class="tag">&lt;/<span class="name">h4</span>&gt;</span></span><br><span class="line">&#123;% if book_id %&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">form</span> <span class="attr">action</span>=<span class="string">"&#123;% url 'cms:book_mod' book_id=book_id %&#125;"</span> <span class="attr">method</span>=<span class="string">"post"</span>&gt;</span></span><br><span class="line">&#123;% else %&#125;</span><br><span class="line"><span class="tag">&lt;<span class="name">form</span> <span class="attr">action</span>=<span class="string">"&#123;% url 'cms:book_add' %&#125;"</span> <span class="attr">method</span>=<span class="string">"post"</span>&gt;</span></span><br><span class="line">&#123;% endif %&#125;</span><br><span class="line">  &#123;% csrf_token %&#125;</span><br><span class="line">  &#123;% bootstrap_form form layout='horizontal' %&#125;</span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"form-group row"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"offset-md-3 col-md-9"</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">button</span> <span class="attr">type</span>=<span class="string">"submit"</span> <span class="attr">class</span>=<span class="string">"btn btn-primary"</span>&gt;</span>Send<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">"&#123;% url 'cms:book_list' %&#125;"</span> <span class="attr">class</span>=<span class="string">"btn btn-secondary btn-sm"</span>&gt;</span>Back<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">&#123;% endblock content %&#125;</span><br></pre></td></tr></table></figure><h2 id="Form"><a href="#Form" class="headerlink" title="Form"></a>Form</h2><p>Create <code>cms/forms.py</code>:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.forms <span class="keyword">import</span> ModelForm</span><br><span class="line"><span class="keyword">from</span> cms.models <span class="keyword">import</span> Book</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">BookForm</span><span class="params">(ModelForm)</span>:</span></span><br><span class="line">    <span class="class"><span class="keyword">class</span> <span class="title">Meta</span>:</span></span><br><span class="line">        model = Book</span><br><span class="line">        fields = (<span class="string">'name'</span>, <span class="string">'publisher'</span>, <span class="string">'page'</span>,)</span><br></pre></td></tr></table></figure><h2 id="URL-Routing"><a href="#URL-Routing" class="headerlink" title="URL Routing"></a>URL Routing</h2><p>Create <code>cms/urls.py</code></p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.urls <span class="keyword">import</span> path</span><br><span class="line"><span class="keyword">from</span> cms <span class="keyword">import</span> views</span><br><span class="line"></span><br><span class="line">app_name = <span class="string">'cms'</span></span><br><span class="line">urlpatterns = [</span><br><span class="line">    <span class="comment"># Book</span></span><br><span class="line">    path(<span class="string">'book/'</span>, views.book_list, name=<span class="string">'book_list'</span>), <span class="comment"># list</span></span><br><span class="line">    path(<span class="string">'book/add/'</span>, views.book_edit, name=<span class="string">'book_add'</span>), <span class="comment"># create</span></span><br><span class="line">    path(<span class="string">'book/mod/&lt;int:book_id&gt;/'</span>, views.book_edit, name=<span class="string">'book_mod'</span>), <span class="comment"># edit</span></span><br><span class="line">    path(<span class="string">'book/del/&lt;int:book_id&gt;/'</span>, views.book_del, name=<span class="string">'book_del'</span>), <span class="comment"># delete</span></span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>Modify <code>admin/urls.py</code>:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> django.contrib <span class="keyword">import</span> admin</span><br><span class="line"><span class="keyword">from</span> django.urls <span class="keyword">import</span> path, include</span><br><span class="line"></span><br><span class="line">urlpatterns = [</span><br><span class="line">    path(<span class="string">'admin/'</span>, admin.site.urls),</span><br><span class="line">    path(<span class="string">'cms/'</span>, include(<span class="string">'cms.urls'</span>)),</span><br><span class="line">]</span><br></pre></td></tr></table></figure><h2 id="Confirmation-CRUD-pages"><a href="#Confirmation-CRUD-pages" class="headerlink" title="Confirmation CRUD pages"></a>Confirmation CRUD pages</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">http://$(docker-machine ip):8000/cms/book/</span><br><span class="line">http://$(docker-machine ip):8000/cms/book/add/</span><br><span class="line">http://$(docker-machine ip):8000/cms/book/mod/1/</span><br><span class="line">http://$(docker-machine ip):8000/cms/book/del/2/</span><br></pre></td></tr></table></figure><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="https://qiita.com/kaki_k/items/511611cadac1d0c69c54" target="_blank" rel="noopener">https://qiita.com/kaki_k/items/511611cadac1d0c69c54</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.djangoproject.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Django&lt;/a&gt;&lt;/strong&gt; is the most famous web framework for 
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Basic tutorial for BigQuery with Python</title>
    <link href="https://blog.morizyun.com/blog/library-bigquery-google-cloud-python/"/>
    <id>https://blog.morizyun.com/blog/library-bigquery-google-cloud-python/</id>
    <published>2018-07-04T04:00:00.000Z</published>
    <updated>2018-07-07T10:53:29.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong><a href="https://cloud.google.com/bigquery/" target="_blank" rel="noopener">BigQuery</a></strong> is a fully-managed enterprise data warehouse for analystics.<br>It is cheap and high-scalable. In this article, I would like to share basic tutorial for BigQuery with Python.</p><h2 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pip install google-cloud-bigquery</span><br></pre></td></tr></table></figure><h2 id="Create-credentials"><a href="#Create-credentials" class="headerlink" title="Create credentials"></a>Create credentials</h2><p>please see <a href="https://cloud.google.com/bigquery/docs/reference/libraries" target="_blank" rel="noopener">https://cloud.google.com/bigquery/docs/reference/libraries</a> .</p><p>Additionally, please set the PATH to environment variables.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">export</span> GOOGLE_APPLICATION_CREDENTIALS=<span class="string">"/home/user/Downloads/[FILE_NAME].json"</span></span><br></pre></td></tr></table></figure><h2 id="Create-a-dataset-if-not-existing"><a href="#Create-a-dataset-if-not-existing" class="headerlink" title="Create a dataset if not existing"></a>Create a dataset if not existing</h2><p>Create a dataset if there is not the dataset:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> google.cloud <span class="keyword">import</span> bigquery</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">bq_create_dataset</span><span class="params">()</span>:</span></span><br><span class="line">    bigquery_client = bigquery.Client()</span><br><span class="line">    dataset_ref = bigquery_client.dataset(<span class="string">'my_datasset_id'</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        bigquery_client.get_dataset(dataset_ref)</span><br><span class="line">    <span class="keyword">except</span> NotFound:</span><br><span class="line">        dataset = bigquery.Dataset(dataset_ref)</span><br><span class="line">        dataset = bigquery_client.create_dataset(dataset)</span><br><span class="line">        print(<span class="string">'Dataset &#123;&#125; created.'</span>.format(dataset.dataset_id))</span><br></pre></td></tr></table></figure><h2 id="Create-a-table-if-not-existing"><a href="#Create-a-table-if-not-existing" class="headerlink" title="Create a table if not existing"></a>Create a table if not existing</h2><p>Create a table if there is not the table:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> google.cloud <span class="keyword">import</span> bigquery</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">bq_create_table</span><span class="params">()</span>:</span></span><br><span class="line">    bigquery_client = bigquery.Client()</span><br><span class="line">    dataset_ref = bigquery_client.dataset(<span class="string">'my_datasset_id'</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Prepares a reference to the table</span></span><br><span class="line">    table_ref = dataset_ref.table(<span class="string">'my_table_name'</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        bigquery_client.get_table(table_ref)</span><br><span class="line">    <span class="keyword">except</span> NotFound:</span><br><span class="line">        schema = [</span><br><span class="line">            bigquery.SchemaField(<span class="string">'name'</span>, <span class="string">'STRING'</span>, mode=<span class="string">'REQUIRED'</span>),</span><br><span class="line">            bigquery.SchemaField(<span class="string">'age'</span>, <span class="string">'INTEGER'</span>, mode=<span class="string">'REQUIRED'</span>),</span><br><span class="line">        ]</span><br><span class="line">        table = bigquery.Table(table_ref, schema=schema)</span><br><span class="line">        table = bigquery_client.create_table(table)</span><br><span class="line">        print(<span class="string">'table &#123;&#125; created.'</span>.format(table.table_id))</span><br></pre></td></tr></table></figure><h2 id="Schema-info"><a href="#Schema-info" class="headerlink" title="Schema info"></a>Schema info</h2><p>You can add description or required option to schema information.</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">BQ_TABLE_SCHEMA = [</span><br><span class="line">    bigquery.SchemaField(<span class="string">'age'</span>, <span class="string">'INTEGER'</span>, mode=<span class="string">'REQUIRED'</span>, description=<span class="string">'Age'</span>),</span><br><span class="line">    bigquery.SchemaField(<span class="string">'name'</span>, <span class="string">'STRING'</span>, description=<span class="string">'Name'</span>),</span><br><span class="line">    bigquery.SchemaField(<span class="string">'created_at'</span>, <span class="string">'TIMESTAMP'</span>, mode=<span class="string">'REQUIRED'</span>, description=<span class="string">'Date and time when the record was created'</span>)</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>If you want to know more detail for <code>SchemaField</code> method, please see <strong><a href="https://google-cloud-python.readthedocs.io/en/latest/bigquery/generated/google.cloud.bigquery.schema.SchemaField.html" target="_blank" rel="noopener">bigquery.schema.SchemaField</a></strong></p><h2 id="Insert-rows"><a href="#Insert-rows" class="headerlink" title="Insert rows"></a>Insert rows</h2><p>Upload tuple object to BigQuery. It use stream buffer, so I don’t recommend it.</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> google.cloud <span class="keyword">import</span> bigquery</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">export_items_to_bigquery</span><span class="params">()</span>:</span></span><br><span class="line">    <span class="comment"># Instantiates a client</span></span><br><span class="line">    bigquery_client = bigquery.Client()</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Prepares a reference to the dataset</span></span><br><span class="line">    dataset_ref = bigquery_client.dataset(<span class="string">'my_datasset_id'</span>)</span><br><span class="line"></span><br><span class="line">    table_ref = dataset_ref.table(<span class="string">'my_table_id'</span>)</span><br><span class="line">    table = bigquery_client.get_table(table_ref)  <span class="comment"># API call</span></span><br><span class="line"></span><br><span class="line">    rows_to_insert = [</span><br><span class="line">        (<span class="string">u'Phred Phlyntstone'</span>, <span class="number">32</span>),</span><br><span class="line">        (<span class="string">u'Wylma Phlyntstone'</span>, <span class="number">29</span>),</span><br><span class="line">    ]</span><br><span class="line">    errors = bigquery_client.insert_rows(table, rows_to_insert)  <span class="comment"># API request</span></span><br><span class="line">    <span class="keyword">assert</span> errors == []</span><br></pre></td></tr></table></figure><h2 id="Check-data-exist"><a href="#Check-data-exist" class="headerlink" title="Check data exist"></a>Check data exist</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> google.cloud <span class="keyword">import</span> bigquery</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">exist_record</span><span class="params">()</span></span></span><br><span class="line">    bigquery_client = bigquery.Client()</span><br><span class="line"></span><br><span class="line">    query = (<span class="string">'SELECT id FROM `&#123;&#125;.&#123;&#125;.&#123;&#125;` WHERE id="&#123;&#125;" LIMIT 1'</span></span><br><span class="line">            .format(<span class="string">'my_project_id'</span>, <span class="string">'my_datasset_id'</span>, <span class="string">'my_table_id'</span>, <span class="string">'my_selected_id'</span>))</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        query_job = bigquery_client.query(query)</span><br><span class="line">        is_exist = len(list(query_job.result())) &gt;= <span class="number">1</span></span><br><span class="line">        print(<span class="string">'Exist id: &#123;&#125;'</span>.format(<span class="string">'my_selected_id'</span>) <span class="keyword">if</span> is_exist <span class="keyword">else</span> <span class="string">'Not exist id: &#123;&#125;'</span>.format(<span class="string">'my_selected_id'</span>))</span><br><span class="line">        <span class="keyword">return</span> is_exist</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        print(<span class="string">"Error"</span>)</span><br><span class="line">        print(e)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h2 id="Upload-a-csv-to-google-cloud-storage-and-load-the-csv"><a href="#Upload-a-csv-to-google-cloud-storage-and-load-the-csv" class="headerlink" title="Upload a csv to google cloud storage and load the csv"></a>Upload a csv to google cloud storage and load the csv</h2><p>This is a sample which is uploading a CSV file to google cloud storage and load the CSV file to BigQuery.</p><p>Before coding, please execute as follows:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pip install google-cloud-storage</span><br></pre></td></tr></table></figure><p>After installing <code>google-cloud-storage</code>, add following functions:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> google.cloud <span class="keyword">import</span> bigquery</span><br><span class="line"><span class="keyword">from</span> google.cloud <span class="keyword">import</span> storage</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">gcs_upload_blob</span><span class="params">()</span>:</span></span><br><span class="line">    <span class="string">"""Uploads a file to the bucket."""</span></span><br><span class="line">    storage_client = storage.Client()</span><br><span class="line">    bucket = storage_client.get_bucket(<span class="string">'my_bucket_name'</span>)</span><br><span class="line">    blob = bucket.blob(<span class="string">'gs://path/to/file.name'</span>)</span><br><span class="line"></span><br><span class="line">    blob.upload_from_filename(<span class="string">'/path/to/source.file'</span>)</span><br><span class="line"></span><br><span class="line">    print(<span class="string">'File &#123;&#125; uploaded to &#123;&#125;.'</span>.format(</span><br><span class="line">        <span class="string">'/path/to/source.csv'</span>,</span><br><span class="line">        <span class="string">'gs://path/to/upload.csv'</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">bq_load_csv_in_gcs</span><span class="params">()</span>:</span></span><br><span class="line">    bigquery_client = bigquery.Client()</span><br><span class="line">    dataset_ref = bigquery_client.dataset()</span><br><span class="line"></span><br><span class="line">    job_config = bigquery.LoadJobConfig()</span><br><span class="line">    schema = [</span><br><span class="line">        bigquery.SchemaField(<span class="string">'name'</span>, <span class="string">'STRING'</span>, mode=<span class="string">'REQUIRED'</span>),</span><br><span class="line">        bigquery.SchemaField(<span class="string">'age'</span>, <span class="string">'INTEGER'</span>, mode=<span class="string">'REQUIRED'</span>),</span><br><span class="line">    ]</span><br><span class="line">    job_config.schema = schema</span><br><span class="line">    job_config.skip_leading_rows = <span class="number">1</span></span><br><span class="line"></span><br><span class="line">    load_job = bigquery_client.load_table_from_uri(</span><br><span class="line">        <span class="string">'gs://path/to/upload.csv'</span>,</span><br><span class="line">        dataset_ref.table(<span class="string">'my_table_id'</span>),</span><br><span class="line">        job_config=job_config)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">assert</span> load_job.job_type == <span class="string">'load'</span></span><br><span class="line"></span><br><span class="line">    load_job.result()  <span class="comment"># Waits for table load to complete.</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">assert</span> load_job.state == <span class="string">'DONE'</span></span><br></pre></td></tr></table></figure><h2 id="Appendix"><a href="#Appendix" class="headerlink" title="Appendix"></a>Appendix</h2><h3 id="Web-Console-Enable-to-standardSQL"><a href="#Web-Console-Enable-to-standardSQL" class="headerlink" title="Web Console / Enable to standardSQL"></a>Web Console / Enable to standardSQL</h3><p>If you want to delete some records in BigQuery, please add <code>#standardSQL</code>, like this:</p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">#standardSQL</span></span><br><span class="line"><span class="keyword">DELETE</span> articles <span class="keyword">WHERE</span> title = <span class="string">'sample'</span></span><br></pre></td></tr></table></figure><p><strong><a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql#bigquery-enable-sql-web" target="_blank" rel="noopener">More Detail: Setting a query prefix</a></strong></p><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="https://github.com/GoogleCloudPlatform/python-docs-samples/blob/19f7f65c7badc37e23ad9f0663da8bd78823a1d7/bigquery/cloud-client/quickstart.py" target="_blank" rel="noopener">https://github.com/GoogleCloudPlatform/python-docs-samples/blob/19f7f65c7badc37e23ad9f0663da8bd78823a1d7/bigquery/cloud-client/quickstart.py</a></li><li><a href="https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv?hl=ja#bigquery-load-table-gcs-csv-create-python" target="_blank" rel="noopener">https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv?hl=ja#bigquery-load-table-gcs-csv-create-python</a></li><li><a href="https://qiita.com/pyr_revs/items/55cec7ff435bddffc352" target="_blank" rel="noopener">https://qiita.com/pyr_revs/items/55cec7ff435bddffc352</a></li><li><a href="https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv?hl=ja#bigquery-load-table-gcs-csv-create-python" target="_blank" rel="noopener">https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-csv?hl=ja#bigquery-load-table-gcs-csv-create-python</a></li><li><a href="https://googlecloudplatform.github.io/google-cloud-python/latest/_modules/google/cloud/bigquery/schema.html" target="_blank" rel="noopener">https://googlecloudplatform.github.io/google-cloud-python/latest/_modules/google/cloud/bigquery/schema.html</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://cloud.google.com/bigquery/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BigQuery&lt;/a&gt;&lt;/strong&gt; is a fully-managed enterprise d
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Serverless framework for Node.js/Python with Docker</title>
    <link href="https://blog.morizyun.com/blog/javascript-serverless-framework-aws-lambda-python-docker/"/>
    <id>https://blog.morizyun.com/blog/javascript-serverless-framework-aws-lambda-python-docker/</id>
    <published>2018-06-28T04:00:00.000Z</published>
    <updated>2018-07-23T10:07:20.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong><a href="https://serverless.com/" target="_blank" rel="noopener">Serverless</a></strong> is toolkit for deploying and operating serverless framework due to focus your application.<br>In this article, I would like to introduce how to build basic lambda API by Node.js/Python with Docker.</p><h2 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yarn global add serverless</span><br><span class="line"></span><br><span class="line"><span class="comment"># Create project folder (e.g. serverless-sample)</span></span><br><span class="line">mkdir serverless-sample</span><br><span class="line"><span class="built_in">cd</span> serverless-sample</span><br></pre></td></tr></table></figure><h2 id="Docker-Config-for-Python"><a href="#Docker-Config-for-Python" class="headerlink" title="Docker Config for Python"></a>Docker Config for Python</h2><p>If you want to develop a function with Python, it is better to use Dockerfile, because it is easy to use pip library in lambda.</p><p>Create <code>Dockerfile</code> for development:</p><figure class="highlight dockerfile"><table><tr><td class="code"><pre><span class="line"><span class="keyword">FROM</span> python:<span class="number">3.6</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># update apt-get</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update -y &amp;&amp; apt-get upgrade -y</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Install Nodejs 8</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> curl -sL https://deb.nodesource.com/setup_8.x | bash -</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get install -y nodejs</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># install dev tool</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get install -y vim</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># install aws-cli</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> pip install awscli</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># install serverless framework</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> npm install -g serverless</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># change work directory</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> mkdir -p /app</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /app</span></span><br></pre></td></tr></table></figure><p>Also, create <code>docker-compose.yml</code>:</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">'3.5'</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line"><span class="attr">  serverless:</span></span><br><span class="line"><span class="attr">    build:</span> <span class="string">.</span></span><br><span class="line"><span class="attr">    tty:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">    stdin_open:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">    image:</span> <span class="string">serverless</span></span><br><span class="line"><span class="attr">    working_dir:</span> <span class="string">/app</span></span><br><span class="line"><span class="attr">    volumes:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">.:/app</span></span><br><span class="line"><span class="attr">    container_name:</span> <span class="string">serverless</span></span><br><span class="line"><span class="attr">    env_file:</span></span><br><span class="line"><span class="bullet">      -</span> <span class="string">.env.docker</span></span><br><span class="line"><span class="attr">    logging:</span></span><br><span class="line"><span class="attr">      driver:</span> <span class="string">"json-file"</span></span><br><span class="line"><span class="attr">      options:</span></span><br><span class="line"><span class="attr">        max-size:</span> <span class="string">"10m"</span></span><br><span class="line"><span class="attr">        max-file:</span> <span class="string">"3"</span></span><br></pre></td></tr></table></figure><p>After then, create <code>.env.docker</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">aws_access_key_id=YOUR_ACCESS_KEY_ID</span><br><span class="line">aws_secret_access_key=YOUR_SECRET_ACCESS_KEY</span><br></pre></td></tr></table></figure><p>Please add your AWS Access information and do not commit the <code>.env.docker</code> file in git repository.</p><h2 id="Start-the-image-for-dev"><a href="#Start-the-image-for-dev" class="headerlink" title="Start the image for dev"></a>Start the image for dev</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">docker-compose up -d</span><br><span class="line">docker-compose <span class="built_in">exec</span> serverless /bin/bash</span><br></pre></td></tr></table></figure><h2 id="Set-AWS-Access-key"><a href="#Set-AWS-Access-key" class="headerlink" title="Set AWS Access key"></a>Set AWS Access key</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sls config credentials --provider aws --key <span class="variable">$AWS_ACCESS_KEY_ID</span> --secret <span class="variable">$AWS_SECRET_ACCESS_KEY</span></span><br></pre></td></tr></table></figure><h2 id="Create-lambda-function-with-Pytnon3-template"><a href="#Create-lambda-function-with-Pytnon3-template" class="headerlink" title="Create lambda function with Pytnon3 template"></a>Create lambda function with Pytnon3 template</h2><p>Create new service:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Create service with Python 3.x</span></span><br><span class="line">sls create -t aws-python3 -p py3test</span><br></pre></td></tr></table></figure><p>Modify <code>serverless.yml</code> configuration file:<br>(<code>diff --no-index --unified=1 serverless.org.yml serverless.yml</code>):</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">@@ -25,3 +25,3 @@ provider:</span><br><span class="line"> <span class="comment">#  stage: dev</span></span><br><span class="line">-<span class="comment">#  region: us-east-1</span></span><br><span class="line">+  region: ap-northeast-1</span><br><span class="line"></span><br><span class="line">@@ -63,6 +63,6 @@ <span class="built_in">functions</span>:</span><br><span class="line"> <span class="comment">#    Check the event documentation for details</span></span><br><span class="line">-<span class="comment">#    events:</span></span><br><span class="line">-<span class="comment">#      - http:</span></span><br><span class="line">-<span class="comment">#          path: users/create</span></span><br><span class="line">-<span class="comment">#          method: get</span></span><br><span class="line">+    events:</span><br><span class="line">+      - http:</span><br><span class="line">+          path: users/create</span><br><span class="line">+          method: get</span><br><span class="line"> <span class="comment">#      - s3: $&#123;env:BUCKET&#125;</span></span><br></pre></td></tr></table></figure><h2 id="Confirm-developing-function"><a href="#Confirm-developing-function" class="headerlink" title="Confirm developing function"></a>Confirm developing function</h2><p>Enable to confirm your devloping function on local</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Call the function</span></span><br><span class="line">sls invoke <span class="built_in">local</span> -f hello</span><br></pre></td></tr></table></figure><h2 id="Deploy-code-to-AWS"><a href="#Deploy-code-to-AWS" class="headerlink" title="Deploy code to AWS"></a>Deploy code to AWS</h2><p>After development, you can deploy your code by one command:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sls deploy -v</span><br></pre></td></tr></table></figure><h2 id="Confirm-the-deployed-function"><a href="#Confirm-the-deployed-function" class="headerlink" title="Confirm the deployed function"></a>Confirm the deployed function</h2><p>Enable to confirm your devloping function on local or you can call your API by <code>curl</code>:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Call the function</span></span><br><span class="line">sls invoke -f hello</span><br><span class="line"></span><br><span class="line"><span class="comment"># Call the function's API by curl</span></span><br><span class="line">curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/users/create</span><br></pre></td></tr></table></figure><h2 id="Add-pip-libraries-for-lambda"><a href="#Add-pip-libraries-for-lambda" class="headerlink" title="Add pip libraries for lambda"></a>Add pip libraries for lambda</h2><p>If you want to use library, please install pip libraries as follows:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># In docker</span></span><br><span class="line">pip install requests -t /app/lib/requests</span><br></pre></td></tr></table></figure><h2 id="Remove-deployed-function"><a href="#Remove-deployed-function" class="headerlink" title="Remove deployed function"></a>Remove deployed function</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sls remove</span><br></pre></td></tr></table></figure><h2 id="Configuration-serverless-yml"><a href="#Configuration-serverless-yml" class="headerlink" title="Configuration (serverless.yml)"></a>Configuration (serverless.yml)</h2><h3 id="Memory-Size-Timeout-etc-in-AWS-lambda"><a href="#Memory-Size-Timeout-etc-in-AWS-lambda" class="headerlink" title="Memory Size, Timeout, etc in AWS lambda"></a>Memory Size, Timeout, etc in AWS lambda</h3><p>You can configure memory size and timeout for function in AWS lambda:</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># https://serverless.com/framework/docs/providers/aws/guide/functions/</span></span><br><span class="line"><span class="attr">provider:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">aws</span></span><br><span class="line"><span class="attr">  runtime:</span> <span class="string">python3.6</span></span><br><span class="line"><span class="attr">  memorySize:</span> <span class="number">128</span> <span class="comment"># optional, in MB, default is 1024</span></span><br><span class="line"><span class="attr">  timeout:</span> <span class="number">10</span> <span class="comment"># optional, in seconds, default is 6</span></span><br></pre></td></tr></table></figure><p>If you want to know more detail, please see <a href="https://serverless.com/framework/docs/providers/aws/guide/functions/" target="_blank" rel="noopener">https://serverless.com/framework/docs/providers/aws/guide/functions/</a> .</p><h3 id="Including-excluding-file-or-folder"><a href="#Including-excluding-file-or-folder" class="headerlink" title="Including/excluding file or folder"></a>Including/excluding file or folder</h3><p>Please configure including/excluding a file or a folder.</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># you can add packaging information here</span></span><br><span class="line"><span class="comment"># https://serverless.com/framework/docs/providers/aws/guide/packaging/</span></span><br><span class="line"><span class="attr">package:</span></span><br><span class="line"><span class="attr">  exclude:</span> <span class="comment"># excluding file or folder</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">src/**</span></span><br><span class="line"><span class="attr">  include:</span> <span class="comment"># including file or folder</span></span><br><span class="line"><span class="bullet">    -</span> <span class="string">src/function/handler.js</span></span><br></pre></td></tr></table></figure><p>If you want to know more detail, please see <a href="https://serverless.com/framework/docs/providers/aws/guide/packaging/" target="_blank" rel="noopener">https://serverless.com/framework/docs/providers/aws/guide/packaging/</a></p><h3 id="Cron-Scheduled-job-configuration"><a href="#Cron-Scheduled-job-configuration" class="headerlink" title="Cron(Scheduled job) configuration"></a>Cron(Scheduled job) configuration</h3><p>Enable to configure cron/scheduled job.</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Cron (scheduled job) information</span></span><br><span class="line"><span class="attr">functions:</span></span><br><span class="line"><span class="attr">  crawl:</span></span><br><span class="line"><span class="attr">    handler:</span> <span class="string">crawl</span></span><br><span class="line"><span class="attr">    events:</span></span><br><span class="line"><span class="attr">      - schedule:</span> <span class="string">rate(2</span> <span class="string">hours)</span></span><br><span class="line"><span class="attr">      - schedule:</span> <span class="string">cron(0</span> <span class="number">12</span> <span class="string">*</span> <span class="string">*</span> <span class="string">?</span> <span class="string">*)</span></span><br></pre></td></tr></table></figure><p>If you want to know more detail, please see <a href="https://serverless.com/framework/docs/providers/aws/events/schedule/" target="_blank" rel="noopener">https://serverless.com/framework/docs/providers/aws/events/schedule/</a></p><h2 id="Impression"><a href="#Impression" class="headerlink" title="Impression"></a>Impression</h2><p>My impression for serverless is as follows:</p><ul><li>A deploy command (<code>serverless deploy</code>) is simple and useful to create the required IAM, set up CloudWatch logs, set up S3 for deployment, deploy, etc.</li><li>Cron (CloudWatch Events) needs just a line to YAML, there are a lot of useful configurations.</li><li>I thought that it was easy for using Google Cloud Function to manage credential on GCP, I tried a little, but it was buggy. I think that serverless is useful in only AWS lambda.<ul><li>There are some problems in GCF and serverless. Also, GCF is beta yet.</li></ul></li><li>I found <a href="https://github.com/serverless/serverless-graphql" target="_blank" rel="noopener">https://github.com/serverless/serverless-graphql</a> . If it becomes better, it is a good option for GraphQL server.</li></ul><h2 id="Appendix-Google-Cloud-function-with-Node-js"><a href="#Appendix-Google-Cloud-function-with-Node-js" class="headerlink" title="[Appendix] Google Cloud function with Node.js"></a>[Appendix] Google Cloud function with Node.js</h2><h3 id="Supported-Node-js-version"><a href="#Supported-Node-js-version" class="headerlink" title="Supported Node.js version"></a>Supported Node.js version</h3><p>Node version is 6.14.0, so please be careful: <a href="https://cloud.google.com/functions/docs/writing/" target="_blank" rel="noopener">https://cloud.google.com/functions/docs/writing/</a> .</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">'6.14.0'</span> &gt; .nvmrc</span><br></pre></td></tr></table></figure><h3 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h3><p>Create a project:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">serverless create --template google-nodejs --path gcf-nodejs</span><br></pre></td></tr></table></figure><p>Install npm libraries:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">cd</span> gcf-nodejs</span><br><span class="line">npm install</span><br></pre></td></tr></table></figure><h3 id="Create-your-credential"><a href="#Create-your-credential" class="headerlink" title="Create your credential"></a>Create your credential</h3><p><a href="https://serverless.com/framework/docs/providers/google/guide/credentials" target="_blank" rel="noopener">https://serverless.com/framework/docs/providers/google/guide/credentials</a></p><h3 id="Deploy-your-code"><a href="#Deploy-your-code" class="headerlink" title="Deploy your code"></a>Deploy your code</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">serverless deploy</span><br></pre></td></tr></table></figure><h3 id="Confirmation"><a href="#Confirmation" class="headerlink" title="Confirmation"></a>Confirmation</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Confirm your code by function</span></span><br><span class="line">serverless invoke --<span class="keyword">function</span> first</span><br><span class="line"></span><br><span class="line"><span class="comment"># Confirm your code by API</span></span><br><span class="line">curl https://us-central1-price-rank-production.cloudfunctions.net/http</span><br></pre></td></tr></table></figure><h3 id="More-detail"><a href="#More-detail" class="headerlink" title="More detail"></a>More detail</h3><p>If you want to know more detail, please see <a href="https://serverless.com/framework/docs/providers/google/guide/quick-start/" target="_blank" rel="noopener">https://serverless.com/framework/docs/providers/google/guide/quick-start/</a> .</p><h3 id="Concerns"><a href="#Concerns" class="headerlink" title="Concerns"></a>Concerns</h3><ul><li>SLA is not guaranteed because it is in beta test.</li><li>It is impossible to configure environment variable like AWS.</li><li>There is no mechanism like cron, scheduled job.</li><li>It is thought that the test with GCP is not done much.</li></ul><h2 id="Appendix"><a href="#Appendix" class="headerlink" title="Appendix"></a>Appendix</h2><h3 id="Manage-permission-for-your-Lambda-function"><a href="#Manage-permission-for-your-Lambda-function" class="headerlink" title="Manage permission for your Lambda function"></a>Manage permission for your Lambda function</h3><p>If your function read/edit data in <strong>DynamoDB table</strong>, you can add these additional permission statements directly in your <code>serverless.yml</code>:</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">provider:</span></span><br><span class="line"><span class="attr">  name:</span> <span class="string">aws</span></span><br><span class="line"><span class="attr">  runtime:</span> <span class="string">nodejs6.10</span></span><br><span class="line"><span class="attr">  iamRoleStatements:</span></span><br><span class="line"><span class="attr">    - Effect:</span> <span class="string">"Allow"</span></span><br><span class="line"><span class="attr">      Action:</span></span><br><span class="line"><span class="attr">       - dynamodb:</span><span class="string">Query</span></span><br><span class="line"><span class="attr">       - dynamodb:</span><span class="string">Scan</span></span><br><span class="line"><span class="attr">       - dynamodb:</span><span class="string">GetItem</span></span><br><span class="line"><span class="attr">       - dynamodb:</span><span class="string">PutItem</span></span><br><span class="line"><span class="attr">       - dynamodb:</span><span class="string">UpdateItem</span></span><br><span class="line"><span class="attr">       - dynamodb:</span><span class="string">DeleteItem</span></span><br><span class="line"><span class="attr">      Resource:</span> <span class="string">"arn:aws:dynamodb:us-west-2:111110002222:table/my-new-table"</span></span><br></pre></td></tr></table></figure><p>If you want to know more details, please see <a href="https://serverless.com/blog/abcs-of-iam-permissions/" target="_blank" rel="noopener">https://serverless.com/blog/abcs-of-iam-permissions/</a> .</p><h3 id="Python-Load-and-delete-a-credential"><a href="#Python-Load-and-delete-a-credential" class="headerlink" title="Python / Load and delete a credential"></a>Python / Load and delete a credential</h3><p>Load and delete a credential data from environment variable in AWS lambda:</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">load_credential</span><span class="params">()</span>:</span></span><br><span class="line">    credential_data = os.environ[<span class="string">'CREDENTIAL_DATA'</span>]</span><br><span class="line">    <span class="keyword">if</span> len(credential_data) &lt;= <span class="number">1</span>:</span><br><span class="line">        <span class="keyword">raise</span> RuntimeError(<span class="string">'No CREDENTIAL_DATA'</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># In AWS lambda, you can write only /tmp folder</span></span><br><span class="line">    credential_file = os.environ[<span class="string">'APPLICATION_CREDENTIALS'</span>]</span><br><span class="line">    <span class="keyword">with</span> open(credential_file, <span class="string">'w'</span>, encoding=<span class="string">'utf8'</span>) <span class="keyword">as</span> f:</span><br><span class="line">        print(<span class="string">'Credential file &#123;&#125; created.'</span>.format(credential_file))</span><br><span class="line">        f.write(credential_data)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">delete_credential</span><span class="params">()</span>:</span></span><br><span class="line">    credential_file = os.environ[<span class="string">'APPLICATION_CREDENTIALS'</span>]</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        os.remove(credential_file)</span><br><span class="line">    <span class="keyword">except</span> OSError:</span><br><span class="line">        <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="https://dev.classmethod.jp/cloud/aws/serverless-framework-with-python-3-6/" target="_blank" rel="noopener">https://dev.classmethod.jp/cloud/aws/serverless-framework-with-python-3-6/</a></li><li><a href="https://qiita.com/bremen/items/7e9407349d74a6a62822" target="_blank" rel="noopener">https://qiita.com/bremen/items/7e9407349d74a6a62822</a></li><li><a href="https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html" target="_blank" rel="noopener">https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://serverless.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Serverless&lt;/a&gt;&lt;/strong&gt; is toolkit for deploying and operating s
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>create-react-app with Redux &amp; TypeScript &amp; Firebase Authentication [JavaScript]</title>
    <link href="https://blog.morizyun.com/blog/typescript-tutorial-react-app-redux-firebase-authentication/"/>
    <id>https://blog.morizyun.com/blog/typescript-tutorial-react-app-redux-firebase-authentication/</id>
    <published>2018-06-27T04:00:00.000Z</published>
    <updated>2018-07-19T08:13:39.000Z</updated>
    
    <content type="html"><![CDATA[<p>Let’s implement a whole authentication mechanism in React &amp; Redux with sign up, sign in, password reset, change password and sign out in TypeScript.</p><h2 id="GitHub-Repository"><a href="#GitHub-Repository" class="headerlink" title="GitHub Repository"></a>GitHub Repository</h2><p>Whole files of this tutorial are as follows:</p><p><a href="https://github.com/morizyun/react-redux-typescript-firebase-auth" target="_blank" rel="noopener">https://github.com/morizyun/react-redux-typescript-firebase-auth</a></p><h2 id="Get-Firebase-App-info"><a href="#Get-Firebase-App-info" class="headerlink" title="Get Firebase App info"></a>Get Firebase App info</h2><ul><li>Go to <a href="https://console.firebase.google.com/" target="_blank" rel="noopener">https://console.firebase.google.com/</a></li><li>Create new project</li><li>Create new Auth app</li><li>See web setup</li></ul><p><img src="/img/2018-06-26-firebase-web-setup.png" alt></p><p>It will be needs for using Firebase authentication.</p><h2 id="create-react-app-with-Redux-and-TypeScript"><a href="#create-react-app-with-Redux-and-TypeScript" class="headerlink" title="create-react-app with Redux and TypeScript"></a>create-react-app with Redux and TypeScript</h2><p>You can install <strong><a href="https://github.com/facebook/create-react-app" target="_blank" rel="noopener">create-react-app</a></strong> on command line:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># If you have not install it yet, please do:</span></span><br><span class="line">yarn global add create-react-app <span class="comment"># npm install -g create-react-app</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Create new project</span></span><br><span class="line">create-react-app react-ts-firebase-auth --scripts-version=react-scripts-ts</span><br><span class="line"><span class="built_in">cd</span> react-ts-firebase-auth</span><br><span class="line"></span><br><span class="line"><span class="comment"># Install Firebase and react-router-dom (React Router)</span></span><br><span class="line">yarn add firebase react-router-dom redux react-redux recompose</span><br><span class="line"></span><br><span class="line">yarn add --dev @types/react-router @types/react-router-dom @types/react-redux @types/recompose</span><br></pre></td></tr></table></figure><p>After then, you can run app process by <code>yarn start</code> on terminal and open <code>http://localhost:3000</code>.</p><p>Also, please create some directories:</p><h2 id="Configuration"><a href="#Configuration" class="headerlink" title="Configuration"></a>Configuration</h2><p>Please change <code>tslint.json</code> to add as follows:</p><figure class="highlight"><table><tr><td class="code"><pre><span class="line">&#123;</span><br><span class="line">+  "rules": &#123;</span><br><span class="line">+    "jsx-no-lambda": false</span><br><span class="line">+  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Rebuild-folders"><a href="#Rebuild-folders" class="headerlink" title="Rebuild folders"></a>Rebuild folders</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Create folders</span></span><br><span class="line">mkdir src/components</span><br><span class="line">mkdir src/components/Account</span><br><span class="line">mkdir src/components/App</span><br><span class="line">mkdir src/components/Home</span><br><span class="line">mkdir src/components/Landing</span><br><span class="line">mkdir src/components/Navigation</span><br><span class="line">mkdir src/components/PasswordChange</span><br><span class="line">mkdir src/components/PasswordForget</span><br><span class="line">mkdir src/components/Session</span><br><span class="line">mkdir src/components/SignIn</span><br><span class="line">mkdir src/components/SignOut</span><br><span class="line">mkdir src/components/SignUp</span><br><span class="line">mkdir src/constants</span><br><span class="line">mkdir src/firebase</span><br><span class="line">mkdir src/reducers</span><br><span class="line">mkdir src/store</span><br><span class="line"></span><br><span class="line"><span class="comment"># Move files for App</span></span><br><span class="line">mv src/components/App.ts src/components/App/index.ts</span><br><span class="line"></span><br><span class="line"><span class="comment"># Remove unused files</span></span><br><span class="line">rm src/logo.svg</span><br><span class="line">rm src/App.test.ts</span><br><span class="line">rm src/App.css</span><br></pre></td></tr></table></figure><h2 id="index"><a href="#index" class="headerlink" title="index"></a>index</h2><p>Create <code>src/index.ts</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> ReactDOM <span class="keyword">from</span> <span class="string">"react-dom"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; Provider &#125; <span class="keyword">from</span> <span class="string">"react-redux"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; App &#125; <span class="keyword">from</span> <span class="string">"./components/App"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">"./index.css"</span>;</span><br><span class="line"><span class="keyword">import</span> registerServiceWorker <span class="keyword">from</span> <span class="string">"./registerServiceWorker"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; store &#125; <span class="keyword">from</span> <span class="string">"./store"</span>;</span><br><span class="line"></span><br><span class="line">ReactDOM.render(</span><br><span class="line">  &lt;Provider store=&#123;store&#125;&gt;</span><br><span class="line">    &lt;App /&gt;</span><br><span class="line">  &lt;<span class="regexp">/Provider&gt;,</span></span><br><span class="line"><span class="regexp">  document.getElementById("root")</span></span><br><span class="line"><span class="regexp">);</span></span><br><span class="line"><span class="regexp">registerServiceWorker();</span></span><br></pre></td></tr></table></figure><h2 id="Constants"><a href="#Constants" class="headerlink" title="Constants"></a>Constants</h2><p>Add <code>src/constants/routes.ts</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> SIGN_UP = <span class="string">"/signup"</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> SIGN_IN = <span class="string">"/signin"</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> LANDING = <span class="string">"/"</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> HOME = <span class="string">"/home"</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> ACCOUNT = <span class="string">"/account"</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> PASSWORD_FORGET = <span class="string">"/password_forget"</span>;</span><br></pre></td></tr></table></figure><h2 id="Components"><a href="#Components" class="headerlink" title="Components"></a>Components</h2><h3 id="Account"><a href="#Account" class="headerlink" title="Account"></a>Account</h3><p>Create <code>src/components/Account/index.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; connect &#125; <span class="keyword">from</span> <span class="string">"react-redux"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; compose &#125; <span class="keyword">from</span> <span class="string">"recompose"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; withRouter &#125; <span class="keyword">from</span> <span class="string">'react-router-dom'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> &#123; PasswordChangeForm &#125; <span class="keyword">from</span> <span class="string">"../PasswordChange"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; PasswordForgetForm &#125; <span class="keyword">from</span> <span class="string">"../PasswordForget/PasswordForgetForm"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; withAuthorization &#125; <span class="keyword">from</span> <span class="string">"../Session/withAuthorization"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> AccountComponent = <span class="function">(<span class="params">&#123; authUser &#125;: <span class="built_in">any</span></span>) =&gt;</span> (</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;h1&gt;Account: &#123;authUser.email&#125;&lt;<span class="regexp">/h1&gt;</span></span><br><span class="line"><span class="regexp">    &lt;PasswordForgetForm /</span>&gt;</span><br><span class="line">    &lt;PasswordChangeForm /&gt;</span><br><span class="line">  &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">);</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">const mapStateToProps = (state: any) =&gt; (&#123;</span></span><br><span class="line"><span class="regexp">  authUser: state.sessionState.authUser</span></span><br><span class="line"><span class="regexp">&#125;);</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">const authCondition = (authUser: any) =&gt; !!authUser;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">export const Account = compose(</span></span><br><span class="line"><span class="regexp">  withAuthorization(authCondition),</span></span><br><span class="line"><span class="regexp">  withRouter,</span></span><br><span class="line"><span class="regexp">  connect(mapStateToProps)</span></span><br><span class="line"><span class="regexp">)(AccountComponent);</span></span><br></pre></td></tr></table></figure><h3 id="App"><a href="#App" class="headerlink" title="App"></a>App</h3><p>Create <code>src/components/App/index.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; BrowserRouter, Route, Switch &#125; <span class="keyword">from</span> <span class="string">"react-router-dom"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> routes <span class="keyword">from</span> <span class="string">"../../constants/routes"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; firebase &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; Account &#125; <span class="keyword">from</span> <span class="string">"../Account"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; Home &#125; <span class="keyword">from</span> <span class="string">"../Home"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; Landing &#125; <span class="keyword">from</span> <span class="string">"../Landing"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; Navigation &#125; <span class="keyword">from</span> <span class="string">"../Navigation"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; PasswordForget &#125; <span class="keyword">from</span> <span class="string">"../PasswordForget"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; withAuthentication &#125; <span class="keyword">from</span> <span class="string">"../Session/withAuthentication"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; SignIn &#125; <span class="keyword">from</span> <span class="string">"../SignIn"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; SignUp &#125; <span class="keyword">from</span> <span class="string">"../SignUp"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> AppComponent <span class="keyword">extends</span> React.Component &#123;</span><br><span class="line">  <span class="keyword">constructor</span>(<span class="params">props: <span class="built_in">any</span></span>) &#123;</span><br><span class="line">    <span class="keyword">super</span>(props);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">this</span>.state = &#123;</span><br><span class="line">      authUser: <span class="literal">null</span></span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> componentDidMount() &#123;</span><br><span class="line">    firebase.auth.onAuthStateChanged(<span class="function"><span class="params">authUser</span> =&gt;</span> &#123;</span><br><span class="line">      authUser</span><br><span class="line">        ? <span class="keyword">this</span>.setState(<span class="function"><span class="params">()</span> =&gt;</span> (&#123; authUser &#125;))</span><br><span class="line">        : <span class="keyword">this</span>.setState(<span class="function"><span class="params">()</span> =&gt;</span> (&#123; authUser: <span class="literal">null</span> &#125;));</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> render() &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;BrowserRouter&gt;</span><br><span class="line">        &lt;div&gt;</span><br><span class="line">          &lt;Navigation /&gt;</span><br><span class="line">          &lt;hr /&gt;</span><br><span class="line">          &lt;Switch&gt;</span><br><span class="line">            &lt;Route exact=&#123;<span class="literal">true</span>&#125; path=&#123;routes.LANDING&#125; component=&#123;Landing&#125; /&gt;</span><br><span class="line">            &lt;Route exact=&#123;<span class="literal">true</span>&#125; path=&#123;routes.SIGN_UP&#125; component=&#123;SignUp&#125; /&gt;</span><br><span class="line">            &lt;Route exact=&#123;<span class="literal">true</span>&#125; path=&#123;routes.SIGN_IN&#125; component=&#123;SignIn&#125; /&gt;</span><br><span class="line">            &lt;Route</span><br><span class="line">              exact=&#123;<span class="literal">true</span>&#125;</span><br><span class="line">              path=&#123;routes.PASSWORD_FORGET&#125;</span><br><span class="line">              component=&#123;PasswordForget&#125;</span><br><span class="line">            /&gt;</span><br><span class="line">            &lt;Route exact=&#123;<span class="literal">true</span>&#125; path=&#123;routes.HOME&#125; component=&#123;Home&#125; /&gt;</span><br><span class="line">            &lt;Route exact=&#123;<span class="literal">true</span>&#125; path=&#123;routes.ACCOUNT&#125; component=&#123;Account&#125; /&gt;</span><br><span class="line">          &lt;<span class="regexp">/Switch&gt;</span></span><br><span class="line"><span class="regexp">        &lt;/</span>div&gt;</span><br><span class="line">      &lt;<span class="regexp">/BrowserRouter&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">export const App = withAuthentication(AppComponent);</span></span><br></pre></td></tr></table></figure><h3 id="Home"><a href="#Home" class="headerlink" title="Home"></a>Home</h3><p>Create <code>src/components/Home/index.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; connect &#125; <span class="keyword">from</span> <span class="string">"react-redux"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; compose &#125; <span class="keyword">from</span> <span class="string">"recompose"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; withRouter &#125; <span class="keyword">from</span> <span class="string">'react-router-dom'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> &#123; db &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; withAuthorization &#125; <span class="keyword">from</span> <span class="string">"../Session/withAuthorization"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; UserList &#125; <span class="keyword">from</span> <span class="string">"./UserList"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> HomeComponent <span class="keyword">extends</span> React.Component &#123;</span><br><span class="line">  <span class="keyword">public</span> componentDidMount() &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; onSetUsers &#125;: <span class="built_in">any</span> = <span class="keyword">this</span>.props;</span><br><span class="line"></span><br><span class="line">    db.onceGetUsers().then(<span class="function"><span class="params">snapshot</span> =&gt;</span> onSetUsers(snapshot.val()));</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> render() &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; users &#125;: <span class="built_in">any</span> = <span class="keyword">this</span>.props;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;div&gt;</span><br><span class="line">        &lt;h1&gt;Home&lt;<span class="regexp">/h1&gt;</span></span><br><span class="line"><span class="regexp">        &lt;p&gt;The Home Page is accessible by every signed in user.&lt;/</span>p&gt;</span><br><span class="line"></span><br><span class="line">        &#123;!!users &amp;&amp; &lt;UserList users=&#123;users&#125; /&gt;&#125;</span><br><span class="line">      &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">const mapStateToProps = (state: any) =&gt; (&#123;</span></span><br><span class="line"><span class="regexp">  users: state.userState.users</span></span><br><span class="line"><span class="regexp">&#125;);</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">const mapDispatchToProps = (dispatch: any) =&gt; (&#123;</span></span><br><span class="line"><span class="regexp">  onSetUsers: (users: any) =&gt; dispatch(&#123; type: "USERS_SET", users &#125;)</span></span><br><span class="line"><span class="regexp">&#125;);</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">const authCondition = (authUser: any) =&gt; !!authUser;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">export const Home = compose(</span></span><br><span class="line"><span class="regexp">  withAuthorization(authCondition),</span></span><br><span class="line"><span class="regexp">  withRouter,</span></span><br><span class="line"><span class="regexp">  connect(</span></span><br><span class="line"><span class="regexp">    mapStateToProps,</span></span><br><span class="line"><span class="regexp">    mapDispatchToProps</span></span><br><span class="line"><span class="regexp">  )</span></span><br><span class="line"><span class="regexp">)(HomeComponent);</span></span><br></pre></td></tr></table></figure><p>Create <code>src/components/Home/UserList.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceProps &#123;</span><br><span class="line">  users?: <span class="built_in">any</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> UserList <span class="keyword">extends</span> React.Component&lt;InterfaceProps, &#123;&#125;&gt; &#123;</span><br><span class="line">  <span class="keyword">constructor</span>(<span class="params">props: <span class="built_in">any</span></span>) &#123;</span><br><span class="line">    <span class="keyword">super</span>(props);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> render() &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; users &#125;: <span class="built_in">any</span> = <span class="keyword">this</span>.props;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;div&gt;</span><br><span class="line">        &lt;h2&gt;List of Usernames of Users&lt;<span class="regexp">/h2&gt;</span></span><br><span class="line"><span class="regexp">        &lt;p&gt;(Saved on Sign Up in Firebase Database)&lt;/</span>p&gt;</span><br><span class="line"></span><br><span class="line">        &lt;ul&gt;</span><br><span class="line">          &#123;<span class="built_in">Object</span>.keys(users).map(<span class="function"><span class="params">key</span> =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> &lt;li key=&#123;key&#125;&gt;&#123;users[key].username&#125;&lt;<span class="regexp">/li&gt;;</span></span><br><span class="line"><span class="regexp">          &#125;)&#125;</span></span><br><span class="line"><span class="regexp">        &lt;/u</span>l&gt;</span><br><span class="line">      &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="Landing"><a href="#Landing" class="headerlink" title="Landing"></a>Landing</h3><p>Create <code>src/components/Landing/index.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> Landing = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    &lt;div&gt;</span><br><span class="line">      &lt;h2&gt;Landing Page&lt;<span class="regexp">/h2&gt;</span></span><br><span class="line"><span class="regexp">    &lt;/</span>div&gt;</span><br><span class="line">  );</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h3 id="Navigation"><a href="#Navigation" class="headerlink" title="Navigation"></a>Navigation</h3><p>Create <code>src/components/Navigation/index.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; connect &#125; <span class="keyword">from</span> <span class="string">"react-redux"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; Link &#125; <span class="keyword">from</span> <span class="string">"react-router-dom"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> routes <span class="keyword">from</span> <span class="string">"../../constants/routes"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; SignOutButton &#125; <span class="keyword">from</span> <span class="string">"../SignOut"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> NavigationComponent = <span class="function">(<span class="params">&#123; authUser &#125;: <span class="built_in">any</span></span>) =&gt;</span> (</span><br><span class="line">  &lt;div&gt;&#123;authUser ? &lt;NavigationAuth /&gt; : &lt;NavigationNonAuth /&gt;&#125;&lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">);</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">const NavigationAuth = () =&gt; (</span></span><br><span class="line"><span class="regexp">  &lt;ul&gt;</span></span><br><span class="line"><span class="regexp">    &lt;li&gt;</span></span><br><span class="line"><span class="regexp">      &lt;Link to=&#123;routes.LANDING&#125;&gt;Landing&lt;/</span>Link&gt;</span><br><span class="line">    &lt;<span class="regexp">/li&gt;</span></span><br><span class="line"><span class="regexp">    &lt;li&gt;</span></span><br><span class="line"><span class="regexp">      &lt;Link to=&#123;routes.HOME&#125;&gt;Home&lt;/</span>Link&gt;</span><br><span class="line">    &lt;<span class="regexp">/li&gt;</span></span><br><span class="line"><span class="regexp">    &lt;li&gt;</span></span><br><span class="line"><span class="regexp">      &lt;Link to=&#123;routes.ACCOUNT&#125;&gt;Account&lt;/</span>Link&gt;</span><br><span class="line">    &lt;<span class="regexp">/li&gt;</span></span><br><span class="line"><span class="regexp">    &lt;li&gt;</span></span><br><span class="line"><span class="regexp">      &lt;SignOutButton /</span>&gt;</span><br><span class="line">    &lt;<span class="regexp">/li&gt;</span></span><br><span class="line"><span class="regexp">  &lt;/u</span>l&gt;</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> NavigationNonAuth = <span class="function"><span class="params">()</span> =&gt;</span> (</span><br><span class="line">  &lt;ul&gt;</span><br><span class="line">    &lt;li&gt;</span><br><span class="line">      &lt;Link to=&#123;routes.LANDING&#125;&gt;Landing&lt;<span class="regexp">/Link&gt;</span></span><br><span class="line"><span class="regexp">    &lt;/</span>li&gt;</span><br><span class="line">    &lt;li&gt;</span><br><span class="line">      &lt;Link to=&#123;routes.SIGN_IN&#125;&gt;Sign In&lt;<span class="regexp">/Link&gt;</span></span><br><span class="line"><span class="regexp">    &lt;/</span>li&gt;</span><br><span class="line">  &lt;<span class="regexp">/ul&gt;</span></span><br><span class="line"><span class="regexp">);</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">const mapStateToProps = (state: any) =&gt; (&#123;</span></span><br><span class="line"><span class="regexp">  authUser: state.sessionState.authUser</span></span><br><span class="line"><span class="regexp">&#125;);</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">export const Home = compose(</span></span><br><span class="line"><span class="regexp">  withRouter,</span></span><br><span class="line"><span class="regexp">  connect(mapStateToProps)</span></span><br><span class="line"><span class="regexp">)(NavigationComponent);</span></span><br></pre></td></tr></table></figure><h3 id="PasswordChange"><a href="#PasswordChange" class="headerlink" title="PasswordChange"></a>PasswordChange</h3><p>Create <code>src/components/PasswordChange/index.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; auth &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceProps &#123;</span><br><span class="line">  error?: <span class="built_in">any</span>;</span><br><span class="line">  history?: <span class="built_in">any</span>;</span><br><span class="line">  passwordOne?: <span class="built_in">string</span>;</span><br><span class="line">  passwordTwo?: <span class="built_in">string</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceState &#123;</span><br><span class="line">  error?: <span class="built_in">any</span>;</span><br><span class="line">  passwordOne?: <span class="built_in">string</span>;</span><br><span class="line">  passwordTwo?: <span class="built_in">string</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> PasswordChangeForm <span class="keyword">extends</span> React.Component&lt;</span><br><span class="line">  InterfaceProps,</span><br><span class="line">  InterfaceState</span><br><span class="line">&gt; &#123;</span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> INITIAL_STATE = &#123;</span><br><span class="line">    error: <span class="literal">null</span>,</span><br><span class="line">    passwordOne: <span class="string">""</span>,</span><br><span class="line">    passwordTwo: <span class="string">""</span></span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> propKey(propertyName: <span class="built_in">string</span>, value: <span class="built_in">string</span>): object &#123;</span><br><span class="line">    <span class="keyword">return</span> &#123; [propertyName]: value &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">constructor</span>(<span class="params">props: <span class="built_in">any</span></span>) &#123;</span><br><span class="line">    <span class="keyword">super</span>(props);</span><br><span class="line">    <span class="keyword">this</span>.state = &#123; ...PasswordChangeForm.INITIAL_STATE &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> onSubmit = <span class="function">(<span class="params">event: <span class="built_in">any</span></span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; passwordOne &#125;: <span class="built_in">any</span> = <span class="keyword">this</span>.state;</span><br><span class="line"></span><br><span class="line">    auth</span><br><span class="line">      .doPasswordUpdate(passwordOne)</span><br><span class="line">      .then(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">this</span>.setState(<span class="function"><span class="params">()</span> =&gt;</span> (&#123; ...PasswordChangeForm.INITIAL_STATE &#125;));</span><br><span class="line">      &#125;)</span><br><span class="line">      .catch(<span class="function"><span class="params">error</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">this</span>.setState(PasswordChangeForm.propKey(<span class="string">"error"</span>, error));</span><br><span class="line">      &#125;);</span><br><span class="line"></span><br><span class="line">    event.preventDefault();</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> render() &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; passwordOne, passwordTwo, error &#125;: <span class="built_in">any</span> = <span class="keyword">this</span>.state;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> isInvalid = passwordOne !== passwordTwo || passwordOne === <span class="string">""</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;form onSubmit=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.onSubmit(event)&#125;&gt;</span><br><span class="line">        &lt;input</span><br><span class="line">          value=&#123;passwordOne&#125;</span><br><span class="line">          onChange=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.setStateWithEvent(event, <span class="string">"passwordOne"</span>)&#125;</span><br><span class="line">          <span class="keyword">type</span>=<span class="string">"password"</span></span><br><span class="line">          placeholder=<span class="string">"New Password"</span></span><br><span class="line">        /&gt;</span><br><span class="line">        &lt;input</span><br><span class="line">          value=&#123;passwordTwo&#125;</span><br><span class="line">          onChange=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.setStateWithEvent(event, <span class="string">"passwordTwo"</span>)&#125;</span><br><span class="line">          <span class="keyword">type</span>=<span class="string">"password"</span></span><br><span class="line">          placeholder=<span class="string">"Confirm New Password"</span></span><br><span class="line">        /&gt;</span><br><span class="line">        &lt;button disabled=&#123;isInvalid&#125; <span class="keyword">type</span>=<span class="string">"submit"</span>&gt;</span><br><span class="line">          Reset My Password</span><br><span class="line">        &lt;<span class="regexp">/button&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &#123;error &amp;&amp; &lt;p&gt;&#123;error.message&#125;&lt;/</span>p&gt;&#125;</span><br><span class="line">      &lt;<span class="regexp">/form&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">  private setStateWithEvent(event: any, columnType: string): void &#123;</span></span><br><span class="line"><span class="regexp">    this.setState(</span></span><br><span class="line"><span class="regexp">      PasswordChangeForm.propKey(columnType, (event.target as any).value)</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="PasswordForget"><a href="#PasswordForget" class="headerlink" title="PasswordForget"></a>PasswordForget</h3><p>Create <code>src/components/PasswordForget/index.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; Link &#125; <span class="keyword">from</span> <span class="string">"react-router-dom"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; PasswordForgetForm &#125; <span class="keyword">from</span> <span class="string">"./PasswordForgetForm"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> routes <span class="keyword">from</span> <span class="string">"../../constants/routes"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> PasswordForget = <span class="function"><span class="params">()</span> =&gt;</span> (</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;h1&gt;PasswordForget&lt;<span class="regexp">/h1&gt;</span></span><br><span class="line"><span class="regexp">    &lt;PasswordForgetForm /</span>&gt;</span><br><span class="line">  &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">);</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">export const PasswordForgetLink = () =&gt; (</span></span><br><span class="line"><span class="regexp">  &lt;p&gt;</span></span><br><span class="line"><span class="regexp">    &lt;Link to=&#123;routes.PASSWORD_FORGET&#125;&gt;Forgot Password&lt;/</span>Link&gt;</span><br><span class="line">  &lt;<span class="regexp">/p&gt;</span></span><br><span class="line"><span class="regexp">);</span></span><br></pre></td></tr></table></figure><p>Create <code>src/components/PasswordForget/PasswordForgetForm.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; auth &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> PasswordForgetForm <span class="keyword">extends</span> React.Component &#123;</span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> INITIAL_STATE = &#123;</span><br><span class="line">    email: <span class="string">""</span>,</span><br><span class="line">    error: <span class="literal">null</span></span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> propKey(propertyName: <span class="built_in">string</span>, value: <span class="built_in">string</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> &#123; [propertyName]: value &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">constructor</span>(<span class="params">props: <span class="built_in">any</span></span>) &#123;</span><br><span class="line">    <span class="keyword">super</span>(props);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">this</span>.state = &#123; ...PasswordForgetForm.INITIAL_STATE &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> onSubmit = <span class="function">(<span class="params">event: <span class="built_in">any</span></span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; email &#125;: <span class="built_in">any</span> = <span class="keyword">this</span>.state;</span><br><span class="line"></span><br><span class="line">    auth</span><br><span class="line">      .doPasswordReset(email)</span><br><span class="line">      .then(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">this</span>.setState(<span class="function"><span class="params">()</span> =&gt;</span> (&#123; ...PasswordForgetForm.INITIAL_STATE &#125;));</span><br><span class="line">      &#125;)</span><br><span class="line">      .catch(<span class="function"><span class="params">error</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">this</span>.setState(PasswordForgetForm.propKey(<span class="string">"error"</span>, error));</span><br><span class="line">      &#125;);</span><br><span class="line"></span><br><span class="line">    event.preventDefault();</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> render() &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; email, error &#125;: <span class="built_in">any</span> = <span class="keyword">this</span>.state;</span><br><span class="line">    <span class="keyword">const</span> isInvalid = email === <span class="string">""</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;form onSubmit=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.onSubmit(event)&#125;&gt;</span><br><span class="line">        &lt;input</span><br><span class="line">          value=&#123;email&#125;</span><br><span class="line">          onChange=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.setStateWithEvent(event, <span class="string">"email"</span>)&#125;</span><br><span class="line">          <span class="keyword">type</span>=<span class="string">"text"</span></span><br><span class="line">          placeholder=<span class="string">"Email Address"</span></span><br><span class="line">        /&gt;</span><br><span class="line">        &lt;button disabled=&#123;isInvalid&#125; <span class="keyword">type</span>=<span class="string">"submit"</span>&gt;</span><br><span class="line">          Reset My Password</span><br><span class="line">        &lt;<span class="regexp">/button&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &#123;error &amp;&amp; &lt;p&gt;&#123;error.message&#125;&lt;/</span>p&gt;&#125;</span><br><span class="line">      &lt;<span class="regexp">/form&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">  private setStateWithEvent(event: any, columnType: string): void &#123;</span></span><br><span class="line"><span class="regexp">    this.setState(</span></span><br><span class="line"><span class="regexp">      PasswordForgetForm.propKey(columnType, (event.target as any).value)</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="Session"><a href="#Session" class="headerlink" title="Session"></a>Session</h2><p>Create <code>src/components/Session/withAuthentication.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; connect &#125; <span class="keyword">from</span> <span class="string">"react-redux"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; firebase &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceProps &#123;</span><br><span class="line">  authUser?: <span class="built_in">any</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceState &#123;</span><br><span class="line">  authUser?: <span class="built_in">any</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> withAuthentication = <span class="function">(<span class="params">Component: <span class="built_in">any</span></span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">class</span> WithAuthentication <span class="keyword">extends</span> React.Component&lt;</span><br><span class="line">    InterfaceProps,</span><br><span class="line">    InterfaceState</span><br><span class="line">  &gt; &#123;</span><br><span class="line">    <span class="keyword">public</span> componentDidMount() &#123;</span><br><span class="line">      <span class="keyword">const</span> &#123; onSetAuthUser &#125;: <span class="built_in">any</span> = <span class="keyword">this</span>.props;</span><br><span class="line"></span><br><span class="line">      firebase.auth.onAuthStateChanged(<span class="function"><span class="params">authUser</span> =&gt;</span> &#123;</span><br><span class="line">        authUser ? onSetAuthUser(authUser) : onSetAuthUser(<span class="literal">null</span>);</span><br><span class="line">      &#125;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> render() &#123;</span><br><span class="line">      <span class="keyword">return</span> &lt;Component /&gt;;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> mapDispatchToProps = <span class="function">(<span class="params">dispatch: <span class="built_in">any</span></span>) =&gt;</span> (&#123;</span><br><span class="line">    onSetAuthUser: <span class="function">(<span class="params">authUser: <span class="built_in">any</span></span>) =&gt;</span></span><br><span class="line">      dispatch(&#123; <span class="keyword">type</span>: <span class="string">"AUTH_USER_SET"</span>, authUser &#125;)</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> connect(</span><br><span class="line">    <span class="literal">null</span>,</span><br><span class="line">    mapDispatchToProps</span><br><span class="line">  )(WithAuthentication);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>Create <code>src/components/Session/withAuthorization.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; connect &#125; <span class="keyword">from</span> <span class="string">"react-redux"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; withRouter &#125; <span class="keyword">from</span> <span class="string">"react-router-dom"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; compose &#125; <span class="keyword">from</span> <span class="string">"recompose"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> routes <span class="keyword">from</span> <span class="string">"../../constants/routes"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; firebase &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceProps &#123;</span><br><span class="line">  history?: <span class="built_in">any</span>;</span><br><span class="line">  authUser?: <span class="built_in">any</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> withAuthorization = <span class="function">(<span class="params">condition: <span class="built_in">any</span></span>) =&gt;</span> (Component: <span class="built_in">any</span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">class</span> WithAuthorization <span class="keyword">extends</span> React.Component&lt;InterfaceProps, <span class="built_in">any</span>&gt; &#123;</span><br><span class="line">    <span class="keyword">public</span> componentDidMount() &#123;</span><br><span class="line">      firebase.auth.onAuthStateChanged(<span class="function"><span class="params">authUser</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (!condition(authUser)) &#123;</span><br><span class="line">          <span class="keyword">this</span>.props.history.push(routes.SIGN_IN);</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> render() &#123;</span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">this</span>.props.authUser ? &lt;Component /&gt; : <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> mapStateToProps = <span class="function">(<span class="params">state: <span class="built_in">any</span></span>) =&gt;</span> (&#123;</span><br><span class="line">    authUser: state.sessionState.authUser</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> compose(</span><br><span class="line">    withRouter,</span><br><span class="line">    connect(mapStateToProps)</span><br><span class="line">  )(WithAuthorization);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h3 id="SignIn"><a href="#SignIn" class="headerlink" title="SignIn"></a>SignIn</h3><p>Create <code>src/components/SignIn/index.tsx</code>:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; withRouter &#125; <span class="keyword">from</span> <span class="string">"react-router-dom"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; PasswordForgetLink &#125; <span class="keyword">from</span> <span class="string">"../PasswordForget"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; SignUpLink &#125; <span class="keyword">from</span> <span class="string">"../SignUp"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; SignInForm &#125; <span class="keyword">from</span> <span class="string">"./SignInForm"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> SignInComponent = <span class="function">(<span class="params">&#123; history &#125;: &#123; [key: <span class="built_in">string</span>]: <span class="built_in">any</span> &#125;</span>) =&gt;</span> (</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;h1&gt;SignIn&lt;<span class="regexp">/h1&gt;</span></span><br><span class="line"><span class="regexp">    &lt;SignInForm history=&#123;history&#125; /</span>&gt;</span><br><span class="line">    &lt;SignUpLink /&gt;</span><br><span class="line">    &lt;PasswordForgetLink /&gt;</span><br><span class="line">  &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">);</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">export const SignIn = withRouter(SignInComponent);</span></span><br></pre></td></tr></table></figure><p>Create <code>src/components/SignIn/SignInForm.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> routes <span class="keyword">from</span> <span class="string">"../../constants/routes"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; auth &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceProps &#123;</span><br><span class="line">  email?: <span class="built_in">string</span>;</span><br><span class="line">  error?: <span class="built_in">any</span>;</span><br><span class="line">  history?: <span class="built_in">any</span>;</span><br><span class="line">  password?: <span class="built_in">string</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceState &#123;</span><br><span class="line">  email: <span class="built_in">string</span>;</span><br><span class="line">  error: <span class="built_in">any</span>;</span><br><span class="line">  password: <span class="built_in">string</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> SignInForm <span class="keyword">extends</span> React.Component&lt;</span><br><span class="line">  InterfaceProps,</span><br><span class="line">  InterfaceState</span><br><span class="line">&gt; &#123;</span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> INITIAL_STATE = &#123;</span><br><span class="line">    email: <span class="string">""</span>,</span><br><span class="line">    error: <span class="literal">null</span>,</span><br><span class="line">    password: <span class="string">""</span></span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> propKey(propertyName: <span class="built_in">string</span>, value: <span class="built_in">any</span>): object &#123;</span><br><span class="line">    <span class="keyword">return</span> &#123; [propertyName]: value &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">constructor</span>(<span class="params">props: InterfaceProps</span>) &#123;</span><br><span class="line">    <span class="keyword">super</span>(props);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">this</span>.state = &#123; ...SignInForm.INITIAL_STATE &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> onSubmit = <span class="function">(<span class="params">event: <span class="built_in">any</span></span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; email, password &#125; = <span class="keyword">this</span>.state;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> &#123; history &#125; = <span class="keyword">this</span>.props;</span><br><span class="line"></span><br><span class="line">    auth</span><br><span class="line">      .doSignInWithEmailAndPassword(email, password)</span><br><span class="line">      .then(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">this</span>.setState(<span class="function"><span class="params">()</span> =&gt;</span> (&#123; ...SignInForm.INITIAL_STATE &#125;));</span><br><span class="line">        history.push(routes.HOME);</span><br><span class="line">      &#125;)</span><br><span class="line">      .catch(<span class="function"><span class="params">error</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">this</span>.setState(SignInForm.propKey(<span class="string">"error"</span>, error));</span><br><span class="line">      &#125;);</span><br><span class="line"></span><br><span class="line">    event.preventDefault();</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> render() &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; email, password, error &#125; = <span class="keyword">this</span>.state;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> isInvalid = password === <span class="string">""</span> || email === <span class="string">""</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;form onSubmit=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.onSubmit(event)&#125;&gt;</span><br><span class="line">        &lt;input</span><br><span class="line">          value=&#123;email&#125;</span><br><span class="line">          onChange=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.setStateWithEvent(event, <span class="string">"email"</span>)&#125;</span><br><span class="line">          <span class="keyword">type</span>=<span class="string">"text"</span></span><br><span class="line">          placeholder=<span class="string">"Email Address"</span></span><br><span class="line">        /&gt;</span><br><span class="line">        &lt;input</span><br><span class="line">          value=&#123;password&#125;</span><br><span class="line">          onChange=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.setStateWithEvent(event, <span class="string">"password"</span>)&#125;</span><br><span class="line">          <span class="keyword">type</span>=<span class="string">"password"</span></span><br><span class="line">          placeholder=<span class="string">"Password"</span></span><br><span class="line">        /&gt;</span><br><span class="line">        &lt;button disabled=&#123;isInvalid&#125; <span class="keyword">type</span>=<span class="string">"submit"</span>&gt;</span><br><span class="line">          Sign In</span><br><span class="line">        &lt;<span class="regexp">/button&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &#123;error &amp;&amp; &lt;p&gt;&#123;error.message&#125;&lt;/</span>p&gt;&#125;</span><br><span class="line">      &lt;<span class="regexp">/form&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">  private setStateWithEvent(event: any, columnType: string): void &#123;</span></span><br><span class="line"><span class="regexp">    this.setState(SignInForm.propKey(columnType, (event.target as any).value));</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="SignOut"><a href="#SignOut" class="headerlink" title="SignOut"></a>SignOut</h3><p>Create <code>src/components/SignOut/index.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; auth &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> SignOutButton = <span class="function"><span class="params">()</span> =&gt;</span> (</span><br><span class="line">  &lt;button <span class="keyword">type</span>=<span class="string">"button"</span> onClick=&#123;auth.doSignOut&#125;&gt;</span><br><span class="line">    Sign Out</span><br><span class="line">  &lt;<span class="regexp">/button&gt;</span></span><br><span class="line"><span class="regexp">);</span></span><br></pre></td></tr></table></figure><h3 id="SignUp"><a href="#SignUp" class="headerlink" title="SignUp"></a>SignUp</h3><p>Create <code>src/components/SignUp/index.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; auth &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> SignOutButton = <span class="function"><span class="params">()</span> =&gt;</span> (</span><br><span class="line">  &lt;button <span class="keyword">type</span>=<span class="string">"button"</span> onClick=&#123;auth.doSignOut&#125;&gt;</span><br><span class="line">    Sign Out</span><br><span class="line">  &lt;<span class="regexp">/button&gt;</span></span><br><span class="line"><span class="regexp">);</span></span><br></pre></td></tr></table></figure><p>Create <code>SingUpForm.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> routes <span class="keyword">from</span> <span class="string">"../../constants/routes"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; auth, db &#125; <span class="keyword">from</span> <span class="string">"../../firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceProps &#123;</span><br><span class="line">  email?: <span class="built_in">string</span>;</span><br><span class="line">  error?: <span class="built_in">any</span>;</span><br><span class="line">  history?: <span class="built_in">any</span>;</span><br><span class="line">  passwordOne?: <span class="built_in">string</span>;</span><br><span class="line">  passwordTwo?: <span class="built_in">string</span>;</span><br><span class="line">  username?: <span class="built_in">string</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> InterfaceState &#123;</span><br><span class="line">  email: <span class="built_in">string</span>;</span><br><span class="line">  error: <span class="built_in">any</span>;</span><br><span class="line">  passwordOne: <span class="built_in">string</span>;</span><br><span class="line">  passwordTwo: <span class="built_in">string</span>;</span><br><span class="line">  username: <span class="built_in">string</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> SignUpForm <span class="keyword">extends</span> React.Component&lt;</span><br><span class="line">  InterfaceProps,</span><br><span class="line">  InterfaceState</span><br><span class="line">&gt; &#123;</span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> INITIAL_STATE = &#123;</span><br><span class="line">    email: <span class="string">""</span>,</span><br><span class="line">    error: <span class="literal">null</span>,</span><br><span class="line">    passwordOne: <span class="string">""</span>,</span><br><span class="line">    passwordTwo: <span class="string">""</span>,</span><br><span class="line">    username: <span class="string">""</span></span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> <span class="keyword">static</span> propKey(propertyName: <span class="built_in">string</span>, value: <span class="built_in">any</span>): object &#123;</span><br><span class="line">    <span class="keyword">return</span> &#123; [propertyName]: value &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">constructor</span>(<span class="params">props: InterfaceProps</span>) &#123;</span><br><span class="line">    <span class="keyword">super</span>(props);</span><br><span class="line">    <span class="keyword">this</span>.state = &#123; ...SignUpForm.INITIAL_STATE &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> onSubmit(event: <span class="built_in">any</span>) &#123;</span><br><span class="line">    event.preventDefault();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> &#123; email, passwordOne, username &#125; = <span class="keyword">this</span>.state;</span><br><span class="line">    <span class="keyword">const</span> &#123; history &#125; = <span class="keyword">this</span>.props;</span><br><span class="line"></span><br><span class="line">    auth</span><br><span class="line">      .doCreateUserWithEmailAndPassword(email, passwordOne)</span><br><span class="line">      .then(<span class="function">(<span class="params">authUser: <span class="built_in">any</span></span>) =&gt;</span> &#123;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Create a user in your own accessible Firebase Database too</span></span><br><span class="line">        db.doCreateUser(authUser.user.uid, username, email)</span><br><span class="line">          .then(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">this</span>.setState(<span class="function"><span class="params">()</span> =&gt;</span> (&#123; ...SignUpForm.INITIAL_STATE &#125;));</span><br><span class="line">            history.push(routes.HOME);</span><br><span class="line">          &#125;)</span><br><span class="line">          .catch(<span class="function"><span class="params">error</span> =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">this</span>.setState(SignUpForm.propKey(<span class="string">"error"</span>, error));</span><br><span class="line">          &#125;);</span><br><span class="line">      &#125;)</span><br><span class="line">      .catch(<span class="function"><span class="params">error</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">this</span>.setState(SignUpForm.propKey(<span class="string">"error"</span>, error));</span><br><span class="line">      &#125;);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">public</span> render() &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; username, email, passwordOne, passwordTwo, error &#125; = <span class="keyword">this</span>.state;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> isInvalid =</span><br><span class="line">      passwordOne !== passwordTwo ||</span><br><span class="line">      passwordOne === <span class="string">""</span> ||</span><br><span class="line">      email === <span class="string">""</span> ||</span><br><span class="line">      username === <span class="string">""</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;form onSubmit=&#123;<span class="function">(<span class="params">event</span>) =&gt;</span> <span class="keyword">this</span>.onSubmit(event)&#125;&gt;</span><br><span class="line">        &lt;input</span><br><span class="line">          value=&#123;username&#125;</span><br><span class="line">          onChange=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.setStateWithEvent(event, <span class="string">"username"</span>)&#125;</span><br><span class="line">          <span class="keyword">type</span>=<span class="string">"text"</span></span><br><span class="line">          placeholder=<span class="string">"Full Name"</span></span><br><span class="line">        /&gt;</span><br><span class="line">        &lt;input</span><br><span class="line">          value=&#123;email&#125;</span><br><span class="line">          onChange=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.setStateWithEvent(event, <span class="string">"email"</span>)&#125;</span><br><span class="line">          <span class="keyword">type</span>=<span class="string">"text"</span></span><br><span class="line">          placeholder=<span class="string">"Email Address"</span></span><br><span class="line">        /&gt;</span><br><span class="line">        &lt;input</span><br><span class="line">          value=&#123;passwordOne&#125;</span><br><span class="line">          onChange=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.setStateWithEvent(event, <span class="string">"passwordOne"</span>)&#125;</span><br><span class="line">          <span class="keyword">type</span>=<span class="string">"password"</span></span><br><span class="line">          placeholder=<span class="string">"Password"</span></span><br><span class="line">        /&gt;</span><br><span class="line">        &lt;input</span><br><span class="line">          value=&#123;passwordTwo&#125;</span><br><span class="line">          onChange=&#123;<span class="function"><span class="params">event</span> =&gt;</span> <span class="keyword">this</span>.setStateWithEvent(event, <span class="string">"passwordTwo"</span>)&#125;</span><br><span class="line">          <span class="keyword">type</span>=<span class="string">"password"</span></span><br><span class="line">          placeholder=<span class="string">"Confirm Password"</span></span><br><span class="line">        /&gt;</span><br><span class="line">        &lt;button disabled=&#123;isInvalid&#125; <span class="keyword">type</span>=<span class="string">"submit"</span>&gt;</span><br><span class="line">          Sign Up</span><br><span class="line">        &lt;<span class="regexp">/button&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &#123;error &amp;&amp; &lt;p&gt;&#123;error.message&#125;&lt;/</span>p&gt;&#125;</span><br><span class="line">      &lt;<span class="regexp">/form&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">  private setStateWithEvent(event: any, columnType: string) &#123;</span></span><br><span class="line"><span class="regexp">    this.setState(SignUpForm.propKey(columnType, (event.target as any).value));</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br></pre></td></tr></table></figure><p>After then, please confirm <code>http://localhost:3000</code> again. You can see some pages for sign up, sign in, password reset, change password and sign out.</p><h2 id="firebase"><a href="#firebase" class="headerlink" title="firebase"></a>firebase</h2><h3 id="auth"><a href="#auth" class="headerlink" title="auth"></a>auth</h3><p>Create <code>src/firebase/auth.tsx</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; auth &#125; <span class="keyword">from</span> <span class="string">"./firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Sign Up</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> doCreateUserWithEmailAndPassword = (</span><br><span class="line">  email: <span class="built_in">string</span>,</span><br><span class="line">  password: <span class="built_in">string</span></span><br><span class="line">) =&gt; auth.createUserWithEmailAndPassword(email, password);</span><br><span class="line"></span><br><span class="line"><span class="comment">// Sign In</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> doSignInWithEmailAndPassword = <span class="function">(<span class="params">email: <span class="built_in">string</span>, password: <span class="built_in">string</span></span>) =&gt;</span></span><br><span class="line">  auth.signInWithEmailAndPassword(email, password);</span><br><span class="line"></span><br><span class="line"><span class="comment">// Sign out</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> doSignOut = <span class="function"><span class="params">()</span> =&gt;</span> auth.signOut();</span><br><span class="line"></span><br><span class="line"><span class="comment">// Password Reset</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> doPasswordReset = <span class="function">(<span class="params">email: <span class="built_in">string</span></span>) =&gt;</span></span><br><span class="line">  auth.sendPasswordResetEmail(email);</span><br><span class="line"></span><br><span class="line"><span class="comment">// Password Change</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> doPasswordUpdate = <span class="keyword">async</span> (password: <span class="built_in">string</span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">if</span> (auth.currentUser) &#123;</span><br><span class="line">    <span class="keyword">await</span> auth.currentUser.updatePassword(password);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">throw</span> <span class="built_in">Error</span>(<span class="string">"No auth.currentUser!"</span>);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h3 id="db"><a href="#db" class="headerlink" title="db"></a>db</h3><p>Create <code>src/firebase/db.ts</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; db &#125; <span class="keyword">from</span> <span class="string">"./firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// User API</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> doCreateUser = <span class="function">(<span class="params">id: <span class="built_in">string</span>, username: <span class="built_in">string</span>, email: <span class="built_in">string</span></span>) =&gt;</span></span><br><span class="line">  db.ref(<span class="string">`users/<span class="subst">$&#123;id&#125;</span>`</span>).set(&#123;</span><br><span class="line">    email,</span><br><span class="line">    username</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> onceGetUsers = <span class="function"><span class="params">()</span> =&gt;</span> db.ref(<span class="string">"users"</span>).once(<span class="string">"value"</span>);</span><br></pre></td></tr></table></figure><h3 id="firebase-1"><a href="#firebase-1" class="headerlink" title="firebase"></a>firebase</h3><p>Create <code>src/firebase/firebase.ts</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> firebase <span class="keyword">from</span> <span class="string">"firebase/app"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">"firebase/auth"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">"firebase/database"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> config = &#123;</span><br><span class="line">  apiKey: <span class="string">"YOUR_API_KEY"</span>,</span><br><span class="line">  authDomain: <span class="string">"YOUR_AUTH_DOMAIN"</span>,</span><br><span class="line">  databaseURL: <span class="string">"YOUR_DATABASE_URL"</span>,</span><br><span class="line">  messagingSenderId: <span class="string">"YOUR_MESSAGING_SENDER_ID"</span>,</span><br><span class="line">  projectId: <span class="string">"YOUR PROJECT_ID"</span>,</span><br><span class="line">  storageBucket: <span class="string">"YOUR_STORAGE_BUCKET"</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!firebase.apps.length) &#123;</span><br><span class="line">  firebase.initializeApp(config);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> auth = firebase.auth();</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> db = firebase.database();</span><br></pre></td></tr></table></figure><h3 id="index-1"><a href="#index-1" class="headerlink" title="index"></a>index</h3><p>Create <code>src/firebase/index.ts</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> auth <span class="keyword">from</span> <span class="string">"./auth"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> db <span class="keyword">from</span> <span class="string">"./db"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> firebase <span class="keyword">from</span> <span class="string">"./firebase"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> &#123; auth, db, firebase &#125;;</span><br></pre></td></tr></table></figure><h2 id="reducers"><a href="#reducers" class="headerlink" title="reducers"></a>reducers</h2><h3 id="index-2"><a href="#index-2" class="headerlink" title="index"></a>index</h3><p>Create <code>src/reducers/index.ts</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; combineReducers &#125; <span class="keyword">from</span> <span class="string">"redux"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; sessionReducer &#125; <span class="keyword">from</span> <span class="string">"./session"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; userReducer &#125; <span class="keyword">from</span> <span class="string">"./user"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> rootReducer = combineReducers(&#123;</span><br><span class="line">  sessionState: sessionReducer,</span><br><span class="line">  userState: userReducer</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h3 id="session"><a href="#session" class="headerlink" title="session"></a>session</h3><p>Create <code>src/reducers/session.ts</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> INITIAL_STATE = &#123;</span><br><span class="line">  authUser: <span class="literal">null</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> applySetAuthUser = <span class="function">(<span class="params">state: <span class="built_in">any</span>, action: <span class="built_in">any</span></span>) =&gt;</span> (&#123;</span><br><span class="line">  ...state,</span><br><span class="line">  authUser: action.authUser</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="function"><span class="keyword">function</span> <span class="title">sessionReducer</span>(<span class="params">state = INITIAL_STATE, action: <span class="built_in">any</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">switch</span> (action.type) &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="string">"AUTH_USER_SET"</span>: &#123;</span><br><span class="line">      <span class="keyword">return</span> applySetAuthUser(state, action);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">default</span>:</span><br><span class="line">      <span class="keyword">return</span> state;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="user"><a href="#user" class="headerlink" title="user"></a>user</h3><p>Create <code>src/reducers/user.ts</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> INITIAL_STATE = &#123;</span><br><span class="line">  users: &#123;&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> applySetUsers = <span class="function">(<span class="params">state: <span class="built_in">any</span>, action: <span class="built_in">any</span></span>) =&gt;</span> (&#123;</span><br><span class="line">  ...state,</span><br><span class="line">  users: action.users</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="function"><span class="keyword">function</span> <span class="title">userReducer</span>(<span class="params">state = INITIAL_STATE, action: <span class="built_in">any</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">switch</span> (action.type) &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="string">"USERS_SET"</span>: &#123;</span><br><span class="line">      <span class="keyword">return</span> applySetUsers(state, action);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">default</span>:</span><br><span class="line">      <span class="keyword">return</span> state;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="store"><a href="#store" class="headerlink" title="store"></a>store</h2><p>Create <code>src/store/index.ts</code> file:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; createStore &#125; <span class="keyword">from</span> <span class="string">"redux"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; rootReducer &#125; <span class="keyword">from</span> <span class="string">"../reducers"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> store = createStore(rootReducer);</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> store;</span><br></pre></td></tr></table></figure><h2 id="GitHub-Repository-1"><a href="#GitHub-Repository-1" class="headerlink" title="GitHub Repository"></a>GitHub Repository</h2><p>Whole files of this tutorial are as follows:</p><p><a href="https://github.com/morizyun/react-redux-typescript-firebase-auth" target="_blank" rel="noopener">https://github.com/morizyun/react-redux-typescript-firebase-auth</a></p><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="https://www.robinwieruch.de/complete-firebase-authentication-react-tutorial/" target="_blank" rel="noopener">https://www.robinwieruch.de/complete-firebase-authentication-react-tutorial/</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Let’s implement a whole authentication mechanism in React &amp;amp; Redux with sign up, sign in, password reset, change password and sign out
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Initial Setup with Jest &amp; TypeScript [JavaScript]</title>
    <link href="https://blog.morizyun.com/blog/typescript-jest-unit-test-zero-config/"/>
    <id>https://blog.morizyun.com/blog/typescript-jest-unit-test-zero-config/</id>
    <published>2018-06-21T04:00:00.000Z</published>
    <updated>2018-07-30T07:08:58.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong><a href="https://facebook.github.io/jest/" target="_blank" rel="noopener">Jest</a></strong> is JavaScript test framework which is less configuration.</p><p>This article describes how to setup <strong><a href="https://facebook.github.io/jest/" target="_blank" rel="noopener">Jest</a></strong> with TypeScript.</p><h2 id="Install-libraries"><a href="#Install-libraries" class="headerlink" title="Install libraries"></a>Install libraries</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yarn add --dev jest ts-jest @types/jest</span><br></pre></td></tr></table></figure><h2 id="Configure-Jest"><a href="#Configure-Jest" class="headerlink" title="Configure Jest"></a>Configure Jest</h2><p>Modify <code>package.json</code> to add <code>run test configuration</code>.<br>(If you want to run test sequentially, please use <code>jest --runInBand</code>.)</p><figure class="highlight"><table><tr><td class="code"><pre><span class="line">"scripts": &#123;</span><br><span class="line">  "test": "jest"</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Create <code>jest.config.js</code> file for configuring Jest.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="built_in">module</span>.exports = &#123;</span><br><span class="line">  moduleFileExtensions: [<span class="string">"ts"</span>, <span class="string">"tsx"</span>, <span class="string">"js"</span>, <span class="string">"json"</span>],</span><br><span class="line">  transform: &#123;</span><br><span class="line">    <span class="string">"^.+\\.(ts|tsx)$"</span>: <span class="string">"ts-jest"</span></span><br><span class="line">  &#125;,</span><br><span class="line">  globals: &#123;</span><br><span class="line">    <span class="string">"ts-jest"</span>: &#123;</span><br><span class="line">      tsConfigFile: <span class="string">"tsconfig.json"</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  testMatch: [<span class="string">"**/__tests__/specs/**/*.+(ts|tsx|js)"</span>],</span><br><span class="line">  testPathIgnorePatterns: [<span class="string">"/node_modules/"</span>, <span class="string">"/dist/"</span>, <span class="string">"/lib/"</span>],</span><br><span class="line">  setupTestFrameworkScriptFile: <span class="string">"./__tests__/setup.ts"</span>,</span><br><span class="line">  verbose: <span class="literal">true</span>,</span><br><span class="line">  testURL: <span class="string">"http://localhost/"</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="Setup-for-all-test"><a href="#Setup-for-all-test" class="headerlink" title="Setup for all test"></a>Setup for all test</h2><p>Create <code>./__tests__/setup.ts</code> file for putting common configuration.<br>(e.g. clean up after all tests have run or setuping/closing DB)</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// Example</span></span><br><span class="line"><span class="keyword">import</span> &#123; getConnection, getConnectionManager &#125; <span class="keyword">from</span> <span class="string">"typeorm"</span>;</span><br><span class="line"></span><br><span class="line">beforeAll(<span class="keyword">async</span> () =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> connectionManager = getConnectionManager();</span><br><span class="line">  <span class="keyword">const</span> connection = connectionManager.create(&#123; <span class="comment">/* test configuration */</span> &#125;);</span><br><span class="line">  <span class="keyword">await</span> connection.connect();</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">afterAll(<span class="keyword">async</span> () =&gt; &#123;</span><br><span class="line">  <span class="keyword">await</span> getConnection().close();</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="Write-tests"><a href="#Write-tests" class="headerlink" title="Write tests"></a>Write tests</h2><p>Create a <code>./src/sum.ts</code> function file.</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> sum = <span class="function">(<span class="params">a, b</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> a + b;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="built_in">module</span>.exports = sum;</span><br></pre></td></tr></table></figure><p>After create a file which you want to write test, add <code>./__tests__/specs/sum.ts</code> test file.</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; sum &#125; <span class="keyword">from</span> <span class="string">"../../../src/sum.ts"</span>;</span><br><span class="line"></span><br><span class="line">test(<span class="string">"adds 1 + 2 to equal 3"</span>, <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  expect(sum(<span class="number">1</span>, <span class="number">2</span>)).toBe(<span class="number">3</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>Run the test.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yarn <span class="built_in">test</span></span><br><span class="line"><span class="comment"># PASS  ./sum.test.js</span></span><br><span class="line"><span class="comment"># ✓ adds 1 + 2 to equal 3 (5ms)</span></span><br></pre></td></tr></table></figure><h2 id="Appendix-Unit-test-with-supertest"><a href="#Appendix-Unit-test-with-supertest" class="headerlink" title="[Appendix] Unit test with supertest"></a>[Appendix] Unit test with supertest</h2><p><strong><a href="https://github.com/visionmedia/supertest" target="_blank" rel="noopener">supertest</a></strong> suports unit test for Express.js App.</p><h3 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yarn add supertest <span class="comment"># npm install supertest --save-dev</span></span><br></pre></td></tr></table></figure><h3 id="How-to-use"><a href="#How-to-use" class="headerlink" title="How to use"></a>How to use</h3><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> request <span class="keyword">from</span> <span class="string">"supertest"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> express <span class="keyword">from</span> <span class="string">"express"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> app = express();</span><br><span class="line"></span><br><span class="line">app</span><br><span class="line">  .get(<span class="string">"/user"</span>, <span class="function"><span class="keyword">function</span>(<span class="params">req, res</span>) </span>&#123;</span><br><span class="line">    res.status(<span class="number">200</span>).json(&#123; name: <span class="string">"john"</span> &#125;);</span><br><span class="line">  &#125;)</span><br><span class="line">  .post(<span class="string">"/users"</span>, <span class="function"><span class="keyword">function</span>(<span class="params">req, res</span>) </span>&#123;</span><br><span class="line">    res.status(<span class="number">200</span>).json(&#123; status: <span class="string">"create user!"</span> &#125;);</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">describe(<span class="string">"GET /user"</span>, <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  it(<span class="string">"respond with json"</span>, <span class="function"><span class="params">done</span> =&gt;</span> &#123;</span><br><span class="line">    request(app)</span><br><span class="line">      .get(<span class="string">"/user"</span>)</span><br><span class="line">      .set(<span class="string">"Accept"</span>, <span class="string">"application/json"</span>)</span><br><span class="line">      .expect(<span class="string">"Content-Type"</span>, <span class="regexp">/json/</span>)</span><br><span class="line">      .expect(<span class="number">200</span>, done);</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">describe(<span class="string">"POST /users"</span>, <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  it(<span class="string">"responds with json"</span>, <span class="function"><span class="params">done</span> =&gt;</span> &#123;</span><br><span class="line">    request(app)</span><br><span class="line">      .post(<span class="string">"/users"</span>)</span><br><span class="line">      .send(&#123; name: <span class="string">"john"</span> &#125;)</span><br><span class="line">      .set(<span class="string">"Accept"</span>, <span class="string">"application/json"</span>)</span><br><span class="line">      .expect(<span class="number">200</span>)</span><br><span class="line">      .end(<span class="function"><span class="keyword">function</span>(<span class="params">err, res</span>) </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (err) <span class="keyword">return</span> done(err);</span><br><span class="line">        done();</span><br><span class="line">      &#125;);</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>If I want to use create sample data, I needs to write the following things:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> user;</span><br><span class="line"></span><br><span class="line">before(<span class="keyword">async</span> () =&gt; &#123;</span><br><span class="line">  user = <span class="keyword">await</span> createUser();</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="http://bit.ly/2v25MaB" target="_blank" rel="noopener">http://bit.ly/2v25MaB</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://facebook.github.io/jest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Jest&lt;/a&gt;&lt;/strong&gt; is JavaScript test framework which is
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Tutorial of RESTful APIs with Express.js and TypeScript</title>
    <link href="https://blog.morizyun.com/blog/typescript-express-tutorial-javascript-nodejs/"/>
    <id>https://blog.morizyun.com/blog/typescript-express-tutorial-javascript-nodejs/</id>
    <published>2018-06-09T04:00:00.000Z</published>
    <updated>2018-06-23T18:40:38.000Z</updated>
    
    <content type="html"><![CDATA[<p>This is a tutorial about how to build RESTful APIs with Express.js and TypeScript.</p><h2 id="Prepare-Node-env-on-macOS"><a href="#Prepare-Node-env-on-macOS" class="headerlink" title="Prepare Node env on macOS"></a>Prepare Node env on macOS</h2><p>If you don’t have a development environment for Node.js, I recommend installing <a href="https://github.com/creationix/nvm" target="_blank" rel="noopener">nvm</a>. If you are interested, please see my post <strong><a href="https://blog.morizyun.com/javascript/library-nvm.html">nvm: Node Version Manager</a></strong> .</p><h2 id="Install-TypeScript"><a href="#Install-TypeScript" class="headerlink" title="Install TypeScript"></a>Install TypeScript</h2><p>Before we get started, we should install TypeScript and TypeScript Node:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yarn global add typescript ts-node <span class="comment"># npm install -g typescript ts-node</span></span><br></pre></td></tr></table></figure><h2 id="Initiate-a-Project"><a href="#Initiate-a-Project" class="headerlink" title="Initiate a Project"></a>Initiate a Project</h2><p>Create a project folder and initiate the npm project.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Create a folder and change directory to the folder</span></span><br><span class="line">mkdir nodejs-api-project &amp; <span class="built_in">cd</span> nodejs-api-project</span><br><span class="line"></span><br><span class="line"><span class="comment"># Initiate npm configuration</span></span><br><span class="line">yarn init <span class="comment"># npm init</span></span><br></pre></td></tr></table></figure><h2 id="Install-Express"><a href="#Install-Express" class="headerlink" title="Install Express"></a>Install Express</h2><p>Install Express.js and dependencies.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yarn add @types/express express body-parser <span class="comment"># npm install --save @types/express express body-parser</span></span><br><span class="line"></span><br><span class="line">yarn add --dev nodemon typescript ts-node <span class="comment"># npm install --save-dev nodemon typescript ts-node</span></span><br></pre></td></tr></table></figure><h2 id="Configure-TypeScript"><a href="#Configure-TypeScript" class="headerlink" title="Configure TypeScript"></a>Configure TypeScript</h2><p>Create <code>tsconfig.json</code> file.</p><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"compilerOptions"</span>: &#123;</span><br><span class="line">    <span class="attr">"module"</span>: <span class="string">"commonjs"</span>,</span><br><span class="line">    <span class="attr">"moduleResolution"</span>: <span class="string">"node"</span>,</span><br><span class="line">    <span class="attr">"pretty"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">"sourceMap"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">"target"</span>: <span class="string">"es6"</span>,</span><br><span class="line">    <span class="attr">"lib"</span>: [<span class="string">"dom"</span>, <span class="string">"esnext"</span>],</span><br><span class="line">    <span class="attr">"outDir"</span>: <span class="string">"./dist"</span>,</span><br><span class="line">    <span class="attr">"baseUrl"</span>: <span class="string">"./src"</span>,</span><br><span class="line">    <span class="attr">"alwaysStrict"</span>: <span class="literal">true</span></span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">"include"</span>: [<span class="string">"src/**/*.ts"</span>],</span><br><span class="line">  <span class="attr">"exclude"</span>: [<span class="string">"node_modules"</span>]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Create-source-and-dist-folders"><a href="#Create-source-and-dist-folders" class="headerlink" title="Create source and dist folders"></a>Create source and dist folders</h2><p>Create a folder to put TypeScript files. You will put your TypeScript files.</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mkdir src</span><br></pre></td></tr></table></figure><h2 id="Configure-nodemon"><a href="#Configure-nodemon" class="headerlink" title="Configure nodemon"></a>Configure nodemon</h2><p>Create <code>nodemon.json</code> file.</p><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">"watch"</span>: [<span class="string">"src"</span>],</span><br><span class="line">  <span class="attr">"ext"</span>: <span class="string">"ts"</span>,</span><br><span class="line">  <span class="attr">"ignore"</span>: [<span class="string">"src/**/*.spec.ts"</span>],</span><br><span class="line">  <span class="attr">"exec"</span>: <span class="string">"ts-node ./src/server.ts"</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Edit-script-configuration-in-package-json"><a href="#Edit-script-configuration-in-package-json" class="headerlink" title="Edit script configuration in package.json"></a>Edit script configuration in package.json</h2><p>Edit <code>package.json</code> file to add script configuration.</p><figure class="highlight"><table><tr><td class="code"><pre><span class="line">"scripts": &#123;</span><br><span class="line">    "build": "tsc",</span><br><span class="line">    "dev": "nodemon -L",        </span><br><span class="line">    "start": "node ./dist/server.js"</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Create-base-Express-code"><a href="#Create-base-Express-code" class="headerlink" title="Create base Express code"></a>Create base Express code</h2><p>Create <code>src/app.ts</code> file.</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> express <span class="keyword">from</span> <span class="string">"express"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> bodyParser <span class="keyword">from</span> <span class="string">"body-parser"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> App &#123;</span><br><span class="line">  <span class="keyword">public</span> app: express.Application;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">constructor</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">this</span>.app = express();</span><br><span class="line">    <span class="keyword">this</span>.config();</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> config(): <span class="built_in">void</span> &#123;</span><br><span class="line">    <span class="comment">// support application/json</span></span><br><span class="line">    <span class="keyword">this</span>.app.use(bodyParser.json());</span><br><span class="line">    <span class="comment">//support application/x-www-form-urlencoded post data</span></span><br><span class="line">    <span class="keyword">this</span>.app.use(bodyParser.urlencoded(&#123; extended: <span class="literal">false</span> &#125;));</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">new</span> App().app;</span><br></pre></td></tr></table></figure><p>Additionally, generate <code>src/server.ts</code>.</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> app <span class="keyword">from</span> <span class="string">"./app"</span>;</span><br><span class="line"><span class="keyword">const</span> PORT = <span class="number">3000</span>;</span><br><span class="line"></span><br><span class="line">app.listen(PORT, <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="built_in">console</span>.log(<span class="string">"Express server listening on port "</span> + PORT);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>So, for your development, you can run a dev server by the following command:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yarn dev</span><br></pre></td></tr></table></figure><p><img src="https://farm2.staticflickr.com/1721/27808881417_452318d387_b.jpg" alt="express-typescript-start-bash"></p><h2 id="Create-routing-file"><a href="#Create-routing-file" class="headerlink" title="Create routing file"></a>Create routing file</h2><p>Create <code>src/routes</code> folder and add <code>src/routes/MainRoutes.ts</code> file.</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; Request, Response &#125; <span class="keyword">from</span> <span class="string">"express"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> MainController &#123;</span><br><span class="line">  <span class="keyword">public</span> root(req: Request, res: Response) &#123;</span><br><span class="line">    res.status(<span class="number">200</span>).send(&#123;</span><br><span class="line">      message: <span class="string">"GET request successful!!"</span></span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> mainController = <span class="keyword">new</span> MainController();</span><br></pre></td></tr></table></figure><p>After then, you should create <code>src/controllers</code> and add <code>src/controllers/MainController.ts</code> file.</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> express <span class="keyword">from</span> <span class="string">"express"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; mainController &#125; <span class="keyword">from</span> <span class="string">"../controllers/MainController"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> MainRoutes &#123;</span><br><span class="line">  <span class="keyword">public</span> router: express.Router = express.Router();</span><br><span class="line"></span><br><span class="line">  <span class="keyword">constructor</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">this</span>.config();</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> config(): <span class="built_in">void</span> &#123;</span><br><span class="line">    <span class="keyword">this</span>.router.get(<span class="string">"/"</span>, <span class="function">(<span class="params">req: express.Request, res: express.Response</span>) =&gt;</span></span><br><span class="line">      mainController.root(req, res)</span><br><span class="line">    );</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> mainRoutes = <span class="keyword">new</span> MainRoutes().router;</span><br></pre></td></tr></table></figure><p>After creating the route file, we need to import it to <code>src/app.ts</code>:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> express <span class="keyword">from</span> <span class="string">"express"</span>;</span><br><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> bodyParser <span class="keyword">from</span> <span class="string">"body-parser"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; mainRoutes &#125; <span class="keyword">from</span> <span class="string">"./routes/MainRoutes"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> App &#123;</span><br><span class="line">  <span class="keyword">public</span> app: express.Application;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">constructor</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">this</span>.app = express();</span><br><span class="line">    <span class="keyword">this</span>.config();</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">private</span> config(): <span class="built_in">void</span> &#123;</span><br><span class="line">    <span class="comment">// support application/json</span></span><br><span class="line">    <span class="keyword">this</span>.app.use(bodyParser.json());</span><br><span class="line">    <span class="comment">//support application/x-www-form-urlencoded post data</span></span><br><span class="line">    <span class="keyword">this</span>.app.use(bodyParser.urlencoded(&#123; extended: <span class="literal">false</span> &#125;));</span><br><span class="line">    <span class="comment">// Routing</span></span><br><span class="line">    <span class="keyword">this</span>.app.use(<span class="string">"/"</span>, mainRoutes);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">new</span> App().app;</span><br></pre></td></tr></table></figure><p>Now you can see the result in Browser (<code>http://localhost:3000</code>).</p><p><img src="https://farm2.staticflickr.com/1724/40869344270_29725d66c2_b.jpg" alt="localhost-result"></p><h2 id="Appendix-Dockerfile"><a href="#Appendix-Dockerfile" class="headerlink" title="[Appendix] Dockerfile"></a>[Appendix] Dockerfile</h2><p>This is <code>Dockerfile</code> for TypeScript &amp; Express.js.</p><h2 id="Development"><a href="#Development" class="headerlink" title="Development"></a>Development</h2><figure class="highlight dockerfile"><table><tr><td class="code"><pre><span class="line"><span class="keyword">FROM</span> node</span><br><span class="line"></span><br><span class="line"><span class="comment"># Create app directory</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> mkdir /app</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /app</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Install app dependencies</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> package.json ./</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> yarn.lock ./</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Install libraries</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> yarn &amp;&amp; yarn global add typescript ts-node</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Bundle app source</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> . .</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Build dist folder</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> yarn build</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">4000</span></span><br><span class="line"><span class="keyword">CMD</span><span class="bash"> [ <span class="string">"yarn"</span>, <span class="string">"start"</span> ]</span></span><br></pre></td></tr></table></figure><h2 id="Appendix-Basic-Authentication"><a href="#Appendix-Basic-Authentication" class="headerlink" title="[Appendix] Basic Authentication"></a>[Appendix] Basic Authentication</h2><p><strong><a href="https://github.com/expressjs/basic-auth-connect" target="_blank" rel="noopener">basic-auth-connect</a></strong> supports basic authentication in Express v4 apps.</p><p>Please run the following command:</p><h3 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yarn add basic-auth-connect</span><br></pre></td></tr></table></figure><h3 id="Configuration"><a href="#Configuration" class="headerlink" title="Configuration"></a>Configuration</h3><p>Add following code:</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> * <span class="keyword">as</span> basicAuth <span class="keyword">from</span> <span class="string">'basic-auth-connect'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> app = express();</span><br><span class="line"><span class="keyword">if</span> (process.env.BASIC_AUTH_USER || process.env.BASIC_AUTH_PASSWORD) &#123;</span><br><span class="line">  app.all(</span><br><span class="line">    <span class="string">"/*"</span>,</span><br><span class="line">    basicAuth(<span class="function"><span class="keyword">function</span>(<span class="params">user, password</span>) </span>&#123;</span><br><span class="line">      <span class="keyword">return</span> (</span><br><span class="line">        user === process.env.BASIC_AUTH_USER &amp;&amp;</span><br><span class="line">        password === process.env.BASIC_AUTH_PASSWORD</span><br><span class="line">      );</span><br><span class="line">    &#125;)</span><br><span class="line">  );</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>After then, if you provide <code>BASIC_AUTH_USER</code> and <code>BASIC_AUTH_PASSWORD</code> environment variable, you can use basic authentication in Express app.</p><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ul><li><a href="https://itnext.io/building-restful-web-apis-with-node-js-express-mongodb-and-typescript-part-1-2-195bdaf129cf\" target="_blank" rel="noopener">https://itnext.io/building-restful-web-apis-with-node-js-express-mongodb-and-typescript-part-1-2-195bdaf129cf\</a></li><li><a href="https://qiita.com/R-STYLE/items/6afd4aab417f973de961" target="_blank" rel="noopener">https://qiita.com/R-STYLE/items/6afd4aab417f973de961</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;This is a tutorial about how to build RESTful APIs with Express.js and TypeScript.&lt;/p&gt;
&lt;h2 id=&quot;Prepare-Node-env-on-macOS&quot;&gt;&lt;a href=&quot;#Prepa
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Beiginner&#39;s guide for Big O notation</title>
    <link href="https://blog.morizyun.com/blog/computer-sience-big-o-notation-beginner-guide/"/>
    <id>https://blog.morizyun.com/blog/computer-sience-big-o-notation-beginner-guide/</id>
    <published>2018-01-06T05:00:00.000Z</published>
    <updated>2018-01-06T11:00:14.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong>Big O notation</strong> describes the performance or complexity of an algorithm. It shows the worst-case scenario and the execution time required or the storage space used by an algorithm too.</p><p>Hopefully, this article will help you understand the basic of Big O notation with JavaScript sample code.</p><h2 id="O-1"><a href="#O-1" class="headerlink" title="O(1)"></a><code>O(1)</code></h2><p><code>O(1)</code> shows the execution time(or space) of an algorithm is always same regardless of the size of the input data set.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">isFirstElementNull</span>(<span class="params">elements</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> elements[<span class="number">0</span>] === <span class="literal">null</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="O-N"><a href="#O-N" class="headerlink" title="O(N)"></a><code>O(N)</code></h2><p><code>O(N)</code> illustrates an algorithm’s performance will grow linearly and in direct proportion to the size of the input data set. The example is as follows:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">findValue</span>(<span class="params">elements, expect</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> e <span class="keyword">of</span> elements) &#123;</span><br><span class="line">    <span class="keyword">if</span> (e === expect) &#123; <span class="keyword">return</span> <span class="literal">true</span>; &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>In Big O notation, we should always assume the upper limit where the algorithm will perform the maximum number of iterations. So, in that case, the worst case is <code>return false</code> after finishing the loop.</p><h2 id="O-N-2"><a href="#O-N-2" class="headerlink" title="O(N**2)"></a><code>O(N**2)</code></h2><p><code>O(N**2)</code>(N squared) describes an algorithm whose performance is directly proportional to the square of the size of the input data set. This is common with algorithms that involve nested iterations. O Notation of deeper nested iteration will be <code>O(N**3)</code>, <code>O(N**4)</code> or etc.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">hasDuplicatedValue</span>(<span class="params">elements</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> outerIndex = <span class="number">0</span>; outerIndex &lt; elements.length; outerIndex++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> innerIndex = <span class="number">0</span>; innerIndex &lt; elements.length; innerIndex++) &#123;</span><br><span class="line">      <span class="keyword">if</span> (outerIndex !== innerIndex &amp;&amp; elements[outerIndex] === elements[innerIndex]) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="O-2-N"><a href="#O-2-N" class="headerlink" title="O(2**N)"></a><code>O(2**N)</code></h2><p><code>O(2**N)</code> represents an algorithm whose growth doubles with each addition to the input data set and it’s exponential.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">fibonacci</span>(<span class="params">number</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (number &lt;= <span class="number">1</span>) <span class="keyword">return</span> number;</span><br><span class="line">  <span class="keyword">return</span> fibonacci(number - <span class="number">2</span>) + fibonacci(number - <span class="number">1</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="O-log-N"><a href="#O-log-N" class="headerlink" title="O(log N)"></a><code>O(log N)</code></h2><p>Big O notation of <strong><a href="https://en.wikipedia.org/wiki/Binary_search_algorithm" target="_blank" rel="noopener">Binary search</a></strong> like following example is <code>O(log N)</code>.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">binarySearch</span>(<span class="params">elements, expect</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">let</span> firstIndex = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">let</span> lastIndex = elements.length - <span class="number">1</span>;</span><br><span class="line">  <span class="keyword">let</span> middleIndex = <span class="built_in">Math</span>.floor((lastIndex + firstIndex)/<span class="number">2</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">while</span>(elements[middleIndex] !== expect &amp;&amp; firstIndex &lt; lastIndex) &#123;</span><br><span class="line">    <span class="keyword">if</span> (expect &lt; elements[middleIndex]) &#123;</span><br><span class="line">      lastIndex = middleIndex - <span class="number">1</span>;</span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (expect &gt; elements[middleIndex]) &#123;</span><br><span class="line">      firstIndex = middleIndex + <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    middleIndex = <span class="built_in">Math</span>.floor((lastIndex + firstIndex)/<span class="number">2</span>);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> (elements[middleIndex] === expect) ? middleIndex : <span class="number">-1</span> ;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> elements = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>];</span><br><span class="line"><span class="built_in">console</span>.log(binarySearch(elements, <span class="number">5</span>)); <span class="comment">// =&gt; 4</span></span><br><span class="line"><span class="built_in">console</span>.log(binarySearch(elements, <span class="number">10</span>)); <span class="comment">// =&gt; -1</span></span><br></pre></td></tr></table></figure><p><code>O(log N)</code> algorithm like the binary search denotes produces a growth curve that peaks at the beginning and slowly flattens out as the size of the data sets increase. This makes algorithms extremely efficient when processing with large data sets.</p><h2 id="Special-Thanks"><a href="#Special-Thanks" class="headerlink" title="Special Thanks"></a>Special Thanks</h2><p>I wrote this article referencing <strong><a href="https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/" target="_blank" rel="noopener">A beginner’s guide to Big O notation - Rob Bell</a></strong>.</p><p>In addition, I could understand it with the following articles:</p><ul><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of" target="_blank" rel="noopener">for…of - JavaScript</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;strong&gt;Big O notation&lt;/strong&gt; describes the performance or complexity of an algorithm. It shows the worst-case scenario and the executi
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title></title>
    <link href="https://blog.morizyun.com/blog/javascript-node-js-security-tips/"/>
    <id>https://blog.morizyun.com/blog/javascript-node-js-security-tips/</id>
    <published>2018-01-02T05:00:00.000Z</published>
    <updated>2018-10-06T09:08:50.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="title-“Security-Tips-for-Node-js”"><a href="#title-“Security-Tips-for-Node-js”" class="headerlink" title="title: “Security Tips for Node.js”"></a>title: “Security Tips for Node.js”</h2><p>In this post, I will share some points that you should keep in mind in coding.</p><h2 id="No-eval"><a href="#No-eval" class="headerlink" title="No eval"></a>No <code>eval</code></h2><p>If <code>eval</code> get user input, it can open up your code for injection attacks and it is slow as it will run the interpreter/compiler.</p><h2 id="Declare-use-strict"><a href="#Declare-use-strict" class="headerlink" title="Declare use strict"></a>Declare <code>use strict</code></h2><p>To invoke strict mode, write <code>use strict;</code> statement before any other statements;</p><p>You can opt-in to use a restricted variant and eliminate (Undeletable properties, Object literals must be unique, etc)</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="meta">"use strict"</span>;</span><br><span class="line"><span class="comment">// do something</span></span><br></pre></td></tr></table></figure><h2 id="No-sudo-node-app-js"><a href="#No-sudo-node-app-js" class="headerlink" title="No sudo node app.js"></a>No <code>sudo node app.js</code></h2><p>Your process can bring down the entire system, as it will have a credential to do anything if you use <code>sodo node app.js</code>. Please set up an HTTP proxy/server (Nginx, Apache) to forward a request.</p><h2 id="Avoid-command-injection"><a href="#Avoid-command-injection" class="headerlink" title="Avoid command injection"></a>Avoid command injection</h2><p>Fo example, <code>child_process.exec</code> makes a call to execute <code>/bin/sh</code>.</p><h2 id="Pay-attention-tmpfile"><a href="#Pay-attention-tmpfile" class="headerlink" title="Pay attention tmpfile"></a>Pay attention <code>tmpfile</code></h2><p>Please pay extra attention to <code>tmpfile</code>, like handling uploading files. These files can easily eat up all your disk space.</p><h2 id="Use-HttpOnly-cookie"><a href="#Use-HttpOnly-cookie" class="headerlink" title="Use HttpOnly cookie"></a>Use <code>HttpOnly</code> cookie</h2><p>By default, cookies can be read by JS on your same domain. This mean is dangerous in case of Cross-Site Scripting &amp; any third-party JS library can read them. So, you should set <code>HttpOnly</code> flag on a cookie.</p><h2 id="Use-helmet-in-Express"><a href="#Use-helmet-in-Express" class="headerlink" title="Use helmet in Express"></a>Use helmet in Express</h2><p><strong><a href="https://github.com/helmetjs/helmet" target="_blank" rel="noopener">helmetjs/helmet</a></strong> help secure Expres apps with various HTTP header, for example CSP, crossdomain, xframe, xssfilter and much more.</p><h2 id="Prevent-Cross-Site-Request-forgery"><a href="#Prevent-Cross-Site-Request-forgery" class="headerlink" title="Prevent Cross-Site Request forgery"></a>Prevent Cross-Site Request forgery</h2><p>Example is as follows:</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">body</span> <span class="attr">onload</span>=<span class="string">"document.form[0].submit()"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">form</span> <span class="attr">method</span>=<span class="string">"POST"</span> <span class="attr">action</span>=<span class="string">"http://example.com/user/delete"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">name</span>=<span class="string">"id"</span> <span class="attr">value</span>=<span class="string">"12345"</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br></pre></td></tr></table></figure><p>The above snippet can easily delete your user profile.</p><p>To prevent CSRF, you should add CSRF token to your form.(Express or other famous Node.js framework support the token.)</p><ol><li>When a GET request is being served check for the CSRF token and adding a hidden input with the CSRF token</li><li>When the form is submitted, make sure that the value of the form and from the session are a match</li></ol><p>There is some greate middlewares in Express and Koa, like them:</p><ul><li>Express: <strong><a href="https://github.com/expressjs/csurf" target="_blank" rel="noopener">csurf</a></strong></li><li>Koa: <strong><a href="https://github.com/koajs/csrf" target="_blank" rel="noopener">Koa CSRF</a></strong></li></ul><h2 id="Brute-Force-protection"><a href="#Brute-Force-protection" class="headerlink" title="Brute Force protection"></a>Brute Force protection</h2><p>To protect your apps from a brute force attacks, you have to implement some kind of rate-limiting. Both Express and Koa has great middlewares for it.</p><ul><li>Express: <strong><a href="https://github.com/nfriedly/express-rate-limit" target="_blank" rel="noopener">Express Rate Limit</a></strong></li><li>Koa: <strong><a href="https://github.com/koajs/ratelimit" target="_blank" rel="noopener">koa-ratelimit</a></strong></li></ul><h2 id="Cookie-Management"><a href="#Cookie-Management" class="headerlink" title="Cookie Management"></a>Cookie Management</h2><p>In Express, you can easily create a cookie using <strong><a href="https://github.com/expressjs/cookie-session" target="_blank" rel="noopener">expressjs/cookie-session</a></strong> or some other middlewares. These libraries prevent Cookie security risks.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> cookieSession = <span class="built_in">require</span>(<span class="string">"cookie-session"</span>);</span><br><span class="line"><span class="keyword">var</span> express = <span class="built_in">require</span>(<span class="string">"express"</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> app = express();</span><br><span class="line"></span><br><span class="line">app.use(</span><br><span class="line">  cookieSession(&#123;</span><br><span class="line">    name: <span class="string">"session"</span>,</span><br><span class="line">    keys: [</span><br><span class="line">      <span class="comment">/* secret keys */</span></span><br><span class="line">    ],</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Cookie Options</span></span><br><span class="line">    maxAge: <span class="number">24</span> * <span class="number">60</span> * <span class="number">60</span> * <span class="number">1000</span> <span class="comment">// 24 hours</span></span><br><span class="line">  &#125;)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="Protect-by-SQL-injection"><a href="#Protect-by-SQL-injection" class="headerlink" title="Protect by SQL injection"></a>Protect by SQL injection</h2><p>To avoid the injection, you probably use the following modules:</p><ul><li>PostgreSQL: <strong><a href="https://github.com/brianc/node-postgres" target="_blank" rel="noopener">node-postgres</a></strong></li><li>MySQL: <strong><a href="https://github.com/mysqljs/mysql" target="_blank" rel="noopener">mysql</a></strong></li></ul><h2 id="The-Node-Security-Project"><a href="#The-Node-Security-Project" class="headerlink" title="The Node Security Project"></a>The Node Security Project</h2><p><strong><a href="https://github.com/nodesecurity/nsp" target="_blank" rel="noopener">Node Security Project</a></strong> is a great tool that can check your used modules for know vulnerabilities. The tool adds security checks right into your GitHub pull request flow.</p><p><strong><a href="https://snyk.io/" target="_blank" rel="noopener">Snyk</a></strong> is sililar to the Node Security Project, so please check it too.</p><h2 id="Use-Retire-js"><a href="#Use-Retire-js" class="headerlink" title="Use Retire.js"></a>Use Retire.js</h2><p>The goad of <strong><a href="https://retirejs.github.io/retire.js/" target="_blank" rel="noopener">Retire.js</a></strong> is to help deletet use of version with known vulnerabilities.</p><h2 id="Special-Thanks"><a href="#Special-Thanks" class="headerlink" title="Special Thanks"></a>Special Thanks</h2><ul><li><a href="https://blog.risingstack.com/node-js-security-tips/" target="_blank" rel="noopener">https://blog.risingstack.com/node-js-security-tips/</a></li><li><a href="https://blog.risingstack.com/node-js-security-checklist/" target="_blank" rel="noopener">https://blog.risingstack.com/node-js-security-checklist/</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;title-“Security-Tips-for-Node-js”&quot;&gt;&lt;a href=&quot;#title-“Security-Tips-for-Node-js”&quot; class=&quot;headerlink&quot; title=&quot;title: “Security Tips for 
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Helpful Tips for React.js</title>
    <link href="https://blog.morizyun.com/blog/javascript-react-helpful-tips/"/>
    <id>https://blog.morizyun.com/blog/javascript-react-helpful-tips/</id>
    <published>2017-12-23T05:00:00.000Z</published>
    <updated>2018-09-23T04:02:27.000Z</updated>
    
    <content type="html"><![CDATA[<p>In this article, I will introduce helpful tips to improve React development efficiency.</p><h2 id="Remove-bind-this"><a href="#Remove-bind-this" class="headerlink" title="Remove .bind(this)"></a>Remove <code>.bind(this)</code></h2><p>We can lose <code>.bind(this)</code> by using arrow function.</p><figure class="highlight typescript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> React, &#123; Component &#125; <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> Button <span class="keyword">extends</span> Component &#123;</span><br><span class="line">  state = &#123; toggle: <span class="literal">false</span> &#125;;</span><br><span class="line"></span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">const</span> toggle = <span class="keyword">this</span>.state.toggle;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;div&gt;</span><br><span class="line">        &lt;button onClick=&#123;<span class="keyword">this</span>.toggleButton&#125;&gt;&#123;toggle ? <span class="string">"ON"</span> : <span class="string">"OFF"</span>&#125;&lt;<span class="regexp">/button&gt;</span></span><br><span class="line"><span class="regexp">      &lt;/</span>div&gt;</span><br><span class="line">    );</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  toggleButton = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">this</span>.setState(<span class="function"><span class="params">prevState</span> =&gt;</span> (&#123; toggle: !prevState.toggle &#125;));</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Stateless-functional-components"><a href="#Stateless-functional-components" class="headerlink" title="Stateless functional components"></a>Stateless functional components</h2><p>We should use “Stateless functional components”, if it is possible.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// Bad</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">App</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  componentDidMount() &#123;</span><br><span class="line">    <span class="built_in">console</span>.log(<span class="string">'Called componentDidMount'</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">div</span>&gt;</span>Hello World<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Good</span></span><br><span class="line"><span class="keyword">import</span> &#123; compose, lifecycle, pure &#125; <span class="keyword">from</span> <span class="string">'recompose'</span></span><br><span class="line"></span><br><span class="line">compose(</span><br><span class="line">  lifecycle(&#123;</span><br><span class="line">    componentDidMount() &#123;</span><br><span class="line">      <span class="built_in">console</span>.log(<span class="string">'Called componentDidMount'</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;),</span><br><span class="line">  pure</span><br><span class="line">&#125;)(<span class="function"><span class="keyword">function</span> <span class="title">App</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">div</span>&gt;</span>Hello World<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span>;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p><strong>HOC + Functional Stateless Component</strong> is a good solution in stateless functional components.</p><h2 id="Separate-components-by-responsibilities"><a href="#Separate-components-by-responsibilities" class="headerlink" title="Separate components by responsibilities"></a>Separate components by responsibilities</h2><p>According to responsibilities, we should separate React components.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// Bad</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Layout</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  renderHeader() &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">header</span> /&gt;</span>;</span></span><br><span class="line"><span class="xml">  &#125;  </span></span><br><span class="line"><span class="xml">  render() &#123;</span></span><br><span class="line"><span class="xml">    return (</span></span><br><span class="line">      &lt;div&gt;</span><br><span class="line">        &#123;this.renderHeader()&#125;</span><br><span class="line">        &#123;this.props.children&#125;</span><br><span class="line"><span class="xml">      <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="xml">    );</span></span><br><span class="line"><span class="xml">  &#125;</span></span><br><span class="line"><span class="xml">&#125;</span></span><br><span class="line"><span class="xml"></span></span><br><span class="line"><span class="xml">// Good</span></span><br><span class="line"><span class="xml">function Header() &#123;</span></span><br><span class="line"><span class="xml">  return <span class="tag">&lt;<span class="name">header</span> /&gt;</span>;</span></span><br><span class="line"><span class="xml">&#125;</span></span><br><span class="line"><span class="xml"></span></span><br><span class="line"><span class="xml">function Layout(children) &#123;</span></span><br><span class="line"><span class="xml">  return (</span></span><br><span class="line">    &lt;div&gt;</span><br><span class="line">      &lt;Header /&gt;</span><br><span class="line">      &#123;children&#125;</span><br><span class="line"><span class="xml">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="xml">  )</span></span><br><span class="line"><span class="xml">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="Use-object-rest-spread"><a href="#Use-object-rest-spread" class="headerlink" title="Use object-rest-spread"></a>Use object-rest-spread</h2><p>Let’s use <strong><a href="https://github.com/tc39/proposal-object-rest-spread" target="_blank" rel="noopener">object-rest-spread</a></strong> to update difference ditection in React state.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// object-rest-spread</span></span><br><span class="line"><span class="keyword">let</span> n = &#123; x, y, ...z &#125;;</span><br><span class="line">n; <span class="comment">// &#123; x: 1, y: 2, a: 3, b: 4 &#125;</span></span><br></pre></td></tr></table></figure><h2 id="Follow-Flux-Standard-Action"><a href="#Follow-Flux-Standard-Action" class="headerlink" title="Follow Flux Standard Action"></a>Follow Flux Standard Action</h2><p><strong><a href="https://github.com/acdlite/flux-standard-action" target="_blank" rel="noopener">Flux Standard Action</a></strong> is a human-friendly standard for Flux action objects.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// Good</span></span><br><span class="line">&#123;</span><br><span class="line">  type: <span class="string">'ADD_TODO'</span>,</span><br><span class="line">  payload: &#123;</span><br><span class="line">    text: <span class="string">'Do something.'</span>  </span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Bad</span></span><br><span class="line">&#123;</span><br><span class="line">  type: <span class="string">'ADD_TODO'</span>,</span><br><span class="line">  text: <span class="string">'Do something.'</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Duplicated-lifecycle-methods"><a href="#Duplicated-lifecycle-methods" class="headerlink" title="Duplicated lifecycle methods"></a>Duplicated lifecycle methods</h2><p>Please be careful the following methods. In the feature, them will be un-usable. It is useful command: <strong><a href="https://github.com/reactjs/react-codemod#rename-unsafe-lifecycles" target="_blank" rel="noopener">reactjs/react-codemod</a></strong>.</p><ul><li><code>componentWillMount</code></li><li><code>componentWillReceiveProps</code></li><li><code>componentWillUpdate</code></li></ul><h2 id="Special-Thanks"><a href="#Special-Thanks" class="headerlink" title="Special Thanks"></a>Special Thanks</h2><ul><li><a href="https://qiita.com/mizchi/items/bcb1aef8d1f14f8d0b4a" target="_blank" rel="noopener">https://qiita.com/mizchi/items/bcb1aef8d1f14f8d0b4a</a></li><li><a href="https://github.com/tc39/proposal-object-rest-spread" target="_blank" rel="noopener">https://github.com/tc39/proposal-object-rest-spread</a></li><li><a href="https://github.com/acdlite/flux-standard-action" target="_blank" rel="noopener">https://github.com/acdlite/flux-standard-action</a></li><li><a href="https://medium.com/@nikolalsvk/loosing-bind-this-in-react-8637ebf372cf" target="_blank" rel="noopener">https://medium.com/@nikolalsvk/loosing-bind-this-in-react-8637ebf372cf</a></li><li><a href="https://reactjs.org/docs/react-component.html" target="_blank" rel="noopener">https://reactjs.org/docs/react-component.html</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;In this article, I will introduce helpful tips to improve React development efficiency.&lt;/p&gt;
&lt;h2 id=&quot;Remove-bind-this&quot;&gt;&lt;a href=&quot;#Remove-bi
      
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Scraping by using CasperJS[JavaScript]</title>
    <link href="https://blog.morizyun.com/blog/casper-js-scraping-headless-browser/"/>
    <id>https://blog.morizyun.com/blog/casper-js-scraping-headless-browser/</id>
    <published>2017-01-08T05:00:00.000Z</published>
    <updated>2017-12-16T02:34:32.000Z</updated>
    
    <content type="html"><![CDATA[<p>It is a tips that you can use when you want to scrape a page using JavaScript.<br>Since <strong><a href="http://casperjs.org/" target="_blank" rel="noopener">CasperJS</a></strong> can be instaled easily by <code>npm</code>, it is recomended to use in sever side.</p><a id="more"></a><h2 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h2><p>Installation command for CasperJS is as follows:</p><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">npm install casperjs -g</span><br></pre></td></tr></table></figure><h2 id="Source-Code"><a href="#Source-Code" class="headerlink" title="Source Code"></a>Source Code</h2><p>The following code is a a script to scrape web page by using CasperJS.<br>In this case, I tried to be able to scpecify URL to scrape and a destination to save scraped HTML.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// scrape.js</span></span><br><span class="line"><span class="keyword">var</span> casper = <span class="built_in">require</span>(<span class="string">'casper'</span>).create();</span><br><span class="line">casper.userAgent(<span class="string">'Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> url = casper.cli.args[<span class="number">0</span>];</span><br><span class="line"><span class="keyword">var</span> outputPath = casper.cli.args[<span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">casper.start(url);</span><br><span class="line"></span><br><span class="line">casper.then(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">  casper.wait(<span class="number">5000</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="comment">// Get HTML</span></span><br><span class="line">    <span class="keyword">var</span> html = <span class="keyword">this</span>.evaluate(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">      <span class="keyword">return</span> <span class="built_in">document</span>.querySelector(<span class="string">"html"</span>).outerHTML;</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Save HTML</span></span><br><span class="line">    fs = <span class="built_in">require</span>(<span class="string">'fs'</span>);</span><br><span class="line">    fs.write(outputPath, html, <span class="string">'w'</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">casper.run();</span><br></pre></td></tr></table></figure><p>After that, if you run the command below, HTML of your target URL will be saved.</p><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">casperjs scrape.js https://google.com /tmp/html.txt --ssl-protocol=TLSv1</span><br></pre></td></tr></table></figure><p>Happy Hacking!</p><h2 id="Special-Thanks"><a href="#Special-Thanks" class="headerlink" title="Special Thanks"></a>Special Thanks</h2><ul><li><a href="http://takun71.hatenablog.com/entry/2014/10/15/154336" target="_blank" rel="noopener">http://takun71.hatenabl…</a></li><li><a href="https://github.com/PharaohKJ/scrape_5374/blob/master/mnt/capture-5374.js" target="_blank" rel="noopener">scrape_5374/capture-5374.js at master · PharaohKJ/scrape_5374</a></li><li><a href="http://docs.casperjs.org/en/latest/cli.html" target="_blank" rel="noopener">Using the command line — CasperJS 1.1.0-DEV documentation</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;It is a tips that you can use when you want to scrape a page using JavaScript.&lt;br&gt;Since &lt;strong&gt;&lt;a href=&quot;http://casperjs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CasperJS&lt;/a&gt;&lt;/strong&gt; can be instaled easily by &lt;code&gt;npm&lt;/code&gt;, it is recomended to use in sever side.&lt;/p&gt;
    
    </summary>
    
      <category term="Javascript" scheme="https://blog.morizyun.com/categories/Javascript/"/>
    
    
      <category term="JavaScript" scheme="https://blog.morizyun.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>PostgreSQL Tips [Data Size per Table, Reindex, NULLSLAST]</title>
    <link href="https://blog.morizyun.com/blog/postgresql-reindex-null-last/"/>
    <id>https://blog.morizyun.com/blog/postgresql-reindex-null-last/</id>
    <published>2017-01-07T05:00:00.000Z</published>
    <updated>2017-12-16T02:34:32.000Z</updated>
    
    <content type="html"><![CDATA[<p>While using PosgreSQL, this is my note which I learned.</p><ul><li>Show data size per table/index in PostgreSQL</li><li>REINDEX command</li><li>Control sort with NULL</li></ul><a id="more"></a><h2 id="Show-data-size-per-table-index-in-PostgreSQL"><a href="#Show-data-size-per-table-index-in-PostgreSQL" class="headerlink" title="Show data size per table/index in PostgreSQL"></a>Show data size per table/index in PostgreSQL</h2><p>While using PostgreSQL DB, sometimes you may want to know which table/index is using capacity.</p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> pgn.nspname, relname, pg_size_pretty(relpages::<span class="built_in">bigint</span> * <span class="number">8</span> * <span class="number">1024</span>) <span class="keyword">AS</span> <span class="keyword">size</span>, <span class="keyword">CASE</span> <span class="keyword">WHEN</span> relkind =</span><br><span class="line"><span class="string">'t'</span> <span class="keyword">THEN</span> (<span class="keyword">SELECT</span> pgd.relname <span class="keyword">FROM</span> pg_class pgd <span class="keyword">WHERE</span> pgd.reltoastrelid = pg.oid) <span class="keyword">WHEN</span> nspname =</span><br><span class="line"><span class="string">'pg_toast'</span> <span class="keyword">AND</span> relkind = <span class="string">'i'</span> <span class="keyword">THEN</span> (<span class="keyword">SELECT</span> pgt.relname <span class="keyword">FROM</span> pg_class pgt <span class="keyword">WHERE</span> <span class="keyword">SUBSTRING</span>(pgt.relname</span><br><span class="line"><span class="keyword">FROM</span> <span class="number">10</span>) = <span class="keyword">REPLACE</span>(<span class="keyword">SUBSTRING</span>(pg.relname <span class="keyword">FROM</span> <span class="number">10</span>), <span class="string">'_index'</span>, <span class="string">''</span>)) <span class="keyword">ELSE</span> (<span class="keyword">SELECT</span> pgc.relname <span class="keyword">FROM</span></span><br><span class="line">pg_class pgc <span class="keyword">WHERE</span> pg.reltoastrelid = pgc.oid) <span class="keyword">END</span>::<span class="built_in">varchar</span> <span class="keyword">AS</span> refrelname, <span class="keyword">CASE</span> <span class="keyword">WHEN</span> nspname =</span><br><span class="line"><span class="string">'pg_toast'</span> <span class="keyword">AND</span> relkind = <span class="string">'i'</span> <span class="keyword">THEN</span> (<span class="keyword">SELECT</span> pgts.relname <span class="keyword">FROM</span> pg_class pgts <span class="keyword">WHERE</span> pgts.reltoastrelid =</span><br><span class="line">(<span class="keyword">SELECT</span> pgt.oid <span class="keyword">FROM</span> pg_class pgt <span class="keyword">WHERE</span> <span class="keyword">SUBSTRING</span>(pgt.relname <span class="keyword">FROM</span> <span class="number">10</span>) = <span class="keyword">REPLACE</span>(<span class="keyword">SUBSTRING</span>(pg.relname</span><br><span class="line"><span class="keyword">FROM</span> <span class="number">10</span>), <span class="string">'_index'</span>, <span class="string">''</span>))) <span class="keyword">END</span> <span class="keyword">AS</span> relidxrefrelname, relfilenode, relkind, reltuples::<span class="built_in">bigint</span>, relpages</span><br><span class="line"><span class="keyword">FROM</span> pg_class pg, pg_namespace pgn <span class="keyword">WHERE</span> pg.relnamespace = pgn.oid <span class="keyword">AND</span> pgn.nspname <span class="keyword">NOT</span> <span class="keyword">IN</span></span><br><span class="line">(<span class="string">'information_schema'</span>, <span class="string">'pg_catalog'</span>) <span class="keyword">ORDER</span> <span class="keyword">BY</span> relpages <span class="keyword">DESC</span>;</span><br><span class="line"></span><br><span class="line"> nspname  |                     relname                     |    size    |       refrelname        |    relidxrefrelname     | relfilenode | relkind | reltuples | relpages</span><br><span class="line"><span class="comment">----------+-------------------------------------------------+------------+-------------------------+-------------------------+-------------+---------+-----------+----------</span></span><br><span class="line"> pg_toast | pg_toast_246538                                 | 1648 kB    | scrape_items            |                         |      246543 | t       |        51 |      206</span><br><span class="line"> pg_toast | pg_toast_2618                                   | 376 kB     | pg_rewrite              |                         |        2838 | t       |       206 |       47</span><br><span class="line"> pg_toast | pg_toast_246538_index                           | 56 kB      | pg_toast_246538         | scrape_items            |      246545 | i       |        79 |        7</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>Source of the above SQL is here:</p><p><strong><a href="https://wiki.postgresql.org/images/a/ab/Pganalyze_Lightning_talk.pdf" target="_blank" rel="noopener">Monitoring Postgres</a></strong></p><h2 id="REINDEX"><a href="#REINDEX" class="headerlink" title="REINDEX"></a>REINDEX</h2><p>PostgreSQL seems to have unnecessary data remaining index unless you delete record well.<br>If there is such kind of data, it is better to run <code>REINDEX</code> command, like this:</p><figure class="highlight"><table><tr><td class="code"><pre><span class="line">REINDEX &#123; INDEX | TABLE | DATABASE | SYSTEM &#125; name [ FORCE ]</span><br></pre></td></tr></table></figure><h2 id="Excellent-tool-pg-repack"><a href="#Excellent-tool-pg-repack" class="headerlink" title="Excellent tool pg_repack"></a>Excellent tool pg_repack</h2><p>It would be nice to use <code>pg_repack</code> which rebuilding a bloated table / index and rearranging records order to a specified index.<br>It can run online because it does not keep locking.</p><p><a href="http://qiita.com/bwtakacy/items/3be7a3e1540ccef7c9e3" target="_blank" rel="noopener">http://qiita.com/bwtakac…</a></p><h2 id="Control-a-position-of-NULL-in-sort-order"><a href="#Control-a-position-of-NULL-in-sort-order" class="headerlink" title="Control a position of NULL in sort order"></a>Control a position of NULL in sort order</h2><p>Control a position of NULL in sort order:</p><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">ORDER BY some_time DESC NULLS LAST</span><br></pre></td></tr></table></figure><p>By the way, the default of PostgreSQL is <code>NULLS FAST</code></p><p><a href="http://qiita.com/hanoopy/items/03f62de8b15bea195208" target="_blank" rel="noopener">http://qiita.com/hanoop…</a></p><p>Happy Hacking!</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;While using PosgreSQL, this is my note which I learned.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show data size per table/index in PostgreSQL&lt;/li&gt;
&lt;li&gt;REINDEX command&lt;/li&gt;
&lt;li&gt;Control sort with NULL&lt;/li&gt;
&lt;/ul&gt;
    
    </summary>
    
      <category term="Postgresql" scheme="https://blog.morizyun.com/categories/Postgresql/"/>
    
    
      <category term="PostgreSQL" scheme="https://blog.morizyun.com/tags/PostgreSQL/"/>
    
  </entry>
  
  <entry>
    <title>ESLint with React.js &amp; ES6+</title>
    <link href="https://blog.morizyun.com/blog/eslint-react-js-es6-plus/"/>
    <id>https://blog.morizyun.com/blog/eslint-react-js-es6-plus/</id>
    <published>2017-01-03T05:00:00.000Z</published>
    <updated>2017-12-16T02:34:32.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="http://www.amazon.com/gp/product/B019HRGOPQ/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=B019HRGOPQ&linkCode=as2&tag=morizyun00-22" target="_blank" rel="noopener"><img border="0" src="http://ws.assoc-amazon.jp/widgets/q?_encoding=UTF8&ASIN=B019HRGOPQ&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=morizyun00-22" width="150" style="float: left; margin: 0 20px 20px 0;"></a><img src="http://www.assoc-amazon.jp/e/ir?t=morizyun00-22&l=as2&o=9&a=B019HRGOPQ" width="1" height="1" border="0" alt style="border:none !important; margin:0px !important;">ESLint is a static lint tool for JavaScript. Before running your code, the tool find obvious bug.<br>In addtion, it helps to unify your code styles such as how to use parentheses and spaces, etc.<br>In this article, I will explain the ESLint configuration for checking React.js written with ES6+.</p><a id="more"></a><h2 id="Style-Guide"><a href="#Style-Guide" class="headerlink" title="Style Guide"></a>Style Guide</h2><p>Aribnb’s style guide is really great and easy to understand. ESLint also check your code based on the style guide.</p><ul><li>JavaScript: <strong><a href="https://github.com/airbnb/javascript/tree/master/react" target="_blank" rel="noopener">airbnb/javascript</a></strong></li><li>React.js: <strong><a href="https://github.com/airbnb/javascript/tree/master/react" target="_blank" rel="noopener">airbnb/javascript/react</a></strong></li></ul><h2 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h2><p>Install following libraries:</p><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">npm install --save-dev eslint babel-eslint eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react</span><br></pre></td></tr></table></figure><h2 id="Configuration"><a href="#Configuration" class="headerlink" title="Configuration"></a>Configuration</h2><p>ESLint configuration is as follows:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// .eslint.json</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="string">"extends"</span>: <span class="string">"airbnb"</span>,</span><br><span class="line">  <span class="string">"parser"</span>: <span class="string">"babel-eslint"</span>,</span><br><span class="line">  <span class="string">"env"</span>: &#123;</span><br><span class="line">    <span class="string">"browser"</span>: <span class="literal">true</span></span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="string">"ecmaFeatures"</span>: &#123;</span><br><span class="line">    <span class="string">"classes"</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="string">"jsx"</span>: <span class="literal">true</span></span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="string">"plugins"</span>: [</span><br><span class="line">    <span class="string">"react"</span>,</span><br><span class="line">    <span class="string">"jsx-a11y"</span>,</span><br><span class="line">    <span class="string">"import"</span></span><br><span class="line">  ],</span><br><span class="line">  <span class="string">"extends"</span>: [<span class="string">"eslint"</span>, <span class="string">"eslint:recommended"</span>, <span class="string">"plugin:react/recommended"</span>],</span><br><span class="line">  <span class="string">"parserOptions"</span>: &#123;</span><br><span class="line">    <span class="string">"ecmaVersion"</span>: <span class="number">7</span>,</span><br><span class="line">    <span class="string">"sourceType"</span>: <span class="string">"module"</span>,</span><br><span class="line">    <span class="string">"ecmaFeatures"</span>: &#123;</span><br><span class="line">      <span class="string">"jsx"</span>: <span class="literal">true</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="string">"rules"</span>: &#123;</span><br><span class="line">    <span class="string">"arrow-body-style"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"arrow-parens"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"arrow-spacing"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"eqeqeq"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"generator-star-spacing"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"no-duplicate-imports"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"no-eq-null"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"no-undefined"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"no-useless-computed-key"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"no-useless-constructor"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"no-useless-rename"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"no-var"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"object-shorthand"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"prefer-arrow-callback"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"prefer-const"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"prefer-rest-params"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"prefer-spread"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"prefer-template"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"rest-spread-spacing"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"semi"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"template-curly-spacing"</span>: <span class="string">"error"</span>,</span><br><span class="line">    <span class="string">"yield-star-spacing"</span>: <span class="string">"error"</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Please see moore detail <strong><a href="http://eslint.org/docs/user-guide/configuring" target="_blank" rel="noopener">Configuring ESLint</a></strong>.</p><h2 id="Usage-in-Command-Line"><a href="#Usage-in-Command-Line" class="headerlink" title="Usage in Command Line"></a>Usage in Command Line</h2><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">./node_modules/bin/eslint sample.js</span><br></pre></td></tr></table></figure><h2 id="Usage-in-overcommit"><a href="#Usage-in-overcommit" class="headerlink" title="Usage in overcommit"></a>Usage in overcommit</h2><p><a href="https://github.com/brigade/overcommit" target="_blank" rel="noopener">overcommit</a> is a git hook management tool which can execute various command before git commit, push or etc.<br>The following configuration is how to use ESLint with overcommit.</p><p>At first, overcommit configuration like this:</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># .overcommit.yml (Add following comfigugration)</span></span><br><span class="line"><span class="attr">PreCommit:</span></span><br><span class="line">  <span class="comment"># Style Check for JavaScript</span></span><br><span class="line"><span class="attr">  EsLint:</span></span><br><span class="line"><span class="attr">    enabled:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">    command:</span> <span class="string">['./client/node_modules/.bin/eslint',</span> <span class="string">'client/components/*'</span><span class="string">,</span> <span class="string">'-c'</span><span class="string">,</span> <span class="string">'client/.eslintrc.json'</span><span class="string">]</span></span><br><span class="line"><span class="attr">    include:</span> <span class="string">'**/*.jsx'</span></span><br></pre></td></tr></table></figure><p>Ater the configuration, execute <code>bundle exec overcommit --sign</code>, so ESLint will be executed automatically before <code>git push</code>.</p><h2 id="Usage-in-wercker"><a href="#Usage-in-wercker" class="headerlink" title="Usage in wercker"></a>Usage in wercker</h2><p>The configuration of free CI <strong><a href="http://www.wercker.com/" target="_blank" rel="noopener">wercker</a></strong> is as follows:</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">eslint:</span></span><br><span class="line"><span class="attr">  steps:</span></span><br><span class="line"><span class="attr">    - bundle-install:</span></span><br><span class="line"><span class="attr">      jobs:</span> <span class="number">4</span></span><br><span class="line"></span><br><span class="line"><span class="attr">    - install-packages:</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">Install</span> <span class="string">node.js,</span> <span class="string">build-essential,</span> <span class="string">libpq-dev</span></span><br><span class="line"><span class="attr">      packages:</span> <span class="string">build-essential</span> <span class="string">libpq-dev</span> <span class="string">nodejs</span> <span class="string">npm</span> <span class="string">nodejs-legacy</span></span><br><span class="line"></span><br><span class="line"><span class="attr">    - script:</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">NPM</span> <span class="string">install</span></span><br><span class="line"><span class="attr">      code:</span> <span class="string">npm</span> <span class="string">install</span> <span class="bullet">-D</span></span><br><span class="line"></span><br><span class="line"><span class="attr">    - script:</span></span><br><span class="line"><span class="attr">      name:</span> <span class="string">Run</span> <span class="string">ESLint</span></span><br><span class="line"><span class="attr">      code:</span> <span class="string">eslint</span> <span class="string">components/*</span> <span class="bullet">-c</span> <span class="string">.eslintrc.json</span></span><br></pre></td></tr></table></figure><p>Happy Hacking!</p><h2 id="Special-Thanks"><a href="#Special-Thanks" class="headerlink" title="Special Thanks"></a>Special Thanks</h2><ul><li><a href="http://qiita.com/mysticatea/items/f523dab04a25f617c87d" target="_blank" rel="noopener">http://qiita.com/mysticat…</a></li><li><a href="http://qiita.com/tkrkt/items/b3b624ef32e05bd6bf55" target="_blank" rel="noopener">http://qiita.com/tkrkt/i…</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;http://www.amazon.com/gp/product/B019HRGOPQ/ref=as_li_qf_sp_asin_il?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B019HRGOPQ&amp;linkCode=as2&amp;tag=morizyun00-22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://ws.assoc-amazon.jp/widgets/q?_encoding=UTF8&amp;ASIN=B019HRGOPQ&amp;Format=_SL160_&amp;ID=AsinImage&amp;MarketPlace=JP&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=morizyun00-22&quot; width=&quot;150&quot; style=&quot;float: left; margin: 0 20px 20px 0;&quot;&gt;&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.jp/e/ir?t=morizyun00-22&amp;l=as2&amp;o=9&amp;a=B019HRGOPQ&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt style=&quot;border:none !important; margin:0px !important;&quot;&gt;ESLint is a static lint tool for JavaScript. Before running your code, the tool find obvious bug.&lt;br&gt;In addtion, it helps to unify your code styles such as how to use parentheses and spaces, etc.&lt;br&gt;In this article, I will explain the ESLint configuration for checking React.js written with ES6+.&lt;/p&gt;
    
    </summary>
    
      <category term="React.js" scheme="https://blog.morizyun.com/categories/React-js/"/>
    
    
  </entry>
  
  <entry>
    <title>Wonderful react-bootstrap! We can use Bootstrap as a component!</title>
    <link href="https://blog.morizyun.com/blog/react-bootstrap-javascript-css-framework/"/>
    <id>https://blog.morizyun.com/blog/react-bootstrap-javascript-css-framework/</id>
    <published>2017-01-02T05:00:00.000Z</published>
    <updated>2017-12-16T02:34:32.000Z</updated>
    
    <content type="html"><![CDATA[<p><strong><a href="https://react-bootstrap.github.io" target="_blank" rel="noopener">React-Bootstrap</a></strong> is a library that can handle Bootstrap as a component of React.js.<br>By using this you can build code with a sense of combining React.js components, not Bootstrap’s CSS.<br>Also, as a whole your code becomes clearer, maintenance costs are suppressed as well!</p><a id="more"></a><h2 id="Merit"><a href="#Merit" class="headerlink" title="Merit"></a>Merit</h2><ul><li>A Whole code becomes clearer</li><li>We don’t need to remember Bootstrap CSS. We just build by React component.</li><li>When combining JS such as Modal can also be treated as a component</li></ul><h2 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h2><p>The following code is the library istallation command:</p><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">$ npm install react-bootstrap --save</span><br></pre></td></tr></table></figure><h2 id="Load-CSS"><a href="#Load-CSS" class="headerlink" title="Load CSS"></a>Load CSS</h2><p><strong>[React-Bootstrap] (<a href="https://react-bootstrap.github.io" target="_blank" rel="noopener">https://react-bootstrap.github.io</a>)</strong> does not include Bootstrap CSS, so we need to load CSS by yourself.<br>In my opinion, it is better to load CSS yourself because we can use our favorite theme. Also we can manage the CSS by <code>npm</code>.</p><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">&lt;!-- Latest compiled and minified CSS --&gt;</span><br><span class="line">&lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css&quot;&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- Optional theme --&gt;</span><br><span class="line">&lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap-theme.min.css&quot;&gt;</span><br></pre></td></tr></table></figure><h2 id="Usage"><a href="#Usage" class="headerlink" title="Usage"></a>Usage</h2><h3 id="Navigation-Bar"><a href="#Navigation-Bar" class="headerlink" title="Navigation Bar"></a>Navigation Bar</h3><p><img src="/img/2017-01-02-react-bootstrap-javascript-css-framework_1.jpg" width="640" height="56"></p><p>A usual Bootstrap navigation bar will be the following code:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// components/NavigationSample.jsx</span></span><br><span class="line"><span class="keyword">import</span> React <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> NavigationSample <span class="class"><span class="keyword">class</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  render () &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;Grid&gt;</span><br><span class="line">        &lt;Row className=<span class="string">"show-grid"</span>&gt;</span><br><span class="line">          &lt;Col xs=&#123;<span class="number">12</span>&#125; md=&#123;<span class="number">8</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col xs=&#123;12&#125; md=&#123;8&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">          &lt;Col xs=&#123;<span class="number">6</span>&#125; md=&#123;<span class="number">4</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col xs=&#123;6&#125; md=&#123;4&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">        &lt;<span class="regexp">/Row&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &lt;Row className="show-grid"&gt;</span></span><br><span class="line"><span class="regexp">          &lt;Col xs=&#123;6&#125; md=&#123;4&#125;&gt;&lt;code&gt;&amp;lt;&#123;'Col xs=&#123;6&#125; md=&#123;4&#125;'&#125; /</span>&amp;gt;<span class="xml"><span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">          &lt;Col xs=&#123;<span class="number">6</span>&#125; md=&#123;<span class="number">4</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col xs=&#123;6&#125; md=&#123;4&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">          &lt;Col xsHidden md=&#123;<span class="number">4</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col xsHidden md=&#123;4&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">        &lt;<span class="regexp">/Row&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &lt;Row className="show-grid"&gt;</span></span><br><span class="line"><span class="regexp">          &lt;Col xs=&#123;6&#125; xsOffset=&#123;6&#125;&gt;&lt;code&gt;&amp;lt;&#123;'Col xs=&#123;6&#125; xsOffset=&#123;6&#125;'&#125; /</span>&amp;gt;<span class="xml"><span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">        &lt;<span class="regexp">/Row&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &lt;Row className="show-grid"&gt;</span></span><br><span class="line"><span class="regexp">          &lt;Col md=&#123;6&#125; mdPush=&#123;6&#125;&gt;&lt;code&gt;&amp;lt;&#123;'Col md=&#123;6&#125; mdPush=&#123;6&#125;'&#125; /</span>&amp;gt;<span class="xml"><span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">          &lt;Col md=&#123;<span class="number">6</span>&#125; mdPull=&#123;<span class="number">6</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col md=&#123;6&#125; mdPull=&#123;6&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">        &lt;<span class="regexp">/Row&gt;</span></span><br><span class="line"><span class="regexp">      &lt;/</span>Grid&gt;</span><br><span class="line">    );</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="Layout"><a href="#Layout" class="headerlink" title="Layout"></a>Layout</h3><p><img src="/img/2017-01-02-react-bootstrap-javascript-css-framework_2.jpg" width="640" height="182"></p><p>For example, above layout will be following codes:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// components/LayoutSample.jsx</span></span><br><span class="line"><span class="keyword">import</span> React <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> LayoutSample <span class="class"><span class="keyword">class</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  render () &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;Grid&gt;</span><br><span class="line">        &lt;Row className=<span class="string">"show-grid"</span>&gt;</span><br><span class="line">          &lt;Col xs=&#123;<span class="number">12</span>&#125; md=&#123;<span class="number">8</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col xs=&#123;12&#125; md=&#123;8&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">          &lt;Col xs=&#123;<span class="number">6</span>&#125; md=&#123;<span class="number">4</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col xs=&#123;6&#125; md=&#123;4&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">        &lt;<span class="regexp">/Row&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &lt;Row className="show-grid"&gt;</span></span><br><span class="line"><span class="regexp">          &lt;Col xs=&#123;6&#125; md=&#123;4&#125;&gt;&lt;code&gt;&amp;lt;&#123;'Col xs=&#123;6&#125; md=&#123;4&#125;'&#125; /</span>&amp;gt;<span class="xml"><span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">          &lt;Col xs=&#123;<span class="number">6</span>&#125; md=&#123;<span class="number">4</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col xs=&#123;6&#125; md=&#123;4&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">          &lt;Col xsHidden md=&#123;<span class="number">4</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col xsHidden md=&#123;4&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">        &lt;<span class="regexp">/Row&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &lt;Row className="show-grid"&gt;</span></span><br><span class="line"><span class="regexp">          &lt;Col xs=&#123;6&#125; xsOffset=&#123;6&#125;&gt;&lt;code&gt;&amp;lt;&#123;'Col xs=&#123;6&#125; xsOffset=&#123;6&#125;'&#125; /</span>&amp;gt;<span class="xml"><span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">        &lt;<span class="regexp">/Row&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">        &lt;Row className="show-grid"&gt;</span></span><br><span class="line"><span class="regexp">          &lt;Col md=&#123;6&#125; mdPush=&#123;6&#125;&gt;&lt;code&gt;&amp;lt;&#123;'Col md=&#123;6&#125; mdPush=&#123;6&#125;'&#125; /</span>&amp;gt;<span class="xml"><span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">          &lt;Col md=&#123;<span class="number">6</span>&#125; mdPull=&#123;<span class="number">6</span>&#125;&gt;<span class="xml"><span class="tag">&lt;<span class="name">code</span>&gt;</span>&amp;lt;&#123;'Col md=&#123;6&#125; mdPull=&#123;6&#125;'&#125; /&amp;gt;<span class="tag">&lt;/<span class="name">code</span>&gt;</span></span><span class="xml"><span class="tag">&lt;/<span class="name">Col</span>&gt;</span></span></span><br><span class="line">        &lt;<span class="regexp">/Row&gt;</span></span><br><span class="line"><span class="regexp">      &lt;/</span>Grid&gt;</span><br><span class="line">    );</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Correspondence-between-Grid-Row-Col-and-Bootstrap-CSS"><a href="#Correspondence-between-Grid-Row-Col-and-Bootstrap-CSS" class="headerlink" title="Correspondence between Grid, Row Col and Bootstrap CSS"></a>Correspondence between Grid, Row Col and Bootstrap CSS</h2><ul><li><code>&lt;Col xs={12} md={4}&gt;</code> =&gt;    <code>&lt;div class=&quot;col-md-4 col-xs-12&quot;&gt;</code></li><li><code>&lt;Row&gt;</code> =&gt; <code>&lt;div class=&quot;row&quot;&gt;</code></li><li><code>&lt;Grid&gt;</code> =&gt;    <code>&lt;div class=&quot;container&quot;&gt;</code></li><li><code>&lt;Button&gt;</code> =&gt;    <code>&lt;button type=&quot;button&quot; class=&quot;btn&quot;&gt;</code></li></ul><p>Happy Hacking!</p><h2 id="Special-Thanks"><a href="#Special-Thanks" class="headerlink" title="Special Thanks"></a>Special Thanks</h2><ul><li><a href="https://react-bootstrap.github.io" target="_blank" rel="noopener">React-Bootstrap</a></li><li><a href="http://qiita.com/ynunokawa/items/7c60c0db0c000d265554" target="_blank" rel="noopener">http://qiita.com/ynunokaw…</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://react-bootstrap.github.io&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;React-Bootstrap&lt;/a&gt;&lt;/strong&gt; is a library that can handle Bootstrap as a component of React.js.&lt;br&gt;By using this you can build code with a sense of combining React.js components, not Bootstrap’s CSS.&lt;br&gt;Also, as a whole your code becomes clearer, maintenance costs are suppressed as well!&lt;/p&gt;
    
    </summary>
    
      <category term="React.js" scheme="https://blog.morizyun.com/categories/React-js/"/>
    
    
      <category term="javascript" scheme="https://blog.morizyun.com/tags/javascript/"/>
    
      <category term="css" scheme="https://blog.morizyun.com/tags/css/"/>
    
      <category term="react" scheme="https://blog.morizyun.com/tags/react/"/>
    
  </entry>
  
  <entry>
    <title>CSS-Modules with React.js</title>
    <link href="https://blog.morizyun.com/blog/react-js-css-module/"/>
    <id>https://blog.morizyun.com/blog/react-js-css-module/</id>
    <published>2017-01-01T05:00:00.000Z</published>
    <updated>2017-12-16T02:34:32.000Z</updated>
    
    <content type="html"><![CDATA[<p>I would like to introduce <strong><a href="https://github.com/gajus/react-css-modules" target="_blank" rel="noopener">react-css-modules</a></strong> with React.js.<br>CSS-Module is a concept for seamless mapping of class names to CSS modules inside of React components.</p><a id="more"></a><h2 id="Installation"><a href="#Installation" class="headerlink" title="Installation"></a>Installation</h2><p>Install following libraries:</p><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">$ npm init -y</span><br><span class="line">$ npm install --save react react-dom</span><br><span class="line">$ npm install --save-dev webpack style-loader css-loader sass-loader node-sass extract-text-webpack-plugin</span><br><span class="line">$ npm install --save-dev resolve-url resolve-url-loader babel-plugin-transform-decorators-legacy</span><br></pre></td></tr></table></figure><h2 id="Setup-CSS-loader"><a href="#Setup-CSS-loader" class="headerlink" title="Setup CSS loader"></a>Setup CSS loader</h2><p>Add following codes to <code>.babelrc</code>:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line">&#123;</span><br><span class="line">   <span class="string">"plugins"</span>: [<span class="string">"transform-decorators-legacy"</span>]  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Please add following codes in <code>webpack.config.js</code>:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="built_in">module</span>: &#123;</span><br><span class="line">  loaders: [</span><br><span class="line">    &#123;</span><br><span class="line">        test: <span class="regexp">/\.css$/</span>,</span><br><span class="line">        loaders: [</span><br><span class="line">            <span class="string">'style?sourceMap'</span>,</span><br><span class="line">            <span class="string">'css?modules&amp;importLoaders=1&amp;localIdentName=[path]___[name]__[local]___[hash:base64:5]'</span></span><br><span class="line">        ]</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      test: <span class="regexp">/\.scss$/</span>,</span><br><span class="line">      loaders: [</span><br><span class="line">        <span class="string">'style'</span>,</span><br><span class="line">        <span class="string">'css?modules&amp;importLoaders=1&amp;localIdentName=[path]___[name]__[local]___[hash:base64:5]'</span>,</span><br><span class="line">        <span class="string">'resolve-url'</span>,</span><br><span class="line">        <span class="string">'sass'</span></span><br><span class="line">      ]</span><br><span class="line">    &#125;</span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Usage"><a href="#Usage" class="headerlink" title="Usage"></a>Usage</h2><p>In the context of React, CSS Modules look like this:</p><figure class="highlight css"><table><tr><td class="code"><pre><span class="line"><span class="comment">/* css/table-custom-styles.scss */</span></span><br><span class="line"><span class="selector-class">.table</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">400px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.row</span> &#123;</span><br><span class="line">    <span class="attribute">composes</span>: row from <span class="string">'./table.css'</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.cell</span> &#123;</span><br><span class="line">    <span class="attribute">float</span>: left; <span class="attribute">width</span>: <span class="number">154px</span>; <span class="attribute">background</span>: <span class="number">#eee</span>; <span class="attribute">padding</span>: <span class="number">10px</span>; <span class="attribute">margin</span>: <span class="number">10px</span> <span class="number">0</span> <span class="number">10px</span> <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>In ES6 syntax, we can support CSS like this:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// components/Table.jsx</span></span><br><span class="line"><span class="keyword">import</span> React <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"><span class="keyword">import</span> styles <span class="keyword">from</span> <span class="string">'../css/table.css'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="class"><span class="keyword">class</span> <span class="title">Table</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">    render () &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">className</span>=<span class="string">&#123;styles.table&#125;</span>&gt;</span></span></span><br><span class="line">            &lt;div className=&#123;styles.row&#125;&gt;</span><br><span class="line">                &lt;div className=&#123;styles.cell&#125;&gt;A0&lt;/div&gt;</span><br><span class="line">                &lt;div className=&#123;styles.cell&#125;&gt;B0&lt;/div&gt;</span><br><span class="line"><span class="xml">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>ES7 decorators syntax is as follows:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// components/Table.jsx</span></span><br><span class="line"><span class="keyword">import</span> React <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"><span class="keyword">import</span> CSSModules <span class="keyword">from</span> <span class="string">'react-css-modules'</span>;</span><br><span class="line"><span class="keyword">import</span> styles <span class="keyword">from</span> <span class="string">'./table.css'</span>;</span><br><span class="line"></span><br><span class="line">@CSSModules(styles)</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="class"><span class="keyword">class</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">    render () &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">styleName</span>=<span class="string">'table'</span>&gt;</span></span></span><br><span class="line">            &lt;div styleName='row'&gt;</span><br><span class="line">                &lt;div styleName='cell'&gt;A0&lt;/div&gt;</span><br><span class="line">                &lt;div styleName='cell'&gt;B0&lt;/div&gt;</span><br><span class="line"><span class="xml">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="xml">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Happy Hacking!</p><h2 id="Special-Thanks"><a href="#Special-Thanks" class="headerlink" title="Special Thanks"></a>Special Thanks</h2><ul><li><a href="http://qiita.com/_likr/items/c335dec5221024ad56bc" target="_blank" rel="noopener">http://qiita.com/_likr/i…</a></li><li>Modular CSS with React – Medium<ul><li><a href="https://medium.com/@pioul/modular-css-with-react-61638ae9ea3e#.698bxp1vu" target="_blank" rel="noopener">English</a></li><li><a href="http://postd.cc/modular-css-with-react/" target="_blank" rel="noopener">Japanese</a></li></ul></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;I would like to introduce &lt;strong&gt;&lt;a href=&quot;https://github.com/gajus/react-css-modules&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;react-css-modules&lt;/a&gt;&lt;/strong&gt; with React.js.&lt;br&gt;CSS-Module is a concept for seamless mapping of class names to CSS modules inside of React components.&lt;/p&gt;
    
    </summary>
    
      <category term="React.js" scheme="https://blog.morizyun.com/categories/React-js/"/>
    
    
      <category term="javascript" scheme="https://blog.morizyun.com/tags/javascript/"/>
    
      <category term="React.js" scheme="https://blog.morizyun.com/tags/React-js/"/>
    
      <category term="css" scheme="https://blog.morizyun.com/tags/css/"/>
    
  </entry>
  
  <entry>
    <title>First Step for React.js on Rails</title>
    <link href="https://blog.morizyun.com/blog/react-js-on-rails-installation/"/>
    <id>https://blog.morizyun.com/blog/react-js-on-rails-installation/</id>
    <published>2016-12-30T05:00:00.000Z</published>
    <updated>2017-12-16T02:34:32.000Z</updated>
    
    <content type="html"><![CDATA[<p>This article describes how to start React on Rails.</p><a id="more"></a><h2 id="Instration-Node-with-Mac-Homebrew"><a href="#Instration-Node-with-Mac-Homebrew" class="headerlink" title="Instration Node with Mac Homebrew"></a>Instration Node with Mac Homebrew</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">brew upgrade</span><br><span class="line">brew install node</span><br></pre></td></tr></table></figure><h2 id="Creating-React-Sample-App"><a href="#Creating-React-Sample-App" class="headerlink" title="Creating React Sample App"></a>Creating React Sample App</h2><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm install -g create-react-app</span><br><span class="line">create-react-app hello-world</span><br><span class="line"><span class="built_in">cd</span> hello-world</span><br><span class="line">npm start</span><br></pre></td></tr></table></figure><h2 id="Using-React-on-Rails"><a href="#Using-React-on-Rails" class="headerlink" title="Using React on Rails"></a>Using React on Rails</h2><p>In this section, we are using RubyGem <strong><a href="https://github.com/shakacode/react_on_rails" target="_blank" rel="noopener">react_on_rails</a></strong>.</p><p>At first, add the following to your Gemfile and <code>bundle install</code>:</p><figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line">gem <span class="string">'react_on_rails'</span></span><br></pre></td></tr></table></figure><p>Commit this to git and please run following commands:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Run the generator with a sample "Hello World" App with React.js</span></span><br><span class="line">rails g react_on_rails:install</span><br><span class="line"></span><br><span class="line"><span class="comment"># Bundle &amp;&amp; NPM install:</span></span><br><span class="line">bundle &amp;&amp; npm install</span><br><span class="line"></span><br><span class="line"><span class="comment"># Start your Rails server:</span></span><br><span class="line">foreman start -f Procfile.dev</span><br></pre></td></tr></table></figure><p>Please see <a href="http://localhost:3000/hello_world" target="_blank" rel="noopener">http://localhost:3000/hello_world</a>.</p><p>All JavaScript in React On Rails is loaded from npm: react-on-rails.<br>To manually install this, please execute following command like this:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">cd</span> client &amp;&amp; npm i --saveDev react react-on-rails react-helmet nprogress</span><br></pre></td></tr></table></figure><h2 id="Controller"><a href="#Controller" class="headerlink" title="Controller"></a>Controller</h2><p>Supporting following flow:</p><ol><li>Return HTML in first request</li><li>In page transition, return JSON</li><li>Do not show JSON when returning with browser back</li></ol><figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ApplicationController</span> &lt; ActionController::Base</span></span><br><span class="line">  protect_from_forgery <span class="symbol">with:</span> <span class="symbol">:exception</span></span><br><span class="line"></span><br><span class="line">  private</span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">_action_path</span></span></span><br><span class="line">    <span class="string">"<span class="subst">#&#123;controller_path&#125;</span>#<span class="subst">#&#123;action_name&#125;</span>"</span></span><br><span class="line">  <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">_common_props</span></span></span><br><span class="line">    &#123; <span class="symbol">actionPath:</span> _action_path &#125;</span><br><span class="line">  <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">_render_for_react</span><span class="params">(<span class="symbol">props:</span> &#123;&#125;, <span class="symbol">status:</span> <span class="number">200</span>)</span></span></span><br><span class="line">    <span class="keyword">if</span> request.format.json?</span><br><span class="line">      response.headers[<span class="string">'Cache-Control'</span>] = <span class="string">'no-cache, no-store'</span></span><br><span class="line">      response.headers[<span class="string">'Expires'</span>] = <span class="string">'Fri, 01 Jan 1990 00:00:00 GMT'</span></span><br><span class="line">      response.headers[<span class="string">'Pragma'</span>] = <span class="string">'no-cache'</span></span><br><span class="line">      render(</span><br><span class="line">        <span class="symbol">json:</span> &#123;</span><br><span class="line">          <span class="symbol">rootProps:</span> _common_props.merge(props)</span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="symbol">status:</span> status</span><br><span class="line">      )</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">      render(</span><br><span class="line">        <span class="symbol">html:</span> view_context.react_component(</span><br><span class="line">          <span class="string">'Router'</span>,</span><br><span class="line">          <span class="symbol">props:</span> &#123;</span><br><span class="line">            <span class="symbol">rootProps:</span> _common_props.merge(props)</span><br><span class="line">          &#125;.as_json</span><br><span class="line">        ),</span><br><span class="line">        <span class="symbol">layout:</span> <span class="literal">true</span>,</span><br><span class="line">        <span class="symbol">status:</span> status</span><br><span class="line">      )</span><br><span class="line">    <span class="keyword">end</span></span><br><span class="line">  <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><p>Usage example is as follows:</p><figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ArticlesController</span> &lt; ApplicationController</span></span><br><span class="line">  <span class="comment"># GET /</span></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">index</span></span></span><br><span class="line">    _render_for_react(</span><br><span class="line">      <span class="symbol">props:</span> &#123;</span><br><span class="line">        <span class="symbol">articles:</span> Article.limit(<span class="number">20</span>)</span><br><span class="line">      &#125;</span><br><span class="line">    )</span><br><span class="line">  <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><h2 id="JavaScript"><a href="#JavaScript" class="headerlink" title="JavaScript"></a>JavaScript</h2><h3 id="Entry-Point"><a href="#Entry-Point" class="headerlink" title="Entry Point"></a>Entry Point</h3><p>Entry point of shared JavaScript code is like this:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// client/entry_points/main.js</span></span><br><span class="line"><span class="keyword">import</span> ReactOnRails <span class="keyword">from</span> <span class="string">"react-on-rails"</span>;</span><br><span class="line"><span class="keyword">import</span> Router <span class="keyword">from</span> <span class="string">"../components/Router"</span>;</span><br><span class="line"></span><br><span class="line">ReactOnRails.register(&#123; Router &#125;);</span><br></pre></td></tr></table></figure><h3 id="Router"><a href="#Router" class="headerlink" title="Router"></a>Router</h3><ol><li>Router selects Component by <code>actionPath</code></li><li>Display progress bar during page transition</li><li>Scroll to a top of a page after page transition</li><li>Adjust browser history using pushState / popState</li></ol><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> NProgress <span class="keyword">from</span> <span class="string">"nprogress"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> Articles <span class="keyword">from</span> <span class="string">"../components/Articles"</span></span><br><span class="line"><span class="comment">//...</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="class"><span class="keyword">class</span> <span class="title">Router</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  <span class="keyword">static</span> propTypes = &#123;</span><br><span class="line">    rootProps:  React.PropTypes.object,</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">static</span> childContextTypes = &#123;</span><br><span class="line">    onLinkClick: React.PropTypes.func,</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  componentDidMount() &#123;</span><br><span class="line">    <span class="built_in">window</span>.addEventListener(<span class="string">"popstate"</span>, () =&gt; &#123;</span><br><span class="line">      <span class="keyword">this</span>.transitTo(<span class="built_in">document</span>.location.href, &#123; <span class="attr">pushState</span>: <span class="literal">false</span> &#125;);</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">constructor</span>(...args) &#123;</span><br><span class="line">    <span class="keyword">super</span>(...args);</span><br><span class="line">    <span class="keyword">this</span>.state = &#123;</span><br><span class="line">      rootProps:    <span class="keyword">this</span>.props.rootProps,</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  getComponent() &#123;</span><br><span class="line">    <span class="keyword">switch</span> (<span class="keyword">this</span>.state.rootProps.actionPath) &#123;</span><br><span class="line">      <span class="keyword">case</span> <span class="string">"articles#index"</span>:</span><br><span class="line">        <span class="keyword">return</span> Articles;</span><br><span class="line">      <span class="comment">//...</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  getChildContext() &#123;</span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">      onLinkClick: <span class="keyword">this</span>.onLinkClick.bind(<span class="keyword">this</span>),</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  onLinkClick(event) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!event.metaKey) &#123;</span><br><span class="line">      event.preventDefault();</span><br><span class="line">      <span class="keyword">const</span> anchorElement = event.currentTarget.pathname ? event.currentTarget : event.currentTarget.querySelector(<span class="string">"a"</span>);</span><br><span class="line">      <span class="keyword">this</span>.transitTo(anchorElement.href, &#123; <span class="attr">pushState</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  transitTo(url, &#123; pushState &#125;) &#123;</span><br><span class="line">    NProgress.start();</span><br><span class="line">    $.ajax(&#123;</span><br><span class="line">      url: url,</span><br><span class="line">      dataType: <span class="string">'json'</span>,</span><br><span class="line">      cache: <span class="literal">false</span>,</span><br><span class="line">      success: <span class="function"><span class="keyword">function</span>(<span class="params">props</span>) </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (pushState) &#123;</span><br><span class="line">          history.pushState(&#123;&#125;, <span class="string">""</span>, url);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">this</span>.setState(&#123;<span class="attr">rootProps</span>: props.rootProps&#125;);</span><br><span class="line">        NProgress.done();</span><br><span class="line">        <span class="keyword">if</span>(<span class="keyword">typeof</span> <span class="built_in">window</span> !== <span class="string">'undefined'</span>) &#123;</span><br><span class="line">          <span class="built_in">window</span>.scrollTo(<span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;.bind(<span class="keyword">this</span>),</span><br><span class="line">      error: <span class="function"><span class="keyword">function</span>(<span class="params">xhr, status, err</span>) </span>&#123;</span><br><span class="line">        NProgress.done();</span><br><span class="line">        <span class="built_in">console</span>.error(url, status, err.toString());</span><br><span class="line">      &#125;.bind(<span class="keyword">this</span>)</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">const</span> Component = <span class="keyword">this</span>.getComponent();</span><br><span class="line">    <span class="keyword">return</span> <span class="xml"><span class="tag">&lt;<span class="name">Component</span> &#123;<span class="attr">...this.state.rootProps</span>&#125; <span class="attr">key</span>=<span class="string">&#123;this.state.requestId&#125;</span> /&gt;</span>;</span></span><br><span class="line"><span class="xml">  &#125;;</span></span><br><span class="line"><span class="xml">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="Link"><a href="#Link" class="headerlink" title="Link"></a>Link</h3><p>When a user clicks a link, a client communicates with the server with XHR and post a state to Router. </p><p>So I use the original Link tag instead of a tag.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="class"><span class="keyword">class</span> <span class="title">Link</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  <span class="keyword">static</span> contextTypes = &#123;</span><br><span class="line">    onLinkClick: React.PropTypes.func,</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  onClick(event) &#123;</span><br><span class="line">    <span class="keyword">this</span>.context.onLinkClick(event);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">return</span>(</span><br><span class="line">      &lt;a onClick=&#123;<span class="keyword">this</span>.onClick.bind(<span class="keyword">this</span>)&#125; &#123;...this.props&#125;&gt;</span><br><span class="line">        &#123;<span class="keyword">this</span>.props.children&#125;</span><br><span class="line">      &lt;<span class="regexp">/a&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;;</span></span><br></pre></td></tr></table></figure><p><code>Link</code> example is as follows:</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Link</span> <span class="attr">href</span>=<span class="string">"/"</span>&gt;</span>txt<span class="tag">&lt;/<span class="name">Link</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="Title-Meta-Tags"><a href="#Title-Meta-Tags" class="headerlink" title="Title/Meta Tags"></a>Title/Meta Tags</h2><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> Helmet <span class="keyword">from</span> <span class="string">"react-helmet"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> &#123;siteName, siteBaseUrl&#125; <span class="keyword">from</span> <span class="string">"../constants/service"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="class"><span class="keyword">class</span> <span class="title">Articles</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  pageUrl() &#123;</span><br><span class="line">    <span class="keyword">return</span> siteBaseUrl + <span class="string">"/articles"</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  pageTitle() &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">"huga"</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  pageDescription() &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">"hoge"</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">return</span>(</span><br><span class="line">      &lt;div&gt;</span><br><span class="line">        &lt;Helmet</span><br><span class="line">          title=&#123;<span class="keyword">this</span>.pageTitle()&#125;</span><br><span class="line">          link=&#123;[</span><br><span class="line">            &#123;<span class="attr">rel</span>: <span class="string">"canonical"</span>, <span class="attr">href</span>: <span class="keyword">this</span>.pageUrl()&#125;,</span><br><span class="line">            &#123;<span class="attr">rel</span>: <span class="string">'alternate'</span>, <span class="attr">href</span>: <span class="keyword">this</span>.pageUrl()&#125;,</span><br><span class="line">          ]&#125;</span><br><span class="line">          meta=&#123;[</span><br><span class="line">            &#123;<span class="attr">property</span>: <span class="string">"og:url"</span>,          <span class="attr">content</span>: <span class="keyword">this</span>.pageUrl()&#125;,</span><br><span class="line">            &#123;<span class="attr">property</span>: <span class="string">"og:title"</span>,        <span class="attr">content</span>: <span class="keyword">this</span>.pageTitle()&#125;,</span><br><span class="line">            &#123;<span class="attr">property</span>: <span class="string">"og:description"</span>,  <span class="attr">content</span>: <span class="keyword">this</span>.pageDescription()&#125;,</span><br><span class="line">            &#123;<span class="attr">name</span>: <span class="string">"description"</span>,         <span class="attr">content</span>: <span class="keyword">this</span>.pageDescription()&#125;,</span><br><span class="line">          ]&#125;</span><br><span class="line">        /&gt;</span><br><span class="line">        <span class="comment">//...</span></span><br><span class="line">  &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">  );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="Run-npm-install-in-ElasticBeansTalk"><a href="#Run-npm-install-in-ElasticBeansTalk" class="headerlink" title="Run npm install in ElasticBeansTalk"></a>Run npm install in ElasticBeansTalk</h2><p>This is a script to use <code>webpack</code> in deploy process of ElasticBeansTalk.<br>To use webpack you need to run <code>npm install</code> before<code>rake assets: precompile</code>.<br>(<code>10</code> is depend on each environment, so please fix it.)</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">files:</span></span><br><span class="line">  <span class="string">"/opt/elasticbeanstalk/hooks/appdeploy/pre/10_install_node_modules.sh"</span> <span class="string">:</span></span><br><span class="line"><span class="attr">    mode:</span> <span class="string">"000744"</span></span><br><span class="line"><span class="attr">    owner:</span> <span class="string">root</span></span><br><span class="line"><span class="attr">    group:</span> <span class="string">root</span></span><br><span class="line"><span class="attr">    content:</span> <span class="string">|</span></span><br><span class="line"><span class="string">      #!/usr/bin/env bash</span></span><br><span class="line"><span class="string">      set -xe</span></span><br><span class="line"><span class="string">      EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)</span></span><br><span class="line"><span class="string">      cd $EB_APP_STAGING_DIR/client</span></span><br><span class="line"><span class="string">      npm install</span></span><br><span class="line"><span class="string"></span><span class="attr">    encoding:</span> <span class="string">plain</span></span><br></pre></td></tr></table></figure><h2 id="Special-Thanks"><a href="#Special-Thanks" class="headerlink" title="Special Thanks"></a>Special Thanks</h2><p>This article has created by the following Japanese articles. Thank you very much, <a href="https://twitter.com/r7kamura" target="_blank" rel="noopener">@r7kamura</a>!</p><ul><li><a href="http://r7kamura.hatenablog.com/entry/2016/10/10/173610" target="_blank" rel="noopener">http://r7kamura.hatenablog.com/entry/2016/10/10/173610</a></li><li><a href="http://r7kamura.hatenablog.com/entry/2016/12/13/074119" target="_blank" rel="noopener">http://r7kamura.hatenablog.com/entry/2016/12/13/074119</a></li><li><p><a href="http://r7kamura.hatenablog.com/entry/2016/10/03/001212" target="_blank" rel="noopener">http://r7kamura.hatenablog.com/entry/2016/10/03/001212</a></p></li><li><p><a href="https://facebook.github.io/react/docs/hello-world.html" target="_blank" rel="noopener">https://facebook.github.io/react/docs/hello-world.html</a></p></li><li><a href="https://facebook.github.io/react/tutorial/tutorial.html" target="_blank" rel="noopener">https://facebook.github.io/react/tutorial/tutorial.html</a></li><li><a href="http://qiita.com/_muraham/items/22dec19e5d069560b40f" target="_blank" rel="noopener">http://qiita.com/_muraham/item…</a></li></ul><h2 id="Sample-App"><a href="#Sample-App" class="headerlink" title="Sample App"></a>Sample App</h2><ul><li><a href="https://github.com/suzan2go/react-rails-redux-sample" target="_blank" rel="noopener">suzan2go/react-rails-redux-sample: Example of rails application with redux and react-rails</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;This article describes how to start React on Rails.&lt;/p&gt;
    
    </summary>
    
      <category term="React.js" scheme="https://blog.morizyun.com/categories/React-js/"/>
    
    
  </entry>
  
  <entry>
    <title>React.js Tips &amp; Useful Component Set for beginner</title>
    <link href="https://blog.morizyun.com/blog/react-js-tips-useful-component/"/>
    <id>https://blog.morizyun.com/blog/react-js-tips-useful-component/</id>
    <published>2016-12-29T05:00:00.000Z</published>
    <updated>2017-12-16T02:34:32.000Z</updated>
    
    <content type="html"><![CDATA[<p>This article describes React.js tips &amp; useful componet for beginner.</p><a id="more"></a><h2 id="Useful-Component-Set-Material-UI"><a href="#Useful-Component-Set-Material-UI" class="headerlink" title="Useful Component Set: Material UI"></a>Useful Component Set: Material UI</h2><p><a href="https://github.com/callemall/material-ui" target="_blank"><br>  <img src="/img/2016-12-29-react-js-tips-useful-component_1.jpg" width="500" height="297"><br></a></p><ul><li><a href="https://github.com/callemall/material-ui" target="_blank" rel="noopener">https://github.com/callemall/material-ui</a></li></ul><p>It is a React Component sets supprting Google Material Design Guideline.</p><ul><li>There are a lot of components patttern &amp; it is high quality.</li><li>Server Side Rendering is being considered.</li><li>Some themes and color palettes are prepared.</li></ul><h2 id="Allow-function"><a href="#Allow-function" class="headerlink" title="Allow function"></a>Allow function</h2><p>The body of ES6 arrow functions share the same lexical <code>this</code> as the code that surrounds them.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// before</span></span><br><span class="line"><span class="keyword">var</span> getUserStoreStates = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">  <span class="keyword">return</span> UserStore.getAjaxResult();</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// after</span></span><br><span class="line"><span class="keyword">const</span> getUserStoreStates = <span class="function"><span class="params">()</span> =&gt;</span> UserStore.getAjaxResult();</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> ajax = &#123;</span><br><span class="line">  <span class="keyword">get</span>  : (url, params, callback) =&gt; &#123;</span><br><span class="line">    request</span><br><span class="line">      .get(url)</span><br><span class="line">      .query(params)</span><br><span class="line">      .end(<span class="function">(<span class="params">err, res</span>) =&gt;</span> callback(err, res))</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Stateless-Functions"><a href="#Stateless-Functions" class="headerlink" title="Stateless Functions"></a>Stateless Functions</h2><p>Most of your components would be stateless functions:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> React <span class="keyword">from</span> <span class="string">'react'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> App = <span class="function">(<span class="params">&#123;greet, name&#125;</span>) =&gt;</span> (</span><br><span class="line">  <span class="keyword">return</span> (<span class="xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">className</span>=<span class="string">"commentBox"</span>&gt;</span></span></span><br><span class="line"><span class="xml">    &#123;greet&#125;! I am a &#123;name&#125;.</span></span><br><span class="line"><span class="xml">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span>);</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line">App.propTypes = &#123;</span><br><span class="line">  greet: React.PropTypes.string.isRequired,</span><br><span class="line">  name: React.PropTypes.string.isRequired</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="refs"><a href="#refs" class="headerlink" title="refs"></a>refs</h2><p>A component can have a attribute to identify the component named <code>ref</code>.<br>All ref in the same componet are grouped into <code>refs</code>.</p><p>If you write the following code:</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">ref</span>=<span class="string">"name"</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">ref</span>=<span class="string">"mail"</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>You can access the element by <code>this.refs.name</code> or <code>this.refs.mail</code>.</p><ul><li><a href="http://qiita.com/kuniken/items/a22adda392ccc30011b1" target="_blank" rel="noopener">http://qiita.com/kuniken/…</a></li></ul><h2 id="Context-Usage"><a href="#Context-Usage" class="headerlink" title="Context Usage"></a>Context Usage</h2><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">// components/Parent.jsx</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="class"><span class="keyword">class</span> <span class="title">Parent</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  <span class="keyword">static</span> childContextTypes = &#123;</span><br><span class="line">    onLick: React.PropTypes.func,</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  getChildContext() &#123;</span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">      onLick: <span class="keyword">this</span>.onLick.bind(<span class="keyword">this</span>),</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  onLick(event) &#123;</span><br><span class="line">    <span class="comment">// do something...</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// components/Child.jsx</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="class"><span class="keyword">class</span> <span class="title">Child</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  <span class="keyword">static</span> contextTypes = &#123;</span><br><span class="line">    onClick: React.PropTypes.func.isRequired,</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  onClick = <span class="function">(<span class="params">event</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">this</span>.context.onClick(event);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">return</span>(</span><br><span class="line">      &lt;a onClick=&#123;<span class="keyword">this</span>.onClick.bind(<span class="keyword">this</span>)&#125; &#123;...this.props&#125;&gt;</span><br><span class="line">        sample text</span><br><span class="line">      &lt;<span class="regexp">/a&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="Render-raw-html"><a href="#Render-raw-html" class="headerlink" title="Render raw html"></a>Render raw html</h2><p>It is possible to draw in raw HTML by using <code>dangerouslySetInnerHTML</code>.</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line">&lt;div className=<span class="string">"text"</span> dangerouslySetInnerHTML=&#123;&#123;<span class="attr">__html</span>: <span class="keyword">this</span>.props.message&#125;&#125;&gt;</span><br></pre></td></tr></table></figure><ul><li><a href="http://mikazuki.hatenablog.jp/entry/2016/01/07/055556" target="_blank" rel="noopener">http://mikazuki.hatenablog.jp/entry/2016/01/07/055556</a></li></ul><h2 id="Using-React-addons"><a href="#Using-React-addons" class="headerlink" title="Using React addons"></a>Using React addons</h2><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> children = React.addons.createFragment(&#123;</span><br><span class="line">  right: props.rightChildren,</span><br><span class="line">  left: props.leftChildren</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><ul><li><a href="https://facebook.github.io/react/docs/addons.html" target="_blank" rel="noopener">https://facebook.github.io/react/docs/addons.html</a></li><li><a href="https://facebook.github.io/react/docs/create-fragment.html" target="_blank" rel="noopener">https://facebook.github.io/react/docs/create-fragment.html</a></li></ul><h2 id="JS-Tips-Currency-Formatting"><a href="#JS-Tips-Currency-Formatting" class="headerlink" title="JS Tips: Currency Formatting"></a>JS Tips: Currency Formatting</h2><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line">[<span class="built_in">Number</span>].toString().replace(<span class="regexp">/(\d)(?=(\d&#123;3&#125;)+$)/g</span> , <span class="string">'$1,'</span>);</span><br></pre></td></tr></table></figure><ul><li><a href="http://stackoverflow.com/questions/14467433/currency-formatting-in-javascript" target="_blank" rel="noopener">http://stackoverflow.com/questions/14467433/currency-formatting-in-javascript</a></li></ul><h2 id="Not-use-target-’-blank’"><a href="#Not-use-target-’-blank’" class="headerlink" title="Not use target=’_blank’"></a>Not use target=’_blank’</h2><p>In React.js, we should not use <code>target=&#39;_blank&#39;</code> in link tag.<br>We should add <code>rel=&quot;noreferrer noopener&quot;</code></p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> React <span class="keyword">from</span> <span class="string">"react"</span>;</span><br><span class="line"><span class="keyword">import</span> ReactDOM <span class="keyword">from</span> <span class="string">"react-dom"</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Index</span> <span class="keyword">extends</span> <span class="title">React</span>.<span class="title">Component</span> </span>&#123;</span><br><span class="line">  render() &#123;</span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">      &lt;a</span><br><span class="line">        href=<span class="string">"http://example.com"</span></span><br><span class="line">        target=<span class="string">"_blank"</span></span><br><span class="line">        rel=<span class="string">"noreferrer noopener"</span></span><br><span class="line">      &gt;</span><br><span class="line">        Anchor Text</span><br><span class="line">      &lt;<span class="regexp">/a&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">  &#125;</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">ReactDOM.render(</span></span><br><span class="line"><span class="regexp">  &lt;Index /</span>&gt;,</span><br><span class="line">  <span class="built_in">document</span>.getElementById(<span class="string">"root"</span>)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="Trouble-shooting"><a href="#Trouble-shooting" class="headerlink" title="Trouble shooting"></a>Trouble shooting</h2><p>Error is as follows:</p><figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">Uncaught Invariant Violation: Objects are not valid as a React child (found: object with keys &#123;...&#125;). If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons.</span><br></pre></td></tr></table></figure><p>Solution:</p><figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> newArray = <span class="keyword">this</span>.state.oldArray.map(<span class="function"><span class="keyword">function</span>(<span class="params">obj</span>)</span>&#123;</span><br><span class="line">    <span class="keyword">return</span> &#123; <span class="attr">id</span>: obj.id, <span class="attr">url</span>: obj.url, &#125;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> newArray[<span class="number">0</span>].url + newArray[<span class="number">0</span>].id</span><br></pre></td></tr></table></figure><h2 id="Special-Thanks"><a href="#Special-Thanks" class="headerlink" title="Special Thanks"></a>Special Thanks</h2><ul><li><a href="https://babeljs.io/blog/2015/06/07/react-on-es6-plus" target="_blank" rel="noopener">React on ES6+ · Babel</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;This article describes React.js tips &amp;amp; useful componet for beginner.&lt;/p&gt;
    
    </summary>
    
      <category term="React.js" scheme="https://blog.morizyun.com/categories/React-js/"/>
    
    
  </entry>
  
</feed>
