フォト
無料ブログはココログ

« 2018年3月 | トップページ | 2018年5月 »

2018年4月

2018年4月30日 (月)

表彰(2)

 最近とある会議で表彰案件が議題になったそうだ。

 だいたいこの手の案件は大した反対もないのだが、その時は違っていて、ある人が、かなり強く反対したというのだ。 その表彰はいかにも、ついでに感が強かったから反対意見は正論だ。

 現場の技術者を管理部門が表彰するというよくあるパターンで、管理部門の人も技術職ということにはなっている。 その中で反対したのは、他所の部署から来た技術職ではない人だったらしい。

 さすがに技術職でない人に「プライド」はないのかと言われれると、自称技術屋としては心中穏やかではいられない。 しかし、管理部門の人達は結局押し切ったようで、ついでの案件も表彰されたようだ。

 その表彰は結構立派な表彰状が貰えるくらいの表彰だ。 もし、自分がついでで表彰されたらどうするか考えた。

 正直なところ、「ついでの表彰」なら要らない。
「ついでの表彰なら要りません。」ではなく「謹んで辞退します。」と言っても波風が立つだろうが、辞退するだろう。

 表彰状はプライドは無いのかと言われてまで貰うものではない。技術屋としてそれくらいのプライドはある。

 実は、ついでで表彰されたことがあった。
チームでの表彰だったので、辞退しようと話し合っていたのだが、メンバーの一人が欲しいというので辞退しないことになった。

 その表彰状は最近火事で燃えてしまった。
正直なところ、表彰状が燃えて無くなっても、惜しいとか悔しいとか悲しいとか少しも思わない。

 貰って嬉しくない表彰状はそんなものだ。

 「人生に悩んだらアドラーを読もう。」の著者、岸見一郎氏は、褒める行為は上から下に向かって下す評価だとおっしゃる。

 つまり、今回の「ついでの表彰」は管理部門が現場を見下した行為だろう。
技術職ではない人に技術職にプライドはないのかと、正論を言われることより、現場を下に見ることの方が重要なのだろうか。



最近の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2018年4月28日 (土)

指示しないマネジメント <現場が考える>

指示しない"マネジメントが組織を変える!注目の軍隊式って? 働き方改革Lab (2017/12/6)

 元記事は、日経ビジネス 2010/9/13の「戦場の指揮官から学ぶ」 らしい。
日経BPの記事検索サービスから270円でダウンロードできるようなので読んでみた。

軍隊と言えば典型的な「上意下達」「官僚的」な組織というイメージだが、

伝統的な国と国との戦争を前提とした、上意下達の命令系統は過去のもの。現在の軍隊が直面しているのは、対テロリストなどの不確実な敵と、多国籍軍などの不確実な味方のなかでミッションを達成しなければならない、「不確実性を前提とした組織運営」です。欧米諸国の軍隊では、従来型のリーダーシップやコミュニケーションの取り方が徐々にうまく機能しなくなった結果、研究に基づいた大きな改革が実行されました。

らしい。

 今も前線に行って戦争をしている人たちは違うなあ。 現場の指揮官は、自分も死にたくないし、部下を死なせたくはないから、上意下達であるべきだと、言っていられない。 これが、前線に行かず後方にいるだけの人たちは、考え方を変えられないのではないだろうか。

 アメリカ陸軍のリーダーシップの基本は「Be Know Do」らしい。

Be:「どうあるべきか」品格:忠誠、義務、尊敬、無私の奉仕、名誉、高潔、個人的勇気
Know:「何(スキル)を知るべきか」
Do:「とるべき行動」

 自分で考えて行動するには、基本を理解しておくことが必要だ。
現場で部隊を指揮する時に困ったからと言って逐一お伺いを立てていたのでは、命令は遂行できない。 かといって、間違った判断をすれば、自分が率いる部隊だけでなく他の部隊も危険に晒しかねない。

 米国陸軍ではリーダーシップのあり方を考えなくてはならなくなった時に、品格とスキル、行動と言う3要素を定義することで組織的リーダーシップ教育を構築し直したのだ。

 判断に困ったときには、基本に戻って考えるようにすれば、判断を現場に任せたとしても大きく間違うことははない。 むしろ、現場のリーダーが自らの頭で考えることによって、結果として全体が同じ判断に基づいた行動をするようになるのではないだろうか。

 中央で少数(1人)の者が判断した場合の方が全体が同じ行動ができるような気がするが、判断を任された者がブレた場合には、現場への影響が多い。 中央から現場の末端に指示が伝わるまでにブレが広がる。 そのため、現場では昨日と言うことが180°変わったように感じることがある。 

 日本企業では今まで、幹部候補社員向け研修でも、財務やファシリテーションといった専門的な知識、スキルの習得に終始することが多かった。リーダー像を明確に定義したうえで、それに合致する人材を育てるための研修や人事制度は手薄だった。

ウチの幹部向けの研修はスキルの習得さえやらないからなあ。 ;_;)


最近の投稿】【最近の書籍・雑誌】【2017の投稿】【2016の投稿】【2015の投稿

〇〇の神様の仕事が無くなったら

 若い人は知らないだろうが、昔、通信士という職業があった。
今みたいに世界中どこでも携帯で話ができなかったから、離れた所にメッセージを送ろうとすると電波を使ってモールス信号で電報を送信したり受信したりしていた。(無線電信という)

 モールス信号の送受信は特殊技能だ。また、電波は貴重な資源だから扱うには専門知識が必要だ。無線の専門知識とモールス信号の送受信技能を持っていると認められた者が無線通信士で、国家試験を受けて無線従事者免許を取らなければならない。

 オヤジが三十数年前に就職した頃には無線電信の重要性は極めて低くなっていた。それでも職場にはまだモールスの神様と呼ばれている人がいた。しかし、通信手段は電話とFAXに変わっていたから、卓越した技能を使う仕事は無くなっていて、閑職に回されている神様がいた。

 一方で、無線の専門知識を生かして移動体無線や無線多重などの無線関係の仕事をしている人もいた。

 その頃はまだ、再教育するだけの時間的余裕もあったし、教育・訓練専門の部署で再教育を受けることができた。 閑職に回されていた人は再教育を受けなかったのだろう。

 特殊技能は技術の進歩の前にして、ある日突然価値の無い技能になったり、ある日突然専門知識が価値の無い知識になったりして、〇〇の神様と呼ばれていた人がある日突然普通の人以下になってしまう。

 技術を扱う仕事をしていると、そういう例を目の当たりにしてきた。

 今、特殊技能や専門知識をメシのタネにしている者にとっての脅威はAI技術だ。特殊技能や専門知識の価値が無くなる速度は30年前より速い。 遥かに速い。

 30年前と決定的に違っているのは、必要とされなくなった者の受け皿となる仕事は無くなっているということ。 閑職は無いし、専門的でない単純な仕事は真っ先に効率化されているかアウトソーシングされている。

 では、昔、電信技能の価値がなくなったときに無線の専門知識に価値を見出したように、別の特殊技能や専門知識を習得する方法はどうか?

 残念ながら、仕事が無くなってから、別の技能や知識を習得するのでは遅い。
特殊技能や専門知識の習得にどれだけの時間と労力が必要だったか思い出してみると良い。今時は人が技能や知識を習得する速度より、特殊技能や専門知識の価値が無くなる速度の方が速いのだ。

 特殊技能や専門知識の価値がなくなる前に別の特殊技能や専門知識の習得を始めておかなければならない。 因みに、マネジメントも技能と知識が必要だから、技術で食えなくなって始めたのでは遅い。技術屋崩れが使えないのはこのことに気が付いていないからだろう。

 困るのは、AIで業務を効率化して、浮いた人員を配置換えして別の仕事をさせようと考える管理者だ。今時、再教育していたのでは間に合わないことを、多くの管理者は気が付いていないようだ。

 AIで業務を効率化するのは良いが、簡単にクビが切れない職場では、食えなくなった者の仕事を考えておかなければならない。

 さもなければ、仕事のない神様だらけになってしまう。


最近の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2018年4月26日 (木)

あ、「やりがい」とかいらないんで、とりあえず残業代ください。

あ、「やりがい」とかいらないんで、とりあえず残業代ください。 日野瑛太郎 東洋経済新報社

Photo

日野瑛太郎氏は、

結局のところ、日本の職場が息苦しくて、ものすごく「働きづらい」と思ってしまう一番の原因は、「多様な価値観を認めない」という閉鎖的な態度にあると僕は考えています。

とおっしゃる。

 同感だ。この本に書いてあることは30年以上前から思っていることだったりする。 若い頃にこの本に書いてあるようなことを口出して顰蹙を買ったりもした。 KYだからつい思ったことを言ってしまうのだ。

 40歳限界説の話をすると何人かハマる人がいるようだ。 ウチは技術者向けのキャリアパスはないから、お仕着せの価値観に疑問を持っている人は考えるきっかけになるのだろう。 一方、既に社畜になっている人は「何言ってんのこのオジサン」かもしれない。

 さらに、日野瑛太郎氏は会社に依存することは危険だとおっしゃる。

社畜にされないようにするためには、自分が今勤めている会社への依存度をできるだけ少なくしておく必要があります。

例えば

  • 住宅ローン
  • 配偶者を専業主婦(専業主夫)にする

そして

  • その会社のある部門でのみしか通用しないような専門化され過ぎている業務

は会社への依存度が上がり社畜になる可能性が高まる。

 う~ん。当てはまる。(^^;

 文句を言いながら30年も勤務したのは自ら依存度を上げてしまったからか。


最近の投稿】【最近の書籍・雑誌】【2017の投稿】【2016の投稿】【2015の投稿

2018年4月24日 (火)

lcc1802

 以前書いた記事(CDP1802 (15/10/11))のコメントにCDP1802用のCコンパイラの質問があったので調べてみた。 

 結論は、出力されるバイナリが大きいので、RAMを十分載せておけば使える。

lcc1802

 CDP1802は入手したがまだ動かしていない。 (^^;
SBCを作ったとしても、おそらくtinyBASICでも動かしたら満足するのだろう。というわけで、CDP1802用のCコンパイラは調べていなかった。

 調べてみるとlcc1802が見つかった。
lccはOpen SourceのコンパイラでターゲットCPUはAlpha,SPARC,MIPS,x86に対応している。 lcc1802はlccをCDP1802に対応させたもので、COSMAC ELF Membersip Cardのアドオンシールドにarduinoを持たせた 1802 olduino 用に作られたもののようだ。 
https://sites.google.com/site/lcc1802/downloads
からダウンロードできる。

インストール

 lcc42judy.zipをインストールしてみた。
zipを解凍して現れるlcc42ディレクトリをCドライブ直下(C:\)にコピーしろと書いてある。
開発系は C:\Devzにインストールしているので、ここにインストールした。 コンパイル・ドライバ(lcc)が呼び出すコマンドは同じディレクトリを探すので問題はないだろうと考えたのだが、cppが見付からないと怒られた。(^^;
どうやら、プリプロセッサ(cpp.exe)、コンパイラ(rcc.exe)、アセンブラ(asw.exe)のパスは"C:\lcc42\bin"がハードコードしてあるようだ。 仕方がないので、C:\からinkを張っておいた。

エミュレータ

 まだSBCを作っていないのでCOSMACエミュレータ Emma 02で試してみた。
Emma 02はCDP1802が使われている数々のボードやシステムのエミュレーションができる。 その中でシンプルな VELFで試してみた。

Emma02_velf

Emma02_velf_frontpanel

 COSMAC ELFはシリアル・インタフェースを持っていない。Q(#4)をTXD、EF2(#23)をRXDに使ってソフトウェアで実装してある。

 シンプルな COSMAC ELFで試しておけばSBCを作るときにシリアルインタフェースを載せなくて良い。

サンプル

 lcc1802にはサンプルが用意されている。 これらのサンプルはolduino用なので、これを変更してVELFで動くようにする。

 まずはお約束の hello worldから。 examples/helloworldディレクトリにある。

↓helloworld.c

/*
   print the string "hello World!"
*/
#include <nstdlib.h>
void main()
{
printstr("hello World!\n");
}
#include <nstdlib.c>

ライブラリ

 4行目の #include <nstdlib.h>は良いが、最終行の #include <nstdlib.c>は何?である。

 lcc1802はライブラリはなくて、最低限の関数がinclude/nstdlib.cに書いてある。printf()もあるが、最低限の機能だけで出力幅指定はできない。

 文字列出力関数のprintstr()は1文字出力にout(5,d)を呼んでいるが、VELFでは動作しないのでputc()を使うように変更しておく。

↓nstdlib.c内のprintstr()

void printstr(char *ptr){
//    while(*ptr) out(5,*ptr++);
    while(*ptr) putc(*ptr++);
}

 nstdlib.cにはfloatを扱う関数がある。 sdccは賢いので必要な関数だけリンクしてくれるがlcc1802ではnstdlib.cはいつでもコンパイルされるので使わない関数でもオブジェクトに含まれる。float関係の部分だけは "nofloats"が宣言されているとコンパイルしないようになっている。 コマンドラインオプションで -Dnofloatsとすれば良い。

ランタイムライブラリ

 ランタイムライブラリは、include/lcc1802Prolo??.incとinclude/lcc1802Epiloxx.inc。

 これらはのライブラリは、コンパイル済のライブラリをlinkerがリンクするのではなく、ソースに展開している。ソース中にnsddlib.cをインクルードし、アセンブラソース中でlcc1802Prolo??.incとlcc1802Epiloxx.incをインクルードしている。

入出力ルーチン

 IOルーチンは、include/IO1802.incに書いてある。 printf()は1文字出力にputc()を呼んでいる。  lcc1802が想定しているolduinoの1文字出力はout(5,d)を使っているので、VELFでは出力できない。

 IO1802.incに1文字出力(putc())と1文字入力(getc())を書けば良さそうだ。
ここでハタと困った。CDP1802のアセンブラは書いたことが無い。
とりあえず、Emma02にVELFのモニタソース(Emma02\data\Velf\VELFbios-v3.1.LST)があったので、この中の1文字入出力ルーチンを参考に(ほぼコピペ)、Cから引数を渡す部分と戻り値を返す部分を付け加えて、テンポラリ変数をreからrt1に変えた。

↓IO1802.inc

;**********************************************************************
;Transmit Byte via Q connected to RS232 driver
;call with R3 being the previous PC
;Byte to send in D
;Returns with D unaffected
;re.1 = D
;Destroys rt1.0
;----------------------------------------------------------------------
_putc: glo regArg1
txchar: phi rt1
ldi 9 ;9 bits to transmit (1 start + 8 data)
plo rt1
ghi rt1
shl ;set start bit
rshr ;DF=0

txcloop:
bdf $+5 ;10.5   jump to seq to send a 1 bit
req ;11.5   send a 0 bit
br $+5 ;1      jump +5 to next shift
seq ;11.5   send a 1 bit
br $+2 ;1      jump +2 to next shift (NOP for timing)
rshr ;2      shift next bit to DF flag
phi rt1 ;3      save D in rt1.1
DEC rt1 ;4      dec bit count
glo rt1 ;5      get bit count
bz txcret ;6      if 0 then all 9 bits (start and data) sent
ghi rt1 ;7      restore D
NOP ;8.5    pause 1/2 time
br txcloop ;9.5    loop back to send next bit
txcret: ghi rt1 ;7
ghi rt1 ;8
ghi rt1 ;9
NOP ;10.5
seq ;11.5 stop bit
NOP ;1
NOP ;2.5
NOP ;4
NOP ;5.5
NOP ;7
NOP ;8.5
NOP ;9
NOP ;10.5
Cretn

;**********************************************************************
;rx_char
;Receive Byte via EF2 connected to RS232 rt1ceiver
;Recieves 8 bits
;call with R3 being the previous PC
;Returns with Byte received in D and rt1.1
;Destroys rt1.0
;----------------------------------------------------------------------
_getc:
rxchar: ldi 8 ;start bit +7 bits from loop, last bit on returning
plo rt1
ldi 0
rxcw: ;wait for start bit
bn2 rxcw ;each instr takes 9us, we need 104us = 11.5
;delay 1/2 bit time to center samples
NOP ;     Don't test for correct start bit
NOP ;     it will work, if there's too much
NOP ;     noise on the line, shorten the cable!
rxcloop:
NOP ;10.5
b2 $+6 ;11.5 sample rx input bit
ori 80h ;1
br $+4 ;2
phi rt1 ;1
phi rt1 ;2
shr ;3
phi rt1 ;4
DEC rt1 ;5
glo rt1 ;6
bz rxcret ;7
ghi rt1 ;8
br rxcloop ;9
rxcret: ghi rt1 ;8
ghi rt1 ;9
NOP ;10.5
b2 $+4 ;11.5 sample last rx input bit
ori 80h ;1
plo retVal
Cretn

 

コンパイル

 この変更でIntelHexフォーマットの a.hexが作られるようになる。

C:\Users\user> lcc -Dnofloats helloworld.c
And St. Judy's Compiler FLOATS Across your code...
P2HEX/C V1.42 Beta [Bld 87]
(C) 1992,2013 Alfred Arnold
C:\Users\user\AppData\Local\Temp/lcc124682.p==>>a.hex  (3609 Bytes)

しかし、hellowroldだけで3,609byteとは。 

8Queen

 8Queen問題を解くプログラムをコンパイルしてみる。 再帰を使っているのでちゃんと動くだろうか?

/*
* 8Queen.c
* Yoshi / Apr.2018
*/

#include <nstdlib.h>

#define FALSE 0
#define TRUE (!FALSE)
#define u_char unsigned char
#define u_short unsigned short
#define NL "\r\n"
#define getchar getc
int DEBUG = 0;

char table[8];
void clrtbl(void) { int i; for(i=0;i<8;i++) table[i]=0xFF; }

void printtb(char n) {
    int x, y;
    printf(NL "-- %d --" NL, n);
    for (y=0;y<8;y++) {
        putchar('|');
        for (x=0;x<8;x++) {
            if (table[y]==x)
                 putchar('Q');
            else putchar(' ');
            putchar('|');
        }
        puts(NL);
    }
}

char check(int x, int y) {
    int i;

    if (y==0) return TRUE;
    for (i=y-1; 0<=i; i--) {
        if (2<DEBUG) printf("tb[%d]=%d" NL, i, table[i]);
        if (table[i]==x || table[i]==(x-(y-i)) || table[i]==(x+(y-i)))
            return FALSE;
    }
    return TRUE;
}

char place(int x, int y) {
    static int n = 1;

    if (DEBUG) printf("place(%d,%d):" NL, x, y);

    if (7<y) {  /* 解 */
        printtb(n++);
        return FALSE;
    }
    if (7<x) {  /* 見つからない */
        return FALSE;
    }

    if (check(x,y)) {
        table[y] = x;
        if (n==1) printtb(n);
        place(0, y+1);
        table[y] = (u_char)-1;
    }
    return place(x+1, y);
}

void main(void) {
    printf("8 Queen" NL);
    clrtbl();
    place(0,0);
    exit(0);
}

#include <nstdlib.c>

コンパイルすると、4,542byteだった。

↓実行結果

Emma02_velf_terminal

ちゃんと実行されるようだ。

まとめ

 SBCを作るときはRAMをケチらないで載せておけばlcc1802は使える。今時、32kのRAMを積んでも大した出費ではない。

 残念ながら、オリジナルのCOSMAC ELFではRAMが少ないので使えないだろう。もっともオリジナルのCOSMAC ELFを忠実に作るなら、ハンドアセンブルして、8個のスイッチでプログラムを入力する覚悟が必要だ。

 rcc.exeがASxxxxアセンブラを吐くようにするとSDCCのライブラリが使えるようになる。そして、aslinkを使うともう出力がもう少しコンパクトになると思う。 興味はあるが、そこまでやるか... 



最近の投稿】【2017の投稿】【2016の投稿】【2015の投稿

最近のCOSMAC/CDP1802

2018年4月22日 (日)

漫画村騒動 

僕が漫画村を批判しない理由 佐藤秀峰 (2018/01/30)

 最近マンガ村が話題になっているようだ。
マンガ村を利用している人がインタビューで困っていると発言したことがSNSで炎上している。多くの人はマンガ村の違法性にフォーカスしているようだ。その中で、漫画家の佐藤秀峰氏は業界の今後に注目しておられる。

漫画村は「よくある海賊サイト」というのが、僕の印象です。もちろん、それが過小評価という場合もあるかもしれません。だけど、ネガティブキャンペーンが行われる時、その陰には目的を持った人たちがいます。感情的になればなる程、その目的に利用されてしまうのではないでしょうか。

 著作権を飯のネタにしている音楽業界や出版業界は、悪く言えば新しいコンテンツを創造できる1人の才能を創造できない大勢が取り巻いているようなものだ。

 元来著作権は創造できる才能を保護するための権利だ。ところが、これまで創造できる才能を保護するという正論を元に取り巻きが著作権を拡張してきた。つまり、創造できない者が多くの権利を持っている。これが音楽業界と出版業界ということだろう。

 これまで、創造できない取り巻きの戦略は概ね成功してきた。しかし、ネットの普及に伴って時代遅れになってきた。 これはよく言われていることだ。

 創造できない取り巻きは、ネット社会に適合するようなビジネスモデルを創ることはできない。なぜなら創造できない人たちなのだから。

 佐藤秀峰さんはNapsterの例を引いておられる。
つまり、マンガ村に対する出版業界の対応は、Napsterに対する音楽業界の対応と重なるということだろう。

 音楽業界はNapsterを無くすことはできたが、消費者はAppleやgoogleを使うようになったように、出版業界がロビー活動で政府を焚きつけてマンガ村を無くしても行く先は無い。読者はAmazonを使うようになるだけだ。

 今後、権利にしがみついている創造できない取り巻きは食えなくなる。
新しいコンテンツ創造できる人は新しいビジネスモデルを創造できる人と組むと生き残ることができる。
 新しいビジネスモデルを創造できる人と組むことができなければ、Amazonに搾取されるようになるということだろうか。


最近の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2018年4月20日 (金)

「努力」という幻想

田坂広志氏のメルマガ「風の便り」四季 第133便は『「努力」という幻想

引用すると

 昔、あるテレビドラマで見た
 お母さんと子供の微笑ましい会話が
 心に残っています。

 勉強をしない子供に対して、
 「どうして、もっと勉強しようと努力しないの」
 と聞く母親に、子供が答えます。

 「うん、だから、努力しようと努力しているんだけれど」

 おもわず微笑んでしまうこの言葉を聞くとき、
 我々は、「努力」という言葉が、
 極めて精神的な言葉であり、
 自己幻想に陥りやすい言葉であることに気がつきます。

 なぜなら、仕事で壁に突き当たっている人に
 「あなたは、努力をしていますか」と聞くならば、
 「ええ、自分なりに、精一杯の努力はしています」と、
 多くの人が答えるからです。

 誰でも、精神的には、努力している。
 しかし、具体的には、成果が出ない。

 そのことを考えるとき、
 ふと、不思議なことに気がつきます。

  一流のプロフェッショナルは、
  精神的な「努力」という言葉を
  あまり使わない。

 そのことに気がつきます。

 では、彼らは、どのような言葉を使うのか。

  具体的な「工夫」

 それが、プロフェッショナルの世界において、
 「努力」を意味する言葉なのでしょう。


 2004年7月5日
 田坂広志

努力しても頑張っても成果が上がらないことは多い。
だから、成果が上がっていなくても頑張ったことで良しとする人は多い。

マネジャはメンバーの頑張り(努力)を成果にする手助けをするのが仕事だ。
しかし、頑張りが必ずしも成果にならないことを知っている。
だから、メンバーの頑張りを評価しようとする。

でも、顧客が望んでいるのは頑張りではない。

頑張れば必ずしも成果になるわけではない。しかし、成果になる確率は上がる。
そして、確率を上げるものが「工夫」というとだろう。

言い換えれば「工夫」しないことを「努力」という言葉に逃げないことだ。


最近の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2018年4月18日 (水)

カモメになったペンギン

カモメになったペンギン  ジョン・P・コッター/ホルガー・ラスゲバー ダイヤモンド社

Photo

分かりやすい寓話だ。

「チーズはどこへ消えた」は行動や考え方を変えられない個人の話で、この話は行動や考え方を変えられない組織の話。

 変革を成功させる八段階のプロセスは

  1. 危機意識を高める
  2. 変革推進チームをつくる
  3. 変革のビジョンと戦略を立てる
  4. 変革のビジョンを周知徹底する
  5. 行動しやすい環境を整える
  6. 短期的な成果を生む
  7. さらに変革を進める
  8. 新しい文化を築く

だ。

個人的に風土改革をやっていると、「1危機意識を高める」から先に進まない。

正直、「8新しい文化を築く」なんて遥か先のことだと思う。



最近の投稿】【最近の書籍・雑誌】【2017の投稿】【2016の投稿】【2015の投稿

2018年4月15日 (日)

IchigoJam(11) 

LED&KEY(TM1638)をIchigojamで点けてみた。BASICで入出力ポートを制御するとさすがに遅い。あまりに遅いので、マシン語で高速化してみた。

Tm1638_yoshi1
ダウンロード TM1638_Yoshi1.mp4 (1075.3K)

YOSHIがスクロールしているのだけれど、残像が残って認識できないくらい速くなっている。

 福野さんがこのボードをマシン語で制御しておられる。(2018/4/14)
(格安7セグディスプレイ「LED&KEY」を使ってカチカチカウンターづくり、TM1638 x IchigoJam用マシン語SPIドライバの作り方)

どの部分をマシン語で書くか

  このボードに載っているLED&KEY制御用デバイス(TM1638)はSPIもどきでデータを送り受けする。で8個のLEDを制御しようとすると、 8(LED)x16bit/LED+3(command)×8bit/cmd=152bit のデータを送る必要があるから、クロックも152個必要だ。
このクロックをBASICのOUT命令でON/OFFしているから、データI/Oが152回、クロックが304回で合計456回IN/OUT命令を実行しなければならない。

 高速化するならば、データを送り受けする部分をマシン語にすれば効果があるだろう。

 メモリダンプ・プログラムを書いたときの手法でやってみる。IchigoJam(4) (2015/06/01)
Cで書いてgccでコンパイルして、逆汗して、BASICのPOKE文を作る。
逆アセンブラはgccのツールチェーンに入っているobjdumpを使った。
逆汗リストからPOKE文の作成にはawkを使った。今どきならpythonオヤジ世代ならperlだがおじいちゃん世代はawkだ。
 (IJUtils (http://ijutilities.micutil.com/#Software)のIJBin2Pokeを使うと簡単にできるらしい)

Cソース

 Cのソースはこんな感じ。

/*
* access.c
* Apr.2018/Yoshi
*/
#include <stdio.h>
#include <stdlib.h>

#define    GPIO1_MASKED_ACCESS    ((volatile uint32_t *)0x50010000)
#define    GPIO0_MASKED_ACCESS    ((volatile uint32_t *)0x50000000)

#define    BIT_LED    5    //GPIO1_5
#define    BIT_STB    0    //GPIO1_0
#define    BIT_CLK    1    //GPIO1_1
#define    BIT_DIO    5    //GPIO0_5

#define    STB_L    0
#define    STB_H    (1<<BIT_STB)
#define    CLK_L    0
#define    CLK_H    (1<<BIT_CLK)

#define    STB(d)    GPIO1_MASKED_ACCESS[1<<BIT_STB]=(d)
#define    CLK(d)    GPIO1_MASKED_ACCESS[1<<BIT_CLK]=(d)
#define    CLKIN()   GPIO1_MASKED_ACCESS[1<<BIT_CLK]
#define    DI()      GPIO0_MASKED_ACCESS[1<<BIT_DIO]
#define    DO(d)     GPIO0_MASKED_ACCESS[1<<BIT_DIO]=(d)

#define    GPIO0_DIR    *((volatile uint32_t *)0x50008000)
#define    GPIO0_10_IN    0
#define    GPIO0_10_OUT    (1<<BIT_DIO)

#pragma GCC optimize("O1")
void wait(void) {
    int w=5;
    while (0<w) {
        w--;
        CLKIN();
    }
}
#pragma GCC optimize("Os")

/*
* receive 16bit
* uint32_t recv(uint32_t data)
* arg : uint32_t data : receive data
* ret : uint32_t : receive data
*/
uint32_t recv(uint32_t data) {
    int i;
    GPIO0_DIR &= ~(1<<BIT_DIO);    //DIO -> input
    for (i=0; i<16; i++) {
        CLK(CLK_L);
        wait();
        data <<= 1;
        data |= DI();
        CLK(CLK_H);
        wait();
    }
    data >>= BIT_DIO;
    return data;
}

/*
* send 8/16bit data
* uint32_t send(uint32_t data)
* arg : uint32_t send data
* ret : uint32_t :
* rem : send data : 1xxx xxxx CCCC CCCC : command (8bit)
*                   0xxx xxDD DDDD DDDD : data(16bit)
*/
uint32_t send(uint32_t data) {
    int i = (data & 0x8000)? 8: 0;    //check command flag
    data <<= BIT_DIO;
    GPIO0_DIR |= (1<<BIT_DIO);        //DIO -> output
    STB(STB_L);
    for (; i<16; i++) {
        CLK(CLK_L);
        DO(data);
        data >>= 1;
        wait();
        CLK(CLK_H);
        wait();
    }
}

void main(void) {
    wait();
    recv(0);
    send(0);
}

  TM1638にデータを送る関数はuint32_t send(uint32_t data)でデータを受ける関数はuint32_t recv(uint32_t dummy)だ。

 IchigojamのUSR関数の解説では、hint16_t foo(uint16_t arg , uint8_t* mem, uint8_t* font)となっているが気にしない。

 第1引数にはUSR(address , num)で呼んだときのnumがR0レジスタ経由で渡される、第2引数には仮想メモリの先頭アドレスが、第3引数にはキャラクタ・パターン・テーブルの先頭アドレスが渡されるが今回は使わないので宣言しない。

 ARMの関数呼び出し規約では、4個までの引数はR0~R3レジスタを使い、5個目以上の引数はスタック経由で渡すらしい。 第2引数(uint8_t* mem)、第3引数(uint8_t* font)を宣言すると、R1とR2レジスタをコンパイラが使わなくなるので第2、第3引数は宣言しなかった。

マスクアクセス(masked access)

 Ichihojamに使われているCPU LPC1114FN28には、マスク・アクセスという機能がある。福野さんのサイトに解説がある。
(マシン語でLEDを光らせよう! - IchigoJamではじめるArmマシン語その4)

 一般に出力ポートの特定のビットを制御するときには、他のビットに影響しないようにする必要がある。
C言語では、出力ポートPxに'1'や'0'を出力するには、Px |= (1<<BIT)、Px &= ~(1<<BIT)
と書くことが多い。

もっと詳しく書くと
 W <- Px
 W <- W & (1<<BIT)
 W <-  DATA << BIT
 Px <- W

という処理が必要だ。つまり、変数Wに一旦ポートのデータを読んできて書き換えたいビットだけ書き換えてもう一度ポートに出力する処理が必要になる。

 簡単に言うと、この面倒な処理を一度のアクセスで実現するのがマスク・アクセス機能で、GPIOのベース・アドレス付近にこの機能が割り当てられている。

 C言語的には、ベースアドレスに配列 uint32_t MSKED_ACCESS[4096] があって。配列の要素がそれぞれビット・パターン(マスクパターン)に対応している。

 例えば、IchigojamのGPIO1のbit(5)に接続されているLEDを制御する場合。

 GPIO1のベースアドレスは 0x50010000で、データ・レジスタ GPIO1_DATA は 0x500103FFCにマッピングされている。

 LEDを点灯させるには GPIO1_DATA(5)に'1'を出力すればよいから

 GPIO1_DATA |= (1<<5);

となる。これをマスク・アクセスを使うと

 GPIO1_MASKED_ACCESS[1<<5] = (1<<5);

でよい。出力する値は I<<5= 0b00010000でなくても、5ビットが1であれば良く、0b11111111でも良い。

 Cで書くと手間はあまり変わらないが、マシン語に翻訳すると

      GPIO1_DATA |= (1<<5);

    movs    r3, #32     ; r3 <- 1<<BIT_LED
    ldr     r2, .L2     ; r2 <- &PIO1_DATA
    ldr     r1, [r2]    ; r1 <- *PIO1_DATA
    orrs    r3 r1       ; r1 <- *PIO1_DATA | (1<<BIT_LED)
    str     r3, [r2]    ;(PIO1_DATA <- r1
    bx      lr          ; return_
    .align  2
.L2:
    .word    0x50013FFC

   GPIO1_MASKED_ACCESS[1<<5] = (1<<5);

    movs    r2, #32     ; r2 <- 1<<BIT_LED
    ldr     r3, .L5     ; r3 <- &PIO1_MASKED_ACCESS[1<<BIT_LED]
    str     r2, [r3]    ; PIO1_MASKED_ACCESS[1<<BIT_LED] <- 1<<BIT_LED
    bx      lr          ; return    ;
    .align   2
.L5:
    .word    0x50010008 ; &PIO1_MASCED_ACCESS[1<<BIT_LED]

コードは短くなっている。

 コードが減るより重要なことは、ポートアクセスは一旦ポートの状態を読んでいるので、処理中にポートの状態が変わってしまうと誤動作してしまう。 ところが、マスクアクセスはポートの状態を読み出さないので、誤動作する心配がないということである。

ウエイト(時間待ち)

 Cのソースはごく普通に16/8bitのデータを受けて1ビットづつ出力する処理だ。

 TM1638のデータシートを見るとクロックの最小パルス幅(PWCLK)は400ns、データセットアップタイム(tSETUP) データホールドタイム(tHOLD)はそれぞれ100nsとなっている。

 BASICは遅いからクロック出力はOUT 2,0/OUT 2,1で良いが、
マシン語に置き換えると速すぎる。'1'又は'0'を出力して400nsは出力データが変わらないように時間待ちする必要がある。

最適化

 gccは-Oオプションで最適化レベルを指定できる。実行速度よりコード領域を最小化するオプション -Os は強力だ。 Ichigojamのようにマシン語で使える領域が少ない場合には有難い。

 ところが、-Osオプションで最適化すると、ループを回って時間待ちするルーチンは最適化されて無くなってしまう。

 void wait(void { int i; for (i=0;i<100;i++) ; }

の結果はどこにも影響を与えないので無くても良いということだけど、ちょっと困る。

 最適化されないようにするには、wati()関数内で volataile属性の変数にアクセスすれば良い。 volatile属性は、例えばIO関係のレジスタや割り込みで使用される変数のようにアクセスするたびに内容が変わるという意味だ。

 つまり、コンパイラに「あんたが知らないうちに値が変わってる変数だヨ」と教えておくと、最適化しないでくれる。

 これをコンパイルして、wati(),recv(),send()をBASICのPOKE文にすると

REM wait()
POKE #700,#03,#4B,#1A,#68,#1A,#68,#1A,#68,#1A,#68,#1B,#68,#70,#47,#C0,#46,#08,#00,#01,#50
REM recv()
POKE #714,#20,#21,#F8,#B5,#04,#00,#10,#25,#02,#27,#0B,#4A,#13,#68,#8B,#43,#13,#60
POKE #726,#00,#23,#09,#4E,#33,#60,#FF,#F7,#E8,#FF,#08,#4B,#1B,#68,#64,#00,#37,#60
POKE #738,#01,#3D,#1C,#43,#FF,#F7,#E0,#FF,#00,#2D,#F0,#D1,#60,#09,#F8,#BC,#02,#BC
POKE #74A,#08,#47,#00,#80,#00,#50,#08,#00,#01,#50,#80,#00,#00,#50
REM send()
POKE #758,#20,#21,#0F,#4A,#F8,#B5,#13,#68,#0B,#43,#13,#60,#00,#22,#02,#27,#0C,#4B
POKE #76A,#04,#04,#E4,#0F,#1A,#60,#E4,#00,#45,#01,#00,#23,#0A,#4E,#33,#60,#0A,#4B
POKE #77C,#1D,#60,#FF,#F7,#BF,#FF,#01,#34,#37,#60,#6D,#08,#FF,#F7,#BA,#FF,#10,#2C
POKE #78E,#F1,#D1,#F8,#BC,#02,#BC,#08,#47,#C0,#46,#00,#80,#00,#50,#04,#00,#01,#50
POKE #7A0,#08,#00,#01,#50,#80,#00,#00,#50

BASICソース

BASICのプログラムはこんな感じ

1 REM TM1638 demo2
2 CLV: VIDEO 0
3 REM === ===
3 REM [0]-[7]    :7SEG data:
3 REM [8]        :guard
3 REM [9]        :LED data
3 REM [20]-[22]  :key
3 REM [23]-[26]  :key scan data
3 REM
3 REM === FONT ===
3 REM  -- a       dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
3 REM |f |b     0: 0011 1111 1: 0000 0110 2: 0101 1011 3: 0100 1111
3 REM  -- g       dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
3 REM |e |c     4: 0110 0110 5: 0110 1101 6: 0111 1101 7: 0000 0111
3 REM  -- d .dp   dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
3 REM           8: 0111 1111 9: 0110 1111 A: 0111 0111 B: 0111 1100
3 REM             dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
3 REM           C: 0011 1001 D: 0101 1110 E: 0111 1001 F: 0111 0001
3 LET [80],#3F,#06,#5B,#4F, #66,#6D,#7D,#07, #7F,#6F,#77,#7C, #39,#5E,#79,#71
4 REM             dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
4 REM           H: 0111 0110 L: 0011 1000 G: 0011 1101 Y: 0110 1110
4 REM             dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
4 LET [96],#76,#38,#3D,#6E
5 D=3        :'Duty:1/16
6 'P=0        :'Position 0
7 'L=8        :'Length 8

100 REM === MAIN ===
120 REM I/O STB:1 CLK:2 DI:IN3/OUT10
120 OUT 1,1: OUT 2,1
130 GOSUB @DSPOFF
135 @SCRL
140 REM SCROOL
140 LET [0],0,0,0,[99],[80],[85],[96],[81],0    :'"YOSHI"
150 @LOOP1
160 GOSUB @GETKEY: [9]=[20]
170 'PRINT HEX$([23],4);" ";HEX$([24],4);" ";BIN$([20],8)
170 PRINT BIN$([20],8);:FOR I=0 TO 7:?CHR$(8);:NEXT
180 N=N+1:
190 IF [20]=#81 THEN GOSUB @DSPNUM: GOTO @SCRL
200 'ELSE
210  P=0: L=8: GOSUB @DSP7SEG
220  [8]=[0]: COPY #800, #802, 16
280 GOTO @LOOP1

500 REM Disp number
500 REM N:number
500 REM W:work Y:counter
500 @DSPNUM
510 W=N: LET[0],0,0,0
520 FOR Y=7 TO 3 STEP -1
530   IF W=0 THEN [Y]=0
540   [Y]=[80+W%10]: W=W/10
550 NEXT
560 GOSUB @DSP7SEG
570 RETURN

600 REM    KeyScan
600 REM    Command=#42:Rread key-scan data
600 REM    [20]:K1 [21]:K2 [22]:K3 [23]-[26] scan data
600 REM S:SendData R:RecvData Y:counter
600 @GETKEY
610 S=#42: GOSUB @SENDC
620 FOR Y=23 TO 24
630   GOSUB @RECV
640   [Y] = R
650 NEXT
660 OUT 1,1    :'STB off
670 X=#8888
680 FOR Y=0 TO 2: U=Y+20
690   [U]=    ([23]&X)>>(1-Y)        :'-1---5---2---6--
690   [U]=[U]|([24]&X)>>(3-Y)        :'-1-3-5-7-2-4-6-8
700   [U]=([U]&#FF)|([U]&#FF00)>>7   :'--------12345678
710   X=X>>1
720 NEXT
730 RETURN
                   
800 REM DISP OFF
800 REM S:Send data #80=Command:Display Off
800 @DSPOFF
810 S=#80+D: GOSUB @SENDC: OUT 1,1
820 RETURN

900 REM DISP 7SEG (address add mode)
900 REM D: Dimmer 0-7 #80:Disp OFF
900 REM P: Position
900 REM L: Length
900 REM [0]-[7]: 7SEGx8, [9]:LEDx8
900 @DSP7SEG
910 S=#40:GOSUB @SENDC: OUT 1,1        :'#40: write register | auto increment
920 S=#C0+P*2: GOSUB @SENDC            :'address
930 FOR I=0 TO (L-1)
940   S=[P+I]: GOSUB @SENDD            :'7SEG
960 NEXT
970 OUT 1,1                            :'STB off
980 @DSPON: S=#88 | D: GOSUB @SENDC: OUT 1,1    :'88H:disp on
990 RETURN

1000 REM R:Recv data(16bit)
1000 @RECV
1000 R=USR(#714,0)
1010 'OUT 10,-1            :'OUT10->IN3
1020 'FOR X=1 TO 16
1030 '  OUT 2,0            :'OUT2:CLK
1040 '  R = R<<1: R=R+IN(3)    :'IN3, DI
1050 '  OUT 2,1            :'OUT2:CLK
1060 'NEXT
1070 RETURN

1100 REM S: Send data
1100 REM 1xxxxxxx CCCCCCCC : command(8bit)
1100 REM 0xxxxxDD DDDDDDDD : data(10bit)
1100 @SENDC        :'send command
1110 S=S|#8000
1120 @SENDD        :'send data
1130 X=USR(#758,S)
1130 'OUT 1,0        :'STB on
1140 'M=16: IF S&#8000 THEN M=8
1150 'FOR X=1 TO M
1160 '  OUT 2,0        :'OUT2:CLK
1170 '  OUT 10, S&1    :'OUT3:DIO
1180 '  OUT 2,1        :'OUT2:CLK
1190 '  S = S>>1
1200 'NEXT
1210 RETURN

コマンドは8ビット、データは16ビットで送受信するように変えた。

 メモリ容量が足りないので、ソースの中にマシン語が書けない。
マシン語をメモリに書き込む処理は最初に実行すれば良い。そしてプログラム実行中に書き換える必要性はないので、プログラム実行前にダイレクトモードで実行すればよい。メモリにセーブしたい場合には、別プログラムにしてLRUNで呼び出すことになる。

 1024バイトに収まるようにパックすると、

10 'TM1638 demo2
20 CLV:VIDEO 0
30 LET[80],#3F,#06,#5B,#4F,#66,#6D,#7D,#07,#7F,#6F,#77,#7C,#39,#5E,#79,#71
40 LET[96],#76,#38,#3D,#6E:D=3:OUT 1,1:OUT 2,1:GSB @DSPOFF
50 @SCRL:LET[0],0,0,0,[99],[80],[85],[96],[81],0
60 @LOOP1:GSB @GETKEY:[9]=[20]:? BIN$([20],8):FOR I=0 TO 7:?CHR$(8);:NEXT:N=N+1
70 IF[20]=#81 GSB @DSPNUM:GOTO @SCRL
80 P=0:L=8:GSB @DSP7SEG:[8]=[0]:COPY #800,#802,16:GOTO @LOOP1
90 @DSPNUM:W=N:LET[0],0,0,0:FOR Y=7 TO 3 STEP-1:IF W=0 [Y]=0
100 [Y]=[80+W%10]:W=W/10:NEXT:GSB @DSP7SEG:RTN
110 @GETKEY:S=#42:GSB @SENDC:FOR Y=23 TO 24:GSB @RECV:[Y]=R:NEXT:OUT 1,1:X=#8888
120 FOR Y=0 TO 2:U=Y+20:[U]=([23]&X)>>(1-Y):[U]=[U]|([24]&X)>>(3-Y)
130 [U]=([U]&#FF)|([U]&#FF00)>>7:X=X>>1:NEXT:RTN
140 @DSPOFF:S=#80+D:GSB @SENDC:OUT 1,1:RTN
150 @DSP7SEG:S=#40:GSB @SENDC:OUT 1,1:S=#C0+P*2:GSB @SENDC:FOR I=0 TO(L-1):S=[P+I]
160 GSB @SENDD:NEXT:OUT 1,1
170 @DSPON:S=#88|D:GSB @SENDC:OUT 1,1:RTN
180 @RECV:R=USR(#714,0):RTN
190 @SENDC:S=S|#8000
200 @SENDD:X=USR(#758,S):RTN
'974bytes

マシン語

 わざわざ窮屈なメモリ環境でBASICからマシン語を使わなくて良いと思う。 Cで書いていると「全部Cで書いたらいいじゃないか」と思ったりして...

 趣味やパズルだと考えるとやる気がわいてくるのだけれど。^^)



最近の投稿】【最近のCPUボード】 【最近のIchigoJam】 【2017の投稿】 【2016の投稿】 【2015の投稿

2018年4月14日 (土)

学校とは同じ人間を作る工場?

学校とは同じ人間を作る工場、でも社会に出ると…プレゼン資料が話題
with news  (2018/03/14)

 元はベニガシラ氏のtwitterへの投稿 「就活用のプレゼン資料作ったのに「毒がありすぎる」とボツになりました」

 ↓この意見に賛成。

 このプレゼンは、学校で評価されないが能力や才能がある人に対するエールだろう。

 重要なことは社会で要求される(需要がある)能力があるかどうかだ。

 学校で教えてくれることは社会で生きてく上で必要なことが多く、学校で評価されることは社会でも評価されることが多い。 でも、社会で評価されるのは学校で教えてくれることだけではないし、学校で評価されなかったことかもしれない。

 ネット民は二元論になる傾向があるけれど、学校で教えてくれることや学校での評価は全て無駄というわけではない。

 誰かがコメントしているように、学校の評価基準は社会の要求によるものだろう。

 今の学校の評価基準は明治以降の社会の要求によるものだろう。 当時は戦争をするにも、工業化して工場で多量生産するにも、命令されたことを正確に理解して忠実に実行する人を増やすことが重要だった。 そして、戦後の高度成長期にも重要だった。

 だから「テストに出るから覚えておけ」を忠実に実行する生徒は評価されやすい仕組みになっている。

 今でも、大企業や官庁が求める人物は、論理的な理解力と記憶力、命令を忠実に遂行する能力だ。 そして、これらの能力は偏差値と相関があるから、大企業が学歴で判断するのは合理的だ。

 組織的に結果が出せるような命令ができる管理者は貴重だ。そして、勘と経験か論理的かによらず、自分の頭で考えて命令しなければならないから、だれでも優秀な管理者になれるとは限らない。 であれば、数少ない優秀な管理者が多くの忠実な部下を管理する仕組みの方が合理的だ。

 管理者の命令を忠実に実行にする人は管理者が設定した課題を疑わないから扱い易い。 「そもそも課題設定が間違ってる」と言いだす人は扱い難いから高評価の集団には入れないようになっている。いわゆる集団になじめない人達だ。

 これがバブルまで社会が命令される側の者に要求してきたことだ。

 ところが、現場のマネジメントをやった経験では、社会の要求は変わっていると思う。

 論理的な理解力は今でも重要だ。 記憶力は重要でなくなっているが、何でもぐーぐる先生に聞けば良いわけではない。

 決定的に変わったのは、命令されたことを忠実に実行する人より自分で考えて行動できる人の方が貴重になってきたということだろう。

 特にミドル・マネジメント層は学歴とか偏差値とかは関係なく、誰かが設定した課題を疑わない(ようにしている)人より、自分で課題を見つけられる人が必要だと思う。 

 「そんなの当然だ!」と思うかもしれないが、誰かが課題を設定してくれるのを待っている人は多いと思う。

  「それはお前の管理者としての能力が足りない!」と言われれば、「そのとおりです」と答えざるをえないのだが...


最近の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2018年4月12日 (木)

AI・人工知能EXPO 2018

 今年もAI・人工知能EXPOに行ってきた。

 去年のこの展示会は、まだ出展が少く、AIブームで大勢の来場者が詰めかけたので、上野動物園でパンダを見るくらいの混みようだった。今年は会場も広くなって出展者も増えたので余裕がある。

ハイブリッド・オルゴール

 同時開催の展示会も見るようにしている。
興味がある隣接分野や異業種を見ておくことは重要だ。油断すると仕事に関係があるか興味があるブースしか見ないようになりがちだ。それでなくても歳を取ると歩くのが面倒になっている。

今回はこんなところに引っかかってしまった。
ハイブリッド・オルゴール

Photo

櫛歯が振動して音が鳴るところはアナログで、櫛歯を弾くピンの制御がデジタル。

1

演奏できる曲は無限のはずだ。でも、曲の追加は有料らしい。

閑話休題

育成サービス

 未だ人工知能とは?のような解説は多い反面、今年は、AI技術者、データサイエンティスト育成サービスを提供している企業の展示が結構あった。

 「AIとやらを買ってくればヨロシクやってくれる」と考えている人は未だ多いようだが、データの分析とシステムへの反映を外注するか自前でやるかは判断が分かれるところだ。

 大量のデータを持っていて、そこから価値を見つけようとする企業なら自前でデータサイエンティストは必要になるのだろう。

 「いい感じのやつが欲しい」とうリクエストは社外の人間には到底理解できないから。

RPA

 去年から注目しているRPAは全部RPAで処理しようとしなければ実用化段階にきているようだ。 ロボットが判断できなかったり間違えたりすることはある。怪しい領域を人間に判断をゆだねれば良いことにすると人間は無くならないがほぼ不要になる。

 今後、労働集約型の職業がロボットに取って代わられるのは分かりやすい。 労働集約型の職業だけでなく知識集約型の職業もロボット(RPA)が取って代わるのだろう。

 それまでに、自分自身をアップデートできるかどうかが大きな問題だ。

 35年くらい前にコンピュータが個人で買えるようになって、誰でもプログラムを作って仕事を効率化できるようになった。  あの時にプログラミングを勉強して価値を生み出せるようになった人と、プログラミングは無理とあきらめて他人が作ったプログラムを使うだけだった人との差は大きい。

 そして今、他人が作ったプログラムを使うだけの人の仕事は無くなろうとしている。 35年前と今が違うのは、35年前はプログラミングができなくても、プログラムを使うという仕事があった。 しかし、今後はツールを使うという仕事はRPAがやるということだ。

 そして、ツールを使うという仕事をしている人は多い。



最近の投稿】【2017の投稿】【2016の投稿】【2015の投稿


2018年4月10日 (火)

されど愛しきお妻様 <知っていても理解できない>

されど愛しきお妻様 鈴木大介 講談社

Photo

 脳梗塞を患い、高次脳機能障害者としての視点と、発達障害を持ったパートナーとしての視点を併せ持つ鈴木大介の体験に基づくノンフィクション。

 鈴木大介氏は定形発達だったから障碍者の苦悩と、健常者が障碍者の苦悩を理解できないことを身をもって知ることができたのだろう。

 高次脳機能障碍になったことで、障碍になる前と後との状態を比較することや、心理を自分自身で比較、分析することができるようになった。 そうなってはじめて、否定形発達者に対する接し方を頭で理解するのではなく身をもって分かったようだ。

 だから闘病経験は僥倖だとおっしゃる。

 最近、発達障害に関する情報は増えたけど、知識として知っているだけでは対応できない。 「発達障害じゃない?」のような発言も聞くことがある。素人知識で診断はできるかもしれないが、サポートできるわけではない。 それは定形発達者の心の問題でもある。

 せめて、否定形発達者本人や周囲の人が健康被害を受けないように、また、健康被害を与えないようにするための最低限の行動を知っておく必要があるだろう。

 特に、上司と呼ばれる立場の人は自分が定形、否定形を問わず知っておく必要があるのではないかと思う。



最近の投稿】【最近の書籍・雑誌】【2017の投稿】【2016の投稿】【2015の投稿

2018年4月 8日 (日)

IchigoJam(10)

 何気なくaitendoを見ていたら、マイコンボードにちょうど良さげな表示器を見つけた。

aitendoで売ってるボードはたいていamazonでも売っているので調べたら、270円で売っていたのでAmazonで買った。今は2個で850円に値上がりしている。

Ledkey

 TM1638はTitan Micro ElectronicsのLED表示用ICで、英語版のデータシートは(https://www.mikrocontroller.net/attachment/332035/TM1638_V1.3_EN.pdf)にある。

 このICは7セグLED10桁の表示と、8x3のキー・マトリクスのスキャンができる。8279に似てると言ってわかるのはオジサンだろう。

 インタフェースはSPIモドキ。 TM1638はSIとSOが分離していない(オープンドレイン)ので、SPIで接続するならMaster側のMOSIとMISOを接続して使う。出力が衝突する可能性があるのでMOSIに1kΩの抵抗を入れておく。

Connect_spi

 サンプルはたくさんある。特にarduino用のサンプルは検索するとたくさん見つかる。

Ichgojamでやってみた。 IchigojamはI2C用にオープンドレイン出力のOUT10(IN3)がある。これをDI/DOUTに使うと簡単だ。 STBとCLKはOUT1,OUT2でON/OFFする。

↓こんな感じ

1 REM TM1638 
2 CLV: VIDEO 0
3 REM === ===
3 REM [0]-[7]	:7SEG data: 
3 REM [8]	:LED data
3 REM [20]-[22]	:key
3 REM [23]-[26]	:key scan data
3 REM
3 REM === FONT ===
3 REM  -- a       dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba 
3 REM |f |b     0: 0011 1111 1: 0000 0110 2: 0101 1011 3: 0100 1111 
3 REM  -- g       dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
3 REM |e |c     4: 0110 0110 5: 0110 1101 6: 0111 1101 7: 0000 0111
3 REM  -- d .dp   dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
3 REM           8: 0111 1111 9: 0110 1111 A: 0111 0111 B: 0111 1100
3 REM             dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
3 REM           C: 0011 1001 D: 0101 1110 E: 0111 1001 F: 0111 0001
3 LET [80],#3F,#06,#5B,#4F, #66,#6D,#7D,#07, #7F,#6F,#77,#7C, #C9,#5E,#79,#71
4 REM             dpgfe dcba   dpgfe dcba   dpgfe dcba   dpgfe dcba
4 REM           H: 0111 0110 L: 0011 1000 G: 0011 1101 -: 0100 0000
4 LET [96],#76,#38,#3D,#40
5 D=3		:'Duty:1/16
6 'P=0		:'Position 0
7 'L=8		:'Length 8

100 REM === MAIN ===
120 REM I/O STB:1 CLK:2 DI:IN3/OUT10
120 OUT 1,1: OUT 2,1 
130 GOSUB @DSPOFF
135 @SCRL
140 REM SCROOL
140 LET [0],0,0,0,[96],[94],[97],[97],[80]	:'"HELLO"
150 @LOOP1
160 GOSUB @GETKEY: [8]=[20]
170 'PRINT BIN$([20],8);:FOR I=0 TO 7:?CHR$(8);:NEXT
180 N=N+1: 
190 IF [20]=#81 THEN GOSUB @DSPNUM: GOTO @SCRL
200 'ELSE
210  P=0: L=8: GOSUB @DSP7SEG
220  W=[0]
230  FOR I=0 TO 6
240    [I]=[I+1]
250  NEXT
260  [7]=W
270 GOTO @LOOP1

500 REM Disp number
500 REM N:number
500 REM W:work Y:counter
500 @DSPNUM
510 W=N: LET[0],0,0,0
520 FOR Y=7 TO 3 STEP -1
530   IF W=0 THEN [Y]=0
540   [Y]=[80+W%10]: W=W/10
550 NEXT
560 P=3: L=5: GOSUB @DSP7SEG
570 RETURN

600 REM	KeyScan
600 REM	Command=#42:Rread key-scan data
600 REM	[20]:K1 [21]:K2 [22]:K3 [23]-[26] scan data
600 REM S:SendData R:RecvData Y:counter
600 @GETKEY
610 S=#42: GOSUB @SENDC
620 FOR Y=23 TO 26
630   GOSUB @RECV
640   [Y] = R
650 NEXT
660 OUT 1,1	:'STB off
670 LET [20],0,0,0:
680 FOR Y=0 TO 3
690   [20]=[20]|([Y+23])>>Y
700 NEXT
720 RETURN

800 REM DISP OFF
800 REM S:Send data #80=Command:Display Off
800 @DSPOFF
810 S=#80+D: GOSUB @SENDC: OUT 1,1
820 RETURN

900 REM DISP 7SEG (address add mode)
900 REM D: Dimmer 0-7 #80:Disp OFF 
900 REM P: Position
900 REM L: Length
900 REM [0]-[7]: 7SEGx8, [8]:LEDx8
900 @DSP7SEG
910 S=#40:GOSUB @SENDC :OUT 1,1	:'#40: write register | auto increment
920 S=#C0+P*2: GOSUB @SENDC 	:'address
930 FOR I=0 TO (L-1)
940   S=[P+I]: GOSUB @SENDD	:'7SEG
950   S=([8]>>I)&1: GOSUB @SENDD:'LED
960 NEXT
970 OUT 1,1			:'STB off
980 @DSPON: S=#88 | D: GOSUB @SENDC: OUT 1,1	:'88H:disp on
990 RETURN

1000 REM R:Recv data
1000 @RECV
1010 OUT 10,-1			:'OUT10->IN3
1020 FOR X=1 TO 8
1030   OUT 2,0			:'OUT2:CLK
1040   R = R<<1: R=R+IN(3)	:'IN3, DI
1050   OUT 2,1			:'OUT2:CLK
1060 NEXT
1070 RETURN

1100 REM S: Send data
1100 REM need STB ON
1100 @SENDC		:'send command
1110 OUT 1,0		:'STB on
1120 @SENDD		:'send data
1130 FOR X=1 TO 8
1140   OUT 2,0		:'OUT2:CLK
1150   OUT 10, S&1	:'OUT3:DIO
1160   OUT 2,1		:'OUT2:CLK
1170   S = S>>1
1180 NEXT
1190 RETURN

↑間違っていたので修正(2018/4/11) >(690   [20]=[20]|([Y+23]X)>>Y)

↑これでは1024バイトに収まらないので、省略形の命令に変えて、スペースを取って、マルチステートメントに変える。↓

10 ' TM1638
20 CLV:VIDEO 0
30 LET[80],#3F,#06,#5B,#4F,#66,#6D,#7D,#07,#7F,#6F,#77,#7C,#C9,#5E,#79,#71
40 LET[96],#76,#38,#3D,#40:D=3:OUT 1,1:OUT 2,1:GSB @DSPOFF
50 @SCRL:LET[0],0,0,0,[96],[94],[97],[97],[80]
60 @LOOP1:GSB @GETKEY:[8]=[20]:N=N+1:IF[20]=#81 GSB @DSPNUM:GOTO @SCRL
70 P=0:L=8:GSB @DSP7SEG:W=[0]:FOR I=0 TO 6:[I]=[I+1]:NEXT:[7]=W:GOTO @LOOP1
80 @DSPNUM:W=N:LET[0],0,0,0:FOR Y=7 TO 3 STEP-1:IF W=0[Y]=0
90 [Y]=[80+W%10]:W=W/10:NEXT:P=3:L=5:GSB @DSP7SEG:RTN
100 @GETKEY:S=#42:GSB @SENDC:FOR Y=23 TO 26:GSB @RECV:[Y]=R:NEXT:OUT 1,1
110 LET[20],0,0,0:FOR Y=0 TO 3:[20]=[20]|([Y+23]X)>>Y:NEXT:RTN
120 @DSPOFF:S=#80+D:GSB @SENDC:OUT 1,1:RTN
130 @DSP7SEG:S=#40:GSB @SENDC:OUT 1,1:S=#C0+P*2:GSB @SENDC:FOR I=0 TO(L-1):S=[P+I]
140 GSB @SENDD:S=([8]>>I)&1:GSB @SENDD:NEXT:OUT 1,1
150 @DSPON:S=#88|D:GSB @SENDC:OUT 1,1:RTN
160 @RECV:OUT 10,-1:FOR X=1 TO 8:OUT 2,0:R=R<<1:R=R+IN(3):OUT 2,1:NEXT:RTN
170 @SENDC:OUT 1,0
180 @SENDD:FOR X=1 TO 8:OUT 2,0:OUT 10,S&1:OUT 2,1:S=S>>1:NEXT:RTN

↑間違っていたので修正(2018/4/11) (110 LET[20],0,0,0:FOR Y=0 TO 3:[20]=[20]|([Y+23]X)>>Y:NEXT:RTN)

↓動かしたところ

Tm1638

ダウンロード TM1638.mp4 (1058.8K)

 さすがに遅い。 ソフトでCLKをON/OFFしているのが原因だ。

 もう少し早くなりそうだが。


2018年4月 6日 (金)

若松通商で買い物

若松通商SBC6800SBC6809に使うSRAM 6264ALSPを買った。 (若松はクレジットカードが使えるようになったようだ)

Hm6264alsp

300mil幅の64k SRAM。300mil幅の256kと16kは持っているんだけど64kは持ってなかった。

ついでに買った物は

IntelのEE80C188とAMDのN80C188

Ee80c188 80c188

IntelのCPUのプリフィクスってEEだったんだと知った。今更。

Intelの16bitCPUは8086で外部バスを8bitにしたのが8088。 16bitCPU8086にIOを内蔵して組み込み用にしたのが80186。

外部バスが16bitだと一般的なEPROM(27Cxxx)が2個、RAM(62xxx)が2個必要となる。80188は外部バスが8bitだからEPROMとRAMは1個づつでよい。

何かに使う目的があるわけではなく趣味で動かしてみることが目的だ。一品物なので手配線で作っているとEPROMとRAMが減ると配線が減るのでありがたい。

8088や80186は持っているのだが配線が面倒だから80188を探していた。2個も必要ないんだけど...

MC68HC11

Mc68hc11f1fn

68HC11にはそこまで思い入れはないのだけれど、HD63B03の開発環境を調べていて、68HC11の情報もたくさん見たので1つくらい持っておくかと。

↑のサフィックスは1Fだけど8AにはBUFFALOというブートローダーが入っている。若松にはA8はないみたいだ。できればDIPが欲しいのだけど。
 (マルツに870円のMC68HC11A8P1があるでも、最低19個からだ。19個も使わない。(2018/05/02)

アクティブ・ディレーライン

Adl100s

初めて見たような気がする。

ついでにZ80

Z84c0006

ZilogのZ80をCMOS化した東芝のTMPZ84C00があって、これを本家Zilogが作っているのがZ84C00。

最初に買ったZ80はシャープのLH0080だった。PC-8001にはuPD780が入っていたけど。


最近の投稿】 【最近の6809】 【最近のCPUボード】 【2017の投稿】 【2016の投稿】 【2015の投稿

2018年4月 4日 (水)

AI vs. 教科書が読めない子どもたち <子供たちだけの問題ではない>

AI vs. 教科書が読めない子どもたち 新井紀子 東洋経済新報社

Ai

 前半は「ロボットは東大に入れるか」プロジェクトでの話、後半はAIにできないことができる子供を育てる方法の話。 全編通じて、これからAIが導入された社会にどう対応するかについて、論じておられる。

 著者の新井紀子氏はこのプロジェクトのマネージャだ。プロジェクト自体は2016/11で東大合格を断念したことが発表された。 東大合格は断念したが現時点での偏差値は57.8らしい。

 AIは問題文の意味を理解できないが、大量のデータを学習することで入試問題の正解の確率を上げることができる。 問題は、AIが偏差値57.8まで進歩・成長したことではなく、問題文の意味が理解できないAIの偏差値がなぜ高いかということだ。

 偏差値は相対的なものだから、AIの成績が良くなったのか、受験生(人間)の成績が悪くなったことが考えられる。 そして、問題文を理解できない受験生が多いのではないかという仮定で調査したところ、問題文が理解できない受験生が多くいることが判明したのだという。

 つまり、多くの受験生は問題文が理解できないから、問題を考えないで、答えを探している。 

 それなら、大量の過去問などのデータを分類、記憶、蓄積し、高速に検索できればよい。ざっくり言うと、これをコンピュータで実現したのがAIということだ。 

AIに職を奪われる人

 これからの社会はAIが導入されることは間違いないだろう。そのときに、AIと競合するのは多くの情報を記憶し、記憶から素早く情報を引き出せる人だ。 

 典型的には、これまでの教育でそこそこの評価を受けてきた人だろう。これらの人達は、いわゆるAIに職を奪われてしまう。

 これまでの教育で高い評価を受けた人には考える能力がある。AIは考えることはできなので、職を奪われることはない。

 これまでの教育で悪い評価を受けた人は、誰でもできる仕事か、特殊な能力を活かす仕事をしているから、職を奪われることはないだろう。

 AIに代替されそうな人(記憶力パターン認識でやってきた人)は、AIに代替されない能力(考える能力)を獲得するか、誰でもできる仕事をするしかないということだろう。

身近な影響

 将来、AIが導入されるようになったときの影響を考えてみる。

 ウチは良くも悪くも巷のトレンドの影響を受けにくい職場だ。 巷ではAIが導入されAIに職を奪われる人が現れても、ウチの職場ではなかなかAIを導入しないから、職を奪われないで生き残るかもしれない。

 そのような人は、AIに代替されない能力の獲得が遅れる。 しかし、いずれは時代の流れでAIが導入され、不要な人材になる。

 そのときに、AIに奪われていない職に替わろうとすると、巷の人は既にAIに代替されない能力を獲得しているから、後から参入するのは困難だ。

 では、誰にできる仕事はどうかというと、AIに代替されない能力が獲得できなかった人が既に参入しているから、やはり、後から参入するのは困難だ。 しかも、供給過多になっているから労働賃金は低下している。

 つまり、AIに代替されない能力の獲得が遅くなればなるほど、影響が大きいということだ。

  • 職に就いていないなら、コピペしないで、読解力(国語だけではない)を身につけること。
  • 職に就いているなら、命令されたことだけ忠実に遂行するのではなく、考える力を身につけること。
 

が重要だろう。

さて、退職間際のオヤジはどうするか? 困ったぞ。


最近の投稿】【最近の書籍・雑誌】【2017の投稿】【2016の投稿】【2015の投稿

2018年4月 2日 (月)

SBC6800、SBC6809

 モトローラ6800伝説で紹介されているSBC6800、SBC6809のプリント基板スイッチサイエンスで売られているので、1枚づつ買ってみた。

Rusekit

上がSBC6800用、下がSBC6809用。

 DCジャックは買い置きがあるのだけれど、このDCジャックは丸穴に刺さるタイプ。このタイプのDCジャックはプラグを抜き差しするときに力がかかるので強度的にどうだろう?

dcjack

 aitendoでSBC6800用のプリント基板とICを除いたパーツセットを売っているようだ。目ざといなaitendo。

 MC6800はクロックを作るのが大変でMC6871(クロックジェネレータ)の入手は難しい。
MC6871とかMC6875があるようだけど見たことが無い。でもこんなのを持っていたりする。

Mb8867

 MB8867はMB8861(富士通の6800)用のクロックジェネレータ―だ。(どこで見付けたんだったか?)

 MC6871やMC6875は簡単には入手できないので、8ピンPIC(PIC12F1288)で、クロックを作るのは現実的だ。

 MC6850(ACIA)もボーレートジェネレータが内蔵されていないので、通信速度の16倍のクロックが必要になる。

 こだわるなら、MC6840(PTM)とかMC14411を使うのだろうが、MPU用のクロックを8ピンPICで作ったのなら、ボーレートジェネレータも8ピンPICで作るのもありだろう。作りやすさを考えてのことかな。

Pic12f1822

 昔のマイコンで遊んでいると、どこまで昔の部品を使おうかと悩むことが多い。

###
 AVR派なのでPICを持ってない。PIC12F1288買わなくては。 ATTiny45でもできそうだけど。


最近の投稿】 【最近の6809】 【最近のCPUボード】 【2017の投稿】 【2016の投稿】 【2015の投稿






« 2018年3月 | トップページ | 2018年5月 »

2018年9月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

最近のトラックバック