• トップ
  • ブログ一覧
  • 【最終回】Go言語(Golang)入門~Twitterアプリ作成完了編~
  • 【最終回】Go言語(Golang)入門~Twitterアプリ作成完了編~

    笹川(エンジニア)笹川(エンジニア)
    2019.12.18

    IT技術

    最終回~Go言語(Golang)入門~

    笹川笹川先生

    (株)ライトコードの笹川(ささがわ)です!

    引き続き、ツイートを猫語に変換する「にゃイッター」作っていきます!

    簡単なTwitterアプリです。

    詳しくは、前回の記事をご覧ください。

    それでは、早速進めていきます!

    前回の記事はこちら

    featureImg2019.12.12【第14回】Go言語(Golang)入門~Twitterアプリ作成編~第14回~Go言語(Golang)入門~笹川先生(株)ライトコードの笹川(ささがわ)です!そろそろレベルも上がり、Go...

    猫語変換処理を実装

    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の部分は、HTMLCSS(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入門本

    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る
    Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る

     

    こちらの記事もオススメ!

    featureImg2020.08.08Go言語 特集知識編人気急上昇中のGo言語(Golang)って何だ?実装編Go言語(Golang)入門...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    第1回の記事はこちら

    featureImg2019.09.13【第1回】Go言語(Golang)入門~環境構築編~第1回~Go言語(Golang)を習得したい!~笹川先生(株)ライトコードでモバイルアプリケーション開発をしている笹川...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    笹川(エンジニア)

    笹川(エンジニア)

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background