並列非同期処理
手術などもありましたが、気付けば、かなり間が空いてしまいました。
一応、この投稿で終了としたいと思います。
次は、(まだ完成していない)ゲームブックのマニュアル的な投稿が出来ればと思います。
表記のテクニックについては、後述するとして、モバイルアプリを作った感想をまとめると
・基本的には無料で作れる
・便利なツールもいっぱいある
・でもGooglePlayとかに出すのは(プログラム技術以外で)面倒が多い
・さらに規約やらが結構変わるのでメンテ(再作成に近い事も)も面倒
・HTMLとjavascriptで良いなら、その辺は楽できる。
こんな感じになります。
個人的には、わざわざ手間暇かけてアプリショップに出すよりはHTML+Javascriptで行くのが正解だと思います。(一度アップしたものを、いついつまでに規約に合うように修正してください!というメールが来ます)
ここから読む方のために一応説明すると、私のアプリ作成はionic+Angularと言うやり方で、HTML+javascriptのアプリを作り、それをAndroidアプリ(iOSアプリも可能)に変換したものですので、中身はほぼ一緒です。
簡単なものでしたら、PCが有ればすぐ出来ますのでGWの暇つぶしなどにいかがでしょうか?
さて、最後の備忘録的なネタです。
非同期と並列、二つのキーワードがありますね。
まず非同期ですが、素数の計算など延々に終わらない計算を普通にjavascriptで書くと、ブラウザがフリーズして応答がありませんというようなシステムメッセージが出ます。
これはプログラムがコード順に処理をするためです。
そのため、例えば画面の上に経過時間を表示させるようなコードでしたら、非同期というテクニックを使いメインのコードとは別に動かす方法が取られます。
私の使ってるionic+Angularでしたら、home.page.tsに以下の機能をインポートして
import { interval } from 'rxjs';
//開始時間と終了時間、非同期プログラムを動かす間隔をクラスの中に定義
startTime :number
endTime :number
//間隔1000分の1秒が1
i_Time = 1
//停止フラグ
flgStop=true
//非同期プログラムを投げる関数(例えば開始ボタンを押すと実行される関数)
async fnTestStart(){
//停止フラグオンならば処理しない
if(!this.flgStop){
return;
}
this.flgStop=false;
this.flg1st=true;
this.startTime=Date.now()
this.startTime2=Date.now()
const TimerCounter = interval(this.i_Time); //this.i_Time秒ごと繰り返す
//TimerCounter が以下の処理を非同期に投げてます。
//具体的にはfnSubscribedTimer()と言う関数を実行させて結果によって終了、あるいは継続させます。
const subscribeTimer=TimerCounter.subscribe(()=>{
if(!this.fnSubscribedTimer()){ //終了条件達成時、つまりfnSubscribedTimerがfalseを返した時、unsubscribeで繰り返しの終了
subscribeTimer.unsubscribe();
this.flgStop=true;
this.endTime=Date.now();
}else{
//終了時後処理(fnSubscribedがfalseを返した時の処理、繰り返しは継続する)
}
});
return;
}
//停止ボタンを押した時の処理
fnTestStop(){
this.flgStop=true;
}
//第一の非同期
//this.i_Time/1000秒ごとの処理
fnSubscribedTimer():boolean{
if(this.flgStop){
return false;
}
//経過時間書き換え
this.endTime=Date.now();
return true;
}
home.page.htmlにボタンを経過時間表示を設定する。
<ion-content [fullscreen]="true">
<div id="container">
<p>{{(endTime-startTime)/1000}} seconds</p>
<ion-button (click)="fnTestStart()">Start</ion-button>
<ion-button (click)="fnTestStop()">Stop</ion-button>
</div>
</ion-content>
これで一応動くかと思います。
余談ですが、ブラウザに表示されるHTMLの各部分を自動的に変更してくれるための技術的枠組みがionic+Angularです。(他にももっとあります。個人的には気に入ってますが他の枠組み(フレームワーク)の方が有名かも?)
例えば、リアルタイムに変わる予約者情報テーブルなんかも出来るので面白いと思います。
(サーバ側の仕組みも要りますが)
上記は、指定のタイミングで関数を非同期で繰り返すと言う、非同期の方法の一例です。
他の方法については必要に応じてお調べください。
次に並列化です。
それ程難しい話ではないのですが、私は少し躓いたので、ここに書いておきますね。
やり方自体は、単純に別なインターバルを指定して同じように非同期処理を投げてやるだけです。
ただし、上の処理とは完全に別に書いて下さい。上の処理内(インターバル内)に書くと処理止まることになるかも?
その辺は実験しつつ試すのが理解の早道だと思います。
さて、長々と書いていった投稿もここで終了とさせていただきます。
ゲームブックの開発自体は継続していますので、完成しましたらご報告させていただきますが、長々とお付き合い、本当にありがとうございました!
return true;




