月度归档:2015年09月

asd

undefined与null的区别(前端面试经典问题)

大多数计算机语言,有且仅有一个表示”无”的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil。

有点奇怪的是,JavaScript语言居然有两个表示”无”的值:undefined和null。这是为什么?

undefined vs. null

一、相似性

在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别。


var a = undefined;

var a = null;

上面代码中,a变量分别被赋值为undefined和null,这两种写法几乎等价。

undefined和null在if语句中,都会被自动转为false,相等运算符甚至直接报告两者相等。


if (!undefined) 
    console.log('undefined is false');
// undefined is false

if (!null) 
    console.log('null is false');
// null is false

undefined == null
// true

上面代码说明,两者的行为是何等相似!

既然undefined和null的含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加JavaScript的复杂度,令初学者困扰吗?Google公司开发的JavaScript语言的替代品Dart语言,就明确规定只有null,没有undefined!

二、历史原因

最近,我在读新书《Speaking JavaScript》时,意外发现了这个问题的答案!

原来,这与JavaScript的历史有关。1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示”无”的值。

根据C语言的传统,null被设计成可以自动转为0。


Number(null)
// 0

5 + null
// 5

但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。

首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示”无”的值最好不是对象。

其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。

因此,Brendan Eich又设计了一个undefined。

三、最初设计

JavaScript的最初版本是这样区分的:null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。


Number(undefined)
// NaN

5 + undefined
// NaN

四、目前的用法

但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只有一些细微的差别。

null表示”没有对象”,即该处不应该有值。典型用法是:

(1) 作为函数的参数,表示该函数的参数不是对象。

(2) 作为对象原型链的终点。


Object.getPrototypeOf(Object.prototype)
// null

undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:

(1)变量被声明了,但没有赋值时,就等于undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。

(3)对象没有赋值的属性,该属性的值为undefined。

(4)函数没有返回值时,默认返回undefined。


var i;
i // undefined

function f(x){console.log(x)}
f() // undefined

var  o = new Object();
o.p // undefined

var x = f();
x // undefined

(完)

asd

jquery判断checkbox是否选中及改变checkbox状态

jquery判断checked的三种方法:

.attr(‘checked’):   //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或false
.prop(‘checked’): //16+:true/false
.is(‘:checked’):    //所有版本:true/false//别忘记冒号哦

jquery赋值checked的几种写法:

所有的jquery版本都可以这样赋值:

// $(“#cb1″).attr(“checked”,”checked”);
// $(“#cb1″).attr(“checked”,true);

jquery1.6+:prop的4种赋值:

// $(“#cb1″).prop(“checked”,true);//很简单就不说了哦
// $(“#cb1″).prop({checked:true}); //map键值对
// $(“#cb1″).prop(“checked”,function(){
return true;//函数返回true或false
});

//记得还有这种哦:$(“#cb1″).prop(“checked”,”checked”);

asd

杀死你网站SEO的5个技术

几天前,胡亮亮先生(网迈SEO总监)在其微信公众帐号里发布了文章《杀死你网站SEO的5个技术》,当时感觉内容挺好可是个别地方写得不够清晰完善,于是小编主动联系作者进行了沟通,胡亮亮收到反馈后很快整理出完整版,学院终于可以发出来给大家分享一下了:

应百度站长平台邀请,抽空把这篇文章做一些细节上的补充 ,欢迎大家关注并讨论。由于现阶段,触屏技术以及移动互联网的发展,SEO也面临着各种各样的算法变革,技术变革或者更进一步,营销方法上的变革,那么这些变革,对于一些技术上的细节事项,往往可能无法兼顾,接下来带大家一起看看,目前主流的一些技术上的误区给网站SEO带来的不利影响。

1、你还没有移动站点(No Mobile website),或者说你的移动站点只是做了简单的转码和浏览器适配,那么你的移动搜索结果将会非常糟糕。这在百度体现的犹为突出,听说百度内部有一个测试移动站点得分的在线工具,如果你的网站是H5的移动站点并且进行适配,可能会得到比较高的分,但是据观察得知,H5的移动站点,依然没有H4的移动站点排名好,流量高,相信后续会有改观(纯属我个人SEO项目经验,有不同观点欢迎探讨)。

2、无限滚动(Infinite -Endless Scroll),你的网站为了适应手机或者平板浏览,用了一个看似很酷但是非常糟糕的技术——无限滚动。这里要说明下,搜索引擎既不会学人滚动鼠标,也不会无限制的去读取你所谓的触发代码,说白了,无限滚动让你的网站几乎失去了99%的内容。
这里解释下,无限滚动——它是一种网页交互技术,特别是微博,社交等网站经常使用的一种交互,而且特别适用于触摸屏,鼓励用户一直往下拉,一直看,看到用户不想看为止!这样的话,就摒弃了原来分页的浏览方式,让用户不用再点击鼠标,看上去很完美,其实这种技术SEO弊端有3个
1 )这种交互,是针对人的行为,目前主流的搜索引擎并没有官方说明支持这样的无限滚动抓取技术。
2)不分页的方式,导致页面数量减少,可能会影响到你的收录和排名。
3)这种交互,势必会让你的服务器压力更大,加载更慢,而且搜索引擎也不能保证它在这个页面上会停留足够多,足够长的时间。
当然,这种交互还是有很多优点的,比如更多的浏览内容,停留时长以及专门为触屏定制等。
杀死你网站SEO的5个技术

3、延时加载(Lazy Loading),这个技术很多网站都会用(jQuery貌似是主流),技术美其名曰提高网站速度,提升用户体验,其实,在网速如电,互联网爆炸时代的现在,再抱怨服务器不够用,网速慢真的是一件很令人羞耻的事情,延时加载导致搜索引擎无法像人一样去移动鼠标,搜索引擎只会选择看你第一页的内容,剩下的依然是一片空白,除非你的网站不要考虑SEO,否则还是老老实实的丢掉这个看起来很酷听起来也很牛掰的技术吧——其实它真的要淘汰了,4G都来了,还要担心网速?

比如
<img src=”loader.gif” data-src=”img1.jpg” />
这段代码,并不能有效抓取延时加载的内容和图片,所以不建议采用这种方式,当然,也有技术表示,可以采用<noscript>标签来展现内容而不要用javascript. 目前还没经过测试,所以是否有用还有待验证。

当然,也有童鞋会想到,用sitemap提交图片内容,是否能保证图片被收录呢 ?这里可以肯定给你一个NO的答案,案例如下:
杀死你网站SEO的5个技术

经过测试发现,2年后这些提交的图片一个都没有被收录(国外友人的友情测试)

当然,也有来自谷歌的说明称,可以解决这个问题,跟解决AJAX是一样的原理,大家可以看看谷歌开发者帮助,https://developers.google.com/webmasters/ajax-crawling/

还有没有更好的办法?当然是有的,比如
<a href=’http://www.idea-r.it/…?blogimage=<image-number>’
onclick=’…show(<image-number>);return false;’>
这段代码意味着,如果是搜索引擎看到的话,会直接读取 href里面的URL,如果是用户,则会看到图片内容,一举两得。

4、视差(Parallax,也可以称为利用图片的前景和背景的差别来造成一种很酷炫的景象,这种技术,我只想说一句话:你们活在自己YY的世界里,在幻想用户也跟你一起YY,而用户只想要解决他的需求而已,不是来跟你一起YY的。以上这个技术,大多使用在一些品牌网站,先看几个图来看看到底长什么样子:
杀死你网站SEO的5个技术

没错,就是偏向酷酷的感觉,把很多个页面,都归纳为一个页面,我们都知道SEO的世界里,更多的页面,意味着更多的关键词和排名,以及更多的流量,这基本上是正相关关系。用图来说话,更形象一些:
杀死你网站SEO的5个技术
这就是很形象的跟大家解释了视差所带来的直接影响。当然,很多人可能会说用不同的H标签来区分不同的页面,但是我想说这绝对不是一个非常好的解决方案,可以说你的SEO肯定做不过其他人。

5、汉堡式菜单(Hamburger Menus),我们经常看到手机上或者平板上有这种汉堡式菜单,手指点上去,就看到了导航栏里的链接,然后你再点开就能看到内容了,但是如果这种技术被用到了PC上,将是一种灾难,如果你有重要内容但是不在第一时间展示给用户看,而是需要用户点下鼠标才能看到,那么诺大的PC屏幕你打算用来做什么 ? 以下就是我们常在移动端见到的菜单了,看看大家有没有很熟悉?
杀死你网站SEO的5个技术

在移动端虽然好,并不代表这个汉堡式菜单要照搬到PC端来,用户在PC上更喜欢直接精准的找到他想要的导航和内容,而不是给他看汉堡菜单。

以上就是总结的5个技术上对SEO影响较大的技术误区,其实在搜索引擎技术还没有完全能够实现更加智能的情况下,冒险采用以上这些技术是挺有风险的,如果您的网站特别需要SEO流量,那么不建议采用以上这些技术,希望大家能够运用好技术,做好SEO,也希望百度能够在技术上多做创新,多多支持SEO的发展。

asd

微信快速增加好友的十大方法

移动互联网大势所趋,很多网商朋友们开始转战微信,如何快速增加微信好友数目?是摆在我们面前的一个现实问题,本人也刚开始玩,谈点个人心得,和大家探讨,希望能够抛砖引玉:

 

一丶将微信号和手机号丶QQ号关联。这样可以从手机通讯录,QQ通讯录中导入一部分,这部分很简单,不多说。

二丶建群丶建立自己的班级群,校友群,行业群,老乡群,同事群(如果没有现成的话),建群之后,可以添加群里的人为好友,这些主要是熟人,也是真正的朋友圈。
三丶关注一些大号,看看他们的操作方式。很多大号会每天推荐一些人,或者建立一些专业群邀请大家进入。已经有人整理了一些微信大号,比较全面,公开场合我就不转发了,如果你搜索不到,可以找我,我发给你。
四丶加群:同学,老乡人数有限,行业群,兴趣群应该是最有拓展空间的。当你的好友数有一定基数,而且平时在和朋友圈的互动有一定价值的时候,会有人把你拉进一些行业群,或者你自建一些行业群也可以。进群之后先要发言,和大家混个脸熟,然后添加群里群友。为提高效率,可以用微信网页版在电脑里添加。方法:在百度里搜索“微信网页版”,用微信扫描一下,找到群进入,一个一个的添加,很多人都要验证的,你需要给人家一个理由,如“电商交流”“微商交流”,“我是某某群里的”,否则,人家无缘无故的不见得会添加你,一般一个群里30-50%的人添加你问题是不大的。
五丶群互换:加群应该是最快的方法了,我有5个群,你有3个群,我们互换一下,就都有8个群了,和一二十个人的互换的话,你的群就可能超过百个,我前几天看到一个做群互换的,声称手里有700多个群。
六丶手工收集微信号添加:微信大号几乎每天都会推荐一些人,你可以将被推荐的人的号记下来,查找加入,不过微信目前有限制,好像每天只能查找20个号,20个号能加你的每天就算10个,一个月下来就有300个了,一年下来就有3000个了,这个方法虽然笨一些,但只要坚持下去还是很管用的,微信好友有个2万,基本上也可以算是个大号了。补充一下,为方便查看信息,你可以将一些微信大号标为星标用户,星标用户排在前面,好查看。
七丶找大号推荐:微信大号一般都乐于推荐,如果你有“卖点”的话,编辑一段文字,发给大号,请他们帮推荐一下,一天几十上百个好友问题不大。
八丶写文章:在一些专业论坛写文章,介绍自己对行业的理解丶看法,或者分享自己实操的一些案例,会有很多人加你的微信号,有个做女性产品营销的,一篇原创文章一天引来了1500个微信好友,目前很火的做鸭的柴公子,主要也是这个手段。
九丶微博导入:如果你的微博已经有了一定的粉丝数,你可以从那里面导入,不过这个是要有条件的。
十丶或者你是做网店的,每天都有一定的用户,你也可以从那里导入,在客服服务卡上加上自己的微信号,吸引用户添加。
另外,还有几点要注意:
1. 取个简单的微信号,不要搞得太复杂,要考虑大家的输入的方便性。不要搞得又是字母丶数字又是下划线之类的,别人在查找添加的时候还要不停的切换,可能有的人就放弃添加你了。注意微信号的修改只能改一次,要慎重,想好了再改。
2. 上述所说的加人手段只是启动手段,用以获得初始的用户基数,最重要的是能提供价值,不能给你的好友提供有价值的信息,你的号加再多好友也没有用,不会有人认可你。多分享自己的工作体验丶实操案例,这方面如果操作得好的话,后期根本不用考虑主动加人了,你的微信号自然有人去分享去传播,你做好内容就可以了。
3. 互动,微信朋友圈,有互动才有意思,否则你发你的,我发我的,没有交集,加了也是白加,为增加互动效率,可以用网页版,回复私信丶群信息会快些,可惜网页版用不了朋友圈,要是以后有这功能就好了。
4. 千万不要刷屏,尤其不要着急卖货。有很多人一天发10多条卖货信息,这种人基本都会被删掉或者拉黑。不管发什么信息,无论你是原创还是分享的,一天最好不要超过3-6条,否则对于朋友圈只有几十几百人的,你一下就占据他的屏幕了,会引起反感。3-6条信息最好也间隔了发,不要一股脑的全发出去。
5. 对多数人来说,还不可能把微信当做主业,玩个微信还很难养活你或者你的公司。微信信息最好在下班后找个时间集中处理,不要一天到晚将时间耗在微信上,不要耽误了本职工作以及和家人相处的时间。

asd

不设高度,使两个并排div等高,纯css解决

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN” “http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gbk” />
<title>div等高处理</title>
<style type=”text/css”>
/*统一设置body属性*/
body{
padding: 0;
margin: 0;
font-size: 12px;
font-family: Arial, Helvetica, sans-serif;
line-height: 140%;
text-align: center;
background:#E7DFD3;
}
#wrap{
width: 750px;
margin: 0 auto;
overflow: hidden;   /*用overflow: hidden 到容器里的元素*/
}
#header{
background: #E8E8E8;
}
#sideleft{ /*设置左边通栏*/
width: 580px;
float: left;
background: #FFF;
text-align: left;
}
#sideright{ /*设置左边通栏*/
width: 170px;
float: left;
background: #F0F0F0;
text-align: left;
}
/*解决内层浮动后外面丢失高度的BUG*/
#wrap:after{
content: ‘[DO NOT LEAVE IT IS NOT REAL]‘;
display: block;
height: 0;
clear: both;
visibility: hidden;
}
#wrap{
display: inline-block;
}
/*\*/
#wrap{
display: block;
}
/* end easy clearing */
/*\*/
#sideleft, #sideright{
padding-bottom: 32767px !important;  /*应用 padding-bottom(足够大的值)到列的块元素*/
margin-bottom: -32767px !important;  /*应用 margin-bottom(足够大的值)到列的块元素*/
}
@media all and (min-width: 0px){
#sideleft, #sideright{
padding-bottom: 0 !important;
margin-bottom: 0 !important;
}
#sideleft:before, #sideright:before{
content: ‘[DO NOT LEAVE IT IS NOT REAL]‘;
display: block;
background: inherit;
padding-top: 32767px !important;
margin-bottom: -32767px !important;
height: 0;
}
}
/**/
#footer{
background: #E8E8E8;
width: 100%;
float: left;
}
h1,h2,p{
margin: 0;
padding: .8em;
}
h1,h2{font-size: 20px;}
</style>
</head>
<body>
<div id=”wrap”>
<div id=”header”>
<h1>Header</h1>
</div>
<div id=”sideleft”>
<h2>sideleft</h2>
<p> 要从固定的、基于像素的设计方法转到弹性的、相对的设计方法并不容易。但是如果恰当利用,就可以成为增强亲和力和易用性的一个自然选择,同时又无须做出设计上的牺牲。 </p>
<p> 像素是计算机屏幕上的不可缩放的点,而一个
h3 就是一个字大小的方块。由于字体大小的变化, h3
代表用户喜欢的文字大小的相对单位。 </p>
<p> 采用印刷式的固定设计方案或许要容易些,因为如果尺寸不变,则考虑的东西就相对较少。可是如果采用弹性的设计方法,就可以充分利用电脑的显示器和浏览器。 </p>
<p> 也许你想你的网站以某种特定的方式显示,但是你的用户想看到的可能不一样。任何强加于用户的东西都不利于易用性,从而对网站的成功造成损害。 </p>
<p> 要从固定的、基于像素的设计方法转到弹性的、相对的设计方法并不容易。但是如果恰当利用,就可以成为增强亲和力和易用性的一个自然选择,同时又无须做出设计上的牺牲。 </p>
<p> 像素是计算机屏幕上的不可缩放的点,而一个
h3 就是一个字大小的方块。由于字体大小的变化, h3
代表用户喜欢的文字大小的相对单位。 </p>
<p> 采用印刷式的固定设计方案或许要容易些,因为如果尺寸不变,则考虑的东西就相对较少。可是如果采用弹性的设计方法,就可以充分利用电脑的显示器和浏览器。 </p>
<p> 也许你想你的网站以某种特定的方式显示,但是你的用户想看到的可能不一样。任何强加于用户的东西都不利于易用性,从而对网站的成功造成损害。 </p>
</div>
<div id=”sideright”>
<h2>sideright</h2>
<p> 要从固定的、基于像素的设计方法转到弹性的、相对的设计方法并不容易。但是如果恰当利用,就可以成为增强亲和力和易用性的一个自然选择,同时又无须做出设计上的牺牲。 </p>
<p> 像素是计算机屏幕上的不可缩放的点,而一个
h3 就是一个字大小的方块。由于字体大小的变化, h3
代表用户喜欢的文字大小的相对单位。 </p>
<p> 采用印刷式的固定设计方案或许要容易些,因为如果尺寸不变,则考虑的东西就相对较少。可是如果采用弹性的设计方法,就可以充分利用电脑的显示器和浏览器。 </p>
<p> 也许你想你的网站以某种特定的方式显示,但是你的用户想看到的可能不一样。任何强加于用户的东西都不利于易用性,从而对网站的成功造成损害。 </p>
</div>
<div id=”footer”>
<h1>Footer</h1>
</div>
</div>
</body>
</html>

4b51be6f-2940-3116-b502-316b8a75cd12.jpg

IntelliJ IDEA 14 注册码

IntelliJ IDEA 14 下载地址:

IntelliJ IDEA 14 下载

分享几个license:

(1)

key:IDEA

value:61156-YRN2M-5MNCN-NZ8D2-7B4EW-U12L4

 

(2)

key:huangwei
value:97493-G3A41-0SO24-W57LI-Y2UGI-JGTU2

 

(3)

key:hkl520
value:34423-VZYXD-FQXZ7-O6I7U-J3ZK8-R7V62

 

(4)

key:Intelligent
value:40957-EG6O9-2915L-CF1RP-57IQJ-Y6VZ3

 

(5)

key:tommy
value:49164-YPNVL-OXUZL-XIWM4-Z9OHC-LF053

 

(6)

key:whuanghk
value:98220-IN97R-TV1ID-2JAPO-OXZEO-LAM70

 

(7)

key:itey
value:91758-T1CLA-C64F3-T7X5R-A7YDO-CRSN1


以下是破解代码:

 

Java代码  收藏代码
  1. import java.math.BigInteger;
  2. import java.util.Date;
  3. import java.util.Random;
  4. import java.util.zip.CRC32;
  5. public class keygen
  6. {
  7.   /**
  8.   * @param s
  9.   * @param i
  10.   * @param bytes
  11.   * @return
  12.   */
  13.   public static short getCRC(String s, int i, byte bytes[])
  14.   {
  15.       CRC32 crc32 = new CRC32();
  16.       if (s != null)
  17.       {
  18.           for (int j = 0; j < s.length(); j++)
  19.           {
  20.               char c = s.charAt(j);
  21.               crc32.update(c);
  22.           }
  23.       }
  24.       crc32.update(i);
  25.       crc32.update(i >> 8);
  26.       crc32.update(i >> 16);
  27.       crc32.update(i >> 24);
  28.       for (int k = 0; k < bytes.length – 2; k++)
  29.       {
  30.           byte byte0 = bytes[k];
  31.           crc32.update(byte0);
  32.       }
  33.       return (short) (int) crc32.getValue();
  34.   }
  35.   /**
  36.   * @param biginteger
  37.   * @return String
  38.   */
  39.   public static String encodeGroups(BigInteger biginteger)
  40.   {
  41.       BigInteger beginner1 = BigInteger.valueOf(0x39aa400L);
  42.       StringBuilder sb = new StringBuilder();
  43.       for (int i = 0; biginteger.compareTo(BigInteger.ZERO) != 0; i++)
  44.       {
  45.           int j = biginteger.mod(beginner1).intValue();
  46.           String s1 = encodeGroup(j);
  47.           if (i > 0)
  48.           {
  49.               sb.append(“-“);
  50.           }
  51.           sb.append(s1);
  52.           biginteger = biginteger.divide(beginner1);
  53.       }
  54.       return sb.toString();
  55.   }
  56.   /**
  57.   * @param i
  58.   * @return
  59.   */
  60.   public static String encodeGroup(int i)
  61.   {
  62.       StringBuilder sb = new StringBuilder();
  63.       for (int j = 0; j < 5; j++)
  64.       {
  65.           int k = i % 36;
  66.           char c;
  67.           if (k < 10)
  68.           {
  69.               c = (char) (48 + k);
  70.           }
  71.           else
  72.           {
  73.               c = (char) ((65 + k) – 10);
  74.           }
  75.           sb.append(c);
  76.           i /= 36;
  77.       }
  78.       return sb.toString();
  79.   }
  80.   /**
  81.   * @param name
  82.   * @param days
  83.   * @param id
  84.   * @param prtype
  85.   * @return
  86.   */
  87.   public static String MakeKey(String name, int days, int id)
  88.   {
  89.       id %= 100000;
  90.       byte bkey[] = new byte[12];
  91.       bkey[0] = (byte1// Product type: IntelliJ IDEA is 1
  92.       bkey[1] = 14// version
  93.       Date d = new Date();
  94.       long ld = (d.getTime() >> 16);
  95.       bkey[2] = (byte) (ld & 255);
  96.       bkey[3] = (byte) ((ld >> 8) & 255);
  97.       bkey[4] = (byte) ((ld >> 16) & 255);
  98.       bkey[5] = (byte) ((ld >> 24) & 255);
  99.       days &= 0xffff;
  100.       bkey[6] = (byte) (days & 255);
  101.       bkey[7] = (byte) ((days >> 8) & 255);
  102.       bkey[8] = 105;
  103.       bkey[9] = -59;
  104.       bkey[10] = 0;
  105.       bkey[11] = 0;
  106.       int w = getCRC(name, id % 100000, bkey);
  107.       bkey[10] = (byte) (w & 255);
  108.       bkey[11] = (byte) ((w >> 8) & 255);
  109.       BigInteger pow = new BigInteger(“89126272330128007543578052027888001981”10);
  110.       BigInteger mod = new BigInteger(“86f71688cdd2612ca117d1f54bdae029″16);
  111.       BigInteger k0 = new BigInteger(bkey);
  112.       BigInteger k1 = k0.modPow(pow, mod);
  113.       String s0 = Integer.toString(id);
  114.       String sz = “0”;
  115.       while (s0.length() != 5)
  116.       {
  117.           s0 = sz.concat(s0);
  118.       }
  119.       s0 = s0.concat(“-“);
  120.       String s1 = encodeGroups(k1);
  121.       s0 = s0.concat(s1);
  122.       return s0;
  123.   }
  124.   public static void main(String[] args)
  125.   {
  126.       if (args.length == 0)
  127.       {
  128.           System.err.printf(“*** Usage: %s name%n”, keygen.class.getCanonicalName());
  129.           System.exit(1);
  130.       }
  131.       Random r = new Random();
  132.       System.out.println(MakeKey(args[0], 0, r.nextInt(100000)));
  133.   }
  134. }

直接保存为keygen.java

 

D:develop>javac keygen.java

 

D:develop>java keygen username

67937-QF06H-9X5JW-HWYVN-0G2G3-WVDL1

 

在线注册机

http://appcode.aliapp.com