2010年7月アーカイブ

ユーザに提供するのは、機能やサービスではなく
''価値'''を提供することをということを念頭に
下記を3原則とし「ものづくり」をしているとのことです。
(料理も作ることなので、つくるつながりはよいと思いました。)

1, 無限実行
事前にリリース予定などの告知はしない。見えないものを伝えるのは困難だし誤解を生じやすくユーザを混乱させる。事前告知の効果もはっきりしないので、しないほうがよい

2, 無限語化
HelpやFAQなどは準備しない。ユーザがマニュアルやFAQを必要とするサイトはどこかに問題があるので、それを解決するほうが先。ユーザが2秒で理解できないものは問題がある。

3, サービスに値段をつける
Webサービスは無料で提供しているものが多いが、無料であることがサービス提供側の言い訳になる恐れがあり、クオリティが低下する。サービスに予め値段をつけることで、そういう状況を回避できる。
(http://d.hatena.ne.jp/atyks/20090201/1233421922の下に書いてあります)

おもしろい考え方だと思いました。

下記がコードサンプル、create_indexは忘れずに。

#!/usr/bin/env python

import binascii
import struct
import datetime
import hashlib
rom pymongo import Connection
from time import sleep

reconnect_times = 10
reconnect_counter = 0
dbsetting = {'dbhost':'localhost','dbname':'shorturldb'}

def con(**kwargs):

    global reconnect_counter
    global reconnect_times

    if 'host' not in kwargs:
        kwargs['host'] = dbsetting['dbhost']
    dbname = dbsetting['dbname']

    try:
        _con = Connection(**kwargs)
        return eval('_con.'+dbname)

    except Exception, e:

        sleep(0.1)

        print('Fail to excute %s [%s]' % ( __name__, e))
        if reconnect_counter == reconnect_times:
            reconnect_counter = reconnect_counter + 1
            con(**kwargs)


def save_hash(url, length=5):
    base32 = [
            'a', 'b', 'c', 'd', 'e',
            'f', 'g', 'h', 'i', 'j',
            'k', 'l', 'm', 'n', 'o',
            'p', 'q', 'r', 's', 't',
            'u', 'v', 'w', 'x', 'y','z',
            'A', 'B', 'C', 'D', 'E',
            'F', 'G', 'H', 'I', 'J',
            'K', 'L', 'M', 'N', 'O',
            'P', 'Q', 'R', 'S', 'T',
            'U', 'V', 'W', 'X', 'Y','Z',
            '0', '1', '2', '3', '4',
            '5', '6', '7', '8', '9'
            ]
    hex = hashlib.md5(url).hexdigest()
    hexLen = len(hex)
    subHexLen = hexLen/8
    output = []
    mydb = con()
    for i in range(0, subHexLen):
        subHex = hex[i*8:(i*8)+8]
        num = 0x3FFFFFFF & int('0x'+subHex, 0)
        hash = '';
        for j in range(0,length):
            val = 0x0000003D & num
            hash = hash + base32[val]
            num = num >> length
        r = mydb.shorturl.find_one({'i':{'$in':[hash,url]}})
        if not r:
            insert = {'i':[hash,url],'p':datetime.datetime.utcnow()}
            mydb.shorturl.insert(insert)
            return hash

        elif r and r['i'][1] == url:
            return r['i'][0]
    return None

def get_hash(url):
    mydb = con()
    r = mydb.shorturl.find_one({'i':{'$in':[url]}})
    if r:
        return r['i'][0]
    return None

このアーカイブについて

このページには、2010年7月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2010年6月です。

次のアーカイブは2010年8月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。