关于现在完成时不与时间状语连用
Author: Date:2022年3月1日 - 23:45 PM
就这句话本身而言, 是没有错的. 现在完成时确实某些情况下不与时间状语连用. 但这可以说是一句正确但无用的废话, 而且给学习者指向了一个错误的方向, 那就是把它当作一个语法规则去记忆. 这句话也没有解释为什么不与时间状语连用, 而这个原因其实是不需要记忆的, 甚至也是不需要用文字去教授的, 换句话说这个语法规则没有值得去记忆的有形的文字描述. 如果懂得了其中的含义, 这种规则教学其实是多余的. 它把我们已经知道的东西变成有形的文字描述, 而通过这个文字描述却难以得到其中的含义. 许多语法规则其实是把我们本来就知道的东西用某种方式描述出来, 而看了这些描述反而变得不知道了, 这种类型的知识属于典型的不知道自己知道, 甚至不必知道自己知道的那种.
从问答的角度来看会一目了然. 如果把每一个这样的完成时都当作对某个问题的 回答, 就会立即明白和时间状语连用的问题在哪里.
Java 使用HttpURLConnection发送POST请求和Cookie
Author: Date:2022年2月3日 - 12:06 PM
通常发送POST请求的地方是在浏览器的表单中.
可以通过脚本来自动化这个动作.
PHP 一次性变量
Author: Date:2022年1月17日 - 21:59 PM
一次性变量就是只在第一次判断为真或者假, 但是之后任何基于那个变量的判断都和第一次的结果相反. 如果有一段代码只在他首次执行的时候有某些操作要执行, 而之后都不需要, 那么一次性变量就非常有用. 如果用带索引的for循环可以通过判断索引是否等于0来判断是不是首次执行, 但如果是for each或者是函数被循环执行, 查看索引就无效了. 一个通用的办法是
define定义一个命名的常数, 具备全局作用域, 因此上述方法在循环执行函数中也有效.
在Windows中使用Python结束进程
Author: Date:2021年12月12日 - 22:25 PM
总是有些无用进程会在后台持续运行, 消耗着宝贵的系统资源, 拖慢其他真正重要任务的运行. 虽然彻底卸载掉这些软件会一劳永逸地解决问题, 但是由于偶尔仍会需要用到这些软件, 这不是一个好办法. 我们可以在任务管理器里面手动结束这些进程, 也可以用Python脚本达到同样的目的, 而且更加灵活, 节省更多时间.
当你需要和WIN32 API打交道, 那么Python是个不错的选择, Python提供了相当多的和Windows进程处理有关的选项.
MySQL 查询显示 Copying to tmp DEPENDENT SUBQUERY的解决方案
Author: Date:2021年12月7日 - 12:18 PM
当一个MySQL查询中包含子查询的时候, 一定要格外留意, 最好先用EXPLAIN检查一下, 因为这个查询可能会非常缓慢, 甚至永远无法返回, 如果查询的表只有表级锁, 这个查询会阻塞后续的所有写入查询, 并且发起这些查询的连接也不会释放, 最终导致最大可用连接耗尽, 除非启用管理员账号, 可能连登录数据库都无法实现. 下面是一个案例.
这个查询首先收集那些达到1000次访问记录的IP地址, 然后查询所有来自这些IP地址的访问记录总数.
Emacs字体调整
Author: Date:2017年6月7日 - 19:04 PM
目前我习惯的Emacs字体配置是12倍的Fixedsys显示英文和数字,16倍的微软雅黑显示中日韩即CJK文字. 在Surface Pro上面非常完美,但是并不是每个环境都能很好的支持这个配置.
elisp代码如下
单词fleet的翻译
Author: Date:2017年5月23日 - 21:57 PM
最近看电力方面的东西,发现一个单词fleet,查了半天字典,不知道什么意思.在电力行业中用的很多,例如generation fleet,coal-fired fleet,fleets of nuclear power stations,fossil fleet.
我们从最原始的意义出发,fleet的意思舰队.那么比较直接的引申就是nuclear fleet,即核舰队.航空与航海非常类似,因此自然延伸到代指飞机编队,例如F-16 fleet,jet fleet,fighter fleet.
Emacs 配置文件迁移
Author: Date:2017年4月24日 - 14:11 PM
对于Emacs最重要的可能就是.emacs.d这个文件夹了. Windows上面他位于Roaming目录. 在user/AppData下面. 这里面保存了所有自己额外安装的插件, 命令历史记录, 自动保存的副本等等.
一直都用的很好, 但是总是感觉Roaming里面不够安全, 如果重装系统, 这个内容有可能丢失. 但毕竟和操作系统耦合的太紧密, 对于重度用户, 丢失这个目录是很麻烦的, 这意味着, 多年使用过程中累积的工具都会丢失. 所以最好是把它做成绿色版的, portable的, 只要拷贝复制就可以立即原样使用的.
Clojure 用Monad来解决NULL检查的问题
Author: Date:2017年4月11日 - 19:02 PM
之前用Clojure写了一个小工具来抓取Youtube视频的下载地址, 功能是分析Google提供的API中的数据, 其实就是一个JSON对象, 转换为Clojure map, 然后从中提取想要的数据.
例如
Clojure REPL 自动添加括号
Author: Date:2016年12月24日 - 20:07 PM
有些时候我们希望在REPL中自动给表达式添加括号, 特别是对一些命令行式的程序, 通常只有一行, 毕竟任何任务最终都可以抽象为一个函数极其参数, 这个时候括号就有些多余
比如我们下面一个宏, 执行的时候会调出浏览器转到Google并查询字符串"how clojure repl works"
EOF System.in, Java stream 和 Windows命令行
Author: Date:2016年12月24日 - 17:53 PM
什么是EOF, 如果是一个文件的话, 全部字符读完之后, 继续读得到就会是EOF, 数值上是-1, 例如下面的Clojure代码
这里EOF可以作为循环的终止条件. 在处理stream的过程中最重要的两个符号就是换行符和EOF了.
Emacs desktop-save-mode和autoload冲突
Author: Date:2016年9月15日 - 13:42 PM
问题: 开启desktop-save-mode之后, 连不上CLojure REPL, 提示
查看了一下cider的代码的确有下面的代码
Windows上设置Leiningen
Author: Date:2016年9月15日 - 11:08 AM
Leiningen是用来构建Clojure项目的build工具, 我的第一印象是非常难用, 也不能说是难用, 就是很难跑起来, 第一次用的时候折腾了好长时间, 加上平时都是直接在REPL里面做实验, 也没有发布像样的library, 因此平时基本只是使用lein deps来获取依赖的jar文件.
这次因为实在是需要build一个项目specter snapshot, 因为不是稳定版, 找不到相应的jar, 只能直接从源码项目进行构建, 所以又试了一次.
Clojure基础: require和namespace
Author: Date:2016年9月14日 - 13:18 PM
一个很小的, 很基础的Clojure问题, 折腾了好久. 想要使用某个jar中的某个namespace中的函数, 一直提示namespace not found. 为此升级了Clojure版本和JDK版本, 仍然不行. 其实只需要先require一下或者use这个namespace就解决问题.
原因在于我有了一种思维定势, 即认为加载clj文件和class文件的方式是一样的. 如果一个jar文件中同时又clj文件和class, 文件, 那么只要jar文件在classpath范围内, JVM启动的时候加载了jar文件, 那么所有的class文件就是可用的, 但是要使用全名, 例如java.util.Date, 当然你也可以import一遍, 这样就可以直接使用类名Date. 这是因为这些文件是JVM自动载入的.
Clojure两种递归遍历形式
Author: Date:2016年9月10日 - 14:03 PM
Spector的代码中出现以下两个函数
如果抛开其中无关的具体细节, 而是关注他们的遍历和递归的方式, 会发现本质是一样的, 但是却用了不同的写法, 从理解代码的角度, 显然不应把他们看成两种不同的东西, 而且我们自己写的时候, 也应该保持某种连贯性, 如果意思和意图是相同的, 那么总应该用同一种形式来表现, 如同命名规范一样, 例如如果要一个变量表示total amount, 那么在一个地方写成totalAmount, 那么所有的地方都应该写成这样, 而不是用很多形式来表示同一个实质, 例如total_amount, m_TotalAmount之类的. 那么除了增加多余的噪音, 对代码质量没有好处.
Clojure mutation 例子: 遍历树并收集数据
Author: Date:2016年8月31日 - 17:15 PM
在看Spector的代码, 碰到类似下面的代码
这段代码也许只是完成一个简单的操作, 但是写法让我感觉不那么elegant.
Clojure defmacro cannot be cast to clojure.lang.IFn
Author: Date:2016年8月31日 - 13:19 PM
defmacro 和 defn有着微妙的区别, 不注意的话会出现难以理解的错误. 下面的的macro只是简单的将参数中的每个元素转换成字符串.
抛出错误
Monad, 原来如此
Author: Date:2016年7月8日 - 23:39 PM
之前写过一篇关于Monad的文章, Haskell之纯粹, 非纯粹以及Monad, 但是并没有感觉真正理解了Monad, 当然这些思考打下了一些基础, 一些基本的概念, 形式已经了解. 但是对Monad本身感觉还是隔了一层.
这次重温, 结合已有的基础, 得到了新的理解, 自我感觉, 离真相更近了一步.
Haskell code 用Clojure实现
Author: Date:2016年7月4日 - 19:03 PM
在看 Haskell - The Craft of Functional Programming 2e. 下面的函数
可以很容易翻译为Clojure代码, 函数式语言本质都是相通的
Java InputStream的重大缺陷之一
Author: Date:2016年4月20日 - 12:31 PM
InputStream 可以用来读取URL, 但是却有一个重大的缺陷: 这个调用很容易挂起, 而且永远不返回, 这个时候唯一的办法往往是重启JVM. 因为默认是没有设置timeout的, 也就是会永远等待, 而有时候服务器会莫名其妙的突然不响应, 其实可能数据以及发送完成了, 可能还缺最后一个数据包, 但是这个数据包很可能再也不会返回了.
这个情况的出现是不可预料和完全随机的, 前一秒钟有问题, 下一秒钟就可以了, 就好像有时候我们打开一个网页会报错, 但是下一秒刷新一下又会正常一样.
Clojure中使用正则表达式的两种方法
Author: Date:2016年4月19日 - 16:21 PM
一直以来我都不知道Clojure里面的正则表达式有两种语法, 我一直以为只有一种, 那就是Java的语法, 因为Clojure根本没有自己的正则表达式引擎, 而是完全依赖于host, 如果是JVM就是Java的语法, 如果是Javascript虚拟机, 那就是Javascript的语法.
其实Clojure这里做一个小小的优化, 那就是#语法, 例子:
Yandex 跟 Google还是有明显的差距
Author: Date:2016年4月19日 - 9:11 AM
因为用Google很麻烦, 或者有时候根本用不了, 于是有些时候我就会替代性的用一下Yandex, 一开始还没有察觉出什么, 但是用的时间多了之后, 明显感觉到Yandex不能很好的理解我的查询, 返回的结果质量和Google确实有差距. 这个感觉非常明显, Yandex返回的结果的相关程度更低, 找到想要的内容花费的时间更多.
下面是两幅截图, 搜索同样的字符串
TokenStream contract violation: reset()/close() call missing, clojure
Author: Date:2016年4月18日 - 19:30 PM
准备将一段Java代码转换为Clojure代码, 是处理关键字高亮的
Eclipse中用的是Lucene 6.0.0, Clojure的用的是4.0
PHP preg_match 非贪婪匹配的神秘bug
Author: Date:2016年4月16日 - 15:52 PM
很偶然的发现php的正则表达中有一个神秘的bug, 结果是执行一个简单的表达式匹配耗时超过30秒, 而且似乎只在Windows平台上出现, 同样的表达式, 同样的输入数据, 在Linux上检测不到延迟, 即我们精确到毫秒的时候是检测不出来的, 也就是说正常情况下这个语句应该在1毫秒以内完成, 但是在Windows上面却要耗费30秒.
VIM 几个小问题
Author: Date:2016年4月2日 - 19:35 PM
根据几件小事来说说对VIM的感觉.
不支持动态高亮, 即边打字边高亮, 这些功能在Emacs和Sublime里面都是默认的, 因此在VIM里面很不习惯, :set hlsearch是在输入完成按下Enter键之后才会高亮, 而且高亮会一直保持, 除非你下次再搜索, :set incsearch 只会高亮首个匹配.
Emacs 内置中文输入法pyim
Author: Date:2016年3月29日 - 21:57 PM
Emacs加win8加中文输入就是灾难, 第一个搜狗输入法, 因为经常死机已经被我给删掉了, 然后是bing输入法, 果然是自家的产品, 通常情况下表现很好, 但是偶尔也会出现失效的情况, 这个时候真是要命, 重点是这个时候不能输入中文, 而且必须重启系统才能恢复正常, 但是我不想重启. 而且我是打死不用微软拼音的.
然后又尝试了谷歌拼音输入法, 结果十分钟阵亡, 而百度, 我连尝试的念头都没有了.
用Clojure和Emacs写博客
Author: Date:2016年3月20日 - 23:04 PM
写作的最佳环境还是Emacs编辑器, 网页界面的编辑器无论多么强大, 永远也不可能比得上Emacs. 但是我想更进一步, 完全不考虑web界面, 所有的动作, 发布, 修改, 更新都在Emacs里面完成, 这样的话, Emacs就显得有点不足, 编辑本身才是他的强项, 而其他的任务例如和HTTP, FTP, 文件系统打交道更适合像Clojure这样的脚本语言.
而Clojure的REPL可以完全融合在Emacs里面, 那么整个过程都不需要离开Emacs就可以完成.
Python脚本使用urllib3和BeautifulSoup4实现网页抓取和分析
Author: Date:2016年3月20日 - 22:36 PM
好久没有用Python来做网页抓取和分析了, 这次有个客户指定要用Python, 原来的脚本用到urllib2居然都已经下不到了. 唯一可用的是urllib3, 不过Python还是一如既往的方便, 很快就把所有的依赖全部搞定, 代码页非常简单.
首先按照需要用到的依赖, 执行如下命令.
Yandex图片搜索格式更改
Author: Date:2016年3月18日 - 16:41 PM
Clojure抓取Yandex图搜索结果的脚本突然失效了, 原因是Yandex所返回的HTML的格式修改了, Yandex修改输出格式相对频繁, Google几乎不怎么变.
原来的格式
Emacs以所见即所得的方式插入换行符
Author: Date:2016年3月18日 - 16:30 PM
最近碰到一个很小众的需求, 就是在Emacs中以所见即所得的方式给一个段落填充换行符, 查阅了Emacs自带的各种填充换行符的方式都找不到符合这个要求的. 我需要的是把在某个frame宽度下形成的auto wrap格局变成对应的hard wrap格局.
例如之前是这样
PHP UTF8 BOM和session_start
Author: Date:2016年3月18日 - 13:22 PM
PHP的老问题, utf8和BOM, 又让我给碰到了, 已经不记得是多久以前处理过与之有关的问题了.
首先是莫名其妙的session_start问题, 在代码里找了半天根本找不到哪里有内容在session start之前发送出去了.
抓取网页常见问题总结
Author:
Date:2015年12月7日 - 0:00 AM有时候我们需要程序化的方式访问网页, 最典型的应用当然是网络爬虫, 但也可以是其他有用的应用. 和通常的用浏览器访问不同, 爬虫会碰到一些意想不到的问题, 一般大型站点基本都有某种反爬虫策略. 不过理论上, 服务器是无法完全区别浏览器和爬虫的, 只要不是恶意的发送大量请求, 基本可以绕过这些限制, 下面是常见的问题总结.
Referer
Clojure脚本处理yandex图片搜索和Youtube视频下载地址
Author:
Date:2015年11月25日 - 0:00 AM论搜索能力, Yandex不再Google之下, 有时候比Google的结果要好, 下面的Clojure脚本将会抓取Yandex图片搜索的结果并提取所有图片的图片地址, 来源网址等信息, 这样可以在同一个界面中以原始大小显示所有图片.