miki艾比利个人博客

愿居于一城,与卿所见美好......

推荐文章

javascript常用正则表达式(-)

    Javascript 与正则表达式

     

    一、正则表达式(regular expression简称res)

    1、定义:

    一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。

    正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

     

    2、作用:

    正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;

    提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。

    3、主要用途:

    正则表达式被用来匹配一组文字。

    通常,它有两类用途:

    1. 数据有效性验证
    2. 查找和替换 

     

    4、如何来构造正则表达式:

    构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式

    可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式。对 JScript 而言,分隔符为一对正斜杠 (/) 字符。

    1. 构造器函数方法使用方法如下:
      new RegExp("pattern"[, "flags"])

     

    1. 文本格式: /pattern/flags

    参数说明:

    pattern :一个正则表达式文本

    flags : 如果存在,将是以下值: 

    g global match(全局匹配)

    i ignore case(忽略大小写)

    gi both global match and ignore case(匹配所有可能的值,也忽略大小写)

    注意:文本格式中的参数不要使用引号标记,而构造器函数的参数则要使用引号标记。所以下面的
    表达式建立同样的正则表达式:/ab+c/i   等价于   new RegExp("ab+c", "i")

    使用 文本格式 文本的长度最大支持128个字符,

    描述:
    当使用构造函数的时候,必须使用正常的字符串避开规则(在字符串中加入前导字符\ )是必须的。
    例如,下面的两条语句是等价的:
    re = new RegExp("\\w+")
    re = /\w+/

     

    三、正则表达式的常用方法:

     

    regexp.test(string)

    用来测试一个字符串是否能够被匹配。它返回turefalse两个值。

    regexp.exec(string)

    在指定的字符串中执行搜寻一个匹配,匹配的结果是通过一个数组返回。

     

    四、与正则表达式有关的字符串对象的方法:

     

    string.replace(pattern,string)

    替换在正则表达式查找中找到的文本。

    string.search(pattern)

    通过正则表达式查找相应的字符串,只是判断有无匹配的字符串。如果查找成功,search返回匹配串的位置, 否则返回-1 

    string.match(pattern)

    match方法执行全局查找,查找结果存放在一个数组里。 

     

    五、常用的正则表达式的操作符

     

    Symbol

    Function

    \

    转义符

    (), (?:), (?=), []

    括号

    *, +, ?, {n}, {n,}, {n,m}

    限定符

    ^, $, \anymetacharacter

    定位符

    |

     

     

    八、一些常用的正则表达式示例:

     

    1、匹配所有的正数:^[0-9]+$

    2、匹配所有的小数:^\-?[0-9]*\.?[0-9]*$

    3匹配所有的整数:^\-?[0-9]+$

    4、提取信息中的中文字符串: [\u4e00-\u9fa5]*

    5、提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
    6
    、提取信息中的中国手机号码:(86)*0*13\d{9}
    7
    、提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
    8
    、提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
    9
    、提取信息中的中国身份证号码:\d{18}|\d{15}
    10
    、提取信息中的任何数字:(-?\d*)(\.\d+)?
    11
    匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/

     

    则表达式用于字符串处理、表单验证等场合,实用高效。
    现将一些常用的表达式收集于此,以备不时之需。

    匹配中文字符的正则表达式: [\u4e00-\u9fa5]
    评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

    匹配双字节字符(包括汉字在 )[^\x00-\xff]
    评注:可以用来计算字符串的长度(一个双字节字符长度计2ASCII字符计1

    匹配空白行的正 则表达式:\n\s*\r
    评注:可以用来删除空白行

    匹配HTML标记的正则表达式:<(\S*?) [^>]*>.*?</\1>|<.*? />
    评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对 于复杂的嵌套标记依旧无能为力

    匹配首尾空白字符的正则表达式:^\s*|\s*$
    评注:可以用来删除行首行尾的空白字符(包括空 格、制表符、换页符等等),非常有用的表达式

    匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.] \w+)*\.\w+([-.]\w+)*
    评注:表单验证时很实用

    匹配网址URL的正则表达式:[a-zA- z]+://[^\s]*
    评注:网上流传的版本功能很有限,上面这个基本可以满足需求

    匹配帐号是否合法(字母开头,允许5-16 字节,允许字母数字下划线)^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    评注:表单验证时很实用

    匹配国内电话号 码:\d{3}-\d{8}|\d{4}-\d{7}
    评注:匹配形式如 0511-4405222  021-87888822

    配腾讯QQ号:[1-9][0-9]{4,}
    评注:腾讯QQ号从10000开始

    匹配中国邮政编码:[1-9]\d{5}(?! \d)
    评注:中国邮政编码为6位数字

    匹配身份证:\d{15}|\d{18}
    评注:中国的身份证为15位或18

    ip地址:\d+\.\d+\.\d+\.\d+
    评注:提取ip地址时有用

    匹配特定数字:
    ^[1-9]\d*$     //匹配正整数
    ^-[1-9]\d*$   //匹配负整数
    ^-?[1-9]\d*$   //匹配整数
    ^[1-9]\d*|0$   //匹配非负整数(正整数 + 0
    ^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0
    ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$    //匹配正浮点数
    ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
    ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$   //匹配浮点数
    ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点  + 0
    ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点  + 0
    评注:处理大量数据时有用,具体应用时注意修正

    匹配特定字符串:
    ^[A-Za-z]+$  //匹配由26 个英文字母组成的字符串
    ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
    ^[a-z]+$  //匹配由26个英文字母 的小写组成的字符串
    ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
    ^\w+$  //匹配由数字、26 英文字母或者下划线组成的字符串
    评注:最基本也是最常用的一些表达式

     

    加了时间验证的

    ^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\d):[0-5]?\d:[0-5]?\d$

    阅读全文>>

作者:miki艾比利分类:【web前端浏览(465评论(0

2019-10-15 17:02:40

使用百度云CDN为你的网站加速教程

    1.在程序猿届流传一句老话,没有手撸过个人网站的程序猿不是好的程序猿。

    站长也撸这个网站撸了两年多了,纯属个人爱好,无任何盈利,自己也是三两天开心了就倒腾点内容上去,三天打鱼两天晒网。但是每年高昂的服务器费用经不起咱们这样玩耍,像阿里云,腾讯云这样的云服务器平台,1G1核1M带宽的服务器年均价也要千元靠上。本人吊钱没有,就只能尽量花最小的成本,将兴趣开销最大化。于是便四处借学妹,学弟的学生证在某云平台上白嫖,每年成本合120元,加上每年域名45元,基本上170元左右就能维护个人网站的运营。

    但是有归有了,友好性就不尽人意了,1M带宽稍微搞点页面的花样,服务器页面加载就得花上半天时间。卡的不要不要的。这个时候就动心思优化网站了。由于站长是搞java出身的,网站依然是用的jsp,所以想到了使用freemarker作为静态资源模板,将动态页面生成html页面,通过nginx进行反向代理。这样解决了详情页面加载问题。

    但是站点主页依然慢的要死,某得办法,只能对页面数据进行缓存,这里想到了用redis作为页面数据缓存,将主页的每个板块的数据都单独存到redis中,页面加载时,先从redis中取数据,减少直接从数据库读数据的压力。当页面内容发生变化时,将redis数据删除,然后将新的内容再存入redis中。这样解决了主页访问的压力。

     

    最后一步,就是解决静态资源缓存的问题,比如js,css,图片等静态资源。这里用到了本次讲的核心内容,CDN节点,就是一些大的平台在全国各地部署上自己的服务器,将你的网站上的静态资源同步到每个节点上,这样就解决了不同地区的网络访问你的服务器的资源的时候,都有就近的服务器可以为你提供页面资源,减少各个节点之间的数据传输,以及跨节点问题。

    目前免费的CDN有百度云,七牛云,360云等。无用的是百度云加速。直接登录该网站,注册之后,进行身份认证,然后开始服务器的绑定吧。

    1.成功接入以后,选择规则自定义

     

    2.添加自定义规则设置如下:

    • 添加URL

    *ddblog.cc/*

    • 把ddblog.cc改为你自己的网址

    • 跳转到 OFF

    • 缓存粒度设置 所有都缓存

    • 节点缓存有效期 一周

    • 浏览器缓存有效期 2小时或4小时

    • 永久在线 ON

    • 图片延迟加载 OFF

    • 加速 OFF

    • 安全通用设置 ON

    • CC防护 

    • 浏览器检查 OFF

    • 保存即可

    设置好以后要等会再去测速看看效果吧

    PS:如果设置好以后需要调节前台页面效果或者样式,请打开实时同步,不然,你修改过之后,页面会不生效的。

    不需要修改样式的时候要把实时同步关闭,否则加载会很慢的。喜欢的点个赞哦

    阅读全文>>

作者:miki艾比利分类:【SEO浏览(511评论(0

2019-10-10 19:56:21

初期草根站长适合做什么样的网站好?

    初期草根站长适合做什么样的网站好?

    当你决定做一名累得半死的草根站长后,在选择网站定位的时候也会出现难处,不知道要做什么样的网站好,对于草根站长来说,用一个字来形容就是“穷”!要有钱谁会选择这条路?早上笔者花了三个小时的时间在互联网上泡,搜索了一些关于草根站长在初期应该做什么样的网站内容,因为本身也需要了解通过做什么网站更好赚钱,下面就根据笔者的理解来为众草根分享一下个人的见解。

     

    一.量力而行,草根不宜贪大

    俗话说得好,你有多大胃,就吃多少饭,对于草根而言,在定位网站的时候最好根据自己的能力和胃口来做网站,很多草根站长在初期,就幻想着做一个拼比京东淘宝之类的大商场,但最后个人运营能力有限,导致网站没什么利润可图;在做一个网站之前,最好先考虑这几点:1.自己是每天都奉献在上面,还是业余时间打理网站?2.网站能提供什么样的内容?3.看网站的都是什么人?是否有愿意看网站的用户?

    做好三点的分析,如果一天没有多少时间,就别做大型网站,根据笔者的经验而言,大网站不光要人力,还需要推广的资金,对于草根站长不是很适合。

    二.网站内容要专一,切记做成“杂货铺”

    对于新的草根站长而言,理想往往很伟大,想做这个又想做那个,最后把网站做成了什么内容都有的网站,虽说内容丰富是好事,但是内容范围杂乱的话,也会失去网站形象,因此,在定位网站前,不要考虑做什么,而是考虑用户要什么,然后再针对核心进行网站建设,做一个专一核心的网站。

    三.初期站长适合做什么网站好?

    对于新入站长行业的朋友,由于技术方面不成熟,做不出好的网站,或者不知道做什么样的网站好,那么不妨做一个简单的个人博客,用来充当互联网的名片,关于博客的搭建,互联网上教程已经很多了,快的话,一天就可以搭建好一个博客。若你要说做博客有什么用?那笔者告诉你,一个博客能否搭建完成,是对一个初级站长的考验,而且搭建博客是最简单的技术,搭建完成后,对新站长提升自信有所帮助。

    或者是做本地行业的一个网站,例如:搬家、物流、装修、培训、特色食品等网站,然后通过一些互联网推广的方法进行推广宣传,当然,如果选择做行业网站,那么盈利的事情就只能等后期有流量再考虑了,重点是提升站长的自信,提升自身技术,为以后提供建站服务打下基础。

     

    初期,新站长最好避免做商场或者论坛等大型网站,至于做什么网站赚钱,其实每一个网站都有自身的价值所在,需要长时间运营,例如你做一个装修网站,后期运营好的话,会有户主联系你,你在找装修公司合作,那提成也是一个不错的模式,但若是想做网站立马赚钱,只能说有点浮夸。

    四.定位网站最好是要有转换变现的

    在定位初期要做什么网站之前,最好也要考虑网站的盈利模式,有的是靠挂广告,有的是靠宣传产品达成合作,若是靠广告盈利,那么就要累积流量,目前网站流量大多都是靠日积月累而来的,因此,最好不要依靠流量广告来赚钱,最好选择能产生转换的来做。

     

    如何保证转换呢?无非就是动脑分析用户而已,用户是谁?用户看我网站目的是什么?用户看完后能不能和我产生利益合作挂钩?因为目前用户上网搜索的人群较多,上网也并不一定是你的合作用户,所以在定位网站之前,一定要考虑清楚,举个例子,如果你是做培训资料分享的,网站都是一些高质量的内容资料,符合用户体验,也有流量,但这类人群上网的目的就是查询资料,看完资料他们就走了,根本无法架起自身与用户的沟通桥梁,这类网站想要赚钱也不容易。

    就拿笔者的博客来说吧,之所以能有人咨询,原因在于能产生互动,而且提供的内容都不是固定答案的,分享观点,一旦架起了与用户沟通的桥梁,盈利自然不在话下,有服务合作的,有付费培训的,有学习建站的,只要自身有技术,变现自然没问题。

    注:不管任何网站,要想知道是否有转换,首先从用户上网目的分析开始,其次是与能否用户交流沟通为主,这类网站才具备转换。

    总结:针对目前的草根站长而言,大多数站长都没赚钱,原因在于网站初期定位不准确,加上没有长期运营下去,只有做好基础的这两点,才能实现网站的价值,提升草根站长的利益,至于做什么样的网站能赚钱,这个也是没有一个固定的答案,需要结合网站自身定位以及用户需求群体而言,大家不妨自己动脑去思考一下。

    本文由岑辉宇原创,原文地址:http://www.chyseo.net/2230.html

    阅读全文>>

作者:miki艾比利分类:【日记浏览(456评论(0

2019-10-10 18:09:19

【转载】kettle转换定义错误处理

    Kettle使用_1转换之错误处理

    2018-03-14 23:19:24 SunShine2025 阅读数 4782更多

    分类专栏: ETL

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    本文链接:https://blog.csdn.net/shenliang1985/article/details/79561802

    需求:通过kettle配置数据转换失败的日志记录.

    解决方法:通过表输入、表输出、文本文件输出等组件完成该功能.

     

    1)  配置数据库连接,这里输入连接名、主机名称、数据库名称、数据库用户名、密码等数据库的基本信息

    2)  新建立个转换,或者通过快捷键Ctrl+N建立

     

     

    3) 在核心对象里找到输入这个分类,然后下拉找到表输入组件

    4)定位到表输入这个组件并将其拖放到右边的面板中

     

    5)双击表入组件,对组件相应内容进行修改

     

    6)创建验证表tb_kettle并插入数据后修改表输入组件中SQL的内容见下截图示意:

    1. CREATE TABLE `tb_kettle` (
    2.   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '元数据标识',
    3.   `name` varchar(100) DEFAULT NULL COMMENT '姓名',
    4.   `birthday` date DEFAULT NULL COMMENT '出生日期',
    5.   `des` varchar(6) DEFAULT NULL,
    6.   PRIMARY KEY (`id`)
    7. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULTCHARSET=utf8;
    8.  
    9. INSERT INTO tb_kettle(name, birthday, des)
    10.   VALUES ('Tom', '1988/3/23 0:00:00', 'good');
    11.  
    12. INSERT INTO tb_kettle(name, birthday, des)
    13.   VALUES ('Tim', '1978/2/16 0:00:00', 'nice');
    14.  
    15. INSERT INTO tb_kettle(name, birthday, des)
    16.   VALUES ('Kate', '1968/6/24 0:00:00', 'badguy');
    17.  
    18. INSERT INTO tb_kettle(name, birthday, des)
    19.   VALUES ('Mike', '1998/3/13 0:00:00', 'badman');

     

     

    7)我们先定义好要输出的表结构,这里为了演示错误处理的过程,故意将des字段定义短了些,见如下SQL语句.

    1. CREATE TABLE `tb_kettle_out` (
    2.   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '元数据标识',
    3.   `name` varchar(100) DEFAULT NULL COMMENT '姓名',
    4.   `birthday` date DEFAULT NULL COMMENT '出生日期',
    5.   `des` varchar(4) DEFAULT NULL,
    6.   PRIMARY KEY (`id`)
    7. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    注:此步可直接在数据库里执行,也可以在表输入组件里执行该DDL.

    7)同理找到输出这个分类并找到表输出这个组件,然后拖到右边面板中.这时需要做个动作:点击表输入组件,按住SHIFT键,将表输入和表输出连接起来,见下图所示:

    8)双击表输出组件,选择要输出的表,如果tb_kettle_out已经在数据库里建好则只需要选择即可,如果还未创建,可以参照步骤9

     

     

    9)如果想在表输入时执行DDL,可参见下面的步骤,先双击表输出组件,在选中表后执行DDL,详细步骤见下图所示:

     

     

    10)同理拖动一个文本文件输出组件并将表输出和其连接,这里选择错误处理步骤

     

    11)右击表输出,选中定义错误处理选项并定义错误相关的字段名称,具体见下图: 

     

     

    12)右击文本文件输出,设置错误文件要输出的字段,具体设置见下图: 

     

     

    13)运行转换并验证执行结果

     

    打开错误文本文件不难发现tb_kettle里的4条记录有2条在错误日志内:

     

    同时查看tb_kettle_out不难发现进来了2条记录.

     

     

     

    阅读全文>>

作者:miki艾比利分类:【数据集成工具浏览(1733评论(0

2019-10-10 14:23:55

【转载】阿里资深工程师教你如何优化 Java 代码!

    作者 | 王超

    责编 | 伍杏玲

    明代王阳明先生在《传习录》谈为学之道时说:

    私欲日生,如地上尘,一日不扫,便又有一层。着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可。

    代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。这里,整理了日常工作中的一些"坏味道",及清理方法,供大家参考。

     

    让代码性能更高

     

    1.需要 Map 的主键和取值时,应该迭代 entrySet()

    当循环中只需要 Map 的主键时,迭代 keySet() 是正确的。但是,当需要主键和取值时,迭代 entrySet() 才是更高效的做法,比先迭代 keySet() 后再去 get 取值性能更佳。

    反例: 

    Map map = ...;
    for (String key : map.keySet()) {
        String value = map.get(key);
        ...
    }


    正例:

    Map map = ...;
    for (Map.Entry entry : map.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue();
        ...
    }


    2.应该使用Collection.isEmpty()检测空

    使用 Collection.size() 来检测空逻辑上没有问题,但是使用 Collection.isEmpty()使得代码更易读,并且可以获得更好的性能。任何 Collection.isEmpty() 实现的时间复杂度都是 O(1) ,但是某些 Collection.size() 实现的时间复杂度可能是 O(n) 。

    反例:

    if (collection.size() == 0) {
        ...
    }


    正例:

    if (collection.isEmpty()) {
        ...
    }


    如果需要还需要检测 null ,可采用CollectionUtils.isEmpty(collection)和CollectionUtils.isNotEmpty(collection)。

    3.不要把集合对象传给自己

    此外,由于某些方法要求参数在执行期间保持不变,因此将集合传递给自身可能会导致异常行为。

    反例:

    List list = new ArrayList<>();
    list.add("Hello");
    list.add("World");
    if (list.containsAll(list)) { // 无意义,总是返回true
        ...
    }
    list.removeAll(list); // 性能差, 直接使用clear()


    4.集合初始化尽量指定大小

    Java 的集合类用起来十分方便,但是看源码可知,集合也是有大小限制的。每次扩容的时间复杂度很有可能是 O(n) ,所以尽量指定可预知的集合大小,能减少集合的扩容次数。

    反例:

    int[] arr = new int[]{1, 2, 3};
    List list = new ArrayList<>();
    for (int i : arr) {
        list.add(i);
    }


    正例:

    int[] arr = new int[]{1, 2, 3};
    List list = new ArrayList<>(arr.length);
    for (int i : arr) {
        list.add(i);
    }


    5.字符串拼接使用 StringBuilder 

    一般的字符串拼接在编译期 Java 会进行优化,但是在循环中字符串拼接, Java 编译期无法做到优化,所以需要使用 StringBuilder 进行替换。

    反例:

    String s = "";
    for (int i = 0; i < 10; i++) {
        s += i;
    }


    正例:

    String a = "a";
    String b = "b";
    String c = "c";
    String s = a + b + c; // 没问题,java编译器会进行优化
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; i++) {
        sb.append(i);  // 循环中,java编译器无法进行优化,所以要手动使用StringBuilder
    }


    6.List 的随机访问

    大家都知道数组和链表的区别:数组的随机访问效率更高。当调用方法获取到 List 后,如果想随机访问其中的数据,并不知道该数组内部实现是链表还是数组,怎么办呢?可以判断它是否实现* RandomAccess *接口。

    正例:

    // 调用别人的服务获取到list
    List list = otherService.getList();
    if (list instanceof RandomAccess) {
        // 内部数组实现,可以随机访问
        System.out.println(list.get(list.size() - 1));
    } else {
        // 内部可能是链表实现,随机访问效率低
    }


    7.频繁调用 Collection.contains 方法请使用 Set

    在 Java 集合类库中,List 的 contains 方法普遍时间复杂度是 O(n) ,如果在代码中需要频繁调用 contains 方法查找数据,可以先将 list 转换成 HashSet 实现,将 O(n) 的时间复杂度降为 O(1) 。

    反例: 

    ArrayList list = otherService.getList();
    for (int i = 0; i <= Integer.MAX_VALUE; i++) {
        // 时间复杂度O(n)
        list.contains(i);
    }


    正例:

    ArrayList list = otherService.getList();
    Set set = new HashSet(list);
    for (int i = 0; i <= Integer.MAX_VALUE; i++) {
        // 时间复杂度O(1)
        set.contains(i);
    }


     

    二 让代码更优雅
     

    1.长整型常量后添加大写 L
    在使用长整型常量值时,后面需要添加 L ,必须是大写的 L ,不能是小写的 l ,小写 l 容易跟数字 1 混淆而造成误解。

    反例:

    long value = 1l;
    long max = Math.max(1L, 5);


    正例:

    long value = 1L;
    long max = Math.max(1L, 5L);


    2. 不要使用魔法值

    当你编写一段代码时,使用魔法值可能看起来很明确,但在调试时它们却不显得那么明确了。这就是为什么需要把魔法值定义为可读取常量的原因。但是,-1、0 和 1不被视为魔法值。

    反例: 

    for (int i = 0; i < 100; i++){
        ...
    }
    if (a == 100) {
        ...
    }


    正例:

    private static final int MAX_COUNT = 100;
    for (int i = 0; i < MAX_COUNT; i++){
        ...
    }
    if (count == MAX_COUNT) {
        ...
    }


    3. 不要使用集合实现来赋值静态成员变量

    对于集合类型的静态成员变量,不要使用集合实现来赋值,应该使用静态代码块赋值。

    反例:

    private static Map map = new HashMap() {
        {
            put("a", 1);
            put("b", 2);
        }
    };
     
    private static List list = new ArrayList() {
        {
            add("a");
            add("b");
        }
    };
    
    正例:
    private static Map map = new HashMap<>();
    static {
        map.put("a", 1);
        map.put("b", 2);
    };
     
    private static List list = new ArrayList<>();
    static {
        list.add("a");
        list.add("b");
    };


    4. 建议使用 try-with-resources 语句

    Java 7 中引入了 try-with-resources 语句,该语句能保证将相关资源关闭,优于原来的 try-catch-finally 语句,并且使程序代码更安全更简洁。

    反例:

    private void handle(String fileName) {
        BufferedReader reader = null;
        try {
            String line;
            reader = new BufferedReader(new FileReader(fileName));
            while ((line = reader.readLine()) != null) {
                ...
            }
        } catch (Exception e) {
            ...
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    ...
                }
            }
        }
    }


     

    正例:

    private void handle(String fileName) {
        try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
            String line;
            while ((line = reader.readLine()) != null) {
                ...
            }
        } catch (Exception e) {
            ...
        }
    }


    5. 删除未使用的私有方法和字段

    删除未使用的私有方法和字段,使代码更简洁更易维护。若有需要再使用,可以从历史提交中找回。

    反例: 

    public class DoubleDemo1 {
        private int unusedField = 100;
        private void unusedMethod() {
            ...
        }
        public int sum(int a, int b) {
            return a + b;
        }
    }


    正例: 

    public class DoubleDemo1 {
        public int sum(int a, int b) {
            return a + b;
        }
    }


    6. 删除未使用的局部变量

    删除未使用的局部变量,使代码更简洁更易维护。

    反例:

    public int sum(int a, int b) {
        int c = 100;
        return a + b;
    }
    正例:

    public int sum(int a, int b) {
        return a + b;
    }
     
    7. 删除未使用的方法参数

    未使用的方法参数具有误导性,删除未使用的方法参数,使代码更简洁更易维护。但是,由于重写方法是基于父类或接口的方法定义,即便有未使用的方法参数,也是不能删除的。

    反例:

    public int sum(int a, int b, int c) {
        return a + b;
    }
    正例:

    public int sum(int a, int b) {
        return a + b;
    }


    8. 删除表达式的多余括号

    对应表达式中的多余括号,有人认为有助于代码阅读,也有人认为完全没有必要。对于一个熟悉 Java 语法的人来说,表达式中的多余括号反而会让代码显得更繁琐。

    反例:

    return (x);
    return (x + 2);
    int x = (y * 3) + 1;
    int m = (n * 4 + 2);
    正例:

    return x;
    return x + 2;
    int x = y * 3 + 1;
    int m = n * 4 + 2;


    9. 工具类应该屏蔽构造函数

    工具类是一堆静态字段和函数的集合,不应该被实例化。但是,Java 为每个没有明确定义构造函数的类添加了一个隐式公有构造函数。所以,为了避免 java "小白"使用有误,应该显式定义私有构造函数来屏蔽这个隐式公有构造函数。

    反例: 

    public class MathUtils {
        public static final double PI = 3.1415926D;
        public static int sum(int a, int b) {
            return a + b;
        }
    }


    正例: 

    public class MathUtils {
        public static final double PI = 3.1415926D;
        private MathUtils() {}
        public static int sum(int a, int b) {
            return a + b;
        }
    }


    10. 删除多余的异常捕获并抛出

    用 catch 语句捕获异常后,什么也不进行处理,就让异常重新抛出,这跟不捕获异常的效果一样,可以删除这块代码或添加别的处理。

    反例:

    private static String readFile(String fileName) throws IOException {
        try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
            String line;
            StringBuilder builder = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
            return builder.toString();
        } catch (Exception e) {
            throw e;
        }
    }


    正例:

    private static String readFile(String fileName) throws IOException {
        try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
            String line;
            StringBuilder builder = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
            return builder.toString();
        }
    }


    11. 公有静态常量应该通过类访问

    虽然通过类的实例访问公有静态常量是允许的,但是容易让人它误认为每个类的实例都有一个公有静态常量。所以,公有静态常量应该直接通过类访问。

    反例:

    public class User {
        public static final String CONST_NAME = "name";
        ...
    }
     
    User user = new User();
    String nameKey = user.CONST_NAME;


    正例:

    public class User {
        public static final String CONST_NAME = "name";
        ...
    }
     
    String nameKey = User.CONST_NAME;


    12. 不要用NullPointerException判断空

    空指针异常应该用代码规避(比如检测不为空),而不是用捕获异常的方式处理。

    反例:

    public String getUserName(User user) {
        try {
            return user.getName();
        } catch (NullPointerException e) {
            return null;
        }
    }


    正例: 

    public String getUserName(User user) {
        if (Objects.isNull(user)) {
            return null;
        }
        return user.getName();
    }


    13. 使用String.valueOf(value)代替""+value

    当要把其它对象或类型转化为字符串时,使用 String.valueOf(value) 比""+value 的效率更高。

    反例:

    int i = 1;
    String s = "" + i;


    正例:

    int i = 1;
    String s = String.valueOf(i);


    14. 过时代码添加 @Deprecated 注解

    当一段代码过时,但为了兼容又无法直接删除,不希望以后有人再使用它时,可以添加 @Deprecated 注解进行标记。在文档注释中添加 @deprecated 来进行解释,并提供可替代方案

    正例:

    /**
     * 保存
     *
     * @deprecated 此方法效率较低,请使用{@link newSave()}方法替换它
     */
    @Deprecated
    public void save(){
        // do something
    }
     

    三 让代码远离 Bug
     

    1. 禁止使用构造方法 BigDecimal(double)


    BigDecimal(double) 存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。

    反例:

    BigDecimal value = new BigDecimal(0.1D); // 0.100000000000000005551115...


    正例:

    BigDecimal value = BigDecimal.valueOf(0.1D);; // 0.1


    2. 返回空数组和空集合而不是 null

    返回 null ,需要调用方强制检测 null ,否则就会抛出空指针异常。返回空数组或空集合,有效地避免了调用方因为未检测 null 而抛出空指针异常,还可以删除调用方检测 null 的语句使代码更简洁。

    反例:

    public static Result[] getResults() {
        return null;
    }
     
    public static List getResultList() {
        return null;
    }
     
    public static Map getResultMap() {
        return null;
    }
     
    public static void main(String[] args) {
        Result[] results = getResults();
        if (results != null) {
            for (Result result : results) {
                ...
            }
        }
     
        List resultList = getResultList();
        if (resultList != null) {
            for (Result result : resultList) {
                ...
            }
        }
     
        Map resultMap = getResultMap();
        if (resultMap != null) {
            for (Map.Entry resultEntry : resultMap) {
                ...
            }
        }
    }


    正例: 

    public static Result[] getResults() {
        return new Result[0];
    }
     
    public static List getResultList() {
        return Collections.emptyList();
    }
     
    public static Map getResultMap() {
        return Collections.emptyMap();
    }
     
    public static void main(String[] args) {
        Result[] results = getResults();
        for (Result result : results) {
            ...
        }
     
        List resultList = getResultList();
        for (Result result : resultList) {
            ...
        }
     
        Map resultMap = getResultMap();
        for (Map.Entry resultEntry : resultMap) {
            ...
        }
    }
    


    3. 优先使用常量或确定值来调用 equals 方法

    对象的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals 方法。当然,使用 java.util.Objects.equals() 方法是最佳实践。

    反例:

    public void isFinished(OrderStatus status) {
        return status.equals(OrderStatus.FINISHED); // 可能抛空指针异常
    }
    正例:

    public void isFinished(OrderStatus status) {
        return OrderStatus.FINISHED.equals(status);
    }
     
    public void isFinished(OrderStatus status) {
        return Objects.equals(status, OrderStatus.FINISHED);
    }


    4. 枚举的属性字段必须是私有不可变

    枚举通常被当做常量使用,如果枚举中存在公共属性字段或设置字段方法,那么这些枚举常量的属性很容易被修改。理想情况下,枚举中的属性字段是私有的,并在私有构造函数中赋值,没有对应的 Setter 方法,最好加上 final 修饰符。

    反例:

    public enum UserStatus {
        DISABLED(0, "禁用"),
        ENABLED(1, "启用");
     
        public int value;
        private String description;
     
        private UserStatus(int value, String description) {
            this.value = value;
            this.description = description;
        }
     
        public String getDescription() {
            return description;
        }
     
        public void setDescription(String description) {
            this.description = description;
        }
    }

     
    正例:

    public enum UserStatus {
        DISABLED(0, "禁用"),
        ENABLED(1, "启用");
     
        private final int value;
        private final String description;
     
        private UserStatus(int value, String description) {
            this.value = value;
            this.description = description;
        }
     
        public int getValue() {
            return value;
        }
     
        public String getDescription() {
            return description;
        }
    }


    5. 小心String.split(String regex)

    字符串 String 的 split 方法,传入的分隔字符串是正则表达式!部分关键字(比如.[]()\| 等)需要转义

    反例:

    "a.ab.abc".split("."); // 结果为[]
    "a|ab|abc".split("|"); // 结果为["a", "|", "a", "b", "|", "a", "b", "c"]


    正例: 

    "a.ab.abc".split("\\."); // 结果为["a", "ab", "abc"]
    "a|ab|abc".split("\\|"); // 结果为["a", "ab", "abc"]


    这篇文章,可以说是从事 Java 开发的经验总结,分享出来以供大家参考。希望能帮大家避免踩坑,让代码更加高效优雅。

    作者简介:王超,花名麟超,阿里巴巴高级地图技术工程师,一直从事Java研发相关工作。Github id: starcwang

    声明:本文系作者投稿,版权归作者所有。
    ————————————————
    版权声明:本文为CSDN博主「CSDN资讯」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/csdnnews/article/details/100987866

    阅读全文>>

作者:miki艾比利分类:【javaEE浏览(1506评论(0

2019-10-10 14:22:56

如何向谷歌提交站点地图

    Sitemap在线生成器,网站地图在线生成工具

    最近在网站上找了几个在线生成网站地图的软件都试了下,都是英文的,好在都是些简单的英文,阅读还不成问题,基本上都能看懂,实用性也各有不同。下面Google优化研究中心就对以下三个在线生成Sitemaps网站的试用分享:

    1. Sitemapspal  http://www.sitemapspal.com/

    界面简洁实用,输入要生成的网站网址后,只需要做一些简单的参数调整,就可以生成.生成的速度比较快,而且生成的Sitemaps的XML文件提供复制与下载。缺点是只支持一级链级深度,就是说生成的文件里的URL只有首页上包含的站内链结。如果你的网站的一些链结没在首页上,生成的Sitemaps就不会有这些链结的URL。一级链结深度也就算了,它连这一级的链结也不能完完整整的生成出来,反正我生成的Sitemaps里就有好多明明在首页上有链结的URL没有包含在里面。

    2. XML-Sitemaps Generator  http://www.xml-sitemaps.com/

    同样输入网站的网址后再做一些参数调整,按下Sart就可以生成了,生成完成后,提供以下四个文件下载:sitemaps.xml,sitemaps.xml.gz,sitemaps.html,urllist.txt。不用解释了吧,下载下来就知道是干什么用的了。
    缺点:生成速度慢了点,虽然没有链结深度的限制,但是有链结数目的限制,500个它会一页一页的读取,不管有几级链结,但是最多只会生成包含500个URL的Sitemaps。如果不想受到任何限制,那就支付几美元的费用。

    3. Free Sitemap Generator  http://www.freesitemapgenerator.com/

    需要用邮箱注册并验证激活,激活后可以自行添加要生成Sitemaps的网站,不限制链结深度,不限制链结数量,但是速度巨慢,可能是因为每一页都要去读取的原因。按下MAKE SITEMAPS之后就可以不用管了,即使你不在线也不会有任何关系,因为它会在服务器上为你慢慢地慢慢地生成的,你完全没必要盯着它的进度数一点点地上升。生成完成后它会往你的邮箱发邮件通知你,如果你的站很大,一般要N个小时后才会收到,请特别注意,这里的N个小时中的N很有可能会是两位数,不别说我没提醒你。如果想高速生成就必需满足它的一点小要求——在你的每一个页面上加上一段链结代码。

    Sitemap文件生成好了之后就可以登录Google网站管理员工具提交了,

    这里我使用的是第二个网站生成siteMap,直接输入网址会生成一个xml文件,将它下载下来放入网站的根目录下。

    将siteMap.xml放入网站根目录下,然后直接在谷歌网站管理工具平台,输入站点地图的网址

    如上图所示。大功告成

    阅读全文>>

作者:miki艾比利分类:【SEO浏览(1511评论(0

2019-10-10 09:59:36

Windows下Nginx+Tomcat整合的安装与配置

    【转载】Windows下Nginx+Tomcat整合的安装与配置

    原帖:http://zyjustin9.iteye.com/blog/2017394

    相信很多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额。那究竟它有什么作用呢?可能很多人未必了解。

    说到反向代理,可能很多人都听说,但具体什么是反向代理,很多人估计就不清楚了。摘一段百度百科上的描述:

    Html代码
    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
    这里讲得很直白。反向代理方式实际上就是一台负责转发的代理 服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的数据。这样说,其实nginx 完成的就是这样的工作。我们让nginx监听一个端口,譬如80端口,但实际上我们转发给在8080端口的tomcat,由它来处理真正的请求,当请求完 成后,tomcat返回,但数据此时没直接返回,而是直接给nginx,由nginx进行返回,这里,我们会以为是nginx进行了处理,但实际上进行处 理的是tomcat。

    说到上面的方式,也许很多人又会想起来,这样可以把静态文件交由nginx来进行处理。对,很多用到nginx的地方都是作为静态伺服器,这样可以方便缓存那些静态文件,比如CSS,js,html,htm等文件。

    1)官网地址:http://nginx.org/en/download.html可以到这里去下。

    这里,由于我的是windows,当然下windows版啦。下完后首先要启动吧。进入到nginx文件夹,直接start nginx就OK了。

    比如我下载后放在D:\software \developerTools\server\nginx-1.1.7,直接cmd后cd D:\software\developerTools \server\nginx-1.1.7,有些不习惯命令行的可能会奇怪,它没有进行到那个文件夹。windows并不会在分区间跳转,除非你自己指定 了。所以我们要直接d:如下:

    然后,我们直接start nginx,这里也许你会看到一个窗口一闪而过,根据我们使用tomcat的经验,如果一闪而过,证明有错误了,是吧?但实际上不是。

    此时我们打开任务管理器,可以看到两个nginx.exe在那里好好的。这说明我们已经启动了,至于为什么两个,我们这里不深究。

    现在,我们已经启动了nginx,来看看启动后的nginx是怎样的。直接访问http://localhost可以看到:

    我们可以看到nginx启动成功,现在访问是直接进到nginx的目录里面了。
    

    那么这些实际上是在哪里配置的。这就涉及到nginx的一个重要配置文件nginx.conf了。

    2)我们可以看到nginx文件夹内有一个conf文件夹,其中有好几个文件,其他先不管,我们打开nginx.conf,可以看到一段:

    这段代码在server里面,相当于一个代理服务器,当然可以配置多个。

    下面我们仔细来分析一下:

    listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。

    server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。

    location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里

    root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。

    index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。

    下面的error_page是代表错误的页面,这里我们暂时不用,先不管它。

    那我们知道了具体的配置了,怎么让它访问localhost时转到tomcat时。实际上就修改两个地方:

    Java代码

    server_name localhost:8080;  
      
    location / {  
        proxy_pass http://localhost:8080;  
    }  
    

    我们就修改了上面两个地方,我的tomcat在8080端口,可以根据自己的需要修改。这里有一个新元素proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。

    此时我们修改了文件,是不是就意思着必须先关了nginx再重新启动了,其实不必,nginx可以重新加载文件的。

    我们直接运行:

    Html代码

    nginx -s reload  
    

    如果不想直接加载,而只是想看看自己的配置文件有没有问题,可以直接输入:

    Xml代码

    nginx -t  
    

    这可以检查配置文件中是否有错。 下面我们所有的修改都假设我们修改完成后运行了nginx -s reload
    进行重新加载配置文件,请注意。

    一切没问题了,然后我们再重新打开http://localhost,我们看到下面的页面:

    这时,我们发现它并不是刚才的welcome页面了,而是tomcat的管理页面了,不管我们点击什么链接都是没问题的,相当于直接访问http://localhost:8080一样。

    3)上面我们直接试了一个小例子,让nginx进行转发,即所 谓的反向代理。但实际上我们的需求不会是这样的,我们需要分文件类型来进行过滤,比如jsp直接给tomcat处理,因为nginx并不是servlet 容器,没办法处理JSP,而html,js,css这些不需要处理的,直接给nginx进行缓存。

    下面我们来进行一下配置,让JSP页面直接给tomcat,而html,png等一些图片和JS等直接给nginx进行缓存。

    这时最主要用的还是location这个元素,并且涉及到一部分正则,但不难:

    Xml代码

    location ~ \.jsp$ {  
            proxy_pass http://localhost:8080;  
    }  
    
    location ~ \.(html|js|css|png|gif)$ {  
        root D:/software/developerTools/server/apache-tomcat-7.0.8/webapps/ROOT;  
    }  
    

    我们先要去掉之前配的location /,避免全部请求被拦截了。

    然后我们再来看看http://localhost

    当我们不指定jsp页面的时候,它会出现找不到,因为,此时并没有相应的location匹配,所以就会有404错误,这时就跳到了nginx自定义的error页面去了。

    而当我们用http://localhost/index.jsp去访问时,我们看到了熟悉的页面:

    而且图片那些都显示正常,因为图片是png的,所以直接在tomcat/webapps/ROOT目录下直接查找,当然,如果我们点击Manager Application HOW-TO这个链接,我们发现:

    它还是找不到,为什么呢?因为这是个html页面,但它并不在ROOT目录下,而是在docs目录下,但当我们匹配html时,我们却到ROOT目录下去找,所以还是找不到这个页面。

    一般情况下,如果我们需要用nginx来进行静态文件伺服,一般都会把所有静态文件,html,htm,js,css等都放在同一个文件夹下,这样就不会有tomcat这样的情况了,因为tomcat下的是属于不同的项目,这个我们就没办法了。

    3)有些人会说,这些都只会找一台服务器,但如果我们想在一台服务器挂了的时候,自动去找另外一台,这怎么办?这实际上nginx都考虑到了。

    这时,我们之前用的proxy_pass就有大用途了。

    我们把之前的第一个例子,即全部都代理的修改一下:

    最后修改如下:

    Xml代码  
    upstream local_tomcat {  
        server localhost:8080;  
    }  
      
    server{  
            location / {  
               proxy_pass http://local_tomcat;  
            }  
            #......其他省略  
    }
    

    我们在server外添加了一个upstream,而直接在proxy_pass里面直接用http://+upstream的名称来使用。

    我们还是直接来http://localhost,还是和第一个一样的效果,所有链接都没问题,说明我们配置正确。

    upstream中的server元素必须要注意,不能加http://,但proxy_pass中必须加。

    我们刚才说可以在一个服务器挂了的情况下连到另外一个,那怎么弄呢?

    其实很简单,在upstream中的local_tomcat中配置多一个server。比如我现在弄多一个jetty,端口在9999,所以我们配置如下:

    Xml代码

    upstream local_tomcat {  
        server localhost:8080;  
        server localhost:9999;  
    }  
    

    此时,我们关闭tomcat,而只开jetty。我们来运行http://localhost看看效果:

    我们看到它请求到了jetty的页面,但由于jetty的机制,这时没有显示jetty主页,这个我们先不管。但我们的在一个服务器挂的情况下自动使用另外一个的功能实现了。

    但有时我们就不想它挂的时候访问另外一个,而只是希望一个服务器访问的机会比另外一个大,这个可以在server最后加上一个weight=数字来指定,数字越大,表明请求到的机会越大。

    Xml代码

    upstream local_tomcat {  
        server localhost:8080 weight=1;  
        server localhost:9999 weight=5;  
    }  
    

    这时我们给了jetty一个更高的权值,让它更有机会访问到,实际上当我们刷新http://localhost访问的时候发现jetty访问机率大很多,tomcat几乎没机会访问,一般情况下,如果我们必须这样用,不要相关太大,以免一个服务器负载太大。

    当然,server还有一些其他的元素,比如down表示暂时不用到该服务器等等。这些可以参考nginx的wiki。也许写了一大堆,有人会有问题,那nginx怎么关闭呢?这倒是个问题,其实直接运行nginx -s stop就可以关闭了。

    基本上nginx的用法是这样,深入的以后我们如果用到再学习。

     

    阅读全文>>

作者:miki分类:【javaEE浏览(937评论(4

2019-10-09 12:52:29

博客新增自定义文章分类功能啦

    为了更灵活的使用博客,特地建立了用户自定义分类功能

    避免了以往的文章堆积在一块,不便于用户挖掘其他的文章,或者在底部的旧的文章,造成资源的浪费。自定义tab的方法,可以简单快捷的创建分类项目,后期会增加文章的搜索功能,敬请关注哦

    阅读全文>>

作者:miki艾比利分类:【编程浏览(327评论(0

2019-10-09 11:40:48

【实战分享】不用软件实现百度贴吧无限顶贴技巧

    今天给大家分享一个超级牛逼的神技能,无需任何软件,实现全自动贴吧回帖,是引流推广的牛逼神器,具体操作步骤如下。

           今天给大家分享一个超级牛逼的神技能,无需任何软件,实现全自动贴吧回帖,是引流推广的牛逼神器,具体操作步骤如下。

    一、登陆百度贴吧账号

           进入贴吧后,选择我们要回复的帖子,或者发布一篇帖子,进入该贴内容页,如下图所示。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

    二、查看网页源代码

           按F2或者点击右键-查看审查元素,如下图所示。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

           然后,点击“审查元素”,进入网页代码页面,点击“Console”,如下图所示。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

           点击“Console”之后,就会进入上图所示的页面,该页面内容是可以编辑的。

    三、粘贴代码回车

           进入前面说的页面后,就需要使用到该技术最为关键的“代码”了,将代码复制到编辑框的最底部,单击回车,如图所示。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

           单击回车之后,会出现下图所示对话框,根据提示一步步设置即可,第一步是确定回复内容,如下图所示。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

           第二步,是确定回复的楼层,可以选择回复楼层,也可以选择回复原贴,如下图。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

           第三步,是确定回复的次数,最高可以自动回复10000次,具体数量自己定。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

           第四步,是确定间隔多少秒回复一次,建议时间不宜设置过短。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

           第五步,是确认以上所有信息,如无误点击确定开始发帖。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

           设置好之后,就可以将网页最小化,然后系统会自动发帖回复,演示效果如下图所示。

    【实战分享】不用软件实现百度贴吧无限顶贴技巧-阿泽SEO自学网

           以上是所有的思路和步骤,该技术比任何软件操作都便利成本也更低,不需要多账号,也不需要下载软件,一个账号可以完成所有步骤,24小时不限制顶贴回帖。

    操作代码如下,请自行保存,代码:

    javascript:function reply(a,b){var c={ie:"utf-8",kw:PageData.forum.forum_name,fid:PageData.forum.forum_id,tid:PageData.thread.thread_id,quote_id:b,tbs:PageData.tbs,content:a,};return $.post("http://tieba.baidu.com/f/commit/post/add",c),console.log("已回复"+timer+"次"),++timer,timer>config.times?(clearInterval(run),alert("代码执行完毕,即将刷新"),setTimeout("location.reload()",1e3),0):void 0}var run,config={content:prompt("请输入回帖内容","CPA学习网的大Q师傅很牛掰,都是满满的干货!!!")||"",pid:prompt("请输入要回复的楼层号(普通回复直接确定)",""),times:prompt("请输入回复次数","10000")||1,standby:prompt("请输入间隔时间(不可填0),单位:秒","2")||6},timer=1,cmfcfg='回帖内容:"'+config.content+'"\n';cmfcfg+="--"==config.pid?"回复楼层:普通回复\n":"回复楼层:"+config.pid+"\n",cmfcfg+="回复次数:"+config.times+"\n"+"时间间隔:"+config.standby+"s\n"+"确认参数正确开始回复?",1==confirm("请核对参数后确认执行\n"+cmfcfg)?1==config.times?(reply(config.content,config.pid),setTimeout("location.reload()",1e3)):(reply(config.content,config.pid),run=setInterval("reply(config.content,config.pid);",1e3*config.standby)):(alert("代码未执行,将重新刷新。"),location.reload());

           不得不说,技术的魅力。该项技术目前知道的人几乎没有,如果用作营销其技术价值大于10000+,如果用于二次开发或者“信息差”转售价值更不会低。

           大Q认为算是干货吧,本不想分享出来,但新年到了总觉得该送些礼物,方觉新安。这仅仅是思路,其实可以再一次甚至多次放大的,具体操作就需要大家自行探索了。

           除了贴吧无软件全自动回帖技术外,大Q昨天还发现了把自己网址转化为百度百科网址的方法,如果把这两项技术结合起来,其营销价值如果经过某些营销客的包装,出售几千上万,无可非议。

           把自己网址转化为百科网址的技术,如果有需要的可以在关注本公众号后回复“百度百科”获取方法,也可以等大Q在适当的时机分享出来。

           微信公众号:cpaxuexi(CPA学习网)

    阅读全文>>

作者:miki分类:【日记浏览(1575评论(3

2019-10-09 11:36:35