コンピューターやネットワークが社会が深く広く使われている現代におけるサイバーセキュリティは、セキュリティの一部ではなく、実生活全般の安全に関わる上位概念として捉える必要があります。

Hana道場の向かい、Hana工房で開催されたサイバーセキュリティー勉強会。来年本格実施予定の中高生向けのサイバーセキュリティコンテスト「CyberSakura」に向け修行中。 参加に名乗りを上げた、中学1年生3人が受講。サイバーセキュリティの入門とコンテストに向けた模擬競技が行われました。

サイバーセキュリティとは、コンピューター、ネットワーク、データを使い続けられるよう保全すること。 社会にとっての普通の状態を持続するためには、オンライン、オフライン問わず発生しうる迷惑なハッキング行為、悪意のないうっかりや、地震まで、さまざまなリスクに備える必要があります。

CyberSakura」は、その知識と実行力を養うコンテストを含む教育プログラム。
エキシビジョンマッチに向け、日本全国の中学1年生から高専高校の2年生までを募集中です。
CyberSakura 〜サイバーセキュリティ教育プログラム〜 | Peatix

誰が作ったか分からないアプリを自分のパソコンで動かすリスクを考えてみましょう。
プログラミングした人には分かりますが、ファイルを消すのも、編集するのも、どこかに送信するのもプログラムを使えば自由自在。 いくら見た目がかわいくても、自分自身をパソコン内部の分かりづらい部分にコピーし、こっそり動かし続け、何かの司令を待つ、そんなこともできてしまいます。

よく知られた、また、よく使われているアプリであっても完全に信用できるわけではありません。 突然そのアプリの所有者が変わって、悪意ある自動更新が起きない保証はありません。

対処する方法のひとつに仮想化技術があります。仮想的なパソコン上でアプリを動かすことで、実際のアプリの動きを手にとるように確認できます。 CyberSakuraは、問題あるOSの状態を仮想化環境上で動かし、対処します。


Zen言語3行でつくるWebAssemblyの続きとして、ZenからDOM操作の実験成功!(src on GitHub)

ブラウザ上で動作する静的型付け言語環境、WebAssemblyも、仮想化技術のひとつとして注目されています。 WASI (The WebAssembly System Interface) により、サーバー上での動作環境が整ってくると、より安心なサーバー運用ができそうです。

発明が、ソフトウェア化、オープン化したことによって、新技術が世界中から続々誕生するエキサイティングな世界は留まることを知りません。 大いに活用していきましょう!

福井県でのサイバーセキュリティ、キックオフ!
サイバーセキュリティフォーラム&交流会in 福井
2020/8/3(月)開催、オンライン開催となっています。

webアプリのサイズ、小さいほど読み込みが早くて快適に!
Zen言語でシンプルな WebAssembly、動かしてみました。(src on GitHub)


C言語以上に細部に手が届く、軽量静的型付け言語の「Zen言語」は、WebAssembly出力にも対応。 下記、たった3行、誰にでも分かりやすい足し算するだけのプログラムを「zen build」でコンパイルするだけ、HTML/JavaScriptから呼び出して、利用できます。(src on GitHub)

export fn add(a: i32, b: i32) i32 { return a + b; }

(プログラム解説)
export → 外部から使うよ
fn → function 関数だよ
add → 関数名はaddにしよう
a: i32 → 符号付き整数32bitのパラーメータaが関数addの引数1つ目
b: i32 → 符号付き整数32bitのパラーメータbが関数addの引数2つ目
i32 → 符号付き整数32bitを関数の値として返すよ
return a + b; → パラメータaとbを足したものを返すプログラム、終端記号は「;」セミコロン

コンパイルしてできあがった、main.wasm ファイルは、たった115byte。
下記のようにHTML内のJavaScriptでつないで、HTTPサーバーを立ててブラウザで開けば動きます!(ローカルファイルからは動きません)

<script type="module"> (async () => { const bin = await (await fetch("./main.wasm")).arrayBuffer(); const wasm = await WebAssembly.instantiate(bin); const ex = wasm.instance.exports; const add = ex.add; document.body.textContent = "WebAssembly in Zen, add(1,2) = " + add(1, 2); })(); </script>

簡単ですね!

別途 wasm-strip を使ったビルドコマンド「zen build strip」を使うと、72byteまで縮みます。

ランタイムがなく、追加容量なしでプログラムを分かりやすく整理できる(抽象化)Zen言語。
大規模Webアプリ開発にも使える予感!何かのアプリで実証してみたくなりますね!

links
- Zen言語で LPC810 Arm組み込み開発、Zenbedded!
- 言語づくりという解決手段、高速安全コンパクトなZen言語で簡単組み込み開発 on IchigoJam with zen4ij
- RustではじめるWebAssemblyはじめのいっぽ、足し算するwasmファイルは116byte
- IchigoJam BASIC on the web by WebAssembly

モダンでC言語以上の記述力、Zen言語でLPC810のベアメタルエルチカに成功!
LPC810は、NXP社製Arm Cortex-M0アーキテクチャーの最大30MHz動作する32bit CPU、RAM1KB、ROM4KB。

こちら、プログラム boot.zen。マシン語版からの移植がスムーズかつ、可読性高い!

const SYSAHBCLKCTRL: u32 = 0x40048080; const FLASHCFG: u32 = 0x40040010; const PINENABLE0: u32 = 0x4000C1C0; const GPIO_DIR0: u32 = 0xA0002000; const GPIO_NOT0: u32 = 0xA0002300; const WAIT_CNT: u32 = 400000; export fn reset() noreturn { @intToPtr(*mut u32, SYSAHBCLKCTRL).* = 0b0011011001; // WKT:off, SCT:off, SWT, GPIO, I2C:off, FLASH, FLASHREG, RAM:off, ROM:off, SYS @intToPtr(*mut u32, FLASHCFG).* &= 0b11; // flash no wait: set 0b00 @intToPtr(*mut u32, PINENABLE0).* = 0xFFFFFFBF; @intToPtr(*mut u32, GPIO_DIR0).* = 0b1100; // PIO0_2 and PIO0_3 while (true) { @intToPtr(*mut volatile u32, GPIO_NOT0).* = 0b0100; // toggle PIO0_2, GND PIO0_3 var waitcnt = WAIT_CNT; while (waitcnt > 0) { asm volatile ("nop"); waitcnt -= 1; } } } export const RESET_VECTOR: fn () callconv(.C) noreturn linksection(".vector_table.reset_vector") = reset; export const DUMMY linksection(".dummy") = [5]u32 { 0, 0, 0, 0, 0 }; export const VALID_CODE: u32 linksection(".valid_code") = 0xEFFFFBDF; // 0x100000000-0x10000400-0x21

リンクスクリプト linker.ld とビルド用の Makefile を用意して、make、できあがり! サイズはたった96byte!ROM4KBの2.3%しか使ってません。マシン語もインラインでさらっと使える。(src on GitHub接続方法)


欲しかったZen言語の書籍「The Zen Book」と「Zenbedded」ゲット!
そういえば、Zen言語と、IchigoJam、両方色相環カラーリング。
色相環で光るネクタイ。Zen言語でパワーアップしよう!

links
- ごきげんよう、Zenへようこそ | Reduce your stress with the C language
- C言語よりコンパクトに! Zen言語開発者からのプルリクとマシン語の気持ち
- 言語づくりという解決手段、高速安全コンパクトなZen言語で簡単組み込み開発 on IchigoJam with zen4ij

Zen言語で作るIchigoJamプログラム zen4ij、なんとZen言語開発者自ら早速改造!?

実機で動かすため、IchigoJamのはんだづけもしてくれました!無事LEDが光り、PCとのUSBシリアル接続もOK。久利寿とオンラインで話しつつコンパクト版にトライ、動いた! 最終的なサイズは、112byte。C言語より4byte、Arm thumbのマシン語で2命令少ない!


zen4ij に、プルリク送ってもらって、こちらの環境でも確認、マージ完了!
(プルリク=プルリクエスト=改善案置いておくからよかったら引っ張って使ってねという意味、マージ=改善案を採り込むこと、共にGit用語)

Zen言語の使い方や、ビルドのコツを直接聞くことができた。サイズ縮小のポイントとして不要セクションの削減が肝だった。下記が改良版 かわくだりゲーム in Zen言語(switch構文がいい感じ)

const ij = @import("std15.zen"); export fn main() callconv(.C) i32 { ij.cls(); var x: i32 = 15; var score: i32 = 0; while (true) { ij.locate(x, 5); ij.putc(236); ij.locate(ij.rnd(32), 23); ij.putc('*'); ij.putc(10); ij.wait(3); switch (ij.inkey()) { 28 => x -= 1, 29 => x += 1, else => {}, } if (ij.scr(x, 5) != 0) { break; } score += 1; } return score; }

公平を期すため rust4ij も改良、ただ同じく不要セクションを消しても Rust 版では 124byteと、Zenの112byte、C(gcc -Os)の116byteに及びませんでした。 なぜ、サイズが違うのか?それは、それぞれのコンパイラが出力するマシン語に差があるからです。コンパクトなプログラムでいろいろ見比べると個性があっておもしろい!

果たして、どこまで小さくなるのか?
コンパイラを使わず、asm15マシン語でプログラムしてみたところ、96byteで実装できた! (追記、Thanks 100→98byte @fujitanozomu さん!98byte → 96byte @fujitanozomuさん)

PUSH {R4-R7,LR} 'cls R7=#CC R7=[R7]W GOSUB R7 R4=15 ' X R5=0 ' S 'putc R7=#C4 R0=[R7]W R12=R0 'locate R7=[R7+(#CE-#C4)/2]W @LOOP 'locate X,5 R0=R4 R1=5 GOSUB R7 'putc neko R0=#EC GOSUB R12 'rnd(32) R0=32 R6=#C0 R6=[R6]W GOSUB R6 'locate R0,23 R1=23 GOSUB R7 'ptuc *, enter R0=#2A GOSUB R12 R0=10 GOSUB R12 'wait 3 R0=3 R6=#D6 R6=[R6]W GOSUB R6 'inkey() R6=#CA R6=[R6]W GOSUB R6 R0-28 IF !0 GOTO 2 R4-=1 R0-29 IF !0 GOTO 2 R4+=1 'scr(X,5) R0=R4 R1=5 R6=#D0 R6=[R6]W GOSUB R6 R5+=1 R0-0 IF 0 GOTO @LOOP R0=R5-1 POP {R4-R7,PC}

IcihgoJam APIは、アドレスの8bit範囲内に16bit範囲内の関数ポインタを書き込んであり、ファームウェアのバージョンが変わっても使用できるMSXのBIOS的な仕組みを採っています。(例、CLSの呼び出し)

'cls R7=#CC R7=[R7]W GOSUB R7

削減のポイントは、使える命令が限定されるハイレジスタ(R8以降)で、唯一関数内で値を保存せず使用してよいレジスタ、R12を繰り返し使用するAPIのキャッシュとして使用したところです。 だいぶ最適化が進むコンパイラ技術ですが、まだ発展の余地があるってことですね!

ちょうどネコのキャラクターパターンが96byte目からなので、#700からマシン語を書き込んでも動きます!

POKE#700,240,181,204,39,63,136,184,71,15,36,0,37,196,39,56,136,132,70,127,137,32,70,5,33,184,71,236,32,224,71,32,32,192,38,54,136,176,71,23,33,184,71,42,32,224,71,10,32,224,71,3,32,214,38,54,136 POKE#738,176,71,202,38,54,136,176,71,28,40,0,209,1,60,29,40,0,209,1,52,32,70,5,33,208,38,54,136,176,71,1,53,0,40,219,208,104,30,240,189 ?USR(#700)

コンピューターに初めての触るこどもから、ガチなエンジニアまで、幅広く楽しめるIchigoJam。 そのヒミツを書いた「情報処理 2020年8月号 (日本語) 雑誌」 now on sale!

この度、情報処理学会の会誌『情報処理』に「プログラミング...

上松 恵理子さんの投稿 2020年7月20日月曜日


今日のおやつ、いちごティー

日本社会にテクノロジーが根付かない原因は信頼か? 独自開発のIoTとZen言語による解決を目指すコネクトフリーCEO、帝都久利寿さん。 マイクロソフトと任天堂があるシアトル出身、5才からプログラミングし、10代で会社を売却し、単独来日、再び創業。 日本&技術好きの同志。

プログラムが使うメモリ、使ったまま忘れたり、使ってはいけないところを触るとソフトウェアは停止する。 このいわゆるバグは、アプリを使う人をイライラさせ、車や社会インフラなどで起きると多大な影響を引き起こす。

現在主力となっているプログラミング言語の解決方法に、自動的にメモリを回収する仕組みを使う方法(GoやTypeScriptなど)、所有権という概念を入れて管理する(Rust)という方法がある。 Zen言語はそのどちらでもなく、後片付け構文とメモリ確保の明確化で安全にするというアプローチ。

IchigoJam BASICでは、そもそも使うメモリ量を固定化しているため問題が起きない。 Zen言語はこの古典定期かつ堅牢なメモリ使用方法を、一段上位で管理するイメージ。

GCを使う言語はランタイム(作ったプログラムを動かすために必要なベースプログラム)で容量が大きくなってしまうが、ZenはRust同様、ゼロランタイム。 IchigoJamなど、小さな組み込み用途にも使える。


zen4ij - Zen language for IcihgoJam
早速実験「かわくだり」のZen言語版が動いた。コンパイル済みバイナリ124byteと小さい。
(参考、Rust版 132byte、C版 116byte、Ruby版 325byte + runtime 2,376byte)

const ij = @import("std15.zen"); export fn main() i32 { ij.cls(); var x: i32 = 15; var score: i32 = 0; while (true) { ij.locate(x, 5); ij.putc(236); ij.locate(ij.rnd(32), 23); ij.putc('*'); ij.putc(10); ij.wait(3); const c = ij.inkey(); if (c == 28) { x -= 1; } if (c == 29) { x += 1; } if (ij.scr(x, 5) != 0) { break; } score += 1; } return score; }

IchigoJam BASICのかわくだり 150byteとの比較

10 CLS:X=15:S=0 20 LC X,5:?CHR$(236) 30 LC RND(32),23:?"*" 40 WAIT 3 50 C=INKEY() 60 X=X-(C=28)+(C=29) 70 IF SCR(X,5) ?S:END 80 S=S+1 90 GOTO 20

@マークで始まるものはZenの組み込み関数、std15.zenにてIchigoJamのAPIを定義している。 例えば、1文字表示するij.putcは、下記のように定義し、IchigoJam APIと接続している。

pub fn putc(x: u8) void { const addr = @intToPtr(*u16, 0xC4); const f = @intToPtr(fn(u8) void, addr.*); f(x); }

u8は、符号なし(unsigned)8bitの意味。Rustに似ているが、関数の返り値型に"->"が不要でよりコンパクト。 @intToPtrを使うことで、物理メモリにもアクセスできるので、OSづくりにも対応できる。(Rustではunsafeを使用する)


Zen言語のドキュメントだけでなく,コンパイラのエラーも日本語対応!優しい! (コンソールで export LANG=ja と設定してみよう)
ごきげんよう、Zenへようこそ | Zen Language Documentation


IchigoDyhookがあれば、亀蔵でもサクっと取り出し、 IchigoJam BASIC プログラミング!
久利寿氏、超久々のBASICでPRINT/GOTOループを決めているところ。

社会のあちこちで活躍するソフトウェアだが、本領発揮はまだまだこれから!
日本のソフトウェア技術力、どんどん上げていこう!


@yrm__ (IchigoLatte MINIScript)、 @kristopher (Zen language)、 @taisukef (IchigoJam BASIC)
国産言語プチサミット in 鯖江!

links
- C言語よりコンパクトに! Zen言語開発者からのプルリクとマシン語の気持ち

インターンDay9、永平寺町のエボリューション大使に就任したあみるが来てくれました!

Stand-up, less meetings / Pairing / TDD / CI/CD / Retro / Constant evolution とシリコンバレースタイルを解説。

その中でひとつ、TDDをIchigoJamで解説してみます。
例えば、こちら四捨五入を作る、IchigoJamプリントをTDDで作ってみます

まずは簡単に1の位を切り捨てるプログラムのテストコードを書きます

10 N=45:GOSUB100:IF N=40 ?"TEST CLEAR!1" RUN Line error

GOSUB100としているのに、100行がないのでエラーになりました。
ひとまず何もしない100行をつくりましょう

100 RETURN Not match in 110

今度はプログラムが終わらずRETURNにいってしまったので、ENDを追加。

99 END RUN OK

「TEST CLEAR!」と表示してくれません。何もしていないのでテストは失敗しました。
テスト成功するように書きます

100 N=40:RETURN RUN TEST CLEAR!1 OK

やった!テスト通った!
でも、他の数でテストすると・・・

20 N=32:GOSUB100:IF N=30 ?"TEST CLEAR!2" RUN TEST CLEAR1 OK

TEST1しかクリアしてくれません。
32でもちゃんとなるように作ってみます。

100 IF N=32 N=30 ELSE N=40 110 RETURN RUN TEST CLEAR!1 TEST CLEAR!2 OK

今度はOK!ですが、いろんな数でテストすると・・・

10 LET[0],55,50,22,20,10,10 20 FORI=0TO4STEP2:N=[I]:GSB100 30 IF N!=[I+1]?"ERR!";[I]:END 40 NEXT RUN ERR!55 ERR!22 ERR!10 OK

どんな数でも切り捨てるように、ちゃんと書きます。

100 N=N/10*10 RUN OK

うまくいきました!

このように、求める結果をまず書くのが、TDD(Test Driven Development = テスト駆動形開発)です!
お試しとして、四捨五入するプログラムのTDDもやってみましょう!


こちら、エボリューション大使、あみるのオフィス、永平寺町、四季の森文化館


Zen x Programming のワークショップが始まっています!


さくらインターネット高橋さんと永平寺町役場へ訪問!
まずはステキな結果を想像して創造する、福井エボリューション楽しみです!

Zen x Programming、インターンブログにも!
ZEN力開発! - jigintern2018’s diary


永平寺町のうたPV」公開!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / RSS