2条在 JavaScript 中写好条件控制的建议

条件控制是我们每天都要写的东西,怎么写出更好、更清晰易读的条件控制呢?这里有两条建议。
1. 在多项匹配中,使用Array.includes
2. 少嵌套,尽早返回

具体说来:

1. 在多项匹配中,使用Array.includes

来看看下面的语句:

function test(fruit) {
  if (fruit == 'apple' || fruit == 'strawberry') {
    console.log('red');
  }
}

乍看上去没什么问题,但是如果我们想要匹配更多的红色水果呢,比如cherry 或者 cranberries ? 要再写一大堆 || 么?
我们可以用 Array.includes 来重写这段代码:

function test(fruit) {
  // extract conditions to array
  const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];

  if (redFruits.includes(fruit)) {
    console.log('red');
  }
}

下次要扩展红色水果的匹配,只要往数组里面添加就好了。

2. 少嵌套,尽早返回

我们把上面的需求再扩展一下,多添加两个判断:
– 如果没有传递水果进来,抛出错误
– 接收水果后,如果数量超过10个,就打印出来。
可能一开始的代码是这样的

function test(fruit, quantity) {
  const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];

  // 第一次判定: 必须传递进了水果
  if (fruit) {
    // 第二次判定: 必须是红色水果
    if (redFruits.includes(fruit)) {
      console.log('red');

      // 第三次判定:数量必须大于10
      if (quantity > 10) {
        console.log('big quantity');
      }
    }
  } else {
    throw new Error('No fruit!');
  }
}

// 测试结果
test(null); // error: No fruits
test('apple'); // print: red
test('apple', 20); // print: red, big quantity

来总结一下上面的代码, 我们有:
– 一个 if/else 语句来过滤不合法条件
– 3层 if 嵌套
其实可以修改成下面这种更为清晰的形式:

function test(fruit, quantity) {
  const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];

  // condition 1: throw error early
  if (!fruit) throw new Error('No fruit!');

  // condition 2: must be red
  if (redFruits.includes(fruit)) {
    console.log('red');

    // condition 3: must be big quantity
    if (quantity > 10) {
      console.log('big quantity');
    }
  }
}

先判定不符合的情况,不符合就立刻返回,代码简略了不少。其实还能更进一步:


function test(fruit, quantity) { const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries']; if (!fruit) throw new Error('No fruit!'); // condition 1: throw error early if (!redFruits.includes(fruit)) return; // condition 2: stop when fruit is not red console.log('red'); // condition 3: must be big quantity if (quantity > 10) { console.log('big quantity'); } }

Ubuntu: 解决 yarn add global 安装工具无法使用的问题

yarn 添加全局工具包的命令是
yarn add global PACKAGE_NAME
比如你要安装最新的Vue-cli 3.0′, 那么就这样使用:
yarn add global @vue/cli

安装完了以后你就可以使用vue init PROJECT_NAM 来新建项目了。

可是如果你是在Ubuntu 或者是 WSL (Windows sub system for linux)中,当你运行的时候会告诉你
Command 'vue' not found, did you mean: ...

解决方法是需要将yarn的运行目录添加到bash中去。运行如下命令
– 编辑 ~/.bash_profile
nano ~/.bash_profile
– 将以下语句添加进去:
export PATH="$PATH:$HOME/.config/yarn/global/node_modules/.bin"
– 重启bash

完成,enjoy

Git: 删除所有本地分支(branch) 并保留指定分支

git的本地分支建得多了不好管理。

可以在bash里面运行这句命令来删除所有本地分支,同时指定保留一个分支:

git branch | grep -v "你要保留的分支名" | xargs git branch -D

比如你要删除所有的分支只保留master:

git branch | grep -v "master" | xargs git branch -D

如果你每次都想删除所有分支只保留master,那么可以使用alias来简化命令,比如这样:

alias gbr="git branch | grep -v "master" | xargs git branch -D"

Ubuntu 18.04 LTS 阿里云源镜像

Ubuntu 18.04 LTS 版的阿里源镜像粘贴在这里


deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

使用方法:


sudo nano /etc/apt/sources.list

删除掉里面的旧内容。
粘贴上面的代码即可。

也可使用163的:
163镜像:

deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse

如何解决WSL(ubuntu)中puppetteer 运行报错的问题

最近一个项目中用到了 Chrome 的 headless Node library puppetteer 来进行预加载。
在WSL或者Ubuntu中运行的时候会报错:

Failed to launch chrome!
/mnt/...../node_modules/puppeteer/.local-chromium/linux-579032/chrome-linux/chrome: error while loading shared libraries: libX11-xcb.so.1: cannot open shared object file: No such file or directory

看起来是缺了一个依赖,可以如果你手动安装这一个依赖后再次运行的话,会提示你少另外一个。

其实它需要以下所有这些依赖:


packages="gconf-service
libasound2
libatk1.0-0
libc6
libcairo2
libcups2
libdbus-1-3
libexpat1
libfontconfig1
libgcc1
libgconf-2-4
libgdk-pixbuf2.0-0
libglib2.0-0
libgtk-3-0
libnspr4
libpango-1.0-0
libpangocairo-1.0-0
libstdc++6
libx11-6
libx11-xcb1
libxcb1
libxcomposite1
libxcursor1
libxdamage1
libxext6
libxfixes3
libxi6
libxrandr2
libxrender1
libxss1
libxtst6
ca-certificates
fonts-liberation
libappindicator1
libnss3
lsb-release
xdg-utils
wget

最简单的解决方法是运行以下命令把这些包全部装上:

sudo apt-get update && sudo apt-get install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget

一次解决 😀

如何解决在unix系统下创建的.sh脚本在WSL中运行报错的问题

项目中大部分同事用的都是Mac或者Ubuntu,而我用不惯,大部分时间都是使用Windows,在WSL(Windows sub system for Linux)。

一切都很美好,我可以使用unix系统中的各种工具包,同时也能使用早已习惯的Windows操作习惯和文件管理方式。更棒的是二者还共享文件系统。

但是也会有一些小问题,比如之前遇到的 Ubuntu on Windows (WSL) 使用git时显示所有文件都被更改

最近又遇到一个问题,在unix类系统中写的脚本在WSL中运行的时候会报错:

scripts/test.sh: line 2: $'\r': command not found
scripts/test.sh: line 3: syntax error near unexpected token `$'{\r''
scripts/test.sh: line 2: syntax error near unexpected token `$'{\r''
'cripts/test.sh: line 2: `function cleanup {

这还是unix和windows系统下文本结尾字符定义不同导致。修复方法有两种:

  • 使用 dos2unix:
    apt install dos2unix
    dos2unix FILE_NAME
    
  • 使用 sed
    sed -i 's/\r//' setup.sh

Ubuntu on Windows (WSL) 使用git时显示所有文件都被更改的解决方法

Windows 的 Bash(又称作Ubuntu in Windows 或者Windows Subsystem for Linux,  WSL)很好用,基本能满足日常开发需要。

不过在其中使用git的时候你会发现,它总是会显示所有文件都被更改过了。

这是因为,代码文件实际上是在Windows系统中的,而Windows系统 使用CRLF作为行尾。

当你在bash 里面使用git的时候,git会以为你在linux里,而linux的行尾符号是LR。所以它就会认为所有的文件都被更改过了。

修复这个问题的方法是,在bash里面运行以下命令:

git config --global core.autocrlf true

WSL: 用Powershell 而不是 Bash on windows

前端开发人员使用Mac或者说Unix类系统的比例非常高,这导致很多的工具、包管理都对Windows系统非常不友好,特别是当你在一个团队中,别人都在用Mac的时候。以前的解决方式是要么买Mac,要么安装Ubuntu等Linux的桌面发行版本。再不济还有虚拟机这种方案。

但是Windows良好的硬件兼容性、丰富的扩展性和DIY可能,以及最大的需求:游戏,导致很多人,比如我,难以割舍对Windows的爱。

好在Windows后来推出了Bash on Windows 工具,这使得Windows 用户可以直接在Windows里面使用一个内建的Ubuntu bash,这使得Windows上的开发体验和Mac用户接近了不少,何况还有天然的外接显示器、机械键盘等外设,不用任何转接头即可顺畅连接。

 

不过最近在参与一个Ruby on Rails开发的过程中发现,bash中编译过程非常缓慢, 在webpack做编译的时候更是慢得令人发指(虽然这是个很好的摸鱼借口)。时不时还出现一个内存不够用的错误。后来才发现,默认Windows对这个Bash工具只给了1G内存。

搜索了一番,很多人都有这种问题。最终得到的答案是,用Powershell而不是用Bash on Windows.

在Powershell中键入bash,即可启动内建Ubuntu子系统。没有内存限制。编译飞快,再也没有理由摸鱼。

 

yarn 使用淘宝镜像

npm 似乎正在被 yarn 代替。但是在大陆境内,无论使用哪个工具,都面临着资源下载缓慢的问题。

针对npm,淘宝推出了 cnpm 这个工具。可以方便通过

`npm install cnpm` 来安装,之后再直接使用cnpm来达到加入下载包的目的。

那么yarn如何设置呢?目前没有cyarn 之类的工具。

方法就是把yarn的源改成淘宝的npm源。

命令如下:

yarn config set registry https://registry.npm.taobao.org -g

把常用的比较大的包node-sass源也设置为淘宝镜像

yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sass -g

其他一些常用的yarn命令如下

初始化一个新的项目

yarn init  (可以在后面加 `y` 来默认每一项都yes)

安装所有的依赖包

yarn  or  yarn install

添加一个依赖包

yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]

更新一个依赖包

yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]

删除一个依赖包

yarn remove [package]

列出每个缓存的包
yarn cache ls 

清除本地缓存

yarn cache clean

以太坊的游戏开发者在一天内赚了50万美元

历史已经被改写了。在过去的24小时里,一个游戏开发者从他的以太坊游戏里赚了超过50万美元。我们来从头分析一下。

我对这个领域的数据非常了解是因为我在运营一个名为DappRadar的网站。它追踪着大部分的以太坊游戏,并根据它们每24小时的表现进行排行。欢迎点击进去发现新的应用。不过现在还是先来继续看看吧。

什么是以太坊游戏?

我们把这些游戏称作以太坊游戏是因为它们的代码运行在以太坊区块链上。 大多数情况下不是所有代码都在上面,而是负责主要逻辑的代码。

是什么吸引了我?

几乎所有的以太坊游戏都有一个共通点——它们都是开源的。这意味着所有人都能阅读游戏的代码来确保这个游戏没什么黑幕。

想象一下,一个MMORPG私服,管理员和所有者有很严格的权限,而且他们无法把高级武器拿去卖钱。这就是区块链的力量。没有腐败,你可以编写出来这些权限,所有人都能阅读这些代码,确保你没在作弊。

CryptoCounties就是这些透明的以太坊游戏中的一个。

 

什么是CryptoCountries?

CryptoCountries 是一个以太坊游戏,你可以在一个虚拟地图上购买一块地。一旦你出价买入一块地后,你就可以等那块地的价格上涨,然后其他人也可以从你这里购买这块地。如果你成功卖出去你的地,你就能赚到以太了。

开发者如何赚钱的?

我读了这个游戏的代码,每一次交易产生的时候开发者都会从里面收取佣金,佣金比例是交易金额的2-5%。交易的金额越大,佣金比例就越低。比如以10ETH转让一块地的佣金是2%, 以0.05ETH转让一块地的佣金比例是5%。

就这样24小时能赚50万?

对的。就是这么简单。CryptoCountries今天早上上线,在不到24小时内,它就产生了31564ETH的交易,按照当前1:$906的比例来算就是2千8百6十万美金。

我们已经知道最低的交易佣金是2%, 我们按照这个比例算的话 28600000 * 0.02  = 572000。 这已经是按照每笔交易都是5ETH以上算出来的最低金额了,事实上甚至有100万。具体金额难以统计,只有开发者自己才知道。不过超过50万美元是肯定有了,一天而已。