tag:blogger.com,1999:blog-13443377966734803982024-03-13T21:20:08.786+09:00CuBeatSystemsshintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.comBlogger393125tag:blogger.com,1999:blog-1344337796673480398.post-39812716477632395542019-11-29T01:50:00.001+09:002019-11-29T01:50:33.506+09:00教科書に載らないソフトウェア開発入門 (インターフェースを切る事と実現可能なソフトウェア規模についての話)<h2>
<span style="font-size: large;">どうやったらもっとまともにソフトウェアを書くことができるようになるのか?</span></h2>
僕も若い頃、いや、まだ若いんだけど、本当にどうやってソフトウェアを書いてゆけば良いのかわからなくて、とにかくダラダラダラダラダラダラダラダラ「きっとやらなくてはいけない処理」を羅列したものだった。それも膨大な量のコードを。<br />
<br />
・・・と書こうと思ったのだが、実は自分自身はそうではなかった。<br />
<br />
以前書いた「アセンブラでこんなに美しく書ける方がいるんだ!」という純粋な感動体験が完全に邪魔をして、職業でソフトウェアを書く時に美しさに何かの美学を見出していた若かりし自分は、とにかくいかに美しく問題を解決するのか?についてひたすら毎日考えていた。このおかげで、人よりも余計な苦労をしなくてはならなかったのと、まだ若かった自分には設計や実装に関する知恵も知識もなかった上に余計なことに思慮を巡らせるものだからとにかく時間がかかっていた。本当にあれは今でも周囲にとっては単なる迷惑な新人だっただろうと想像できる。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-93ZxFi3vZQM/Xd_tHvo2bUI/AAAAAAAAEEA/ShfpONGNdpIvZhaDDXjRVwdeWslzwSu8wCLcBGAsYHQ/s1600/codes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="667" data-original-width="692" height="383" src="https://1.bp.blogspot.com/-93ZxFi3vZQM/Xd_tHvo2bUI/AAAAAAAAEEA/ShfpONGNdpIvZhaDDXjRVwdeWslzwSu8wCLcBGAsYHQ/s400/codes.png" width="400" /></a></div>
<br />
新しくソフトウェアを書こうと思う人にとっての最初の疑問は、どうやったらもっとまともにソフトウェアを書くことができるようになるのか?ということかもしれない。少なくとも自分はそうだった。<br />
<br />
<h2>
<span style="font-size: large;">インターフェースを切れるようになること</span></h2>
「どうやったらもっとまともにソフトウェアを書くことができるようになるのか?」という疑問に対する答えのひとつは「インターフェースを切れるようになること」だ。<br />
<br />
「インターフェースを切る」というのは、つまり、対象物が何であるのか、というのと、それをどうするのか、という二つの事を分析して理解した上で、使う側と使われる側の双方の立場で物事を考えなければならない。この分析を経てようやく何かのインターフェースを策定できるようになる。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-acPmUF9_TVg/Xd_xePFqq5I/AAAAAAAAEEM/CLWvg5SsfLc2ox60Ccfb31FKWstw-WJfgCLcBGAsYHQ/s1600/architecture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="517" data-original-width="1061" height="192" src="https://1.bp.blogspot.com/-acPmUF9_TVg/Xd_xePFqq5I/AAAAAAAAEEM/CLWvg5SsfLc2ox60Ccfb31FKWstw-WJfgCLcBGAsYHQ/s400/architecture.png" width="400" /></a></div>
<br />
この分析から理解、理解から策定に至るまでの道筋を立てられるようになると、インターフェースを切れるようになってくるのだけど、インターフェースが切れるようになってくると、大きな設計対象物でもそれらを部分に分割し、適切な階層構造を構築できるようになる。適切な階層構造を構築できるようになると、全体も部分もそれぞれの粒度で理解できるようになる。そして、階層構造で設計対象物を見れるようになることでソフトウェアの全体構造を見る視点が養われる。つまり、この時点で規模の大きなソフトウェアを実現できるようになってくるんだ!<br />
<br />
この段階に入ってくると、設計対象物を様々な見方で分析して理解できるようになってくる。データの流れで全体構造を見たり、論理的な階層構造から全体構造を見たりすると楽しいものなんだ。そして、何よりも大切なのは、楽しいと自分がやりたくなるっていうこと。苦労だけすれば良いってものではないからね。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Cd8Z4-GiyNE/Xd_ngGwFDPI/AAAAAAAAED0/zTQquVfq7CgvdjLrWbCx146dc4XfB7_HgCLcBGAsYHQ/s1600/block-diagram.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="535" data-original-width="913" height="233" src="https://1.bp.blogspot.com/-Cd8Z4-GiyNE/Xd_ngGwFDPI/AAAAAAAAED0/zTQquVfq7CgvdjLrWbCx146dc4XfB7_HgCLcBGAsYHQ/s400/block-diagram.png" width="400" /></a></div>
<br />
つまり、インターフェースを切るということは、全体を部分に分割するのに必要不可欠で、分割することで大きな規模のソフトウェアも実現できる。それだけではなく、全体を部分に分割する中で、関係のあるものと関係のないものを分離することが可能になり、よりソフトウェアが洗練される。例えば、何かのソフトウェアを書いていて「この処理は他でも使えるな」という処理があったとする。そういう処理は一度書いておけばどんどん使えるネタとして持っておくことができるようになるんだ。<br />
<br />
インターフェースを切っていると出来る芸当もあって、インターフェースを切っていることで、何かの変更が必要になった時にコンパイラに助けてもらうこともできる。<br />
<br />
例えば、インターフェースに新しい機能を追加したくなったとする。インターフェースの定義を変更するだけで、そのインターフェースを使っている上位層をあぶりだすことができるんだ。だって、変更して形の変わったインターフェースを使おうとしている上位のコードは、必ずコンパイルエラーになるでしょ?<br />
<br />
こんな風に、インターフェースを切るという話を始めただけでも、色々な側面の話が出てくるってこと。頭の片隅にあっても良いかもしれない。shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-62336520623519084782019-11-17T22:06:00.002+09:002019-11-17T22:06:56.760+09:00教科書に載らないソフトウェア開発入門 (インターフェースの定義と実装の詳細)<h2>
<span style="font-size: x-large;">インターフェースの定義と実装の詳細</span></h2>
「教科書に載らない」と書くからには、教科書に書かれないような(でも非常に大切なこと)ことを書こうと思う。<br />
<br />
働き始めて直ぐに横にいた先輩は、とある業務用ビデオ装置のディスク制御ファームウェアを書いていた人だった。この先輩は日本語の使い方しかり、話し方しかり、色々と事細かに注文を付けてきた。入社したての自分にとっては煩いだけの先輩だったのだけど、今思うと非常に大切なことをここで学んだように思う。<br />
<br />
このシリーズの冒頭では、同じことを指示しているような一つの単語があったとしても、見方や認識の差から結果的に全く異なる場所に行きついてしまう点について書いた。実はこの先輩も同じような事を言いたくて若い頃の自分に事細かに指導をしてくれていたのだと思う。<br />
<br />
ここ約20年ほど、様々なソフトウェア開発者の設計や実装を見てきて、如実に実力の差が明らかになるのは、インターフェースの定義と実装の詳細についての明確な思想が育っているか、という点だ。経験の浅いソフトウェア開発者、あるいは経験はあるはずなのに一向に技術レベルが向上しないソフトウェア開発者には共通して「インターフェースの定義と実装の詳細を明確に区別できていない」という問題があった。<br />
<br />
おそらくこの区別を最初に身に付けておくだけでも、相当なレベルの差になりそうだから、ここで非常に重要なこととして「インターフェースの定義と実装の詳細」について述べておくことにしたい。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-qhvN5YiUP8Q/XdFA3xJcFwI/AAAAAAAAEDc/yqZETg2xH5M31VlDIBC3S0oS02PHEpeKgCLcBGAsYHQ/s1600/interface-definition-and-the-implementation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="325" data-original-width="1200" height="172" src="https://1.bp.blogspot.com/-qhvN5YiUP8Q/XdFA3xJcFwI/AAAAAAAAEDc/yqZETg2xH5M31VlDIBC3S0oS02PHEpeKgCLcBGAsYHQ/s640/interface-definition-and-the-implementation.png" width="640" /></a></div>
<br />
もしかしたら、とても重要でかつ唯一といって良いかもしれない。そしたらこのシリーズは既に今日の内容で終わってしまうことになるが、それはそれで良いだろう。<br />
<br />
<h2>
<span style="font-size: x-large;">インターフェースの定義</span></h2>
インターフェースとは、ある面と別のまたある面の境界にある出入口のことだ。ざっくり言うとね。その出入口にはそれぞれ定められた規則があって、その規則に従う限り何かを通すことができる。”何か”っていうのがポイントだ。この通すものや規則を具体的に定めるのがインターフェースの定義。この定義に従う限り面と面を接続できる。<br />
<br />
これはソフトウェアの言語に依らない考え方ではあるのだけど、具体的な例が欲しいのでここではC言語で書いてみようと思う。<br />
<br />
<blockquote class="tr_bq">
int getc(FILE *stream);</blockquote>
<br />
例えば、上記の関数があったとしよう。この関数はFILEへのポインタを第一引数に取り、intを返値に持つ。この関数の実際の動作はインターフェースを定義した際に具体的な挙動が決められることになる。この関数はlibcの標準ライブラリだが、実際にこの一見簡単に見えるインターフェースでさえ、インターフェースの定義が明確になっていない限り、どのような動作になるのか見当もつかないはずだ。<br />
<br />
例に挙げると<br />
<ul>
<li>streamにnullを与えるとどうなるの?</li>
<li>streamに与えるFILEへのポインタとは一体なんなの?</li>
<li>streamのFILEへのポインタは開かれていないFILEだったらどうなるの?</li>
<li>返値のintはどういう規則で返されるものなの?</li>
</ul>
<div>
のように細かな動作を決めるのはインターフェースの定義に含まれる。いずれにせよ重要なのは外部から見た出入口の振る舞いを決めるということだ。<br />
<br />
このインターフェースの定義は何もソフトウェアに依らない。ハードウェアでも同じように考えることができる。このチップはI2CバスとSPIバスの橋渡しをするデバイスだ。インターフェースにI2CバスとSPIバスを取っている。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-mG5PjaDF7Mk/XdFFRyzXDbI/AAAAAAAAEDo/cbV6y1eR-sokXvg5syGKSyONfABnif7WgCLcBGAsYHQ/s1600/chip-interface.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="503" data-original-width="988" height="202" src="https://1.bp.blogspot.com/-mG5PjaDF7Mk/XdFFRyzXDbI/AAAAAAAAEDo/cbV6y1eR-sokXvg5syGKSyONfABnif7WgCLcBGAsYHQ/s400/chip-interface.png" width="400" /></a></div>
<br /></div>
<h2>
<span style="font-size: x-large;">実装の詳細</span></h2>
<div>
実装の詳細とは、インターフェースの定義で定められた振る舞いを実現するためのものだ。とても乱暴に言うと、インターフェースの定義で定められた振る舞いさえ提供できれば、中身の実装がどんな風になっていても構わない。もちろん実装詳細の具体的な内容は時と場合によって正解もあり間違いも当然ながら存在するが。<br />
<br />
例えば、二つの数を与えると加算して返す関数があったとする。インターフェースの裏側にある実装の詳細がコンピュータで実現されていても良いし、小人さんが10人で寄ってたかって一生懸命計算していても良いし、紙テープで何か不思議な計算処理をしていても良い。つまり、インターフェースの定義に従っていさえすれば良い、というのが実装の詳細の基本的な考えだ。<br />
<br />
<h2>
<span style="font-size: x-large;">ここまでで</span></h2>
ここまででインターフェースの定義と実装の詳細について簡単に説明した。具体的なイメージは上記の説明だけでは不十分で、これから先のシリーズでより具体的な設計や実装のイメージをつかめるようにしていきたいと思う。<br />
<br /></div>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-19621938151218975302019-11-08T00:40:00.000+09:002019-11-08T00:45:10.565+09:00教科書に載らないソフトウェア開発入門 (今はあまり出来ないと考えている君へ)<h3>
<span style="font-size: x-large;">今できることと将来の自分</span></h3>
「教科書に載らないソフトウェア開発入門」なのだから、当然のように最初からソフトウェア開発の何たるかについてツラツラと書き記したい気持ちがあるのだが、やっぱり先の記事と同様に少しだけ寄り道をしようと思う。<br />
<br />
というのも、15年ほどソフトウェア開発をしてきて振り返ると、今でこそ考えた通りに動作するソフトウェアが出来るようになったものの、始めた一年目なんかは本当にひどい状況だった。書くソフトウェアの全てが100%の確率で思った通りに動かない。動かないならまだしも、そもそもコンパイルも通らないしリンクとか言われてもワケがわからない。<br />
<br />
もう本当に詰まらないというか何をやっているのか自分でわからないような日々が続いた。そもそも自分がソフトウェア開発をやることになったのは、自分で設計した基板に載せていたマイクロコントローラのファームウェアをアセンブラでスラスラと書いているのが間違ってソフトウェア開発を統括する人の目に留まってしまったからだ。これは失敗だったと当時は何度も思った。<br />
<br />
そんな動きもしないソフトウェアを何年も作り続ける日が続いたのを今では懐かしく思うが、当時は本当にこれは駄目だなと何度も思った。手掛かりになればと色々な書籍やウェブを読み漁ったけど、どれもこれもピンと来ない。当時はなぜなのかわからなかった。<br />
<br />
<h3>
<span style="font-size: x-large;">何かのきっかけ</span></h3>
物事にはきっかけというものがあるみたいだけど、自分のソフトウェア開発の状況を徐々に改善するきっかけになったのは、やっぱりこれも「どうしようもなく動かないソフトウェア」を作ってしまった時だった。もう本当に納品することになっていたソフトウェアを担当していた自分は、先輩から言われた前提条件に従って限定的に動作するソフトウェアを書いていた。この前提条件に従う限り、確かにソフトウェアは動作した。まずかったのは、その前提条件があまりにも厳しく、殆どの場合で適用できなかったことだ。<br />
<br />
そんなソフトウェアを納品に持って行った結果、御客様の落胆度合いは半端でなかった。また、不運にも、というか当然の結果として御客様の環境はその前提条件に該当しなかった。ソフトウェアについての説明を加えながら実際に動作をさせていったところ、あらゆる処理で例外が発生した。これには本当に作っていた本人が参ってしまった。当然ながら御客様はそれ以上に参ってしまった。今でも表情を思い出せるくらいの落胆さを示された御客様は、お引き取り下さいだったか何かを仰っていたように思うが、もう当時のこの瞬間を思い出すことも出来ない。記憶から消してしまったのだろう。<br />
<br />
とにかく、この厳しい前提条件で限定的に動作するソフトウェアは、本当に世の中に何の役にも立たず、もっと言うと様々な人に害を与えるために世に生まれてきてしまったのだった。<br />
<br />
この話を聞きつけた上司(彼がその厳しい前提条件で良いと話していた)は、顧客と同様に激しく落胆し、私を担当から外して別の人間に修理させようといった内容の話をしていたようだ。その話を聞いた自分は落胆に落胆を重ねた落胆パレードに参加しているかのような錯覚に陥った。ひどく参って次の日は一日休んで何かを考える日に使った。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-HrqKG2drlX0/XcQ79djb38I/AAAAAAAAEDA/Tul_06qjYMgiD5v0_U_DO52tr4YpNgRaQCLcBGAsYHQ/s1600/micro-mml-player-lpc812.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="334" data-original-width="1187" height="180" src="https://1.bp.blogspot.com/-HrqKG2drlX0/XcQ79djb38I/AAAAAAAAEDA/Tul_06qjYMgiD5v0_U_DO52tr4YpNgRaQCLcBGAsYHQ/s640/micro-mml-player-lpc812.png" width="640" /></a></div>
<br />
<h3>
<span style="font-size: x-large;">心に決めたこと</span></h3>
休んだ一日は本当に何をやっても手に付かなかったし、自分のボロボロのソフトウェアを修正する担当を逆恨みしたりした。これはひどい。出来ない人の典型みたいだ。だから決めた。ちゃんと作ろうと。ちゃんと作るのは当時の自分からすると何をして良いのかわからなかった。唯一わかっていたのは、動かないソフトウェアは「考えられていない」ということ。<br />
<br />
何を考えるのかも重要だったと思うけど、とにかくあちこち隅々まで考えられていない事で徹底されていた。当時はわからなかったけど、厳しい前提条件を自分の思い込みで設定してしまった上司が典型例だった。特に何も考えないで「それで良いんじゃない?」と言う。その何かにとって都合の良い思い込みで作り続けてしまう。そんな事はもうたくさんだと思った。<br />
<br />
その日からとにかく考えて作ることにした。まず、厳しい前提条件は何故生まれてしまったのか?その前提条件を外す方法は何か?そもそも前提条件を外すのは無理なのか?なぜ人々は過ちを犯してしまうのか。(いや、それは考えすぎだった)<br />
<br />
調べてみるとその前提条件は、当時制御対象になっていた装置の実装制約から来ているものだった。とある信号を生成するのに使っていた設定ファイルが、無数の数式から出てきた値を保存するものになっていた。その値を編集するソフトウェアだったのだが、元の式が一体どういうものだったのかわからないものもあった。<br />
<br />
仕方がないから100個くらいあった設定値の数式をあらゆるソースコードやユーティリティから漁っていくことにした。式は軽く数十個。中にはよくわからないパラメータも無数にあった。わからなくなってくると周りの先輩に聞いて回った。中には「そんなの勝手にやれ!」とか「なんでそんなの必要なんだよ!」と怒り出す先輩もいたが気にしなかった。「自分はこれを完成させないといけないんです」と逆切れした。<br />
<br />
兎にも角にも「前提条件を外せば今よりももっとまともに動くはず」という目論みで進めた結果、意味不明な設定値の羅列だったものが、設定ファイルから元の数式にはまるパラメータを逆算できるようになり、これがきっかけで問題だらけだったソフトウェアが動作するようになった。<br />
<br />
それだけでなく、パラメータの生まれた背景や意図を知る事になり、結果的に今まで出来なかったような便利な設定も出来るようになった。この結果を喜ぶ人は社内に殆どいなかったが、少なくとも御客様とその製品を主に担当していた先輩だけは喜んでくれた。<br />
<br />
このことがきっかけになって、自分は他の人よりも考えることにしようと心に決めた。自分は頭が良い方ではない。それでも何かをしないといけないと思った。<br />
<br />
<h3>
<span style="font-size: x-large;">みっともない話をする事について</span></h3>
こういうみっともない話(個人的な情けない話)は、ふつうはしないものだと思う。色んな人が色んな事を言うわけだし、そういう批判や非難は誰しも耳にしたくない。でも心に留めておいて欲しい。ソフトウェアを書くというのは、ありのままの自分でいないと書けないということ。わかる範囲でしか書けない。残念ながら現代の計算機は、未だもって思った通りには動かない。書いたとおりに動く。だから、自分の書いている範囲でしか動かない。<br />
<br />
最近見た光景だが、その彼は様々な状況や人間にありがちな見栄から、どんな事を言われても「簡単です」と答えていた。実際にそれらがどうなったか。簡単と言われていた内容が、とてつもない人数をかけてやる一大プロジェクトだったり、熟練した人なら特に問題もなく完成させられるはずの内容を、いつまで経っても完成させられない状況に陥っていた。<br />
<br />
彼は見栄っ張りだった。見栄やプライドは成長を阻害する。わからないものはわからない、難しそうなものは難しそう。それは何の恥でも無知でもない。それは個人の能力の限界かもしれないが、それは別に人格とも関係が無い。知らないものが事があるのは恥ではない。全てを知るのは無理だ。ただ素直に自分に対してそれを認めれば良い。馬鹿にする人も気にしなくて良い。そういう人達は単に暇なんだ。本当に。<br />
<br />
今日もソフトウェア開発に直接関係なさそうな事を書いてしまったけど、もしかしたら一番大事なことなのかもしれない。shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-54768473605915616202019-11-03T22:52:00.000+09:002019-11-07T23:50:15.509+09:00教科書に載らないソフトウェア開発入門 (はじめに)<h2>
<span style="font-size: x-large;">
万物世界共通</span></h2>
思い立って何かソフトウェア開発にまつわる話を書こうと思ったのだけど、おもむろに重い話を書くと読む人も嫌になると思ったので、いっけん関係ない話をしようと思う。<br />
<br />
<span style="font-size: large;">
<b>「どんな物事も基本が一番簡単に見えて一番難しい」</b></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-qbzuFmNrGRE/Xb7Mcs56ZOI/AAAAAAAAECA/Uu-0lIXE2noYbzXXIAjp0zl5YBlR9uiDQCLcBGAsYHQ/s1600/piano.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="148" data-original-width="762" height="124" src="https://3.bp.blogspot.com/-qbzuFmNrGRE/Xb7Mcs56ZOI/AAAAAAAAECA/Uu-0lIXE2noYbzXXIAjp0zl5YBlR9uiDQCLcBGAsYHQ/s640/piano.png" width="640" /></a></div>
<br />
例えば、ピアノを弾けない人に「明日からピアノでジャズを弾いてくれ」と頼んだとする。
面を食らった人はピアノ曲集みたいなのを手に入れておもむろに曲を弾き始めるだろう。
そうするとどうだろう。いかにも「曲集を練習しました」という演奏にしかならない。
<br />
<br />
長年この問題を考えていたけど、結局のところ動作や結果、それぞれひとつひとつには「背景となる思想や積み重ねがあってそうなる」という事かもしれない。少しニュアンスが難しい。もしかしたら何を言っているのかわからないかもしれない。<br />
<br />
少し前の話、ビーバップの伝統を受け継ぐピアニスト、バリーハリス氏が教育の現場で学生に「Cmを弾いてくれ」と言った光景を見たことがある。たいていの学生はどうしてか弾きなれている(?)Cm7を弾いてしまう。つまり、特に何も考えることなく7thを足してしまうわけだ。こうなると話は全然違う方向になる。<br />
<br />
バリー氏はCmを弾いて欲しいと頼んでいるにも関わらず、Cm7を弾く人達について、頭を使っていない(=Cm7はF7を経由してBbメジャーへのトニック進行を暗に示唆する)と見ているのだ。Cm7を弾いた時点で、結果的に本来の意図であるマイナーとは全く異なるメジャーに帰着することになり、異なる結果になってしまう。<br />
<br />
つまり、そういうことだ。(え?)<br />
<br />
すべての一見簡単に見えることが、あらゆる浅はかさによって全く異なる結果を生んでしまう。これが「どんな物事も基本が一番簡単に見えて一番難しい」という由縁だ。コードを1つ弾くだけでも間違いは起こり得るのだ。<br />
<br />
<hr />
<h2>
<span style="font-size: x-large;">
ちょっと古い2000年頃の話</span></h2>
当時工学部の学生だった自分は、そろそろ真面目に勉強をして大学生活から外へ出たい気持ちになっていた。
電気好きの一級建築士だった祖父から受け継いだ電気への興味をそのままに電気電子工学科なる学科に進んだのは良いが、真空蒸着なんかをやっている間に何をやりたいのだっけ?とわからなくなっていた。<br />
<br />
在学五年目に差し掛かったあたりから、当時徐々に日本国内で人気の出ていたマイクロコントローラに興味を持つようになり、研究室の先生にお願いして幾つかの部品を購入してもらった。正直に言おう。当時、手にしたものの中にはTI社のDSPもあったのだが、これはのっけから開発環境のセットアップがよくわからずに躓いて放っておいた。ごめん。あれは高かった。<br />
<br />
まぁ、それはさておき、当時自分が触っていたマイクロコントローラは、8ビットのハーバードアーキテクチャを持つもので、プログラム上で変数を扱おうと思うと数少ないレジスタとメモリを駆使しながらアセンブラで組み上げるという代物だった。 当時はそもそもソフトウェア開発を生業にすることを考えていなかったので、ハードウェアを設計した後に付いてくるお愉しみみたいなものに過ぎなかったのをよく覚えている。<br />
<br />
ところで、その当時の国内では「このマイクロコントローラといえばこの人!」みたいな著名な方がいて、沢山の書籍が出ていたのだが、ソフトウェア開発を知らない自分から見ても「この実装は質が低くないか?」と疑いの目でしか見れなくなっていた。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-GoJgb9S4kzE/Xb7Yxrxqd8I/AAAAAAAAECM/exUssWnOIi8ulr8JqFxG7WqdZ5uTDZaSACLcBGAsYHQ/s1600/happy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="520" data-original-width="805" height="412" src="https://1.bp.blogspot.com/-GoJgb9S4kzE/Xb7Yxrxqd8I/AAAAAAAAECM/exUssWnOIi8ulr8JqFxG7WqdZ5uTDZaSACLcBGAsYHQ/s640/happy.png" width="640" /></a></div>
<br />
元々、「出来る人の言う事しか聞かない」ポリシーがあるので、この著名な方の書いてあることを信用するのはやめて、もっと他の良い教師を探すことにした。
時は2000年、ちょうどWindows NTやらWindows 2000やらが出て、世間はインターネットだとかウェブだとか色々とにぎやかになり始めたことだ。
研究室にあったSONYのノートパソコン(そうVAIOだ!)を勝手に拝借して自分の研究用にあてた上で、授業が終わるとウェブで必死に技術資料をかき集めた。<br />
<br />
当時、この類の情報を国内で発信していた人はそれほど多くなかったとは思うが、その中に一つ「これは!」と思う実装を公開している人がいた。
具体的な名前は書かないけど、この人の実装を見た時から自分の本当のソフトウェア開発がスタートしたといっても過言ではない。
(いや、本当は中学生の頃からソフトウェアは書いていたのだけど、それは忘れて良いと思う。N88-BASICだし。)
<br />
<br />
ひとつ、良いことを教えよう。
その人はとても良い公開方法を選んでいた。
「人に考えさせること」だ。
当時その人が公開していたウェブには確かにソースコードがあった。
でも、実はそのままではコンパイルできないように、ある関数だけは非公開になっていた。 もうどんなセリフだったのか忘れてしまったけど「興味のある人は連絡をください」だったかな。
こんなに綺麗なソースコードをアセンブラでも書けるなんて素敵だと感動した自分はさっそくメールを打った。
ほどなくして返答を頂いた自分は「本当に宝物を頂いた」と感動して、すぐさまコードを印刷して一行ずつ穴があくまで読んだ。<br />
<br />
<hr />
<h2>
<span style="font-size: x-large;">
で?</span></h2>
もう既にあれから20年くらい経って少し大人になってしまったのだけど、それからまだ自分はソフトウェアを書いている。
自分に感動を与えてくれたコードを書いた人にいまだ持って会えていないのだけど、そろそろ会うのではないかと考え始めている。
そして、自分もそろそろ先代がしてくれたことと同じように誰かに何かを与えて生きて行く段階に入っている。
そろそろ時間も足りなくなってくるので、その活動を始めようと思うのだ。
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-25292782870153192282017-11-30T23:58:00.000+09:002017-12-01T00:05:11.838+09:00FreeRTOSがAWSオープンソースプロジェクトになってMITライセンスが採用されたらしい<div class="separator" style="clear: both; text-align: left;">
最近はマイコンで遊ぶ暇もないくらい忙しいのですが、なんとFreeRTOSがAWSオープンソースプロジェクトになって、しかもMITライセンスが採用されたらしいです。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
あぁ、たまにはゆっくりマイコンで遊びたいなぁ。</div>
<div class="separator" style="clear: both; text-align: left;">
<a href="https://www.freertos.org/">https://www.freertos.org/</a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-WfOtntoFbjM/WiAcz2Q-CvI/AAAAAAAAD90/4gnAs-Bkr78K8Pnp6jTn5V_Sp9B1dSpIgCLcBGAs/s1600/amazon-freertos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="626" data-original-width="1219" height="328" src="https://1.bp.blogspot.com/-WfOtntoFbjM/WiAcz2Q-CvI/AAAAAAAAD90/4gnAs-Bkr78K8Pnp6jTn5V_Sp9B1dSpIgCLcBGAs/s640/amazon-freertos.png" width="640" /></a></div>
<br />
どんどん時代が変わっていきますね。<br />
<a href="https://aws.amazon.com/jp/freertos/">https://aws.amazon.com/jp/freertos/</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-RFvlLOEkVjo/WiAdXz0z70I/AAAAAAAAD98/gGOLdu37X2keyEbLm0NPgZk_IOWAc0H4gCLcBGAs/s1600/amazon-website.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="627" data-original-width="1301" height="308" src="https://2.bp.blogspot.com/-RFvlLOEkVjo/WiAdXz0z70I/AAAAAAAAD98/gGOLdu37X2keyEbLm0NPgZk_IOWAc0H4gCLcBGAs/s640/amazon-website.png" width="640" /></a></div>
<br />shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-37328946184920716972017-10-31T23:58:00.000+09:002017-10-31T23:58:04.918+09:00ARMv6-M Architecture Reference Manual先日の続きでARMv6-M Architecture Reference Manual(https://static.docs.arm.com/ddi0419/d/DDI0419D_armv6m_arm.pdf)を見ていきます。文書をざざざっと見渡し、まずはARM core registersの確認から進めます。D7.1にARMv6-Mにおけるコアレジスタ定義が表になっているのでここから進めることにしましょう。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Ez7zCA8tn9w/WfiOseC3VSI/AAAAAAAAD9Q/J3MBK9Az5xcBP_9tLHnwLSVQRiRPPDDZwCLcBGAs/s1600/arm-core-registers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="574" data-original-width="841" height="436" src="https://2.bp.blogspot.com/-Ez7zCA8tn9w/WfiOseC3VSI/AAAAAAAAD9Q/J3MBK9Az5xcBP_9tLHnwLSVQRiRPPDDZwCLcBGAs/s640/arm-core-registers.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
続きは次回...え?</div>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-38807550526187444212017-09-30T10:09:00.001+09:002017-09-30T10:18:53.515+09:00ARMv6-Mと戯れる 第1号 ~ARMv6-Mと戯れる準備をしよう~<h1>まえがき</h1>
<p>
大抵の場合「ARMマイコン!ARMマイコン!」と言っているその中身は、ARM社が提供しているプロセッサに加えて、チップベンダー各社が周辺回路を加えてパッケージングされたものだったりします。
「マイコンを使えます」という人でも、自分が使っているマイコンがどういったプロセッサを使用しているのか詳細を答えられる人は稀で、せいぜい「Cortex-M0+です」とかその程度のものでしょう。
</p>
<p>
4年前の2013年、<a href="https://www.cubeatsystems.com/uos-lpc800/index.html">LPC810でも動作するUOS-LPC800</a>を設計し、その過程でARMv6-Mのレジスタセットについて学習しました。
この学習過程を振り返った上で、再度見直して楽しんでみようというのが本シリーズです。
</p>
<h1>ブート!</h1>
<p>
学習過程を振り返るというお題があるので、学習を始める過程も挙げておきます。
まずは題材となるマイクロコントローラのデータシートを見ます。
</p>
<p>
NXP社のウェブより<a href="https://www.nxp.com/jp/products/microcontrollers-and-processors/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc800-series-cortex-m0-plus-mcus/low-cost-microcontrollers-mcus-based-on-arm-cortex-m0-plus-cores:LPC81X_LPC83X?&tab=Documentation_Tab&linkline=Data-Sheet">LPC81X_LPC83X: Low-Cost Microcontrollers (MCUs) based on ARM® Cortex®-M0+ Cores</a>には、ARM Cortex-M0+と書かれていますね。でも、この段階では「あぁ、ARM Cortex-M0+っていうのを使っているんだ。」程度にしかわかりません。
<p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-18Eev9aOaWk/Wc7lBT98-dI/AAAAAAAAD70/IQLxL_8o5Q0Vnn6NMxdyKdEFhKtVfeqswCLcBGAs/s1600/lpc81xM-no1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-18Eev9aOaWk/Wc7lBT98-dI/AAAAAAAAD70/IQLxL_8o5Q0Vnn6NMxdyKdEFhKtVfeqswCLcBGAs/s400/lpc81xM-no1.png" width="400" height="213" data-original-width="688" data-original-height="366" /></a></div>
</p>
<p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-MQTKrE_oht8/Wc7mKpV2nsI/AAAAAAAAD8A/_07Q-uos7kIMN4FipWibVfdTRu6tZvViQCLcBGAs/s1600/lpc81xM-no2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-MQTKrE_oht8/Wc7mKpV2nsI/AAAAAAAAD8A/_07Q-uos7kIMN4FipWibVfdTRu6tZvViQCLcBGAs/s400/lpc81xM-no2.png" width="334" height="400" data-original-width="674" data-original-height="806" /></a></div>
</p>
</p>
<p>
次に「このARM Cortex-M0+って何だ?」というのは、ARM社の情報を見る事になります。
<a href="https://developer.arm.com/products/processors/cortex-m/cortex-m0-plus">https://developer.arm.com/products/processors/cortex-m/cortex-m0-plus</a>には、ARM Cortex-M0+という絵の中に「CPU ARMv6-M」とあり、「あぁ、ARMv6-Mと呼ばれるCPUを使っているんだなぁ」と先ほどのARM Cortex-M0+から一段掘り下げた情報が得られます。
<p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-cQkBcXUHg4g/Wc7m8CsM-JI/AAAAAAAAD8I/Caxn6WPIWEAmhD5DIs6aILy7BrPdsId4gCLcBGAs/s1600/lpc81xM-no3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-cQkBcXUHg4g/Wc7m8CsM-JI/AAAAAAAAD8I/Caxn6WPIWEAmhD5DIs6aILy7BrPdsId4gCLcBGAs/s400/lpc81xM-no3.png" width="400" height="400" data-original-width="734" data-original-height="734" /></a></div>
</p>
で、ハイライトを見ると、ISA Supportの欄に「Thumb/Thumb-2 subset.」と書かれています。この「ISA」というのは、Instruction Set Architectureの略で、命令セットアーキテクチャは「Thumb/Thumb-2のサブセットだよ」と言っています。
<p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-9fWOzU_HjdI/Wc7m9jxdx6I/AAAAAAAAD8Q/M4mPGXY7YBAQy1L26ewX88Jr-alcC4i0ACPcBGAYYCw/s1600/lpc81xM-no4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-9fWOzU_HjdI/Wc7m9jxdx6I/AAAAAAAAD8Q/M4mPGXY7YBAQy1L26ewX88Jr-alcC4i0ACPcBGAYYCw/s640/lpc81xM-no4.png" width="640" height="328" data-original-width="831" data-original-height="426" /></a></div>
</p>
</p>
<p>
ここまでで、「ARM Cortex-M0+は、ARMv6-Mと呼ばれるCPUを使っていて、命令セットアーキテクチャはThumb/Thumb-2のサブセットである。」という事がわかりました。
</p>
<p>
さて、プロセッサと戯れるためには、ここで止まってはいけません。
更に<a href="https://developer.arm.com/products/architecture">https://developer.arm.com/products/architecture</a>から、M-Profile Architecturesの情報<a href="https://developer.arm.com/products/architecture/m-profile">https://developer.arm.com/products/architecture/m-profile</a>に辿り着きます。
</p>
<p>
概要ページにはARMv6-Mアーキテクチャの概要も書かれており、「T32命令セットをサポート」と書かれています。
新しいキーワードT32命令セットが出てきましたね。
<p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://2.bp.blogspot.com/-skGW8BPKVfY/Wc7p_10PuPI/AAAAAAAAD8Y/pEB5AdWNPf0vvpvIclFg27QWiDwxyTQ9QCLcBGAs/s1600/lpc81xM-no5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://2.bp.blogspot.com/-skGW8BPKVfY/Wc7p_10PuPI/AAAAAAAAD8Y/pEB5AdWNPf0vvpvIclFg27QWiDwxyTQ9QCLcBGAs/s640/lpc81xM-no5.png" width="640" height="194" data-original-width="1074" data-original-height="325" /></a></div>
</p>
Instruction Setsのページ<a href="https://developer.arm.com/products/architecture/instruction-sets">https://developer.arm.com/products/architecture/instruction-sets</a>を見ると、A64、A32、T32の各命令セットについてリンクが張られています。
<p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://4.bp.blogspot.com/-7lO4yZkf-nk/Wc7vqaoDyQI/AAAAAAAAD8o/XIsplyI7alAvw2DpDUNEFQCLV6nyqsplACLcBGAs/s1600/lpc81xM-noA.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-7lO4yZkf-nk/Wc7vqaoDyQI/AAAAAAAAD8o/XIsplyI7alAvw2DpDUNEFQCLV6nyqsplACLcBGAs/s400/lpc81xM-noA.png" width="400" height="220" data-original-width="634" data-original-height="348" /></a></div>
</p>
<a href="https://developer.arm.com/products/architecture/instruction-sets/a32-and-t32-instruction-sets">https://developer.arm.com/products/architecture/instruction-sets/a32-and-t32-instruction-sets</a>には「T32命令セットはARMv8アーキテクチャ以前にThumbとして知られていたもの」と書かれています。つまり、先に出てきたThumbと呼ばれる命令セットはT32命令セットである事がわかりました。
</p>
<h1>今回のまとめ</h1>
<p>
「ARM Cortex-M0+は、ARMv6-Mと呼ばれるCPUを使っていて、命令セットアーキテクチャはThumb/Thumb-2のサブセットである。T32命令セットはThumbとして知られている。」という事がわかりました。
</p>
<p>
次回は、ドキュメントのページ<a href="https://developer.arm.com/products/architecture/m-profile/docs">https://developer.arm.com/products/architecture/m-profile/docs</a>に辿り着いて色々と見てみましょう。
<p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://3.bp.blogspot.com/-Se-UW00AQDA/Wc7wCQ2LFiI/AAAAAAAAD8s/T5wo_hgEcb4xgIx430GgKBleUHVNDe-3gCLcBGAs/s1600/lpc81xM-noB.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://3.bp.blogspot.com/-Se-UW00AQDA/Wc7wCQ2LFiI/AAAAAAAAD8s/T5wo_hgEcb4xgIx430GgKBleUHVNDe-3gCLcBGAs/s400/lpc81xM-noB.png" width="400" height="175" data-original-width="654" data-original-height="286" /></a></div>
</p>
<a href="http://docs-api-peg.northeurope.cloudapp.azure.com/assets/ddi0419/c/DDI0419C_arm_architecture_v6m_reference_manual.pdf">http://docs-api-peg.northeurope.cloudapp.azure.com/assets/ddi0419/c/DDI0419C_arm_architecture_v6m_reference_manual.pdf</a>がアーキテクチャのリファレンスマニュアルです。
</p>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-14994294078976030262017-08-13T17:09:00.002+09:002017-08-13T21:21:23.138+09:00ESP-WROOM-32をMicroPythonで遊ぶ<h2><span style="font-size: x-large;">■うだうだと前書き</span></h2>
<div>
猫も杓子もIoTと皆さんが仰るので、その声が大きくなればなるほど自分は遠ざかる方向で生きていたのですが、そうすると完全に煙に巻かれたお爺さんのようになりまして、今は世の中が進んでおるんじゃのぉと言うだけの人です。気付いてみれば<a href="http://gsmcustomeffects.hatenablog.com/">ガレスタさんのDIY日記</a>は素晴らしい勢いで開発を進めており、こんな風に生きてみたいものだと思うようになってきた今日この頃。私も負けて・・・いら・・・れ・・・うぐぐぐぐ・・・パタ。←血を吐いて倒れました。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-FalwEQUUsOw/WY_7c2aQKCI/AAAAAAAAD6U/JmYoZfk0aPE8ldinEIUyunboH37OyqmNwCLcBGAs/s1600/M-11647.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://1.bp.blogspot.com/-FalwEQUUsOw/WY_7c2aQKCI/AAAAAAAAD6U/JmYoZfk0aPE8ldinEIUyunboH37OyqmNwCLcBGAs/s320/M-11647.jpg" width="320" /></a></div>
<div>
数か月前、とある都合から<a href="http://espressif.com/en/content/esp-wroom-32-datasheet">ESP-WROOM-32</a>(おっ!2017年8月4日にデータシートが更新されている!)を搭載した開発ボード(えぇ、あのねむいさんが激オコの<a href="http://nemuisan.blog.bai.ne.jp/?eid=220875">電源に問題のある</a>ですね...)を入手していたのですが、色々な別の開発で忙殺されており全く調査が進んでいませんでした。肝心の「とある都合」もほったらかしでマズイぞ。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-FoCnYOH7qIk/WY_7eI6HLbI/AAAAAAAAD6Y/nCNWKtEpWHgrXAz67V2lcOuGcWdEE7fFQCLcBGAs/s1600/M-11647-PADS.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://4.bp.blogspot.com/-FoCnYOH7qIk/WY_7eI6HLbI/AAAAAAAAD6Y/nCNWKtEpWHgrXAz67V2lcOuGcWdEE7fFQCLcBGAs/s320/M-11647-PADS.jpg" width="320" /></a></div>
<div>
さてさて、このESP-WROOM-32は、プロセッサ、フラッシュロム、クロック、アンテナ配線などが集約されたモジュールとして提供されています。加えてメーカーが提供するSDKを使えば、簡単にネットワーク通信可能な小型ソリューションが出来上がるという仕掛け。開発ボードを購入すれば手間をかけずに試すことが出来て、これは面白いですよねー。(棒読み)
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-xbrTI7C8wzo/WY_7bOB_rkI/AAAAAAAAD6Q/uoVfJ19LbU4ftppQvQAGIGuZolgVYyDfwCEwYBhgL/s1600/M-11819.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="240" src="https://3.bp.blogspot.com/-xbrTI7C8wzo/WY_7bOB_rkI/AAAAAAAAD6Q/uoVfJ19LbU4ftppQvQAGIGuZolgVYyDfwCEwYBhgL/s320/M-11819.jpg" width="320" /></a></div>
<div>
ここいらで触っておかないと永遠に触らない事を悟ったので、ホストOSにUbuntu 16.04.3を配備した上で重い腰を上げました。</div>
<h2><span style="font-size: x-large;">■事前準備</span></h2>
<div>
まずは設定やビルドなどで必要になるパッケージをインストールします。
<pre><code class="bash">sudo apt-get install git wget make libncurses-dev flex bison gperf python python-serial vim screen</code></pre>
</div>
<h2><span style="font-size: x-large;">■ツールチェインの準備</span></h2>
<div>
次にツールチェインをダウンロードして適当な場所に置いた上で、パスを通します。
私は/optの配下に配置することにしました。
<pre><code class="bash">cd ~/Downloads
wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz
tar xvfz xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz
mv xtensa-esp32-elf /opt/
vi ~/.bash_profile</code></pre>
</div>
<div>
.bash_profileには以下を追記しました。
<pre><code class="bash">export PATH=$PATH:/opt/xtensa-esp32-elf/bin</code></pre>
これで次回ログイン時からパスが通った状態の環境になります。当然ながら、即座に反映させたいときはsource ~/.bash_profileして下さい。
</div>
<h2><span style="font-size: x-large;">■ESP-IDFの準備</span></h2>
<div>
ESP-IDFとは、 Espressif IoT Development Frameworkの略のようです。このフレームワークは、ブートローダからデバイスのペリフェラルドライバまでを包括しており、更にサンプルが上位に加わって、文字通りフレームワークとして使えるように仕立てられています。なるほど。<br />
<br />
後々MicroPythonと組み合わせるときに気付く事になるのですが、特定のリビジョンとの組み合わせを要求されますので、git cloneでリポジトリからコードを取り出すことにします。<br />
<pre><code class="bash">cd /opt
git clone https://github.com/espressif/esp-idf.git
cd esp-idf
git submodule update --init</code></pre>
これで準備完了。
ESP-IDFは、外部モジュールに盛大に依存していますので、最後のgit submodule update --initをお忘れなく。
</div>
<h2>
<span style="font-size: x-large;">■MicroPython ESP32の準備</span></h2>
<div>
次にMicroPython ESP32をリポジトリから取り出します。
先のツールチェインとESP-IDFは/optに配置しましたが、こちらはホームの下に作ったProjectsディレクトリにcloneすることにしました。</div>
<pre><code class="bash">mkdir ~/Projects
cd ~/Projects
git clone https://github.com/micropython/micropython-esp32.git
cd micropython-esp32/
git submodule update --init</code></pre>
<div>
MicroPythonも外部モジュールに依存しています。git submodule update --initをお忘れないようにね!これで一通りの準備が完了!<br />
<br /></div>
<h2>
<span style="font-size: x-large;">■フローズンモジュールをビルドする</span></h2>
<div>
さて、最初に行うのはフローズンモジュールのビルドです。<br />
<pre><code class="bash">cd ~/Projects/micropython-esp32
make -C mpy-cross</code></pre>
以下のような出力が出れば完了です。
<pre><code class="bash">LINK mpy-cross
text data bss dec hex filename
133038 776 872 134686 20e1e mpy-cross</code></pre>
これで、MicroPythonのモジュールがビルドされた状態になります。
</div>
<h2>
<span style="font-size: x-large;">■本体をビルドする</span></h2>
<div>
はじめに、ビルド時に使用する変数を設定してMakefileを呼び出すためのメイクファイルmakefileを作ります。</div>
<pre><code class="bash">cd micropython-esp32/esp32
vi makefile</code></pre>
<div>
エディタはお好きなものを御利用下さい。makefileは、5つの変数に必要なデータを格納した上でMakefileをインクルードするように記述します。</div>
<div>
<pre><code class="bash">ESPIDF = /opt/esp-idf/
PORT = /dev/ttyUSB0
FLASH_MODE = dio
FLASH_SIZE = 16MB
CROSS_COMPILE = xtensa-esp32-elf-
include Makefile</code></pre>
</div>
<div>
最後に本体をビルドして完成です。</div>
<pre><code class="bash">cd ~/Projects/micropython-esp32/esp32
make</code></pre>
これで、先ほど作ったmakefileが使われて環境変数が設定された後、Makefileがインクルードされて適切なビルドが行われます。<br />
<br />
ビルド時、最初のメッセージにご注目。もしも、ESP IDFがサポート外のバージョンだった場合、以下のようなメッセージが出力されているはずです。<br />
<pre><code class="bash">** WARNING **
The git hash of ESP IDF does not match the supported version
The build may complete and the firmware may work but it is not guaranteed
ESP IDF path: /opt/esp-idf/
Current git hash: cd5cc9927bf494e759b8bb513de3f4a9312bc4af
Supported git hash: 4ec2abbf23084ac060679e4136fa222a2d0ab0e8</code></pre>
<div>
ここで、無理に未知のバージョンで頑張る積極的な理由はないと思いますので、ESP IDFのディレクトリに移動して、Supported git hashに書かれたバージョンをチェックアウトして下さい。</div>
<div>
<br /></div>
<div>
ガチャガチャとビルドが進行し、以下のような出力が出てきたら出来上がり。</div>
<div>
<pre><code class="bash">LINK build/application.elf
text data bss dec hex filename
703087 194764 138472 1036323 fd023 build/application.elf
Create build/application.bin
esptool.py v2.1-beta1
Create build/firmware.bin
bootloader 13248
partitions 3072
application 897984
total 963520</code></pre>
</div>
<div>
次にこれを書き込みます。<br />
<br /></div>
<h2><span style="font-size: x-large;">■フラッシュの消去</span></h2>
<div>
フラッシュの消去は、先ほどのmakefileに書き込んだPORTに書かれたデバイスファイルを経由して実行されます。<br />
<pre><code class="bash">sudo make erase</code></pre>
実行すると以下のようなメッセージが出力されます。<br />
<pre><code class="bash">Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
Erasing flash
esptool.py v2.1-beta1
Connecting........_
Chip is ESP32D0WDQ6 (revision 0)
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Erasing flash (this may take a while)...
Chip erase completed successfully in 3.3s
Hard resetting...</code></pre>
これでフラッシュが消去されました。次にファームウェアを書き込みます。<br />
<br /></div>
<h2><span style="font-size: x-large;">■フラッシュの書き込み</span></h2>
<div>
フラッシュを消去したら、次にファームウェアを書き込みます。<br />
<pre><code class="bash">sudo make deploy</code></pre>
実行すると以下のようなメッセージが出力されます。<br />
<pre><code class="bash">Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
Writing build/firmware.bin to the board
esptool.py v2.1-beta1
Connecting........__
Chip is ESP32D0WDQ6 (revision 0)
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 959424 bytes to 598202...
Wrote 959424 bytes (598202 compressed) at 0x00001000 in 15.3 seconds (effective 502.5 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting...</code></pre>
あれ?Auto-detected Flash sizeが4MBとなっとる...
まぁ、とにかく書き込み出来ました。
</div>
<h2><span style="font-size: x-large;">■screenで接続してみる</span></h2>
<div>
screenコマンドを使ってシリアル接続してみましょう。</div>
<pre><code class="bash">sudo screen /dev/ttyUSB0 115200</code></pre>
<div>
screenコマンドを終了させたい場合には、CTRL+Aを押してからKを押します。</div>
<div>
試しにEnterキーを押してみてください。>>>が表示されていれば動作しています。</div>
<div>
<pre><code class="python">>>>
>>>
>>>
>>>
>>> import machine
>>> machine.
__name__ mem8 mem16 mem32
freq reset unique_id idle
disable_irq enable_irq time_pulse_us Timer
Pin Signal TouchPad ADC
DAC I2C PWM SPI
UART</code></pre>
</div>
<div>
更に「import machine」と打ってから「machine.」まで打ってTABを叩くと入力補間機能が使えます。あぁ、楽しいなぁ。<br />
<br /></div>
<h2><span style="font-size: x-large;">■物足りないよね?</span></h2>
<div>
こんな誰でもやるようなステップを踏んだ記事を読んでイライラしている方、居ますよね。居ます居ます。私もそう。
</div>
<div>
例えば、「<a href="https://espressif.com/sites/default/files/documentation/eco_and_workarounds_for_bugs_in_esp32_en.pdf">ECO and Workarounds for Bugs in ESP32</a>」を眺めて、Chip Revision 0に対するワークアラウンドがどのように実装されているのか見るのも楽しいでしょう。ESP32のRevision 0には、キャッシュ・メモリ・マネージメント・ユニットのバグによって、パワーアップ時/ディープ・スリープからのウェイク・アップ時に、間違ったウォッチドッグ・リセットが発生してしまいます。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-hrmrCyGeaZw/WZAGNrAfw-I/AAAAAAAAD6o/SnBC02SggPMOyac7MHbTzHzKfFcfgYidACLcBGAs/s1600/esp32-rev0-workaround.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="367" data-original-width="710" height="330" src="https://1.bp.blogspot.com/-hrmrCyGeaZw/WZAGNrAfw-I/AAAAAAAAD6o/SnBC02SggPMOyac7MHbTzHzKfFcfgYidACLcBGAs/s640/esp32-rev0-workaround.png" width="640" /></a></div>
<div>
<br /></div>
<div>
さて、今回私が手にしたモジュールにはRevision 0のデバイスが搭載されていることが、フラッシュの消去と書き込み時の出力「Chip is ESP32D0WDQ6 (revision 0)」からわかっています。つまり、ワークアラウンドがなければ動作しない可能性があるわけです。このバグに対するワークアラウンドは、DPORT_PRO_CACHE_CTRL1_REGにあるPRO_CACHE_MMU_IA_CLRビットを1に設定し、次にそのビットを0にする事とあります。</div>
<div>
<br /></div>
<div>
では、これに対する実装はどこにあるのかというと、先ほどのESP-IDFで実装されているブートローダにあります。私の場合、ESP-IDFを/optの下に配置したので「/opt/esp-idf/components/bootloader/src/main」のディレクトリにあるbootloader_start.cにあります。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-BTEJPb9LI-o/WZAIRoBQQzI/AAAAAAAAD60/4XM5y9QvvW0v6iiTPO_DzSWvyi2YUQDKgCLcBGAs/s1600/esp32-rev0-workaround-the-codes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="554" data-original-width="743" height="476" src="https://2.bp.blogspot.com/-BTEJPb9LI-o/WZAIRoBQQzI/AAAAAAAAD60/4XM5y9QvvW0v6iiTPO_DzSWvyi2YUQDKgCLcBGAs/s640/esp32-rev0-workaround-the-codes.png" width="640" /></a></div>
<div>
<br /></div>
<div>
あぁ、楽しくなってきた。組み込みシステムのファームウェアというのは、こういう色々な事情を考慮した上で成り立っているんです。ちょっと実装して「あー動いた。終わり。」とか「あー動かないや。終わり。」という世界ではないんです。動いたら動いたで本当に意図した動作で動いているのか確かめる、動かないなら動かないでどこが意図しない動作で動いていないのか確かめる、どっちにしろ確かめるっていう姿勢が大事なんじゃないかと、ESP32にまつわる色々な記事を見ていて少し思いました。少しだけね。<br />
<br /></div>
<h2>
<span style="font-size: x-large;">■ここまでのまとめ</span></h2>
<div>
<ul>
<li>Ubuntu 16.04.3の環境構築、ビルド、書き込み、動作確認までを一巡させた。</li>
<li>普通に動かす方法だけを書いても面白くないので、一部だけ掘り下げてみた。</li>
</ul>
</div>
<h2>
<span style="font-size: x-large;">■参考文献</span></h2>
<div>
<ul>
<li><a href="https://github.com/micropython/micropython-esp32">https://github.com/micropython/micropython-esp32</a></li>
</ul>
</div>shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-29561880483916228052017-07-30T13:47:00.001+09:002017-07-30T13:47:22.718+09:00ARM-Cortex-M0などの小規模なマイコンでも簡単にシリアル入出力機能を実現するMicroShellのウェブサイトを少しだけ修正した話ARM Cortex-M0などの小規模なマイコンでも簡単にシリアル入出力機能を実現するMicroShellのウェブサイトを少しだけ修正しました。<br />
<br />
修正したのは<a href="https://www.cubeatsystems.com/microshell/api.html">APIのページ</a>で、以前は定義や関数がズラズラと並んでいるだけのページでした。サイトを構築する際、この<a href="https://www.cubeatsystems.com/microshell/api.html">APIページ</a>を眺めた後に<a href="https://www.cubeatsystems.com/microshell/example.html">Exampleページ</a>を御覧頂く事を考えていましたが、実際に<a href="https://www.cubeatsystems.com/microshell/api.html">APIページ</a>を見るだけで嫌になりそうです。というのも、読み手からして見れば早く理解して使いたいのに、何の説明もない<a href="https://www.cubeatsystems.com/microshell/api.html">APIページ</a>を見させられたのではたまったものではありません。かと言って、唐突に自分に関係があるのかわからない具体的なプラットフォームに対するサンプルを提示するのも考え物です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-DEU1xBnOQTE/WX1i5R2szYI/AAAAAAAAD5k/4xitIji0LcQvgOY2nsmPO4EhdAn3iqUbgCLcBGAs/s1600/before.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1083" height="400" src="https://2.bp.blogspot.com/-DEU1xBnOQTE/WX1i5R2szYI/AAAAAAAAD5k/4xitIji0LcQvgOY2nsmPO4EhdAn3iqUbgCLcBGAs/s400/before.png" width="270" /></a></div>
<br />
特に、実際のサンプルでは、複数のモジュールを組み合わせて実際のアプリケーションに近い例を見せていたため、どのAPIが必須なのか、どのモジュールで何を提供しようとしているのかが非常に不明瞭でした。<br />
<br />
これらの振り返りをふまえ、新しいAPIページでは以下の対応をしました。<br />
<br />
<ul>
<li>提示しているAPIが必ず必要なものなのか、それとも選択的に使用すれば良いものなのかわかるように[Core]と[Optional]という表記を追加した。</li>
<li>単にモジュール名称を提示するのではなく、一体何を提供しようとしているのかわかる説明をモジュール名称の前に追加した。</li>
<li>かなり短いサンプルコードを対象APIのみを使って記述した。</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-ytZXBV0EBcQ/WX1j_1yUF7I/AAAAAAAAD5s/g9mglsuOTUk3vUZoQamaQTW2oYZHIxZwQCLcBGAs/s1600/after.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="641" height="640" src="https://3.bp.blogspot.com/-ytZXBV0EBcQ/WX1j_1yUF7I/AAAAAAAAD5s/g9mglsuOTUk3vUZoQamaQTW2oYZHIxZwQCLcBGAs/s640/after.png" width="256" /></a></div>
<div>
<br /></div>
<div>
ということで、少しだけ見やすくなったMicroShellのAPIページを是非ご覧頂き、興味があれば色々なマイコンの入力系統にお使い下さい。</div>
<div>
<a href="https://www.cubeatsystems.com/microshell/index.html">https://www.cubeatsystems.com/microshell/index.html</a></div>
<div>
<br /></div>
<br />
<br />
<br />shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-90373888475912842202017-06-30T23:27:00.000+09:002017-07-02T11:49:07.771+09:00Autodesk FUSION 360を始めてみる<div class="separator" style="clear: both; text-align: left;">
最近は魅力的なマイコンが数多く出荷されていて、STM32とかそういう方向に進んでみたいなと考え始めました。なのですが、ここ数年の活動を見ていると、やっぱり最後は基板作っておしまい!な感じが否めません。そこで終わっちゃうのは寂しい。最終的に箱に入れて使えるようにしておきたいし、そのためにはやっぱり機械的な設計もしたいなと思うようになりました。ということで、ちょっとやってみようFUSION 360という流れ。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-AKiOozRHboE/WVhbXtXt8WI/AAAAAAAAD4k/lgGboc1SGiw1na4gZNxaE51kgPG1bR6gwCLcBGAs/s1600/fusion360.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="160" data-original-width="723" height="139" src="https://4.bp.blogspot.com/-AKiOozRHboE/WVhbXtXt8WI/AAAAAAAAD4k/lgGboc1SGiw1na4gZNxaE51kgPG1bR6gwCLcBGAs/s640/fusion360.png" width="640" /></a></div>
<br />
前回、機械設計をしたのは2006年、<a href="http://shinta-main-jp.blogspot.jp/2012/01/blog-post_07.html">2012年にもそんな事を書いていた</a>ので、5、6年周期くらいで何か違うことをしたくなるのでしょうか。<a href="http://shinta-main-jp.blogspot.jp/2012/12/blog-post.html">随分と過激なタイトルでも記事を書いて</a>いますね。危ない危ない。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-ksxDVL9MCsA/WVhdVZ02_EI/AAAAAAAAD4s/_hle6AAD-QUjbdkBY-ATXbhfS3yFm1x7gCLcBGAs/s1600/PICT0014.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="480" data-original-width="640" height="300" src="https://3.bp.blogspot.com/-ksxDVL9MCsA/WVhdVZ02_EI/AAAAAAAAD4s/_hle6AAD-QUjbdkBY-ATXbhfS3yFm1x7gCLcBGAs/s400/PICT0014.JPG" width="400" /></a></div>
<br />
ということで、FUSION 360を使う記事がダラダラと続くかもしれません。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-JY1QyZwavwU/WVhfDuolYuI/AAAAAAAAD40/4p9gUbmEGtIVvgg8bQnQ8AR7aDWSiBIYgCLcBGAs/s1600/cbs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="576" data-original-width="1225" height="187" src="https://4.bp.blogspot.com/-JY1QyZwavwU/WVhfDuolYuI/AAAAAAAAD40/4p9gUbmEGtIVvgg8bQnQ8AR7aDWSiBIYgCLcBGAs/s400/cbs.png" width="400" /></a></div>
<br />shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-7962959242893409172017-05-31T08:30:00.000+09:002017-05-31T08:31:22.667+09:00ソフトウェア開発のマネージメントは航空会社の運営:課題管理における「バージョンはフライトで、チケットは乗客だ」という私のバージョンに対する考え方について<h2>
<span style="font-size: x-large;">
あらまし</span></h2>
自分たちのソフトウェア出荷物に特定の名前を付ける場合に、バージョン番号を付けることは一般に広く行われています。「あのバージョンではXXX機能が加わった」とか「このバージョンではYYY機能が加わった」とか「そのバージョンではZZZ機能が壊れている」とか、その類の話です。今日は、私のバージョンに対する考え方について述べたいと思います。<br />
<br />
<h2>
<span style="font-size: x-large;">
前提とか状況とか</span></h2>
ソフトウェア出荷物を得なければならないプロジェクトで私が用いている前提は概ね以下のとおりです。<br />
<br />
<ul>
<li>人間が計画するものは必ず遅れを呼ぶ。</li>
<li>将来の予期は難しい。</li>
<li>特定のバージョンの出荷を遅らせても、劇的な状況改善に至ることはない。</li>
</ul>
<div>
ソフトウェアを出荷するということは、それまで内部で進めてきた活動が外部に現れ、それが何らかの価値を産むということです。当然ながら出荷しない限り価値は産みません。なので、企業を経営する立場からすると、ソフトウェアを早く出荷したい気持ちになります。</div>
<div>
<br /></div>
<div>
その対岸にいるかもしれないソフトウェア開発者から見ると、特定機能や要求への対応など複数の未解決項目があり、それらの状況は出荷に値しないと見ているかもしれません。ですから、出来るだけ出荷を延期したいかもしれません。</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">
ソフトウェア開発のマネージメントは航空会社の運営</span></h2>
<div>
唐突ですが、私はソフトウェア開発のマネージメントは航空会社の運営に似ているなと常々考えていました。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-ylEtkiM3xVE/WS384pKU5mI/AAAAAAAAD4A/MoWTE3ccpLAmJmQco0yVBwd-IlXfY-8OgCLcB/s1600/version-and-ticket.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="719" data-original-width="1600" height="284" src="https://1.bp.blogspot.com/-ylEtkiM3xVE/WS384pKU5mI/AAAAAAAAD4A/MoWTE3ccpLAmJmQco0yVBwd-IlXfY-8OgCLcB/s640/version-and-ticket.jpg" width="640" /></a></div>
<div>
<br /></div>
<div>
例えば、あなたが上の図に示したVersion 1.0.0に向かって開発を進めているプロジェクトの開発者だったとしましょう。あなたは「DEF機能の追加」が全く間に合わず、ついつい「これはVersion 1.0.0の出荷を見合わせよう」と考え始めます。こうなるとそれに続くVersion 1.5.0もVersion 2.0.0も後ろにずれ込んでいくことになるかもしれません。</div>
<div>
<br /></div>
<div>
こうなると全てが後ろにずれ込んで、計画も何も無いような気持ちになってしまいますし、実際に外から見るとそんな風にダラダラ進んでいるように見えてしまうようです。</div>
<div>
<br /></div>
<div>
でも、出荷はフライトと同じだと少しだけ考え方を変えてみます。例えば、300人が搭乗する航空機の出発の際に、特定の乗客が乗り遅れようとしているからといって、3時間も6時間も出発が遅れることはありません。そうすると、全体の利益が損なわれてしまうからです。</div>
<div>
<br /></div>
<div>
これはちょうどソフトウェア開発における出荷の状況にも言えます。ある150個の仕事をこなした後に出荷すると決めたバージョンに対して、特定のある1つの仕事が間に合わなかったからといって、たとえそれがどんなに重要な仕事だったとしても、他の149個の仕事の成果を巻き添えにして出荷を(フライトに例えると出発を)遅らせるのは、もしかしたら行き過ぎかもしれません。</div>
<div>
<br /></div>
<div>
このバージョン(フライト)に搭載するはずだったチケット(=解決済みの課題)は、次のバージョン以降に延期されたけど、確実にプロジェクトは進んでいるよね?</div>
<div>
<br /></div>
<div>
こんな風に考えると、気持ちも少し楽になってきます。確かに約束した重要な機能は約束したバージョンに搭載されなかったかもしれませんが、それは次のバージョンで確実に搭載されるように配慮します。既に他の149個の仕事は完了しているのですから、搭載の遅れた1個の仕事に注力すれば、次に行うべき他の仕事よりも完了する確率は高いでしょう。</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">
最後に</span></h2>
<div>
ソフトウェア開発の場合、とても乱暴に言って遅れることは問題ではありません。それよりもむしろ、進んでいないように見える、あるいは進んでいないことが一番の問題です。ソフトウェア開発のマネージメントに際して、事前に計画した内容の通りに進まないといけないといった厳しい外部制約を与えると、局所的には最適化されるのかもしれませんが、全体の動きは鈍くなる可能性があるので、私は航空会社のように全体の利益に基づいて柔軟に計画を変更することは重要だと考えるようになりました。</div>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-55102283858365652982017-04-30T12:09:00.002+09:002017-04-30T12:09:41.646+09:00今すぐ出来る!HTML5なウェブサイト実現ワークショップ「#HelloHTML5」を開催します。<h1 style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #222222; font-family: "PT Sans Caption", Helvetica, "ヒラギノ角ゴ Pro W3", HiraKakuProN-W3, "Hiragino Kaku Gothic Pro", メイリオ, Meiryo, "MS Pゴシック", sans-serif; line-height: 1.3em; margin: 0px; outline: 0px; padding: 0px 0px 5px; vertical-align: baseline;">
はじめに</h1>
<div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #222222; font-family: "PT Sans Caption", Helvetica, "ヒラギノ角ゴ Pro W3", HiraKakuProN-W3, "Hiragino Kaku Gothic Pro", メイリオ, Meiryo, "MS Pゴシック", sans-serif; font-size: 12px; margin-bottom: 1em; outline: 0px; padding: 0px; vertical-align: baseline;">
近年、ウェブサイトのHTML5化が盛んに行われています。 様々なデバイスがウェブに接続されるようになり、端末の画面サイズに応じた表現なども必須になってきました。 このセミナーでは、「今すぐ出来る!HTML5なウェブサイト実現セミナー」と題して、HTML5を活用したウェブサイトの実現をワークショップ形式でお届けします。</div>
<h1 style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #222222; font-family: "PT Sans Caption", Helvetica, "ヒラギノ角ゴ Pro W3", HiraKakuProN-W3, "Hiragino Kaku Gothic Pro", メイリオ, Meiryo, "MS Pゴシック", sans-serif; line-height: 1.3em; margin: 0px; outline: 0px; padding: 0px 0px 5px; vertical-align: baseline;">
お勧めする人</h1>
<ul style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #222222; font-family: "PT Sans Caption", Helvetica, "ヒラギノ角ゴ Pro W3", HiraKakuProN-W3, "Hiragino Kaku Gothic Pro", メイリオ, Meiryo, "MS Pゴシック", sans-serif; font-size: 12px; margin: 0px 0px 1em 1.5em; outline: 0px; padding: 0px; vertical-align: baseline;">
<li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">ウェブサーバーを立ち上げたけど、魅力的なコンテンツの実現に技術的な課題を感じている方。</li>
<li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">サイトをHTML5化したいけど、どこから手を付けてよいかわからない方。</li>
<li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">組み込みシステムのエンジニアリングが専門で、ウェブ技術の調査までなかなか手が回らない方。</li>
<li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">その他、とにかく現状のウェブが不満でどうにかしたい方。</li>
<li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">そもそも億劫でなかなかウェブの実現が進まない方。</li>
</ul>
<h1 style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; color: #222222; font-family: "PT Sans Caption", Helvetica, "ヒラギノ角ゴ Pro W3", HiraKakuProN-W3, "Hiragino Kaku Gothic Pro", メイリオ, Meiryo, "MS Pゴシック", sans-serif; line-height: 1.3em; margin: 0px; outline: 0px; padding: 0px 0px 5px; vertical-align: baseline;">
参加登録</h1>
<ul style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; margin: 0px 0px 1em 1.5em; outline: 0px; padding: 0px; vertical-align: baseline;">
<li style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: none; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><span style="color: #222222; font-family: PT Sans Caption, Helvetica, ヒラギノ角ゴ Pro W3, HiraKakuProN-W3, Hiragino Kaku Gothic Pro, メイリオ, Meiryo, MS Pゴシック, sans-serif;"><span style="font-size: 12px;"><a href="https://atnd.org/events/86409">https://atnd.org/events/86409</a> から可能です。</span></span></li>
</ul>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-50646739357787727962017-03-26T20:32:00.000+09:002017-04-01T07:44:21.939+09:00MicroShellをArduinoにも対応させ、Version 0.0.2として公開しました!小規模組み込みシステムのシリアル・コンソール・インターフェースとして便利に使えるミドルウェアMicroShellをArduinoにも対応させ、Version 0.0.2として公開しました。<br />
<a href="https://www.cubeatsystems.com/microshell/download.html">https://www.cubeatsystems.com/microshell/download.html</a> からダウンロードできます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-j_U1C0DOWN0/WN7W-Ex1U6I/AAAAAAAAD3U/3ddjLWfhLaA5oUKrsIgpaoFms5fVh2FCgCLcB/s1600/logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="102" src="https://4.bp.blogspot.com/-j_U1C0DOWN0/WN7W-Ex1U6I/AAAAAAAAD3U/3ddjLWfhLaA5oUKrsIgpaoFms5fVh2FCgCLcB/s400/logo.png" width="400" /></a></div>
<br />
<br />shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-84333397788765684632017-02-28T21:31:00.003+09:002017-02-28T21:31:51.375+09:00熱血!アセンブラ入門に感化されてARM Cortex-M0で動作する小さなオペレーティング・システムUOS-LPC800のパッケージを更新しました!ARM Cortex-M0で動作する小さなオペレーティング・システムUOS-LPC800のパッケージを更新しました。今回はとても地味にコンパイル・オプションの更新を行っただけのパッケージです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-giH0b6p6sXg/WLVq7H1VUXI/AAAAAAAAD10/sZytdC1RGBc7u2JEaoX_ZwDhc-g7jzo6wCLcB/s1600/uos-lpc800.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="60" src="https://4.bp.blogspot.com/-giH0b6p6sXg/WLVq7H1VUXI/AAAAAAAAD10/sZytdC1RGBc7u2JEaoX_ZwDhc-g7jzo6wCLcB/s400/uos-lpc800.png" width="400" /></a></div>
<br />
今回の更新は完全に<a href="https://www.amazon.co.jp/%E7%86%B1%E8%A1%80-%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9%E5%85%A5%E9%96%80-%E5%9D%82%E4%BA%95-%E5%BC%98%E4%BA%AE/dp/4798041807">「熱血!アセンブラ入門」</a>に感化されたもので、今回のパッケージを展開してLPCXpressoでコンパイルすればアセンブラまで確認できるというものになっています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-NpYiJ51y6aQ/WLVsgJ1SU3I/AAAAAAAAD2A/I2JLdcXbvA4DBWuTQpZO4_7Xw2gZJpjnwCLcB/s1600/nekketsu.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://3.bp.blogspot.com/-NpYiJ51y6aQ/WLVsgJ1SU3I/AAAAAAAAD2A/I2JLdcXbvA4DBWuTQpZO4_7Xw2gZJpjnwCLcB/s400/nekketsu.jpg" width="308" /></a></div>
<br />
ビルドすると.hexなどの他に.asmが出力されるようにしました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-kD1SjVw1b20/WLVsr7COjfI/AAAAAAAAD2I/XKXmylTzML8EDphc4qFG1dXB1S2Y7MN8ACLcB/s1600/buildfiles.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="231" src="https://3.bp.blogspot.com/-kD1SjVw1b20/WLVsr7COjfI/AAAAAAAAD2I/XKXmylTzML8EDphc4qFG1dXB1S2Y7MN8ACLcB/s400/buildfiles.png" width="400" /></a></div>
<br />
中身を見るとソースコードとアセンブラを同時に確認できます。<br />
熱血!アセンブラ入門と同時に活用できる便利なパッケージです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-YT8Pij9bHiI/WLVtY5s3S9I/AAAAAAAAD2Q/G_z5JIksM4A0DGQSXZRnNoAmzYEk2foYgCLcB/s1600/asmfile.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="276" src="https://2.bp.blogspot.com/-YT8Pij9bHiI/WLVtY5s3S9I/AAAAAAAAD2Q/G_z5JIksM4A0DGQSXZRnNoAmzYEk2foYgCLcB/s400/asmfile.png" width="400" /></a></div>
<br />
ダウンロードは以下からどうぞ。<br />
<a href="http://cubeatsystems.com/uos-lpc800/download.html">http://cubeatsystems.com/uos-lpc800/download.html</a>shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-23113967762476074252017-01-31T02:54:00.002+09:002020-09-10T09:10:07.671+09:00ARM Cortex-M0でもラクラク使えるNT-Shellよりもコンパクトな端末入出力ミドルウェアMicroShellライブラリを開発しました (NXP LPC824用サンプルプロジェクト付き)<h2 style="clear: both; text-align: left;">
<span style="font-size: x-large;">あらまし</span></h2>
<div>
昨年のこと、NXP LPC824を使ったサウンドモジュールMicroSoundModuleを開発していました。このサウンドモジュールは、コマンドを受け取って色々な再生を行うもので、当初はこのコマンド処理部分の実装にNT-Shellを用いる計画でした。しかし、最小10KBのROM、最小1KBのRAMを要求するNT-ShellはNXP LPC824の小さなリソースに対して厳しいものです。仮に入ったとしてもアプリケーション側に大きな制約を課すことになります。</div>
<div>
<br /></div>
<div>
よくよく見まわしてみると、様々な面白そうなマイクロコントローラがNXP LPC824と同クラスで存在します。ARM Cortex-M0のような小さなマイコンを使ったシステムにおいて、NT-Shellほどの機能は要らない、でも、きっちり入力は出来るようにしたい、といったニーズはありそうです。<br />
<br />
そこで、NXP LPC824のような小さなサイズのマイコンにも導入可能な端末入出力ミドルウェアを開発することにしました。名付けてMicroShellです。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-hyroR2hs6yE/WI94iCBCGPI/AAAAAAAAD0Q/oWKSIW-cMRUhn2zA7sH5zktvdFv8nQx9QCLcB/s1600/logo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="102" src="https://2.bp.blogspot.com/-hyroR2hs6yE/WI94iCBCGPI/AAAAAAAAD0Q/oWKSIW-cMRUhn2zA7sH5zktvdFv8nQx9QCLcB/s400/logo.png" width="400" /></a></div>
<br />
<br />
<h2>
<span style="font-size: x-large;">使い方</span></h2>
<div>
使い方はmicroshell_initという関数にハンドラの実体へのポインタと、ブロッキング型のシリアル送受信関数のポインタを渡すだけという至って単純なもの。このコードだけできっちり動作する入力系が得られます。とても簡単ですね。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-rrqIFCtqxTg/WI97VeJatXI/AAAAAAAAD0g/5A4prvFK_xwdZ7GvkwvC-BMNnigwx2aogCLcB/s1600/microshell-example-code.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://3.bp.blogspot.com/-rrqIFCtqxTg/WI97VeJatXI/AAAAAAAAD0g/5A4prvFK_xwdZ7GvkwvC-BMNnigwx2aogCLcB/s640/microshell-example-code.png" width="334" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">内部構造</span></h2>
内部構造は、以下の図に示すようにcoreとutilの二つから成り立っています。本当に最小限の構成にしたい場合にはcore側のmicroshellを用い、この場合には1行の入力処理が得られます。これに加えてコマンドのパースなどを行いたい場合には、util側のmscmdを用います。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-1LE42GqXkb8/WI94jJ-ORVI/AAAAAAAAD0U/bJgloKa6-tMD5pn4HabYeoOJihdcentxACLcB/s1600/architecture.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="https://4.bp.blogspot.com/-1LE42GqXkb8/WI94jJ-ORVI/AAAAAAAAD0U/bJgloKa6-tMD5pn4HabYeoOJihdcentxACLcB/s400/architecture.png" width="400" /></a></div>
<br />
<br />
<h2>
<span style="font-size: x-large;">ダウンロード</span></h2>
ダウンロードは専用サイトからできます。<br />
<ul>
<li><a href="https://cubeatsystems.com/microshell/index.html">https://cubeatsystems.com/microshell/index.html</a></li>
</ul>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com2tag:blogger.com,1999:blog-1344337796673480398.post-73138539077866218982016-12-30T06:48:00.001+09:002016-12-30T06:48:39.384+09:00塩漬けになっている「Micro Sound Module」をなんとかしようと思い立つ試作してから塩漬けになっているMicro Sound Moduleですが、年末年始のちょっとした時間で取り組もうかと考えています。そもそも、塩漬けにしすぎて何をどこまでやったのか忘れてしまった。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-ytfq5V7RMKM/WGV_yGmA-AI/AAAAAAAADzs/EAF4-6ieYqYHMASpauXtifFEm5YwuDbJQCLcB/s1600/msm-photo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://2.bp.blogspot.com/-ytfq5V7RMKM/WGV_yGmA-AI/AAAAAAAADzs/EAF4-6ieYqYHMASpauXtifFEm5YwuDbJQCLcB/s400/msm-photo.png" width="400" /></a></div>
<br />
元々、アートインスタレーションで使えるような小さなモジュールにしたかったので、仕様から様々なこだわりを切り捨てて作りました。LPC824を選択したのも、「このくらいのマイコンを選べばアレコレやろうとしても欲張れないだろう」という斜め上(下?)の動機があったりします。<br />
<br />
ということで、ちょっと成果物を眺めてから色々と取り組んでみようと思います。shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-82986011580641719972016-11-30T22:50:00.001+09:002016-11-30T22:50:22.045+09:00リアルタイムOS教材について思う事(をちょっとだけ書いてみる)<h2>
<span style="font-size: x-large;">■あらまし</span></h2>
<div>
学生の頃からリアルタイム・システムに興味があって様々な書籍を読んでいた自分ですが、エンジニア・ライフを約一周ほど楽しんで、そろそろ思うことあってリアルタイムOS教材についても触れなければならないなと考え始めました。というのも、世の中に溢れる教材の中には、初学者に与えるべきでない間違った例が数あまたあり、それらが実開発の現場で様々な問題を生んでいるからです。今日はその中からひとつだけ取り上げてショート・ブレイクとして書いてみます。</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">■良くない例:タスク・スリープで排他処理</span></h2>
<div>
世の中には不思議な例を取り上げてリアルタイムOSの機能を紹介する例を見かけます。その代表例がタスク・スリープで排他処理やシステムの状態を管理する例です。</div>
<div>
<br /></div>
<div>
この例を取り上げる教材の多くは、リアルタイムOSの機能を紹介したいようでもあるのですが、よくよく読んでみると、結局のところどれも「こういうときはこうするのだ」と実際のアプリケーションについて触れています。しかし、このような設計で実システムを実現されてはひとたまりもありません。</div>
<div>
<br /></div>
<div>
リアルタイムOSの使い方として間違ったアイデア、「タスク・スリープで排他処理やシステムの状態を管理」が何を言っているのか図示してみます。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-tZpCpja3me0/WD7RPkxHXrI/AAAAAAAADyw/OcVPeKEEk98yOTkkVvpU15j3uYFAZq4XgCLcB/s1600/slp_tsk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="122" src="https://1.bp.blogspot.com/-tZpCpja3me0/WD7RPkxHXrI/AAAAAAAADyw/OcVPeKEEk98yOTkkVvpU15j3uYFAZq4XgCLcB/s400/slp_tsk.png" width="400" /></a></div>
<div>
<br /></div>
<div>
タスクAとタスクBは、それぞれグローバル変数であるint valueを操作します。もうグローバル変数が出てくる時点で完全に失格なのですが、問題はそこではありません。この典型的な間違ったアイデアは、よく以下のような方法で紹介されています。</div>
<div>
<br /></div>
<div>
①システム起動直後、タスクAは動作し、タスクBは寝ています。</div>
<div>
②タスクAはint valueを操作し、タスクBを起こして自分は寝ます。</div>
<div>
③起床したタスクBはint valueを操作後、タスクAを起こして自分は寝ます。</div>
<div>
<br /></div>
<div>
例えば、この設計には以下の疑問がつきまといます。</div>
<div>
<br /></div>
<div>
A. タスクAとタスクBが非同期で双方動作している瞬間について考慮されていない。</div>
<div>
B. タスクAがタスクBを知っている。タスクBがタスクAを知っている。つまり循環参照関係にある。</div>
<div>
C. やっている内容から考えると、そもそも単一タスクで良い。(説明に必然性が全く無い)</div>
<div>
D. その他。</div>
<div>
<br /></div>
<div>
上の例、int valueと書いてあるものは物理デバイスであることもあります。となると、なおさら問題は複雑になります。というのも、物理デバイスは動作に時間がかかります。状態遷移中の物理デバイスの状態を適切に扱う場合、上記の例では対処できません。</div>
<div>
<br /></div>
<div>
<h2>
<span style="font-size: x-large;">■例えばどうすれば良いのか?</span></h2>
</div>
<div>
リアルタイムOSを使うのは、抽象化レベルを上げつつ、キビキビとした動作を実現できるからです。上記の例で言うと、int value(物理デバイスかもしれない)は、操作対象ですが、これはあるタスク内部で操作される操作対象と見ることができます。つまり、タスクAやタスクBから操作される新たなタスクCのようなものが内部で操作する対象とすることができます。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-DtQ-XfcKBQw/WD7XLGbLzYI/AAAAAAAADzA/0lYIo_WRZV4sjzPQN9YRFbigkeOYjz4AgCLcB/s1600/added-task-c.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://2.bp.blogspot.com/-DtQ-XfcKBQw/WD7XLGbLzYI/AAAAAAAADzA/0lYIo_WRZV4sjzPQN9YRFbigkeOYjz4AgCLcB/s400/added-task-c.png" width="400" /></a></div>
<div>
<br /></div>
<div>
そして、タスクAやタスクBからメッセージ通信でタスクCに操作を依頼する形式を取ります。</div>
<div>
「ちょっと待って!さっきの例で出来ていたタスクAとタスクBの同期ができないじゃない!」と言われるかもしれませんが、タスクCは単一スレッド上でメッセージ受信処理を行っているので操作は競合しません。</div>
<div>
<br /></div>
<div>
加えて、タスクCのAPIを工夫しておけば、操作自体も抽象化された表現で扱うことが可能になります。</div>
<div>
<ul>
<li>アームを上に上げろ!</li>
<li>アームを下に下げろ!</li>
<li>緊急停止!</li>
</ul>
<div>
上記のような操作を抽象的に表現したAPIにするだけで、グンとシステムで操作する内容がわかりやすくなってきます。そして、実装の詳細はタスクCに隠ぺいされるというメリットも生まれます。タスクAとタスクBが循環参照状態になる事もありません。</div>
</div>
<div>
<br /></div>
<div>
<div>
<h2>
<span style="font-size: x-large;">■ということで・・・</span></h2>
</div>
</div>
<div>
リアルタイムOSの教材でタスクのスリープを使って状態をコントロールするような例を見かけたら、「この教材は怪しいな」と疑って内容をレビューしてみて下さい。</div>
<div>
<br /></div>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-80778555742420560972016-10-31T06:19:00.001+09:002016-10-31T06:21:13.378+09:00ちょうど100円玉サイズ!NXP LPC824を使ったとっても小さなWAV File Player「Micro Sound Module」を作りました!<h2>
<span style="font-size: x-large;">■KiCadへの移行</span></h2>
2016年2月にCADをEAGLEからKiCadに移行する練習を兼ねて、何か実際に作ってみようと考えていました。でも、あまり大きな設計はしたくない。そこで小ピンでも何か面白いことが出来そうなマイコンを使うことを考え、LPC824を使ったとっても小さなWAV Player「Micro Sound Module」を作ることにしました。こちらが完成品。じゃん!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-fIv7YANVSQ0/WBZjQEre9OI/AAAAAAAADyQ/GzZlpD3aEyQ6g6uEJ1EdP8Y1BWqmYr4mACLcB/s1600/msm-photo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://1.bp.blogspot.com/-fIv7YANVSQ0/WBZjQEre9OI/AAAAAAAADyQ/GzZlpD3aEyQ6g6uEJ1EdP8Y1BWqmYr4mACLcB/s400/msm-photo.png" width="400" /></a></div>
<br />
EAGLEからKiCadに移行する人の中には、独特なユーザーインターフェースに戸惑いを感じる事もあるようですが、OrCADなどの業務でも使われているCADに馴染みのある人にとっては、逆に自然に移行できるのかも。私の場合、KiCadへの移行に合わせて、回路図、基板、3Dモデルを3画面で同時に見れるようにPC環境を更新しました。これはとても便利。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-pGkTZ9Eajbc/WBZa4lnkChI/AAAAAAAADxU/YOVm4VVEt44tlHI7fI-ZLtWoDW4BISZVgCLcB/s1600/msm-kicad.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="132" src="https://1.bp.blogspot.com/-pGkTZ9Eajbc/WBZa4lnkChI/AAAAAAAADxU/YOVm4VVEt44tlHI7fI-ZLtWoDW4BISZVgCLcB/s640/msm-kicad.png" width="640" /></a></div>
<br />
パッド名やネット名の確認が簡単に出来たり、リアルタイムでルールチェックを行なってくれるところも素敵です。EAGLEの場合には後からデザインルールチェックをかけるわけですが、これを忘れてしまうととんでもない状態で基板を作ってしまう事になります。そういう事は起こらないのが良いなぁと思いました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-N9g8Bd9FyQI/WBZeRRLknYI/AAAAAAAADyA/v5sXDln5jsM6Oynfp6Mgx58eF-d9XXj5QCLcB/s1600/msm-kicad-padname.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" src="https://4.bp.blogspot.com/-N9g8Bd9FyQI/WBZeRRLknYI/AAAAAAAADyA/v5sXDln5jsM6Oynfp6Mgx58eF-d9XXj5QCLcB/s400/msm-kicad-padname.png" width="400" /></a></div>
<br />
私が使ったKiCadのバージョンでは、フットプリント側で配線禁止エリアや配置禁止エリアを指定できず、これはちょっと困ったことになりましたが、この苦しい制限があってもEAGLEには戻れない気持ちになっています。そのうちこの苦しい状況も改善されるでしょうと期待。<br />
<br />
<h2>
<span style="font-size: x-large;">■Micro Sound Moduleの企画</span></h2>
マイコンがそもそも小さいのでコンパクトに面白いことができそう、と企画したのがMicro Sound Moduleです。本体のデザインは以下のようなもの。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-hk74Hm8ldSQ/WBZbiwYxOaI/AAAAAAAADxY/nxag_UCoUMsyNFwOOIqoKVeJl2oBhIErgCLcB/s1600/msm1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://4.bp.blogspot.com/-hk74Hm8ldSQ/WBZbiwYxOaI/AAAAAAAADxY/nxag_UCoUMsyNFwOOIqoKVeJl2oBhIErgCLcB/s400/msm1.png" width="400" /></a></div>
<div>
<br /></div>
Micro Sound Moduleですが、とにかく小さくて便利な機能満載!と行きたかったのですが、現状でROMがパンパンでI2Cスレーブ機能が入りません。苦し紛れにI2C端子をGPIにしてスイッチで制御出来るようにしました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-zP5J-wrGBJo/WBZdC2KqqHI/AAAAAAAADxs/pdyvCe0tvdkyzU4l51Qr1xw-Hw5mL83ogCLcB/s1600/msm2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="181" src="https://2.bp.blogspot.com/-zP5J-wrGBJo/WBZdC2KqqHI/AAAAAAAADxs/pdyvCe0tvdkyzU4l51Qr1xw-Hw5mL83ogCLcB/s320/msm2.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Micro Sound Moduleプロジェクトの副産物。</div>
<div class="separator" style="clear: both; text-align: left;">
某企業さんに行ったプレゼンテーション資料の中で何故か好評だったシリアル通信の説明文・・・。</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-ZMVTcPLD1DY/WBZdCqPJJiI/AAAAAAAADxo/l4pU2VG2zPo12Tob-ODr8p0YavElMDyYwCLcB/s1600/msm3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="181" src="https://1.bp.blogspot.com/-ZMVTcPLD1DY/WBZdCqPJJiI/AAAAAAAADxo/l4pU2VG2zPo12Tob-ODr8p0YavElMDyYwCLcB/s320/msm3.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-DUlgDHNiAew/WBZdC3veLEI/AAAAAAAADxk/FxB23XFSaA8NqR_Ti-3IqHs1BAI2-9ynwCLcB/s1600/msm4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="181" src="https://2.bp.blogspot.com/-DUlgDHNiAew/WBZdC3veLEI/AAAAAAAADxk/FxB23XFSaA8NqR_Ti-3IqHs1BAI2-9ynwCLcB/s320/msm4.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Kjx3fIx6iIc/WBZdDT2t-MI/AAAAAAAADxw/YvbSXfhvs5o08W2s8p4vRNiNjKNDK4ZqQCLcB/s1600/msm5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://2.bp.blogspot.com/-Kjx3fIx6iIc/WBZdDT2t-MI/AAAAAAAADxw/YvbSXfhvs5o08W2s8p4vRNiNjKNDK4ZqQCLcB/s320/msm5.png" width="320" /></a></div>
<br />
<h2>
<span style="font-size: x-large;">■ファームウェア</span></h2>
ファームウェアには色々な仕掛けが施されていて、面白いことが出来るので何処かでお見せできるように準備したいなぁと考えています。コマンドの例を挙げると・・・<br />
<br />
<ul>
<li>ディスクコマンド(マウント、アンマウント、情報取得)</li>
<li>ファイルコマンド(ディレクトリ指定、リスト取得、オープン、クローズ、情報取得)</li>
<li>トランスポートコマンド(再生、停止、ジャンプ、情報取得)</li>
<li>マーカーコマンド(設定、解除、ジャンプ、情報取得)</li>
</ul>
<div>
こんな感じでひととおりの制御が可能なコマンドを装備しています。</div>
<div>
コマンドパーサーにはNT-Shell (Natural Tiny Shell)を使用する予定でしたが、ROM容量の都合であえなく断念し、新しくコンパクトなパーサーを書きました。そろそろこれも公開したい。</div>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-13783443057365813272016-09-30T21:02:00.001+09:002016-09-30T21:02:24.942+09:00Artistic Style (astyle) でコードを整形する<h2>
<span style="font-size: x-large;">■インデントって重要</span></h2>
最近、色々な人のコードを眺めるにつけ、インデントまできちんと目を配って実装している人とそうでない人との間に、とてつもなく大きな壁がある事に気付きました。前者、インデントまできちんと目を配って実装している人の多くは、不要な実装、余計な実装は一切無く、終始一貫した表現で実装されています。対して、後者のインデントに気を使わない人の多くは、未使用変数や未使用関数、全く意味のないコメントやデバッグ文の散乱、ハードタブとソフトタブの同居・・・その他たくさんの危険な香りのする実装が残されています。ここ数年で見ていく中でインデントと成果物の内容に相関性があるのでは?という疑問に至り、インデントをきちんと行う姿勢に変えるだけでもその人のアウトプットが改善されるようにすら思えてきました。(今は単にそう思っているだけ)<br />
<br />
<h2>
<span style="font-size: x-large;">■最近はArtistic Styleなの?</span></h2>
私の場合、ソースコードは常にvimで編集しています。autoindentは常にonですし、整形する際も組み込まれた整形機能をパパッと充てて済ませていました。ふとしたことから「最近では皆さんどうしているのかな?」と疑問に至り調べてみたところ、<a href="http://astyle.sourceforge.net/" target="_blank">Artistic Style (astyle)</a>というツールが割と最近では使われているようです。メジャーなLinuxディストリビューションではパッケージ管理システムから簡単にインストールできますし、Windows版は<a href="https://sourceforge.net/projects/astyle/">sourceforge.netのプロジェクトページ</a>から入手可能なようです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-rmrMedqSthY/V-5REWA0WWI/AAAAAAAADwk/Hj5yUUNDSeIYlAzUT8EZPypFqzutA4WEQCLcB/s1600/rc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://4.bp.blogspot.com/-rmrMedqSthY/V-5REWA0WWI/AAAAAAAADwk/Hj5yUUNDSeIYlAzUT8EZPypFqzutA4WEQCLcB/s400/rc.jpg" width="400" /></a></div>
<br />
<h2>
<span style="font-size: x-large;">■"One True Brace Style"が使える!</span></h2>
Artistic Styleでは、<a href="http://astyle.sourceforge.net/astyle.html" target="_blank">様々なコーディングスタイルを実現できるように豊富なオプションが用意</a>されています。自分たちのコーディングスタイルに合わせてオプションを加えて実行できるのは嬉しい点です。"One True Brace Style"は、条件分岐などで一行で完結する命令の場合でも波括弧を付けて実装するスタイルのひとつで、私が好んで使用しているスタイルのひとつです。Artistic Styleでは、「--style=otbs」という引数を与えるだけで、One True Brace Styleになっていないコードでも自動的に波括弧を加えて整形してくれます。他にも様々な代表的なコーディングスタイルに対応しているので、きっと自分の気に入ったスタイリングオプションを見つける事ができるでしょう。<br />
<br />
<br />
<br />shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-35317244207079657902016-08-28T13:21:00.001+09:002016-08-28T13:51:24.307+09:00CQ出版Interface2016年10月号の第七章にMicroPythonに関する記事を書きましたCQ出版Interface2016年10月号の第七章にMicroPythonに関する記事を書きました。<br />
<br />
今回の記事は「とにかくソースコードと格闘してMicroPythonの世界を体験しようよ!」という内容になっています。成長中のオープンソースでこのような記事を書くと本当に生ものになってしまい、数か月後には「記事の内容と全然違う!」なんて事も多々あるので迷いましたが、「こーんな風に見ていけば良いんだよ」という雰囲気が少しでも伝わればという考えでしたためました。<br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.kumikomi.net/interface/contents/201610.php" target="_blank"><img border="0" height="320" src="https://1.bp.blogspot.com/-7rNEgvom0_I/V8JjNuOR-jI/AAAAAAAADvo/8FdhqmUz9XMRX6PHpRXWJlYyAtDekO5KACLcB/s320/interface-2016-10.jpg" width="226" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
ちなみに、記事のタイトルは「MicroPythonプログラミング」となっていますが、MicroPythonの中身を知るための入り口として、既存のモジュールに機能を追加する体験記事になっています。「なーんだ、ポーティングじゃないんだ」とか「プログラミングじゃないじゃん」と思われるかもしれませんが、騙されたつもりで一度体験してみて下さい。このちょっとした機能追加を体験する事が、意外にも内部構造の理解や機能拡張、更には別のプラットフォームへの展開の大きなヒントになります。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.kumikomi.net/interface/sample/201610/if10_057.pdf" target="_blank"><img border="0" src="https://2.bp.blogspot.com/-q09zEBMo4vY/V8JjgWrAYXI/AAAAAAAADvs/s634bX6fXjQqUu1OZLXFmfD-rBSC-NkVwCLcB/s1600/banner.png" /></a></div>
<br />
記事の中で使用したボードは<a href="http://www.st.com/content/st_com/ja/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-nucleo/nucleo-f401re.html" target="_blank">NUCLEO-F401RE</a>です。<br />
<a href="http://akizukidenshi.com/catalog/g/gM-07723/" target="_blank">秋月電子通商さん</a>や<a href="https://www.switch-science.com/catalog/1619/" target="_blank">スイッチサイエンスさん</a>から購入できます。<br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-8rCqrefGHM4/V8JlUY4BB6I/AAAAAAAADv0/zD1dv93jIcUKGxf9uMyeCnfFkw6EYjpRACLcB/s1600/NUCLEO_F401RE.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://1.bp.blogspot.com/-8rCqrefGHM4/V8JlUY4BB6I/AAAAAAAADv0/zD1dv93jIcUKGxf9uMyeCnfFkw6EYjpRACLcB/s400/NUCLEO_F401RE.png" width="400" /></a></div>
<br />
<a href="http://www.cqpub.co.jp/interface/download/contents.htm" target="_blank">ダウンロードコーナーのファイル</a>(2016年 10月号 データ解析時代の新定番 Python)には執筆段階で使用したコードと環境構築用スクリプト(Ubuntu 16.04用)も含まれますので御利用下さい。shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-34548595856375154252016-07-31T17:49:00.001+09:002017-02-01T18:29:09.617+09:00技術開発と製品開発とビジネス開発は全く別物だけど混同されていることが多いという話<h2>
<span style="font-size: x-large;"><b>あらまし</b></span></h2>
お仕事で様々な立場の方とお話しする機会があるわけですが、以前からどの階層にいる人にも共通した「技術開発と製品開発とビジネス開発が同時に出来るのではないかという思い込み」を持っている方が非常に多い事に気付きました。<br />
<br />
<div style="text-align: center;">
<a href="https://4.bp.blogspot.com/-00iEz2Sbfpw/V52uSpOxNvI/AAAAAAAADvE/V_Z8q93z5iEAnGvaTDFi2yN_FT-K473WQCLcB/s1600/100percent.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="372" src="https://4.bp.blogspot.com/-00iEz2Sbfpw/V52uSpOxNvI/AAAAAAAADvE/V_Z8q93z5iEAnGvaTDFi2yN_FT-K473WQCLcB/s640/100percent.png" width="640" /></a></div>
<div style="text-align: center;">
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
</div>
<h2>
<span style="font-size: x-large;">よくある混同で起きるマズい事</span></h2>
例えば、おぼろげながら自分達で考えている製品像が浮かんだとしましょう。この製品像は、それこそ具体的になっているものではありませんが、必要な機能や性能やインターフェースが何となく整理できた状態になっていたとします。そこで必要になる機能を実現するための技術的な要素は、少し頑張れば実現できそうな事ばかりで、さっそく製品開発をスタートする事にしてしまいます。<br />
<br />
このシチュエーションで起きるのは以下です。<br />
<ol>
<li>製品の機能を仕様にまとめる</li>
<li>仕様が好ましいものと判断され/判断し、計画をスタートさせる</li>
<li>仕様を満たす機能を実現できるように設計を開始する</li>
<li>設計が完了したので実装を始める(ハードウェア、ファームウェア、ソフトウェアは問わない)</li>
<li>実装が完了したので製造する(ハードウェア、ファームウェア、ソフトウェアは問わない)</li>
<li>製造が完了したので評価する</li>
<li>(以降、付随したプロセスに続く・・・)</li>
</ol>
<div>
何もマズい事が起きていないようにも見えます。が、実際に技術開発と製品開発とビジネス開発を混同している人達に起きる悲劇の一例を挙げます。</div>
<div>
<ul>
<li>出来ると思っていた技術的な要素に意外な課題があった</li>
<li>技術的な要素に絡む問題のために実現すべき仕様の一部が実現出来なくなった</li>
<li>仕様の一部が無くなったが、市場に出したい時期を明らかにしているので出す事にした</li>
<li>実現できなかったのはエンジニアリング能力の低さだと誰もが落胆し真因にたどり着かない</li>
</ul>
<div>
混同によって、どれもこれもが全て中途半端になってしまうのが最大の欠点です。こういった結末に至るプロジェクトは無数にあり、共通に存在するのが技術開発、製品開発、ビジネス開発を混同してしまっている事にあります。</div>
</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">技術開発</span></h2>
当たり前の話ですが、製品を実現するために必要な技術要素について、事前に課題や実現性を吟味しておく必要があります。そうでなければ製品の実現性すら不明のままで製品開発をスタートさせる事になってしまいます。このような組織にいたっては、製品開発を行う時点でビジネスまで混同して考えてしまっているので、全部が不透明感で一杯になる事になります。<br />
<div>
<br /></div>
<div>
技術開発は、製品開発とは性格の異なるもので、将来何に役立つのかわからないが、魅力的な物事について事前に研究開発しておくものです。大抵の場合、これらは現場の技術者の個人的な興味に由来していたり、過去に失敗した製品の残骸からゾンビのように生き返って組織に残っているようなものだったりします。</div>
<div>
<br /></div>
<div>
そして、非常に重要な点ですが、これらは一般に組織的に必要性を認められることは少なく、たいていの場合アンダーグラウンドで活動する事すら認められないようなものだったりします。(そんな事をやっている暇があるのなら、別の事をやれというやつです。)</div>
<div>
<br /></div>
<div>
<div>
もちろん、ニーズを的確に察知して必要になりそうな技術要素について研究開発する事も多いのですが、実際にそれらはビジネスへの発展を事前に考慮しているので、思わぬ発展に至るケースは少ないように思います。</div>
</div>
<div>
<br /></div>
<div>
いずれにせよ、重要な点はその時点で何の役に立つのかわからない、けれども興味のある物事を実現できるようにしておくというのが技術開発です。</div>
<div>
<br /></div>
<div>
<h2>
<span style="font-size: x-large;">製品開発</span></h2>
<div>
</div>
</div>
<div>
製品開発は、商品やサービスを実際に市場に出すために行う活動で、通常はビジネス開発との関係も持ちながら行われます。売れないものを作っても何もならないので、売れる前提でモノを作る事になります。つまり、実現性が非常に重要な点で、この時に初めて技術開発の成果物が価値を持ってきます。</div>
<div>
<br /></div>
<div>
製品開発の段階では、明らかになった技術要素を用いる事ができるようになっていると失敗のリスクを低減できます。</div>
<div>
<br /></div>
<div>
最近は様々な物事が安易に進む傾向があるようで、お金を積めば実現できると思っている方も多いのですが、実際に製品開発をするならば事前に積み重ねられた技術開発が伴っていなければなりません。そうでなければ博打にもなりかねません。動くと思うけどどうかなー。なんて嫌ですよね。</div>
<div>
<br /></div>
<h2>
<span style="font-size: x-large;">ビジネス開発</span></h2>
<div>
ビジネス開発では製品やサービスだけでなく、市場の動向や人々の趣味嗜好、その他さまざまな要素を踏まえて見えるものや見えないものまで作っていきます。</div>
<div>
<br /></div>
<div>
<div>
重要な点ですが、技術開発はそれ自身が当初品質が低く、実現形態も最終品ではないので曖昧で、結果的にビジネス開発側では具体的な製品のイメージを持ちにくい性質のものです。ビジネス開発側に自分が位置している場合には、目の前で実現できているモノが、技術開発の成果物なのか、製品開発の成果物なのか、十分に理解した上でモノを見なければなりません。その点を見誤ると、将来の大事な要素を自ら見捨ててしまう結果になってしまいます。</div>
</div>
<div>
<br /></div>
<div>
<h2>
<span style="font-size: x-large;">まとめじゃないまとめ</span></h2>
</div>
<div>
沢山の失敗するプロジェクトと少しの成功するプロジェクトを眺めていると、ある一定の共通項が見えてきました。その結論の一つが上記の、技術開発と製品開発とビジネス開発を混同しない事。です。</div>
<div>
<br /></div>
<div>
技術開発と製品開発を混同している組織は、製品開発で必ず失敗しています。そして、その失敗の原因を現場の担当に押し付けてしまいます。しかし、実際に組織で起きているのは、単に十把一絡げに物事を混同してしまう思想の雑さ加減にあるのです。もちろん、製品開発とビジネス開発も同様で、開発担当現場に一緒にビジネスまで開発させようとする組織すら存在しますが、エンジニアはスーパーマンではないので、小さなビジネスでまとめるなら別ですが、通常はうまくいかないでしょう。</div>
<div>
<br /></div>
<div>
モノを作るのが大好きな日本人ですが、世界中で見ると創造性や生産性は高くないのが現状です。そして、うまくいかなくても分析すらままなりません。結局は「社員の能力」などと言い放つ方すらいるのですが、それでは問題が解決しないようなぁと考える今日この頃なのです。</div>
<div>
<br /></div>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-34544796803513749512016-06-29T23:08:00.000+09:002016-06-30T07:23:27.572+09:00ドキュメント生成にSphinxを用いる色々と思う事があって、最近はドキュメントをきちんと書こうという気持ちになっているのですが、最初に書き始めるまでに膨大な時間がかかってしまいます。ソースコードを書き始めるのは心理的な抵抗が無いのにも関わらず、ドキュメントを書き始めるのに時間がかかってしまうのは何故なんでしょうか?<br />
<br />
そんな事を考えていてウェブを調べてみると、ちょっと良さそうなドキュメント生成ツールを見つけました。なんだか有名なツールのようですが、私が知ったのはつい最近。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-o2gHCNeu9V8/V3PRycrphlI/AAAAAAAADug/pfF4U1exZv8Cn0KruqFrZO4pp41OtwhRQCLcB/s1600/sphinx.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="69" src="https://1.bp.blogspot.com/-o2gHCNeu9V8/V3PRycrphlI/AAAAAAAADug/pfF4U1exZv8Cn0KruqFrZO4pp41OtwhRQCLcB/s320/sphinx.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.sphinx-doc.org/en/stable/" style="text-align: start;">http://www.sphinx-doc.org/en/stable/</a></div>
<br />
何やら独自のマークアップ言語で記述すればhtmlやlatexやepubやなんだかんだに変換が出来るという・・・一見するとよく見る類のものに見えます。そして、いつものように試してガッカリするんだろうなと期待せずに<a href="http://www.sphinx-doc.org/en/stable/tutorial.html" target="_blank">チュートリアル的な内容</a>をこなしてビックリ。なかなか綺麗な出力が得られることがわかりました。<br />
<br />
例えば、sphinx-quickstartで作ったプロジェクトのファイルに日本語を入力してUTF-8で保存し、make latexpdfjaした時の出力が以下。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-QJfHphT0vOQ/V3PTGdZ9UvI/AAAAAAAADuo/vZF2_nUVC2kn5p4BnsHkEZ-fVSfoy50YQCLcB/s1600/example.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="269" src="https://2.bp.blogspot.com/-QJfHphT0vOQ/V3PTGdZ9UvI/AAAAAAAADuo/vZF2_nUVC2kn5p4BnsHkEZ-fVSfoy50YQCLcB/s640/example.png" width="640" /></a></div>
<br />
もちろんSphinx自体のサイトもSphinxで作られていて、これがなかなか綺麗な仕上がりです。<br />
<a href="http://www.sphinx-doc.org/en/stable/contents.html">http://www.sphinx-doc.org/en/stable/contents.html</a><br />
<br />
ソースコードの類を書く人にとって、WordのようなWYSIWYGはやはり辛いんでしょうか。よく考えてみるとソースコードの整形だってエディタやツールにやらせています。よほどの事情(とにかく気分転換したいので単純作業とかしたい・・・とか?)が無い限り、手で一文字一文字整形する人は稀でしょう。このノリで考えると、文章を整形しながら書くというのは、ソースコードを書く人の感覚と少し異なるのかもしれません。「整形は後で」って思っていても、そもそもソースコードを書く人は綺麗好きな人が多いので、やっぱり整形作業も始めちゃうというジレンマがあるのかも。<br />
<br />
という事で、ひとまず道具を開拓してみただけなのですが、実際に説明不足のプロジェクトが山のようにあるので、何かのプロジェクトで使ってみたいと(今は)考えています。<br />
<br />shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-72687743974826602792016-05-31T23:41:00.001+09:002016-05-31T23:46:54.717+09:00NT-Monitorの外部オブジェクト参照にバグがあるんじゃないかという話NT-Monitorとは、<a href="http://www.kumikomi.net/interface/contents/201301.php" target="_blank">CQ出版社が出版しているInterface2013年1月号</a>に掲載されたマイコン用のモニタプログラムです。シェルの部分はNT-Shellを用い、その上にモニタプログラムとしてNT-Monitorが乗る形を想定しました。記事掲載時点ではFM3マイコンに対するモニタプログラムとして構成し、その時点ではコールバックに渡される外部オブジェクト参照を使用しない実装になっていました。<br />
<br />
2013年から約三年後の2016年現在、そういえば久しぶりに懐かしいコードを引っ張り出してみようと見てみたところ、限りなく怪しい香りのする実装が幾つも見られます。そのひとつがタイプセーフではない外部オブジェクト参照の実装。ちょっと載せてみたいシステムがあったので使ってみたところ、インターフェースに渡したはずのオブジェクトへのポインタが、異なるアドレスを指す何かに代わってコールバックされます。「あー、何だこりゃ」というのが事の始まり。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-pDGDgGLnmpo/V02bDo_R9UI/AAAAAAAADtU/kxs-gPjt3g84xxxHJ5DIS7aA-SmZ7skCQCLcB/s1600/ntm-api.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="317" src="https://4.bp.blogspot.com/-pDGDgGLnmpo/V02bDo_R9UI/AAAAAAAADtU/kxs-gPjt3g84xxxHJ5DIS7aA-SmZ7skCQCLcB/s400/ntm-api.png" width="400" /></a></div>
<br />
NT-Monitorは、元々単一スレッド上で永久に動作し続けるものであるとの前提で設計しました。唯一のAPIは上記に示すntm_executeで、シェルオブジェクトとシリアルI/O関数へのポインタを渡すと後は勝手にシェルを駆動しながら処理してくれるというものです。<br />
<br />
システム内部に複数のシリアルインターフェースが存在し、かつそれらを別々のモニタープログラムが使用する事も念頭に入れ、UARTなどのインターフェースに対するハンドラへのポインタなどを格納できるようにしたのがextobjです。<br />
<br />
が、ここにどうしようもない情けないバグがあるんじゃないかとコードを眺めていて気付きました。<br />
<br />
まず、NT-Monitorの最上位階層であるntmモジュールを見たユーザは、当然のように自分がextobjへ渡したオブジェクトへのポインタが、そのままserial_readやserial_writeへ渡されることを期待します。そうでなければ、それが一体なんであるのか上記のAPIから知る由もありません。<br />
<br />
しかし、実際にNT-Monitorの実装を見るとのっけから次のようなコードが見えます。何やら突然現れたntmcmd_extobj_tにserial_readとserial_writeを格納し、更にはユーザが上位のAPIで与えたextobjをuser_extobjとして保存しています。そして、この準備の終わった新しい外部参照用オブジェクトへのポインタをシェルモジュールであるntmshellに渡しています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-OlVTGNBvEQ0/V02ci_frg3I/AAAAAAAADtg/gvOGbVkYC74-T4hxGtP8Hdwk1IQR6vg-ACLcB/s1600/ntm-extobj.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://3.bp.blogspot.com/-OlVTGNBvEQ0/V02ci_frg3I/AAAAAAAADtg/gvOGbVkYC74-T4hxGtP8Hdwk1IQR6vg-ACLcB/s400/ntm-extobj.png" width="400" /></a></div>
<br />
このままセオリー通りに事が進むと、ntmshellから呼び出されるserial_readとserial_writeは、最上位でユーザーが渡したextobjとは異なるものになってしまいそうな気もします。確認してみると・・・<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-SaWTE-aBco8/V02eNF3O4PI/AAAAAAAADts/pJwPLpCHsdUgAbVg_5gA7SOOK24s2XfaACLcB/s1600/ntmshell-extobj.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://3.bp.blogspot.com/-SaWTE-aBco8/V02eNF3O4PI/AAAAAAAADts/pJwPLpCHsdUgAbVg_5gA7SOOK24s2XfaACLcB/s400/ntmshell-extobj.png" width="338" /></a></div>
<br />
ntmshell_executeで呼び出されるp->func_writeは、最上位で言うところのserial_writeです。そして、そのシリアル出力関数に渡される外部参照オブジェクトへのポインタはp->extobjを示しており、これは先ほどの確認にあったようにNT-Monitorの内部で定義されたntmcmd_extobj_tである事がわかります。ということで、のっけからユーザーが渡したものと違うアドレスがコールバック関数に渡ってしまう事になります。あらら。<br />
<br />
一方で更に物事を無駄に複雑にしているのが以下の記述です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-MzuRiLllAls/V02f3pmJ4LI/AAAAAAAADt4/2pzoaHh3dwQlw9w-Sh5cM1QdYhxA4hUnwCLcB/s1600/ntmcmd-execute.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="81" src="https://1.bp.blogspot.com/-MzuRiLllAls/V02f3pmJ4LI/AAAAAAAADt4/2pzoaHh3dwQlw9w-Sh5cM1QdYhxA4hUnwCLcB/s400/ntmcmd-execute.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-wopDnXPD8PY/V02gCcu7xYI/AAAAAAAADt8/1e8fQBpdmJETakC7LBgW051wgB95x-RiQCLcB/s1600/ntmcmd-extobj.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="141" src="https://3.bp.blogspot.com/-wopDnXPD8PY/V02gCcu7xYI/AAAAAAAADt8/1e8fQBpdmJETakC7LBgW051wgB95x-RiQCLcB/s400/ntmcmd-extobj.png" width="400" /></a></div>
<br />
なんと、シリアル書き込み関数に対してマクロが用意されており、そのマクロを使用した箇所に関しては、user_extobjが渡るようになっています。どうしてここは正しいんだ。と過去の自分に言いたい。<br />
<br />
つまり、同じシリアル通信関数でも、呼び出される個所によって期待するアドレスが渡ったり、はたまた間違ったアドレスが渡ったりします。<br />
<br />
実はこの話、凡ミスのようにも見えますが、問題の根本には全体設計のまずさがあります。そもそも、シェルインターフェースを提供するNT-Shellと、モニタ機能を提供するNT-Monitorのシステム境界が曖昧です。本来であればシェルの機能とモニタの機能は完全に分離できるはずですが、あまり綺麗に分離できているとは言い難く、結果的にこれらの二層に渡るオブジェクトの取り違えにまで発展してしまっています。<br />
<br />
冒頭「シェルの部分はNT-Shellを用い、その上にモニタプログラムとしてNT-Monitorが乗る形を想定しました。」と書いている事からもわかるように、本来の依存関係はNT-MonitorからNT-Shellへの使用依存ですが、実装を見ると内包になっています。これも気持ちが悪い。<br />
<br />
ということで、NT-ShellもNT-MonitorもそろそろAPIの見直しなども含めて考えたくなってきました。<br />
<br />shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-57887204279009534882016-04-30T21:44:00.004+09:002017-04-01T07:43:35.343+09:00Natural Tiny Shell (NT-Shell)の新しいリリースパッケージVersion 0.3.1を発行しました。<a href="http://www.kumikomi.net/interface/sample/201301/if01_174.pdf" target="_blank">Natural Tiny Shell (NT-Shell)</a>の新しいリリース・パッケージVersion 0.3.1を発行しました。<br />
<a href="https://www.cubeatsystems.com/ntshell/">https://www.cubeatsystems.com/ntshell/</a> の<a href="https://www.cubeatsystems.com/ntshell/download.html" target="_blank">ダウンロード</a>からダウンロードできます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-SDioBe1Kqko/VySnFFFhVyI/AAAAAAAADso/8UF3Vqapl_8PmMVqAq-grOpIJbODt5pVQCLcB/s1600/nts-on-lpc824.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://4.bp.blogspot.com/-SDioBe1Kqko/VySnFFFhVyI/AAAAAAAADso/8UF3Vqapl_8PmMVqAq-grOpIJbODt5pVQCLcB/s1600/nts-on-lpc824.png" /></a></div>
<br />
ET展のTOPPERSブースでプレゼンテーションをさせて頂いた時の資料に書かせて頂いた「ユーザーコマンド」なるものを実現する例として、NXP LPC824を題材にしたサンプル・プロジェクトを追加してあります。<br />
<a href="https://www.toppers.jp/docs/contest/presen2011_NaturalTinyShellTask.pdf#search='toppers+ntshell'">https://www.toppers.jp/docs/contest/presen2011_NaturalTinyShellTask.pdf#search='toppers+ntshell'</a><br />
<br />
今回のパッケージ・アップデートはざわさんのコメントを発端にしています。ざわさん、貴重なフィードバックをありがとうございます。shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0tag:blogger.com,1999:blog-1344337796673480398.post-3323679457199978012016-03-31T21:38:00.001+09:002016-04-07T17:45:49.417+09:00組込み機器の制御にStandard Commands for Programmable Instruments(SCPI)を用いる事を考える<h2>
<span style="font-size: x-large;">あらまし</span></h2>
<div>
組込み機器を設計すると、小さな規模の装置でも数十から数百を超える操作が簡単に生まれてしまいます。設計実装した機器が確かに意図したとおりに機能しているのかを確認しようと考えた場合、それら全ての操作に対して考え得る全ての組み合わせで実行しない限り、予期しない動作が生まれない保証はありません。特に機器側に何らかの状態を持つような設計が含まれる場合、人間が操作したのでは到底網羅出来ない数の組み合わせが存在する事になります。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-MltdApuJQpA/Vv0NVasKHRI/AAAAAAAADrs/apNFb9QTF_YT9NWFK2uE6O3LycZK4SIlQ/s1600/host-target.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="https://3.bp.blogspot.com/-MltdApuJQpA/Vv0NVasKHRI/AAAAAAAADrs/apNFb9QTF_YT9NWFK2uE6O3LycZK4SIlQ/s400/host-target.png" width="400" /></a></div>
<div>
<br /></div>
<div>
さて、エンジニアとしては自分の設計と実装が期待通りの動作をしているのか確認してから枕を高くして眠りたいところですが、その操作インターフェースが独自コマンド体系になっていると色々な弊害が出てきます。例えば、「そもそも操作を自動化できるコマンド体系になっていない」、「独自の概念に基づく操作が並べられており第三者の理解が難しい」、「機器側の状態にコマンドの実行結果が依存しすぎる」など。ついつい作ってしまう独自コマンド体系によって自動化が困難な状況も自ら作り出してしまう事になります。おろろ・・・これでは枕を高くして眠れない・・・。</div>
<div>
<br /></div>
<div>
ということで、「何か代替案はないかなぁ」と調べ始めたのが今日のお話。</div>
<div>
<br /></div>
<h2>
<b><span style="font-size: x-large;">Standard Commands for Programmable Instruments(SCPI)</span></b></h2>
<div>
Standard Commands for Programmable Instruments(SCPI)とは、プログラマブルな計測器をコマンドで操作するために作られた規格です。独自の操作体系で作られた数多くの機器を制御するのが難しかった背景から策定されたもので</div>
<div>
<ol>
<li>同種の二つの計測器が存在した場合、同一の制御方法を持つ(垂直互換性)</li>
<li>二つの測定器では計測手法が何であるのかに依らず同じ計測が可能である(水平互換性)</li>
<li>同じ機能を持つ二つの計測器では同じコマンドで操作できる(機能互換性)</li>
</ol>
<div>
という3つのコンセプトがベースになっています。</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-5NxT_6WA1G4/Vv0WVXpJQGI/AAAAAAAADr8/nPzez3KgAl8RtBVrWN7BeLtRkbmhW5rNw/s1600/model-of-a-programmable-instrument.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://1.bp.blogspot.com/-5NxT_6WA1G4/Vv0WVXpJQGI/AAAAAAAADr8/nPzez3KgAl8RtBVrWN7BeLtRkbmhW5rNw/s400/model-of-a-programmable-instrument.png" width="400" /></a></div>
<div>
<br /></div>
<div>
実際に規格に書かれたプログラマブル計測器のモデルを見ると計測器のみならず、様々な組込み機器でも再利用可能に思えてきました。上記のモデルで言うと、Measurement Functionは入力系統、メモリは文字通り、Signal Generationは出力系統です。要するに入力された信号がメモリに入り、計算されて出力されるというコンピュータシステムそのものなのです。</div>
<div>
<br /></div>
<div>
例えば、オーディオを処理するような装置を仮に作った場合、上記モデルで言うところの上段は入力(録音)系統、下段は出力(再生)系統になるわけです。実際、規格文書の例は車台ダイナモメータのモデルが示されたおり、ちょっとやってみたくなる素材としても面白い内容になっています。どのような装置であっても、広義の意味で測定器と言えるのでその応用の範囲は広そうです。</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-Vmv7mHj2bvw/Vv0ZufEVWUI/AAAAAAAADsI/OibXk_3FbkMngurFNVxqatlTShOAm0kVg/s1600/scpi-chassis-dynamometer-model.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="393" src="https://3.bp.blogspot.com/-Vmv7mHj2bvw/Vv0ZufEVWUI/AAAAAAAADsI/OibXk_3FbkMngurFNVxqatlTShOAm0kVg/s400/scpi-chassis-dynamometer-model.png" width="400" /></a></div>
<div>
<br /></div>
<div>
という事で、何か作ってみたくなる素材のお話しでした。</div>
<div>
<a href="http://www.ivifoundation.org/docs/scpi-99.pdf">http://www.ivifoundation.org/docs/scpi-99.pdf</a></div>
shintahttp://www.blogger.com/profile/02376749777898637349noreply@blogger.com0