2022/08/18


Go言語で画像ファイルか確認してみる - Qiita

Go言語で書かれたサーバーサイドでアップロードされたファイルが画像ファイルか確認する必要があったため今後の備忘録として記載します。

https://qiita.com/tebakane/items/b7a47379659d42364c8d

実は Go にはそれ専用の関数が用意されています。

http package - net/http - Go Packages

Package http provides HTTP client and server implementations. Get, Head, Post, and PostFo...

https://pkg.go.dev/net/http#DetectContentType

バイト列を指定して以下の様に呼び出すだけです。

ct := http.DetectContentType(b)
if strings.HasPrefix(ct, "image/") {
    // 画像ファイル
}

簡単ですね。image.Decode を使い画像を一定のサイズにリサイズしてディスクに保存するといったケースであれば引用元の方法でも良いですが、そうでないならば画像のマジック部分だけで判定できるの DetectContentType を使った方が良いでしょう。

Posted at by



2022/04/01


Go で URL を扱う時は通常、net/url を使います。その際、例えばベースとなる URL にパスを足そうと思うと意外としんどかったりしました。

package main

import (
    "fmt"
    "log"
    "net/url"
    "path"
)

func main() {
    endpoint := "https://example.com"
    u, err := url.Parse(endpoint)
    if err != nil {
        log.Fatal(err)
    }
    u.Path = path.Join(u.Path, "foo""bar""baz")
    endpoint = u.String()
    fmt.Println(endpoint)
}

一部の方は「ハァッ?文字列で足せばいいじゃん」と思われるかもしれませんが、URL のパスを扱うという行為は実はとても難しい事なのです。path.Join を使う事で、不要な / が混じらない効果があります。また以下の様に相対パスを扱う場合

u.Path = path.Join(u.Path, "foo""..""baz")

https:///example.com/foo/baz に修正してくれるといった効果もあります。そういう点で僕は Go で URL を扱う場合は面倒でも url.Parse を使う事をオススメしています。しかしたかが元が文字列の URL にパスを足す為だけにこれだけのコードを書くのは、いくら Explicit の精神とは言え面倒に感じるのは共感できます。

net/url: add JoinPath, URL.JoinPath · golang/go@604140d · GitHub

Builds on CL 332209. Fixes #47005 Change-Id: I82708dede05d79a196ca63f5a4e7cb5ac9a041ea GitHub-Last-R...

https://github.com/golang/go/commit/604140d93111f89911e17cb147dcf6a02d2700d0
Go の master ブランチで net/urlJoinPathURL.JoinPath が追加されました。上記のコードであれば以下の様に簡単にパスを結合する事ができる様になりました。 package main

import (
    "fmt"
    "log"
    "net/url"
)

func main() {
    endpoint := "https://example.com"
    var err error
    endpoint, err = url.JoinPath(endpoint, "foo""bar")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(endpoint)
}

URL のパスを組み立てる為に URL を作らなくても良いので、ずいぶん楽になりました。

改訂2版 みんなのGo言語 改訂2版 みんなのGo言語
松木 雅幸, mattn, 藤原 俊一郎, 中島 大一, 上田 拓也, 牧 大輔, 鈴木 健太
技術評論社 Kindle版 / ¥2,350 (2019年08月01日)
 
発送可能時間:

Posted at by



2022/03/24


献本頂きました。執筆者の皆様、技術評論社の皆様、ありがとうございました。

Rが生産性を高める〜データ分析ワークフロー効率化の実践 Rが生産性を高める〜データ分析ワークフロー効率化の実践
igjit, atusy, hanaori
技術評論社 Kindle版 / ¥3,126 (2022年01月21日)
 
発送可能時間:

もともとデータ解析というか機械学習に幾らか興味があり、このブログや Zenn 等でも幾らか記事を書いてきたのですが、R 言語に関してはほぼほぼノータッチで、たまに遊んだりはしていましたが使えるというレベルではありませんでした。

以前から vim-lsp-settings という、Vim からあらゆる Language Server をインストールできるプラグインを作っており、そこで R の Language Server を試したところ、Windows で動かないバグを見付けパッチを送った際に少し触ったのが初めて R を触った体験です。このパッチがマージされたのをきっかけに少しだけ R を触る様になりました。

おそらく多くの皆さんも、R がどういった言語でどれくらい成熟しているのかはご存じないかもしれません。かくいう僕も今回 R を触って改めて驚いたのですが、R はかなり成熟しており、エコシステムはもちろん、周辺ツールや IDE、ライブラリを作る為の仕組み等も既に一通り揃った、ほぼほぼ完成したプラットフォームなのです。特に驚いたのが Windows への対応力です。僕の経験上、失礼ながらマイナーなプログラミング言語は Windows での動作が未保障でひどければ非サポートという状況が一般的で、うまく動いても手直しが必要というのが経験則だったのですが、R に至ってはほぼ何も手を加える事無く、いろいろなライブラリが動作します。

そんな中で本書を手に取り、色々なサンプルを1つずつ試しながら読んだのですが、一言で言えば「データ解析は奥が深い」です。そしてもう1つ「見せ方次第でデータは変わる」とも感じました。もちろんデータそのものが変わる訳ではありませんが、受け取る側の印象はまったく変わってくると思いますし、その為に必要なデータ加工のスキルはとても重要だと思いました。そして抽出されたデータを加工し、グラフ等で表現する一連のワークフローを行う際には、R は強い味方になってくれる事も理解できました。

こういったデータ解析はもちろん Python でも同じ様な事はできるのですが、R の IDE である RStudio のデキがかなり良く、おそらく巷にあるどのデータ解析 IDE よりも良く出来ているだろうと思いました。僕は R 言語はド素人な訳ですが、僕と同じ様に R 言語をビギナーから始めたい人には、初手から詳しい説明が書かれている本書はとても便利でありがたい1冊だと思いますし、R に慣れるまではしばらく近くに置いておきたい本になると思います。

Posted at by