开发背景

简单来说,就是原手机因为过度开发调试(自己和手机一起为公司项目牺牲了),导致各种故障。例如随机黑屏,突然死机之类的。

在这种情况下,也为了以后做iPhone应用方便,换了部iPhone手机。

在整部手机里,最舍不得的应用就是DreamReader,为了延续下去,就开发iPhone版本,把Android版移植过去。

开发过程

其实开发过程说不上顺利。说是移植,但实际上跟重新做差不多,毕竟Android的开发和iOS的开发还是有很大差异的,表面上看起来是差不多,但实际的实现方法是完全不一样的。

虽然说困难重重,特别是把Zip库直接重写了一遍,最后阅读器还是成功做出来了。

因为和Android的差异,在Android里是有文件管理器的,直接通过文件管理器把小说发送到手机就可以了。因为iOS没有文件管理器,就增加了小说下载功能,让手机可以直接下载到电脑里的小说。

也增加了3DTouch功能,减少误触,等等,看起来一切还好。

停止开发

按着当时的进度,真的有能力把Android的一切做进去,还能更好。

然而,却始终是绕不过iOS里永恒的难题:手机权限。

本来是想把闹钟功能做进去的,但是iOS限定最多只能响30秒,这对于闹钟来说是远远不够的,所以放弃了闹钟功能的移植。

同样的,二维码功能也是因为权限问题只得放弃。

小说功能是基本移植成功的。

然而,在开发者的权限下,应用只能在手机里运行7天。一旦超过7天就无法运行。

要解决的话要么每隔7天去重新联机更新一次应用,要么去买正式证书。

开始的时候定期联机更新APP还能接受,但次数多了,未免不厌其烦。

去买正式证书,首先证书也不是永久,得每年买一次,价格99美元/年。

如果我是专门做iOS开发的话,购买这个证书也是可以的。但是可惜,我既不是专门的iOS开发,所在公司也不提供这个职位。所以我买的话,就相当于是花99美元/年,来自己买自己开发的应用,心理上无法接受。

最后,小说阅读量越来越少,只能是考虑重新换部Android手机,iOS版停止开发。

真机运行

开发背景

在做一些采集项目的时候遇到一些问题。

主要原因是现在的网站为了更好的用户体验,大量使用AJAX技术,但这给采集带来很大的困难。

DreamJavaScript就是对这些脚本进行解释,协助采集项目完成工作的后端项目。

关联项目

DreamDownloader[开发中]

运行效果

项目演示

演示地址:http://s.dm1.in/C

开发背景

我自己的网站,是基于用户生成内容(User-generated content,简称UGC)模式开设的。网站的信息内容,都是由用户自行发布、维护的,目前信息总量达到150万条。

其中,有不少信息是用户通过图床发布的。因为网站位于境外,用户也比较喜欢使用Photobucket,Flickr等境外长效图床,也因此存在一些问题。

特别是近年来,图床在大力推广收费策略,导致原有的图片大量失效。

网站上的不少信息,特别是用户的专业翻译文章,有使用到图床,因此遭到损坏,实在是令人痛心疾首。

即使是引导用户改变习惯,但原有的各种精华信息的失效仍然非常令人痛心。

于是便在构思此项目,希望能解决图床因策略调整使图片失效,从而影响到用户发布的图文信息损坏,导致网站内容减少,质量下降的问题。

封锁突破

Photobucket的图片服务是非常长效稳定的,储存了超过10年的图片,现在仍然可以正常打开。但是,由于政策关系,国内铁通/移动网络的用户却无法打开图片。

Flickr在国内则经常因为域名被封锁,导致无法打开图片。

通过DreamPic,实现让图像可以对所有用户正常显示。

弹窗提示

网站是加密网站,当引用非加密内容(通常是外链图片)时,浏览器会出现不友好的弹窗提示。

通过DreamPic,可以实现图片的统一加载,消去这种弹窗提示。

故障容灾

这是一个真实发生的案例。

某知名图床发生故障,约2天无法正常访问。

此时,通过DreamPic让图像服务不中断,网站不受影响正常使用。

分流镜像

DreamPic对外使用(指对其他网站使用),是可以对图床破解,让受限的图像能正常显示。对内使用,通过配置也可以实现一些复杂效果。

DreamPic有图像缓存智能管理功能,通过配置多域名,实现同ISP加载图像。电信的加载电信的图片,联通的加载联通的图片,境内加载境内的图片,境外加载境外图片,让网页的加载速度进一步提高。

相关新闻

注意!受Photobucket政策“勒索”,亚马逊、eBay卖家产品图片受影响

http://www.cifnews.com/article/27242

效果演示

自己的网站不方便演示,就使用在考驾照时,报考网站上的一篇新闻做为示例。

防盗链功能

因项目的特殊性,极易被复制至第三方使用。

为避免被滥用,DreamPic有防盗链功能。

打开防盗链功能的话非指定网站使用就会有相关图像提示。

开发背景

因工作和个人需要,一直有使用远程控制的需求,使用过多款远程控制软件。

在Linux下,SSH能解决绝大部分的问题,但Windows是以GUI为核心设计的,而且软件大部分也是基于GUI设计的,所以命令行模式太弱,无法满足需求。

远程控制软件大部分都是基于CS模式设计,每次都要安装个不小的客户端(例如pcAnyWhere等),我希望的是随用随走,这实在是不方便。

而Windows Server自带的远程桌面功能,会生成一套前台和后台的远程桌面,桌面内容不相通,更重要的是远程桌面下不少软件因为权限、驱动等问题无法正常运行。

最终找到一款可以在网页上运行的远程控制软件,完美解决所有问题,用了好多年。可惜因为浏览器升级关系,不再兼容新版浏览器,非常可惜。

使用过多年的境外服务器,有部分是网页控制台可以直接使用远程功能的。Linux下的终端控制台做得很好,但Windows下只见过一次某服务商提供基于VNC的网页远程控制,但是需要安装Java插件且使用体验极差。

HTML5带来了更多的可能性,通过HTML5来实现一个基于浏览器的随用随走、免安装、免插件的远程控制,就是DreamRemote的开发初衷。

剪贴板

在使用里,经常需要把一些数据复制到远程主机,其中剪贴版文字更是特别多,所以做了这个剪贴板复制功能。

刷新速度

极速:10帧/秒,默认:5帧/秒,普通:2帧/秒,稍慢:1.25帧/秒,最慢:1帧/秒。

项目演示

因为项目的特殊性,可以直接对服务器进行控制,不方便在线演示,只提供现场演示。

项目截图

开发背景

Pvz指的是Plants vs Zombies,也就是知名手机游戏植物大战僵尸2。

随着对游戏的了解,感觉可以通过辅助工具让游戏玩得更轻松。

要注意要是本项目针对的是自己玩的iOS端,但Android端的账号和游戏服务器等都是iOS端分离的,不在适用范围内。

项目的运行不需要设备越狱。

本机存档

游戏本身有两种存档。为了不跟主题混淆,称为云端存档和手机存档。

云端存档就是玩家在游戏服务商的游戏服务器里的游戏存档。云端存档可以让玩家在iOS设备,普遍是iPhone、iPad之间迁移游戏存档,还有就是因恢复出厂设置、设备丢失等原因丢失游戏数据后可以从云端重新下载游戏存档。

手机存档就是指游戏在手机里的存档数据。游戏是可以离线玩的,离线玩的时候使用的就是手机存档。手机存档会经常自动与云端存档同步。

云端存档是用户是拿不到的,而手机存档在设备没有越狱的前提下也是拿不到的,这给备份游戏数据带来了麻烦。

而本机存档,就是项目在游戏官方认可的云端存档和手机存档之外,建立的第三种存档。

理论上,可以通过本机存档,可以让新手账号直接达到满级,获取海量游戏金币等作弊功能。

我开发此功能的主要目的,主要就是在不越狱的前提备份存档,还有在竞速比赛排名上,通过快速布阵来提升自己的排名。

游戏本身的规则是需要一关一关打下去才能获得需要的植物的,但我通过本机存档可以直接一开始就可以获取满植物。

阵型快速切换

还有就是,随着比赛难度的增加,前期阵形与后期阵形是不一样的。

前期阵形主打快速通关,各种暴力输出。但是随着难度的增加,各种暴力输出都会变得无力。所以后期阵型主打的是稳定通关。

可以这么认为,后期阵型虽然稳定但不能快速通关,所以在前期使用会导致通关变慢,从而使排名下降。而前期阵型在后期则无法通关。

而解决方法,就是在本项目里,通过快速切换本机存档来快速更换阵型。

再举一个通俗一点的例子吧,例如英雄联盟,相信很多人都玩过。

游戏前期的时候,对方的血量防御都比较低,这时候一般是用固定攻击,这样会比较有效果。如果这时候用百分比攻击,打个半天,是吃力不讨好。

但到了游戏后期,对方的血量和防御都达到了一个非常高的水平。这时候使用固定攻击,几乎无法让对方受到实质上的伤害,这时候就要使用百分比攻击了。

无尽挑战补充

在竞赛的时候,植物是有限制的,只能在通关以后获得。

但是通关后的获取植物,是类似于抽奖性质的,不一定能得到自己需要的植物。

之前有玩家统计过,要是运气不好的话,要60关以后才可以得到全部植物。

此功能是通过作弊取得自己需要的植物,让通关奖励最大化,20关就可以在竞赛中得到全部植物。

钻石加速载入

这个是本项目中,2个不为作弊而开发的作弊功能之一。

钻石,是指游戏里的货币。

所有充值类游戏都会有明显地方放置一个充值入口,以增加运营收入,包括本游戏。

问题是,在竞赛的时候,这个充值入口被放到一个很容易被误碰到的地方,这个明显是游戏厂商故意的设计。

本来误碰到充值入口,只要关闭就可以了,也不会有什么实质损失。

但是这个充值入口,一但点击就会跟云端通讯,速度快的话也要等2-3秒加载完成后才可以关闭。要是一旦运气不好,服务器连接失败,就得退出游戏重玩,非常的让人不爽。

这功能就是加速通讯,让点到充值入口以后可以在1秒内加载完成并让玩家可以马上关闭。

无尽挑战计时

这是另一个不为作弊而开发的作弊功能。

到了游戏后期,对方的防御和血量达到了一个非常惊人的地步。厂商认为玩家不可能在短时间内通关,所以就用通关时间计测,做为检测玩家作弊的一个手段。

这个在以前还是有效的。然而,随着游戏不断地推出新植物,玩家们不断地开发出新玩法,已经把短时间内不需要作弊而通关变成了现实。

在这个时候,因为厂商的防作弊而把玩家判断为作弊玩家,并取消竞赛成绩,这是非常不人性化的。

更重要的是,经过了这么长时间,也没看到厂商有修改这种不合理防作弊手段的说明与行动。

所以,项目里就增加了计时功能,在竞赛中,可以实现自动开始倒计时,只要在倒计时完成以后再通关,就可以免除取消竞赛成绩的风险。

项目截图

运行效果

在线演示

测试账号:admin

测试密码:admin

测试地址:http://s.dm1.in/7

测试环境下,部分后台设置禁止修改,请见谅。

开发背景

短网址服务,是一种常用的服务,服务的应用范围很广。例如目前知名度比较高的腾讯短网址服务t.cn,淘宝短网址服务tb.cn,谷歌短网址服务goo.gl,twitter的短网址服务t.co。

机缘之下获得了一个3位数的域名,用来做短网址服务是非常适合的。

自己所发表的演示链接,日后的链接地址可能会发生变化,希望通过短网址服务统一管理,实现长效链接。

短网址服务对SEO有负面影响,自己也不可能像某些大公司一样使用一个专用域名,折衷之下就使用了一个较短的二级域名。

主要功能

方便用户输入网址链接。

方便用户分享、推广网址链接。

可以应用在二维码上,减少二维码的复杂度,提高识别率和容错性。

应用在二维码上时,通过DreamShort后台设置,实现〖活码〗功能。

使用说明

  1. 登录系统,本系统仅有后台
  2. 进入网址管理
  3. 添加网址

项目截图

在线演示

测试地址:http://s.dm1.in/G

测试账号:不需要,直接微信扫码登录

测试邮箱:支持163,126,QQMail,Gmail,邮箱IMAP账号无法提供,请自备。

后台地址:仅现场演示

开发背景

电子邮箱,在计算机历史上是一个历史悠久的服务。

现在仍然有很多网站以电子邮箱做为登陆账号、认证、密保工具。

尤其对于外贸企业,电子邮箱是一项非常重要的服务。

对于我个人来说,因为接触网络的时候比较早,也顺势使用过不少邮箱,例如:

Gmail, Hotmail, Yahoo, 163, 126, QQMail, 已经停止服务的中华邮等等,甚至有一些已经遗忘了。

自己的使用习惯上,境内多用QQMail,境外多用Gmail,每月的信用卡账单,服务器月账单,电子钱包等等都是通过电子邮件处理的,一直有计划去统一管理这些邮箱,让信息处理更便捷。

近年来各大电子邮箱都在做IMAP支持,这让不使用WebMail去管理邮箱邮件成为了可能,目前是使用著名邮件客户端ThunderBird来管理邮件,但是也存在一些问题。

最主要的问题,就是Gmail收信,因为国内网络政策关系,Gmail的收信一直不稳定。

要解决Gmail收信困难的问题,必须得把收信服务放到境外,这就意味着不能单靠ThunderBird来解决这些问题。

HTML5的出现,带来的更多的可能性,特别是让即时收信通知成为了可能。但是PHP因为本身的限制,并不适合本项目的开发。在学习Go后,可以把之前的想法实现出来。

微信扫码登录

通过微信扫码登录,让系统在接管了大量邮箱和邮件信息的私密信息前提下,既避免了目前主流的撞库问题,又能更安全方便地登陆,登陆后通过微信通知账号所有人,避免盗号造成损失,尤其是完成了DreamWeixin后,多项目共用微信登陆成为可能,也不会影响到后续其他项目使用同一微信可能产生的问题。

多语言设计

在前公司,曾经做过一个PHP的多语言项目。总经理让我把单一语言设计的简体中文的公司框架后台,做成五国语言任意切换的后台系统。任务我是完成了,唯一不足的是,总经理没有给我前台,只要求我做后台的五国语言,后来可能是把项目给其他同事做了,后面项目如何就不清楚了,反正后续,或者成品,我都没有见过,DreamMail的多语言设计算是弥补这一小遗憾。

另一方面,客户经常需要修改一些前台文本,每次都需要直接修改模板或者修改源代码,于是就考虑到把前台文本放到后台统一管理,把这两个结合起来的成果就是目前的多语言管理模块,以后的所有项目都是基于这个多语言模块设计完成的。

邮件解码

电子邮件于1971年出现,1987年进入中国,已经有将近50年的历史。

也因此,邮件格式异常地多,再加上各种垃圾邮件,不标准邮件,不规范邮件。

也不敢说DreamMail能正常识别所有邮件,但是就目前来说,上线以来,我几个邮箱里的几千封邮件还是可以正常识别出来的。

支持邮箱

目前支持QQ、163、126、Gmail。

如能提供其他邮箱账号,可现场增加其他邮箱支持。

关联项目

DreamWeixin

使用说明

1. 通过微信扫码登录,未注册用户也可以扫码。DreamMail可以自动识别语言,也可以手工选择语言。

2. 根据提示填入邮箱账号及密码。要注意的是,部分邮箱(如QQ)里,IMAP的密码跟登陆密码不一致,而且默认只能收1周内的信件,这需要在邮箱里自行设置。

相关动图

项目截图

后台截图

开发背景

数据备份本来就是很常用的操作。

网站数据库记录已超百万,以前用的备份工具效果不理想,自带的数据备份早因数据过多而失效。多年来一直手工操作备份、打包,操作似乎有点太繁琐,而且有些时候因工作太忙,难免会延误备份。

近年来的开发项目多与数据库相关,随着项目的增加,数据库的增加,备份越来越复杂。

之前有考虑过用PHP做一个备份工具,但始终是不适合,因而一直没有落实。

之前所学的编程语言大都是Windows下的,在Linux下无法很有效地使用。所以,在学习了Go后,发现用来做此项目实在是非常适合,终于可以把之前的想法实现出来。

开发限制

MySQL的备份工具普遍是PHP做的,但是我网站也是用PHP做的。在进行备份时,因为数据量大,备份时间比较长,导致PHP进程一直卡住,进而影响到网站的正常访问。

由于PHP有在线运行这一特性。虽然可以取消,但是需要高权限,而且一旦设置就全局启用,一旦其中一个脚本卡住就很容易导致全部当机,非常不安全。

PHP还有被动运行的特性,不适合做定时任务,尤其是空闲期运行的定时任务。

PHP的开源特性,用于加密解密数据库,实在是不适合。

综上所述,PHP不适合本项目。

定时备份

由于数据备份涉及到大量数据库读取操作,会影响到网站的响应速度。

定时备份有2个方面,一方面是指以固定的周期,对数据库进行备份。

另一方面,是指在固定的时间,对数据库进行备份。

而这个时间,必须是网站访客较少的时间,既能加快备份的速度,又可以减少对网站的影响。

分卷备份

数据库备份工具普遍都有分卷备份功能。

开发的想法是好的,可是,对于大数据的网站,反而不适用。

首先是分卷备份会导致备份时间大幅延长,尤其是对于PHP做的备份工具,会导致整个PHP进程卡住,影响到其他PHP进程,特别是网站的正常运行。

更重要的是,分卷备份对导致大量重复的数据库分页操作,增加数据库负载。而且在备份过期中,不可避免地产生表锁。重复地分页,不断重复的表锁,极大地影响到相关项目的正常运行。也是因为重复地分页操作,导致备份会越来越慢。

在之前的一个企业项目中,就有一个1G多的数据库,开始的时候1秒一个分卷,10个分卷后就1分钟一个,到后面几个小时都备份不了一个分卷。

参数加密

为了方便安装使用,所有配置都是通过命令行参数设置的。

然而要备份数据库,不可避免地需要数据库的账号密码。

但是把相关资料明文放出来,始终有所不妥。最后的解决方法就是加密参数了。

加密算法是通过正反向乱序四次加密的,所以,无论是增、删、篡改密文或部分密文,都无法得到原始数据。

压缩备份

数据库大多数是文本内容,所以有非常可观的压缩率。

经过压缩后,既可以减少空间占用,又加快了传输速度。

这里特意使用了7z压缩,既不需要像RAR一样需要商业授权,也有着比ZIP、RAR更高的压缩率。唯一不足就是压缩时间稍长,但毕竟是在服务器空闲时间处理的,不会影响到其他项目的正常运行。

加密备份

为了数据安全,导出的数据库备份会被加密处理(可选)。

远端备份

数据库备份完成后,会被发送到远端统一处理。

然后用户就可以到远端定时管理、下载数据库备份。

操作流程

1. 准备好相关参数

示例参数

-mysqldump=/usr/mysql/bin/mysqldump -7z=/usr/7z/p7zip -password=123 -dbhost=localhost -dbuser=root -dbpass=root -dbport=3306 -url=http://127.0.0.1:8080/

2. 在服务端生成密文

3. 在数据库服务器上安装客户端,并添加crontab任务

运行效果

开发背景

在开发过程中,免不了要接收第三方通知。

比较典型的,就是在做电子商务时的各种支付网关的推送通知,还有接收微信的推送通知。

接收通知需要公网地址,但是目前的民用网络,是没有公网地址的,这给调试开发带来了很多麻烦。

一些下载软件,例如著名的BT下载,eMule下载等P2P下载工具,也是需要公网地址才能达到最高速,传统方法是通过UPnP来做端口映射。以前的电信是有公网地址的,通过UPnP是可以解决问题,但是现在电信也不分配公网地址了,所以这种方法也随之失效了。迅雷也通过中转服务器,离线服务器等来实现高速下载的。

细心的读者可能发现了,这个项目就是做DreamWeixin之前所必须解决的首要问题。

可以说,没有DreamTunnel就没有DreamWeixin。

数据转发

由于多年的专业路由器、可编程式路由器的操作经验,使我对网络有一定的了解。

项目的关键,就在于数据的转发,也类似于路由器的NAT操作(两种NAT方式这里不讨论)。

实际操作上还是比较复杂的。

而主要原因,就在于路由器的NAT操作是在内网的,路由器可以直接访问到主机,直接做转发还是很方便的。但是我利用的是境外服务器,服务器不在内网,远在美国,甚至还要通过电信→电信内网→路由器,经过重重路障才可以到达目标主机。

通讯加密

因为众所周知的原因,境外网络数据是经过审核的。

虽然我并不发布或接收敏感信息,但数据一多,难免会被误判。

一旦被判断为敏感信息,轻则中断连接几分钟到几小时,重则直接封IP。

为避免这些不必要的麻烦,服务端与客户端的通讯是全程加密的。

项目演示

CS架构的项目,且属于纯命令行项目,不方便在线演示,可现场演示。

演示账号

因为有真实项目在DreamWeixin下运行着,仅提供前台在线演示,后台可现场演示。

测试账号:demouser

测试密码:demouser

测试地址:https://weixin.dm1.in/

开发背景

在前公司,试用期的第一个项目就是做公司的全新项目:微信分销系统,之后的项目不少都是跟微信有关,遇到一些现有模式下难以解决的问题。

比较典型的,就是需要开发一个基于微信的商城,但是客户的微信资料迟迟拿不到,或者申请不下来导致项目受阻。

公司是有一个微信公众号,但也就只有一个,基本是很难借出来开发使用。

微信系统都是独占式的,特别是分销系统是完全基于微信开发的,没有微信开发账号几乎无法运行。

不说和同事一起运行微信系统就会各种错误,开发任务都是一边上线运行一边开发的,稍一不慎就会影响到线上系统的运行。

一个客户,要求他一个微信商户号做他旗下2个网站的支付,等等…

个人的多个项目也需要用到微信功能,使一个公众号可以用于多个不同的项目的共同开发运行,已经是当务之急。

关联项目

DreamWeixinMonitor、DreamMail、DreamMonitor、DreamTunnel等…

使用说明

1. 准备好微信官方的 AppID和AppSecret。

2. 添加账号里填入AppID和AppSecret,直接确定。

3. 如果有提示IP错误的话,就把提示里的IP复制到微信公众平台的IP白名单里。如果不需要推送功能的话后面的操作可以跳过。

4. 如果需要推送服务的话需要继续填写Token,AESKey。如果是之前没有使用过的话可以直接点右侧随机生成。

5. 加解密方式请选择明文模式。DreamWeixin是可以处理加密模式的,但因为我没有认证公众账号,没有办法测试,不推荐使用。

6. 在左侧导航菜单,我的微信里,选择刚才新添加的微信账号。然后把接口配置资料填入微信公众平台。加解密方式请和上一步一致。

程序调用

1. AppID不变,在程序调用里把AppSecret换成DreamWeixin提供的AppSecret(请参考上图微信信息里的AppSecret项目)。

2.请求路径修改,只修改网址部分,其余不变。

例如,原路径为:

https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

修改为:

https://weixin.dm1.in/cgi-bin/menu/create?access_token=ACCESS_TOKEN

简化开发

ACCESS_TOKEN默认是有请求次数限制,和有效期的。但通过DreamWeixin,请求次数不做限制,有效期由DreamWeixin自动管理,也就是说ACCESS_TOKEN不存在有效期,程序可以不处理有效期的缓存等问题。

如果需要刷新ACCESS_TOKEN的话,可以到“修改账号”里,勾选“重新生成AppAppSecret”项目,这样的话AppSecret和ACCESS_TOKEN会一同更新,原AppSecret和ACCESS_TOKEN失效。

DreamWeixin有微信服务器安全验证功能,且每小时会更新微信服务器资料,确保推送信息来自官方。也因此,消息是否加密不会对安全造成影响。

项目截图