Hatena::ブログ(Diary)

SHIROのモバイル日記 RSSフィード Twitter

2018-04-12

[]バーコードJam USB

FacebookIchigoJam-FANグループにも参加している渡邊さんが、「USB-PS/2逆変換アダプタ」を作って、スイッチサイエンスで発売しました。
f:id:shiro0922:20180412175051j:image:w360
USBキーボードの信号をPS/2へ変換するアダプタで、これを介すると普通のUSBキーボードIchigoJamにつないで使うことができます。

以前「バーコードJam」を作る際に、USBタイプのバーコードリーダーをIchigoJamにつなごうとして失敗していました。
このアダプタでつなげば行けるんじゃ?と思って、IchigoJamUSBバーコードリーダーをつないで試してみました。
その結果、読み取り速度を調整すれば、バッチリ読めました!
f:id:shiro0922:20180412174518p:image:w360

使用したバーコードリーダーは、ビジコム社の「BC-BR900L」です。設定マニュアルをサイトからダウンロードして印刷し、リーダーでバーコードを読み取ると動作を設定できます。設定値は以下のとおり。

バーコードから読み込んだ文字+EnterキーがそのままIchigoJamへ入力されるので、とてもわかりやすいです。
これで電子工作無しで簡単に「バーコードJam」が作れます! 作ってみたのがこちら。
f:id:shiro0922:20180412172725j:image:w640
USBバーコードリーダーと変換アダプタがあればすぐ試せるので、子ども向けのカードプログラミングにいかがでしょうか。

USBバーコードリーダーに対応したプログラムは以下のとおり。読み込み部分が簡単になりました。

プログラム0:メインプログラム

1 SWITCH1:CLS:?"*Barcode Jam*"
2 CLV:F=FILE():WAIT60:CLK
3 OUT0:Z=0:L=0
4 ?"OK"
5 ?CHR$(1);:R=1
6 B=INKEY():IF!BCONT
7 GSB28
8 ?CHR$(8);:IF!CGOTO15
9 IFTGSB14 ELSEGSB12
10 GOTO23
11 GOTO5
12 Z=Z+1:[Z]=C*16+O:IFC=8L=L+1:[70+L]=Z
13 ?">";Z*10;" ";:RTN
14 [Z]=[Z]|((C*16+O)<<8):T=0:RTN
15 BEEP30,30:IFO=1?"RUN":R=0:GOTO20
16 IFO=2?"LIST":R=2:GOTO20
17 IFO=3?"NEW":GOTO3
18 IFO=4CLS:GOTO4
19 GOTO5
20 A=0
21 A=A+1:IFA>ZGOTO4
22 C=[A]&#F0/16:O=[A]&15:?A*10;" ";
23 IFC=15&&O=15LRUNF+1,150
24 LRUNF+1,C*10
25 IFT&&(R!=1):C=([A]&#F000)>>12:O=([A]&#F00)>>8:T=0:GOTO23
26 B=INKEY()&#FF:IFBGSB28:IFC=15&&O=15BEEP30,30:?"ESC":GOTO4
27 GOTO21
28 I=89
29 I=I+1:[I]=B-48
30 B=INKEY():IF!BCONT
31 IFB!=10GOTO29
32 D=0:FORJ=90TOI:D=D*10+[J]:NEXT
33 C=D/16:O=D%16:BEEP:WAIT30:CLK:RTN

※1行目の「SWITCH1」を削除すれば、普通の液晶モニタで動きます。

プログラム1:コマンドサブルーチン

1 '*Barcode Jam-1
10 @LED
11 ?"LED ";O:IFR=1LRUNF,11
12 IFR=2LRUNF,25
13 LEDO:LRUNF,25
20 @WAIT
21 ?"WAIT ";O*60:IFR=1LRUNF,11
22 IFR=2LRUNF,25
23 WAITO*60:LRUNF,25
30 @BEEP
31 ?"BEEP":IFR=1LRUNF,11
32 IFR=2LRUNF,25
33 BEEP:LRUNF,25
80 @LABEL
81 ?"@";O:IFR=1LRUNF,11
82 LRUNF,25
90 @GOTOL
91 ?"GOTO @";O:IFR=1LRUNF,11
92 IFR=2LRUNF,25
93 A=[70+O]-1:LRUNF,25
100 @IFBTN
101 ?"IF BTN()=";O;" THEN ";:T=1:IFR=1LRUNF,11
102 IFR=2LRUNF,25
103 T=(BTN()=O):IF!T?
104 LRUNF,25
120 @FOR
121 ?"FOR I=1 TO ";O:IFR=1LRUNF,11
122 IFR=2LRUNF,25
123 I=1:J=O:S=A:LRUNF,25
130 @NEXT
131 ?"NEXT":IFR=1LRUNF,11
132 IFR=2LRUNF,25
133 I=I+1:IFI<=JA=S
134 LRUNF,25
150 @END
151 ?"END":IFR=1LRUNF,11
152 IFR=2LRUNF,25
153 A=Z:LRUNF,25

プログラム0とプログラム1は、連続したスロットに置いてください。
(スロット0と1でなくても構いません。が、スロット0と1に置いて自動起動すると便利です)

関連ファイル

カトラリーカード(バーコード付き)PDFファイル

命令表
f:id:shiro0922:20180128143751p:image:w640

2018-04-03

[]Questダッシュ

RPGインターフェースプログラミングできる「IchigonQuest」の正式ファームウェアが、公式サイトで公開されました
さっそくそれを使って、「IchigoJamスポーツ」ペーパーの「100mダッシュ」をIchigonQuestへ移植してみました。
キミは世界記録を破れるか?

f:id:shiro0922:20180403141213p:image:w480

  • 起動すると、画面左上にダンブンのキャラクターが表示されます。
  • 右矢印キーを連打して100メートル走ってください。
  • ゴールするとタイムが「秒」と「1/10秒」単位で表示されます。
  • ゴール後にEnterキーを押すとリプレイできます。

プログラムリスト

IJUtilitiesで転送したリストです。キャラクター文字は化けていますが、IJUtilitiesで転送すれば使えます。
表示キャラクターに「.」(小数点)が欲しかった…。

1 CLS
2 ?"?
3 A=0
4 CLT
5 [0]=BTN(RIGHT)
6 IF[0]=1GOTO5
7 [0]=BTN(RIGHT)
8 IF[0]=0GOTO7
9 B=A
10 B=B%32
11 C=A
12 C=C/32
13 LCB,3
14 ?"瓣
15 A=A+1
16 B=A
17 B=B%32
18 C=A
19 C=C/32
20 LCB,3
21 ?"?
22 [0]=A
23 IF[0]<100GOTO5
24 [0]=TICK()
25 A=[0]
26 [0]=[0]/60
27 ?[0]
28 A=A%60
29 A=A/10
30 ?A
31 [0]=BTN(ENTER)
32 IF[0]=0GOTO31
33 GOTO1

2018-03-29

[]パスワードバトル

パスワードネタの第3弾、バトルゲームを作ってみました。
キミは最強のパスワードを作れるか?

f:id:shiro0922:20180329220956p:image:w640

  • 最初に自分のパスワードを聞かれるので、10文字以内で入力します。
  • 敵のモンスターが出現して、バトルが始まります。互いのパスワードで強さのパラメータが決まります。
  • 互いに攻撃して、HPが0以下になった方が負けです。自分が勝てば次のバトルに進み、だんだん敵モンスターが強くなります。自分が負けたらゲームオーバーです。

プログラムリスト

※3/30 攻撃時の効果音を追加しました。

1 CLV:CLS:?"Password(<10c)?"
2 K=INKEY():IF!KCONT
3 IFK<>10?CHR$(K);:GOTO2
4 FORJ=0TO9:[J]=PEEK(#920+J):NEXT
5 GSB14:A=B:D=E:S=T:G=I:SRND(TICK())
6 CLS:W=W+1:?"[BATTLE";W;"]":H=G
7 M=M+(M<10):O=20:GSB21:GSB14
8 GSB22:O=0:GSB22
9 X=A*2+S/2-E-T/2:O=20:GSB29:WAIT20:IFI<=0GOTO12
10 X=B*2+T/2-D-S/2:O=0:GSB29:WAIT20:IFH<=0GOTO13
11 GOTO9
12 LC0,10:?"You WIN!":BEEP10,30:WAIT60:GOTO6
13 LC0,10:?"You Lose":BEEP30,30:END
14 I=10:B=10:E=10:T=10
15 FORJ=0TO9:Z=[O+J]:IF!ZGOTO20
16 IFZ>96&&Z<123B=(B*2)^Z:GOTO20
17 IFZ>64&&Z<91E=(E*2)^Z:GOTO20
18 IFZ>47&&Z<58I=(I*2)^Z:GOTO20
19 T=T^Z
20 NEXT:RTN
21 FORJ=0TOM-1:[O+J]=RND(94)+33:NEXT:RTN
22 LCO,2:IFO?"@Monster"ELSE?"*You"
23 LCO,3:FORJ=0TO9:?CHR$([O+J]);:NEXT
24 LCO,5:?"HP=";:IFO?IELSE?H
25 LCO,6:?"AT=";:IFO?BELSE?A
26 LCO,7:?"DF=";:IFO?EELSE?D
27 LCO,8:?"SP=";:IFO?TELSE?S
28 RTN
29 X=X*(X>0)+RND(11)
30 FORJ=1TO3:LCO,5:?"HP=";:IFO?IELSE?H
31 BEEP30,1:WAIT5:LCO,5:?"        ":WAIT5:NEXT
32 IFOI=I-XELSEH=H-X
33 LCO,5:?"HP=";:IFO?IELSE?H
34 RTN

Web版

IchigoJam web版はこちら。

ヒント

相手に与えるダメージ量は、自分の攻撃力・相手の守備力・お互いのすばやさで決まります。(乱数が若干足されます)
パラメータは、以下の文字種から算出されます。

  • 体力:数字
  • 攻撃力:アルファベット小文字
  • 守備力:アルファベット大文字
  • すばやさ:記号

基本的にはその種類の文字数が多いほど数値が上がりますが、文字によっても変わります。また、すばやさ(記号)のみ文字数によらない計算をしています。
全体で最大10文字なので、その中でバランスを探ってください。

2018-03-27

[]パスワード自動作成

先日、【パスワードアタック】で「簡単なパスワードはダメだぞ!」と警告したのですが、難しいパスワードをなかなか考えられない人のために、パスワードを自動生成するプログラムを作りました。
f:id:shiro0922:20180327161221p:image:w480

  • 起動すると、アルファベット小文字・大文字・数字・記号を混ぜた8文字のパスワードが自動で表示されます。
  • 指定されたキーを押すと、設定を変更できます。
    • 1 アルファベット小文字のON/OFF
    • 2 アルファベット大文字のON/OFF
    • 3 数字のON/OFF
    • 4 記号のON/OFF
    • +− 文字数の増減(1〜32文字まで)
    • その他のキー パスワードの再作成

個人での利用の他、業務で何個もパスワードを考えないといけない時にも使えるでしょう。

プログラムリスト

10 '*Password Make
20 CLV:P=8
30 GSB 300:GSB 340:GSB 380:GSB 420
40 '@LOOP
50 GSB 140:BEEP:CLK
60 K=INKEY():IF !K CONT
70 IF K=49 GSB 300
80 IF K=50 GSB 340
90 IF K=51 GSB 380
100 IF K=52 GSB 420
110 IF K=43 P=P+(P<32)
120 IF K=45 P=P-(P>1)
130 GOTO 40
140 '@PRT
150 CLS
160 ?"*SET(1=ON,0=OFF)":?
170 ?"1)Lower case letter=";L
180 ?"2)Upper case letter=";U
190 ?"3)Number=";N
200 ?"4)Symbol=";S
210 ?"+-)Length=";P
220 ?"Else)Remake"
230 ?:?"*Password"
240 IF L|U|N|S=0 RTN
250 FOR I=1 TO P
260 C=RND(94):IF ![C] CONT
270 ?CHR$(C+33);
280 NEXT
290 RTN
300 '@LOWER
310 L=!L
320 FOR I=64 TO 89:[I]=![I]:NEXT
330 RTN
340 '@UPPER
350 U=!U
360 FOR I=32 TO 57:[I]=![I]:NEXT
370 RTN
380 '@NUM
390 N=!N
400 FOR I=15 TO 24:[I]=![I]:NEXT
410 RTN
420 '@SYM
430 S=!S
440 FOR I=0 TO 14:[I]=![I]:NEXT
450 FOR I=25 TO 31:[I]=![I]:NEXT
460 FOR I=58 TO 63:[I]=![I]:NEXT
470 FOR I=90 TO 93:[I]=![I]:NEXT
480 RTN

web版

web版はこちら。

2018-03-25

[]パスワードアタック

いわゆる「総当たり攻撃」(ブルートフォースアタック)で、パスワードクラッキングするシミュレーションプログラムです。
f:id:shiro0922:20180325190456p:image:w360

  • 起動するとパスワードを聞いてくるので、10文字以内のパスワードを入力してEnterキーを押します。
  • パスワードへのアタックが始まります。数字・アルファベット・記号(文字コード33〜127まで)を総当たりで試します。
  • パスワードを突き止めると、所要時間(分)を表示して終了します。

よく情報モラルの授業で「パスワードはできるだけ長く複雑なものにしましょう」と説明されます。
実際にアタックする様子を見て、子ども達に危機感を感じて欲しいと思って、このプログラムを作りました。
ちなみにパスワードが「AB」の2文字だと、IchigoJam webで5分、ThinkPad上のIchigoJam appでは数秒で破られます。
あとはIchigoJam appで試すと、「ABC」の3文字は2分、「ABCD」の4文字は230分(4時間弱)で破られました。
f:id:shiro0922:20180325181328p:image:w360

f:id:shiro0922:20180325190201p:image:w360
画面の文字表示をやめるなど、プログラムを改良すればもっと速くなるはず。
みんな、簡単なパスワードはダメだぞ!

プログラムリスト

10 '*Password Attack
20 CLV:CLS
30 ?"Password(<10chr.)="
40 '@INLOOP
50 K=INKEY():IF !K CONT
60 IF K<>10 ?CHR$(K);:GOTO 40
70 L=1
80 '@READLOOP
90 [90+L]=PEEK(#91F+L)
100 IF [90+L] L=L+1:GOTO 80
110 LC 0,5:?"Attacking..."
120 L=0:CLT
130 '@ATTACKLOOP
140 L=L+1:M=0
150 GSB 190
160 IF E GOTO 130
170 ?:?"FIND!! Time=";T;"min."
180 BEEP10,30:END
190 '@ATTACKSUB
200 M=M+1
210 FOR [M]=33 TO 127
220 [50+M]=[M]
230 IF M<L GSB 190:M=M-1
240 E=0:LC 0,6
250 FOR D=1 TO L
260 ?CHR$([50+D]);
270 IF [90+D]<>[50+D] E=1
280 NEXT
290 IF [91+L] E=1
300 IF TICK()>3600 T=T+1:CLT
310 IF !E [M]=127:NEXT:RTN
320 NEXT
330 RTN

プログラムリスト(数字限定)

10 '*Password Attack
20 CLV:CLS
30 ?"Password(<10chr.)="
40 '@INLOOP
50 K=INKEY():IF !K CONT
60 IF K<>10 ?CHR$(K);:GOTO 40
70 L=1
80 '@READLOOP
90 [90+L]=PEEK(#91F+L)
100 IF [90+L] L=L+1:GOTO 80
110 LC 0,5:?"Attacking..."
120 L=0:CLT
130 '@ATTACKLOOP
140 L=L+1:M=0
150 GSB 190
160 IF E GOTO 130
170 ?:?"FIND!! Time=";T;"min."
180 BEEP10,30:END
190 '@ATTACKSUB
200 M=M+1
210 FOR [M]=48 TO 57
220 [50+M]=[M]
230 IF M<L GSB 190:M=M-1
240 E=0:LC 0,6
250 FOR D=1 TO L
260 ?CHR$([50+D]);
270 IF [90+D]<>[50+D] E=1
280 NEXT
290 IF [91+L] E=1
300 IF TICK()>3600 T=T+1:CLT
310 IF !E [M]=57:NEXT:RTN
320 NEXT
330 RTN

アタック範囲を数字(0〜9)に限定すると、4桁の「9999」は数秒で、5桁の「99999」でも1分以内に破られてしまいます。短時間で済むので、子ども向け教材には数字限定でもいいかもしれません。
なお、6桁の「999999」を試すと、スタックが足りなくなってエラーになってしまいます。1桁ごとに再帰サブルーチンを呼んでいるので仕方ないのですが。

リンク集