去掉了WordPress自定义摘要,翻页终于不错乱了

有读者反馈说看我博客的时候,翻页到后面或者搜索的第一页就出现页面错乱,我以为是个别文章的问题,昨晚花时间研究了一下,原来是WP摘要显示的问题。

因为2018年以前的博客是ASP平台的ZBlog,转换WordPress过来的时候,原来的自定义摘要也自动带过来了,但有些图片并没有替换src地址,还带着<#ZC_BLOG_HOST#>字样的url,狠了狠心,索性把所有的自定义摘要都删除了,可能会丢掉一些重要的信息。

我翻页到很多页,终于没有页面错乱了。

搞了个开发者专属Linux云主机

2018年重新捡起PHP,把博客从ASP平台的ZBlog转为WordPress,2019年弄了个VM虚拟机玩了一下CentOS的Linux系统,但弄虚拟机有点麻烦,下载CentOS安装包,安装到VM,基本配置跑起来,为了安全做快照,一个虚拟就得占用几十G,要是不用SSD硬盘,要不是内存足,真得跑得不爽。

这几年.NET Core突飞猛进,C#开发也开始从原来的.NET Framework逐步升级,为方便研究在腾讯云买了个Linux主机,1核4G2M只要376元2年。

昨晚花了2小时设置服务器端口放行,安装宝塔,配置LNMP(Linux+Nginx+MySQL+PHP),手动安装PHP7.3/4,先部署了个WordPress测试下(网站还得备案才行)。

有兴趣的话,赶紧趁有活动买一个玩玩。

活动链接地址:http://cloud.tencent.com/act/developer?sk=40902ab8511057d4d636e0640b291ce3

活动时间
2019年12月1日-2020年6月30日
活动对象
通过本活动开发者认证,且未在腾讯云付过费的用户(协作者除外)

通过我上述链接注册购买,我可以获得3个月的免费延长使用。你购买好加我微信,我发50元红包(3*376/24=47)给你。

.Net下请求Infor LN ERP WebService的5种方式

随着这几年Restful API的兴起,Web API遍地都是。以前老的WCF、WebService等的SOAP的份额越来越少。但总有些古老的应用或者企业级如ERP应用还是通过Web Service的方式提供对外集成接口。Infor LN ERP就是其中一个。

我这几年尝试了以下5中方法,与LN进行对接。

1、客户端代理类
2、动态代理类
3、WebClient
4、WebRequest
5、HttpClient

但前两种已经被我放弃了,后三种呢其实都是HTTP Request,通过标准的写法都可以很方便的与LN对接,注意两点:

1、拼接发起请求的XML
2、LN WebService返回500报错的时候,报错信息的转换
3、不要直接用using的方式使用HttpClient,因为由来已久的高并发时无法释放资源的bug,会让你崩溃。

至于后面三个方法,你可以从网络上找到一大把的Util/Helper类库,我就不贴出来了。

GitHub Desktop清除本地缓存

自从GitHub提供一个私有仓库最多3个协作者之后,我就开始尝试使用,一开始也在用.gitignore(https://github.com/github/gitignore/blob/master/VisualStudio.gitignore),后来增加Uni-App的代码,有个unpackage\dist的目录增加到忽略清单,但怎么都不生效。

后来只有求助百度、Google,得到解决方案如下,试了之后果然好了。

git rm -r --cached .
git add .
git commit -m "update .gitignore"

有几个注意事项:

1、已经安装了GitHub Desktop
2、打开CMD命令行模式窗口,切换到你的仓库目录,再执行上述命令

WordPress下载:429 Too Many Requests,怎么办

国内访问WordPress官方下载站:https://cn.wordpress.org/download/会经常出现:429 Too Many Requests – nginx的报错,怎么办呢?

这里通过翻墙得到最新版wordpress下载地址:https://cn.wordpress.org/latest-zh_CN.zip

那么如果你用的国外或香港的主机,只需要直接远程下载上面的地址,就能成功。

旧话重提:IIS将http强制https访问的正确方法

我以前写过《DTcms4/5中使用HttpModule将http访问301重定向到https》,也写过《使用Certify来自动申请并配置Let’s Encrypt免费SSL证书到IIS8》都提到了如何将IIS的http访问强制为https,如果你现在搜索.net强制https访问,或者iis强制https等关键词,会看到很多错误的指导。

常见问题1:要求SSL

比方说开启“ 要求SSL ”,然后用 403 的html(在 C:\inetpub\custerr\目录下,注意语言版本)重定向js代码,这个千万别用了。

<script type="text/javascript">  
    var url=window.location.href;  
    url=url.replace("http:","https:")  
    window.location.replace(url);
</script>

常见问题2:图形化设置IIS的URL重写工具

还有些介绍安装微软IIS的URL重写工具的,讲了半天一堆截图,操作下来因为版本不一样,还不一定成功,你直接按照我的方法,使用Web Platform Installer安装2.0版本:如下图。

然后也不要去IIS的管理器一个个站点去设置了,只需要在Web.config里面的 <system.webServer>节点内增加如下代码即可:

    <rewrite>
      <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTPS}" pattern="off" ignoreCase="true" />
          </conditions>
          <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
        </rule>
      </rules>
    </rewrite>

如果需要开启HSTS请用以下代码,首次访问不用https,但之后都会强制使用了,所以建议开启!

           <rules>
                <rule name="redirect to HTTPS" enabled="true" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^OFF$" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
                    redirectType="Permanent" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
                    <match serverVariable="RESPONSE_Strict_Transport_Security"
                        pattern=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="on" ignoreCase="true" />
                    </conditions>
                    <action type="Rewrite" value="max-age=31536000" />
                </rule>
            </outboundRules>

常见问题3:WebApi还在用自己写的filter重定向

这个方法未必不可以,但我不认为最优。我也在用,以下代码的BaseSystemInfo.ForceHttps是我的一个系统参数,可以自行切换,如果没有安装URL重写工具,本地测试可以http。

但有了URL重定向,这个重定向代码就不会执行了。

public override void OnAuthorization(HttpActionContext actionContext)
        {
            //先检查是否:强制https访问
            var request = actionContext.Request;
            if (BaseSystemInfo.ForceHttps && request.RequestUri.Scheme != Uri.UriSchemeHttps)
            {
                var html = "<p>Https is required</p>";
                if (request.Method.Equals(HttpMethod.Get) || request.Method.Equals(HttpMethod.Head))
                {
                    actionContext.Response = request.CreateResponse(HttpStatusCode.Found);
                    actionContext.Response.Content = new StringContent(html, Encoding.UTF8, "text/html");
                    //重定向
                    var httpsNewUri = new UriBuilder(request.RequestUri);
                    httpsNewUri.Scheme = Uri.UriSchemeHttps;
                    httpsNewUri.Port = 443;
                    actionContext.Response.Headers.Location = httpsNewUri.Uri;
                }
                else
                {
                    actionContext.Response = request.CreateResponse(HttpStatusCode.NotFound);
                    actionContext.Response.Content = new StringContent(html, Encoding.UTF8, "text/html");

                    //重定向
                    var httpsNewUri = new UriBuilder(request.RequestUri);
                    httpsNewUri.Scheme = Uri.UriSchemeHttps;
                    httpsNewUri.Port = 443;
                    actionContext.Response.Headers.Location = httpsNewUri.Uri;
                }
            }
        }

好了,看完这篇文字,你不要再去搜索查找可行的IIS强制https的ssl证书访问了。

雪花算法:每一片雪花都是独一无二的

标题写得那么文艺,但文字是写技术的。

德国哲学家、数学家莱布尼茨说过一句话:“There are no two identical leaves in the world.”

我想这大概是Twitter为啥把自己的开源分布式 id 生成算法叫做:SnowFlake 算法,中文雪花算法。

顾名思义,就是通过算法能获取到唯一的编号。

这在一般规模应用或者传统企业,都是用不到的。

一般用数据库自增Id或者数据库实现的中心化Id分配,或者GUID、UUID等。

而对于大型互联网公司,这个唯一编号都是刚需。

所以很多国内的互联网公司,如百度、美团、滴滴在Twitter的Scalar SnowFlake ID的基础上开发了Java版、.NET版等,并扩展了很多应用,解决了宕机和时间回拨的编号重复问题,当然了也都开源了,大家可以自行GitHub搜索:滴滴 TinyID、 百度 Uidgenerator、美团 Leaf。

简单说说它的原理吧

Snowflake ID组成结构:正数位(1字节)+ 时间戳(41 字节)+ 机器ID(5 字节)+ 数据中心(5 字节)+ 自增值(12 字节),总共64 字节组成的一个Long类型。

在Java中Snowflake生成的是Long类型的ID,一个Long类型占8个字节,每个字节占8 字节 ,也就是说一个Long类型占64个 字节 。而.NET中Long类型是System.Int64的一个实例。

第一个bit位(1bit):Java中long的最高位是符号位代表正负,正数是0,负数是1,一般生成ID都为正数,所以默认为0。
时间戳部分(41bit):毫秒级的时间,不建议存当前时间戳,而是用(当前时间戳 – 固定开始时间戳)的差值,可以使产生的ID从更小的值开始;41位的时间戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年
工作机器id(10bit):也被叫做workId,这个可以灵活配置,机房或者机器号组合都可以。
序列号部分(12bit),自增值支持同一毫秒内同一个节点可以生成4096个ID
根据这个算法的逻辑,只需要将这个算法用Java/.NET语言实现出来,封装为一个工具方法,那么各个业务应用可以直接使用该工具方法来获取分布式ID,只需保证每个业务应用有自己的工作机器id即可,而不需要单独去搭建一个获取分布式ID的应用。

SnowFlake有什么问题

SnowFlake很好,分布式、去中心化、无第三方依赖。但它并不是完美的,由于SnowFlake强依赖时间戳,所以时间的变动会造成SnowFlake的算法产生错误。

时钟回拨:最常见的问题就是时钟回拨导致的ID重复问题,在SnowFlake算法中并没有什么有效的解法,仅是抛出异常。

时钟回拨涉及两种情况

1、实例停机→时钟回拨→实例重启→计算ID
2、实例运行中→时钟回拨→计算ID

手动配置WorkerId:另一个就是workerId(机器ID)是需要部署时手动配置,而workerId又不能重复。几台实例还好,一旦实例达到一定量级,管理workerId将是一个复杂的操作。

#0011:提供DTcms4.旺财代码生成器免费版.20170926下载地址

去年写得这篇《旺财2018的618小福利》提到的DTcms4.旺财代码生成器免费版.20170926,当时文中写了加我微信索取,但后来免费发布到很多DTcms的QQ群,而文章没有更新,造成不少加我的朋友拉黑我,因为我没有发下载地址给他,而只是告诉他到DTcms的QQ群里面下载。

为避免更多朋友拉黑我,我决定做如下两件事情:

1、更新原来的文章,注明可以去QQ群索取,或到本文获取下载地址
2、写文本说明,并提供下载地址:http://download.cuiwenyuan.com/DTcms4.旺财代码生成器免费版.20170926.zip

如果您已经在使用DTcms,欢迎 购买付费版 与我一起共舞

DTcms5版本可在淘宝购买:https://item.taobao.com/item.htm?spm=a230r.1.14.13.51f476cb2Kotft&id=545213785654&ns=1&abbucket=14#detail

#0010:这半年来经受得住诱惑

有时候懂得多了,觉得自己的可以做得事情有很多,就会分散精力。

但一旦没有聚焦,结果就难免偏离预期。

虽然目前还没有达到预期,但这半年来如果未经受住这几个诱惑,那现状可能更惨。

这里记录下来,不是显摆,而是分享一下,在我们固有的认知视野之外,听一下来自市场的声音。

脸猪返利机器插件:2万元

脸猪返利机器人官方这么介绍自己:支持微信最新协议、支持QQ,支持自动发单、支持自动发送朋友圈、朋友圈点赞、评论,支持自动微信转账提现等!通通一个软件即可搞定!

脸猪返利机器人支持名片分享裂变、邀请好友裂变、防封设置、网站导购、订单提醒通知、群主提成、分群PID等强大功能,是专为淘客量打造的一款营销推广软件。

虽然这个插件技术上挺简单,.NET的插件编写,ORM用的开源的,表定义和接口也挺规范,示例插件可以直接反编译用于参考。但因为涉及到可能违法或用途不明,就果断放弃了。

QQLite插件:5000元

QQLite的官网介绍

QQLite是对QQ进行功能扩展的程序,在QQLite登录QQ号码后可以按照预先设定的一些指令自动完成某些任务,例如与好友进行交流,执行一些数据交互任务,实现QQ与网站的交互,常用插件等操作。QQLite可以为企业节省大量客服人员和时间,模拟人工应答,完成可以自己搭建客服系统。
QQLite是基于QQ2013正式版协议开发的一款QQ机器人,拥有QQ常用的功能,首款支持发送图片的机器人(PC版协议),拥有完善的插件机制,使用SkinSharp换肤组件,可以自由的变换界面。
QQLite的特色:首款支持发送图片的机器人、快如风——自动选择最快的服务器IP、提供多种风格皮肤供您选择、多线程超快反应、支持插件扩展

QQLite与同类产品相比有如下优势:

发送图片,史无前例,首个支持发送图片的机器人,单纯的文字太无聊啊,来点图片,聊天更生动,推销产品更吸引。
插件扩展,QQLite已经支持插件扩展了,不单止支持接口,还支持插件,完成的功能更强大。
千变万化皮肤,采用SkinSharp换肤组件,几十个皮肤任你换,总有一款你喜欢的。如果都不适合你,不怕我们提供工具让你自己定制属于自己的皮肤。
多线程超快反应,先进的后台处理技术,让您不必等待枯燥漫长的过程。多线程处理更迅速!

需求用了DTcms的系统搭建了Web前后端,现在需要对接里面的数据,做个查询的插件,有点像智能客服一样。微信公众号有个关键字回复功能,他想实现类似的功能。

正好那段时间也没有空,就推掉了。

BaaN ERP远程开发:2000-2500/天

其实这是我的本职工作,从2005年就开始干了,但是越干越不喜欢,因为BaaN ERP下面的开发,不同的版本,程序迁移和重用是个大问题。一直未找打一个很好的方案,重用代码和开发成果。

即便BaaN/LN里面可以将Program Script写成各种公用的dll,但是前端的Form还有Report其实很难迁移和重用,毕竟通过Export和Import进行迁移或者PMC导出来的东西,到不同的版本,兼容性是个问题。

一个月抽出四五天的周末,一万块就到手了。

可是我还是放弃了。

倾听来自市场的声音

其实还有一些朋友或者朋友的朋友要做些网站,简单的小系统开发,比如动态生成认证证书的PDF方便每个学员在线下载和印刷用途等。

还有一些想要付费问一些问题,学习一些东西,或者让我介绍几个人给他项目上用,介绍几个公司给他选型等。

最初我热情对待,但耗费太多时间,后来索性微信丢过去这篇文章《 找我培训、咨询(问问题)、外包、技术支持前,请先阅读 》,瞬间就筛选出真正匹配的人。

最后:鼓励自己,坚持聚焦

真正想做一件事情的时间,不求短暂的结果,其实会发现时间根本不够用。

加上我老婆作为前端,从市场上倾听需求和客户的声音,发现想做成一件事情,真得需要一个团队。

为未来10年布局,现在的每一步都需要脚踏实地,未来任重道远,自己给自己打气加油吧。