2020年6月

Swift 获取文件MD5的方法

首先需要引入用的的Cocoa类CommonCrypto,由于CommonCrypto没有兼容 Swift,需要将以下导入到项目的 Bridging-Header.h 文件中:

#import <CommonCrypto/CommonCrypto.h>

由于移动设备的内存有限,以下代码实现是将文件分块读出并且计算md5值的方法,兼容Swift 3.0:

func fileMD5(_ path: String) -> String? {
    let handle = FileHandle(forReadingAtPath: path)
    if handle == nil {
        return nil
    }
    let ctx = UnsafeMutablePointer<CC_MD5_CTX>.allocate(capacity: MemoryLayout<CC_MD5_CTX>.size)
    CC_MD5_Init(ctx)
    var done = false
    while !done {
        let fileData = handle?.readData(ofLength: 256)
        fileData?.withUnsafeBytes {(bytes: UnsafePointer<CChar>)->Void in
            //Use `bytes` inside this closure
            //...
            CC_MD5_Update(ctx, bytes, CC_LONG(fileData!.count))
        }
        if fileData?.count == 0 {
            done = true
        }
    }
    //unsigned char digest[CC_MD5_DIGEST_LENGTH];
    let digestLen = Int(CC_MD5_DIGEST_LENGTH)
    let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
    CC_MD5_Final(digest, ctx);
    
    var hash = ""
    for i in 0..<digestLen {
        hash +=  String(format: "%02x", (digest[i]))
    }
    
    digest.deinitialize()
    ctx.deinitialize()
    
    return hash;

}
Objective-C 下实现库:

Link:

报错java.lang.IllegalArgumentException: Result Maps collection does not contain value解决

使用mybatis报错

java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.xxx.mapper.xxxMapper.xxx

at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:853) ~[mybatis-3.4.0.jar:3.4.0]

at org.apache.ibatis.session.Configuration.getResultMap(Configuration.java:605) ~[mybatis-3.4.0.jar:3.4.0]

at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:344)

本人总结了两点原因:

    1. 在mapper.xml文件中,将resultType和resultMap弄混淆。

这个原因一般报错的第一行后面都会有这样一句话 org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.xxx.xxx with root cause

注意:使用resultMap时,必须要有标签指明id和返回类型以及表字段的对应关系。

如果是直接返回一个用户定义的实体类型,则要使用resultType,弄混淆就会报错。

    1. 在mapper.xml头部namespace引入错误。
<mapper namespace="com.xxx.mapper.xxxMapper">

这个namespace引入的mapper文件要和你的mapper.xml文件对应。

一般都是第一条原因

Link:

树莓派 之 dnsmasq搭建DNS服务器

Dnsmasq是一款高性能的DNS缓存软件,可以使用它来搭建一个小型的DNS服务器。在使用时,由于dnsmasq可以将域名缓存下来,这样下次就不用再次请求上游的DNS服务器,使用时极大的加快了上网速度,从而提升了上网体验。如果你有树莓派在闲置,那就赶快利用起来吧,使用你手里的树莓派来搭建一个自己的DNS服务器吧。

安装Dnsmasq

sudo apt-get install dnsmasq

配置Dnsmasq

sudo vim /etc/dnsmasq.conf

修改文件需要修改文件的实际文件:

查看链接文件的实际文件:

ls -l /etc/dnsmasq.conf

去掉strict-order前面的#号
设置listen-address,配置如下:

listen-address=127.0.0.1,192.168.0.80

如果只加上127.0.0.1,表示只能为本机提供dns服务,如果需要为局域网的其他电脑提供dns服务,需要再加上树莓派在局域网内的IP地址。

修改缓存大小

cache-size=10000

保存dnsmasq.conf文件
修改resolv.conf文件,添加以下几行:

nameserver 127.0.0.1
nameserver 223.5.5.5
nameserver 114.114.114.114

第一行是自动生成的,表示查询DNS时首先从本地查找,找不到了才从下面的上游DNS服务器查找。

保存resolv.conf文件
重启dnsmasq

sudo service dnsmasq restart

查看服务状态

sudo service dnsmasq status

OK,安装成功了!在其它电脑上就可以使用树莓派DNS缓存服务器了,明显可以看到解析域名的速度大大提高,基本上第一次解析花点时间,以后访问时的速度有了极大提高。

卸载

sudo apt remove dnsmasq
sudo apt purge dnsmasq

根据删除提示信息,删除其他关联库及文件

使用查找命令,查找关联文件及文件夹并删除:

whereis dnsmasq

sudo rm -rf file[file-dir]

Link:

grep 搜索不包含

grep 是我们在Linux下查找文本内容最常用的命令,通常我们都是获取包含某个字段的内容。当然, grep 也能获取不包含某个字段的内容,同时各个命令能组合使用。下面我们一起来熟悉下。

查找包含某字段:

less file | grep 'keyword'

查找不包含某字段:

less file | grep -v 'keyword'

输出查找到的某字段个数:

less file | grep 'keyword' -c

同时输出查找到的内容的行数:

less file | grep 'keyword' -n

忽略大小写:

less file | grep 'keyword' - i

将查找到的内容高亮显示:

less file | grep 'keyword' --color=auto

更多使用方法,可以使用帮助命令查看:

grep --help

Done.

How to detect the end of slider drag?

UISlider 是iOS 提供的一个系统滑动指示条,可以帮助我们快速实现需要进度展示的相关功能。我们可以通过添加滑动监听方法,来获取滑动变化。一般我们都会添加以下监听方法获取滑动监听:

[slider addTarget:self action:@selector(onSliderValueChanged:) forControlEvents:UIControlEventValueChanged];

但这种单参数的监听,只能获取到滑动值得改变,无法获取用户手势变化,这样给我们实现一些功能时带来不便。

我们可以通过添加多参数的监听,实现同时获取滑动值得变化和用户手势变化的通知:

[slider addTarget:self action:@selector(onSliderValueChanged:forEvent:) forControlEvents:UIControlEventValueChanged]
- (void)onSliderValueChanged:(UISlider*)slider forEvent:(UIEvent*)event {
    UITouch *touchEvent = [[event allTouches] anyObject];
    switch (touchEvent.phase) {     
        case UITouchPhaseBegan:
            // handle drag began
            break;
        case UITouchPhaseMoved:
            // handle drag moved
            break;
        case UITouchPhaseEnded:
            // handle drag ended
            break;
        default:
            break;
    }
}

Link: iPhone : How to detect the end of slider drag?

Done.

解决Python3不能导入pip3安装包问题

最近将Hugo博客转移到七牛云,按照要求使用 pip3 命令安装好了相关的模块,结果出现了一个重大的问题,就是使用 python3 命令导入相关模块的时候直接出现了一个很尴尬的问题,无法查找到该模块。如下:

$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import imutils
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'imutils'

pip3安装包位置与python3引用位置不同

在命令行查看一下 pip3 到底是什么?

$ which pip3
/usr/local/bin/pip3
$ pip3 --version
pip 9.0.1 from usr/local/lib/python3.6/site-packages

注意这里的目录 usr/local/lib/python3.6/site-packages ,下面我们会和它进行对比。

在命令行打开Python3的终端:

$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
>>>

看最后一个路径 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages ,和我们上面pip3安装的目录 usr/local/lib/python3.6/site-packages 居然不一样。也就是说我们使用 python3 命令根本就无法导入 pip3 安装的模块,因为完全找不到这个目录下。有些同学可以看一下自己的 python3 输出结果,有的是这个:

$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', 'usr/local/lib/python3.6/site-packages']
>>>

这种情况的话就可以直接导入成功了。我也不太清楚为啥同样是Homebrew安装Python,结果有的同学是这个结果,有的同学是那个结果,不过没关系,下面我们提出解决方案。

建立一个软链将两个 site-packages 合并

其实我们是希望 python3 能够找到 pip3 安装的模块,但是无法找到 usr/local/lib/python3.6/site-packages 这个目录,我们可以将这个 site-packages 去掉,将它变成 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 的一个软链接,这样的话,我们使用pip3安装的模块都会直接进入 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 这个目录了,导入自然就没问题了。

$ cd /usr/local/lib/python3.6
$ mv site-packages site-packages.bak
$ ln -s /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages site-packages

这样软链就创建完成了,关于 site-packages.bak 这个目录,如果你觉的没什么用就可以直接删除了。这样我们再次使用 pip3 安装 imutils 这个模块,就会直接进入 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 这个目录。我们接下来再次使用 python3 导入一下这个模块:

$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import imutils
>>>

说明导入成功了!

其它博客的解决方案

在网上之前找了很多解决方案,其中比较多的就是说在 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 目录中建立一个 .pth 文件,指定另一个 site-packages 目录的地址,然后 site.py 文件会自动去查找,但是这种方案仅针对 python2.7 ,我还没有试过,不过觉得比较麻烦,而且不一定能成功,所以就没有采取这种方法。

PyCharm安装目录

我们在使用 PyCharm 去安装一些模块的时候会到这里进行安装:

pycharm-pip.png

看到上面的项目解释器( Project Interpreter ),就是我们上面提到的 Python3.6.3 ,它的安装目录地址就是 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages ,因此 PyCharm 在这个解释器的情况下会安装到 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages 这个目录。和我们在命令行使用 pip3 安装模块的目录是一样的。我们使用 pip3 安装一些目录以后,重新打开这个窗口,就会发现这里全部显示出来了。

总结

这个应该算是Python环境里面的一个大坑了吧,对于Python不太熟悉的朋友很有可能会被这么多的安装位置搞晕,搞懵。不过我们在遇到这个问题的时候还是要冷静思考,多Google,看得多了,自己也就对这个问题慢慢熟悉了,然后才能有自己的解决方案。所以一定要有足够的Input,才能有Output。

Link: 解决Python3不能导入pip3安装包问题

Ubuntu 18.04安装Java JDK8

Java JDK在linux系统有两个版本,一个开源版本Openjdk,还有一个oracle官方版本jdk,oracle JDK既可以通过添加ppa源命令行安装,也可以去官网下载jdk压缩包安装

安装openjdk

1、更新软件包列表:

sudo apt-get update

2、安装openjdk-8-jdk:

sudo apt-get install openjdk-8-jdk

3、查看java版本,看看是否安装成功:

java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

Link: Ubuntu 18.04安装Java JDK8三种方式