mongodbのNode.jsドライバーのバージョンに気を付けろ(connect()の仕様が変わってるので)

やあ子供たち、おじさんはかつてmongodb driver の 4.2.2というバージョン(←"npm list"で確認できるよ)を使って、以下のようなコードを使っていたよ。まあこれで何の問題もなく動いていたものさ。

var g_db=null;
{
  let connection_string = "mongodb://127.0.0.1:27017";
  MongoClient.connect(connection_string, (err, client) => {
    if(err){console.log("mongodb connect error.");return;}
    console.log("Connected successfully to server");
    g_db = client.db("English");
    server.listen( settings.port, g_local_ip, ()=>{
      console.log("app listening.. ");
    });
  });
}

まあそのような古いドライバーを秘伝のタレ状態で使いまわしていたおじさんの方にも問題はあったと思う。
そう、このたびmongodb driverを6.5.0にしてみて、上記のコードを使いまわそうとしたら、errも返さないし、上のコード中で表示させているはずの"Connected successfully to server" も何も表示されなくなってしまった。困るよねえ。。
で、こんなの調べようがないじゃん?ていうか何が原因なのかもわからんじゃん?
でまあ今まで使ってきたmongoドライバーのバージョンが古いことに気づくのにどれだけかかったことか。そこに辿り着くまでに。。
npm list でバージョン調べたり、
npm i mongodb@4.2 とかやってダウングレードしたら、、動きましたがなっ!!
で、GPT様に以下の質問ですよ「code below works for mongodb driver version 4.2 but not for 6.5 why」そうすると、ああ、connect()の仕様が変わったんだよってGPT様が教えてくれるからそっからはもうホントに助かったんだけどそれまでは「code below does not succeed」とか聞いてもさ、もしかしてドライバーのバージョンがとか教えてくれないわけよ。もうホント苦労したわ気づくまで。つっても2時間くらいだけどさ。ほんとにもう。
ちなみに新しいconnect()の仕様に即したコードは以下のような感じだ。

// Create a new MongoClient
let g_db =null;
const client = new MongoClient("mongodb://127.0.0.1:27017");
async function mongo_connect() {
  try {
    // Connect the client to the server
    await client.connect();
    console.log("Connected successfully to server");
    g_db = client.db("English");
    // Start your server here
    server.listen(settings.port, g_local_ip, () => {
      console.log("app listening.. ");
    });
  } catch (err) {
    console.log("mongodb connect error:", err);
  }
}
mongo_connect();

やー本当になんつーかね。秘伝のタレ方式ってある意味便利なんだけど、ずっと使いまわしているとホント危険だよなみたいな例でしたと。最後に整理してみよう。
・秘伝のタレ方式で使いまわしてきたもの
 ・mongodb nodejs driver 4.2
 ・4.2に即したconnect()文を使った接続コード
・今回新しくして動かなくなった組み合わせ
 ・mongodb nodejs driver 6.5.0
 ・4.2に即したconnect()文を使った接続コード ←connect()の仕様が古いままだった。
それだけなのか?って、で思うわけなんだけど、
まこういう、breaking changesの情報だとかあるけど、載ってないし!(●リンク)まあ、宛にならんよなー。結局一番いいのは小まめにアップすることなんだろうな。あくまで理想としてはの話だが。。
え、mongodbのバージョン?5.0.26だよ。
はい今日はそんなところで。チャオ!

VSCodeのStickyScopeを無効化・有効化する方法

いつも忘れた頃に有効になっててむかつくやつ。
コード中スコープの最初の行だけが上の方の行として残ったままになって、
スコープの階層が増えるにつれその表示行が費やされてゆく。。なんじゃこのモードは!!

検索ワードの手探りから。この動きを見て思いつくワード、「vscode scope keep」とすると、
この機能はどうやら sticky scope というらしいことが分かる。
そして例えばここのようなリンクに辿り着く。

ま、あとは機能名さえわかりゃこっちのもんで「sticky scroll disable」とかやればいい。結局設定でsticky scrollで検索してチェックを外せばよいわけだが一番簡単なのは、このまさに邪魔な行で右クリックしてdisableを選択すればよいようだ。ふう!

JavascriptのNumber()関数は神か仏か

やあ子供たち。おじさんは昨日ね、Number()関数を知ったぞ。
プログラムの中でいろいろとやっていて、もはや数値なのか文字列なのかわからなくなってしまった変数のある場合、とにかくそれを「数値プリミティブ」にするのに便利だ。何せ、引数に数値を渡せばその数値が戻るだけだし、文字列を入れればそれを数値リテラルとしてテストしてくれ、成功すればパースした結果を数値として返してくれるのだからもうその変数の型についてコード遡らなくてもその場で解決できるということ。
これで、実は文字列なのにtoFixed(2)を一生懸命かましても何も変化せずに「おかしーなー??」なんて困るなんてことはなくなるね!
今日はこんなネタだったよ。チャオ!

ちなみに Number()は間違っても new Number() としてはいけないよ。これは数値ではなくてNumberオブジェクトという、数値プリミティブとは違う型の何かを返してくれてしまうそうだからな。気をつけろ!

MongoScriptのload()は便利

やあ子供たち。いくつもmongo script(js)を書いていると何だか共通部分が出来ちゃったりした経験はないかな?
異なるファイルで同じ記述がいくつもあるのはメンテもやりづらいよな。
そこでload()だ!loag("commong.js")という感じで共通部分を簡単に取り込めるぞ!
これならcommon.jsのあそこだけ変えれば一瞬ですみたいな状態になれるぞ!
じゃあ今日はここまでだ、チャオ!

ExcelInteropのCells[row, col]は遅いからRange[cell1,cell2]を使おう

やあ子供たち。
今日は以下のメモだよ。
これ、Excelの連続したセルに値を入れていくときはホント、パフォーマンスに差があるので忘れるな!

        // Cellsを使って値をセット。(めっちゃ遅い)
        worksheet.Cells[2, 1].Value = "Value A2"; // A2セルに記入
        worksheet.Cells[2, 2].Value = "Value B2"; // B2セルに記入
        worksheet.Cells[3, 1].Value = "Value A3"; // A3セルに記入
        worksheet.Cells[3, 2].Value = "Value B3"; // B3セルに記入

        // 配列の値を一気にセット(例えば行単位で一括してセット→まとめた分だけ速い!(体感)
        Excel.Range rangeA2B3 = worksheet.Range[worksheet.Cells[2, 1], worksheet.Cells[3, 2]]; // A2:B3 の範囲
        object[,] rangeData = { { "Value A2", "Value B2" }, { "Value A3", "Value B3" } };
        rangeA2B3.Value = rangeData;

WinMergeのfilterを知った。

WinMergeを使って以下のように同じフォルダ構造を持つ二つのフォルダa1、a2を比べることを考えます。
このとき、例えば bin/resoures フォルダはa1とa2とで全く同じ、しかもとても容量の大きいフォルダであると仮定しましょう。
そのようなとき、a1とa2とを比較する処理は、bin/resourcesの比較もやってしまうので、とても時間がかかってしまいます。
このような無駄な比較で時間を取られたくない時に便利なのが、WinMergeのFilter(フィルタ)機能です。

C:.
├─a1
│  ├─b
│  │  ├─c
│  │  └─d
│  ├─bin
│  │  ├─data
│  │  └─resources
│  └─trash
└─a2
    ├─b
    │  ├─c
    │  └─d
    ├─bin
    │  ├─data
    │  └─resources
    └─trash

はい、ずばりこの場合、bin/resourcesフォルダは比較対象から外したいですよね。そのような場合は、Winmergeで、
「ツール」>「フィルタ…」コマンドを起動させます。
すると、フィルタファイル.fltのリスト画面が出てくるので下の方にある「新規」ボタンを押して自分だけのフィルタファイルを作成します。
まず、name:と書かれた行に、自分のフィルタ名を書きます。自分のものだとわかる名前なら何でもよいでしょう。
続いて、フィルタファイル末尾に以下を追記して、

d: \\bin\\resources$

保存し、フィルタダイヤログに帰ってきたなら、OKを押します。
そうすると再度比較するかという旨のメッセージが出るので、再度比較させると、、
bin/resourcesのフォルダだけ、比較画面に表示されなくなりました!
(なお、以降にまたWinMergeを立ち上げ直したときに、いま作ったフィルタがデフォルトで有効になっているわけでもないようなのでこれは毎回、「ツール」>「フィルタ…」でフィルタリストを開き、自分のフィルタファイルをダブルクリックする必要があるようです。)

さて上記のd: とは何でしょうか。
これはWindowsばかりやっていると、d:ドライブのことかと思ってしまうのですがそうではありません。
これはdirectory(Unix系OSにおける、Windowsのフォルダと同じ意味の言葉)のd: です。

特定のファイルだけ比較をやめさせたい場合は、
f: \\.bak$
などとやるわけです。f:はおそらくfileのfで間違いないと思います。

上記を知ったことでいままでとても時間のかかっていた、node_modulesフォルダや、.svnフォルダ、その他比較からは外したい重たいフォルダなどを、自在に比較対象から外すことができるようになり、フォルダ間比較や、手動マージ作業がとても楽になるかと思うので、
みなさんもぜひ試してみてください!

YouTubeのお気に入りが消えた?

(PCパソコン画面の話です)
あれあれあれあれ、4月になってからかな、YouTubeの自分アカウントのページの左側にいつも出ていたお気に入りリストがなくなってしまった!と思っていると、よくみるとそれは左側メニューの「再生リスト」の中にあった!消えたわけではなくてよかったねと。

おじさんはもういつだったかも思い出せない過去のどこかで「お気に入り」という名前をつけた「再生リスト」を作っていて、これがつい先日までは、YouTube画面の左のペインに見えていたのでてっきりこれは「お気に入り」リストなのだと思っていたわけだけど、

こうなってみて初めて気づいたことにはこれは本来「お気に入り」ではなく「再生リスト」というものであって、その内容が左側に展開されて見えていたわけだが、なんだかその仕様がこのたびなくなって、「再生リスト」を押さなくてはいけない仕様になったんだなと理解したぞ。