15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Google Cloud PlatformAdvent Calendar 2014

Day 5

新しくて古い: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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?