2023年5月28日日曜日

PowerShellでプチプログラミング

こんにちは、やっまむーです。

仕事での出来事ですが、常駐先の現場ではセキュリティの関係でPCにソフトを勝手にインストールする事は禁止されています。
当然、業務で使わないのであればVisualStudio等もインストールできず、専用のマシンを別途使わなければなりません。

そんな中、内製の暗号化ライブラリで共通鍵が期待値と異なる問題が発生しました。
ソースコードはあれど、デバッグをする事は出来ません。
何故期待値と異なるのか、暗号化クラスの使い方に問題はないかと調べる際に、実際に動作させられないことが非常に不便でした。

そんな時、PowerShellを使って簡単にですが暗号化クラスの動作確認ができたのでその方法を紹介します。

PowerShellでクラスを生成する

問題があるとされていたのは、ECDiffieHellmanCng クラスでした。
このクラスのオブジェクトをPowerShell上で生成します。(上記ページの例を参考)

このようにPowerShell上で任意のクラスのオブジェクトを生成することができます。
また、PublicKeyの取得もできます。

同様の手順でBobのPublicKeyを生成してCngKeyオブジェクトの生成まで行います。

作成されたCngKeyを使い、鍵の生成を行います。

このような手順で、ソースコードの内容をPowerShell上で再現して鍵計算の間違いを調べることができました。

複雑なコードを再現することは難しいですが、簡単な確認程度であればPowerShellでも十分に可能です。
もし、同じようにデバッグ環境が用意できない場合があれば、一度試してみてはいかがでしょうか。

ではではー。

2023年5月19日金曜日

YouTube & Article Summary powered by ChatGPTを使ってみた!

ChatGPTを使い、YouTube動画の要約を作成してくれるChrome拡張機能「YouTube & Article Summary powered by ChatGPT」を使ってみました。


インストール&設定


YouTube & Article Summary powered by ChatGPTは「chrome ウェブストア」にあります。


「Chromeに追加」すると、YouTubeの動画再生画面の右上にツールが表示されます。


言語設定を日本語に設定し、ChatGPTアイコンを押すと、ChatGPTの画面が開き、動画の要約が表示されます。


使ってみる


当社のYouTubeチャンネルで公開している動画で試してみましょう。

当社のチャンネルで公開している動画には、英語字幕を付けているものと付けていないものがあります。まずは、英語字幕を付けていない動画です。



自動翻訳の日本語字幕をもとに要約しています。語句がおかしいのは元の翻訳のせいで、要約自体はきちんとできていますね。

次に、英語字幕を付けている動画で試してみましょう。



完璧ですね!
ところが、もう一度、試したところ、下記の要約が出力されました。


先ほどは
列車は近鉄大阪線の終点である伊勢中川駅には停まらず、連絡線を通過して近鉄名古屋線に合流し、名古屋に到着します。プレミアムシートは非常に快適で、筆者はまた乗りたいと思っています。

と、「伊勢中川駅が大阪線の終点であること」「伊勢中川駅には入らず、中川短絡線を通って名古屋線に合流すること」をきちんと訳せていたのに、
「ひのとり」は伊勢中川駅で終点となり、名古屋へ向かう途中で近鉄名古屋線に合流する。約2時間以上かけて名古屋駅に到着し、プレミアム席は非常に快適である。

と、「ひのとりの終点が伊勢中川駅」と誤訳していますね。
何度か試しましたが、正しく訳せる、訳せないは半々くらいでした。


またいつか、どこかで。

2023年5月14日日曜日

GAS(Google Apps Script)でGmailのメール削除

こんにちは。ざわです。

Gmailを使っているのですが、未読件数がどんどん溜まっていってます。。

手動で削除してもいいのですが、GAS(Google Apps Script)を使ってGmailのメールを一括削除してみることにしました。

手順は以下の通り。

① GASプロジェクト作成

 GASのプロジェクト作成方法については、以前書いたこちらのブログを参照ください。

② メール削除のスクリプトを実行

 ◆ メール削除スクリプト(全体)
let cnt = 0;

function myFunction() {

  // 削除するメールの条件:スター付きでない かつ 過去1年前より古い日付のもの
  const query = '-is:starred older_than:1y';
  const threads = GmailApp.search(query, 0, 100);

  Logger.log('取得スレッド数: ' + threads.length + '件');
 
  if(threads.length > 0){  
    cnt++;
    Logger.log('処理回数: ' + cnt + '回目');

    // スレッドをゴミ箱に移動
    GmailApp.moveThreadsToTrash(threads);

    // 再帰呼び出し
    myFunction();
  }
 
}

 ◆ スクリプトの説明:

 ・削除対象とするメールの条件を指定
スター付きのメールと 過去1年分のメールは削除せずに残そうと思うので、
「スター付きでない かつ 過去1年前より古い日付のもの」を削除条件として設定します。
const query = '-is:starred older_than:1y';
 
 ・対象メールの抽出
Gmailアプリクラスの searchメソッドで、削除対象メールのスレッドを抽出します。
引数には上記の条件と抽出結果で返却されるスレッド数の最大値(ここでは100スレッド)を指定。
(最大値の引数は省略可能で、指定なしの場合は 500 になります)
const threads = GmailApp.search(query, 0, 100);

 ・ 抽出したスレッドをゴミ箱に移動
GmailApp.moveThreadsToTrash(threads);
 
 ・再帰呼び出し 
ここでは1回の削除件数を100スレッドにしているのですが、溜まっている件数はそれ以上なのでスクリプトを再帰呼び出しして、条件に該当するスレッド件数が0件になるまで繰り返し処理するようにしています。
// 再帰呼び出し
myFunction();
 
GASでは、1スクリプトの実行時間が6分間という制限があるそうで、
実行した結果、件数が多かったため 6分以上になると途中でタイムアウトエラーが発生してしまいましたが、
過去年数の条件を変えながら数回に分けて実行することで溜まりに溜まっていたメールを削除することができました。

今後、不要メールが溜まらないよう GASのトリガー機能を使って、この削除スクリプトを定期的に自動実行させたいと思います。

 ・画面左の[トリガー]アイコンをクリックし、[トリガーを追加]ボタンをクリック。

 ・イベントのソースに「時間手動型」を選択し、時間ベースのトリガータイプに任意のタイプを選択。
  (私は月1回実行するように設定)

 それではまた!