スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
前回 ( ぜんかい ) はクラウド変数 ( へんすう ) の基本的 ( きほんてき ) な使 ( つか ) い方 ( かた ) を見 ( み ) て、別 ( べつ ) のタブで開 ( ひら ) いた2つのスクラッチキャットが同 ( おな ) じ動 ( うご ) きをする同期 ( どうき ) 処理 ( しょり ) を実装 ( じっそう ) したね。
前回 ( ぜんかい ) のラストはこんな
感 ( かん ) じ↓で、タブAとタブBで
同 ( おな ) じ
作品 ( さくひん ) を
開 ( ひら ) いて
並 ( なら ) べながら
動 ( うご ) きを
確 ( たし ) かめた!
ただ
動 ( うご ) きがカクカクしてて、まだまだ
僕 ( ぼく ) らが
求 ( もと ) めるクオリティにはなってない。
僕 ( ぼく ) らはここじゃあ
止 ( や ) まれない。そうだよね!?はるか
高 ( たか ) みを
目指 ( めざ ) して、
着実 ( ちゃくじつ ) に一
歩 ( ぽ ) ずつ
登 ( のぼ ) っていこう!
今回 ( こんかい ) の目標 ( もくひょう ) は「エンコード」今回 ( こんかい ) の
目標 ( もくひょう ) は、クラウド
変数 ( へんすう ) の
同期 ( どうき ) 処理 ( しょり ) をスムーズにするためにエンコード
処理 ( しょり ) というものを
実装 ( じっそう ) していくよ。
エンコードってなんやねん ちょっと
待 ( ま ) って、エンコードの
説明 ( せつめい ) をする
前 ( まえ ) にまずはカクカクしている
原因 ( げんいん ) について
復習 ( ふくしゅう ) しておこう。
手 ( て ) を
動 ( うご ) かすのはちょっと
先 ( さき ) だ。
同期 ( どうき ) 処理 ( しょり ) にはラグがあるクラウド
変数 ( へんすう ) を
同期 ( どうき ) する
際 ( さい ) は、どうしても0.1
秒 ( びょう ) のラグが
生 ( しょう ) じるという
仕様 ( しよう ) だったね。そしていまの
実装 ( じっそう ) ではクラウド
変数 ( へんすう ) を2つ
使 ( つか ) っていたね。
X座標 ( ざひょう ) をクラウド変数 ( へんすう ) 1にセット Y座標 ( ざひょう ) をクラウド変数 ( へんすう ) 2にセット これをもっと
具体的 ( ぐたいてき ) に
書 ( か ) くと
下記 ( かき ) イメージになる。
① X座標 ( ざひょう ) をクラウド変数 ( へんすう ) 1にセットタブAでX座標 ( ざひょう ) をクラウド変数 ( へんすう ) 1にセットすると、0.1秒 ( びょう ) 後 ( ご ) にタブBでクラウド変数 ( へんすう ) 1の値 ( ね ) が更新 ( こうしん ) されてX座標 ( ざひょう ) に反映 ( はんえい ) される
② Y座標 ( ざひょう ) をクラウド変数 ( へんすう ) 2にセット少 ( すこ ) し遅 ( おく ) れてタブAでY座標 ( ざひょう ) をクラウド変数 ( へんすう ) 2にセットすると、0.1秒 ( びょう ) より少 ( すこ ) し遅 ( おく ) れてタブBでクラウド変数 ( へんすう ) 2の値 ( ね ) が更新 ( こうしん ) されてY座標 ( ざひょう ) に反映 ( はんえい ) される
つまり、
横 ( よこ ) →縦 ( たて ) 、横 ( よこ ) →縦 ( たて ) 、という順番 ( じゅんばん ) に少 ( すこ ) しずつ遅 ( おく ) れながら更新 ( こうしん ) するからカクカクしてしまうんだ。2つ
以上 ( いじょう ) のクラウド
変数 ( へんすう ) を
使 ( つか ) って
動 ( うご ) きを
同期 ( どうき ) させようとするとどうしても
発生 ( はっせい ) してしまうラグなんだ……。
このラグは改善 ( かいぜん ) できる カクカクの
原因 ( げんいん ) はクラウド
変数 ( へんすう ) を2つ
使 ( つか ) っているから。ならクラウド
変数 ( へんすう ) を1つしか
使 ( つか ) わなければカクカクは
改善 ( かいぜん ) する、
単純 ( たんじゅん ) だね!この
方針 ( ほうしん ) を
採用 ( さいよう ) するぞ。
どうやって1つにするか 肝心 ( かんじん ) なのは
方法 ( ほうほう ) 論 ( ろん ) だね。シンプルに、X
座標 ( ざひょう ) とY
座標 ( ざひょう ) を
合体 ( がったい ) させてクラウド
変数 ( へんすう ) 1にセットする
方法 ( ほうほう ) で
行 ( い ) きたいと
思 ( おも ) う。
変更 ( へんこう ) 前 ( まえ ) X座標 ( ざひょう ) = 142 → クラウド変数 ( へんすう ) 1 = 142Y座標 ( ざひょう ) = 30 → クラウド変数 ( へんすう ) 2 = 30
変更 ( へんこう ) 後 ( ご ) X座標 ( ざひょう ) = 142 → クラウド変数 ( へんすう ) 1 = 142Y座標 ( ざひょう ) = 30 → クラウド変数 ( へんすう ) 1 = 14230
こんな
感 ( かん ) じでどうだろう?クラウド
変数 ( へんすう ) 1にX
座標 ( ざひょう ) 142もY
座標 ( ざひょう ) 30も
混 ( ま ) ぜて
入 ( い ) れて、14230っていう
数字 ( すうじ ) を
作 ( つく ) るっていうこと。
問題 ( もんだい ) 発生 ( はっせい ) うーん、なんか
嫌 ( いや ) な
予感 ( よかん ) がするよね。なんだろう。これの
問題点 ( もんだいてん ) が
分 ( わ ) かる?この14230を
解読 ( かいどく ) するときに
困 ( こま ) ると
思 ( おも ) うんだよ。これがXとYを
合体 ( がったい ) させた
数字 ( すうじ ) ってことは
分 ( わ ) かってても、このままじゃ
次 ( つぎ ) のどのパターンなのか
分 ( わ ) からない……。
x = 14 と y = 230 かもしれない x = 142 と y = 30 かもしれない x = 1 と y = 4230 かもしれない
解決策 ( かいけつさく ) これを
解決 ( かいけつ ) するためにXとYの
数値 ( すうち ) の
前 ( まえ ) に「ケタ」を
示 ( しめ ) す
数 ( かず ) を
書 ( か ) いてみよう。Xは142という3
桁 ( けた ) 《けた》の
数字 ( すうじ ) だから、まず3と
書 ( か ) いてから142を
書 ( か ) く。
合 ( あ ) わせて3142と
書 ( か ) く。Yは30という2
桁 ( けた ) の
数字 ( すうじ ) だから、まず2と
書 ( か ) いてから30を
書 ( か ) く。
合 ( あ ) わせて230と
書 ( か ) く。この2つを
合体 ( がったい ) させてみよう。
3142230
注釈 ( ちゅうしゃく ) をつけてこの
数字 ( すうじ ) を
分解 ( ぶんかい ) してみると
下記 ( かき ) のようになるよ。
おおお!なんか
良 ( よ ) さそう!
分 ( わ ) かる
分 ( わ ) かる!
暗号 ( あんごう ) みたいだった
数字 ( すうじ ) が
意味 ( いみ ) を
持 ( も ) ったデータとして
見 ( み ) えてきたね。
ケタ数(すう)またはプレフィックス
u003cpu003eこのケタ数 ( すう ) みたいに数字 ( すうじ ) の長 ( なが ) さを示 ( しめ ) す数字 ( すうじ ) のことをプレフィックスって呼 ( よ ) んでるけど、正式 ( せいしき ) 名称 ( めいしょう ) じゃないかも。プレフィックスってよくIPアドレス関連 ( かんれん ) で使 ( つか ) われる専門 ( せんもん ) 用語 ( ようご ) で、IPアドレスの長 ( なが ) さを意味 ( いみ ) する数字 ( すうじ ) なんだよね。その流 ( なが ) れでこれも数字 ( すうじ ) の長 ( なが ) さを表 ( あらわ ) す数字 ( すうじ ) だからプレフィックスって呼 ( よ ) んでるだけかも。すまん、正式 ( せいしき ) 名称 ( めいしょう ) は違 ( ちが ) うかもしれないけど、そこまで重要 ( じゅうよう ) な話 ( はなし ) でもないからケタとかケタ数 ( すう ) って呼 ( よ ) んでもいいし、プレフィックスって呼 ( よ ) んでもいいと思 ( おも ) う。u003c/pu003e
結果 ( けっか ) クラウド
変数 ( へんすう ) を1つにまとめることができそうだね。
タブAでXとYを合体 ( がったい ) させてクラウド変数 ( へんすう ) 1にセットする → タブBでクラウド変数 ( へんすう ) 1を分解 ( ぶんかい ) してXとYにセットする
これでラグが0.1
秒 ( びょう ) に
限定 ( げんてい ) できるね!
理論 ( りろん ) 上 ( じょう ) ではカクカクもかなり
改善 ( かいぜん ) するはずだ。
で、エンコードってなに? ここまで
見 ( み ) てきた、
何 ( なに ) かと何 ( なに ) かを混 ( ま ) ぜて意味 ( いみ ) のあるカタマリにすることをエンコードっていうんだ。
今回 ( こんかい ) だとXとYをケタ数 ( すう ) 込 ( こ ) みで合体 ( がったい ) させることがエンコードになるよ。ちなみにその
カタマリをもとのXとYに分解 ( ぶんかい ) することをデコード って
呼 ( よ ) ぶよ。エンコードもデコードもプロの
現場 ( げんば ) では
毎回 ( まいかい ) のように
飛 ( と ) び
交 ( か ) う
専門 ( せんもん ) 用語 ( ようご ) だよ。
エンコード、デコード、覚(おぼ)えられない!?
u003cpu003e合体 ( がったい ) させるのがエンコードで、それを分解 ( ぶんかい ) させるのがデコードといったけど、時間 ( じかん ) が経 ( た ) つと「どっちがエンコードでどっちがデコードだったっけ?」ってなる。はじめの頃 ( ころ ) の僕 ( ぼく ) はなってたwu003c/pu003eu003cpu003eそのときに無理 ( むり ) やり思 ( おも ) いついた覚 ( おぼ ) え方 ( かた ) がある。くだらないけどwu003c/pu003eu003cpu003e「ENCODEエンコード 」と「DECODEデコード 」の最初 ( さいしょ ) の2文字 ( もじ ) に注目 ( ちゅうもく ) してみて。u003c/pu003eu003cpu003eENとDEだよね。Eが前 ( まえ ) にあるからエンコードが先 ( さき ) (=合体 ( がったい ) )で、Eが後 ( うし ) ろにあるからデコードが後 ( あと ) (=分解 ( ぶんかい ) )って覚 ( おぼ ) えた。……フッ、認 ( みと ) めたくないものだな。自分 ( じぶん ) 自身 ( じしん ) の若 ( わか ) さ故 ( ゆえ ) の過 ( あやま ) ちというものを。u003c/pu003eu003cpu003eu003c/pu003e
エンコード処理 ( しょり ) を準備 ( じゅんび ) しよう 前置 ( ぜんち ) きがなっがw はやく
実装 ( じっそう ) したくてウズウズしてるぜ!こっからは
手 ( て ) を
動 ( うご ) かしていこう!
変数 ( へんすう ) 「エンコード文字列 ( もじれつ ) 」を用意 ( ようい ) するエンコードされた
数字 ( すうじ ) を
入 ( い ) れる
変数 ( へんすう ) を
作 ( つく ) ろう。
文字列(もじれつ)というよりは数字(すうじ)列(れつ)では?
u003cpu003eエンコードした後 ( あと ) も数字 ( すうじ ) のカタマリなのだから、文字列 ( もじれつ ) というよりも数字 ( すうじ ) 列 ( れつ ) という名前 ( なまえ ) が適当 ( てきとう ) では?と思 ( おも ) うかもしれないね。でもプログラミングにおいて数字 ( すうじ ) 列 ( れつ ) という言葉 ( ことば ) は聞 ( き ) き慣 ( な ) れない。一方 ( いっぽう ) で、文字列 ( もじれつ ) という言葉 ( ことば ) は頻繁 ( ひんぱん ) に使 ( つか ) われているんだ。u003c/pu003eu003cpu003eあと、プログラミングにおいては数字 ( すうじ ) と数値 ( すうち ) は異 ( こと ) なるケースがある。数字 ( すうじ ) は文字 ( もじ ) の仲間 ( なかま ) として考 ( かんが ) えられているんだ。わかりにくいから例 ( れい ) を出 ( だ ) すね。数値 ( すうち ) の1と数値 ( すうち ) の2を足 ( た ) すと普通 ( ふつう ) に3になる。でも数字 ( すうじ ) の1と数字 ( すうじ ) の2を足 ( た ) すと12になる。こういうことがプログラミングでは一般的 ( いっぱんてき ) なので、今回 ( こんかい ) エンコードされるデータも文字列 ( もじれつ ) と呼 ( よ ) ぶのが正 ( ただ ) しいんだ。u003c/pu003e
初期 ( しょき ) 化 ( か ) する適当 ( てきとう ) に
空 ( あ ) いてる
場所 ( ばしょ ) に
置 ( お ) いて、
空白 ( くうはく ) で
初期 ( しょき ) 化 ( か ) しておこう。
一時 ( じ ) 変数 ( へんすう ) を用意 ( ようい ) しておく エンコードの
途中 ( とちゅう ) で
値 ( ね ) を
保持 ( ほじ ) しておく
予定 ( よてい ) なので、「
値 ( ね ) 」という一
時 ( じ ) 変数 ( へんすう ) を
用意 ( ようい ) しておく!
後 ( あと ) で
使 ( つか ) うよ。
ブロック定義 ( ていぎ ) 「◯をエンコードする」を用意 ( ようい ) する エンコード
処理 ( しょり ) はブロック
定義 ( ていぎ ) にしておくと
便利 ( べんり ) だ。
テスト用 ( よう ) のデータを渡 ( わた ) しておく エンコードのブロック
定義 ( ていぎ ) を
作 ( つく ) り
込 ( こ ) んでいく
前 ( まえ ) に、とりあえず1とか
適当 ( てきとう ) なデータを
渡 ( わた ) しておこう。
一時 ( じ ) 変数 ( へんすう ) に引数 ( ひきすう ) をセットする 受 ( う ) け
取 ( と ) った
値 ( ね ) (
引数 ( ひきすう ) と
呼 ( よ ) ぶ)を一
時 ( じ ) 変数 ( へんすう ) に
入 ( い ) れておこう。
テストする うん、
動 ( うご ) いてるね。
エンコード処理 ( しょり ) を作 ( つく ) り込 ( こ ) む ( む ) ここまでは
下準備 ( したじゅんび ) みたいなものだ!どんどん
洗練 ( せんれん ) させていこう。
値 ( ね ) を丸 ( まる ) めておくなにかのはずみで「100.5」みたいな
数字 ( すうじ ) がブロック
定義 ( ていぎ ) に
渡 ( わた ) されてしまうと
困 ( こま ) るよね。なぜなら「.」は
文字 ( もじ ) としてみなされてしまうからだ。クラウド
変数 ( へんすう ) に
万 ( まん ) が
一 ( いち ) でも
文字 ( もじ ) をセットしないように、「.」が
消 ( き ) えるように
演算 ( えんざん ) ブロックを1つかませておくよ。
ケタ数 ( すう ) を調 ( しら ) べる ケタ
数 ( すう ) を
調 ( しら ) べるには、
数字 ( すうじ ) の
長 ( なが ) さを
調 ( しら ) べればOKだ。
適当 ( てきとう ) な
場所 ( ばしょ ) に
下記 ( かき ) ブロックを
作 ( つく ) っておこう。
これで
値 ( ね ) の
長 ( なが ) さを
調 ( しら ) べられる。
値 ( ね ) が100なら
長 ( なが ) さは3だし、
値 ( ね ) が4なら
長 ( なが ) さは1だ。
ok-scratch
u003cpu003e分 ( わ ) かりづらいけど、このオレンジの値 ( ね ) は変数 ( へんすう ) の値 ( ね ) であって、引数 ( ひきすう ) の値 ( ね ) (ピンク)ではないよ。u003c/pu003e
ケタ数 ( すう ) と数字 ( すうじ ) を組 ( く ) み合 ( あ ) わせる ケタ
数 ( すう ) に
続 ( つづ ) いて
数字 ( すうじ ) を
組 ( く ) み
合 ( あ ) わせるっていう
作戦 ( さくせん ) だったよね。これは
下記 ( かき ) のように
実現 ( じつげん ) できるぞ。
で、こうなる↓
これで
値 ( ね ) が100なら、ケタ
数 ( すう ) は3だから、
組 ( く ) み
合 ( あ ) わせて「3100」になる!
エンコード文字列 ( もじれつ ) に追記 ( ついき ) する この
組 ( く ) み
合 ( あ ) わせた
値 ( ね ) を
変数 ( へんすう ) 「エンコード
文字列 ( もじれつ ) 」に
追加 ( ついか ) するよ。
で、こうなる↓
エンコード文字列 ( もじれつ ) にセットする 一連 ( いちれん ) の
演算 ( えんざん ) 結果 ( けっか ) を
変数 ( へんすう ) 「エンコード
文字列 ( もじれつ ) 」にセットする。
これで
後 ( うし ) ろにどんどん
値 ( ね ) が
追記 ( ついき ) されていくね。
テストする クリックしてテストしよう!
うん、
処理 ( しょり ) を
追加 ( ついか ) してもういっちょ。
よし、さらに
追加 ( ついか ) してダメ
押 ( お ) しだ!
うっし!
意図 ( いと ) したとおりにエンコードできた!
次回 ( じかい ) へまだまだ
中途半端 ( ちゅうとはんぱ ) だけど、ひとまずエンコードの
基本的 ( きほんてき ) な
処理 ( しょり ) はできた!エンコードなんて
専門的 ( せんもんてき ) で
難 ( むずか ) しい
処理 ( しょり ) だったよね。でもここまで
一緒 ( いっしょ ) にできたならスゴイよ!ナイス!
次回 ( じかい ) はエンコードして
合体 ( がったい ) した
文字列 ( もじれつ ) を、デコード(
分解 ( ぶんかい ) )する
処理 ( しょり ) を
作 ( つく ) ってみよう。そしてX
座標 ( ざひょう ) とY
座標 ( ざひょう ) の
同期 ( どうき ) を
改善 ( かいぜん ) して、どのくらい
動 ( うご ) きがスムーズになるのかを
試 ( ため ) そう。
脳 ( のう ) トレ答 ( こた ) え前回 ( ぜんかい ) の
脳 ( のう ) トレの
答 ( こた ) えは、
今回 ( こんかい ) のエンコード
処理 ( しょり ) を
通 ( とお ) してわかったかな?
392411は924と1です。15234は5と34です。では、3322291は何 ( なん ) と何 ( なに ) ?
答 ( こた ) えは32291だね!
早 ( はや ) めに
次 ( つぎ ) の
記事 ( きじ ) も
公開 ( こうかい ) するぜ。