【最終回】Go言語(Golang)入門~Twitterアプリ作成完了編~
IT技術
最終回~Go言語(Golang)入門~
(株)ライトコードの笹川(ささがわ)です!
引き続き、ツイートを猫語に変換する「にゃイッター」作っていきます!
簡単なTwitterアプリです。
詳しくは、前回の記事をご覧ください。
それでは、早速進めていきます!
前回の記事はこちら
猫語変換処理を実装
POSTで受け取った値を置換する処理で、「猫語変換」をします。
ReplaceAllを使うと一括置換が出来ます。
1strings.ReplaceAll(target, before, after)
今回は、文字列 map の Key を、Value に変換するように実装します。
なぜ、文字列 map で管理するかと言うと、Go言語(Golang)が分からない人でも、どのように変換されるか解るようにしたかったからです。
簡単な仕組みのアプリですので、気軽にPR(プルリクエスト)や issue(イシュー)を作るなど、笹川以外の人にも開発してもらえたら面白いなと思っているので、このようにしております。
変換処理と対称
変換処理は、こんな感じですね!
1 for key, value := range keyword {
2 message = strings.ReplaceAll(message, key, value)
3 }
ちなみに変換対象は、こんな感じにしてます。(2019/11/21 現在)
1var keyword = map[string]string{
2 "oh": "オオン",
3 "oh...": "オオオオオオン",
4 "バキューン": "ニャオーン",
5 "わおーん": "ニャオーン",
6 "うま言う": "ちょw誰が上手いこと言えって言ったにゃww",
7 "まだ": "まだにゃ",
8 "した": "したにゃ",
9 "った": "ったにゃ",
10 "です": "ですにゃ",
11 "よう": "ようにゃ",
12 "ねこ": "にゃーん (=・ω・=)",
13 "な": "にゃ",
14}
一部おかしい変換があるのは、Twitter上で案を出してもらったりしたのを、そのまま採用したからです(笑)
140文字制限の対応
あと、Twitterには投稿する際に140文字の制限がありますので、そちらも忘れずに対応します。
1 utf8Message := utf8string.NewString(message)
2 size := utf8Message.RuneCount()
3 if size > 120 {
4 return c.JSON(http.StatusBadRequest, "string length over")
5 }
日本語はマルチバイトなので、 len(target) では正しく取れませんので注意してください。
文末が 「にゃ」 で終わっていたら 「にゃん」 になるようにします。
1 if strings.HasSuffix(message, "にゃ") {
2 message += "ん"
3 }
最後にハッシュタグを付けます。
1message += "\n#にゃイッター"
全体
全体としては、こんな感じになります。
1package nyaitter
2
3import (
4 "net/http"
5 "strings"
6
7 "github.com/labstack/echo"
8 "golang.org/x/exp/utf8string"
9)
10
11var keyword = map[string]string{
12 "oh": "オオン",
13 "oh...": "オオオオオオン",
14 "バキューン": "ニャオーン",
15 "わおーん": "ニャオーン",
16 "うま言う": "ちょw誰が上手いこと言えって言ったにゃww",
17 "まだ": "まだにゃ",
18 "した": "したにゃ",
19 "った": "ったにゃ",
20 "です": "ですにゃ",
21 "よう": "ようにゃ",
22 "ねこ": "にゃーん (=・ω・=)",
23 "な": "にゃ",
24}
25
26// ReplaceMessge 文字列置換
27func ReplaceMessge(c echo.Context) error {
28 message := c.FormValue("message")
29 utf8Message := utf8string.NewString(message)
30 size := utf8Message.RuneCount()
31 if size > 120 {
32 return c.JSON(http.StatusBadRequest, "string length over")
33 }
34 for key, value := range keyword {
35 message = strings.ReplaceAll(message, key, value)
36 }
37
38 if strings.HasSuffix(message, "にゃ") {
39 message += "ん"
40 }
41
42 message += "\n#にゃイッター"
43
44 if utf8string.NewString(message).RuneCount() >= 140 {
45 return c.JSON(http.StatusBadRequest, "string length over")
46 }
47
48 return c.JSON(http.StatusOK, message)
49}
echoインスタンス側への実装に、下記を追加したら完了です。
1e.POST("/replace", nyaitter.ReplaceMessge)
これで、下記のようにリクエストをすると、変換された文字列が返却されます。
1curl --request POST --url http://localhost:3022/post --data message=これで変換できたかな
おそらくレスポンスは、下記の感じになったはずです。
1"これで変換できたかにゃん\n#にゃイッター"
これで、猫語変換の実装は完了です!
Go言語(Golang)側の実装は、残すところ後「1つ」です。
HTMLテンプレートの実装
実際のUIの部分は、HTML と CSS(Bootstrap) と JS で構築します。
echoの設定
Go言語(Golang)側の実装は、echo の設定をまず行います。
1package server
2
3import (
4 "html/template"
5 "io"
6
7 "github.com/labstack/echo"
8 "github.com/noriyuki-sasagawa/nyaitter_api/nyaitter"
9 "github.com/noriyuki-sasagawa/nyaitter_api/page"
10 "github.com/noriyuki-sasagawa/nyaitter_api/twitter"
11)
12
13// RunAPIServer APIサーバー実行
14func RunAPIServer() {
15 t := &Template{
16 templates: template.Must(template.ParseGlob("./public/views/*.html")),
17 }
18 e := echo.New()
19 e.Static("/css", "public/views/css")
20 e.Static("/js", "public/views/js")
21 e.File("/header.png", "public/views/header.png")
22 e.Renderer = t
23 e.GET("/", page.Index)
24 e.GET("/tweet", page.Tweet)
25 e.GET("/auth", twitter.AuthTwitter)
26 e.GET("/callback", twitter.Callback)
27 e.POST("/post", twitter.PostTwitterAPI)
28 e.POST("/replace", nyaitter.ReplaceMessge)
29 // サーバーを開始
30 go func() {
31 if err := e.Start(":3022"); err != nil {
32 e.Logger.Info("shutting down the server")
33 }
34 }()
35}
36
37// Render テンプレートレンダリング
38func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
39 return t.templates.ExecuteTemplate(w, name, data)
40}
41
42// Template テンプレート
43type Template struct {
44 templates *template.Template
45}
今までの実装の部分も載っていますが、大事なのはここの部分です。
1 e.Static("/css", "public/views/css")
2 e.Static("/js", "public/views/js")
3 e.File("/header.png", "public/views/header.png")
CSS と JS を読み込むための設定と、ヘッダー画像として使っている画像の絶対パスをここで設定しています
この設定を忘れると、HTMLファイル上では問題なく表示できるのに、Go言語(Golang)上では表示が崩れてしまいます。
HTMLのルーティング
HTMLのルーティングは、下記のように実装してます。
1package page
2
3import (
4 "net/http"
5
6 session "github.com/ipfans/echo-session"
7 "github.com/labstack/echo"
8)
9
10// Index index.html
11func Index(c echo.Context) error {
12 return c.Render(http.StatusOK, "index.html", nil)
13}
14
15// Tweet tweet.html
16func Tweet(c echo.Context) error {
17 return c.Render(http.StatusOK, "tweet.html", nil)
18}
それぞれのルートで、それぞれの HTML を読み込むだけです。
これでGo言語(Golang)側の実装は、ほとんど終わりになります。
HTML(フロント)側の実装
今回は、Go言語(Golang)の記事なので、HTML側の実装の詳細は割愛させていただきます。
基本的な流れ
【1】
index.htmlでTwitterログイン機能がある ./auth へアクセスさせるようなボタンを用意します。
【2】
Twitterログインが完了したら ./callbackへ戻ってきますので、そのままtweet.htmlを表示します。
【3】
tweet.htmlでは、textareaで入力してもらった値を、Ajaxで ./replace に対してリクエストして、戻ってきた値をもう一つのプレビュー用の textara に表示します。
【4】
入力後にツイートする用のボタンをタップするとツイートされ、ボタンの下にツイートのリンクが表示されます。
にゃイッター完成!
そして、完成したアプリはこちらになります。
にゃイッターのソースは、以下のリポジトリで確認してください。
【リポジトリ】
https://github.com/noriyuki-sasagawa/nyaitter
連載を振り返ってみて
Go言語(Golnag)入門として、様々な実装を試してきましたが、いかがでしたでしょうか?
この15回の合間に笹川の個人アプリのAPIも全て、JavaからGo言語(Golang)へのリプレースが完了しました。
もう、すっかりGo言語(Golang)の人となってしまいました(笑)
笹川の感想としては、書きやすさや環境構築の手間などを考えれば、今後のAPI開発もGo言語(Golang)を続けていきたいなぁと思っています。
あと、注意していただきたいのは、他の言語でも同じようなことは十二分にできます。
そのため、絶対的にGo言語(Golang)が優れているわけではないという事です。
ご自身の技術力やチームやプロダクトの状態を考慮し、適切な技術選定をしていただくのが大前提です。
この入門記事は、Go言語(Golang)の習得を始めてみたり、困ったときに読んでいただければ幸いです。
皆様のお力になれれば、そんな嬉しいことはございません…!
長い間、お付き合いいただきありがとうございました!!
また、別の記事でお会いしましょう!
過去の記事で取り扱ったサンプル実装について
なお、過去の記事で取り扱ったサンプル実装は、全て以下のリポジトリにて管理しています。
【リポジトリ】
https://github.com/noriyuki-sasagawa/go_example/
オススメのGo入門本
こちらの記事もオススメ!
2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
第1回の記事はこちら
2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
新潟生まれ新潟育ち本業はモバイルアプリエンジニア。 日々、猫(犬)エンジニアとして活躍中!
おすすめ記事
immichを知ってほしい
2024.10.31