Find Something Worth Pursuing

时隔整整两年,跟我以前的E-Commerce/IT VP在Skype再次聊天,除了常规的寒暄,说一下近况,问候一下我们这里的疫情和家人朋友。谈到了一些职业规划和人生追求的事情。

这个单词Pursuing,其实我以前都不知道,只是在聊天时看到,然后就记住了。

想到了,很多时候,我们是从交流中学习,靠自己摸索这条路肯定不是最优的。

以前认为越多分享,越多收获。

现在有了新的认识,越多交流,也会越多收获。

如果你还是大四待毕业的学子,亦或是刚毕业没几年的职场新人,在这个疫情影响下的2020,记得多去打开心胸,去认识更多的人,记得在认识更厉害的人之前,通过一定的分享,也让别人感兴趣。

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证书访问了。

通过Infor LN ERP中的EAN字段来聊聊UPC和Code 128

很多人一提起条码(BarCode),我就犯嘀咕,因为我不知道他们每个人所表达的是否是一个东西。

因为条码实在太多了,一维的,二维码,图书的,行业专用的。如果打开BarTender软件,你会发现选择如下。而GS1只是GTIN是全球贸易项目代码(Global Trade Item Number)的一个数据来源而已。

我们常见的微信二维码用得是 QR Code,图书用的是ISBN,商场超市买的很多物品是EAN或UPC编码。

言归正传,在我们Infor LN ERP里面的General Item Data里面有个可以维护EAN的地方,截图如下,红色框里的按钮是我们的客户化定制,连接了一个Web,会自动传递当前的Item Code,如果未匹配过EAN Code,就会自动从已购买的清单里面分配一个,如果已获取就直接显示出来。这个Web页面后台有个数据库,记录着Item Code和EAN Code的一一对应,同时也有一个所有的EAN Code的清单,这个是从第三方机构付费购买的。

如果是美国的公司,这里的EAN Code大概率都是用UPC-A编码,因为UPC(Universal Product Code)码是美国统一代码委员会制定的一种商品用条码,主要用于美国和加拿大地区。

UPC条码也有标准版和缩短版两种,标准版由12位数字构成,缩短版由8位数字构成。

标准版的UPC12的编码结构为:系统码(1位)+厂商码(5位)+商品码(5位)+校检码(1位)。

后来随着欧洲、亚洲、澳洲的需求,增加了一位国家代码,就是第一位,UPC也变成了13位了。美国和加拿大的国家码是0。

标准版的UPC13的编码结构为:国家码 (1位)+ 系统码(1位)+厂商码(5位)+商品码(5位)+校检码(1位)。

而EAN(European Article Number)码是国际物品编码协会制定的一种商品用条码,已经在全球90多个国家和地区使用,通用于全世界。

分配给中国物品编码中心的前缀区间为690-696,再由中国物品编码中心统一分配企业代码,产品代码则由制造商根据规定自己编制。

贴一张最近在国内热销的酒精制品的商品条码图,你用微信扫一扫就能看到来自中国物品编码中心的查询信息。

标准EAN13编码结构为:国家码(2/3位)+厂商码(5/4位)+商品码(5位)+校检码(1位)。

对比一下EAN和UPC的编码,你会发现这两个条码简直一模一样,宽度、高度、条码粗细,位置。不同处是
1、EAN把国家码打在左侧条码内外侧,而UPC是只讲国家码打在条码外侧
2、而最后一位5,EAN打印在条码内测,UPC打印在外侧。

所以当你看到左右两侧都有数字的时候,就是UPC码,卖到美国和加拿大的。

再回到上面看我贴得医用酒精消毒棉片,看看到底是UPC还是EAN?

因为EAN码是在UPC码基础上形成的,所以,在技术上EAN系统的光电阅读器可以阅读UPC系统的条码,而UPC系统的光电阅读器却不能阅读EAN码。

从位数上看的出区别,所以美国亚马逊的商品默认用UPC的话,一旦要上架到欧洲市场,就可以简单的在UPC编码前增加0变成13位的EAN码即可。

亚马逊规定,要在亚马逊上传商品每个商品都需要相对应的条码,UPC码或者EAN码都行。当然了EBay也有同样的要求!中国区的用户可以去亚马逊官方指定的供应商购买,网址:www.barcodestalk.com。

上面是大概的价格,当然购买中国区的到中国物品编码中心官网: http://www.ancc.org.cn/ ,价格上除了一次性加入费用,还有胶片制作费和系统维护费。

说了这么多了,你对EAN和UPC的定义、差别、价格、用途等都了解过了,再来看下Code 128,这个其实在我们仓库、生产运营中更常见,我们常见的生产工单、料号、数量、批次、波次等信息大都用这种条码形式来打印。最普通的扫描枪也能识别这个条码。Code 128可以接受标准数字和大写字母,小写字母,特殊字符,所以除了在企业内部管理,在物流、仓储领域应用非常广泛。

到此为止,我们把Infor LN ERP应用最多的条码就介绍完毕了,如果你还有其它问题,欢迎留言探讨。

Infor ERP LN有用的Session whinp1200m000: Rebuild Planned Inventory Transactions

在仓库的Inventory Planning模块,可以看到Planned Inventory Transactions(whinp1500m000)可以看每一个Item Code在某个仓库的计划进出状态及明细,当然了这里的数据也会反映在计划模块的Item Order Plan(cprrp0520m000)上,但有很多时候,因为网络中断或者其它原因造成在其它业务模块所操作的订单,未能正确的在此处进行必要更新,就造成了不同步。

比方说采购员取消一个采购订单行的时候,如果订单行取消成功了,但此处未更新,就会造成看到还有一笔Open的待收货订单,当然了跑MRP的话,也会根据此错误信息来下采购单。

其实很多时候,我们应该用事务处理,就是一旦失败,就回滚操作,但因为业务逻辑太复杂,此处并未使用事务操作。正因为如此,才有了一个标准的Session – whinp1200m000,你可以通过这个Session来模拟运行来检查一下你公司的系统数据时候有问题。

注意这里有个选项:Update Mode,默认是模拟Simulate,如果要修正数据记得勾选为Update。

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

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

德国哲学家、数学家莱布尼茨说过一句话:“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将是一个复杂的操作。

2020春节假期二三事

今天上班一周了,春节假期里举家被隔离在居所,老家的亲人也一样。

本计划的上海亲友聚餐逐一取消,连拜年都比往年缩水。

有几件事情还是值得在博客记录一下,第一件就是猎头朋友对我的一个访谈发布到了百度、微信和头条,据说访问量很不错。

微信公众号平台:《不做电气工程师,我选择做一名Infor LN工程师 | 100人100岗
百度百家号:《不做电气工程师,我选择做一名Infor LN工程师 | 100人100岗
今日头条:《不做电气工程师,我选择做一名Infor LN工程师 | 100人100岗

第二件事情,是我所从事的ERP专家工作里涉及的厂商Infor被Koch Industries( 美国科氏工业集团 )收购了。这样Infor在制造业的优势可以借助Koch的背景和资金支持,能够追赶下SAP、Oracle和Microsoft。

Infor好了,我的未来职业后半程(35后)还能绑着这棵大树继续做到老。

Infor可能是你从未听说过的大公司, 成立于2002年,总部在美国纽约。

Infor作为全球第三大企业级应用软件及服务供应商,Infor先后将Lawson、SSA、MAPICS、BaaN、SYMIX、Fourth Shift(四班)、Datastream、Geac、EXE、Daly.Commerce、Varial、NxTrden、Aperum等管理软件领域大名鼎鼎的厂商收归旗下。 国内大家用得Infor M3,Infor ERP LN(BaaN)比较多 。

它在全球100多个国家/地区有17000多名员工和68000多个客户。所有这些客户在2018年创造了30亿美元的收入。它是个大玩家。

Infor大事记
2002 年 – 作为一家 ERP 软件公司成立;
2004 至 2009 年 – Infor 收购多家软件公司,并专注于特定行业的应用程序;
2009 年– Infor 收购 SoftBrands,并开发了 Infor ION;
2010 年 – Infor 聘请 Charles Phillips 担任新任首席执行官;Phillips 先生带领 Infor 将业务重点转向行业利基和对客户用户友好的应用程序的开发;
2011 年 – 收购 ERP 提供商 Lawson Software,并将产品系列扩展到服务行业;
2011 至 2016 年 – Infor 通过 CloudSuite Financials 向现代云体验迈进;
2013 年 – Infor 与 AWS 合作; 2014 年 – Infor 收购 PeopleAnswers;首次推出 Infor CloudSuite™ 产品;
2015 年 – Infor 收购 GT Nexus;
2016 年 – 超过 200 个国家/地区的 5800 万用户在 Infor 云中活跃;
2017 年 – Koch Equity 向 Infor 投资 22 亿余美元;Infor 收购 Birst;Infor 宣布Infor Coleman A.I.
2020年 – Koch Equity Development 130亿美金收购Infor

最后要记录的一件事,就是奶奶的生日,今年过得很冷清,因为姑姑们、亲戚们都不能进村,叔叔在家专门托人做了个蛋糕,然后给她烧了顿好吃的。

话说奶奶年级大了,记忆力退化的厉害,相信她并不在乎,而作为后辈的我们更加过意不去。

非典那年记忆

零星的回忆

当年还流行写信,邮局的那种,给爷爷、给朋友都写过。

年前来上海,我就把弟弟买的三星翻盖手机拿过来用了,其实根本用不起。

春节回家跟老家的高中同学谎称带了笔记本,后来火保不住了,落下了过河拆桥的美名。

被老板拉着每天晚上加班到8、9点,感受到了工作的压力。

第一次喝黄酒、加热的那种,喝完一杯没啥感觉,但当晚就醉倒了,之后多年都不沾黄酒。

看着团队从几个人到近20人,然后再变成几个人。

开始搞网站,看着每天百度的收录和页面的访问数,还有咨询的留言和电话,屏幕前的我欣喜万分。

工资不高,但年底的时候,还了一部分学校的助学贷款。

穷并快乐着

系里安排来上海实习,到同济大学的杨浦小区(没记错的化),被老同学催了好多次才从公司跑出来,因此还被耻笑了多年。

但真实的原因,就是一个字:穷。

当年领着600块的实习工资,虽然包吃住,但在大上海这些钱根本不禁用。

直到被学校要求回去毕业,才积攒了1000多块钱,打着领带回去装逼了几次,请客、喝酒、吃饭。

后来装过头了,还借了网友牟大哥500还是600块,毕业返回上海又干了几个月才还清。

毕业时自己扛着包打车到火车站,大家都散了,也没人送。口袋的钱只够买张学生票的,出出站口的时候紧张了半天,还在火车站直接转地铁的口没查票。

等下了地铁,口袋里的钱只够吃一顿早餐的了。

下半年,请一个来上海读研究生的女同学吃饭,因为那时候我经常去徐家汇的办公室,就请她在美罗城的麦当劳(记不清,吃的太少,麦当劳和肯德基分不清)吃汉堡,碍于面子,不肯讲困难,也没有信用卡,口袋里的钱只够请一般的套餐。

那年几个同事经常吃饭,没有房贷、车贷、家庭,单纯的乐子,想想还会笑一下。

2020复工

这个春节假期从除夕开始至正月十六结束,历时17天,是大学毕业以后最长的一次。

周围复工的朋友还不多,特别是上海以外的朋友。

碰巧的是,17年前的今天(阴历),也就是2003非典那年,我也在上海。

当年大四提前跑到上海实习,对病毒的风险简直一无所知。

那年六月被学校催着赶紧回去,因为具体毕业越来越近,同时回去还需要隔离两周,再不回去恐怕隔离的时长都不够了。

当时回去第一件事情,就是去学校附近指定的医院去检查,然后接着送到了学校在郊区的隔离点。

说到这里,非常感谢冒着危险在学校北门与我见面的同学。

搞得当时以为诀别一样。

没想到17年后,还是在上海,还是因为冠状病毒,在家里隔离了超过两周。

其实今年这么长假期,闲下来,的确没有准备好。所以,不少时间是虚度了。

本想跟至今们好好聊聊家常,说说心里话。

本想与17年前的老同事们通个电话,问候一声。

本想和在各地的高中、大学同学们叙叙旧,拜拜年。

本想用文字写下当下的所想,给爱人,给孩子。

。。。。。。

还没有好好筹备,却发现已经需要开工了。

长久以来的节奏被打乱,难得有时间与自己对话,并且是那么长时间,真得太不适应了。

复工第一天,其实也是惊险万分,提心吊胆。

虽是虚惊一场,但本想假期提笔确迟迟未动的我,决心开始写起来。

因为谁知道意外和明天哪个更早到来?

17年前你在做什么?

2020这个特别的假期里,你有没有一些特别的想法?

欢迎留言交流。

没有所谓的FlowPortal BPM绿色版

因为FlowPortal BPM加我微信的朋友日渐增多,但有不少抱着找安装文件,特别是破解版的想法。

自己不好意思说明,美其名曰绿色版。

统一回复一下,我没有。

请咨询问题、远程安装、培训或外包的朋友,先看一下这篇文字,以免耽误彼此的宝贵时间。

FlowPortal只是个BPM软件,工具是要被正确使用才能发挥价值!