茶国 Rev3

2100-01-01

[]お越しいただきありがとうございます。

このブログでは主に以下の内容を記載しています。

  • 何か作った話(自分は何かを作るために生きている)
  • 技術関係のネタ(エンジニアのような仕事をしておりまして。。サーバ運用関連で飯食ってますが、スマフォ+サーバアプリ開発のマネージメントにシフト中。。機械学習が脅威に思えてボチボチ勉強しています。。休日は道楽のプログラミング)
  • 趣味のロードバイク(坂道をひーこら走ると結構大変な人生(笑)と重なる。。仕事のストレスが軽いと走らなくなる。。いかん)
  • 食べたり飲んだり(凹んだ時は美味しい物を食べて元気をつけよう)

記事が渾然一体となってカオス状態ですが、マイコンのプログラムも、ちゃりで走るのも、回転寿司食うのも、料理するのも、自分の中ではそれぞれが繋がっているので、カオスな日常をそのまま反映させています。といいつつ、何が何か分からない状態なので、google siteを使って索引サイト(まとめサイト)を作っています。

茶国まとめサイト: https://sites.google.com/site/chakokumatome/

Kindle無料マンガまとめ: https://amazon-kindle-search.appspot.com/

リンクや引用はご自由にどうぞ。質問等ありましたらコメントに書いてください。微力ながら自分の分かる範囲で回答します。

とにかく、、人に「あほやなぁ」と言われる事に精進するのが我が人生。

2018-04-22

[]クラッシュデニムを作ってみる

自分はジーンズはきませんが、子供からクラッシュデニムにしてくれと頼まれ、見よう見まねでクラッシュ化してみた。

デニムの生地は、たて糸と横糸で編まれていて、ハサミ等で横に切れ目を入れてたて糸を切断し、必要に応じてたて糸を抜き取ることでできるようであった(文書だと意味伝わらず)

f:id:chakoku:20180422110226j:image:w250:left

今回依頼されたジーンズ(ユニクロのストレッチジーンズというのか)

f:id:chakoku:20180422110234j:image:w250:left

おおよその穴開け目標の指定あり


f:id:chakoku:20180422110504j:image:w250:leftいきなりカッターで切ると、前後ろを一度に穴開けてしまうので、新聞紙などで前面だけ切れるように仕込む

f:id:chakoku:20180422110605j:image:w250:leftカッターで横方向に切断する(縦糸が切れる)

f:id:chakoku:20180422110924j:image:w250:left穴あけエリアの上下2か所に横方向に切り込みを入れた

f:id:chakoku:20180422111624j:image:w250:left縦糸が切断されたので、クラッシュ風になるよう、穴あけエリアの縦糸を抜いていく。自分は千枚通しで縦糸を拾って抜き取りました。

f:id:chakoku:20180422112450j:image:w250:leftクラッシュ風をめざして縦糸を抜いていく。縦糸を抜いただけだと横糸ばブラインドみたいになって残るので、横糸も適当に切断

f:id:chakoku:20180422131009j:image:w250:leftクラッシュ化に完成があるのかどうか分からんが、、左側の穴あけは一旦終了。ぽっかりと穴を空けたことに反省あり。。

f:id:chakoku:20180422114233j:image:w250:left向かって右側は横長のスリットに仕上がるよう、上下の切り込みは段差をつけるようにした。

f:id:chakoku:20180422130921j:image:w250:left右側は夢中になってクラッシュ化させてたので途中写真とる余裕なし。一応完成

いかにも作りましたという風にならないよう、、切れ目のエッジもカッター等でほつれさせた。

f:id:chakoku:20180422120151j:image:w250:left一応完成。これでいのか。。向かって左は穴空き感が強い。はいてみないと似合うのかどうかわからないが、子供は用事で出かけており不在。帰ってきて出来上がりを見たらなんというか。。「単なるボロジーンズやないか!!」というのか、「おお。。クラッシュ感がええ感じ!」というのか。。


■ご参考URL

https://matome.naver.jp/odai/2143169038589648701/2143169471393623903

NAVERまとめサイト

「必要なのはハサミだけ 簡単!おしゃれなダメージデニムの作り方」

2018-04-21

[]micro:bitを買った。micropythonで操作してみる

自分で使うというより、micro:bitをプログラミング教育に活用しているNPO団体が近くにあり、そこの活動内容に興味があり、そもそもmicro:bitとはどんなものかを理解しようと思って一つ買った。

Webサイトにもmicro:bitに関する記事がいろいろ掲載されているようですが、、手っ取り早く概要を理解したくて、以下の本を購入

Programming the BBC micro:bit: Getting Started with MicroPython

Programming the BBC micro:bit: Getting Started with MicroPython

microPythonを中心に、micro:bitに搭載されている各種デバイスをどうやったら制御できるか?について細かく説明がなされてます。ただ、最後のリファレンスには、micro:bit用のモジュールの一覧はありません。クラスのリファレンスは以下の仕様書を参考になさってください。

microbit用micropython言語仕様

http://microbit-micropython.readthedocs.io/en/latest/

(日本語版)

http://microbit-micropython.readthedocs.io/ja/latest/

https://codewith.mu/

f:id:chakoku:20180422085500p:image:w250:left

プログラミング言語は大きく分けて、Javascript系かPython系が用意されていると理解しましたが、自分はjavascriptはダメな方なのでPython(micropython)でプログラムすることに。評価ボードでのプログラミングでは、打ち込んですぐに実行評価できる、REPL(Read-eval-print loop)が使えるのが非常にありがたいので、、MUエディタを導入。

muエディタをPCにインストールしてmicro:bitを接続して、REPLで操作した例

(microbitをインポートしてdirコマンドを実行すると、IO制御用に追加されたクラスが分かる)

>>> import microbit
>>> dir(microbit)
['__name__', 'Image', 'display', 'button_a', 'button_b', 'accelerometer', 'compass', 'i2c', 'uart', 'spi', 'reset', 'sleep', 'running_time', 'panic', 'temperature', 'pin0', 'pin1', 'pin2', 'pin3', 'pin4', 'pin5', 'pin6', 'pin7', 'pin8', 'pin9', 'pin10', 'pin11', 'pin12', 'pin13', 'pin14', 'pin15', 'pin16', 'pin19', 'pin20']
>>> 

REPLで対話的に操作できると、最低限の事*1さえ覚えておけば、dirコマンドとhelpコマンドでだいたいどうやったらいいか手探りでも使えてしまう。

>>> import microbit            <- microbitライブラリをインポート
>>> dir(microbit)              <- どんなクラスがあるのか確認
['__name__', 'Image', 'display', 'button_a', 'button_b', 
'accelerometer', 'compass', 'i2c', 'uart', 'spi', 'reset',
 'sleep', 'running_time', 'panic', 'temperature', 'pin0', 
'pin1', 'pin2', 'pin3', 'pin4', 'pin5', 'pin6', 'pin7', 
'pin8', 'pin9', 'pin10', 'pin11', 'pin12', 'pin13', 
'pin14', 'pin15', 'pin16', 'pin19', 'pin20']

>>> dir(Image)                 <- Imageクラスの内容を確認
['width', 'height', 'get_pixel', 'set_pixel', 'shift_left',
 'shift_right', 'shift_up', 'shift_down', 'copy', 'crop',
 'invert', 'HEART', 'HEART_SMALL', 'HAPPY', 'SMILE', 'SAD',
 'CONFUSED', 'ANGRY', 'ASLEEP', 'SURPRISED', 'SILLY',
 'FABULOUS', 'MEH', 'YES', 'NO', 'CLOCK12', 'CLOCK1',
 'CLOCK2', 'CLOCK3', 'CLOCK4', 'CLOCK5', 'CLOCK6', 'CLOCK7',
 'CLOCK8', 'CLOCK9', 'CLOCK10', 'CLOCK11', 'ARROW_N',
 'ARROW_NE', 'ARROW_E', 'ARROW_SE', 'ARROW_S', 'ARROW_SW',
 'ARROW_W', 'ARROW_NW', 'TRIANGLE', 'TRIANGLE_LEFT',
 'CHESSBOARD', 'DIAMOND', 'DIAMOND_SMALL', 'SQUARE',
 'SQUARE_SMALL', 'RABBIT', 'COW', 'MUSIC_CROTCHET',
 'MUSIC_QUAVER', 'MUSIC_QUAVERS', 'PITCHFORK', 'XMAS',
 'PACMAN', 'TARGET', 'ALL_CLOCKS', 'ALL_ARROWS', 'TSHIRT',
 'ROLLERSKATE', 'DUCK', 'HOUSE', 'TORTOISE', 'BUTTERFLY',
 'STICKFIGURE', 'GHOST', 'SWORD', 'GIRAFFE', 'SKULL',
 'UMBRELLA', 'SNAKE']

>>> Image.SNAKE                  <- Image.SNAKEの内容を見てみる
Image('99000:99099:09090:09990:00000:')

>>> dir(display)                 <- displayクラスがLED表示とあたりを
                  つけて確認、showが表示だろうと
['get_pixel', 'set_pixel', 'show', 'scroll', 'clear', 'on', 'off', 'is_on']

>>> help(microbit.display)       <- helpで見る
micro:bit's 5x5 LED display.

>>> help(display.show)          <- 確かに表示用関数である
Use show(x) to print the string or images 'x' to the display. 
Try show('Hi!'). Use show(s, i) to show string 's', 
one character at a time with a delay of 'i' milliseconds.


>>> display.show(Image.SNAKE)    <- Image.SNAKEをLEDに表示させてみる

f:id:chakoku:20180422085650j:image:w250:leftmicro:bitのLEDにヘビがされた

■micro:bitをmicropythonで少し動かした印象

  • pythonでプログラムすると言えども、バグは出る。プログラムはmicro:bit上で動作するため、デバッガで好き勝手に実行止めたりできないので、デバッグが困難。普通のPythonのようには開発できない(パイソンデバッガ(pdb)が動かないので。まぁそらそうでしょう)
  • フラッシュ書き込みの時間待ちがあるので、開発サイクル(プログラミングー>実行ー>テストー>デバッグ)に時間がかかる
  • muエディタのソースチェック機能はめちゃくちゃ細かく指摘してくる。普段緩くコーディングしている人には細かすぎるかも。

理想的にはmicropythonが走るmicro:bitシミュレータがあり、そこでバグを潰してから最終バージョンをmicro:bit本体に焼きこんで実機テストするようなフローが望ましい。でもそうなるとほぼほんまもんの開発になってしまう。

開発サイクルだけで言うと、Blockプログラミング環境の方はmicro:bitシミュレータが提供されているので、実行待ち時間もないので効率がいいかも。ブロックでプログラムを作りたいかどうかは目的によると思いますが。。

イギリスではmicro:bitは11歳と12歳の小学生に配布されたらしいですが、彼らは多分Blockでプログラミングしてるのだろう。。micropythonでのプログラムは苦労が多すぎるような。。(もちろんPCでPythonを使ってる人は、デバッグ環境の整ったPC版Pythonで基本部分を試してからmicro:bitで最終実装とか、いろんな逃げの手があるので必要以上に時間を消費したりするのは避けられると思いますが)

以下は試しに作った、イメージ次々表示サンプル。イメージ一覧がどうにかして取れれば、imageリストを作る所がちょっと楽になりそうですが。。

from microbit import *

images = [Image.HEART, Image.HEART_SMALL, Image.HAPPY]
images.extend([Image.SMILE, Image.SAD, Image.CONFUSED])
images.extend([Image.ANGRY, Image.ASLEEP, Image.SURPRISED])
images.extend([Image.SILLY, Image.FABULOUS, Image.MEH, Image.YES])

while True:
    for i in images:
        display.show(i)   # , wait=True, delay=1000
        sleep(1000)

主観ですが、、Blockの方は全然分かっていませんが、micropythonによるmicro:bitのプログラムは一見手軽そうに見えてシミュレータがないのでデバッグ手段がほとんどなく、デバッグが厄介な印象。。

*1:micro:bit用モジュール名は、 microbit

2018-04-20

[]Interface大阪オフ会に参加

4/20にinterface誌による、AIスピーカ記事の大阪オフ会があり、ぜひとも関西のエンジニアの方々と話をしてみたいと思い参加した。当日は20名ぐらい(だったか。。酔って忘れた)の方が集まり、会場も席が一杯になった。

OFF会では、記事を執筆された作者の方々による解説や苦労話、Interface誌の編集の方のお話、さらには、、オフ会では、デジタルモノづくり魂の熱い方々のお話を聞くことができた。

特に、関西のデジタルもくもく会を主催されている方ともお話を聞くことができ、それぞれの思いが伝わってきて夜の11時まであっという間であった。

f:id:chakoku:20180420205828j:image:w200:left左はOFF会後半戦の飲み会。理系の集まりだから、みんな紳士的。よって暴れる人はおらず。。もう少し写真とりましたが、お顔が写ってるので、、この写真で二次会の雰囲気を想像してください。。

今回参加して、みなさんの思いや、作りたいという欲求エンジニアの繋がりというのを身をもって感じることができた。こういった輪がどんどん広がってほしいと思うし、一方で、会社はモノづくりの中心のはずが、なぜこういうワクワクした熱さがないのだろうか。。と自分にももっと問いたださないといけないと思った。

今回企画いただいた、Interface誌の編集部のみなさん、ご説明いただいた執筆者のみなさん、参加していろいろお話をお聞かせいただいたみなさんありがとうございました。。自分もモノづくりエネルギーがチャージされました。

■関連URL

http://www.kumikomi.net/interface/contents/201804_off.php

「Interface4月号特集「研究 AIスピーカの仕組み」のオフ会(@大阪)を開催します!」

https://dezimoku.connpass.com/

デジもく会 (大阪本町デジタル工作もくもく会

2018-03-21

[]VTL(Very Tiny Language)を理解するためBNFを定義してソース自動生成してみた

VTLの言語仕様がいまいち理解できず、自分なりに理解すべくBNF風に文法を定義して、定義したBNFを使ってソース自動生成してみた。

#!/usr/bin/python
import random
import re

VERB = False

BNF = {   
 '<SRC>'    : ('<STMT>',),
 '<STMT>'   : ('<ASSIGN>','<OUTPUT>','<INPUT>','<STMT>_SP_<STMT>'),
 '<ASSIGN>' : ('<VAR> = <TERM0>','<ARRAY> = <TERM0>'),
 '<INPUT>'  : ('<VAR> = ?','<ARRAY> = ?'),
 '<OUTPUT>' : ('? = <TERM0>','? = <TERM0> ;'),   # ; means no LF
 '<TERM0>'  : ('<TERM>','<EXP0>'),
 '<TERM>'   : ('<VAR>','<ARRAY>','<NUMBER>','<EXP>','<STRING>'),
 '<VAR>'    : ('<USER_VAR>','<SYS_VAR>'),
 '<ARRAY>'  : (':<VAR>)',),
 '<NUMBER>'  : ('1','2','3','4','5'),
 '<STRING>'  : ('"hello"','"bye"','""'),
 '<USER_VAR>' : ('A','B','Z','a','z'),
 '<SYS_VAR>'  : ('%','$','#'),

 '<EXP0>'  : ('<1OP> <TERM>','<EXP>'),
 '<EXP>'  : ('<TERM> <2OP> <TERM>','(<1OP> <TERM>)','(<EXP>)'),
 '<2OP>'  : ('*','/','+','-','>','<','=') ,
 '<1OP>'  : ('+','-','!') ,


}

def gen_vtl_src():
    src = '<SRC>'
    matched = True
    while(matched):
      if VERB:
         print "-------------------"
         print "SRC:",src
         print "-------------------"
      matched = re.match(".*(<[A-z0-9]*>).*",src)
      if matched:
         lavel = matched.group(1)
         value = get_next(lavel)
         src = src.replace(lavel,value,1)  # specify replace only once
         if VERB:
             print "{:s} -> {:s} : {:s}".format(lavel,value,src)
    return src

def get_next(lavel):
    next = BNF[lavel]
    if len(next) == 1:
          return next[0]
    else:
          return next[int(random.random()*len(next))]

for x in range(100):
   src = gen_vtl_src()
   print "---------------------"
   print src.replace('_SP_','\n')

上記文法(BNF風)がVTLを正しく表現しているかどうかは分からないけど、、自動生成されたソースは以下

% = (! "")
B = :A)
:#) = ! :Z)
$ = :#)
? = ((! #))
? = + :$)
? = - 4
A = ((- :B)) < Z)
? = (((1 < "")))
? = ! :a) ;
? = ((- # = $)) / :B)
? = 3 ;
:z) = ?
? = 3 = z ;
z = ?
:#) = ?
:Z) = 5
? = ! ""
? = :a) ;
% = :$)
A = ?
? = "hello" ;
z = - :B)
:z) = ?
? = 2
? = (- a)
:#) = + %
? = ! :z) ;
% = - "bye"
# = ?
z = + A * ""
? = (((! "hello"))) ;
? = "hello" ;
? = :#) ;
$ = ?
# = ?
B = :%)
:#) = :#) + ""
:z) = ?
z = ?

文字列/文字(string/ascii code)入出力がまだ変なのと、、否定の単項オペレータ、!はVTLでは使えなさそうなので、もう少し修正が必要だが、だいたいこんな感じかと。あと、行番号も抜けているが、、まぁそれは表現上だけか。文字列の算術演算とかもできてしまうが、、これは構文解析時にエラーとして排除するか、実行時に無視する(NULL文字列は数字の0とみなし、NULL文字以外は1と見なす?)か。。

自作パーザが正しいかどうかは上記の生成されたソースを読み込ませて、構文木が<SRC>まで辿れたら、だいたいOKと言える。完全性をどうやって担保したらいいのかは不勉強で分からず。

■改訂版仕様

行番号も仕様として規定

BNF = {   
 '<SRC>'    : ('<LINES>',),
 '<LINES>'  : ('<LINE>','<LINE>_NL_<LINES>'),
 '<LINE>'   : ("<LINE_NUMBER> <STMT>",),
 '<STMT>'   : ('<ASSIGN>','<OUTPUT>','<INPUT>'),
 '<ASSIGN>' : ('<VAR> = <TERM0>','<ARRAY> = <TERM0>'),
 '<INPUT>'  : ('<VAR> = ?','<ARRAY> = ?'),
 '<OUTPUT>' : ('? = <TERM0>','? = <TERM0> ;',  # ; means no LF
               '$ = <TERM0>','$ = <TERM0> ;'), # $ means putchar(ch)
 '<TERM0>'  : ('<TERM>','<EXP0>'),
 '<TERM>'   : ('<VAR>','<ARRAY>','<NUMBER>','<EXP>','<STRING>'),
 '<VAR>'    : ('<USER_VAR>','<SYS_VAR>'),
 '<ARRAY>'  : (':<VAR>)',),
 '<NUMBER>'  : ('1','2','3','4','5'),
 '<LINE_NUMBER>'  : ('100','200','300','400','500'),
 '<STRING>'  : ('"hello"','"bye"','""'),
 '<USER_VAR>' : ('A','B','Z','a','z'),
 '<SYS_VAR>'  : ('%','$','#'),

 '<EXP0>'  : ('<1OP> <TERM>','<EXP>'),
 '<EXP>'  : ('<TERM> <2OP> <TERM>','(<1OP> <TERM>)','(<EXP>)'),
 '<2OP>'  : ('*','/','+','-','>','<','=') ,
 '<1OP>'  : ('+','-','!') ,
}

WhiteSpaceは空白(0x20)一文字だけに制限(ミニマムサイズが至上命題のため)。上記ルールで生成されたソースは以下

500 :z) = ?
---------------------
500 ? = 2 ;
---------------------
200 ? = ((("bye" * ((- Z < (- 5))))))
300 Z = ?
---------------------
500 z = ?
500 :B) = ""
---------------------
400 $ = (- "bye") ;
---------------------
500 ? = - "bye" ;
400 $ = 4
200 :%) = Z / (% < "bye")
400 :z) = ?

■追加

BNFを見ながらパーザを作ってみて、解析しにくい所、コード最小化最優先でさらにルール見直し

BNF = {   
 '<SRC>'    : ('<LINES>',),
 '<LINES>'  : ('<LINE>', '<LINE>_NL_<LINES>'),
 '<LINE>'   : ("<LINE_NUMBER> <STMT>",),
 '<STMT>'   : ('<ASSIGN>', '<OUTPUT>', '<INPUT>'),
 '<ASSIGN>' : ('<VAR>=<EXP>','<ARRAY>=<EXP>'),
 '<INPUT>'  : ('<VAR>=?','<ARRAY>=?'),
 '<OUTPUT>' : ('?=<EXP>', '?=<EXP>;',  # ; means no LF
               '$=<EXP>', '$=<EXP>;'), # $ means putchar(ch)
 '<EXP>'  : ('<PRIM_EXP><OP><EXP>', '<PRIM_EXP>'),
 '<PRIM_EXP>' : ('<VAR>', '<ARRAY>', '<NUMBER>', '<STRING>', '(<EXP>)'),
 '<VAR>'    : ('<USER_VAR>', '<SYS_VAR>'),
 '<ARRAY>'  : (':<VAR>)',),
 '<OP>'  : ('*', '/', '+', '-', '>', '<', '=') ,
 '<NUMBER>'  : ('1', '2', '3', '4', '5'),
 '<LINE_NUMBER>'  : ('100', '200', '300', '400', '500'),
 '<STRING>'  : ('"hello"', '"bye"', '""'),
 '<USER_VAR>' : ('A', 'B', 'Z', 'a', 'z'),
 '<SYS_VAR>'  : ('%', '$', '#'),
}

■追記(180421)

Pythonで実装したVTLがボチボチ動くようになった。言語仕様のリファレンスとしている、VTL2(Altair_680-VTL-2)のサンプルコードを打ち込んでエラーなく動作するかを確認

http://www.altair680kit.com/manuals/Altair_680-VTL-2%20Manual-05-Beta_1-Searchable.pdf

これはスターシューターというシンプルなゲームで、星印めがけて打つと、星は縦横4方向に広がる。星を選んで打って、盤の外周をぐるっと星で囲めば上がりというゲーム(らしい)

$ ./vtl.py test/startshooter.vtl
Welcome to VTL
(V0.05 2018/4/7_0500)
CMD:RUN
A - . . . . .
B - . . . . .
C - . . * . .
D - . . . . .
E - . . . . .
    1 2 3 4 5

YOUR MOVE --C
3



A - . . . . .
B - . . * . .
C - . * . * .
D - . . * . .
E - . . . . .
    1 2 3 4 5

YOUR MOVE --

2018-03-17

[]マイコンとかTinyBasicとかStarTrekゲームとかVTL

マイコン == マイコンピュータ 時代のノスタルジア。。電大版TinyBasicやStarTrekGameが懐かしい。。

ところで、インタープリタはどこまでコンパクトにできるのだろうか。ちょっと調べるとVTL(Very Tiny Language)というミニマムな言語があるのを知った。VTLが提供するのはプログラミングに必要な最低限の仕様のみであり、ミニマムな言語仕様をなんとか使いこなしてプログラミングするという、今の高水準言語全盛の時代に完全に逆行した変態なプログラミング言語なのである。この言語仕様にはシビレました(だったらいっそうのこと、マシン語使え??そうですけど。。RISCアセンブラプログラミングしようとすると、パイプラインの先読みキャッシュのクリアとかウエイトとか必要のはずで。。人力で組んでもまともに走るのかどうか。。)。

遊びでVTLを実装してみたいと思う。StarTrekを動かせる程度の仕様にはしたい。それをできればお茶目な8ピンARMのNXP810上で走らせたいが。。乗るのかどうか。。

一番やっかいなのは数式のパージングと思うが、ここはRPN表記(逆ポーランド表記)で代用すれば力技で書き下して実装できそうな気がする。。あとは、、中間言語方式にするか、あるいは、毎回ソースを解釈(インタープリット)するか。。速度より省メモリを優先するなら、都度解釈の実装になるだろう。CPU性能は余っているので、リソース優先が妥当かと。

世の中、ディープラーニングだ、スマートスピーカだ、フィンテックだと言われてるけど、あまり興味が湧かない(文書生成等ができるリカレントネットワークは別ですが。。あれは学習アルゴリズムが難しすぎて)

何十年も前の話題を掘り下げるのは完全に後ろを向いてる気がするが。。こんなマイナーなネタが自分を惹き付けるのだからしょうがない。。プログラミング言語(オレオレ言語)の処理系を作るとソフトウエアに魂を入れてるような気になる。。

■式の評価

push/popで構文木を作る必要あり。RPNを作ってもいいとは思うが

■追記

VTLとは代入を中心としたプログラミングモデルと理解した。式の演算も代入なら、入出力も代入、条件分岐も行を表すシステム変数への代入。

式の演算は左からの結合のみで、+-*/の結合則はなし。*/が優先されることはなく、左から単純に計算されるようである。またエラー処理はなくて、どうにかこうにか処理を続けるらしい。この割り切りが素晴らしい。ある意味、プログラム言語の使いやすさよりも省コードこそが正義というポリシィなのだ。ポリシィが正しいかどうかは言語が使われる条件や使う人によって決まるので、ポリシィに納得する人がVTLを使えばいいのだと思う。

自分はどうか?と言われると、、、ミニマム言語で比べるなら、VTLよりはForthの方が好みだ。演算RPNで表現されるスタックマシンモデルだから言語仕様も分かりやすい。

■追記

ミニマム言語を本気で作るなら、アセンブリ言語でTVLを組む根性でやるべきでは?とも思えた。根拠はないけど。。それぐらいのリソース条件が厳しい中で初めて存在価値が出てくる言語だから。。そんなにリソース厳しかったらクロスコンパイルしろよ?それはそうだ。。だったらなぜマイコンの上で動くインタープリタがある?? 開発環境が無い条件下でマイコンの動作を変えたいから。あるいは、、マイコン+αでお手軽にプログラミングがしたいから? TVLが活きた時代はクロス環境がなく、コンパイラもFreeではなかった(そもそもその時代(6800とか8080とか)C言語があったのかどうか、CはVAXやPDP上で動いていた??)。今TVLの価値とは?? うーん。。手作りの楽しさ??Cコンパイラに頼ってTVLを作って、それに意味ある??

■追記

最初からARMのマシン語でVTLを実装するのは敷居が高すぎるので、、Pythonでサンプル実装して、それをCで焼きなおしてLPC810に入れてみて、次にアセンブラに置き換える。。こんな感じか。しかし、、道は長く途中で絶対に飽きる気がする。。でももし最後まで行けたら、素のARMコアと周辺IOを触れるので結構勉強になるかとは思う。というわけで、、省コスト・省コード(インタプリタ側)こそ正義!のポリシィでやっつけ仕様でVTLをPythonで組んでみよう。

というわけで、、Pythonでミニマム&&場当たり実装版(VTL2のサンプルがエラーなく動くレベル)を作ってLPC810に移植してみることに(VTL–2 for the Altair 680記載のサンプルコード)。課題は、(作る速度VS飽きる速度)でどちらが早いか

■ご参考URL

VTL(Very Tiny Language)の作成

http://middleriver.chagasi.com/electronics/vtl.html

VTL2言語仕様書

http://www.altair680kit.com/manuals/Altair_680-VTL-2%20Manual-05-Beta_1-Searchable.pdf

http://ir.lib.u-ryukyu.ac.jp/bitstream/20.500.12000/7729/1/No63p1.pdf

https://usermanual.wiki/Document/MITSAltair680VeryTinyLanguageVTL2Manual.3512030835/view

https://www3.hp-ez.com/hp/bequest333/page56

https://www.jstage.jst.go.jp/article/johokanri/25/4/25_319/_pdf

https://en.wikipedia.org/wiki/History_of_Star_Trek_games

https://web.archive.org/web/20150303015501/http://www.dunnington.u-net.com:80/public/startrek/

https://ichigojam.github.io/asm15/armasm.html

GAMEという言語

http://www.mztn.org/game86/

電大版BasicとかStarTrekゲームとか。。

安田寿明 (1977年9月). マイ・コンピュータをつくる―組み立てのテクニック. 講談社. ISBN 9784061179288.

安田寿明 (1978年4月). マイコンピュータをつかう―周辺機器と活用の実際. 講談社. ISBN 9784061179479.

http://d.hatena.ne.jp/mikkabo/20150531/1433026306

http://www.eas.uccs.edu/~mwickert/ece5655/lecture_notes/ARM/ece5655_chap3.pdf

http://www.csci.csusb.edu/dick/samples/c.syntax.html#Syntax of The C Programming Language

https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%20C%20in%20Backus-Naur%20form.htm

2018-03-11

[]「ロボット・イン・ザ・ガーデン」と「グレイテスト・ショーマン

Kindleのお試しで、無料の部分を読んでみて、これは面白いと思って、印刷版の「ロボット・イン・ザ・ガーデン」を買った。段々と壊れてゆく旧式ロボット(タング)をなんとか救おうとする主人公(ベン)がいろんな人の縁というか繋がりを辿って、アメリカ、日本、パラオを旅する。何一つやり遂げられないと奥様からなじられていたベンが大切な相棒のために奮闘する。旅を続ける中で、タングとベンのコミュニケーションもより深くなってゆく。まだ途中までしか読んでないけど、日本の描写に泣けてくる。子供と喧嘩した気持ちを引きずりなら読んでるので、なんか読書感もまだらになってしまっている。。これはいかん。

子供に勧められて「グレイテスト・ショーマン」を観た。普段映画は見ないので、映画館も新鮮というか非日常だった。ストーリー自体は主人公の少年期〜栄光と挫折、本当の使命を掴むという感じで展開自体はシンプル。だけど、、人との心のふれあいとか人に助けられて窮地を脱するとか、本当に大切な事とは何かを見つけ出すとか、細かい描写がこの作品を味わい深いものにしていると思う。主人公の仕事観(退屈よりも冒険!リスクと成功etc)と、自分が半年以上携わっていた開発テーマ(これが結構大変だった)と重なったりして、結構映画に入り込んでしまった。グレテスト・ショーマンは、サーカスの登場人物が、はたして単なる見世物なのか、プロのパフォーマーなのか?とか、芸術と見世物の違いは何なのか?とか、難しいテーマも含まれているように思えましたが、あまりその部分は掘り下げられておらず、主人公の興行(ショー)に対する成功観が描かれているように思えました。自分としては、ストーリー自体よりもディテールが気に入って、良い映画だと思いました。この映画はミュージカルに分類されるそうですけど、ミュージカルだからどうという印象はありません。映画としての感想。。

2018-02-24

[]コーヒーミルを買って豆を挽いて飲んでみた。。

マツコの知らない世界で、焙煎士の方が、例の、、コマンダンテのミルで豆から挽いてマツコさんにコーヒーを出していた。あの放送を見て、自分も豆を挽いて飲んでみたいと思い、コマンダンテを買おうかと思ったけど、かなり高いのと、どこも売り切れになっていて、まずは安いコーヒーミルで飲んでみようと思い、ハリオのハンドミルを買ってみた。結論から言うと、豆を挽いて淹れたコーヒーはめちゃくちゃ旨い。単に味がどうのという以上に、アロマというか、コーヒーにまとわりつく、香り、風味、鼻から抜ける香り、そういった五感すべてに訴えかける情報量が全く違う。こんな世界で皆コーヒーを飲んでいたのかという感想です。もちろんコーヒーショップに行っても、豆から挽いてコーヒーを淹れてくれているのだろうけど、、自分で挽いてすぐに飲むコーヒーは部屋がコーヒーのフレーバーで満たされれ、体でフレーバを感じながらコーヒーを飲む。家で豆から淹れるコーヒーは手間暇かけるだけの価値があるとショックを受けました。

f:id:chakoku:20180224155239j:image:w200:leftハンドミル入門のために買ってみたハリオコーヒーミル(製品名:セラミックスリム)

f:id:chakoku:20180224155515j:image:w200:left手始めに、近くのショップでお店(ジュピター)のブレンド豆を購入。ジュピターブレンドというやつ、200gパック

f:id:chakoku:20180224155828j:image:w200:leftネットでは少量を美味しく淹れるのは難しく、まずは二人分くらいが適切とあった。この豆は一人12gが標準と書かれていたので、二人分で24gを計量

f:id:chakoku:20180224160042j:image:w200:left軽量カップだとこんな感じ(あんまり参考にならないですが)

f:id:chakoku:20180224160749j:image:w200:leftどれぐらい細かく設定していいか分からず、いろいろノッチ?メモリ?を変えながら挽いてみた。手でゴリゴリ挽くのは楽しくて、子供の頃、家にあったクラシックコーヒーミルを思い出す。。子供の頃はコーヒーの旨さも全然分かっておらず、ネスカフェをミルクコーヒーにして飲んでいた。。

f:id:chakoku:20180224161157j:image:w200:left粒度をいろいろ変えたので結局どの設定がベストなのかまだ分かっておらず。V60のペーパードリップの場合は中挽きぐらいがお勧めらしいけど。。中挽きとはいったいどれぐらいノッチなのか!?

f:id:chakoku:20180224160828j:image:w200:left挽いてみて分かったけど、豆を挽くのは、静電気と粉末の飛散との闘いでもあった。セラミックの臼も細かいコーヒーの粉がいっぱい付いている。だから、、ミルは金属製がよろしいかと。

f:id:chakoku:20180224161415j:image:w200:leftV60のペーパードリップに入れてみた。ペーパーフィルターと粉が一体になったドリップ式のレギュラーコーヒーも粉をV60に移し替えて淹れていたけど、分量が全然違う。もちろん二人分というのはあるが、それ以上にモリモリに粉が入っている。これまでV60にこんなに粉が入ることはなかった

f:id:chakoku:20180224162402j:image:w200:left新鮮な豆だからか、お湯をそそぐとモコモコと盛り上がる。。よくTVとかで映る”美味しいコーヒー淹れてます!!”というシーンが自宅で見ることができた。。

f:id:chakoku:20180224162735j:image:w200:left二人前300gとして抽出終わり。

味わいは最初に書いた通り、真空パックのドリップ一体型コーヒーとは、レベルが全然違う。アロマというかフレーバーというか、舌での味が旨いというより、五感に訴える情報量が全然違っている。コーヒーの風味が部屋に充満して、コーヒーのフレーバに自分が酔って溶けてしまうぐらいです。

皆がコーヒーにハマる気持ちがよく分かった。しかも、、店では飲まず、お家コーヒーならではの楽しみもあると思えた。あ〜〜、久しぶりにガツンと来ました(仕事で怒られた場合を除く:-p)。

2018-02-17

[]ARM(LPC810)組込みプログラミングAgain...

仕事がアップアップで休日はプログラミングをやる気も全くなかったけど、開発プロジェクトもゴールが見えてきて余裕かましているので、久しぶりにARMで工作をすることに。。

最終的には、Google HomeAmazon Echoなんかで、開けゴマ等と音声指示を出すと、めぐりめぐって、模型の扉が開いたり、右向けと音声指示を出すと、模型の矢印等の形状を左右に回転するようなのを作りたい。

先日ポイントが期限切れそうになったので、YahooShop?だったかで、小型サーボを買った。これをマイコンから動かすようにする。

一番手軽なのは、Arduinoか、ラズパイでサーボライブラリを使うのだろうけど、Arduinoは他人のフンドシに乗っかるのが気に入らないのと、ラズパイはサーボ動かすだけなのに大げさだと思い、ミニマムに作るためARM(LPC810)を使うことにした。値段だけなら、AVRマイコン(Tiny)の方が安いけど、デバッガ買おうとすると結構高いので。。

昔使っていた開発環境もPCのどこに行ったのか分からなくなったので、NXPのサイトから、LPC Xpresso 8.2.2をダウンロードしてPCに開発環境を再度構築した。お試しのmainだけのProjectを作ってビルドデバッグしてみた。昔販売されていたトラ技付録のmbedコンパチのARM評価ボード(トラ技ARMライタ)を利用して一応LPC810とつながった。

他人様(みっかぼログ様)のLチカプログラムを一部Copyして、デバッガでステップ実行してLEDが点滅するところまでは確認した。

下記が何も考えず、ほとんど仕様書を調べず、みっかぼログ様のソースをコピーさせてもらったLチカサンプル。チカといってもWAIT入ってないので、発振するぐらいの速さでチカチカします。(だからデバッガでステップ実行させないと目ではチカチカと見えない)

void led_setup();

int main(void) {

    // TODO: insert code here

    // Force the counter to be placed into memory
    volatile static int i = 0 ;
    led_setup();
    // Enter an infinite loop, just incrementing a counter
    while(1) {
        i++ ;
        LPC_GPIO_PORT->SET0 |= (1<<0);
        LPC_GPIO_PORT->CLR0 |= (1<<0);
    }
    return 0 ;
}
void led_setup(){
	// LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);  // Reset Value is 1, so no need
	 LPC_GPIO_PORT->DIR0 |= (1<<0);
}

■ご参考URL

LPC810のLチカのため参考にさせてもらった記事(みっかぼログ様)

http://d.hatena.ne.jp/mikkabo/20150401/1427886535

NXPのLPC81Xポータルサイト

https://www.nxp.com/products/processors-and-microcontrollers/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

LPC81x User Manual

https://www.nxp.com/docs/en/user-guide/UM10601.pdf

LPCXpresso IDE

https://www.nxp.com/products/processors-and-microcontrollers/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc1100-cortex-m0-plus-m0/lpcxpresso-ide-v8.2.2:LPCXPRESSO

(Windows版、Mac版、Linux版あります)

NXPセミコンダクターズジャパンが提供するWebサイト;SCTimer/PWM

http://www.nxp-lpc.com/lpc_peripheral/sct/index.php

SCTチュートリアルスライド(説明が段階的で分かりやすいように思える)

https://onedrive.live.com/view.aspx?resid=7AE40E5A5F1EC907!24470&ithint=file%2cpptx&app=PowerPoint&authkey=!ACDxmgRtdAZZdXE

IDEを有効化するには、IDEでシリアルを生成(create serial number)、LPCXpresso IDE Free Edition Activationsの画面でIDEのシリアルを入力、ActivateKeyを入手して、IDEにて入力する。

2018-02-12

[]年賀状を簡易製本する

毎年年賀状を頂くが、はがきフォルダに入れたりするのもちょっと手間で、いつもは適当に輪ゴムとかで綴じて収納している。だから、読み返してとかほとんどやっていない。なんとか簡単に製本できないか?と試してみた。

f:id:chakoku:20180212201949p:image:w200:left糊付けする背中側をできるだけ揃えて置く。

f:id:chakoku:20180113140744j:image:w200:left糊付けしている間、ずれないように万力で年賀状を挟む。おめでたい年賀状を挟む。。申し訳なし。

f:id:chakoku:20180113141618j:image:w200:left糊付け作業にむけて、背表紙を上にする。

f:id:chakoku:20180113142003j:image:w200:left今回使った木工用ボンド。速乾性らしいです。

f:id:chakoku:20180113142018j:image:w200:left背中側に木工用ボンドを塗り付ける。

f:id:chakoku:20180113154135j:image:w200:left乾くと透明で伸びのあるビニールの質感になる(酢酸ビニル樹脂だったような)。

f:id:chakoku:20180113155434j:image:w200:left糊が乾いてひろげてみたところ。なんせ簡易製本なのであまり力いっぱいにやってしまうとページが取れるかもしれない。

f:id:chakoku:20180113154449j:image:w200:left一応見開きにはなる。上記同様耐久性は不明です。

f:id:chakoku:20180212202510p:image:w200:left表紙をつけるのだけど、面倒なので透明の幅広テープで白ボール紙をくっつけることにした。

f:id:chakoku:20180211083419j:image:w200:leftくっつけた表紙にタイトルを書いてできあがり

f:id:chakoku:20180211083600j:image:w200:left背表紙にも年代を書いてみた。これで毎年の年賀状がコンパクトに収納できるはず。。いつまで年賀状やりとりするか分からないけど。