跳到主要内容

49 篇博文 含有标签「码农札记」

查看所有标签

最近使用国内网站的麻烦

· 阅读需 6 分钟

都是实名认证弄出来的麻烦,看这趋势,以后国内外的网络世界恐怕要彻底分离了。

我前一阵子买了个域名 https://www.qizhen.xyz/ 。为啥是xyz后缀呢,因为便宜,穷人也想有个独立域名,就不能要求太高了。再后来把自己家里电脑做成了服务器,但是如果要让别人看到我家里的服务器就需要一个内网穿透软件了。这个当然首选用国内软件,否则墙内可能还是看不到。我试了一下“花生壳”等几个用户量比较大的软件。软件做的都还不错,要手机认证,这还好,我还有亲戚在国内,虽然麻烦但还是认证通过了。但接下来就无解了,首先是客户端不允许国外IP;再有使用的域名必须是工信部注册的。我还真试了一下通过腾讯云的服务办理工信部注册,但是这个实名认证就严格多了,需要我打开一个微信应用,实时视频,然后发现我的IP在国外,直接就认证失败。

好吧,这些还难不住软件工程师,我还可以自己搭一个FRP服务来实现内网穿透。在腾讯云上买了了一个最便宜的服务器,服务器在国内。然后呢,发现我连不上那个服务器。开始以为我配置有问题,后来才发现,这之间有墙。那台与服务器的IP和我上网的IP之间根本ping不通。我原以为墙只会阻挡一些特定网站的,没想到,国内的运营商可能是为了避免麻烦,大概是一封就封一大段IP的。其它运营商的云服务器不知道会不会好一点。我使用腾讯云是因为可以用微信登陆,即便我的微信账号是美国的。这让我方便了不少。

后来,只好有买了腾讯云在美国的服务器,这个服务器的IP还可以被国内外用户都访问到,算是勉强解决了问题吧。

以上都是政策引起的麻烦,但如果产品做的还行,总还可以找到方法来用。但是产品也做的垃圾,那就彻底没法用了。新浪的产品就是这样。前些天看到一条新闻说近年新浪微博收入大涨,我有点吃惊,心想:现在还有人用微博吗?新浪曾是我每天都登陆的网站,获取新闻的最主要来源,它的博客,微博也都风靡一时,可惜后来越做越差,我的熟人们大多都逐步离开新浪平台了。我曾经试图使用过一阵子新浪博客,但是它的产品体检极差,最主要的一点:经常是我写了一大片技术文章之后,告诉里面有敏感词,不能发。也不说哪些是敏感词,弄的我完全不知道该怎么改。于是就果断告别新浪,使用Workpress做了博客平台。当然也是有代价的,就是国内用户没法访问了。当时幸好没留在新浪博客,因为现在这个产品已经完全不让我用了。登陆它需要手机验证,但是不论我使用国内的还是国外的手机,它都会显示验证出错。可能因为我的IP地址还在国外吧。虽然我本人无法使用了,但是我惊奇的发现,居然有个机器人正在使用的微博账号自动关注别人和发帖。平均每小时就可以关注一个莫名其妙的账号,然后再转发一些内容。我赶紧再去看看以前好友的微博,也都是很久不登陆得了。果然也有一些账号是被机器人接管了,在不知疲倦的转发微博。我现在算是理解新浪微博的活跃度是哪来的了,没想到新浪堕落成这样了。

查看或添加留言

终于把所有章节都放好了

· 阅读需 3 分钟

https://lv.qizhen.xyz/

花了好几天时间,有一天我还请了休假专门来弄它。还依然存在的一些排版问题就只能慢慢修改了。

Markdown 格式在某些方面的功能还是不太够,最主要的问题可能是表格,无表头的表格都不支持。Word文档转换到Markdown,大部分的表格都是直接使用了HTML标签。显示到时没有问题,但如果要编辑就困难了,满眼看去,全是标签,都找不到需要的内容。

还要特别感谢 lhb5883 网友,最初建议我在Github上搭建博客。我这才惊喜的发现原来Github没有被墙(但愿我不是乌鸦嘴),而且Github也确实是最适合放置开源项目的网站。唯一担心的是LabVIEW用户可能很多都不熟悉Github。

这堵墙给我造成了很多麻烦,更糟糕的是,它还越来愈高了。墙里的可能以为它只是为了圈住里面的人,但实际上它是双向的。我访问国内网站也是越来越困难了。比如我已经完全无法使用新浪博客了,最开始我还可以浏览页面,但是不能看评论,现在正文也经常加载不了了。而且如果要登陆,还要每次让我用国内的手机收验证码。目前,国内用户量比较大的网站都必须要使用手机注册和验证了,也就意味着大多数的常用网站我都无法使用了。如果只是注册需要手机,必要时我还可以请国内亲戚帮个忙,但有些网站每次登陆都要手机验证,就真是彻底不让国外用户使用了。

这次把书开源的过程中还是学习了一些建网页的知识的,之前基本没有任何编写网页的经验。不过对于把博客迁移到Github上,我还是有些犹豫。主要是之前博客的内容很多,还包含大量的图片,链接,留言等等。这些要迁移起来工作量恐怕比迁移一本书要大得多,不知要花多少时间。所以我还得再研究研究,有没有什么更简单的做法。

查看或添加留言

不可解问题

· 阅读需 2 分钟

这两天看到一篇算法方面的文章,提到了不可解问题。于是我自己也想了一下。我能想到的不可解问题只有一类(不知道是否还有其它类型的不可解问题?):是由无限引起的不可解。

比如这个问题“打印出所有的整数”就是一个不可解问题,因为整数是无限的,无论哪种算法都无法将其全部列出。图灵提出的The Halting Problem也是这样一种情况,由于它是一段可能被无限次递归调用的代码,因此无法判断其运行结果。

有一类问题是暂时不可解的,不可解是因为它没有被现有公理所覆盖到。这类问题一旦被发现,人们就会补全公理体系,问题就解决了。比如说哥德巴赫猜想就有可能是这样一个问题。哥德巴赫猜想还没有被证明,所以现在不能确定它是否可解,不过也许有一天人们会发现从现有所有的数学公理都无法证明这个题目,它本身可能就会变成一条公理,被加入到数学体系里去了。

查看或添加留言

对计算机病毒的免疫

· 阅读需 2 分钟

早些时候,看新闻得知今年诺贝尔医学奖得主是三位免疫系统的专家。这几天豆豆生病,我看护他的时候难免就联想到了豆豆的免疫系统是如何工作的。出于软件工程师的本能,我最后由琢磨到计算机病毒防御上来了。人的免疫反应分为两类,第一类是固有免疫,任何细菌病毒侵入之后,人体都会产生增多白细胞,加强它的活力等反应,试图杀死病原。固有免疫若不成功,第二类适应性免疫就会启动,找出病原的特征值,针对这种病原制造抗体将其杀死。现在的杀毒软件的工作方式中,人脑负责了计算机适应性免疫系统的主要工作:分析病毒的特征,制造抗体。不过我想,人类会慢慢把这些工作都交给计算机自己去做的。我想象的将来防病毒软件发展的方向是:首先让计算机具备固有免疫,杀毒软件不需区分病毒的具体类型,只要发现有异常的程序,就对他卸载,删除。再之后,就是考虑如何让计算机自己找出顽固病毒的特征和弱点,有针对性的攻击特定病毒。

查看或添加留言

一个翻墙浏览器的想法

· 阅读需 2 分钟

最近,天朝有封堵了所有Wordpress的二级域名,导致我的博客无法在国内打开了。郁闷之下,我想到如果有人做一个自带翻墙功能的浏览器。

做个可翻墙的浏览器,在技术上应当不难。我的想法是利用p2p技术。当在国内的A电脑上,用浏览器访问wordpress,发现连不同,浏览器就查找自己保留的其它浏览器的ip地址,然后询问其它浏览器是否可以访问wordpress。假如恰好查询到位处美国的B电脑可以访问这一网址,那么A就把自己的请求加密,发给B,B解密后把请求发给wordpress,B读取了wordpress的网页后,再加密传回给A。

不过,这样一来,浏览器的主人就要承担很多不属于自己的流量,可能不会有太多人愿意承担这些额外开销。

查看或添加留言

递归调用的层次限制

· 阅读需 2 分钟

今天调试一个大程序中出现崩溃的Bug。程序不是我写的,而且崩溃的时候Visual Studio也没有给出调用链,我只好自己去定位bug。最后确定程序是在一个自调用的递归函数中崩溃的。一看到递归函数我就发愁了,它的调用深度可能成百上千,根本没法跟进去确定它崩溃在哪一层。后来经同事提示,我才恍然大悟。因为程序崩溃时Visual Studio给出了错误信息是“Stack Overflow”,所以这里最可能的问题就是递归调用层次过深,导致了栈溢出。

我还是挺喜欢使用递归的,因为写起来简单。今天真正调试了别人的程序才发现它缺点也不少,主要是不容易调试,递归层次较深的时候,很难找出错误出现的那一层。相对来说,循环中找出错误出现在哪一次迭代还是比较容易的。

至于递归深度的限制还是个小问题,如果程序正确,很少有递归需要达到那么深的层次。

我仔细阅读了一遍我调试的那段程序,果然发现它有一个逻辑错误,导致了在特定情况下递归永远达不到截止条件,以至于系统出现栈溢出错误。

查看或添加留言

Lucene contrib(贡献软件)下常用模块的功能

· 阅读需 5 分钟

Lucene 是一个开源的搜索引擎,它的基本功能是对文本建立索引,帮助快速找到包含关键字的文档。Lucene被广泛的应用到了各种软件中,目前当需要在软件中添加搜索功能时,工程师都首先会想到借助Lucene。虽然Lucene只具备基本的文本索引和搜索功能,但广大工程师在实际应用中对它进行了扩展,添加了大量高级功能,并且将他们的改进贡献了出来。一些最为常用的功能也被收录到了Lucene的发布包中,被放置在contrib文件夹下。

网上对这些附加的模块的介绍比较少,我最近自己研究了一下它们的功能。用于我工作中使用的是Lucene.net,所以我只查看了.net版Lucene所带的功能,可能比java版得要少。

  • Analyzers\Lucene.Net.Analyzers\AR
    阿拉伯语 Analyzer

  • Analyzers\Lucene.Net.Analyzers\BR
    巴西语 Analyzer

  • Contrib.Net
    提供了一个按字母分词的分析器,可以用于子字符串搜索

  • DistributedSearch
    这个项目居然连个工程文件也没提供,所以我也没实验它。从名字来看,大概可以做分布式搜索的。

  • FastVectorHighlighter.Net
    这是一个用于在目标文档中高亮关键词的库。它的功能较Highlighter.Net更为复杂。但是在我所实验的 Lucene.net 2.9.2版本中,它存在严重bug,根本无法使用。

  • Highlighter.Net
    具备简单的高亮关键词的功能。可以把索引中保存的文本拿出来,然后把搜索词从中挑出来。

  • Queries.Net
    这个工具包由多个功能组成:

  • MoreLikeThis
    输入一段文字,然后它可以根据输入的文本生成一个查询语句,在索引库中查找与输入文本类似的文档。它可以用来制作推荐系统:用户找到了一个文档之后,我根据这个文档的内容给用户推荐一些类似的文档。

  • FuzzyLikeThis
    一个用于模糊查找的查询解析器,与lucene自带的FuzzyQuery功能类似,但是使用起来更加简便。

  • BoostingQuery
    允许在查询的时候,设置“上下文词”和提升分数。若搜到的目标文档中包含有“上下文词”,则对目标文档的得分做相应提升(也可以使降低)。

  • TermsFilter
    可以设定一组词作为过滤器,把包含了任意一个词的文档滤出来。

  • Similarity.Net
    包含了MoreLikeThis这一功能。与Queries.Net中那个MoreLikeThis一摸一样。

  • Snowball.Net
    用于词根搜索。西方语言,一个词义会有名词动词等不同词性,在做词根搜索,忽略一个词语的词性和时态,把包含这个词任何一种变换形式的文档都搜出来。

  • Spatial.Net
    为搜索加入距离限制。可以用于地理信息搜索,比如搜索当前位置一公里范围内的加油站。

  • SpellChecker.Net
    如果用户查询的词找不到答案,很可能是拼写错了。这个模块可以给出正确拼写建议。

  • WordNet.Net
    实现同义词搜索。WordNet也是一个开源软件,它是一个字典,也包含了查同义词的功能。

查看或添加留言

Silverlight程序中显示帧数的方法

· 阅读需 3 分钟

接到一个需求:要在Silverlight程序的界面上放置一些控制选项,可以开关Silverlight的EnableFrameRateCounter,EnableRedrawRegions等和显示效率相关的一些设置项。我开始在网上查了一下,这几个与显示性能相关的设置主要被用在装载Silverlight控件的HTML文本中。在Silverlight程序启动之后,这几个属性仍然可以被修改,除EnableGPUAcceleration之外。问题在于,如果EnableGPUAcceleration没有在HTML文件中被设置为True的话,EnableCacheVisualization和EnableFrameRateCounter也无法工作。看来微软给出这几个属性就是为了帮助开发显卡加速的动画的。

EnableFrameRateCounter被设置为真时,Silverlight界面左上角会显示出几个和GPU相关的数据,其中包括动画刷新帧数。但是我搜索了一下,Silverlight似乎没有提供函数,可以在程序中把这个帧数读出来。MSDN中提供了一个间接方法来计算帧数,利用CompositionTarget.Rendering这个事件。Silverlight没刷新一帧,都会抛出一个CompositionTarget.Rendering事件,对这个事件计数,就可以算出每秒帧数了。不过,用这个方法计算出来的帧数,与EnableFrameRateCounter设置显示的帧数居然是不同的。

CompositionTarget.Rendering事件的发生次数与用户设置的MaxFrameRate和系统繁忙程度相关。而EnableFrameRateCounter显示出来的那个帧数还与Silverlight动画是否需要刷新相关。比如对于一个界面不怎么活跃的Silverlight程序,当Silverlight觉得不需要刷新界面时,它就不刷新,显示出来的帧数很可能是个位数,甚至为0。

查看或添加留言

Scrum

· 阅读需 5 分钟

我居然没能在网上找到这个词的中文翻译(也许可以称为迭代开发?),就直接用英文吧。Scrum是敏捷开发的一种方法,简单来说,就是把传统软件开发流程的周期时间缩短,周期数量增加。就拿LabVIEW做例子吧,目前LabVIEW每年发布一个新版本,如果换用Scrum流程,就应当每个月发布一个版本,一年12个版本,但每个版本的更新只有原来一个版本的1/12。

Scrum现在非常时髦啊,也许是Google的成功起到了示范效应,原来越多的软件企业开始采纳这套开发流程。Google的开发模式被称为永远的Beta版:一个产品刚有几个基本功能就发布给用户去用了,然后再根据用户的反馈,每隔一小段时间就更新一下。

我最初在网上了解到Google这套开发理念的时候,就被它的优势吸引住了:软件的很多新功能都是程序员或者经理拍脑袋想出来的,它们或许并不符合用户的需求。越早拿给用户看,也就可以越早改进,少走弯路。真的遇到一个垃圾想法,也好早死早超生。我当时就预感,这套开发方式必定会被广泛采纳的。

Scrum流程肯定不适用于所有领域。比如说盖楼,原本盖一栋楼要一年:1月挖坑、2月打地基……11月封顶、12月装修外墙。用Scrum就不能按这个顺序了,因为最终用户不关心挖坑、地基和内部结构。所以施工队必须一个月内就挖个小坑、埋几根地基,竖起一面墙,粉刷好,然后给用户看。用户说墙太薄,窗户不够大等,于是施工队下个月按照用户的意见再建下一堵墙。我很怀疑按这种方法,施工效率会有多高。

实际上,使用了Scrum流程的公司也并非都取得了成功,比如说引入Scrum流程之后的诺基亚…… Google的成功与诺基亚的失败也许可以说明开发流程不是影响企业的成败主要原因;或者也可能是因为Scrum不是狗皮膏药,它只在某些领域才能发挥出功效。

还是说我熟悉的LabVIEW吧,LabVIEW的主要应用领域依然是是工业测控。这个领域的用户与互联网用户的一个明显差别就是,工业领域的客户要谨慎的多。受大多数用户喜欢的技术的特点是稳定而非先进。LabVIEW每年升级一次,居然很多用户抱怨说升级太快了。与之对比,某个拼音输入法的用户们天天在论坛上叫:“都几个星期了,怎么还不更新?”让LabVIEW的用户每个月更新一次,他们还不疯了才怪。我估计LabVIEW在这一点上是学不了Google的。

对于不能频繁更新的软件来说,一定要走Scrum的流程,又不能每个月从外部客户那里收集反馈,那就只好去经理那里要反馈了。每个月做一个版本,然后给经理看看,再去做下一个版本。我个人看法:敏捷开发的精髓在于:最终用户的快速反馈使得软件可以紧跟用户需求的变化。内部人员无论是谁,他们的需求都必然与用户不同,都代替不了最终客户。至于Scrum流程上的东西,如每日例会、用户故事、燃尽图之类的都只是形式而已,没了最终用户的参与,新开发流程只能算换汤不换药吧。

查看或添加留言

越来越不喜欢谷歌拼音了

· 阅读需 3 分钟

我本来是Google的忠实用户,输入法也一直在用谷歌的。可是自打Google撤离中国,谷歌的拼音输入法就再没有过什么重大的改进了。前一段时间发现它出了3.0版,心里大喜,赶快下来试用。

用过之后却大失所望,没几天就把它给删了。这个3.0版,在中文输入方面没什么改进,主要功能是增加了一个英文输入助手。开始我想,我也常写英文,或许这个助手会有所帮助,但后来发现,它的帮助有限,弊端却不少。所谓英文写作助手,就是在你敲入英文的时候,提示你所输入英文的中文解释和同义词等。不过实际使用中,我极少需要用它,就算我想查个英文词的用法,查词典会比它更有效。糟糕的是,这个英文助手改变了英文的录入方法:之前都是每敲一个字母就上屏,而现在它和中文一样,要等到一个完整词语敲完后,再敲个什么键,或者按一下鼠标,才真正输入到界面上。这就导致了很多软件的提示功能失效。比如在邮件软件中,本来在地址栏敲一个字母,它就会提示处所有以这个字母开头的收件人,但现在不行了。就算有时,我可以一气呵成写完一个整词,也要再加个什么动作才能把它放上去。用起来真是麻烦至极。

拼音输入法,不在拼音输入方面改进,却弄一个用户并不需要等功能来,谷歌也不知是怎么想的?搞英文助手,甚至还不如像搜狗那样搞换皮肤。我都有点想换用搜狗输入法了,不过听说搜狗有广告,如果正在给同事演示程序的时候,跳出个广告来,多不专业啊。再等等吧,现在输入法多的去了,也许出现一个更适合我的。

查看或添加留言