Root


  • Home

  • About

  • Tags

  • Categories

  • Archives

react-route-webpack- Unhandled Rejection (TypeError) callback is not a function. (In 'callback(null, __webpack_require__(/*! ./pages/NotFound.js */ "./src/pages/NotFound.js").default)', 'callback' is undefined))

Posted on 2018-09-10 | In 前端

修改Route.js

问题:×
Unhandled Rejection (TypeError): callback is not a function. (In ‘callback(null, webpack_require(/! ./pages/NotFound.js / “./src/pages/NotFound.js”).default)’, ‘callback’ is undefined)
解决:
(1)报错部分

1
2
3
4
5
6
7
8
9
10
const Routes = () => (
<Router history = {history} createElement = {createElement}>
<Route path="/" component={App}>
<IndexRoute getComponent={getHomePage}/>
<Route path="home" getComponent={getHomePage}/>
<Route path="about" getComponent={getAboutPage}/>
<Route path="*" getComponent={getNotFoundPage()}/> //报错
</Route>
</Router>
)

(2)修改后

1
2
3
4
5
6
7
8
9
10
const Routes = () => (
<Router history = {history} createElement = {createElement}>
<Route path="/" component={App}>
<IndexRoute getComponent={getHomePage}/>
<Route path="home" getComponent={getHomePage}/>
<Route path="about" getComponent={getAboutPage}/>
<Route path="*" getComponent={getNotFoundPage}/>
</Route>
</Router>
)

js原型链

Posted on 2018-09-06 | In 前端
  1. js的对象分为普通对象和函数对象。
  2. 创建对象的三种方法
1
2
3
// 字面量
var o1 = {name: 'o1'}
var o2 = new Object({name: 'o2'})
1
2
3
4
// 构造函数
var M = function (name) {this.name = name}
var o3 = new M('o3')
o3为实例,M为构造函数,实例o3的_proto_指向原型对象,实例o3的构造函数M的prototype指向原型对象,原型对象的constructor指向构造函数M
1
2
3
// Object.create
var p = {name: 'p'}
var o4 = Object.create(p)

输出结果:avatar

  1. proto:Object
    所有对象均有proto
  2. 原型和原型链
    avatar
    对象的proto为原型,原型也是对象,也有proto属性,以此类推,直到找到Object原型
  3. 原型对象和实例
    通过构造函数创建出来的多个实例,给原型添加一个方法,这个原型的所有实例都有这个方法
  4. prototype
    只有函数有prototype,对象没有;函数的proto指向Function.prototype
  5. instanceof原理
    instanceof是判断实例对象的proto和生成该实例的构造函数的prototype是不是引用的同一个地址
    o3 instanceof M及原型链中M以上的构造函数,结果都是true

react

Posted on 2018-09-06 | In 前端

一. MAIN CONCEPTS
10.Lifting State Up
input:e.target.value
11.Composition vs Inheritance 组合与继承
组件作为props属性进行传递
JSX中{props.left} left={}
建议使用组件而不是继承

12.Thinking in React

二.ADVANCED GUIDES

  1. Accessibility无障碍访问

加密算法

Posted on 2018-08-28 | In 加密
  1. javascript加密库

  2. AES和RSA的应用:混合密码系统
    通过比较,我们知道:
    RSA 比 AES 更难破解,因为它不需要担心密钥在传递过程中有泄露,只存在暴力破解一种可能;
    AES的优势是以分组为轮,加解密速度非常快,一般而言,AES 速度上数百倍于 RSA
    所以在实际应用中,我们会混合应用AES和RSA,比如 需要加密一个尺寸不小的文件,可能会这么干:
    生成一个一次性随机密钥,算法上采用 AES 的CBC模式 aes-256-cbc(加密分组为256比特)对文件进行加密
    加密完成后,为了安全的传递这个一次性随机密钥,我们使用 接收方的RSA公钥 对其进行加密,随加密后的文件一起发送
    接收方使用私钥进行解密,得到AES密钥原文,并用其解密文件
    例子
    以上场景的应用,比如在 Node.js 中,可以这么实现:
    (1) 生成 AES 随机密钥:

    1
    2
    3
    var passwdLength = 256;  // 初始化随机向量长度
    var aesPassword = require('crypto').randomBytes(passwdLength);
    require('fs').writeFileSync('aesPassword', aesPassword); // 写入文件供openssl使用

(2) 使用openssl aes 加密 filename代表的文件:
openssl enc -aes-256-cbc -kfile aesPassword -in filename -out filename.out
(3) 使用open rsa 加密密钥
openssl enc rsautl -encrypt -pubin -inkey id_rsa.pub -in aespassword -out aespassword.out
将 filename.out 和 aespassword.out 一并发给对方即可,接收方使用openssl 进行一次逆操作即可实现解密。

  1. 选用AES算法,3DES需要三个密钥,且加密时间较长
    AES算法密钥配置128长度即可
    rails实现:(1)gem 安装aes GEM-AES地址:还是选用ase,github上的
    (2)gem 安装aescrypt GEM-AES地址
    (3)Open::SSL::Cipher
    OPENSSL::PKey::RSA
  2. 加密算法

  3. 自行加解密自己来搞加解密,核心在于密钥的生成与管理,密钥管理方式有多种,主要有这么三种:
    (1)固定密钥
    服务端和客户端约定好一个密钥,同时约定好一个加密算法(eg:AES ),每次客户端im在发送前,就用约定好的算法,以及约定好的密钥加密再传输,服务端收到报文后,用约定好的算法,约定好的密钥再解密。这种方式,密钥和算法对程序员都是透明的。
    (2)一人一密钥
    简单说来就是每个人的密钥是固定的,但是每个人之间又不同,其实就是在固定密钥的算法中包含用户的某一特殊属性,比如用户uid、手机号、qq号等。
    (3)动态密钥(一session一密钥)
    动态密钥,一Session一密钥的安全性更高,每次会话前协商密钥。密钥协商的过程要经过2次非对称密钥的随机生成,1次对称加密密钥的随机生成,参考固态秘钥,用于加密的秘钥由客户端通过公钥加密发送给服务端,服务端使用私钥解密拿到后续通讯时使用改秘钥对信息进行加密
    我尽量简单一些说,如果是大虾,就不用看了。注意,和具体的情况会有些不同,因为为了说明原理,简化了。


一.对称算法

AES
块加密和流加密

二.非对称算法

  1. RSA

三.Hash算法

  1. SHA
    require ‘digest/sha1’
    puts Digest::SHA1.hexdigest(‘admin’)
  2. 不要把密钥存储在本地计算机上,应该使用密钥存储器

加密系统设计-实现-问题解决

Posted on 2018-08-28 | In 加密

一. 加密系统设计流程

  1. 使用微信小程序rdSession方式进行加密系统
  2. wx.getUserInfo-(rdSession,rawData,signature)->rdSession存在,签名正确
    <----(对称密钥,iv发送)----
    
  3. scanMessage –(rdSession,rawData,signature)–>rdSession存在,签名正确,scanMessage加密存储

二. 数字签名和加解密

三. 问题解决

1. 后端Ruby on Rails通过OPENSSL::Cipher (OPENSSL::Cipher::Cipher)实现

(1)Encoding::UndefinedConversionError (“\xFA” from ASCII-8BIT to UTF-8)
\xB1I\x0E?4H\x8B}\x85\x82\xEC*8\x8A6\x82\xD6~\x9A\xE8&\xC6V)>\xE5\x0E?\xC6\x863\xC3\xFA\xC7Vz1\xC3\xAD\xB3 \t\x8B\xBD3p…..
Completed 500 Internal Server Error in 366ms (ActiveRecord: 0.3ms)

实际上自动将能够转化为ASCII-8bit的十六进制字符\x转化了,(字节数组:类型为string,每一位为一个十六进制字符),但是在params传播需要UTF-8类型,所以报错。
解决1: asy_key.encode(‘UTF-8’,invalid: :replace,undef: :replace)会导致丢失字符
解决2: unpack(‘H‘) pack(‘H‘) unpack(‘C*’) 转化为16进制的字符串
解决3: 转化为Base64格式进行传送;base64:在字节长度为3的倍数时,生成的加密数据结尾没有=;其他情况下有=

  1. aes-128-cbc加密时,小于16位则加密结果为空。。。。。
    1
    2
    3
    require ‘base64’ 
    Base64.encode64()
    Base64.decode64()

(2) key,iv,final
AES-128-CBC中key和iv必须为16bytes,random_key,random_iv生成key和iv,在+cipher.final格式中生成的key和iv,再次使用该密钥加密或者解密时必须+Cipher.final
(3) 无论encrypt或者decrypt,先new再定义加(解)密格式
sym = OPENSSL::Cipher.new(“aes-128-cbc”)
sym.encrypt //加(解)密格式

2. 前端微信小程序通过crypto-js/crypto-js实现

前端和后端调用不用的库进行AES-128-CBC加密和解密,但是结果不同
Crypto.enc.Base64
Crypto.enc.Utf8 更改编码格式

3. 后端AES加密可以调用gem:AES

ActionRecord数据库查询

Posted on 2018-08-27 | In 数据库
  1. 条件查询
  2. created_at根据底层数据库语言进行查询和排序

weui组件

Posted on 2018-08-09 | In 微信小程序

如何在mpvue框架中引入weui组件

  1. 直接复制weui文件中wxss样式,在相应的pages或者components中引入

从官网导入weui.css

  1. 从文件夹中复制的文件
    dist/weui中的weui.css
  2. 从官网的inspect中报错
    1
    2
    unexpected token "*"
    编译.wxss文件错误

直接添加组件

  1. route.js中使用usingComponents导入使用的组件

初始化mpvue

Posted on 2018-08-04 | In 微信小程序

Mpvue

1
2
3
# 4. 创建一个基于 mpvue-quickstart 模板的新项目
# 新手一路回车选择默认就可以了
$ vue init mpvue/mpvue-quickstart my-project

吴恩达-目录

Posted on 2018-07-30 | In 人工智能

Why Machine Learning Strategy

3 Prerequisites and Notation

Posted on 2018-07-30 | In 人工智能

3 预备知识和符号约定

如果你曾经学习过机器学习的课程(如我在coursera上的machine learning MOOC)
或有应用监督式学习的经验,你将能够理解下面这段文字。
我假设你熟悉监督学习:使用标记训练样本(x,y)学习一个从x映射到y的函数。监督学习包括线性回归,逻辑回归和神经网络。机器学习形式有很多种,但是大多数机器学习的实际应用都是监督学习。
我会频繁提到神经网络(也称为深度学习)。你只需要对他们有一个基本的理解。
如果你不熟悉这里提到的概念,可以看一下Coursera上的前三周的机器学习课程课程地址
avatar

4 规模促进了机器学习的发展

深度学习(神经网络)中的很多想法已经存了几十年了。为什么这些想法突然火了呢?
促使近年来进步的最大的驱动因素有两个:
● 大量可用的数据。如今人们在数字设备(笔记本电脑,移动设备等)上花费比以前多得多的时间。这些活动产生了大量的数据,我们可以使用这些数据来训练我们的学习算法。
● 计算能力的提升。仅仅在几年前我们才能够训练足够大的神经网络,以利用我们现在所拥有的巨大的数据量。
具体来说,如果你使用传统的学习算法(如logistic regression),即使你现在拥有更大的数据量,也会出现“高原效应(plateaus)”。也就是说即使你给它更多的数据,它的学习曲线也会变平坦(flattens out),算法效果不再有提升:
avatar
就好像这些传统算法并不知道该如何处理我们所拥有的全部数据。
如果你在同一个监督学习任务上训练一个小型的神经网络(NN),你可能会获得略微好些的性能:
avatar
这里,“小型神经网络(small NN)”是指仅具有少量隐层神经元/层/参数 的神经网络。最后,如果你训练一个更大的神经网络,你能获得甚至更好的性能:
avatar
因此,如果你想要获得最好的性能表现,你需要(i)训练一个非常大的神经网络,使其在上面的绿色曲线上;(ii)拥有大量的数据。
有许多其他的细节(如神经网络的架构)也非常重要,这些方面也有很多创新。但是提高算法性能最可靠的方法仍然是(i)训练更大的神经 和(ii)获得更多的数据。
如何完成(i)和(ii)是极其复杂的。这本书将会详尽地讨论这些细节。我们将从对传统学习算法和神经网络都有用的一般策略开始,并建立对构建深度学习系统的最先进的策略。

1
2
3
4
5
这个图表展示了NN在小数据集下也会做的更好(横轴前半部分)。
这和NN在大数据集中表现优秀并不具有一致性。
在小数据集中,传统算法可能做得更好,也可能不会做得更好,这依赖于手工设计的特征。
例如,如果你只有20个训练样本,那么你使用logistic regression 或使用neural network可能没有多大区别;
手工设计的特征将会比算法的选择产生更大的影响。但是如果你拥有一百万的数据量,我更倾向于使用神经网络。

建立开发集和测试集

5 你的开发集和测试集

让我们回到之前关于猫的图片的例子:你制作了一个移动APP,用户可以上传很多不同事物的图片到你的app上,你想要自动发现关于猫的图片。

你的团队从不同的网站下载大量猫(正样本,positive examples)和非猫(负样本,negative example)的图片,从而获得了一个很大的数据集。他们将这些数据按 70%:30%分为训练集和测试集。利用这些数据,他们构建了一个猫的检测算法,它在训练集和测试集上表现都很好.
但是当你把这个分类器分数到移动APP上时,你会发现它的表现非常糟糕!

avatar

发生了什么?

你发现用户上传的图片和你从网站下载的作为训练集的图片有些不同:用户使用手机拍摄的图片分辨率更低,模糊,且照明效果较差。由于你的训练集和测试机数据都来自于网站图片,你的算法没有在你所关心的智能手机图片的实际分布上一般化得很好。

大数据时代之前,在机器学习中人们常使用随机的70%:30%分割训练集和测试集。这种做法有效,但是在越来越多的应用(在这些应用中,训练集的分布(在我们的例子中的网站图像)不同于你最终关心的分布(手机拍摄的图像))中这是个坏主意。

我们通常定义:
● 训练集(Training set)——你在这上面运行你的算法。
● 开发集(Dev/development set)——这部分数据用来调参,选择特征,以及对学习算法做出其他决定。有时也被称为留出交叉验证机(hold-out cross validation set)
● 测试集(Test set)——这部分数据用来评估算法的性能,但不要依靠这部分数据对使用的学习和参数
做出任何决定。

一旦你定义一个开发集(Dev/development set)和测试集(Test set),你的团队将尝试各种想法(例如不同的学习算法参数),看哪一种最好。开发集和测试集能够使你的团队快速看到你的算法做得有多好。

换句话说,#开发集和测试集的目的是指导你的团队对机器学习系统作出最重要的改变。#
所以,你应该做到:
选择开发集和测试集,以反映你期望在未来获得的数据,并希望在上面做得很好
换句话说,你的测试集不应该只是可用数据的30%这么简单,特别是当你期望得到的数据(移动app的图像)和你的训练数据(网页图像)在性质上不太一样时。

如果你尚未发布你的app,也就意味着还没有任何用户,因此可能无法获得你未来想要做得很好的数据。但是你仍然可以尝试去接近这一点。例如,请你的朋友拍一些手机照片并发给你。一旦你的app启动后,你可以使用用户的实际数据更新你的开发/测试集。

如果你真的没有任何方法获取接近你期望的数据,也许你可以使用网站图片作为开始。但是你应该清醒地意识到这种做法可能导致你的系统不能一般化的很好。

有时可能我们需要决定投资多少去获取好的开发集和测试集。切记不要假定你的训练集分布和测试集分布必须是一样的。尝试去挑选能反映你最终想要表现很好的数据作为测试样本,而不是你遇到的任何数据。

123…9

Root

87 posts
20 categories
23 tags
© 2018 Root
Powered by Hexo
|
Theme — NexT.Mist v5.1.4
本站总访问量 次 | 有人看过我的博客啦