以前紹介した、5コ950円で買える、安価でIchigoJam BASICだけでも使える超音波センサー「HC-SR04」。 他デバイスとの関係で、どうしてもBTNを使いたいとご要望あり。


できました!IchigoSodaにつないでIoT化していますが、IchigoJam、IchigoDakeでもOKです!

BTNはIchigoJam付属のボタンとSLEEPからの復帰のため外部でプルアップ抵抗をつなげていて、ANA(0)としてアナログ入力としても使えます。 つまり、CPU内部の設定としてはアナログになっているので前回紹介したマシン語で読み出そうとしてもうまくいきません。


BTNを割り当てているPIO1_4、LPC1114のデータシートの IOCON_PIO1_4 (アドレス#40044094) を見ると設定方法が書いてあります。 一度、マシン語を使ってどういう設定になっているか読み出してみましょう。

R0=[@IOCON_PIO1_4]L R0=[R0]L RET @IOCON_PIO1_4 DATA L #40044094

asm15でアセンブルして、読みだした値を8桁の2進法で表示

POKE#700,1,72,0,104,112,71,0,0,148,64,4,64 OK ?BIN$(USR(#700,0),8) 01000001

2:0 つまり最下位の0bit目から2bit目の3bitを使ったFUNCは1、次の2bitのMODEは0(プルアップなどなし)、次の1bitのHYSは0(無効)、6bit目はReservedとして予約されていて1を設定することになっていて、7bit目ADMODEが0でアナログ入力モードとなっています。

これをADMODE:デジタル入力+FUNC:PIO1_4と、`11000000 に一時的に変更する作戦でいきます。前回のカウントプログラムの前後にこの設定を足します。

PIO1のベースアドレスは #50010000、BTNは、PIO1_4の場所なので
?"#5001";HEX$(1<<(4+2),4) → #50010040 を@INに設定します。

'BTN(PIO1_4) <- digital R1=`11000000 R3=[@IOCON_PIO1_4]L [R3]L=R1 'count check R0=0 R1=[@IN]L @LOOP R2=[R1]L R0=R0+1 R2-0 IF !0 GOTO @LOOP R0=R0>>9 'BTN(PIO1_4) <- analog R1=`01000001 [R3]L=R1 RET @IOCON_PIO1_4 DATA L #40044094 @IN DATA L #50010040 'BTN=PIO1_4

アセンブルして、BASICのプログラムと組み合わせて、できあがり!

10 POKE#700,192,33,6,75,25,96,0,32,5,73,10,104,64,28,0,42,251,209,64,10,65,33,25,96,112,71,0,0,148,64,4,64,64,0,1,80 20 OUT1,1:OUT1,0:?USR(#700,0) 30 WAIT 5:GOTO 20

マシン語でカウントした値、R0をBASICに返す前に9ビット右シフト、つまり512分の1にしています。マシン語のカウントだと速すぎて大きな値になってしまうからですが、ここをいじると精度アップが見込めます。 ただ、IchigoJamでは1秒間に1.5万回くらい画面表示用の割り込みが発生するので、高い精度で計測するには割り込みを一時的に止める必要があります。

CPSID R0=0 R1=[@IN]L @LOOP R2=[R1]L R0=R0+1 R2-0 IF !0 GOTO @LOOP R0=R0>>5 CPSIE RET @IN DATA L #50001000 'IN1=PIO0_10

割り込みの一時停止は CPSID、最下位は CPSIE です。戻し忘れると何も操作できなくなってしまいます。下記、CPSIDした後リターンする危険なプログラム、SAVEした後、お試しください。

LET[0],#B672,#4770:?USR(#800,0)

完成した、超音波センサー、TrigをIN1に接続し、精度16倍バージョンがこちら!

10 POKE#700,114,182,0,32,3,73,10,104,64,28,0,42,251,209,64,9,98,182,112,71,0,16,0,80 20 OUT1,1:OUT1,0:A=USR(#700,0):?A 25 LED A<300 30 WAIT 5:GOTO 20

一定距離から近づくとLEDがついてお知らせ、リレー経由でスゴイ照明と組み合わせると防犯ライトにもなりますね!

5 B=0 26 IF B=0 AND A<300 B=1:N=N+1:IOT.OUT N:?"IOT!";N:WAIT30 27 IF B=1 AND A>=300 B=0

IchigoSodaを使って通ったらIOT.OUTでカウントを送るように改造も簡単です!
福井県で始まった「混雑状況オープンデータ」との連携も便利そう。


Let's IoT with IchigoJam x various sensors!

links
- 200円 超音波距離センサー HC-SR04 を IchigoJam で使う方法 - Armマシン語で時間を測ろう
- 今週末は越前がにロボコン! IchigoJamで超音波センサーをIN1とは違うポートで使う方法 BASIC編 マシン語編

すっかり手軽になった基板発注、無料の基板CADソフトを使った両面基板づくりは小中学生でもチャレンジできます! そんな両面基板のエッセンスを使ったステキなゲームを発見!


配線が多くなると、表と裏の二層を使い分けて目的の箇所をつないでいく感じは確かにゲームに通じるものがありますね。

おもしろそうだったので、さくっと形にしてみましょう! IchigoJam編!

RUN on IchigoJam web

ざっくり解説する作り方。ひとまずおなじみ普通のヘビゲームを作ります。

1 'SINGLE-SIDED-HEBI 10 CLS:X=15:Y=5:A=-1:B=0:S=0:H=ASC("♥"):M=ASC("⚪"):GSB200 20 K=INKEY() 30 IF K>27 && K<32 A=(K=29)-(K=28):B=(K=31)-(K=30) 40 X=X+A:Y=Y+B 41 P=SCR(X,Y):IF P=H S=S+1:GSB200:P=0 42 IF P || X<0 || Y<0 || X>31 || Y>22 GOTO400 45 LC X,Y:?CHR$(M); 46 WAIT 5 50 GOTO 20 200 C=RND(32):D=RND(23):IF SCR(C,D) CONT ELSE LC C,D:?CHR$(H); 205 LC 0,23:?"SCORE:";S;:RTN 400 LC 10,10:?" GAME OVER ":WAIT60:CLK:FORI=0TO1:I=INKEY():NEXT:RUN

10 準備
20-50 メインループ(42 何か当たるか画面外で終了)
200-205 エサ表示サブルーチン
400 ゲームオーバー、リトライ処理

INKEY()でキー入力を受け付けて、向いている方向(A,B)にずっと動き続けるのがヘビゲーのおもしろさですね。

(RUN on IchigoJam web)

続いて、二層構造にしてみましょう。

1 'DOUBLE-SIDED-HEBI 10 CLS:X=15:Y=5:A=-1:B=0:S=0:F=0:H=ASC("♥"):M=ASC("⚪"):GSB200:GSB300 20 K=INKEY() 25 IF K=32 F=!F 30 IF K>27 && K<32 A=(K=29)-(K=28):B=(K=31)-(K=30) 40 X=X+A:Y=Y+B 41 P=SCR(X,Y):IF P=H || P=H+1 IF F=S&1 S=S+1:GSB200:P=0 ELSE GOTO400 42 IF P=F+M || P=M-1 || X<0 || Y<0 || X>31 || Y>22 GOTO400 45 LC X,Y:IF P=0 ?CHR$(M+F); ELSE ?CHR$(M-1); 46 WAIT 5 50 GOTO 20 200 C=RND(32):D=RND(23):IF SCR(C,D) CONT ELSE LC C,D:?CHR$(H+S&1); 205 LC 0,23:?"SCORE:";S;:RTN 300 C=M:GSB310:COPYC*8-8,C*8,8:C=H:GSB310:RTN 310 FORI=0TO7:POKEC*8+8+I,PEEK(C*8+I)&PEEK(24+I):NEXT:RTN 400 LC 10,10:?" GAME OVER ":WAIT60:CLK:FORI=0TO1:I=INKEY():NEXT:RUN

300-310 裏面用の網掛けした絵文字を作成するサブルーチン(追加)
25 スペースキーで裏表切り替え
41 エサは正しい面で取らないとゲームオーバーとしました
200 エサが出現する面は表と裏、交互にします

IchigoJam絵文字の白丸をキャラクターコード3の網掛け模様とビット論理積をとって合成する技! 45行で裏面表面、両方通っているところは一見わかりませんが、通れないようにしているところがポイントです。

両面基板の表裏を切り替える感を加えます。

500 C=H:GSB510:C=M:GSB510:RTN 510 T=224:COPYT*8,C*8,8:COPYC*8,C*8+8,8:COPYC*8+8,T*8,8:RTN 25 IF K=32 F=!F:GSB500

500-510 表パターンと裏パターンを交換するサブルーチン
25 スペースで切り替える時に呼び出すように追記

なかなか楽しいゲームになりました!
ワクをつけたり、ヘビの長さを制限したり、好みに合わせていろいろ改造するのが上達の近道!


ハイスコア、18点!

links
- こどもパソコン IchigoJam
- IchigoJam BASIC on the web by WebAssembly

速いプログラムを作る基本は、ループ数を減らすこと、ループ内を軽くすること。

100円のCPUでも1秒間5,000万回計算してくれますが、4K動画に必要な2500万コのLED制御、1コ1計算だとしても1秒間に2コマの紙芝居にしかなりません。 滑らかで美しい映像を計算するためには高速化が欠かせません。

計算で作る美しい映像例「ライフゲーム」、IchigoJamでも「Kubotaさんのライフゲーム - IchigoJam-FAN」にて、高速化チャレンジ中。 100円CPU、Arm Cortex-M0では、足し算、引き算、掛け算と比較して、割り算が150倍遅いことを「IchigoJamマシン語入門」で確認しました。では、普通のPCではどうでしょうか?

MacやWindowsは、Intel/AMDのx64アーキテクチャーが大半です。Intelの資料によると、レイテンシー(ざっくり実行してから結果がでるまでの時間)で、掛け算(MUL)は足し算(ADD)の3倍、割り算(DIV)は足し算の80倍〜90倍ほどかかることがわかります。
インテル ® 64 アーキテクチャーおよび IA-32 アーキテクチャー最適化リファレンス・マニュアル
プログラミング言語、コンパイラーを作る人には必見のこの資料、日本語でここまで用意されているのはスゴイ! ちなみに、ハードウェア除算命令がある Arm Cortex-M3 での掛け算は足し算と変わらず1クロック、除算はその2〜12倍です。(18.2. プロセッサ命令のタイミング - ARM Information Center

どんな環境でもループ内の割り算は少なくするのが得策です。ループ外にもって行けないか、ビットシフトや掛け算で代用できないか検討しましょう。32で割る整数計算は、2進数のビット演算で5bit右にシフトするのと一緒で、速度はどのアーキテクチャーでも1クロックになるのでとても有効です。

掛け算の使用はアーキテクチャーで判断が分かれます。IchigoJamやスマホなど、Armアーキテクチャーでは掛け算が足し算と同様に高速なので、カジュアルに使えますが、PC向けの場合多少命令が増えても、事前計算や、足し算ビット演算などでの代用が有効そう。

IchigoJamでのライフゲーム、1更新が16秒から14.5秒に短縮されたとのこと!Cortex-M0は、構造がシンプルなので速度計算が簡単で、遅い分、効果が体感で分かるのが楽しいです。

ループ内を軽くする手段の一つ、並列化。Intel/AMDのx64には512bitのSIMD命令、AVX-512という512bit(8bit x 32コ)まとめて計算する命令があります。 zmm0〜zmm31という512bitレジスタを使った計算ができるとのことでしたが、残念ながら今使っているMacBookProではちょっと古くて非対応。 AVX2の256bit(ymm0〜ymm15)で足し算(vpaddb = 1クロック)させてみました。(src for Mac on GitHub)

せっかくなら持てる力、フルパワー使いたいですね!もっと長いビット長が計算できるRISC-Vのベクトル拡張も楽しみです。

GPUやFPGAなど、高速化のための様々な技術、必要に応じて楽しく使っていきましょう!

2020-06-29 追記、すみません!執筆時、10倍、66倍〜80倍と記述していたのは異なるCPUIDでの比較をしていました(、ご指摘ありがとうございます! @57tggx さん)。
現行のアーキテクチャーを調べて、比較表を作ってみたところ、下記のようになりました。2008年のNehalemでは、掛け算で10倍、割り算で70-80倍でした。2015年のSkylakeで少し遅くなっています。Ice LakeはSkylakeがベースとの記述があるので、この部分は変わっていないのではないかと思います。

アーキテクチャー,ADD,SAL 左シフト,MUL 下位64bit,MUL 上位64bit,DIV Core 65nm (2006),1,1,6,7,-90 拡張 Core,1,1,6,7,- Nehalem (2008),1,1,3,10,70-80 Westmere (2008),1,1,3,10,70-80 SandyBridge (2011),1,1,3,4,80-90 Ivy Bridge (2012),1,1,3,4,80-95 Haswell (2013),1,1,3,4,80-95 Broadwel (2014),1,1,3,4,80-95 Skylake (2015),1,1,4,5,80-95 Intel® 64 and IA-32 Architectures Optimization Reference Manualより)

links
- サイズを取るかスピードを取るか、割り算のアルゴリズムとマシン語実装 / IchigoJamではじめるArmマシン語その14
- ハンドアセンブルで高速計算! RISC-V、RV32ICエミュレーターのC言語実装
- MacのGPUでも700倍速! パスワード20文字時代の盾と矛 / さくらクラウドで分散探査する方法
- Macで開発、FPGAで作る4bit学習用CPU「GMC-4」 - Parallels x Ubuntu x Quartus x Verilog

はんだごても握りたい。ちょっと電子工作、ILI9341編。

IchigoJam基板に収まる2.2インチILI9341コントローラー付き液晶を載せてみました。


IchigoJamにつなぐピンヘッダーと液晶用ピンソケットをはんだづけ。
ピンヘッダーは使うピンを中心にまばらにしておくと、抜き差ししやすく、ピンヘッダーも節約できる。


回路図書いて発注すればきれいですが、この程度ならその場でジャンパー線で!
簡単に試行錯誤できるのが利点です。CSとGNDは隣なので、はんだづけでOK!7本配線して完成。 (対応ファームとつなぎかた


選べる4サイズ、3.2/2.8/2.4/2.2inch(この3.2インチは設定とピン配置変更必要です。


厚みをとるか?拡張性をとるか?
今回は拡張性を重視しピンソケットで実装。ちょくせつはんだづけしてしまえば、もっと薄くもできますね。


タッチパネル用のピンがあっても使わないので大丈夫。


2.2インチを載せ、キーボードをつないだ図。プログラム終われば、キーボードは抜いて動かせばOK!


目指せ!ハッカーRADIO|bravesoft ブレイブソフト
ブレイブソフト菅澤さんの番組、電子工作へと導いてくれた、ユカイ工学青木さんからの紹介での出演となりました。
konashiで、こどもパソコンIchigoJamをネットにつなぐ」(この時の技、活きてます)

エンジニアのためのラジオ番組にオンライン出演。初心者エンジニアへのアドバイスとは!?
配信、放送をお楽しみに!(→ 2020-05-26 前半公開

Web標準、W3C BROWSERS AND ROBOTICS コミュニティグループで議論され、仕様策定中のWebGPIOを使って、PCに接続したIchigoJamをコントロールしてみました。 まずは、JavaScriptで、エルチカ!(USBシリアル付き、IchigoKamuy with IchigoJam BASIC)

実装は、こちら (src on GitHub)

import navigator from './WebGPIO.mjs' const sleep = async msec => new Promise(resolve => setTimeout(resolve, msec)) const main = async () => { const gpio = await navigator.requestGPIOAccess() const port = gpio.ports.get('LED') await port.export('out') // export (activate) the port. for (;;) { port.write(1) await sleep(500) port.write(0) await sleep(500) } } main()

GitHubからソースをcloneするか、ダウンロードして

npm i

で、シリアル通信に必要なパッケージをセットアップ。USBシリアルポートを設定する '.env' ファイルを作成。

SERIAL_DRIVER=/dev/tty.SLAB_USBtoUART

あとは動かすだけ!

node led4.mjs

エルチカ部分、sleepメソッドやasync/awaitを使わず、このようにも記述可能です。

let v = 1 setInterval(function () { port.write(v) v = 1 - v }, 500)

まだ出力のみです。入力と、onchangeを使った入力監視を実装すれば、現時点でのWebGPIOとしては完了。

WebGPIOとして拡張したい3点
- アナログ出力(PWM) - サーボの制御、LEDの明るさ制御、簡易的なサウンド出力に使える
- アナログ入力(ANA) - アナログセンサーで距離や明るさ、温度などを計測できる
- プルアップ・プルダウンの設定 - 3値出力として使うなど

ちなみに、JavaScriptが使えるIchigoJam用OS、IchigoLatteでのエルチカはこちら

while (1) { led(1); sleep(500); led(0); sleep(500); }

何の宣言も必要なく、シリアルで転送したり、直接キーボードをつないで打ち込めばOK!
100円CPUには、Promiseの実装はちょっとヘビーだし過剰なので、WebGPIO light というのもあり?

links
- CHIRIMEN Open Hardware
- JavaScript Robotics Advent Calendar 2016 13日目 WebGPIOのPolyfillを実装してみて
- ハート基板 x IchigoKamuy で感染病床残数IoT by シリアルで制御するIchigoJam、IchigoSerial for Node.js

COVID-19 Japan 新型コロナウイルス対策ダッシュボードの物理版。パソコン上のPythonを使って、USBシリアル経由でつないだIchigoJamを制御。 (モノクロにすると、色の強さが分かる)

データは、COVID-19 Japan 新型コロナウイルス対策ダッシュボードTXT版を使用。CSV / JSON もオープンデータ、ご活用ください。


すがやみつる氏による「こんにちはマイコン」のPython版「ゲームセンターあらしと学ぶ プログラミング入門 まんが版こんにちはPython」の出版記念にひさびさPythonプログラミング!

Pythonは、変数に型はないけど、型変換は自動ではないのでメソッドを使う。変数はBASICと同様、宣言が不要なので、長い変数名を使った時の誤字に注意。一行コメントは #、長いコメントは """ で囲む。

IchigoJamを単なる表示器として使ったプログラムが完成。(src on GitHub)

def locate(x, y): ser.write(b'\x15') ser.write(chr(32 + x).encode()) ser.write(chr(32 + y).encode()) ser.write(b'\x13\x0c') locate(2, 2) ser.write(b'COVID19 ')

こちらその一部、IchigoJam特殊キーコードを使った、カーソル位置指定(LOCATE/LC)に相当するメソッドを、定義(def)して、使用。chrはBASICのCHR$と一緒!シリアル通信にわたす際、encodeで文字列をバイナリ化。


COVID-19 Japan 新型コロナウイルス対策ダッシュボード
5/8まで公開されていたデータがなくなり、報道発表で数値が訂正される。以後、都道府県の公開データを集計する形となった。 このため、死亡者数が一部不明「-」表示に変わっている。ぜひ各自治体からのオープンデータ化、ぜひお願いします!

重症患者数、現在患者数を含むデータ定義書を作成。オープンデータ化する際に参考にどうぞ。
covid19/opendata_spec_covid19_20200510.xlsx at master · code4sabae/covid19


VIDEO3/5を使った拡大表示にも対応!
ILI9341対応βファームウェア:IchigoJam 1.4β20 for ILI9341


★3.2インチ★TFT液晶モジュール★240x320★ - aitendo
かなり文字が大きく見える、3.2インチのILI9341液晶は、こちら!IM0、IM1、IM2のはんだによるジャンパー設定を、0、1、1に切り替えて、4線SPI制御にして、使用するピンにピンヘッダーかピンソケットをはんだづけ。


CLKがD_WRS、DCがD_WRと表記されているので注意。

液晶モジュール - IchigoJam
D_LEDA - VCC(抵抗を介して接続で明るさ調整可)
D_WRS(SCK) - IN1 (SPI用のクロック)
D_SDI(MOSI) - VIDEO2 (SPI信号)
D_WR(DC) - IN2 (Data or Command)
D_RESET - IN4
D_CS - GND (Chip Select - 常に選択)
GND - GND
VCC_IN - VCC (3.3V)


コンパクトでかわいい、2.2インチ!

4線SPI対応ILI9341液晶でぜひお試しください!
(8bit/16bitパラレル通信のみのものには非対応です)

速度面と入手性と価格に難ありだった320x240の液晶版「IchigoJam mobile β」。同サイズのILI9341版液晶が割と良さそうとのことで、対応チャレンジ!(by 中村さん on IchigoJam-FAN)


動きました!

ただ、48MHzで動作するIchigoJamには、320x240の液晶駆動はちょっと重い。 ILI9341のデータシートを確認、reduce color mode の文字に期待したが、残念ながら結局1画素最小16bit、モノクロモードとか、8bitモードとかあるといいのに。

1/60秒で全画面描画が間に合わないので、ちょっとずつ分割しての表示に対応し、音出力にも対応。速度は通常のIchigoJamに近い感じに合わせる形に調整。約10fpsの表示としました。ぎりぎり使える?

ILI9341対応βファムウェーア:IchigoJam 1.4β19 for ILI9341
接続方法は、ST7567とほぼ一緒。

液晶モジュール - IchigoJam
SDO(MISO) - NC (接続なし)
LED - VCC(抵抗を介して接続で明るさ調整可)
SCK - IN1 (SPI用のクロック)
SDI(MOSI) - VIDEO2 (SPI信号)
DC - IN2 (Data or Command)
RESET - IN4
CS - GND (Chip Select - 常に選択)
GND - GND
VCC - VCC (3.3V)

ST7567版と違って、SWITCHによるビデオ信号との切り替えはありません。反転はできますが、拡大表示には非対応。

links
- ILI9341 on Amazon

教材づくりや、オンラインイベントで活躍、ブラウザ上で動くIchigoJam web、EEPROMを使った128コの拡張領域を含むファイル保存に対応しました。CPUに保存する0-3の4ファイルに加え、1Mbit EEPROMを搭載した時に使える100-227までの128ファイルが、ブラウザ上に保存されます。 データは localStorage で、保存されるのでブラウザを閉じても再開できます。

IchigoJam web
長いプログラムのLISTコマンドでの停止が効かない問題にも対処完了、大作づくりにどうぞ!

大作を作るコツ
- シーン毎にプログラムを分けて、LRUNでつなぐ(ファイル番号と行番号を指定可能)
- いくつかのシーンから共通で使う場合、変数Rなどで戻るファイル番号や行番号を渡す
- 似たプログラムは別ファイルとして保存を使ってコピーすればOK!
- メッセージなど、文字列は配列へデータをセットするプログラムに分けると便利
- 変数や配列、メモリをどう使うか別にまとめておく
- 局所的にしか使わない場合、配列や別のメモリに退避させるとすっきり(Stackも便利
- どのファイルが何の機能かわからなくならないよう、1行目にコメントで名前をつけておく
- ファイル番号をつけずにSAVEで、前回使ったファイルに保存できる(?FILE())

詳細は「IchigoJam BASIC 1.4 コマンド一覧」を見ながら、どうぞ!


AmabieDakeペンダント | Programming Club Network
疫病退散でご利益があるといわれる妖怪「アマビエ」を象ったIchigoDakeDakeCap、ネックストラップのセット。アマビエさまの目がLED、電池をいれるとピカピカ光るプログラム書き込み済み!

もちろん、自分でプログラミングで自在にコントロール可能もOK!

links
- 全国から参加してくれました!こどもの日IchigoJamオンライン"プチ"ハッカソン | きらきら星のつぶやき☆
- 創造的休暇を過ごそう!IchigoJamプチハッカソン開催 -with PCN仙台【オンラインIchigoJam大喜利】: Hana道場

自宅学習が続く中、iPadを使う家庭も多そうだとiPad miniを入手。いつの間にかSafariのフルスクリーンAPIに対応していたことに驚き、IchigoJam webをiPad向けに調整。


ホーム画面に追加して起動すると、まるでIchiogJam専用デバイス!
Safari上からの利用だと[FULL]ボタンで、フルスクリーン化する(横画面で文字の大きさが小さい問題は調査予定)


iPhoneで見た時も使い勝手も合わせて向上!iPadがあると写真が相互に取れて地味に便利。


物理キーボードや、フリック入力はいいけど、ソフトキーボードは入力にストレスあり。
調べてみると、割とややこしい手順で、iPhoneと同等のフリック入力に変更できた。

iPadでフリック入力を使う方法
1. 設定、キーボード、新しいキーボードを追加、「日本語-かな」を追加
2. 設定、キーボード、「キーボードを分割」をON
3. キーボードを表示させ、右下のキーボードアイコンを長押し、「フローティング」を選択
4. 右手、左手、好きな位置に動かせます。「分割」を試すのも手です!


iPadのSafariがフルスクリーンAPI対応であることに気がつけたのは、過去アプリ「softime」のおかげ。 使用ライブラリ D3.js、だけどバージョンが古いので現行バージョンでもいろいろやってみたい。

2012年に追加された、特定アプリ以外を動かせなくするモード「通称 Single App Mode」ことアクセスガイド(設定、アクセシビリティ、アクセスガイド)を使うと、フルスクリーンにしたアプリ以外、ホームボタンを含めて一切触れなくできるので、小さな子供向けにも安心(時間制限も設定可能)。 その時、残念だった4桁パスワードもパスワード長が伸びたので、専用端末としての活用もできそうです!

JavaScriptを使った学習教材アプリ、みんなで作りまくるのも楽しいかも?
興味ある高専生、こちらへどうぞ!「Slack: Code for KOSEN

世界が一つのネットワークでつながる現代社会、文字の問題は文字コードを16bitを超えて拡張するサロゲートペアだけでは解決しなかったようです。 例えば日本語のひらがな「ぱ」という文字、「は」と「゜」が結合した1文字です。ビルマ文字など、世界には結合して1文字となるいろんな言語があります。 Unicode(ユニコード)はこの「結合文字」に対応しています。

下記の文字列の長さを表示する JavaScriptのプログラム、結果はどうなるでしょう?

console.log("👨‍👨‍👧‍👦👩‍👩‍👧‍👦👨‍👨‍👧‍👦".length)

実は、結果は33!肌の色の違いと家族構成などの組み合わせで1文字の絵文字を合成する、結合文字の一種です。 日本語の濁音や半濁音のように、言語別ルールで1文字が決まっています。 全ルールが Unicode から公開され、それを元に C# で書かれた文字分割プログラム「GraphemeSplitter by @ufcpp」を発見、JavaScriptで移植し追加しました。(src on GitHub)

Grapheme(グラフィーム、書記素)とは、意味で区別する最小の図形のこと。たぶん、人にとっての1文字を表します。下記のように、使い方はとってもシンプル!(sample)

import gsplit from './StringSplitter.Grapheme.mjs' console.log(gsplit.split("👨‍👨‍👧‍👦👩‍👩‍👧‍👦👨‍👨‍👧‍👦")) // 👨‍👨‍👧‍👦, 👩‍👩‍👧‍👦, 👨‍👨‍👧‍👦

結合絵文字を含めると、もっとぴったりくる絵文字があるかもしれませんが、ひとまず1つのUnicodeの文字コード(コードポイントと呼ぶ)で扱えるもので構成しておこうと思います。 こちら、ソフトキーボードの「ALT」を押すことで、IchigoJam絵文字の入力にも対応した「IchigoJam web」です。


IchigoJam web」ブラウザ、スマホ、タブレットでIchigoJam体験!
小さなこどもでも安心、複雑なセットアップやネットワークが不要で、思う存分プログラミングを楽しめる IchigoDyhook も再入荷! (持ち運びできるプログラミング専用PC「IchigoDyhook」ついに入荷!

絵文字を探す際に作った、ユニコード一覧表示アプリ「unicode」で、約111万のコードポイントを巡ってみましょう。

8bitに収まる、0〜255(0xff)には、おなじみASCIIコード。半角カタカナの姿はありません。


変わった文字がありますね!


JISで導入されたいろんな記号、罫線などや、Unicodeに絵文字が導入されるきっかけとなった、i-mode絵文字が登場!


点字も収録!


ひらがな発見!


漢字が続き・・・


何やらかわいい文字が!


アラビア文字でしょうか、結合文字の影響か、表示が崩れることがあります。16bitも終盤に、半角カタカナも発見。


しばらく何もない空間が続きます。古代文字など、増えるかもしれません。


とーとつに麻雀牌!チュンだけ絵文字になってしまっているのが残念。ドミノは使えそう。


絵文字ゾーンにきました!IchigoJam絵文字との対応もこの中からピックアップしています。


またしばらくまばらなゾーンになり、現在は、16進数で0x2f87fが最後の様子。収録余力はまだまだあります!

あるアプリや環境では見えても、他の環境では見えない問題、まだありそうなので、要調査!
Windows 10にオリジナル絵文字「ニンジャキャット」が追加されることが明らかに - GIGAZINE

結合絵文字の全組み合わせを調べてみるのもおもしろいかも。

links
- 絵文字の連結と、書記素クラスター判定 | ++C++; // 未確認飛行 C ブログ
- 書記素分割/Unicode カテゴリー判定 | ++C++; // 未確認飛行 C ブログ
- Unicodeとは? その歴史と進化、開発者向け基礎知識 - Build Insider
- taisukef/GraphemeSplitter: A C# and JavaScript implementation of the Unicode grapheme cluster breaking algorithm
- ufcpp/GraphemeSplitter: A C# implementation of the Unicode grapheme cluster breaking algorithm (fork元)
- ユニコード一覧表示アプリ

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