福野泰介の一日一創 - create every day

音は数学と物理でできています。
何かが1秒間に440回振動すると「ラ」の音、440Hz。
倍の880回だと1オクターブ高い「ラ」。220回だと1オクターブ低い「ラ」。

こちらがオクターブ1の「ド」からオクターブ5の「シ」までの、周期の半分の8bitに収まる数値、60コ、60byte。これをテレビ画面に1ライン引くために使っている、15.7068kHzで動くタイマーを流用して鳴らしています。 流用しないで別途タイマーを使うこともできますが、サーボやモーターの速度制御に使う分を確保するとあまりがありません。

240, 226, 213, 201, 190, 179, 169, 160, 151, 142, 134, 127, 120, 113, 106, 100, 95, 89, 84, 80, 75, 71, 67, 63, 60, 56, 53, 50, 47, 44, 42, 40, 37, 35, 33, 31, 30, 28, 26, 25, 23, 22, 21, 20, 18, 17, 16, 15, 15, 14, 13, 12, 11, 11, 10, 10, 9, 8, 8, 7

今回このタイマーをひとまず倍速で動かし精度を上げてみようと思いましたが、1ライン描画するタイマー処理と重なってしまうため、きれいな周期で鳴らすことができず断念。VIDEO0でビデオ出力を止めた時のみ音痴が直るという実装方法ならありかもしれません。 ひとまず今回は倍速化までで容量オーバー。

IchigoJam 1.3.2β16 - 「ichigojam-1.3b16.zip
(VIDEO0にした際のサウンド倍速化(暫定版)、ビデオ表示調整(VIDEO3以降)、複雑な式でComplex expressionがでるように変更)


付属の圧電サウンダーから、「エイリアンスピーカー」や、ステレオ端子経由やアンプ経由でスピーカーにつなぐとだいぶ良く聞こえます。

SOUND端子ではなく、OUT5端子などに接続し、プログラムで音痴を回避する方法もあります。
IchigoJamのPLAY文と似ているMML風に書くとPWMを使って鳴らしてくれるプログラムが、KidsPod;に公開されています!(by イチゴジャムおじさん
ジングルベル PWM_MUSIC/Kidspod;
PWM_MUSICの検索結果/Kidspod;

平均律に近い音階の周期データを計算するC言語のプログラムはこちら!

#include <stdio.h> #include <math.h> int main() { int vsync = 3056; int cpuhz = 48000000; int cnt = 0; for (int i = -33; i <= 26; i++) { double freq = pow(2, (double)i / 12) * 440; double len = 1.0 / freq; double d = len / ((double)vsync / cpuhz); int n = (int)(d + 0.5); //printf("%f %f %d\n", freq, d, n); printf("%d, ", n); cnt++; } printf("\nlen: %d\n", cnt); return 0; }

進む、jigインターン2019の選考プロセス。面接で好きなプログラミング言語を聞いて、C言語と答える高専生は割と多い。 黒い画面にテキストで動く地味なプログラム、それで楽しさは伝わるのだろうか?

中学生の頃、その頃のパソコン好きが辿った、BASIC、Z80マシン語の次のC言語。妙に気に入ったのが、ファイル変換プログラム。バイナリデータをテキストに変換するプログラム(matsumoto)や、K&Rスタイルしか対応していなかったMSXのC言語をモダンに使えるように変換するプログラムなど、BASICでは遠かった実用性を感じて感動。

時は現代、IchigoJamβのバグフィックス。C言語なくてはありえない24KBのOSづくり。スクリプト言語ではランタイムが収まらず。マシン語で書くには複雑すぎる。 C言語の魅力は、生成されるマシン語が想像でき、コンピューターの本来の力をほぼ最大限に引き出してあげられてる感にある。

コンパイラが生成したLPC1114用24KBのバイナリをAPI追加するポストプロセス。インテルHEXファイルに反映し忘れていた不具合を直すため、変換プログラムを書く。 RubyでもPythonでもJavaでもJavaScriptでも書けるが、エコなC言語が気持ちいい。このくらいの規模だと、自作コンパイラでも手が届く。


「bin2hex.c - バイナリデータからインテルヘックスファイルへの変換プログラム in C」

このプログラムを使ってできあがったもの
IchigoJam 1.3.2β15 - 「ichigojam-1.3b15.zip
(USキーボードで効かないキーがあった不具合修正、HEXファイルでAPIが使えない不具合修正)

API呼び出しサンプルプログラム RNDを使ったサイコロプログラム(for IchigoJam 1.3.2b15)

10 LET[0],#21C0,#8809,#4708:?USR(#800,6)+1 RUN 5

地味ゲー好きだとカミングアウトしてくれた鯖江の少年に後押しされて誕生したIchigoJam。 自動運転、キラキラVR、ロボット、ドローンなど、派手な応用領域も地味なファイル変換も根っこは同じ、コンピューターとの対話、プログラミング。


福井県小中学生 プログラミング・フェス
福井新聞との取り組み、小中学生プログラミングフェスも4年目!
今年の舞台は禅のふるさと、福井県永平寺町の曹洞宗の大本山、永平寺。
座禅とプログラミングで、自分自身をアップグレードし続ける楽しさに気づけるか!?

去年大活躍した、自分でプログラミングする自動運転車「らでぃっしゅ」今年も登場!


プログラミングフェス2018の様子を、福井県町の岩田さんが取材してくれた様子。
体当たり撮影「すごい」県庁職員 福井県広報課の岩田早希代さん | 政治・行政 | 福井のニュース | 福井新聞ONLINE

伝えよう、世界中のどこにもないものを創り出せるワクワク感。

links
- 福井県小中学生 プログラミング・フェス

bin2hex.c

#include <stdio.h> void out(int address, char* buf, int nbuf) { int crc = nbuf + address + (address >> 8); printf(":%02X%04X00", nbuf, address); for (int i = 0; i < nbuf; i++) { printf("%02X", buf[i] & 0xff); crc += buf[i]; } printf("%02X\n", -crc & 0xff); } int main(int argc, char** argv) { char buf[16]; int nbuf = 0; int address = 0; for (;;) { int c = getchar(); if (c == EOF) { if (nbuf > 0) { out(address - nbuf, buf, nbuf); } printf(":00000001FF\n"); break; } buf[nbuf++] = (char)c; address++; if (nbuf == 16) { out(address - nbuf, buf, nbuf); nbuf = 0; } } return 0; }

IchigoJam BASICでコンピューターを操る楽しみを知り、マシン語でその正体を知ったら、人類の英知コンパイラを学び、広がり続けるプログラミング言語、開発ツールの海へと出港しましょう!

コンパイラとは人間とマシン語をつなぐ翻訳者。やってほしいこと(アルゴリズム)を0と1の並びへと変換してくれるソフトウェアのこと。

福井高専電子情報工学科にもコンパイラという授業がありました。講義を単に受けるのではなく、自分でコンパイラを作りながら学ぶのが近道で楽しいのでオススメです。

C言語はその代表格。その機能限定版を実際のソースコードを読んだり、改造するのが近道です。自分だけのプログラミング言語づくりも簡単に楽しめる、コンパクトな実装「ci0 - ミニCインタプリタ」を発見。Macで動くように編集してみました。(src on GitHub

$ cat test0-hello.c int main() { println("Hello World!"); return 0; } $ ./ci0 test0-hello.c Hello World! $ ./ci0 -trace test0-hello.c 0: int ************** execute ***************** entryPoint = 2 2: entry 3: addsp int 0 4: push str "Hello World!" 5: call str println Hello World! 6: addsp int 1 7: push int 0 8: ret

このコンパイラ、字句解析、構文解析、VMまで含めて512行ととっても短いのが特徴です!
for文に対応していないなど、言語仕様は極力削ってあるので、欲しい構文を好きなように追加することも楽しめます。

VMはJavaVMやWebAssmeblyと同様のスタックマシン(mrubyはレジスタマシンなのでちょっと違う)になっていて、中間コードを見たり(-codeオプション)、実行内容を見たり(-trace)もできます。

WebAssemblyのビットコードを出力するようにして、ブラウザ上の開発環境にしてみたり、IchigoJamで動くCコンパイラに挑戦するのもおもしろそう。

links
- ミニCインタプリタ (言語処理入門 by Minoru Hatada 氏)
- 高専でなぜC言語を学ぶのか? IchigoJamマシン語生成プログラム c4ij で作る、C言語版かわくだり
- オールマシン語かわくだり - API対応 IchigoJam 1.3.2β12
- mruby VM level 1 in 2KB / 実用最小限VMとIchigoJam BASICと動かす組込Ruby

APIに対応し、オールマシン語でかいた「かわくだり」、APIをC言語環境から呼び出せる環境を整えたC言語用ヘッダファイル std15.h を作って、C言語版も作ってみました。 PCとUSBシリアルケーブルを手に入れれば、BASICではできないスゴイモノが簡単に作れます!(マシン語をハンドアセンブルすれば、PCがなくても同等以上のものは作れます)

#include <std15.h> __attribute__ ((section(".main"))) int main(int param, int ram, int rom, int (*divfunc)()) { cls(); int x = 15; for (;;) { locate(x, 5); putc('O'); locate(rnd(32), 23); putc('*'); putc(10); wait(3); int c = inkey(); if (c == LEFT) x--; if (c == RIGHT) x++; if (scr(x, 5)) break; } return x; }

IchigoJam BASIC に慣れた人なら読めますね!(IchigoJam BASIC版、Ruby版
#include というのは、コンパイラ向けの命令で、その後ろに書かれた std15.h というファイル名のファイルの中身をまるっと取り込んでくれます。 このファイルの中に main cls locate などが何なのかが書いてあります。(通常のC言語では stdio.h というファイル名をincludeしますね)

std15.h の中身はこのような感じ。IDを覚えていなくても、分かりやすい名前で呼び出せて、コンパイルする際、間違った使い方は警告してくれるなど、いたれりつくせり。

typedef unsigned int uint32_t; typedef unsigned short uint16_t; typedef uint32_t (*IJFUNC_P1R)(uint32_t n); #define rnd(n) ((IJFUNC_P1R)(void*)(uint32_t)*(uint16_t*)0xC0)((n))

生成されたコードサイズは、108byte、オールマシン語で作ったものが 90byte だったので20%ほどコード量が増えてしまってますが、十分に小さいのでOKですね。 使える容量は、#700-#7FFまでで256byte、変数を使わないことにすれば512byteまで。プログラム領域#C00以降にPOKEコマンドで書き込むように変更すると、1KB近くまで使えます。

ダウンロードはこちら(IchigoJam 1.3.2b12 以降用)
IchigoJam/c4ij: C language for IchigoJam」 - src on GitHub

マシン語を読みたいときは、 make dasm とすると、マシン語コードを表示します。コンパイラがどのようなマシン語にするか辿って、どこに無駄があるか読んでみるもまたおもしろいですよ。

某現役高専生による高専生のためのC言語連載が始まりました!
C言語 - Part.0:C言語とは - 某高専生の某高専生による高専生のための...
ただ、C言語、初めてプログラミングとしていきなり学ぶのはオススメしません。

まずは、IchigoJam BASIC、JavaScript、Python、Ruby、Unity、何でもいいので、サクッと簡単に楽しいゲームが作れることを体験しましょう。 便利なツールを使って、実現したいことを最短で実現し、もっとやってみたい!と興味を持つことが何より大事です。

コンピューターの気持ちが気になったら、コンピューターの構造(アーキテクチャ)、マシン語、C言語、現代言語の順に学ぶのがオススメです。

マシン語を触ってコンピューターの真の力を体感し、ちょっとしたプログラムを作るのに苦労してもらった上で、C言語のコンパイラに触れると、もう一度コンピューターってすごい!となれます。 もっと楽しく、もっと速く作りたい!という思いが、Python、Ruby、JavaScript、Go、Javaなどの言語を産みました。

なぜC言語を学ぶのか、それは、それらのモダン言語と言われている言語自体を作った言語がC言語だからです。

光るもの、いいですよね!
フルカラーに輝くLED、WS2812Bは1ツブ約10円!
自由自在に制御して、ステキな演出してみませんか?

こちら、光るメガネの制御実験

Maker Faire Kyoto 2019の帰途、京都駅の階段イルミ。
WS2812B系を多量に使ったと思われる、階段アートにひとだかり。地元でもチャレンジしてみたい?

多量につくるためには、極力安く作りたいので、複雑な制御も65円で買ったLPC810だけでやってみます。

開発環境を用意して、USBシリアルケーブルでPCと接続して、開発、転送。
taisukef/devkit-lpc800: devkit for LPC800 series in C

今回、ボタンを1つ、つけました。
WS2812Bの制御などは、マシン語をasm15でC言語形式に出力して組み込んでいます(ws2812b.h)。

開発言語はC言語、キラキラするエフェクトはこういうプログラムで動いてます

int flash(int len) { int v = 40; for (int j = 0; j < 300; j++) { clear(); set(rnd(len), rgb(v, v, v)); flush(); if (btn()) wait(5000); else wait(50000); } return 0; }

LPC810、コンピューターに書き込んでしまえば、あとは電源接続するだけで動きます!
(IchigoJamプログラミング体験で、やっている通り!)

マトリクス状のLEDを制御したり、同じように大きく並べることで、イルミネーションができあがります。

IchigoJamからシリアルや、I2Cで手軽に使えるキットにするのもいいかも?

Hana道場から商品化され、鯖江と明和電機秋葉原店で買える「光るネクタイ
付属のLPC810でもオリジナルイルミづくりチャレンジできます!

mrubyのmgemのように、IchigoJamをC言語で拡張する方法をつくりました。
最大バイナリサイズ、なんと3KB!

IchigoJamのプログラムは、USBシリアル経由でターミナルなどで接続すれば、PS/2キーボードやテレビを用意することなく、らくらく開発! 完成したプログラムをサクっと転送するのに便利なツール「bas2bin for IchigoJam

これを使えば、BASICのファイルをIchigoJamに書き込むバイナリファイルにできるので、4ファイルまとめて書き込めるので、ワークショップ用などでまとめて準備する時、実製品として出荷するときなどに便利です。(初公開は2016/2/28

今回、C言語でつくったマシン語プログラムをIchigoJamのファイル1〜3へ書き込み、呼び出すマシン語プログラムを追加開発!

bas2bin/src/main.c の、main関数を使って開発し、ファイル1-3の3KBへ書き込んだプログラムを、ファイル0に書き込んだ起動用マシン語が入ったBASICプログラムから呼び出します。

__attribute__ ((section(".MAIN"))) int main(int param, int ram, int rom, int (*divfunc)()) { //return param + 1; return divfunc(100, param); // == 100 / param }

* 割り算はIchiogoJam内のバイナリを使えるので、400byte節約できます。

呼び出し用、ファイル0におかれる IchigoJam BASICプログラム (entry.bas)

1 '3KB asm 10 POKE#700,3,180,5,73,8,120,1,40,0,208,4,73,5,49,139,70,3,188,88,71,112,71,0,0,0,100,0,0,0,116,0,0 20 ?"100/3=";USR(#700,3)

実行すると、100/3の「33」と表示され、無事マシン語が呼び出されたことを確認できます。

IchigoJamはOSサイズ24KB、LPC1114FDH28のROMサイズ32KBの後ろ8KBをユーザーファイル用としています。 残念なことに4KB単位でしか消去できないので、1KB x 4のユーザープログラムを交互に書き込む仕組みになっています。

この後ろ3ファイル、3KBにマシン語をおき、25KB目か29KB目のどちらかマシン語がある方を呼び出しています。 FILESで見ても、1-3は何もでなかったりおかしな表示になる部分が、マシン語です。 先頭4byteを使って、マシン語が書き込まれているかどうかを判定しているので、厳密には3068byte(3KB-4B)まで。 利便性を削って、ファイル0の領域にも食い込ませれば、約4KB使ったオールマシン語プログラムも!

IchigoJam、どんな拡張しましょう!?
初回起動時に動く、すごいデモプログラムを作るのも楽しいかも!

bas2bin for IchigoJam - src on GitHub

呼び出し用のマシン語プログラム、asm15ソースがこちら (entry.bas)

PUSH {R0,R1} R1=[@FILE1A]L R0=[R1] R0-1 IF 0 GOTO 2 R1=[@FILE1B]L R1+=5 R12=R1 POP {R0,R1} GOTO R12 @FILE1A DATA L (24+1) * 1024 @FILE1B DATA L (24+4+1) * 1024

ファイル1の場所にマシン語があるかどうかチェックして、破壊可能なレジスタR12を使って呼び出し!

links
- USB-シリアルモジュール - ショップのふうせん
- はじめてのマシン語 - IchigoJamではじめるArmマシン語その1
- Ruby on Jam! IchigoJamで動くROM8KBのミニ Ruby VM と、mruby ver2.0対応はじめのいっぽ - mmruby for LPC1114

30年前の今日、1989年3月12日、ティム・バーナーズ=リー氏「web」を発明!
The original proposal of the WWW, HTMLized

インターネットで結ばれたコンピューター内の文書同士をリンクで結ぶというシンプルなコンセプトと、オープンなシステムは、瞬く間に広がり、世界中を覆った。 ただ、世界中に兆単位にある文書をすべて辿ることはもはやコンピューターでも不可能。

リンクに意味をつけるだけで整理できるティム氏による更なる発明「セマンティック・ウェブ」は、同氏提唱の「5つ星オープンデータ」と共に花開く。

そろそろ本ブログも次世代webへと移行しなければと、まずはリンクだけを整理したJSONデータを作成。
ひとまず、webアプリとしてグラフ表示してみたのがこちら。(これでも一部))

とても、手におえないので、直近300件の相互に何らかのリンクがあるもののみの表示としたものがこちら。

一日一創 graph
ブログ内でのリンクを可視化し、タップまたはクリックでそのページを開く。
リンクのつながりで、関連ある塊感だけがわかる状態。

シンプルなリンクは世界中をつないだ偉大なアイデア!
ただ、世の中を整理するには不十分。
例えば、福井県と鯖江市をつなぐリンク。これだけだと、ただの関係としてしかわからない。
ここで、意味付きリンクの出番となる。

福井県内にある市町のひとつであるなど、組織の含有関係をことを示す「意味付きリンク」でつなげば日本にいくつ市があるか瞬時にわかり、世界中の自治組織がすべて整理できる。

本ブログ内のリンクはまだ意味がついていない状態。
まずは、自分のオープンデータを整理しながら、次世代web化のメリットを明らかにしていきたい。

links
- Web will connect world as one! (web25周年)

G空間ハッカソンから、G空間ごはん会。
インターナショナルオープンデータデイ2019の前夜祭!

今回の成果、5チーム、5アイデアの発表がこちら!

G空間ごはん会、サバエドッグをもぐもぐしつつ、インプットタイム。今日のG空間テーマは「衛星データプラットフォーム Tellus

アイデア出すだけなら簡単です!

アイデアは組み合わせ!


アイデアは量!


質はひとまず後回し。出してみないとわからないおもしろさ。作ってみないとわからない本当の価値。


3人-4人で一チーム、まずは一人一テーマだして、表の一列目に記入。


続いて、一行目に、衛星、レーダー、IoTを書き、テーマと組み合わせて15秒で、みんなで思いついたアイデアを記入!


一気にできた9アイデアからベストアイデアをチーム内で決めて、1枚のプレゼン資料にまとめます!
タイトルやイメージにインパクトがあるといいですね!

こちらができた、アイデアシート。



発表タイム!

竹部賞は、レッサーパンダを救え!衛星、レーダー、IoTを駆使して、野生のレッサーパンダの生体を追いかけようというアイデア。

G空間ごはんタイム!ちょっとずつ、みんなでつくろうG空間アプリ!

人類が手に入れた宇宙からの目「Tellus」、楽しく活用していきましょう!
* 高精細な宙の目、まだ見られるエリアと期間が限定的な様子

G空間ごはん会、次回は2019.3.15(金)夕方、Tellusのオウンドメディア「宙畑」さん、緊急来福!
どうぞお楽しみに!

地方自治体職員が集結、未来の行政運営を研究する、公益財団法人 日本都市センターの第5回都市調査研究交流会にて、基調講演とIoT、webアプリのハンズオンワークショップを開催しました。
オープンデータで創る地方の未来―オープンデータのトップランナーになるには―


オープンデータとIoTが注目される理由、活用事例を紹介しつつ、実際に手を動かしてもらうハンズオン形式。 プログラミングで制御するLED、IoTで集めるデータ、スマホで制御するIoTをIchigoSodaで体験。 後半は、ノートPCを使ってオープンデータでよく使われる地図アプリを実際、GitHubのアカウントを作って、自分で作ってみるwebアプリワークショップ。 SPARQLも少し紹介できました。


地図アプリ向け、かんたん地図フレームワーク「egmapjs」
チュートリアルを作りました。ぜひ、みなさんで挑戦してみてください!


マップアプリづくりハンズオン(地理院地図編) 地図簡単フレームワーク egmapjs (PDF)
こちらは、スライドオープンデータ。

何かつくった自慢や、ご質問など、サポートはFacebookグループ「Code for Fukui」までどうぞ!

links
- 消火栓へゴー!? かんたんマップアプリづくりハンズオン(egmapjs 地理院地図編)スライド公開 - G空間ハッカーはじめのいっぽ
- はじめようG空間ごはん会 - 福井生まれのG空間9アプリレビューとアイデア集 / 総務省主催ハッカソンレポート Geospatial Hackers Program in 福井

日本人男性の5%、日本人女性の0.2%が色弱という。
色覚特性について|メガネスーパー 眼鏡(めがね、メガネ),コンタクト,サングラス,補聴器販売
フランス・北欧の男性では10%と、そう珍しいことではありません。(色覚多様性 - Wikipedia

この色なんだろう?色を通じた子供とのコミュニケーションにも活用してもらえればと、
WebMegane colorsight」をもっとスマホで手軽につかえるバージョン「iromieru / いろみえる」を開発!


iromieru / いろみえる
色名は「JIS慣用色名 - Wikipedia」を利用しています(colorjis.js / colorjis.csv

色覚特性の人は”Super Green Eyes”の持ち主!
色覚特性(いわゆる色盲・色弱)の人は微妙な「緑」の違いを容易に識別できるといわれています。
色覚特性について|メガネスーパー
人も自分と同じように見えていると思ってしまいがちですが、大間違い。
色覚特性を細かく計測するアプリを作ってみたいですね。

MacBook Pro など、カメラ付きのPCでも動きます!
この色なんだろう?を手軽に解決!?

iromieru src on GitHub

ARアプリのテンプレートとしても活用ください!
WebMegane colorsight も、JISカラーに対応版にバージョンアップ!

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