Node.js socket stream 和异步函数

考虑如下实现场景:
使用 Node.js 实现一个服务端,客户端使用 Socket 连接之后处理数据并返回。
其中,处理数据的场景中很容易出现异步函数(比如数据库查询,或者读配置文件),导致还没把 chunk 处理完,pipe就跑到下一步去了,导致客户端直接被关掉了。
查了一晚上 so 和各种官方 github ,最后还是通过读官方文档解决了。
先给出解决方案。
在 Create Server 的时候,设置 allowHalfOpen 为 true 。
官方对这一参数的解释是:
allowHalfOpen Indicates whether half-opened TCP connections are allowed. See net.createServer() and the 'end' event for details. Defaults to false.
就是允许创建的 Socket 处于半开模式(数据流暂时停止而连接仍然建立)。这样的话,就可以让处理器 (parser) 放心地去处理数据,等返回后再将处理过的 chunk 吐回到 pipe 中。
不过有一点需要注意,如果允许了 HalfOpen ,那么就一定要在处理完数据后手动关掉 Socket ,也就是文中所说的调用 Socket.end() 方法,否则的话 tcp 连接就无法正常结束了。

exp.
简单实现场景:


const server = net.createServer({allowHalfOpen :true}, (socket) => {
    socket.once('error', (err) => {
        console.log('[ERROR]');
    });

    socket
        .pipe(...)
        .pipe(through2(function(chunk,enc,callback){
            let _this = this;
            _parser.parseData(chunk).then(function(chunk){
                _this.push(chunk);
                socket.end();
            }).catch(function(err){
                _this.push(err);
                socket.end();
            });
        }))
        .pipe(...)
    .pipe(socket);
});
server.listen(..., ..., () => {
    console.log('[INFO]');
});

其中,parseData是一个使用了 asnyc 方法的函数。

初识 react-intl

5.9更新
继续踩坑。
因为要传递自定义的函数,于是将 react-router 属性中的 component 改成了 render 。结果发现props中的 match 和 history 直接不见了。原因是又踩了另外一个坑。

正确的打开姿势是:

<Match exactly pattern="/" render={(props) => <Home msg={"hello"} {...props} />} />

*还是没有超过初学者的范畴,参考 git issue : https://github.com/ReactTraining/react-router/issues/4293
=============

最近拿手头一个小项目尝试了一下 React 。项目中涉及到了国际化(其实就是中英文切换),于是(也没有第二选择地)使用了雅虎出的 react-intl
说句实在话就是文档看的有点头疼,因为 react 自带全家桶属性,而它提供的挺多东西还是没能用得上的。
开发过程中参考了两个项目:
1)https://github.com/DWboutin/react-webpack-startup
2)https://segmentfault.com/a/1190000005824920
遇到的最大的问题就是在于要提供一个切换语言的按钮。 React 的组件化让我包在最外面的整站 IntlProvider 需要一层一层地把事件传递到页面内部。
大概结构就是:


<IntlProvider ...config>
<App>
...
<Router render={()=><PageContent changeLanguageFunc={this.changeLang}/>}>
...
</App>
</IntlProvider>

然后在<PageContent/>中通过 this.props.changeLanguageFunc 来调用。如果你的这个函数还在下一级的组件里,那就要继续传递了。
这个方法主要参考的是 AlloyTeam 的这篇文章:http://www.alloyteam.com/2016/01/some-methods-of-reactjs-communication-between-components/

真正学会 React 是个漫长的过程啊~

我为什么很怀念精文世嘉

从来没有如此怀念过一家倒闭的公司
街机这一行,从技术上说,世嘉可以说是树大招风,被中国破解的最惨的。
当然 konami 也不是没人搞,只是实在不太行。传统的中国街机厅更倾向于格斗机和推币、麻将机, konami 虽然占了后两样,但是中国市场主要是 IGS 的天下。
中国的创新能力这两年确实有很长足的进步,然而还是不太行。最典型的产品就是各种尺寸异常夸张的“环游世界”。
环游世界是 SEGA 在上世纪末推出的一款在 SEGA AM2 (街机)和 XBox (家用)上的赛车游戏。这东西可以说是被玩的最坏的了。过年回老家的国产 outrun 2 背景音乐被换成了凤凰传奇的荷塘月色,让人觉得真是滑稽。
至于 ID (头文字D) 系列, ID3 还稍微好一点,因为 ID4 开始框体有了一次断层升级(屏幕更换为液晶宽屏),因此大部分在国内可以看到的 ID3 都是作为洋垃圾从日本直接收进来的。后面 ID4 、 ID5 甚至后面 ID6 是新纪元的故事了。
到了新纪元(大概是 2009 年之后),世嘉的街机平台开始彻底转变为 X86 based 架构的 PC ,这给破解打开了一扇大门。不夸张地说,除了现在最新的舰娘、 DIVA 、Chunithm 之类的街机,SEGA的游戏可以说是全线失守。当然,根据最新的黑科技, Nu 也已经不再是一个安全的平台,毕竟也是一个基于 Windows 7 嵌入式版的 PC ,所以严格上说是 SEGA 依然全线失守,只是中国还没有跟上。
这一次的讨论也是因大佬要买舰娘街机进中国。舰娘也是个神 IP ,政治层面不讨论,反正也是类似于《千本樱》一样很容易引起争议的一个题材(何况还被我国政府点名下架:文化部点名下架列表)。
之前我有跟一个朋友讨论过从日本直接购买街机的可能性,最大的门槛还是在许可证,而不是费用。根据中国的政府规定,进口中国大陆地区的电子产品需要有 “强制性产品认证制度”,而街机是有显示屏的,屏幕也需要经过环保部门的污染和辐射合格准入证。这一条基本把原装进口这条路给堵死了,因为这两个文件都没有国外的等效认证,需要在国内由实体送审才能拿到。
呵,这个实体当然不可能是个人。
而作为企业想要送一个合法的街机,就需要去以企业的身份去联系代理,这期间各种事情,更麻烦。
所以我有点怀念精文世嘉,从各个方面来说。
首先是街机引进。精文世嘉是由上海精文投资(上海市政府、上海市文委牵头)、日本世嘉两家公司合资的一个从事街机运营的企业,它的存在为中国大陆带来了 maimai 、 ID6 、 ID7 等几款日本世嘉最新的机器(虽然没有后续升级),而且进行了彻底的中文化,而且提供了中国地区的独立网络运营。所谓独立网络运营,就是阉割了 aime.net 的功能,独立进行账号的管理。
其次是内鬼。不讲最核心的问题了,讲一款街机吧,叫《Let's go island》。
这款街机是精文世嘉时代有过代理的一款街机,全中文版,现在淘宝上还有人在卖。
海岛探险游戏机
首先声明一点, SEGA 确实展示过 这款街机的 3D 版,但是从来没有正式发售过。
文章
但是,国内的盗版街机却出现了一个我很感兴趣的特性:
盗版海岛探险

注意左上角,有个3D OFF。
个中缘由,我就不太懂了~
先写这么多吧,后面想起来慢慢补。

稍微聊一下街机海外版的删歌以及关联问题

其实按理说这种事情就不应该摆出来说,但是既然聊到了还是要说明一下。
事情的起因已经过去一段时间了。前几天 maimai 的一首东方曲(未和谐版 MV 链接(竟然还是 Flash ,充满了历史的味道,是的我就是看不起你们高贵的 Mac 用户): http://www.iosysos.com/cd/toho2/IOSYS_tohootomebayashi_loving.swf )的手元被 bilibili 各种鞭尸,无论如何修改都无法通过。后来我们发现因为里面有大概一秒的雪山狮子旗。这玩意是啥相信有点脑子的人都知道,就不展开说了。当然, IOSYS 作为一个跟我国没什么关系的团体这么搞确实不用考虑我国的想法,然而身为一个中国人我个人还是觉得这种私货其实掺的很恶心的。
当然由这件事情展开来说,追溯到更早的中国大陆地区正版街机,最亲近 niconico 和东方的街机 maimai (舞萌)在更新的时候也是删掉了 1.02 原版中的千本樱,而且从数据来看是整个干掉了,完全没有留在数据分区里。而且这首歌展开更远一点,韩国版的太鼓达人里面也对这首歌进行了删除。把这几件事情摆到一起说并不意味着它们之间有什么关联,(顺带一提,千本樱的官方作者其实当初有表明不希望作品流出 niconico ,说明 黑p 已经预见到了可能的政治问题)可能只是官方自宫。但是还是可以看得出来其实每个国家在海外的文化制品进入到本国的时候,对一些对意识形态可能造成冲击的东西会有额外的关照。
每个人心里都有个筛子,什么能说什么不能说,可能只是因为我大走国的筛子眼儿细了点,加上人懒,能说的不能说的都不要说的懒政,才导致现在的海外街机引进现状吧。
洗洗睡,有这个功夫还是去练练宴谱面好了。
对了,昨天搬了一个牛奶的宴,有毒。
http://www.bilibili.com/video/av9074306/

这个假红包

早上家族群里开始群发一个假的微信红包。我不禁有点好奇,微信这么强大的智能识别还是不能解决这个问题?于是起床抓了个包。
分享的地址是
shizhuang.ifeng.com/share/topic/159053-1-0?sz_ch=friend&sz_platform=2&skt=89341487982719
查看之后发现存在 xss 。

跟进去发现跳转到了
http://m.ufoto.com.cn/post/2523312?skt=83851487983287
这个页面槽点就更多了,当初写这个页面的程序员估计坟头草都几丈高了。基本没有标签过滤,就算做了有限的处理也是可以轻松绕过的。

看了一下 JS ,有点像当年挂马玩的那一套,关键字编码后直接在页面加载完成后替换整个全屏。其实微信要屏蔽这个也不是不可能,只要禁止掉内置浏览器中的通过 document.write 或者 js dom 操作注入的 html 代码段的跨域请求就可以了。
唉,难怪微信浏览器要设白名单。

试图去保护一个逝者的梦

各位看到这篇文章的时候,我可能已经写了很久了。这篇文章里面不会有连续的干货,是我以一个局外人的身份,试图拯救一个逝者生前遗愿的过程。
当然,如果失败了,这篇文章可能永远都不会发出来,但是我依然想尽自己最大的努力。

雪拉比是我最喜欢的 精灵宝可梦·金银 世代的超神兽。这也是一个已经因病逝去的精灵宝可梦同好站 —— PM双子星 的站长的昵称。
下面的豆瓣链接是网站继任写在头七的文章。
https://www.douban.com/note/274999353/

20170223
今天早上把 PTB 的首页修整了一下,于是进行日常的友情链接清理。果然又发现了一个挂掉的链接。但是,却是我最不想看到挂掉的链接。
PM双子星。
其实我现在的角色真的有点像守墓人,每天日常清理一下 PTB 遗留下来的垃圾,挨个点一下友情链接看看谁有挂掉了。双子跟我们的关系其实是很不错的。当年从 PM杂货店 时代开始就有联系,我还去玩了一把版主。后来双子的图区几位朋友都是很好的人,包括上次去香港见到的阿米
去查了一下whois,域名是一个月以前过期的。
当然,毕竟是我是局外人,还是要先从联系相关人士起步。
根据《纪念森林の宇》一文的描述,貌似在很多年前来北京的时候跟一个相关人士有面基。于是通过方法找到了联系方式。
是的,是咖啡哦。
微博和QQ都没有理我。
更新:好在通过朋友,联系上了。
然后去搜了一下域名的备案和所有人的信息。域名的所有者留的电话,还是不要去打扰比较好。

原因有两个:
1、域名注册已经12年了,不知道信息是否还存在,虽然知道升号之后的规则。
2、不知道是谁的电话,假如是原站长的,贸然打扰逝者家属不好。

总之把消息散布出去了,看看其他人的回应吧。

23:25
域名果然过期了。外人只能干着急。

有人跑路了,真是令人悲伤啊。

23:38
拿到了后台的管理账号密码,小 IDC 真是不靠谱。

总之提个工单,明天上班打电话。

20170224
早上睡不着很早就醒了。赶紧起来电话联系空间商。
南京毕竟是安徽省会(哈哈哈),普通话还是很标准的。
好在赶在deadline之前把域名费用给结清了。
多少钱已经不重要了。

好在域名安全了。

真是松了一口气。

体验了一下咪哒,以及国内的音乐(类)街机游戏思路

有句话说叫做“劣币驱逐良币”,现在来看其实也不失为一种弯道超车的好办法。左边这句话送给总部在广州,工厂在番禺的几大中国街机代理、制造商。
之前抽空去体验了一下咪哒,整理了一下,那就聊聊这个话题。

(一)咪哒相关

查了一下资料,咪哒的制作公司是知名的(版权忽略者,和)街机制造商——艾美科技。提到这个名字可能有点陌生,他们家还有另一个街机游戏,叫做《e舞成名》。
黑(
对,就是那个什么火,马上你就可以跳到的跳舞机。

其实一直更新新歌的思路是对的,毕竟音乐游戏么,除了新玩法,那就只能不停地堆歌来保持新鲜感。
扯远了。回到咪哒。
找了很久,都没找到相关的技术文档,而官网推的也是所谓“无维护运营”,艾美真是厉害。
刚进去感觉不错,虽然是个密闭空间(因为要保证隔音),但是里面很清爽,没有什么味道,也不感觉很闷。看上去是有比较高效的静音换风系统,这一点还是很不错的。
换风口

因为定位是随处安放的k歌房,所以对外保持静音很重要。因此机器的设定是用户需要戴上耳机互动。耳机和话筒都是一般KTV的质量档次,都是有线的,毕竟是考虑到无人值守的问题,无线就丢了。
其他的硬件也还不错,有窗帘,也有放东西的小桌子。




除此之外,还提供了自带设备的3.5mm接口和6.25mm插口,可以自带话筒。

游戏方式上,采用的是微信登录的方式,同时跟微信公众账号深度集成。
在营销方面,每天每台机器有20次免费体验机会,每个微信账号一次。

刚刚还顺手拿手机测试了一下,还是可以扫描的,看上去这个是和机器直接绑定的固定二维码。这样的话会不会有奇怪的事情发生呢~

吐槽:妈的这个程序员到底是登陆党还是登录党啊?看得我好难受。
嗯,顺手截个图好了。登录成功基本就是这个样子。
结束游戏大概三五分钟就可以在微信号里面看到自己刚刚唱过的歌曲。体验很顺畅,还可以做成贺卡发给别人或者分享到朋友圈。体验各种好。
总结了一下,界面做的非常流畅(看他们公司的招聘,要求的是C++程序员,所以性能估计是足够的)、友好,网络的话速度也不错,基本上可以忽略掉的等待时间,让分享这个过程可以很流畅的进行下去。想了想这家公司还是有网络架设基础的,毕竟 e舞成名 这么多年持续更新,这么大的客户端数量也是一个不小的要求。
这次体验让我明白了这个机器为什么这么火。其实咪哒已经运营很长时间了,然而我一直看不起这类机器,我承认我确实对国产的音乐机没什么好感,加上音游玩家对路人多的机器的天然厌恶,就错过了这个机会。后来猛然发现游戏厅里面的机器,除了娃娃机,它也可以走出来,而且营收状况相当好。
这就很可怕了。劣币驱逐良币。
2016年是国内游戏媒体爆发的一年,触乐游研社两大媒体还有任天堂的口袋妖怪中文版、大法姨父各种对中国市场的重视,让玩了多年盗版,完全没有什么生态可言的大陆市场变得有意思了起来。
不可否认,游戏在国内流行起来除了代表国家经济实力上升到有能力消费以外,也确实让原来比较小的圈子里面掺杂了挺多的外行人。比如前两天游研社和几家其他的媒体报道日本 JAEPO 的文章就被圈内大佬各种吐槽。对于咪哒,情况也是一样的。其实从严格意义上来说,咪哒并不是一个街机游戏,它只是一个自助包时的,加入了社交元素的 mini KTV 。这种模式在日本早有先例,只不过是固定的包房,剩下的几乎一样。这种泛街机的模式让传统的街机死亡速度更快了,虽然说街机自己本身就在因为家用硬件的不断增强而持续衰落。
但是换一个角度想,或许这就是未来的趋势呢?也说不定。或许日本传统街机的 hard core 向真的过时了呢?不好说。

(二)国内的其他音乐机和音乐游戏

国内有能力自研街机的厂家屈指可数,算上只出口不内销的台湾 IGS ,这些家这些年拿出来的音乐机也无非就是那些。当然,我确实很喜欢我没有赶上的 Rock Fever 时代,那个时代的 IGS 除了鼓王还没有到处处跪舔日本街机,也有很多不错的良曲。
最近两年,最成功的国产音乐游戏机莫过于星光了。玩法的创新,加上与节奏大师联动,让这个游戏圈了很多粉。可惜的是运营不太给力,星光2 没能大范围铺开,星光1 版本混杂,升级费用高昂。这其实也是华立的无奈之举。通过一些技术手段我们发现 星光1 的程序部分是由开发了 DMT 的韩国团队完成的,这种外包行为让后面的升级变得十分的困难。而星光2 采用了Android作为系统,基本就是完全开发的一款新游戏。
当然,这些还不足以说明它的成功,最让我们大跌眼镜的是,开发出太鼓达人的南梦宫竟然在2014年推出了一款玩法和星光几乎一样的街机。其实国内的大部分玩家对这个还是很失望的,毕竟这么多年了,我国厂商都是一直在抄别人,突然变成了原创党,让一直跪着的一些人感到不太习惯。
当然,顺带一提,这个叫做 Synchronica 的游戏在国内玩家的口中叫做 伪星光 。
剩下的游戏基本都可以找得到原型。《舞立方》抄袭的《舞萌maimai》,这个游戏让我觉得最过分的一点就是提示语音都是直接从舞萌中文版里面拷贝(或者说录音更合适)出来的;《Piano》基本就是 KONAMI 已经放弃的 keyboardmania 的儿童版。各种青春鼓手就是拿 IGS 在 08 年推出的小鼓王改了改曲子。惨不忍睹。
说完了街机,得说说手游了。中国的互联网发展刚好碰上移动互联网大跃进,当年拿着直板手机的时代一去不复返, 499 元就可以买到一个畅玩 3D 游戏的安卓手机。于是各种手游也蓬勃发展。圈外实在太多,而且有节奏大师这种的王牌级游戏坐镇,无法分析。而圈内,喵赛克傍上落天依, TJ 牵头的 水幻之音 开发的 Zion载音也登陆了PSV平台。到了台湾,虽然 Rayark雷亚 树大招风加上智障的大陆地区运营十分招黑,但是依然挡不住旗下 Cytus Deemo VOEZ 几款游戏的风靡,而 Cytus 更是傍上了 CAPCOM 的大腿开发了街机版(不过并没有正式发售,难产了)。

国产音乐游戏还没完全兴起,我们惊讶地发现,日系音游竟然衰败了。手握 BEMANI 大牌的 KONAMI 连出昏招,MUSECA(五饼)和触屏的新机都暴死到团队解散, RB也出现了续命无力的情况,游戏方法一改再改导致玩家流失严重。SEGA这边,diva 也渐露颓势,只有V家死宅还在坚守;maimai 人气也不如从前,好在有 CHUNITHM 这张王牌。namco依然只有太鼓拿得出手;TAITO的过山车也是各种拆解被出售,音乐枪枪更是已经不知道死到哪里去了。本家如此,更不用说其他国家的了。韩国的 DJMAX 团队转职家用机,美国的常青树定位就不是核心向。今年的 JAEPO 竟然让世宇科技抢了风头,真是让人大跌眼镜。
三十年河东三十年河西。国产街机放弃了自己本来不在行的游戏性,用新技术去吸引眼球,却拿到了一致好评,说实在话,我还真不想让这种弯道超车成功。

但是,反正这行已经完了,就这样吧。

从微信小程序导航学到的姿势

知晓程序
最早的一个微信小程序导航,但是大家都知道,微信么,立牌坊(并没有),并不支持直接识别二维码进入小程序。于是各类导航就不能直接把二维码打印在屏幕上让程序识别。于是各位导航都是各显神通。
之前闲逛发现这家解决了一个历史难题: Safari 操作剪贴板。
Clipboard
周末做了点 maimai 相关的微小的工作,于是就把这个工作交给了还要解 ticket 的花花( @liuyanghejerry )。
花花果然很快,五分钟就搞定了。
那么先 Show the code 。

var funs = {
  copySelectedRange: function(element) {
    var range = document.createRange();
    range.selectNodeContents(element);
    var selection = document.getSelection();
    selection.removeAllRanges(),
    selection.addRange(range),
    document.execCommand("copy", true);
  },
};

之后,发挥了单身程序狗的优秀特质,去 Can I use 上看了一眼。
发现上面竟然说的是
Only supports OS clipboard reading/writing via shortcut keys, not through document.execCommand().

这脸打的。

读了《京都流年》

京都流年

建议配合这个 BGM 食用:
Kuwo

上次去书店闲逛,偶然发现了这么一本书,觉得还挺有趣的,于是就顺手买了下来。恰好在玩的手游《阴阳师》也是以平安时期的日本为背景的游戏,就顺手进去研究了一下。
当然,读完了之后最大的印象还是青岛大学的尤海燕教授。奈良本这个家伙真的是在用心写作啊,放荡不羁以至于被译者各种勘误。
书分了四章,具体的内容不想展开来谈。不过,我想说点其他的。比如,我很喜欢的是作者的内容组织方式。虽然“由浅入深”是一个基本的叙事方法,但是由建筑、风景深入到它们的来源,并由来源深入到它们背后的人,真的是让人看起来就停不下来。
也可能是我比较喜欢这种风格吧。
说是很喜欢看,前前后后也花了快两个月的时间才把它完全看完。平安京时代日本出产的不只是吟游诗人,更多的是看似入世实则出世的人。从唐(更早一点说可以是三国末年)开始到明治维新这么多年,来自诸朝、欧美等地的文化混杂,加上这个国家原始积累之后的文化产出,造就了这么一方奇怪的水土和人。
换句话说,这就是日本的美学来源吧。
而且,这么一个起源于外国,并混杂了世界各地文化的民族,对自己文化的自信程度也远超我们。而且,他们自信的结果我们也能从他们输出的各种文化产品里面略知一二。 90 后这一代人没有不受日本文化影响的,更早一点通过质量过硬的商品流入到改革开放之前的中国的“强国日本”印象,更是影响了几辈人。不知道现在还在抱着《弟子规》当作国学传统的投机者们觉不觉得自己正在做的事情是多么的可笑。
接着说说为什么看了快两个月吧。作者老爷子是个游历四方的人,因此在介绍他所熟知的领域的时候,喜欢在一句话里面塞下多达几个甚至十几个的名词。每一个名词都值得我们打开搜索引擎,然后仔细学习好久。挺久没这么认真地看书了,有点累。看完之后发现这本书是作者在立命馆大学任教的时候一门课的课本,不禁对他的学生们暗暗表示起了同情。
总之,是本很好玩的书。作者本人是个日本有名的“在野历史学家”,非正统的历史书,只要不涉及到立场和意识形态问题(论述),看看还是很好玩的。