hermesli

MiLog 可以用 python 写插件啦

MiLog 发布一年多了,昨天才第一次真正有动力实现插件系统——总觉得用一个异步的外部脚本做 anti-spam,不怎么得劲,还是写一个插件系统比较靠谱,本来插件系统也是 MiLog 的规划功能之一,更重要的是:

  1. 简单的非核心功能并不想用 Go 写进 MiLog 里,最好只保持一个轻量级的 Core;
  2. 最好可以用 Python 写插件,没别的原因,我喜欢 Python 就足够了;

于是乎,MiLog Plugins System 诞生了,目前只支持用 Python 编写插件,最简单的插件只需要两个函数(参考 speak-chinese-please):

  1. register() 用于 MiLog 加载插件时注册事件;
  2. <事件名>() 用于处理事件回调;

将编写好的插件放在任意目录下,并在 conf/app.conf 中增加一行,指向该目录就行:

plugindir = <path_to_plugin_directory>

哦对了,做完以上步骤后 MiLog 需要重启,注意通过日志观察插件是否注册成功。

Now, enjoy!

Speak Chinese Please

最近一段时间本 blog 被个别 spammer 盯上了,成功绕过验证码狂发垃圾广告,本来打算抽空做个简单的朴素贝叶斯做反垃圾,无奈本人实在太懒,迟迟没有动手,倒是收集了不少内容做样本……

考虑到这些 spam 内容无一例外都是英文,暂时先写个检测中文的脚本顶一阵吧,于是在几分钟前,speak-chinese-please 上线了——我太懒,简单脚本管用绝不写复杂的,顺便观察下 spammer 学习能力如何,10 年前玩 WordPress 的时候已经有机器人可以随机输入中文绕过该机制了,就看这次它会不会了。

分享一个 python 检测中文字符的函数吧,这也是 speak-chinese-please 的核心:

def any_chinese(s):
    return any(u'\u4e00' <= c <= u'\u9fff' for c in s.decode('utf-8'))

嗯,就一行,注意 any() 函数。

Python PIP 升级所有包 & 配置国内源(阿里云)

升级所有包

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs pip install -U

via

配置国内源(阿里云)

Mac & Linux

修改 ~/.pip/pip.conf 文件(Mac & Linux 系统)或 %HOMEPATH%\pip\pip.ini(Windows 系统),如果不存在就新建一个,把下面的内容粘进去:

[global]
trusted-host=mirrors.aliyun.com
index-url=http://mirrors.aliyun.com/pypi/simple

迅雷离线助手的设置齿轮不见了

迅雷离线助手的设置齿轮不见了,怎么设置 jsonrpc?

开发者工具 -> Application -> Storage -> Local Storage -> http://dynamic.cloud.vip.xunlei.com

key value 说明
TLE_aria2_jsonrpc <你的 jsonrpc 地址> jsonrpc 地址

via

macOS Sierra 上的 Karabiner 替代:Control_L + hjkl 组合方向键

2017-12-02: Karabiner-Elements-11.3.0 已经支持在 macOS High Sierra (ver 11.13.1) 系统上实现 Vi Style Arrows——安装 Karabiner-Elements 后,在这个页面上找到「Vi Style Arrows」,点击右侧的 Import 按钮将配置导入并 enable 即可。

作为 vim + HHKB 键盘 + Karabiner 的重度依赖患者,某天晚上升级到 macOS Sierra 后突然傻眼了,Control_L + hjkl 作为方向键的设置全部失效了……

接下来的几天强迫自己重新适应 MBP 自带键盘、强迫自己适应 HHKB 默认的方向组合键,都觉得丑陋不堪,已然唯有 Control_L + hjkl 才是正确打开方式,于是踏上了寻找 Karabiner 临时替代者的不归路,直到刚才看到这个:[KeyMove] Control_L+hjkl to Left/Down/Up/Right #103

这里提到了一款收费软件:Keyboard Maestro,按照 seangaffney 的设置就可以轻松实现!不管了,这是目前为止找到体验最完美的替代软件了——当然,我的需求只是 Control_L + hjkl 实现方向键。

希望用到 Trial 结束前,the Next Generation Karabiner 可以完工哈,虽然感觉可能性不大,给作者捐了 $5,加油……

ps. BetterTouchTool、ControllerMate 都试过,前者貌似没法实现 key repeat,后者折腾半天不知道究竟如何正确设置组合键,遂都放弃了……

爱词霸 Alfred Workflow

@author  lzw.whu@gmail.com
@version 20160908:03

安装

下载

使用

ci <word>

iciba.alfredworkflow

ci > <word>

iciba.alfredworkflow

更新历史

版本 更新内容
20160908:03 支持中文
20160908:02 第一次输入获取suggest,回车后查词
20160907:01 初始版本

雪球股票实时价格查询 Alfred Workflow

@author  lzw.whu@gmail.com
@version 20160907:01

安装

下载

使用

xueqiu.alfredworkflow

12306 火车票余票查询 Alfred Workflow

@author  lzw.whu@gmail.com
@version 20160906:01

安装

下载

使用

12306.alfredworkflow

感谢

Alfred Workflow 北京链家二手房成交价格查询

北京链家成交价格查询 Alfred.Workflow

@author  lzw.whu@gmail.com
@version 20160906.01

安装

下载

使用

lj <小区名称>

lianjia.alfredworkflow

NumPy 矩阵乘法

先上结论:NumPy 中对 array 使用 multiply()* 操作符并不是矩阵乘法,正确的用法是 dot()matmul(),或者对 matrix 使用 *

根据 numpy.multiply 文档说明,multiply() 是 element-wise 的乘法,换句话说,是把两个入参数组中对应元素进行相乘。

举个栗子:

>>> from numpy import *
>>> a = [1, 2, 3, 4, 5, 6]
>>> b = [6, 5, 4, 3, 2, 1]
>>> ma = reshape(a, (2, 3))
>>> mb = reshape(b, (3, 2))
>>> ma
array([[1, 2, 3],
       [4, 5, 6]])
>>> mb
array([[6, 5],
       [4, 3],
       [2, 1]])
>>> multiply(ma, mb)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3) (3,2)
>>> c = arange(6).reshape(2,3)
>>> d = arange(6).reshape(2,3)
>>> c
array([[0, 1, 2],
       [3, 4, 5]])
>>> d
array([[0, 1, 2],
       [3, 4, 5]])
>>> c * d
array([[ 0,  1,  4],
       [ 9, 16, 25]])

在上面的代码中,ma 是 2×3 矩阵,mb 是 3×2 矩阵,预期二者相乘的结果应该是一个 2×2 矩阵,但实际运行会报异常。在 multiply() 看来,mamb 只是两个形状不同的二维数组,因此无法把对应的元素进行相乘。c * d 符合 element-wise 相乘的结果。

正确的用法是什么呢?

  1. numpy.dot,对于二维数组,dot() 等价于矩阵乘法
    >>> ma.dot(mb)
    array([[20, 14],
        [56, 41]])
    
  2. numpy.matmul,从 NumPy 1.10.0 开始被引入
    >>> matmul(ma,mb)
    array([[20, 14],
        [56, 41]])
    
  3. array 类型转换为 matrix 再使用 * 操作符
    >>> np.asmatrix(c) * np.asmatrix(d.reshape(3,2))
    matrix([[10, 13],
         [28, 40]])
    >>> np.asmatrix(c) * np.asmatrix(d.T)
    matrix([[ 5, 14],
         [14, 50]])
    >>> np.asmatrix(c) * np.asmatrix(d.T)
    matrix([[ 5, 14],
         [14, 50]])
    >>> np.mat(c) * np.mat(d).T
    matrix([[ 5, 14],
         [14, 50]])
    >>> np.mat(c) * np.mat(d.T)
    matrix([[ 5, 14],
         [14, 50]])
    
  4. python3 的 @ 操作符,参考这里,由于不用 python3,没试过