ginでCORS対応

go(gin)で作成したWeb APIを別ドメイン(ローカルに作成したindex.html)からアクセスした場合、CORSでエラーが発生しました。

対策としては、ginで作成したハンドラでヘッダ(Access-Control-Allow-Origin)を追加すればOK。

func XXXX(ctx *gin.Context) {
    ctx.Header("Access-Control-Allow-Origin", "*")
    ctx.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
    ctx.Header("Access-Control-Max-Age", "86400")
    ctx.Header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
        ...

CORSについてもあまり良く理解していなかったので復習。 Cross-Origin Resource Sharing (CORS)は、別ドメインからアクセスした場合サーバー側で許可していないとブラウザがチェックしてエラーに してくれる。 公開されているAPIサーバーはすべてのドメインからのアクセスを許可するかわりにトークンでチェックしているのでここまで気が回っていませんでした。 実際にいろいろ試してみないと覚えることができないことを改めて痛感。

リンク

GORMでdistinct

GORMはGo言語でよく使われているORMの一つです。

GORM ガイド | GORM - The fantastic ORM library for Golang, aims to be developer friendly. ても便利なのですが、distinct(レコードの重複をまとめる)は未実装でした。

したがって、distinctを実現するためには生SQLを実行する必要があります。

以下の記事を参照。

Advanced Usage · GORM Guide

type Result struct {
    Name string
    Age  int
}

var result Result
db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result)

覚えておいて損はなさそう。

DynamicFeaturesInSwift

swift 4.2の新しい機能「Dynamic Member Lookup」について学ぶために以下の記事を写経しました。

Dynamic Features in Swift | raywenderlich.com

Dynamic Member Lookupを理解した後で、以下の記事を読むとよりわかりやすいと思います。 今、僕が一番注目している Swift の新機能について、 iOSDC Japan 2018 で話します - koherent.org

チュートリアル

DocCatcherページのJSONDocCatcherの例が分かりやすいです。

プロパティアクセスとして記述できるようになる仕組みなんですね。

適用後

let ownerName: String = catcher.owner?.name?.value() ?? ""

適用前

let messyName: String = catcher["owner"]?["name"]?.value() ?? ""

写経後のソースは ここ にあります。

SSH経由でサーバーのファイルをVS Codeで編集する

拡張機能(SSH FS)をインストールするとサーバーのファイルを編集することができます。 VS Code拡張機能が使えるのでとても便利です。

リンクの記事を参考に設定しました。 公開鍵認証で、サーバーのauthorized_keysに公開鍵を登録しておくとpassphraseの入力は不要になります。

    "passphrase": false

リンク

Visual Studio CodeでSSHごしにファイルを編集する - Qiita

単語分散表現のクラスタリング

語彙空間のクラスタリングの参考になるものがないかと探して以下の記事に遭遇しました。

Pythonで単語分散表現のクラスタリング - Ahogrammer

現象

作成済みモデルをダウンロードしてクラスタリングを実行するという優れもの記事でしたが、クラスタリングをする際にgensimのエラーが出たのでその解決法をメモ。

AttributeError: 'Word2Vec' object has no attribute 'trainables'

どうやらこれはgensimのバージョン相違に伴うエラーでした。

モデル作成時のgensimとモデル読み込み時のgensimのバージョンが異なる。

'Word2Vec' object has no attribute 'trainables' · Issue #2000 · RaRe-Technologies/gensim

対応策

ありがたいことにこの作者の方はモデル作成のソースをgithubに公開してくれていました。

shiroyagicorp/japanese-word2vec-model-builder: A tool for building gensim word2vec model for Japanese.

$ git submodule init
$ git submodule update
$ python -m venv .env
$ . .env/bin/activate
$ pip install -r requirements.txt

これを使って環境を構築し、クラスタリングを実行したところうまくいきました。多謝!

以下が実行結果の一部です。

...
['年末', '11月下旬', '5月上旬', '3月下旬', '6月中旬', '10月中旬', '8月下旬', '9月中旬', '3月上旬', '秋期']
['大洋', '近鉄バファローズ', '南海', 'プロ野球', '近鉄', '球団', '日本ハム', '藤井寺球場', 'オリックス', '東北楽天ゴールデンイーグルス']
['ヒール', 'ギミック', 'プロレスラー', 'ベビーフェイス', 'ルチャリブレ', 'ルード', 'テクニコ', 'レスラー', 'ハンス・シュミット', 'フリッツ・フォン・エリック']
...

実は、Mecabのビルド時にエラーが発生したのですが、実行ときにはグローバルにインストールしているMecabモジュールを使うので問題なく動作しました。

MeCab_wrap.cxx:2987:10: fatal error: 'stdexcept' file not found

こちらは、XcodeのCommandLineToolsのバージョン問題のようです。

MacとiPhone連携

最近、iPhoneのSIMを音声通話対応版に変更しまし MaciPhoneでいろいろな連携ができることに驚いています。便利!

知られていない機能が盛りだくさん。MacとiPhoneの美しき連携機能10選 | ライフハッカー[日本版]