2023/12/02

vsReversiアップデート

 Google Cloudのデモとして用意していたvsReversiをアップデートしました。今回はJava8→17の更新だけです。内容は特に変わっていません。Google App EngineのJava8サポート終了が予定されているので、それに備えての更新です。

Java11を飛ばして17にした理由は、単にライフサイクルがJava17のほうが長いからです。App Engineのランタイムサポートスケジュールを参照してください。Java11だと残り1年もないですね。すでにJavaのLTSバージョンは今年秋に21がリリースされていますが、これもそのうちApp Engineで使えるようになることでしょう。


2023/10/18

CORSに対応する [Go]

背景

 HTML/JavaScript/TypeScriptのダウンロード元と Ajaxでのアクセス先が異なる場合、Cross Resource Origin Sharing(以下CORSと略)ポリシーに従う必要があります。AjaxやCORSについての詳細はいろいろなところで説明されているので、ここでは割愛します。

 Go+GinでのCORS対応の実装についてです。


前提

 使用するソフトウェアのバージョンは以下のとおりです。

  • Go : 1.20
  • Gin : 1.9.0


 また、すべてのアクセス先に対してCORSアクセスを許可する設定であるAccess-Control-Allow-Originヘッダへの"*"の設定ではなく、特定のアクセス先に対してのみ許可するものとします。


gin-contrib/cors

 最初に見つけたのが「gin-contrib/cors」です。Ginの公式なCORSのパッケージのようです。ドキュメントはこちら。スニペットを見る限り使い方も簡単で、Ginのミドルウェアとして設定するだけです。
 しかし「Canonical example」のスニペットを参考に実装してみたのですが、まったくCORSポリシーを解決できませんでした。OPTIONSリクエストに対して、レスポンスヘッダにはAccess-Control-Allow-Originヘッダが付いていません。しばらく設定を変えたりして試してみたのですが、全く解決できませんでした。

 この状況をググってみて見つかったのがStackOverflowの記事「Go gin framework CORS」です。質問者はGoの標準ライブラリのみを使用していますが、OPTIONSに続くアクセスが発生せず、期待動作しないと言っています。
 回答を見ると複数パターンあるようです。
  • Goの標準ライブラリのみで実装の修正。質問者はこれで解決したもよう。
  • gin-contrib/corsの使用を勧めるもの。これで動いたといっているのは1名のみ。
  • rs/corsを勧めるもの。
  • 独自ライブラリを勧めるもの。

 自分の使っているGo/Ginのバージョンに比べて、gin-contrib/corsの最新リリースは2022/07/05なので幾分か古く、そのためGo/Ginの更新について行っていない可能性があります。Go/Ginのバージョンダウンまでして確認するほどgin-contrib/corsにこだわることもないので、このパッケージは諦めました。

標準ライブラリでの実装

 変なライブラリを入れたくないので、結局標準ライブラリのみで実装することにしました。実際にCORSを解決できた最小限の実装が以下です。Ginのミドルウェアにしています。


func main() {
    router := gin.Default()
    router.Use(corsSetting)
    // リクエストハンドラを設定 router.GET(...) etc.
}

func corsSetting(ginctx *gin.Context) {
    // リクエスト元の確認
    requestheader := ginctx.Request.Header
    requestorigin := requestheader.Get("origin")
    if リクエストの確認 {
        // レスポンスヘッダの設定
        responseheader := ginctx.Writer.Header()
        responseheader.Set("Access-Control-Allow-Origin", requestorigin)
        responseheader.Set("Access-Control-Allow-Headers", "Content-Type")
    }
}


 OPTIONSに続くアクセスのために、Access-Control-Allow-Headersレスポンスヘッダに"Content-Type"を設定しています。


2023/08/08

ローカルバックアップからリストアしたGitリポジトリのアクセス権エラーへの対処

概要

GitHubなどのリモートリポジトリにクローンしておらず、ローカルでのみバックアップしていたGitリポジトリのリストアを試みると、アクセス権の問題でリポジトリを利用できないというケースに遭遇しました。その解決方法の忘備録です。


発生環境

OS : Windows 10 Home 64bit
アプリケーション : Source Tree
リポジトリの種類 : Gitローカル (リモートリポジトリは不使用)
目的 : HDD入れ替えに伴う開発環境の復元。
操作 : 
  1. 開発作業用HDD上のローカルのGitリポジトリをディレクトリごとコピーして、バックアップHDD上にローカルのバックアップを作成。
  2. 新HDDにWindows 10、Source Treeをインストール。
  3. バックアップHDDをつないで、バックアップHDD→新HDDにディレクトリごとコピーして、ローカルのGitリポジトリのファイルをリストア。
  4. Source TreeでClone。保存先パスにはリストアした新HDD上のローカルGitリポジトリを指定。この時点ではSource TreeはGitリポジトリを認識している。
  5. Source Treeで以下のエラーを示すダイアログが表示され、リポジトリを取り込めない。


上記ダイアログの内容は以下のとおり。
'git log'がコード 128 で終了しました:fatal:detected dubious ownership in repository at 'リポジトリのパス'
'リポジトリのパス' is owned by: 'Gitリポジトリに記録されたオーナー識別子'
but the current user is: '指定したディレクトリのオーナー識別子'
To add an exception for this directory, call:

        git config --global --add safe.directory リポジトリのパス
(リポジトリのパス)

調査

まずはメッセージのとおりgit config --global --add safe.directory リポジトリのパス を試してみたのですが、効果なし。

ちょっとすぐにはわからなかったので、ググってみて見つけたのが以下の記事です。
この記事ではOSなどの書かれていないようですが、症状はこの記事と全く同じに見えます。さらに回答を読み進めると、2022/8/7のhalt9kさんの回答はWindows10での対処法について書かれています。
この回答によるとGitの問題ではなく、Windowsのディレクトリのアクセス権の問題とのこと。

解決した手順

上記調査結果を参考に、結果として自分は以下の手順で解決することができました。
  1. Gitリポジトリのディレクトリの親ディレクトリを右クリック。
  2. コンテキストメニューの「プロパティ」を選択。
  3. プロパティウィンドウの「セキュリティ」タブを選択。
  4. 「詳細設定」ボタンを押下。
  5. セキュリティの詳細設定ダイアログが表示されるので、「所有者」を確認しておく。
  6. 同ダイアログの下部の「継承の無効化」を押下。
  7. 同ダイアログ上部の「変更」を押下。
  8. ユーザまたはグループの選択ダイアログの下部の「選択するオブジェクトを~」に、自分のWindowsのアカウント名を入力。
  9. 「OK」を押下。
  10. セキュリティの詳細設定ダイアログに戻るので、「所有者」が入力したアカウントに変わっていることを確認。
  11. Source TreeでGitリポジトリをAddする。

現象発生したリポジトリはドライブ直下ではなく、サブディレクトリ内に置いていたことも影響しているかもしれません。
自分はWindowsではSource Treeを使用していますが、gitで生じる問題なので、たぶんCUIのgitでも同様に解決できると思います。

(2023/8/11追記)
ドライブ直下に置いたGitリポジトリでも同様の現象の発生を確認しました。その場合に最も簡単に解決できた方法は以下のとおりです。ドライブ直下だと面倒なので、サブディレクトリに移したほうが楽でした。
  1. Gitリポジトリを格納するためのディレクトリを適当に作る。
  2. 作成したディレクトリを右クリックし、上記手順2~6を実施。
  3. 「OK」を押下してダイアログ2つを閉じる。
  4. Gitリポジトリのディレクトリを作成したディレクトリに、移動ではなくコピーする。
  5. Source TreeでコピーしたGitリポジトリをAddする。