5 DuanJiaNing_

尚未进行身份认证

我要认证

越努力越幸运

等级
TA的排名 3w+

一. Go 为什么快?(译: 五件事让Go变得如此之快)

原文地址: five things that make go fast.本文并非完整翻译,只对原文关键部分进行提取归纳。正文:当人们谈论到为什么做出学习Go的决定时,往往会有不同的回答,但总有三个原因是他们都会谈及的:并发性(Concurrency)易于部署(Ease to deployment)性能(Performance)人们选择Go的一个重要原因是因为它快。Go的众多特性中...

2020-04-28 15:42:12

使用 ETag 以利用浏览器缓存,节省带宽

ETag 可以理解为服务端的一个资源标识,当两次请求相同的 URL,且 URL 对应的资源没有变化时 ETag 的值应该相同。合理使用 ETag 可以有效利用浏览器缓存,降低服务器的带宽压力。原理分析用户第一次通过 URL 请求资源时,服务器将为该资源生成 ETag(其值一般为MD5摘要),并通过响应头返回给浏览器,浏览器会将资源进行缓存。下次相同 URL 被请求时,浏览器将在请求中附加 If...

2020-04-24 15:16:54

GoMailer - 用 Go 开发的轻量电子邮件推送服务

GoMailer轻量电子邮件推送服务(A lightly email sending service for Go)通过form提交用户输入的数据,GoMailer会将这些数据填入预先定义好的邮件内容模板中,并帮你把内容投递到指定的邮箱。也可以选择把邮件暂存在GoMailer中,另外选择时间手动触发投递。额外的可选配置:支持开启reCaptcha验证,避免恶意投递配置请求成功或失败时...

2020-03-26 00:00:04

浏览器直接上传文件到 Cloud Storage,绕开 App Engine Request 最大 32M 限制

随着流量的增加,GCP App Engine 会自动为应用分配更多的资源,但自动分配资源仍然受到一些阀值的约束,其中一条便是:发送到应用的请求,请求体不能大于32M。而对于一些上传大文件的需求,这个限制使得那些将文件上传服务的 EndPoint 设置在 App Engine 上的应用无法正常处理请求。考虑到 App Engine 不允许应用操作本地存储,而且我们上传的文件一般也不会保存在本地,而...

2020-01-16 15:18:06

Go 实现简单的请求路由和中间件框架

go 中区分函数和方法,方法依附于对象,需要先创建对象,才能调用对象的方法;而函数是包级的,只要是公开的,那么通过包就可以访问。go 中定义新的类型有两种方式,类型别名和结构体:// 类型别名type Integer inttype Integer1 = int// 结构体type User struct { Name string Age int}此外,类型别...

2020-01-06 14:55:44

JetBrains 系列 IDE 快速部署项目到远程服务器

JetBrains 系列 IDE 一直是我开发的主力工具,在开发时往往选择在本机进行运行和调试。这样毫无疑问是很高效的开发方式,但有时我们希望在更接近于线上的环境中进行调试,那么如何使此次的修改快速见效(部署以及运行)是需要解决的关键问题之一。JetBrains GoLand、JetBrains WebStorm 和 IntelliJ IDEA 是我用得最多的 IDE,接下来以一个用 go 开发...

2019-12-12 11:07:14

grpc java client, go server 错误 io.grpc.StatusRuntimeException: UNAVAILABLE

java client 获取 channel 的代码如下: public ManagedChannel getChannel() { ManagedChannel channel = ManagedChannelBuilder.forAddress(config.getGrpc().getHost(), config.getGrpc().getPort()) ...

2019-11-14 15:30:10

地图应用如何优化 上: 数据请求和渲染方式

前端在基于 Google Map 的地图应用上渲染数据时一般以 tile 为单位请求数据。简单来说,屏幕上可见的地图区域是由多个 tile 拼接而成的,数据渲染以 tile 为单位,数据请求也以 tile 为单位。这样,前端只需要绘制可见的几个 tile ,以及预绘制边缘的几个 tile,而不是一次绘制,绘制一张大图,也就是整个世界地图。既然是基于地图的应用,那么应用数据往往与地理位置相关,G...

2019-10-28 15:23:17

Spring IOC 容器启动流程分析

Spring IOC 容器启动流程分析使用 Spring 时,XML 和注解是使用得最多的两种配置方式,虽然是两种完全不同的配置方式,但对于 IOC 容器来说,两种方式的不同主要是在 BeanDefinition 的解析上。而对于核心的容器启动流程,仍然是一致的。AbstractApplicationContext 的 refresh 方法实现了 IOC 容器启动...

2019-08-29 12:48:28

for 循环中取地址引发的错误

在for a,b := range c 遍历中, a 和 b 在内存中只会存在一份,即之后每次循环时遍历到的数据都是以值覆盖的方式赋给 a 和 b,a,b 的内存地址始终不变。以下是错误代码示例: p := []s2.Rect{} var rs []*s2.Rect for _, r := range p.Rect { rs = append(rs, &r) }因为...

2019-07-30 17:32:05

Google Cloud - 使用时值得注意的细节

在 instance 启动和停止时收到通知appengine 在进行自动扩缩时可能会频繁的停止或启动 instance,应用往往在启动时需要进行一些数据预热处理, appengine 提供了 /_ah/warmup 回调,在应用启动时得到通知,需要注意的是 /_ah/warmup 只有在自动扩缩(Automatic scaling)模式下生效。除了 warmup 回调外,/_ah/start ...

2019-07-19 16:33:27

Google Cloud - instance 间通信(pubsub + memcache 实现实例间通信和保证一致性)

GCP - appengine 通过 version 管理应用,你可以在 appengine 上部署多个 version(dev、qa等),而每个 version 可以有多个 instance,一个 instance 可简单理解为一个基于 Spring Boot 实现的微服务,当有请求到达时 appengine 会根据一定策略选择由哪一个 instance 处理该请求,如果现有的 instance...

2019-07-11 16:38:28

词素+词

词素+词语言结构的层次性:语法层面:词素、词、词组、分句、句子;语篇层面:句子、语段、语篇;词素粘附词素-词缀前缀: postwar coexist后缀:movement careless carelessness前后缀:unlucky coexistence否定前缀:in-(inactive) im-(imperfect) il-(illogical) ir-(irresponsib...

2019-05-07 07:39:45

六. 语句与语法:函数 + 列表生成式

函数在Python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。如果没有return语句,函数执行完毕后也会返回结果,只是结果为 None。return None可以简写为return。def square_of_sum(L): sum = 0 for item in L...

2018-12-14 16:00:39

五. 语句与语法:语句

输入输出s = input() 接收输入,接收为str型input(‘提示’) 先输出提示信息print(‘=’ * 20) 输出20次 =print(n,b,v,sep=’ - ’) 用-分隔n,b,v并输出print(1, 2, 3, 4, sep=’\n’, end=’ end’) 用换行分隔,最后输出endprint(‘f={:08,.4f}’.format(math.pi *...

2018-12-14 15:57:12

四. 数据类型:其它类型 + 文件

空对象 None布尔 bool:True、FalseTrue本质为 1(等且只等于),False本质为0(等且只等于)。True + 4 -> 5False – 3 -> -3注意:bool(3) -> Truebool(-3) -> Truebool(0) -> Falsebool(‘s’) -> Truebool([]) -> Fa...

2018-12-14 15:52:45

三. 数据类型:集合类型 + 映射类型

集合类型set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像。set存储的元素和dict的key类似,必须是不变对象借助list创建set,重复元素会被合并。s = set([1,2,34,1]) -> {1, 2, 34}s.add(11) -> {1,2,34,11}s.add(1) -> ...

2018-12-14 15:49:23

二. 数据类型:序列类型

分为可变和不可变序列。序列通用操作(以列表为例)生成序列list(‘abcd’) -> [‘a’,’b’,’c’,’d’]list(range(5)) -> [0,1,2,3,4]判断元素是否包含a = [1,2,3,4,’a’,’b’]1 in a -> True2 not in a -> False连接序列a = [1,2]b = [4,5]a ...

2018-12-14 15:45:12

一. 数据类型:基本数据类型

第一个 Python 程序解释器解释运行,源代码编译为pyc字节码,字节码会被缓存,提供下次运行速度,根据时间戳和版本判断是否需要重新编译。在PVM虚拟机中运行。Source(py) -> Byte code(pyc) -> Runtime(PVM)整数Python可以处理任意大小的整数,当然包括负整数,在Python程序中,整数的表示方法和数学上的写法一模一样,例如:1,1...

2018-12-14 15:31:11

排序:六. 堆排序(利用堆结构(二叉完全树)的弹出/下沉操作排序)

平均情况、最好情况和最坏情况的时间复杂度都为O(nlog2n),即线性对数复杂度,不稳定的排序算法。堆结构在 数据结构:二叉完全树(堆) 一文中进行了分析,接下来用代码来实现其几个关键操作:弹出、插入、取顶、上浮、下沉堆操作实现这里的实现以小根堆为例:堆的基本操作接口定义:弹出方法弹出时将数组尾元素放到到数组首部,然后对数据首部(根节点)执行下沉操作即可。插入方法插入时将新元...

2018-12-14 11:05:14

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv1
    勤写标兵Lv1
    授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 原力新人
    原力新人
    在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。