Tech」カテゴリーアーカイブ

テクノロジの進化がものすごい現代では、アートがやっぱり大切になると思う。

教育について記載してある本は多々あるけど、僕が一番オススメするのは、サルマン・カーン(サル・カーン)の「世界はひとつの教室」だ。

著者の造形の深さや頭脳明晰さがとても参考になるし、教育を歴史的観点から捉えつつも、現代においてテクノロジを活用した適した教育スタイルは何か?という目線で展開される。

ちなみに、著者は、かの有名な「カーン・アカデミー」の創設者だ。僕の教育関係のバイブルと言っても過言ではない。

界はひとつの教室 「学び×テクノロジー」が起こすイノベーション
https://amzn.asia/d/3I5xqBY

そんな中、孫正義の弟さんが書いた本について、本人が紹介している動画が結構参考になったので、こちらも紹介する。

テクノロジの進化はものすごくて、2022年11月30日に公開されたChatGPTは、2023年1月に1億人のアクティブユーザー数を記録したらしい。たった2~3ヶ月で。

普及速度がこれからもっと早くなると考えると、世界のほんのひとにぎりの人たちから、その他の多くの人々がついていけない世界になるんだろうな、と危惧してしまうけど、逆にそういう状況を捉えつつ、自分なりに咲きを読んで行動することに価値はあると思う。

写真の腕を上げよう。きっと、アートは人間に、もっともっと必要になるはず。

gedit が最高という話。

Linuxにすぐに使える gedit というエディタが、とても使いやすい。

端的にポイントを挙げると、以下となる。

  • 軽量ですぐに起動する
  • エディタのカラーが標準で複数パターンあるし、かっこいい
  • ディレクトリやファイルをエディタの左側にツリー表示できるし、新規作成などの操作までできる
  • プラグインも結構あって、機能追加もできる
  • 下部分にターミナルを表示して操作することができる

特に最後の「下部分にターミナルを表示できるし、操作できる」というのが、一番ヒットした。最高。

vimを使っていて思ったのだが、こういうエディタには「選択したワードと同じワードを全部反転表示(共著表示する)」という機能があって、便利だと思った。

デバッグの時とか、コードを確かめたいとか、読み込みたいとかいう場合に、とても役に立つ。

VScodeなどのリッチなエディタだと当然の機能だと思うのだが、リッチなエディタは起動が遅くて性に合わない。その点、geditはちょうど良い。

ただ、vimの方が高速に処理ができる。マウスは必要ない。CUIが良い。ただ、CUIには、選択したワードを全部強調表示する機能がない…。

そう思っていたら、なんと、geditにはターミナルがくっつけられるじゃないか。すなわち、CUIの良いところも使いつつ、選択したワードを強調表示するとか、その他、役に立つエディタの機能も使える。

それが、無料で、しかも、ほぼ標準搭載のレベルで使える。Linuxって、本当に素晴らしい。

あまりにも気に入ったので、MacBookにもインストールしようと試みているが、BREWでのインストールが必要で、しかも設定が面倒…。こちらは、できたら別投稿で紹介しようと思う。

兎にも角にも、Linuxが一弾と好きになった出来事だった。

テトリスを作りながらJSの勉強

この動画が参考になる。上級者のコーディングする過程を見つつ学べるので、コードの書き方だけじゃなくて、ロジックやセンスまで伺えるので、とても参考になる。

JSでテトリス制作

何度も見ることで、理解が深まるし、記憶にも定着してくる。記憶に定着してくると、常に考えるようになるから、血肉になる。血肉になるということは、自分のセンス(感覚)になる、という感じで、とても良い。

自然と思考できるようになれば、もっと吸収できるし、理解できるし、学べる。そして、楽しくなる。

プログラマの心構え?

勉強させてもらっているけど、プログラミングのスキルだけじゃなくて、心構えも参考になった。

なんというか、好きこそ物の上手なれだなってやっぱり思わせてくれた良い内容だった。

動かなかったプログラムを朝までかかってデバックして動くようにしたこともざらだけど楽しかったとか、C言語のポインタでつまづく人が多いけどそもそもなんでポインタなのかを考えているのか?とか。

好きな人からすると当然の思考回路なんだろうな。そうじゃない人からすると、きっと苦痛でしかない頃だらけなんだろうな。

僕はポインタはなんとなく分かっているけど、実業務でゴリゴリ使っていないのでその真価は血肉にできていない気がする。だから、より一層「いいな」と思ってしまった。

Linux Mint 21.1 Cinnamon →すこぶる調子が良い。

最近、21.1にUpdateしてみたが、すこぶる調子が良い。Updateする前は、カーネルをアップデートしたらファンが常に回りだして焦ったが、Updateしたら解消されて、現在はすこぶる調子が良い。

マウスの形が可愛くなって、しかも変更の仕方が分からいのが、最初は難点と思っていたが、慣れたら全然問題ないということで、快適なLinux Mintライフを満喫している。

JSでゲーム開発の勉強メモ

index.html

画面を表示するためのhtmlファイル。body部分で、JSコードを読み込む。

main.js

JSのメインとなるコード。ゲームの主軸となる流れを書いていく。書く中で、各種JSファイルを適宜読み込んでいく。

game.js

ゲームエンジンのメインとなるコード。ゲームエンジンとは、ゲーム作りに使う機能をあらかじめ作ってまとめたもの。

例えば、画像や文字を表示する機能などを作っておく。そすうると、同じ機能を都度作成せずに、必要な時に呼び出せばOKなので、効率よく、かつ開発者目線でも分かりやすく開発することができる。

UnityやUnreal Engine、melon.js、phina.jsなどが有名。

canvas

HTML5の機能。絵を描画する範囲を示す。今回は、game.jsのコンストラクタでcanvasをcreateElementしてbodyに追加する形で使っていく。

メインループ(game.js内)

ゲームプログラミングでは、①変数、②条件分岐、③繰り返しがよく使われる、というか常に使われている。描画は繰り返し実行される。いわば、アニメでいうワンシーンごとを描画しているイメージ。特に、繰り返しは常に行われており、これをメインループとして実装する。

game.js内に、メインループおよび、メインループを呼び出す関数を書く。

メインループでは、canvasのコンテキストを呼び出して描画するという内容を書いておく。実際には、game.jp内に描画するモノ=オブジェクトを格納する配列を用意しておいて、スプライドのupdate()を呼び出す際の引数とし渡すことで、意図したオブジェクトを繰り返し描画する。

なお、オブジェクト格納する配列に、オブジェクトを追加していく関数はgame.jpにメインループとは別関数として書いておく。

スプライト

ゲームに表示させるキャラや背景などの画像をスプライトと言う。

ゲームエンジンの一つとして記載する。コードは別ファイルに保存する(例えば、sprite.js)。

sprite.jsの中身は、画像ファイルへのパスを受け取って、Imageクラスのインスタンスを作って、x座標y座標を初期化するコンストラクタと、画像を表示するためのメソッドであるrender()、およびrender()を呼び出して実際に画像を描画するためのメソッドupdate()とする。

個人的には、描画するコードを記載しているrender()と、そのrender()を呼び出すupdate()を別々に記載している構成が参考になった。一見、render()とupdate()は一緒にしておいて良さそうだが、「機能」と「その機能を実行する機能」を別々に記載しておけば、インスタンスを作って操作する際に細かな作り込みができそうなので良いのだろう、と今は思っている(要するに、現時点では、関数を分ける意味がなんとなく感覚でわかっているというレベル)

キー入力で操作できるようにする

game.jsにkeybind関数やeventListener()を使って、使うキー(今回は上下左右の矢印キー)の登録と、キーが押下された際の挙動を書く。

シーンを描画できるようにする

シーン専用のクラスを作成する。シーン(オブジェクト)を詰め込む配列と、その配列にシーンオブジェクトを追加するメソッドを書く。

game.jsでシーンを入れておくための専用の配列および、現在のシーンを格納する変数を用意する。また、シーンを追加するためのadd関数も用意する。

main.jsでシーンオブジェクトを作成する部分と、指定したシーンにスプライトを格納する部分、そしてそのシーンをgameに追加する箇所を記載する。

シーンクラスを作成するメリットは、画像や音楽や別シーンへの切り替えといった中身をシーンごとに記載して整理することができること。RPGはシーンの集まり、シーンの入れ替わりと考えると、確かにこの構成、すなわちシーンごとに機能を記載するプログラム構成は正しいと言える気がする。

タイルとタイルマップ

タイルマップとは、タイルを組み合わせることで作られるマップのこと。タイルとは、マップを構成する最小単位=部品のこと。

タイルマップ用にTilemapクラスを作成。基本構成はスプライト用のクラスと同じ。

コンストラクタで、Imageのインスタンスを作成して、タイル用のファイル指定や、xy座標、タイルの最小単位サイズを指定する。今回は32ビット。あと、二次元配列でマップを作れるようにするための配列も用意。

このTilemapクラスでも、描画する機能のrender()関数と、そのrender()を呼び出すためのupdate()関数を記載。update()では常に呼び出されるオーバライド用の関数も作成。

Tilemapクラスは、main.jsで呼び出して使う。マップ用の二次元配列は、main.jsに直で記載指定も良いが、map.jsとして別で記載しておけば、頭の整理がしやすい=分かりやすい構成になる。

キャラクターはタイルマップ上に表示するが、タイルの種類によって通過できる・できないを判定したり、例えばゴールや扉のような特定の場所に触れたら条件付きで動作を変更するなどの処理を施す場合は、単にスプライトとして表示するのではなくて、タイルとしてキャラも表示する方が処理がしやすい(のこと)。

そのため、タイルとしてキャラを表示するために、Tileクラスを作成。この際に、Spriteクラスを継承する。

タイルはタイルマップ上に存在する(ようにする)ため、タイルマップは同時に移動したり、タイルマップの何番目のタイルとして表示するかを取得したりする。

キャラクターではなくタイルマップを移動する

タイルマップのサイズが大きくなったら、キャラを移動させるよりも、代わりにタイルマップを移動させることで、あたかもキャラを操作しているように見せた方が便利だ。すなわち、常にキャラを中央に位置しておいて、タイルマップ(背景)を動かすようにする。

キャラを基準に、その背景であるタイルマップや、タイルマップ上に表示する他の部品(村人キャラなど)を設置して、なおかつキャラではなくてタイルマップを移動させる。キャラ自身もクラスやその継承でタイルマップやタイルと同じように表示するので、移動するかどうかの同期を取る・取らないの機能を追加した方が扱いやすい。

進もうとする先が、移動できるか・できないかを判定するための機能も実装する。some()というJSの関数を活用すると、簡潔に実装できる。

その他

各クラスやインスタンスで使用する「this」というものが、最初はなかなか分かりにくかったけれど、「そのインスタンス」を意味するということと、thisのおかげで他のインスタンスや条件などど比較したり参照したりできるということが、RGPを作成することが理解できた気がする。

thisって慣れないと、たまがごちゃごちゃする。というか、クラスとインスタンスという概念を、机上だけでなくて、実際にスクリプトを組むという手を動かしたり、デバッグなどの経験を通すことで「ちゃんと理解する」といいうことが大事だな、と改めて痛感。何でもそうだけど。

参考サイト

JavaScriptでRPGを作ろう!スマホにも対応したゲームの作り方
https://original-game.com/make-an-rpg-with-javascript/

シビックテックのハッカソン大詰め。

2023年3月12日、すなわち来週の日曜日に、「シビックテックによる市民協働のまちづくりシンポジウム」が予定されている。

これは、沖縄県宜野湾市において、今まで取り組んできたシビックテック(講座やハッカソン)の結果をお披露目する場でも会って、僕もプレゼンすることになっている。

シビックテックによる市民協働まりづくり講座2022
https://ginowan-civictech-2022.ipublishing.jp/

今日は、本番前のメンバMTG。プレゼン資料はだいたいできているけれど、プロトタイプがまだできていない。僕が開発しているが、先週末は風邪で39.0度近くの熱が3日も続いていて、作業する予定が全くできずに、ビハインドしている状態だ。

メンバに現状共有したし、プレゼン資料もOKそうなので、あとはできるだけ作り込んで、プレゼン当日に臨むだけだ。ということで、残り時間は、プレゼン資料を修正して(これも僕が実施)、時間ギリギリまで開発だ。やれるだけことは、やろう。

ちなみに、僕は介護チームに所属している。「介護の関係人口が少ない」ことを本質の課題と捉えていて、解決のために「ゲームの活用」ということで、介護に関するRPGを開発している。

検討・議論していて改めて思ったけれど、ゲームって、実はとても良い手段だ。気軽にできるし、きっかけとか、とりかかりのハードルが下がるからだ。

ゲームの特性を戦略的に活用する思想である「ゲームにクス」も勉強する予定。

社会貢献はゲームでできる、というか、ゲームだからできる、と言っても過言じゃないとすら思えている。自分でも予想していなかったが、ゲーム開発にハマっているここ最近。おもしろい。

JavaScriptでRPGを開発していて思ったこと。

宜野湾市のシビックテック(ハッカソン)で、介護チームに所属していて、議論を重ねた末に「ゲーム開発」に着手している。プログラミング言語は、JavaScript(JS)。

久々のコーディングをしつつ、勉強をしつつ思ったのは、Webアプリとしての親和性はやっぱり高いな、ということと、扱いやすい言語だな、と言う点だ。

  • OSを意識しなくてよい(ブラウザで動作する)
  • アプリのインストールの手間がかからない
  • 情報もライブラリも豊富

初心者レベルだが、開発する中で調べたり考えたりしたことは、ゲームも深い検討が必要ということと、特に名作と言われているゲームは考え抜かれているということだ。

哲学、ビジョン、情熱。どれも素晴らしい。

もう絶版になっているが、以下の書籍も胸アツだった。

マンガドラゴンクエストへの道 (ドラクエコミックス) 
https://amzn.asia/d/2KoTt7U

シビックテックの活動だからと手を抜かない。できるだけ多くの人に楽しんでもらって、かつためになるようにがんばる。

ハイスキル者のコーディングを見ることも参考になる。

今まで人のコーディングなんて気にしてこなかったけど、最近、シビックテック講座でゲームを作ることになって、というか作りたくなって色々と勉強しだして、以下の動画に出会って眺めていたら、とても参考になった。

自分の成長のためには、もっと視野を広くして貪欲に、何でも観て触れてみることが大事だな、と痛感。食わず嫌いも悪くはないかもしれないが、何でもまずはやってみた方が、自分の成長スピードは早いということか。成長のためなら、食わず嫌いなんで、どうでも良い。

JSでテトリスを開発する動画

それにしても、この動画の作者さん(Akichun★PGさん)のコーディング速度が、非常に早い。話す言葉も早い。並行してコピーしようとしても追いつかない。

プロはこんなに違うのか…と思っていたけど、2倍速再生にしてたんだった。

という、笑い話。

vimの設定の備忘録

vimの設定についての情報。これだけ知っていれば、問題なく使える気がする。

Vim 設定ガイド – Qiita
https://qiita.com/marrontan619/items/541a1374e1ac672977e6

Vim: 拡張子ごとにインデントを変更する方法 ~ 初心者 ~ – Qiita
https://qiita.com/locona_0810/items/5644af52da2469adce1a

ちなみに、僕は以下を設定した。これで十分。

set number
set autoindent
set smartindent
set cindent
set smarttab

set tabstop=2
set shiftwidth=2

vimは、やっぱり使える。軽くて必要最低限の機能が整っていて気持ち良い。