golangでGo !!

とりあえずGo言語を触っていきます。

Goで文字コードを扱う方法

golangは基本的にUnicodeが基本ですね

文字もUTF-8で扱うので日本語sjisを扱う場面では色々と面倒なのですが、

ちゃんとライブラリが用意されてます!

 

とりあえずいつものようにgo get しちゃいます。

pkg.go.dev

 

使い方はまずimportして

import (
 
"golang.org/x/text/encoding/japanese"
"golang.org/x/text/transform"
 
)

 

変換エンコーディングするだけでお気軽ですねー

func sjis2utf8(str string) (string, error) {
ret, err := io.ReadAll(transform.NewReader(strings.NewReader(str),
                               japanese.ShiftJIS.NewDecoder()))

if err != nil {
return "", err
}

return string(ret), err

}

戻り値はちゃんとsjisに変換されてます。

他にも別のパッケージもあるけど、これが一番カジュアルで簡単な気がしますね。

 

GoでWebページをダウンロード

みんな興味があるスクレイピングだけど、相手先のサーバーに無駄に負荷をかけることになるので、とりあえずローカルにページを保存する方法です。

勝手にスクレイピングしちゃうし、最低限のマナーかなと思うし。

 

それでGoでどうやってHPを保存するかというと、意外と簡単です。

 

まずいつものように

↓↓

import (
"io"
"log"
"net/http"
"os"
"path/filepath"

)

 

必要なライブラリをインポートしちゃいます。

必要なページのアドレスを送って

resp, err := http.Get(url)

 

保存先を作成したら

out, err := os.Create(filepath.Join(saveBaseDir, saveFilename))

 

中身を保存しちゃう

_, err = io.Copy(out, resp.Body)

 

これだけでOK

エラー処理は適当にしちゃうけど、短いコードで出来るので

難しく考えなくてもいいのは気軽でいい。

 

Goでテキストファイル読み込みと文字コード

Goでテキストファイルを読み込んで処理しようとすると

必ず文字コードで引っかかる。

なんとも面倒な事なんですが、とりあえず日本語ならShift_JISエンコードしちゃいます。

ファイル読み込みと同時に処理しちゃうのが楽ですけどね。

 

↓↓ とりあえずいつものようにライブラリを go getしちゃいます。

pkg.go.dev

 

↓↓ インストールできたら、importします。

"golang.org/x/text/encoding/japanese"
"golang.org/x/text/transform"

 

これで準備OKです。

↓↓ 適当なテキストファイルを読み込んで、エンコードしちゃいます。

var temp string

fp, err := os.Open(filename)
if err != nil {
panic(err)
}
 
sjisScanner := bufio.NewScanner(transform.NewReader(fp, japanese.ShiftJIS.NewDecoder()))

for sjisScanner.Scan() {
temp += sjisScanner.Text()
//fmt.Println(sjisScanner.Text())
}

fp.Close()

for文で一行毎に処理していく感じですけね。

これが一番お気楽な感じがします。

まぁ、早さとかを求めたらもっと効率がいい方法があるかもしれませんw

とりあえず、Goをカジュアルに使いたいので、これでヨシとします。

 

 

Go で Wordcloudを使う方法

ここを参考にしてみたんですけど、

>>Goで青空文庫の小説からWordCloud作ってみた - Qiita

まぁ、上手くいきませんw

初心者には難しことこの上ないww

 

とりあえずライブラリを go get しちゃいます。

>>GitHub - psykhi/wordclouds: Wordclouds in go

ここまでは特に問題ない。

 

とりあえずサラサラとコードを書いていったら

上手く実行できません・・・

まず、フォントを指定するんですけど、どうもこのライブラリは

ttfしか対応してないようです。

Macを使ってたので適当なttcを指定していたら、例外エラーになって

ひとしきり悩みましたw

あと、デフォルトでColorsを指定してあげないと、画像は生成されるけど、

BackgroundColorで指定した色の画像だけが生成されるw

文字色をしていしない場合は黒色で生成されると思ってたから、これも悩んだ!

エラーになれば初心者でも分かるんだけどな・・・

 

だからとりあえず文字色作って ↓↓

// なぜか文字だけ表示されない!!!
// 意味がわからないぞー
// ↓ 結果、デフォルトのフォントカラーを指定しないとダメみたい
var DefaultColors = color.RGBA{
{0x1b, 0x1b, 0x1b, 0xff},
{0x48, 0x48, 0x4B, 0xff},
{0x59, 0x3a, 0xee, 0xff},
{0x65, 0xCD, 0xFA, 0xff},
{0x70, 0xD6, 0xBF, 0xff},
}
colors := make(color.Color, 0)
for _, c := range DefaultColors {
colors = append(colors, c)
}

 

こんな感じに設定して ↓↓

w := wordclouds.NewWordcloud(
wordlist,
wordclouds.Height(2048),
wordclouds.Width(2048),
wordclouds.RandomPlacement(false),
wordclouds.FontMaxSize(800),
wordclouds.FontMinSize(10),
wordclouds.FontFile("./ipaexg.ttf"),
wordclouds.Colors(colors),
wordclouds.BackgroundColor(color.RGBA{0, 0, 0, 255}),
)

 

生成されたのがコレ!!  ↓↓

羅生門を解析した結果だけど、意外なほどカッコよくないですか?

羅生門