关于G#F#W和信息自由

每年这段时间都很敏感,今天最突出。过去几年,我的梯子都没有倒过,毕竟自己也就是用来进行技术探索,上上几个top5的网站,从来不在外面乱说话乱起哄,也有自己独立的判断能力,不轻易相信恶意抹黑的花边新闻。但是今年梯子倒了,估计是全面推倒了这次。昨天折腾了一上午终于弄好了,魔高一尺道高一丈,这次启用https加cdn,并且屏蔽一切IP请求主机,应该能撑一段时间。 我理解有些码农们投身G#F#W建设的身不由己,但如果真把这当成伟大事业那就有些悲哀了。要知道,互联网发明最初的目的就是信息分享和信息自由,而我也一直坚信,自由开放下的环境没事的地方,才是真正长治久安。如果有机会,我一定写一部关于码农们和G#F#W之间的你来我往和爱恨纠葛的剧本。

June 6, 2019

CentOS编译安装shadowsocks-libev

部署环境:CentOS 7.4 x64 shadowsocks-libev项目地址 编译安装 yum update -y yum install -y epel-release rng-tools yum install -y git wget gettext gcc autoconf libtool automake make asciidoc xmlto c-ares-devel libev-devel zlib-devel openssl-devel rngd -r /dev/urandom 安装Libsodium export LIBSODIUM_VER=1.0.16 wget https://download.libsodium.org/libsodium/releases/libsodium-$LIBSODIUM_VER.tar.gz tar xvf libsodium-$LIBSODIUM_VER.tar.gz pushd libsodium-$LIBSODIUM_VER ./configure --prefix=/usr && make make install popd ldconfig 安装MbedTLS export MBEDTLS_VER=2.7.0 wget https://tls.mbed.org/download/mbedtls-$MBEDTLS_VER-gpl.tgz tar xvf mbedtls-$MBEDTLS_VER-gpl.tgz pushd mbedtls-$MBEDTLS_VER make SHARED=1 CFLAGS=-fPIC make DESTDIR=/usr install popd ldconfig 安装shadowsocks git clone https://github.com/shadowsocks/shadowsocks-libev.git cd shadowsocks-libev git submodule update --init --recursive ./autogen.sh && ./configure && make make install cd .. 修改配置 mkdir /etc/shadowsocks-libev vi /etc/shadowsocks-libev/config.json 写入以下内容并保存 ...

June 4, 2019

安装shadowsocks的v2ray插件

服务端部署 部署环境:CentOS 7.6 x64 安装Shadowsocks-libev 这个之前博文说过,就不重复了。 安装v2ray-plugin 我懒得编译,直接下载已经编译好的了,解压到/usr/local/bin/下。 获取SSL证书 我使用的是Let’s Encrypt的免费证书(这里建议使用CloudFlare的免费证书),执行命令之前记得先将域名的A记录解析到服务器IP上,并且开放80和443端口。 wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto ./certbot-auto certonly 成功之后会有/etc/letsencrypt/live/域名/fullchain.pem和/etc/letsencrypt/live/域名/privkey.pem两个文件。 修改配置文件 默认配置文件在/etc/shadowsocks-libev/config.json,如下文所示,在最后加上plugin和plugin_opts,把域名换成自己的就行。这里采用的是Shadowsocks over websocket (HTTPS),其它的可以自己参考GitHub上的介绍。 { "server":"0.0.0.0", "server_port":443, "local_port":1080, "password":"password", "timeout":300, "method":"aes-256-gcm", "plugin":"v2ray-plugin", "plugin_opts":"server;tls;cert=/etc/letsencrypt/live/域名/fullchain.pem;key=/etc/letsencrypt/live/域名/privkey.pem;host=域名;loglevel=none" } 最后执行ss-server -c /etc/shadowsocks-libev/config.json -f /run/shadowsocks.pid即可。 客户端设置 先安装对应平台的Shadowsocks客户端。 Windows 直接下载已经编译好的v2ray-plugin的windows版,解压后命名为v2ray-plugin.exe和Shadowsocks.exe放在同一文件夹下。 在Shadowsocks的服务器设置中,插件程序填v2ray-plugin,插件选项填tls;host=域名。域名要和服务端设置的一致。 Android 安装v2ray-plugin-android,打开Shadowsocks编辑服务器,在最下面的插件中选择v2ray,配置Transport mode为websocket-tls,Hostname为服务端设置的域名即可。 Ubuntu 直接下载已经编译好的v2ray-plugin,解压到/usr/local/bin/下。 编辑配置文件/etc/shadowsocks-libev/config.json,如下文所示,在最后加上plugin和plugin_opts,域名要和服务端设置的一致。 { "server":"域名", "server_port":443, "local_port":1080, "password":"password", "timeout":300, "method":"aes-256-gcm", "plugin":"v2ray-plugin", "plugin_opts":"tls;host=域名;loglevel=none" } 最后执行ss-local -c /etc/shadowsocks-libev/config.json即可。 优势 你甚至可以把SS服务器放在CDN后面,免费的CDN有Cloudflare。 然后,最重要的,让你的服务器屏蔽所有除了CloudFlare和你自己的IP之外的所有IP。 基本上很长一段时间内,G#F#W就拿你没办法了。 原文: https://blog.m3chd09.com/2019/02/01/v2ray-plugin-for-shadowsocks.html

June 4, 2019

我们都拿到了4个6.5,总分7

其实这个分数,我在去年9月份的时候就拿到了,但是因为就差一点点达到4个7,所以很不服气又考了3次,但依然没有拿到理想分数,幸运的是爱人也拿到了这个分数。目前来看,只能抢489和491了,如果抢不到就考虑新西兰。 我心里觉得如果坚持下去,应该能拿到4个7,但是现在这个分数也无法189和190,特别是最近澳洲出了新的政策,砍掉大量的配额,并且出了新的491签证,所以不打算考了。 回过头了,从2017年5月起,到2018年12月,一年半的时间,虽然没有达到理想的分数,但是想想对于口语那么烂的我,也许这个结果已经很不错了。 这近两年过来关于migaration的问题,我们讨论、争论、研究、分析,期间还去了一趟澳新,最终达成一致,定了目标,就看后面这几个月了。 希望有志者事竟成,我真的很希望能拿我们喜欢的地方,I love Melbourne! 写在五月的最后一天。

May 31, 2019

.NET Core 3.0 Preview 5发布

今天我们非常高兴发布 .NET Core 3.0 Preview 5,它包含了新的Json serializer,支持发布单执行文件,并且更新到新的runtime roll-forward,BCL也做了一些改动。 目前可以下载.NET Core 3.0 Preview 5安装到Windows, macOS and Linux.另外,ASP.NET Core和EF Core也发布了。 具体英文地址:https://devblogs.microsoft.com/dotnet/announcing-net-core-3-0-preview-5/

May 28, 2019

留美幼童观后感

“他们是中国历史上最早的官派留学生。公元1872年到1875年间,清政府先后派出四批共一百二十名学生赴美国留学。这批学生出洋时的平均年龄只有十二岁,因此 他们有一个共同的名字——留美幼童。这批饱受欧风美雨熏陶的学子是中国矿业、铁路业、电报业的先驱。他们中出现了今天清华大学、天津大学最早的校长,出现了中国最早的一批外交官,出现了中华民国的第一任总理。回国后的这批西学所造之子历经中国晚清政坛的跌宕起伏,目睹了近代中国的荣辱兴衰。 留美幼童的命运,离奇曲折;他们的故事,美丽而忧伤。 他们有一个永远的名字:留美幼童。” 最近翻出央视的一部纪录片《留美幼童》,居然眼前一亮,原来央视也出过这么优秀的纪录片。眼看现在中美贸易战打得火热,不知道有多少人认真去看这部纪录片。如果认真想想中国近代化和现代话过程中,哪个国家对中国最慷慨和友好,我觉得一定是美国,美国没有侵略过中国,并且100多年来一直在帮助中国。历史上美国对中国伤害最大的估计也就是1882的排华法案,但要知道这只是限制华人在美的权利。 留美幼童是中国与美国的第一次接触,但清政府却因为排华法案从日后第一强国撤回留学生。从此以后,美国对中国的帮助就一直延续:庚子赔款退还用于建设清华园、为中国培养大批人才;协和医院救助大量中国人、并且培养大量医学人才;二战期间无私地帮助中国进行反法西斯战争、并确认战后五个大国之一的地位;中美建交成功阻止了苏联对中国的威胁;新世纪帮助加入世贸、彻底改变中国的经济状况…

May 28, 2019

领域驱动设计实现之路

2004年,Eric Evans出版《领域驱动设计——软件核心复杂性应对之道》(简称《领域驱动设计》),10年之后,我们有了《实现领域驱动设计》。DDD将一个软件系统的核心业务功能集中在一个核心域里面,其中包含了实体、值对象、领域服务、资源库和聚合等概念。在此基础上,DDD提出了一套完整的支撑这样的核心领域的基础设施。此时,DDD已经不再是“面向对象进阶”那么简单了,而是演变成了一个系统工程。 领域,即是一个组织的业务开展方式,业务价值便体现在其中。长久以来,我们程序员都是很好的技术型思考者,我们总是擅长从技术的角度来解决项目问题。但是,一个软件系统是否真正可用是通过它所提供的业务价值体现出来的。因此,与其每天钻在那些永远也学不完的技术中,何不将我们的关注点向软件系统所提供的业务价值方向思考思考,这也正是DDD所试图解决的问题。在DDD中,代码就是设计本身,你不再需要那些繁文缛节的并且永远也无法得到实时更新的设计文档。编码者与领域专家再也不需要翻译才能理解对方所表达的意思。DDD有战略设计和战术设计之分。战略设计主要从高层“俯视”我们的软件系统,帮助我们精准地划分领域以及处理各个领域之间的关系;而战术设计则从技术实现的层面教会我们如何具体地实施DDD。 DDD之战略设计 DDD的战略设计主要包括领域/子域、通用语言、限界上下文和架构风格等概念。 1、领域和子域(Domain/Subdomain) 领域驱动设计关注点应该放在如何设计领域模型上,以及对领域模型的划分。 领域的概念:一个电商网站的领域包含了产品名录、订单、发票、库存和物流的概念。领域的划分是将一个大的领域划分成若干个子域。通常会将一个大型的软件系统拆分成若干个子系统。这种划分有可能是基于架构方面的考虑,也有可能是基于基础设施的。DDD对系统的划分是基于领域的,即基于业务。第一个问题,哪些概念应该建模在哪些子系统里面?第二个问题是,各个子系统之间的应该如何集成?如何解决?答案是:限界上下文和上下文映射图。 2、限界上下文(Bounded Context) 在一个领域/子域中,我们会创建一个概念上的领域边界,在这个边界中,任何领域对象都只表示特定于该边界内部的确切含义。这样边界便称为限界上下文。限界上下文和领域具有一对一的关系。将一个限界上下文中的所有概念,包括名词、动词和形容词全部集中在一起,我们便为该限界上下文创建了一套通用语言。通用语言是一个团队所有成员交流时所使用的语言,业务分析人员、编码人员和测试人员都应该直接通过通用语言进行交流。 上文中的各个子域之间的集成问题,是限界上下文之间的集成问题。防腐层负责与外部服务提供方打交道,还负责将外部概念翻译成自己的核心领域能够理解的概念。当然,防腐层只是限界上下文之间众多集成方式的一种,另外还有共享内核、开放主机服务等,具体细节请参考 《实现领域驱动设计》原书。限界上下文之间的集成关系也可以理解为是领域概念在不同上下文之间的映射关系,因此,限界上下文之间的集成也称为上下文映射图。 3、架构风格(Architecture) DDD并不要求采用特定的架构风格,因为它是对架构中立的。可以采用传统的三层式架构,也可以采用REST架构和事件驱动架构等。但是在《实现领域驱动设计》中,作者比较推崇事件驱动架构和六边形(Hexagonal)架构。在六边形架构中,已经不存在分层的概念,所有组件都是平等的。这主要得益于软件抽象的好处,即各个组件的之间的交互完全通过接口完成,而不是具体的实现细节。Robert C. Martin:抽象不应该依赖于细节,细节应该依赖于抽象。 采用六边形架构的系统中存在着很多端口和适配器的组合。端口表示的是一个软件系统的输入和输出,而适配器则是对每一个端口的访问方式。 DDD之战术设计 战略设计为我们提供一种高层视野来审视我们的软件系统,而战术设计则将战略设计进行具体化和细节化,它主要关注的是技术层面的实施,也是对我们程序员来得最实在的地方。 1、领域对象 领域对象能够准确地表达出业务意图,但多数时候却是充满getter和setter的领域对象,此时的领域对象已经不是领域对象了,而是Martin Fowler所称之为的贫血对象。.NET里面很好地支持非贫血对象。 2、实体vs值对象(Entity vs Value Object) 软件系统中实体表示那些具有生命周期并且会在其生命周期中发生改变的东西;而值对象则表示起描述性作用的并且可以相互替换的概念。同一个概念,在一个软件系统中被建模成了实体,但是在另一个系统中则有可能是值对象。 3、聚合(Aggregate) 聚合是DDD中最难理解的概念 ,聚合中所包含的对象之间具有密不可分的联系,他们是内聚在一起的。比如一辆汽车(Car)包含了引擎(Engine)、车轮 (Wheel)和油箱(Tank)等组件,缺一不可。一个聚合中可以包含多个实体和值对象,因此聚合也被称为根实体。聚合是持久化的基本单位,它和资源库具有一一对应的关系。 4、领域服务(Domain Service) 领域概念放在实体上不合适,放在值对象上也不合适,领域服务本来就是来处理这种场景的。比如对密码进行加密,可以创建一个 PasswordEncryptService来专门负责此事。 5、资源库(Repository) 资源库用于保存和获取聚合对象,资源库与DAO相似。但资源库和DAO存在显著区别。DAO只是对数据库的一层很薄的封装,而资源库则更加具有领域特征。另外,所有的实体都可以有相应的DAO,但并不是所有的实体都有资源库,只有聚合才有相应的资源库。资源库分为两种,一种是基于集合的,一种是基于持久化的。顾名思义,基于集合的资源库具有编程语言中集合的特征。 6、领域事件(Domain Event) 《领域驱动设计》中并没有提到领域事件,领域事件是最近几年才加入DDD生态系统的。微服务(Micro Service)的架构中,整个系统被分成了很多个轻量的程序模块,他们之间的数据一致性并不容易通过事务一致性完成,领域事件便可以用于处理上述问题,此时最终一致性取代了事务一致性,通过领域事件的方式达到各个组件之间的数据一致性。

May 20, 2019

澳新之行

这趟旅行我们酝酿了将近一年时间。今年正好是我们结婚七周年,而从去年开始,澳新这两个国家就一直在我们家里反复被提起讨论,连宝宝都是不是冒出阿德莱德、奥克兰、悉尼、墨尔本了。想想如果不先出去看看,对于我们都没有出过国的人来说,讨论migration貌似真的有点夸张。正好从网上、电视上看,这两个国家的景色和环境都非常棒,所以我们就打算作为旅行地。 从北京出发,穿过中国的大江南北,穿过黄河、长江、南海,穿过马来西亚,来到新加坡,休息一晚上,从新加坡穿过南太平洋,来到澳大利亚的上空,穿过帕斯、穿过阿德莱德,来到墨尔本。 一、墨尔本 墨尔本气候宜人,人文氛围好。这是皇家植物园,确实名不虚传。 二、悉尼 悉尼确实很繁华,她的繁华体现在几乎每个地方都很发达。这是悉尼歌剧院和海港大桥。 三、奥克兰 奥克兰是新西兰的首都,但因为准备举办帆船世界杯,到处都在施工,而且山地多,所以整体的感觉没有澳洲方便。当然,伊甸山还是很棒的。 四、皇后镇(格林诺奇、剑镇和瓦纳卡湖) 新西兰的自然环境无可挑剔,真的是100%纯净的新西兰。皇后镇很美,格林诺奇是一个来了就不想走的地方,秋天的剑镇更是让人心醉。 这是箭镇,而文章最开始那张是格林诺奇,爱人和女儿的合影。 这是瓦纳卡湖,没有什么比这个湖更美的了。 五、惠灵顿 惠灵顿是首都,所以更让人舒适,而且这里居住的人,很多是英国人的后裔,感觉他们依然秉承英伦gentle之风。

May 10, 2019

.NET Core 3.0-preview3 发布

.NET Core 3.0 Preview 3已经发布,框架和ASP.NET Core有许多有趣的更新。这是最重要的更新列表。 下载地址 :https://aka.ms/netcore3download 。 .NET Core 3.0的更新: C#中对索引和范围的更多支持 支持.NET Standard 2.1。以.NET Standard项目文件为目标,并将netstandard2.1指定为目标框架。完整的.NET Framework不支持.NET Standard 2.1。 F#4.6和dotnet fsi命令。可以使用F#4.6和dotnet fsi命令的预览。FSI代表F#互动。 AssemblyDependencyResolver和resolver事件。从给定路径加载依赖程序集(之前不可能),解析程序事件可帮助我们更好地处理动态加载的本机依赖项。 Windows Forms应用程序的高DPI。最后,微软将Windows Forms应用程序推向了当今时代。96DPI不再适用,并且可以构建高DP Windows窗体应用程序。 ​ ASP.NET Core 3.0的更新: Razor组件的改进。现在2个项目合并成单个项目模板,Razor组件支持端点路由和预渲染,Razor组件可以托管在Razor类库中。还改进了事件处理和表单和验证支持。 运行时编译。它在ASP.NET Core 3.0模板中被禁用,但现在可以通过向项目添加特殊的NuGet包来打开它。 Worker Service 模板。需要编写Windows服务还是Linux守护进程?现在我们有了Worker Service 模板。 gRPC模板。与谷歌一起构建的gRPC是一种流行的远程过程调用(RPC)框架。此版本的ASP.NET Core在ASP.NET Core上引入了第一等的gRPC支持。 Angular模板使用Angular 7. Angular SPA模板现在使用Angular 7,在第一次稳定释放之前,它将被Angular 8替换。 SPA-s的身份验证。Microsoft通过此预览为单页应用程序添加了现成的身份验证支持。 SignalR与端点路由集成。小变化 - 现在使用端点路由定义SingalR路由。 SignalR Java客户端支持长轮询。即使在不支持或不允许WebSocket的环境中,SignalR Java客户端现在也可以使用。

March 6, 2019

DDD领域驱动设计的理解

一、软件开发首先要回答:要解决什么问题 任何软件系统都不是凭空产生的,而是为了回应某个现实问题。 因此,在开始编码之前,首先需要明确: 系统解决什么问题? 服务哪些用户? 核心价值是什么? 哪些问题属于系统边界,哪些不属于? 系统的定位越清晰,后续设计越容易保持一致。 二、领域(Domain)就是业务问题的范围 DDD强调,软件应该围绕业务本身,而不是围绕数据库或技术框架展开。 所谓领域,可以理解为: 一个具有明确业务目标、业务规则和业务边界的问题空间。 例如: 电商领域关注商品、订单、支付、库存等业务; 社交领域关注用户、关系、内容互动; 金融领域关注账户、交易、风控等。 不同领域拥有不同的核心概念和规则。 三、DDD的核心不是代码,而是模型 DDD认为: 领域模型才是系统真正的核心。 领域模型负责表达: 业务中的重要对象; 对象之间的关系; 业务规则; 状态变化; 生命周期。 代码只是把模型实现出来,而不是直接堆砌业务逻辑。 因此: 领域 → 模型 → 代码 而不是: 数据库 → Controller → SQL 四、真正困难的是理解业务 很多项目失败,并不是因为技术不够,而是因为业务理解不到位。 因此,在建模之前,需要充分理解领域知识,包括: 业务术语 业务规则 使用场景 操作流程 用户真正关心的问题 领域专家、产品经理、开发人员都需要共同参与这一过程。 五、复杂业务需要拆分子领域 大型系统往往不能作为一个整体设计,而需要按照业务职责拆分。 例如一个电商平台可以拆分为: 用户 商品 库存 订单 支付 营销 每个子领域都有自己的职责和边界。 DDD称这种划分为子域(Subdomain)和边界上下文(Bounded Context)。 良好的边界划分能够降低耦合,提高系统演进能力。 六、建模前先梳理四类内容 在设计模型之前,需要把业务整理清楚。 通常包括: 核心概念:有哪些重要业务对象; 业务规则:有哪些必须满足的不变条件; 业务场景:系统需要支持哪些典型操作; 业务流程:这些操作如何串联形成完整业务。 只有把这些内容理顺,模型才有坚实基础。 七、领域模型要服务业务,而不是追求复杂 DDD提供了许多建模工具,例如: ...

March 6, 2019