线程安全性

要编写线程安全的代码,核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问。
「共享」意味着变量可以由多个线程同时访问,「可变」意味着变量的值在其生命周期可以发生变化。

一个对象可以被多个线程访问,那么要让它是线程安全的,需要采用同步机制。Java的主要同步机制:

阅读全文

Nginx反向代理websocket

配置反向代理

Nginx代理websoket,与普通配置基本相同,但是需要设置好头部信息:

  • Host
  • Upgrade

阅读全文

Gitblit配合Nginx搭建Git仓库(CentOS7)

关于Gitblit

Gitblit是一个以Git为基础的代码版本管理库。Gitblit简单易用,虽然界面不及Gitlab好看,但是Gitblit配置要求低,基本没什么依赖,而Gitlab依赖较多,搭建起来不是很方便(当然如果使用Docker那就很方便啦)。

阅读全文

避免SSH连接因超时闲置断开

平时我们通过终端连接服务器时,当鼠标和键盘长时间不操作,服务器就会自动断开连接,也就是SSH超时断开。
下面有几种方法可以避免超时断开连接:

方法一

阅读全文

(调侃)Node.js的版本变化一点也不像个"后端"的样子

其实就是调侃Node的版本迭代的好快,哈哈

阅读全文

可以消磨时间的桌游

国庆假期就这么过去了,这个假期主要是在自我调节,9月份整个人的状态都偏差,各种各样的原因都有吧。假期回去和朋友玩了很多次桌游,「卡坦岛」和「卡卡颂」是最有意思,也是比较能消磨时间的。

卡坦岛:

简单的可以看成一个复杂版本的大富翁,只是游戏不单纯地由掷骰子来决定,更多的是自己的发展决策,以及玩家间的互动。而且还有扩展版,可以在原游戏基础上增添元素。

阅读全文

JS检查Function是否为Generator

Nodejs中如何检查一个函数是否为GeneratorFunction(生成器,也就是function*)。
我一开始是想用typeof或者instanceof,发现达不到目的
其实可以这么做:

1
2
3
4
5
6
7
8
function isGenerator(fn) {
return fn && fn.constructor.name === 'GeneratorFunction';
}

var a = function *() {}
var b = function () {}
console.log(isGenerator(a)); // true
console.log(isGenerator(b)); // false

阅读全文

iOS10和macOS Sierra更新,印象比较深的功能

上周更新了iOS10,昨天更新了macOS Sierra,最大的感受是整个苹果的生态又往前迈进了一步。

iOS10,比较喜欢的功能是「照片」的回忆,还有「时钟」的就寝。
「回忆」是将你照片里面,以往的某个时间点的照片提取出来,还可以制作成幻灯片类型的小视频(配上背景音乐),这样的效果跟单纯一张张的翻照片的感觉确实还是不同的,出来的结果也是挺喜欢,当然跟你当时拍的照片的质量也有关。
「就寝」也是挺不错的一个功能,我把以前设置的闹钟都关掉了,直接设置「就寝」,那我晚上几点要睡,早上几点起来,它会提醒你去睡觉,早上时间到了闹钟就响了,最近我刚好在调节自己的生物钟,发现挺好用的。

阅读全文