Last active
November 24, 2018 06:00
-
-
Save kai-kou/6fa6183389c9b1f0a1a5ab8c66ebe4d2 to your computer and use it in GitHub Desktop.
Qiita API v2で取得できる投稿のHTML形式の本文を利用してみた
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!doctype html> | |
<html lang="ja"> | |
<head> | |
<meta charset="utf-8"> | |
<title>Qiitaのrendered_bodyをつかってみた</title> | |
<style> | |
.item { | |
padding: 16px; | |
max-width: 1200px; | |
display: block; | |
font-size: 14px; | |
} | |
pre { | |
padding: 10px; | |
display: block; | |
overflow-x: auto; | |
box-sizing: inherit; | |
} | |
img { | |
width: 100%; | |
} | |
</style> | |
</head> | |
<body> | |
<div class="item"><h2> | |
<span id="概要" class="fragment"></span><a href="#%E6%A6%82%E8%A6%81"><i class="fa fa-link"></i></a>概要</h2> | |
<p><a href="https://qiita.com/api/v2/docs">Qiita API</a>が便利でよく利用しているのですが、毎回<code>curl</code> やスクリプトを組むのが面倒だったので、CLIツールを作ってみました。<del>何番煎じか数えるのはやめましたw</del></p> | |
<p>利用イメージ<br> | |
<a href="https://camo.qiitausercontent.com/b2e7cd04430f857cf4481cb8d98d6e5e5594570e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34383534392f63326533633265632d633530312d663464632d306636342d3665663435636238316563302e706e67" target="_blank" rel="nofollow noopener"><img width="645" alt="Hyper-2.png" src="https://camo.qiitausercontent.com/b2e7cd04430f857cf4481cb8d98d6e5e5594570e/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34383534392f63326533633265632d633530312d663464632d306636342d3665663435636238316563302e706e67" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/48549/c2e3c2ec-c501-f4dc-0f64-6ef45cb81ec0.png"></a></p> | |
<h2> | |
<span id="インストール方法" class="fragment"></span><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95"><i class="fa fa-link"></i></a>インストール方法</h2> | |
<p>さくっと作ったので、PyPiへの登録はしていません。GitHubからソースを取得してインストールします。</p> | |
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="o">></span> git clone https://github.com/kai-kou/qiita-py-cli.git | |
<span class="o">></span> <span class="nb">cd </span>qiita-py-cli | |
<span class="o">></span> pip <span class="nb">install</span> <span class="nt">-r</span> requirements.txt | |
<span class="o">></span> python setup.py <span class="nb">install</span> | |
<span class="c"># ターミナルの再起動(bash)</span> | |
<span class="o">></span> <span class="nb">exec</span> <span class="nv">$SHELL</span> <span class="nt">-l</span> | |
<span class="c"># ターミナルの再起動(fish)</span> | |
<span class="o">></span> <span class="nb">exec </span>fish <span class="nt">-l</span> | |
</pre></div></div> | |
<p>アンインストールする場合は、以下のようにします。</p> | |
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="o">></span> python setup.py <span class="nb">install</span> <span class="nt">--record</span> files.txt | |
<span class="o">></span> <span class="nb">cat </span>files.txt | xargs <span class="nb">rm</span> <span class="nt">-rf</span> | |
</pre></div></div> | |
<p>以下の記事を参考にさせてもらいました。</p> | |
<p>setup.pyを用いてインストールしたモジュールのアンインストール方法<br> | |
<a href="https://qiita.com/orion46/items/dfe476067e499cca8535" class="autolink" id="reference-365d3ce829ab07968a82">https://qiita.com/orion46/items/dfe476067e499cca8535</a></p> | |
<h2> | |
<span id="使い方" class="fragment"></span><a href="#%E4%BD%BF%E3%81%84%E6%96%B9"><i class="fa fa-link"></i></a>使い方</h2> | |
<p>Qiitaのアクセストークンが必要となります。アクセストークンはQiitaに認証していると以下のURLから取得できます。</p> | |
<p><a href="https://qiita.com/settings/tokens/new" class="autolink">https://qiita.com/settings/tokens/new</a></p> | |
<p>POST系のコマンドを利用する場合にはスコープの<code>write_qiita</code> が必要になります。情報取得だけで利用するのなら、<code>read_qiita</code> があれば十分です。<br> | |
<a href="https://camo.qiitausercontent.com/2538bc7fa78f303eba374fa91b6383cf79c061c3/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34383534392f35633266613539612d393635332d616139302d336236652d3262326266323734623137392e706e67" target="_blank" rel="nofollow noopener"><img width="1082" alt="Qiita.png" src="https://camo.qiitausercontent.com/2538bc7fa78f303eba374fa91b6383cf79c061c3/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34383534392f35633266613539612d393635332d616139302d336236652d3262326266323734623137392e706e67" data-canonical-src="https://qiita-image-store.s3.amazonaws.com/0/48549/5c2fa59a-9653-aa90-3b6e-2b2bf274b179.png"></a></p> | |
<p>取得できたら<code>qiita init</code> コマンドでアクセストークンを設定します。</p> | |
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="c"># アクセストークンの設定</span> | |
<span class="o">></span> qiita init | |
Qiitaのアクセストークンを入力してください: | |
</pre></div></div> | |
<p>環境変数にアクセストークンを設定することもできます。</p> | |
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="c"># bash</span> | |
<span class="o">></span> <span class="nb">export </span><span class="nv">QIITA_PY_CLI_ACCESS_TOKEN</span><span class="o">=</span><Qiitaのアクセストークン> | |
<span class="c"># fish</span> | |
<span class="o">></span> <span class="nb">set</span> <span class="nt">-x</span> QIITA_PY_CLI_ACCESS_TOKEN <Qiitaのアクセストークン> | |
</pre></div></div> | |
<p>アクセストークンが設定できたらコマンドを実行してみます。</p> | |
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="o">></span> qiita get_user kai_kou | |
<span class="o">{</span><span class="s2">"description"</span>: <span class="s2">"2004-2011 フリーランス。2011-2018 株式会社グリーティングワークスでEC、バックヤード開発をプレイングマネージャーとしてAWSを超積極的に導入。サーバレス大好きっ子。Python、Ruby、TypeScript、C#とかが好み。2018/7からCloudpackにJoin。</span><span class="se">\r\n\r\n</span><span class="s2">Qiita記事は誰かひとりの琴線に触れたらそれでいい^^"</span>, <span class="s2">"facebook_id"</span>: <span class="s2">"kokaorz"</span>, <span class="s2">"followees_count"</span>: 429, <span class="s2">"followers_count"</span>: 79, <span class="s2">"github_login_name"</span>: <span class="s2">"kai-kou"</span>, <span class="s2">"id"</span>: <span class="s2">"kai_kou"</span>, <span class="s2">"items_count"</span>: 79, <span class="s2">"linkedin_id"</span>: <span class="s2">""</span>, <span class="s2">"location"</span>: <span class="s2">"Osaka, Japan"</span>, <span class="s2">"name"</span>: <span class="s2">"甲斐 甲"</span>, <span class="s2">"organization"</span>: <span class="s2">"アイレット株式会社"</span>, <span class="s2">"permanent_id"</span>: 48549, <span class="s2">"profile_image_url"</span>: <span class="s2">"https://qiita-image-store.s3.amazonaws.com/0/48549/profile-images/1524132209"</span>, <span class="s2">"twitter_screen_name"</span>: <span class="s2">"k_aik_ou"</span>, <span class="s2">"website_url"</span>: <span class="s2">"https://twitter.com/k_aik_ou"</span><span class="o">}</span> | |
</pre></div></div> | |
<p>取得結果はJSONとなりますので、<code>jq</code> コマンドなどで整形する前提です。</p> | |
<div class="code-frame" data-lang="sh"><div class="highlight"><pre class="prettyprint"><span class="o">></span> qiita get_user kai_kou | jq | |
<span class="o">{</span> | |
<span class="s2">"description"</span>: <span class="s2">"2004-2011 フリーランス。2011-2018 株式会社グリーティングワークスでEC、バックヤード開発をプレイングマネージャーとしてAWSを超積極的に導入。サーバレス大好きっ子。Python、Ruby、TypeScript、C#とかが好み。2018/7からCloudpackにJoin。</span><span class="se">\r\n\r\n</span><span class="s2">Qiita記事は誰かひとりの琴線に触れたらそれでいい^^"</span>, | |
<span class="s2">"facebook_id"</span>: <span class="s2">"kokaorz"</span>, | |
<span class="s2">"followees_count"</span>: 429, | |
<span class="s2">"followers_count"</span>: 79, | |
<span class="s2">"github_login_name"</span>: <span class="s2">"kai-kou"</span>, | |
<span class="s2">"id"</span>: <span class="s2">"kai_kou"</span>, | |
<span class="s2">"items_count"</span>: 79, | |
<span class="s2">"linkedin_id"</span>: <span class="s2">""</span>, | |
<span class="s2">"location"</span>: <span class="s2">"Osaka, Japan"</span>, | |
<span class="s2">"name"</span>: <span class="s2">"甲斐 甲"</span>, | |
<span class="s2">"organization"</span>: <span class="s2">"アイレット株式会社"</span>, | |
<span class="s2">"permanent_id"</span>: 48549, | |
<span class="s2">"profile_image_url"</span>: <span class="s2">"https://qiita-image-store.s3.amazonaws.com/0/48549/profile-images/1524132209"</span>, | |
<span class="s2">"twitter_screen_name"</span>: <span class="s2">"k_aik_ou"</span>, | |
<span class="s2">"website_url"</span>: <span class="s2">"https://twitter.com/k_aik_ou"</span> | |
<span class="o">}</span> | |
</pre></div></div> | |
<p><code>jq</code> コマンドについては下記が参考になります。</p> | |
<p>jq コマンドを使う日常のご紹介<br> | |
<a href="https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af" class="autolink" id="reference-69c4aa23e0a46a1ae927">https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af</a></p> | |
<h2> | |
<span id="実装" class="fragment"></span><a href="#%E5%AE%9F%E8%A3%85"><i class="fa fa-link"></i></a>実装</h2> | |
<h3> | |
<span id="コマンドラインパーサー" class="fragment"></span><a href="#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%91%E3%83%BC%E3%82%B5%E3%83%BC"><i class="fa fa-link"></i></a>コマンドラインパーサー</h3> | |
<p>パラメータ設定はdocoptを利用しています。パーサーを自動的に作成してくれるので、お手軽です。メソッド名をいちいち書くのが面倒だったので、下記を参考にメソッドを洗い出して、必要なものだけを記載するようにしました。パラメータは、、、自力でコツコツと。。。</p> | |
<p>Python: オブジェクトのメソッド一覧を取得する<br> | |
<a href="https://qiita.com/suin/items/b15f908aaf8023a8a1fc" class="autolink" id="reference-13ec1176b6f41c018d32">https://qiita.com/suin/items/b15f908aaf8023a8a1fc</a></p> | |
<div class="code-frame" data-lang="python"> | |
<div class="code-lang"><span class="bold">実装の一部抜粋</span></div> | |
<div class="highlight"><pre class="prettyprint"><span class="k">def</span> <span class="nf">main</span><span class="p">():</span> | |
<span class="n">_USAGE</span> <span class="o">=</span> <span class="s">''' | |
Qiita API CLI | |
Usage: | |
qiita init | |
qiita create_access_token [--params=<kn> --headers=<kn>] | |
qiita create_item [--params=<kn> --headers=<kn>] | |
qiita create_item_comment <item_id> [--params=<kn> --headers=<kn>] | |
qiita delete_access_token <token> [--params=<kn> --headers=<kn>] | |
qiita delete_comment <id> [--params=<kn> --headers=<kn>] | |
qiita delete_item <id> [--params=<kn> --headers=<kn>] | |
qiita follow_tag <id> [--params=<kn> --headers=<kn>] | |
qiita follow_user <user_id> [--params=<kn> --headers=<kn>] | |
qiita get_authenticated_user [--params=<kn> --headers=<kn>] | |
qiita get_authenticated_user_items [--params=<kn> --headers=<kn>] | |
qiita get_comment <id> [--params=<kn> --headers=<kn>] | |
qiita get_item <id> [--params=<kn> --headers=<kn>] | |
qiita get_item_stock <item_id> [--params=<kn> --headers=<kn>] | |
qiita get_tag <id> [--params=<kn> --headers=<kn>] | |
qiita get_tag_following <id> [--params=<kn> --headers=<kn>] | |
qiita get_user <id> [--params=<kn> --headers=<kn>] | |
qiita get_user_following <user_id> [--params=<kn> --headers=<kn>] | |
qiita list_item_comments <item_id> [--params=<kn> --headers=<kn>] | |
qiita list_item_stockers <item_id> [--params=<kn> --headers=<kn>] | |
qiita list_items [--params=<kn> --headers=<kn>] | |
qiita list_tag_items <id> [--params=<kn> --headers=<kn>] | |
qiita list_tags [--params=<kn> --headers=<kn>] | |
qiita list_user_followees <user_id> [--params=<kn> --headers=<kn>] | |
qiita list_user_followers <user_id> [--params=<kn> --headers=<kn>] | |
qiita list_user_following_tags <user_id> [--params=<kn> --headers=<kn>] | |
qiita list_user_items <user_id> [--params=<kn> --headers=<kn>] | |
qiita list_user_stocks <user_id> [--params=<kn> --headers=<kn>] | |
qiita list_users [--params=<kn> --headers=<kn>] | |
qiita stock_item <item_id> [--params=<kn> --headers=<kn>] | |
qiita unfollow_tag <id> [--params=<kn> --headers=<kn>] | |
qiita unfollow_user <user_id> [--params=<kn> --headers=<kn>] | |
qiita unstock_item <item_id> [--params=<kn> --headers=<kn>] | |
qiita update_comment <id> [--params=<kn> --headers=<kn>] | |
qiita update_item <id> [--params=<kn> --headers=<kn>] | |
Options: | |
--help ヘルプを表示 | |
--params=<kn> params [default: None] | |
--headers=<kn> headers [default: None] | |
'''</span> | |
<span class="n">all_params</span> <span class="o">=</span> <span class="n">docopt</span><span class="p">(</span><span class="n">_USAGE</span><span class="p">)</span> | |
</pre></div> | |
</div> | |
<p>docopt<br> | |
<a href="http://docopt.org/" class="autolink" rel="nofollow noopener" target="_blank">http://docopt.org/</a></p> | |
<p>Pythonのdocopt使い方メモ<br> | |
<a href="https://qiita.com/ymdymd/items/651245d80964393b12c5" class="autolink" id="reference-89ec1283cdae53da24aa">https://qiita.com/ymdymd/items/651245d80964393b12c5</a></p> | |
<p>PythonでCLIツールを作成するのにdocoptでパラメータのパーサー作成を自動化する<br> | |
<a href="https://qiita.com/kai_kou/items/5ff0958264c56ecf0a17" class="autolink" id="reference-92c09470e62ccfd99253">https://qiita.com/kai_kou/items/5ff0958264c56ecf0a17</a></p> | |
<h3> | |
<span id="qiita-apiへのアクセス" class="fragment"></span><a href="#qiita-api%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9"><i class="fa fa-link"></i></a>Qiita APIへのアクセス</h3> | |
<p>下記で紹介されているラッパーを利用させてもらいました。一部APIの実装が足りていなかったので、フォークしました。</p> | |
<p>Qiita API v2のPythonラッパー実装した<br> | |
<a href="https://qiita.com/petitviolet/items/deda7b66852635264508" class="autolink" id="reference-3bb118e321de0f061bdb">https://qiita.com/petitviolet/items/deda7b66852635264508</a></p> | |
<p>kai-kou/qiita_py: Python Wrapper for Qiita API v2<br> | |
<a href="https://github.com/kai-kou/qiita_py" class="autolink" rel="nofollow noopener" target="_blank">https://github.com/kai-kou/qiita_py</a></p> | |
<p>基本的にはラッパーで実装されているメソッドをパラメータとして引き渡し実行しているだけです。お手軽!</p> | |
<div class="code-frame" data-lang="python"> | |
<div class="code-lang"><span class="bold">実装の一部抜粋</span></div> | |
<div class="highlight"><pre class="prettyprint"> <span class="n">command</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">all_params</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span> <span class="o">==</span> <span class="bp">True</span><span class="p">]</span> | |
<span class="n">params</span> <span class="o">=</span> <span class="p">[</span> | |
<span class="n">v</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">all_params</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> | |
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">r'\<.*\>'</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="ow">and</span> <span class="n">v</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">]</span> | |
<span class="n">options</span> <span class="o">=</span> <span class="p">[</span> | |
<span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">all_params</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> | |
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">r'^\-'</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="ow">and</span> <span class="n">v</span> <span class="o">!=</span> <span class="s">'None'</span><span class="p">]</span> | |
<span class="n">params</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">options</span><span class="p">)</span> | |
<span class="p">(</span><span class="err">略</span><span class="p">)</span> | |
<span class="n">client</span> <span class="o">=</span> <span class="n">QiitaClient</span><span class="p">(</span><span class="n">access_token</span><span class="o">=</span><span class="n">access_token</span><span class="p">)</span> | |
<span class="n">res</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">command</span><span class="p">[</span><span class="mi">0</span><span class="p">])(</span><span class="o">*</span><span class="n">params</span><span class="p">)</span> | |
</pre></div> | |
</div> | |
<p><code>getattr</code> を利用して、メソッドを動的に呼んでいます。下記が詳しく参考になりました。</p> | |
<p>pythonで動的にクラスとメソッドをCallする<br> | |
<a href="https://yuji0602.hatenablog.jp/entry/2018/03/21/225700" class="autolink" rel="nofollow noopener" target="_blank">https://yuji0602.hatenablog.jp/entry/2018/03/21/225700</a></p> | |
<h2> | |
<span id="まとめ" class="fragment"></span><a href="#%E3%81%BE%E3%81%A8%E3%82%81"><i class="fa fa-link"></i></a>まとめ</h2> | |
<p>CLIツールを初めて作ってみましたが、便利なライブラリが充実しているので、とても簡単に実装することができました。</p> | |
<p>さくっと実装したので、テストも書いてない状態なので、テストを書いたらPyPiに登録してみたいと思います^^</p> | |
<h2> | |
<span id="参考" class="fragment"></span><a href="#%E5%8F%82%E8%80%83"><i class="fa fa-link"></i></a>参考</h2> | |
<p>docopt<br> | |
<a href="http://docopt.org/" class="autolink" rel="nofollow noopener" target="_blank">http://docopt.org/</a></p> | |
<p>Pythonのdocopt使い方メモ<br> | |
<a href="https://qiita.com/ymdymd/items/651245d80964393b12c5" class="autolink">https://qiita.com/ymdymd/items/651245d80964393b12c5</a></p> | |
<p>Qiita API v2のPythonラッパー実装した<br> | |
<a href="https://qiita.com/petitviolet/items/deda7b66852635264508" class="autolink">https://qiita.com/petitviolet/items/deda7b66852635264508</a></p> | |
<p>Pythonにおけるリフレクション<br> | |
<a href="https://qiita.com/icoxfog417/items/bf04966d4e9706eb9e04" class="autolink" id="reference-d43ee73d970089e70014">https://qiita.com/icoxfog417/items/bf04966d4e9706eb9e04</a></p> | |
<p>pythonで動的にクラスとメソッドをCallする<br> | |
<a href="https://yuji0602.hatenablog.jp/entry/2018/03/21/225700" class="autolink" rel="nofollow noopener" target="_blank">https://yuji0602.hatenablog.jp/entry/2018/03/21/225700</a></p> | |
<p>Python: オブジェクトのメソッド一覧を取得する<br> | |
<a href="https://qiita.com/suin/items/b15f908aaf8023a8a1fc" class="autolink">https://qiita.com/suin/items/b15f908aaf8023a8a1fc</a></p> | |
<p>Python: PyPI にないパッケージを依存パッケージにするには<br> | |
<a href="https://blog.amedama.jp/entry/2016/02/18/221555" class="autolink" rel="nofollow noopener" target="_blank">https://blog.amedama.jp/entry/2016/02/18/221555</a></p> | |
<p>Pythonで関数の引数にリスト、タプル、辞書を展開して渡す<br> | |
<a href="https://note.nkmk.me/python-argument-expand/" class="autolink" rel="nofollow noopener" target="_blank">https://note.nkmk.me/python-argument-expand/</a></p> | |
<p>Pythonでリストとタプルを相互に変換するlist(), tuple()<br> | |
<a href="https://note.nkmk.me/python-list-tuple-convert/" class="autolink" rel="nofollow noopener" target="_blank">https://note.nkmk.me/python-list-tuple-convert/</a></p> | |
<p>Pythonで対応する値に基づいて辞書型のキーをフィルターしたい<br> | |
<a href="https://teratail.com/questions/3731" class="autolink" rel="nofollow noopener" target="_blank">https://teratail.com/questions/3731</a></p> | |
<p>Python Prompt Toolkitで対話的な選択コマンドを作る<br> | |
<a href="https://vaaaaaanquish.hatenablog.com/entry/2017/12/25/183927" class="autolink" rel="nofollow noopener" target="_blank">https://vaaaaaanquish.hatenablog.com/entry/2017/12/25/183927</a></p> | |
<p>Pythonでyamlファイルを設定ファイルとして使う<br> | |
<a href="http://www.bokupy.com/detail/74" class="autolink" rel="nofollow noopener" target="_blank">http://www.bokupy.com/detail/74</a></p> | |
<p>pythonでホームディレクトリの取得<br> | |
<a href="https://qiita.com/sotetsuk/items/d7b32b12f94a341c79a5" class="autolink" id="reference-f5bb3aad3ede4b23371f">https://qiita.com/sotetsuk/items/d7b32b12f94a341c79a5</a></p></div> | |
<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=desert"></script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment