Finisky Garden

NLP, 软件工程, 产品设计

stunnel简介

stunnel是一个开源跨平台进行通信加密的软件。它可以对原生不支持加密通信的服务(如FTP, Telnet等)在上层提供加密功能,而无须修改这些服务的代码。

stunnel分为client和server两种不同的角色,二者之间的通信使用X509证书进行加密。在初装时,stunnel会自动生成一个自签名的证书用于加密,但它更推荐用户使用自己生成的证书。

阅读全文 »

Selenium简介

Selenium是一个浏览器自动测试框架,可以通过模拟各种浏览器行为完成各种测试任务。但它能做的远不止这些,一个更实用的功能是作网页内容爬取。

有人会问为什么不直接使用curl、python的urllib或C#的HttpClient完成这样的功能,因为后者不容易爬取许多需要javascript渲染的内容。二者的本质区别在于,Selenium是通过一个真实的浏览器(webdriver)行为获取网页内容,而curl类通过http请求获取网页字符串,而不对该字符串作任何解析处理。理论上来说,只要通过浏览器查看源代码能看到的所有html的内容,都可以通过Selenium爬取下来。

阅读全文 »

在贝叶斯推断和参数估计等相关文献中常见\(P(X|Y)\)\(P(X;Y)\)两种不同的表示方法,常常令初学者感到困惑:参数\(Y\)和随机变量\(X\)到底是什么关系?二者有什么区别?

阅读全文 »

《人类简史》的作者在“宗教的法则”一章中对于宗教的出现和解释非常犀利,从成文来看,作者看起来应该像是一个无神论者。搜索引擎上也能看到许多关于基督教徒如何看待《人类简史》的搜索。此处引用一些原文中比较精彩的片段,梳理下宗教发展的轨迹。

阅读全文 »

Intro to NDCG

Normalized Discounted Cumulative Gain (NDCG) is a measure of ranking quality. Typically, it is used to measure the performance of a ranker and widely adopted in information retrieval. Our goal is to rank relevant documents higher than irrelavant documents. Here comes the problem, given a list of documents with corresponding grades, how to model the ranking quality?

Concretely, assume we want to rank a list of 5 documents with grades: \[G = [3, 1, 2, 0, 2]\]

阅读全文 »

There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.

C. A. R. Hoare

The Law of Leaky Abstractions: All non-trivial abstractions, to some degree, are leaky.

Joel Spolsky
阅读全文 »

2021-06-20: 使用Hexo扩展的方式可以更简洁地定制页面,避免了本文实现的一些弊端。Hexo添加自定义分类菜单项并定制页面布局(简洁版)

2020-07-22: 更新hexo-generator-category到v1.0.0后,对应的generator.js代码进行了修改。 2019-11-27: 更新NexT v7.5.0的customcategory.swig文件,与老版本v6.6.0不同。

希望在Hexo的NexT主题中增加自定义分类的菜单,即一个指向特定分类的链接,且页面显示的是类似主页的标题+摘要形式。Hexo的可定制化很强,绝大多数需求都可以直接通过配置满足。真的有额外需求,因为它开源,可以直接在源码上折腾。:-)

阅读全文 »

实际工程中有时需要将同步方法包装在异步方法之中。比如一个类实现了异步接口,而实际实现可能是本地计算的同步操作,也可能是需要HTTP请求的异步操作。对于前者,如果实现中没有await关键字,编译器会提示该方法缺少await运算符,将以同步方式运行。将二者统一的解决方案是使用Task.FromResult将结果包装成一个已完成的Task返回。举例:

阅读全文 »

TCP为什么需要三次握手

简单答案:

  1. client与server需要交换各自的Initial Sequence Number (ISN),至少需要三次交换。
  2. 若采用两次握手,server可能会浪费资源为延迟到达的SYN包建立连接。
阅读全文 »

简介

面向对象软件设计中,如何使软件易读、易维护和灵活适应需求是一个永恒的话题。SOLID原则即为大家在概念上指明了我们应如何达到这些设计目标。相较于设计模式,SOLID是高层次的抽象思想指导,可以说具体的设计模式是SOLID原则的实现。

在具体讨论这些原则之前,需要说明SOLID并不是软件设计中必须遵从的铁律,落地的软件开发还需要根据实际需求进行折衷与取舍。在我看来,软件架构与设计并不完全是技术,而更像是艺术。一个巧夺天工的设计常令人拍案叫绝,生搬硬套地应用所谓设计原则只能是弄巧成拙。

阅读全文 »
0%