職場発信用のFacebookに書いたことをさらに詳細にして書き直します。

https://www.facebook.com/matsuka.corestaff

 

 EXCELのセルの指定法は、RANGEだと「A1」つまり縦がCollumで横がRowと呼ばれる。しかしCellsプロパティだとCells(1,"A")で逆配置となる。これはCollumとRowを呼ぶ「視点」が違うことで、EXCELの代々のプログラマーでも見解が違ったことを意味すると思う。私は縦列を「Row]と呼んでいる。また下でも言及している列の番号付け(A,B......Z,AA,AB,,,)は人間の直感でわかりやすい表記法と思う。しかし、これを数値で考えたいときには、イレギュラーな26進法であり、簡単に数に直せない。横列の番号は値なのに縦はアルファベットとは、開発当時の気配りを感じえない。

 私の業務ではエクセルで表を見ながらそのデータを処理する必要があるので、CSVファイルにしてテキストで処理すると効率的な場合がある。エクセル内はVBAが使えて結構便利なのだが、数百ものファイルを一括処理するのはCSVファイル(もともとその形式で登録される)がいい。

 C言語でCSVテキストを処理するときは1行づつ読み込んで、エクセルの列番号に対応した配列を作らねばならない。しかしここで配列の位置を指定するときは”AA”を27としなければならない(しかも配列は0から始まるので、配列[26]となる)・・・。

 簡単にアルファベット番号を数値に出来ると考えたのが間違いだった。「A」は1番目であり、「Z」は26。つまり26進法だが、Zの次は「AA」(27)となり、26までは一桁なのに、「ZZ」(702)まで二桁だ。こんなヘンタイな進法は見たことがない。幸い下に示した たかみんつ さんのブログで対照表があるが、C言語で扱うときこの表を持つのはメモリ的にもプログラマの矜持的にも不本意だ。よってなんとか自力でアルゴリズムを見つけようとした。

 

 下が試行錯誤して作ったC言語での式だ。先人が既に作っているかと思い検索したが、見つからなかった(Githubは見ていない)のでひょっとすると、世界初のマイクロソフトのEXCEL囲い込みへの挑戦となるのかもしれない。誰かのお役に立てば幸いだ。3桁以上は検証が面倒で気力がなくなった。列「AB」なら一桁目の *word は「A」、二桁目は「B」とする。コンパイラによっては日本語の変数は使えないので注意。

 

char word[]="AB";

char 一桁目,二桁目;

int 桁数;// word の桁数(二桁なら2)を入れる変数

桁数=strlen(word);

switch( 桁数)
{ case 1:
result = 25 * ('A' - 'A') + (*word - 'A');
break;
case 2:
一桁目= (*word);
二桁目 = (*(word + 1));

result = ( 25 * (一桁目- 'A' + 1) + (一桁目- 'A' + 1) ) + (二桁目- 'A');
break;

default: printf("[VBA_alphabet_to_number]VBA縦配列の3桁には対応してません!誰か作ってね!\n");
return (0);//vba row index starts 1
break;

}

エクセル列番号対応表(たかみんつ さん) のブログ

https://takamin.github.io/techtips/xlsColNumMap

 

 

 ARDIUNO UNOが手に入ったので、EnOceanという無線機器の信号を受信してなにか出来ないか、とARDIUNOに関してはアマチュアながらいろいろやってみました。

 ARDUINO UNO(下)とシールド(上)とUSB400J

 UNOに付いているUSBのメスコネクタはPCと接続して、給電とクロス・コンパイルしたオブジェクトをUNOにロードするためのものです。EnOcean無線受信機はコアスタッフのサイトで売っているUSBのドングル型のUSB400Jというデバイスが使いやすいので、USBインターフェースを持ったシールドを購入する必要があります。CQ出版社から出ている「電池レス無線マイコンEnOcean・・」というムックにいろいろと使い方が出ていますので一読をお勧めします。EnOceanの電文のパーシングは、このムックの126ページから乗っているサンプルプログラムを参考にしました。Arduino IDEの場合、ソースファイルは .cpp としないとちゃんと読んでくれません。EnOceanとは自家発電素子で動くセンサーの無線ネットワークのシステムを指します。

 アマゾンでUSBホストシールドと検索すると、1700円ぐらいで手に入りました。これを動かすためのUNOのドライバーは、Githubにあります・・・が、なんとシールドのサポートは打ち切られているようです。他に探しましたが、USB変換ICがFTDIでなかったりして、かつ中国製で大量に出回っているようなのでこれを使用しました。

 まず、Ardiuno の開発環境をArdiuno正式サイトからDLしてPCにインストールします。そしてGithubからドライバのZipをDLして開いたEditorからインクルードします。私が参考にしたのは、FILE>スケッチ例>USB HOST Sheild Library 2.0>ftdi>USBFTDILoopback で、シールドのUSBから接続した機器とシリアル通信をするサンプルが開きます。簡単に外部機器とシリアル通信出来ると考えていたのですが、検索してもPS3やマウスの接続記事ばかりで、本格的にシリアル通信して使っている人はいないんじゃないか、などと思ってしまいます。

 外部機器とのシリアル通信のログは、TOOL>シリアルモニタ を起動すると新しい画面が出てそこに受け取った文字が表示されます。PCと通信する速度と、外部機器(USB400J)の速度が異なる場合、うっかりすると文字化けします。USB400Jが出力する電文はオブジェクトですが、シリアルモニタはテキストに直してくれます。

 シリアルモニタに表示されたUSB400Jが受信したデータ

 EnOceanはいろいろなセンサーが製品化されており、それぞれの製品は用途によってEEPという機器プロファイルを設定されてます。つまり、ロッカースイッチ(押すとカチッと言ってON/OFFする)、ドアセンサー(マグネット磁界の検知)、温度センサー、などです。EEPによって電文のパーシングから何が信号を送ってきているのかが判別出来るのです。

 ARDIUNOのEditorで開いたサンプルは.ino というファイルですがテキストでも開けます。すべてをメインファイルでやっても良いのですが、それでは煩雑になるので、EnOceanLibというファイルを作って分割コンパイルを行いました。

 Ardiuno Editorはブレークポイントなど設定できるしろものでないし、printf がサポートされていないのでSerial.print()というCPPで書かれたクラスを使います。中に入れる変数のフォーマットを整えるために sprintf(text,"data %s received!\n",data); とペアで使いました。

 ・・・(切った張ったの苦難の時間)
 ついにEnOceanのロッカースイッチの信号を基盤のGPIOで動かすことに成功!・・と言っても、単にUSBから来た電文によって digitalWriteというAPIを叩いたに過ぎませんが。LEDを点滅させたかったのだが、5Vに直接LEDの足を突っ込んだせいか、CPUが止まってしまう・・また、「LOW」ステートのはずが0.1V 付近をフラフラします。「ON」だと4.7Vで安定しています。よって電圧を図る写真を撮ってエビデンスにすることにしました。確かにLEDの順方向電圧は2~3Vだが、電流を流しすぎると内部抵抗で電圧が上がりCPUのIOとの電流が平衡するのが普通だが、経験から言ってこのUNOの出来が悪いと推測します。(最大定格を無視する奴
 これでEnOceanセンサーの受信は、Windows10、Ubuntu、ARDIUNO、RaspberryPiで成功しました。

ソースコードは次の項で公開する予定です。

ロッカスイッチをクリックしてUNOのGPIOをHI-LOさせる

 

高城剛さんの日本のTVに関する分析は面白い。が、自民党との関係はちょっと疑問だ。

 

 私も私見を書いてみるが、自民党の政策の一部かは知らないが、TV番組の制作会社と電通などの独占企業の密着がその問題の原点であることは間違いない。

 お笑いや一癖あるコメンテータの趣味的な登用は旧ソ連の官僚主義そのものの様だ。お茶の間の衆愚的な視聴者にも問題はあるだろう。日本の成長期に疲れ果てたか、考えることを日本の視聴者は嫌う。これも問題。

 

 アメリカに目を向けると、Showtime、HBOなどの制作会社がとても面白い連続ドラマを造っている。TVドラマというと日本では安っぽい制作金を掛けないという印象があるが、彼らは映画を作るのと同じくらいの周到さでコンテンツ造りをしている。そこには役者の層の厚さどころか脚本家の積極的登用、協力会社の多様性など、日本では実現不可能な構造を持っている。

 

 日本では国民的アイドルなる概念があるが、そればかりのような気がする。視聴者も考えるべきだ。