Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all 14821 articles
Browse latest View live

微信跳一跳跳跃脚本NodeJS版本(自动版)

$
0
0

NodeJS开挂玩微信跳一跳 不要太厉害了

github求星 求星 github地址: 微信跳一跳自动跳跃工具

前言:

本脚本参照python版本去开发,内置了 ADB 环境,使用者无需安装 ADB 和配置全局变量等

67b9f1423413ef05355f857c35de5de5mini-jump.gif

本辅助全自动执行,在意外跳跃失败结束游戏后,会自动重新开始游戏哟

使用教程

安装 NodeJS

将本项目克隆到本地

git clone https://github.com/JesseWeb/JumpIt.git

进入项目根目录JumpIt Shift+右键 选择在此处打开命令窗口

 npm install

等待包安装完毕后,把安卓手机连上电脑,打开调试模式,开发者选项中有模拟触摸选项的请一并开启

进入微信打开微信跳一跳,点击开始游戏

命令行输入

npm run start

result.jpg

思路和原理参考 https://github.com/wangshub/wechat_jump_game自动跳跃算法细节参考

原理说明

  1. 用 ADB 获取手机跳一跳的截图 再用 ADB 把截图拉出来
  2. 利用nodejs分析把图片解析为像素分析
  3. 计算出棋子、棋盘的位置后,算出距离再乘以一个换算成时间的系数,最后转化为按压的时间
  4. 再用 ADB 工具实现点击屏幕

移植参照:

神奇的战士-王松

友情链接: 教你用 Python 来玩微信跳一跳

使用须知:

由于本人手上没有mac设备(ios调试需要mac设备的支持),遂只开发了安卓端的脚本,

声明:

本脚本仅供个人测试和代码分享,请勿做商业用途以及恶意刷榜工具,仅供参考


有没有 Egg + Nuxt 的实践

$
0
0

不是单独的 Nuxt 一个项目,然后 Egg 一个项目,而是类似于nuxt-egg这种的

npm突然开始报错的问题,求助

$
0
0

win10系统,我的node昨天还运行的好好的,今天一早就发现所有npm命令都报同样的错误,今天一天尝试了各种修复,重装,重启电脑,全都不管用,跪求各位大佬应该如何解决!报错.jpg

自己写的一个nodejs服务端加密实现。。。

node源码粗读(5):通过调试./lib库的js代码来看javascript在node中运行环境的变化

$
0
0

前言

相信对node源码感兴趣的同学一定知道,./lib库中的js通过node.gyp自动转换成了node_javascript.cc中的ASCII码,如果读过我之前写的一篇文章,应该也是对此有点了解的,而./lib库中的bootstrap_node.js又是js的入口文件,所有./lib下的文件几乎都需要它来挂载。那么这部分代码又该如何调试修改呢?

./lib中的js如何编译

由于./lib库中的js都是存储在node_javascript.cc中,所以我们如果想要调试./lib中的js需要多一个编译的步骤,也就是把你修改的代码编译到node_javascript.cc中。如果大家读过node.gyp以及makefile,那么整个编译流程就会很清晰,在这篇文章中不做过多解读,如果有兴趣了解的话请移步这里。我们在修改完代码后需要执行一下make来进行编译。make会根据lib库中的js重新生成node_javascript.cc文件。这样就可以保证./lib库中的代码在调用的时候都是最新的了。

调试

相信大家都了解,node的入口文件是bootstrap_node.js,那么我们就从这个文件入手,聊一聊该如何调试。二话不说,先写一个console.log然后make一下看看更新了么。

// ./lib/internal/bootstrap_node.js
'use strict';

(function(process) {
  console.log(1111)
  let internalBinding;
  const exceptionHandlerState = { captureFn: null };
//...此处省略n多代码

然后我们make一下(手动滑稽.jpg): issue14-1 nice,没有报错,release和debug都完美生成了。接下来,我们开始跑了: issue14-2 What?!代码没更新?console没出来?还没报错?这是什么情况?(黑人问号脸.jpg) 吓得我赶紧去翻一下node_javascript.cc,然后看到了: issue14-3上面的红框表示是文件internal/bootstrap_node.js,下面的红框如果大家有兴趣可以查一下ASCII,表示的是console.log(1111)。这里可以说明,编译是绝对没问题的,那么问题出在哪里呢?

js node运行环境的变化

顺着bootstrap_node.js往下看会看到一段代码:

    const browserGlobals = !process._noBrowserGlobals;
    if (browserGlobals) {
      setupGlobalTimeouts();
      setupGlobalConsole();
    }

之后的调用栈就不深扒了,通过命名可以看出来,这是装载全局console的代码。哦,原来是在这里装载的,那我在这之后打个console试试? issue14-4居然打出来了?!那么另外一个问题就来了,为什么之前那个console没打出来亦没有报错呢? 然后我们可以做一个小测试,分别在这两个地方设置断点,然后在前面的断点记录下来console.log,在后面的断点对比两者是否相等,代码如下

(function(process) {
  let internalBinding;
  const exceptionHandlerState = { captureFn: null };
  let testConsole = console.log;//添加的testConsole记录下来此时的console.log
  debugger;//添加断点
//....此处省略n多代码
if (browserGlobals) {
      setupGlobalTimeouts();
      setupGlobalConsole();
      console.log(testConsole === console.log);//添加console验证一下
    }
debugger;//添加断点
//...此处省略n多代码

接下来我们跑一遍验证一下,在跑之前记得修改一下调用参数哦: issue14-5issue14-6这个地方应该都没有疑问吧,肯定是true,接下来我们看下面的debugger: issue14-7通过这个结果,能清晰的看出来node已然把console重做了。那么为什么要重做呢? 于是乎,在这里引出来一个概念:v8是js的翻译(编译)器,而node在c++中会为js全局添加global而且会把process作为bootstrap_node.js的参数传入;而在bootstrap_node.js中,则会添加和重写一部分方法,使之符合node的相关需求
我们还是用console这个例子说明一下。在node中,console的输出是针对于ttys的,所以node在处理console的时候,其实是引入了process.stdout.write的概念来实现的console,具体代码可以参考这里,对于这部分代码不在本次主要的说明范围内,所以不做过多解释,有兴趣的可以结合上下文看一下。这就是一个非常典型的node runtime interface

node runtime interface

如果大家看过./lib下面的js文件,那么会发现一个非常有意思的文件: ./lib/repl.js,这个文件可以让你的代码获得runtime interface。

总结

  • 通过上面的流程大家应该也看出来了,./lib中的js使用debugger来调试较为方便。
  • 如果大家想知道bootstrap_node.js调用栈的先后顺序,那么在调用到你的代码之后,直接在debugger中打bt,那么一切都清晰可见,: issue14-8

by 小菜 如果有什么疑问或者我的表述有不正确的地方欢迎回复和指正。
原文地址:https://github.com/xtx1130/blog/issues/14欢迎watch和star。

哪里能找到支付宝账单h5的代码?

$
0
0

最新的支付宝账单h5做的很酷,很想学一下这个h5的代码,哪里能找到?

基于thinkjs2.2的用户登录验证,中途传不了数据return this.model('user').checkUsername(username, phone);

$
0
0

有新的手机号注册,但是执行到console.log(‘a’)就不执行return this.model(‘user’).checkUsername(username, phone);小弟实在不懂 getUserByPhone (phone) { return this.model(‘users’).where({phone: phone}).find(); }; checkUsername (username, phone) { return this.model(‘users’).where({username: username, phone: [’!=’, phone]}).count(‘username’); };

if (isEmpty(errMsg)) {
          return this.model('user').getUserByPhone(phone).then(function (data) {
            if (!isEmpty(data) && data.status > 0) {
              return Promise.reject({
                code: -1,
                info: '手机号已被注册',
                data: {}
              });
            }else{
              **console.log('a');**
              return this.model('user').checkUsername(username, phone);
            }
          }).then(function (data) {
             console.log('b');
              if (data <= 0) {
                return this.model('user').ckeckVerificationOnReg(phone);
              } else {
                return Promise.reject({
                  code: -2,
                  info: '用户名已被使用',
                  data: {}
                });
              }
            }).then(function (data) {
              console.log('c');
              if (isEmpty(data)) {
                return Promise.reject({
                  code: -3,
                  info: '验证码错误',
                  data: {}
                });
              } else {
                data.verification_time = moment().unix();
                if (data.verification_code == verification && data.verification_time >= moment().unix() - 600) {
                  return Promise.resolve();
                }  else if (data.verification_time < moment().unix() - 600) {
                  return Promise.reject({
                    code: -4,
                    info: '验证码失效,请重新发送',
                    data: {}
                  });
                } else {
                  return Promise.reject({
                    code: -3,
                    info: '验证码错误',
                    data: {}
                  });
                }
              }

            }).then(function () {
              var randomCode = parseInt(Math.random() * 1000);
              randomCode >= 1000 ? 999 : randomCode;
              var md5Password = md5(md5(password) + randomCode);
              return this.model('user').updateUserinfoOnReg(phone, username, md5Password, randomCode);
            }).then(function () {
              return this.model('user').getUserByPhone(phone);
            }).then(function (data) {
              return this.model('user').initAccount(data.user_id).then(function (data) {
                //console.log(data);
                self.session('userInfo', {
                  user_id: data.user_id,
                  username: data.username,
                  phone: data.phone,
                  role: data.role,
                  monthly: data.monthly
                });
              })
            }).then(function(){
              self.json({
                code: 1,
                info: '注册成功',
                data: {
                  returnUrl: returnUrl
                }
              });
            }, function (err) {
              if (typeof(err)==='object'&& err!==null) {
                self.json(err);
              } else {
                self.json({
                  code: 500,
                  info: '服务器繁忙,请稍后再试',
                  data: {}
                });
              }
            })
        }
\n```

谁在北京,这两天可以接个nodejs,mongoose的活儿呀?

$
0
0

谁在北京,这两天可以接个nodejs,mongoose的活儿呀?


深入理解React源码 - 首次渲染 III

Koa2项目安全加固建议--完整版

$
0
0

2017 年 12 月 27 日 14:36:56

参考:

1.使用 TLS 加密数据的传输

如果传输的信息的敏感性较高,比如用户的个人信息或者安全秘钥信息的传递,请考虑使用 TLS 协议来加密数据传输。另外普通的 Ajax 请求和 Post 请求在不加密的情况下很容易被包嗅探工具扫描到,并且可能遭受中间人攻击等风险。

可能很多人对于传统的 SSL 加密比较熟悉,而 TLS 就是 SSL 的下一代安全加密产品。对于 web app 我们可以使用 Nginx 来配置 TLS 加密,具体的操作方法可参考如下的配置文件,该配置文件适用于几乎所有的现代浏览器(老式浏览器可能会对于一些算法的支持度不好):

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /path/to/dhparam.pem;

    # modern configuration. tweak to your needs.
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    ## verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    resolver <IP DNS resolver>;

    ....
}

2.使用 koa-helmet 中间件

koa-helmet 可以帮助你的 app 抵御一些比较常见的安全 web 安全隐患,它其实是将 9 个安全中间件集中到了一起,做了合并,大部分都是对于 http header 的操作,下面我们就来看一下这几个模块:

* csp: 通过设置 Content-Security-Policy 来阻止 XSS 攻击和一些其他的跨站注入风险。

  • csp:“网页安全政策”(Content Security Policy,缩写 CSP),CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。
  • Content-Security-Policy:通过设置可以启用 csp
  • meta:通过网页的 meta 标签也可以开启 csp 功能
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
  • 使用
// Make sure you run "npm install helmet" to get the Helmet package.
var helmet = require("koa-helmet");

app.use(
  helmet.contentSecurityPolicy({
    directives: {
      defaultSrc: ["'self'"],
      styleSrc: ["'self'", "maxcdn.bootstrapcdn.com"]
    }
  })
);

参考:Content Security Policy 入门教程

* hidePoweredBy: 删除了 header 中的 X-Powered-By 标签

  • X-Powered-By:包含站点服务器信息与程序信息及版本
  • 使用:默认已启用

* hpkp:通过增加 Public key Pinning 来阻止伪造证书导致的中间人攻击。

  • HPKP:技术给予我们主动选择信任 CA 的权利。它的工作原理是通过响应头或者 meta 标签告诉浏览器当前网站的证书指纹,以及过期时间等其它信息。未来一段时间内,浏览器再次访问这个网站必须验证证书链中的证书指纹,如果跟之前指定的值不匹配,即便证书本身是合法的,也必须断开连接。
  • 使用:
// Make sure you run "npm install helmet" to get the Helmet package.
var helmet = require('koa-helmet')

var ninetyDaysInSeconds = 7776000
app.use(helmet.hpkp({
  maxAge: ninetyDaysInSeconds,
  sha256s: ['AbCdEf123=', 'ZyXwVu456=']
}))

参考:HTTP Public Key Pinning 介绍HTTP PUBLIC-KEY-PINNING EXPLAINED The what, why, and how of RFC 7469

* hsts: 设置 Strict-Transport-Security 来强制安全连接(http over SSL)到服务器(服务器需要支持 https)

  • HSTS: HSTS 的作用是强制客户端(如浏览器)使用 HTTPS 与服务器创建连接
  • 使用:默认已开启

参考:百度百科 HSTS

* ieNoOpen:为 ie8 设置 X-Download-Options

  • 原因:一些网络应用程序将提供不可信的 HTML 下载。默认情况下,IE 的某些版本将允许您在网站上下文中打开这些 HTML 文件,这意味着不可信的 HTML 页面可能会在页面的上下文中开始做坏事。
  • 使用:默认已开启

* noCache:设置 Cache-Control 关闭客户端缓存。

  • 使用:
// Make sure you run "npm install helmet" to get the Helmet package.
var helmet = require('koa-helmet')

app.use(helmet.noCache())

* noSniff: 设置 X-Content-Type-Options 阻止浏览器 MIME-sniffing。

  • 原因:if my server serves file.txt with a text/plain content-type, some browsers can still run that file with <script src=“file.txt”></script>. Many browsers will allow file.js to be run even if the content-type isn’t for JavaScript.
  • 使用:默认已开启

参考:[翻译] 危险的嗅探——IE 的 MIME 嗅探导致 XSS 攻击

* frameguard:设置 X-Frame-Options 阻止点击劫持风险

  • 点击劫持(clickjacking)是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下,并诱使用户点击的手段
  • 使用:默认已开启

* xssFilter: 设置 X-XSS-Protection 启用

  • 目的:这个 header 主要是用来防止浏览器中的反射性 xss。现在,只有 IE,chrome 和 safari(webkit)支持这个 header。
  • 反射性 xss:主要是由于服务端接收到客户端的不安全输入,在客户端触发执行从而发起 Web 攻击。比如:在某购物网站搜索物品,搜索结果会显示搜索的关键词。搜索关键词填入<script>alert('handsome boy')</script>, 点击搜索。页面没有对关键词进行过滤,这段代码就会直接在页面上执行,弹出 alert。
  • 使用:默认已开启

参考:header 的安全配置指南

* koa-helmet功能默认启动表

moduledefault?
contentSecurityPolicy for setting Content Security Policyx
dnsPrefetchControl controls browser DNS prefetching
frameguard to prevent clickjacking
hpkp for HTTP Public Key Pinningx
hsts for HTTP Strict Transport Security
ieNoOpen sets X-Download-Options for IE8+
noCache to disable client-side cachingx
noSniff to keep clients from sniffing the MIME type
referrerPolicy to hide the Referer headerx
xssFilter adds some small XSS protections

* 默认使用

const Koa = require('koa')
const helmet = require('koa-helmet')
const app = new Koa()

app.use(helmet())

app.use((ctx) => {
  ctx.body = 'Hello World'
})

app.listen(4000)

3.使用koa-limit中间件

* koa-limit: 可以限制用户的提交速度和查询速度,从而用来预防洪水攻击。

  • 洪水攻击: 常见的有DDoS(拒绝服务攻击),就是让你的服务器资源耗尽,无法提供正常的服务,间接地拒绝。

参考:百度百科洪水攻击

  • 使用:
var koa = require('koa');
var favicon = require('koa-favicon');
var limit = require('koa-limit');

var app = koa();
// If you are using reverse proxy on the front of node, like 'nginx', please set this 
// app.proxy = true; 
app.use(favicon());
//一个小时内限制用户访问不超过1000次
app.use(limit({
  limit: 1000,
  interval: 1000 * 60 * 60
}));

app.use(function *() {
  this.body = 'hello';
});

app.listen(7001);

  • 使用参数说明:

    • limit: limit request number, default is 1000.

    • interval: limit refresh interval in ms, default is one day.

    • token: prefix key, for isolate different koa-limit, default is koa-limit, if you want to use more than one

    • koa-limit in a project, you must set different token!!

    • store: can be set with a redis store, or other store with API in MemoryStore. default store is MemoryStore.

    • whiteList: all ips in whiteList won’t be limited.

    • blackList: all ips in blackList will 403.

    • message: forbidden message, defautl is ‘request frequency limited’.

4.使用koa-csrf中间件

* koa-csrf:在你的提交表单里增加一个独有的临时的令牌用于服务器端验证,从而保证提交数据的正确性,防止CSRF攻击。

  • CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
  • CSRF攻击理解:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。
  • 使用: koa2安装:
npm install --save koa-csrf@3.x

使用: 服务器端

import Koa from 'koa';
import bodyParser from 'koa-bodyparser';
import session from 'koa-generic-session';
import convert from 'koa-convert';

const app = new Koa();

// set the session keys 
app.keys = [ 'a', 'b' ];

// add session support 
app.use(convert(session()));

// add body parsing 
app.use(bodyParser());

// add the CSRF middleware 
app.use(new CSRF({
 invalidSessionSecretMessage: 'Invalid session secret',
 invalidSessionSecretStatusCode: 403,
 invalidTokenMessage: 'Invalid CSRF token',
 invalidTokenStatusCode: 403,
 excludedMethods: [ 'GET', 'HEAD', 'OPTIONS' ],
 disableQuery: false
}));

// your middleware here (e.g. parse a form submit) 
app.use((ctx, next) => {

 if (![ 'GET', 'POST' ].includes(ctx.method))
   return next();

 if (ctx.method === 'GET') {
   ctx.body = ctx.csrf;
   return;
 }

 ctx.body = 'OK';

});

app.listen();

客户端表单新增_csrf项:

//pug模板
form(action='/register', method='POST')
  input(type='hidden', name='_csrf', value=csrf)
  input(type='email', name='email', placeholder='Email')
  input(type='password', name='password', placeholder='Password')
  button(type='submit') Register

参考:浅谈CSRF攻击方式

5.使用sqlmap工具

* sqlmap是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

  • sqlmap支持的数据库有:MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
  • 检测注入:
    • 基本格式
sqlmap -u "http://www.vuln.cn/post.php?id=1"
默认使用level1检测全部数据库类型
sqlmap -u "http://www.vuln.cn/post.php?id=1"  --dbms mysql --level 3
指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)

参考: Sqlmap使用教程【个人笔记精华整理】

6.确保依赖库的安全性

借助于社区提供的大量的依赖库,我们可以更加聚焦在自己的业务代码的编码上。对于依赖库我们一般通过npm来管理,非常方便,但是引入的包是否会给我们的应用引入新的安全风险呢?我们可能听说过的短板效应,描述的就是这种情况,当我们苦心积虑的去考虑了任何安全的风险后写出自己的业务代码。但是却忽视了引入的库的安全性,则之前所作出的努力可能都白费了。

我们可以使用如下的两个工具来管理第三方的依赖库的安全问题。nsprequireSafe,两个工具功能上大致相同。

nsp是一个命令行工具,通过一个node安全项目数据库来决定我们的应用所依赖的包是否具有安全风险。

  • 使用:
//nsp会提交package.json中的内容进行安全检查

$ npm i nsp -g
$ nsp check

// requiresafe的使用基本相似

$ npm install -g requiresafe
$ cd your-app
$ requiresafe check

7.确保前端引用的js库安全

  • Retire.js的目标是帮助用已知的漏洞检测模块版本的使用。在chrome浏览器的应用商店搜索Retire.js插件并安装。
  • 使用:安装好后用浏览器打开要测试的网页即可,点击插件即可进行检查。

retireJs.png

8.代码扫描工具SonarQube

  • Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测。
  • 安装:CentOS7.4上安装SonarQube
  • 使用:
    • 使用admin,admin用户名,密码登录到你搭建的服务器上
    • 分析一个新项目

2.png4.png6.png

使用React+Redux+Antd完成的CNode社区

node.js 可以实现对PC端的窗口进行模拟点击和窗口查找吗?

$
0
0

node.js 可以实现对PC端的窗口进行模拟点击和窗口查找吗?

有好的前后端分离开源项目推荐吗

【北京-望京】奇妙时光 移动端开发工程师 25K~30K

$
0
0

【公司简介】 我们专注于面向大中型互联网企业提供移动通信产品解决方案,经过 1 年多的创业成长,目前公司已成为滴滴最大的云通信产品合作伙伴。团队于 16 年初获得天使轮投资, 4 月 29 日 PAAS 平台上线,次月营收即成功突破百万大关后,公司营收连续 6 个月保持环比 100%的增幅, 10 月份实现单月盈利, 11 月份单月营收突破 3000 万元, 2016 年全年营收达到 9 位数! 2017 年环比增幅100%。我们诚挚邀请牛人加盟,为核心成员提供优厚的待遇,致力于大家共享团队发展收益!

【公司文化】 我们采用 OKRs 模式,聚焦团队战略目标,为团队小伙伴们提供宽松的创新环境,鼓励创新,允许试错,提倡自我管理,关注、发掘、释放团队协作潜能!

【招聘要求】 职位:移动端开发工程师

工作内容及职责 1、负责Android & iOS平台的SDK的产品研发; 2、负责解决对接问题、兼容问题; 3、负责编写相关的对接技术文档 4、负责移动产品日常的运行、维护、管理工作,解决产品运营中遇到的相关技术问题。

任职要求 1、985/211或海外知名院校统招本科学历,3年以上实际开发经验,能力优异者可适当放宽标准; 2、熟练掌握Java和Objective-C及对应移动端框架,有SDK(Android、iOS)相关开发工作经验,有较丰富的终端兼容性相关经验,有大数据采集、处理相关项目经验的优先; 3、2年以上的Android,ios手机开发经验, 熟悉Android、iOS打包工作原理,有完整的SDK平台开发经验; 4、有良好的代码风格和编程习惯; 5、具有独立思考解决问题的能力,热衷技术研究与实践,具备Hacker精神,能承担较大工作压力; 6、有梦想,有追求,有冲劲,喜欢挑战,热爱生活,有愈挫愈勇不达目的决不罢休的精神!

【公司环境】 坐标:来广营站:北京市朝阳区来广营西路 诚盈中心3号楼706室 1.jpg

2.jpg

3.jpg

4.jpg

5.jpg

【联系方式】

看完觉得有加入意向的请发送简历至邮箱: liudq@mzboss.com

期待你的到来 O(∩_∩)O

ES6 import & export默认值default的问题

$
0
0

a.js 与 b.js属于同一个文件夹

a.js 导出模块

const PI = Math.PI
// 导出模块
// 写法1:
export defult PI
// 写法2:
export default {
	PI
}

b.js 导入模块

impot tmp from './b'
console.log(tmp) // a.js 中写法1 与 写法2在b.js中结果是什么? 为什么?

【阿里巴巴】供应链平台事业部零售终端团队招前端开发

$
0
0

首先是官方JD

职位描述:

1.业务领域 —— 建设天猫从消费者导购到品牌商家系统全链路各类产品,体验每年全球瞩目双11狂欢节,加入尽情施展才华的舞台;

2.技术驱动 —— 从极致的Mobile体验、前端工程化开发、企业级中台应用、可视化编程、3D/AR创新交互,到大规模NodeJS应用等等,拥有足够的挑战及机遇;

职位要求:

1.精通各种前端技术(包括HTML/CSS/JavaScript等),熟悉ES6语法,具备跨终端(Mobile+PC)的前端开发能力,熟悉网络协议(HTTP/SSL),熟悉常见安全问题和对策; 2.熟悉前端工程化与模块化开发,并有实践经验(如gulp/webpack、VueJS/React等); 3.至少熟悉一门非前端的语言(如NodeJS/Java/PHP/C/C++/Python/Ruby等),并有实践经验; 4.对前端技术有持续的热情,良好的团队协作能力,提升团队研发效率,实现极致性能,通过创新交互优化产品体验; 5.加分项(满足其一即可):

  • 具备客户端能力或者Native&Web技术融合经验;
  • 熟悉Canvas动效&WebGL3D以及各种传感器技术;
  • 复杂企业后台应用开发经验;数据可视化产品设计开发经验;
  • 大规模/高负载场景下NodeJS应用开发、运维经验;
  • 良好的算法背景,对机器学习有研究和项目实施经验;
  • 有独立的开源项目或者参与知名开源项目经验;
  • 团队管理能力;
  • 英语沟通能力;**** 6、层级要求:P6、P7、P8

其实阿里各个BU前端要求大同小异,感兴趣的话可以来份简历聊聊看 Email: socketio#qq.com(把#换成@)

分享一个用 ThinkJS3+Vue.js2写的博客程序

$
0
0

github:https://github.com/lscho/ThinkJS-Vue.js-blog demo:http://demo.lscho.com/

结构

|-client前端
|-server后端

依赖

服务端

"dependencies": {
    "think-logger3": "^1.0.0",
    "think-model": "^1.0.0",
    "think-model-mysql": "^1.0.0",
    "think-session": "^1.0.0",
    "think-session-jwt": "^1.0.8",
    "think-view": "^1.0.11",
    "thinkjs": "^3.0.0"
  }

前端

"dependencies": {
    "axios": "^0.17.0",
    "iview": "^2.8.0",
    "mavon-editor": "^2.4.13",
    "vue": "^2.5.2",
    "vue-axios": "^2.0.2",
    "vue-router": "^3.0.1",
    "vuex": "^3.0.0",
    "vuex-router-sync": "^5.0.0"
  }

安装

开发

导入sql,修改配置中 mysql 部分,启动服务

# 启动后台服务
cd ./server
npm start
# 启动前台服务
cd ./client
npm start

部署

# 编译
cd ./client
npm run build

将 server 文件夹上传至服务器,参考nginx.conf进行配置

其他

很多写的不合理的地方,求大佬指点

Web 游戏 「梦幻西游」地图 Demo ,纯 Canvas 画

$
0
0

前言

本程序仅仅学习,顺便回忆小学玩的游戏。 项目初心为了验证一些对 Canvas 想法。 项目大量运用 ES6。

cover.gif

目录

  • 文件介绍
  • 职责分类
  • 缺点

文件

  • img
    • jxk(剑侠客图片)
    • background(地图图片)
  • js
    • base
      • runloop.js(循环)
    • view
      • jxk.js(剑侠客)
      • map_one.js(地图)
    • game.js
    • index.js
  • index.html

职责分类

<script type="text/javascript" src="js/base/runloop.js"></script>
    <script type="text/javascript" src="js/view/map_one.js"></script>
    <script type="text/javascript" src="js/view/jxk.js"></script>
    <script type="text/javascript" src="js/game.js"></script>
    <script type="text/javascript" src="js/index.js"></script>

js/base/runloop.js:主要负责 window.requestAnimationFrame 循环 js/view/map_one.js:地图渲染 js/view/jxk.js:剑侠客渲染 js/game.js:初始化 Canvas ,处理击事件 js/index.js:项目入口

缺点

  1. 人物走在地图边界没有站立状态,这都怪我没有拆分地图与人物之间x,y关系。最近看到微信小程序打飞机源码,发现值得学习。
  2. Canvas 对点击事件支持弱,获取不到绘制在上面的状态,我也没有找到完美的解决方法。

结尾

GitHub: https://github.com/liangtongzhuo/game_web本想做成联网,大家一起在上面走,想了想,为了代码的干净,还是以后另外开项目再加把。

体验地址:https://liangtongzhuo.github.io/game_web/在GitHub 打开速度非常慢,加载了50张以上的图,另外记得打开手机调试,并没有适配 PC,获取不到点击事件

Error: not opened

$
0
0
Error: not opened
    at WebSocket.send (/var/www/html/site_avalokitesvara/node_modules/ws/lib/WebSocket.js:360:18)
    at Tb.send (/var/www/html/site_avalokitesvara/app/extend/h5service.patch.js:1827:25)
    at Tb.pingAP (/var/www/html/site_avalokitesvara/app/extend/h5service.patch.js:1907:16)
    at Tb.timerCheck (/var/www/html/site_avalokitesvara/app/extend/h5service.patch.js:1900:37)
    at Timeout.<anonymous> (/var/www/html/site_avalokitesvara/app/extend/h5service.patch.js:1928:13)
    at ontimeout (timers.js:475:11)
    at tryOnTimeout (timers.js:310:5)
    at Timer.listOnTimeout (timers.js:270:5) } reason: Error: not opened
    at WebSocket.send (/var/www/html/site_avalokitesvara/node_modules/ws/lib/WebSocket.js:360:18)
    at Tb.send (/var/www/html/site_avalokitesvara/app/extend/h5service.patch.js:1827:25)
    at Tb.pingAP (/var/www/html/site_avalokitesvara/app/extend/h5service.patch.js:1907:16)
    at Tb.timerCheck (/var/www/html/site_avalokitesvara/app/extend/h5service.patch.js:1900:37)
    at Timeout.<anonymous> (/var/www/html/site_avalokitesvara/app/extend/h5service.patch.js:1928:13)
    at ontimeout (timers.js:475:11)
    at tryOnTimeout (timers.js:310:5)
    at Timer.listOnTimeout (timers.js:270:5)

System: Centos 7.4 Language: Nodejs 8.9.4

System configuration [root@web-1 log]# cat /etc/sysctl.conf

fs.file-max = 1000000
vm.overcommit_memory = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_abort_on_overflow = 0
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 65535
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608

[root@web-1 log]# cat /etc/security/limits.conf

* hard nofile 1000000
* soft nofile 1000000
root hard nofile 1000000
root soft nofile 1000000

当系统创建的websocket到达1W左右时,系统就不能再创建连接了,我觉得好像是连接数或者文件描述符不够用了,我用curl访问baidu都会超时,上面是我的服务器配置,请问下我应该怎么排查问题?不知道是哪里限制住了,谢谢

[root@web-1 log]# lsof -p 1441 | wc
  10524  105213 1255001

[root@web-1 log]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 30724
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1000000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 30724
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@web-1 log]# curl www.baidu.com

NPM:一些包凭空消失,大量包无法安装。

Viewing all 14821 articles
Browse latest View live