每逢年末,难免会有些感慨,2017年的元旦犹如昨日,眼下却即将步入2018年。

仍旧记得5月份写的一篇帖子,题为“”,帖子的最末,多半期待,些许承诺。如今作为回复,对半年前的程序员应一声:“Hey,真好,我还在”

过往没有写日记亦或是总结的习惯,忽然某一天开始写起了公众号,难免忍不住在年末这么有仪式感的日子里去回顾这一年的点点滴滴。愿与你分享,2017年,我与Matlab的八件小事。

2017年3月14日,我注册了微信公众号,起名为“打浦桥程序员”,只关于Matlab。

创建公众号的初衷很简单,在平时工作过程中会遇见形形色色的问题或是繁琐的重复性任务,在解决问题之初,我也在网上搜寻了答案很久,但是时常不能当下就找到相应的答案。

我相信,这些问题都是冷门小众的问题,不见得每个人都会遇上。而每个遇上这些问题的人,在解决以后,似乎也没有兴致记录下解决问题的思路。

每篇我所记录的问题,倘若有一天,你也碰到了,而我所聊的逻辑,恰好也给了你一点点启发,让你在解决问题的道路上,少走一些弯路,少花一些时间,那就是我的幸运,也是打浦桥程序员公众号存在的意义。

而在这一年当中,公众号从最初的50人亲友关注量,到现在2110人关注,一共发帖43篇,总计18509人阅读,阅读量为54306次,其中阅读量最高的帖子是“”,阅读量为1954次。

虽然算不得成功,不过对我而言实实在在是一件实现自我突破的事。同时也谢谢大家的关注与支持。

关于网络爬虫

2017年4月9日,我写了一篇关于爬虫的帖子“”而这也是我第一次尝试用Matlab去实现网络爬虫。

看着命令窗口中一条一条弹出数据爬取成功的提示,即便是在现在看来十分暴力生涩的代码,当下的成就感旁人自然是无法理解。

对于Matlab网络爬虫而言,最基本的,不外乎三点:

网址的分析

网页源代码的分析

乃至最终通过正则法去提取目标数据

不过即便不是专注于网络爬虫,上述的三点都可以认为是数据分析不可或缺的基本功,并且不单单只是说能够通过看工具书就能习得,需要通过些许例子加强练习。

在上海房价的爬虫之后,陆陆续续我又写了几篇关于网络爬虫的帖子:

就技术上而言,与上海房价的爬虫相比,代码逻辑并没有特别突出的创新点,纯粹的换汤不换药。

而真正进行改进的,是关于反爬虫机制的应对。Matlab应对反爬虫的策略有很多,包括使用代理器,修改IP地址进行网页读取。

在最近的那篇爬虫帖中,我举例了一种最简单的策略,通俗的讲就是,网站不让我读取信息,那我就等,直到网站再次许可我读取信息为止。如果网站识别到位机器读取的话,urlread有效值的输出依旧为1,是有效读取网页的动作,不过输出的网页字符串信息无效,其中并没有包含你所需要的信息。对此不妨使用while循环,如果网页信息中始终包含“Unhuman”该关键词,那么进行重新读取,直到读取到真正有效的网页信息。

同时尝试变频读取。所谓变频读取,就是不要以等时长形式进行读取或者是不间断进行读取,对时间间隔稍加修饰。对于时间间隔的命令,很容易就能联想到pause的函数。而变频的话,可以考虑对时长进行随机选取,而随机数的选取就可以考虑使用rand函数。

这种策略的一个弊端就是,耗时相对比较长,从技术层面上而言,属于无脑爬虫,技术相对较低。但是如果不考虑时间成本的话,这种方法是可以满足自身需求的。让Matlab一直运算,直到爬完所有信息。

自动生成Word文档

2017年3月24日,我发了一篇关于产品评估工具的帖子,由于涉及到工作内容,不得不以股票为例子,重新写了一个工具,“”。

这篇帖子中,最为吸引我的一点功能是能够自动生成Word报告。

正如帖子的题目所言,这个工具也仅仅只是存活了一个星期。而当初所有的不愉快,甚至是因为不受尊重而产生的愤怒,如今看来也只是过眼云烟。相反,我感谢能有这样一次机会,让我有一个礼拜的时间去尝试用自己的方式去写一个工具,也收获了许多意料之外的创意。

印象中很深的是,我花了很久的时间就在琢磨如何在Word文档中插入所截取的图片。直到某一天晚上在单位加班到9点多,突然袭来的灵感解决了这个问题,一时兴奋的却无人分享。

对于这个问题,Matlab中有个函数

这个函数的作用就是,将剪切板中的内容粘贴到Word中。最初尝试搜索Matlab有没有自带这种函数,能否将一个文件复制到剪切板中,但是我没有找到答案。最终曲线救国的办法是,我写了vbs脚本对目标文件进行复制,然后通过Matlab的dos函数执行了这个vbs脚本。当插完图片之后,就删除这个vbs文件。

除此以外,在这个工具中还有不少有意思的点,比如如何在GUI工具界面画雷达图,如何通过参数的调节控制雷达图的变化,等等。有兴趣的朋友,不妨阅读这篇帖子“”。

Matlab与Excel交互

2017年5月,我与媳妇前往摩洛哥度假,那是一段特别棒的旅程,也是我发帖较为频繁的一段时光。在卡萨布兰卡的海滩,我收获了一张迄今为止最为喜爱的照片。

闲暇之余的创意,想把这张照片以单元格涂色的形式录入到excel中,于是就写下了第一篇关于Matlab与Excel交互的帖子“”。

而在如今看来,这篇帖子对于目前的工作而言意义重大,于是在不久之前,凭着一直以来的工作感悟,发了一篇帖子“”,以一个简单的例子介绍Matlab与Excel的交互在平时工作中的应用。

对于这块内容,处理起来并不难,整体过程大致是,先通过Excel.application对Excel进行定义,此后便依次对workbook,sheet,单元格进行处理。

而在对单元格进行处理的过程中,最常见的大致是以下几种:

1. 设置单元格颜色

2. 合并单元格

3. 水平居中

4. 垂直居中

5. 单元格写入

或许会有朋友心有疑问,不清楚如何获取想要设定的参数名。在“”这篇帖子中,我介绍了整个Excel生成流程,以及通过设定单元格颜色的例子介绍了如何自己取摸索确定参数名。

Simulink建模工具

在很长一段时间内,Simulink建模工具应该是我最为喜爱的一个工具,没有之一。产生开发这个工具的想法,源于2016年的一个项目。那时候,我还是一个软件工程师。

那一年有两个月,每天下班回家之后,我就坐在电脑前码代码,一码就是到凌晨,周末也是如此。当时给自己开发了一个工具,算不上工作任务,也算不上业余的爱好,仅仅只是工作上碰到了一个很繁琐的任务,畅想着能通过代码实现,好让一个重复性任务变得更有吸引力。

整个工具成型之后,也慢慢会碰到其他诉求,业余时间我也逐一为此开发功能,逐一加入到了这个工具之中。直至如今,这个工具虽然算不上完美,但好歹让我想对模型大刀阔斧的改造时丝毫没有些许畏惧。

这个工具中集成了许多平时在控制器软件开发过程中所需的功能,将近35个不同的功能。其中最让我有成就感的功能,莫过于一键替换参数名。

当然还包括Stateflow中参数名的替换

除此以外,还有其他有意思的功能,在“”这篇帖子中都有动图演示。

对于修改Simulink模型这种需求,关键的函数不外乎以下几种:

1. 获取参数

2. 设置参数

3. 新增模块

4. 新增连线

除此以外就是关于具体参数的设置了,包括name,position,value,inputs,outputs等等。而这些资料以及优秀的代码在网上和论坛上都是有朋友讨论的,最重要的还是在于对Simulink模型设计的理解。

截屏与屏幕录制

2017年8月23日,我发了一篇关于Matlab截屏与屏幕录制的帖子“”。

写这个工具的想法并不是一下子就成型的,是在5月份的时候,一位Matlab论坛里的朋友私信我说,他完成了数据分析并且通过plot函数以图片的形式呈现了计算结果,不过他的导师希望能够以一个动态图的形式更直观的理解整个变化过程。

最初对于这个需求,我挺有兴趣,于是就着手写了一个Matlab制作GIF动图的工具,并在5月27日发了一篇帖子“”。

而计算结果动态显示的效果大致如下:

到了8月份,由于电脑中Screenpresson软件的临时故障导致不能录制屏幕,于是我灵光一现,就打算自己写一个Matlab录制屏幕的工具。

在逛知乎的过程中,渐渐了解到,有个词叫造轮子。用知乎网友@王子亭的话来说,造轮子就是,明知道你做的不可能比前辈做得更好,却仍然坚持要做。而造轮子的意义在于,能够增加自己的经验,很多事情看起来很简单,但只有自己动手,才会发现其中的难点。

如果对写这两个工具有兴趣的朋友,会在之后动手过程中发现,码其代码来并不如看起来那么容易,其中有几个技术点挺有趣的,比如

如何实现截屏

如何确定录屏区域

如何实现录屏

如何实现录屏的暂停与终止

尤其最后那个问题,是一个特别普通常见,但是在处理过程中需要花时间琢磨的点。有兴趣的朋友,可以参考这篇帖子“”。

提取曲线原数据

提取曲线原数据这个工具是我在5月份写的另一个工具“”。

那阵子跟朋友聊天,聊到一个问题,比较有意思,是关于获取曲线图中的数据。无论是在学习还是工作过程中,肯定会有那么几个时刻,比如看到了一张扭矩转速图或是电池特性图,很想获取这些曲线图中的原始数据。

也正是源于这一次偶然的对话,我突然对提取曲线数据这个话题尤为感兴趣。期间也在网上搜索过相关的处理方案,大多都是通过ginput多次描点最终提取曲线的。对于这种需要费时费力的解决方案,我并不赞同。于是就踏上自己琢磨的道路

事实上而言,这个工具被使用的次数并不多,主要原因在于处理对象的局限性,对于简单的单实线图,是能够识别其中的数据,而当出现多曲线时,需要对曲线图进行一个预处理。同时因为这个功能的需求并不迫切,因此也没能再深入去优化这个工具。但是整体上而言,我还是特别喜欢这个工具的,因为在开发这个工具的过程中,应该是我第一次尝试挑战图像处理。

鼠标精灵

鼠标精灵是2017年我完成的最后一个工具,而这个工具对我而言意义重大,因为鼠标精灵的产生,对于Matlab所能够实现的功能又增加了一个维度。而我也将再不用依赖于调用vbs脚本了。

开发这个工具的理由真的是太奇葩了,简单的说,是因为我太懒了,不想在上班的时候,一次又一次的在登录不同系统过程中去输入相同的账号和密码。于是,在2017年的10月,这个工具诞生了“”。

其实在“”这篇帖子中所举的使用例子并不具代表性,因为这种操蛋的烦恼不是每个人都能经历的到的。而在这个月月初,我刚发的一个帖子中“”,鼠标精灵的作用就体现出来了。当使用yahoo读取股票数据宕机的情况下,获取直接通过同花顺下载历史数据是一个更为有效的办法,毕竟用15秒来获取上证几十年的历史数据,并不见得在效率上会败给爬虫式的读数据法。

有心的朋友可能会发现,这一年来,我很大一部分时间是花在GUI工具开发上。在使用Matlab的过程中,于我而言,最迷人的一点莫过于GUI的开发,这不同于仿真,不同于图像处理,或是其他,因为仿真的优化是无止尽的,没有人敢断言,老子的模型天下第一,没有人的模型能比我的仿的更准了。这有点像一道语文阅读理解,作者写这句话是什么用意。相比之下,工具开发更像一道数学题,答案是确定的,要么能实现功能,要么就是不能实现功能,而其中唯一的不同是,你是如何解这道题的,你又是如何实现这个功能的。

为此,我专门写过一篇帖子是关于如何制作GUI工具的。

如果有对GUI工具这一块特别感兴趣的朋友,不妨参考一下几篇关于GUI的实例帖子:

往期精彩内容回顾