VSCode + TypeScript + clasp + Github ActionsでGAS開発を良い感じにしてみた!
はじめに
個人開発でタイマートリガーを利用したLineへの通知アプリを作成した際にGoogle Apps Script(GAS)を利用してみました!
GASは無料で使えるし、専用のエディタの補完機能も良い感じですが、個人的にはVSCodeを用いてローカル開発したり、TypeScriptを用いて型付けをしっかりしたり、デプロイは自動でしたりしたいな~という思いからその環境を作ってみたので備忘録として残します。
前提
- Node.jsがインストール済み
Google Apps Script APIを有効にする
まずは外部からGASプロジェクトを操作できるようにGoogle Apps Script APIを有効にします。
Apps Script – Google Apps Script
claspとTypeScriptの導入と認証
対象のフォルダ内で以下のコマンドを実行します。
npm init
npm install @google/clasp
GAS関連のスクリプトもインストールしておきます。
npm install @types/google-apps-script
claspの導入後、以下のコマンドで認証を行います。
clasp login
ログイン後、Windowsユーザの場合はC:\Users\{ユーザ名}フォルダに.clasprc.jsonファイルが出来ています。Github Actionsの設定で後々使うのでファイルの場所は忘れないようにしましょう。
以下のコマンドでプロジェクトを新規作成します。
clasp create
※ちなみにTypeScriptはclaspが最初からサポートしているので独自にインストールする必要はありません。
eslintとpretterの導入
こちらは個々人の好みかと思いますが、eslintとpretterも導入しておきます。
npm install eslint prettier eslint-config-prettier eslint-plugin-googleappsscript
※eslintがなかなか効かなくてハマってしまったのですが、どうやら.eslintrc.jsファイルにてparserOptions.project項目へ対象のtsconfig.jsonファイルのパスを追加する必要があるみたいでした。
parserOptions: {
/* 省略 */
project: ["tsconfig.json"],
},
Pretterについても.vscode\settings.jsonファイルに設定を書いて動くようにします。今回は保存時にフォーマット警察が動くようにしています。
{ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }
Github Actionsにて自動デプロイ
.github\workflowsフォルダにrun.ymlファイルを作成します。
中身は以下のような感じにして、masterブランチにマージ(もしくは直接プッシュ)されたときに自動デプロイが走るようにしました。
name: cicd-notificate-app
on:
push:
branches:
- master
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v3
- name: setup Node.js
uses: actions/setup-node@v3
with:
node-version: "16"
- name: install Clasp
run: |
npm init -y
npm install clasp
- name: create clasprc.json
# scopeは長いのでこの記事では空にしてます。
run: |
echo \{\"token\":\{\"access_token\":\"${{ secrets.ACCESS_TOKEN}}\",\"scope\":\"\",\"token_type\":\"Bearer\",\"id_token\":\"${{ secrets.ID_TOKEN }}\",\"expiry_date\":1673089616269,\"refresh_token\":\"${{ secrets.REFRESH_TOKEN }}\"\},\"oauth2ClientSettings\":\{\"clientId\":\"${{ secrets.CLIENTID }}\",\"clientSecret\":\"${{ secrets.CLIENT_SECRET }}\",\"redirectUri\":\"http://localhost\"\},\"isLocalCreds\":false\} > ~/.clasprc.json
- name: deploy
run: |
clasp push
ポイントはコメントを書いている下のrun項目の部分でしょうか。
こちらはデプロイの際にGASプロジェクトへアクセスする際に必要な内容(.clasprc.jsonファイルの内容)です。
secrets.・・・と書いている部分はGitHubのSecretを利用しています。
直接機密情報をアップするのは好ましくないので、こういうサービスは積極的に使っていきたいですね。
以上でmasterブランチにマージされた後にGASプロジェクトへ自動デプロイされることが出来るかと思われます。
おわりに
最初はなんとなく触ったGASでしたが、一気に技術幅が広がって結構楽しい!
HTTP-01チャレンジとDNS-01チャレンジについての備忘録
はじめに
業務でHTTP-01チャレンジとDNS-01チャレンジについて学ぶ機会があったので備忘録として残します。
概要
どちらもドメインの所有者を確認するための(本人確認的な)ものとなります。
HTTP-01
証明書発行側がHTTP通信を用いてドメイン所有者の所有確認を行います。
ドメイン所有者側はWebサーバ上に特定のファイルを設置する必要があります。
DNS-01
証明書発行側がドメインのTXTレコードを確認することでドメイン所有者の所有確認を行います。
ドメイン所有者側は_acme-challenge.<YOUR_DOMAIN>のTXTレコードに認証用の値を入れる必要があります。
それぞれのメリットとデメリット
以下の記事が大変分かりやすかったのでこちらでメリットとデメリットを確認することができます。
おわりに
以上、HTTP-01チャレンジとDNS-01チャレンジについての備忘録でした~!
【Git】シェルスクリプトを用いてブランチへのプッシュまで自動化してみた。
はじめに
業務で100個近いリポジトリに特定ファイルを追加してデフォルトブランチへMRを作るという超単純作業が発生したのでシェルスクリプトを用いて各リポジトリのブランチまで一気にプッシュするものを作ってみました。
※本当はMR作成までいきたかったけど、それはまた今度にします。
概要
下記のように作業が必要なリポジトリ群があるとします(このフォルダ数が100個近く)。

1つずつリポジトリにアクセスしてブランチ切ってファイル追加(デフォルトブランチが更新されているかもしれないのでpull作業も)、コミット~プッシュまでを手作業でやるのはちょっと大変だなと思ったので何とか自動化しようと思いました。
こういう場合はやはりシェルスクリプトを用いるのが一番お手軽かと思い、やってみた感じです。
サンプルコード
以下にサンプルコードを記載します。
#!/bin/bash TargetPath=`pwd` Targets=`find ${TargetPath}/* -maxdepth 0 -type d` WorkBranch="features/add-test-file" CommitMessage="テストファイルを追加" for filepath in $Targets do echo $filepath cd $filepath git stash -u # 既存の変更は保留にしておく defaultBranch=`git remote show origin | grep 'HEAD branch' | awk '{print $NF}'` # デフォルトブランチから作業ブランチを切りたいのでデフォルト名を取得 git checkout $defaultBranch git pull origin $defaultBranch git checkout -b $WorkBranch cp /c/Work/test/test.txt . # 追加したいファイルを任意のフォルダからコピー git add . git commit -m $CommitMessage git push origin $WorkBranch done
一連の操作をリポジトリ数分forループで回したのみ、という感じではありますが結構作業が楽になりましたw
おわりに
本当はMR作成までしたかったのですが、一旦時間の都合上リモートブランチへのプッシュのみとなります。
機会があればMR作成までやってみたいですね!
RTP(Real-Time Protocol)について勉強してみた。
はじめに
RTP(Real-Time Protocol)について学ぶ機会があったので備忘録として残します。
RTPについて
トランスポート層の代表的なプロトコルとしてTCPとUDPがあります。
信頼性のある通信に対してはTCPが用いられますが、IP電話やテレビ会議など、リアルタイム性が重視される場合はUDPが用いられます。
しかしながらUDPのみではパケットの順番が保証されないために、以下の2つを付与し、順番を保証するのがRTPとなります。
- タイムスタンプ
- シーケンス番号
パケットを受け取ったアプリケーションは、上記で受け取ったタイムスタンプを基に再生するタイミングを調整したり、仮に同じタイムスタンプで通信が来た場合でもシーケンス番号によって順番を調整したりすることが可能になります。
おわりに
以上、RTP(Real-Time Protocol)についての備忘録でした。
SOAP APIをC# + ASP.NETで体験してみた。
はじめに
WebAPIを実装する際、最近のトレンドはREST API(GraphQLもだいぶ来ている?)かと思いますが、SOAP通信について触る機会があったため備忘録として残します。
SOAPとREST API
SOAPに関する説明とREST APIとの比較については以下の記事がとても分かりやすかったです。
SOAP と REST とは|API の種類| Red Hat
今さら聞けないWebAPIの実装方式RESTとSOAPの違い - Qiita
ASP.NETでSOAP APIを体験してみた
- Visual Studio > 新しいプロジェクトの作成 > ASP.NETアプリケーション(.NET Framework) > テンプレートは空を選択します。
- 作成されたプロジェクトを右クリック > 追加 > Webサービス(ASMX)を選択します。

- 新規にasmxファイルが作成されていることを確認し、デバッグ実行します。
- 以下のような画面が出ていることを確認します。

- サンプルに沿ってPostmanなどでリクエストを送るとレスポンスが返却されることを確認します。

実際に200レスポンスが返却されたことが確認できました。
おわりに
とりあえずSOAPとREST APIの違いについては理解しましたが、まだまだ実際の実装についてはこれから頑張って理解していく...という感じですかね。 以上、SOAP APIをC# + ASP.NETで体験した備忘録でした~!
Hosts File Mnagerを用いてhostsの切替を行う!
はじめに
移転先のサイトが同じドメインで正常に見れるかどうか、あらかじめ確認しておきたいなというときにhostsの書き換えを行うことが多々あります。
今までは直接書き換えを行っていたのですが、Hosts File Managerを用いることでより便利に切り替えられることを知ったので備忘録として記載します。
Hosts File Manager
ダウンロードは以下から行います。
ダウンロード後、アプリを開くと以下のようになります。

使い方
ファイル > 開く を選択するとhostsファイルを格納するフォルダが開きます。
そこへ各hostsファイルをセットします。
セット後、ツール > hostsファイル切り替え よりセットしたhostsファイルが一覧となって確認できるので、適用したいhostsを設定することで切り替えが可能になります。
おわりに
以上、Hosts File Mnagerを用いてhostsの切替を行う備忘録でした!
メールの暗号化と電子署名を行うS/MIMEについて勉強してみた
はじめに
S/MIMEについて学習する機会があったので備忘録として残したいと思います。
S/MIMEとは
通常、メールはインターネットを介して送信先へ送られます。
そのため、生のデータを送った場合は第三者からの閲覧が可能になってしまいます。
それを防ぐためにメールを暗号化もしくは電子署名を行う仕組みをS/MIME(Secure / Multipurpose Internet Mail Extensions)と言います。
暗号化
S/MIMEでは、暗号化にハイブリッド暗号方式を利用しています。
※ハイブリッド暗号方式では共通鍵暗号方式と公開鍵暗号方式の両方が使用されています。
暗号化の内容については以下サイトの『S/MIMEによるメールの暗号化の仕組み』の解説がとても分かりやすいです。
S/MIMEとは?メールへの電子署名と暗号化の仕組み|GMOグローバルサイン【公式】
電子署名
S/MIMEでは、電子署名に公開鍵暗号方式を利用しています。
暗号化の内容については以下サイトの『メールへの電子署名の仕組み』の解説がとても分かりやすいです。
S/MIMEとは?メールへの電子署名と暗号化の仕組み|GMOグローバルサイン【公式】
注意
S/MIMEではメール本文や電子署名をCMS(Crypgraphic Message Syntax)形式で扱うため、CMS形式に対応しているメーラを利用する必要があります。