PythonでRedisに書き出して有効期限も設定する

2014-07-26
このエントリーをはてなブックマークに追加

Redisは頻繁に使ってます。データベースとして使うって言うよりテンポラリキャッシュとして使うケースのほうが多いです。

import redis

_redis = redis.Redis(
    host=REDIS_HOST,
    port=REDIS_PORT,
    db=REDIS_DB)

_redis.set('key', 'value')
_redis.expire('key', 90)

有効期限の設定方法がわかりにくいというかピンとこなくて悩んだのでメモ。「キーに対してバリューと有効期限を設定する」っていうよりも「キーにバリューを設定、キーに有効期限を設定」っていう2段階、ってイメージでしょうか。

expireで指定する値は秒数。上記で90秒間有効です。

Python 2.7.5、redis 2.9.1(本体じゃなくてパッケージのほう)

Tags: ,

golangで画像ファイルをリサイズしてファイル書き出ししないで出力する

2014-07-19
このエントリーをはてなブックマークに追加

コードは前回のエントリ(golangで静的ファイルを出力する)への追加になってます。

いちいちファイルをローカルに書き出ししないで出力したいケースに使います。リサイズ自体はnfnt/resizeがよく使われてるっぽいのでこちらを。

go get github.com/nfnt/resize

でインストール。

package main

import (
	"github.com/nfnt/resize"
	"image"
	"image/jpeg"
	"net/http"
	"os"
)

func StaticHandler(w http.ResponseWriter, r *http.Request) {

	http.ServeFile(w, r, "img.jpg")
}

func ResizeHandler(w http.ResponseWriter, r *http.Request) {

	_file, err := os.Open("img.jpg")
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	_image, _, err := image.Decode(_file)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	_resized := resize.Resize(320, 0, _image, resize.NearestNeighbor)

	jpeg.Encode(w, _resized, nil)
}

func main() {
	http.HandleFunc("/foo.jpg", StaticHandler)
	http.HandleFunc("/bar.jpg", ResizeHandler)
	http.ListenAndServe(":15100", nil)
}

image.Decode(_file) で生成されたオブジェクトはExif情報は破棄されるようです。ので、事前にExif読んで縦画像であれば回転させる処理も追加しないとです。そこは次回調べておこう。

Tags:

golangで静的ファイルを出力する

2014-07-19
このエントリーをはてなブックマークに追加

非常に簡単です。
ファイルをダウンロードさせたり、デバイスによってファイル出し分けたり。

package main

import (
	"net/http"
)

func StaticHandler(w http.ResponseWriter, r *http.Request) {

	http.ServeFile(w, r, "img.jpg")
}

func main() {
	http.HandleFunc("/foo.jpg", StaticHandler)
	http.ListenAndServe(":15100", nil)
}

Tags:

golangでMySQLに接続

2014-07-18
このエントリーをはてなブックマークに追加

新しい言語の勉強始めたら最初は掲示板を作る、っていうのが自分のなかでパターン化してるのでそれに向けてまずはgolangからMySQLにつないでみた。ORM使えばこのへんは意識しないでいいんだろうけど、まあ触っておいて損はしないでしょ。

ドライバはgo-sql-driver/mysql使いました。インストールは

go get github.com/go-sql-driver/mysql

だけ。GOPATHが通ってないとめんどくさい。最初それでそこそこの時間溶かした。

package main

import (
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"os"
)

func main() {

	var pub_date string
	var mod_date string

	db, err := sql.Open("mysql", "user:passwd@/some_db")
	if err != nil {
		os.Exit(1)
	}

	rows, err := db.Query("select pub_date, mod_date from some_table;")
	if err != nil {
		fmt.Println("ERROR")
		os.Exit(1)
	}

	for rows.Next() {
		rows.Scan(&pub_date, &mod_date)
		fmt.Println(pub_date, mod_date)
	}
}

取ってきたフィールドが日付型なのは特に意味は無いです。golangには日付型が見当たらなかったのでどうなんのかなー、って。rowは構造体にしてそれを内包したmapを返却するようにしてラップすればいいのかな。

Tags: ,

golangで構造体をjsonとして出力

2014-07-15
このエントリーをはてなブックマークに追加

PythonのDictionaryみたいなのがあるのを期待してたんだけどそういう便利なものはなくて構造体を使うっぽい。

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

type SomeStruct struct {
	ID   int
	Name string
}

func StructHandler(w http.ResponseWriter, r *http.Request) {

	_struct := SomeStruct{1, "some string"}
	_json, err := json.Marshal(_struct)

	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	w.Header().Set("Content-Type", "application/json")
	w.Write(_json)
}

func main() {
	http.HandleFunc("/struct.json", StructHandler)
	http.ListenAndServe(":15100", nil)
}

Tags: ,

golangでjsonを返却するapi

2014-07-12
このエントリーをはてなブックマークに追加

引き続きgolang。

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello World.")
}

func JsonHandler(w http.ResponseWriter, r *http.Request) {

	var body = map[string]int{
		"a": 0,
		"b": 1,
		"c": 2,
		"d": 3,
	}

	_json, err := json.Marshal(body)

	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
	w.Header().Set("Content-Type", "application/json")
	w.Write(_json)

}

func main() {
	http.HandleFunc("/", handler)
	http.HandleFunc("/hello.json", JsonHandler)
	http.ListenAndServe(":15100", nil)
}

/hello.jsonへのリクエストで呼ばれるJsonHandlerが追加された部分。mapの使い方はこれでいいんだろうか。Pythonの辞書みたいにキーによってデータの型が違うっていうのは書けないのかなぁ。

Tags: ,

golangでhttp

2014-07-10
このエントリーをはてなブックマークに追加

勉強しておこうと思い立ったはいいけど全然時間取れなくてちゃんと身についてないgolang。

と、@yosida95 にハードルあげられっぱなしで1年経ってしまい自己嫌悪の嵐なので、自分のケツに火をつける意味も含めてブログに書き残していこう。更新が滞ったら勉強が疎かになっているということで。

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello World.")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":15100", nil)
}

hello.goというファイルをつくって上記を書き、

go run hello.go

もしくは

go build hello.go
./hello

go buildでhelloという実行ファイルが生成されます。

curl http://127.0.0.1:15100/

して、Hello World.が返ってきたら成功。

Tags:

Pythonのsetter、getter

2014-07-10
このエントリーをはてなブックマークに追加

ハセテツはこう書いてますよというメモ。

# -*- encoding: utf-8 -*-


class SampleClass(object):

    def __init__(self):
        self._params = None

    @property
    def params(self):
        return self._params

    @params.setter
    def params(self, v):
        self._params = v


if __name__ == '__main__':
    _obj = SampleClass()
    _obj.params = {'foo': 'bar'}
    print _obj.params
Tags: