きれいに制御されている

Rover MEMSからのデータの読み出し,ちょこちょこと作り込みの甘い部分はあるものの,データは収集できるようになったので,今日の遠出の往復の際のデータを記録し,手作業で視覚化してみた。

これは豊田から名古屋へ移動した際のデータの抜粋。

灰色の幅ひろいデータは酸素濃度センサ値。数値で見たときはかなりばらついているんじゃないかと思ったが,グラフ化してみたらきれいに一定幅に収まっている。青はエンジン回転数,橙色は蓄電池電圧。一箇所,異常値(20V)がある。定電圧装置が故障しかかっているのかなと思ったが,その瞬間のエンジン回転数は863rpmなので,発電電圧がそれほど上がっているとも思えない。コイルタイムなるものも記録をとったが,みると,蓄電池電圧の上下に反比例して変動している。MEMSの解説文書によれば,インジェクタ方式の制御ではエンジン回転数とバッテリ電圧に応じて点火装置の通電時間を制御しているとのことなので,このことなのだろう。但し,その文書では3.0から3.5ミリ秒の範囲で制御しているとのことであったが,手元のデータでは4.58から6.17ミリ秒となっている。謎。

ちなみにエンジンルームでのコネクタと電線はこんな処理。

車内側は基盤むき出しです。

ひっかけて短絡しないようエポキシ樹脂で適当にかばってあります。

ECUデータ読み出しその後

手が空いたときにちょこちょこと進めてきたRover Mini 1.3i のECUからどデータ読み出しプログラム,一段落しました。macOSで動かす IoT アプリを関数プログラミング言語Haskellで作るというかわった取り組みです。

これまでの経緯

もともとは,自分のMini 1.3i で出ている不具合の原因究明の参考情報をとりたいがためにはじめました。不具合は,具体的に はアイドリング中にエンジン停止する不具合が時々発生している他,アクセルを踏み込むと,特に上り坂で1800rps付近でエンジンが瞬停(?ノッキング?)するような現象が雨の日や標高の高い山間地でよく発生するような状況です。

  • 下記のCollin Bourassa氏のページで掲載されていた情報をもとに,自分のMini 1.3iに搭載されているECU接続用のUSB-シリアル変換ケーブルを作成した。変換チップ付きUSBケーブルは電子工作ではおなじみ秋月から購入し,自分で電線をはんだ付け。またECU側からの信号線はコネクタは通販で大垣の某事務用品店から購入,電線は大須の電気街で耐熱電線を購入して,自分ではんだ付け。
  • 上記接続ケーブルを使い,MacBook Airにのせてある仮想ソフト上のWindows XP/10 にてMEMS Gaugeを動作させることができた。
  • とりあえず,この環境で,しばらくログを取ってみた。上記の不具合との関連はわからないが,時々,各センサの値がおかしな値となるほか,バッテリ電圧も降下する様子。また,突然コネクトが切れ,再接続をしなければならない現象も発生。かなり電装系にトラブルを抱えている模様。
  • まずは,しばらくテスタを車内に持ち込み,シガレットプラグで電圧をモニタリング。当初は特に不具合はなかったが,そのうちエンジンの回転数に合わせて電圧が比例して変化する現象が発生。修理業者さんに見てもらったところ,発電機の定電圧化装置が壊れていたので修理。
  • エンジン停止が頻発したため,一時期,修理業者さんに長期入院させる。この頃,業者さんも発電機交換やECU点検・交換など様々な取り組みをしていただいたが,現象はおさまらなかった。鉄製の部品に穴の空いた場所を電線が走っており,その部分の被覆が剥けているのを見つけていただき,補修していただいた折はしばらく現象はおさまったが,その後復活。
  • また,ECUのコネクタ部分の接触が悪くなっているかもと爪をおこしていただいたりした後,やはりしばらく現象はおさまったが,その後復活。
  • 修理業者さんいわく,動力系に不具合はなく,この年式にしては状態が良いとのこと。
  • 毎回,車中にMBAを持ち込み,仮想ソフトを立ち上げ,Windowsを走らせ,USBポートをWindows側に接続し,MEMS Gaugeを立ち上げ,接続させ,ログをとる,という一連の作業をだんだんわずらわしく思うようになり,macOSのTerminal.appで直接動くものを作ることに。macOSで動けば,Raspberry Piに簡単に移植できるだろうから,気軽に使えるようになるだろうという目論見。
  • どうせやるなら新しいことに挑戦ということで,関数型言語Haskellで作ることにする。IoTと抽象化・遅延評価などというHaskellの特徴はあまり相性が良いというわけではないが,だからこそ誰もそんなにやらないだろうということで挑戦。
  • HaskellでUSB−シリアル変換ケーブルの通信をするのにOSのシステムコールを使うかとも思ったが,serialportというライブラリをHackageで見つけ,これを使うことに。まだHaskell環境に慣れていなかったため,当初はうまく自動で組み込めず,ソースを自分のプログラムのソースに移して動作させ始めた(その後,パッケージ管理の仕組みを学んで,外部ライブラリとして管理できるようになった)。
  • 時間の合間合間を見てMEMS Gaugeのソースを参考にしながら接続アプリを開発。当初は初期化コマンドは通ったが,コマンドに対する反応をうまく拾えなかった(4バイト読み込み指定でも2バイトしか拾えないなど。ECU側が数10MHzで動いているし,9600bpsという速度なので,タイムアウトの設定かといろいろ変えてみたが,結局,1バイトずつ読み込むことで解決)。
  • コマンド7Dで得られるデータ数が,ずいぶん少ない14バイトであることが判明(MEMS Gaugeは32バイトを設定している)。MEMS Gaugeのサイトはある程度年式の新しいモデルに対応していたが,こちらは1992年に買った,クーラー付きの日本モデルであり,別のサイトで見るとECUのモデル番号も桁数からして違っている(うちのMiniのECUモデルを表す4バイトの値は39 00 00 5Cという値であり,おそらく部品番号 MNE10078 の, Manual  SPI – Japan – Cooper 向け)。

ECUのログを見ると2016年4月3日のものが残っていたので,遅くともその頃から実際に試行錯誤していたはずだが,記事として出てくるのは2016年から。Amazonの注文履歴では2013年に入門Haskellを,2014年にはReal World Haskellを,2016年にはRaspberry Pi 2Bとディスプレイを発注した記録が残っている。MEMS Gaugeのタイムスタンプは2016年2月。また,非公開の書きかけ記事で関数型言語プログラミングのデザインパターンに関するものが2015年5月2日付けで見つかった。HaskellをECUデータ読み出し用に使おうとしだしたのは2015年から2016年にかけてか。

以下,魚野のサイト内ページです。

Androidで動くPDAのGeminiや,Windows10で動くGPD Pocket でありもののソフトを動かしてもよいのだけれど,ログを解析するのにやっぱりmacでやりたいのと,日本仕様ECUの対応を組み込むのが楽という点で,自作を続けます。

今後の予定

  • パフォーマンス計測と改善。現在は80と7Dのデータを読み込んで表示する1周期に400ミリ秒程度。非同期IO・マルチスレッドにしてもよいのだが,どうせデータを待っている間にmac側がすることもないので,シングルスレッドの基本線は変えない予定。改修はHaskellのチューニングの勉強として,読みづらい表現の変更や例外処理の改善(ByteStringでindexの指定を間違うとHaskellといえど実行時エラーで止まってしまう—止まってしまうのは黙って意図しない処理が行われるよりよっぽどマシなのだが—のでその対策をきちんとする)など。
  • 上記と関連するが,ちゃんとHaskellらしい構造に。今はファイルハンドル情報(を含んだSerialPort型の情報)をあちこち持ち回っているが,本来,カプセル化すべき。文字列の++演算も遅いだろうし,メモリリークの現状も把握できていない。たかだか1回あたり数十バイトの情報を保持するのにByteStringを多用してループをまわしているので,かなり効率の悪い構造になっていてガベージコレクションの時間もかなりとなれているのではと想像する。
  • 出力はcsv形式なので,これをもとに別途GUIを使った表示の仕組みを用意する。本体がHaskellなのでElmを活用?FRPを使ってGUIにもHaskellを使う?昔ながらのcursesなどにしてしまう?
  • Raspberry Pi と得体の知れない互換ワンボードが用意してあるので,そちらで動くようにHaskell環境,OS環境,ディスプレイ環境を整え,車内に常時備え付けられるようにする。ケーブルは今の半自作USBシリアル変換ケーブルをそのまま転用。
  • 広域低電力WANなどの利用で1992年式Miniをコネクティッドカーにする?
  • 関数型言語でのIoT対応について,何かしら発展の方向性を考えてみる(たくさんのセンサからいろんなデータが来て,それを処理していく。また,センサからデータを拾う頻度がまちまちになるだろう。そして,データの処理について,おそらくは柔軟にユーザーに変更できるようにしたくなるだろう。
  • モナドなどは概念をある程度理解し,使えるようにはなった(作れるまでには至っていない)ので,Haskellでのモナド,並行並列処理,GUI,DSL,FRPを使いこなせるように。
  • また,関数型言語プログラミングでの抽象化やモナドなどの考え方は,生物の意識という問題と何かしら関係がありそうな気がするので,それを検討してみる。

参考にした資料など

ECUとの情報のやりとりのプロトコル等

きっかけは忘れましたが,このプロジェクトを始めるに当たり,大いに参考になったのは,独自解析でRover MiniのECUからの情報を読み出すプログラムを公表していたColin Bourassa氏のページ。

  • Rover MEMS 1.6 diagnostic Protocol以前はとある大学のサイトに掲載されていたColin Bourassa氏によるRover MEMSの診断プロトコルに関するページ。今はbearinghead.comというドメインに掲載されている(記事の掲載日時は2014-04-21となっているが,2015年6月と12月に追記されている)。オープンソースで無料の診断情報ソフト(MEMSGauge)やライブラリ(librosco)が紹介されている他,接続用のシリアルケーブルの作り方(利用するUSBシリアルチップやコネクタの規格・入手先情報を含む),ECUのプロトコルなどの詳細が紹介されている。このページがなければ,今回のプロジェクトはなかった。
  • MEMS Diagnostics (Google Group) … 上記サイトからリンクされている。2015年に開設された模様。
  • MG Rover MEMS Modular Engine Management Explained (ビデオ)…最近見つけた,おそらく販売店向けなどのために作られた技術解説ビデオ。ECUがどんな情報をもとに何を制御しているかを簡単に解説している。
  • Display/diagnostics utility for Rover MEMS 1.6 ECU…github内にあるプロジェクト
  • MEMS 1.6/1.9 ECU diagnostics…android用の診断ソフトを紹介している。androidは興味の対象外なので一応あるということだけ知っておく。

シリアル通信について

かつて学生時代,パソコン通信華やかりし頃の1980年代後半,PC-9800シリーズなどのDOS上でTurbo Pascalや,Pascalを開発したWirthが後継として開発した言語,Modula-2を使って端末エミュレーションプログラムなどを作っていました。ですのでシリアル通信の大枠は理解しているのですが,今回はmacOSというUnix系のOSで,しかもUSBポートを通じてのシリアル通信ですので,いろいろよくわからない点があります。そこでまずはLinux Serial HOWTOなどであらためて基礎から勉強してみました。

その他見つけた情報

車のSNSサイトみんカラや自動車販売・修理業者さんのサイトに,Androidoのソフトと自作ケーブルを使った接続事例,市販されているらしい簡易モニタでの診断事例が時々紹介されている。

そろそろガソリンエンジン車の終焉も近いでしょうし,カーシェアリングなども東京ほどではないですが名古屋でも充実してきつつありますので,いつまでMiniを所有し続けるのかはわかりません。そもそもデータを吸い出しても400ミリ秒単位では,現在出ているような瞬停みたいな現象や前触れのない回転数の低下の原因究明に役立つものでもなさそうですが…。まぁ工学部出身の元エンジニアとしては,こういう技術探求がしたくなるのです。

 

 

VisualStudio を使って Mac で F# の始め方(MSの資料の抄訳)

以下は,Microsoftのこちらのページ(Get started with F# in Visual Studio for Mac)の抄訳。原文は2017年2月13日版。

Visual Studio for Mac IDEは,F# および Visual F# をサポートしている。まずVisual Studio for Macをダウンロードする。この文書は,Visual Studio Community 2017 for Mac を使うことを前提にしている。

F#のインストール

Visual Studio for Mac のインストールでは,F# そのものは,初期設定のままでサポートされているので,特に何かをする必要はない。

コンソールアプリケーションの作成

Visual Studio for Mac で最も簡単なアプリケーションは,コンソールアプリケーションであるので,以下にその作成方法を示す:

  1. ファイルメニューからNew Solution を選択。
  2. New Project dialog が現れ,コンソールアプリケーション用には二種類のテンプレートが表示される。一つは,Other -> .NET にあり, .NET Framework である。もう一つは, .NET Core -> App にあり,こちらは .NET Core を想定している。この文書で書かれている内容に限っては,どちらを選んでもよい。console app を選ぶ際, C# から F# に切り替えてあるか,確認すること。
  3. プロジェクトに名前を設定し,必要なオプションを選択する。オプションの選択に応じて,プレビュー欄に表示されるディレクトリ(フォルダー)構造も変化する。
  4. Create をクリックして完了。F#プロジェクトがソリューションエクスプローラ内に表示される。

コードを書く

Program.fs という名前のファイルを開き,その中身を以下のように書き換えよう:

module HelloSquare

let square x = x * x

[<EntryPoint>]
let main argv =
    printfn "%d squared is: %d!" 12 (square 12)
    0 // Return an integer exit code

上記のコード例では, square 関数は x という引数を一つとり,それを自乗する関数として定義されている。F# は 型推論をするので,x の型を明示しなくともよい。F# コンパイラは,掛け算がどのような場合に有効であるかをわかっているので, square がどのような条件で呼び出されるかという情報を元に,x に適切な型を割り付けることができる。 square 関数名の上にマウスを動かすと,以下の情報が表示されるはずである。

val square: x:int -> int

これは,関数の型シグネチャである。意味するところは,「square は,整数型の引数 x をとり,整数型の結果を出力する関数」である。 square が int を出力すると特定されているのは,掛け算が特定のいくつかの型のみに有効な演算だとコンパイラがわかっているので,このことをもとに,この時点では int を選んでいる。だが,引数の型を別の型,例えば float に変えたとしたら,関数の型シグネチャも自動的に変わる。

別に,main 関数が定義されているが,これは EntryPoint 属性により,F#コンパイラはプログラムの開始位置をここからだと認識する。以下,コマンドライン引数がこの関数に渡され,返り値として(典型的には 0 なのだが,)整数値を出力するC言語タイプのプログラミング言語の作法に則った記述が続いている。

上記の例では,square 関数を呼び出すにあたって,引数に 12 をあてている。F#コンパイラは,これをもって square の型を,int -> int (つまり,この関数は int 型の引数を一つとり,int 型の返り値を出力する)としている。printfn は,フォーマット文字列を使用して,引数を埋め込んだ文字列と改行を出力する,C言語タイプのプログラミング言語ではおなじみの関数と同じ働きをする関数である。

コードを走らせる

メニューで表示されているRun の中の Start Without Debugging を選ぶと,プログラムが開始される。デバッグ機能は無効で,すぐに結果が表示されるはずだ。

Visual Studio for Mac が表示したコンソールウィンドウ内に,以下のように表示されただろうか:

12 squared is 144!

F# インタラクティブウィンドウを使う

F#インタラクティブウィンドウとは,コードを入力するとその場で結果が得られるコンソールウィンドウのことである。これを使うには,先程の square 関数の定義記述部分を選択し,メニューの Edit の中の Send selection to F# Interactive を選ぶ。これにより,選択したプログラムコードが F# インタラクティブウィンドウに送られる。別の方法としては,コード選択の後,右クリックで出てくる Send selection to F# Interactive を選ぶという方法もある。このように表示されるはずだ:

>
val square : x:int -> int
>

この表示は,先程見た square 関数の型シグネチャと同じ内容である。square 関数が F# インタラクティブプロセスの中であらためて定義されたので,以下のように別の値を引数として呼び出すことが可能となった:

> square 12;;
val it : int = 144
>square 13;;
val it : int = 169

上記の例では,関数が呼び出され,その結果が it に束縛され,it の型と内容が表示されている。各行を ;; で締めくくっているが,これは,F# インタラクティブ環境に対して関数呼び出しがここで終了していることを知らせている。F# インタラクティブ環境で新しい関数を定義することもできる:

> let isOdd x = x % 2 <> 0;;
val isOdd : x:int -> bool
> isOdd 12;;
val it : bool = false

上記の例では,新しい関数の isOdd を定義している。 int 型の引数を一つとり,奇数かどうかを判定する関数である。さまざまな引数で呼び出してみよう。関数の中で関数を呼び出すことも可能である:

> isOdd (square 15);;
val it : bool = true

パイプ演算子( pipe-forward operator )を使って,値を関数に流し込むこともできる:

> 15 |> square |> isOdd;;
val it : bool = true

パイプ演算子 ( The pipe-forward operator ) については後述する。インタラクティブ環境について,詳しくは Interactive Programming with F# を参照のこと。

次は…

F#言語の主要機能については,Tour of F# や F# Guide を参照のこと。

OmniFocus 3 for iOS – OmniFocus 2 for Macとのデータ互換性

OmniFocus 3 for iOS のデータがOmniFocus 2 for Mac のデータとして使えるかが公式サイトに出ていたので,自分のために要約。結論としては使える。但し,いくつか注意点あり。元になったOmni社のページ「Using OmniFocus 3 for iOS with OmniFocus 2 for Mac」はこちら。現地時間2018年6月7日版に基づく。 “OmniFocus 3 for iOS – OmniFocus 2 for Macとのデータ互換性” の続きを読む

Threepenny-gui とは

Haskell で Rover Mini の ECU データを拾うプロジェクト,ぼちぼち進めています。

開発は MacBook Air 11” でやっていますが,実際の稼働ではラズパイなどワンボードの小型PCでやろうかと。Haskell はあちことのプラットフォームで動くのでいいのですが,問題はGUI。

Real World Haskell などは汎用GUIライブラリの呼び出し例なども掲載されていますが,macOS で他のプラットフォームと共通のデザインだとものすごい違和感を感じます。また,GUI の世界では最近,Functional Reactive Programming という新しい考え方に基づく実装例も増えてきています。そのものずばりの名前の本(Functional Reactive Programming , Manning Publications )も2016年に出版されたので,計算機科学分野の英語の復習の意味も含めて電子ブックを買い求めて読み進めています(ちなみに最近,書店店頭で翻訳本を見かけましたが,意味が読み取りにくい翻訳となっている箇所が多数あったため,購入は見送りました)。

そこで今回のブログ記事では,Haskell の GUI 環境の中でも FRP が使え,ラズパイ でも macOS でも使えそうな Threepenny-gui ライブラリについて調べてみることにしました。

以下はHaskell wiki Threepenny-gui より。2018年1月17日15:00 (JST) 閲覧した際の記述内容に基づいたもの。

1. Threepenny-gui とは

Threepenny-gui とはウェブブラウザーをディスプレイとして見立てた GUI (Graphic Interface Library; グラフィックユーザーインターフェース) のフレームワークである。

以下の機能を持つ:

  • 容易な設置 いまどきは誰でもブラウザをインストールしている。従い、threepenny-gui ライブラリを hackage からインストールするだけでよい。このライブラリは多数のプラットフォームで動作する。
  • HTML + JavaScript ユーザインタフェースを作成する際、HTMLの機能をすべて使用することができる。これは素晴らしいことではあるが、うっかりするとはまり込んでしまうことにもなりかねない。それゆえ、このライブラリには、CSSを使用しなくてもユーザインタフェースを素早く構築できるよう、レイアウトコンビネータが含まれている。またFFI(Foregin function interface; 他言語接続機能)を利用してブラウザの中でJavaScriptを走らせることも可能である。
  • FRR ( Functional Reactive Programming ) により、ユーザーとのやりとりのプログラミングでイベント駆動式のスタイルを伝統的な手続き型言語で構築するときに陥りがちなスパゲッティコードを避けることができる。Threepenny は FRP ライブラリを持っているが、それを使うか否かは自由である。便利と思えばFRPを利用してもよいし、袋小路にはまり込んだと思ったら FRP を使わなくてもよい。

2. Threepenny-gui ができないこと

  • ウェブのフロントエンドではない。サーバはローカルホストで稼働することを想定している。(ネットを経由する)ウェブアプリとして使用するには遅延が問題となるだろう。つまり、ローカルネットワークの多数のユーザーを想定した場面には向いているということ。サンプルコードの Chat.hs example を参照。
  • JavaScript や HTML のライブラリではない。Threepenny-gui は Haskell の API を備える GUI フレームワークであり、ドキュメント・オブジェクトモデルについて様々なことを抽象化している。Threepenny-gui を使うにあたっては、 HTML については多少の知識が必要だが、JavaScript の知識は必要ではない。もっとも、外部クライアントライブラリを活用とする場合はその限りではないが。

ウェブアプリを作ろうとしているなら、他のプロジェクト(たとえばFay, GHCJS, Haste など)を参照のこと。Threepenny の API はこれらのプロジェクトにいくらか影響を与えている、もしくは将来与えることになるかもしれないが、現時点ではそこ(ウェブアプリ開発向きの機能)に焦点はあたっていない。

3.開発経緯

現在、活発に開発が行われいる状況であり、主要なAPIについても将来の版では改訂されているかもしれない。このプロジェクトの目標はGUI プログラミングをできるだけ簡素にすることにある。そのためにやや実験的に様々な挑戦を行っている。

  • 2017.04.29 threepenny-gui-0.8.0.0 公開
  • 2016.09.16 threepenny-gui-0.7.0.0 公開
  • 2015.05.15 threepenny-gui-0.6.0.2 公開
  • 2015.05.13 threepenny-gui 0.6.0.1 公開
  • 2014.10.04 threepenny-gui 0.5.0.0 公開
  • 2013.11.21 threepenny-gui 0.4.0.0 公開
  • 2013.09.07 threepenny-gui 0.3.0.0 公開

4. 応用例

Threepenny を使って書かれたアプリケーションの例

5. 現況と参考資料

Hackage からのダウンロード threepenny-gui

参考資料

フィードバック先および連絡先

github 上のソースコード

Haskellメモ というか,High Sierra と FTDI USB Serial メモ

以前からぼちぼち開発しているRoverMiniコンピュータデータ取扱用のプログラム,ので本日はその原因究明と対策実施。

現象

  • macOS X を High Sierra にしたら,FTDIのUSBシリアル変換機がマック上ではttyデバイスとして認識されなくなった。
  • 同じハードで仮想マシン上のWindows10では同変換器を検出し,正常にECUと通信できるので,マック上のドライバの問題と想定。
  • メーカー(FTDI社)の最新ドライバなどをインストールしてみたが,状況は変わらなかった。
  • High Sierra ではセキュリティ強化のため,場合によっては「システム環境設定」のセキュリティとプライバシー設定で,明示的に権限許可を与えないと動作しない機能拡張があるが,現時点では許可催促の表示は出ていない(ただし,当該催促は最初にその機能拡張が動作しようとしてから一定の時間以内にのみ表示され,その後は消えてしまうとのことなので,OSアップデート後にケーブルを初めて挿入した際,これを見逃した可能性はある)。

原因探索

ネットで検索した所,以下のことがわかり,ドライバが複数あって,衝突して不具合となっている可能性があるものと思われた。

  • Appleは,しばらく前(少なくとも Marverics )から,自社のFTDIチップ用ドライバを mac OS に含めて提供している。
  • 幾つかのサイトでは,FTDI社のドライバとApple社のドライバの切り替えを行って問題が解決したことを報告している。(例1例2例3例4
  • 両ドライバとも,kext形式で提供されている。
  • kextとは,加除可能なOS機能追加モジュールであり,sudo kextstatで現在使われているモジュールの確認ができる他,sudo kextload xx.kext でモジュールを追加することができる。
  • 当該ハードには,OSバージョンアップ前からFTDI社のドライバが入れてあり,機能していたが,こうした場合,High Sierraのインストールでは,(クリーンインストールであっても?)サードパーティー提供のドライバが新たな権限許可を与えずとも動作するようになっている模様。

対策

ドライバを一つにする。Apple社提供のものでまずは実験してみて,その上で,FTDI社のものを実験してみるかを判断することにした。実際の作業としては,以下の通り。

  • 存在しているドライバの確認。→/System/Library/Extentions にAppleUSBFTDI.kext 2017/08/25 14:20 6.0.0 がある。また,Library/Extentions に FTDI社のドライバ D2xxHelper.kext 2015/11/09 2.0.0 があった。
  • kextstat | grep FTDI で動作している機能拡張を確認。今回の場合はなかった(両方共読み込み失敗の様子)。
  • FTDI社のドライバを削除の上,マックを再起動。
  • 手動でAppleのドライバを読み込み(cd /System/Library/Extentions  -> sudo kextload AppleUSBFTDI.kext)
  • kextstat で機能拡張が読み込まれているかを確認。この時点では読み込まれていない。
  • ケーブルを接続。kextstatで状況確認→ドライバが読み込まれている。
  • /dev/ を確認。無事,認識され,/dev/tty.usbserial-DJ0… として表示された。

まとめ

  • 今回のトラブルの原因は複数の機能拡張(ドライバ)を設置したことによる競合。
  • 純正とメーカー製の二種類のドライバで機能・性能が違いそうなので,今後,機能・性能で不審な点があった場合,ドライバを変えてみるという策をとってみる必要がある。

以上

 

Haskellメモ Haddock

この説明は,Haskellの公式サイトの記述を魚野が自分のメモとして部分的に日本語化したもの。
詳細は下記サイト参照。
http://haskell-haddock.readthedocs.io/en/latest/markup.html

1 Haddockとは

Haddockとは,プログラミング言語,Haskellのソースファイルにコメントを記述することで,
自動的に参考用の文書を作成するシステムのこと。

2 Haddockの記法

2-1 トップレベル宣言

・トップレベル(関数の型署名や方宣言,クラス宣言等)での記述。
・「--|」という句で書き出すと,それ以降の部分はその直後の宣言に関する説明となる。

-- | The 'square' function square an integer
square :: Int -> Int
square x = x * x

・トップレベルとは
トップレベルの関数の型署名
型署名のないトップレベルの関数の定義
data 宣言
newtype 宣言
type 宣言
class 宣言
data family または type family 宣言
data instance またはtype instance 宣言
・別の宣言が続いた時は,後の宣言はHaddockに無視される。
・宣言の後にコメントを書くことも可能。

square :: Int -> Int
-- ^ The 'square' function square an integer
square x = x * x

2-2 宣言の一部分へのコメント

・クラスメソッド トップレベル宣言に同じ(「-- |」 や「--^」を使う)。
・コンストラクタ,レコードフィールド 同上

2-3 関数の引数

・「--^」を使う。

f :: Int -- ^ The 'Int' argument
-> Float -- ^ the 'Float' argument
-> IO() -- ^ the return value

2-4 モジュールの説明

・モジュールの説明は記述が多岐にわたることが多い。

{-|
Module : W
Description : Short description
Copyright : (c) Some Guy, 2013
Someone Else, 2014
License : GPL-3
Maintainer : sample@email.com
Stability : experimental
Portability : POSIX

Here is a longer description of this module, containing some
commentary with @some markup@.
-}

・各フィールド全てを記述する必要はない。重要度の順で記述すること。
・各フィールドの中身が二行以上になる時は,フィールドのラベル終了位置よりも右方から記述する。
・但し,冒頭に「--」を記述した際は例外(詳細は冒頭のURL参照)

2−5 モジュールの説明要素

・Module モジュール名
・Description モジュールの概説。
・Copyright, License, Maintainer, Stability できるだけ明示すること
・Portability OSの制約や必要なGHC拡張が記述されることが多い。

3 ドキュメントの構造

・各モジュールが輸出(エクスポート)している要素のみ説明文作成の対象とされる。
・輸入(インポート)されたモジュールで輸出されている場合も説明文作成の対象となる。
・3つの構造がある:セクション頭書,名前付記述,モジュール全体の再輸出

3-1 セクション頭書

・Class, Typeなどは同位のセクション,Type, A data type などはセクションの下位化
・「-- *」,「-- **」などで書き始める。*数はセクションの下位化

3-2 名前付記述

・名前付記述 二個目の「-- $XXX」以降の記述は一個めの「-- $XXX」の部分に置かれる。
XXXは名前)

3-3 ハイパーリンクと要素再輸出

・Haddockは説明文書作成の際,クラス名などを全てハイパーリンクつきにする。

サイトにssl証明導入

ブログ程度の運用しかしていない小さなサイトに必要性があるかどうかはわかりませんが,世の中の情報セキュリティ対策強化の動きに合わせ,一応,SSL証明書を入手し,設置することにしました。http://www.kuono.net だけでなく,https://www.kuono.net でもアクセスできるようになります(現在手続き中)。

導入したのは,ドメインの証明,つまり,このドメインがなりすましサイトにあるわけではないよという内容の証明なので,kuono.net がどこの会社・組織の所有なのかといったようなことは証明されているわけではありません。こういう証明書の発行手数料は,結構値段の張るものです。行政など公的機関がやってくれたらいいのにと思わないわけでもないですが,現在はセコムだとかシマンテックだとかの,大手民間事業者が発行してます。利用しているのは一番価格の低いランクのもので,大手IT関係組織の方あたりには証明にもならないよと笑われそうですが,サイトを利用したサービスをやっているわけでもないので,IT業界の流れをおっかけているという意味では,まぁこれでよいかと。

最近は,支援先の公式サイトのメンテナンスや記事追加支援ばかりで自分のサイトの更新を怠ってきましたが,大学での後期の講座も始まったことですし,6次産業化や認定支援機関としての経営改善計画策定支援など,関わっている業務でもいろいろ情報がたまってきていますので,ぼちぼち記事を追加していきます。

工業経営論第13回

2017年度前期の工業経営論第13回,テーマは標題は生産システムと経営。テキストから離れての講義であり,お膝元,愛知県内の事業者,トヨタに関連する用語が次々と紹介される。愛知県内の工業系の学生が興味をもちやすいテーマでもある。

質問一覧は以下の添付資料の通り。特に7つのムダについて興味を持つ学生が多かったようで,もっとも質問者数が多かった。

20170712工業経営論質問一覧

Haskellメモ inkey$を実現する

難しいことを簡単にし,簡単なことを難しくする,などといわれる純粋関数型言語 Haskell。かつてBasic 言語でプログラミングをしていた際によくつかったinkey$関数の実現方法を調べてみた。

inkey$関数とは実行されたときに押されている一文字からなる文字列を返す関数。キーが押されていないときは””が返ってきたはず(30年以上前の記憶なのでうろ覚え)。

以下のコード〜raspberry pi で動けばいいので,とりあえずはこんなコードで〜を macOS で動作確認したところ,おおむね期待通りに動作した。Windows でどうなるかは不明。

import Data.ByteString as BS
import System.IO

main :: IO ()
main = do
 hSetBuffering stdin NoBuffering -- set non buffering mode 
 keyscaned <- BS.hGetNonBlocking stdin 1 -- ::IO ByteString
 if keyscaned == BS.empty
 then main
 else do
 print keyscaned
 main