作者归档:王兆基

关于王兆基

可能是一个程序员。

ThinkPHP 5.1 笔记(一)

最近在做一个需要大力出奇迹、快速开发的东西,听说 ThinkPHP 十分易于上手,就决定试一试用 ThinkPHP5.1 稳定版做程序的后端。因为过去基本没有用过 PHP 语言和 ThinkPHP 框架,所以基本是一边看手册一般写代码的。使用体验很好,ThinkPHP 不愧是风靡无数培训班的 PHP 框架,上手和使用都可以说是零门槛。

以下是我写代码时记录下的一些笔记。

继续阅读

为 SCU URP 助手增加「计算各种绩点与均分」的功能

期末考试结束了,又到了一年的出分季,若是在过去,算平均绩点和平均分不是什么难事,因为不论是飞扬的绩点计算器还是后来的「We 川大」(现川大圈校内通)都很好用。然而,因为教务处这学期的升级改造,帮助了无数学子多年的「川大圈校内通」牺牲了……

于是我身边的同学们不得不倒退回用 Excel 或者纸笔计算的原始时代……但作为半个程序猿,还用纸笔算这种事情实在是不大合适,于是我决定为我的四川大学综合教务系统助手增加一个自动计算绩点和平均分的功能。

四川大学综合教务系统助手-绩点与均分计算

现在脚本的新版本已经上传了,有需要的同学可以点击下面的链接安装使用:

四川大学综合教务系统助手

下面的,我将记录一下编写这个功能时的要点。

继续阅读

用 INDEX 和 MATCH 函数的组合取代 VLOOKUP 函数

0x00 前言

在 Excel 里,有无数或简单或复杂的函数,有些函数如 COUNT 可能我们天天都会用到,有些函数则是一辈子都不会碰到的陌生人,爱情也是如此。

而在那些复杂一点的函数里,最广为人知的函数可能就是 VLOOKUP 函数了,这个函数的作用很简单也很强大,就是从表格里找出匹配的的数据。用严肃的语言来说就是:「在数组第一列中查找,然后在行之间移动以返回单元格的值」。

个人认为是否可以使用 VLOOKUP 与 HLOOKUP 函数,大抵是一个人是否对 Excel「略知一二」的分界线。

但 VLOOKUP 函数虽然简单、易用、强大,却仍然有一些呆板的地方,这也很正常,在计算机程序里,「简单易用」往往「灵活多变」的反义词。VLOOKUP 函数的「查阅值」必须位于单元格区域的第一列,这让我们在表格中使用 VLOOKUP 函数时,不得不按照自己的需求重新组织单元格区域的结构,以让 VLOOKUP 函数可以正常工作。

那有没有方法可以让我们在达到 VLOOKUP 函数功能的同时,又可以避开这个「查阅值必须在首列」的白璧微瑕呢?答案就是使用「INDEX 和 MATCH 函数的组合」,我将在下文具体说明这个技巧。

继续阅读

JavaScript 笔记(一):字符编码

作为一个比较懒的人,我没有记笔记的习惯,结果大量不算常用的的内容就都只是记了个大概,每次用到时都只能现场谷歌。为了改掉这个习惯,今后遇到有趣的事情都会记录这样一篇笔记。

一方面,这些笔记可以让我在习惯性的遗忘一些知识时能够更快的回想起了,另一方面,也许也可以给同样正在学习 JavaScript 的同志们一些经验。

——王兆基 二〇一八年十二月八日

0x00:URI 编码

不管知不知道 JavaScript,几乎所有人都在浏览器的地址栏里见过 URI 编码,也就是类似于这样的东西:

图 1 浏览器地址栏的汉字 URI 编码

图中被红框框住的「%E7%8E%8B%E4%BC%AF%E6%96%87」,实际上就是汉字「王伯文」在 URI(Uniform Resource Identifier,即统一资源标识符,也就是我们俗称的网址)中的「转义序列(escape sequences)」。这些转义序列按照标准,是用 UTF-8 的编码方式编码每个字符的。

当然,如果只是使用的话,其实只需要知道,JavaScript 里可以用 encodeURI 与 encodeURIComponent 方法将 URI 中的字符进行处理,使用一到四个转义序列来表示字符串中的每个字符的 UTF-8 编码。但是我们总是会有许许多多的疑问,比如:encodeURI 方法和 encodeURIComponent 方法有什么区别?为什么是一到四个转义序列?为什么用的是 UTF-8 编码? UTF-8 编码又是什么?这个转换过程是怎样的?这就需要去了解更多的知识了,我将记录在下面。

继续阅读

为 Developer Tools 增加 console.save 保存数据功能

  Google Chrome 浏览器的 Developer Tools 无疑是非常好用的一个工具,它有语法着色与最新的 ECMAScript 标准支持,于简洁性上胜
Visual Studio Code 半子,于易用性上胜 Node.js REPL Terminal 一步。因此,在写一些代码片段时,我往往会直接用 DevTools 环境编写代码并测试。

  但是,在 DevTools 下编写代码却有一个硬伤,就是数据的保存问题。console 可以将各种变量输出在屏幕上,却无法直接将其保存到本地文件,数据少了还好,数据多了后每次手动保存就很伤。正好最近我写了一个简易爬取京东评论的爬虫,需要批量保存数据,便想找到一个更好的方法。

  于是,我决定写一小段 Userscript,为 console 增加一个 save 方法,以一劳永逸地解决这个问题。

继续阅读

如何为新版的「四川大学综合教务系统」增加「一键评教」功能

8 月 27 日无疑是个伟大的日子,在 110 年前的这一天,晚清政府颁布钦定宪法大纲,标志着中国第一部真正意义上的宪法诞生。如果把时间继续向前推移,我们会发现,凯撒在这一天登陆英格兰;而如果把时间继续向后推移,我们会发现,摩尔多瓦在这一天脱离苏联独立,甚至在 2004 年的这一天的雅典奥林匹克体育场上,刘翔跑出了 12 秒 91 平世界纪录的佳绩勇夺金牌……

但是,这些事情对我而言,都不如 2018 年 8 月 27 日发生的事情令人振奋——「四川大学综合教务系统」终于更新了。

我是在江安寝室里的一号坑上得知这个消息的,随后我便意识到了一个严重的问题,我先前写的四川大学综合教务助手失效了!老系统都没了,皮之不存,毛将焉附?一个现实的问题摆在了我面前,是补作业还是重构这个程序?在收到下面这封邮件后,我决定补完重要的作业后就把这个程序重构一下。

现在程序已经重构完成,有需要的同学可以点击这里安装使用。

下面我将记述一下重构过程中的一些要点,基本原理和之前旧系统一键评教那篇文章中所讲的类似,所以一些旧文中提过的内容将不再详述。

继续阅读

[译] 如何检测 Chrome Headless(无头浏览器)?

原文链接:https://antoinevastel.com/bot%20detection/2017/08/05/detect-chrome-headless.html

原文标题:Detecting Chrome Headless

原文作者:Antoine Vastel

译者注:自从 Chrome Headless 发布后,各种基于 Chrome Headless 的自动化测试工具、爬虫等项目层出不穷。比起已经停止更新且容易被针对的 PhantomJS、Selenium 等经典自动化测试程序,Chrome Headless 几乎是完美的。然而,比起 Chrome 的普通模式,Chrome Headless 仍然有一些细微的差别,使其会被抓住小辫子……

编者注:我创建了一个库,可以使用浏览器指纹来检测识别机器人与爬虫。虽然这个库仍在开发中,但您已经可以开始使用它了。Github 地址为:https://github.com/antoinevastel/fpscanner

什么是无头浏览器(headless browser)?

无头浏览器就是一种没有图形用户界面的浏览器。它可以被程序控制,从而自动执行某些任务,例如进行网页自动化测试或网页截图。

为什么要检测无头浏览器?

除了上文提到的那两个人畜无害的例子,无头浏览器还可用于自动执行一些恶意的任务。例如,无头浏览器经常被用于网页爬取,增加广告展示次数或寻找网站漏洞中。

到目前为止,最受欢迎的无头浏览器之一是 PhantomJS。不过,因为它是基于 Qt 框架构建的,所以与大多数流行的浏览器相比,它在许多地方都有所不同。正如这篇文章所述,我们可以使用一些基于浏览器指纹的识别技术来检测它。

在 Chrome 59 之后,Google 发布了 Chrome 浏览器的 Headless 版本。与 PhantomJS 不同,它基于普通的 Chrome 而不是外部框架,这使得它更难被检测出来。

接下来,我们将介绍几种可用于区分普通 Chrome 浏览器和 Chrome Headless 的技术。

继续阅读