分类目录归档:未分类

Node.js 创建模块

mkdir /censorify
cd censorify

#建立主文件
vi censortext.js
var censoredWords = ["sad", "bad", "mad"];
var customCensoredWords = [];

function censor(inStr) {
    for(idx in censoredWords) {
        inStr = inStr.replace(censoredWords[idx], "****"); 
    }    
    for(idx in customCensoredWords) {
        inStr = inStr.replace(customCensoredWords[idx], "****"); 
    } 
    return inStr;
}

function addCensoredWord(word) {
       censoredWords.push(word); 
}

function getCensoredWords() {
       return censoredWords.concat(customCensoredWords);
}

exports.censor = censor;
exports.addCensoredWord = addCensoredWord;
exports.getCensoredWords = getCensoredWords;

#建立package.json(main指定入口)
vi package.json
{
    "author": "vfeelit@qq.com",
    "name": "censorify",
    "version": "0.1.1",
    "description": "",
    "main": "censortext",
    "dependencies": {},
    "engines": {
        "node": "*"   
     }
}

#打包(生成censorify-0.1.1.tgz文件)
npm pack

#在其它应用中安装
cd ../readwords
npm install ../censorify/censorify-0.1.1.tgz

#使用引入的包
vi readwords.js
var censor = require("censorify");

console.log(censor.getCensoredWords());
console.log(censor.censor("Some very sad, bad and mad text."));

censor.addCensoredWord("gloomy");
console.log(censor.getCensoredWords());
console.log(censor.censor("A very gloomy day."));

#运行结果
node readwords.js 
[ 'sad', 'bad', 'mad' ]
Some very ****, **** and **** text.
[ 'sad', 'bad', 'mad', 'gloomy' ]
A very **** day.

Node.js 安装

Node.js运行环境的部署安装是非常简单的,从https://nodejs.org/en/download/(https://nodejs.org/dist/)下载不同平台编译好的二进制包(也可以下载源码编译,Windows下需要下载Windows Installer (.msi)安装文件,里面包含npm包;如果下载Windows Binary (.exe)则仅仅对应node.exe文件。安装第三方包需要npm支持),解压放入对应目录即可,在CentOS/Ubuntu下,可以释放到/usr/local下,由于PATH默认包含/usr/local/bin目录,换句话说只要解压缩就完成了安装:

cd /usr/local
wget https://nodejs.org/dist/v6.11.3/node-v6.11.3-linux-x64.tar.xz
#xz命令解压xz包得到tar包
xz -d node-v6.11.3-linux-x64.tar.xz
#解压tar包
tar -xvf node-v6.11.3-linux-x64.tar.xz

##或者用tar一键解压
tar xvJf node-v6.11.3-linux-x86.tar.xz

#直接拷贝释放到/usr/local
chown -hR root:root node-v6.11.3-linux-x86
cd node-v6.11.3-linux-x86
cp -frap * /usr/local

直接释放到/usr/local就可以完成安装。由于/usr/local/bin是在PATH中的,所以bin中的node和npm自然是可以直接找到的。

node -v
npm -v

#如果在国内部署,可以使用npm安装cnpm:(https://github.com/cnpm/cnpm)
npm install cnpm -g --registry=https://registry.npm.taobao.org	

使用npm或cnpm安装cheerio(https://github.com/cheeriojs/cheerio)
npm install cheerio
cnpm install cheerio

NPM是一个包管理器,NMP本身就可以看做是一个NodeJS模块,全局安装在/usr/lib/node_modules/中(nmp目录),NPM使用到的包,放入到子目录node_modules中,这个目录中的包就类似是nmp包的本地安装。

如下,升级NMP:

npm install npm -g

参数-g表示全局安装,就是放入到/usr/lib/node_modules/,否则就是本地安装。npm install npm本身就说明npm就是nodejs的一个包。

举例来说:

npm install express

就会在当前目录下创建一个叫node_modules目录,里面安装express包(它还会依赖其它包,会把依赖也下载),这里里面的包,只需要使用require进来即可(实际就是自动进入这个目录去寻找包)

npm install xxx -g
npm install xxx
npm uninstall xxx -g
npm uninstall xxx
npm update xxx
npm search xxx
npm ls -g
npm ls

npm search express
npm install                     #使用package.json文件来安装包
npm install express             #安装指定包
npm install express@0.1.1       #安装指定包指定版本
npm install ../module.tgz       #安装本地包

npm install express -g
npm remove express
npm pack                        #对一个包进行本地打包
npm view express
npm publish
npm unpublish module

对于每个包,package.json是必须的,它定义了包的属性,比如名称、版本、依赖等。更加详细的内容需要去参考官方文档。

代码范例收集

// 数字1-9, 找出9位数,使得其从左边开始,每第n(1<=n<=9)位组成的数字都能被n整除
class Cat {
	public $result = [];
	
	public function c($ss, array $aa, $count) {


		foreach($aa as $a){
			$tmp = $ss.$a;
			
			if(((int)$tmp % $count) === 0){
				$bb = array_diff($aa,[$a]);

				$this->c($tmp,$bb,$count+1);
			}
		}
		if(empty($aa)){
			$this->result[] = $ss;
		}

		return $this;
	}

	public function getResult() {
		return $this->result;
	}
}


$cat = (new Cat())->c('', ['1','2','3','4','5','6','7','8','9'], 1)->getResult();
print_r($cat);

浏览器基础知识

WebKit所包含的WebCore排版引擎和JSCore引擎来自于KDE的KHTML和KJS。Apple的Safari是基于WebKit(AppleWebKit)引擎的浏览器 。(Webkit实际由Apple控制)。

WebKit所包含的WebCore排版引擎和JSCore引擎,均是从KDE的KHTML及KJS引擎衍生而来。它们都是自由软件,在GPL条约下授权,同时支持BSD系统的开发。所以Webkit也是自由软件,同时开放源代码。

——————–
上面说的WebCore(KHTML)和JSCore(KJS)是一个浏览器核心的两个组成部分,一个是页面渲染,一个JS解析器。苹果把KHTML换了个名字叫WebCore,一个意思,跟Firefox浏览器中用的Gecko是同样概念的东西,都实现页面渲染。

Google在发展自己的浏览器时并不是从头开始的,它从WebKit基础上创建了一个叫Chromium的内核,Google自身维护这个内核,Chrom就基于这个内核,但是Google从2010年开始开始决定“脱离”WebKit,真正自己维护一条主线,所以这个内核改名为blink引擎。(Blink是一个渲染引擎,从WebKit分离)。

Google的Chromium是一个开源浏览器实现,包括了Blink引擎和V8引擎。Chrome是基于Chromium的,不一样的地方是:Chrome是闭源的,并且添加了自己的特色功能。

其它的浏览器厂商可以基于Chromium或WebKit开发自己的浏览器,并在其上贴牌、增加特色功能等,跟Apple的Safari和Google的Chrome是同一个级别的。

所以浏览器可以简单分为几大类:
1 基于Webkit,比如Safari
2 基于Chromium, 比如Chrome
3 Firefox(Gecko)
4 IE类

简单的关系图:
browser-relate

开发常用工具(备用)

版本控制
1 Git for Windows(原命名为msysgit, MS系统下的GIT)
说明:Windows下Git管理软件不二的选择
下载:https://git-for-windows.github.io/

这个工具使得在MS系统以类linux的操作方式来使用Git。这个工具是如何做到的?实际上它集成了一个叫MinGW的工具(http://www.mingw.org/),这个工具全名Minimalist GNU for Windows, 从名称就可以知道,它是GNU软件在Windows下运行的工具,自然Git就可以跑在它上面了,MinGW的Shell是MSYS,它是搭配MinGW来使用的,安装了Git for Windows后看到的Git for Bash,实际就是这么一个东西。

2 TortoiseGit
说明:Git客户端,Windows下最流行的客户端
下载:http://download.tortoisegit.org
3 Gitlab
说明:Git代码托管
下载:https://about.gitlab.com/
使用:http://blog.ifeeline.com/1628.html

文件比较工具:
1 WinMerge
首先是免费的,支持文件和目录比较。
2 Beyond Compare(http://www.scootersoftware.com/ 标准版30美金)专业级的文件和文件夹比较,支持包括二进制在内多种格式文件比较,跟WinMerge相比,它提供了一个右击菜单,可以开速加入文件。
http://blog.ifeeline.com/1880.html

数据库客户端(http://blog.ifeeline.com/1588.html)
1 Navicat
2 phpMyAdmin

虚拟机
VMware Workstation

IDE
Zend Studio

编辑器
EditPlus
Dreamweaver

Shell & FTP
Xshell
WinScp
FileZilla Client
http://blog.ifeeline.com/1865.html

开发环境
Wamp
http://blog.ifeeline.com/1464.html

Cygwin – Windows下运行Linux软件

Cygwin可以说是一个伟大的软件,通过一个DLL(cygwin1.dll)建立了Linux与Windows之间的系统调用和API之间的转换,使得Linux下的绝大多数软件能向Windows迁移。Cygwin和其它的虚拟机软件不一样,虚拟机软件会独占系统资源(Cygwin进行系统调用和API转换)。

关于Wifi万能秘钥

老家客厅网络安装了无线网络,为了方便我设置了我的手机号码作为密码,一亲戚带了一小弟过来拜年,他用所谓的Wifi万能秘钥”破解”了我设置的密码。一阵纳闷…

手机号是纯数字11位,0到9有10位,那么能组合出来的就有10的11次方个,那是100亿,短短几分钟就能试遍100亿?直觉告诉我,绝无可能。那么这样的App是如何做到的呢?

如果有人接入这个网络后,共享了热点(就是把名称和密码告诉它),当别人接入时,首先到所谓的云端查询对应的密码,那么它就可以很顺利地获取到密码,这个就是以上说的破解的唯一可能。肯定有某位成员安装了Wifi万能秘钥这个流氓App并共享了热点(或者这款流氓软件偷偷共享了热点),Wifi万能秘钥默认是选中共享热点的,对于一般的小白来说,它根本不知道共享热点意味者什么。

通过以上分析可知,蹭网并没有那么简单。比较常见的所谓的Wifi密码破解实际都是暴力破解工具,如果密码是数字混合字母,长度设置为6,就有50多亿个密码;长度为9,就有1353亿亿个密码。

现在一般的路由器都可以设置MAC地址绑定或过虑,如果实在担心密码被破解,可以设置MAC地址过滤,只允许自己的设备接入。

最后结论是,蹭网并没有那么容易,完成没有必要谈Wifi破解就色变。Wifi万能秘钥这个App的流氓行为实在卑鄙无耻。

PHP文件编码遭遇UTF-8的BOM

之前总结过PHP文件编码的UTF-8编码带BOM的问题:http://blog.ifeeline.com/952.html

最近又遭遇了一次。过程如下:
我本机无法链接上实际服务器,也没有发布服务器,要做实际的测试需要到专门机器上去做,代码上传上去后报错,在FTP本地这边直接编辑文件保存然后上传,于是问题出现了,特别是那些返回JSON数据的方法,数据传递到客户端,都是就是无法解析。刚开始是代码哪里出了问题,用尽了所有可用方法,仍然无法找到问题出在哪里,最终恢复之前的版本上传到服务器,暂时缓解压力。

建立一个文件,保存为UTF-8编码:
UTF-8编码

然后用Windows中的文本编辑器打开并编辑后保存:
UTF-8 文本编辑

然后再次打开文件(使用EditPlus)查看编码:
修改文件编码

看到了吧,文件变成了ANSI,TMD,ANSI是啥毛啊,为何会改我的文件编码?我这里是Windows 7下做的实验,实际在XP下,如果文件原来是UTF-8编码,通过文本编辑器编辑保存后编码改为UTF-8 + BOM,注意,它是自动修改的,没有任何提示。

PHP中无法支持带BOM的UTF-8编码的文件,如果包含这种文件,将出现无法预料的问题。此问题是我第二次遇到此问题,真实操蛋。慎用Windows文本编辑器。

一点关于中国空军歼击机的文字

中国歼击机

有官方报道J10B是4代机,那么说明中国现在对歼击机的分法是按照5代来分了。根据报道,中国上世纪90年代,从俄罗斯购买了大批的苏27,在吃透了苏27的基础上仿制了J11,并在其基础上进行优化升级,最终生产了J11B。而美国在上世纪70年代末就开始装备了3代战机,中国那时候正是动乱年代,90年代引入了苏27后,才正式有3代战机,至少相差10年,如果从掌握3代机的技术来说,中国比老美至少晚了20年以上。中国的歼击机的发展,选择了一条捷径,那就是从俄罗斯采购3代机,然后吃透3代机的技术,再然后是在掌握了三代机的技术上发展了4代机。J10的研制也是如此,据说得到了以色列方面的技术帮助,而以色列是最早采购美国F16战机的国家,中国目前发展的J10B,据说已经是4代机了(三代半),而中国周边的国家或地区,如日本、韩国、新加坡、台湾等,采购的是美国F15和F16居多,它们应该都是3代机,F15和F16的改进型的这些4代机,是美国现在的主力,估计也不会允许出口,所以中国对周边就有了压倒性的优势。

目前中国已经成功试飞了J20,估计2018年可以装备5代机,但是美国从2005年就已经开始装备了F22,所以从技术来说,中国应该至少还落后老美10年,从中国的这个发展来看,中国的歼击机技术获得了跨代发展,上世纪90年代花钱购买的3代机,非常物有所值。

现在看到很多人说中国的技术涉及抄袭,妄自菲薄。我想说的是,在落后一大截的情况下,抄袭是唯一能赶超并逆袭的方法。在完全吃透了别人的技术的同时,大批的人才以及配套设置就会建立起来,这个为后面的4代和5代机的研究打下坚实的基础,现在的J11B,除了外形类似外,基本已经脱胎换骨了(据说发动机还是短板)。

如果J20开始装备空军,那么就歼击机层面,就可以和老美有得一比了。中国需要一支强大的空军,至少能够和老美抗衡,对日本以及周边国家或地区有压倒性优势,那么日本这样的小杂种才能安分一些,因为当美国不能成为它的靠山时,它还有什么底气?

单从技术上来说,中国的J10B和J11B跟美国的F16和F15,应该差别不大了,不过真格斗起来,应该还是会吃亏,这个不是技术问题了,是实战经验问题。

关于分辨率

分辨率

2K 和 4K名称来着横向分辨率接近2K 和 4K。

电脑的分辨率1024*768 1280*720 1366*768,当前电脑显示器一般都大于等于1366*768。

当前电视机顶盒输出的标清信号一般是7xx*5xx,高清机顶盒输出的信号大于等于1280*720。

当前大多数的电视的物理分辨率大于等于1280*720, 1920*1080的所谓2K电视是当前主流。

在高清机顶盒都没有很普及的情况下,1280*720的电视已经足够,如果需要看高清电影,那么当前主流的1920*1080电视也足够了。至于4K,完全扯淡,再过10年也无法普及。

当前低端的投影仪很多物理分辨率为800*600,如果用来投射标清电视,绰绰有余。如果要投射高清电视就选用1280*720估计比较好,如果要看高清电影就需要选择1920*1080的,但是1920*1080分别率的投影仪,当前的价格虚高。如果采购了一个1920*1080的投影仪,而你又有对应的片源,那么投影到200寸(或更大)的屏幕上,跟在当前的电影院看电影基本一样。如果投影仪的分辨率比较低,投射的屏幕越大,画面自然不够清晰,原因在于投射面越大画面被拉得也越大。

当前家庭影院看起来没有必要选择1920*1080的投影仪,一方面这个分辨率的投影仪当前价格虚高,另一方面家庭影院投射面一般100寸左右,100寸左右的投射,只要能支持到1280*720就足清晰了,当然在1080P的电视上看1080P的高清电影,细腻的度当然会比投射到100寸的屏幕上好很多,但是损失一些细腻度换取了大屏幕体验,也合算吧。

需要批一下的是当前的4K电视。当前机顶盒输出的信号还没有到达1080P(就是2K),所以用2K的电视看所谓的标清或高清电视,已经极度浪费了,只有少部分人会来看个全高清电影等。在视频源都远远无法到达1080P的情况下,开始了4K的炒作,真是无比恶心,而最悲剧的是很多人压根不知道自己为何要买4K电视,只知道越大越好,就比如你有那么大的管子,都是只有一股小泉水流进来,很明显,严重的浪费但自己还不晓得。如果你要搞一部能发挥4K显示效果的电影,粗糙估计也得20G吧,把这个数字在砍半,10G吧,假如你要下载它,假如你的是10M带宽,你至少需要下载2.275个小时,很明显,10M的带宽,你无法在线看,因为一般的电影都没有那么长的时间,除非阉割一下(就是降低质量)。

不过当前很多小区可以接入100M带宽了,如果100M的带宽开始普及,那么有线电视可以光荣退休了,完全可以使用宽带代替它。总而言之,4K电视离我们还很遥远,如果你现在如果购买了一个4K电视,当到了能使用上4K的电视信号时,你的电视估计也差不多报废了。