场景:每天带笔记本电脑上班,公司使用固定 IP 上网,家里网络的网段又跟公司不一样。
方法 1:两个网络环境分别使用有线连接和无线连接(鉴于笔记本无线网卡不支持 5G(802.11ac),或者有其它需求必须都使用有线连接的不适用此方法)。
方法 2:修改家里路由器的局域网 IP 地址,使其网段与公司相同(虽然仅需要一次修改,但部分路由器不允许修改局域网 IP 地址);
方法 3:使用第三方软件一键切换(有安全隐患,且可能导致电脑网络设置出现错误);
方法 4(推荐):设置电脑网络连接同时使用两个 IP,具体方法如下:
打开“以太网 属性”,双击“Internet 协议版本 4 (TCP/IPv4)”,配置其中一个网络环境的 IP 地址和网关(例如我在公司上网的 IP 是 192.168.1.5,网关是 192.168.1.1)
点击“高级”,在 IP 地址栏添加另一个网络的 IP(如 192.168.31.5),在“默认网关”处添加这个网络的网关(如 192.168.31.1)
这样设置后,不管到公司还是回到家,只要网线一插就能上网,不需要每天更换 IP 地址设置了。
(图中显示了两个网络名称)

spacedesk 是一款非常强大的虚拟投影软件,可以将其它电脑、苹果设备(iPhone、iPad)、安卓手机甚至 HTML5 浏览器作为第二屏幕。本文以一台笔记本的屏幕作为另一台笔记本的扩展记录安装配置过程。
主笔记本安装 spacedesk DRIVER
扩展笔记本安装 spacedesk VIEWER
为了保证屏幕最佳的显示效果,我们希望两台笔记本最终的显示分辨率与物理分辨率一致。
我的主笔记本分辨率 1920x1080,扩展笔记本分辨率 1366x768
主笔记本
首先在扩展笔记本中打开 spacedesk VIEWER,连接主笔记本。
在主笔记本,桌面右键“显示设置”,分别针对 1 和 2 显示器设置分辨率:
当然还可以在上上图中的“重新排列显示器”中拖动来实现屏幕内容的显示位置。
扩展笔记本
打开 spacedesk VIEWER,在菜单的 Settings 中选择 Resolutions 可设置显示分辨率:
选择 Compression Quality 可设置显示质量:
压缩(Compression)如果选择 Off,那得看你的电脑能否吃得消,否则显示效果会更卡。我的配置是压缩选择 On,颜色深度选择低,快速,质量 100,帧率选择 60 FPS:
这样比默认设置的显示效果要好很多。
如果有条件用有线连接的话,尽量不要用无线连接,能减少不少延时。

微信小程序 login 后,在用 code 换 session 时,如果小程序绑定了微信开放平台,应该会返回 unionid。
文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/code2Session.html。
但实际上部分用户仍然是没有 unionid 的,把上述接口返回的数据记录下来如:
仔细阅读官方 UnionID 机制说明,通过用户授权 wx.getUserInfo 才会保证有 unionid 返回,否则只会在“用户关注了绑定同一微信开放平台的同主体的公众号”等情况下才会返回 unionid。
确保获取 unionid 流程参此文。

Input string is not a valid interger. Path 'batteryLevel', line 1, position 447.
使用 uni-app 开发小程序的时候,获取系统信息(getSystemInfoSync())在 iPhone X 上报错,原因是电池电量值无法转换为 int 型。出现的情况是偶发性的,但一旦出现,一段时间内会一直出现(可能等电量值更新了才会正常吧)。不知道是 uni-app 的 bug 还是微信小程序的 bug。问了度娘和必应国际,暂时没有找到答案。

二维码类型 | 可扫码授权的微信号 | 其它微信号 | ||
直接扫码 | 将二维码截图发送给可扫码授权的微信号 | 无需劳烦管理员的方式 | ||
登录微信公众平台 | 管理员与运营者 | 扫码后需管理员验证登录(管理员通过“公众平台安全助手”接收消息,点开详情后点击“确定”) | 授权人用摄像头扫码①,点击“确定” | 成为运营者② |
设置公众号IP白名单 | 管理员与长期运营者 | 无法完成 | 授权人用摄像头扫码①,点击“确定” | 成为长期运营者② |
公众号绑定运营者 | 管理员 | 无法完成 | 管理员用摄像头扫码①,点击“确定” | 无 |
小程序添加/删除项目成员 | 管理员 | 无法完成 | 管理员直接识别二维码,点击“确定” | 无 |
小程序修改名称、修改简称、修改登录邮箱、修改密码 | 管理员 | 无法完成 | “修改简称”管理员用摄像头扫码①,点击“确定”,其它未测 | 无 |
小程序修改业务域名 | 管理员、有“开发者”权限的项目成员 | 无法完成 | 授权人直接识别二维码,点击“确定” | 成为有“开发者”权限的项目成员 |
微信开放平台绑定小程序 | 管理员 | 无法完成 | 管理员用摄像头扫码①,点击“确定” | 无 |
① 摄像头扫码:无法直接用“识别二维码”,必须把二维码发送到身边的其它设备,再使用手机摄像头完成扫码。
② 成为运营者要求绑定银行卡;成为运营者将占用“微信号绑定的帐号”数量,详见说明。若达到上限,只有法定代表人可继续成为运营者。在公众号“公众平台安全助手”中可查询绑定的帐号。
另外:
小程序添加/删除体验成员无须管理员授权
如果管理员未关注公众号“公众平台安全助手”,待测……

常用获取英文的方法是查看英文版 App。
微信:WeChat
小程序:Mini Programs
公众号:Official Accounts
订阅号:Subscriptions
朋友圈:Moments
已登录的:Logged
服务通知:Service Messages
置顶:Sticky on Top / Remove from Top
发送给朋友:Share to Friends
微信号:WeChat ID
钱包:Wallet
余额:Balance
资金/零钱/基金:Funds
金额:Amount
明细:Details
账单:Transactions
资产:Assets
收入/收益:Income
财富:Fortune
登录:Log In / Login
退出登录:Log Out / Logout

使用以下代码对字符串 s 进行判断:
var s = null;
if (s) {
console.log('true');
} else {
console.log('false');
}
测试当 s 为不同值时的结果如下:
s 的值 | if(s) 的结果 |
s = null; | false |
s = undefined; | false |
s = ''; | false |
s = ""; | false |
s = 0; | false |
s = 1; | true |
s = 2; | true |
s = -1; | true |
s = '0'; | true |
s= ' '; | true |
结论:
当 s 未定义或未赋值时,结果为 false;
当 s 为字符串类型时,长度为 0 即 false,长度大于 0 即 true;
当 s 为数字类型时,等于 0 为 false,不等于 0 为 true。
如果判断 s 的长度:
var s = null;
if (s.length > 0) {
console.log('true');
} else {
console.log('false');
}
那么会有以下结果:
s 的值 | if(s.length > 0) 的结果 |
s = null; | Uncaught TypeError |
s = undefined; | Uncaught TypeError |
s = ''; | false |
s = ""; | false |
s = 0; | false |
s = 1; | false |
s = 2; | false |
s = -1; | false |
s = '0'; | true |
s= ' '; | true |
结论:
当 s 未定义或未赋值时,异常;
当 s 为字符串类型时,长度为 0 即 false,长度大于 0 即 true;
当 s 为数字类型时,永远为 false。
这样的话,if(s.length > 0) 等同于 if(s.length)。
综上所述,判断一个字符串是否“有值且长度大于 0 ”,可以这样写:
var s = null;
if (s && s.length) {
console.log('true');
} else {
console.log('false');
}
相反,是否“无值或长度为 0”,可以这样写:
var s = null;
if (!s || !s.length) {
console.log('true');
} else {
console.log('false');
}
当然,如果要将不为 0 的数字类型也视为“有值”,只要 if(s) 或 if(!s) 即可。

在学习和使用 ASP.NET Web API 之前,最好先对 RESTful 有所了解。它是一种软件架构风格、设计风格,而不是标准。
推荐视频教程:https://www.imooc.com/learn/811
讲师:会飞的鱼Xia
需时:2小时25分
REST API 测试工具:
在 Chrome 网上应用店中搜索:Restlet Client
或网站 https://client.restlet.com
>>> 资源路径
SCHEME :// HOST [ ":" PORT ] [ PATH [ "?" QUERY ]]
其中 PATH 中的资源名称应该使用复数名词,举例:
GET https://xoyozo.net/api/Articles/{id}
POST https://xoyozo.net/api/Articles
>>> HTTP verb(对应 CURD 操作):
方法 | 功能 | ASP.NET Web API 接口返回类型(一般的) |
---|---|---|
GET | 取一个或多个资源 | T 或 IEnumerable<T> |
POST | 增加一个资源 | T |
PUT | 修改一个资源 | T |
DELETE | 删除一个资源 | void |
PATCH | 更新一个资源(资源的部分属性) | |
HEAD | 获取报头 | |
OPTIONS | 查询服务器性能或资源相关选项和需求 |
>>> 过滤信息:
如分页、搜索等
>>> 常用状态码:
200 | OK | 指示请求已成功 |
201 | Created | 资源创建成功(常见用例是一个 PUT 请求的结果) |
202 | Accepted | 该请求已被接收但尚未起作用。它是非承诺的,这意味着HTTP中没有办法稍后发送指示处理请求结果的异步响应。 |
204 | No Content | 成功 PUT(修改)或 DELETE(删除)一个资源后返回空内容(ASP.NET Web API 中将接口返回类型设置为 void 即可) |
400 | Bad Request | 服务器无法理解请求(如必填项未填、内容超长、分页大小超限等),幂等 |
401 | Unauthorized | 未授权(如用户未登录时执行了须要登录才能执行的操作),通俗地讲,是服务器告诉你,“你没有通过身份验证 - 根本没有进行身份验证或验证不正确 - 但请重新进行身份验证并再试一次。”这是暂时的,服务器要求你在获得授权后再试一次。 |
403 | Forbidden | 服务器理解请求但拒绝授权(是永久禁止的并且与应用程序逻辑相关联(如不正确的密码、尝试删除其它用户发表的文章)、IP 被禁止等),通俗地讲,是服务器告诉你,“我很抱歉。我知道你是谁 - 我相信你说你是谁 - 但你只是没有权限访问此资源。” |
404 | Not Found | 找不到请求的资源(指资源不存在,如果找到但无权访问则应返回 403) |
405 | Method Not Allowed | 请求方法被禁用(HTTP 动词) |
500 | Internal Server Error | 服务器遇到阻止它履行请求的意外情况(如数据库连接失败) |
503 | Service Unavailable | 服务器尚未准备好处理请求(常见原因是服务器因维护或重载而停机,这是临时的,可用于在单线程处理事务时遇到被锁定时的响应,如抽奖活动、抢楼活动,防止因并发导致逻辑错误) |
>> 错误处理:
C# 例:throw new HttpResponseException(HttpStatusCode.NotFound);
PHP 例:throw new Exception('文章不存在', 404);
>>> 返回结果:
JSON/XML
不要返回密码等机密字段
>>> 其它:
身份验证窗口(浏览器弹窗,类似 alert,非页面表单),明文传输,安全性不高,不建议使用。实现:
在 Headers 中添加 Authorization:Basic “用户名:密码”的 Base64 编码

本文作为 多平台用户登录模块设计 的扩展设计,即以手机号作为用户的唯一凭证。
官方文档的小程序登录时序:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
(图片摘自 2018.10.30)
session_key 是密钥,仅保存于开发者服务器,用于将小程序通过前端接口获取到的数据解密来验证其真实性。详见 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html
小程序与服务器是通过自定义登录态来识别用户身份的,以下简称口令(token)。
由于微信未告知 session_key 的有效期,那么为保证小程序发起业务请求成功,token 须要永久有效,但这会带来安全隐患。
如果设置 token 的有效期(如 7200 秒),那么小程序发起业务请求后,服务器必须把 token 的验证结果告知小程序,若失效则重新登录。
微信授权登录(含绑定手机号码)流程图
子流程:授权登录
子流程:绑定手机号
为保证数据安全,针对每个须要授权登录的业务请求,服务器都都会检验 token 的有效性。如果小程序同时发起多个业务请求,并几乎同时收到 token 过期,那么会同时发起多个重新登录流程,服务器多次 code2Session,重新生成多个 token 返回到小程序,那么小程序最终保存的 token 可能不是服务器上认为的最新的一个 token。这样,如果程序设计为获取到 token 继而重新发起业务请求,可能会进入死循环。解决的方法是在同时发起多个业务请求之前先向服务器验证一次 token 的有效性,再发起多个业务请求时就不会出现都过期的情况了。

打开配置文件:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
将 ONBOOT 改成 yes 即可:
ONBOOT=yes
重启网络使配置生效:
service network restart
或
/etc/init.d/network restart
详细安装 VMware Tools 官方教程:在 Linux 虚拟机中手动安装 VMware Tools
