对 python 的 Flask、FastAPI 和 Spring Boot 集成的简单接口做速度对比,返回 json 格式的当前时间戳:

{
    "timestamp":1584416801569
}

同时把某个11位时间戳 json string 写死在 index.html 里,测试 Nginx 的并发量。虽然一个静态资源一个动态计算没有可比性,但是为了体现性能差距,还是把 Nginx 的并发拿来做对比。

- 阅读剩余部分 -

不知从什么时候开始,shadowsocks 开启后一直无法监听 1080 端口,当时换了 1081、1082 也不行,于是换了个比较高的 10800 端口解决了,也没当回事。今天因为要跑一个非 maven 的项目,需要在 idea 里手动配置 tomcat,默认的 JMX 端口 1099 又没法分配,而使用netstat -ano | grep "1099"又显示没有任何程序在占用这个端口,非常诡异。后来更改为 1098、1097 也是和上次 shadowsocks 同样的情况,死活绑定不上去,而 netstat 又显示没有程序占用这个端口,换成比较高的比如 11099 又可用了……

- 阅读剩余部分 -

使用 Spring Boot 接收上传的文件,接收到的文件对象为srcFile,目标路径为 /upload/img/fileName.jpg,使用transferTo方法存储到本地:

File dstFile = new File("/upload/img/" + fileName);
srcFile.transferTo(dstFile);

提示目标文件路径不存在:

java.io.IOException: java.io.FileNotFoundException: C:\Users\syf\AppData\Local\Temp\tomcat.6910981657131718308.8080\work\Tomcat\localhost\ROOT\upload\img\5a6acf84e27448be9925959821ca1e90.png (系统找不到指定的路径。)

可以看见封装的transferTo方法自动把相对路径补全到了绝对路径,且是以 Tomcat 容器所在的临时目录为父目录补全的,而我们是想保存到项目的/upload/img/目录下。

解决方法:

不使用MultipartFile.transferTo,把 MultipartFile 对象转字节流后使用 FileOutputStream 手动保存二进制流:

// 这里的actualPath是相对项目根目录的路径
String actualPath = "src/main/webapp/upload/img/" + fileName;
String absolutePath = "/upload/img/" + fileName;

try {
    byte[] srcFileBytes = srcFile.getBytes();
    OutputStream f = new FileOutputStream(actualPath);
    f.write(srcFileBytes);
    f.close();
} catch (FileNotFoundException e) {
    System.out.println("File not found");
    System.out.println(actualPath);
    e.printStackTrace();
    return null;
} catch (IOException e) {
    e.printStackTrace();
    return null;
}
return absolutePath;

The Pale Blue Dot

这张照片是卡尔萨根说服整个 NASA,让航天器转个圈拍的一张地球照片,叫做“The Pale Blue Dot”

这是从40亿英里外的太空拍摄的地球照片,太阳光束上的那一个小点就是我们的家

- 阅读剩余部分 -

gauss_test.png

如图,需要对数据集生成对应的 HeatMap 数据,中心点值为1,向四周生成一个高斯分布。

高斯分布又叫正态分布,最近武汉新型冠状病毒的确诊人数应该就是一个很类似正态分布的图,虽然还不知道什么时候会是高峰期。

正态分布的概率密度函数为 $$f(x)=\frac{1}{\sqrt{2\pi}\sigma}e^\frac{(x-\mu)^2}{2\sigma^2}$$,对应图像如下:

Normal Distribution PDF

根据这个公式,就可以写出生成一维高斯分布的函数:

def get_gauss(n):
    u = 0  # 均值μ
    sig = math.sqrt(1)  # 标准差δ
    x = np.linspace(u - 3*sig, u + 3*sig, n)
    y = np.exp(-(x - u) ** 2 / (2 * sig ** 2))/(math.sqrt(2*math.pi)*sig)
    y = normalize(y)
    return y

注意此时生成的高斯分布数据还需要进行归一化:

def normalize(x):
    max = x.max()
    min = x.min()
    return (x - min) / (max - min)

最后将两个一维的高斯分布矩阵相乘即可,完整代码如下:

- 阅读剩余部分 -