二十一世纪韭事记

满记一记吧,不定时更新,不定时删除

  1. 2018-8-16 看到消息Redcore浏览器获融资2.5亿。打着全自主研发的口号,实际是Chrome换皮肤。
  2. 2018-8-17 XXXX建议生育基金,生二胎后领取。
  3. 2018-8-27 上海昆山纹身社会人士刮擦电动大叔后殴打并拿刀砍人结果刀掉了之后被受害者拿刀反杀。看怎么判吧。(9.1日 检察撤诉认为正当防卫)2018年为止的第一个正能量吧
  4. 2018-10-3 范冰冰罚的税达到8.8亿,需要说什么么?不用了吧。


443-917-5162

博客昨天还好好的,今天一早访问居然提示“The connection is not private”?

        上博客看看结果chrome报连接不安全,这。。。一看证书居然在昨天过期了。

首先想到的是我确定我有定时在证书过期前两个月更新一次,怎么还会出现证书过期的事故呢?是不是chrome有缓存,切换到safari上一看,也是提示不安全,证书过期。

赶紧上服务器,确认定时脚本存在。于是手动执行renew,提示证书没到期不需要更新,并且当前证书的有效期是2018-10-15?What?

这是怎么回事?

原来我只记得定时更新证书,但是没有定时reload nginx。。。加载的还是已经过期的证书。

所以nginx -s reload一下就可以了。定时脚本里证书更新成功的时候让nginx也重载一次就能解决将来的更新问题了。

查这个问题的时候遇到一个搞笑的事情。一个博客主写了一篇文章,说自己的证书过期了,站点访问不了,自己一直都没注意,上去一看结果是定时脚本写错了,噼里啪啦一顿操作,心满意足的说搞定了。可是我查到他这篇文章的时候他的证书又已经过期了一个月了。

(442) 208-3009

larave-admin表格列名点和横线会消失,$grid->disableActions()无效,页面上仍然有delete的action.

使用laravel-admin V1.5.x-dev Grid中column列的label莫名英文句号和横线消失。查看代码:

src/Grid/Column.php

第236行发现

    protected function formatLabel($label)
{
$label = $label ?: ucfirst($this->name);

return str_replace(['.', '_'], ' ', $label);
}

被刻意替换了,不清楚目的。按理后台是给管理员看的,界面也是开发自己搭的,不用这么在意注入。要显示点也很简单,用html的句号“.”代替就行了。

另外一个问题disableActions无效,应该是个bug,单独写$grid->disableActioins()页面仍然会有多选框和delete action.所以只要多加一行就可以了。

$grid->disableActions();
$grid->disableRowSelector();

Laravel-admin是非常棒的项目,但用的人可能还不够多,出些奇怪的问题总是很难查到现成解决办法,老是要去看源码找线索还挺麻烦的,毕竟选择admin后台框架就为了省事。

(804) 835-5922

NodeJs通过zmq订阅Bitcoin-ABC的"rawblock"消息,在生成环境会出现中断,并且没有异常抛出

用NodeJs通过zeromq.js订阅Bitcoin-ABC节点的"rawblock"消息,开始的时候接收的很正常,隔天去查看发现日志中断在晚上9点,并且没有恢复推送,也没有异常抛出。

zmq协议socket断了是会自动重连,写了简单的测试sub和pub脚本,将sub停掉再开,pub那边是可以继续收到消息的。

尝试监听disconnect事件?不可行,zmq的sub和pub没有disconnect事件(这里如有说错欢迎指正)。

只有选择自动重连的方式来解决。

BCH的现阶段出快事件非常的不稳定,一般一小时内会短事件内连续出两个快。

让程序半小时内没收到快通知消息就结束进程,用forever守护,会自动重开并重新连接。

var timeoutHandler = false;
function countDown()
{
if (timeoutHandler) {
clearTimeout(timeoutHandler);
}
/ 1800000
timeoutHandler = setTimeout(() => {
process.exit();
}, 1800000);
};
countDown();
sock.on('message', function(topic, message) {
countDown();
...
});

观察了几天运行良好,块高度log连续。

Bitcoin JSON-RPC: Work queue depth exceeded问题,nodeJs解决方式

用nodejs rpc调用bitcoin cash getRawTransaction方法的时候频繁出现 “Bitcoin JSON-RPC: Work queue depth exceeded”

用nodejs订阅bitcoin cash节点zmq的rawtx消息,收到新交易rawtx的时候inputs里面只有花费交易的txid和vout。想得到花费交易的地址及金额,于是就想遍历inputs通过getRawTransaction查出花费的tx里面的output来得到地址及金额。

let tran = new bitcore.Transaction('rawtx');
let transObj = tran.toObject();
let promiseQueue = [];
for (let i = 0; i < transObj.inputs.length; i++) {
promiseQueue.push(getInput(transObj.inputs[i].prevTxId, transObj.inputs[i].outputIndex));
}
Promise.all(promiseQueue).then(rets => {
/ return Promise.resolve(rets);
}).catch(err => {
console.log(err);
/ return Promise.reject(err);
});
function getInput(txId, outputIndex)
{
return new Promise(function (resolve, reject) {
rpc.getRawTransaction(txId, function(err, raw) {
try {
if (err) {
console.log(err);
reject(err);
}
let tran = new bitcore.Transaction(raw.result);
let script = new bitcore.Script(tran.outputs[outputIndex].script);
let address = script.toAddress().toString();
address = address.replace('bitcoincash:', '');
let tranObj = tran.toObject();
tranObj.outputs[outputIndex].address = address;
tranObj.outputs[outputIndex].txId = txId;
tranObj.outputs[outputIndex].outputIndex = outputIndex;
resolve(tranObj.outputs[outputIndex]);
} catch (e) {
reject(txId)
}
});
});
}

实际情况是一直在抛出“Bitcoin JSON-RPC: Work queue depth exceeded”,烦的不行。

解决却很简单,在rpc调用的时候套一层setTimeout,或者用async await 阻塞执行。

function getInput(txId, outputIndex)
{
return new Promise(function (resolve, reject) {
setTimeout(function() {
rpc.getRawTransaction(txId, function(err, raw) {
try {
if (err) {
console.log(err);
reject(err);
}
let tran = new bitcore.Transaction(raw.result);
/ signale.debug(tran.outputs[outputIndex].script);
let script = new bitcore.Script(tran.outputs[outputIndex].script);
let address = script.toAddress().toString();
address = address.replace('bitcoincash:', '');
let tranObj = tran.toObject();
tranObj.outputs[outputIndex].address = address;
tranObj.outputs[outputIndex].txId = txId;
tranObj.outputs[outputIndex].outputIndex = outputIndex;
resolve(tranObj.outputs[outputIndex]);
} catch (e) {
reject(txId)
}
});
}, Math.random() * 1000)
});
}

注意在出块的时候和inputs数巨大的时候仍然可能抛出异常,要做好重试。

也可以尝试修改节点配置“rpcworkqueue”。或者修改服务器设置 “prlimit”。来降低概率。

laravel-admin编辑数据条目的时候格式化显示

发现很多人需要编辑表单的时候对数据格式化显示,找了下发现挺多人问同样的问题却都没有合适的解决,于是写了一个pull request.

拿我的博客举例。每篇博客中有一个字段subhead,用来做url中的slug,比如“custom format form column data when edit”,在保存文章的时候它将被格式化成“custom-format-form-column-data-when-edit”存在数据库中,而我又希望在编辑文章的时候显示给我看到的是“custom format form column data when edit”。

这个功能挺普遍的,google找了一圈发现很多人有这方面的需求,但是laravel-admin并没有提供相应的方法。作者z-song给出了一个一个解决方法,就是在相应的model里面加getColumnNameAttribute方法

class Post extends Model
{
public function getSubheadAttribute($value)
{
str_replace('-', ' ', $value);
}
}

因为model是前后台公用的,前端所有的subhead全都变成没有横线的状态,为了用slug又得一一将空格转为“-”,而这一切仅仅是因为后台需要显示一次空格状态的subhead而已。对效率上来说太不划算了。

要改也很简单,在下面文件加入一个customFormat方法

laravel-admin/src/Form/Field.php:

/**
* [custom format form column data when edit]
*
* @param Closure $call
*
* @return [null]
*/
public function customFormat(\Closure $call)
{
$this->customFormat = $call;
}

并在同文件fill方法中加入

$this->value = array_get($data, $this->column);
if (isset($this->customFormat) && $this->customFormat instanceof \Closure) {
$this->value = call_user_func($this->customFormat, $this->value);
}

usage:

return Admin::form(Models\Post::class, function(Form $form) use ($id){
...
$form->text('subhead', '副标题')->rules('required')->customFormat(function($value) {
return str_replace('-', ' ', $value);
});
...
}

pull request:

/github.com/z-song/laravel-admin/pull/2153

4693460479

https设置跳转http遇到跳转死循环的问题

上周遇到一个诡异的问题。
原来站点设计的时候同时支持了http和https,测试阶段的时候发现前端请求的一个外部接口是http的导致加载失败,想着偷懒加上https也非必要的情况下,那就注释掉https,然后再在https的server配置里面强制跳转到http就行了。
想的挺完美,逻辑也没什么问题那就动手吧。

return 301 /www.domain.com$request_uri;

一行代码搞定。
然而实际情况呢,访问/www.doman.com 加载失败。。。,访问/www.domain.com 加载失败。。。我。。。
打开调试发现加载失败都是重定向过多,所有的请求都不断的从http跳转到https,又从https跳转到http。。。
https里的跳转是我刚加的,可http我没有设置跳转啊。
开始怀疑vhost配置,查看后发现没有设置跳转。
开始怀疑是代码里面写了判断,查看后找不到跳转。
把https里的跳转去掉就又正常了。。。
睡一觉第二天再来查bug就和不行就重启试试大概是一个效果。反正项目还在测试阶段,收拾东西回家。
。。。。。。
重新开始,配置重新看一遍,跳转换其它种写法,代码再检查一遍,还是没找到问题所在,开始疑神疑鬼。。。
最后打开调试一个一个header看过去,最后发现一个奇怪的地方,https跳转http的时候是301,http跳转https的时候是307 Internal Redirect ?嗯?内部跳转?再看一下header里面有这一项:

Strict-Transport-Security: max-age=15768000

原来是HSTS搞的鬼,这样就解释的通为什么访问http的时候nginx的日志是空的。
HSTS是用来降低http到https这一步被中间人攻击概率的东西。

  1. 用户浏览器访问http
  2. 服务器收到http请求返回301跳转https
  3. 用户浏览器收到301,重新请求https
  4. 服务器返回200

其中1到2这步还是会被中间人截获的。因此HSTS就出现了,它将1,2取消,在有收到Strict-Transport-Security头的情况下,由浏览器内部进行307跳转,不与服务器通信,降低因为是http而被截获的概率。
问题原因是找到了,但是也没办法解决,Strict-Transport-Security服务器的这个header头设置的过期时间是半年。。。好多人还是用的微信内置浏览器。

最终的解决办法是。。。还是把https开启,要求api接口提供https。

微软收购github

唉,程序员界的悲哀

一大早就看到微软75亿美元收购github的消息,真是遗憾万分。github失去了伟大的机会,那么痛苦的时代都熬过来了,为什么要出售呢。不仅仅是代码仓库的问题,不用github很多地方可以存放,重要的是那么一个良好的社区文化和环境。从微软收购的历史上来看,github慢慢的沉寂的概率很大。

Twitter上已经各种哀嚎,偶尔出现一些微软拥簇。有些人已经声称要转移到gitlab和bitbucket。这样简直糟糕透了。以前再怎么分化,大家总是在一个平台保持自己的观点下共同进步。现在又要分开了。资源也分开了,沟通成本,重用成本都增加了。新世纪程序开发的进程反而倒退了。。。真是唏嘘。

linkedin 262亿美元,skype85亿,nokia72亿。github才卖75亿,真是遗憾。多年以后会不会只是偶尔想起来以前有过一个叫github的?

(201) 932-7323

github的仓库deploy key居然不能设置同一个。

给新项目设置deploy ssh key的时候,居然不允许设置同样的key。没办法,新生成一个。

ssh-keygen

生成一个新的key,~/.ssh/newrepo_rsa
将newrepo_rsa.pub填到github里去,想当然的以为就可以了。clone的时候报错,提示没有权限或仓库不存在。
这是显然的,新key虽然生成了,但是系统仍然使用默认的id_rsa。知道原因了。

ssh-add ~/.ssh/newrepo_rsa

也许会提示 Could not open a connection to your authentication agent
执行ssh-agent bash

编辑~/.ssh/config 添加

#newrepo
Host github.com-newrepo
HostName github.com
User git
IdentityFile ~/.ssh/newrepo_rsa

接下来clone的时候只要把repo url里面的github.com换成github.com-newrepo就可以了。


952-591-8039

此篇内容介绍环境要求,使用工具,包,和初步思路

项目地址
op-blog:/github.com/cloudop/op-blog

环境要求

PHP 7.2.4
MySql 5.7.22
Nginx 1.13

开源库
博客框架使用Laravel 5.6.17,这个框架架构合理功能齐全,一些你遇不到的想不到的问题,它都给你处理好了,第三包也很丰富,瑕疵当然也是有的但瑕不掩瑜,强烈推荐使用。
前端使用Bootstrap, Jquery。(提一提Jquery这个项目,有些新晋前端工程师看不起它,那是你们没有经历过IE为主流,firefox,opera,腾讯,遨游抢地盘的那个时代,写Javascript简直就是地狱,这里兼容,那里兼容。直到Jquery的出现,极大的减少了(95%以上)当时互联网程序员的前端工作量,现代网页形式的发展Jquery至少将它提前了五年,对我来说Jquery这个项目是21世纪WEB贡献最大的项目之一。别以为自己用了一段时间Angular,react,vue什么的就牛逼哄哄,那些前端框架也不是你开源出来的。)
具体前端资源查看public/bower.json

博客后台用Laravel插件Laravel-admin

PHP的包管理用的Composer

前端资源管理用的Bower

安装
建立一个新数据库 Blog

git clone /github.com/cloudop/op-blog
cd op-blog
mv .env.example .env

编辑.env文件修改为你的数据库连接
修改注释app/Providers/AppServiceProvider.php

/ $catRs = Models\Category::select('id', 'name')->get();
/ $category = [];
/ if ($catRs) {
/ $category = $catRs->toArray();
/ }
/ View::share('category', $category);

因为Composer install的时候Laravel会提示表不存在(当然不存在,表还没建立)
继续执行

composer install
php artisan admin:install
php artisan db:seed
cd public
bower install

解释
安装php依赖
laravel-admin文件安装
初始数据插入
安装前端包

将AppServiceProvider.php里面注释的取消,至此博客就安装完成,首页访问仍会报错,因为没有数据。进入 /yourdomain/admin,admin: admin 进行添加。


4237040472

个人小站要弄图片服务成本挺高的,图床也不好找,找到了也不想传。那么为什么不自动生成呢~

        ä¸ªäººç«™çš„资源管理能简单就简单,我是不怎么想做图片上传,还要提供图片服务,最重要效果还不好。但是矛盾的是没有图片整体又很贫乏不友好。于是我就想着图片还是必须要有的,就用文章内容来自动生成预览图。那么我们就开始吧。
        æœ‰äº†è¿™ä¸ªæƒ³æ³•åŽï¼Œé¦–先想到的就是一定有人需求类似的功能用来做自动化测试和采集,js的话应该会用canvas相关,不要自己去重复造轮子。Google一下 发现html2canvas ã€‚

使用也很简单,先看官方的例子

html2canvas(document.body).then(function(canvas) {
document.body.appendChild(canvas);
});

        ä¸Šé¢çš„例子将渲染后整个body的内容生成截图canvas。
        ä»¥æˆ‘的博客首页推荐文章来做例子,预览图的大小是 200 * 250,因此我们生成的预览图宽高得是它的倍数,我选择了3倍既600 * 750,因为我觉得这样预览图里的字大小正好。来看实现代码。
        æœ¬åšå®¢çš„代码在这里 op-blog
        æ¨¡ç‰ˆæ–‡ä»¶: resources/views/index/index.blade.php

    javascript

$(document).ready(function() {

......
let option = {
scale: 2
}
$('img[data-thumbnail]').each(function(i, element){
html2canvas($('#'+ $(element).data('thumbnail'))[0], option).then(canvas => {
$(element).attr('src', canvas.toDataURL());
});
});
......
});

    html

<div class="col-md-6">
<div class="card flex-md-row mb-4 box-shadow h-md-250">
<div class="card-body d-flex flex-column align-items-start">
<strong class="d-inline-block mb-2 text-primary">{{$recommendPost[0]['category']['name']}}</strong>
<h3 class="mb-0">
<a data-pjax class="text-dark" href="/post/show?id={{$recommendPost[0]['id']}}">{{$recommendPost[0]['head']}}</a>
</h3>
<div class="mb-1 text-muted">{{Carbon\Carbon::parse($recommendPost[0]['created_at'])->format('M j')}}</div>
<p class="card-text mb-auto">{{$recommendPost[0]['guide']}}</p>
</div>
<img class="card-img-right flex-auto d-none d-md-block border-left" data-thumbnail="thumb{{$recommendPost[0]['id']}}" src="/tmp.svg">
</div>
<div id="thumb{{$recommendPost[0]['id']}}" style="width:600px;height:750px;padding: 10px; position: fixed; background-color: #f8f9fa;">
{!!$recommendPost[0]['content']!!}
</div>
</div>

        è§£é‡Šä¸€ä¸‹ï¼Œå°†æ–‡ç« çš„正文内容放在id为thumbxxx的div里面,文档加载完成后循环解析每个有data-thumbnail属性的img,得到div的id,生成canvas,最后将图片数据赋值给img。
        ä½¿ç”¨çš„时候注意存放内容的div宽度和高度设置是为上面提到的预览图的整倍数。并且在这里position设置为 fixed的效果是这块内容在页面上不显示,不能设置为display: none等,否则会显示空白,因为是根据dom渲染后生成的预览图(可以修改html2canvas源码来支持,不建议)。

是不是很简单呢。


  



7814563733

一直想有个自己的空间博客,一边是懒的写代码,一边又不满足现成博客程序,实在是矛盾。 这次总算是迈出第一步,希望可以将有意思的功能实现在这里,留个纪念,也留个记录

一直以来的记录都是用的Evernote,大大小小的事情都用它,一些疑难杂症的解决,新奇的功能实现,烦恼的吐槽等等都用它来记录,查找也还能用,排版也还行,但是由于是写给自己看的,难免偷懒,变成了尽量快速的记录,排版就随意了点,标题什么的有时候都没有,时间一久某些有价值的内容就像直接消失了一样,再也看不到也想不起来。

工作中也是,中国靠谱的产品和老板远没有靠谱的工程师多,有时候他们的想法很好,我们实现的更美丽,但是耐不住他们的想法变化太块或前后矛盾,一些有趣的功能实现之后就这么看着它没上线,然后渐渐的被所有人包括我自己忘记,实在可惜。以后遇到有趣的功能,我希望都能做成小功能在这个站点实现。

于是决定将长久以来想要建站的想法实现出来。将工作和生活中的点点滴滴记录下来,也许自己将来也会忘记曾今写下的博客。



清晨的游戏回忆

清晨醒来后就无法入睡,脑袋思路异常的清晰。不知怎的回想起魔兽世界,继而又想起天堂2,记忆慢慢的从心底涌了出来,过去的游戏画面是那么的清晰,但是过程却支离破碎。

昨晚西瓜吃多了,凌晨6点晕乎乎的起床如厕,完了,带着火辣辣的腚希望能继续睡着。身体虽然软绵绵,陷在床上,可是意识却异常的清晰,想过好多好多事,不知怎的回想起过去的游戏历程,好不感慨。

作为一个80后在我成长小初高的时候“漫画”经由港台大量出现在我的周围,它们打开了我的幻想世界大门。同样的时期红白机,Gameboy,街机,土星,索尼给了我同往那个世界的交通工具。互联网紧接着流行又给了我们世界的地图,让我遨游,作为80后的我是何等的幸运啊。

我们那个年代父母们刚熬过了会饿死的年代没多久,幸运的迎接到了下岗潮。穷啊,那个时候红白机是卖两百左右吧,小学的时候每日零花钱是1毛,买糖是1分,初中后好一些,每日是1块。游戏机的价位就是遥不可及的,经常和表哥到处去别人家蹭完,魂斗罗玩一下午。

红白机没红多久我们那里就迎来了街机-街霸,同样游戏币也是玩不起的,只得站在旁边看,看一下午。

大概是初中的时候土星,索尼ps1被引进了我的小县城,街机也开始进入了KOF的时代,电脑也进入仙剑奇侠传,红警,星际的时代。那个时候网吧是去不起的,已经玩的起街机了,对那时候的我来说还是很贵的,因此必须变成机霸,一有空就起游戏厅站着看人玩kof,有点闲钱都投入到练习中去了,那时候kof是最火的,一个厅里大部分机器装的都是它,一般正中间有一台遥感很灵敏,所有的高手都是玩这台,周围的是给小孩子玩的。当然,我也是玩中间那台的人。曾几何时我也能霸着中间的机一下午,战无不胜。那时的我努力守护着这小小的荣耀。

于此同时市里也开了2家游戏机“网吧”因为两千左右价格的索尼,土星可没什么人买的起,将它们买来放几台电视在一民房就成了小小的网吧。当时的世嘉土星和索尼ps1的战斗已经接近尾声,随着世嘉的失败,这些网吧里渐渐的都只剩下ps1了。家用机当时的画面可是好过街机很多的,游戏种类又多,特别是当最终幻想8出来之后。不过我倒是没怎么玩,觉得确实挺牛逼,但玩不下去。直到生化危机2的出世,简直惊为天人,那是我第一次接触AVG,放当时也是数一数二的画面表现,满满的恐怖元素,超前意识和玩法,时不时的一次惊吓,让我掏光了口袋。那是我在那个年代唯一通关的家用游戏。

家用机和街机都非常好玩,但都拥有同一个缺点,缺乏共斗乐趣。电脑游戏三角洲,雷神之锤,红色警戒,星际争霸,暗黑破坏神的出现让网吧瞬间接管了我们市的电子娱乐,游戏网吧都倒了,街机厅也只有在每年更新新版kof的时候热闹一点,平时也就慵懒的苟活着。

网吧火了之后,就没街机和家用机什么事了。并且这个优势在不断的扩大。互联网来了!上网,聊天,联网的游戏传奇也来了。是的传奇就在那时候火起来了,但是我却完全玩不下去,不是没玩,尝试过,玩不下去。为什么?因为和同期的家用机游戏比起来简直是丑陋,也没什么情节。后来出来个画面稍微好一点的奇迹。但还是和同期家用游戏差很多啊。

东玩玩西玩玩到了大学。宿舍通网后,大家陆续都买了电脑。这个时候天堂2出现了,那个时候画面最好的mmorpg,rpg方面少的可怜,但是画面优美,场景宏大,人物帅酷吊(就当时来说)。当时对我的冲击是巨大的,家用机厂商们不知道在干嘛,任天堂靠掌机保命呢,大多都2d游戏。家用机画面的网络游戏,能想象么,家用机的缺点没有了!丑陋画面的传奇没有了。瞬间就吸引了我们宿舍的小伙伴投入其中,我取了一个中二名字“守夜”,暗影行者,开始了我的天堂之旅。

天堂2虽然在游戏方式上和传奇没多大区别,就是打怪升级,然后pk。但它比传奇美啊,游戏也是看脸的啊。天天操作丑逼互砍,哪怕砍赢了也没什么成就感,有什么意思。操纵帅哥美女就不一样了,输了,还是那么帅!美!。赢了,哈,那就是天下第一酷。就在这种心态下我们日以继夜的玩。50000还是80000的商店闪耀刀,一直到上亿的恶魔之刃,为了省钱不舍得传送,地图全靠跑。升级慢,打怪的地方满是人,大家变打边聊天,还能做做生意。那是剑斗士练的人多,中期有个套装很好,但是只有头部得靠工匠制作,锁头。我和社友于是满世界收皮革和高级皮革,然后制作成锁头卖。一个锁头可以卖一张点卡,我们一人一个月也就用2张点卡。练级的过程走过精灵峡谷,龙之谷,龙洞,无限之塔,在龙洞门口求组聊天,进龙洞之后抢地盘,然后别人报复拉怪害人,最后pk,双方工会各自叫人,最后约定蜥蜴平原大决战。决战当天,服务器无比的卡,画质调最低,91连起来,成千的人陆陆续续的奔赴战场。远处的敌人一丛一丛从屏幕上刷出来,席琳先知buff加起来,灵魂蛋设置自动,篷!篷!篷的上蛋声刺激着我们的每一个神经,警告着我们接下来不是你死就是我活。战斗时会长,队长通过语音控制,频道里时不时报告红名人的动向,一队的紫名追着另外一队的紫名,所过之处尽是倒地的玩家,奶妈们尽力的在救人,刺客们蠢蠢欲动找准时机秒杀,成功,开极限闪避,往我方阵营逃跑,奶妈跟上,盟友一旦看到便从后方堵截追兵,大打出手,导致更多的紫名和红名出现,我们等名颜色一消立刻回身继续加入战斗。就这样不断循环,战场上的每一个人都不再吝啬经验,金钱。平时的节省,努力的升级就是为了这一刻。。。

那是我人生中美好刺激的一次战役,而这一切完全由玩家自发的,游戏里的经验,金钱,装备是那么的珍贵,但是在那一刻都可以不要,为了荣耀,为了使命,为了义气。在游戏里用同样珍贵的代价但是却轻的多的后果,换取现实世界真实的快感,这不正是游戏的使命么。

好景不长,由于练级难,累,系统不合理(无法单人练级,必须组队)导致根本无法容纳独狼玩家,你必须得找长期组,必须的大家配合时间,玩个游戏还要这么委屈求全么?外挂开始出现了。

天堂2是有新浪代理的,我记得非常的清楚,新浪当时立了“军令状”的,说决不姑息外挂,说的可好听可真了。可事实是根本不管,到后期开脱机挂,挂机角色被石头卡住居然可以打电话给客服让客服帮你把人物移出来?What the fuck?最后还舔着脸和玩家说,诶,那个你们不用外挂的玩家来我们新开的绿色服,这个服我告诉你们,叫绿色服我们新浪是绝对不允许玩家使用外挂的!言外之意就是现有的服务器你们爱用什么款的外挂都可以,当时反外挂的时候我们说的话都是放屁,我们就是不要脸,不好意思啊。

虽然游戏机制不合理,正因为如此里面的经验,装备,金钱,友情,人脉,才愈发的珍贵,这样的游戏你才会觉得重要,才会珍惜。可是外挂让一切变的廉价,换句话说就是贱,贱的东西是可以呼之即来,挥之即去的。慢慢的游戏以前满是玩家的练习场所,pk圣地,变成了一队队的机器人。

爱有多深,恨就有多深,从那时候起,我就决定不再相信新浪这个公司,不使用它们的产品。提醒我自己,天堂是毁在他们手上的。

幸运的时候魔兽世界在不久的将来立刻接替了它的使命。我还清楚的记得我和舍友晚上凌晨5点裹着被子坐在椅子上等魔兽世界开服,兴奋的等待新世界的到来。个人觉得魔兽世界的成功有很大的运气成分,魔兽争霸为世界打下了坚实的玩家基础,但是不能说魔兽的故事有什么出彩,甚至漏洞百出,还很俗套。但是最关键的点是,暴雪没有将这个故事讲的非常详细,他们没这水准,也没这能力,他们只是一个做游戏的公司而已,但是他们cg做的好,一个个战役精彩绝伦,让玩家从各种小片段cg中感受到了史诗气概,暴雪只营造了那么一个氛围,讲了一个故事。真正的讲故事的人是玩家自己,就像哈姆雷特一样,每个玩家都在自己心里建立起了自己的魔兽世界。这决不是暴雪有意为之,只是他们当时绝对没能力把故事讲的完美,现在也没有,但恰恰是这样,给了玩家无限的想象空间。暴雪又正好将这个空间给实体化了。就像现在的黑暗之魂,宫崎英高几乎只讲了个开头,其它的所有细节都以碎片式的方式呈现给玩家,让玩家自己去猜,效果却好的不得了,最终整个故事在玩家脑海里十分的丰满。

加上当时有个论坛艾泽拉斯国家地理将国外玩家的动态带入中国,在游戏没公测前给玩家各种憧憬。玩家在世界里路过互相加buff拉,共同守卫十字入口拉,被人守尸拉,打世界boss蓝龙。游戏还没玩,我们的期待已经达到了无限之高。

最终魔兽世界在玩家无限高的期待下如约公测,结果呢,游戏的素质比玩家的期待还要高,简直前所未有。老有人说魔兽抄袭这个,抄袭那个。我就说了,这个,那个,没达到魔兽这个高度啊,达到了再来BB,就只看到和自己一样的,不看看魔兽创新了多少,只知道守着自己的老本。

真希望可以回到魔兽世界60级甚至是公测45封顶的那个时代,每个玩家穿的破破烂烂,每次装备更新都非常的快乐,路过会给陌生人加buff,都会到副本门口集合组队,副本里面大家探讨战术,不是自己的坚决不要,十字路口被袭击跑都要跑过去守卫,在中立区做个任务都要惊心胆战,潜行做任务看到红色名字就偷袭他,还要守他的尸体,最后大打出手,一群陌生人在战场里面互相拉锯,没有语音的情况下配合默契,组队到野外区杀人获取荣誉,和敌对阵营的工会抢世界boss,提早到黑石山杀那些要进副本的联盟,把正在挖矿的联盟闷棍,然后在他面前把矿挖走,醒了之后致盲,消失,伺机待发。。。

无数次的野外遭遇战,非固定公式的副本挑战,千奇百官的天赋加点套路,五花八门的游戏任务名字,玩家自发组织的巡逻队,屠村大队。暴雪给了我们无限的可能,玩家的想象力创造了丰富多彩的魔兽世界。

可是美好的事物最终总要毁坏,暴雪新接手的傻逼们渐渐的把所有有趣的都毁了,是的所有。渐渐的野外pk没有了,甚至联盟和部落在同一个地点相安无事的做任务,WTF?副本都是一样的套路,攻略一出来所有人都那个套路,还要求这装等,那装等,以前一身破烂都能打熔火之心!!人物剧情崩坏,竞技场设计失败,战场轮为刷子的场地。暴雪把所有的自由度都收回,让玩家被限制在他的条条框框里面玩,暴雪教你玩游戏。可以说魔兽世界的主创人员走了之后,接手的那批人正是以前做游戏做的烂做不火的那些人。

魔兽的没落方式对我来说实在太惨了,在我心里她是女神,他是英雄,他是领袖。他不羁,浪漫,富有才华,他丰富多彩,他驰骋疆场,他杀尽天下庸才mmo,笑看后起魔兽杀手,不屑垃圾山寨,他值得一个风光的收场,他值得天下的玩家永远记得他。好比项羽没自杀,但是武功尽废,为了苟活,乞讨为生,偶尔去酒馆给人讲他过去的辉煌故事,怕大官人开心了,好不赏口酒喝。我呸!写得我直犯恶心。

辉煌如魔兽,最后在暴雪管理层眼里也只不过是一只鸡。

愿此生只记得魔兽世界的好。