Redis主从同步

安装环境
linux Centos7
redis-3.2.8

Redis安装
$ wget http://download.redis.io/releases/redis-3.2.8.tar.gz
$ tar xzf redis-3.2.8.tar.gz
$ cd redis-3.2.8
$ make

MASTER 192.168.5.50
SLAVE 192.168.5.51

master 的 redis.conf
bind 127.0.0.1
改为
bind 0.0.0.0

slave 的 redis.conf
找到 # slaveof
添加
slaveof 192.168.5.50 6379
如果master有密码找到 # masterauth
添加
masterauth 密码

启动master
然后启动slave 要加上配置文件 如
/usr/redis-3.2.8/src/redis-server /usr/redis-3.2.8/redis.conf

关闭防火墙
CentOS 7.0默认使用的是firewall作为防火墙 关闭firewall
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

html2canvas实现微信长按图片保存整个网页功能

项目中要做一个性格测试,第一个页面输入姓名,第二个页面显示测试结果。
第二个页面要求长按图片可以保存,微信自带的功能是长按一个图片可以保存但是他是局部的图片,而不是整张网页的内容。
网上找到了一个html2canvas的js插件。
遇到了几个问题
1.不支持跨域,微信头像显示不出来。
2.截的图不清晰
3.截出的元素是canvas

解决方法
1.图片跨域的问题是通过下载远程图片到本地解决的。
2.截图不清晰是通过放大2倍实现的。
3.创建img元素

页面需要先引入jquery和html2canvas.js
js实现的代码如下:

$(document).ready(function(){
var w = document.body.scrollWidth;
var h = document.body.scrollHeight;
//要将 canvas 的宽高设置成容器宽高的 2 倍
var canvas = document.createElement("canvas");
canvas.width = w * 2;
canvas.height = h * 2;
canvas.style.width = w + "px";
canvas.style.height = h + "px";
var context = canvas.getContext("2d");
//然后将画布缩放,将图像放大两倍画到画布上
context.scale(2,2);

html2canvas(document.body, {
canvas:canvas,
onrendered: function(canvas) {
document.body.innerHTML='';
var dataUrl = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream");
var newImg = document.createElement("img");
newImg.src = dataUrl;
newImg.width = w;
document.body.appendChild(newImg);
}
});

php利用缓冲实现动态输出(flush,ob_flush)

php利用缓冲实现动态输出通过 flush,ob_flush实现


print str_repeat(" ", 4096);//php.ini output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲
for ($i=10; $i>0; $i--)
{
echo $i;
ob_flush();
flush();
sleep(1);
}

//ob_flush()和flush()的区别。前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。


//附上一段非常有趣的代码,作者为PuTTYshell。在一个脚本周期里,每次输出,都会把前一次的输出覆盖掉。

header('Content-type: multipart/x-mixed-replace;boundary=endofsection');
print "\n--endofsection\n";

$pmt = array("-", "\\", "|", "/" );
for( $i = 0; $i <10; $i ++ ){ sleep(1); print "Content-type: text/plain\n\n"; print "Part $i\t".$pmt[$i % 4]; print "--endofsection\n"; ob_flush(); flush(); } print "Content-type: text/plain\n\n"; print "The end\n"; print "--endofsection--\n";

用js使得输入框input只能输入数字

JS判断只能是数字和小数点
1.文本框只能输入数字代码(小数点也不能输入)

2.只能输入数字,能输小数点.


3.数字和小数点方法二

4.只能输入字母和汉字

5.只能输入英文字母和数字,不能输入中文

6.只能输入数字和英文chun

7.小数点后只能有最多两位(数字,中文都可输入),不能输入字母和运算符号:

只能是数字和小数点和加减乘際
onkeypress=”return event.keyCode>=4&&event.keyCode<=57"

安装Scrapy的时候遇到的问题及解决方法。

使用pip安装:
pip install Scrapy

第一个问题会遇到
Microsoft Visual C++ Compiler for Python 2.7
http://www.microsoft.com/en-us/download/details.aspx?id=44266

第二问题
安装的时候遇到lxml安装失败解决方法是
1. 安装wheel,命令行运行:
pip install wheel
2.在这里下载对应的.whl文件,注意别改文件名! http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
3. 进入.whl所在的文件夹,执行命令即可完成安装
pip install 带后缀的完整文件名

第三个问题
会遇到缺少win32api模块
下载 pywin32-220-cp27-none-win_amd64.whl
http://www.lfd.uci.edu/~gohlke/pythonlibs/bofhrmxk/pywin32-220-cp27-none-win_amd64.whl
pip install 带后缀的完整文件名

第四个问题
爬虫爬后获取不到信息,这是由于pywin32模块只下载没有安装。
pywin32_postinstall.py -install

Html5获取地理位置

我这个是放在微信浏览器下,找附件门店的。安卓 ios都支持


if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(pos) {
// A callback function that takes a Position object as its sole input parameter.
// 成功回调函数,接受一个地理位置的对象作为参数。
// https://developer.mozilla.org/en-US/docs/Web/API/Position 参数说明
alert(pos.coords.latitude + ' '+pos.coords.longitude);
}, function(err) {
// An optional callback function that takes a PositionError object as its sole input parameter.
// 错误的回调
// https://developer.mozilla.org/en-US/docs/Web/API/PositionError 错误参数
}, {
enableHighAccuracy: true, // 是否获取高精度结果
timeout: 5000, //超时,毫秒
maximumAge: 0 //可以接受多少毫秒的缓存位置
// 详细说明 https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions
});
} else {
alert('抱歉!您的浏览器无法使用地位功能');
}

微信商户平台发红包接口——现金红包和裂变红包源码。亲自手写。

今天刚写好的代码。官方文档看了两、三天才搞出来是个啥情况。废话不多说,进入正题。

用源码的时候要主要注意的有几点。
1.文件的编码格式一定要是utf-8编码的,不然发的红包是乱码也领不出钱。
2.证书的路径一定要放正确,看你们放的位置到时候改一下,我这里是网站根路径下的。
3.填入参数就可以了,后面都有备注的。本作者已经亲自线上开发测试好才分享出来的。代码绝对没问题,你们根据你们自己的需要再二次开发吧。有需要加QQ群:143220554交流。

然后,弱弱的说一句,如果帮到你了,网站广告给我点一下呗,别多点。

直接上源码了。

账户设置-->API安全-->密钥设置
$nonce_str = md5(rand()); //随机字符串,不长于32位

$m_arr = array (
'mch_billno' => $mch_billno,
'mch_id' => $mch_id,
'wxappid' => $wxappid,
'send_name' => $send_name,
're_openid' => $re_openid,
'total_amount' => $total_amount,
'total_num' => $total_num,
'wishing' => $wishing,
'client_ip' => $client_ip,
'act_name' => $act_name,
'remark' => $remark,
'nonce_str'=> $nonce_str
);
array_filter ( $m_arr ); // 清空参数为空的数组元素
ksort ( $m_arr ); // 按照参数名ASCII码从小到大排序

$stringA = "";
foreach ( $m_arr as $key => $row ) {
$stringA .= "&" . $key . '=' . $row;
}
$stringA = substr ( $stringA, 1 );
// 拼接API密钥:
$stringSignTemp = $stringA."&key=" . $apikey;
$sign = strtoupper ( md5 ( $stringSignTemp ) ); //签名

$textTpl = '













';
$resultStr = sprintf($textTpl, $sign, $mch_billno, $mch_id, $wxappid, $send_name,$re_openid,$total_amount,$total_num,$wishing,$client_ip,$act_name,$remark,$nonce_str);

return curl_post_ssl($url, $resultStr);

}

//裂变红包
function sendgroupredpack()
{
$mch_billno = '0000000000' . date ( "YmdHis", time () ) . rand ( 1000, 9999 ); //商户订单号
$mch_id = '0000000000'; //微信支付分配的商户号
$wxappid = ''; //公众账号appid
$send_name = ""; //商户名称
$re_openid = ""; //用户openid
$total_amount = "300"; //付款金额,单位分
$total_num = 3; //红包发放总人数
$amt_type = "ALL_RAND"; //红包金额设置方式 ALL_RAND—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额
$wishing = "恭喜发财"; //红包祝福语
$act_name = "关注有礼"; //活动名称
$remark = "测试"; //备注
$apikey = "key"; // key 商户后台设置的 微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
$nonce_str = md5(rand()); //随机字符串,不长于32位

$m_arr = array (
'mch_billno' => $mch_billno,
'mch_id' => $mch_id,
'wxappid' => $wxappid,
'send_name' => $send_name,
're_openid' => $re_openid,
'total_amount' => $total_amount,
'total_num' => $total_num,
'amt_type' => $amt_type,
'wishing' => $wishing,
'act_name' => $act_name,
'remark' => $remark,
'nonce_str'=> $nonce_str
);
array_filter ( $m_arr ); // 清空参数为空的数组元素
ksort ( $m_arr ); // 按照参数名ASCII码从小到大排序

$stringA = "";
foreach ( $m_arr as $key => $row ) {
$stringA .= "&" . $key . '=' . $row;
}
$stringA = substr ( $stringA, 1 );
// 拼接API密钥:
$stringSignTemp = $stringA."&key=" . $apikey;
$sign = strtoupper ( md5 ( $stringSignTemp ) ); //签名

$textTpl = '













';
$resultStr = sprintf($textTpl, $sign, $mch_billno, $mch_id, $wxappid, $send_name,$re_openid,$total_amount,$amt_type,$total_num,$wishing,$act_name,$remark,$nonce_str);

$url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";

return curl_post_ssl($url, $resultStr);
}

function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
{
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

//以下两种方式需选择一种

//第一种方法,cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/apiclient_cert.pem');
// 默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/apiclient_key.pem');

//第二种方式,两个文件合成一个.pem文件
//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');

if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}

curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
$data = curl_exec($ch);
if($data){
curl_close($ch);
return $data;
}
else {
$error = curl_errno($ch);
echo "call faild, errorCode:$error\n";
curl_close($ch);
return false;
}
}

?>

ThinkPHP字符串截取

ThinkPHP带的字符串截取函数是msubstr

但是$suffix参数,为true,字符串长度不足截取长度的时候,也会显示…

原因是函数里面没判断。

[cce_php]
/**
 +----------------------------------------------------------
 * 字符串截取,支持中文和其他编码
 +----------------------------------------------------------
 * @static
 * @access public
 +----------------------------------------------------------
 * @param string $str 需要转换的字符串
 * @param string $start 开始位置
 * @param string $length 截取长度
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符

function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
[/cce_php]

在不改变原有的函数的基础上,可以这样调用

[cce_php]
{$painting.painting_name|msubstr=0,9,'utf-8',false}
<eq name="painting.painting_name|checkStrNum=9" value="0">...</eq>
[/cce_php]

CSS hack技巧大全

兼容范围:

  • IE:6.0+,FireFox:2.0+,Opera 10.0+,Sarari 3.0+,Chrome
    • 参考资料:
    • 各游览器常用兼容标记一览表:

    • 标记 IE6 IE7 IE8 FF Opera Sarari
      [*+><] X X X X
      _ X X X X X
      \9 X X X
      \0 X X X X
      @media screen and (-webkit-min-device-pixel-ratio:0){.bb {}} X X X X X
      .bb , x:-moz-any-link, x:default X X √(ff3.5及以下) X X
      @-moz-document url-prefix(){.bb{}} X X X X X
      @media all and (min-width: 0px){.bb {}} X X X
      * +html .bb {} X X X X X
      游览器内核 Trident Trident Trident Gecko Presto WebKit
      (以上 .bb 可更换为其它样式名)
    • 注意点:

    • 网上很多资料中常常把!important也作为一个hack手段,其实这是一个误区。!important常常被我们用来更改样式,而不是兼容 hack。造成这个误区的原因是IE6在某些情况下不主动识别!important,以至于常常被人误用做识别IE6的hack。可是,大家注意一 下,IE6只是在某些情况下不识别(ie6下,同一个大括号里对同一个样式属性定义,其中一个加important 则important标记是被忽略的,例:{background:red!important; background:green;} ie6下解释为背景色green,其它浏览器解释为背景色red;如果这同一个样式在不同大括号里定义,其中一个加important 则important发挥正常作用,例:div{background:red!important} div{background:green},这时所有浏览器统一解释为背景色red。)


    • 实例讲解:
    • Hack应用情境(一)

    • 适用范围:IE:6.0,IE7.0,IE8.0之间的兼容

    • 实例说明:

    • 此例中我们使用了渐进识别的方式,从总体中逐渐排除局部。首先,巧妙的使用“\9”这一标记,将IE游览器从所有情况中分离出来。接着,再次使用“+”将IE8和IE7、IE6分离开来,此时,我们的IE8已经独立识别。
    • 实例代码:

      [cce_html]
      .bb{
      height:32px;
      background-color:#f1ee18;/*所有识别*/
      .background-color:#00deff\9; /*IE6、7、8识别*/ +background-color:#a200ff;/*IE6、7识别*/ _background-color:#1e0bd1;/*IE6识别*/ }
      
      /*一个用于展示的class为bb的div标签*/
      < div class ="bb"></ div >
      [/cce_html]

 


    • Hack应用情境(二)

    • 适用范围:IE:6.0,IE7.0,IE8.0,Firefox之间的兼容

    • 实例说明:

    • 大家很容易的可以看出这是情境(一)的加强版,适用于更广泛的环境。其实情境(一)中也已经做到了把火狐与IE游览器区分开来了,现在我们要做的是把火狐 从其它游览器中再次识别出来。大家仔细看下代码,大家会发现其实游览器识别是很简单的。火狐如何识别?对了,IE中对伪类支持不广泛,所以伪类是个不错的 途径。(.yourClass,x:-moz-any-link, x:default)注意,这个区分伪类往往IE7也能识别,所以最好还需要把IE7单独识别出来,且此方法对ff3.6 已无效,firefox的区分可以使用@-moz-document url-prefix(){}
    • 实例代码:

      [cce_html]
      
      
      .bb{
      height:32px;
      background-color:#f1ee18;/*所有识别*/
      background-color:#00deff\9; /*IE6、7、8识别*/
      +background-color:#a200ff;/*IE6、7识别*/
      _background-color:#1e0bd1;/*IE6识别*/
      }
      .bb, x:-moz-any-link, x:default{background-color:#00ff00;}/*IE7 firefox3.5及以下 识别 */
      @-moz-document url-prefix(){.bb{background-color:#00ff00;}}/* 仅firefox 识别 */
      * +html .bb{background-color:#a200ff;}/* 仅IE7 识别 */
      
      /*一个用于展示的class为bb的div标签*/
      < div class ="bb"></ div > 
      [/cce_html]

    • Hack应用情境(三)

    • 适用范围:IE:6.0,IE7.0,IE8.0,Firefox,Safari(Chrome)之间的兼容

    • 实例说明:

    • 我们现在将再次对我们的CSS进行加强了,使其能识别Safari(Chrome)游览器。这是基于它们的内核webkit来识别的,用法为@media screen and (-webkit-min-device-pixel-ratio:0)
    • 实例代码:

[cce_html]


.bb{
height:32px;
background-color:#f1ee18;/*所有识别*/
background-color:#00deff\9; /*IE6、7、8识别*/
+background-color:#a200ff;/*IE6、7识别*/
_background-color:#1e0bd1;/*IE6识别*/
}
@media screen and (-webkit-min-device-pixel-ratio:0){.bb{background-color:#f1ee18}}{} /*safari(Chrome) 有效 */
.bb, x:-moz-any-link, x:default{background-color:#00ff00;}/*IE7 firefox3.5及以下 识别 */
@-moz-document url-prefix(){.bb{background-color:#00ff00;}}/*仅firefox 识别*/
* +html .bb{background-color:#a200ff;}/* 仅IE7 识别 */

/*一个用于展示的class为bb的div标签*/
< div class ="bb"></ div > 
[/cce_html]

  • Hack应用情境(四)

  • 适用范围:IE:6.0+,FireFox:2.0+,Opera 10.0+,Sarari 3.0+,Chrome全兼容

  • 实例说明:

  • 实例的具体代码在下面实例代码中已经列出,具体效果如此页面的顶端部分效果,您可以通过不同游览器检测该效果。这次我们基本把所有的主流游览器都兼容了,大家来看下代码。Opera的识别有一部分归功于“\0”标记,这个标记只被IE8和Opera识别,特殊的标记往往造就的是我们更广泛的hack手段。下例的代码比较完整,大家可以选择参考。
  • 实例代码:

[cce_html]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312">
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312"/>
<style type="text/css">

/***************************************** 各游览器兼容CSS **********************************************/
.bb{height:32px;background-color:#f1ee18;/*所有识别*/ background-color:#00deff\9; /*IE6、7、8识别*/ +background-color:#a200ff;/*IE6、7识别*/ _background-color:#1e0bd1/*IE6识别*/}

@media screen and (-webkit-min-device-pixel-ratio:0){.bb{background-color:#f1ee18}}{} /* Safari(Chrome) 有效 */
@media all and (min-width: 0px){ .bb{background-color:#f1ee18;/*opera and Safari(Chrome) and firefox*/ background-color:#4cac70\0;}/* 仅 Opera 有效 */ }{}

.bb, x:-moz-any-link, x:default{background-color:#4eff00;/*IE7、Firefox3.5及以下 识别 */}
@-moz-document url-prefix(){.bb{background-color:#4eff00;/*仅 Firefox 识别 */}}
* +html .bb{background-color:#a200ff;}/* 仅IE7 识别 */

/* 一般情况下 我们区分IE7 只用 +background-color 配合 _background-color 就行了 如果必须写 .bb, x:-moz-any-link, x:default 这样的代码区分 Firefox3.5及以下 则谨记此写法对IE7也有效,故在其中要再重写一次 +background-color 或者使用 * +html .bb{background-color:blue;} 方法仅对 IE7 有效。可使用 @-moz-document url-prefix(){} 方法独立区分所有 firefox */

.browsers td{width:8%;text-align:center;padding:8px;}}
.browsercolor{color:#333;font-size:18px;font-weight:bold;}
.ie6{background-color:#1e0bd1}
.ie7{background-color:#a200ff}
.ie8{background-color:#00deff}
.firefox{background-color:#4eff00}
.opera{background-color:#4cac70}
.other{background-color:#f1ee18;}

#tipTable td,#tipTable th{border:1px solid black;width:56px;height:16px;text-align:center;}
#wordTable td{margin-left:8px;}
#firefoxTip{display:none;}
#firefoxTip, x:-moz-any-link, x:default{display:block;/*IE7 firefox3.5及以下 识别 */+display:none/*再区分一次IE7*/}
@-moz-document url-prefix(){#firefoxTip{display:block;/*仅 firefox 识别 */}}
#ChromeTip{display:none;}
@media screen and (-webkit-min-device-pixel-ratio:0){#ChromeTip{display:block;}}{} /* safari(Chrome) 有效 */
@media all and (min-width: 0px){#ChromeTip{display:none\0;} /* 仅 Opera 有效 */ }{}
</style>
</head>
<body>
<table class="browsers" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td>IE6</td>
<td></td>
<td>IE7</td>
<td></td>
<td>IE8</td>
<td></td>
<td>Firefox</td>
<td></td>
<td>Opera</td>
<td></td>
<td>Safari(Chrome)</td>
<td></td>
</tr>
<tr class="browsercolor">
<td class="ie6">IE6</td>
<td></td>
<td class="ie7">IE7</td>
<td></td>
<td class="ie8">IE8</td>
<td></td>
<td class="firefox">Firefox</td>
<td></td>
<td class="opera">Opera</td>
<td></td>
<td class="other">Safari(Chrome)</td>
<td></td>
</tr>
</table>
<div class="bb">
<span style="display:none;display:block\0;display:none\9;">Opera的辨别色是深绿色,Opera游览器很时髦么。</span >
<span id="firefoxTip">Firefox的辨别色是浅绿色,Firefox是很强大的游览器。</span >
<span id="ChromeTip">Safari和Chrome的辨别色是金黄色,Safari和Chrome使用的都是Webkit内核</span >

<!--[if IE 8]>IE8的辨别色是蓝色,新版IE8的功能可是不少呢。<![endif]-->

<!--[if IE 7]>IE7的辨别色是紫色,IE7还可以凑合着用!<![endif]-->

<!--[if IE 6]>IE6的辨别色是红色,不过,IE6可是有点落后了!<![endif]-->
</div>
</body>
</html>
[/cce_html]

koala 编译scss不支持中文解决方案

scss文件编译时候使用ruby环境,出现

Syntax error: Invalid GBK character “\xE5”

检查了好久才发现 scss编译不支持中文字体,请教了下度娘才找到解决方案

解决方法很简单

进入到Koala 安装目录

D:\Koala\rubygems\gems\sass-3.4.9\lib\sass
修改 engine.rb 文件

在require 最下面 加入以下代码 即可解决

Encoding.default_external = Encoding.find('utf-8')