Skip to content

Instantly share code, notes, and snippets.

@siteshen
siteshen / log_utils.py
Created September 27, 2022 03:04
Customizable decorator logging the input, output, exception, and cost of a function call.
import functools
import logging
import time
def log_func(
logger: logging.Logger,
*,
log_input=True,
input_level=logging.WARNING,
@siteshen
siteshen / api-design.org
Created April 13, 2022 03:22
API 设计对比

API 设计对比

常见的 API 设计方式

随心所欲

HTTP 请求优点缺点得分
GET /create/user?username={username}不需要思考罄竹难书1

API 设计对比

常见的 API 设计方式

随心所欲

HTTP 请求优点缺点得分
GET /create/user?username={username}不需要思考罄竹难书1
GET /list/user/by-page/{pageNo}
[
{
"longitude" : 116.383,
"city_name_en" : "Beijing",
"province_url" : "/wiki/Beijing",
"full_name_en" : "Beijing:Beijing",
"city_url" : "/wiki/Beijing",
"province_name_en" : "Beijing",
"latitude" : 39.917,
"city_name_cn" : "北京市"
@siteshen
siteshen / merge_sort.go
Last active March 30, 2018 06:07
A merge sort algorithm implementation in Go.
package main
import (
"math/rand"
"sort"
"time"
)
func merge(xs, ys []int) []int {
sizex, sizey := len(xs), len(ys)
@siteshen
siteshen / domains.txt
Created March 29, 2018 06:49
How to use letsencrypt.org in qiniu storage service with https://github.com/Neilpang/acme.sh
# 1 domain per line
# *ALL* domains use the same ssl certificate
my.domain1.com
my.domain2.com
@siteshen
siteshen / version.go
Created December 22, 2017 02:36
A simple version implementation in in Go.
package version
import (
"strconv"
"strings"
)
type Version struct {
Major int
Minor int
@siteshen
siteshen / sqla_pagination.py
Created October 11, 2017 07:14
SQLAlchemy keyset && offset/limit pagination query mixin
class PaginationMixin(object):
def paginate(self, order_by=None, order_dir=None, limit=None, cursor=None, page=None):
assert not page or not cursor, 'should not combine cusor and page'
# convert arguments
if isinstance(order_by, str):
order_by = getattr(self._primary_entity.expr._identity_class, order_by)
# check arguments
@siteshen
siteshen / bearychat_dinner.js
Created November 8, 2016 04:32
List bearychat food count in bearychat group.
// Bookmarklet
//
// javascript:function listFoods(beginStr, endDateStr, foodBlacklist) { var _es = document.querySelectorAll('.Message-wrapper'); var es = Array.slice.call(0, _es); es.reverse(); var counts = {}; for (var e of es) { var author = e.querySelector('.author'); var message = ''; for (var sube of e.querySelectorAll('.Message-body')) { message += sube.innerText; } message = message.trim(); if (message.match(beginStr)) { break; } if (!foodBlacklist.includes(message)) { counts[message] = counts[message] || []; counts[message].push(author && author.innerText.trim()); } var ended = false; for (var b of e.querySelectorAll('.Message-body')) { var date = e.querySelector('.Messages-date'); if (date && date.innerText.trim() === endDateStr) { ended = true; } } if (ended) { break; } } var strs = []; for (var k of Object.keys(counts)) { var str = k + '(' + counts[k].length + '份): ' + counts[k].join(', '); strs.push(str); } return strs;}var foods = listFoods('大家订餐了', '今天', ['@讨论组']);alert(foods.join('\n'));for (
@siteshen
siteshen / nginx.conf
Created August 22, 2016 16:58
Example nginx.conf of system maintaining.
server {
location / {
default_type application/json;
return 400 '{"data": {}, "meta": {"error_message": "系统维护中,预计5点完成", "success": false}}';
}
location /api {
default_type 'text/html';
return 200 '<center style="padding: 16em 0; color: #333;"><h1>系统维护中</h1><p>系统正在进行停机维护,预计8月23日凌晨5点完成。</p></center>';
}