本站首页 返回顶部 关于博主

怎样让小程序服务器免备案

我们知道,小程序服务器的域名必须备案。然而,扫码签到工具的服务器在国外,没有备案,也没法备案。
小程序服务器不备案,我们是怎么做到的呢?答案就是代理。
下面对背景和解决方案逐一详细说明。 阅读全文 »

小程序开发,那些我们跳过的坑

最近,微信小程序扫码签到工具正式上线了。
回首过去一个月的历程,是时候该停下来做个阶段性的总结了,回顾得失,以便持续改进。这篇文章,就总结一下过去跳过的那些坑吧。 阅读全文 »

一个网络质量相关的无聊问题

      前不久,成都的同事给我演示了一个bug:点击“Upload License”按钮,会弹出Upload License对话框。奇怪的是,如果第二次打开Upload License对话框,从弹出对话框到整个对话框加载完毕,竟然要花费近20秒的时间。
      这是一个部署地为美国的Web应用,我们通过浏览器来访问网页。事实上,这个对话框很简单,基本上在1秒内就应该加载完毕,耗费这么长的时间,的确很意外。
       我尝试着重现这个bug,发现不能稳定地重现。大多数情况,对话框在1秒之内就能加载完毕。重现几率大约10%。据我所知,这个对话框仅需要加载html网页和Javascript代码,和后台之间不存在任何其他的交互。
       排除了与后台交互,等待response的时间过长的可能性之后,我怀疑问题的根源在于Web服务器。于是,尝试着把系统部署在本地的服务器上,发现加载速度相当快。因此,更加确认了我的想法:对方的Web服务器有问题。
       之后,转发给后台的同事进一步调查。同事反馈说,尝试了不下几十次,一直都无法重现。我通过自己的美国虚拟机来访问这个网页,的确,无论如何都重现不了。
       好吧,我只能得出结论,这很有可能是网络问题,排除公司网络防火墙的可能之后,只能是伟大的GFW了。

String.split()保存了原始的char数组

一个朋友发布了这样一条微博

蛋疼的String啊……虽然我之前注意到Java会利用String的不可变性在subString 的时候利用原Stirng的char数组和偏移量创建新的String,但是这还导致了split也一样是浅拷贝。如果想容一个超长的Stirng里 cut出一小部分,其实本体char数组都还在那个小部分里面留着,有撒方法能获取纯净的String吗……

出于好奇,我查看了一下String的代码,原来在String中用一个char[]数组来保存一段字符串,offset表示一个位移值,count表示字符串的长度。从char[]数组中的第offset开始,连续的count个字符就组成了这个字符串。比如说,如果char[]中存储的是"abcdefg",offset是1,count是3,那么这个字符串就是“bcd”。

对于一个原始字符串我debug了一下String的subString()和Split()两个函数,得知在通过这两个方法返回的String都保存了原始字符串中char数组,通过offset和count来得到最终的字符串。的确,和我想象的很不一样。

查看了一下subString()的代码,和String(orgString)这个拷贝函数,发现String(orgString)这个拷贝函数会返回一个“纯净”的String。于是,我回复:

我倒有个办法,不如调用new String(subString)在得到的subString上再创建一个string吧,这是一个深拷贝。如果嫌效率低,不如自己用 Arrays.copyOfRange()自己写一个subString()的方法。

最后,他给我发了一个链接:String.split() will keep original char array inside

嗯,也给出了两种方法:1.使用构造函数;2.自己实现。

让程序只能加载一次

很多时候,我们只允许某个程序加载一次。也就是说,不允许这个程序的两个进程同时运行。 要实现这个功能中,该怎么做呢?本文将讨论Java中是如何实现的。 我找到了如下几个备选方案。
 
1.在临时文件中标记程序的状态。
此方法提出者的观点是这样的:当程序运行时,在某个文件临时文件中写一个标记1;在程序退出时把这个标记改成0。在程序加载时,检查这个文件中的标记值 是什么,如果是0,则意味这系统中没有程序的运行实例。此时可以继运行。如果是1,那就意味着程序已经加载了一个实例,这时就可以直接退出了。 理论上似乎是可以的,但现实往往没那么完美。假设,当程序运行时,临时文件中的标记已经改为1了,这个时候程序异常退出,或者此时强行关掉Java虚拟机呢?程序显然会终止运行,但是临时文件中的标记却停留在了1,而不是期望中的0。当再次加载程序时,显然它会错误地认为已经有一个实例在运行了。 所以,这条路走不通。 阅读全文 »