#37 使用 Gravatar(全球认证头像)

2013-12-09

如何获取 Gravatar 头像地址?

PHP

$email_address = 'abc@xyz.com';
$default = '';
$size = '';
$url = 'https://www.gravatar.com/avatar/' + md5(strtolower(trim($email_address)))

Python

email_address = 'abc@xyz.com';
default = '';
size = '';
"https://www.gravatar.com/avatar/" + hashlib.md5(email.lower()).hexdigest() + "?" + urllib.urlencode({'d':default, 's':str(size)})

其他语言类似。

支持的GET 参数:

  • s/size:用户头像的尺寸,单位为像素,可选值:1 - 512,默认为 80,即 80 * 80。
  • d/default:默认头像,在 email 关联的头像无法获取到的时候作为返回值,格式为 urlencode($default_avatar_url)

除了制定一个 URL 之外,还可以使用以下值:

  • 404:不加载图片,直接返回 404 响应。
  • mm:表示神秘的家伙,返回一个固定的简单卡通人物轮廓。
    b032cbf256037fbfbb6b9aa8b29acd70 (1).png
  • identicon:一个基于电子邮件哈希值的抽象图案
    b032cbf256037fbfbb6b9aa8b29acd70 (3).png
  • monsterid:产生一个不同颜色和面部的怪物
    b032cbf256037fbfbb6b9aa8b29acd70 (2).png
  • wavatar:产生不同的特征和杯具的脸。。。
    b032cbf256037fbfbb6b9aa8b29acd70.png

  • r/rating:类似于电影评级,头像也有级别的管理,避免将将某些头像显示在了不合时宜的场所,可选值:g | pg | r | x

更多详情参见:https://en.gravatar.com/site/implement/

#36 Git 基础

2013-12-03

Linus 为了托管内核代码的方便,创建了 Git。
之前,Linux 开发者使用的是 BitKeeper,不过社区对这个私有工具总是不放心,然后 BitKeeper 方面对于部分开发者试图逆向工程不满。

对于大多数公司来说, Git 的设计颇为复杂。
但是没办法,现在 Git 已经成为大多数开发者的选择。

基础命令

  • git config 配置
  • git init 初始化当前目录为 git 仓库
  • git clone 克隆一个远程仓库到本地
  • git add 添加变更(提交之前的挑选)
  • git commit 提交变更
  • git push 推送变更到远程仓库
  • git pull 拉取远程仓库变更,并合并到本地;等于 git fetch + git merge
  • git status 查看变更状态
  • git log 查看提交历史
  • git branch 分支管理
  • git checkout 切换分支
  • git fetch 拉取远程仓库变更
  • git merge 合并分支

示例

git config --global user.name "Your Name"
git config --global user.email "your@email.com"

git clone git@github.com:your-username/example
cd example

# 创建新文件
echo "hello" > newfile
git add newfile
git commit -m "Add newfile"

git push origin master

参考资料与拓展阅读

#34 曹操:让县自明本志令

2013-11-14

又名《述志令》,是曹操难得留世的一篇散文。
曹操欲借此表明本志,叙述自己的志向,表明立场,回应朝野质疑,已消除人们对自己“不逊之志”的揣测,有相当的政治目的。
我虽不是文艺青年,但看到这篇文章,但还是觉得文采飞扬,有大气魄。

#33 转载:SQL 注入一点小心得

2013-11-10

好久没写技术博客,最近研究产品关于用户体验方面较多,加上项目突然比较多,设计原型、跟进开发、设计师等工作着实没时间写博客。
接下来技术上主要 php 深入学习和 mysql 优化。这两天看了关于 sql 注入方面的知识,拿出来分享一下 :)

#30 转载:如何掌握程序语言

2013-10-22

学习程序语言是每个程序员的必经之路。可是这个世界上有太多的程序语言,每一种都号称具有最新的“特性”。所以程序员的苦恼就在于总是需要学习各种稀奇古怪的语言,而且必须紧跟“潮流”,否则就怕被时代所淘汰。
作为一个程序语言的研究者,我深深的知道这种心理产生的根源。程序语言里面其实有着非常简单,永恒不变的原理。看到了它们,就可以在很短的时间之内就能学会并且开始使用任何新的语言,而不是花费很多功夫去学习一个又一个的语言。

#29 转载:脚下的流沙

2013-10-17

这么多年来,一直是我脚下的流沙裹着我四处漂泊,它也不淹没我,它只是时不时提醒我,你没有别的选择,否则你就被风吹走了。我就这么浑浑噩噩地度过了我所有热血的岁月,被裹到东,被裹到西,连我曾经所鄙视的种子都不如。

#28 Tornado 1,2,3

2013-10-13

Tornado web server 是使用 Python 编写出來的一个极轻量级、高可伸缩性和非阻塞 IO 的 Web 服务器软件,著名的 Friendfeed 网站就是使用它搭建的。

Tornado 跟其他主流的 Web 服务器框架(主要是 Python 框架)不同是采用 epoll 非阻塞 IO,响应快速,可处理数千并发连接,特别适用用于实时的 Web 服务。

要使用它,必须按照以下套件:

1)Python(建议使用 Python 2.5 / Python 2.6)
2)Simplejson(建议使用 simplejson 2.0.9)
3)cURL(建议使用 curl 7.19.7 或以上版本)
4)Pycurl(建议使用 pycurl 7.16.2.1)
5)Tornado Web Server(这才是主角,版本就照官網上最新的安裝吧)

一个最简单的服务:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

在 Tornado 中运行 Django

#!/usr/bin/env python
# *-* encoding: utf-8 *-*

import os
import sys
import tornado.web
from tornado import autoreload
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.web import url
from django.conf import settings
from django.core.handlers.wsgi import WSGIHandler

if not os.path.dirname(__file__) in sys.path[:1]:
    sys.path.insert(0, os.path.dirname(__file__))

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            url(r"/static/(.+)", tornado.web.StaticFileHandler, dict(path=settings.MEDIA_ROOT), name='static_path'),
            url(r"/media/(.+)", tornado.web.StaticFileHandler, dict(path=settings.MEDIA_ROOT), name='media_path'),
        ]
        handlers.append(('.*', tornado.web.FallbackHandler, dict(fallback=WSGIContainer(WSGIHandler()))))

tornado.web.Application.__init__(self, handlers)
http_server = HTTPServer(Application())
http_server.listen(8080)
loop = IOLoop.instance()
autoreload.start(loop) #自动加载修改过的代码
loop.start()