stu服务器无法访问 作者: 曾奎 时间: 2017-07-13 分类: linux 1. 用阿里云子账号登录阿里云控制台http://signin.aliyun.com/50029795/login.htm 选择-》安全(云盾)  2. 选择DDos防护  3. 选择华南区域,根据实例名称搜索stu服务器,点击右边查看详情。  4. 在详情页选择扫描拦截,点击右边白名单设置  5. 百度一下IP,将本机IP加入白名单 
php剔除非utf-8字符进行json_decode,应对json_decode失败的部分情况 作者: 曾奎 时间: 2017-02-04 分类: php # 如何处理json中的非法utf8字符 根据utf8的编码范围,是可以剔除掉非法utf8字符的。 可以参见http://magp.ie/2011/01/06/remove-non-utf8-characters-from-string-with-php/ `reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?` ``` php $some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'. '|[\x00-\x7F][\x80-\xBF]+'. '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'. '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'. '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S', '?', $some_string ); ``` `reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?` ``` php $some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'. '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string ); ``` 这里是把非法字符替换成?,根据需要自己改。
Redux个人理解(一) 作者: Asser 时间: 2016-11-21 分类: react,javascript #### 通过阅读阮一峰的react教程,初步接触了redux,记录一下初次学习的一些体会,并review一下学到的知识点。 ##### 1.大概结构 > 在redux中,所有的state存储在一个名为store的单一对象中,想要改变state唯一可以触发的方法是使用action,而action会如何改变state需要编写reducer ##### 2.纯组件和容器组件 > 在redux中,react组件总体可以分为两个类型。纯组件和容器组件。 > 纯组件是指不包含状态的纯react组件(即没有this.state),并使用es6中新语法可以轻松的从其他js文件中导出和引入,更充分的体现了代码组件化构成,提高了代码复用性。 > 容器组件专门负责接受用户的action和反映state上的值。具体生成方式是使用redux的connect方法,通过制定映射来将纯组件变成容器组件。 import {connect} from "redux" import {Mycomponent} from "Mycomponent" // 从Mycomponent.js中引入纯组件 function map1(state) { return { "text" : state.text; } } // 返回结果为一个对象,对象为组件UI参数在state上的映射 function map2(action) { return { "OnClick" : (e) => action({ "type" : "click", "payload" : e.target.value }); } } // 返回结果为一个对象,对象为指定用户操作类型, 指定接收的动作类型 const App = connect( map1, map2 )(Mycomponent) #### 3.reducer编写 function reducer(state = { text: '你好,访问者', name: '访问者' }, action) { switch (action.type) { case 'change': return { name: action.payload, text: '你好,' + action.payload }; default: return state; } } > reducer接受state和action两个参数,并通过action来计算新的state然后返回新的state #### 4.使用redux中的createStore方法生成store,此方法以reducer作为参数 #### 5.使用redux的provider组件设置在app应用的最外层,并将上一步生成的store传入app
ECM6新语法学习(二) 作者: Asser 时间: 2016-11-15 分类: ### 函数部分 #### 关于函数的默认参数 > 在es6中支持js函数在参数中直接设置默认参数 function aaa(x = 5, y = 6) { return [x, y]; // [5,6] } > 但是需要注意的是,一旦设置了默认参数,函数的length会发生改变。因为函数的length是指预期传入参数的个数。并且假如默认参数不是尾参数的话,默认参数之后的参数都不会计入length中 function aaa(x, y=6) { return [x, y]; } aaa.length; // 1 function bbb(x=6, y) { return [x, y]; } bbb.length #### rest参数 > rest参数是指函数的参数使用...(参数)的形式,获取函数的多个参数,可以不用再使用arguments对象 function aaa(...values) { let sum = 0; for(let a of values) { sum += a; } return sum; } aaa(1, 2, 3) // 6 #### 拓展运算符... > 拓展运算符可以看作为rest的逆运算,可以将数组中的各个元素,转化成逗号分隔的参数序列 var arr = [1,2,3]; function f(x, y, z){ // code } // es5 f.apply(null, arr); // es6 f(...arr); > 在涉及到32位unicode字符串操作时,直接用字符串.length js会出现判断错误的情况。但是假如使用[...target_str].length就不会出现问题 > 在实现了iterator接口的所有结构,使用...都可以将其转变成一个真正的数组.比如nodelist > 但是如下图所示的类数组对象由于不含有iterator接口所以无法被...转化成数组。替代它的是Array.from()方法 var arr = { "0" : "a", "1" : "b", "2" : "c", "length" : 3 }; Array.from(arr); // ["a", "b", "c"] #### generator(生成器)函数 > 语法: function* name (args){} > 描述:(个人理解)生成器函数可以在运行中退出,并且在下一次进入时,上一次运行函数的环境仍然保存。 > 具体: 运行生成器函数会生成一个可迭代(具有iterator接口)的返回对象,并每次执行该对象的next(),生成器就会执行到下一个"yield"并停止(个人认为,yield等同于生成器函数中的return)或被yield*委派到另一个生成器函数。yield返回的对象拥有一个value属性,表示它产出的值和一个done属性,表示它是否已经运行到最后。 function*aaa() { var index = 0; while (index < 3) { yield index ++ ; } } gen = aaa(); gen.next(); Object {value: 0, done: false} gen.next(); Object {value: 1, done: false} gen.next(); Object {value: 2, done: false} gen.next(); Object {value: undefined, done: true} ###未完待续
代码规范 作者: 曾奎 时间: 2016-11-15 分类: 1. 函数驼峰,变量是下划线,全局变量全大写 2. 大括号不换行 3. 类私有加 耗子 1. 解决作图失败率 仔仔 上线后维护工作 星宇 ps的推送有待完善。 靳宁 相册小程序页面,基本完成、 陈凌鹏 王国剑 预计这周碎片完成 朱涛 明天可以交手两个模板
ECS6新语法学习(一) 作者: Asser 时间: 2016-11-14 分类: javascript ### ECS6中新引入块级作用域声明方法let 和 const > 即使用该方法声明的变量只在当前的块级作用域({}中)有效,使用此方式声明变量可以有效的防止全局变量冲突的情况。在此情况下也可以取代常用的匿名函数写法 //使用var 声明变量i var arr = []; for (var i = 0; i < 10; i++) { arr[i] = function () { console.log(i); } }; arr[6](); // 输出10 // 使用let 声明变量i var arr = []; for (let i = 0; i < 10; i++) { arr[i] = function() { console.log(i); } } arr[6](); //输出6 > ECS6中的新写法,=>和>>>, => 为arrow function ### => 为arrow function,(x) => x + 6相当于 function(x) { return x + 6 } > 箭头函数中没有arguments对象,箭头函数的this也始终指向定义时所在的对象而不是使用时的对象. ### 关于数组和对象的解构赋值,个人认为有点类似于python var [a, b] = [1, 2] console.log(a) // a = 1 console.,log(b) // b = 2 //数组解构 function example () { return { "aaa" : 1, "bbb" : 2 } } var {aaa, bbb} = example(); console.log(aaa) // 1 console.log(bbb) // 2 //对象解构 ### 关于数组遍历,使用for..of.. 在原有的ECS5中有forEach但是forEach不支持break,使用for..of..可以完美支持break var a = [111,222,333] for (let test of a) { console.log(test); } ### 测试时发现对象貌似没有Iterator接口,所以在遍历是可以采用如下方法。 var map = new Map() map.set("aaa", 11); map.set("bbb", 22); for(let [key, value] of map) { console.log(key + "is" + value); } ### 模板字符串`的使用。 > 在ECS6中支持将多行字符串写在`中,被称作模板字符串,可以完美保留空格,缩进,转行等。假如在模板字符串中需要引用变量,可以在${}中写入 var name = "Asser"; var txt = `User's name is ${name}, and this is a test`; ### 数组新功能 ####使用Array.of()建立新数组 > 在ECS5中 Array(); // [] Array(3); //[, , ] Array(1,2,3)[1, 2, 3] > 又上可见 输入的值不同,创建的数组都不同,Array()函数只有在参数是2个及以上的时候才能创建数组 > 使用Array.of() Array.of(1) // [1] #### 使用includes查找数组中是否存在某一元素,返回值为布尔值.此函数可以传第二个参数,选择开始查询的位置,默认为0,假如为负数则表示为从倒数的第x个位置开始查询。 [1, 2, 3].includes(1) // true [1, 2, 3].includes(1, 1) // false [1, 2, 3].includes(3, -1) // true ###未完待续
redis数据库管理 作者: 曾奎 时间: 2016-11-10 分类: redis # 数据库服务器的新增 1. 在阿里云控制台创建云服务器实例,注意服务器`区域`,以及服务器的`内存`大小。通常购买华南地区8G内存的服务器用于配置redis。 2. 购买好服务器之后ssh进入服务器安装redis,执行以下命令 > mkdir /install && cd /install wget http://download.redis.io/releases/redis-3.0.7.tar.gz tar xzf redis-3.0.7.tar.gz cd redis-3.0.7 make && make install mkdir /db cp src/redis-cli src/redis-server /db cd /db 3. 到这里redis已经安装到了/db目录,现在创建一个redis.conf用来作为启动redis的配置文件,内容如下 >daemonize yes timeout 300 save 3600 1 dbfilename kphoto.rdb dir /db requirepass KawaPhoto5252 maxmemory 7800000000 >注:maxmemory为允许redis占用的最大内存, requirepass为数据库密码 dir为数据库目录 dbfilename为数据库保存的持久化文件 4. 再创建一个dbcli用来连接数据库,内容如下 ./redis-cli -a KawaPhoto5252 5. 执行redis-server查看是否有异常,如果有异常按照提示解决。 6. 执行 ./redis-server redis.conf启动redis。 7. 执行./dbcli 查看redis启动结果 8. 对于`相册数据库`,需要将数据库添加到备份程序中,操作如下: >ssh 到dtreset1服务器 cd /photomove 修改dbs.json,把新的数据库服务器加入json的数组中。 9. 另外`相册数据库`还需要添加到photo1的setting.php中db_host # 数据库运维 1. 重启数据库 >ssh到数据库服务器 cd /db ./dbcli shutdown 关掉数据库,该命令会备份数据库 ./redis-server redis.conf 启动redis
Linux Netstat运维 作者: 曾奎 时间: 2016-11-02 分类: linux 1. 查看当前网络各种状态情况 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn 2. 当出现大量TIME_WAIT时 vim /etc/sysctl.conf 然后,在这个文件中,加入下面的几行内容: net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 最后输入下面的命令,让内核参数生效: /sbin/sysctl -p
php redis扩展安装 作者: 曾奎 时间: 2016-11-01 分类: php,redis cd /install wget http://op.kagirl.cn/typecho/usr/uploads/2016/11/4075209923.zip unzip 4075209923.zip cd phpredis-master phpize ./configure make && make install vim /etc/php.ini 在第二行加上 extension=redis.so; [重启php-fpm](http://op.kagirl.cn/typecho/index.php/archives/62.html)
php5.4升级php5.5 作者: 曾奎 时间: 2016-11-01 分类: php,linux 1. 检查当前安装的php版本 rpm -qa |grep php* 2. 移除当前安装的php yum remove php* 3. 添加[yum源](http://op.kagirl.cn/typecho/usr/uploads/2016/11/2094056191.zip)下载解压放到目录 /etc/yum.repos.d/中 4. 安装php5.5 >yum install php55w php55w-gd php55w-mcrypt php55w-fpm php55w-dba php55w-devel php55w-cli php55w-common php55w-mbstring php55w-mysql php55w-xml php55w-xmlrpc 5. 上面安装过程中可能会报错libmcrypt.so不存在 >1. 更新yum源 yum install epel-release //扩展包更新包 yum update //更新yum源 yum install libmcrypt libmcrypt-devel mcrypt mhash 6. [安装php redis扩展](http://op.kagirl.cn/typecho/index.php/archives/71.html) 7. [重启php-fpm](http://op.kagirl.cn/typecho/index.php/archives/62.html) yum update 可能会报错如下: 注: Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again 解决办法如下: 在网上查了查,解决办法是编辑/etc/yum.repos.d/epel.repo,把基础的恢复,镜像的地址注释掉 #baseurl mirrorlist 改成 baseurl #mirrorlist 只改下面这一项就ok了。 [epel] name=Extra Packages for Enterprise Linux 6 - $basearch baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch #mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearc h failovermethod=priority enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6