つてとのブログ

「金銭感覚がおかしい/ない」とならないように、自分の金銭感覚をあらためて反省する話

 

こんにちは、基本ケチなたちつてとです。

最近、1ヶ月単位で

じみ−ーーーーーに欲しいものが

増えてきた一方、ケチなので

買っていいのかな?という思いで揺れる日々なので

僕の金銭感覚と困りごとについて書こうと思います。

 

何かを主張したいわけでなく

日々こんなこと考えながら生きてまーす

というのを素朴に書いていくだけ。

 

こうありたいものだ。

を書くと

少しは財布の紐を閉めるきっかけになるのかな?

と思った次第です。

あと考えの整理。

 

まあともかく、文字起こし。

 

収入から考える金銭感覚

これは、その人の収入や貯金が基準となるでしょう。

例えば、月に20万儲ける人が

20円のお菓子を買うのは

 

20/200000 = 1/10000

 

割合にして0.0001なので、安い。

一方、同じ収入で10万のスマホを買うのは

 

100000/200000 = 1/2

 

収入の半分なので高い。

もちろん、「この割合の大小の閾値がどこにあるか」は

人ごとで異なり、「なぜ異なるのか、その原因は何かも」も

収入だけで決定しているわけではないと思います。

 

mac book proを20万で買ったよ」

に対しての反応は、僕なら

「(僕の収入的には)高っ(けどそいつの収入を考えるに安いか)」

となるわけです。

なお、そんな友達はいません。

 

これは誰もが、(少なくとも)

感覚的に考えることかな、と思います。

 

相場から考える金銭感覚

これも日常的な感覚。

例えば、Amazonでの中古出品の値段と

フリマアプリでの中古出品なら

フリマアプリの方が安い。

 

さらには、フリマアプリの中でも

各々によって金額はばらつきます。

なんとなくざっと出品から平均値を想像、

しばらく様子を見て、この平均値より

はるかに安い出品なら購入。

 

ってのが僕の中でよくあるパターンです。

この辺の統計が気になってメルカリ遊戯王相場

のデータで遊んでたことも(過去記事で)あります。

飽きたし疲れるのでやめましたが。

この辺をガチの統計プロがちゃんと時間をかけて解析すると

面白いことも発見できるんやろなぁとは思いましたが...

 

まあ、つまり他の類似商品とも照らし合わせて、

その中から見出す値段の感覚は確かにあります。

 

収入とは関係なしに

相場から外れた商品はお得ですぐ横取りされる!!!

という思いから、焦って購入...

という流れもありがちです。

 

ほいで、セット商品なら

この商品の平均価格はああで、

あの商品の平均価格はこうだから、

これは割とお得。

と結論を出すと、歯止めが効かなくなる

 

分母の問題

僕の場合、収入 < 出費なので

まあまあの額を貯金できています。

 

ここで厄介なのは、欲しいものがあれば

大抵のものが購入できる状態であるということ。

さらに、

欲しいものが連鎖的にできても、購入できてしまう

こと。

 

10万円のwalkmanを購入します。ここで、

月収が20万で

10/20

=1/2

0.5⇨「まあまあ高く」ても

1000万の貯金があれば(ありませんが。)

10/1000

=1/100

 

0.01とも考えられるので、安いともいえます。

ここで重要なのは、分母

 

しかも、欲しいものは何しろ欲しいものなので、

分母が大きい方で考えがちです。

→安いと判断し、我慢できずに買ってしまう

 

金銭感覚がおかしくなるとは

まあまあ。たまに(1ヶ月ごと)は良いじゃない。

などと購入したとしましょう。

事実、2万円で(新品のところ3万の)walkman

購入しました。

 

すると、ガソリン代に5000円とられるのは

(出勤のためやむを得ない出費であるとはいえ)

高い。しかし、欲しいものに関しては

5000円くらいならまあ安いか。

という思考になっています。

ここで、

 

5000/20000

=1/4

 

という、買ったものと欲しいものの(不毛な)比較が

始まっていることにも気づきます。

危険なのは、買ったものの値段が上がると

欲しいものの値段が上がっても相対値としては小さいこと。

→安いと判断しがちになる。

 

一言で言うと、金銭感覚がおかしくなる

んじゃないですかねぇ...という心配。

 

次善ならぬ次悪の状態として

貯金はたまらないけど、増えもしない。

また、貯金する額が減り続ける状態

(=貯金総額が増えにくい状態)。

 

でもやっぱ難しいんだよなあ

今月は、これ以上欲しいもんはない!

だから買ったろ!

と思っても

週末の仕事終わりは無性にお金を使いたくなるし、

来月に欲しいもんができてしまうし...

 

後者はともかく前者が問題です。

困ったことに、月に週は4回ありますから。

少なくとも4回は、この衝動に耐えねばなりません。

 

以上の問題に対しての対策

最も有効な対策

最大の原因は、使えるお金が存在することなので

これを別の口座に移してしまう。

 

幸にして、全く使ってない

5ヶ月経たずに退場

株用に開設した三井の口座がありますので

これに移すか。

 

大学時代にためた口座と仕事で貯めた口座は

入社時に(仕方なく)別に開設してます。

多分取引先とかの都合。

それで、前者の方は手を付けてないんですよね。

よって、別口座利用作戦はうまくいきそう。

 

よくわからんけど効くかもな対策

自分の中で月に使える金額を設定する。

上述の分母の話で、分母を貯金額ではなく

1ヶ月の利用可能額に置き換えるよう自分を洗脳する。

 

ただ、僕はまず5万くらいに設定しそうな一方で

車とかPCの修理出すと余裕で超えてしまうんですよね。

 

しかし、8万(=過去にあったPCの修理代)とか

だと高すぎるし、設定の根拠を求める自分がいて

いまいち自分の性格も含めてめんどくさい。

 

あーあ、金が欲しいぜ。

今日寝たら、またいい案が浮かぶかもしれん。

GBA SPとポケモンのエメラルド

2台ずつ欲しいもんなあ...

後、フーディン作るのに通信ケーブルもいるしなあ...

 

あ、

ゲンガーも欲しいからリーフグリーンとかもいる?

困ったなあ...3万で集まるのかなあ...

待てよ、時間の機能使うのに電池とかもいる?

ジョウト地方ポケモンってどうやって手に入れるんだっけ...

 

とりあえずエメラルドとSPだけ手に入れるか?

今月はいって早速1万は、迷うなあ。

【Flutter/Dart開発】初!アニメーションを導入/表示制御をちょっとおしゃれにしてみた話【スマホアプリ】

こんにちは、たちつてとです。

表題通り、アニメーションを導入してみました。

 

やりたいこと

f:id:tachitutetoNosuke:20211105193833p:plain

みていただきたいのは、上画像の

左から1,2番目のスマホ画面。

 

出費管理アプリを作って

独りで使っているんですが。

完成物。

f:id:tachitutetoNosuke:20211106183103g:plain

 

モチベーション

毎月、固定費を入力をしなければならない

ことに気づき、いやだる。となったので

実装しました。

固定費の設定画面になります。

 

まあ、細かいことはよくて、

入力画面を新しく作るのも、いやだる。と

思ったからではないんですが、

めんどくさいものはめんどくさいので

一覧編集画面にて一括登録形式で

固定費を設定しようと思いました。

 

そこでネックなのは一覧画面なだけに

一行にたくさんのスペースを使うのもな...

ということでして。

 

ならタップで表示切り替えすれば

コンパクトになるんじゃね?

 

と思いました。これだけなら

Widget的にはVisiblityというのがありますので

タップイベントでVisibleをtrue/falseで

切り替えれば、はいOK。となります。

 

でもそれだけだとつまんなくね。

 

と思ったので、アニメーションを導入しました。

なんという向上心と啓蒙!

 

コード

Container getContainer() {
return Container(
child: ListView.builder(
// リストを生成
itemBuilder: (context, index) {
final cost = _costList[index];// 独自変数

return
Card(
child: ListTile(
title: Column(children: <Widget>[
Container(
height: 60,
child: AnimatedSwitcher(// 中核
duration: const Duration(seconds: 1),// 時間設定
     // 独自メソッド
child: getRenderWigit(_widMode[index], index, _costList[index]),
transitionBuilder:
(Widget child, Animation<double> animation) {
final offsetAnimation = Tween<Offset>(
begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0))
.animate(animation);// 位置設定等
return ClipRect(
child: SlideTransition(
position: offsetAnimation,
child: child,
),// スライドの感じに
);
},
)),
]),
onTap: () {// tapイベント
setState(() {
if (_widMode[index] == "") {// モード切り替え用の変数にしこむ
_widMode[index] = "1";
} else {
_widMode[index] = "";
}
});
},
),
);
},
itemCount: _costList.length, // 制限
),
);
}

というメソッド(戻り値:Container)をScaffoldのbodyにぶち込みます。

 

変数/処理で重要なこと

オリジナルな変数は_costList, _widModeになります。

ここでは、一覧画面ということでいずれの変数も

List型になります。それぞれ

List<RegularCost>, List<String>型

となります。

前者は独自のクラスなので参考にならない思いますが...

 

大事なのは、

 

前者が表示したいList変数で

後者が一行ごとに表示制御を切り替えるための変数

 

となります。

 

そして、上記ソースの通り

OnTap、タップイベントに

後者のモード制御用の変数の値を切り替えています。

 

値が

  • ""、空ならデフォルトモード(以下ソースでは詳細略)
  • "1" なら日付入力用モード(以下ソースでは詳細略)

となります。

 

アニメで重要なこと

AnimetedSwitcher

 

というのがアニメーションにおいて

最も重要になります。

基本的にはコメントした通りになっています。

これによって、上述の表示モードの切り替えが

(滑らかに動く)アニメーションになります。

 

Offset

ちょっと調べた感じ、

近いのは「補正値」という意味ですかね?

僕の経験としては、仕事とかでライブラリ使ってると

システムの見た目をちょっと修正したい

→「ある基準値からのずれ」を設定するために

なになにOffsetという関数を使ったりします。

 

ここでは、本来ある位置がoffset(0.0, 0.0)で、

ここを始点にアニメにしたいぜ(start)

→offset(0.0, -1.0)

としてます。

offsetの引数はそれぞれ

横方向、縦方向です。

 

ですので、横方向にアニメにしたいときは

例えば、

  • startをoffset(-1.0, 0.0)
  • endをoffset(0.0, 0.0)

とする。最後には本来の位置にいて欲しいので、

endは0,0です。

 

もちろん、斜めにしたければ

(-1.0, -1.0)や(1.0, 0.5)

とかもあり。

 

表示切り替え用のメソッド

最後に、以下のコード。

getRenderWigit(widMode, index, cost) {
if (widMode == "") {// 表示モード デフォ
return Container(
key: Key("Text" + index.toString()),
height: 60,
width: MediaQuery.of(context).size.width,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Card(
child: Container(
width: MediaQuery.of(context).size.width * 0.4,
child: TextFormField(
key: Key('Text' + index.toString()),// Key指定必須
initialValue: 'Text',
style: TextStyle(fontSize: 16),
textAlign: TextAlign.left,
))),
Card(
color: Color.fromRGBO(255, 255, 255, 1.0),
child: Container(
width: MediaQuery.of(context).size.width * 0.4
          )
),
]),
);
} else {// 表示モード1
return Container(
alignment: Alignment.center,
key: Key("Date" + index.toString()),// Key指定必須

child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
],
));
}
}

こんな感じのメソッドで

ifによってモードの切り替えをしています。

 

引数のwidModeがsetStateするたびに変化

→戻り値のContainerの内容も変わる

 

という感じで、表示切り替えのアニメーションができます。

 

まとめ

  • AnimetedSwitcherを利用
  • タップイベントに表示制御変数の値が変わるよう仕込む
  • 表示制御用の変数値によって表示が変わるようにメソッドを用意

説明は以上となります。

お疲れ様でした。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Android/iOSクロス開発フレームワークFlutter入門 [ 掌田津耶乃 ]
価格:3300円(税込、送料無料) (2021/10/25時点)

楽天で購入
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Flutter モバイルアプリ開発バイブル [ 南里勇気 ]
価格:3509円(税込、送料無料) (2021/9/20時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Javaのオブジェクト指向がゼッタイにわかる本[第2版] [ 立山秀利 ]
価格:2530円(税込、送料無料) (2021/9/26時点)

エンジニア発オンラインスクール【RUNTEQ】

 

【Flutter/Dart開発】カレンダーで利用開始・終了日を導入→固定費を表現した話【スマホアプリ】

 

こんにちは、たちつてとです。

自作の出費記録アプリを(一人で)使ってて、

アマプラなど、月ごとに固定額が出ていくのを

わざわざ毎月やるのもアホらし。と思い、

アプリ側で固定費の入力画面を作成しました。

 

カレンダー機能の導入について

なお、カレンダの導入については

がっつり

【Dart/Flutter開発】画面遷移とカレンダー機能を実装、実際の(自作)アプリと考え方を共に...

こちらの記事で書きました。今回の記事では述べません。

カレンダ導入でいらっしゃった方はこちらへどうぞ。

 

機能一覧

以下の様な画面です。

f:id:tachitutetoNosuke:20211105193833p:plain

  • 固定費の一覧があって、それぞれのTextを編集できる。
  • Text以外のところをタップすると、

    アニメーションで適用日を編集する行に変わる

  • 適用日は外部パッケージで、便利に?選択できる

 

固定費を登録してどうなるか

こうなります。今回やりたいことです。

f:id:tachitutetoNosuke:20211105200308p:plain

一番右の画像のように、月毎の出費合計を

出すところがあるのですが、

そこに自動的に固定費の金額を足します。

 

画像の様に、固定費で500円

固定費でない通常の入力で1000円

合わせて1500円という表示になります。

 

画像では緑の枠の項目に

2022/03/09, 2999/12/31とあります。

一方、一番右は2021年11月の表示ですが、

2022/03/09〜 2999/12/31の範囲にはありませんから

合計には入っていないという具合です。

これを利用開始・終了日と勝手に読んでいます。

 

実際のソース

クラス

@HiveType(typeId: 2)
class RegularCost{
RegularCost({
this.id = -1,
this.categoryCd = -1
, this.name = ''
, this.money = 0
, this.memo=''
, this.dateFrom = "2021-01-01"//利用開始日デフォルト
, this.dateTo = "2999-12-31"//利用終了日デフォルト
});

@HiveField(0)
final int id;
@HiveField(1)
final int categoryCd;
@HiveField(2)
String name;
@HiveField(3)
int money;
@HiveField(4)
String memo;
@HiveField(5)
String dateFrom;//利用開始日
@HiveField(6)
String dateTo;//利用終了日
}

Hiveむにゃむにゃ、は気にしないでください。

スマホのストレージにデータを保存するのに

Hiveというパッケージを見つけたって感じです。

【Dart/Flutter開発】ローカルのストレージでデータ記録/管理できるHiveについてまとめた話【個人開発】

一応こちらでまとめています。

 

ともかく、クラスに利用日のフィールドを設定。

陽に設定されない時は、「ずっと」という意味で

2021/01/01〜2999/12/31とした。

ただし、問題は後者の2999年なんです...

 

_showDatePickerの注意点

多分、↑の方であげた過去記事も似たようなソースを

書いていると思うんですが

final DateTime? selected = await showDatePicker(
context: context,
initialDate: 初期値,
firstDate: DateTime(2021),
lastDate: DateTime(2999,12,31),//ここです
);

lastDateも利用終了日のデフォに合わせないと、

エラーが吐かれます。

つまり、firstDate〜lastDateの範囲外で

入力/表示したいDateを無理やり表示させることはできない

です。

例)

○良い例

  • initailDate 2021/05/01
  • firstDate 2020/07/05
  • lastDate 2026/07/05

×悪い例

  • initailDate 2021/05/01
  • firstDate 2021/07/05
  • lastDate 2022/07/05

 

まあそれはそれで結構なんですが...

f:id:tachitutetoNosuke:20211105204224p:plain

いや2999年は編集したいわって時、

年を変えようとすると、この画像みたいになります。

いつなったら2020年代に来るんや...

 

という注意でした。

まあ、デフォの値を2022/01/01とかにすれば

OKな話です。

 

固定費の抽出

Hive.openBox<RegularCost>(_cost).then((value) {
Box<RegularCost> mesBox = value;

for (RegularCost cost in mesBox.values) {// 固定費ループ
if(DateTime(int.parse(_year), int.parse(_month),1).isAfter(DateTime.parse(cost.dateFrom))
&& DateTime(int.parse(_year), int.parse(_month),1).isBefore(DateTime.parse(cost.dateTo))
)// 利用日判定
_sum += cost.money;
}
});

HIve使っているのでわかりにくいですが、

要は登録されている固定費項目について

ループかけて

DateTime型の比較をしています。

 

isAfter/isBefore

 

というのが比較演算子?になります。

C#とか「=>」で比較できたのに

エラー吐かれてビックリでした。

 

isAfter/isBeforeという比較メソッドで

表示中の年月

(=_year,_month:ドロップダウンの選択値)

が利用開始日/終了日の間にあるか

を見ています。

 

って感じで以上です。

お疲れ様でした。

 

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Android/iOSクロス開発フレームワークFlutter入門 [ 掌田津耶乃 ]
価格:3300円(税込、送料無料) (2021/10/25時点)

楽天で購入
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Flutter モバイルアプリ開発バイブル [ 南里勇気 ]
価格:3509円(税込、送料無料) (2021/9/20時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Javaのオブジェクト指向がゼッタイにわかる本[第2版] [ 立山秀利 ]
価格:2530円(税込、送料無料) (2021/9/26時点)

エンジニア発オンラインスクール【RUNTEQ】

 

【Flutter/Dart開発】アプリのアイコンを変更するのに事故ったけど、順次解決してやったぞ、な話【Image Assetが表示されない等】

こんにちは、たちつてとです。

僕、出費管理アプリとメモアプリを開発してます。

それぞれ8割、7割くらい完成してて

あとは便利機能つけるか、という段階です。

 

特に出費管理アプリの方は、

すでに僕専用で稼働していて、

我ながらいいもん作ったなぁ...と思いながら

うわ、先月5マン使っちゃったよ...と思いながら

でも5マン使っちゃたよ...が明確に

記録として残るのは、やはりいいなぁ...と思いながら

利用しています。

 

さて本題、そんな状況の出費管理アプリなんですが、

スマホのhomeで出るアイコンが

サンプルアプリのと同じだったのでそれを変更した

という話です。

 

利用したもの

必須/ほぼ必須

 

任意、サポート用

 

作戦

  1. おえかきボード(5)で舐め腐ったアイコンをpngで生成
  2. 必要に応じて(4)でpngのサイズを変換(任意)
  3. (3)でアイコン差し替えに必要なパーツを取得
  4. (1)で差し替え作業

こんな感じです。順をおって説明していきます。

とはいえ、1,2はURL踏んで

もちもちと作業するだけなので

3,4番目のについてお話しします。

 

本題

 

該当フォルダを差し替え

Icon Generator(アプリアイコンを生成) でアイコンを

生成してもらったあと、アイコンを差し替えたい

プロジェクトのあるフォルダを置き換える必要があります。

 

↑リンクでアイコンにしたいpng画像をぶち込み

Generateボタンを押すと

f:id:tachitutetoNosuke:20211101214853p:plain

↑こんな感じの中身がつまったフォルダが

ダウンロードされます。

補足

なお、左画面のic_launcher.pngという名前を

(僕の様に)不用意に変更すると、

ビルドエラーを吐かれます。

 

調査するのも面倒だったので未解決ですが、

特にこだわりがない場合は、変更不要です。

赤枠で囲ったところは、名前を変更できるみたいですが

注意です。

 

f:id:tachitutetoNosuke:20211101215238p:plain

 

フォルダを取得後

さて、お次はAndroid Studioの出番です。

該当プロジェクトの下の

  • sample/android/app/src/main/res
  • sample/ios/Runner/Assets.xcassets

を見つけてください。

※上Android、下iOS用のパスです。

先ほどダウンロードしてもらったフォルダと

同じフォルダがプロジェクト内にあるので、

置換しましょう。

 

この状態でアプリを実機/シミュレータで

インストールしてみてください。

確かにアプリのアイコンが変わってませんか?

 

アイコンがちくちくの長方形である

ので、ちょっと露骨すぎんな、ということで

丸みのある四角形とかにしたい。

Android Studioの出番。

 

Image Asset

 

というのを利用します。ところが

のresを右クリックしても、Image Assetという選択肢がない。

f:id:tachitutetoNosuke:20211101220717p:plain

Newより10個ほど下の項目に

「Flutter」というのがあるのでクリック。

さらにOpen Androidなになにをクリック。

f:id:tachitutetoNosuke:20211101220958p:plain

これで、新たにAndroid Studioみたいなのが開かれます。

 

以下画像の手順に従ってください。

もう一度、resフォルダを右クリックでしてみてください。

Image Assetがあるでしょうか。

f:id:tachitutetoNosuke:20211101221309p:plain

 

Image Asset起動!!!

f:id:tachitutetoNosuke:20211101221614p:plain

画像垢枠のとこで、1024×1024のpngファイルが

あるパスを選択してください。

これで、画面右側のドロイドくんの絵が差し替えたい

アイコンになるはずです。

 

少しみにくいですが、灰色の線の内側が

アイコンになります。

もし、

 

はみ出てるわ...ってなっても

 

(僕のように)あらためて画像編集等をする前に、

赤枠で囲ったところの下にResizeを試しましょう。

画像の拡大縮小ができます。

僕の場合は、はみ出てた部分はResizeで解決できました。

 

最後、FInishを押すと

アイコンがちくちくの長方形ではなくなっていると思います。

実機等でインストールしてみてください。

 

最後に

無事、舐め腐ったアイコンに差し替えることができました。

腹立つなこいつ。

f:id:tachitutetoNosuke:20211101222542p:plain

というわけでいえい。

お疲れ様でした。

 

エンジニア発オンラインスクール【RUNTEQ】

 

【メトロイド ドレッド 感想】無気力な僕もドレッドクリアしたったぞ、と評価の話【おもしろいswitchソフト】

 

こんにちは、たちつてとです。

表題通り、クリアまでのプレイ時間10時間か...

と渋っていた僕が2週間かけてクリアした

メトロイドドレッド」の感想になります。

※なお、本当にクリアまで10時間くらいでした。

 

 

最初のダンジョンのボスを倒したくらいでの

感想が以下の過去記事になります。

よかったら、さっと目を通していただけると

嬉しいです。

tachitutetonosuke.hatenablog.com

 

以下、重大なネタバレはないです。

結論、というか評価

↑の過去記事では、割と絶賛気味だったのが

クリアしてどうか、という話になります。

一言で言うと

 

まあまあ良ゲーでは?

 

という案配でした。

100点満点なら85点くらい?

僕がやり切れた時点で、良いゲーム認定です。

 

悪かったところ

ちょっと気になるかな〜くらいで

致命的な点はなかった気がしますが。

気になった順で。

ジャンプのタイミング

スタフィー2(わかる人います?)みたいに、

雑に入力して2,3...段ジャンプができるわけではない。

多段ジャンプするには、

入力タイミングが重要なんですが。

 

これマスターしないと、ラスボスで

ボコボコにされたんですけど。

他にも、この入力タイミングのせいで

僕のサムスが散った場面が何回も...

 

敵が強い、ダンジョンが複雑...etcは良いんですが、

自機の操作を難しくすることで、

ゲームを難しくするのはどうなん?

と思いました。

 

ちょっと敵硬/タフい

これは過去記事でも触れました。

ため打ち一発で、道中の敵を屠れないのは、

ちょっとめんどくさかったです。

 

パリィみたいな技を利用すると一発なんですが、

もちろん相手が攻撃してくれるのを

待たないといけないので...

その度に足を止めるのは、ちょっとだるいな

という感じでした。

 

サムスくん(ちゃん)はせっかく

スピードあふるる感じで走ってくれてるのに、

都度、足を止めるのはな...、でした。

 

BGM、印象に残らず

ゲームそのものよりBGMに期待するまである

僕としては、ちょっと残念...

 

まあ、今回の作風でかっこいい曲が流れても

ゲームと合わないと思うので、

ここは仕方ない気もする。

 

振り返ると、敵使い回し...

何回か似たような敵に遭遇したりもするんですよね。

とはいえ、若干強化されており、

初見殺し(殺され?)の原因となったりします。

 

ベースは同じなんですが、

敵のギミックも変わってたりして

これを攻略するのは面白かったです。

→ほぼ気にならない程度。

 

よかった点

メトロイド自体は、僕初めてなんですが

毎回どんなセオリーがあるんですかね?

まあ、僕なりの感想。

 

操作感がよろしい

操作が難しいなんてレビューも見かけましたが、

慣れたらええやろ、というレベルでした。

過去記事でも述べましたが。

 

特にメレーカウンターというパリィ技があるんですが、

初見ではこれが気持ちよくてはまりました。

 

中盤〜終盤でも割と大事な技で、ボスにも聴くし

できたら楽しいし、って感じですね。

 

程よい難易度

ボス敵はいい感じで

攻略しがいのある難易度でした。

 

初見でクリアできたボスは多分いません。

何回か死んで、パターンを見つけたり

攻略ギミックを発見したりするのが楽しかったです。

 

個人的にはボス攻略が一番楽しかった。

 

ダンジョン攻略が一本道じゃない

ここはメトロイドガチ勢から

怒られるかもしれません。

 

なんか色々道があって、

単純に新しいマップを切り開いていくだけだと、

どこかで行き止まりになってしまう。

 

僕みたいに記憶力悪かったり、サボったりすると

どこにいけそうな場所があったか

わからなくなり沼ります。

 

偶然ギミックを発見できたりすると、

おおっ...!ってなったり楽しいです。

 

E.M.M.Iくんすこ

この点は過去記事でも述べました。

最悪エミーくんに捕まっても、

カウンターで脱出できるところがいいですね。

(なお、タイミングは

予測して置きに行かないと...ってレベルで成功、

合図を見てからだと、無理でした。)

 

ラスボスがラスボスしてる

これ、地味に嬉しいですね。

ドラクエ5のミル○ラースとか

目も当てられませんからね。

 

死にまくったし、ラスボスが一番強かった

って個人的にはいえます。

 

この攻撃無理ゲーすぎるやろ...

→あ、これで突破できるんちゃう?

→できるやんけ...

 

楽しかった。

 

惜しかったかな?な点

以下、アビリティに関する微ネタバレ?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最終的に、サムスくんは

マグマであろうが冷凍庫であろうが、

水中であろうがすいすい歩ける装備を手にします。

 

多分、誰もが思うであろう

水中では動きが遅くなるから、

なるべく入りたくないな...

がこの装備入手で一気に解消されます。

 

僕は、この装備入手時に大変感動したものです。

このゲームは、ストーリーを進めると、

装備が少しずつ解放

→ダンジョンもいける場所がふえていきます。

 

ですんで、欲を言えば、

フル装備状態で、ゲームを一から進めるモードが

欲しかったです。

ぜってー楽しい...

 

このモードあったら95点くらいかな...と思います。

まあ、そもそも実装が難しいと思いますが...

また、悪かった点を挙げましたが、

-5点くらいということですね。

 

 

という感じで、以上が感想になります。

面白かった。

僕が珍しく、クリアまでありつけたゲームになります。

多分、まともにクリアしたの、2月くらいにやった

一年放置されてたHorizon zero dawn以来では?

 

ポケモンとかは僕も小中学生の時ハマってました。

がたぶん、新作はもう買いません

4つの中から技選択して...

順路に沿って...

あんまり感情移入できないイベント見て...

ってのが自分に合わなくなってしまったので。

 

しかし、メトロイドの続編が出たら買います。

淡々とダンジョンを拓き、ボスのパターンを見抜き...

 

久しぶりに、明確に楽しかったです。

 

そんな話でした。

 

 

よかったら購入されてはいかがでしょうか?

そういえば、体験版も発表されましたし。

友達とラーメンを食べに行って、いろいろトラブったけど楽しかったなあ、の話

こんにちは、たちつてとです。

 

ドタキャンならぬドタアポ

金曜日(2021/10/29)に、

僕がyahooニュースを発見しました。

内容は、以前行ったことのあるラーメン屋が

新商品を出すとのこと。

 

なんとなく、知ってる店がyahooニュースに載ってたこと

新鮮で、友達に声かけてみました。

「ここ前行ったとこかな?」

 

なんだかんや、土曜の深夜に行くか聞いてみて

(返事を見る前に)僕は眠りに...

眠かったので。

 

ほいで当日いくことが決定。

滑り込みセーフ。

 

当日

当日というか、起きてから。

「前、10時くらいに家出たっけ?

 今回もそうするか」

的な打ち合わせをし、僕がcar(車)で迎えに。

 

まあ順調に1時間かけて目的地へ。

 

驚愕の事実

目的のラーメン屋ですが、

僕は11時開店かと思い

10時に出発→1時間弱でいける

という想定でした。

 

ところが開店時間は11:30だったらしい...

 

やばいよ...ラーメン屋に30分前行動はないよ...

 

「いや、11:30なら教えてくれよ、

 わしは11:00スタートかと...」

「いや、俺も11:00かと....」

 

とか話しながらラーメン屋に到着。

 

並ぶこと15分

並ぶ(動詞)

 列などを作って隣り合う。

他の客がいないけど、その場所にいることを

果たして「並ぶ」と言っていいのか、

甚だ疑問ですが。

 

ともかく待機していると、

まだ開店していないのに

ぽつぽつお客さんがいらっしゃる。

 

開店直後には、7グループくらい?

 

やっぱり人気な店なんだなあと。

yahooニュースパワーが効いていなくても

たぶん、同じ状況だったでしょう。

 

10分くらい来るの早かっただけやん。

 

いざ、ラーメン

もちろん、yahooニュースになった商品を

2人で注文します。

5分かかってないくらいできました。

 

気のせいかもわかりませんが、

やっぱり(ニュースになって)準備してたから

速かったんかなあ...と。

 

仕事の休憩時間で行った店、

30分くらい待ってようやっときた

ところありましたから。速い速い。

 

味も美味しかったです。

ごちそうさまでした。

感想2行かよ。

2行です。

 

帰り

駐車券をお店の人にもらい、駐車場へ。

満足して帰ろうかという時。

 

駐車場、精算機前で。

おじいちゃんが明らかにトラブっている。

たぶん、100円玉とかを探しているんだろう...

まあそれは良いです。

 

問題は、駐車場の「1時間無料」。

ちょっと早くきたせいで、

もう1時間数分前。

 

多分3〜5分くらい待ちぼうけ。

車の中での出来事で、

はよお金見つけて、出てってくれ...

と思うことしかできず。

 

「もう車でて、わし100円入れてこれば

 1時間無料でいけるんじゃね?」

とか話しながら、ようやく前の車が動く。

 

結局、480円のところ

110円請求されました。

おい、じじぃ。

友達が110円出してくれたとはいえ

ちくせう。

 

その後、特に事故もなく

友達を家に送り、わしも帰宅する前に

お腹を壊しスーパーへ冷やかしトイレし、

ついでに散髪

 

憂鬱だった散髪も、終わらせて満足満足

という休日でした。

【Dart/Flutter開発】検索エンジンでありがちな、単語/言葉の検索機能を実装する、話

 

こんにちは、たちつてとです。

↓過去記事では(年月やカテゴリIDなど)

「完全一致」に関する検索機能を

実装しました。

【Dart/Flutter開発】表示制御と検索機能の実装、実際の(自作)アプリと考え方を共に...【スマホアプリ】

 

が、Googleやyahooで見かけるような

単語を入力→一致する項目を表示する

「部分一致」の検索機能は

実装したことがありませんでした。

 

「あい」で検索すると

  • あかさたな
  • あいうえお←Hit!
  • ゆがんだあい←Hit!
  • あいのない話←Hit!
  • あばばばば

とこんな感じの検索機能の話です。

 

メモアプリを作っているんですが、

それで上記のような単語検索機能を

組みたいなと思い、記事にする次第です。

 

完成イメージ

実装イメージ、シミュレーターのキーボードの都合で

aiu」で検索...

f:id:tachitutetoNosuke:20211027200927p:plain



作戦

基本的な作戦は、

【Dart/Flutter開発】表示制御と検索機能の実装、実際の(自作)アプリと考え方を共に...【スマホアプリ】

こちらの記事と同じものでいきます。

(※前提:一覧画面があってその項目を絞り込みたい。)

 

言葉にすると、

  1. テキスト入力がされた時に
  2. その言葉を含む項目「だけ」
  3. 一覧画面にセットしたい

です。

 

ですんで、より具体的には

 

  1. TextFieldのChangeイベントで
  2. TextFieldに入力された内容を含む項目を、if分岐しつつList変数にぶちこみ
  3. ListView.builderのitemBuilderに渡す

 

となります。

ここで厄介なのが、キーワードを含む

なんですが、割と余裕?というか

プログラムにして一文でクリアできたりします。

 

正規表現

これタイトルに入れると、アクセス数少なくなりそうで

入れませんでした。

ブラウザバックはしないでください...。

正直、僕も100%は使いこなせません。

業務の中で必要に応じて、必要な記述を勉強してくって感じで。

はい、結論から。

 

for (Memo memo in mesBox.values) {
if(memo.categoryCd == _categoryCd) {
if(new RegExp(r'.*' + _searchWord +'.*').hasMatch(memo.title)) {//ここが大事
_memos.add(memo);
}
}
}

RegExpが最も大事な記述です。

RegexExpression(のはず...)が正規表現と呼ばれるものです。

 

は?って方もいっぺんコピペして

動かしてみてください。

 

何かしらのパターンで文字検索したい時に

よく利用されます。

 

ほんの少し解説すると、

「.」:任意の一文字

「*」:0回以上の繰り返し

という意味になります。0回以上ってなんやねんて方。

うーん、あってもなくてもいいって感じ?

この解説に長くなるのは本意ではないので、

ここまでにします。

 

要は

「.*」任意の文字の繰り返しが0回以上ある

 

任意の文字列(あってもなくてもいい)

+

検索ワード

+

任意の文字列(あってもなくてもいい)

 

という形式でパターン一致をみます。

先の例を繰り返し書くと

 

「あい」で検索すると

  • あかさたな
  • あいうえお←Hit!
  • ゆがんだあい←Hit!
  • あいのない話←Hit!
  • あばばばば

 

2番目のは、「あい」 + 任意の文字列(以下、任)

3番目のは、任 + 「あい」

4番目のは、任 + 「あい」 + 任

でヒット!となります。

2,3番目は、任意の文字列があってもなくてもいい

ということに注意です。

 

最後に、

メソッドhasMatchはこのパターンに一致したら

trueという感覚的にわかるものです。

 

このように、正規表現によって

検索機能が実現できます。

 

補足

一応補足ですが、

 

「アイ」で検索すると

  • あかさたな
  • あいうえお
  • ゆがんだあい
  • たあいのない話
  • あばばばば

はヒットしませんし、

 

「愛」で検索しても

  • あかさたな
  • あいうえお
  • ゆがんだあい
  • たあいのない話
  • あばばばば

ヒットしません。

ヒットしません...

ヒットしないのです...

 

検索ワードとパターン内の文字のひらがな・カタカナ・漢字は

完全に一致していないといけません。

アルファベットも同様です。

 

ここを解消しようとすると、

カタカナの例では、

「あい」ときたら

「アイ」、「アい」、「あイ」

も検索ワードに含めるという処理を書くことが必要です。

 

余談の余談ですが、

これを実装するために、if分岐で||(or)を書かなくても

(=if( 正規表現 or 正規表現 )としなくても)

正規表現の中で「または」と書くことができます。

 

めんどくさいので、僕はやりませんよ。

あんまり面白そうでもないし...

 

コード全貌

僕のコード独自のものが入っているので、

コピペしただけでは動きませんが...

 

黄色のコメントのところがポイントですので

真似するのも難しくはないんじゃないかなと思います。

 

プロパティ宣言

TextEditingController _cont= new TextEditingController();//補足に詳細
final List<Memo> _memos = [];
static int _categoryCd = -1;
String _searchWord = '';

 

絞り込み用ロジック

void loadData() async {//テキスト変更イベントで呼び出される、項目絞り込みロジック
Hive.openBox<Memo>(_memo).then((value) {
Box<Memo> mesBox = value;
_memos.clear();
for (Memo memo in mesBox.values) {
if(memo.categoryCd == _categoryCd) {
    //項目の絞り込み
if(new RegExp(r'.*' + _searchWord +'.*').hasMatch(memo.title)) {
_memos.add(memo);
}
}
}
    setState(() {});//絞り込みを反映するために、再描画。非同期処理の最後に記述。
  });
}

検索用テキストボックス

TextField(
controller: _cont,
style: TextStyle(fontSize: 16),
textAlign: TextAlign.left,
onChanged: (word) {//テキスト変更イベント
_searchWord = word;
loadData();// 絞り込み開始
},
decoration: const InputDecoration(
labelText: '',
filled: true,
fillColor:
Color.fromRGBO(255, 255, 255, 1.0),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.black12, width: 1.0),
),
),
)

 

一覧表示用のロジック

ListView.builder(
// リストを生成
itemBuilder: (context, index) {
final daymemo = _memos[index];// 絞り込まれた項目が表示

return Dismissible(...)

 

後から気づいたんですが、

変数「_serachWord」は実は不要でした。

TextEditingController(=_cont).textというので

テキスト入力に入っているワードを取得できるので

わざわざプロパティとして準備しなくてよかったです。

 

補足

コードにあるコメントですが、

TextEditingControllerをあえて、プロパティにしているのは

訳があります。

TextFiled

    controller:new TextEditingController

とかくと、(Onchangeイベント等で)

画面が描画されるたびにカーソル位置が

リセットされ、一番左端になってしまいます。

 

つまり、素朴にaiuと入力しても

(カーソルを|とすると)

 

  1. |a
  2. |ia
  3. |uia

 

となるのです。ですので、

いちいちnewしないで、プロパティ化しています。

 

という具合でキーワード検索を実装しました。

どうでしょうか。正規表現という言葉さえ知っておけば

割と誰でもすぐ実装できます。

 

正規表現は、

もっといろんな表現で様々なパターンの

文字検索ができます。

正規表現だけで無限に記事が書けそうなくらい。

 

ま、「含む」くらいの実装なら

今回書いたような内容で十分です。

それ以上のことは、僕は知りません!

 

 

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Android/iOSクロス開発フレームワークFlutter入門 [ 掌田津耶乃 ]
価格:3300円(税込、送料無料) (2021/10/25時点)

楽天で購入
[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Flutter モバイルアプリ開発バイブル [ 南里勇気 ]
価格:3509円(税込、送料無料) (2021/9/20時点)

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Javaのオブジェクト指向がゼッタイにわかる本[第2版] [ 立山秀利 ]
価格:2530円(税込、送料無料) (2021/9/26時点)

エンジニア発オンラインスクール【RUNTEQ】