CC's blog

CC的技术博客 专注于 it 互联网的技术爱好者

bear 发布的文章

未命名文档

工作概述详细介绍
工作目标1. 完成 React-Native 基础增强框架的开发,构建美菜 React-Native 项目通用框架
2.完成快速构建工具快速创建 React-Native 项目工程
3. 完成美农伙伴项目RN 版本需求一期
4.推进新框架 React-native 在其他 App 的使用,便于统一维护升级
工作完成1.完成 React-Native 基础增强框架的开发,构建美菜 React-Native 项目通用框架(框架一期目标100% 有待二期优化)
2.快速构建工具的开发完成(一期目标100%,插件化尚未得到更好地解决方案)
3.美农伙伴一期开发完成
4 .推进项目接入 mcrn (采供、供应商 伙伴)(70%)
项目成果1.完成项目框架 mcrn 的封装,简化 React-Navigaion 的使用方法,无需复配置即可轻松使用,简化 Redux 的使用,在有人讲解的情况下达到会使用 React 的开发者能在15 分钟内掌握 mcrn 封装后 redux的简单使用,显著降低了 redux 的入门学习成本。简化缓存策略,简单配置缓存模块名称即可完成数据缓存
2.完成项目快速构建工具的开发,在新项目成立时即可快速完成项目的构建即:mcrn init 工程名称即可完成 React-Native 增强框架的初始化,包括iOS Android 与 js基础框架部分,3.美农伙伴一期项目的开发工作,包括amp sentry等系统的对接,状态:已完成,等待上线中 4,推进除美农伙伴外的 供应商、采购App mcrn框架对接()
工作反思总结初期设计一定要考虑的完善一些,否则会给以后工作埋坑,无论是Api开发,或者模块设计,一定不要因为时间的原因在在规范和可扩展性上面打折扣
下季度工作计划
阅读全文
none

React-Native 增强框架(MCRN)

React-Native 增强框架(MCRN)

特点
1抹平平台差异
2更加强大的原生 Api 能力
3自动缓存系统
4逐步完善的全局组件库
5自动页面追踪
6更强大的 Debug 模式

阅读全文
none

MCRN Debug

QA Version

分支切换

说比如我现在开发完了一个订单分支并且已经通过cli 发布,QA 童鞋在需要测试的时候需要摇一摇app,会出现以下界面:


阅读全文
none

内网穿透

首先有一台运行ngrok 服务端的服务器,这是完成整个转发过程的核心。
在这台运行ngrok服务端的服务器上绑定一个域名 ngrok.mydomain.com
再将两个测试域名 test.ngrok.mydomain.com和test2.ngrok.mydomain.com以 CNAME 的方式添加到 DNS 记录里面,把请求者两个测试域名的数据全部转发到ngrok服务器端运行的服务器ngrok.mydomaincom上面



阅读全文
none

Object.keys(), Object.getOwnPropertyNames(), for in的区别

前不久,一朋友求助,让我给解释一波Object.keys(), Object.getOwnPropertyNames(), for in的区别,面试中好几次呗问了。所以,抽了点时间看了看,大概把我看的过程中做的demo记录一下。
看了网上一些关于介绍Object.keys(), Object.getOwnPropertyNames(), for in, Object.getOwnPropertySymbol()的区别,都介绍得不是很详细,不容易理解,今天抽空来说说这三者的区别。
废话不多说,直接上代码。

defineProperty() => 给对象添加单个属性及属性值的,并规定该属性是否可枚举,默认是不可枚举的;所以正常情况下,我们给对象添加单个属性时,只需要用.操作即可。亦,obj.e = 2。这种方式添加的属性默认是可枚举的。
我们通过设置 enumerable 的值来设置属性是否可枚举。
来,下面demo运行起来。

var obj = { a: "1", b: "2"};
Object.prototype.protoName = "proto foobar";
var foo = Symbol("foo");
// 给obj 添加了一个键名为 c, foo 变量值
Object.defineProperty(obj, "c", {
    value: "3", 
    enumerable: false  // 定义是否可枚举,默认 false
})
Object.defineProperty(obj, "d", {
    value: "4", 
    enumerable: true  // 定义是否可枚举
})
Object.defineProperty(obj, foo, {
    value: "foobar",
    enumerable:false
});  

打印的结果为:

{a: "1", b: "2", d: "4", c: "3", Symbol(foo): "foobar"}
1
OK,接下来我们,我们输出日志看看…

for (var i in obj) {
    console.log(" for in : ", i); // 输出 a b d protoName
    if (obj.hasOwnProperty(i)) {
        console.log("obj.hasOwnProperty(i): ", i); // a b d
    }
}
console.log("Object.keys(obj): ", Object.keys(obj));  // ["a", "b", "d"]
console.log("Object.getOwnPropertyNames(obj): ", Object.getOwnPropertyNames(obj));  // ["a", "b", "c", "d"]
console.log("Object.getOwnPropertySymbols(obj): ", Object.getOwnPropertySymbols(obj)); // [Symbol(foo)]
// JSON.stringify(obj) 只能将自身的属性转化成字符串
console.log("JSON.stringify(obj): ", JSON.stringify(obj));  // {"a": "1", "b": "2", "d": "4"}

就上面demo,简单总结一下:

  1. keys() => 输出为一个数组,取到的是 obj 的所有的自身可枚举属性。其功能和for in + hasOwnProperty()功能是一致的
  2. getOwnPropertyNames() => 输出为一个数组,取到的是 obj 的所有自身属性。(可枚举、不可枚举,但不包括symbol类型的属性)
  3. getOwnPropertySymbol() => 输出为一个数组,取到的是 obj 的所有自身的Symbol属性
  4. for in => 遍历 obj 的所有属性,包括自身属性和原型上的所有可枚举的属性
  5. JSON.stringify() => 只能将自身的可枚举的属性转化成字符串

OK, 运行完上面demo后发现,问题是不是轻轻松松地解决了喂,然而,并没有。仔细对比一下上面的日志,然后,来,接着往下走。
for in obj => 能遍历obj的所有属性,包括原型上的属性。(包括原型上的可枚举的属性和方法),有点蒙比了?
如果确实蒙比了,我们接着往下敲代码

Object.defineProperty(obj, "func1", {
    value: function() {console.log("func1")}
})
Object.defineProperty(obj, "func2", {
    value: function() {
        console.log("func2")
    },
    enumerable: true
})

// 来,我们在在原型上添加一个方法

Object.prototype.func3 = function() {
    console.log("func3")
}

for (var i in obj) {
    console.log(" for in : ", i); // 输出 a b d protoName func2 func3
    if (obj.hasOwnProperty(i)) {
        console.log("obj.hasOwnProperty(i): ", i); // a b d func2
    }
}
console.log("Object.keys(obj): ", Object.keys(obj));  // ["a", "b", "d", "func2"]
console.log("Object.getOwnPropertyNames(obj): ", Object.getOwnPropertyNames(obj));  // ["a", "b", "c", "d", "func1", "func2"]
console.log("Object.getOwnPropertySymbols(obj): ", Object.getOwnPropertySymbols(obj)); // [Symbol(foo)]
console.log("JSON.stringify(obj): ", JSON.stringify(obj));  //  {"a":"1","b":"2","d":"4"}
console.log("obj:  ", obj); // {a: "1", b : "2", d : "4", func2 : ƒ (), c : "3", func1 : ƒ (), Symbol(foo) : "foobar"}

对比上面输出日志,我不难发现:

  1. defineProperty() 和 prototype 添加的属性默认是不可枚举的。
  2. defineProperty() 添加的属性时属于自身属性。

哈哈哈,能读到这儿,我想未来的我,可能没有晕吧。
管他呢,简单提个醒吧,方便以后自己更快速地懂这些东西;

  1. for in 没有 func1, 是因为defineProperty()定义的是自身属性,且默认不可枚举。protoName 是在原型 prototype 上,所以会有。
  2. hasOwnProperty() 是只取自身属性,所以 原型上的 protoName, func3 都没有。
  3. keys() 所有的自身可枚举属性, 所以 protoName 和 func3 首先排除了。c 和 func2 是不可枚举。
  4. getOwnPropertyNames() 所有自身属性。所以原型上的protoName 和 func3 都被排除了。
  5. JSON.stringify() 只要自身的,且可枚举的属性。认真看看,转字符串和直接输出的 obj 有多大区别。

所以,网上关于深度克隆一个对象的方式 —- JSON.parse(JSON.stringify(obj)),严格来说,是不正确的。

阅读全文
none

Android Studio apk 自动签名打包

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        applicationId "com.example.bear.myapplication"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    signingConfigs {
        release {
            storeFile
            storePassword
            keyAlias
            keyPassword
        }
    }
    //调用配置文件
    getSigningProperties()


    buildTypes {
        release {
            minifyEnabled true //混淆
            zipAlignEnabled true //Zipalign优化
            shrinkResources true // 移除无用的resource文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //注意要添加签名
            //signingConfig signingConfigs.release
            //自定义apk名字
            signingConfig signingConfigs.release

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.outputFile = new File(
                            output.outputFile.parent,
                            "应用前缀-release-${defaultConfig.versionName}-${releaseTime()}.apk".toLowerCase())
                }
            }

        }
    }


}

<!--more-->

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.+'
    compile 'com.android.support:design:25.+'
}



//获取时间
def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

//读取签名配置文件 这个需要放在android{}外面
def getSigningProperties(){
             android.signingConfigs.release.storeFile = file('./signKey/android.keystore')
            android.signingConfigs.release.storePassword = 15223245
            android.signingConfigs.release.keyAlias = 'test'
            android.signingConfigs.release.keyPassword = 15223245

}

阅读全文
none

oc 获取文件的md5(hash)

简单的来说:

1)、MD5是使用哈希算法计算文件或字符串的摘要,对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。128/ 8 = 16,也就是说MD5得到的是一组16字节长度的八进制。

阅读全文
none