作者:matrix
发布时间:2018 年 9 月 20 日
分类:零零星星
mongodb
和mongo
扩展不同
与mongo扩展不同,此扩展是在»libmongoc和»libbson库之上开发的。它为核心驱动程序功能提供了最小的API:命令,查询,写入,连接管理和BSON序列化。
http://php.net/manual/zh/set.mongodb.php
安装扩展
> sudo pecl install mongodb
显示success
完成安装
Build process completed successfully
Installing '/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/mongodb.so'
install ok: channel://pecl.php.net/mongodb-1.5.2
configuration option "php_ini" is not set to php.ini location
You should add "extension=mongodb.so" to php.ini
配置so文件
一般安装成功会自动配置ini文件,但是还需要自行查看确保正常。
确保so文件配置成功 需要查看/usr/local/php/etc/php.ini
文件末尾是否存在extension=mongodb.so
> sudo echo 'extension=mongodb.so' >> 'php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"'
最后pphinfo()输出查看扩展是否存在
参考:
https://github.com/mongodb/mongo-php-driver
作者:matrix
发布时间:2018 年 9 月 12 日
分类:零零星星
前些时间使用看到Alfred的ocr识别插件workflows插件真心不错,超实用的工具 完全胜任图片文字提取的工作。
mac自带的截图快捷工具我常常使用,但是能够截图之后马上对图片进行内容识别 这倒是很稀奇 至少我是这样。
一般专门的ocr软件我很少用 若要临时应急的话就会很麻烦 因为我需要去查找提供ocr识别服务的三方网站服务 然后进行图片上传 之后再复制内容到剪贴板。像这种情况下有个顺手的小工具是多爽 😆 😆 虽然插件也是使用开源库tesseract-ocr
,但是整合到随手调用这就很少有人做了。
安装tesseract开源库
brew install tesseract #使用brew工具
tesseract --version #查看版本号
配置语言包
tesseract --list-langs #查看当前只是的语言
默认自带英文eng
,简体中文为chi_sim
https://github.com/tesseract-ocr/tessdata
下载chi_sim_vert.traineddata
,chi_sim.traineddata
两文件放至/usr/local/Cellar/tesseract/3.05.02/share/tessdata
。其中3.05.02
为你安装的tesseract版本号
安装workflows
下载OCR
此alfredworkflow被我简单添加了下触发关键字 cn
中文,en
英文
使用
ocr #默认所有中英文语言
ocr cn #指定识别中文
ocr en #指定识别英文
回车截图之后会出现消息通知(响应时间据字符长度而不定)
若内容为空 最好debug查看workflows报错信息
后续问题
自定义修改插件的时候发现有些时候输入的内容无法被Alfred读取 会被自动截断 无任何反应
这里是因为编码转换的问题导致的 确保输入内容以及输出内容的编码 过滤掉特殊字符
php处理:
function force_utf8_safe($str) {
$res = mb_convert_encoding($str, "UTF-8", "UTF-8" ); // replace invalid characters with ?
$res = preg_replace('/\p{Cc}+/u', '?', $res); // replace control characters with ?
return $res;
}
说明:
字符过滤来自于 https://github.com/willfarrell/alfred-encode-decode-workflow
还可以参考它的输入字符处理方式 使用normalise
脚本再处理传入
参考:https://www.alfredforum.com/topic/10141-workflow-arguments-are-always-decomposed/
我的AlfredWorkflows:https://github.com/Hootrix/AlfredWorkflows
参考:
https://www.zhihu.com/question/20656680
https://tonydeng.github.io/2016/07/28/on-the-use-of-tesseract-picture-text-recognition/
PEACE~
作者:matrix
发布时间:2018 年 9 月 7 日
分类:零零星星
Alfred是mac上强大的快速启动工具 可以自定义php/shell/ruby/python脚本执行任意操作。比如快速搜索关键字打开网页 查询字符转码 ip。。。这些都是可以自己定义操作的,只是需要一些脚本语言编写的知识。
windows 上有类型的Wox https://github.com/Wox-launcher/Wox
下载Alfred
官网: https://www.alfredapp.com/
工作流workflows自定义脚本的功能在Alfred中是收费的功能,还好 有可用的版本
nmac.to cracked:https://userscloud.com/o3ibe2w7071h/nmac.to_alf37931b.zip
添加/配置workflows
点击Workflows
切换到工作流选项
窗口左下角 「 help + -」,点击 +
->Blank Workflow
开始新建工作流程
填写名称name
,描述Description
,Bundle id
为自己标记的包名id 要确保唯一性。
右边黑色背景窗口中右键 inputs
->Script Filter
添加自定义执行的脚本
配置执行脚本以及触发的关键字
keyword
为触发的关键字 比如alfred启动框框中输入baidu空格query
,baidu
就是触发脚本的自定义关键字,空格后面的query即为查询的参数下面的
Language`即为脚本语言 这里用的系统自带的权限脚本。
#!/bin/bash
ip=$(ifconfig en0 | grep 'inet .*' | sed 's/^.*inet//g' | sed 's/ netmask.*//g')
cat << EOF
{"items": [
{
"title": "${ip}",
"subtitle": "局域网en0 ip",
"arg": "${ip}"
}
]}
EOF
说明:
使用系统bash 查询ifconfig
命令en0网卡的IP信息 管道命令符|
继续处理sed
截取输出结果。
最后使用cat
输出json数据用于Alfred读取并显示到结果列表
items具体参数释义参考下方alfredapp.com链接。
这里arg
是用于复制粘贴/通知等操作的Alfred变量赋值,否则会没反应。如果只是显示查看 可以只设置title
,subtitle
效果就已经比较好了。
点击save
保存
调试
窗口右边有蜘蛛「🕷️」图标 下方的Log
下拉框 选择 all information
便于查看调试信息
启动
option
+space
启动 输入触发关键字
下载
上面只是操作记录 这里可以直接下载:local ip.alfredworkflow
解压缩 直接打开alfredworkflow文件import导入
参考:
https://www.alfredapp.com/help/workflows/inputs/script-filter/json/
https://www.jianshu.com/p/7e1ea4f296c8
https://sspai.com/post/44624
https://www.jianshu.com/p/e9f3352c785f
作者:matrix
发布时间:2018 年 8 月 29 日
分类:零零星星
MTProxy是专门给Telegram作加密代理的工具,避免平时打开「酸酸乳」之类工具,经常使用TG都订阅了好多消息类的bot,有这样的代理自己搭建更方便打开即用,搭好了之后可以直接点击tg链接即可完成配置。
要搭建此工具需要有一台国外可以正常访问Telegram的vps
环境
root@BareInstructive-VM:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04 LTS
Release: 14.04
Codename: trusty
安装
git clone https://github.com/TelegramMessenger/MTProxy.git
cd MTProxy
make && cd objs/bin
curl -s https://core.telegram.org/getProxySecret -o proxy-secret #获取连接tg的密钥
curl -s https://core.telegram.org/getProxyConfig -o proxy-multi.conf #获取tg服务器ip列表 建议每天定时更新
head -c 16 /dev/urandom | xxd -ps #使用linux系统创建伪随机数 32长度字符
#生成随机数密钥 31c3f028f2faf77e9ab45d5c209aa02c
开启
./mtproto-proxy -u nobody -p 8888 -H 8181 -S 31c3f028f2faf77e9ab45d5c209aa02c --aes-pwd proxy-secret proxy-multi.conf -M 1
说明:
31c3f028f2faf77e9ab45d5c209aa02c为前面的随机密钥
8888为本地监听的端口 用于查看统计数据: curl localhost:8888/stats
8181
为对外提供服务的端口(使用的客户端填写的端口)
出现main loop就是正常开启
测试
tg中打开链接 OPEN:
https://t.me/proxy?server=tg.hhtjim.com&port=8181&secret=31c3f028f2faf77e9ab45d5c209aa02c
tg://proxy?server=tg.hhtjim.com&port=8181&secret=31c3f028f2faf77e9ab45d5c209aa02c
错误
make编译遇见的问题
fatal error: openssl/rand.h: No such file or directory
缺少OpenSSL开发包导致的问题
sudo apt-get install libssl-dev
by:https://linux.cn/article-4147-1.html
- Makefile:94: recipe for target 'objs/bin/mtproto-proxy' failed
sudo apt-get install zlib1g-dev
by:https://github.com/TelegramMessenger/MTProxy/issues/4
参考:
https://www.jianshu.com/p/d40209b94586
https://github.com/TelegramMessenger/MTProxy
https://liball.me/mtproxy/
一键脚本:https://doub.io/shell-jc7/
作者:matrix
发布时间:2018 年 7 月 31 日
分类:零零星星
快速插入当前时间的功能倒是很少需要,只是现在注释的时候需要有时间标记方便查看。windows上的记事本F5
可以获取当前时间,或者手动敲也行。作为IDEA系列的编辑器使用上应该是有这种快捷键的,然而找了大半天的确是没有的。但是有解决办法,还可以自由控制很多快捷关键字。这功能就像java ide中输入sout
中达到快捷输入System.out.println()
的效果 很方便。
测试:PhpStorm for Mac V2018.1
适用于IDEA系列编辑器
添加group
点击右侧的「+」号
这里添加了group
名称为commonInsertTime
,故曰 全局范围插入时间
添加/配置Live Template
这里的Abbreviation
就是触发快捷输入的关键字 time
右侧的Description
为关键字提示的描述信息,可以输入中文的。
填写Template Text 模版变量 $date$
,名称都可以自定义
Expand with
表示触发的操作,默认是输入time
触发关键字之后按tab键触发快捷输入。
然后点击Edit Variables
编辑变量,窗口中会出现刚刚定义的date
,Expresssion
表达式中输入date("yyyy-MM-dd HH:mm:ss")
点击ok保存。
date函数属于官方模版的预定义函数,具体可参考下方IDEA官方资料
来源。
红字提示No application contexts yes
是指没有为当前模板设置使用的语言环境,我这里是所有地方都可以使用 点击Define->Everywhere
。
保存之后在IDEA中任意地方都快速输入当前时间。
输入time
,按Tab键即可。
PEACE~
参考:
https://icewing.cc/post/how-to-insert-template-content-into-phpstorm.html
IDEA官方资料
作者:matrix
发布时间:2018 年 6 月 28 日
分类:零零星星
使用jquery的时候可以直接animate
方法完成滑动滚动条的动作,但是在vue项目中会很蛋疼。
$('.findcar_brand_ul').animate({scrollTop: liheight}, 300);
vue中又没有相关的组件可以调用,载入jquery麻烦,要是需要临时解决的话可以使用js的scrollTop
。
看了网上各路大神的文章才恍悟。要做到渐缓动画 只是需要setTimeOut执行step操作就好,频率快,人眼也就察觉不出。先取使用js操作获取dom的scrollTop
取出需要让滚动条定位的目标位置,之后递增/减setTimeout
操作。
//方法2。js操作
var jump = document.querySelector('#postion');
var total = jump.offsetTop;//要定位的目标滚动条位置
console.log('纵坐标', total)
// var distance = document.documentElement.scrollTop || document.body.scrollTop
var distanceDom = document.querySelector('.findcar_brand_ul');//滚动条所在的容器
var distance = distanceDom.scrollTop;//容器的滚动条照度
// 平滑滚动,每1ms一跳,共20跳
var time = 15;//毫秒
var stepnum = 20;//共20跳
//时长(time*stepnum) ms
var step = total / stepnum //因为除法会出现余数情况 导致最终定位有偏差
if (total > distance) {
// console.log('smoothDown')
// console.log('distance:'+distance)
// console.log('total:'+total)
smoothDown()
} else {
// var newTotal = distance - total + 100
var newTotal = distance - total
step = newTotal / stepnum
// console.log('smoothUp')
smoothUp()
}
function smoothDown () {
if (distance < total) {
// console.log('distance < total')
distance += step
// Firefox
// document.documentElement.scrollTop = distance
// // Chrome
// document.body.scrollTop = distance
distanceDom.scrollTop = distance;
setTimeout(smoothDown, time)
} else {
// console.log('distance < total: else ')
// document.documentElement.scrollTop = total
// // document.body.scrollTop = total
// window.pageYOffset = total
// console.log('standard:'+standard)
distance = total;//将最后一小步的滚动操作的偏移量还原到目标位置。若不加此操作 会导致定位偏移不准的情况出现。因为step = newTotal / stepnum 的值会有除不尽的情况 !!important
// console.log('distance end:'+distance)
distanceDom.scrollTop = distance;
}
}
function smoothUp () {
if (distance > total) {
distance -= step
// // Firefox
// document.documentElement.scrollTop = distance
// // Chrome
// document.body.scrollTop = distance
distanceDom.scrollTop = distance;
setTimeout(smoothUp, time)
} else {
// document.documentElement.scrollTop = total
// document.body.scrollTop = total
// window.pageYOffset = total
distance = total;
distanceDom.scrollTop = distance;
}
}
说明:
demo环境:Vue.version >> "2.2.6"
修改代码使用div中滚动条,取消浏览器窗口滚动条的获取。
代码简单修改了下最终的定位偏移问题。因为step = newTotal / stepnum
至少这能解决问题,还需后面完善。
代码来自@wisewrong
PEACE~
参考:
https://www.cnblogs.com/wisewrong/p/6495726.html
作者:matrix
发布时间:2018 年 5 月 8 日
分类:零零星星
处理返回数据的时候进行json编码/解码可能会因为不是标准的json字符导致出现一系列的连锁反应问题,没有正确的拦截错误信息的显示。
TP5获取器getAttr中进行json处理,结果出现不可预料的false值,且抛出异常 syntax error 语法错误
。很蛋疼啊,明明相应的处理判断,但是错误定位行却是json_encode进行json编码的操作。
后面替换掉以前使用的默认全局函数json()
进行自定义json字符输出,解决。
创建自定义Json类
继承\think\response\Json
<?php
/**
* Created by PhpStorm.
* User: panc
* Date: 2018/5/8
* Time: 上午11:24
*
* 自定义处理json的数据【避免json_encode报错:Syntax error 以及各种杂七杂八的问题】
*/
namespace app\common\output;//自定义命名空间
class json extends \think\response\Json
{
// protected function output($data) //可以自定义重写数据输出即可
}
调用Response类输出
控制器中调用执行
// return json($result);
return new \app\common\output\Json($result);
关键操作如上,虽然只是继承没有任何重写,但是实际上是解决了大问题。可以跟好的控制输出的结果和抛错。
peace~
作者:matrix
发布时间:2018 年 5 月 3 日
分类:零零星星
业务要求按照type,city分组,然后各取前面的100条数据输出,网上找到了类似的需求直接sql语句就可以解决。
测试表结构
CREATE TABLE `esc_catch` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`city` varchar(20) NOT NULL DEFAULT '' COMMENT '城市',
`price` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '报价',
`type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '1,2',
`add_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
解决办法
set @row=0;set @city=''; set @type='';
select a.city,a.price,a.type ,from_unixtime(a.add_time,'%Y-%m-%d %H:%i:%s') as add_time from esc_catch as a
inner join (
SELECT id,add_time, case when (@city = city and @type= type) then @row:=@row+1 else @row:=1 end as rownum, @city:=city as city , @type:=type as type FROM esc_catch order by type,city,add_time desc
) as b on b.id = a.id
where b.rownum>=100 order by b.type,b.city ;
说明:
头部事先声明变量
row
用于统计指定分组下出现的次数,
city
和type
是分组条件
核心在于inner join
的的临时表操作,其中使用变量操作追加rownum
字段
如果变量city
,type
值等同于临时表的同名字段则该行数据排序下标row++,否则为1
@city:=city as city , @type:=type as type 表示给每行数据的字段值赋给变量
之后在inner join内联表 之后使用自定义的rownum
字段b.rownum<=100
进行数量条件的限制即可,最后order by
操作便于查看数据
参考:
https://blog.csdn.net/ylqmf/article/details/39005949
https://blog.csdn.net/woshihaiyong168/article/details/78803655
https://zhidao.baidu.com/question/618263527798895012.html
PEACE~
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
... - 23