非効率も効率

筆者のパソコン関連や効率化についての考察と雑談

ログ出力とエラー処理は早めに理解しておくと良いのではないか

プログラム開発の初心者本では後回しにされがちでうが、
ログ出力とエラー処理については、早めに簡単な使い方だけでも理解しておくと良いと思うのです。
柔道を習う時の、怪我しない為に受け身と柔軟を先に習うみたいなものかなと。

プログラム開発なんて、8割はエラーの対応です。
引数をチェックして問題があればエラー。
計算結果をチェックして問題があればエラー。
そして、発生したエラーは開発者自身やユーザー、保守担当の為に、解り易く出力をしないといけない。
その為にはエラーをトラップしないといけませんし、出力されたログの解析もやらないといけません。
エラー発生時には途中まで処理したデータを処理前の状態に戻さないといけないケースもあります。

理解して欲しいログ出力はprintとかの簡易版ではなく、環境標準のログの出力機能の事です。
pythonならgetLoggerですね。
とは言ってもログ出力は奥が深いので、まずは環境標準のやり方でテキストファイルに出力できれば良いのではないでしょうか。
ただ、細かくは実装しないにしても、そういう機能があると知っている事は今後の役に立つかもしれません。

エラー処理はtry~except~else~finallyですね。
ユーザー定義例外は使えるようになると良いと考えます。
関数の戻り値でエラーを返すより、ユーザー定義例外を発生させた方が読みやすいコードが書けるかと。

とはいえ、やっている事が地味なので、勉強している方としては苦痛に感じるかもしれません。
最初はプロジェクト内での処理方法の共通化も兼ねて、ログ出力とエラー処理が入ったテンプレートを
先輩が用意してあげた方が効率は良いかなと。

そして、後からロクにエラーがログで出力されないプログラムのメンテに当たった時に絶望すると共に、
普段、普通に出力されているログに感謝を覚えるでしょう。
該当プログラムの開発者が過去の先輩だったりするところまでがお約束ですね。

逆に積極的に勉強する人はプログラマの素質があるかも。


というような事を、Pythonのエラー処理とログ出力の勉強をしながら思ったのでした。

NAS購入

NASを購入しました。

使っていたバックアップ用HDDが壊れた後、空いているUSBメモリ等にバックアップを取っていたのですが、
VM Wareを使いだして仮想マシンのファイルがギガ単位なのでUSBメモリでは足りなくなったのです。
HDDの容量は4TBですが、RAID1対応なので実質は2TBです。
人生初のテラバイトです。テンション上がりますね。
専用アプリからHDD異常の際に通知があるとか便利ですね。
SSDタイプは値段が高くて断念しました。

 

どうせなので、重要度が低いファイルも、まとめてバックアップを取ってHDDの整理。

 

アプリのインストーラーがHDD容量の大半を占めていました。
開発に使うかもしれないので、捨てられないのですよね。

 

私は不要そうなファイルや大きな変更前のファイルのコピーも削除せずに、
日付でフォルダを作成してバックアップとして放り込んでいるので、
これも、HDD容量を使っていました。

 

ファイル整理に5時間かかりました。
ほとんどファイルコピーの待ち時間でしたが。
メインPCの空き容量も増えていい感じです。
色々とファイルを溜めこむ癖は、どうにかしないといけませんね。

 

クラウドへのバックアップは回線が上り2MBなので時間がかかるのですよね・・・
Excel,PDF,テキストファイルぐらいならやっているのですが。

 

購入した機種はHDL2-TA4

簡易パッケージ版でAmazonのタイムセールで23,000円ぐらいでした。

HDL2-TAシリーズ | 個人・家庭向けNAS | IODATA アイ・オー・データ機器

新しいことを覚えようとしてハードルの高さに困っている話

Webで調べながら、Webスクレイピングに挑戦していますが・・・
勉強不足で四苦八苦しながら進めています。

Pythonでscrapyを使ってみましたが、Pythonは数年前にVisualStudioで少し遊んだ程度です。

開発環境にしているVM Ware上のWindows 10に対して、Anaconda.Navigator(初体験)、VS Code(初体験)をインストール。
戸惑いながらも、Webサイトのサンプルの動作を確認できました。

そして、本命である私がスクレイピングしたい対象のページを実施。
Chromeデベロッパーツール(初体験)で対象データのXPATHを調べながら、コーディング・・・

そして、想定通りに動作しない。

調べたら対象のページがJavaScriptでデータ取得しているので、scrapy単体ではデータが取れないそうです。
尚、私はJavaScriptも素人です。
HTMLは20年ぐらい前の知識ですが、テキストエディタに手書きしてホームぺ―ジを作成していたので、読めはします。

調べたらsplashで対応できるそうですが、dockerのPython環境にsplashのインストールが必要・・・
私はdocker未体験です。
ANACONDA.NAVIGATORで仮想環境作成しているのですが、これはsplashを動作させる為のDockerの代わりになってくれないのだろうか。


ちょっとスクレイピングに挑戦するのに、Python,ANACONDA NAVIGATOR,VS Code,HTML,JavaScript,dockerを少しは理解しないといけないという・・・
新しい事に挑戦するのは大変ですね。

更に、取得したデータをMySQLに格納して、データを検索できるWebサイトを作ろうとしているので、先は長そうです。

WindowsExcelVBA+VB.NET+Oracleのクライアントサーバー型アプリに慣れ切っているので、余計大変。

 

Excelで切り捨てはINTを使おう

久しぶりにExcel丸め誤差に苦しみました。
バージョンはExcel 365 バージョン 2206 32bitです(客先が32bitなもので)

 

ちょっとややこしい計算式を設定するVBAを開発したのですが、
ユーザーからエラーメッセージが表示されると連絡があり、
対象のExcelファイルを参照すると、とあるセルに"-2E-15"というありえない数値が。

 

"数式の検証"機能で1ステップづつ計算していくと・・・

 

初期状態。"数式の検証"が無かったら計算式のセルを小分けしているところです。


途中を省略。ROUNDDOWNで15の少数部を切り捨てて15です。


15-15=0ですよね・・・


!? 

 

といった感じでした。

 

"ROUNDDOWN"を"INT"に変更したら想定通りに動作。

"ROUNDDOWN"は桁数0で切り捨てても内部では浮動小数扱いなんですね。
"INT"はしっかり内部も整数で扱うみたいです。

 

自分が原因では無い障害対応

先日、KDDIで大規模な通信障害が発生していましたが、
規模こそ小さいですが、システムの運用に関わるエンジニアの端くれとして、
胸が痛くなる思いでした。

KDDIのエンジニアはもちろん大変なのですが、
KDDIの回線を使っているシステムのエンジニアは別の意味で大変だったでしょう。
何せ、回線復旧してくれないとお手上げで、いつ復旧するかは解らないのですから。
しかし、客先やユーザーに対して「対策中です」と説明をしないといけないケースもあるでしょう。
「お手上げです。KDDIが復旧するでお待ちください。」でご納得いただける客先やユーザーなら幸運です。


私も規模は小さいですが、過去にExcelのパッチがあたった途端、動かなくなったプログラムがあり、
解決方法はExcelの修正パッチ待ちのケースがありました。。
ネットで調べると、色々な案件で同じ状況が発生していると書き込みが。

客先のPCは、一元管理されているので個人で勝手にパッチをアンインストールできないのです。
プログラム改修で問題を回避するには、改修作業が数日では終わらなそうでした。

なので、1日ぐらい待てば出る予定(Microsoftの告知)の修正パッチを待ちましょうと客先に説明しても、
客先からすれば、それで直る保証も無いし、業務は効率が悪くなる(止まるほどではない)ので、
プログラム改修を指示するわけですね。当たり前な判断ですね。

その後、1日ぐらい経つと修正パッチがあたって復旧するのですが、
「根本的対応の為に工数を使って修正しますか?」と聞くと客先はノーと答えるわけです。
他に案件は山積みなので当然ですね。

このやり取りや対応が私としては、非常に疲れる内容です。
誰が悪いわけでもない(強いて言えばMicrosoftだが悪気があるわけでは無い。)、
対応に時間は取られる、ユーザーに迷惑はかける、本当にパッチが出るかハラハラさせられると、
胃に穴が空きそうでした。


そして、今日はTeamsの障害が発生していたそうです。
胸が痛い・・・
私もTeams使っていますし。


P.S.
Slack値上げだそうです。懐も痛い・・・

SQLの文法の違いに悩む

普段はOracleSQLを書いているのですが、今はMySQLSQLを書いています。

同じSQLでも関数や文法、動作が微妙に違っていたりして、Oracleの感覚で書いていると痛い目見ますね。

そして、今回ドツボにハマったのが以下のSQLです。

-- テスト用テーブルを作成
create table table_a (name char(10)) ;
create table table_b (name char(10)) ;

-- table_aにデータを作成
insert into table_a (name) values ('A') ;

-- table_aからtable_bにデータコピー
-- ↓エラー発生
insert into table_b tb (tb.name) select ta.name from table_a ta ;
-- SQL エラー  (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tb (tb.name) select ta.name from table_a ta' at line 1

-- ↓正常に動作
insert into table_b (name) select ta.name from table_a ta ;

単純に、Table_bのSelect結果をTable_bに入れたいだけなのに・・・

で、エラーが発生するSQLと発生しないSQLの違いはTable_bに別名を付けているかどうかでした。
個人的にえーって感じです。Oracleでは通るのですが。


こういうので、ちょくちょく時間を消費して、中々先に進まないのです。

Coke ONアプリに驚く

スマホのCoke ONアプリを数年ぶりに使って驚きました。

 

数年前にアプリが出始めた頃に、iPadで使っていたのですが、その時はスタンプカード機能がメインだったように記憶しています。

当時はiPadをケータイにテザリングした上に、Bluetooth接続の為に自販機に近づける手間の方が勝った使うのを止めたのです。

 

スマホに変えてから改めて使うと、進化が凄いです。

スタンプカードは当然ながら、アプリからの決済(Coke ON Pay)や歩数計機能と連動したスタンプとか、クーポンまで対応!

1本買うともう1本ついてくるキャンペーンを実装とか凄いですね。

クーポン使ってアプリをBluetoothで自販機に連動させてから、アプリ上で商品を選ぶとお金使わなくても、自販機から商品が出てくる!

ちょっと、テンション上がりますね。

Bluetooth接続とかで時間を使うので、他に客が並んでいると、気を遣ってアプリ使わないのですが。

 

そして、サブスクまで実装されているとは。

1日1本無料(サブスク代が必要なので無料じゃないですが)で貰えます。

1本90円ぐらいになるそうです。

値段的にはスーパーの方がまだ安いですが、冷たいのとか暖かいのが欲しいときは良いですね。

 

自販機自体も普通に電子マネーで決済できるので小銭を使う機会が減りました。

電子マネーで購入できる自販機とそうじゃない自販機が並んでいたら、電子マネー使える方を選びますね。

集客力にもつながるのですね。

 

Coke ON(コーク オン)- おトクで楽しいコカ・コーラ公式アプリ (cocacola.co.jp)