# 感知哈希算法

## 算法描述

• 步骤1图像处理：首先将图片转换成灰阶并缩小至固定的$M_{32×32}$
• 步骤2 信号变换：使用DCT将图片$M_{32×32}$转换为频域系数矩阵，记作$C_{32×32}$
• 步骤3 低频截取：从$C_{32×32}$左上角第二行第二列开始截取获得低频矩阵，记作$N_{8×8}$
• 步骤4 二值化：计算矩阵$N_{8×8}$的均值，记为$m$，遍历矩阵$N_{8×8}$的每个元素e，若$e \gt m$则记为1，否则记0。得到表征图像特征的二进制串哈希值。
• 步骤5 相似度计算：计算两个图像哈希值的海明距离来表征图像间的相似度，距离越大则相似度低，反之则相似度越高

## 算法实现

https://github.com/klesh/qt-phash

# 性能测试

## 测试结果

### 20 张图片测试结果

Mean Variance Mean Variance
none-mean 2.83 11.18 20.92 106.18
none-median 2.64 12.39 20.93 106.15
box-mean 2.48 9.67 21.26 114.47
box-median 2.82 7.85 20.97 105.99
gaussian-mean 2.34 8.06 20.99 108.08
gaussian-median 2.8 10.24 21.05 108.16

### 50 张图片测试结果

Mean Variance Mean Variance
none-mean 2.8 10.72 20.9 85.56
none-median 2.85 11.76 21.12 86.13
box-mean 3.05 13.3 21.06 84.17
box-median 3.26 9.96 21.09 86.39
gaussian-mean 2.44 8.06 21.07 84.48
gaussian-median 2.85 10.1 21.07 85.44

### 100 张图片测试结果

Mean Variance Mean Variance
none-mean 2.77 11.33 20.6 110.74
none-median 2.85 11.05 21.37 114.27
box-mean 2.83 12.28 21.73 124.97
box-median 3.28 10.03 21.38 117.19
gaussian-mean 2.43 8.45 21.62 120.99
gaussian-median 2.71 9.28 21.31 116.77

Compartir Comentarios

# Speed of copying big file from samba server plummets

I was wathcing a movie located on my Home Server today, and all of a sudden, it became stuttering.I suspected it was MPV‘s fault, so I tried another media player, unfortunately, it wasn’t. So, I decided to copy the movie to my local machine first. During the process I noticed something odd:

My home network speed is 1Gbps, which means the copying speed should be somewhere around 120Mb. And it was starting at 115Mb, then plummeted quickly.

What was going on, was my newly bought HardDrive is failing? I ssh to my Home Server and copy the exact same file to another HardDrive and it worked ok, so I ruled out the possiblity of faulty HardDrive and went for googling, I tried every means I found and nothing worked!

Seems that I had to figure out the solution on my own, so I ran iotop when copying.

Well, that didn’t make any sense to me because my HardDrive is Mechanical, concurrent reads force magnetic arm go back and forth leads to a lower throughput. So I decided to dial it down and see if it solves the problem. I found this setting after some diggings:

After restarting smb service, I got these:

Finally, the problem was solved. Not sure it’s a bug or feature…

Compartir Comentarios

# 缘起

compton 是 X11 下给程序加透明背景的 compositor。前阵子，为了得到一个透明背景模糊的效果，我使用了 compton 的一个 dual_kawase 的分支。虽然平时使用时感觉不出来，但在录屏出来的视频则会不停地闪烁。这样的视频看完估计眼睛就得废掉！

# 解决问题

1. 出错帧背景都比较明亮
2. 而正常帧都有一个 terminal 在运行，色彩则比较暗

# 实现

Compartir Comentarios

# 多任务

1. 跑一个独立的脚本或进程定时执行(不作深入讨论)
2. 起一个相对独立的线程, 循环睡眠执行
3. 异步事件定时执行

# 共享计数器篇

counter-unsafe

counter-safe

1. 不加锁的情况下，速度稍慢，数值不准确
2. 加锁的情况下，速度稍快，数值准确

ps:

1. 这里要特别提一下在py3中, GIL的释放策略由原来py2的每N条”指令”释放一次, 变成了每隔一定时间(默认5ms)释放一次. 此时若累加操作完成太快会导致线程看起来似乎是安全的, 因此测试中特别地对累加操作连续执行百万次.
2. python本身的执行效率不高, 不难推测出大量的时间花费在了循环累加上, 把这部时间去掉的话, 线程模型和异步模型的执行时间比例会大幅上升.

# 缓存加载篇

ps: 以上实现的是一种单一进程下响应式的缓存策略, 可以在进程内, 进程外, 任意的时间, 任意的方式清空缓存, 所有在缓存清空后访问的用户都能看到最新的数据. 我见过一些系统, 采用独立进程定时更新缓存的策略, 用户在使用的时候往往需要等待缓存更新, 当然也不能随便地通过管理界面去清缓存了. 这些都只是策略问题, 与编程模型无关.

# 线程的Flask 与 异步aiohttp

aiohttp 也是依照官方文档给的例子稍微调整：

Flask

aiohttp

1. 在单进程的情况下可能配置出一倍效率来吗？
2. 开发环境与生产环境不一致管理起来麻烦吗？
3. 多线程程序好调吗？

node 版

# 相关代码下载

https://github.com/klesh/threading-vs-async

Compartir Comentarios

# What is hexo-server and hexo-browsersync?

• hexo-server 可以让你实时在本地预览你的hexo博客, 而不必编译整个网站, 对于编写博文和调试hexo本身的插件主题是很有用的
• hexo-browsersync 只有hexo-server的话,每次改完都得手动刷新一下浏览器, 这很不科学. browsersync 可以自动在你保存文件的时候自动化地刷新浏览器

# How to solve

_config.yml 加入:

Compartir Comentarios

# How to build wxWidget app bundle in Mac OS X

## 吐糟一下 Apple

Compartir Comentarios

# 前言

BBR 具体的原理可以参照 知乎上的文章 。对于技术工种的人们来讲，梯子这种日常使用频率极高的工具，自然是一分快十分好，果断要升级一下！

# 个人使用感受

Compartir Comentarios

# 在 Xcode 8 中创建 wxWidgets 的工程

wxWidgets 的文档太老了，相应的指引根本无法使用。经过一番摸索，终于找到了在 Xcode 中创建 wxWidgets 的工程。

# 前提条件

## 开始创建工程

1. 打开 Xcode -> “Create a new Xcode project”

注意要选择 “Cocoa Application”。我一开始选了 “Command Line Tool” ，虽然也能正常跑出来界面，但生成的只是一个可执行文件，而不是 Application Bundle 。这样一来就无法定制程序的图标和一些其它的行为。

2. 语言选 Objective C ，其它的勾全部清空。

1. Build Settings -> Other Linker Flags

打开 Terminal 输入

将输出的内容添加到：

2. Build Settings -> Other C++ Flags

打开 Terminal 输入

将输出的内容添加到 “Ohter C++ Flags”

3. 把没用的文件删除：

其中 Assets.xcassets 是用来放图标的，要留着。MainMenu.xib 是程序菜单，不需要可以删除掉。

4. wxWidgets 的 Hello world 测试一下。

新建一个 main.cpp ，粘贴：

7, 点击运行，一切 OK 就可以开始愉快地编程了。

Compartir Comentarios

# 违法停车时如何避免罚款?

Compartir Comentarios

# 过程

## Openresty

Openresty 是在 nginx core 的基础上集成了 LuaJIT 和许多第三方的 nginx 模块。除了 nginx 本身具备的功能外，还可以用来做 web application，web service。利用 lua 可以直接在 Openresty 里面构建动态服务。目前官方只提供 RPM 的预编译包，其它操作系统需要自行编译。 官方的安装说明 简明易懂，直接照猫画虎即可。

nginx.service

• 通过 systemctl status nginx 可以看到 nginx 是不是正常启动了。若是失败这里也会输出用的日志信息，可以按左右键对界面进行横向滚动
• 需要看到更多日志可以使用 journalctl -b _PID=上一步中输出的PID 查看更多的信息。
• 通过 curl http://localhost 确认 nginx 已经可以正常工作。

## 在 Openresty 中配置 lua-resty-auto-ssl

nginx 的 ssl 站点需要先指定一个静态的 ssl_certificate， 否则会报错，因此需要生成一个自签的证书，骗过 nginx 让它顺利启动之后，再由 lua-resty-auto-ssl 返回动态的证书。

### nginx 的全局配置 /usr/local/openresty/nginx/conf/nginx.conf

example.com.vh.conf

# 总结

Compartir Comentarios