シンプルな家計簿 バージョン0.930を公開しました

シンプルな家計簿 バージョン0.930はこちらから
https://www.crossdrive.net/wp/software/cdn-01

やってみたかったこととして表の配色パターンを変更するという機能を実装しました。デフォルトの配色は万人向けの飽きの来なさそうな無難なカラーにしたつもりですが、このソフトも開発開始から10年以上経過(はじめの1年だけ開発してその後ほったらかしですが)したのでさすがに飽きる。というわけで家計簿をつけるモチベを少しでも上げるために見た目を変えることをできるようにしました。

バージョン0.930からiniファイルでアプリの設定を読み込むようにしています。起動時のバージョン確認の有無と終了時のウインドウのサイズと位置、そして表の配色設定を保存するようにしています。表の配色はRGB値で指定しており、iniファイル内の記述を変更すれば自分好みの配色にすることもできます。配色はデフォルトを含む数パターンだけ実装しているのでそれを参考にカスタマイズしてもらえればと思います。iniファイルをいじって動作がおかしくなったりしたら、iniファイルを削除してから起動すれば初期設定で起動できます。

追記

バージョン0.930は口座一覧と概要に口座の初期残高が加算されていないという致命的な不具合が存在します。バージョン0.940にて当該の仕様変更を再考します。

VB.NETの駄目な所

10年ぶりぐらいにvb.netのソースコードを手直ししたのだけれど、あらためてvb.netってよくわからない仕様になっているなと。特に配列とFor文。

配列を宣言すると+1の要素数で作成される

Dim array(4) As Integer

と配列を宣言すると要素数5の配列ができあがる。ちょっと意味がわからない。

For文の比較演算子がひとつだけ

For i = 0 To 10
Console.Write(i)
Next

上記の出力結果は0,1,2,3,4,5,6,7,8,9,10 となり11回出力される。このToという独特な演算子のせいでfor文でループ処理するときに-1を加えるという余計な記述をしなければならなくなる。コード見たときなんで-1してんの?って真剣に悩んだ。

配列の要素は0から始まるが宣言したら指定数+1の要素数で作成されるし、For文は終了条件となる数値から-1しないといけない。別言語で開発をしばらくやってたからこの辺は違和感がものすごい感じる。

.NET Frameworkの良し悪し

.NET(以下略)コンポーネントに微妙なバグというか些細な意図しない動作をするものがちらほら存在する。そのせいで想定外の表示がされたりというストレスもなかなか開発していて感じる。だが、このミドルウェアの後方互換性は素晴らしいと思う。.net2.0環境で10年以上前にWinXP向けに作成したアプリケーションがWin10環境でも普通に起動して使うことができた。

シンプルな家計簿(仮) バージョン0.914をリリースしました

シンプルな家計簿(仮) バージョン0.914をリリースしました。
詳しくはこちらのページへ https://www.crossdrive.net/wp/software/cdn-01

主な修正内容はバグ修正のみです。10年ぶりにソースコードをいじりましたがなぜ今更こんなバグが・・・。
やる気が残っていれば処理がもう少し早くなるような修正をしてみます。(早くなるかどうかは不明)見た目や基本的な操作系の変更は利用者のストレスになるだけの気がするのでいじらないようにします。それにしてもどこがシンプルな家計簿なのかと。

ジオンの系譜 デラーズ・フリート編

ギレンの野望 ジオンの系譜のデラーズ・フリート編を久しぶりにやってみたのでプレイした要点をメモ。デラーズ・フリート編の特徴は自軍パイロットの少なさと敵軍パイロットとユニットの強力さがある。

序盤

序盤の方針は宇宙エリア制圧を進めることにした。開始5ターンは敵が攻め込んで来ないのでその間にソロモンとア・バオア・クーへと宇宙の戦力の大半を進軍させる。地上のユニットはキリマンジャロに集結させて放置。

敵軍は連邦とティターンズ(ジャミトフ)の二つなのでどちらから攻略をすべきか序盤のうちにはまだ決めていなかった。エリア制圧の状況しだいで臨機応変にとぼんやりと。連邦の本拠地は地上のジャブローでティターンズ本拠地は宇宙のグリプス2なので進行的にはティターンを倒してから連邦という流れが自然なのかなとは思う。初期のデラーズ・フリートのユニット的に宇宙の方がエリア進行をやりやすいというのもある。地上をエリア進行しようとするなら水中適性のズゴッグやハイゴッグ、ザンジバルや索敵用のルッグンなどのユニットを揃える必要があるが資金資源不足で戦力を整えるまでに時間がかかる。だから宇宙を制圧していってグリプス2以外を掌握した状況を作ってから地球に降下して最短でティターンズ重要拠点を制圧→最後にグリプス2という流れが自然な攻略になるのではないだろうか。

戦力の構築

敵エリアに侵攻にはパイロットはともかくそれなりに強力なユニットがなければ話にならないが初期配備のユニットで頼りになるのはゲルググ/SGとグワジンとヴァルヴァロぐらいしかない。開発レベル上げて生産しようにもやはり資金不足で時間がかかるためユニットの調達は外交の敵軍需産業からの協力要請でまれに手に入るユニットを当てにすることにした。親密レベルまで上げたときに手に入る機体は、序盤のうちはプロトタイプガンダムやガンダム、G-3ガンダム、グレイファントムなどが手に入れることができ、中盤になってくるとギャプランやガルバルディβなども候補に上がってくる。デラーズ軍なのに(デラーズ軍だからこそとも言える?)連邦ユニットばかり使うのはどうかとも思うが生産するより外交で手に入る機体の方が強いので仕方がない。

50ターンイベント

ターン数が50ターンを経過するとガンダム2号機奪取のイベントが発生する。YESを選択して実行してみたら、ケリィ・レズナーが負傷中となってしまってその後永遠に戦線離脱状態になってしまった。これはジオンの系譜の初期版ディスクにある特有のバグらしい。後期版なら修正されて発生しないらしいが初期版と後期版の見分け方はなにやらキャラクター辞典の文言が違うとかそれぐらいしかないため後期版を購入しようにも狙って手に入れることができない。ケリィ・レズナーを失うぐらいだったらガンダム2号機イベントは見送った方がよかった。GP-02は1機は手に入ったがさらに量産しようとするならそれなりに技術レベルが必要になってくるので時間がかかるうえにケリィまで失ってしまって結局このイベントを発生させたことでその後の展開が苦しくなった。

地上のティターンズを駆逐

宇宙の制圧(グリプス2とその隣接エリア以外)が終わったら地上のティターンズが制圧している重要拠点を順に制圧していく。この時点でティターンズが制圧している地上の重要エリアはペキン、マドラス、オデッサ、ベルファスト、ハワイの5つ。キリマンジャロはユニットを集結させていたので攻め込まれることなく維持できていた。オデッサとペキンは宇宙の上空エリアからグレイファントムやザンジバルの突入で直接対象エリアに進入できるので手早く進入できる。マドラスは降下したエリアから南下して進入ワザを使って攻め込む。ハワイはペキン制圧後に日本を占領してから進入するというルートをとった。最後はベルファスト。

ティターンズのエリア侵攻をしている間にも連邦軍は攻め込んでくる。特にジャブローの上空エリアP-ジャブローに打ち上げでユニットをどんどん送ってくるのでそれに対処するための戦力をおいて置かなければならない。G-3やアレックス・ステイメンに乗ったアムロやセイラが強敵であるため物資切れをおこさせるための大量のガトルも準備しておかなければならない。(まともに殴り合ったら壊滅的な被害を受けるので)
アレックスに乗ったBランクアムロはガルバルディα3ユニットでかかれば撃退することは可能だろうと思う。先手を取られたら負ける可能性もある。なので常時それ以上の性能のユニットを配備しておかなければならない。Sランクアムロだったらもうガトルで物資切れを起こさせるしかない。

ベルファスト攻略が最難関

地形的にベルファストが最も攻略に手間がかかる。宇宙から直接降下して行くわけに行かないので攻略するには北米かオデッサ周辺を制圧してからでないと進入することができない。また周辺を海に囲われているためザンジバルなどの戦艦や水中機体を揃える必要がある。ベルファスト周辺エリアを制圧してようやく重要拠点ベルファストへと攻め込んだときには70機ものユニットが配備されていた。内訳は半分がジム・キャノン2やジムクウェルなどの陸上ユニットでもう半分は水中型ガンダムやアクアジム、潜水艦、デフロッグなどの航空ユニットだった。地形的にすべてのユニットがいきなり襲いかかってくるというわけではないので、まずは弱い航空ユニットやアクアジムなどを倒してから本土上陸という流れになるためパイロットと機体が精鋭なら少数でもなんとかなる。このときに連れて行ったユニットはG-3ガンダムプロトタイプガンダム3機、ギャプラン2機、グレイファントム1機、ズゴックとズゴックEとゴッグなど10機ぐらい、ルッグン3機、サイサリス1機、他ゲルググなど使える機体数機。パイロットはデラーズ以外全員。

ティターンズ滅亡まで

105ターンぐらいかかってようやくグリプス2制圧してティターンズを滅亡させることに成功した。攻略に連れて行ったユニットはビグ・ザム10機ぐらいとその補給用にドロス、ガルバルディアルファ6ユニット、サイサリス1機、ガトル10機ほど、グワジン2機、グレイファントム1機、ギャプラン2機、G-3ガンダム1機、あとは量産型ゲルググなど。グリプス2に開戦を仕掛けるといつものように大量の敵ユニットが配備されているのでこれを一掃するためにビグ・ザムの砲撃を利用することにした。ビグザム5機を横一列に並べて敵が近づいてきたら次のターンで一斉に砲撃して敵ユニットの数を速攻で減らす。ビグ・ザム10機連れて行ったので5機が物資切れになったら後ろに下がって次の5機がまた砲撃をするというまるで信長の鉄砲3段撃ちのような作戦で被害を最小限で攻略することが出来た。グリプス2攻略で損失した戦力はグワジン1機とビグ・ザム1機、ガトル多数と量産機数機といった感じ。ヤザンが乗っているバウンドドックやシロッコが乗っているアレックスに落とされてしまった。

あとは地球の連邦軍だけ

ティターンズを滅亡させて宇宙のエリアを全て制圧したので、残るは地上の連邦軍を攻めるのみ。だが、あとは同じ作業を繰り返すだけでもう勝ち確定の未来しか見えないので急にモチベーションが下がった(´Д`;)

猫が背中に乗ってくる理由

決して自分からはあまり寄ってこない飼い猫が、私がうつ伏せで寝ているときに限って背中に乗ってくる。膝の上に乗ってきたりはあまりしないし、仰向けで寝ているときに乗ってきたりはしないのだが、うつ伏せで寝ているときはなぜか乗ってくる。不思議だ

うちの猫の特徴

嫌い

  • 抱きかかえられること
  • 見つめられること
  • 膝の上に乗せられること
  • 体を撫でられること

好む

  • 飼い主を見張ること
  • 飼い主の近くで寝ること
  • 自分から飼い主の膝の上に乗るのはOK
  • 飼い主の背中の上に乗って寝ること

猫が飼い主の背中に乗るということは

飼い主のことをそれだけ信頼しているとも言えるかもしれないが、うちの猫の場合はそこが快適だからというのが理由だと思う。なぜなら飼い主の背中に乗ると、

  • 一方的に見張ることができる
  • 手が届かないので撫でられることがない
  • 寝ているときに突然撫でられて起こされることがない
  • 飼い主の視線が届かない
  • 暖かい

といったメリットがいくつかある。普段スキンシップが嫌いなのにうつ伏せになったとたん背中に乗ってくるという行動をする猫は、人間の特徴を理解して快適に過ごす場所を知っている非常に賢い猫だと言える。

BIGLOBEモバイルに電話認証が追加されていた件

※認証は通話料無料でできるように改善された模様

契約しているのビッグローブの管理画面にログインしようとしたらいつの間にか電話認証を求められるようになっていた。

マイページの「お客さま情報」にアクセスすると電話認証が求められます。なぜですか

なりすまし等による不正利用防止を目的としたセキュリティ強化のため、2020年6月4日以降、個人情報を扱うBIGLOBEの特定サイト(マイページー「お客さま情報」など)において、初回のログインやアクセス時に「電話認証」が必須となりました。

SMS発信とかメールアドレスでとか普通は認証で使われるのになぜ電話認証なのか謎。たかが管理画面にログインするのに電話認証は大げさすぎると思う。

音声通話SIMの電話番号から電話認証はできますか

BIGLOBEモバイルの音声通話SIMの電話番号は、登録電話番号に自動的に登録されません。

登録している電話番号の意味がよくわからなかったが契約しているビッグローブの電話番号からの発信では認証ができないということらしい。初見だとこれはわからないだろ。なんで認証できないんだろうって何度もかけ直すことになってしまった。私の場合は固定電話の番号を以前登録していたらしくてそれで認証が通った。認証に使われるって説明された覚えはないままに登録しているからそりゃわからんわ。

電話認証に通話料はかかりますか

認証用電話番号に電話をかける際の通話料は、お客さま負担となります。

勝手に電話認証を必須にしておいてその際の料金はこちら側負担って勘弁して。せめてフリーダイアルか認証要否を客側で判断かSMS発信での認証に変えるかなんかいろいろと方法はあると思うのだが。幸い電話認証しなくても料金の確認とかはなんとかなるので構わないがあまり印象がよくない。

ドコモを解約したらsimロック解除手続きできなくなった

simロックされたドコモの端末はmydocomoから手続きすることでロック解除することができるらしいが、ドコモ解約後は登録情報が即刻削除されてしまうためmydocomoからの手続きが行えなくなる模様

解約したあとにmydocomoの情報が消去されるというのはわかる。だが、ドコモショップで解約手続きしたそのすぐ後で消去されて使えなくなるというのはどうなのだろうか。当該月の料金を支払ってめでたく契約を解約というのだと思っていたが、いきなり消去されてしまったのでsimロック解除の手続きをしようにも一切mydocomoに情報が残っていないのでやりようがない。もちろん解約手続きした日以降の締日までの料金も日割り計算されることなく請求される。

mydocomoに一応のところログインはできる。電話番号とドコモメールが消去されて使えなくなってしまっていて実質できることはなにもない。契約の個人情報も全部消されて残っているのは直近数ヶ月の支払料金の推移とマイショップの店舗名ぐらい。simロック解除しようと思っていた端末の情報も当然のようにない。

試しにsimロック解除の手続きをやってみようとしたら、

という感じで進めない。2段階認証でセキュリティコードを受信する必要があるが、それを受信するメールアドレスと電話番号がないのでどうしようもない。ソフトバンクを解約したときは解約後もう少し猶予があったと思ったがドコモは厳しい印象。

残債有りの端末をsimロック解除するのはどうすればいいのだろうか。解約手続きしたらmydocomoからの申込みはできなくなるし、残債を精算してからじゃないとsimロック解除はできない。残債がある場合は解約手続きのときに残りを一括で払うことになる。残債有り端末はどうあってもウェブからのsimロック解除手続きは困難な予感。

まとめ

  • ドコモのsimロック端末をウェブで解除手続きするのは解約手続き前に行うこと。3000円支払えばドコモショップで解除することもできるとのこと

tensorflow 1.5 をインストールしようとしてみたが断念

最新のtensorflowのバージョンは現在のところ2.4がリリースされているが、バージョン1.6以降のtensorflowはAVX(Advanced Vector Extensions)をサポートしないCPUでは動かないということらしい。古いCPUを使っているマシンではだめということ。なのでtensorflow ver1.5が必要になったのでインストールをして環境構築をしようとしたが、無理だった。

試したこと

tensorflow 1.5 のソースをダウンロードする

https://github.com/tensorflow/tensorflow/releases/tag/v1.5.0

tensorflowをコンパイルするためにbazelをインストールする

tensorflowのソースをビルドするにはbazelというコンパイラが必要とのこと。
https://docs.bazel.build/versions/master/install-ubuntu.html

sudo apt install curl gnupg
curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg –dearmor > bazel.gpg
sudo mv bazel.gpg /etc/apt/trusted.gpg.d/
echo “deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8” | sudo tee /etc/apt/sources.list.d/bazel.list

CUDA9.0 と cuDNN 7.6.5 をインストール

bazelのコンパイルでcudaを使う設定にするときは対応しているCUDAとcuDNNをインストールする必要があるとのこと。

どうやらこのバージョンのCUDAとcuDNNが対応しているらしい。

コンパイルエラーだらけ

ERROR: /root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/grpc/BUILD:431:1: C++ compilation of rule ‘@grpc//:gpr_base’ failed (Exit 1).
external/grpc/src/core/lib/support/log_linux.cc:42:13: error: ambiguating new declaration of ‘long int gettid()’
42 | static long gettid(void) { return syscall(__NR_gettid); }
| ^~~~~~
In file included from /usr/include/unistd.h:1170,
from external/grpc/src/core/lib/support/log_linux.cc:40:
/usr/include/x86_64-linux-gnu/bits/unistd_ext.h:34:16: note: old declaration ‘__pid_t gettid()’
34 | extern __pid_t gettid (void) __THROW;
| ^~~~~~
external/grpc/src/core/lib/support/log_linux.cc:42:13: warning: ‘long int gettid()’ defined but not used [-Wunused-function]
42 | static long gettid(void) { return syscall(__NR_gettid); }
| ^~~~~~
Target //tensorflow/tools/pip_package:build_pip_package failed to build
Use –verbose_failures to see the command lines of failed build steps.

Traceback (most recent call last):
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/execroot/org_tensorflow/bazel-out/host/bin/external/cython/cython_binary.runfiles/org_tensorflow/../cython/cython.py”, line 17, in
main(command_line = 1)
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/Main.py”, line 720, in main
result = compile(sources, options)
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/Main.py”, line 695, in compile
return compile_multiple(source, options)
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/Main.py”, line 666, in compile_multiple
context = options.create_context()
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/Main.py”, line 589, in create_context
return Context(self.include_path, self.compiler_directives,
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/Main.py”, line 75, in __init__
from . import Builtin, CythonScope
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/CythonScope.py”, line 5, in
from .UtilityCode import CythonUtilityCode
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/UtilityCode.py”, line 3, in
from .TreeFragment import parse_from_strings, StringParseContext
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/TreeFragment.py”, line 17, in
from .Visitor import VisitorTransform
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/Visitor.py”, line 15, in
from . import ExprNodes
File “/root/.cache/bazel/_bazel_root/8aaf01c14305585657a643e6741f796b/external/cython/Cython/Compiler/ExprNodes.py”, line 2875
await = None
^
SyntaxError: invalid syntax
Target //tensorflow/tools/pip_package:build_pip_package failed to build

SyntaxErrorの解決は私には無理すぎ。

tensorflowのコンパイルがエラーなく終わる気がしないので諦めた。

他に試してみたがだめだったこと

pip install tensorflow==1.5
リストにはfrom versions: 2.2.0rc1, 2.2.0rc2, 2.2.0rc3, 2.2.0rc4, 2.2.0, 2.2.1, 2.3.0rc0, 2.3.0rc1, 2.3.0rc2, 2.3.0, 2.3.1, 2.4.0rc0, 2.4.0rc1, 2.4.0rc2, 2.4.0rc3 とあり1.5がないため駄目
anacondaでインストールしてみる

/root/anaconda3/conda.exe: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.4′ not found (required by /root/anaconda3/conda.exe)

GLIBC_2.4が見つからないとか言われてanaconda自体をインストールできなかったので断念

tensorflow 1.5.1 のwhl形式のファイルがあったのでそれで試してみる
https://pypi.org/project/tensorflow/1.5.1/

ERROR: tensorflow-1.5.1-cp36-cp36m-manylinux1_x86_64.whl is not a supported wheel on this platform.

pipが対応していないから駄目

まとめ

tensorflowインストールして試してみるだけだったのにめちゃくちゃ大変だった。古いCPUだと対応していない機能があるので古いバージョンのtensorflowをインストールする必要がある→それにはbazelをインストールする必要がある→CUDAとCuDNNも古いバージョンをインストールする必要がある→なんかエラーが出るのでpythonのバージョンも下げてみる→またなんかエラーが出たのでさらに調べる→エンドレス

tensorflowの環境構築だけでこれほど苦労することになるとは。。バージョンを下げて環境構築というのはちょいハードルが高い作業なのかもしれない。

結局は

我らがraspberry pi大先生で環境構築することにした。

# pip install tensorflow

これ一発で環境構築完成

電子書籍のメリットとデメリット

電子書籍のメリットとデメリットについて

メリット

  • 書店に買いに行かなくてもインターネットを介して入手できる
  • 場所を取らない・本棚がいらない
  • ポイント購入に対応している場合がある

デメリット

  • 販売主がサービス終了すれば読めなくなる(またはその可能性がある)
  • 紙媒体と比べてそれほど安くない
  • 本棚に飾っておくということができない
  • 売れない
  • 人に気軽に貸すということができない
  • 端末の故障やバッテリー切れが発生すると読めなくなる
  • 目が疲れる
  • 販売する会社・サービスが多様でそれぞれに合わせたアプリが必要になる
  • 飛ばし読みなど一覧性に劣る
  • 端末が高い
  • 読み始めるまでに端末とアプリの手順・操作が必要でめんどくさい

まとめ

個人的には電子書籍否定派なのでデメリットばかり多く気がつく。電子書籍使ってみたらそれほど悪くはないが、やはり大事な本やじっくり読むような本は紙の本に限るなという印象。余ったポイントとかで適当に買うとかなら電子書籍もいいかもしれない。

H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead.

h5pyを使って値を出力しようとしたらこのエラーが出た。

H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead.

data[‘x’].value という書き方は推奨されなくなるのでこれからは data[‘x’][()] という風に書くようにと。まだvalueの方が意味的にわかりやすい気がするのだが。