VBAでDictionaryにWorksheetオブジェクトを入れたら怒られた

他言語の dic[key] = value に相当する書き方をしたらエラーとなった。
.AddメソッドならOKだった。

Dim dic As Object
set dic = CreateObject("Scripting.Dictionary")
Dim ws As Worksheet
For Wach ws In ActiveWorkbook.Worksheets
    ' dic(ws.Name) = ws ' NG
    dic.Add ws.Name, ws ' OK
Next

複数のワークシートの存在を確認して,存在していたら処理するコードを書いていた。
次のシートを処理するたびにループでシートの有無を確認するのが無駄に思えた。
ならば,先に連想配列に入れてしまおう。
キーがシート名で,値がシートオブジェクトだ
何なら,キーだけでも処理は困らないのだが,VBAに集合(Set)はないので(ないよね?),Dictionaryを用いた。

で,他言語の dic[key] = value に相当する書き方だとエラーとなった。
もちろん,値がWorksheetオブジェクトではなく文字列とかならエラーにならない。
何でやねんと思いつつ,.Addを使うとエラーにはならなかった
この2つで動作が異なる(すでにキーが存在する場合の挙動)のだが,今回の処理ではそこは関係ないだろ,と思うのだが。

パスワード付き圧縮ファイルのメール添付

近頃,俗に「PPAP」と呼ばれるようになった,パスワード付き圧縮ファイルをメールに添付して送信し,次のメールでそのパスワードを送信する,という今までずっと行われてきた無意味な悪習を,ようやく止めようという機運が高まっている。良いことだ。

※そもそも,「パスワードで付きで圧縮したファイルをメールに添付すること」それ自体が良くないという話もあるが,ここでは置いておく。

このような送信方法が広まったのは,最初のメールで宛先を間違った場合に,2つ目のメールを送信しようとして,「やべぇ,さっきのメールの宛先間違ってた!」と気づけた場合に,ぎりセーフ(?)となるためだろう。

だから,送信メールの添付ファイルを自動でパスワード付きにして,時間差で送信するサービスが世の中にあるが,そんなものは全く意味がない。

では,代替手段はどうするのか?

共有ストレージや,クラウドサインのようなサービスを使ったとしても,宛先の入力で間違ったら,マズイことには変わらない。オートフィル機能のために,意図せず違うアドレスが入力されてしまう危険性は,メーラーでもブラウザでも常に存在している。

そこで,私は次の方式を提言したい!

  1. ファイルの受信者(受信予定者)が,あらかじめパスワードを決めて,ファイル送信者にメールで知らせる
  2. ファイル送信者は,そのパスワードで圧縮ファイルを作り,メールに添付して送信する

このようにすれば,宛先間違いの際に添付ファイルが解凍されて見られてしまう危険はなく,パスワードを別送する愚も避けられる。

この方式がスタンダートとして広まり,常識となれば,セキュリティの向上に大きく寄与するのではなかろうか。

えっ? 面倒だって? 安全と利便性はトレードオフだ。送信者も受信者も一手間かけることによりセキュリティが確保できるのだ。

えっ? こんなの顧客には要求できないって? だから「常識となれば」と上では書いたのだ。最初は抵抗があっても,これが当たり前になれば,「ではメールに添付してお送りするので,パスワードを送信してください」と,お客様にお願いしても,何の失礼も違和感もなくなるはずだ。

このブログのアクセス数は限りなくゼロに近いのだが,これを読んだそこのあなた,ぜひ,この方式を始めて見ませんか?

VSCode Mac TypeScript の環境構築

世間のすなる TypeScript と言ふものを我もしてみむとて環境を構築するなり。

…なのだが,存外,手間取ったので,記録しておこうと思う。前提としては,VSCodeはインストール済み。

  1. Homebrew の導入(★第1のハードル)
  2. nodebrew の導入
  3. Node.js の導入
  4. TypeScript の導入
  5. VSCode のビルドの設定(★第2のハードル)

1. Homebrew の導入

 Homebrew は以前に導入済みなのだが,その時にハマったりしたので,その時のことをあらためて書いてみる。

 ネットで調べれば,すぐに実行すべきコマンドが見つかるので,基本的にはターミナルでそれを実行すれば良い。

 だが,実行するとエラーになる。入力間違っていないか目を凝らして確認しても間違っていない。ネットの情報が間違っている?と想って複数のサイトで確認しても,同じだ。なぜ,ダメなのか?

【答】shell が tcsh ではダメでした。bash で実行したら,OKでした。

 いや〜,気づかないっすよ…。これ以来,ターミナルのデフォルト設定を bash にした。

2. nodebrew の導入

 本日やったことは,ここから。

 これもネットで調べれば出てくるので,それを実行するのだが,実行すると出てくるメッセージに従い,フォルダの生成や PATH の追加を行う必要がある。

$ brew install nodebrew
(Homebrew の更新があったりすると長い時間がかかる!)
 :
==> Caveats You need to manually run setup_dirs to create 
directories required by nodebrew:
/usr/local/opt/nodebrew/bin/nodebrew setup_dirs
Add path:   export PATH=$HOME/.nodebrew/current/bin:$PATH
 :

 そこで,/usr/… を実行し,nodebrew 用のフォルダを作り,vi で .bash_profile を編集して,PATH を追加し,source ~/.bash_profile で反映させる。

3. Node.js の導入

 これも特段の困難はなく,コマンドを実行するのみ。

$ nodebrew install-binary stable
$ nodebrew use stable

4. TypeScript の導入

 これもコマンドを実行するのみ。

$ npm install -g typescript

5. VSCode のビルドの設定

 新しいフォルダを作り,VSCode で開いて,ワークスペースに追加。プロジェクトのルートに tsconfig.json を作成。とりあえず,最小限の指定をする。

[tsconfig.json]
{
    "compilerOptions": {
        "target": "ES5",
        "module": "commonjs",
        "sourceMap": true
    }
}

 適当なソースコードを用意する。JavaScript そのものでも良いようだ。ともかく,test.ts などのファイルを作り,コードを書き,保存する。

 さて,いよいよ,Cmd/Ctrl + Shift + B でビルドする。が,エラーとなる。曰く,tsc(コンパイラ)が見つからない,と。

 Mac のターミナルで,tsc -v とすると,きちんとバージョン番号を表示してくれるが,VSCode 内のターミナルでは,tsc が無いという。

【答】VSCode のシェルは,tcsh になっていた。

 そりゃ,.bash_profile にPATH を追加したのだから,tcsh ではダメですよね。.tcshrc にも PATH の設定を入れるか,とも思ったが,そもそも,デフォルトの shell の設定はどうなっているのだ?と思って調べて見た。

 Mac のターミナルで,echo $SHELL すると,/bin/bash である(1. の以前に行った Homebrew の導入の際に設定したもの)。しかし,VSCode のターミナルで,echo $SHELL を見ると,/bin/tcsh となる。システム側で管理されている情報は,古いデフォルトのままのようだ。

 そこで,変更方法をネットで調べて実行した。

  1. 「システム環境設定」を開き,「 ユーザとグループ」を選択
  2. 左下の南京錠のアイコンをクリックして,パスワードを入力し,設定を変更可能にする
  3. すると,左側のユーザのリストを右クリックで「詳細オプション」が選べるようになる
  4. そこにログインシェルの項目があり,当然ながら,/bin/tsch となっていたのを /bin/bash に変更

 ちなみに,使っている Mac は,iMac Late 2009 という古いもので,OS は High Siera までは上げられたが,それ以降にはアップデートできないもの。最初は,Snow Leopard だったか。なので,購入初期にユーザを作成した際の,古いデフォルト設定の shell を引き継いでいるようだ。

 あれ? tcsh でダメで,bash って,Homebrew の時と同じことを繰り返しているような…。ともかく,いったんログアウトし,VSCode を起動し直すと,ビルドできるようになりました。

nextcloud 15 -> 16 アップデート

 レンタルサーバに設置して使用している。設置はレンタルサーバのコンパネで行った。で,アップデート が出ていたので,実行して見たら,アップデートの準備のところまでは順調に進んだが,実行の段で,途中でエラーとなり失敗。しかも,リロードするとメンテナンスモードになる。

 とりあえず,コンパネのファイル編集機能でconfig.phpを編集してメンテナンスモードを解除してリロードしてみると,アップデートの実行のところとなり,再度実行してみたのだが,同じ結果に。

 具体的には,「アプリストアで “アクセシビリティ” アプリのアップデートを確認しています」という表示のあとでエラーとなっている。

 …なのだが,何が原因かサッパリわからないではないか! あれこれ調べてみたりすると,エラーログに,

PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted
 (tried to allocate 12288 bytes) in /home/[ユーザ名]/public_html/
[nextcloudフォルダ]/lib/private/App/AppStore/

などと表示されている。nextcloudのサイトの動作環境をみると,メモリ512MBなどと書いてある。マシンのメモリではなく,PHPの割り当て可能メモリらしい。そんなに必要なの??

 ともかく,コンパネのphp.iniの設定で,memory_limitを512MBにしてみたら,アップデートを完了できた。やれやれ。

iOS devicemotion は https 必須になった?

iPhone(iOS 12.2)で,

window.addEventListener("devicemotion", function(event){
// ...
}

とやっても,動作しない。以前には動作していたのが,セキュリティ上の理由で制約がかかるようになったという。しかし,「設定」の「Safari」で「モーションと画面の…」は,すでにONにしてあるのだ。

試しに iPodTouch(第5世代,iOS 9.3.5)で見てみると,動くではないか!

グーグル先生にお尋ねしても,該当する情報なし。devicemotionなどのサンプルを載せているページを iPhone で見てみると,動作するものとしないものがあり,訳がわからない。昨夜は諦めて終了。

本日,もう少し調べてみるか,と思って調べてみるものの,やはり該当する情報なし。だが,ふと,セキュリティの制約といえば,と思い出し,URL を https://… に変えると,動作するではないか!

いまだに SSL というか TLS 無しでアクセスするなよ,ということですね…。

データベースのトラブルで haxe.org の日本語ページが消えてしまったそうです…。

haXe というマルチプラットフォーム対応のプログラミング言語がある。Flash の開発環境を探していて見つけたのだが,Javascript や PHP 等にも対応している。

主に英語の情報しかなかったのだが,サイトが Wiki になり,他言語のページが作れるようになったので,勉強もかねて以前にいくつかのページを訳し始めてみた。
実のところ,自分は日常業務では Web 開発等を行っている訳でもないので,数ページしか訳しておらず,多くのページは他の方が訳されたものだったりする。

それでも haXe のメーリングリストも一応購読しており,これがまた,活発に幅広い話題が議論されている。普段は斜め読みしかしていないのだが,おととい届いたもので,haXe の開発者の Nicolas氏の投稿で「先週ディスクがクラッシュしてデータベースが吹っ飛んでしまった。バックアップから戻したのだが,UTF8の文字がおかしくなっており,ロシア語,日本語,中国は復旧できなかった。すまぬ。」というものがあった。

で,サイトを見てみると,確かにきれいさっぱり…。

ゼロから直すのも大変であろうと思い,Google で「site: haxe.org lang=jp」で検索して見つかった日本語ページのキャッシュをダウンロードしておくことにした。十数ページほどダウンロードした後に,不正アクセス扱いされてダウンロードできなくなってしまった。特定のサイトのキャシュばかりを見るという単調な操作を繰り返していたからか? 私は人間でbotとかでは無いぞ!
仕方がないので,Yahoo で同様のことを行い,重複もけっこうあるが,数十ページ分を入手した。

キャシュは最新版ではないこともあるのだが,ゼロから訳す/入力するよりはずっとマシで,とりあえず今日のところはトップページと紹介ページとダウンロードページを直してみた。

最新版の英語ページに同期する良い機会だと思って,残りも直していくのだろうか…?

プリンタで苦戦中(後日談)

プリンタで苦戦中(予告編)を書いておきながら,その後,途絶えていた。

結論から言うと,プリンタを入れ替えることになり,無線LAN対応の独立したプリンタ(直接LANにつながる)を購入したことで,実験は中止となってしまった。

それまでの状況がどうだったかというと…。
○一応,クライアントのWinXPマシンから印刷できるようにはなった。
・メーカー(Canon)の提供するLinux用ドライバ+バックエンド処理を導入
・WinXPから接続するプロトコルは,IPPで,接続先もURLで指定
・一部機能は使えない(プリンタの情報取得など)
・WinXPで共有していた時のクライアント数の制限は解消され,便利になった
○しかし,使っていると,印刷できなくなる時がある
・CUPSやCanonが提供するバックエンド処理のサービス(CCPD)が通信中のまま
となり,処理をうけつけなくなっている
・似たような状態でも異なる原因による複数のパターンがありそう
・いずれも,WinXPマシンとの通信が原因のように見える
・CCPDやCUPSを再起動すると正常化する場合もあるが,ひどい時は,Linuxを
再起動しないとダメだった
○だましだまし使ってみていたが,管理者(自分)が不在の時には,他の人は不具合を
解消できないので,不評だった…。

あれこれ試行錯誤していたのだが,上記の印刷できなくなる不具合は,根本的な解決ができないままだった。

そもそも,CanonはCAPTという独自の処理で通信を行い,印刷処理を早くしているようである。しかし,それは,標準の規格外のものなので,例えば,WinXP SP2 以降では,Windowsのファイアウォールで通信が妨げられてしまい,ドライバとともに提供される設定ツールでCAPTの使用するポートを開放しないと,印刷が極端に遅くなったり,印刷できなかったりするという,ちょっと厄介なもののようである。もちろん,セキュリティソフトのファイアウォールでも遮断されないようにする必要がある。

で,Linux上では,CUPSがIPPでデータを受け取り(よってSambaではプリンタ共有の設定は不要?),それをCCPDに渡して処理しているようなのだが,そのどこかで処理が進まなくなってしまう。通信エラーを無限にリトライしているような感じである。Linux上でrootで該当するプロセスをkillしても,psでみると死んでいない…。

というわけで,ほとんど参考にならないかと思いますが,Canon のプリンタをLinuxにつないで共有し,クライアントのWindowsマシンから印刷したいという方は,ぜひ,頑張ってみてください。

プリンタで苦戦中(予告編)

職場では,CanonのLBP3210というプリンタを使っている。

WinXPマシンの1つにUSBで接続されており,共有設定をして,LAN上の他のWinXPから印刷できるようにしている。ごく一般的な構成であろう。

しかし,時々,他のPCから印刷できなくなるときがある。しかも,印刷できるPCとできないPCがあるのだ。そんな時は,プリンタサーバとなっているPCを再起動すると印刷できるようになることが多い。

実は,恥ずかしながら最近まで知らなかったのだが,WinXPの共有機能には,他のPCからの接続を受けつける数に上限があり,Homeエディションでは,5つまでだそうである。そりゃ,印刷できなくなるわな。しかも,再起動すれば,いったんリセットされて数え直されるわけだから,印刷できるようにもなるわけだ。

で,以前から,Sambaでファイルサーバとして使っているLinuxマシンに,プリンタもつなげないものかと思っていた。そもそも,ずーっと以前(Win98の頃)は,ファイルサーバのLinuxマシンにつなぐ設定をしていた。が,プリンタの機能の高度化により,純正ドライバ(=Win用)でないとうまく動作しなくなったり(プリンタの状態を監視する機能等のための双方向通信とか…),店舗が増えて使用するプリンタの種類も様々となり,全部を同じように設定できなくなったり,WinXPになってWindows機につなぐ分には設定がしやすくなり(ドライバ入れてプラグ&プレイ,順序は逆のこともあるが),各店舗で模様替えをしたり,PCの入れ替えがあった際に,PCに詳しくない人でも設定できるので,WinXPにつないで共有しとけばいいじゃん,ということになり,Linuxサーバにはつながなくなったのだった。

…上記のあたりまでは,前任者の方がやっていた時代で,上に書いた説明は自分の認識なのだが,実際にはもっと異なる事情があったのかもしれない。ともあれ,プリンタはLinuxサーバにはつながないものとなった。

そもそも,ずーっと以前にLinuxマシンにプリンタをつないでいた頃は,まだ,cupsとかは無かった時代である(たぶん)。無かったは言い過ぎかもしれないが,少なくとも,広まってはいなかった。linux上では,Samba経由の印刷データを,汎用のドライバで処理していただけのはずだ。使っていたのは,新しくてもVine2.xとかであった。サーバは詳しい人(=担当者1名)のみが操作できる世界で,他の人は,怖くて触れない(間違って電源を切っちゃダメよ!)ものだった。サーバの電源をOffにするために,わざわざ担当者が当該店舗に出向いて,telnetでログインして,shutdown -h nowするような状況だったわけである(ま,面倒だからファイルにアクセスしていない状態で電源ボタンを長押しして切ってしまうことも多かったのだが→ごめんよ,ハードディスク)。

話はそれるが,比較的最近になって,acpi等のおかげで,電源ボタンを押せばシャットダウンするような設定ができるようになった。前からできたのかもしれないが,現在の担当者(=me)が,そのようにできることを知り,設定したのは,つい2年くらい前のことである(Vine3.x/4.x)。最近(Vine5.x)では,デフォルトでそうなっているようであるが。

で,話を戻すと,前から,以前のように,Linuxサーバ機にプリンタを接続できれば,プリンタをつないでいるWinXPをわざわざ起動しなくても印刷できるようになり,便利であろうとは思っていたのだが,最近になって,上記のようにWinXPの共有では接続数に限りがあることが発覚したので,一念発起して,設定してみようと思い立ったのである。

が,なかなか一筋縄ではいかないのである…。

Google Analyticsを設定した

とりあえず,Google Analyticsの設定をした。

そもそも,フッタとかにコードを自分で追加するものだと思っていたのだが,調べてみると,プラグインを使えば良いらしい。そりゃそうだよね。

そこで,調べてヒットした,WordPressにGoogle Analyticsのコードを挿入するプラグイン探しその2(病的溺愛シンドロームさん) を参考に,Ultimate Google Analytics というものを導入してみた。

…ブログの作法がまだ良くわからないのだが,リンクをする際には,上記のような感じで良いのだろうか? WordPress同士なら自動的にトラックバックはなされるとのことだが…。

で,ついでに,上記のサイトで紹介されていた,Wordpress Google Analytics Reports(WordPressの管理画面でanalyticsの情報を見ることができるもの)と,WordPress.com Stats(こちらもアクセス統計などを表示するもの)も入れてみた。

WordPress.com Statsは,wordpress.comでユーザ登録をし,API Keyを取得する必要がある。ユーザ登録のみと,ユーザとブログの登録,と2つの選択肢があったので,試しに後者にしたところ,「ユーザ名.wordpress.com」というブログができてしまった。ユーザ名を自分の名前にしてしまったので,そちらに何か書くことはなさそう…。またネット資源の無駄遣いをしてしまったか。

ブログ始めました

前からPC関連の自分用のメモをブログで書いておくと役に立つのでは?と思っていたのを,一念発起してブログを設置し,始めて見ようと思う。

…じつは,そもそも,前にもWordPressを設置したのだが,文字化けにより断念したのだ。

それというのも,その時は,レンタルサーバの管理画面(cPanel)のアプリケーション追加画面(Fantastico De Luxe)で導入したのだが,なぜか,日本語がうまく表示できなかった。あれこれと調べてようやくわかった原因は,「インストールスクリプトがMySQL上に作るテーブル・フィールドの言語照合設定がUTF-8になっていない」というものだった(外国のサーバですから)。phpMyAdminで当該フィールドの設定を直せば文字化けも直るのだが,DB上の全テーブルを見て直す気にはなれなかったので,その時には,あっさりとあきらめ,設置したものを短期で削除したのである。

で,今回は,日本語版サイトから最新版をダウンロードし,サーバ管理画面でMySQLのDB・ユーザを設定し,ローカルで設定ファイルを書き換え,FTPでアップロード,という,由緒正しい導入法を取ったところ,当然,正常に環境を構築できたわけである。まっ,手抜きするな,ということですね。

<今後の課題>
・必要な設定や書き換え
・Google Analyticsの設定
・テーマをデフォルトから変更する