安心安全「Zen言語」で作る IchigoLatteアプリ!2Dぐるぐる🌀できる バージョン 1.2.0β リリース!

安心安全「Zen言語」で作る IchigoLatteアプリ!2Dぐるぐる🌀できる バージョン 1.2.0β リリース!

JavaScriptプログラミングを学習できる中高生向けIchigoJamIchigoLatte JS」、Zen言語で作ったプログラムも動くようにバージョンアップ中。

usingnamespace @import("latte.zen");

export fn _start() void {
  while(true){
    _ = latte.io_led(1);
    latte.sleep(500, 0);
    _ = latte.io_led(0);
    latte.sleep(500, 0);
  }
}

こちらはZen言語版 Lチカ 、”latte.zen” を @import してAPI “latte” を呼ぶだけ。これを make してできる実行バイナリは 40byte !

実行バイナリを IchigoLatte に転送するには、

lash> cat -c 40 uart > .

lashでこれを叩いて40byteのバイナリ待ち状態にして、uart接続されたPCからTX。

CoolTermならバイナリファイルをDrag&Dropするだけ。

lash> .

バイナリの実行は “.” エンター。

Zen言語でLチカ成功!

せっかくのZen言語、もっと楽しいものを作りましょう。

usingnamespace @import("latte.zen");

export fn _start() void {
  var cX:i8 = 16;
  var cY:i8 = 12;

  var d1:i32 = 90;
  var d2:i32 = 210;
  var d3:i32 = 330;
  var r:i32 = 8;
  var d:i32 = 0;
  var s:i32 = 1;

  while(true){
    latte.screen_clear();
    line(
      @intCast(i8, (r*latte.sin8(d+d1+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d1))>>8) + cY,
      @intCast(i8, (r*latte.sin8(d+d2+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d2))>>8) + cY
    );
    line(
      @intCast(i8, (r*latte.sin8(d+d2+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d2))>>8) + cY,
      @intCast(i8, (r*latte.sin8(d+d3+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d3))>>8) + cY
    );
    line(
      @intCast(i8, (r*latte.sin8(d+d3+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d3))>>8) + cY,
      @intCast(i8, (r*latte.sin8(d+d1+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d1))>>8) + cY
    );

    latte.sleep(3, 0);

    var k:u8 = latte.keyboard_deqKeyBuf();
    if(k == 32){
      break;
    }else
    if(k == 30){
      s += 1;
    }else
    if(k == 31){
      s -= 1;
    }else
    {}

    d += s;
  }
}

fn _abs(x:i32) u32{
  return @intCast(u8, (if(0<x) x else -x));
}

fn _div(n:i32, d:i32) i32{
  return if(d != 0) latte.div(n, d) else n;
}

fn _dot(x:i32, y:i32) void{
  if( (0<=x and x<32) and (0<=y and y<24) ){
    latte.screen_buf(@intCast(u8,x), @intCast(u8,y)).* = '*';
  }
}

fn line(x1:i8, y1:i8, x2:i8, y2:i8) void{
  var dx:i32 = (x2 - x1);
  var dy:i32 = (y2 - y1);
  if(_abs(dx) < _abs(dy)){
    if(y1 < y2){
      var i:i32 = 0;
      while(y1+i <= y2){
        _dot(x1+_div(dx*i,dy), y1+i);
        i += 1;
      }
    }else{
      var i:i32 = 0;
      while(y2+i <= y1){
        _dot(x2+_div(dx*i,dy), y2+i);
        i += 1;
      }
    }
  }else{
    if(x1 < x2){
      var i:i32 = 0;
      while(x1+i <= x2){
        _dot(x1+i, y1+_div(dy*i,dx));
        i += 1;
      }
    }else{
      var i:i32 = 0;
      while(x2+i <= x1){
        _dot(x2+i, y2+_div(dy*i,dx));
        i += 1;
      }
    }
  }
}

これは3角形がぐるぐる回るプログラム、矢印キー上下で回転速度を変更可能。

このサンプルはgithubからどうぞ。実行バイナリを直接実行できる IchigoLatte JS 1.2.0 beta はこちら(Normal, forDake)からどうぞ。

型に厳密で安全志向プログラミング言語「Zen」、エッジ開発に最適かも!









.

[see also]

地元で育む次世代のこども達!『越前がにロボコン2020』待望の「中学生部門」を新設し、業種問わず「企業実業団チーム」大募集中!!

地元で育む次世代のこども達!『越前がにロボコン2020』待望の「中学生部門」を新設し、業種問わず「企業実業団チーム」大募集中!!

今年も開催「越前がにロボコン」!

第4回となる今回は福井県のご協力もいただき「実業団チーム」大募集!!あなたの会社で地元の小中学生を応援して選手として送り出しませんか?

白熱するロボット決勝戦、こども達だけでなく おとな もいっしょになって楽しめる「越前がにロボコン」はまさに eSports。

プログラミングだけではない、物理的なの創意工夫もたくさん詰まったこども達のロボット。多くの要望に応えて今年は 中学生部門 も創設!

福井の地元で育む次世代のこども達「こどもプログラミング実業団」、銀行業、建設業、小売業、学校関係、行政関係、業種問わず参加企業募集中!!

ご一報くださいっ!










.

プログラミングすれば一目瞭然、にわかに信じがたい「モンティ・ホール問題」をシミュレーションしてみよう!

プログラミングすれば一目瞭然、にわかに信じがたい「モンティ・ホール問題」をシミュレーションしてみよう!

アメリカのTV番組で生まれたという興味深い「モンティ・ホール問題」。

「3つのうち1つが当たりのくじ引き」で、あなたが1つを選んだ後に司会者がハズレを1つ減らしてくれます。この段階でチェンジ可能な場合「あなたはチェンジしますか?しませんか?」という問題。

パッと聞くと、もはや 2つ となった目の前のくじ、変えようが変えまいが当たる確率は 1/ 2 な気がします。

ではコンピュータでシミュレーション、今回は「こどもOS IchigoLatte JS」で。

まずは、

var hit = rnd(3);

当たりをセット、このプログラムの意味は以下。

  • var
    • メモるための箱を準備
  • hit
    • そのメモ箱の名前は “hit”
  • = rnd(3)
    • そのメモ箱の中にランダムな数 0〜2 をメモる

次は、

var chosen = rnd(3);

3つのうち1つを選択。

そしてここでハズレを一つ減らします。

var reduced = rnd(3);
while( (reduced==hit) + (reduced==chosen) ){
  reduced = rnd(3);
}

これの意味は、

  • reduced
    • メモ箱の名前は “reduced”
  • while( 〇〇 ){ □□ }
    • 〇〇〇 の間 □□□ をくり返す
  • (reduced==hit) + (reduced==chosen)
    • (reducedがhitと等しい) か (reducedがchosenと等しい)

つまり、

「reduced」をランダムに1つ選ぶんだけど「hit」や「chosen」と同じだったらそれは減らしたらいけないので、違うやつになるまで rnd(3) をしまくる。

という感じ。

では今回はチェンジしないバージョンということにして、

if(chosen==hit){
log("HIT!\n");
}else{
log("blank…\n");
}

結果を表示しちゃいましょう。

  • if( 〇〇〇 ){ □□□ }
    • もし 〇〇〇 なら □□□ する
  • chosen==hit
    • chosenがhitと等しい
  • log( “HIT!\n” )
    • “HIT!\n” と画面に出す(”\n”は”改行”の意味)
  • else{ △△△ }
    • でないなら △△△ する

こんな感じ。ここまでをまとめると最終的にシミュレーションプログラムは、

var hit = rnd(3);
var chosen = rnd(3);

// reduce one
var reduced = rnd(3);
while( (reduced==hit) + (reduced==chosen) ){
  reduced = rnd(3);
}

// show result
if(chosen==hit){
  log("HIT!\n");
}else{
  log("blank…\n");
}

こんな具合、”vi” でこれを打ち込んで ESCキー でセーブ&Exitしよう。

実行は

lash> ms .

こんな具合、「HIT!」が出れば当たり、「blank…」が出ればハズレ。何度も “ms .” すれば当たったりハズレたりを確認できるね。

さて、1,000回ほどシミュレーションしてみよう。1,000回も “ms .” するのはしんどいので、これもプログラミング。

var count=1000;

while(0 < count){
  var hit = rnd(3);
  var chosen = rnd(3);

  // reduce one
  var reduced = rnd(3);
  while( (reduced==hit) + (reduced==chosen) ){
    reduced = rnd(3);
  }

  // show result
  if(chosen==hit){
    log("HIT!\n");
  }else{
    log("blank...\n");
  }

  count = count-1;
}

太字の部分を加えました。はじめ “count” を 1,000 にして置いて、”0 < count” な間くり返します。”count” は下の方で “count = count-1″ しているので1ずつ減っていき、”0” になった時点で終了します。

lash> ms .
HIT!
HIT!
blank…
blank…
HIT!
blank…
blank…
:
:
:

実行するとこんな具合、1,000回シミュレーションされ、結果が大量に表示されます。あとはこれを集計すれば、、、でも手ではたいへん。なので集計もプログラミング。

var count=1000;
var hits=0;

while(0 < count){
  var hit = rnd(3);
  var chosen = rnd(3);

  // reduce one
  var reduced = rnd(3);
  while( (reduced==hit) + (reduced==chosen) ){
    reduced = rnd(3);
  }

  // show result
  if(chosen==hit){
    hits = hits+1;
  }else{
    // none
  }

  count = count-1;
}

log(hits, "\n");

はじめ “hits” を0にして置いて、当たったら “hits = hits+1” で1増やす。1,000回終わったら hits を表示、”\n”は改行の意味。

lash> ms .
319

319回当たりました。

lash> ms .
326

2回目は326。

lash> ms .
350

3回目は350、3回を平均すると331.7回。モンティ・ホール問題で当たる確率は、チェンジしないと33%ほどのようです。つまり、66%ほどはハズレる、言い換えると「チェンジしていれば66%ほどで当たる」という事になります。不思議ですね。

ここで、よくよくソースコードを見ると、

var reduced = rnd(3);
while( (reduced==hit) + (reduced==chosen) ){
  reduced = rnd(3);
}

この部分、せっかく while まで使って reduced(減らすやつ) を選んでいるのに、

if(chosen==hit){
  hits = hits+1;
}else{
  // none
}

結果に reduced は利用されていません。つまりこのプログラムで “reduced” は無くても結果に影響しない、あるだけでCPUやメモリを消費する無駄なモノです。

var count=1000;
var hits=0;

while(0 < count){
  var hit = rnd(3);
  var chosen = rnd(3);

  // show result
  if(chosen==hit){
    hits = hits+1;
  }else{
    // none
  }

  count = count-1;
}

log(hits, "\n");

つまりこうですね。このように無駄なモノを取り除くことを「最適化」と呼んだりします。C/C++などの言語ではコンパイラがこれを自動でやってくれますが、今回の IchigoLatte JS はやってくれないのでこのように手動で最適化しました。

lash> ms .
313

実行しても結果は最適化前と同じです。

つまりこの「モンティ・ホール問題」、チェンジしないのであれば「司会者が1つ減らす」という行為は必要ありません。単に3つの中から1つ選ぶので、確率は1/3。

「チェンジしていれば2/3で当たり」をあえてプログラミングしてみましょう。

if(reduced==0){
  if(chosen==1) chosen=2;
  else          chosen=1;
}else{
if(reduced==1){
  if(chosen==0) chosen=2;
  else          chosen=0;
}else{
  if(chosen==0) chosen=1;
  else          chosen=0;
}}

チェンジするプログラムはこんな感じ。

var count=1000;
var hits=0;

while(0 < count){
  var hit = rnd(3);
  var chosen = rnd(3);

  // reduce one
  var reduced = rnd(3);
  while( (reduced==hit) + (reduced==chosen) ){
    reduced = rnd(3);
  }

  // change chosen
  if(reduced==0){
    if(chosen==1) chosen=2;
    else chosen=1;
  }else{
  if(reduced==1){
    if(chosen==0) chosen=2;
    else chosen=0;
  }else{
    if(chosen==0) chosen=1;
    else chosen=0;
  }}

  // show result
  if(chosen==hit){
    hits = hits+1;
  }else{
    // none
  }

  count = count-1;
}

log(hits, "\n");

これを結果表示の前に入れ込んで、全体はこんな具合。前回と違って reduced が役に立っているので消すことはできませんね。

lash> ms .
693

実行してみるとだいたい 2/3 になっています。ただし、さっきの最適化したプログラムで 2.5秒 だったシミュレーションが、今回は 7.5秒 になりました。元のシミュレーションの方が良いですね。

ひとまず「モンティ・ホール問題」において、「当てたいのであればチェンジはすべき」というのが結論になりそうです。


この問題を知った時、「だったら最初から2つにして選ばせればいいじゃん」って思ってたわけですが、それだと当たる確率は1/2。あえて「3つの時に1つ選ばせて、減らしたあとでチェンジする」という手段を取ることで当たる確率が2/3に上昇するという、にわかに信じ難い くじ引きゲーム。

米村でんじろうサイエンスプロダクションチャンネル でも詳しく説明されています。(でんじろうさん、福井に引っ越してもっと広い実験場で楽しい動画を撮られてはいかがでしょう?)

それでも「えー、ほうとうに?」「いやー、ちがうでしょー」と思う人がいるかも。今回のシミュレーションとは違う意見がある方はご意見聞かせてください。

最初の くじの数 が 1億個 だったら?










.

教室で立てようチャットサーバ、ラズパイ3ならコンセントに挿すだけ!

教室で立てようチャットサーバ、ラズパイ3ならコンセントに挿すだけ!

極小手作りネットワーク」では1対1の通信、「ちょっと物足りない」という場合は多対多、インターネットでも標準的なネットワーク方式「TCP/IP」を味わってみましょう。

取り出しましたはRaspberryPi3、WiFi搭載ということでこれをアクセスポイント(AP)にしてIchigoJam達をwifi接続します。消費電流は0.46A、ICの温度は43℃。

今回も IchigoDake / IchigoDyhookMixJuiceを接続すればWiFiに接続できます。

ラズパイで作ったAPに接続したら、

MJ TCP 192.168.4.1 3333

にアクセス。ここにはチャットサーバーを立てておきました。

var net = require('net');
var member = new Array();

var server = net.createServer(function(socket) {
        member.push(socket);

        socket.write(`'chat server(member:${member.length})\r\n`);
        socket.on('data', function(data){
                console.log(data);
                var text = data.toString('utf8');
                console.log(text);

                for(var n in member){
                        member[n].write('\''+text);
                }
        });
        socket.on('close', function(){
                member = member.filter(item => item !== socket);

                console.log('closed.\r\n');
        });
});

server.listen(3333, '0.0.0.0');

これがラズパイの中に作ったチャットサービスのプログラム「chat.js」。

前回と同じ、チャットを送るには「PRINT」or「?」を使います。

残りの5台に「Hello!!!」が一斉に届きました。

「KONNICHIWA」を返してみると、

みんなに「KONNICHIWA」が届きます。

前回と違ってwifiなので結構離れても、しかも何人でも同時にチャット可能、これは楽しいっ!

ちなみに、前回の3本線とハード構成が同じなので、IchigoLatte JS

while(1){
  var k=inkey();
  if(0<k) uart(k);
  var u=uart();
  if(0<u) log(chr(u));
}

このチャットプログラム、そのまま動くはず。君が作ったBASICのチャットプログラムもそのままうごくよ!

iodataのラズパイなら、設定してコンセントに挿すだけで辺りにチャットのwifiが飛ぶ。こっそり教室で動かしてみてはいかが?

(設定済みのSDをご入用の方はご連絡ください)










.

極小手作りネットワークで双方向通信、IchigoJamで作るチャットマシン!

極小手作りネットワークで双方向通信、IchigoJamで作るチャットマシン!

IchigoJamについている TX,RX ポートは他デバイスと通信するため。TXは送信、RXは受信。

IchigoJam A      IchigoJam B
-----------------------------
         TX   -   RX
         RX   -   TX
        GND   -   GND

のように結線、今回は IchigoDake / IchigoDyhook

電源を入れると

Syntax error

の嵐に。

慌てず GND を抜き、そしてまたさします。

では、IchigoJam Aで

LED1

と入力してみます。

IchigoJam A の LED がつきますね。

では IchigoJam A から IchigoJam B の LED をつけてみましょう。

PRINT "LED1"

と入力。

相手(IchigoJam B)のLEDがつきました。

IchigoJam B の画面には、勝手に「LED1」の文字が。

相手のLEDを消すには、

PRINT "LED0"

ですね。IchigoJam BASIC の PRINT 命令は 画面に表示 しますが、TXから送信 も同時に行なっています。相手に何か送りたいときは PRINT です。

にしても勝手に相手のコンピュータを操作できるのはセキュリティ甘甘、楽しいいたずらいろいろできちゃう。

では、相手の画面にメッセージを送ってみます。「?」は PRINT と同義。

相手に

HELLO!

が伝わりました、が「Syntax error」嵐 再び。

送り手側も同様の嵐。GNDを抜いてさしましょう。

嵐を避けるには BASIC のコメント

?"'HELLO!"

として送ります。

出ました。

返事もコメントとして。

返事到着。

線を長くすれば離れたところと会話可能。

ちょっとミスると「Syntax error」の嵐になっちゃうし、勝手にLEDとか操作できてしまってセキュリティ的に甘いので、BASICで本格的なチャットプログラムを作ってみるのも楽しいかも。

while(1){
var k=inkey();
if(0<k) uart(k);
var u=uart();
if(0<u) log(chr(u));
}

[ヒント] IchigoLatte JS なら、チャットプログラムはこんな感じ。

みがけ君の技術力。










.

「判子」や「サイン」に変わる新しい電子化方式を考案、Webでやるならyrm式「eはんこ」

「判子」や「サイン」に変わる新しい電子化方式を考案、Webでやるならyrm式「eはんこ」

総会シーズン、一般社団法人PCNも6/30に社員総会。

招集通知、今回は電子化、webで作って皆さんにはURLを通知。

返事は簡単、「出欠」をチェックして、

「記名」して「確認」して終わり。「確認」とは従来の「押印」に値するもの、今回だけの「キーワード」が含まれた本人の写真を撮影して送ります。

「確認」写真は例えばこんな具合。画像内に「キーワード」と「本人」を含ませる理由は「今回のためだけに自らの意思で撮影した」ことを担保するため。なので事務局はキーワードに あまり世の中に無いユニークなもの を選びましょう。一人一人違うキーワードにするのもいいですね。悪い人がフォトショで本人の写真を偽造して送信してくる可能性がありますが、それはこれまでの 物理はんこ や サイン でも同じこと、印章偽造の罪として法律で補完します。

スマホだと「確認」の「Choose File」を押すと カメラ を起動できます。URL踏んでから送信するまでほんの1分ほど。

遠隔の人の eはんこ が欲しい時は「総会参加の是非です、”ABCD1234″と書いた紙持って自撮り写真ください」とメールすればokです。

事務局側もExcel表にデータが勝手に溜まるので集計いらずの超楽チン。

紙でやるなら物理はんこ、電子化するなら「eはんこ」、Word感覚でWeb作り、みんなもどんどん電子化しよう!










.

先生もいっしょに楽しもう!45分×10コマのテキスト付きIchigoDyhookセット登場!

先生もいっしょに楽しもう!45分×10コマのテキスト付きIchigoDyhookセット登場!

各地の小学校:

へお邪魔してのプログラミング学習。

そんな中で生まれたプログラミング授業の内容が、テキストブック「IchigoDyhookではじめるBASICプログラミング」となって登場!(45分10コマ分)

今回、必要な教材を揃えた『小学校高学年 45分x10コマ プログラミング学習用「IchigoDake スターターセット」』として販売開始しました。

そして、お得な「IchigoDake 10個パック」も同時発売。

2020年度からスタートした 小学校でのプログラミング教育 、先生もたっぷり楽しみましょう!










.

本当にトイレは足りないのか!?増設前に試してみる「シュレディンガーのトイレ」理論

本当にトイレは足りないのか!?増設前に試してみる「シュレディンガーのトイレ」理論

今や社会問題となっている「トイレが足りない」問題。とうとううちの仕事場でも顕著化、トイレに並んでうんこが顔を出すことが増えてきました。

これはよくあるトイレの仕掛け。

鍵をかけると遠隔からでも「使用中」の判別がつきます。

ここでこの「使用中」の意味を解析してみます。「使用中」であることを外の人に知らせることは、「入ってます、他へ行って」と言っていることに同等です。しかし、別のトイレがない状況下では「入っています、出るまで待って」という意味に変わります。この状況において「ノック」をすることは「早よ出ろ」の意味になるのです。多くの人はノックを躊躇し、顔を出すうんこをこらえているのではないでしょうか?

考えた解決方法はこうです。ノック(もしくはドアガチャ)をしなければ中に人がいるかどうかわからない、いわば「シュレディンガーのトイレ」。この状況でのノックは「誰かいますか?」の意味*のみ*です。ノックを受けた人は「次の人が待っている」を知ることができます。

トイレの数が潤沢な場合は「入ってます」を外に知らせることが混雑をさけることにつながりますが、潤沢でない場合には回転率を下げると考えられます。「中に人がいる」という情報よりも「次の人がいる」という情報の方が重要だからです。

というわけでうちではこの理論で2週間実験中、今の所うんこは顔を出していません。みなさんもお試ししてみては?










.

「一般社団法人PCN」2ndステージスタート!プログラミング教育元年2020、IchigoJamに何かが起こる!?

「一般社団法人PCN」2ndステージスタート!プログラミング教育元年2020、IchigoJamに何かが起こる!?

今回はオンライン開催「PCNサミット2020」!

年に一度の恒例行事、ふだん会うことはなくても「すべてのこども達にプログラミングの機会を」と日々活動している皆さんの、情報共有&作り物自慢&教え子自慢の場!

各PCNから続々と報告されるなか、僕は PCN福井勝山 としてケータイの中から1年分をみつくろった 128枚の写真 を紹介、1枚5秒(の予定だったけどだいぶ押し、すいません)!

各地のみなさん、年間でどれだけのこども達にプログラミングを届けたのか、それぞれにカウントしていました。今年は全体でカウントしてみよう!

こども達のプログラミング体験に最適なファーストパソコン「IchigoJam」、今年は大きな変化が起こるかも!?お楽しみにっ!

かねてより準備をしていた「一般社団法人PCN」、ついにWebページオープン、PCN活動を応援する立場としてのメンバー募集中!

すべてのこども達にプログラミングの機会を、ブラウザの前のあなたもぜひJoinしてください

[P.S.] zoomはほんとすごい。










.

2020年、プログラミングは楽しんだもの勝ち!「マジシャン颯」によるガチャムクセットUnboxing!

2020年、プログラミングは楽しんだもの勝ち!「マジシャン颯」によるガチャムクセットUnboxing!

ガチャピン・ムック と学べるプログラミングセット、好評発売中

フジテレビでのイベントで使われたオリジナルパソコン「ガチャピンDake & ムックIgai」が同梱されています。

キーボードやケーブル類、入門書もセットになっていて、購入後すぐに自宅のテレビでプログラミングを体験することができます。

プログラミング寺子屋Hats」の マジシャン颯【HAYATE MAGIC】 さんにも紹介いただきました!

ガチャピンを胸に下げて ペンダント もおすすめです!

2020年、プログラミングは楽しんだもの勝ちっ!










.