ofly 发表的文章

Linux禁止ping以及开启ping的方法

Linux默认是允许Ping响应的,系统是否允许Ping由2个因素决定的:A、内核参数,B、防火墙,需要2个因素同时允许才能允许Ping,2个因素有任意一个禁Ping就无法Ping。

 

具体的配置方法如下:

 

 A、内核参数设置

       1、允许PING设置

        A.临时允许PING操作的命令为:#echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

         B.永久允许PING配置方法。

              /etc/sysctl.conf 中增加一行

              net.ipv4.icmp_echo_ignore_all=1

          如果已经有net.ipv4.icmp_echo_ignore_all这一行了,直接修改=号后面的值即可的(0表示允许,1表示禁止)。

          修改完成后执行sysctl -p使新配置生效。

        QQ???20150309171941.png

       2、禁止Ping设置     

         A.临时禁止PING的命令为:#echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all     

       B.永久允许PING配置方法。

              /etc/sysctl.conf 中增加一行

              net.ipv4.icmp_echo_ignore_all=0

         如果已经有net.ipv4.icmp_echo_ignore_all这一行了,直接修改=号后面的值即可的。(0表示允许,1表示禁止)

         修改完成后执行sysctl -p使新配置生效。

         QQ???20150309173326.png

 

 

    B、防火墙设置(注:此处的方法的前提是内核配置是默认值,也就是没有禁止Ping)

     这里以Iptables防火墙为例,其他防火墙操作方法可参考防火墙的官方文档。

     1、允许PING设置      

        iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

        iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

       或者也可以临时停止防火墙操作的。

        service iptables stop

 

     2、禁止PING设置

        iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP

export和import

ES6模块主要有两个功能:export和import

export用于对外输出本模块(一个文件可以理解为一个模块)变量的接口

import用于在一个模块中加载另一个含有export接口的模块。

也就是说使用export命令定义了模块的对外接口以后,其他JS文件就可以通过import命令加载这个模块(文件)。如下图(假设a和b文件在同一目录下)


// a.js
var sex="boy";
var echo=function(value){
  console.log(value)
}
export {sex,echo}
//通过向大括号中添加sex,echo变量并且export输出,就可以将对应变量值以sex、echo变量标识符形式暴露给其他文件而被读取到
//不能写成export sex这样的方式,如果这样就相当于export "boy",外部文件就获取不到该文件的内部变量sex的值,因为没有对外输出变量接口,只是输出的字符串。

// b.js
通过import获取a.js文件的内部变量,{}括号内的变量来自于a.js文件export出的变量标识符。
import {sex,echo} from "./a.js"
console.log(sex) // boy
echo(sex) // boy

a.js文件也可以按如下export语法写,但不如上边直观,不太推荐。


// a.js
export var
sex="boy";export var echo=function(value){  console.log(value)}

//因为function echo(){}等价于 var echo=function(){}所以也可以写成
export function echo(value){
   console.log(value)
}

以上是export与module的基本用法,再进行拓展学习

前面的例子可以看出,b.js使用import命令的时候,用户需要知道a.js所暴露出的变量标识符,否则无法加载。可以使用export default命令,为模块指定默认输出,这样就不需要知道所要加载模块的变量名。

//a.js
var
sex="boy";export default sex(sex不能加大括号)
//原本直接export sex外部是无法识别的,加上default就可以了.但是一个文件内最多只能有一个export default。
其实此处相当于为sex变量值"boy"起了一个系统默认的变量名default,自然default只能有一个值,所以一个文件内不能有多个export default。

// b.js
本质上,a.js文件的export default输出一个叫做default的变量,然后系统允许你为它取任意名字。所以可以为import的模块起任何变量名,且不需要用大括号包含import any from "./a.js"
import any12 from "./a.js" console.log(any,any12) // boy,boy

2018年的第一场雪

2018年的第一场雪,今天如期所至,开启过年模式了。

通过gulp 在原html文件上自动化添加js、css版本号

原理

修改js和css文件通过对js,css文件内容进行hash运算,生成一个文件的唯一hash字符串(如果文件修改则hash号会发生变化)替换html中的js,css文件名,生成一个带版本号的文件名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方案

现在网上的方案都是生成一个新的dist目录,里面包含了要发布的html,js,css等文件。但是在实际的公司的项目中,会有情况不能生成新的HTML进行发布,需要在原来的HTML文件上进行js ,css版本的替换. 这里分享下我在实际项目中通过改动插件然后在原目录结构下进行版本的控制方案。

原html文件代码

<link rel="stylesheet" href="../css/default.css"><script src="../js/app.js"></script>
  • 1
  • 2

预期效果:在原目录结构下html文件代码

<link rel="stylesheet" href="../css/default.css?v=5a636d79c4"><script src="../js/app.js?v=3a0d844594"></script>
  • 1
  • 2

1:安装gulp和gulp插件 
执行:

npm install --save-dev gulpnpm install --save-dev gulp-revnpm install --save-dev gulp-rev-collectornpm install --save-dev run-sequence
  • 1
  • 2
  • 3
  • 4

2:编写gulpfile.js

//引入gulp和gulp插件var gulp = require('gulp'),    runSequence = require('run-sequence'),    rev = require('gulp-rev'),    revCollector = require('gulp-rev-collector');//定义css、js源文件路径var cssSrc = 'css/*.css',    jsSrc = 'js/*.js';//CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射gulp.task('revCss', function(){    return gulp.src(cssSrc)        .pipe(rev())        .pipe(rev.manifest())        .pipe(gulp.dest('rev/css'));});//js生成文件hash编码并生成 rev-manifest.json文件名对照映射gulp.task('revJs', function(){    return gulp.src(jsSrc)        .pipe(rev())        .pipe(rev.manifest())        .pipe(gulp.dest('rev/js'));});//Html替换css、js文件版本gulp.task('revHtml', function () {    return gulp.src(['rev/**/*.json', 'View/*.html'])        .pipe(revCollector())        .pipe(gulp.dest('View'));});//开发构建gulp.task('dev', function (done) {    condition = false;    runSequence(        ['revCss'],        ['revJs'],        ['revHtml'],        done);});gulp.task('default', ['dev']);
  • 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
  • 51
  • 52

执行gulp命令后的效果

//rev目录下生成了manifest.json对应文件{  "default.css": "default-803a7fe4ae.css"}<link rel="stylesheet" href="../css/default-803a7fe4ae.css"><script src="../js/app-3a0d844594.js"></script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

很显然这不是我们需要的效果

3.更改gulp-rev和gulp-rev-collector

打开node_modules\gulp-rev\index.js第136行 manifest[originalFile] = revisionedFile;更新为: manifest[originalFile] = originalFile + '?v=' + file.revHash;
  • 1
  • 2
  • 3
打开nodemodules\rev-path\index.js10行 return modifyFilename(pth, (filename, ext) => `${filename}-${hash}${ext}`);更新为: return modifyFilename(pth, (filename, ext) => `${filename}${ext}`);
  • 1
  • 2
  • 3
打开node_modules\gulp-rev-collector\index.js43
let cleanReplacement = path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' );更新为: let cleanReplacement = path.basename(json[key]).split('?')[0];
  • 2
  • 3
打开node_modules\gulp-rev-collector\index.js第143行 regexp: new RegExp(  dirRule.dirRX + pattern , 'g' ),
更新为: regexp: new RegExp( dirRule.dirRX + pattern +'(\\?v=\\w{10})?', 'g' ),
如下:
// changes.push({ //regexp: new RegExp( dirRule.dirRX + pattern , 'g' ), regexp: new RegExp( dirRule.dirRX + pattern +'(\\?v=\\w{10})?', 'g' ), patternLength: (dirRule.dirRX + pattern).length, replacement: _.isFunction(dirRule.dirRpl) ? dirRule.dirRpl(manifest[key]) : closeDirBySep(dirRule.dirRpl) + manifest[key] });


  • 1
  • 2
  • 3

最终结果 
经过上面的四步修改之后现在你不管执行多少遍gulp命令,得到的html效果都是:

<link rel="stylesheet" href="../css/default.css?v=5a636d79c4"><script src="../js/app.js?v=3a0d844594"></script>

MAC升级Nodejs和Npm到最新版

第一步,先查看本机node.js版本:

node -v

第二步,清除node.js的cache:

sudo npm cache clean -f

第三步,安装 n 工具,这个工具是专门用来管理node.js版本的,别怀疑这个工具的名字,是他是他就是他,他的名字就是 "n"

sudo npm install -g n

第四步,安装最新版本的node.js

sudo n stable

如果报-bash: n: command not found 需要执行下:ln -s /home/node-v6.9.5-linux-x64/bin/n /usr/local/bin/n
/home/node-v6.9.5-linux-x64是安装的路径

第五步,再次查看本机的node.js版本:

node -v

第六步,更新npm到最新版:

$ sodu npm install npm@latest -g

第七步,验证

node -vnpm -v

部署Node.js项目(CentOS)

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用来方便地搭建快速的易于扩展的网络应用。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效,非常适合运行在分布式设备的数据密集型的实时应用。Node.js 的包管理器 npm,是全球最大的开源库生态系统。典型的应用场景包括:

  • 实时应用:如在线聊天,实时通知推送等等(如socket.io)
  • 分布式应用:通过高效的并行I/O使用已有的数据
  • 工具类应用:海量的工具,小到前端压缩部署(如grunt),大到桌面图形界面应用程序
  • 游戏类应用:游戏领域对实时和并发有很高的要求(如网易的pomelo框架)
  • 利用稳定接口提升Web渲染能力
  • 前后端编程语言环境统一:前端开发人员可以非常快速地切入到服务器端的开发(如著名的纯Javascript全栈式MEAN架构)

适用对象

本文档介绍如何在阿里云CentOS系统的云服务器ECS实例上,安装Nodejs并部署项目。

准备工作

部署之前,请做如下准备工作:

  • 购买ECS实例
  • 您的实例运行的镜像是CentOS7.2
  • 您的实例可以连接公网
  • 本地已经安装用于连接 Linux 实例的工具,如 Xshell

基本流程

使用云服务器 ECS 安装Nodejs并部署项目的操作步骤如下:

  1. 购买 ECS 实例。
  2. 部署Node.js环境-二进制文件安装。
  3. 部署Node.js环境-使用NVM安装多版本。
  4. 部署测试项目。

注:2和3步骤,根据您的实际应用场景,任选其一。

操作步骤

步骤 1:创建ECS实例

选择操作系统为公共镜像CentOS7.2。使用root用户登录Linux实例

步骤2:部署Node.js环境—二进制文件安装

该部署过程使用的安装包是已编译好的二进制文件,解压之后,在bin文件夹中就已存在node和npm,无需手工编译。

安装步骤:

1、 wget命令下载Node.js安装包。

该安装包是编译好的文件,解压之后,在bin文件夹中就已存在node和npm,无需重复编译。

  1. wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz

2、 解压文件。

  1. tar xvf node-v6.9.5-linux-x64.tar.xz

3、创建软链接,使node和npm命令全局有效。

通过创建软链接的方法,使得在任意目录下都可以直接使用node和npm命令:

  1. ln -s /root/node-v6.9.5-linux-x64/bin/node /usr/local/bin/node
  2. ln -s /root/node-v6.9.5-linux-x64/bin/npm /usr/local/bin/npm

4,查看node、npm版本。

  1. node -v
  2. npm -v

5、至此,Node.js环境已安装完毕。

软件默认安装在/root/node-v6.9.5-linux-x64/目录下。如果需要将该软件安装到其他目录(如:/opt/node/)下,请进行如下操作:

  1. mkdir -p /opt/node/
  2. mv /root/node-v6.9.5-linux-x64/* /opt/node/
  3. rm -f /usr/local/bin/node
  4. rm -f /usr/local/bin/npm
  5. ln -s /opt/node/bin/node /usr/local/bin/node
  6. ln -s /opt/node/bin/npm /usr/local/bin/npm

UglifyJS2安装


npm 全局安装

sudo npm install uglify-js -g

你也可以通过 github 来下载源码使用

git clone git://github.com/mishoo/UglifyJS2.git
使用:

dir$ uglifyjs spa.js -m -o spa.min.js

* source-map [string],生成source map文件。
* –source-map-root [string], 指定生成source map的源文件位置。
* –source-map-url [string], 指定source map的网站访问地址。
* –source-map-include-sources,设置源文件被包含到source map中。
* –in-source-map,自定义source map,用于其他工具生成的source map。
* –screw-ie8, 用于生成完全兼容IE6-8的代码。
* –expr, 解析一个表达式或JSON。
* -p, –prefix [string], 跳过原始文件名的前缀部分,用于指定源文件、source map和输出文件的相对路径。
* -o, –output [string], 输出到文件。
* -b, –beautify [string], 输出带格式化的文件。
* -m, –mangle [string], 输出变量名替换后的文件。
* -r, –reserved [string], 保留变量名,排除mangle过程。
* -c, –compress [string], 输出压缩后的文件。
* -d, –define [string], 全局定义。
* -e, –enclose [string], 把所有代码合并到一个函数中,并提供一个可配置的参数列表。
* –comments [string], 增加注释参数,如@license、@preserve。
* –preamble [string], 增加注释描述。
* –stats, 显示运行状态。
* –acorn, 用Acorn做解析。
* –spidermonkey, 解析SpiderMonkey格式的文件,如JSON。
* –self, 把UglifyJS2做为依赖库一起打包。
* –wrap, 把所有代码合并到一个函数中。
* –export-all, 和–wrap一起使用,自动输出到全局环境。
* –lint, 显示环境的异常信息。
* -v, –verbose, 打印运行日志详细。
* -V, –version, 打印版本号。
* –noerr, 忽略错误命令行参数。





uglifyjs压缩批处理

新建一个txt文档,任意命名,将下面的代码粘贴进去,修改JSFOLDER后面的文件夹目录为你自己的,然后把.txt后缀改成.bat就可以啦!然后双击就可以批量使用uglifyjs压缩JS文件啦!

[html] view plain copy
  1. @echo off  
  2. :: 设置压缩JS文件的根目录,脚本会自动按树层次查找和压缩所有的JS  
  3. SET JSFOLDER=C:\Users\Administrator\Desktop\page  
  4. echo 正在查找JS文件  
  5. chdir /d %JSFOLDER%  
  6. for /r . %%a in (*.js) do (  
  7. @echo 正在压缩 %%~a …  
  8. uglifyjs %%~fa -m -o %%~DPNa.min.js  
  9. )  
  10. echo 完成!  
  11. pause & exit  

什么样的APP算是好的

1、绝不考虑Web形态,一切考虑都基于APP。

2、产品优先级:
(1)有趣高于功能,产品必须有趣,必须Cool,才可能形成传播和口碑。
(2)功能高于交互,明确的功能满足明确的需求,用户不会在意炫酷交互效果。
(3)交互高于UI。便捷、快速的交互设计为先,围绕具体功能实现UI,而非有优质UI方案为此专门设立一个功能。

3、聚焦:一个APP只做一件事情,一个大而全的APP意味着全面的平庸。

4、永远一维化:让用户在一个维度里解决具体的问题,Twitter的Timeline就是一个好的范例。而类似Facebook、Path那样的滑出式菜单则是一个灾难,因为这使得产品拥有两个维度,加大了用户理解的困难。

5、保持主干清晰,枝干适度。产品的主要功能架构是产品的骨骼,它应该尽量保持简单、明了,不可以轻易变更,让用户无所适从。次要功能丰富主干,不可以喧宾夺主,尽量隐藏起来,而不要放在一级页面。

6、不要让用户选择。同一个页面之内,有多个入口;同一个功能,有多个实现方式;同一个界面,有多个展示方式。这对于用户来说是一种痛苦而非享受,因为他们只会因此而感觉到困惑和恐惧。用户宁可采取重复操作漫长而固定的操作路径,也不愿意使用多变的快捷方式。

7、隐藏技术,永远展现简单的、人性化的、符合人类直觉的界面。开发不可以为了炫技而展示功能,产品不可以为了炫耀而功能堆砌。

8、 拒绝个性化。除了依靠设计特色而立身的APP,换肤一类的个性化设计,除了让产品经理幻觉自己做了许多工作而自我满足之外,没有任何价值。它只能证明产品经理对自己的产品不自信,因为自信的产品经理凭借默认皮肤就可以满足用户。延伸开去,一个好的产品,其功能应该满足全球用户需求,无需为地区做特别定制化。

9、 产品一定程度上是为了满足人性中的贪嗔痴,这是用户的痛点。能把握住之后,产品经理应该超越其上,用产品帮助人们得以解脱。

10、想清楚自己究竟要做什么,不去迎合上司,不去讨好用户,不去取悦自己。

11、 分类!分类!分类!这是产品经理在确定产品主要功能构架之后,唯一应该为用户做的事情。分类无助于降低产品使用的难度,但是可以帮助用户认知产品和周边的世界。

12、永远围绕功能而做设计,永远不要倒过来做这件事情。

13、一个产品的基本功能不受用户认可,做加法也无济于事。

14、想不清楚一个功能点之前,宁可不做。

15、千万不要让用户在产品里“管理”什么。
Total: 285Page 1 of 361234567Next ›Last »