Javascript 参数传递 说起参数传递,首先需要弄清楚javascript里的数据类型
原始数据类型 Undefined Null Boolean Number String
引用数据类型
Object Array Function Date 等
原始数据类型存储在栈的简单数据段,他们的值直接存储在变量访问的位置(因原始数据类型占据的空间是固定的,可以存储在较小的内存区域栈中)
引用数据类型是存储在堆中的对象,存储在变量处的值只是一个指针,指向存储对象的内存地址,这是因为引用类型的大小会改变.
不同的内存分配机制带来不同的访问机制
在JavaScript中,是不允许直接访问保存在堆内存中的对象的,访问对象时必须取得对象在堆内存中的地址,然后按地址去取得对象中的值.
这便是传说中的按引用访问.
而原始类型则是直接访问到的.
复制变量时的不同
原始值:
会将原始值的副本赋值给新变量.此后两个变量完全独立.
引用值:
会把内存地址赋值给新变量,也就是说两个变量都指向堆内存中的同一个对象. 他们中任何一个改变都会反映到另一个身上.
参数传递的不同
最重要的一点:ECMAScript中所有函数的参数都是按值传递的.
但原始值和引用值仍会造成不同的后果.
原始值:
把变量里的值传递给参数,之后两个变量互不影响.(就是把实参复制给形参的过程)
引用值:
任然是将实参里面的值复制到形参,但是注意对象变量它里面的值是这个对象的堆内存地址
也就是说形参和实参都是指向同一个堆内存对象.
但是也要记住另外一点:如果形参被赋值为另外一个对象时,那么这个形参将会丢弃对上次指向的堆内存地址,而指向新对象的堆内存地址.
此时,形参和实参相互脱离,互不影响,原先的实参任然指向原先对象的堆内存地址.
如果是添加修改形参的属性,那么就是修改堆内存中的对象,形参和实参将同时得到反映,因为他们指向的是同一个堆内存对象.
这种传递方式被称为Call By Sharing
function box(obj) { obj.name='hello'; var obj=new Object(); obj.name='world'; } var obj=new Object(); box(obj); console.log(obj.name); 注意两点:
var obj=new Object() 声明提升 变为
var obj; obj.name='hello'; obj=new Object(); obj.name='world'; 函数的已存在一个变量形参obj,再次的变量申明会忽略
安装配置Yum 删除原有yum,如果存在的话
rpm -aq|grep yum|xargs rpm -e --nodeps
查看最新的yum
http://mirrors.163.com/centos/6/os/x86_64/Packages/
找到最新版yum rpm 包,使用rpm -ivh 安装
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-3.2.29-73.el6.centos.noarch.rpm rpm -ivh yum-3.2.29-73.el6.centos.noarch.rpm 但是会有依赖问题,需要先安装依赖,yum的依赖
error: Failed dependencies: python-urlgrabber >= 3.9.1-10 is needed by yum-3.2.29-73.el6.centos.noarch yum-metadata-parser >= 1.1.0 is needed by yum-3.2.29-73.el6.centos.noarch yum-plugin-fastestmirror is needed by yum-3.2.29-73.el6.centos.noarch 于是,同时注意,这些依赖的旧版本也要清理
清理
rpm -aq|grep python-urlgrabber # 查看旧的版本 rpm -e --nodeps python-urlgrabber #把旧版本卸载掉,然后安装新版本 安装新版本
yum-plugin-fastestmirror还会依赖yum,yum又依赖yum-plugin-fastestmirror,要一个命令一块安装
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/python-urlgrabber-3.9.1-11.el6.noarch.rpm wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-metadata-parser-1.1.2-16.el6.x86_64.rpm wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.30-37.el6.noarch.rpm rpm -ivh python-urlgrabber-3.9.1-11.el6.noarch.rpm rpm -ivh yum-metadata-parser-1.1.2-16.el6.x86_64.rpm rpm -ivh yum-3.
HAProxy HAProxy高性能的反向代理软件,更专注于TCP,HTTP处理,它可以基于四层或七层进行反向代理,尤其适合于高负载且需要进行七层处理的 Web 站点.
单进程、事件驱动模型,通常用于超高流量的负载均衡.
我们也可以使用它来作为中转站,使直连连通率不好的请求进过中转提升速度.
编译安装 apt-get update && apt-get install -y wget gcc g++ make libpcre++0v5 libpcre++-dev yum update && yum install wget gcc make HAPROXY_VERSION=haproxy-1.7.9 CPU_NUM=`cat /proc/cpuinfo | grep processor | wc -l` wget http://www.haproxy.org/download/1.7/src/${HAPROXY_VERSION}.tar.gz tar zxf ${HAPROXY_VERSION}.tar.gz cd ${HAPROXY_VERSION} export CFLAGS="-O3" make TARGET=linux2628 ARCH=X86_64 USE_STATIC_PCRE=1 -j$CPU_NUM && make install 编译32位版本make TARGET=linux26 ARCH=i686 USE_STATIC_PCRE=1 -j$CPU_NUM
在64位系统下编译32位需要apt-get install gcc-multilib g++-multilib
我编译好的haproxy version 1.7.9
64位 http://share.suconghou.cn/files/bin/haproxy.xz
32位 http://share.
react native 环境准备 前提是需要node和npm,这里不在赘述.介绍一个npm加速的.
使用淘宝的npm镜像.控制台运行,或者加入你的bashrc中永久生效
alias cnpm="npm --registry=https://registry.npm.taobao.org --cache=$HOME/.npm/.cache/cnpm --disturl=https://npm.taobao.org/dist --userconfig=$HOME/.cnpmrc"; 安装开发必备的一些package
cnpm install -g react-native-cli webpack react-native也调用了npm命令,所以我们可以再来个alias加速react-native init
alias npm='cnpm'
或者直接将仓库改为淘宝的NPM镜像
npm config set registry https://registry.npm.taobao.org npm config set disturl https://npm.taobao.org/dist 在mac上还需要一些东西
brew install flow watchman 安装完以后可以开始helloworld了.
开始第一个例子 cd /data/tmp react-native init HelloWorld 然后正在初始化大致如下
This will walk you through creating a new React Native project in /data/tmp/HelloWorld Installing react-native package from npm... Setting up new React Native app in /data/tmp/HelloWorld HelloWorld@0.
微信 关于横竖屏的坑
css3可以使用媒体查询判断设备是横屏还是竖屏
//横屏时显示 @media all and (orientation : landscape) { #screenMask{display:block} } //竖屏时隐藏 @media all and (orientation : portrait) { #screenMask{display:none} } 在手机浏览器中表现良好,微信中看样子也可以,但是微信网页中如果聚焦输入框,弹起键盘就有问题了.
软键盘弹起后,网页可用面积减小,安卓就自动识别为横屏了,原有的页面消失了,影响非常大.IOS则没有这个问题,媒体查询判断横竖屏在IOS上工作良好.
并且由此发现,css3媒体查询就是根据宽度是否比高度小来判断横竖屏的.
解决方案1
使用javascript的orientation和orientationchange判断
window.orientation 属于window对象上一个属性;共有三个值 :0为竖屏模式(portrait),90为向左反转变为横屏模式(landscape),-90为向右反转变为横屏模式(landscape),最后180就是设备上下互换还是竖屏模式。 orientationchange 是一个event,在设备旋转时,会触发此事件,如同PC上使用的resize事件。 (function(){ var init = function(){ var updateOrientation = function(){ var orientation = window.orientation; switch(orientation){ case 90: case -90: orientation = 'landscape'; break; default: orientation = 'portrait'; break; } //do something //比如在html标签加一个状态 //然后根据不同状态,显示不同大小 document.body.parentNode.setAttribute('class',orientation); }; window.addEventListener('orientationchange',updateOrientation,false); updateOrientation(); }; window.
启用http2 我的http2的配置
server{ listen 80 fastopen=3 reuseport; server_name example.com; valid_referers none *.google.com *.bing.com *.baidu.com *.example.com; if ($invalid_referer) { return 444; } rewrite ^(.*) https://example.com$1 permanent; } server{ listen 443 ssl http2 fastopen=3 reuseport; server_name example.com; server_tokens off; gzip on; gzip_proxied any; gzip_min_length 1024; gzip_comp_level 3; gzip_types text/plain text/javascript text/css text/json application/javascript application/json image/jpeg image/gif image/png; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off; ssl_stapling on; #OCPS开启 ssl_stapling_verify on; #OCPS验证开启 resolver 8.
性能优化 数组相关 in_array在大数据量(数万以上元素)下效率低下
在分析nginx log得出所有不重复IP时,采用in_array判断,50多万的数据耗时需要五六分钟,而采用存键的方法,用isset判断仅需要十几秒,效率差别非常大. [php7环境下]
判断一个数组是否存在某个元素,远比查找一个键消耗的要多.前者时间复杂度O(n),而后者O(1)
即时使用in_array,也需要加上第三个参数,设置为严格模式,省略数据类型转化的开销,设置为true比设置为false性能要提升好几倍.
这种情况下使用array_search情况比in_array更加糟糕
如果条件允许使用array_flip交换键值,在用isset来判断要比in_array好得多
同时,使用isset来判断数组的键,也比使用array_key_exists要好
而对于本题,还可以使用array_unique最后去重,用空间换时间,效率仅次于用isset
php pdo MySQL server has gone away 在使用PDO长连接时,执行过一次PDO初始化后,php-fpm进程会与mysql server开启一条TCP长连接,下次连接数据库就能加快速度.
但是却存在一定问题,PDO维持了长连接并没有较好的检测其可用性,如果mysql server kill 掉这个连接,或者mysql重启,都会造成
重新实例化PDO时得到旧的链接,导致出现MySQL server has gone away,更让人郁闷的是这个错误并不是一个Exception,无法被catch捕获,即使设置PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,也不行,还是直接在页面上提示.
如果你使用了set_error_handler,那么这个Warning将会被捕捉,不会直接显示在页面上,但也改变了程序的原有执行逻辑.
如果你不使用set_error_handler,页面上报出Warning,但其实PDO已经返回一个可用的链接了.
猜测可能是PDO首先得到了不可用的然后报警告,然后又创建了一个新的.
较好的解决方法是设置set_error_handler若捕获了这个MySQL server has gone away,则返回null,程序继续按原有逻辑执行.
或者不使用PDO长连接.
注意,set_error_handler返回false的话,这个错误还是会被交到上一级错误程序处理的.
PDO int str 使用 mysqlnd 扩展而不是 mysql扩展
编码转换中的若干问题 我们经常会遇到将utf8编码字符转化为gbk编码的字符,例如生成csv表格,在windows上的cmd窗口输出文字,以及操作windows上的有关文件路径的操作都需要使用gbk编码.
常使用iconv('utf-8', 'gbk', $str);将utf8字符转为gbk
这里 utf gbk 不区分大小写,也可以混写,不区分是utf8还是utf-8,都能都正常使用
iconv('utf-8', 'gbk//ignore', $str); 加上//ignore使有些字符无法装换时略过.
但是//ignore在php5.4及以下,和个别php5.6版本上无效,任然是报NOTICE错误.
<?php echo iconv('UTF8', 'GBK//IGNORE', 'l l l'); ?> 见 https://3v4l.
收集的一些DDNS的工具
利用shell获得本机局域网IP ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:" GO语言版 package main import ( "fmt" "net" "strings" ) func main() { conn, err := net.Dial("udp", "google.com:80") if err != nil { fmt.Println(err.Error()) return } defer conn.Close() fmt.Println(strings.Split(conn.LocalAddr().String(), ":")[0]) } 获取外网IP 新浪IP地址库
可以直接script标签引入
直接script引入 http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
也支持 json 和文本格式
json 格式 http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json
文本格式 http://int.dpool.sina.com.cn/iplookup/iplookup.php
curl ip.cn 直接给出IP和运营商,浏览器访问不一样 类似于 curl myip.ipip.net
后面还可以跟一个IP地址,查询IP的位置. curl ip.cn/8.8.8.8 , 其网站还提供大陆IP列表,较快的DNS等等
curl ipinfo.io JSON格式,信息较全,可跨域,同样也可以查询指定IPcurl ipinfo.
静态编译shadowsocks libev 在alpine里编译
apk update && apk upgrade && apk add wget make gcc g++ perl
先安装依赖
# Installation of Libsodium cd /tmp export LIBSODIUM_VER=1.0.12 wget --no-check-certificate https://download.libsodium.org/libsodium/releases/libsodium-$LIBSODIUM_VER.tar.gz tar xvf libsodium-$LIBSODIUM_VER.tar.gz cd libsodium-$LIBSODIUM_VER ./configure --prefix=/usr && make -j2 && make install cd /tmp ldconfig # Installation of MbedTLS cd /tmp export MBEDTLS_VER=2.6.0 wget --no-check-certificate https://tls.mbed.org/download/mbedtls-$MBEDTLS_VER-gpl.tgz tar xvf mbedtls-$MBEDTLS_VER-gpl.tgz cd mbedtls-$MBEDTLS_VER make SHARED=1 CFLAGS=-fPIC && make DESTDIR=/usr install cd /tmp ldconfig 安装完这两个依赖后,下面准备开始静态编译
各版本 http://www.tcpdump.org/release/
安装依赖 yum install -y flex gcc make byacc or apt-get install flex gcc make byacc wget bzip2
cd /tmp wget http://www.tcpdump.org/release/libpcap-1.7.4.tar.gz tar zxf libpcap-1.7.4.tar.gz cd libpcap-1.7.4 ./configure --prefix=/tmp/lib make -j4 && make install cd ../ wget http://www.tcpdump.org/release/tcpdump-4.7.4.tar.gz tar zxf tcpdump-4.7.4.tar.gz cd tcpdump-4.7.4 ./configure --prefix=/tmp --disable-ipv6 CFLAGS='-O3 -I/tmp/lib/include' LDFLAGS='-L/tmp/lib/lib/libpcap.a' make -j4 make install 安装成功后,位于ls -lh /tmp/sbin/tcpdump ldd查看此文件依赖较少,可直接复制到其他Linux上使用.
采用CFLAGS="-O3"编译后为1.2MB
tcpdump -h 查看版本号以及用法
我编译好的tcpdump version 4.7.4
64位 http://share.suconghou.cn/files/bin/tcpdump.xz
也可以直接yum install tcpdump