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

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のようにマシン語で使える領域が少ない場合には有難い。

 とこrが、-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 6246ALSPを買った。 (若松はクレジットカードが使えるようになったようだ)

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が欲しいのだけど。

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

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が導入された社会にどう対応するかについて、論じておられる。

 著者の新井紀子氏はこのプロジェクトのマネージャだ。プロジェクト自体は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の投稿






«iPhone補聴器アプリ