Junya Nakadahttps://junyanakada.com/2022-05-10T22:13:00+09:00私の人生を変えた三つの文書2022-05-10T22:13:00+09:002022-05-10T22:13:00+09:00Junya Nakadatag:junyanakada.com,2022-05-10:/three-documents-that-changed-my-life.html<p>私の人生を変えた三つの文書について書きたい。ふと、この本で人生が変わったなと思ったことがあった。他にも人生 …</p><p>私の人生を変えた三つの文書について書きたい。ふと、この本で人生が変わったなと思ったことがあった。他にも人生を変えた本がないかと思い起こしてみると三つがあげられた。本ではないが外すことができないものがあったため、三つの文書としている。</p>
<div class="section" id="section-2">
<h2>7つの習慣 成功には原則があった!</h2>
<p>一つ目は、 <a class="reference external" href="http://www.franklincovey.co.jp/books/info/7habits/index.html">7つの習慣 成功には原則があった!</a> だ。改訳版が出版されているが、読んだ本は改訳される前の本だ。</p>
<p>自分の感情から、行動、人生に至るまで、その一切の責任は自分自身に負わされてる。それを学んだ。人生の責任を自分の意志で負っているのではなく、自分の意志に関わらず負わされている。それを受け入れて、負わされるのではなく、自分の意志で負って行く必要があると学んだ。</p>
<p>三つではなく一つをあげるとしたら、この一冊になる。他の二つをあげる理由ともなっている。世の中には普遍の理がある。他の二つは、その普遍の理に触れているように思えた。</p>
</div>
<div class="section" id="born-to-run">
<h2>BORN TO RUN 走るために生まれた</h2>
<p>7つの習慣を読んで運動を始めた。選んだ運動はランニングだ。ほどなくして出会ったのが、 <a class="reference external" href="https://www.nhk-book.co.jp/detail/000000814142010.html">BORN TO RUN 走るために生まれた</a> だ。これは本を読んだのではなく、 <a class="reference external" href="https://audiobook.jp/product/139194">オーディオブック</a> を聞いた。</p>
<p>人間の体は走るために作られているということが、この本の主題だ。作られた通りの走り方があるという。</p>
<p>私には昔から、朝起きると膝や肩が痛くて動かせないという持病のようなものがあった。それでもどうにかギクシャクと動いていると夕方にはそれほど問題なく動くようになる。それから考えると、怪我をしているという様子ではない。</p>
<p>そして、ランニングを始めたは良いが、すぐに足が痛くなる。歩くのがつらい。休んでも楽にならない。どうにか走っていても、パンプスを履いた小走りの女性に追い抜かれた。痛みでつらい上に、気持ちがつらい。</p>
<p>この本に出会って、走り方を変えた。それにあわせて歩き方も変えた。それから、少なくとも記憶の上では、一切、膝や肩が痛くて動かせないということは無い。もちろん走りすぎてしまえば痛いこともある。しかし、以前は運動もしていないのに痛んだ。それが無くなった。</p>
</div>
<div class="section" id="section-3">
<h2>ハッカーになろう</h2>
<p>最後は本ではなく Web ページだ。 <a class="reference external" href="https://cruel.org/freeware/hacker.html">ハッカーになろう (How To Become A Hacker)</a> だ。原文は英語だが読んだのは日本語訳だ。</p>
<p>私は今、プログラマとして働いている。仕事であるから出すべき成果は出さなければならない。それにしても、なかなか節操のない職業だとも思う。使えるものはとにかく使う。簡単に成果が出せればそれで良し。本当に技術者なのか、技術者とはそういうものなのだろうか。ただ Web 検索をして、コードをコピーしてソフトウェアを作る。それ以上に理解しようということもない。皆が皆そうではないが、そんな雰囲気を感じている。</p>
<p>この文書は、プログラマになるきっかけであり、ずっと教本であり続けた。</p>
<p>金が無くて Mac が買えないという理由もあるが、頑固に Linux を使い続けた。仕事は Mac と VSCode になってしまったが、仕事でなければ今も Linux と Vim を使っている。今の会社に就職したのが職業としてのプログラマの始まりだが、会社から Linux と Vim で仕事ができるように見えないと判断されて、仕事には Mac と VSCode を使うことにした。悔しくもあったが、成果が出せないのでは仕事にならない。それでも、はじめから Mac を使っていたら、今もプログラマにはなれていないだろうと思う。VSCode を使っていて思うが、これで何もわからないところからプログラミングが出来るようになれていたとは思えない。</p>
<p>プログラマならやれるはずだから、プログラマでやって行けなければ他の何もかもやって行けないだろうと、プログラマを目指した。その思いの支えになった文書だ。</p>
<p>プログラマになろう、ではない。ハッカーになろう、だ。その違いは私には大きい。</p>
</div>
<div class="section" id="uris">
<h2>URIs</h2>
<p>これからもこれまでと同様、悩みながら生きて行く。時折、立ち返るところとして記録しておきたい。</p>
<dl class="docutils">
<dt>7つの習慣 成功には原則があった!</dt>
<dd>9784906638017</dd>
<dt>BORN TO RUN 走るために生まれた</dt>
<dd>9784140814147</dd>
<dt>ハッカーになろう (How To Become A Hacker)</dt>
<dd><a class="reference external" href="https://cruel.org/freeware/hacker.html">https://cruel.org/freeware/hacker.html</a></dd>
</dl>
</div>
なぜメイカーでありたいのか2021-01-03T22:35:00+09:002021-01-03T22:35:00+09:00Junya Nakadatag:junyanakada.com,2021-01-03:/why-i-want-to-be-a-maker.html<p><a class="reference external" href="https://junyanakada.com/no-such-blah-blah-blah.html">Maker でありたいという思いから、このようなブログ名にしています。</a> では、なぜ Maker でありたいのか。</p>
<p>Maker については <a class="reference external" href="https://ja.wikipedia.org/wiki/メイカームーブメント">Wikipedia</a> にまと …</p><p><a class="reference external" href="https://junyanakada.com/no-such-blah-blah-blah.html">Maker でありたいという思いから、このようなブログ名にしています。</a> では、なぜ Maker でありたいのか。</p>
<p>Maker については <a class="reference external" href="https://ja.wikipedia.org/wiki/メイカームーブメント">Wikipedia</a> にまとめられています。日本語ではメイカーと書くのが良いようです。私がメイカーでありたい理由は、その定義とはあまり関係がありません。ですので、Wikipedia にまかせてしまいます。</p>
<p>私がメイカーでありたい理由は、手を動かしてものを作ることによって自分自身を取り戻したい、保ちたいからです。</p>
<p>日々のさまざまな出来事によって自分自身というものは簡単に失われてしまうものだと感じています。私にとっては、手を動かしてものを作るという行動が、自分自身を取り戻すために有効だと感じています。私は、外食はせずにできるだけ自炊をするようにしていますが、その理由も同じです。調理器具にまかせている部分も多いですが、自分の手で作るという機会をできるだけ持つようにしています。</p>
<p>プログラミングも Make の概念の中に含まれるとは思います。手を動かす、という表現もよく使われます。しかし、ソフトウェアを作るのことは、私にとっては手を動かしてものを作るという感覚が乏しいと感じています。</p>
<p>自分の手で何かを作ることで、自分を取り戻したい。それが私がメイカーでありたい理由です。</p>
blah: No such blah-blah-blah2021-01-02T21:15:00+09:002021-01-02T21:15:00+09:00Junya Nakadatag:junyanakada.com,2021-01-02:/no-such-blah-blah-blah.html<p><a class="reference external" href="https://junyanakada.com/junyanakada-no-such-maker.html">ブログ名を変えました。</a> しかし、<tt class="docutils literal">programmer</tt> の部分を <tt class="docutils literal">maker</tt> に変えただけで、かたちはそのままです。このかたちはエラーメッセージ …</p><p><a class="reference external" href="https://junyanakada.com/junyanakada-no-such-maker.html">ブログ名を変えました。</a> しかし、<tt class="docutils literal">programmer</tt> の部分を <tt class="docutils literal">maker</tt> に変えただけで、かたちはそのままです。このかたちはエラーメッセージをもじったものです。例えば次のような。</p>
<div class="highlight"><pre><span></span>cat: example.txt: No such file or directory
</pre></div>
<p><tt class="docutils literal">junyanakada: No such maker</tt> は中田順也という Maker はいない、という意味でつけました。以前は <tt class="docutils literal">junyanakada: No such programmer</tt> だったので、中田順也というプログラマはいない、という意味でした。それは、プログラマに成りたいけど成ることができていない自分を、自嘲気味に、皮肉って付けたブログ名でした。ひねくれたブログ名だなと思います。</p>
<p>もう少し前向きなブログ名を付けることもできなくはなかったでしょう。しかし、前向きなブログ名を付けることを考えるまでもなく、そのひねくれたブログ名に決定しました。理由は、そのひねくれたブログ名によって自分が鼓舞されるからです。実際に、まだまだ駆け出しとは言え、プログラマにはなりました。</p>
<p>今度は Maker を目指そうと決めて、ブログ名を変えました。誤解が無いように書いておくと、プログラマを辞めるというつもりではありません。Maker という職業に就きたいということとは違います。</p>
<p>では、なぜ Maker なのか?それはまた機会を改めて。</p>
junyanakada: No such maker2021-01-01T23:55:00+09:002021-01-01T23:55:00+09:00Junya Nakadatag:junyanakada.com,2021-01-01:/junyanakada-no-such-maker.html<p>2021 年が明けました。</p>
<p>2020 年は初めてプログラマとして働き始めた年になりました。コードは多少なりとも書いてきまし …</p><p>2021 年が明けました。</p>
<p>2020 年は初めてプログラマとして働き始めた年になりました。コードは多少なりとも書いてきましたが、プログラマとして働くというのは初めての経験でした。いろいろとわからないこともありました。悩んだこともありました。さらにそこに COVID-19 の流行によって様々なストレスを感じました。良いこともありましたが、苦しみもある一年でした。</p>
<p>自分の向かって行くべき方向も見えなくなってしまった一年でした。プログラマを志してからプログラマとして働き始めるまで、約七年の時間が過ぎていました。プログラマになってしまい、その先を定められなくなっていました。</p>
<p>新年を迎えたことを期に、心を定めてブログのタイトルを変えてしまいましょう。</p>
<p><strong>junyanakada: No such maker</strong> 中田順也というメイカーは、まだこの世の中に存在しません。</p>
中年駆け出しプログラマ2020-06-24T20:25:00+09:002020-06-24T20:25:00+09:00Junya Nakadatag:junyanakada.com,2020-06-24:/middle-aged-newbie-programmer.html<p>3月で前の会社を辞め、4月に就職しました。プログラマになりました。前の会社でもプログラミングをすることはあ …</p><p>3月で前の会社を辞め、4月に就職しました。プログラマになりました。前の会社でもプログラミングをすることはありましたが、職業としてプログラマを名乗ることができるような仕事ではありませんでした。40代にして駆け出しです。</p>
<p>会社は小さいです。GCP のサービスパートナーになっている会社です。Web システムの会社が事業の中心です。そういう会社に就職して、Go で Web プログラミングをするようになりました。</p>
<p>自分はプログラマとしてまともな仕事ができなかったら他に何をやっても駄目だろうと思って来ました。新しい分野で働くことは簡単なことではないですが、充実しています。</p>
<div class="section" id="junyanakada">
<h2>junyanakada というプログラマは存在する</h2>
<p>このブログのタイトルのことです。「junyanakada: No such programmer」というタイトルです。junyanakada というプログラマは、駆け出しとは言え、今は存在します。これを機に、このブログについてもいろいろと見直しをしたいところです。</p>
<p>特に技術ブログにしようと思っていたわけではありませんが、関心にしたがって技術的な内容に傾いてはいました。質の良し悪しは問わず、あくまで傾向として。</p>
<p>このブログは、個人ブログとか雑記ブログとか言われるブログです。これからも技術ブログのような傾向はあるかもしれませんが、個人としての生活や考えも、もっと書いて行きたいと思います。</p>
</div>
<div class="section" id="section-2">
<h2>変わる生活</h2>
<p>生活は大きく変わりました。ここ数年は、プログラマとして仕事するようになるためにどうしたら良いかということが生活の軸でした。なかなか思うような生活にはならなかったものの、理想のようなものはありました。</p>
<p>今までの生活にどれくらいの効果があったのか、わかりません。結果的に、プログラマとして仕事をするようになりました。同時に今まで生活の軸としていたものは無くなりました。</p>
<p>新しい職場で働き、引越もしました。コロナウイルスの緊急事態宣言化で始まった生活です。私自身も世の中も、ある程度、状況が落ち着いてきたように思います。</p>
<p>新しい何かに向かって行くべきときなのでしょう。</p>
</div>
Windows で cmd.exe 起動時に PATH を通す2020-01-19T14:12:00+09:002020-01-19T14:12:00+09:00Junya Nakadatag:junyanakada.com,2020-01-19:/set-path-at-start-cli-on-windows.html<p>3月で Windows とはサヨナラするので、思い出につづっておこうと思います。</p>
<p>Python には、ディストリビューションが複数ありま …</p><p>3月で Windows とはサヨナラするので、思い出につづっておこうと思います。</p>
<p>Python には、ディストリビューションが複数あります。公式の配布、 Anaconda 、 WinPython 。私が知っているだけでも、みっつあります。他は知りませんが公式の場合は、バージョンごとにインストール先のディレクトリが違います。</p>
<p>環境変数 <tt class="docutils literal">PATH</tt> を設定した場合、複数ある <tt class="docutils literal">python.exe</tt> を使い分けることができません。そこで、任意の Python に PATH を通しながら CLI を起動するショートカットを作りましょう。</p>
<div class="section" id="section-1">
<h2>ショートカットをつくる</h2>
<p>コンテキストメニューなどでショートカットを作成します。設定するのはリンク先と作業フォルダです。</p>
<p>リンク先の設定 - PowerShell の場合</p>
<div class="highlight"><pre><span></span>%windir%<span class="se">\S</span>ystem32<span class="se">\W</span>indowsPowerShell<span class="se">\v</span><span class="m">1</span>.0<span class="se">\p</span>owershell.exe -ExecutionPolicy ByPass -NoExit -Command <span class="s2">"</span><span class="nv">$env</span><span class="s2">:PATH = '%LOCALAPPDATA%\Programs\Python\Python38;%LOCALAPPDATA%\Programs\Python\Python38\Scripts;%PATH%'"</span>
</pre></div>
<p>リンク先の設定 - cmd の場合</p>
<div class="highlight"><pre><span></span>%windir%<span class="se">\S</span>ystem32<span class="se">\c</span>md.exe /K <span class="s2">"set PATH=%LOCALAPPDATA%\Programs\Python\Python38;%LOCALAPPDATA%\Programs\Python\Python38\Scripts;%PATH%"</span>
</pre></div>
<p>どちらも、公式の Python 3.8 の PATH です。他のバージョン、ディストリビューションの場合は変更してください。</p>
<p>作業フォルダの設定は %HOMEPATH% にします。起動時に開くディレクトリです。</p>
<p>…なんとなく Python にこじつけていますが、他の言語のインタプリタや、いろいろなコマンドラインツールでも同じようにすることができます。Java でも Node.js でも。バッチファイルを実行するようにしておいて、そのバッチファイルの中で環境変数を設定するのもありです。</p>
</div>
<div class="section" id="python">
<h2>しかし Python ランチャーがある</h2>
<p>しかし、Python には、Python ランチャー(py.exe) があります。powershell でも cmd でも、開いて次のように打つとバージョンが表示されるはず。</p>
<div class="highlight"><pre><span></span>py -V
</pre></div>
<p>Python ランチャーは PATH の通っているところにインストールされます。 <tt class="docutils literal">.py</tt> ファイルも Python ランチャーに関連付けされています。</p>
<p>そもそも Python は PATH を通す必要がありません。少なくとも私自身は、通さずに困ったことはありません。書くだけ書いておいてなんですが、先述のショートカットも使ってません。</p>
<ul class="simple">
<li><a class="reference external" href="https://docs.python.org/ja/3/whatsnew/3.3.html">What's New In Python 3.3</a></li>
<li><a class="reference external" href="https://www.python.org/dev/peps/pep-0397/">PEP 397 -- Python launcher for Windows</a></li>
</ul>
</div>
来年こそは LT しようぜ!2019-12-14T22:27:00+09:002019-12-14T22:27:00+09:00Junya Nakadatag:junyanakada.com,2019-12-14:/make-slide-with-jupyter-rise.html<p>このポストは <a class="reference external" href="https://py-suruga.connpass.com/event/155409/">Python駿河 勉強会 #8 〜Pythonの進化を振り返ってみよう!〜</a> の LT を元に作り直したものです。</p>
<p>「来年こそは LT しようぜ …</p><p>このポストは <a class="reference external" href="https://py-suruga.connpass.com/event/155409/">Python駿河 勉強会 #8 〜Pythonの進化を振り返ってみよう!〜</a> の LT を元に作り直したものです。</p>
<p>「来年こそは LT しようぜ!」という題目で話をしました。良いツールを見つけたから、これから LT 頑張ろうという話です。全体的に雑な内容になっていますが、これから使おうという人の書いたものなので、その点、ご理解いただけたらと思います。</p>
<div class="section" id="rise-jupyter-notebook-html">
<h2>RISE - Jupyter Notebook で HTML スライドを作るツール</h2>
<p>RISE <a class="reference external" href="https://rise.readthedocs.io">https://rise.readthedocs.io</a></p>
</div>
<div class="section" id="section-1">
<h2>使い方</h2>
<p>インストールの方法です。 RISE が Jupyter に依存しているので、 Jupyter を明示的にインストールする必要はありません。 Anaconda を使っている場合は、 conda でインストールしてください。</p>
<div class="highlight"><pre><span></span>pip install RISE
jupyter-nbextension install rise --py --sys-prefix
jupyter-nbextension <span class="nb">enable</span> rise --py --sys-prefix
</pre></div>
<p>起動は Jupyter Notebook を起動するだけなので、 <tt class="docutils literal">jupyter notebook</tt> です。オプション等は任意で。</p>
<p>起動してノートブックを開いた後、メニュー <tt class="docutils literal">View > Cell Toolbar > Slideshow</tt> を選択するとセルの右端に <tt class="docutils literal">Slide Type</tt> が現れます。 <tt class="docutils literal">Slide</tt> にするとスライドになります。</p>
</div>
<div class="section" id="section-2">
<h2>コードを実行できる</h2>
<p>Jupyter が動いているので、コードを実行することができます。コードが書いてあるスライドで SHIFT + ENTER を押すと実行結果が表示されます。</p>
<p>スライドを作る際、 Slide Type は - にしておくと、前のスライドを同じスライドに表示されるようです。</p>
</div>
<div class="section" id="doker">
<h2>Doker で動かしてみました</h2>
<p>特に Docker を使う必要はないのですが、勉強がてら Docker で動かしてみました。</p>
<p>Dockerfile です。</p>
<div class="highlight"><pre><span></span>FROM python:latest
RUN python3 -m pip install --upgrade pip RISE
RUN jupyter-nbextension install rise --py --sys-prefix
RUN jupyter-nbextension <span class="nb">enable</span> rise --py --sys-prefix
CMD <span class="o">[</span><span class="s2">"jupyter"</span>, <span class="s2">"notebook"</span>, <span class="s2">"--allow-root"</span>, <span class="s2">"--ip=0.0.0.0"</span>, <span class="s2">"--port=8888"</span>, <span class="s2">"--notebook-dir=/tmp/share/"</span><span class="o">]</span>
</pre></div>
<p>docker-compose.yml です。</p>
<div class="highlight"><pre><span></span>version: <span class="s2">"3"</span>
services:
jupyter:
build:
context: .
dockerfile: Dockerfile
command: <span class="o">[</span><span class="s2">"jupyter"</span>, <span class="s2">"notebook"</span>, <span class="s2">"--allow-root"</span>, <span class="s2">"--ip=0.0.0.0"</span>, <span class="s2">"--port=8888"</span>, <span class="s2">"--notebook-dir=/tmp/share/"</span><span class="o">]</span>
container_name: jupyter
ports:
- <span class="m">8888</span>:8888
volumes:
- ./notebooks/:/tmp/share/
</pre></div>
<p><tt class="docutils literal">Dockerfile</tt> と <tt class="docutils literal"><span class="pre">docker-compose.yml</span></tt> を同一ディレクトリにおいてください。ノートブックを保存するディレクトリも同一ディレクトリに、 <tt class="docutils literal">notebooks</tt> の名前で作っておきます。そのうえで、 <tt class="docutils literal"><span class="pre">docker-compose</span> up</tt> 。コンソールに URL が表示されるので Web ブラウザで開きます。</p>
</div>
<div class="section" id="vagrant-windows-10-home-edition">
<h2>Vagrant を使えば Windows 10 Home Edition でも動かせる</h2>
<p>Docker for Windows は Home Edition では動かないはずです。 Hyper-V が無いからです。 VirtualBox などで仮想マシンを作る必要があります。 Vagrant を使うとVirtualBox で簡単に仮想マシンが作れます。 VirtualBox と Vagrant をインストールしておいてください。</p>
<p>Vagrantfile です。 Ruby 製なのが癪ですね。</p>
<div class="highlight"><pre><span></span><span class="c1"># -*- mode: ruby -*-</span>
<span class="c1"># vi: set ft=ruby :</span>
<span class="no">Vagrant</span><span class="o">.</span><span class="n">configure</span> <span class="s2">"2"</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">box</span> <span class="o">=</span> <span class="s2">"bento/ubuntu-18.04"</span>
<span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">network</span> <span class="s2">"forwarded_port"</span><span class="p">,</span>
<span class="ss">guest</span><span class="p">:</span> <span class="mi">8888</span><span class="p">,</span> <span class="ss">host</span><span class="p">:</span> <span class="mi">8888</span><span class="p">,</span> <span class="ss">host_ip</span><span class="p">:</span> <span class="s2">"127.0.0.1"</span>
<span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">provision</span> <span class="s2">"docker"</span>
<span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">provision</span> <span class="s2">"shell"</span><span class="p">,</span> <span class="ss">inline</span><span class="p">:</span> <span class="s2">"apt-get --yes install docker-compose"</span>
<span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">synced_folder</span> <span class="s2">"."</span><span class="p">,</span> <span class="s2">"/vagrant"</span>
<span class="k">end</span>
</pre></div>
<p><tt class="docutils literal">Vagrantfile</tt> を先述の Docker ファイル群と同一ディレクトリに配置します。 <tt class="docutils literal">vagrant up</tt> で仮想マシンを構築・起動。 <tt class="docutils literal">vagrant ssh</tt> で仮想マシンにログイン。 <tt class="docutils literal">vagrant halt</tt> で仮想マシンを停止。不要になったら、 <tt class="docutils literal">vagrant destroy</tt> で破棄できます。</p>
<p>仮想マシンの <tt class="docutils literal">/vagrant</tt> がホストマシンと共有されているので、 <tt class="docutils literal">cd /vagrant</tt> した後、先述の手順で Docker 起動します。
おしまい</p>
<p>これから RISE を使って LT をしようという話です。これが初めての使用なので、たいしたノウハウがありません。使ってみたいときは、ご自身で情報を探してみてください。</p>
<p>私は次のページを参考にしました。</p>
<ul class="simple">
<li><a class="reference external" href="https://www.procrasist.com/entry/5-jupyter-slide">https://www.procrasist.com/entry/5-jupyter-slide</a></li>
<li><a class="reference external" href="https://qiita.com/cvusk/items/d425751ba663dc8c6517">https://qiita.com/cvusk/items/d425751ba663dc8c6517</a></li>
</ul>
<p>LT しましょう。勉強会が楽しくなりますよ。多分。</p>
</div>
Sphinx でドキュメントに README を含める2019-11-16T19:02:00+09:002019-11-16T19:02:00+09:00Junya Nakadatag:junyanakada.com,2019-11-16:/include-readme-in-docs-with-sphinx.html<p>Django でアプリケーションをつくろうと思っています。自分ひとりで開発するとは言え、ドキュメントがまったく無いの …</p><p>Django でアプリケーションをつくろうと思っています。自分ひとりで開発するとは言え、ドキュメントがまったく無いのでは開発できないと思い、Sphinx でドキュメントを書き始めました。</p>
<p>ドキュメントは書くし、README も必要だし、同じような内容を両方に書かなければならないのか? Sphinx でドキュメントに <tt class="docutils literal">README.rst</tt> を挿入できないか?</p>
<p>簡単でした。 <tt class="docutils literal">README.rst</tt> を挿入したいところで <tt class="docutils literal">include</tt> ディレクティブを使うだけ。</p>
<div class="highlight"><pre><span></span><span class="p">..</span> <span class="ow">include</span><span class="p">::</span> ../../README.rst
</pre></div>
Flask-Login でログイン機能を作ってみる2019-05-06T21:27:00+09:002019-05-06T21:27:00+09:00Junya Nakadatag:junyanakada.com,2019-05-06:/make-flask-login-sampler.html<p><a class="reference external" href="https://flask-login.readthedocs.io/">Flask-Login</a>
を使ってログイン機能を作ってみました。
ログインするところだけです。ユーザー登録等は作っていません。</p>
<p><a class="reference external" href="https://liginc.co.jp/415333">参考に …</a></p><p><a class="reference external" href="https://flask-login.readthedocs.io/">Flask-Login</a>
を使ってログイン機能を作ってみました。
ログインするところだけです。ユーザー登録等は作っていません。</p>
<p><a class="reference external" href="https://liginc.co.jp/415333">参考にしたページ</a> が分かりやすかったです。
スクリプトファイルに直書きですが、ユーザーも作って認証させる処理は加えました。</p>
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/env python3</span>
<span class="sd">"""flask-login sampler."""</span>
<span class="kn">import</span> <span class="nn">flask</span>
<span class="kn">import</span> <span class="nn">flask_login</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">flask</span><span class="o">.</span><span class="n">Flask</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<span class="n">app</span><span class="o">.</span><span class="n">secret_key</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">'boizagie'</span>
<span class="n">login_manager</span> <span class="o">=</span> <span class="n">flask_login</span><span class="o">.</span><span class="n">LoginManager</span><span class="p">()</span>
<span class="n">login_manager</span><span class="o">.</span><span class="n">init_app</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">User</span><span class="p">(</span><span class="n">flask_login</span><span class="o">.</span><span class="n">UserMixin</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">user_id</span> <span class="o">=</span> <span class="n">user_id</span>
<span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">username</span>
<span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span>
<span class="k">def</span> <span class="nf">get_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">user_id</span>
<span class="n">users</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">User</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s1">'Ichiro'</span><span class="p">,</span> <span class="s1">'foobar'</span><span class="p">),</span>
<span class="n">User</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s1">'Jiro'</span><span class="p">,</span> <span class="s1">'fizzbuzz'</span><span class="p">)</span>
<span class="p">]</span>
<span class="nd">@login_manager</span><span class="o">.</span><span class="n">user_loader</span>
<span class="k">def</span> <span class="nf">load_user</span><span class="p">(</span><span class="n">user_id</span><span class="p">):</span>
<span class="k">return</span> <span class="n">users</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">user_id</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s1">'/'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">'GET'</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
<span class="k">def</span> <span class="nf">on_get</span><span class="p">():</span>
<span class="k">if</span> <span class="n">flask_login</span><span class="o">.</span><span class="n">current_user</span><span class="o">.</span><span class="n">is_authenticated</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="s1">'<a href="logout">Log out</a>'</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="s1">'<a href="login">Log in</a>'</span>
<span class="k">return</span> <span class="p">(</span>
<span class="sd">'''<html></span>
<span class="sd"> <head></span>
<span class="sd"> <title>{title}</title></span>
<span class="sd"> </head></span>
<span class="sd"> <body></span>
<span class="sd"> <h1>{title}</h1></span>
<span class="sd"> <p>{content}</p></span>
<span class="sd"> </body></span>
<span class="sd"> </html></span>
<span class="sd"> '''</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="vm">__doc__</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()[</span><span class="mi">0</span><span class="p">][:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
<span class="n">content</span><span class="o">=</span><span class="n">content</span><span class="p">)</span>
<span class="k">if</span> <span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'GET'</span><span class="p">:</span>
<span class="k">return</span> <span class="n">on_get</span><span class="p">()</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s1">'/login'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">'GET'</span><span class="p">,</span> <span class="s1">'POST'</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">login</span><span class="p">():</span>
<span class="k">def</span> <span class="nf">on_get</span><span class="p">():</span>
<span class="k">if</span> <span class="n">flask_login</span><span class="o">.</span><span class="n">current_user</span><span class="o">.</span><span class="n">is_authenticated</span><span class="p">:</span>
<span class="k">return</span> <span class="n">flask</span><span class="o">.</span><span class="n">redirect</span><span class="p">(</span><span class="n">flask</span><span class="o">.</span><span class="n">url_for</span><span class="p">(</span><span class="s1">'user'</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span>
<span class="sd">'''<html></span>
<span class="sd"> <head></span>
<span class="sd"> <title>{title}</title></span>
<span class="sd"> </head></span>
<span class="sd"> <body></span>
<span class="sd"> <h1>{title}</h1></span>
<span class="sd"> <form action+"login" method="post"></span>
<span class="sd"> <label for="username">username</label></span>
<span class="sd"> <input type="text" name="username" id="username"></span>
<span class="sd"> <label for="password">password</label></span>
<span class="sd"> <input type="text" name="password" id="password"></span>
<span class="sd"> <input type="submit" value="Log in"></span>
<span class="sd"> </form></span>
<span class="sd"> </body></span>
<span class="sd"> </html></span>
<span class="sd"> '''</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s1">'Log in'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_post</span><span class="p">():</span>
<span class="n">user_exists</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">is_password_valid</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">users</span><span class="p">:</span>
<span class="n">user_exists</span> <span class="o">=</span> <span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">'username'</span><span class="p">]</span> <span class="o">==</span> <span class="n">user</span><span class="o">.</span><span class="n">username</span>
<span class="n">user_id</span> <span class="o">=</span> <span class="n">user</span><span class="o">.</span><span class="n">user_id</span>
<span class="k">if</span> <span class="n">user_exists</span><span class="p">:</span>
<span class="n">is_password_valid</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">'password'</span><span class="p">]</span> <span class="o">==</span> <span class="n">user</span><span class="o">.</span><span class="n">password</span>
<span class="p">)</span>
<span class="k">break</span>
<span class="k">if</span> <span class="n">user_exists</span> <span class="ow">and</span> <span class="n">is_password_valid</span><span class="p">:</span>
<span class="n">flask_login</span><span class="o">.</span><span class="n">login_user</span><span class="p">(</span><span class="n">users</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">user_id</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">])</span>
<span class="n">flask</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">flask</span><span class="o">.</span><span class="n">session</span><span class="p">[</span><span class="s1">'user_id'</span><span class="p">]</span> <span class="o">=</span> <span class="n">user_id</span>
<span class="k">return</span> <span class="n">flask</span><span class="o">.</span><span class="n">redirect</span><span class="p">(</span><span class="n">flask</span><span class="o">.</span><span class="n">url_for</span><span class="p">(</span><span class="s1">'user'</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">flask</span><span class="o">.</span><span class="n">redirect</span><span class="p">(</span><span class="n">flask</span><span class="o">.</span><span class="n">url_for</span><span class="p">(</span><span class="s1">'index'</span><span class="p">))</span>
<span class="k">if</span> <span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'GET'</span><span class="p">:</span>
<span class="k">return</span> <span class="n">on_get</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'POST'</span><span class="p">:</span>
<span class="k">return</span> <span class="n">on_post</span><span class="p">()</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s1">'/logout'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">'GET'</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">logout</span><span class="p">():</span>
<span class="k">def</span> <span class="nf">on_get</span><span class="p">():</span>
<span class="n">flask_login</span><span class="o">.</span><span class="n">logout_user</span><span class="p">()</span>
<span class="k">return</span> <span class="n">flask</span><span class="o">.</span><span class="n">redirect</span><span class="p">(</span><span class="n">flask</span><span class="o">.</span><span class="n">url_for</span><span class="p">(</span><span class="s1">'index'</span><span class="p">))</span>
<span class="k">if</span> <span class="n">flask</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">'GET'</span><span class="p">:</span>
<span class="k">return</span> <span class="n">on_get</span><span class="p">()</span>
<span class="nd">@app</span><span class="o">.</span><span class="n">route</span><span class="p">(</span><span class="s1">'/user'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s1">'GET'</span><span class="p">])</span>
<span class="nd">@flask_login</span><span class="o">.</span><span class="n">login_required</span>
<span class="k">def</span> <span class="nf">user</span><span class="p">():</span>
<span class="k">return</span> <span class="p">(</span>
<span class="sd">'''<html></span>
<span class="sd"> <head></span>
<span class="sd"> <title>User</title></span>
<span class="sd"> </head></span>
<span class="sd"> <body></span>
<span class="sd"> <h1>Welcome!! {username}</h1></span>
<span class="sd"> <p><a href="logout">Log out</a></p></span>
<span class="sd"> </body></span>
<span class="sd"> </html></span>
<span class="sd"> '''</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
<span class="n">username</span><span class="o">=</span><span class="n">users</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">flask</span><span class="o">.</span><span class="n">session</span><span class="p">[</span><span class="s1">'user_id'</span><span class="p">])</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">username</span>
<span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</pre></div>
<p>まあでも、参考ページがわかりやすいとか言っていないで、
公式ドキュメントを読めるようにならないと…。</p>
ブログを三ヶ月毎日更新2019-03-31T21:38:00+09:002019-03-31T21:38:00+09:00Junya Nakadatag:junyanakada.com,2019-03-31:/write-blog-three-month.html<p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">今年の元日からブログを始めました。</a> そして、今日までの三ヶ月間は毎日更新してきました。内容がどうの、質がどうの …</p><p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">今年の元日からブログを始めました。</a> そして、今日までの三ヶ月間は毎日更新してきました。内容がどうの、質がどうのなどということは問わず、とにかく毎日更新しました。振り返ってみます。</p>
<p>アクセス解析を見てみると、誰も見ていないようです。誰にもブログ書いてますと言っていないので当然ではあります。さりげなく URL を年賀状とか、SNS 等の自己紹介には書いているのですが、書いてますとアピールすることはしていません。これがなんだか難しい。</p>
<p>アクセス解析をもう少し見てみると、ほんの少し他のページに比べてアクセスがあるように見えるページがありました。「 <a class="reference external" href="https://junyanakada.com/begin-to-contribute-with-bug-reporting.html">バグレポートからはじめるコントリビュート</a> 」です。イベントに出たときに書いたページで、このイベントのハッシュタグを付けて Twitter に流しました。SNS の力はやはり馬鹿にできないと思います。</p>
<p>ただ、そこからリピートのアクセスがあったようではありません。どんなに SNS からアクセスがあったとしても、ブログのコンテンツに魅力がなくては、どうにもなりません。</p>
<p>とにかく三ヶ月は毎日書いてきました。ここまでの反省を踏まえて、これからの方向性を決めたいと思います。</p>
Set up Wifi on Alpine Linux, Raspberry Pi Zero W2019-03-31T01:36:00+09:002019-03-31T01:36:00+09:00Junya Nakadatag:junyanakada.com,2019-03-31:/set-up-wifi-on-apline-linux-raspberry-pi-zero-w.html<p><a class="reference external" href="https://junyanakada.com/set-up-apline-linux-on-raspberry-pi-zero-w.html">この前 Raspberry Pi Zero WH に Alpine Linux をインストールしました。</a> つづきで、ネットワーク接続を設定します。</p>
<p>手持ちの Wifi ドングルを使 …</p><p><a class="reference external" href="https://junyanakada.com/set-up-apline-linux-on-raspberry-pi-zero-w.html">この前 Raspberry Pi Zero WH に Alpine Linux をインストールしました。</a> つづきで、ネットワーク接続を設定します。</p>
<p>手持ちの Wifi ドングルを使って接続を試みましたができませんでした。どうしようか?USB LAN アダプタを買うか?と思いましたが、いつも使っているモバイルルータは USB で接続できることを思い出しました。この方法でインターネットに接続することはできました。</p>
<p>ここまで、 <a class="reference external" href="https://tech.144lab.com/entry/rasp-alpine">Wifi のファームウェアが入っていないから、それをインストールするために他の方法でインターネットに接続する必要がある</a> ということだったので、どうにかインターネットに接続してきました。</p>
<p>次に <cite>linux-firmware-brcm</cite> をインストールします。しかしうまくできません。読み取り専用のパーティションにファームウェアのファイルをコピーしようとして失敗しています。</p>
<p>どうにも方法がみつかりません。お手上げです。ところが、コピー先のディレクトリを覗いてみるとファイルがあります。コピーに失敗したファイルと同名のファイルが既にあります。よーくよく考えると Alpine Linux のファームウェアにはじめから Wifi のファームウェアが入っていたのでは?</p>
<p>試しにもう一度 SD カードを作るところからやりなおしてみました。すると、特に Wifi のファームウェアをインストールすることなく Wifi を使うことができました。何が問題だったのかわかりませんが、Wifi を使えるようになりました。問題は正確な情報を得られずに思い込みで作業していたことでしょう。</p>
<p>でもリブートすると、また Wifi がつながりません。リブートする前に次のコマンドを実行しておいたら、リブート後に Wifi が使えるようになりました。</p>
<div class="highlight"><pre><span></span>rc-update add wpa_supplicant boot
</pre></div>
<p>Raspberry Pi をブートしたときに <cite>wpa_supplicant</cite> を起動するように設定する。コマンドです。</p>
<p>次にやることは、Python 開発環境構築でしょうか。</p>
2018 年度も終わり2019-03-30T01:22:00+09:002019-03-30T01:22:00+09:00Junya Nakadatag:junyanakada.com,2019-03-30:/end-of-fy2018.html<p>今日で 2018 年度も終わりです。振り返ると、この一年の主な仕事は自動テストの保守でした。いちからテストコードを書 …</p><p>今日で 2018 年度も終わりです。振り返ると、この一年の主な仕事は自動テストの保守でした。いちからテストコードを書くことはありませんでしたが、Selenuim WebDriver は常に私の傍らにありました。</p>
<p>Selenium といえば自動テストかスクレイピングがよく見かける用途ですが、ブラウザ操作を自動化するツールなので、それほどスキルがなくても意外と便利に使えます。ログを回収するために使ったりしました。</p>
<p>来年度のことはまだ聞かされていませんが、これからも活用できると良いなと思います。</p>
USBをMicro-Bへ変換するアダプタを買う2019-03-28T23:42:00+09:002019-03-28T23:42:00+09:00Junya Nakadatag:junyanakada.com,2019-03-28:/buy-usb-type-b-to-micro-b-adapter.html<p><a class="reference external" href="https://junyanakada.com/set-up-apline-linux-on-raspberry-pi-zero-w.html">Raspberry Pi Zero WH で Alpine Linux を使う準備をしています。</a> Wifi のファームウェアをダウンロードするために、Wifi ドングルを USB に挿さな …</p><p><a class="reference external" href="https://junyanakada.com/set-up-apline-linux-on-raspberry-pi-zero-w.html">Raspberry Pi Zero WH で Alpine Linux を使う準備をしています。</a> Wifi のファームウェアをダウンロードするために、Wifi ドングルを USB に挿さなくてはなりません。Wifi ドングルでつながるか心配ですが、手持ちのドングルがあるので、まずそれで試します。</p>
<p>その前に試しに Raspberry Pi 3 や 2 で試してみました。昨日、Zero WH 用につくった SD カードを挿して起動させてみましたが、どちらも駄目でした。シリアル通信ができないし、そもそも緑色の LED が点滅していて起動できていないようにも見えます。</p>
<p>結局、Zero WH に Wifi ドングルを挿さないことには始まりません。Zero WH に付いている USB Micro B コネクタに USB OTG ケーブルを挿して、その先に Wifi ドングルを挿します。USB OTG ケーブルを買います。</p>
<p>ということで探していると便利そうなものがありました。スイッチサイエンスの <a class="reference external" href="https://www.switch-science.com/catalog/3702/">USBをMicro-Bへ変換するアダプタ</a> です。</p>
<p>さっそく注文しました。明日の出荷で、届くのは土曜日でしょうか。楽しみです。</p>
Set up Alpine Linux on Raspberry Pi Zero W2019-03-28T00:08:00+09:002019-03-28T00:08:00+09:00Junya Nakadatag:junyanakada.com,2019-03-28:/set-up-apline-linux-on-raspberry-pi-zero-w.html<p>Raspberry Pi Zero WH に Alpine Linux をインストールしました。シリアルコンソールが使えることを確認しました。</p>
<p><a class="reference external" href="https://wiki.alpinelinux.org/wiki/Raspberry_Pi">Alpine Linux Wiki</a> の通りに SD カー …</p><p>Raspberry Pi Zero WH に Alpine Linux をインストールしました。シリアルコンソールが使えることを確認しました。</p>
<p><a class="reference external" href="https://wiki.alpinelinux.org/wiki/Raspberry_Pi">Alpine Linux Wiki</a> の通りに SD カードに OS のファイルを書き込みます。</p>
<p>その後、シリアル通信の設定をします。PC に SD カードを挿しておいて中のファイルをいじります。まず、SD カードのルートに <cite>usercfg.txt</cite> というファイルをつくって、次の一行を書きました。</p>
<div class="highlight"><pre><span></span><span class="nv">enable_uart</span><span class="o">=</span><span class="m">1</span>
</pre></div>
<p><cite>config.txt</cite> ではないのか?という疑問がありましたが、 <cite>config.txt</cite> を開いてみるとすぐわかりました。 <cite>usercfg.txt</cite> をインクルードしてくれます。</p>
<div class="highlight"><pre><span></span><span class="o">[</span>all<span class="o">]</span>
include usercfg.txt
</pre></div>
<p>せっかくなので自分で加える設定は <cite>usercfg.txt</cite> に書きました。そもそも Wiki にもそう書いてあるわけですが。</p>
<p>そうして一度 SD カードを Raspberry Pi に挿して起動させてみました。USBシリアル変換モジュールもつなげておいて起動させました。しかし、どうも通信していない様子。</p>
<p>調べてみると、 <a class="reference external" href="https://www.raspberrypi.org/documentation/configuration/uart.md">Raspberry Pi のドキュメント</a> に書いてありました。 <cite>cmdline.txt</cite> を書き換えます。 <cite>console=serial0,115200</cite> を書き加えます。もともとの <cite>cmdline.txt</cite> は次のようになっていました。</p>
<div class="highlight"><pre><span></span><span class="nv">modules</span><span class="o">=</span>loop,squashfs,sd-mod,usb-storage quiet dwc_otg.lpm_enable<span class="o">=</span><span class="m">0</span> <span class="nv">console</span><span class="o">=</span>tty1
</pre></div>
<p><cite>console=tty1</cite> の前に <cite>console=serial0,115200</cite> を挿れてみました。次のようにしました。</p>
<div class="highlight"><pre><span></span><span class="nv">modules</span><span class="o">=</span>loop,squashfs,sd-mod,usb-storage quiet dwc_otg.lpm_enable<span class="o">=</span><span class="m">0</span> <span class="nv">console</span><span class="o">=</span>serial0,115200 <span class="nv">console</span><span class="o">=</span>tty1
</pre></div>
<p>これで SD カードを Raspberry Pi に挿して起動します。</p>
<p>今度は、シリアル通信ができました。しかし、起動してからシリアル通信ができるようになるまでには数分かかるようです。Enter を叩いても何も表示されないので、だめかと思いましたが、トイレで用をたして戻ったらシリアルコンソールを叩けるようになっていました。正確な時間はわかりませんが、結構待たされます。</p>
<p>その後、Alpine Linux Wiki の手順に戻って <cite>setup-alpine</cite> を起動しました。途中で無線 LAN の設定をするところがあって、自分の家のアクセスポイントもリストに挙がってきたので、Wifi 使えるのかと思いましたが、使えるようにはなりませんでした。とりあえず今日のところはシリアルコンソールが叩ければ良しです。</p>
<p>GPIO が使えるのかという疑問もあったので、LED を繋いで試してみました。シェルからコマンドを LED を点灯、消灯させることができました。とりあえずこちらも OK です。でも Python ライブラリ <cite>GPIO Zero</cite> が使えるのかは、まだわかりません。最悪使えなくても、自分でデバイスファイルを叩けば何とかなりそうだということはわかりました。</p>
<p>次はインターネットにつなげられるかを確認します。ケーブルとかアダプタとか買わないと。</p>
Responder に出会う2019-03-27T00:52:00+09:002019-03-27T00:52:00+09:00Junya Nakadatag:junyanakada.com,2019-03-27:/meet-responder.html<p>前に <a class="reference external" href="https://junyanakada.com/swich-led-on-http.html">HTTP で Raspberry Pi に付けた LED を点消灯する</a> ということをやってみました。</p>
<p>このときは Bottle を使ったのですが、もうちょっと …</p><p>前に <a class="reference external" href="https://junyanakada.com/swich-led-on-http.html">HTTP で Raspberry Pi に付けた LED を点消灯する</a> ということをやってみました。</p>
<p>このときは Bottle を使ったのですが、もうちょっと実用的な印象の Flask を使ってみようかと物色していたら出会ったのが、 <a class="reference external" href="https://python-responder.org/en/latest/">Responder</a> です。</p>
<p>2018年リリースの新しい Web Framework みたいです。WebSocket をサポートしているのが魅力的な感じです。こいつが使えるとサーバからクライアントにデータをプッシュできます。</p>
<p>ところでこの Responder が Python 3.6 以降でしか使えないようなので、Raspberry Pi で使おうとすると自分で Python 3.6 をインストールしないといけません。Debian Strech のパッケージは 3.5 みたいなので。</p>
<p>思い切って Alpine Linux を使うという手もあります。こっちのパッケージは Python 3.6 です。</p>
<p>Alpine Linux のインストールには苦労するでしょう。インストール直後は、Wifi が使えません。Wifi を使うためのパッケージをインストールするためにインターネットに接続しなくてはいけませんが、使いたいのは Raspberry Pi Zero WH です。USB に挿して LAN につなげるアダプタが必要です。物自体は普通に売ってると思いますが、かんたんに使えるのだろうか。他にも、GPIO でシリアル通信ができるのかということも問題です。持っていないということもあるのですが、ディスプレイとキーボードをつないでいじるのは何となく格好悪い感じがして嫌です。そんなことを言っていると何も設定できないということになりかねません。</p>
<p>Raspberry Pi Zero WH に Alpine Linux をインストールするのが、今月いっぱいの課題になりそうです。</p>
やっぱり Linux Mint は Xfce より Mate だな2019-03-25T22:29:00+09:002019-03-25T22:29:00+09:00Junya Nakadatag:junyanakada.com,2019-03-25:/feel-better-mate-than-xfce-on-linux-mint-again.html<p>海老名に帰って、こっちの ThinkPad X200s も <a class="reference external" href="https://linuxmint.com/">Linux Mint 19.1 Mate</a> をインストールしました。</p>
<p>Xfce のときは、ターミナルの立ち上がりになんと …</p><p>海老名に帰って、こっちの ThinkPad X200s も <a class="reference external" href="https://linuxmint.com/">Linux Mint 19.1 Mate</a> をインストールしました。</p>
<p>Xfce のときは、ターミナルの立ち上がりになんとなく、ひと呼吸の間があるような感じがしましたが、Mate にしたらサクッと立ち上がります。Xfce 自体がいまいちということではないと思います。しばらく前に同じマシンで Xfce を採用したディストリビューション使っていましたが、そのときはサクッと立ち上がりましたから。</p>
<p>そうそう、忘れずに書いておかないと。 <a class="reference external" href="https://junyanakada.com/kill-capslock-on-linux.html">CapsLock は抹殺しました。</a></p>
Markdown に頼らずテキストを書く2019-03-24T21:42:00+09:002019-03-24T21:42:00+09:00Junya Nakadatag:junyanakada.com,2019-03-24:/write-text-without-relying-on-markdown.html<p><a class="reference external" href="https://junyanakada.com/pages/whoami.html">おまえだれよ</a> を直しました。今までは、reStructuredText を使って箇条書きにしていましたが、ひとつの文章に書き直しました。</p>
<p>いろい …</p><p><a class="reference external" href="https://junyanakada.com/pages/whoami.html">おまえだれよ</a> を直しました。今までは、reStructuredText を使って箇条書きにしていましたが、ひとつの文章に書き直しました。</p>
<p>いろいろな Web サービスでの自己紹介に使いまわしができるようにと思って reStructuredText で書いていました。と言っても、箇条書きなので Markdown との違いはほぼありませんけども。</p>
<p>reStructuredText にせよ、Markdown にせよ、そのまま Web サービスの自己紹介に使おうと思っても、行頭の空白文字が削除されることがあったり、文字数制限のために空白文字を消したりと、案外そのままでは使えないことが多いなと思いました。</p>
<p>そういうことで、箇条書きはやめて、段落というかひとつの文章という体裁で書き直しました。140字で収まるようにしました。今はどうか知りませんが、Twitter が140字までだった記憶があったので。</p>
<p>変に箇条書きにするよりも、普通に文章にしたほうが読みやすい感じもします。本当に使いまわしができるテキストを書こうと思ったら、何かのフォーマットに頼らないのが一番でした。</p>
C Runtime Routine が読めなくなった… がっかり2019-03-23T21:42:00+09:002019-03-23T21:42:00+09:00Junya Nakadatag:junyanakada.com,2019-03-23:/disappoint-myself-to-had-become-can-not-to-read-crt.html<p>久しぶりに LPC1114FN28 で遊ぼうと思って、前に書いた C Runtime Routine を引っ張り出してきました。が、読んでも良くわからなくなってし …</p><p>久しぶりに LPC1114FN28 で遊ぼうと思って、前に書いた C Runtime Routine を引っ張り出してきました。が、読んでも良くわからなくなってしまいました。去年の夏に書いたコードです。当時は理解していたつもりだったのですが、その理解は知識が定着するのには不充分だったのでしょう。何年もかかって、やっとここまでできたと思っていました。それだけにがっかりした度合いも大きいです。</p>
<p>今後どうして行こうか、方向性を出さなければと思っています。それほど見つからない ARM の CRT を書くための情報を探すか。遠回りのようでも AVR を使ってみるか。いっそ MCU のプログラミングはやめて Python に集中するか。</p>
今日から解禁 生しらすを食べる2019-03-23T01:07:00+09:002019-03-23T01:07:00+09:00Junya Nakadatag:junyanakada.com,2019-03-23:/eat-fresh-whitebait-at-season-beginning.html<p>実家からそう遠くないところに用宗港はあります。しらす漁で有名な漁港です。禁漁期間が1月中頃から3月中頃ま …</p><p>実家からそう遠くないところに用宗港はあります。しらす漁で有名な漁港です。禁漁期間が1月中頃から3月中頃までと覚えていたので、そろそろ解禁したただろうと調べてみたら、 <a class="reference external" href="https://excite.mochimune.jp/topics/2019/0320_1022.html">今日、22日解禁</a> でした。せっかく解禁初日なので、これは食べに行こうということで、大慌てで出て行きました。いつも、漁協直営のどんぶりハウスで食べます。屋外で食べることになるので、今日は暖かくて良かったです。</p>
<p>ここ数年で用宗も開発をしているようで、 エキサイト用宗 <a class="reference external" href="https://excite.mochimune.jp">https://excite.mochimune.jp</a> というウェブサイトも作られています。何を使って作っているのかな?と探してみたら、どうも Movable Type を使っているようです。CSS は Bootstrap です。</p>
<p>なんだか懐かしい感じのする Movable Type ですが、私だけでしょうか。オープンソースの WordPress と違い、Movable Type は一企業の製品であるせいか、個人のサイトを作る CMS としてはあまり名前が挙がらないように思います。しかし、現役です。日本企業の製品であるので、日本語でサポートが受けられるので、法人であれば WordPress よりも良いということはあるでしょう。</p>
<p>話があらぬ方向に行きましたが、生しらす丼おいしかったです。他のお客さんが話していた話では、江ノ島とかで食べると 2000 円くらいするそうで。</p>
Linux Mint は Xfce より Mate のほうが良くできている気がする2019-03-22T01:25:00+09:002019-03-22T01:25:00+09:00Junya Nakadatag:junyanakada.com,2019-03-22:/feel-better-mate-than-xfce-on-linux-mint.html<p>実家に帰って PC を起動したら、どういうわけかまともに動きません。こんな夜更けに Linux のインストール作業をしまし …</p><p>実家に帰って PC を起動したら、どういうわけかまともに動きません。こんな夜更けに Linux のインストール作業をしました。今まで使っていた <a class="reference external" href="https://linuxmint.com/">Linux Mint 19.1 Mate</a> をインストールしました。Live USB を残しておいて良かった…。</p>
<p>この前 Linux Mint 19.1 Xfce をインストールのと同じ ThinkPad X200s にインストールしました。機種は同じですが個体は違います。</p>
<p>機種は同じはずです。同じスペックのはずなのですが、この前の Xfce よりも今度の Mate のほうがサクサク動きます。リソース消費は Mate のほうが少し大きいはずです。</p>
<p>Linux Mint は Cinnamon と Mate を普及させるためにスタートしたプロジェクトだと読んだことがあります。ソースは覚えていませんが。そんなこともあるのか Xfce よりも Mate のほうが完成度が高く感じます。</p>
<p>そうそう、もちろん <a class="reference external" href="https://junyanakada.com/kill-capslock-on-linux.html">CapsLock は殺しました。</a></p>
Docstring is not comment2019-03-20T21:27:00+09:002019-03-20T21:27:00+09:00Junya Nakadatag:junyanakada.com,2019-03-20:/docstring-is-not-comment.html<p><a class="reference external" href="https://junyanakada.com/try-python-argparse.html">argparse は便利です。</a> 簡単にコマンドラインオプションがつくれます。ヘルプもつくってくれます。</p>
<p>ただ、素敵なヘルプがつく …</p><p><a class="reference external" href="https://junyanakada.com/try-python-argparse.html">argparse は便利です。</a> 簡単にコマンドラインオプションがつくれます。ヘルプもつくってくれます。</p>
<p>ただ、素敵なヘルプがつくれると、やっぱりしっかりとつくらないと、と思うわけです。docstring も書いて、argeparse 用にヘルプメッセージも書く。似たような内容になるので面倒は面倒です。両方をメンテナンスしなければなりません。</p>
<p>docstring はコメントではないというところに注目します。docstring は、コメントを決まったフォーマットで書いておいて、そこからドキュメントを生成しようというものではありません。docstring は __doc__ 属性に格納されます。</p>
<p>ですので、docstring は、プログラムの中で、呼び出して、加工して、利用することができます。これは docstring から argparse のヘルプメッセージをつくることも可能だということです。</p>
<p>docstring を書くのを面倒臭がる私には、とってもありがたいです。</p>
KILL CapsLock on Linux2019-03-19T22:15:00+09:002019-03-19T22:15:00+09:00Junya Nakadatag:junyanakada.com,2019-03-19:/kill-capslock-on-linux.html<p>ThinkPad X200s に <a class="reference external" href="https://linuxmint.com/">Linux Mint 19.1 Xfce</a> をインストールしました。古い PC ですが、SSD に交換してそこそこ使えています。X240 と比べてしまうと …</p><p>ThinkPad X200s に <a class="reference external" href="https://linuxmint.com/">Linux Mint 19.1 Xfce</a> をインストールしました。古い PC ですが、SSD に交換してそこそこ使えています。X240 と比べてしまうと遅いと感じますが、それでも快適に使えると言えるレベルです。</p>
<p>Linux Mint に限らず、Linux をインストールして真っ先にすることは、CapsLock キーを殺して Ctrl キーにすることです。最近のディストリビューションは systemd を使っているので、だいたい同じようにできるはずです。 <a class="reference external" href="https://wiki.archlinux.org/index.php/Xorg/Keyboard_configuration#Using_localectl">Arch Linux の Wiki</a> を参考にしました。</p>
<p>次のコマンドで CapsLock を殺せます。</p>
<div class="highlight"><pre><span></span>sudo localectl set-x11-keymap us pc105 <span class="s2">""</span> ctrl:nocaps
</pre></div>
<p><cite>ctrl:nocaps</cite> がポイントです。 <cite>us</cite> と <cite>pc105</cite> は英語キーボードの場合で、日本語キーボードでは違います。</p>
<p>なぜか Windows PC では A キーの横に CapsLock が鎮座しています。Unix 系の OS では、そこに Ctrl が無いと窒息するほど窮屈です。Windows でも CapsLock を殺して、Ctrl にしていますが、それで不便はまったくありません。この点だけは Mac がうらやましい。</p>
<p>嗚呼、CapsLock を殲滅したい。</p>
HTTP で LED を点消灯2019-03-18T20:55:00+09:002019-03-18T20:55:00+09:00Junya Nakadatag:junyanakada.com,2019-03-18:/swich-led-on-http.html<p><a class="reference external" href="https://junyanakada.com/learn-a-lesson-about-the-study-meeting-again.html">Shonan.pyもくもく会で書いたプログラムです。</a> Raspberry Pi にサーバを立てて、Web API 越しに LED を点消灯させます。動作するものは作 …</p><p><a class="reference external" href="https://junyanakada.com/learn-a-lesson-about-the-study-meeting-again.html">Shonan.pyもくもく会で書いたプログラムです。</a> Raspberry Pi にサーバを立てて、Web API 越しに LED を点消灯させます。動作するものは作れました。</p>
<p>サーバのコードです。Raspberry Pi に置きます。LED は GPIO 17 につなぎます。</p>
<p>PUT メソッドで、<cite>{サーバのIPアドレス}/led?status=on</cite> などとリクエストすると動きます。on / off 以外がリクエストされると 400 を返します。</p>
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python3</span>
<span class="kn">import</span> <span class="nn">bottle</span>
<span class="kn">from</span> <span class="nn">bottle</span> <span class="kn">import</span> <span class="n">HTTPResponse</span>
<span class="kn">import</span> <span class="nn">gpiozero</span> <span class="k">as</span> <span class="nn">gpio</span>
<span class="nd">@bottle</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="s1">'/led'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update_led_status</span><span class="p">():</span>
<span class="n">status</span> <span class="o">=</span> <span class="n">bottle</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">status</span>
<span class="k">if</span> <span class="n">status</span> <span class="o">==</span> <span class="s1">'on'</span><span class="p">:</span>
<span class="n">led</span><span class="o">.</span><span class="n">on</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'on'</span><span class="p">)</span>
<span class="k">return</span> <span class="n">HTTPResponse</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="p">(</span><span class="s1">'LED: '</span> <span class="o">+</span> <span class="n">status</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">status</span> <span class="o">==</span> <span class="s1">'off'</span><span class="p">:</span>
<span class="n">led</span><span class="o">.</span><span class="n">off</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'off'</span><span class="p">)</span>
<span class="k">return</span> <span class="n">HTTPResponse</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="p">(</span><span class="s1">'LED: '</span> <span class="o">+</span> <span class="n">status</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Unknown status'</span><span class="p">)</span>
<span class="k">return</span> <span class="n">HTTPResponse</span><span class="p">(</span><span class="n">status</span><span class="o">=</span><span class="mi">400</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="s1">'LED: Unkown status'</span><span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">led</span> <span class="o">=</span> <span class="n">gpio</span><span class="o">.</span><span class="n">LED</span><span class="p">(</span><span class="mi">17</span><span class="p">)</span>
<span class="n">bottle</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s1">'raspberrypi.local'</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">8000</span><span class="p">)</span>
</pre></div>
<p>そしてクライアントのコード。PC に置いてコマンドラインで実行します。引数で on / off を指定します。</p>
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python3</span>
<span class="kn">import</span> <span class="nn">argparse</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">requests</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s1">''</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s1">'status'</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s1">'led status'</span><span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="s1">'http://raspberrypi.local:8000/led'</span><span class="p">,</span>
<span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="s1">'status'</span><span class="p">:</span> <span class="n">args</span><span class="o">.</span><span class="n">status</span><span class="p">})</span>
<span class="nb">print</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</pre></div>
<p>いろいろ不足なところはあるでしょうけど、とりあえず動きます。</p>
<p>相変わらず docstring が全然書いてない。</p>
勉強会の教訓 ふたたび2019-03-17T22:10:00+09:002019-03-17T22:10:00+09:00Junya Nakadatag:junyanakada.com,2019-03-17:/learn-a-lesson-about-the-study-meeting-again.html<p><a class="reference external" href="https://shonan-py.connpass.com/event/121202/">Shonan.pyもくもく会 #12</a> に参加しました。 <a class="reference external" href="https://junyanakada.com/learn-a-lesson-about-the-study-meeting.html">この前、失敗したにもかかわらず、</a> 今度も電源を忘れました。モバイルバッテリどこ …</p><p><a class="reference external" href="https://shonan-py.connpass.com/event/121202/">Shonan.pyもくもく会 #12</a> に参加しました。 <a class="reference external" href="https://junyanakada.com/learn-a-lesson-about-the-study-meeting.html">この前、失敗したにもかかわらず、</a> 今度も電源を忘れました。モバイルバッテリどころか AC アダプタを。</p>
<p>仕方ないのでGPIO から給電しようとしたら、配線をまちがえて焦げ臭いにおいを漂わせ、正しく配線したら手持ちの機材では電圧が不安定でまともに動かない。</p>
<p>USB シリアル変換モジュール用に USB ケーブルを 1 本持っていたので、PC から給電して SSH でアクセスする方法でなんとかならないかと Web 検索を繰り返しました。どうにか、 <a class="reference external" href="https://dev.classmethod.jp/hardware/raspberrypi-remote-connect/">SD カードの中身をいじって</a> Wifi 接続を設定する方法を見つけました。やっと SSH でアクセスしました。</p>
<p>そもそも Raspberry Pi 用の機材一式がまとまってないのが問題です。</p>
<p>Raspberry Pi にサーバを立てて、Web API 越しに LED を点消灯させるプログラムを書きました。いろいろ雑ですが、動作するものは作れました。</p>
micro:bit をはじめて手にする2019-03-16T21:17:00+09:002019-03-16T21:17:00+09:00Junya Nakadatag:junyanakada.com,2019-03-16:/try-microbit-at-first-touch.html<p><a class="reference external" href="https://kamakurapython.connpass.com/event/121967/">鎌倉Pythonもくもく会 #4</a> に参加しました。今日は買ったばかりの micro:bit を持っていきました。まずは開梱するところから始 …</p><p><a class="reference external" href="https://kamakurapython.connpass.com/event/121967/">鎌倉Pythonもくもく会 #4</a> に参加しました。今日は買ったばかりの micro:bit を持っていきました。まずは開梱するところから始まりです。</p>
<p><a class="reference external" href="https://codezine.jp/article/detail/11328">ゲームの作り方を紹介したページ</a> を見つけて、それをつくることに挑戦。ただし、このページで使っているのは、Python ではありません。</p>
<p>結果的には完成できず終了。でも、とても楽しくプログラミングができました。マトリクス状の LED があって、タクトスイッチも付いていて、センサーやもあります。そして、無線通信もできる。いろいろ遊べそうです。自分で回路をつくってハンダ付けするのも楽しいですが、得意ではないので、手軽に使えるボードも便利です。</p>
<p>あまり無理せず、LED とタクトスイッチでゲームをつくることに挑戦して行くつもりです。</p>
Python の Argeparse を使ってみる2019-03-15T21:47:00+09:002019-03-15T21:47:00+09:00Junya Nakadatag:junyanakada.com,2019-03-15:/try-python-argparse.html<p>家ではLinux ですが、会社では Windows を使っています。きっかけはいろいろですが、ときどき Windows の CLI にいらつかされます。</p>
<p>できる …</p><p>家ではLinux ですが、会社では Windows を使っています。きっかけはいろいろですが、ときどき Windows の CLI にいらつかされます。</p>
<p>できるだけ GUI を使うように心がけてはいるのですが、久しぶりに <a class="reference external" href="http://todotxt.org/">Todo.txt</a> CLI を使ってみたくなり、Git についてくる Bash で動かしてみたら、これが遅い。とんでもなく遅い。バリバリとタスクを追加することを考えると、まったく使えないレベルです。</p>
<p>Python でそれっぽいものを書いて、コマンドプロンプトで使ったほうが良さそうです。そんなときに <a class="reference external" href="https://docs.python.org/ja/3/howto/argparse.html">Argparse</a> です。</p>
<p>いつもはクリックやドラッグ・アンド・ドロップで使えるようにだけしているので、それほど複雑ではありません。今度のように、Todo.txt CLI っぽいものをつくろうとするとサブコマンドが要ります。サブコマンドもそんなに難しくありません。これを <cite>sys.argv</cite> をいろいろといじって動かそうとすると、途方に暮れることでしょう。</p>
<p>Argparse は覚えておくと便利です。</p>
Raspberry Pi をセットアップしてみる2019-03-14T22:57:00+09:002019-03-14T22:57:00+09:00Junya Nakadatag:junyanakada.com,2019-03-14:/try-to-set-up-raspberry-pi.html<p>SD カードに Raspbian を書き込んで、Raspberry Pi を起動。シリアルでアクセスして、設定をしてみるところまで、やってみました。Raspberry Pi は …</p><p>SD カードに Raspbian を書き込んで、Raspberry Pi を起動。シリアルでアクセスして、設定をしてみるところまで、やってみました。Raspberry Pi は Zero WH です。</p>
<p><a class="reference external" href="https://www.raspberrypi.org/downloads/raspbian/">Raspbian のダウンロードページ</a> で Lite をダウンロードします。数日前にダウンロードだけは済ませておいたので、今日はその先です。同じページに、インストールガイドへのリンクがあるので開きます。</p>
<p>NOOBS のほうがおすすめ、というようなことが書いてあります。でも Raspbian も普通に <cite>dd</cite> で書き込めば良いようなので、そのまま Raspbian で進めます。「普通に <cite>dd</cite> で」というのがそれほど普通でないということでしょうか。</p>
<p>Linux を使ってインストールする方法が書いてあるページを読みます。 <cite>lsblk</cite> という素敵なツールについての説明があります。接続してあるデバイスのデバイスファイルのリストが見られます。わかりやすく見せてくれます。</p>
<p>いろいろと細かいことが書いてはあるのですが、時間がないのでとにかく <cite>dd</cite> しました。</p>
<p>いよいよ起動します。シリアル通信ができるように配線して電源投入。minicom でアクセスしてみましたが、つながりません。調べてみると、 <a class="reference external" href="https://www.raspberrypi.org/documentation/configuration/uart.md">UART(シリアル)は disable が default みたいです。</a> Raspberry Pi の SD カードの <cite>boot</cite> というパーティションに <cite>config.txt</cite> というファイルがあるので、そこに <cite>enable_uart=1</cite> を書いて保存します。</p>
<p>もう一度、起動。今度は大丈夫です。そしてログインですが、ユーザ名とパスワードは? <cite>pi</cite> と <cite>raspberry</cite> <a class="reference external" href="https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/6">だそうです。</a></p>
<p>後は、設定を少ししておきます。 <a class="reference external" href="https://www.raspberrypi.org/documentation/configuration/raspi-config.md">raspi-config</a> で設定します。パスワードくらいは変えておきます。そしてネットワーク設定。SSID を入力するのが面倒ですが、簡単です。</p>
<p>後は、 <cite>Advanced Options</cite> の中にある <cite>Expand Filesystem</cite> を実行します。 <cite>dd</cite> で書き込んだので、ファイルシステムが書き込んだイメージのサイズになっています。これを SD カードのサイズに合わせて拡げてくれます。NOOBS でインストールすると勝手にやってくれるみたいですね。</p>
<p>これでとりあえず使えるようになったはず。</p>
シリアルで Raspberry Pi にアクセスしてみる2019-03-13T21:57:00+09:002019-03-13T21:57:00+09:00Junya Nakadatag:junyanakada.com,2019-03-13:/try-to-access-raspberry-pi-on-serial.html<p><a class="reference external" href="https://junyanakada.com/try-minicom.html">minicom が使えるようになったので、</a> Raspberry Pi にアクセスしてみます。</p>
<p>昔、セットアップした Raspberry Pi 2 を、そのまま放置していたので …</p><p><a class="reference external" href="https://junyanakada.com/try-minicom.html">minicom が使えるようになったので、</a> Raspberry Pi にアクセスしてみます。</p>
<p>昔、セットアップした Raspberry Pi 2 を、そのまま放置していたので、それにアクセスしました。あまり時間をかけたくなかったので、ちょうど良いところに放置されていました。前にシリアル通信をしたこともあるので、うまく動かなかった場合に Raspberry Pi 側に問題がないことがある程度担保されています。</p>
<p>USB シリアル変換モジュールと Raspberry Pi の GPIO をつなぎます。Raspberyy Pi の電源は入れずに配線したほうが良いでしょう。GPIO の配置は Web 検索すればすぐに見つかります。GND 同士を配線して、TX と RX をクロスして配線します。これでハードウェアの準備はできました。電源も投入。</p>
<p>ソフトウェアは minicom を使います。 <a class="reference external" href="https://junyanakada.com/try-minicom.html">ループバックを試したとき</a> と同じ設定でつながるはずなので、その設定を使います。</p>
<div class="highlight"><pre><span></span>sudo minicom loop
</pre></div>
<p>難なくつながりました。無事にログインもできました。</p>
minicom を試す2019-03-12T23:17:00+09:002019-03-12T23:17:00+09:00Junya Nakadatag:junyanakada.com,2019-03-12:/try-minicom.html<img alt="Keyboard" src="images/keyboard.jpg" />
<p><a class="reference external" href="https://junyanakada.com/try-pyserial-on-cli.html">pySerial でシリアル通信をしてみましたが、</a> minicom でも試してみました。</p>
<p>公式サイトがどこにあるのかよくわかりませんでした …</p><img alt="Keyboard" src="images/keyboard.jpg" />
<p><a class="reference external" href="https://junyanakada.com/try-pyserial-on-cli.html">pySerial でシリアル通信をしてみましたが、</a> minicom でも試してみました。</p>
<p>公式サイトがどこにあるのかよくわかりませんでした。 <a class="reference external" href="https://en.wikipedia.org/wiki/Minicom">英語の Wikipedia</a> によると、 <a class="reference external" href="https://salsa.debian.org/minicom-team/minicom">https://salsa.debian.org/minicom-team/minicom</a> みたいですが、リポジトリがあるだけでドキュメントらしいものは見当たりません。man コマンドで読みましょう。</p>
<p>インストールは Linux ディストリビューションのパッケージを使えば良いと思います。 Ubuntu であれば APT でインストールできます。</p>
<p><cite>$HOME/.minirc.dfl</cite> に設定を書いておくと、その設定を使ってくれます。</p>
<p><cite>$HOME/.minirc.dfl</cite> の中身は次のようにします。pySerial のときと同じようにループバックで試したので、このようにしています。</p>
<pre class="literal-block">
pu port /dev/ttyUSB0
pu baudrate 115200
pu bits 8
pu parity N
pu stopbits 1
pu rtscts No
pu xonxoff No
</pre>
<p><cite>rtscts</cite> は Hardware Flow Control で、 <cite>xonxoff</cite> は Software Flow Control です。</p>
<p>次のコマンドで起動できます。 <cite>/dev/ttyUSB0</cite> のパーミッションがないので <cite>sudo</cite> を使います。</p>
<div class="highlight"><pre><span></span>sudo minicom
</pre></div>
<p>終了は <cite>Ctrl + a</cite> の後に <cite>x</cite> です。 <cite>Ctrl + a</cite> の後に <cite>z</cite> でヘルプが出ます。</p>
<p><cite>$HOME/.minirc.configuration</cite> に設定を書いて、次のようにパラメータを渡すと、その設定を使ってくれます。</p>
<div class="highlight"><pre><span></span>sudo minicom configuration
</pre></div>
<p><cite>configuration</cite> は任意の文字列を付けてください。今回は <cite>$HOME/.minirc.loop</cite> としました。ですので、次のようにします。</p>
<div class="highlight"><pre><span></span>sudo minicom loop
</pre></div>
<p>自分でファイルをつくっても良いと思いますが、minicom で設定して保存されたファイルをコピーしてつくりました。</p>
<p><cite>-s</cite> オプションで起動すると設定をすることができます。</p>
<div class="highlight"><pre><span></span>sudo minicom -s
</pre></div>
<p>メニューが開くので、 Serial port setup を選んで設定します。先に書いて置いた設定ファイルの内容を参考に設定します。設定を変更しなかったところは保存したときにファイルに書き込まれないようなので、デフォルトのままで良い場合もわざわざ設定し直します。</p>
<p>設定が終わったら、Save setup as dfl を選択します。 <cite>/etc/minicom/minirc.dfl</cite> に保存されます。このファイルを <cite>$HOME/.minirc.dfl</cite> にコピーするなりして設定ファイルをつくります。</p>
<p>通信する対象によって設定は変わるので、 <cite>$HOME/.minirc.configuration</cite> (configuration は任意の文字列) で使うのが良さそうです。</p>
pySerial をコマンドラインで使う2019-03-11T22:07:00+09:002019-03-11T22:07:00+09:00Junya Nakadatag:junyanakada.com,2019-03-11:/try-pyserial-on-cli.html<img alt="Keyboard" src="images/keyboard.jpg" />
<p>Raspberry Pi を操作するためにシリアル通信を使いたいと思います。たいした理由はありません。HDMI 接続のディスプレイをも …</p><img alt="Keyboard" src="images/keyboard.jpg" />
<p>Raspberry Pi を操作するためにシリアル通信を使いたいと思います。たいした理由はありません。HDMI 接続のディスプレイをもっていないからです。</p>
<p>せっかく Python を使うので、 <a class="reference external" href="http://pythonhosted.org/pyserial/">pySerial</a> を使ってみたいと思います。</p>
<p>まず、 venv で仮想環境をつくって有効にしておきます。</p>
<p>その上で、 <a class="reference external" href="https://pythonhosted.org/pyserial/pyserial.html#from-pypi">ドキュメントどおりに</a></p>
<div class="highlight"><pre><span></span>pip install pyserial
</pre></div>
<p>これでインストールはされました。</p>
<p>とりあえずループバックで試したいので、USB シリアル変換アダプタを PC の USB ポートにつないで、TX と RX をつなぎます。</p>
<p>そうしておいて、 <a class="reference external" href="https://pythonhosted.org/pyserial/tools.html">miniterm.py を起動します。</a></p>
<div class="highlight"><pre><span></span>miniterm.py /dev/ttyUSB0 <span class="m">115200</span>
</pre></div>
<p>するとエラーです。</p>
<div class="highlight"><pre><span></span>could not open port <span class="s1">'/dev/ttyUSB0'</span>: <span class="o">[</span>Errno <span class="m">13</span><span class="o">]</span> could not open port /dev/ttyUSB0: <span class="o">[</span>Errno <span class="m">13</span><span class="o">]</span> Permission denied: <span class="s1">'/dev/ttyUSB0'</span>
</pre></div>
<p><cite>sudo</cite> を付けてみます。</p>
<div class="highlight"><pre><span></span>sudo miniterm.py /dev/ttyUSB0 <span class="m">115200</span>
</pre></div>
<p>エラーです。</p>
<div class="highlight"><pre><span></span>sudo: miniterm.py: <span class="nb">command</span> not found
</pre></div>
<p>次のようにも起動できるので試します。</p>
<div class="highlight"><pre><span></span>sudo python -m serial.tools.miniterm /dev/ttyUSB0 <span class="m">115200</span>
</pre></div>
<p>エラーです。</p>
<div class="highlight"><pre><span></span>/usr/bin/python: No module named serial.tools
</pre></div>
<p>デバイスファイルのパーミッションを変更すれば使えるかもしれませんが、めんどくさそうなのでやりません。そうすると、venv の上では動かないように思います。</p>
<p>venv なしで pySerial をインストールして動かしてみます。Ubuntu 18.04 では Python3 用の pip はインストールされていません。 <cite>python3-pip</cite> をインストールしておきます。</p>
<p>Ubuntu の場合は インストールに <cite>pip3</cite> を使います。</p>
<div class="highlight"><pre><span></span>pip3 install pyserial
</pre></div>
<p>デバイスファイルのパーミッションがないのは、さっきと同じなので sudo を付けてみます。</p>
<div class="highlight"><pre><span></span>sudo miniterm.py /dev/ttyUSB0 <span class="m">115200</span>
</pre></div>
<p>エラーです。</p>
<div class="highlight"><pre><span></span>sudo: miniterm.py: <span class="nb">command</span> not found
</pre></div>
<p>これではどうか。</p>
<div class="highlight"><pre><span></span>sudo python3 -m serial.tools.miniterm /dev/ttyUSB0 <span class="m">115200</span>
</pre></div>
<p>起動しました。</p>
<div class="highlight"><pre><span></span>--- Miniterm on /dev/ttyUSB0 <span class="m">15200</span>,8,N,1 ---
--- Quit: Ctrl+<span class="o">]</span> <span class="p">|</span> Menu: Ctrl+T <span class="p">|</span> Help: Ctrl+T followed by Ctrl+H ---
</pre></div>
<p>キーボードを叩くとターミナルに文字が表示されます。RX と TX をつないであるのでループバックします。つながっていないと何も表示されません。</p>
<p>動きはしましたが、Linux ではシステムが Python を使っていたりするので、仮想環境無しでパッケージをインストールするのはちょっといやな感じがします。目的は Raspberry Pi を操作することではあるので、他のソフトウェア、例えば minicom とかを使ってみようと思います。</p>
Linux Mint のドキュメントを探す2019-03-11T00:57:00+09:002019-03-11T00:57:00+09:00Junya Nakadatag:junyanakada.com,2019-03-11:/find-linux-mint-document.html<p><a class="reference external" href="https://junyanakada.com/begin-to-contribute-with-bug-reporting.html">昨日、OSS Gate のワークショップに参加しました。</a> いつも使っている <a class="reference external" href="https://linuxmint.com/">Linux Mint</a> のドキュメントを探してみました。</p>
<p>とってもわか …</p><p><a class="reference external" href="https://junyanakada.com/begin-to-contribute-with-bug-reporting.html">昨日、OSS Gate のワークショップに参加しました。</a> いつも使っている <a class="reference external" href="https://linuxmint.com/">Linux Mint</a> のドキュメントを探してみました。</p>
<p>とってもわかりやすいところにあります。公式サイトにさえたどり着ければすぐに見つかります。気付かされたのは、こんなにわかりやすいところにあるのに、今まで気付いていなかったこと。ドキュメントを読むことにあまりにも無関心だったことに気付かされました。</p>
バグレポートからはじめるコントリビュート2019-03-10T01:17:00+09:002019-03-10T01:17:00+09:00Junya Nakadatag:junyanakada.com,2019-03-10:/begin-to-contribute-with-bug-reporting.html<p><a class="reference external" href="https://oss-gate.doorkeeper.jp/events/86157">OSS Gate東京ワークショップ</a> に参加しました。OSS 開発未経験者が実際に開発に参加することを体験するワークショップ …</p><p><a class="reference external" href="https://oss-gate.doorkeeper.jp/events/86157">OSS Gate東京ワークショップ</a> に参加しました。OSS 開発未経験者が実際に開発に参加することを体験するワークショップです。</p>
<p>学んだことを挙げてみます。</p>
<ul class="simple">
<li>ドキュメントどおりに動かしてみてうまく動かないところをレポートする。</li>
<li>Google や Qiita で探して済ませるのではなくレポートにする。</li>
<li>作業メモは細かく取る。ドキュメントに書いてあってもメモに書いておく。</li>
<li>遠慮せずにレポートする。</li>
<li>英語で書かなくてはならない。でも難しく書く必要はない。</li>
</ul>
<p>バグレポートから始めれば良いのです。見方を変えると、OSS にコントリビュートしているからと言って、それがプログラミングをしているというわけではないということです。</p>
<p>よく考えるとプログラムを書くよりも使う機会のほうが圧倒的に多いです。そもそもプログラムを書くということは、プログラムを書くためのプログラムを使っているということでもあります。</p>
doctest に挑戦2019-03-08T23:47:00+09:002019-03-08T23:47:00+09:00Junya Nakadatag:junyanakada.com,2019-03-08:/try-doctest.html<p>doctest をやってみました。意外と難しい。REPL で改行コードを入れるのが、ちょっとよくわかりません。テキストファイルから …</p><p>doctest をやってみました。意外と難しい。REPL で改行コードを入れるのが、ちょっとよくわかりません。テキストファイルから読み込んだ文字列を引数とする関数のテストをしたかったのですが、改行が入った文字列をどうやったら良いのか。そのまま改行してしまうと SyntanError になりました。</p>
<div class="highlight"><pre><span></span><span class="o">>>></span> <span class="nb">print</span><span class="p">(</span><span class="s1">'Raspberry</span><span class="se">\\</span><span class="s1">nApple'</span><span class="p">)</span>
<span class="n">Raspberry</span>\<span class="n">nApple</span>
</pre></div>
<p>この投稿の reStructuredText を doctest でテストした結果です。 <cite>-v</cite> オプション付きで実行した出力です。</p>
<pre class="literal-block">
Trying:
print('Raspberry\\nApple')
Expecting:
Raspberry\nApple
ok
1 items passed all tests:
1 tests in try-doctest.rst
1 tests in 1 items.
1 passed and 0 failed.
Test passed.
</pre>
<p>改行コードは <cite>\\n</cite> で良いのか?もともとの会社で書いたコードは最終的に関数の返り値をテキストファイルに書くコードです。その書き出したファイルの中身は問題ありませんでした。</p>
<p>しかし、なんかすっきりしない。こういうときは設計がなんかまずいのかな、などと思っています。</p>
求む Raspberry pi GPIO リファレンス2019-03-07T23:27:00+09:002019-03-07T23:27:00+09:00Junya Nakadatag:junyanakada.com,2019-03-07:/want-raspberry-pi-gpio-reference-card.html<p>前に見かけて便利そうだなと思って Raspberry pi の GPIO の配置が印刷されたカードを探しました。</p>
<p>…なかなか見つからない。紙に …</p><p>前に見かけて便利そうだなと思って Raspberry pi の GPIO の配置が印刷されたカードを探しました。</p>
<p>…なかなか見つからない。紙に印刷して、というのも見つかりましたが、それではなく。</p>
<p>やっと <a class="reference external" href="https://www.adafruit.com/product/2263">Adafruit GPIO Reference Card for Raspberry Pi Model B+/Pi 2/Pi 3</a> を見つけましたが、日本で扱っているところあるだろうか。</p>
Maker 魂を呼び覚ますビデオ2019-03-06T22:37:00+09:002019-03-06T22:37:00+09:00Junya Nakadatag:junyanakada.com,2019-03-06:/whet-my-appetite-for-making.html<p>なかなか平日は自分のプロジェクトに取りかかれません。と言って休日もダメだったりします。正直、勉強会がなけれ …</p><p>なかなか平日は自分のプロジェクトに取りかかれません。と言って休日もダメだったりします。正直、勉強会がなければ何もしてません。なかなか体が動かないときは、ビデオでも見て Maker 魂を呼び覚ますのもすのも良いかもしれません。</p>
<p><a class="reference external" href="https://www.youtube.com/user/makemagazine">Make: - YouTube</a> を見てました。</p>
Markdown を便利なノートとして使う2019-03-05T23:07:00+09:002019-03-05T23:07:00+09:00Junya Nakadatag:junyanakada.com,2019-03-05:/use-markdown-as-handy-note.html<img alt="Keyboard" src="images/keyboard.jpg" />
<p>年度末で色々とまとめることが多いです。普段から、特定の目的のないメモみたいな文書は Markdown を使っています。Markdown はプレ …</p><img alt="Keyboard" src="images/keyboard.jpg" />
<p>年度末で色々とまとめることが多いです。普段から、特定の目的のないメモみたいな文書は Markdown を使っています。Markdown はプレーンテキストを HTML に変換するための構文、または、変換するツールです。</p>
<p>私は Markdown を書くときにはプレーンテキストのままで読まれることを意識して書いています。なぜ?</p>
<blockquote>
The overriding design goal for Markdown’s formatting syntax is to make it as readable as possible. The idea is that a Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions. While Markdown’s syntax has been influenced by several existing text-to-HTML filters, the single biggest source of inspiration for Markdown’s syntax is the format of plain text email. <a class="reference external" href="https://daringfireball.net/projects/markdown/">Daring Fireball</a></blockquote>
<p>Markdown はプレーンテキストのまま配布できるように設計されているらしいです。</p>
<p>確かに AsciiDoc や reStructuredText に比べると表現力は乏しく、それを不足と思う人たちが独自に拡張していたりします。ですが、Markdown は構文が少なく簡単でプレーンテキストのまま読みやすいです。これは機能が少ないというデメリットなのではなく、読みやすいというメリットだと思っています。</p>
<p>なかなか良いですよ。素の Markdown も。</p>
年度末2019-03-04T22:26:00+09:002019-03-04T22:26:00+09:00Junya Nakadatag:junyanakada.com,2019-03-04:/end-of-the-fiscal-year.html<p>三月に入りました。年度末です。会社員をしていると(会社員でなくてもかも)一年の区切りの時期。年末年始よりも大き …</p><p>三月に入りました。年度末です。会社員をしていると(会社員でなくてもかも)一年の区切りの時期。年末年始よりも大きな区切りです。ということで、一年をまとめることが仕事として要求されたりします。</p>
<p>とにかく整理が苦手で、こういうときに苦労します。</p>
勉強会の教訓2019-03-03T21:17:00+09:002019-03-03T21:17:00+09:00Junya Nakadatag:junyanakada.com,2019-03-03:/learn-a-lesson-about-the-study-meeting.html<p><a class="reference external" href="https://www.raspi.jp/2019/01/raspberry-jam-big-birthday-weekend-2019-in-tokyo/">Raspberry Jam Big Birthday Weekend 2019 in TOKYO</a> に行ってきました。</p>
<p>もくもく会に参加するつもりで登録していたのですが実際に行ってみると、空 …</p><p><a class="reference external" href="https://www.raspi.jp/2019/01/raspberry-jam-big-birthday-weekend-2019-in-tokyo/">Raspberry Jam Big Birthday Weekend 2019 in TOKYO</a> に行ってきました。</p>
<p>もくもく会に参加するつもりで登録していたのですが実際に行ってみると、空いているスペースでもくもくに励んでくれということでした。充分にスペースはありましたし、作業している人もいました。そういうスタイルのもくもく会もあるのだなと勉強になりました。</p>
<p>もうひとつの問題は、電源はモバイルバッテリを使ってくれということでした。普段も使っていないこともあって準備していませんでした。使う機材はしっかりと自分で準備しなくてはならないということが勉強できました。テーブルタップも無かったようなので、PC の電源も注意しておくべきでしょう。インターネットも自分で準備したほうが良いです。</p>
<p>そんなこんなで Raspberry Pi を使って作業することができずにいました。幸い、資料見ながら自分で勧めてくれという L チカのハンズオンがあって GPIO を制御する方法がわかりました。そのための gpiozero モジュールが準備されています。デバイスファイルに書き込むということは必要ありませんでした。</p>
<p><strong>必要機材は自前で準備せよ!</strong></p>
#MonthOfMaking on twitter2019-03-02T23:57:00+09:002019-03-02T23:57:00+09:00Junya Nakadatag:junyanakada.com,2019-03-02:/hashtag-monthofmaking-on-twitter.html<p><a class="reference external" href="https://www.raspberrypi.org/magpi/issues/79/">MagPi 2019年3月号</a> の企画で Maker たちに自分のプロジェクトを Twitter に <a class="reference external" href="https://twitter.com/hashtag/MonthOfMaking">#MonthOfMaking</a> で Tweet してもらおうという企画があるみたいです。眺め …</p><p><a class="reference external" href="https://www.raspberrypi.org/magpi/issues/79/">MagPi 2019年3月号</a> の企画で Maker たちに自分のプロジェクトを Twitter に <a class="reference external" href="https://twitter.com/hashtag/MonthOfMaking">#MonthOfMaking</a> で Tweet してもらおうという企画があるみたいです。眺めているとなかなか楽しいです。</p>
<p>明日はもくもく会にも行くので、自分のプロジェクトの参考にできるものがいろいろ見られそうです。</p>
Windows でスクリプトを実行するときの引数2019-03-01T23:57:00+09:002019-03-01T23:57:00+09:00Junya Nakadatag:junyanakada.com,2019-03-01:/handy-script-arguments-on-windows.html<p>Windows は GUI で使うものです。CLI も色々と試してみましたが不自由です。仮想マシンを使うのが我慢の限界でした。無理せず Windows …</p><p>Windows は GUI で使うものです。CLI も色々と試してみましたが不自由です。仮想マシンを使うのが我慢の限界でした。無理せず Windows のやり方にあわせたほうが良いです。</p>
<p>Windows で自作のスクリプトを実行する方法はざっと次の方法でしょう。</p>
<ul class="simple">
<li>スクリプトのアイコンをダブル・クリックする。場所によってはシングル・クリック。</li>
<li>スクリプトのアイコンに処理したいファイルをドラッグ・アンド・ドロップする。</li>
<li>スクリプトを「送る」メニューに置いておいて処理したいファイルを「送る」。</li>
</ul>
<p>コマンドプロンプトは先に述べた理由で除外します。</p>
<p>クリックで起動する場合は引数はとれません。ドラッグ・アンド・ドロップと「送る」は処理したいファイルを引数、厳密にはファイルパスの文字列を引数にとります。</p>
<p>工夫の余地はありますが、Windows で便利なスクリプトをつくろうとすれば、引数は柔軟ではありません。つくるときには念頭において置きたいところです。</p>
Raspberry Pi Desktop で日本語入力できない2019-02-28T22:27:00+09:002019-02-28T22:27:00+09:00Junya Nakadatag:junyanakada.com,2019-02-28:/can-not-use-input-method-by-default-on-raspberry-pi.html<p>あくまでデフォルトでということですが、Raspberry Pi Desktop では日本語入力ができません。UI は初期設定で日本語を選択すれば …</p><p>あくまでデフォルトでということですが、Raspberry Pi Desktop では日本語入力ができません。UI は初期設定で日本語を選択すれば日本語になりますが、その際に日本語入力のソフトウェアをインストールしてくれるわけではありません。</p>
<p>もちろん Debian がベースなので、自分でインストールすれば日本語入力ができるようになります。ですが、日本語入力が必要な人がそのための情報を検索するために日本語入力が必要なのです。これでは初心者には厳しい。</p>
<p><a class="reference external" href="https://junyanakada.com/try-to-use-raspberry-pi-desktop.html">初心者に勧められると思いましたが…。</a> 残念。</p>
Raspberry Pi Desktop を試す2019-02-27T23:37:00+09:002019-02-27T23:37:00+09:00Junya Nakadatag:junyanakada.com,2019-02-27:/try-to-use-raspberry-pi-desktop.html<p>私は「 <a class="reference external" href="https://cruel.org/freeware/hacker.html">ハッカーになろう</a> 」を参考にプログラミングを始めました。そんなこともあって Linux を使っています。使える Windows PC を …</p><p>私は「 <a class="reference external" href="https://cruel.org/freeware/hacker.html">ハッカーになろう</a> 」を参考にプログラミングを始めました。そんなこともあって Linux を使っています。使える Windows PC を買うには金が無かったということもあります。</p>
<p>意外とプログラミング初心者が環境を準備をするには Linux 用に PC を準備してしまうのが良いのではと思います。本気で始めようと思っている人であるほど、です。自分がそうだったというバイアスがかかっていることは否定しませんが。</p>
<p>いらない PC があれば、それに Linux をインストールしてしまえば良いですが、なければ PC を調達しなければなりません。使用中の Windows を消去して Linux にするのは、さすがに勇気がいります。Windows のリカバリメディアを準備するにしても、です。</p>
<p>ありがたいことに Linux は USB にインストールして試すことができます。 <a class="reference external" href="https://www.raspberrypi.org/downloads/raspberry-pi-desktop/">Raspberry Pi 用のディストリビューション Raspbian には PC 用の Live イメージがあります。</a></p>
<p>Live イメージは使っているときに行った変更を保存できないものも多いです。それはそれで良いこともありますが、プログラミングの学習に使うには不便です。Raspberry Pi Desktop は USB に書き込むときに特別な設定をしなくても、変更を保存できるようになっています。</p>
<p>ちょっと使ってみましたが、さすがに SSD からブートするのに比べると動作は遅いです。Linux に慣れている人間からすると、もうちょっと細かい設定ができたらなと思いましたが、初心者からすると細かすぎる設定は使い難さになります。子どもの勉強を用途として始まった Raspberry Pi ですから、あえて細かい設定ができないようになっているのでしょう。細かい設定ができないのは GUI での話。やりたければコマンドを打てば良いのです。</p>
<p>ほんの数十分さわっただけなので、まだ確信的には勧められません。もう少し使ってみようと思います。ちょうど週末には <a class="reference external" href="https://www.raspi.jp/2019/01/raspberry-jam-big-birthday-weekend-2019-in-tokyo/">Raspberry Pi のイベント</a> もあるので。</p>
Disqus やめました2019-02-26T21:04:00+09:002019-02-26T21:04:00+09:00Junya Nakadatag:junyanakada.com,2019-02-26:/remove-disqus-comment-service.html<p><a class="reference external" href="https://junyanakada.com/add-disqus-comment-service.html">昨日 Disqus を付けましたが、</a> やめました。javascript で 呼び出して来るので、あたりまえですがページの読み込みに時間がかかるの …</p><p><a class="reference external" href="https://junyanakada.com/add-disqus-comment-service.html">昨日 Disqus を付けましたが、</a> やめました。javascript で 呼び出して来るので、あたりまえですがページの読み込みに時間がかかるのことと、Twitter にポストするためにつけるのは大げさな感じがすることとで、やめました。</p>
Disqus 付けました2019-02-25T23:04:00+09:002019-02-25T23:04:00+09:00Junya Nakadatag:junyanakada.com,2019-02-25:/add-disqus-comment-service.html<p><a class="reference external" href="https://disqus.com/">Disqus</a> を付けました。このブログは Pelican で作成しています。WordPress のように動的に HTML を生成する Web アプリではなく、静的に生成し …</p><p><a class="reference external" href="https://disqus.com/">Disqus</a> を付けました。このブログは Pelican で作成しています。WordPress のように動的に HTML を生成する Web アプリではなく、静的に生成した HTML をサーバにアップロードするシステムです。ですので、どうしてもコメントは外部のサービスに頼らざるを得ません。</p>
<p>本当のところはコメントできるようにしたいというよりは、Twitter にポストする手間がちょっとだけ省けるからという理由です。</p>
Chrome の Secure Shell で日本語入力ができない2019-02-25T00:37:00+09:002019-02-25T00:37:00+09:00Junya Nakadatag:junyanakada.com,2019-02-25:/fail-to-use-im-on-chrome-secure-shell.html<p><a class="reference external" href="https://junyanakada.com/install-cloudready-chromeos.html">Chrome アプリの Secure Shell App で日本語入力ができないということがありました。</a> サーバに uim-fep をインストールして、それを使えば …</p><p><a class="reference external" href="https://junyanakada.com/install-cloudready-chromeos.html">Chrome アプリの Secure Shell App で日本語入力ができないということがありました。</a> サーバに uim-fep をインストールして、それを使えばできるという情報を見たので試しました。</p>
<p>結果は失敗。EC2 の Ubuntu 18.04 で試してみましたが、 uim-fep が起動しません。 -v オプションでも Aborted と返ってくるので、簡単には無理なのかなという印象です。ちなみに、Amazon Linux 2 のパッケージには uim-fep はありませんでした。</p>
<p>EC2 ではだめでしたが、他のマシン、例えば家にある他のマシンに SSH して日本語入力するとかは試していません。とは言え、外出時に Chromebook で SSH したいので、あまり意味がありません。</p>
<p>Chromebook なら安価で軽量、低価格という風に勝手に思い込んでいるのですが、他の選択肢を探ってみるのが良いでしょうか。</p>
鎌倉 Python もくもく会 #3 に参加2019-02-23T21:18:00+09:002019-02-23T21:18:00+09:00Junya Nakadatag:junyanakada.com,2019-02-23:/attend-kamakura-python-3.html<p><a class="reference external" href="https://kamakurapython.connpass.com/event/117741/">鎌倉 Python もくもく会 #3</a> に参加しました。</p>
<p>雑なコードになってしまいました。サーバが持っている変数を PUT メソッドで更 …</p><p><a class="reference external" href="https://kamakurapython.connpass.com/event/117741/">鎌倉 Python もくもく会 #3</a> に参加しました。</p>
<p>雑なコードになってしまいました。サーバが持っている変数を PUT メソッドで更新するということを試しました。</p>
<p>サーバが持っている変数 status を、クライアントが読み取って、on と off を書き換えるようサーバにリクエストするプログラムです。サーバ側では変数の値をレスポンスボディに入れて返すようにしました。クライアント側では、レスポンスのステータスコードとボディを print するようにしました。</p>
<p>サーバのコードです。</p>
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python3</span>
<span class="kn">from</span> <span class="nn">bottle</span> <span class="kn">import</span> <span class="n">run</span><span class="p">,</span> <span class="n">get</span><span class="p">,</span> <span class="n">post</span><span class="p">,</span> <span class="n">put</span><span class="p">,</span> <span class="n">delete</span>
<span class="nd">@get</span><span class="p">(</span><span class="s1">'/status'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">read_status</span><span class="p">():</span>
<span class="k">return</span> <span class="n">status</span>
<span class="nd">@put</span><span class="p">(</span><span class="s1">'/status/<status_url>'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update_status</span><span class="p">(</span><span class="n">status_url</span><span class="p">):</span>
<span class="k">global</span> <span class="n">status</span>
<span class="n">status</span> <span class="o">=</span> <span class="n">status_url</span>
<span class="k">return</span> <span class="n">status</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">status</span> <span class="o">=</span> <span class="s1">'off'</span>
<span class="n">run</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s1">'localhost'</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">8080</span><span class="p">)</span>
</pre></div>
<p>クライアントのコードです。</p>
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python3</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">requests</span>
<span class="k">def</span> <span class="nf">get</span><span class="p">():</span>
<span class="k">return</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'http://localhost:8080/status'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">put</span><span class="p">(</span><span class="n">status</span><span class="p">):</span>
<span class="k">return</span> <span class="n">requests</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="s1">'http://localhost:8080/status/'</span> <span class="o">+</span> <span class="n">status</span><span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="ow">and</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'get'</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">get</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="ow">and</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'put'</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">put</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="nb">print</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">status</span> <span class="o">=</span> <span class="n">get</span><span class="p">()</span><span class="o">.</span><span class="n">text</span>
<span class="k">if</span> <span class="n">status</span> <span class="o">==</span> <span class="s1">'off'</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">put</span><span class="p">(</span><span class="s1">'on'</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">status</span> <span class="o">==</span> <span class="s1">'on'</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">put</span><span class="p">(</span><span class="s1">'off'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">continue</span>
<span class="nb">print</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</pre></div>
<p>URL が雑だなと思います。<cite>/status/on</cite> ではなくクエリにして <cite>?status=on</cite> という風にしたほうが良いのかなという気はしています。実際に Raspberry Pi に付けた LED を光らせるときには、もう少し調べて実装しましょう。</p>
<p>2 時間でできるかなと思いましたが、今日のところの目標、Bottle と Requests でサーバとクライアントをつくってみるところまでは達成できて良かったと思います。次の目標は Raspberry Pi に LED を付けて、点灯・消灯をさせるプログラムを書くことです。</p>
ネット越しの L チカを描いてみる2019-02-22T21:36:00+09:002019-02-22T21:36:00+09:00Junya Nakadatag:junyanakada.com,2019-02-22:/plan-for-blinking-led-on-ether.html<p>Raspberry Pi に Web API をつくって Ethernet 越しに L チカをさせて見たいと思います。なんとなく絵を描いてみます。</p>
<ul class="simple">
<li>Raspberry Pi に LED を点灯・ …</li></ul><p>Raspberry Pi に Web API をつくって Ethernet 越しに L チカをさせて見たいと思います。なんとなく絵を描いてみます。</p>
<ul class="simple">
<li>Raspberry Pi に LED を点灯・消灯させるプログラムを配置</li>
<li>Raspberry PI に LED を点灯させる Web API と消灯させる Web API を配置</li>
<li>PC に Web API を叩く HTTP クライアントを配置</li>
</ul>
<p>ざっとこんな感じのものをつくる必要があるでしょうか。Raspberry Pi に L チカのプログラムを置くのではなく、点灯させる API と 消灯させる API を置きます。サーバ側もクライアント側も Python で書きます。クライアントは Requests で、サーバは Bottle を使うつもりです。</p>
<p>どちらからつくっても良いと思いますが、勉強会の予定に合わせてクライアント側から攻めたいと思います。</p>
Python の Requests を読む2019-02-21T21:16:00+09:002019-02-21T21:16:00+09:00Junya Nakadatag:junyanakada.com,2019-02-21:/read-python-requests.html<p><a class="reference external" href="https://junyanakada.com/make-device-raspberry-pi-web-api.html">Raspberry Pi を使って Web API 越しにコミュニケーションさせたいと考えています。</a> 操作する側の HTTP クライアントをどうやって …</p><p><a class="reference external" href="https://junyanakada.com/make-device-raspberry-pi-web-api.html">Raspberry Pi を使って Web API 越しにコミュニケーションさせたいと考えています。</a> 操作する側の HTTP クライアントをどうやってつくるか調べてみました。標準ライブラリの urllib や http も調べて見たのですが、 <a class="reference external" href="http://docs.python-requests.org/en/master/">Requests</a> を使ったほうが良いようなことが書いてあったので、Requests を読んでみました。 <a class="reference external" href="https://junyanakada.com/read-code-do-not-read-doc.html">ドキュメントではなくコードの方を。</a></p>
<p>コードを読むとは言っても、docstring からドキュメントを生成していたりするわけです。コードの中にドキュメントが書いてあります。それでもコードを読む習慣は身につけやすいでしょうから、それはそれで良しとします。</p>
<p>Requests と、前に使ったことのあるライブラリいくつかのコードを見てみましたが、 <cite>__init__.py</cite> を見て <cite>__main__.py</cite> があったら見るくらいで、とりあえず使ってみるくらいはできそうな感じです。</p>
<p>標準ライブラリは C だろうと思っていたのですが、そうでもなく Python です。教材には困らなそうです。</p>
ドキュメントを読まずにコードを読む2019-02-20T21:26:00+09:002019-02-20T21:26:00+09:00Junya Nakadatag:junyanakada.com,2019-02-20:/read-code-do-not-read-doc.html<p><a class="reference external" href="https://junyanakada.com/learn-python-beginner-on-udemy-2.html">昨日</a> に続いて Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準 …</a></p><p><a class="reference external" href="https://junyanakada.com/learn-python-beginner-on-udemy-2.html">昨日</a> に続いて Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする</a> を見ました。</p>
<p>1 時間くらい見ましたが、やっぱりいっぺんに見ても頭に入りません。かと言って、少しずつ見ても頭に入りません。それで、いっぺんに見るようにしてみたのです。</p>
<p>もともとは、自分で調べながらコードを書くだけで、人のコードを読むことがないからと、教材を使って勉強することにしたのでした。支払いだけして見てなかったビデオを使って。</p>
<p>どうも所謂座学というのは性に合わないようです。教材を全く使わないということもないですが、自分でコードを書くことを主体にして勉強していこうと思います。</p>
<p>そこで、ライブラリのドキュメントは読まずに、ソースコードを読んで使い方を調べるという形を取ってみようと思います。英語が課題であることもあるので、ちょうど良いかなと。</p>
Udemy で Python 入門 22019-02-19T21:26:00+09:002019-02-19T21:26:00+09:00Junya Nakadatag:junyanakada.com,2019-02-19:/learn-python-beginner-on-udemy-2.html<p><a class="reference external" href="https://junyanakada.com/learn-python-beginner-on-udemy-1.html">昨日</a> に続いて Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準 …</a></p><p><a class="reference external" href="https://junyanakada.com/learn-python-beginner-on-udemy-1.html">昨日</a> に続いて Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする</a> を見ました。</p>
<p>一気に長い時間見てもあまり頭に入らないですね。しかも 2 倍速。</p>
<ul class="simple">
<li><dl class="first docutils">
<dt>リスト型変数や辞書型変数に入っているのは先頭のメモリアドレス</dt>
<dd><ul class="first last">
<li>だから変数の代入では新しいリストにならない(これは昨日のところ)</li>
<li>だから関数のデフォルト引数に空リストを定義は良くない</li>
</ul>
</dd>
</dl>
</li>
<li>クロージャとデコレータが難しかった</li>
</ul>
<p>昼休みに 30 分、夜に 90 分くらい見ましたが、夜見たところは知らないこともそこそこあってなかなか大変でした。</p>
Udemy で Python 入門 12019-02-18T22:12:00+09:002019-02-18T22:12:00+09:00Junya Nakadatag:junyanakada.com,2019-02-18:/learn-python-beginner-on-udemy-1.html<p>Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする</a> を見 …</p><p>Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする</a> を見始めました。 <a class="reference external" href="https://junyanakada.com/learn-python-arithmetic-operation.html">前に見ていたもの</a> と同じですが、頭からもう一度見ています。一度は見ているところを見たので新しいことはないのですが、大事なところを復習できました。</p>
<p>エラーにならないので間違いに気付きにくい事柄です。</p>
<ul class="simple">
<li>数値演算の順序が人間が計算するときと同じ</li>
<li>リスト型変数や辞書型変数に入っているのは先頭のメモリアドレス</li>
<li><cite>1,</cite> はタプル型で <cite>(1)</cite> は整数型</li>
</ul>
ブログと生活2019-02-17T22:14:00+09:002019-02-17T22:14:00+09:00Junya Nakadatag:junyanakada.com,2019-02-17:/blog-and-life-style.html<p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">今年ブログを初めました。</a></p>
<p>どうも記事が日記的になってしまい、夜に書くことがほとんどで、就寝が遅くなってしまっ …</p><p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">今年ブログを初めました。</a></p>
<p>どうも記事が日記的になってしまい、夜に書くことがほとんどで、就寝が遅くなってしまっていました。ブログに書けるような行動を優先するようになり、Python の勉強は少し進みましたが、週末だけはしていたランニングも後回しになってきました。休日もリラックスできなくなり、手っ取り早いストレス解消に時間で時間を浪費することが多くなりました。段々と太ってきて体調も悪くなってきました。今日はいよいよ調子が悪くて夕方まで寝てしまいました。</p>
<p>ブログは重要なコミュニケーションのためのツールだと捉えています。続けて行くための施策を取らなければならないところです。</p>
h1要素がふたつ?2019-02-17T00:53:00+09:002019-02-17T00:53:00+09:00Junya Nakadatag:junyanakada.com,2019-02-17:/heading-in-html51.html<p>とあるウェブページのソースを見たら、「あれ?h1要素がふたつ?」少し調べてみました。</p>
<p>私がHTMLについて学んだのは、XHTML1.0が …</p><p>とあるウェブページのソースを見たら、「あれ?h1要素がふたつ?」少し調べてみました。</p>
<p>私がHTMLについて学んだのは、XHTML1.0が出てきたくらいの頃でした。そのときは見出しを意味するh1やh2などは、文書の構造に従って使うようにと学びました。</p>
<p>次のような構造にしたいなら:</p>
<pre class="literal-block">
題名
第1章
第1節
第2節
第2章
第3章
</pre>
<p>次のように書くようにと。</p>
<div class="highlight"><pre><span></span><span class="p"><</span><span class="nt">h1</span><span class="p">></span>題名<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"><</span><span class="nt">h2</span><span class="p">></span>第1章<span class="p"></</span><span class="nt">h2</span><span class="p">></span>
<span class="p"><</span><span class="nt">h3</span><span class="p">></span>第1節<span class="p"></</span><span class="nt">h3</span><span class="p">></span>
<span class="p"><</span><span class="nt">h3</span><span class="p">></span>第2節<span class="p"></</span><span class="nt">h3</span><span class="p">></span>
<span class="p"><</span><span class="nt">h2</span><span class="p">></span>第2章<span class="p"></</span><span class="nt">h2</span><span class="p">></span>
<span class="p"><</span><span class="nt">h2</span><span class="p">></span>第3章<span class="p"></</span><span class="nt">h2</span><span class="p">></span>
</pre></div>
<p>ところが、h1が2個あるページを見つけました。このブログで使っているテーマもh1が2個あります。そのうち直そうと思っていたこともあり、調べました。</p>
<p>結論としては、HTML5ではsection要素のネストレベルで見出しのレベルが決定されるという仕様になり、HTML5.1で廃止され元に戻ったということのようです。</p>
<p>HTML5では、次のような書き方ができたということです。</p>
<div class="highlight"><pre><span></span><span class="p"><</span><span class="nt">h1</span><span class="p">></span>題名<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h1</span><span class="p">></span>第1章<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h1</span><span class="p">></span>第1節<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"></</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h1</span><span class="p">></span>第2節<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"></</span><span class="nt">section</span><span class="p">></span>
<span class="p"></</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h1</span><span class="p">></span>第2章<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"></</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h1</span><span class="p">></span>第3章<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
</pre></div>
<p>そしてHTML5.1で廃止になった。</p>
<div class="highlight"><pre><span></span><span class="p"><</span><span class="nt">h1</span><span class="p">></span>題名<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h2</span><span class="p">></span>第1章<span class="p"></</span><span class="nt">h2</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h3</span><span class="p">></span>第1節<span class="p"></</span><span class="nt">h3</span><span class="p">></span>
<span class="p"></</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h3</span><span class="p">></span>第2節<span class="p"></</span><span class="nt">h3</span><span class="p">></span>
<span class="p"></</span><span class="nt">section</span><span class="p">></span>
<span class="p"></</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h2</span><span class="p">></span>第2章<span class="p"></</span><span class="nt">h2</span><span class="p">></span>
<span class="p"></</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
<span class="p"><</span><span class="nt">h2</span><span class="p">></span>第3章<span class="p"></</span><span class="nt">h2</span><span class="p">></span>
<span class="p"><</span><span class="nt">section</span><span class="p">></span>
</pre></div>
<p>このことについては、 <a class="reference external" href="http://roka404.main.jp/blog/archives/247">もっと詳しいページ</a> があります。 <a class="reference external" href="https://www.w3.org/TR/html51/changes.html#features-removed">W3C</a> にもHTML5.1で削除されたとありますね。</p>
<p>私が、HTMLを学んだ時と比べて、だいぶ変わっているみたいですね。また、勉強が必要かな…。</p>
自作の便利スクリプトを便利に使う on Git for Windows2019-02-15T21:57:00+09:002019-02-15T21:57:00+09:00Junya Nakadatag:junyanakada.com,2019-02-15:/run-my-scripts-easy-on-git-for-windows.html<p><a class="reference external" href="https://junyanakada.com/run-my-scripts-easy-on-windows.html">Windows の「送る」は便利です。</a></p>
<p>ところで、プログラムを書いているとバージョン管理を使ってみたくなります。Git がメジャーな …</p><p><a class="reference external" href="https://junyanakada.com/run-my-scripts-easy-on-windows.html">Windows の「送る」は便利です。</a></p>
<p>ところで、プログラムを書いているとバージョン管理を使ってみたくなります。Git がメジャーなようなので、Git を使います。GitHub にコードを置いているプロジェクトも多いので、特に理由がなければ Git で良いでしょう。Cygwin や MSYS2 をインストールして Git のパッケージを使うというやり方もあるでしょうが、Git が公式に配布している Windows 用のパッケージを使うのが便利です。</p>
<p><a class="reference external" href="https://git-scm.com/download/win">Git</a> をインストールすると Bash も一緒にインストールされて Linux のコマンドが使えるようになります。Bash を起動すると <cite>$HOME/bin</cite> があれば PATH を通してくれます。自作の便利スクリプトはここに置いておくと便利に使えます。</p>
<p>ですが、Python をインストールするときに python.exe のあるところに PATH を通していないと、スクリプトを動かすときにスクリプトを引数にして Python ランチャー <cite>py.exe</cite> を呼び出さなくてはいけません。これでは <cite>$HOME/bin</cite> に PATH が通っている意味がありません。</p>
<div class="highlight"><pre><span></span>py myscript.py
</pre></div>
<p>すでに PATH を通してあれば要りませんが、Bash 起動時に PATH を通してくれるようにします。</p>
<p>まずコマンドプロンプトで次のように打って python のパスを調べます。</p>
<div class="highlight"><pre><span></span>where python
</pre></div>
<p><cite>$HOME/.bash_profile</cite> を作って次のように書いておきます。 <cite>Python37</cite> のところは Python のバージョンによって違います。 3.7.2 をインストールしたときは例のようになっていました。</p>
<div class="highlight"><pre><span></span><span class="nb">export</span> <span class="nv">PATH</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/AppData/Local/Programs/Python/Python37:</span><span class="nv">$HOME</span><span class="s2">/AppData/Local/Programs/Python/Python37/Scripts:</span><span class="nv">$PATH</span><span class="s2">"</span>
</pre></div>
<p>注意点ひとつ目は、最後に <cite>$PATH</cite> を付けないと既に設定されていた値が消えてしまいます。今回は Bash の中だけだとは思いますが、消えてしまうと不便です。</p>
<p>注意点ふたつ目は、引用符 <cite>"</cite> で囲うことです。Windows はやたらと空白をファイル・フォルダ名に使うので引用符で囲うことが必要です。 <cite>Program Files</cite> とかに既に Path が通っていて、引用符なしではエラーになるでしょう。</p>
<p>書いたら Bash を閉じて起動しなおすか、 <cite>source ~/.bash_profile</cite> を実行してください。</p>
<p>Linux のシェルはいずれ使うようになるので、慣れておくのが良いと思います。</p>
Python チュートリアルを読んだ そしてつかれた2019-02-14T20:37:00+09:002019-02-14T20:37:00+09:00Junya Nakadatag:junyanakada.com,2019-02-14:/read-tutorial-be-tired.html<p><a class="reference external" href="https://junyanakada.com/notice-tutorial-in-python-official-site.html">Python チュートリアルを見つけて、</a> 読みました。 <a class="reference external" href="https://junyanakada.com/learn-python-type-set.html">Udemy の講座を見て</a> 知っていることが多いはずですが、なかなか進みません。</p>
<p>英 …</p><p><a class="reference external" href="https://junyanakada.com/notice-tutorial-in-python-official-site.html">Python チュートリアルを見つけて、</a> 読みました。 <a class="reference external" href="https://junyanakada.com/learn-python-type-set.html">Udemy の講座を見て</a> 知っていることが多いはずですが、なかなか進みません。</p>
<p>英語で読んだのでしかたないです。ドキュメントを書くのに英語は必要になるので効率悪いようでも英語は読んでおかなくてはと思います。まあ、つかれました。</p>
Python チュートリアルがあったとは2019-02-13T22:17:00+09:002019-02-13T22:17:00+09:00Junya Nakadatag:junyanakada.com,2019-02-13:/notice-tutorial-in-python-official-site.html<p>動画で勉強するのは良いですが、動画を見るのがはばかるときがあったりします。テキスト主体のサイトを探してみ …</p><p>動画で勉強するのは良いですが、動画を見るのがはばかるときがあったりします。テキスト主体のサイトを探してみました。</p>
<p>そして、良いドキュメントがあるのを見つけました。しかし、一方でがっくりしました。 <a class="reference external" href="https://docs.python.org/ja/3/tutorial">公式チュートリアル</a> があるのに気付かなかったなんて。</p>
def main() やるべきか2019-02-12T21:07:00+09:002019-02-12T21:07:00+09:00Junya Nakadatag:junyanakada.com,2019-02-12:/to-type-main-or-not-to-type-main.html<div class="highlight"><pre><span></span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
</pre></div>
<p>このブロックにコードを書くと スクリプトをモジュールとしてインポートしたときには実行されません。一 …</p><div class="highlight"><pre><span></span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
</pre></div>
<p>このブロックにコードを書くと スクリプトをモジュールとしてインポートしたときには実行されません。一方で、スクリプトをコマンドラインから実行したりすると実行されます。「関数の名前が <cite>'__main__'</cite> だったら」という意味の if 文です。</p>
<p>次のようにわざわざ main 関数を定義しているサンプルがあったりもします。</p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Hello'</span><span class="p">)</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</pre></div>
<p>個人的には、無駄に C や Java に合わせているようで気持ちが悪いので、どうしたら良いのかざっと調べてみました。 <cite>if __name__ == '__main__':</cite> についてはブログ記事やら質問サイトやらたくさん見つかりましたが、main 関数の是非についてはあまり見つかりません。</p>
<p>意味のありそうなものは、この if ブロックの中に変数を書くと、グローバル変数になるので予想外のところで影響が出る可能性がある、ということでした。関数名は main にする必要はありません。</p>
<p>うまいこと関数で値を受け渡してしまえば変数ができてしまうこともないですし、このブロックからしか実行できない処理が多いということはモジュールとしては使えない機能が多いということにもなるでしょう。個人的にはやはり main という名前の関数をつくるのはあまりうまいやり方ではない気がします。</p>
ブログエンジンを変えようか2019-02-11T21:47:00+09:002019-02-11T21:47:00+09:00Junya Nakadatag:junyanakada.com,2019-02-11:/consider-changing-blog-engine.html<p>ブログエンジンを変えたいなと思って、さらっと調べて見ました。結果的には現状のまま変わりなしということにな …</p><p>ブログエンジンを変えたいなと思って、さらっと調べて見ました。結果的には現状のまま変わりなしということになりました。</p>
<p>現在は、 <a class="reference external" href="https://blog.getpelican.com">Pelican</a> を使っています。静的にサイトを生成して HTML をサーバにアップロードする仕組みですので、どうしてもコマンドラインインターフェイスが必要になります。サーバを準備しておいてスマホから SSH でアクセスして作業をすることもできますが、キーボードなしで Vim を使うのもちょっとつらいです。PC で作業となるとどうしても帰宅後にブログを書くことになり、最近は夜ふかし傾向で望ましくないということもあります。</p>
<p>ブラウザでブログが書けたら昼間スマホで更新ができるかなという理由で、Content Management System(CMS) を検討しました。Python 製で開発がそれなりに活発だという <a class="reference external" href="https://wagtail.io">Wagtail</a> を試しに動かして見ました。PIP でインストールして起動すればすぐにブログが書けるというものではありませんでした。ただ、ドキュメントを読みながら少し手間をかければできそうではあり、それほど問題はありません。</p>
<p>しかし、CMS となると要は Web サイトをつくる Web アプリということになるので、サーバに実行環境が整わないと動かせません。この件も手間をかければ解決できることではありますが、サーバを乗り換えることになると費用もかかります。ちょっと簡単には難しいなということで今回は現状維持にしました。</p>
<p>まだ、ブログも始めたばかり。今は短い文章ばかり書いていますが、今後はどうなって行くかわかりません。短い文であればブラウザで書くことも大きな問題は無いかもしれませんが、長い文になると Vim(や Emacs のような優れたテキストエディタ)が使えないことは問題になります。Pelican のような静的サイトジェネレータの魅力は、使い慣れたエディタで記事が書けるということではないかと思います。</p>
<p>そもそもネタや文章力が無くてなかなか書けずに夜ふかしするというところもありますから。</p>
Python の集合を学ぶ2019-02-10T23:47:00+09:002019-02-10T23:47:00+09:00Junya Nakadatag:junyanakada.com,2019-02-10:/learn-python-type-set.html<p><a class="reference external" href="https://junyanakada.com/learn-python-arithmetic-operation.html">昨日に引き続き</a> 前に買ってあった Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践 …</a></p><p><a class="reference external" href="https://junyanakada.com/learn-python-arithmetic-operation.html">昨日に引き続き</a> 前に買ってあった Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする</a> を見ました。</p>
<p>データ型に set という集合の型があることを初めて知りました。ざっと調べてみると、 C++ や Java や Ruby にもあるみたいです。標準ライブラリをインポートする必要があるものもあるようですが、結構 Python 特有のことではなく、多くの言語で普通に集合を扱えるみたいです。</p>
<p>前にプログラミングスクールで Ruby を習ったはずなのですが、覚えていないのか、習っていないのか。どうも Ruby は好きになれないので、覚えていなかったのでしょう。</p>
Python の算術演算を学ぶ2019-02-09T23:47:00+09:002019-02-09T23:47:00+09:00Junya Nakadatag:junyanakada.com,2019-02-09:/learn-python-arithmetic-operation.html<p><a class="reference external" href="https://junyanakada.com/getter-setter-is-not-pythonic.html">昨日の反省を踏まえて、</a> 前に買ってあった Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学 …</a></p><p><a class="reference external" href="https://junyanakada.com/getter-setter-is-not-pythonic.html">昨日の反省を踏まえて、</a> 前に買ってあった Udemy の講座 <a class="reference external" href="https://www.udemy.com/python-beginner/">Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする</a> を見ました。買ったときはセールか何かだったみたいですが、今は通常価格でしょうか。このコースは入門とありますが、受講に必要な条件を見るとまったくプログラミングが初めての人には難しいようです。何かの言語でプログラミングの経験がないといけないことがわかります。</p>
<p>まだ、入門のところで、知っていることもたくさんありますが、大事なことを知らずにいたのがわかりました。新しい言語を始めるときは入門を謳った教材は学ぶべきですね。</p>
<p>数値の計算順序が、左からではなく、普通に人間が計算するときと同じ、私たちが学校で習うような順番です。</p>
<p><cite>10 + 3 * 5 - 2</cite> は C 等と同じように左から計算するとこうなります。</p>
<div class="highlight"><pre><span></span><span class="mi">10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">5</span><span class="w"></span>
<span class="mi">13</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">5</span><span class="w"></span>
<span class="mi">65</span><span class="w"></span>
</pre></div>
<p>Python は人間と同じ順序で計算します。</p>
<div class="highlight"><pre><span></span><span class="mi">10</span> <span class="o">+</span> <span class="mi">3</span> <span class="o">*</span> <span class="mi">5</span>
<span class="mi">10</span> <span class="o">+</span> <span class="mi">15</span>
<span class="mi">25</span>
</pre></div>
<p>これはとんでもない無知でした。</p>
getter setter はPythonic でない2019-02-08T23:37:00+09:002019-02-08T23:37:00+09:00Junya Nakadatag:junyanakada.com,2019-02-08:/getter-setter-is-not-pythonic.html<p><a class="reference external" href="https://junyanakada.com/pages/whoami.html">おまえだれよ</a> にプログラマではないけど、コードを直すくらいはすると書いていますが、言語は何かというと Java です …</p><p><a class="reference external" href="https://junyanakada.com/pages/whoami.html">おまえだれよ</a> にプログラマではないけど、コードを直すくらいはすると書いていますが、言語は何かというと Java です。オブジェクトの中の変数を外から読み書きする場合は getter setter メソッドを定義しておいて、そのメソッドを通して読み書きします。オブジェクト指向言語の特徴のひとつにオブジェクト内の変数はメソッドを通じてしか触れないというものがあって、多分 Java のようなやり方が一般的なのでしょう。</p>
<p><a class="reference external" href="https://stackoverflow.com/questions/2627002/whats-the-pythonic-way-to-use-getters-and-setters">Python は違うようです。</a> 直接変数を触ります。getter setter を用意することはできますが、 <a class="reference external" href="https://docs.python.org/ja/3/howto/descriptor.html">HOWTO</a> を読むと変数を触るときにメソッドを使う必要が出てきたときに初めて getter setter を用意するのが流儀のようです。</p>
<p>まだまだ、知らないことが多いです。 <a class="reference external" href="https://junyanakada.com/think-how-to-learn-programming.html">わかっているようなこと</a> を言っていないで謙遜にならないと。</p>
「独学プログラマー」をちょっと読む2019-02-07T22:49:00+09:002019-02-07T22:49:00+09:00Junya Nakadatag:junyanakada.com,2019-02-07:/read-self-taught-programmer-part-5-6.html<p><a class="reference external" href="https://shop.nikkeibp.co.jp/front/commodity/0000/C92270/">独学プログラマー</a> の5部6部だけ読みました。全部読むには時間がなかったというのが大きな理由ですが、この本の …</p><p><a class="reference external" href="https://shop.nikkeibp.co.jp/front/commodity/0000/C92270/">独学プログラマー</a> の5部6部だけ読みました。全部読むには時間がなかったというのが大きな理由ですが、この本の一番特徴的なパートだと思うので、ここだけ読みました。</p>
<p>アドバイスの最後のひとつとして、多くのコードを読むこと、書くことと読むことのバランスを取ることがあげられていました。私の場合、読む対書くが0対1です。大げさではなく本当にそれくらいだと思います。</p>
<p>反省しました。<a class="reference external" href="https://junyanakada.com/think-how-to-learn-programming.html">それでは自分のコードの質なんかわかるわけがない</a> 。比較対象がないわけですから。</p>
MIME タイプと拡張子2019-02-06T20:43:00+09:002019-02-06T20:43:00+09:00Junya Nakadatag:junyanakada.com,2019-02-06:/read-doc-mimetypes.html<p>Markdown ファイルから HTML ファイルをつくるスクリプトを書いています。あまり入力のチェックはしていませんが、さすがに …</p><p>Markdown ファイルから HTML ファイルをつくるスクリプトを書いています。あまり入力のチェックはしていませんが、さすがに HTML が入力されたときには弾くようにしています。ソースに上書きされてはまずいので。</p>
<p>ファイルの拡張子が <cite>.html</cite> であれば処理を行わないというようにしています。拡張子を得るのは、 <a class="reference external" href="https://docs.python.org/3/library/os.path.html">os.path</a> モジュールを使えば簡単です。ですが、拡張子で区別するよりうまいやり方がないかと思って調べてみました。</p>
<p>ひとつ見つけたのは、 <a class="reference external" href="https://docs.python.org/3/library/mimetypes.html">mimetypes</a> でしたが、このモジュールは拡張子から MIME タイプを、反対に MIME タイプから拡張子を得るものでした。</p>
<p>もう少し調べてみると MIME タイプはもともと電子メールでテキスト以外のファイルを扱うためにつくったもので、それが HTTP などにも転用されるようになり、Web でファイルを自動的に処理するためのものです。一方で、拡張子は Windows がファイルを判別して処理するためのものです。UNIX 系の OS ではもともとは、人間が区別するために慣習的に付けてはいましたが、OS にとっては意味のないものです。</p>
<p>残念ながら、ファイルの中身を調べずに判別するには拡張子か MIME タイプのどちらかのようです。今回はソースの上書きを防ぐだけのことですから、拡張子を見れば充分かなということで、そのままです。</p>
じゅんやは Linter を てに いれた2019-02-05T21:37:00+09:002019-02-05T21:37:00+09:00Junya Nakadatag:junyanakada.com,2019-02-05:/get-python-linter.html<p><a class="reference external" href="https://junyanakada.com/think-how-to-learn-programming.html">Pythonic なコードが書けているのか?</a> どう書いたら良いのか?と思って探してみたらありました。</p>
<p><a class="reference external" href="https://pypi.org/project/pycodestyle">pycodestyle</a></p>
<p>これまで書いていたコー …</p><p><a class="reference external" href="https://junyanakada.com/think-how-to-learn-programming.html">Pythonic なコードが書けているのか?</a> どう書いたら良いのか?と思って探してみたらありました。</p>
<p><a class="reference external" href="https://pypi.org/project/pycodestyle">pycodestyle</a></p>
<p>これまで書いていたコードをチェックしてみたら、コード 68 行の内、違反が 38 個!目茶苦茶に汚いコードを書いていたわけではなく、PEP8 に沿わないスタイルできっちり書いていたということでした。</p>
ログの出し方をちょっと学ぶ2019-02-04T19:57:00+09:002019-02-04T19:57:00+09:00Junya Nakadatag:junyanakada.com,2019-02-04:/learn-logging.html<p><a class="reference external" href="https://junyanakada.com/think-how-to-learn-programming.html">色々と悩みながらプログラミングをしているところですが、</a> ログの出し方はとりあえず知っておいたほうが良いだろ …</p><p><a class="reference external" href="https://junyanakada.com/think-how-to-learn-programming.html">色々と悩みながらプログラミングをしているところですが、</a> ログの出し方はとりあえず知っておいたほうが良いだろうということで調べました。さすがにいつまでも <cite>print()</cite> では無理があります。 <a class="reference external" href="https://docs.python.jp/3/howto/logging.html">チュートリアルがあるので</a> かいつまんで読みつつ、前に書いたコードを直しました。</p>
<p>が、<a class="reference external" href="https://docs.python.jp/3/howto/logging.html#advanced-logging-tutorial">後半にある上級チュートリアル</a> の書き方のが適切な書き方なようです。</p>
<p>Umm... 前半は一体何だったのか。</p>
Trinket M0 Lチカをなおす2019-02-03T20:46:00+09:002019-02-03T20:46:00+09:00Junya Nakadatag:junyanakada.com,2019-02-03:/fix-trinket-m0-blink.html<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
<span class="kn">from</span> <span class="nn">board</span> <span class="kn">import</span> <span class="n">D13</span>
<span class="kn">from</span> <span class="nn">digitalio</span> <span class="kn">import</span> <span class="n">DigitalInOut</span><span class="p">,</span> <span class="n">Direction</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">led</span> <span class="o">=</span> <span class="n">DigitalInOut</span><span class="p">(</span><span class="n">D13</span><span class="p">)</span>
<span class="n">led</span><span class="o">.</span><span class="n">direction</span> <span class="o">=</span> <span class="n">Direction</span><span class="o">.</span><span class="n">OUTPUT</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">led</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="kc">True</span>
<span class="nb">print</span><span class="p">(</span><span class="n">D13</span><span class="p">,</span> <span class="n">led</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>
<span class="n">led</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="kc">False</span>
<span class="nb">print</span><span class="p">(</span><span class="n">D13</span><span class="p">,</span> <span class="n">led</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</pre></div>
<p><a class="reference external" href="https://junyanakada.com/attend-kamakura-python-2.html">この前に書 …</a></p><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
<span class="kn">from</span> <span class="nn">board</span> <span class="kn">import</span> <span class="n">D13</span>
<span class="kn">from</span> <span class="nn">digitalio</span> <span class="kn">import</span> <span class="n">DigitalInOut</span><span class="p">,</span> <span class="n">Direction</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">led</span> <span class="o">=</span> <span class="n">DigitalInOut</span><span class="p">(</span><span class="n">D13</span><span class="p">)</span>
<span class="n">led</span><span class="o">.</span><span class="n">direction</span> <span class="o">=</span> <span class="n">Direction</span><span class="o">.</span><span class="n">OUTPUT</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">led</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="kc">True</span>
<span class="nb">print</span><span class="p">(</span><span class="n">D13</span><span class="p">,</span> <span class="n">led</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>
<span class="n">led</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="kc">False</span>
<span class="nb">print</span><span class="p">(</span><span class="n">D13</span><span class="p">,</span> <span class="n">led</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</pre></div>
<p><a class="reference external" href="https://junyanakada.com/attend-kamakura-python-2.html">この前に書いた Trinket M0 Lチカ</a> を少し直してみました。本当にちょっとです。</p>
<p>今週末は暖かかったので、つい屋外でのんびりしていました。何もしていないのも気持ち悪いので、ちょっと作業してみた感じです。</p>
英語の文書を読む そして誤解に気づく2019-02-02T22:52:00+09:002019-02-02T22:52:00+09:00Junya Nakadatag:junyanakada.com,2019-02-02:/misunderstand-on-circuitpython.html<p><a class="reference external" href="https://junyanakada.com/buy-trinket-m0.html">Trinket-M0 を買ったときに、</a> こんなことを書きました。</p>
<blockquote>
ところで、<a class="reference external" href="https://www.adafruit.com/product/3500">商品ページ</a> を見ていたら、 <a class="reference external" href="https://learn.adafruit.com/stand-alone-programming-avrs-using-circuitpython">AVR で CircuitPython がプログラミングできるとい …</a></blockquote><p><a class="reference external" href="https://junyanakada.com/buy-trinket-m0.html">Trinket-M0 を買ったときに、</a> こんなことを書きました。</p>
<blockquote>
ところで、<a class="reference external" href="https://www.adafruit.com/product/3500">商品ページ</a> を見ていたら、 <a class="reference external" href="https://learn.adafruit.com/stand-alone-programming-avrs-using-circuitpython">AVR で CircuitPython がプログラミングできるというページ</a> がありました。USB ドライブのように Python スクリプトを書き込めば動くというようには、そのページにはありませんでしたが、CircuitPython で Arduino を動かせるというのは面白そうです。</blockquote>
<p>試してみようと思ってドキュメントを読んでみました。とんでもない勘違いをしていたことがわかりました。AVR のコードを Python で書くことができるという話ではなく、CirCuitPython のボードを使って AVR に実行ファイルを書き込むことができるという話でした。</p>
<p>本当にがっかりしました。いえ、Python で AVR のコードを書けないことではありません。あまりにも大きな勘違いをしたことにです。英語ができないことは課題視しながらも放置している課題です。</p>
このコーディングで良いのか?2019-02-01T20:01:00+09:002019-02-01T20:01:00+09:00Junya Nakadatag:junyanakada.com,2019-02-01:/think-how-to-learn-programming.html<p>Markdown ファイルから HTML ファイルをつくる Python スクリプトを書いています。<a class="reference external" href="https://junyanakada.com/handle-byte-order-mark.html">だいたい動くものはできたので、</a> コードが読みや …</p><p>Markdown ファイルから HTML ファイルをつくる Python スクリプトを書いています。<a class="reference external" href="https://junyanakada.com/handle-byte-order-mark.html">だいたい動くものはできたので、</a> コードが読みやすくなるように書き換えました。</p>
<p>コードは示せなくて残念ですが、それなりにきれいにしたつもりです。ですが、本当に読みやすいコードなのか? Pythonic なコードなのか?そもそもコメントがひとつもない。本当に良いコードが書けているのでしょうか?</p>
<p>プログラムを書いてみてわかりましたが、私の技術レベルはとりあえず動くものをつくることができるというレベルには達しているようです。そのもう少し上、金になるプログラミングができることを目指す段階にあるのではないかと思います。</p>
<p>なんでも良いから動くものがつくりたくて Python を選んだのではなく、プログラミングの作法といった感じのことを身に着けたくて Python を選んだのです。コーディングスタイルが仕様となっているくらいに、きれいで効率の良いコードに対するこだわり。比較的、初心者に親切なコミュニティ。ここらへんが理由で Python にしました。</p>
<p>学習の方法について、もう少し考えないとならないなと思うところです。今回、コードを書いてみたのは良い気付きになりました。</p>
Byte Order Mark に対処する2019-01-31T19:26:00+09:002019-01-31T19:26:00+09:00Junya Nakadatag:junyanakada.com,2019-01-31:/handle-byte-order-mark.html<p>Markdown ファイルから HTML ファイルをつくる Python スクリプトが、まあまあ動くようになりました。PC の中にあるテキストファイ …</p><p>Markdown ファイルから HTML ファイルをつくる Python スクリプトが、まあまあ動くようになりました。PC の中にあるテキストファイルを適当に HTML にしていたら、また問題が発生しました。<a class="reference external" href="https://junyanakada.com/handle-unicode-encode-error.html">UnicodeEncodeError もまだよくわからないというのに。</a></p>
<p>Markdown で ATX スタイルの見出しが変換されずそのまま段落として HTML になっていました。ATX スタイルの見出しというのは、行頭にハッシュ <cite>#</cite> を付けるスタイルの見出しです。こういう見出しです。</p>
<div class="highlight"><pre><span></span><span class="gh"># 見出し</span>
</pre></div>
<p>この部分がそのまま段落として、次のようになります。</p>
<div class="highlight"><pre><span></span><span class="p"><</span><span class="nt">p</span><span class="p">></span># 見出し<span class="p"></</span><span class="nt">p</span><span class="p">></span>
</pre></div>
<p>期待するところは、このようになることです。</p>
<div class="highlight"><pre><span></span><span class="p"><</span><span class="nt">h1</span><span class="p">></span># 見出し<span class="p"></</span><span class="nt">h1</span><span class="p">></span>
</pre></div>
<p>今回はパッとひらめいたことが正解だったのですぐに直せました。Windows のメモ帳で新規につくったファイルを UTF-8 で保存すると、ファイルの先頭に Byte Order Mark(BOM) が入ります。Markdown で見出しにするときには、行頭に <cite>#</cite> を付けなければなりませんが、BOM が行頭に入ってしまいます。イメージとしては次のような感じでしょう。</p>
<div class="highlight"><pre><span></span>(BOM)# 見出し
</pre></div>
<p><a class="reference external" href="https://www.lifewithpython.com/2017/10/python-detect-bom-in-utf8-file.html">解決方法</a> は、ファイルを読み込みモードで開くときに、エンコードを <cite>utf-8-sig</cite> にすることです。</p>
<div class="highlight"><pre><span></span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">content</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</pre></div>
<p><cite>utf-8-sig</cite> にしておくと、BOM なしのファイルもそのまま開けるそうです。ファイルの大きさが処理に関わるような場合でなければ、 <cite>utf-8-sig</cite> で OK です。</p>
<p>メモ帳でプログラムを書く人はあまりいないと思いますが、メモを取るときにメモ帳を使って Markdown を書くという人はそれなりに居そうです。ちょっとの量だったら、起動の速いメモ帳が便利でしょう。そんな私に朗報です。<a class="reference external" href="https://forest.watch.impress.co.jp/docs/news/1157696.html">「メモ帳」のデフォルト保存形式が BOM なし UTF-8 になりました。</a></p>
UnicodeEncodeError に対処する2019-01-30T20:11:00+09:002019-01-30T20:11:00+09:00Junya Nakadatag:junyanakada.com,2019-01-30:/handle-unicode-encode-error.html<p><a class="reference external" href="https://junyanakada.com/run-my-scripts-easy-on-windows.html">こんなことを言っていました。</a></p>
<blockquote>
Python を Windows にインストールして、まずはバッチファイルや VBA を Python に置き換える予定です。</blockquote>
<p>バ …</p><p><a class="reference external" href="https://junyanakada.com/run-my-scripts-easy-on-windows.html">こんなことを言っていました。</a></p>
<blockquote>
Python を Windows にインストールして、まずはバッチファイルや VBA を Python に置き換える予定です。</blockquote>
<p>バッチファイルの置き換えに挑戦しました。Pandoc に Markdown から HTML を生成させるバッチファイルを置き換えました。ついでなので Pandoc を使わない方向でトライしました。</p>
<p>出ました、 <cite>UnicodeEncodeError</cite> そして <cite>UnicodeDecodeError</cite> 。読み込んむファイルも utf-8 で書いてあって、 Python3 はデフォルトで utf-8 であるはず。対処法はわかってみればそれほど難しくはありませんでしたが、一体何が起こっているのかさっぱりわからず、かなりの時間を食われてしまいました。</p>
<p>ファイルを開くときに、<a class="reference external" href="https://docs.python.jp/3/library/functions.html#open">open()</a> のオプションで <cite>errors</cite> を指定してやれば良いようです。</p>
<p><cite>ignore</cite> にしたので、エラーになる文字は消失してしまうはずなのですが、そういうことも起きていないようでした。<cite>0x93</cite> の文字が問題のようでしたが、この文字何でしょう?</p>
<p>コマンドプロンプトの文字コードが cp932 なのが絡んでいるのでしょうが、テキストエディタで utf-8 に直しても起こります。何でしょう?</p>
<p>コマンドプロンプトからリダイレクトして作ったファイルで躓いたので、そのあたりが問題かもしれません。こんな感じのエラーでした。(思い出しながら検索したエラーメッセージなので正確性は?です。)</p>
<div class="highlight"><pre><span></span>UnicodeDecodeError: <span class="s1">'cp932'</span> codec can<span class="err">'</span>t decode byte 0x8d <span class="k">in</span> position <span class="m">143</span>: illegal multibyte sequence
</pre></div>
<p>open() に encoding='utf-8' 指定したら OK だったという記事も多かったですが、それではだめでした。</p>
自作の便利スクリプトを便利に使う on Windows2019-01-29T19:57:00+09:002019-01-29T19:57:00+09:00Junya Nakadatag:junyanakada.com,2019-01-29:/run-my-scripts-easy-on-windows.html<p><a class="reference external" href="https://junyanakada.com/notice-difference-in-python-on-windows.html">Python を Windows にインストールして、</a> まずはバッチファイルや VBA を Python に置き換える予定です。</p>
<p>ところで、せっかく書いた便利な …</p><p><a class="reference external" href="https://junyanakada.com/notice-difference-in-python-on-windows.html">Python を Windows にインストールして、</a> まずはバッチファイルや VBA を Python に置き換える予定です。</p>
<p>ところで、せっかく書いた便利なスクリプトを便利に使いたいという欲求があります。 Linux であれば <cite>$HOME/bin</cite> に置いておくのが定石でしょう。今どきは <cite>$HOME/bin</cite> があればそこに Path を通すように設定してくれていたりもします。</p>
<p>Windows であれば <cite>%USERPROFILE%bin</cite> をつくって Path を通しておくのでしょうか。悪くはありませんが、Windows のコマンドプロンプトはあまり使い勝手が良いとは感じられません。やはり Windows ならマウス操作でスクリプトを実行させられたほうが良いでしょう。</p>
<p>ファイルを変換するとか、ファイルを引数に取るスクリプトは、<a class="reference external" href="http://www.atmarkit.co.jp/ait/articles/1109/30/news131.html">コンテキストメニューの「送る」で実行するのが便利です。</a></p>
<p>Python の標準ライブラリだけ使うスクリプトであれば、そのスクリプトを「送る」に登録すれば充分です。ですが、<a class="reference external" href="https://docs.python.org/ja/3/library/venv.html">仮想環境</a> を使いたい場合にどうするか? Python スクリプトの中で仮想環境を有効にする方法もあるかもしれませんが、調べるのにへこたれました。</p>
<p>ということでバッチファイルで仮想環境を有効化してからスクリプトを実行します。</p>
<p>たとえば次のように仮想環境をつくったとしましょう。</p>
<div class="highlight"><pre><span></span>py.exe -m venv <span class="nv">%USERPROFILE%</span>\venv
</pre></div>
<p>バッチファイルは次のようにします。<cite>myscript.py</cite> が実行したいスクリプトです。</p>
<div class="highlight"><pre><span></span><span class="p">@</span><span class="k">echo</span> off
<span class="k">call</span> <span class="nv">%USERPROFILE%</span>\venv\Scripts\activate.bat
py.exe .\myscript.py <span class="nv">%*</span>
</pre></div>
<p>これでバッチファイルをつくって「送る」に登録します。バッチファイルからバッチファイルを呼び出す場合は <cite>call</cite> が必要になるところに注意します。</p>
Windows で Python を使うときに気に留めておくこと2019-01-28T19:55:00+09:002019-01-28T19:55:00+09:00Junya Nakadatag:junyanakada.com,2019-01-28:/notice-difference-in-python-on-windows.html<p>Make everything as code という題目を掲げて、隙きあらばコーディングに取り組みます。仕事での取り組みが多くなって、ブログに書 …</p><p>Make everything as code という題目を掲げて、隙きあらばコーディングに取り組みます。仕事での取り組みが多くなって、ブログに書けないことが多いのが玉に瑕ですが。</p>
<p>ということで、まずは Windows PC に Python をインストールします。いつもの Linux とはちょっと違うぞ、という話。</p>
<p><a class="reference external" href="https://www.python.jp/install/windows">python.jp の環境構築ガイド</a> を見れば難しいこともなくインストールできます。注意書きで、Download ボタンからダウンロードしないこととありますが、あまり気にする必要ないのではないかと思います。32 bit のバイナリがインストールされますが、Windows が 64 bit で違いがあるからと言ってそれほど困ることあるのかなと。もうひとつ、Path を通すオプションにチェックを入れるようにとありますが、それも必要ないかなと。</p>
<p>Linux それからおそらく Mac との違いは、Python ランチャーというものがインストールされる点です。この Python ランチャーが、スクリプトファイルを受け取って、妥当なバージョンの Python で実行してくれるようです。2 系と 3 系だけでなく、細かくバージョンを管理する場合に便利です。</p>
<p>ということなので、Windows で Python を実行するときは、</p>
<div class="highlight"><pre><span></span><span class="n">python</span>
</pre></div>
<p>ではなく、</p>
<div class="highlight"><pre><span></span><span class="n">py</span>
</pre></div>
<p>です。</p>
<p>そして先に述べましたが <cite>python</cite> に Path は通さないのがデフォルトです。Python ランチャーがうまいことさばいてくれるから必要ないということでしょう。Windows の Path 変数には文字数制限があるので通さずに済むならそのほうが良いです。</p>
<p><cite>.py</cite> ファイルの関連付けも Python ランチャーです。スクリプトファイルのダブルクリックで実行できます。</p>
<p>Linux と違うのでびっくりしました。windows では <cite>python</cite> でなく <cite>py</cite> ですね。</p>
テーマを Flex に2019-01-27T18:45:00+09:002019-01-27T18:45:00+09:00Junya Nakadatag:junyanakada.com,2019-01-27:/flex-theme.html<p>テーマを <a class="reference external" href="http://flex.alxd.me/blog">Flex</a> に変えてみました。このブログを始める前に、一週間くらいでへこたれてしまったときに使っていたテー …</p><p>テーマを <a class="reference external" href="http://flex.alxd.me/blog">Flex</a> に変えてみました。このブログを始める前に、一週間くらいでへこたれてしまったときに使っていたテーマだったりします。今度は自前のテーマで運用しようと始めましたが、なかなかテーマを作り込む時間が取れずで、一旦既存のテーマを適用することにしました。</p>
<p>へこたれたときのテーマを使うなんて縁起でもない!</p>
鎌倉 Python もくもく会 #2 に参加2019-01-26T22:28:00+09:002019-01-26T22:28:00+09:00Junya Nakadatag:junyanakada.com,2019-01-26:/attend-kamakura-python-2.html<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">board</span> <span class="kn">import</span> <span class="n">D13</span>
<span class="kn">from</span> <span class="nn">digitalio</span> <span class="kn">import</span> <span class="n">DigitalInOut</span><span class="p">,</span> <span class="n">Direction</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">led</span> <span class="o">=</span> <span class="n">DigitalInOut</span><span class="p">(</span><span class="n">D13</span><span class="p">)</span>
<span class="n">led</span><span class="o">.</span><span class="n">direction</span> <span class="o">=</span> <span class="n">Direction</span><span class="o">.</span><span class="n">OUTPUT</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">led</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="kc">True</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'LED On'</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>
<span class="n">led</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="kc">False</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'LED Off'</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</pre></div>
<p><a class="reference external" href="https://kamakurapython.connpass.com/event/111878/">鎌倉 Python もくもく …</a></p><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">board</span> <span class="kn">import</span> <span class="n">D13</span>
<span class="kn">from</span> <span class="nn">digitalio</span> <span class="kn">import</span> <span class="n">DigitalInOut</span><span class="p">,</span> <span class="n">Direction</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
<span class="n">led</span> <span class="o">=</span> <span class="n">DigitalInOut</span><span class="p">(</span><span class="n">D13</span><span class="p">)</span>
<span class="n">led</span><span class="o">.</span><span class="n">direction</span> <span class="o">=</span> <span class="n">Direction</span><span class="o">.</span><span class="n">OUTPUT</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">led</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="kc">True</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'LED On'</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>
<span class="n">led</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="kc">False</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'LED Off'</span><span class="p">)</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
</pre></div>
<p><a class="reference external" href="https://kamakurapython.connpass.com/event/111878/">鎌倉 Python もくもく会 #2</a> に参加しました。冒頭のコードはそこで書いたコードです。</p>
<p>2時間のうちにできることをやるつもりで、<a class="reference external" href="https://junyanakada.com/buy-trinket-m0.html">この前買った Adafruit Trinket-M0</a> を持って行きました。Python が動くのでLチカはすぐに終わるだろう、USB ポートでシリアル通信ができれば良いかなというつもりで参加しました。</p>
<p><a class="reference external" href="https://learn.adafruit.com/adafruit-trinket-m0-circuitpython-arduino">Adafruit の解説</a> を見て動かしたという感じです。やりたいことは、そこに書いてあって、Lチカもほぼ写経でできてしまいました。シリアルに至っては print 文だけ。標準出力が USB のシリアルになっているということなのでしょう。</p>
<p>反対に、購入時に書き込まれていたサンプルスクリプトが動きません。解説をよく読んだら、ブートローダのバージョンを上げたらあわせてライブラリもバージョンを上げなければならないということでした。変なところで時間がかかりましたが、そういうものです。</p>
<p>今のところ <a class="reference external" href="https://kamakurapython.connpass.com/event/117741/">次回</a> も参加予定です。</p>
<p>スイッチサイエンスが輸入したものですが、秋葉原にあるツクモロボット王国で扱っていました。他にもスイッチサイエンスの商品が扱われていました。今日欲しいものがあるというときには便利かもしれません。スイッチサイエンスは実店舗がありません。</p>
<p><a class="reference external" href="https://makezine.jp/blog/2017/11/trinket-m0_and_circuitpython.html">Make: の紹介記事</a> 通りに最新のファームウェアを書き込みました。</p>
<p>ところで、<a class="reference external" href="https://www.adafruit.com/product/3500">商品ページ</a> を見ていたら、 <a class="reference external" href="https://learn.adafruit.com/stand-alone-programming-avrs-using-circuitpython">AVR で CircuitPython がプログラミングできるというページ</a> がありました。USB ドライブのように Python スクリプトを書き込めば動くというようには、そのページにはありませんでしたが、CircuitPython で Arduino を動かせるというのは面白そうです。</p>
デバイス同士を Web API で通信させたい2019-01-25T19:55:00+09:002019-01-25T19:55:00+09:00Junya Nakadatag:junyanakada.com,2019-01-25:/make-device-raspberry-pi-web-api.html<p><a class="reference external" href="https://junyanakada.com/line-tracer-3years-ago.html">久しぶりにライントレーサを触ったり、</a> <a class="reference external" href="https://junyanakada.com/think-improvement-line-tracer-3years-ago.html">それの動画を見てみたりで、</a> ものづくりをしようという意欲が湧き始めまし …</p><p><a class="reference external" href="https://junyanakada.com/line-tracer-3years-ago.html">久しぶりにライントレーサを触ったり、</a> <a class="reference external" href="https://junyanakada.com/think-improvement-line-tracer-3years-ago.html">それの動画を見てみたりで、</a> ものづくりをしようという意欲が湧き始めました。</p>
<p>せっかくつくるなら、デバイス同士をインターネットを介して通信できるようにしたいところです。一方のデバイスの状態によってもう一方のデバイスの動作が変わるような何か。まだこれくらいぼやっとした構想しかありません。インターネットを介するとなると Web API をつくってコミュニケーションを取らせるということになるのかなと考えています。そうすると Raspberry Pi らへんの シングルボードコンピュータを使うことになるでしょう。</p>
<p>まず何から始めたら良いでしょう。そもそも Web API の扱い方がわかりません。 <a class="reference external" href="https://bottlepy.org">Bottle</a> とかを触るところから始めてみます。</p>
3年前のライントレーサをどうする?2019-01-24T19:55:00+09:002019-01-24T19:55:00+09:00Junya Nakadatag:junyanakada.com,2019-01-24:/think-improvement-line-tracer-3years-ago.html<p><a class="reference external" href="https://junyanakada.com/line-tracer-3years-ago.html">昨日、久しぶりにライントレーサを触りましたが、</a> 動画のほうも久しぶりに見ました。つくった当時も気になりました …</p><p><a class="reference external" href="https://junyanakada.com/line-tracer-3years-ago.html">昨日、久しぶりにライントレーサを触りましたが、</a> 動画のほうも久しぶりに見ました。つくった当時も気になりましたが、やっぱり久しぶりにみても気になります。鼻先を振りすぎだなと思うのです。</p>
<p>車体の一番前に付いているセンサーでラインを検知して、左右の車輪を別々に制御して左右に向かっています。デファレンシャル方式と言ったら良いでしょうか。戦車と同じ方式です。車輪は車体の最後方にあります。つまり、ライン検知を行う場所は車体最前方で、旋回の中心は車体最後方にあり、離れすぎているのではないかと思うのです。結果、鼻先を振り回してしまい、なかなか前に進めません。その上、動画では一周回りきっていますが、鋭いカーブに出くわすと曲がりきれずに立ち往生してしまいます。</p>
<p>今度つくるときは、旋回の中心とセンサーを車体の中心に寄せてつくりたいと思います。</p>
3年前のライントレーサ2019-01-23T20:59:00+09:002019-01-23T20:59:00+09:00Junya Nakadatag:junyanakada.com,2019-01-23:/line-tracer-3years-ago.html<iframe width="320" height="180" src="https://www.youtube-nocookie.com/embed/BGXCMcYa-8A" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><p>ライントレーサです。今の会社に就職するときの就職活動でつくりました。「そんなに言うなら何かつくって見せてみ …</p><iframe width="320" height="180" src="https://www.youtube-nocookie.com/embed/BGXCMcYa-8A" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><p>ライントレーサです。今の会社に就職するときの就職活動でつくりました。「そんなに言うなら何かつくって見せてみろ」という話になって大慌てでつくって面接に行きました。幸か不幸か、その会社にはご縁がありませんでした。もう3年も前のことで、懐かしく思います。</p>
<p>当時描いていた未来とは違う現在を生きています。これもまた、良かったのか、今ひとつなのか、わかりません。ですが、 <a class="reference external" href="https://junyanakada.com/assemble-clock-kit.html">何かハードウェアをつくるのが楽しいのは今も変わりません。</a></p>
<p>今日、久しぶりにこのロボットを引っ張り出して見ました。バラして新しいものをつくるのも良いかなと思っています。</p>
わたしの Why Python2019-01-22T22:37:00+09:002019-01-22T22:37:00+09:00Junya Nakadatag:junyanakada.com,2019-01-22:/reason-why-python.html<p>Python にこだわっています。使える言語は?という問に対して Python とは答えられませんが(正直、答えられるものがない)、好きな …</p><p>Python にこだわっています。使える言語は?という問に対して Python とは答えられませんが(正直、答えられるものがない)、好きな言語は?という問に対しては Python と答えられます。</p>
<p>Python をから始めてみようかと思ったきっかけは、<a class="reference external" href="https://cruel.org/freeware/hacker.html">How To Become A Hacker</a> でした。Linux を始めたきっかけもこれです。</p>
<p>もう少し調べてみて、次のいくつかの理由で Python が好きになりました。</p>
<ol class="arabic simple">
<li>インデントが構文に定められていて、整ったコードが書きやすい。</li>
<li>ひとつのことをするには、ひとつの方法だけがある。</li>
</ol>
<p>このごろは行き詰まり感じることが多くなりました。もしかして、プログラマになりたいと思った動機と、今プログラミングを身に着けたいと思っている理由とで食い違いが生じているのかもしれないと思って、ちょっとだけ振り返ってみました。何か思想めいたものがあるにはあったみたいです。</p>
<p>ところで、初めての言語は Python なのか?いえ、初めては C でした。</p>
タスクランナー多すぎ2019-01-21T20:57:00+09:002019-01-21T20:57:00+09:00Junya Nakadatag:junyanakada.com,2019-01-21:/too-many-task-runners.html<p>ここで言うタスクランナーというのはビルドやデプロイを自動化する Make のようなツールです。</p>
<p>さて、<a class="reference external" href="https://junyanakada.com/replace-operations-with-software-engineering.html">既存業務を改善 …</a></p><p>ここで言うタスクランナーというのはビルドやデプロイを自動化する Make のようなツールです。</p>
<p>さて、<a class="reference external" href="https://junyanakada.com/replace-operations-with-software-engineering.html">既存業務を改善しよう</a> ということで Jenkins に取り組みました。</p>
<p>書類はできる限り Markdown で書いています。それを Pandoc を使って HTML に変換するようにしています。変換作業を Jenkins にやらせてみようと思い Jenkinsfile を書きました。</p>
<p>せっかくだから、タスクランナーも Make ではなく他のものを使ってみようと思って色々と探してみました。が、タスクランナー多すぎです。Python だけでも Paver やら Invoke やら、なんやらかんやら。API から実行すると、シェルから実行するとは違う使い方ができるかなと思って試してみようとなったのですが、数が多すぎます。</p>
<p>その上 言語が違ったりして API が叩けなかったりすると結局シェルで叩くことになります。そう、結局シェル。</p>
<p>なら、Make で良いや。</p>
既存業務をソフトウェアエンジニアリングで置き換える2019-01-20T20:51:00+09:002019-01-20T20:51:00+09:00Junya Nakadatag:junyanakada.com,2019-01-20:/replace-operations-with-software-engineering.html<p><a class="reference external" href="https://junyanakada.com/install-cloudready-chromeos.html">昨日は Chrome OS をしばらく使おうと書いてますが、</a> さっそくへこたれてしまいました。昨日ブログを書いたときの面倒く …</p><p><a class="reference external" href="https://junyanakada.com/install-cloudready-chromeos.html">昨日は Chrome OS をしばらく使おうと書いてますが、</a> さっそくへこたれてしまいました。昨日ブログを書いたときの面倒くささを思い出すと、無理に使うこともないなということで、今日はもともと使っていた Linux Mint です。</p>
<p>Software Design 2019年2月号を読んでいて気になったことが今日の話です。既存業務をソフトウェアエンジニアリングで置き換える、ということです。記事を深く読んで気になっているということではなく、<a class="reference external" href="https://junyanakada.com/make-liveusb-cloudready-chromeos.html">つくるものが思いつかないときに</a> ヒントを見つけたように思えて、気になったというところです。</p>
<p>Site Reliability Engineering(SRE) についての特集でハートビーツ社の展開事例としてあげられていた例のひとつです。ハートビーツ社はインフラ運用の会社です。インフラ監視は一般的にソフトウェアエンジニアリングが重要視されない業務ですが、こちらでは SRE 以前からソフトウェアエンジニアリングを重視してきたとのことです。この特集記事では、インフラエンジニアがどのようにソフトウェアエンジニアリングを身に着けてきたか、実践例をあげて紹介しています。</p>
<p>私としては、非ソフトウェアエンジニアがどのようにソフトウェアエンジニアリングを身に着けるかという視点で気になりました。何をつくるのかで悩んでいますが、そもそもの動機が、ソフトウェアエンジニアになりたいというところから始まっています。そこで、まずは既存業務の改善に目を向けてみてはどうか、という点でヒントになりました。</p>
<p>無理に何かをつくろうとする前に、ソフトウェアエンジニアリングで既存業務を置き換えるということに取り組みます。</p>
Chrome OS インストール2019-01-19T23:17:00+09:002019-01-19T23:17:00+09:00Junya Nakadatag:junyanakada.com,2019-01-19:/install-cloudready-chromeos.html<p><a class="reference external" href="https://junyanakada.com/make-liveusb-cloudready-chromeos.html">昨日つくった Live USB</a> で ThinkPad X200s に Chrome OS をインストールします。もちろん、厳密には Chromium OS です。</p>
<p>インストール自体は難しくあり …</p><p><a class="reference external" href="https://junyanakada.com/make-liveusb-cloudready-chromeos.html">昨日つくった Live USB</a> で ThinkPad X200s に Chrome OS をインストールします。もちろん、厳密には Chromium OS です。</p>
<p>インストール自体は難しくありません。GUI に従って進めればできます。Chrome ブラウザに慣れていれば設定も難しくはないでしょう。私は普段 FireFox を使っていますが、そんなに問題はありませんでした。ひとつ嬉しいことが、Caps キーを Ctrl キーに変えられる設定があることです。難しい操作は要りません。EC2 に SSH でアクセスするのも、他のマシンで SSH キーをつくって Chrome OS マシンに持って来るのは面倒ですが、<a class="reference external" href="https://dev.classmethod.jp/etc/chromebook-ec2-ssh">参考にできるページ</a> が充分にあるので、そこまで難しくはありません。</p>
<p>残念ですが、Secure Shell App で日本語入力がうまくできません。Ctrl + Space でインプットメソッドの切り替えができなかったり、入力中に文字がずれて表示されたりして、文章を打つのに使えるという感じではありませんでした。日本語を使わなければ特に問題はないように思います。プログラムを書いたり、設定ファイルを書き換えたりするには充分でしょう。日本語もできないわけではないです。少しずつ入力するような作業なら使えると思います。文章は別に書いておいて SSH でアクセスしたときにコピペするとかもありでしょう。</p>
<p>もうしばらく Chrome OS(Chromium OS)を使ってみましょう。</p>
Chrome OS インストーラ USB 作成2019-01-19T00:57:00+09:002019-01-19T00:57:00+09:00Junya Nakadatag:junyanakada.com,2019-01-19:/make-liveusb-cloudready-chromeos.html<p><a class="reference external" href="https://junyanakada.com/naming-too-difficult.html">名前を考えるのに苦戦しているところですが、</a> 何をつくるのかが決まっていません。そもそもあまり Web アプリを使っ …</p><p><a class="reference external" href="https://junyanakada.com/naming-too-difficult.html">名前を考えるのに苦戦しているところですが、</a> 何をつくるのかが決まっていません。そもそもあまり Web アプリを使っていないような気がします。</p>
<p>そんなこともあって、前に使っていた ThinkPad X200s に Chrome OS をインストールして、Web アプリに親しんでみたいと思います。もちろん Chrome OS が配布されているわけではないので、Chromium OS ということになります。</p>
<p>今は Chromium OS を独自にビルドして配布してくれているところもあるので、かんたんにインストールできそうです。<a class="reference external" href="https://www.neverware.com">CloudReady</a> です。</p>
<p>Windows と Mac OS と Chrome OS は Live USB のつくりかたが書かれていますが、Linux は書かれていません。多分、ダウンロードして dd で良いだろうと思いましたが、<a class="reference external" href="https://neverware.zendesk.com/hc/en-us/articles/213346247-How-do-I-create-a-CloudReady-USB-installer-on-Linux-">サポートサイトにも、ダウンロードして dd と書かれています。</a></p>
<p>とりあえず、つくった Live USB でインストーラが起動するところを確認して、今日はここまで。</p>
ネーミングに悩む2019-01-17T21:22:00+09:002019-01-17T21:22:00+09:00Junya Nakadatag:junyanakada.com,2019-01-17:/naming-too-difficult.html<p><a class="reference external" href="https://junyanakada.com/begin-software-develop.html">そろそろソフトウェア開発もはじめたいと思ったは良いですが、</a> 何をつくるかも決まらないうちに悩んでいます。名 …</p><p><a class="reference external" href="https://junyanakada.com/begin-software-develop.html">そろそろソフトウェア開発もはじめたいと思ったは良いですが、</a> 何をつくるかも決まらないうちに悩んでいます。名前が付けられない。</p>
<p>昔、オンラインスクールで習ったときには、フィードアグリゲータをつくりました。名前を NewsTrail にしましたが、これはドメインが取られてしまっています。</p>
<p>使い続けるソフトウェア、開発し続けるソフトウェアをつくるつもりなので、Sample reader みたいなのは絶対に避けたいところです。</p>
<p>…そもそも何をつくるか決めないと。</p>
ソフトウェア開発をはじめよう2019-01-16T21:56:00+09:002019-01-16T21:56:00+09:00Junya Nakadatag:junyanakada.com,2019-01-16:/begin-software-develop.html<p>そろそろソフトウェア開発もはじめたいと思います。</p>
<p>ということで、昔、オンラインスクールで習った設計の手順をざ …</p><p>そろそろソフトウェア開発もはじめたいと思います。</p>
<p>ということで、昔、オンラインスクールで習った設計の手順をざっくりとおさらいします。</p>
<ol class="arabic simple">
<li>何をつくるか決める</li>
<li>ユーザーストーリーを書く(どんな機能、どんな画面があるか)</li>
<li>画面を設計する(部品の具体的な配置など)</li>
<li>DB設計(ER図を書く)</li>
</ol>
<p>つくっている途中で、調べなければならないことが出てくるはずです。これくらいおさらいしておけば、進められます。</p>
<p>何をつくるかが問題です。自分はエンジニアだと主張したいという動機で開発をするわけですが、書き捨てにするのは嫌です。自分自身で使い続けるものをつくりたいです。使っていれば直したいところが出てきて、開発が続くと思います。</p>
<p>さあ、何をつくろうか。</p>
おまえだれよ なおしました2019-01-15T22:43:00+09:002019-01-15T22:43:00+09:00Junya Nakadatag:junyanakada.com,2019-01-15:/fix-whoami-twitter-link.html<p><a class="reference external" href="https://junyanakada.com/pages/whoami.html">おまえだれよ</a> に Twitter のリンクを追加しました。</p>
<p>まだまだ記事の更新で精一杯ですが、情報配信の仕組みは地道に調整し …</p><p><a class="reference external" href="https://junyanakada.com/pages/whoami.html">おまえだれよ</a> に Twitter のリンクを追加しました。</p>
<p>まだまだ記事の更新で精一杯ですが、情報配信の仕組みは地道に調整して行きたいところです。</p>
<p>このブログは技術ブログを目指すのではなく、個人ブログとして運営しています。個人のコミュニケーションツールとして捉えています。ですので、SNS は重要なツールなのですが…。今は、記事の更新で精一杯です。</p>
Adafruit Trinket-M0 を買う2019-01-14T22:08:00+09:002019-01-14T22:08:00+09:00Junya Nakadatag:junyanakada.com,2019-01-14:/buy-trinket-m0.html<p>Adafruit Trinket-M0 を買いました。</p>
<p>スイッチサイエンスが輸入したものですが、秋葉原にあるツクモロボット王国で扱っていました …</p><p>Adafruit Trinket-M0 を買いました。</p>
<p>スイッチサイエンスが輸入したものですが、秋葉原にあるツクモロボット王国で扱っていました。他にもスイッチサイエンスの商品が扱われていました。今日欲しいものがあるというときには便利かもしれません。スイッチサイエンスは実店舗がありません。</p>
<p><a class="reference external" href="https://makezine.jp/blog/2017/11/trinket-m0_and_circuitpython.html">Make: の紹介記事</a> 通りに最新のファームウェアを書き込みました。</p>
<p><a class="reference external" href="https://junyanakada.com/misunderstand-on-circuitpython.html">次に書いたことは勘違いでした。CircuitPython ボードで AVR に書き込みができるということでした。</a></p>
<p>ところで、<a class="reference external" href="https://www.adafruit.com/product/3500">商品ページ</a> を見ていたら、 <a class="reference external" href="https://learn.adafruit.com/stand-alone-programming-avrs-using-circuitpython">AVR で CircuitPython がプログラミングできるというページ</a> がありました。USB ドライブのように Python スクリプトを書き込めば動くというようには、そのページにはありませんでしたが、CircuitPython で Arduino を動かせるというのは面白そうです。</p>
スマホがあれば EC2 で開発ができてしまうのか?2019-01-13T22:19:00+09:002019-01-13T22:19:00+09:00Junya Nakadatag:junyanakada.com,2019-01-13:/ec2-android-ssh.html<p>Android を使って EC2 にログインできました。先に PC で作っておいたインスタンスにログインしました。インスタンスの作成 …</p><p>Android を使って EC2 にログインできました。先に PC で作っておいたインスタンスにログインしました。インスタンスの作成から Android で、とうのは試していません。</p>
<p>Android には SSH Keys を生成できる SSH クライアントをインストールしておく必要があります。<a class="reference external" href="https://play.google.com/store/apps/details?id=org.connectbot">ConnectBot</a> を使いました。</p>
<p>手順です。</p>
<ol class="arabic simple">
<li>PC を使って EC2 インスタンスを作る</li>
<li>Android の SSH クライアントで SSH Keys を生成する</li>
<li>生成した公開鍵を PC に送る</li>
<li>PC を使って EC2 インスタンスの ~/.ssh/authorized_keys に公開鍵を追加する</li>
</ol>
<p>他に、Linux を操作するのに必要な、Ctrl キー等があるキーボードを使うと良いです。<a class="reference external" href="https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard">Hacker's Keyboard</a> が良さそうです。</p>
<p>あとは Bluetooth キーボードがあれば、スマホで開発ができてしまうのか?</p>
ThinkPad X240 アップグレード2019-01-12T22:06:00+09:002019-01-12T22:06:00+09:00Junya Nakadatag:junyanakada.com,2019-01-12:/thinpad-x240-upgrade.html<p><a class="reference external" href="https://junyanakada.com/repair-thinkpad-x240-trackpad.html">TrackPad を修理したThinkPad X240</a> の RAM 増設、SSD 換装をしました。</p>
<p>RAM は 4GB から 8GB に、HDD から SSD に換えました。換える前にも動作確認で触っ …</p><p><a class="reference external" href="https://junyanakada.com/repair-thinkpad-x240-trackpad.html">TrackPad を修理したThinkPad X240</a> の RAM 増設、SSD 換装をしました。</p>
<p>RAM は 4GB から 8GB に、HDD から SSD に換えました。換える前にも動作確認で触って、そんなに違いは感じなかったのですが、換えたらびっくり。インストールもあっという間で、起動がとにかく速い。やっぱり SSD は速いです。そもそも X200s は SSD を載せていて、X200s + SSD と X240 + HDD であまり違いを感じないという時点で、SSD の速さが感じられます。ちなみに、使っている ディストリビューション は <a class="reference external" href="https://linuxmint.com">Linux Mint</a> 19.1 MATE 64bit です。</p>
<p>ところで、幸か不幸かタッチパッドもしっかり動いています。ときどき手が触れてマウスポインタが飛んで行きます。</p>
<p>SSD 速い。</p>
ブログのネタの消費期限 〜 ネタが死んだ日2019-01-11T22:17:00+09:002019-01-11T22:17:00+09:00Junya Nakadatag:junyanakada.com,2019-01-11:/blog-material-is-dead.html<p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">ブログを始めました。</a> そして今日はネタに困ってます。</p>
<p>ブログのネタをちょこちょこメモしているのですが、見返して …</p><p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">ブログを始めました。</a> そして今日はネタに困ってます。</p>
<p>ブログのネタをちょこちょこメモしているのですが、見返してみても言葉にできない…。面白くなくなったとか、そういうことではなく言葉にできない…。やはりブログのネタにも鮮度があるというか、生き物なのでしょうか。</p>
<p>とは言え、毎日その日にネタを見つけるのも大変です。腐らせてしまうのと、発酵あるいは熟成させるのと同じような、ほんの少しの違いがブログのネタにもあるのでしょうか?</p>
<p>ネタを熟成させられるメモの取り方って、どんなでしょう?</p>
ThinkPad X240 TrackPad 断線したケーブルを交換2019-01-10T21:41:00+09:002019-01-10T21:41:00+09:00Junya Nakadatag:junyanakada.com,2019-01-10:/repair-thinkpad-x240-trackpad.html<img alt="TrackPad と断線したケーブル" src="https://junyanakada.com/images/trackpad-cable-disconnect.jpg" />
<p>おととしの秋、中古の ThinkPad X240 を買って TrackPad を X250 のものと交換しました。</p>
<p>うまくできたか不安に思いながら、おそるおそる電 …</p><img alt="TrackPad と断線したケーブル" src="https://junyanakada.com/images/trackpad-cable-disconnect.jpg" />
<p>おととしの秋、中古の ThinkPad X240 を買って TrackPad を X250 のものと交換しました。</p>
<p>うまくできたか不安に思いながら、おそるおそる電源を入れて、がっかり。左クリックができません。新品で買ったはずなのフレキシブルケーブルに傷がついていたのが気になっていましたが、直す気になれず一年も放置していました。</p>
<p>捨てるのにも金がかかるし、今のメインマシン ThinkPad X200s より新しいマシンが使えるようになります。ということで、一念発起して TrackPad を注文しました。</p>
<p>フレキシブルケーブルの傷が怪しかったので、そのケーブルだけ交換する方針で作業開始。ケーブルを外してみたら、やっぱり傷がついていたのは左ボタンにつながる線の上でした。新しいケーブルに傷が無いことを確認して交換。完了して電源を投入しました。めでたく左クリックできました。右ボタン、中ボタンも問題なし、TrackPoint も動きます。パッドは試し忘れましたが…、どちらかというと邪魔なので、まあ良いでしょう。</p>
<p>写真は交換後の TrackPad と断線していたフレキシブルケーブルです。ちょうどこのあたりかなという場所に乗せてみました。</p>
寝袋はじめました2019-01-09T21:19:00+09:002019-01-09T21:19:00+09:00Junya Nakadatag:junyanakada.com,2019-01-09:/begin-sleeping-bag.html<p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-3.html">今年の指針は「整える」です。</a></p>
<p>月曜日に寝袋を買いました。寝袋で冬が越せたら布団は捨てようと捨てる予定です。 今、部屋 …</p><p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-3.html">今年の指針は「整える」です。</a></p>
<p>月曜日に寝袋を買いました。寝袋で冬が越せたら布団は捨てようと捨てる予定です。 今、部屋の中で布団が大きな空間を占めています。これが寝袋に変わるとかなり小さくなります。衣装ケースにも収まりそうな大きさです。まあ、衣装ケースも持っていませんけれど。</p>
<p>今夜が3日目の夜です。一年で最も寒い時期。寝袋とタオルケットで寝ていますが、寒くて眠れないということはありません。朝までぐっすり。どちらかというと寝坊気味です。</p>
<p>寝袋でひと冬越せたら、布団を捨てよう。</p>
秘密鍵を動かすな2019-01-08T22:43:00+09:002019-01-08T22:43:00+09:00Junya Nakadatag:junyanakada.com,2019-01-08:/do-not-move-private-key.html<p><a class="reference external" href="https://junyanakada.com/ssh-keygen-tips.html">昨日、こんなことを書いていました。</a></p>
<blockquote>
キーペアは PC ごとにつくって、それぞれインスタンスに登録するものと思ってい …</blockquote><p><a class="reference external" href="https://junyanakada.com/ssh-keygen-tips.html">昨日、こんなことを書いていました。</a></p>
<blockquote>
キーペアは PC ごとにつくって、それぞれインスタンスに登録するものと思っていたのですが、インスタンスでひとつということのようです。</blockquote>
<p>実際は、 <a class="reference external" href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#replacing-key-pair">キーペアを追加や削除することは可能</a> です。インスタンスをつくるときはひとつだけ登録できて、追加や削除は Web ブラウザではできないというだけのことのようです。手順を見ると特別なことをしているわけでもないみたいです。</p>
<p>キーペアは PC でひとつどころか、ホスト(PC)のユーザごとにつくるものです。公開鍵の末尾のコメントは主に人間がキーを区別するために使われるようです。ですので、ユーザ名ホスト名がデフォルトで記述されるのは合理的なことです。</p>
<p>やはり、秘密鍵を使い回すことは好ましくはないようです。ユーザ個別にキーペアを作成して、サーバに登録することに比べると手間がかからないですが、このあたりはコストとセキュリティのどちらに重きを置くかということなのでしょう。</p>
<p>SSH キーを管理する手間を惜しんではいけない。</p>
SSH キーのユーザ名とホスト名を削除2019-01-07T22:01:00+09:002019-01-07T22:01:00+09:00Junya Nakadatag:junyanakada.com,2019-01-07:/ssh-keygen-tips.html<p>年末年始は実家で過ごしましたが、今日から出勤。昨日まで作業していた PC とは別の PC を使うので、<a class="reference external" href="https://junyanakada.com/localhost-on-ec2.html">昨日のおさらい</a> で …</p><p>年末年始は実家で過ごしましたが、今日から出勤。昨日まで作業していた PC とは別の PC を使うので、<a class="reference external" href="https://junyanakada.com/localhost-on-ec2.html">昨日のおさらい</a> で、もう一度 EC2 インスタンスをつくりました。</p>
<p>実のところはおさらいというわけでもなく、キーペアは PC ごとにつくって、それぞれインスタンスに登録するものと思っていたのですが、インスタンスでひとつということのようです。</p>
<p><a class="reference external" href="https://junyanakada.com/do-not-move-private-key.html">秘密鍵を使い回すことになるのは安全なのか?</a> と若干の不安を感じながら、それとは別に、SSH キーの末尾にユーザ名とホスト名が記述されるのがなんとなく気持ち悪くて、どうにかならないかと探していました。別の PC で使うファイルに、つくったときの情報がずっと残っているのが、セキュリティ云々ではなく、なんとなくすっきりできず。</p>
<p><a class="reference external" href="https://dev.classmethod.jp/tool/ssh-keygen-tips/">ssh-keygen の -C オプションで空文字列を渡してやる</a> と良いようです。</p>
<p>SSH キーのユーザ名とホスト名を消すには、空のコメントを渡せば良いです。</p>
AWS EC2 の localhost にアクセスする2019-01-06T22:24:00+09:002019-01-06T22:24:00+09:00Junya Nakadatag:junyanakada.com,2019-01-06:/localhost-on-ec2.html<p>開発環境は AWS などのクラウドに置いておきたいと思っています。開発環境がクラウドにあれば、PC の性能をさほど要 …</p><p>開発環境は AWS などのクラウドに置いておきたいと思っています。開発環境がクラウドにあれば、PC の性能をさほど要求しないでしょう。もしかすると Chromebook で開発ができてしまうかもしれません。そして、開発環境が不要になれば破棄できる。</p>
<p>今は開発らしいことはしていませんので、このブログのシステム <a class="reference external" href="http://docs.getpelican.com">Pelican</a> を EC2 で動かしてみました。</p>
<p>Pelican には <a class="reference external" href="http://localhost:8000">http://localhost:8000</a> で作成中のブログを見ることができる機能がありますが、仮想マシン上にブログがあるので localhost ではアクセスできません。インスタンスの IP アドレスでもアクセスできませんでした。でも SSH はできているので不可能ではないはず。</p>
<p>しばらく悩みましたが、ポート 8000 番でアクセスできるようにインスタンスを設定したらできました。</p>
<p>インスタンスの情報をみると Security groups という項目があります。ここで、inbound rules を確認してみます。初期状態では SSH の 22 番だけ設定されています。使っているグループのリンクも一緒に記載されていてリンクになっています。リンク先に移って 8000 番を加えれば <a class="reference external" href="http:/">http:/</a>/[インスタンスのアドレス]:8000 でアクセスできます。インスタンスの再起動は要らないようです。Type で HTTP を選択しても 80 から 8000 に変更できないので、Type は Custom TCP Rule とします。</p>
<p>わかってみると簡単でした。ポートを開くだけ。</p>
2019年に始めたいこと その32019-01-05T23:58:00+09:002019-01-05T23:58:00+09:00Junya Nakadatag:junyanakada.com,2019-01-05:/to-begin-in-2019-3.html<p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">その1</a> 、<a class="reference external" href="https://junyanakada.com/to-begin-in-2019-2.html">その2</a> に引き続き、今年始めたいことを考えます。</p>
<p>目標を立てるには一年という期間は長すぎます。自分自身に …</p><p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">その1</a> 、<a class="reference external" href="https://junyanakada.com/to-begin-in-2019-2.html">その2</a> に引き続き、今年始めたいことを考えます。</p>
<p>目標を立てるには一年という期間は長すぎます。自分自身にも周囲にも変化があれば、方向性は変わります。年頭に立てた目標はまったく意味をなさないものになりかねません。</p>
<p>自分が課題と捉えているものをあげてみます。</p>
<ul class="simple">
<li>どういう活動をしているのか人に見せられるものが無い。</li>
<li>英語の技術資料を理解できない。</li>
<li>部屋が散らかっていて物を取り出しにくい。</li>
</ul>
<p>何かを始めたいということで考えていました。何かを始めるその向こう側に求めていることは、変化を起こすということです。ですから、課題としていることの中で今まで最も後回しにしてきたことを最優先させてみます。課題としている、つまり解決する必要があるのに後回しにしていることに取り組んでみたら変化が起こるのではないか、という考えです。</p>
<p>先にあげた課題のなかで後回しにしていること、それは部屋が散らかっていることです。整理整頓はとにかく後回しになっています。今年は整理整頓に取り組むところからスタートして見ましょう。</p>
<p>今年は、「整える」を指針としてスタートします。</p>
時計キット組み立て2019-01-04T19:24:00+09:002019-01-04T19:24:00+09:00Junya Nakadatag:junyanakada.com,2019-01-04:/assemble-clock-kit.html<img alt="ELEKIT デジタルアラーム時計" src="https://junyanakada.com/images/elekit-tk-738.jpg" />
<p><a class="reference external" href="https://www.elekit.co.jp/product/TK-738">ELEKIT デジタルアラーム時計</a> キットを組み立てました。はんだ付け入門シリーズということで、パーツを基盤にはんだ付 …</p><img alt="ELEKIT デジタルアラーム時計" src="https://junyanakada.com/images/elekit-tk-738.jpg" />
<p><a class="reference external" href="https://www.elekit.co.jp/product/TK-738">ELEKIT デジタルアラーム時計</a> キットを組み立てました。はんだ付け入門シリーズということで、パーツを基盤にはんだ付けして完成するキットです。</p>
<p>40分くらいで完成。楽しい工作でした。やっぱり電子工作は楽しいです。 <a class="reference external" href="https://junyanakada.com/to-begin-in-2019-2.html">今年の方針を考えている最中ですが、</a> 工作している暇があったら Web アプリでも書いたほうが収入につながりそうで良いのかなと思ったり、でも楽しいのは組み込みだったり、悩ましいところです。あまり多くに手は着けられませんし。</p>
おまえだれよ つくりました2019-01-03T19:02:00+09:002019-01-03T19:02:00+09:00Junya Nakadatag:junyanakada.com,2019-01-03:/add-whoami-page.html<p><a class="reference external" href="https://junyanakada.com/pages/whoami.html">おまえだれよ</a> をつくりました。</p>
<p>要は自己紹介ページです。Python コミュニティの慣習にしたがって「おまえだれよ」としてい …</p><p><a class="reference external" href="https://junyanakada.com/pages/whoami.html">おまえだれよ</a> をつくりました。</p>
<p>要は自己紹介ページです。Python コミュニティの慣習にしたがって「おまえだれよ」としています。講演スライドの自己紹介の箇所を「自己紹介」などとするのではなく、このようにする慣習があるそうです。</p>
2019年に始めたいこと その22019-01-02T23:58:00+09:002019-01-02T23:58:00+09:00Junya Nakadatag:junyanakada.com,2019-01-02:/to-begin-in-2019-2.html<p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">昨日に引き続き、</a> 今年始めたいことを考えます。</p>
<p>今年は、部屋を片付けたいと思います。私の部屋はかなり散らかってい …</p><p><a class="reference external" href="https://junyanakada.com/to-begin-in-2019-1.html">昨日に引き続き、</a> 今年始めたいことを考えます。</p>
<p>今年は、部屋を片付けたいと思います。私の部屋はかなり散らかっている方です。ごみを捨てていないということはありませんし、よくテレビで取り上げられるようなごみ屋敷でもありません。でも、かなり散らかっています。ガラクタの中で過ごしていると言ったら的確かもしれません。</p>
<p>まず、部屋が散らかっていて、何かをするため、あるいは何もしないためのスペースが確保できていません。そして、所有物にアクセスすることが面倒です。まず探さなくてはいけませんから。結果、何もしないということが起こっていると思います。</p>
<p>分別ができていないということもあります。それ以上に必要な物の置き場所が決められていないというところが問題です。片付けをしていても、これは要るけど置く場所が無いからとりあえずここに置こう、といった感じで全く片付きません。収納用品にはそれなりに費用を割かなければいけません。</p>
<p>今年は収納用品に費用を割いて片付けをします。</p>
2019年に始めたいこと その12019-01-01T23:58:00+09:002019-01-01T23:58:00+09:00Junya Nakadatag:junyanakada.com,2019-01-01:/to-begin-in-2019-1.html<p>個人的には新年が無事に明けたかなと思っています。新年あけましておめでとうございます。しばらくは、昨年の振り …</p><p>個人的には新年が無事に明けたかなと思っています。新年あけましておめでとうございます。しばらくは、昨年の振り返りとともに、今年の計画を考えてみたいと思います。</p>
<p>まず、ブログを始めます。これは2018年の課題として、人に見せるものを持っていないということの解決策のひとつと考えています。2018年にも何回か勉強会に参加しましたが、なかなか自分のことを知ってもらうことは難しいと思いました。長々と自分の話をするわけには行かないし、そもそも自分自身が何者であるのか、または何者になろうとしているのかを自分自身が認識できているのか、というところが難しいと思っています。</p>
<p>始めますとは書きましたが、正しくは再開します、です。何度か挫折しているということです。ネタを探し続けられませんでした。エンジニアであるとアピールしたいあまりに技術的な記事を書くことにこだわってしまったことが原因と見ています。ですので、今度は個人ブログとして始めようと思います。雑記ブログとか日記ブログのような感じになります。</p>
<p>今年から個人ブログを始めます。</p>