notepad++设置多行多个光标多列编辑功能
启用方法:设置→首选项→编辑→多列编辑→启动(ctrl+mouse click/selection) 打勾
启用后,按ctrl+鼠标左键点击或者选中多个内容可以实现多处同时输入或替换的功能
另外,选择矩形块内容的方法:
鼠标:alt+滑鼠左鍵拖拉選取。
鍵盤:alt+shift+方向鍵。
启用方法:设置→首选项→编辑→多列编辑→启动(ctrl+mouse click/selection) 打勾
启用后,按ctrl+鼠标左键点击或者选中多个内容可以实现多处同时输入或替换的功能
另外,选择矩形块内容的方法:
鼠标:alt+滑鼠左鍵拖拉選取。
鍵盤:alt+shift+方向鍵。
JS
function convertCurrency(money) {
//汉字的数字
var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
//基本单位
var cnIntRadice = new Array('', '拾', '佰', '仟');
//对应整数部分扩展单位
var cnIntUnits = new Array('', '万', '亿', '兆');
//对应小数部分单位
var cnDecUnits = new Array('角', '分', '毫', '厘');
//整数金额时后面跟的字符
var cnInteger = '整';
//整型完以后的单位
var cnIntLast = '元';
//最大处理的数字
var maxNum = 999999999999999.9999;
//金额整数部分
var integerNum;
//金额小数部分
var decimalNum;
//输出的中文金额字符串
var chineseStr = '';
//分离金额后用的数组,预定义
var parts;
if (money == '') { return ''; }
money = parseFloat(money);
if (money >= maxNum) {
//超出最大处理数字
return '';
}
if (money == 0) {
chineseStr = cnNums[0] + cnIntLast + cnInteger;
return chineseStr;
}
//转换为字符串
money = money.toString();
if (money.indexOf('.') == -1) {
integerNum = money;
decimalNum = '';
} else {
parts = money.split('.');
integerNum = parts[0];
decimalNum = parts[1].substr(0, 4);
}
//获取整型部分转换
if (parseInt(integerNum, 10) > 0) {
var zeroCount = 0;
var IntLen = integerNum.length;
for (var i = 0; i < IntLen; i++) {
var n = integerNum.substr(i, 1);
var p = IntLen - i - 1;
var q = p / 4;
var m = p % 4;
if (n == '0') {
zeroCount++;
} else {
if (zeroCount > 0) {
chineseStr += cnNums[0];
}
//归零
zeroCount = 0;
chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
}
if (m == 0 && zeroCount < 4) {
chineseStr += cnIntUnits[q];
}
}
chineseStr += cnIntLast;
}
//小数部分
if (decimalNum != '') {
var decLen = decimalNum.length;
for (var i = 0; i < decLen; i++) {
var n = decimalNum.substr(i, 1);
if (n != '0') {
chineseStr += cnNums[Number(n)] + cnDecUnits[i];
}
}
}
if (chineseStr == '') {
chineseStr += cnNums[0] + cnIntLast + cnInteger;
} else if (decimalNum == '') {
chineseStr += cnInteger;
}
return chineseStr;
}PHP
public static function toChineseNumber($money)
{
if (!$money) {
return '';
}
$money = round($money, 2);
$cnynums = array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
$cnyunits = array("圆", "角", "分");
$cnygrees = array("拾", "佰", "仟", "万", "拾", "佰", "仟", "亿");
list($int, $dec) = explode(".", $money, 2);
$dec = array_filter(array($dec[1], $dec[0]));
$ret = array_merge($dec, array(implode("", static::cnyMapUnit(str_split($int), $cnygrees)), ""));
$ret = implode("", array_reverse(static::cnyMapUnit($ret, $cnyunits)));
return str_replace(array_keys($cnynums), $cnynums, $ret);
}
private static function cnyMapUnit($list, $units)
{
$ul = count($units);
$xs = array();
foreach (array_reverse($list) as $x) {
$l = count($xs);
if ($x != "0" || !($l % 4))
$n = ($x == '0' ? '' : $x) . ($units[($l - 1) % $ul]);
else
$n = is_numeric($xs[0][0]) ? $x : '';
array_unshift($xs, $n);
}
return $xs;
} 【制作自签名证书】
一、预备工作
1、检查是否安装了openssl (一般自带有)
rpm -qa | grep openssl2、
预备工作:避免生成证书时 报错“ /etc/pki/CA/index.txt: No such file or directory ”
vim /etc/pki/tls/openssl.cnf 查到dir的目录,一般是/etc/pki/CA
cd /etc/pki/CA
ls执行
touch index.txt
touch serial
echo "01" > serial
mkdir /etc/pki/CA/newcerts3、开始生成证书
mkdir caroll-ca
cd caroll-ca二、制作CA证书
openssl genrsa -des3 -out ca.key 2048 1、生成CA的私钥
输入密码,这里我输入1234
可以看到当前目录底下生成了ca.key
2、生成CA公钥
openssl req -new -x509 -days 7305 -key ca.key -out ca.crt 重复输入密码。这里我输入1234,然后填写一些信息,后面三项可以不填
当前目录底下生成公钥
三、制作网站的证书
1、生成证书私钥
openssl genrsa -des3 -out *.bigmen.cn.pem 1024 输入两次密码,这里我输入1234,然后可查到当前目录生成了对应的pem文件
2、 将私钥解密生成key
openssl rsa -in *.bigmen.cn.pem -out *.bigmen.cn.key这一步很重要,否则拿到的是加密的私钥,无法直接使用 。这里之前的文章也有提过哟,不解密的话会在证书上传腾讯云控制台的时候报错,详情可以参考:https://cloud.tencent.com/developer/article/1452843
3、生成证书请求
openssl req -new -key *.bigmen.cn.pem -out *.bigmen.cn.csr当前目录底下生成csr文件
四、证书签名
【证书签名】
openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in *.bigmen.cn.csr -out *.bigmen.cn.crt 证书期限1460天就是4年
连续输入两个y
证书已经生成
//css
<style>
.expandingArea{
position:relative;
}
.expandingArea span{
display: block;
padding: 8px 12px;
line-height: 1.42857143;
font-size: 14px;
}
.expandingArea textarea{
position:absolute;
top:0;
left:0;
height:100%;
}
</style>
//html
<div class="expandingArea"><pre style="display:block;visibility:hidden;"><span></span></pre><textarea rows="1" style="position:absolute;top:0;left:0;height:100%;" class="form-control money-input remark" <?=$action != 'edit'?'disabled': '' ?> ><%=d[i].remark%></textarea></div>
//js
$(function () {
$("#qudao_data").on('keyup change blur', '.money-input.remark', function () {
//编辑框自适应高度
var text = $(this).val()
$(this).parents(".expandingArea").find('pre span').text(text)
})
})jQuery autoResize 插件实现:
/*
* jQuery autoResize (textarea auto-resizer)
* @copyright James Padolsey http://james.padolsey.com
* @version 1.04
*/
(function ($) {
$.fn.autoResize = function (options) {
// Just some abstracted details,
// to make plugin users happy:
var settings = $.extend({
onResize: function () {
},
animate: true,
animateDuration: 150,
animateCallback: function () {
},
extraSpace: 20,
limit: 1000
}, options);
// Only textarea's auto-resize:
this.filter('textarea').each(function () {
// Get rid of scrollbars and disable WebKit resizing:
var textarea = $(this).css({resize: 'none', 'overflow-y': 'hidden'}),
// Cache original height, for use later:
origHeight = textarea.height(),
// Need clone of textarea, hidden off screen:
clone = (function () {
// Properties which may effect space taken up by chracters:
var props = ['height', 'width', 'lineHeight', 'textDecoration', 'letterSpacing'],
propOb = {};
// Create object of styles to apply:
$.each(props, function (i, prop) {
propOb[prop] = textarea.css(prop);
});
// Clone the actual textarea removing unique properties
// and insert before original textarea:
return textarea.clone().removeAttr('id').removeAttr('name').css({
position: 'absolute',
top: 0,
left: -9999
}).css(propOb).attr('tabIndex', '-1').insertBefore(textarea);
})(),
lastScrollTop = null,
updateSize = function () {
// Prepare the clone:
clone.height(0).val($(this).val()).scrollTop(10000);
// Find the height of text:
var scrollTop = Math.max(clone.scrollTop(), origHeight) + settings.extraSpace,
toChange = $(this).add(clone);
// Don't do anything if scrollTip hasen't changed:
if (lastScrollTop === scrollTop) {
return;
}
lastScrollTop = scrollTop;
// Check for limit:
if (scrollTop >= settings.limit) {
$(this).css('overflow-y', '');
return;
}
// Fire off callback:
settings.onResize.call(this);
// Either animate or directly apply height:
settings.animate && textarea.css('display') === 'block' ?
toChange.stop().animate({height: scrollTop}, settings.animateDuration, settings.animateCallback)
: toChange.height(scrollTop);
};
// Bind namespaced handlers to appropriate events:
textarea
.unbind('.dynSiz')
.bind('keyup.dynSiz', updateSize)
.bind('keydown.dynSiz', updateSize)
.bind('change.dynSiz', updateSize);
});
// Chain:
return this;
};
})(jQuery); 我们经常看到Mysql的explain语句执行结果Extra字段有using temporary、using filesort,理解这两个短语的含义,有助于进行SQL语句的优化。
什么是临时表(temporary table)
顾名思义,临时表也是一张表,只不过不是持久的,当会话结束,临时表就会被删除掉。
什么是文件排序(filesort)
文件排序是相对于索引排序而言的,当不能使用索引生成排序结果的时候,mysql需要进行文件排序,排序可能是在内存中进行的,也可能需要磁盘文件的辅助。当待排序的数据量小于排序缓冲区(sort buffer)的大小时,排序直接在内存中进行,否则就需要磁盘文件的辅助进行排序,无论是哪种情况,mysql并没有进行区分,统一使用filesort来表示。
mysql的关联查询是如何执行的
mysql对所有的关联查询都是通过循环嵌套来执行的。简单的讲,表1位于外层循环,表2位于内层循环,每次首先从外层循环中取出一条数据,然后在内存循环中进行匹配,匹配到的作为结果进行返回。下面的语句及其伪代码表示了实际的执行过程。
关联查询order by执行的两种情况
关联查询中如果有order by排序语句,排序的过程会分为两种情况。
第一种,order by语句中排序的列全部都出现在表1中,那么mysql在关联处理第一个表时就会进行文件排序,也就是在执行关联查询的外层循环时就进行排序,此时,mysql的explain结果中可以看到extra字段会看到using filesort.
第二种,除了第一种情况之外,mysql都会先将关联查询的结果存放到一张临时表中,然后在所有的关联都结束后,再进行文件排序,此时mysql的explain语句的extra字段就会看到using temporary;using filesort.