DSAA Experience 5 How to Use DSAA in Node.js and JavaScript

怎样在Nodejs和JavaScript日常写代码中应用data structure and algorithms?

今天遇到一个问题,就是注册的时候,要填写5个字段,但这5个字段每一个都有多个验证方式,比如用户名不能有特殊字符,不能有空格,不能首字符是下划线等等。每一个字段如果验证不通过,你还要返回相应的错误信息,请问怎么解决?注意,这些验证,如果不通过,肯定是自由排列组合哦。

经过好几天的思索,尝试着用素数这个来解决,

思路其实比较简单,就是你每个验证,用三元符,如果结果你想要的,就是1,如果不想要,就设置为某个素数,比如2,3,5,7之类。

然后结果相乘,然后对乘积进行判断:

  • 如果是1,说明一切OK,全部验证通过;
  • 如果不是1,先看是不是属于这几个素数,如果是,那就直接返回对应的错误信息
  • 如果不是1,而且乘积也不在预先设定的范围内,就分解质因子,然后就对应出来了

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
const _ = require('lodash');

//预设一些不通过的原因,并设置key为素数
let map = new Map([
[2, "验证不通过,原因是xxxx"],
[3, "验证不通过,原因是xxxx"],
[5, "验证不通过,原因是xxxx"],
[7, "验证不通过,原因是xxxx"],
[11, "验证不通过,原因是xxxx"],
[13, "验证不通过,原因是xxxx"],
[17, "验证不通过,原因是xxxx"]
]);

//验证
let a = validator_a(args1) ? 1 : 2; //验证通过,就是1,不通过,就是某个素数
let b = validator_b(args2) ? 1 : 3;
let c = validator_c(args3) ? 1 : 5;
let d = validator_d(args4) ? 1 : 7;
let e = validator_e(args5) ? 1 : 11;
let f = validator_f(args6) ? 1 : 13;
let g = validator_g(args7) ? 1 : 17;

//验证结果进行乘积
let final = a * b * c * d * e * f * g;

//如果是1,说名一切OK,验证通过
if (final === 1){
return true;
}
//如果不是1
else {
//先看是不是在预设的结果里,如果是,说明就只有一个错误,给出这个错误即可
if (map.has(final)){
console.log(map.get(final));
return false;
}
else {
//如果不在预设的结果里,就分解质因数
let keys = [ ...map.keys()];
let errorMessage = [];
_.forEach(keys, (key)=>{
if (final % key === 0){ // 用%取余,如果是0,就说明是因子
errorMessage.push(map.get(final)); //取出对应的错误信息,push到msg里
}
});
console.log(errorMessage);
return false;
}

}

Hexo Evolution

Hexo有哪些需要改进的地方

首先、代码结构。目前的结构有问题,应该是把配置和源码分开。

源码和配置分开的的意思很简单。theme算配置了,而且theme会经常由作者更新,或者用户也要做个性化修改,所以不应该放在某个项目下面,而是应该放在项目的上一层,这样多个项目之间还可以共用此主题。

而且/public目录也应该单独出来,毕竟很多时候有Google Adsense等广告联盟需要对网址做验证,需要对最终生成的代码进行一些调整。这也算是一种配置,总之不是源码。如果能新增一个config目录,专门保存这些验证用的东西,hexo generate命令生成的时候统一生成到/public目录,也可以的。

其次、数据库加载问题

现在的数据库,是warehouse,一个json文件数据库,但这个问题是,显然性能是有问题的,毕竟json文件大了,解析起来就慢了。那么,既然每一篇文章最终都会生成一个目录,里面有一个index.html,那么,能否把json数据库拆成多个小json,/public目录下的contetn.json只是一个索引。

第三、plugin

目前我对此研究不多,但是,是否可以有类似的思路,分开管理。

第四、商业化

Hexo作为一个很不错的发表工具,那么能否做成平台呢?

比如,主题广场,吸引设计师来卖主题。为了防止盗版,这还要涉及到能否远程拉取主题,就是主题配置的时候,可以写一个url,而不用把主题文件拉取到本地。

再比如,能否设计一个桌面客户端,从文本编辑,到生成静态文件,到购买域名,申请网络空间,最终发布出去,整个流程全部下来,点击几次按钮就可以,而完全不用命令行工具。这个可以的吧?

第五、平台化

如果上面这一步搞好了,可以吸收各种的静态网页生成工具,例如Ghost,Jekyll,Hugo等都弄进来。甚至把其他的CMS工具都集成进来。

Netlify都搞成了,都融到资了,这个idea为啥不行呢?

赚钱的方式很多,云服务,主题市场,图片市场,UI设计,SEO,等等吧。

第六、谁来用?

很多人、很多公司,以Google Adsense为生,他们可以多达100多个网址,因此有一个能够统一管理素材的发布工具,是非常有必要的。

中国也有很多人以各类公众号(不限于微信)为生,他们也很需要。

总之,自媒体吧。

Re-Read Content Is King

重新理解Content is King

今天重新读了一下Bill Gates的著名文章“Content is King”,感慨万千。

首先,比尔盖茨重新定义了content。在Internet这个新媒体上出现的任何东西,其实本质都是content,包括但不限于图片,音频,视频和软件。

第二,盖茨先生完全不看好仅仅是把纸质内容照搬到Internet上而已。他多次提到一个关键词:interactivity,也就是“交互”。如果一个互联网用户打开电脑,只是被动接收内容,那和看电视看报纸没区别嘛。他必须可以主动寻找内容,寻找适合自己口味的内容。

第三,盖茨先生也提到了广告。但仍然是强调交互广告。也就是说,广告首先是要吸引注意力,然后用户点击之后获得更多的信息。而且广告商还可以统计出多少人点击了。这显然是Google目前在做的事。当然,在1996年的时候,互联网广告还是非常糟糕的,因为那时是拨号上网,在网页上挂一个图片,会极大增加打开网页的时长,用户简直不能忍受。所以也可以看到,1996年的时候,互联网还是一个什么样的原始状态。

第四,盖茨先生提到好的内容必须付费。

付费是互联网发展的关键,我对此是非常赞成的。免费内容可以有,免费高质量内容也可以有,但长期免费高质量的内容,就不是一个可以持续的发展模式。内容创作者必须能够收费才行。

当然,他也提出了现实困难。在此文发表的1996年,如果收费,用户数量会急剧降低,而且也确实没有收取小额费用的办法,网上支付还不存在。

最后的最后,盖茨先生提到,互联网将会是一个“a marketplace of ideas, experiences, and products-a marketplace of content”。

回头看看这么多年来各色互联网公司的起起落落,今天重读此文,难道没有什么启示吗?

2018年4月3日更新:

当然,你可以说使用“羊毛出在狗身上”的模式,你创造好内容,免费给观众看,让广告商来付费。这个想法不错。

然而这个想法的核心基础是你创造的内容要能够吸引到足够多的观众,并且这些观众会有支付能力,因此才能吸引到广告商投入。

但想过没有,所有领域都是这样的么?一些小众领域,根本没那么多人;或者观众虽不少,但转化能力太差。这二种情况不要太普遍了。

所以在很多领域,必须要直接卖内容,内容消费者必须付费。否则你看到的内容,肯定都是大众化的,因为要吸引大多数人的注意力才能有足够多的人数。这样一来,就根本不能照顾到细分领域,只能是不咸不淡的,全家人都可以看的内容才会免费出现在你家的电视屏幕上。

那么,HBO和Netflix就是内容付费领域的创新者了。因为这二者,尤其是HBO,是收费电视台,你必须付费才能看到他生成的内容。所以,HBO出品了众多小众但精良的内容,赚了不少钱,口碑更是爆棚。每年艾美奖,HBO都是拿奖拿到手软。

HBO都有哪些精品内容呢?各种黄暴就不说了。比如《黑道家族》,讲的是一个黑道人物的中年危机,这种内容要是在公共台,怕是要亏死。再比如《权力的游戏》,我靠,这个投入可是相当大了,但也只有HBO敢投敢制作,多少人因为这个剧而买了HBO的会员。

总之,在小众和细分领域,绝对没办法收广告商的钱来达到收支平衡的,更别提赚钱了,必须收费。

How to Split Large Csv Files Into Smaller Ones

Basically, you don’t need anything special to do it. You just need a Linux command split.

This is a tiny script I have writen to do it:

1
2
#!/bin/bash
sudo split -l 100 myfile.csv -d --additional-suffix=.csv eric-

Let me explain it a little bit.

  • the -l, -d, and –additional-suffix: man split and you can see the documentation
  • eric-: it’s the prefix and you don’t need option to specify it. Just add it.

2018年3月29日更新:

通过上面的命令,按照5000行一个小文件,切割了一个6.9G大小的CSV文件,一共切割了不到5分钟,生成708个小文件。

OK!

Parse CSV Files and Insert Records to MongoDB Using Python

使用Python解析csv文件并使用Pymongo将数据保存到MongoDB里

最近要提取一个CSV文件里的内容,并且保存到MongoDB里。兄弟我Node.jsPromise学的不好,Promise里再嵌套一个Promise,这个就死活处理不好了。于是想到了用Python

但安装Python的环境又是一个大问题。于是我想到了wsl,也就是Windows 10最近比较牛叉的一个功能Windows Subsystem for Linux。于是去Microsoft Store上下载安装了一个Ubuntu

wsl有一个比较牛叉的特性,就是你的硬盘里的内容,都其实挂载在/mnt目录里了,进去看一下,你就明白了。

好,接下来,就在home目录下建了一个目录,并且写了一个小脚本,update.sh,代码如下:

1
2
#!/bin/bash
rm parseMyCsv.py && cp /mnt/d/pythonProjectPath/parseMyCsv.py .

这个小脚本的目的非常简单,更新wsl里的代码,为啥?因为你要在本地写代码啊,wsl没有桌面啊,即便可以安装,那也肯定很慢,不如本地写好了,立刻更新到wsl里调试。

一个小发现:

Windows Subsystem for Linux 竟然可以和本地物理机使用同一个MongoDB,而不用在wsl里重新安装一个MongoDB了

好,一切就绪之后,开始写吧,开始调试吧,写的过程,毫无亮点,照着文档写就行,但是,每次运行,总出现DuplicateKeyError,你知道吗,这个问题多要命么,折腾了一下午,我的代码毫无问题,对吧,问题出在数据库,对吧,但数据库里是空的啊,怎么可能有重复的key呢?

后来怎么解决的呢?我把整个collection删了,就立刻就好了。

所以问题出在MongoDB。单纯的用Robo 3T里删除document是不行的,obejctid还在。那么保存数据的时候,估计是算法的原因,导致每次都生成同一个objectid。

有另一个方法,就是在保存的时候,代码里写好怎样生成objectid,而不是靠mongodb自己生成,这样可以有效避免出现这个问题。

至于怎么写,要去查查资料。

最后,说一个问题,pipenv反正还没有完全搞好,总出问题。

© 2018 awesome.js All Rights Reserved.
Theme by hiero