LoginSignup
15
13

More than 5 years have passed since last update.

新しくて古い:GAE/Goでガラケー(フィーチャーフォン)用ページの表示

Last updated at Posted at 2014-12-04

技術において行かれないように、必死なおっさんが初めてAdvent Calendarに挑戦してみます!

前置き

結局、日本で展開を考えた時って、ちょっと前のものもサポートしないといけないですよね。ということで、GAE/Goを使って社内システムを作ったのですが、ガラケー(フィーチャーフォン)をサポートしないといけなかったので、その時やったことを書いておきます。

必要なものたち

importで必要なやつ
import (

    "code.google.com/p/go.text/encoding/japanese"
    "code.google.com/p/go.text/transform"
    "github.com/gin-gonic/gin"

    "html/template"
    "fmt"
    "io/ioutil"
    "strings"

)

今回は、このくらいを使ってみます。もちろん、他のふつーのやつも必要なので適宜入れてください。
上の3つは、そのURLに行けば入れ方が丁寧に書いてあります。

UA判定/ガラケー判定

いい感じにやってください。ここはガラケーに限った話じゃないと思いますので。
もし、手抜きで判定したい場合は、こんな感じ。

UA判定っぽいやつ(手抜き)
func isMobileUA(ua string) bool {
    fua := [...]string{
        "DoCoMo",
        "KDDI",
        "DDIPOKET",
        "UP.Browser",
        "J-PHONE",
        "Vodafone",
        "SoftBank"}

    for i := 0; i < len(fua); i++ {
        if strings.Contains(ua, fua[i]) {
            return true
        }
    }
    return false
}

ShiftJISへの文字コード変換

ガラケーといえば、やっぱふつーShiftJISですよね。ということで、変換の処理が必要です。上のimportのやつを使わせてもらって、こんな感じで実装します。

ShiftJISへの変換っぽいやつ
func toSjis(str string) (string, error) {
    ret, err := ioutil.ReadAll(transform.NewReader(strings.NewReader(str), japanese.ShiftJIS.NewEncoder()))
    if err != nil {
        return "", err
    }
    return string(ret), err
}

ページ表示用のとこ

今回は、"html/template"を使いました。さらに!なぜか、Gin Web Frameworkを使わせてもらいました。ガラケーの部分だけだと使う必要がないとしても!

※古いものをサポートするコードを書くときには、コードも古めかしい感じがいいですよね。Goっぽかったり、ぽくなかったりの部分がありますが、変数名などはカッコ良くローマ字で書きましょう。例えば、UserMasterとかは、YuuzaMasutaと書くべきです。ほんとは全部大文字だとよりカッコいいです。
いにしえのプログラマの可読性のためにも!

ハンドラっぽいやつ
type PejiView struct {
    Namae  string
    Hyouji string
}

func init() {

    r := gin.New()

    r.GET("/gara", handlerPoi)

    http.Handle("/", r)

}

func handlerPoi(c *gin.Context) {

    isMobile := isMobileUA(c.Request.UserAgent())

    var pv PejiView
    pv.Namae = "なまえ"
    pv.Hyouji = "表示"

    var templateName string
    if isMobile {

        pv.Namae, _ = toSjis(pv.Namae)
        pv.Hyouji, _ = toSjis(pv.Hyouji)

        templateName = "template/indexfp.html"
        t := template.Must(template.ParseFiles(templateName))
        c.Writer.Header().Set("Content-Type", "text/html; charset=Shift_JIS")
        err := t.Execute(c.Writer, pv)
        if err != nil {
            c.String(500, "era- "+err.Error())
            return
        }
    }

}
indexfp.html(ShiftJISでファイル保存してください!)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>Kakkoii Peji</title>
</head>
<body>
    <center>
    <h1>最先端のカッコいいページ!</h1>
    {{.Namae}}さん。お疲れ様です。
    <br /> {{.Hyouji}}
</center>
</body>
</html>

完成!

こんな感じで、新旧折衷のカオスなコードをどんどん作って行きましょう!
わかり始めたマイグレーション。

以上!

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13