2023年9月1日金曜日

ラズパイが壊れちゃった

わかってないやつがビルドするのは危険かも

 NAS構築の上で大事なソフトウェアであるOpenMediaVault(以下OMV)がもっさり遅くて、バージョンも新しいのがリリースされていると言うので更新をかけたんですが、そしたらラズパイが起動しなくなってしまいました。いわゆる壊れた、多分。

aptでインストール/更新管理するタイプではなく、ソースコードからビルドするスクリプトをGitHubから実行するタイプだったので、環境が合わないと駄目になるリスクというのはあったんだと思います。前のOS自体も色々設定を試行錯誤しながらやっていたので、そのへんのゴミが残っていたのかも知れないです。

認識できてるのにマウントできないディスク

元々OMVはブラウザベースで動作するんですけど、それを呼んでもラズパイ自体にSSH接続しようとしても(うちのはRaspbetty Pi OS LiteなのでCUI)うんともすんとも言わない。こりゃどうしようもないなということでSDカードをフォーマットしてOS自体を再インストールしたんですが、そうするとNASも再構築することになります。

そこまでは想定内だったんですが、どうも正常終了しなかったせいで接続してたHDDのマウント解除もできてないし、他にも不具合があったのでしょう、どうしてもマウントができなくなっていました。

一応TerminalでもOMVでもディスク自体は認識できているんですが、マウントがどうしてもできない。Internal server Error 500 というのが出ます。そうするとファイルシステムがext4なのでWindowsからは見えずファイルの救出も困難。せめてLinuxから…とXubuntuマシンを引っ張り出してみましたが、結局ディスクをマウントできなければ同じことです。どうしたらいいんだ。

でググってググって、かなりたくさんタブを開いて調べて見つけたのがエラーチェック。こんなん失敗したらファイル壊れるやろ!とも思ったんですが、マウント解除できてない&NASの設定が残ってるせいで"ボリュームラベルが破損している"なら、そこさえ修正すればイケるのでは?と考え直しました。そもそも他に方法がないならもう試すしかないですし。

ディスクチェックを試してみる

ということで実行してみました。参考にしたのは https://patio.work/archives/1343 「LinuxサーバのHDDが壊れたっぽい時の対応」です。

まず接続されているディスクの状況確認。(スクショはないです、すまん)

$ sudo fdisk -l

ひとつめが/dev/sdaでもうひとつが/dev/sdbなことがわかりました。実行結果で見るとわかりますが、指定するときは/dev/sda1/dev/sdb1と書くことになります。一応スーパーユーザーでやります。

$ sudo fsck /dev/sda1

そうするとディスクの内容チェックがすげー勢いで流れてきます。なんか16進数の4桁的な数字がビャビャビャーッと。ファイルの内容が多ければ多いほど時間がかかるようです。ふたつのHDDどちらも500GBで、使用率4%くらいのが30分くらい、13%くらいのは1時間半くらいやってました。夜の11時半に始めるもんじゃないです…

しかも、「修正しますか?(...Fix? y/n)」みたいなメッセージが大量に出ます。その度にキーボード叩かないといけないのも結構つらいので、「fsck -y」とオプションを指定してしまえば全部Yesになります。

パーティションテーブルが壊れている可能性が微レ存

これでOKかな?と思いきや、パーティションテーブルが破損している場合はダメらしいので(果たしてマウント不可でした)、TestDiskというツールを使ってみます。リンク先ではyumというコマンドを使ってますが、aptでもインストールできましたのでご報告しておきます。詳しくはリンク先をご覧いただいたいんですが、ここで「P」を指定してパーティションを設定するようです。

ここまでやったら、xubuntuではデスクトップにsda1、sda2のドライブアイコンが見えていました。てことはマウントできてる。それぞれマウント解除して、ラズパイに接続→再起動します。

OMVから「ストレージ」を見ると、どちらもディスクが見えています。ここで一気にマウントしたいけど、ここでまたおかしくなったら元の木阿弥です、ひとつずつ丁寧にやっていきます。

「ファイルシステム」でディスクを選ぶとマウントできます。マウントできたら「共有フォルダ」でマウントしたディスク、相対パスを以前の共有フォルダのパスにします(ない場合は指定した名前でフォルダが新規作成されます)。これでNASが復活したわけです。それぞれの工程ごとに操作を反映しますか?と訊かれるので、都度やっていったほうがいいでしょう。

あとはユーザーを作成します。以前に他の端末にユーザー情報を作成しているならそれを流用すれば良いと思います。これが一致しなければNASにアクセスすることはできませんので。

以上です。メインのデスクトップPCは起動していないと他の端末から見えないので、スマホなどからもアクセスできるように設定していたNASが使えなくなると、色々が滞ってしまいます。アップグレードなどはできるだけ情報を集めてから実施するようにしたいですね。反省。

2023年7月20日木曜日

LINE Payカードでタッチ決済を使うときの注意点

 皆さんタッチ決済してますか?コロナ禍以降、電子決済を利用する人増えてると思いますが、こちらもそれにまつわる罠系の話です。


またFeliCa対応のスマホに機種変更したんですが、先代のときからLINE PayカードをGoogle Payに登録してiDでタッチ決済していました。

今回も同様にしようと、Google Payの後継アプリ、GoogleウォレットにLINE Payバーチャルカードを登録しようとしたらうまく行かず非常に不便だったんですね。

はじめは前のスマホにカード情報が残っていたのでそのせいかと思い、初期化手順の一つでもあるため削除。ついでにモバイルSuicaとかメルペイとかも削除しておきます。

しかし「このカードではタッチ決済を設定できません」にしかならない。

1日に何度もトライしたので回数制限に引っかかってしまった可能性があり、何日か置いて再チャレンジするんですがやっぱりダメ。

で、改めてググると過去の質問箱に同様の記事を発見。そこには「LINE Pay側から登録できない場合…」とかなんとか書いてある。え?そっちから?

ということでLINEを開き設定します。

「ウォレット」タブ→上部の「LINE Pay」部分をタップ

→最上部左から2番目の「支払い」

→一番下の緑色バー右側「タッチ支払」をタップすると、iDかVISAタッチ決済を選ぶ事ができます。(スクショが撮れないので画像はありません)

ここでiDを選ぶと「Google Payに移動」という項目が出てくるのでタップし、Googleウォレットを起動。

ここで登録されたバーチャルカード情報をタップし、iDを「有効にする」を選ぶと設定できました。

あとは、ウォレット側でiDをメインカードに設定しておきましょう。


しかしこれ、公式の説明に書いてないんですが…?

ちなみに、VISAタッチ決済はNFC対応クレジットカードでやる暗証番号不要で決済できるやつだと思うんですけど、自分の職場の決済端末(若干旧式)だとひと手間多いんです。新しいタッチ式の決済端末だと簡単らしいんですが、案外旧式の決済端末使ってる店舗が多く、その割にiD対応してるというケースが多いんですよね。さすがガラパゴス日本。まだまだFeliCaが強い!(あとiDだとLINE Payポイント貯まるし)


て言うか、多分先代のPixelにしたときもやった筈なんですが、忘れてた。覚えてないから今回備忘録にしたってわけです。次の機種変時にこの記事書いたことを忘れてなければよいのですが。年は取りたくないなぁ。

2023年6月4日日曜日

空白、あるいはNULL文字列を含む表のソート対策

 表の中でIf関数で戻り値が「FALSE」になる条件のときに「""」を返すよう設定していると、その表をソートしたときに一番上に来てしまう問題があるようです。

これ、既知の問題…というか仕様のようなので、これをうまく制御できないかと調べたらNA関数というのに行き着きました。

NA 関数 - Microsoft サポート

つまりエラー値を返す関数で、これに対応する「ISNA関数」というのもあります。ISERROR関数ではなくピンポイントなこの関数があるってことは、冒頭の問題を回避するための仕様なんだろうなと思います。

実際には以下の手順です。

  1. セルのIF関数の「""」を返していたところに「NA()」を入れ「#N/A」を返すようにする
  2. セルではなく条件付き書式に=ISNA([セル番地])と入れることで、セルの値が「#N/A」になったときに白フォントにする
これで疑似的に非表示にすることができるわけです。そんなことしてなんの意味があるのか、みたいに訝しがる向きもあるでしょうが、人力でデータ入力していく表の場合(※しかもテーブルですらないことが結構ある)非表示にしておくだけで作業しやすくなるって経験、おありでしょう?そういうことです。

覚えておいて損はないですよ。

2023年5月13日土曜日

入力補助用便利機能を組み込んで見る

 またまた便利マクロを思いついたのでメモ。ていうか職場でもう実用してます。

擬似的なデータベースファイルとして動作させる

例えばSheet1に請求明細を入力するときに、Sheet2の口座や住所などを記載した利用者名簿からIDを引っ張って来たい場合。新しいウィンドウを開いて「並べて表示」してもいいが、スクロールしたりするときに各々切り替えて操作するのが微妙に面倒。シート切り替えもいちいちマウス持ちたくないのにキーボードだけだと[Ctrl]+[PageDown/Up]でこれも操作が微妙。紙に印刷しておくとかはもう論外です。

なので、Sheet1のID列のセルをダブルクリックしたときに、Sheet2の名簿に検索をかけることにします。このとき、検索キーは氏名にします。テーブルの構成は画像の感じです。

※Sheet1は「請求先マスタ」という名前になっています。またSheet2にはIDを入力したときにVLOOKUPで氏名とフリガナを取得する数式を仕込んでいます。ありがちなやつです。

実コード

ここで仕込むマクロが以下。Sheet2のモジュールに記述するだけです。

Function Search_ID() As String
 Dim buf As String
 Dim Trg As Worksheet
 Dim Reg As Range
 
 If IMEStatus = vbIMEModeOff Then SendKeys "{kanji}"
 buf = InputBox("氏名を入力してください", "利用者氏名検索", "")
  If buf = "" Then Exit Function
  
 Set Trg = Sheets("請求先マスタ")
 
 Set Reg = Tgr.Range("B:B").Find(what:=buf)
 If Reg Is Nothing Then
  MsgBox "該当なし"
  Else: Search_ID = Reg.Offset(0, -1).Value
 End If
 
 If IMEStatus = vbIMEModeOn Then SendKeys "{kanji}"
 
End Function

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 If Not Intersect(Target, Range("A2:A1048576")) Is Nothing Then
  Dim num As String
  num = Search_ID
  Target.Value = num
  SendKeys "{ESC}"
 End If
End Sub

本当はWorkbook.OpenイベントにApplication.Onkeyで[F8]キーかなんかに割り当てるマクロを呼び出させて動作させようと思っていたんですが、職場のセキュリティ設定の関係か動作せず、こんなコードを書きました。

マクロ無効セキュリティの突破

勿論、そうなるとマクロ付きブックであってもただ開いただけではマクロ無効になってしまうので、これを動作させるためにはVBS等からの呼び出しが必要です。念のため、以下記述します。

Dim xlApp
Dim xlWbk

Set xlApp = CreateObject("Excle.Application")
xlApp.Visible = True

Set xlWbk = xlApp.Workbooks.Open("\Hoge\HogeHoge\Hoge001.xlsm", True)

Exit

これをメモ帳などで記述し、拡張子「.vbs」で保存します(なおフォルダおよびファイル名(HogeとかHogeHogeとか)はダミーですので、環境に合わせてフルパスを書いてください)。そのままスクリプトファイルをダブルクリックでもいいし、心配ならショートカットを作成します。これならスクリプトファイルやマクロ付きブックファイルはどこかに隠しておくことが可能なので、削除されてしまうことはありません。

注意事項

ちなみに、これはOfficeの仕様ですが、VBSを使ってマクロ有効でブックを開くと独立のExcelインスタンスとなるため、そのプロセス以外ではマクロ無効となります。その辺は安心なんですが、マクロ有効のインスタンスに他所のマクロを呼び込んだりしないように注意が必要です。

おわりに

このマクロのいいところは、最悪マクロ無効のままでもブックの機能自体は保たれるところです。コードでは別シートの数値(文字列型だけど)を取得してセルに書き込む、つまり手入力を代行しているだけですので。実作業でも同じIDの明細を連続して入力する場合、上のセルの値を手入力すればいいのでこの機能は使わないでしょう。

ちょっとして手間の軽減に応用できればよいと思います。