首页
免费后端云服务
关于
推荐
免费图床源码
Search
1
小程序后端入门系列视频教程【一-微信开发工具介绍】
9,722 阅读
2
微信小程序三级联动之多列选择器
9,606 阅读
3
小程序开发免费后端之神秘利器分享
9,536 阅读
4
Golang-开发企业级资源权限管理【第一步表设计】-1
9,081 阅读
5
学会微信服务端开发第一步
8,979 阅读
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
登录
Search
Magic
累计撰写
124
篇文章
累计收到
68
条评论
首页
栏目
日常记录
日常
随笔
Bmob后端云
从零开始学物联网
Serverless实战驾校小程序
心邮
Serverless
向量数据库
页面
免费后端云服务
关于
推荐
免费图床源码
搜索到
51
篇与
的结果
2016-07-17
mongodb运维(3)-db-currentOp与db-killOp命令
好久没更新mongo运维这块知识了,这次介绍 db.currentOp与db.killOp命令数据库优化方法有很多,但所有数据库优化都离不开慢查询优化。mysql、mongodb都可以开启慢查询,来对数据库查询进行分析。开启慢查询日志,对性能会有一定的影响。mongoDB 有时我们只想临时看下慢查询日志,应该如何处理。这时,我们可以用到mongdb的db.currentOp命令 ,他可以列出当前真正跑的op相关信息。1.查看目前正在执行的所有查询语句db.currentOp();2.查询所有操作xxx集合并且执行时间已超过3s的请求db.currentOp( { "active" : true, "secs_running" : { "$gt" : 3 }, "ns" : /^xxx\./ } )3. 当然,如果我当前db集群有非常多的集合,我也可以不限制xxx集合db.currentOp( { "active" : true, "secs_running" : { "$gt" : 3 } } )currentOp的过滤条件包括请求操作类型,insert、update、delete…请求对应的connectionId,threadId请求是否正在等待锁请求执行时间请求操作的DB或collection请求query的内容…等等返回结果如下{ "desc" : "conn44266", "threadId" : "140419266524928", "connectionId" : 44266, "client" : "10.10.68.209", "active" : true, "opid" : 4495651, "secs_running" : 25, "microsecs_running" : NumberLong(25459008), "op" : "command", "ns" : "xxxxx", "query" : { "count" : "c74dc2de71", "query" : { "video" : { "$exists" : true }, "_isdel" : 0, "deleted" : { "$ne" : true }, "verify" : { "$ne" : false } } }, "planSummary" : "IXSCAN { video: 1 }", "numYields" : 189, "locks" : { "Global" : "r", "Database" : "r", "Collection" : "r" }, "waitingForLock" : false, "lockStats" : { "Global" : { "acquireCount" : { "r" : NumberLong(380) } }, "Database" : { "acquireCount" : { "r" : NumberLong(190) } }, "Collection" : { "acquireCount" : { "r" : NumberLong(190) } } } }当我们知道某条语句是锁库的罪魁祸首的时候,我们就可以通过另一条语句,干掉对应的请求。killOp 停止正在执行的查询用法:db.killOp(opid)目前Mongodb手册,还未有一次清掉当前所有查询,文档地址:https://docs.mongodb.com/manual/reference/method/db.killOp/执行后返回{ "info" : "attempting to kill op", "ok" : 1 }db.killOp(opid)的实现原理如下每个连接对应的服务线程存储了一个killPending的字段,当发送killOp时,会将该字段置1;请求在执行过程中,可以通过不断的调用OperationContext::checkForInterrupt()来检查killPending是否被设置,如果被设置,则线程退出。一个请求要支持killOp,必须在请求的处理逻辑里加上checkForInterrupt()检查点才行,否则即使发送了killOp,也只能等待请求完全处理完毕线程才会退出。比如createIndex的处理逻辑里包含了类似如下的代码,在createIndex的循环过程中,一旦killPending被置1了,createIndex的执行可以在当前循环结束时退出。while (!createIndexFinished) { createIndexForOneElement(); checkForInterupt(); }所以发送killOp后,请求要执行到下一个『检查点』线程才会退出,MongoDB在很多可能耗时长的请求中,都加入了checkForInterrupt()检查点,如创建索引,repair database,mapreduce、aggregation等。批量一次清楚当前慢查询上面说还未有一次清掉当前所有查询, 不过我们可以通过手动写脚本实现。此脚本由diggzhang大神贡献。文章链接:http://yangcongchufang.com/kill-mongo-ops.html实现功能:传入自己的IP地址,强制关停自己的异常查询。打开家目录下的.mongorc.js拷贝下面的killMyRunningOps函数进去,重新打开mongoshell即可加载这个函数(mongoshell启动时会预读这个文件)。➜ ~ cat ~/.mongorc.jskillMyRunningOps = function (clientIp) { var currOp = db.currentOp(); for (op in currOp.inprog) { if (clientIp == currOp.inprog[op].client.split(":")[0]) { db.killOp(currentOp.inprog[op].opid) } } }用法很简单,知道自己IP后,调用这个函数:> killMyRunningOps("12.23.32.21")
2016年07月17日
7,447 阅读
0 评论
12 点赞
2016-06-06
Shadow socks 配置
(1) 安装Shadowsocks和Chrome brew install shadowsocks-libev brew cask install google-chrome (2) 安装Chrome插件Proxy SwitchySharp https://chrome.google.com/webstore/detail/proxy-switchysharp/dpplabbmogkhghncfbfdeeokoefdjegm (3) 配置 emacs /usr/local/etc/shadowsocks-libev.json 修改下面的配置 { "server":"", "server_port":, "local_port":, "password":"", "timeout":600, "method":"aes-256-cfb" } 服务器请到https://get发邮件获取,配置完成后是如下: { "server":"hongxchen.github.io", "server_port":1080, "local_port":8104, "password":"abc", "timeout":600, "method":"aes-256-cfb" } 注意:method字段一定要小写 (4) 配置Proxy SwitchySharp 1. 添加新的的配置New Profile 2. Profile Name:Shadowsocks 3. 选择Manual Configuration 4. 在SOCKS Host中填入127.0.0.1和shadowsocks-libev.json中设置的local_port,如8104。HTTP Proxy,HTTPS Proxy,FTP Proxy空着不填。 5. 选择SOCKS v5 6. 切换到 Switch Rules 7. 勾选Enable Switch Rules 8. 勾选Online Rule List,在Rule List URL中填入**list.googlecode.com/svn/trunk/**list.txt,Proxy Profile选择Shadowsocks 9. 勾选AutoProxy Compatible List (5) 测试 终端执行 /usr/local/opt/shadowsocks-libev/bin/ss-local -c /usr/local/etc/shadowsocks-libev.json 打开Chrome,Proxy SwitchySharp选择Auto Switch Mode 打开www.youtube.com等被墙网站,如果不能打开则https://get发邮件获取其他服务的的配置 (6) 开机启动 Ctrl+C关闭在终端中打开执行的ss-local 制作/usr/local/opt/shadowsocks-libev/homebrew.mxcl.shadowsocks-libev.plist文件的软连接到~/Library/LaunchAgents % ln -s /usr/local/opt/shadowsocks-libev/homebrew.mxcl.shadowsocks-libev.plist ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist (7) 加载配置文件 launchctl load ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist ** 卸载为launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist (8) 完成 到此配置完成,以后开机打开Chrome就能够翻出墙外,.shadowsocks.net/get提供的服务器在一段时间后可能不能连接,只需关闭服务在shadowsocks-libev.json文件中写入新的配置项,重新启动服务就行了。 launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist emacs /usr/local/etc/shadowsocks-libev.json launchctl load ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist 转:
2016年06月06日
9 阅读
0 评论
0 点赞
2016-03-26
Unix、Linux、mac 内核系统 Sublime 2、3 配置php code sniffer插件
好久没更新自己博客了,今天正好给同事们写一篇sublime 如何配置php code sniffer,发现国内还没有一个比较完善的教程,所以把它放到网上。 一、windows PHPSTORM 配置php code sniffer插件。二、MAC OS PHPSTORM 配置php code sniffer插件。三、MAC OS Sublime 3 配置php code sniffer插件。一、windows PHPSTORM 配置php code sniffer插件。1. 点击菜单:File->Settings 或 按快捷键 Ctrl+Alt+S2. 选择Project Settings下的:PHP->Code Sniffer3. 设置PHP Code Sniffer(phpcs) path为:E:\wamp\bin\pear\phpcs.bat(根据自己电脑情况设置)4. 点击Validate按钮,可以看到如下提示,说明设置OK为知笔记图片5. 选择Project Settings下的Inspections,展开PHP,勾选PHP Code Sniffer validation为知笔记图片6. 第一次打开的时候,需要点击一下刷新的按钮可以获取已安装的代码规范,如果无法获取到代码规范的话,先执行 phpcs -i命令查看PHP_CodeSniffer中已经安装的编码风格,确定有之后,尝试重启一下PhpStorm在刷新看看7. 选择一个你习惯的编码风格,然后Apply配置为知笔记图片 8. 打开一个PHP文件,就可以看到不符合规则的提示为知笔记图片二、MAC OS PHPSTORM 配置php code sniffer插件。设置PHP Code Sniffer(phpcs) path为:/usr/local/bin/phpcs2. 点击Validate按钮,可以看到如下提示,说明设置OK为知笔记图片3.启用代码风格为知笔记图片4.演示效果为知笔记图片三、MAC OS Sublime 3 配置php code sniffer插件。1.系统安装PHP_CodeSniffer、phpmd、php-cs-fixer pear install PHP_CodeSniffer brew install phpmd sudo curl -o /usr/local/bin/php-cs-fixer sudo chmod a+x /usr/local/bin/php-cs-fixer 2.sublime 2 安装 phpcs插件(安装方法(Ctrl+Shift+P->pi(packageinstall)->phpcs,安装成功后右键即可看到PHP Code Sniffer选项))为知笔记图片3.刚刚安装好的插件,sniff this file 显示的是灰色的,修改下配置文件(这是 Sublime 2的配置) Sublime3的配置有所区别,请自行检查。 1. { 2. // *nix based systems, Mac OS X and Linux 3. // - All commands on and using PATHS 4. 5. // We want debugging on 6. "show_debug": true, 7. 8. // Only execute for .php files 9. "extensions_to_execute": ["php"], 10. 11. // Do not execute for twig files 12. "extensions_to_blacklist": ["twig.php"], 13. 14. // Execute the sniffer on file save 15. "phpcs_execute_on_save": false, 16. 17. // Show the error list after save. 18. "phpcs_show_errors_on_save": true, 19. 20. // Show the errors in the gutter 21. "phpcs_show_gutter_marks": true, 22. 23. // Show outline for errors 24. "phpcs_outline_for_errors": true, 25. 26. // Show the errors in the status bar 27. "phpcs_show_errors_in_status": true, 28. 29. // Show the errors in the quick panel so you can then goto line 30. "phpcs_show_quick_panel": true, 31. 32. 33. // PHP_CodeSniffer settings 34. // Run the PHP_CodeSniffer 35. "phpcs_sniffer_run": true, 36. 37. // Execute PHP_CodeSniffer on save 38. "phpcs_command_on_save": true, 39. 40. // Path to phpcs 41. "phpcs_executable_path": "/usr/local/bin/phpcs", 42. 43. // Run the PEAR standard without warnings 44. "phpcs_additional_args": { 45. "--standard": "PEAR", 46. "-n": "" 47. }, 48. 49. 50. // PHP-CS-Fixer settings 51. // Do not automatically fix the errors 52. "php_cs_fixer_on_save": false, 53. 54. // Show the fixes in the quick panel 55. "php_cs_fixer_show_quick_panel": true, 56. 57. // Path to where php-cs-fixer.phar is 58. "php_cs_fixer_executable_path": "/usr/local/bin/php-cs-fixer", 59. 60. // Run all levels of fixing 61. "php_cs_fixer_additional_args": { 62. }, 63. 64. 65. // PHP Linter settings 66. // Lint each file 67. "phpcs_linter_run": true, 68. 69. // Execute the linter on save 70. "phpcs_linter_command_on_save": true, 71. 72. // Use the $PATH version of php 73. "phpcs_php_path": "/usr/local/bin/phpcs", 74. 75. // Regex for the errors the linter produces 76. "phpcs_linter_regex": "(?P.*) on line (?P\d+)", 77. 78. 79. // PHP Mess Detector settings 80. // Execute phpmd 81. "phpmd_run": true, 82. 83. // Execute the phpmd on file save 84. "phpmd_command_on_save": true, 85. 86. // Path to where the phpmd application is 87. "phpmd_executable_path": "/usr/local/bin/phpmd", 88. 89. // What args I want to pass to phpmd 90. "phpmd_additional_args": { 91. "codesize,unusedcode,naming": "" 92. }, 93. 94. // PHP Scheck settings 95. // Execute scheck 96. "scheck_run": false, 97. 98. // Execute the scheck on file save 99. "scheck_command_on_save": false, 100. 101. // It seems python/sublime cannot always find the scheck application 102. // If empty, then use PATH version of scheck, else use the set value 103. "scheck_executable_path": "", 104. 105. // Additional arguments you can specify into the application 106. "scheck_additional_args": { 107. "-strict" : "" 108. } 109. } 4.完成为知笔记图片PS:如submit 出现报错,可显示调试信息调试具体问题 Ctrl+~;如再有问题,可联系我。 为知笔记图片
2016年03月26日
9 阅读
0 评论
0 点赞
2016-01-29
基于向量检索服务与TextEmbedding实现语义搜索
本教程演示如何使用向量检索服务(DashVector),结合上的[EmbeddingAPI](https://help.aliyun.com/zh/dashscope/developer-reference/api-details-15),来从0到1构建基于文本索引的构建+向量检索基础上的语义搜索能力。具体来说,我们将基于QQ 浏览器搜索标题语料库(:QQBrowser Query Title Corpus)进行实时的文本语义搜索,查询{BANNED}{BANNED}最佳佳相似的相关标题。什么是 Embedding简单来说,Embedding是一个多维向量的表示数组,通常由一系列数字组成。Embedding可以用来表示任何数据,例如文本、音频、图片、视频等等,通过Embedding我们可以编码各种类型的非结构化数据,转化为具有语义信息的多维向量,并在这些向量上进行各种操作,例如相似度计算、聚类、分类和推荐等。整体流程概述Embedding:通过DashScope提供的通用文本向量模型,对语料库中所有标题生成对应的embedding向量。构建索引服务和查询:通过DashVector向量检索服务对生成embedding向量构建索引。将查询文本embedding向量作为输入,通过DashVector搜索相似的标题。具体操作流程前提条件开通灵积模型服务,并获得 API-KEY:开通DashScope并创建API-KEY。开通DashVector向量检索服务,并获得 API-KEYAPI-KEY管理。1、环境安装说明需要提前安装 Python3.7 及以上版本,请确保相应的 python 版本。 pip3 install dashvector dashscope 2、数据准备(QBQTC, QQ Browser Query Title Corpus),是QQ浏览器搜索引擎目前针对大搜场景构建的一个融合了相关性、权威性、内容质量、时效性等维度标注的学习排序(LTR)数据集,广泛应用在搜索引擎业务场景中。作为CLUE-beanchmark的一部分,QBQTC数据集可以直接从github上下载(训练集路径为dataset/train.json)。 git clone https://github.com/CLUEbenchmark/QBQTC.git wc-l QBQTC/dataset/train.json 数据集中的训练集(train.json)其格式为 json: { "id":0, "query":"小孩咳嗽感冒", "title":"小孩感冒过后久咳嗽该吃什么药育儿问答宝宝树", "label":"1" } 我们将从这个数据集中提取title,方便后续进行embedding并构建检索服务。 import json def prepare_data(path,size): with open(path,'r',encoding='utf-8')as f: batch_docs=[] forlineinf: batch_docs.append(json.loads(line.strip())) iflen(batch_docs)==size: yield batch_docs[:] batch_docs.clear() ifbatch_docs: yield batch_docs 3、通过 DashScope 生成 Embedding 向量DashScope灵积模型服务通过标准的API提供了多种模型服务。其中支持文本Embedding的模型中文名为通用文本向量,英文名为text-embedding-v1。我们可以方便的通过DashScope API调用来获得一段输入文本的embedding向量。说明需要使用您的api-key替换示例中的 your-dashscope-api-key ,代码才能正常运行。 import dashscope from dashscope import TextEmbedding dashscope.api_key='{your-dashscope-api-key}' def generate_embeddings(text): rsp=TextEmbedding.call(model=TextEmbedding.Models.text_embedding_v1, input=text) embeddings=[record['embedding']forrecordinrsp.output['embeddings']] return embeddingsifisinstance(text,list)elseembeddings[0] # 查看下embedding向量的维数,后面使用 DashVector 检索服务时会用到,目前是1536 print(len(generate_embeddings('hello'))) 4、通过 DashVector 构建检索:向量入库DashVector向量检索服务上的数据以集合(Collection)为单位存储,写入向量之前,我们首先需要先创建一个集合来管理数据集。创建集合的时候,需要指定向量维度,这里的每一个输入文本经过DashScope上的text_embedding_v1模型产生的向量,维度统一均为1536。DashVector 除了提供向量检索服务外,还提供倒排过滤功能 和 scheme free功能。所以我们为了演示方便,可以写入数据时,可以将title内容写入 DashVector 以便召回。写入数据还需要指定 id,我们可以直接使用 QBQTC中id。说明需要使用您的api-key替换示例中的 your-dashvector-api-key ,以及您的Cluster Endpoint替换示例中的your-dashvector-cluster-endpoint ,代码才能正常运行。 from dashvector import Client,Doc # 初始化 DashVector client client=Client( api_key='{your-dashvector-api-key}', endpoint='{your-dashvector-cluster-endpoint}' ) # 指定集合名称和向量维度 rsp=client.create('sample',1536) assert rsp collection=client.get('sample') assert collection batch_size=10 fordocsinlist(prepare_data('QBQTC/dataset/train.json',batch_size)): # 批量 embedding embeddings=generate_embeddings([doc['title']fordocindocs]) # 批量写入数据 rsp=collection.insert( [ Doc(id=str(doc['id']),vector=embedding,fields={"title":doc['title']}) fordoc,embeddinginzip(docs,embeddings) ] ) assert rsp 5、语义检索:向量查询在把QBQTC训练数据集里的title内容都写到DashVector服务上的集合里后,就可以进行快速的向量检索,实现“语义搜索”的能力。继续上面代码的例子,假如我们要搜索有多少和'应届生招聘'相关的title内容,可以通过在DashVector上去查询'应届生 招聘',即可迅速获取与该查询语义相近的内容,以及对应内容与输入之间的相似指数。 # 基于向量检索的语义搜索 rsp=collection.query(generate_embeddings('应届生 招聘'),output_fields=['title']) fordocinrsp.output: print(f"id: {doc.id}, title: {doc.fields['title']}, score: {doc.score}") id:0,title:实习生招聘-应届生求职网,score:2523.1582 id:6848,title:应届生求职网校园招聘yingjieshengcom中国领先的大学生求职网站,score:3053.7095 id:8935,title:北京招聘求职-前程无忧,score:5100.5684 id:5575,title:百度招聘实习生北京实习招聘,score:5451.4155 id:6500,title:中公教育招聘信息网-招聘岗位-近期职位信息-中公教育网,score:5656.128 id:7491,title:张家口招聘求职-前程无忧,score:5834.459 id:7520,title:前程无忧网北京前程无忧网招聘,score:5874.412 id:3214,title:乡镇卫生院招聘招聘乡镇卫生院招聘信息+-58同城,score:6005.207 id:6507,title:赶集网招聘实习生北京实习招聘,score:6424.9927 id:5431,title:实习内容安排百度文库,score:6505.735
2016年01月29日
7 阅读
0 评论
0 点赞
2016-01-10
html表格自定义显示列
后台统计,有个表,有60个字段要显示。这时如果页面一次性全部展示出来,大部分屏幕可能不够宽度。这时就需要固定表格列,但如果只是固定列,太多列了还是比较难查看自己需要的列,这时比较优的方案是,每个账号可以选择显示哪些列显示隐藏。http://www.layui.com/demo/table/fixed.html前端实现固定表格列,有很多插件框架实现,这里主要讲下,配合后端实现整个交互逻辑。相关技术点固定表格列字段选择穿梭框数据库保存隐藏字段固定表格列,这里用插件layuihttp://www.layui.com/demo/table/fixed.html字段选择穿梭框,使用 bootstrap的双边栏选择框http://www.jq22.com/jquery-info15984数据库保存隐藏字段,这个搭建用任何后端语言都可以实现,这里用PHP。代码,穿梭框与后端实现交互function getData(){ return new Promise(function(resolve, reject){ $.getJSON('/admin/ad/getField', {}, function (res) { field = res.tableFile console.log(res); resolve(res); //reject( }) }); } getData().then(function(res){ field = res.tableFile $(document).ready(function () { var demo2 = $('.demo').doublebox({ nonSelectedListLabel: '显示列', selectedListLabel: '隐藏列', preserveSelectionOnMove: 'moved', moveOnSelect: false, nonSelectedList: res.show, selectedList: res.hide, optionValue: "field", optionText: "fieldName", doubleMove: true, }); layui.use('table', function () { var table = layui.table; var w = document.body.scrollWidth - 50; var h = document.body.scrollHeight - 390; table.render({ elem: '#test', limit: 10 , url: '/admin/ad/getData?Ad[type]='+<?php echo isset($_GET['Ad']['type'])?intval($_GET['Ad']['type']):1 ?> , width: w , height: h , cols: [field] , page: true }); }); }) }); 后台API返回对应的显示列,即可,格式如下 { "show":[ { "field":"date", "fieldName":"时间" }, { "field":"clientName", "fieldName":"广告主名称" }, { "field":"adId", "fieldName":"广告id" }, { "field":"adName", "fieldName":"广告名称" }, { "field":"order_roi", "fieldName":"下单ROI" }, { "field":"quest_reservation_pv", "fieldName":"销售线索量" } ], "hide":[ { "field":"contract_flag", "fieldName":"购买类型" }, { "field":"pos_type", "fieldName":"广告位" }, { "field":"convclk_pv", "fieldName":"可转化点击次数" }, { "field":"convclk_cpc", "fieldName":"可转化点击成本" }, { "field":"clk_pv", "fieldName":"点击人数" }, { "field":"exp_pv_avg", "fieldName":"人均曝光次数" }, { "field":"img_uv", "fieldName":"图片点击人数" }, { "field":"play_pv", "fieldName":"视频点击次数" }, { "field":"play_uv", "fieldName":"视频点击人数" }, { "field":"detail_pv", "fieldName":"文字链点击次数" }, { "field":"ios_act_pv", "fieldName":"IOS激活次数" }, { "field":"download_complete_pv", "fieldName":"APP下载完成次数" }, { "field":"install_complete_pv", "fieldName":"APP安装完成次数" }, { "field":"app_act_pv", "fieldName":"APP激活次数" }, { "field":"app_reg_pv", "fieldName":"APP注册次数" }, { "field":"app_addtocart_pv", "fieldName":"APP加入购物车次数" }, { "field":"app_purchase_pv", "fieldName":"APP付费次数" }, { "field":"card_use_pv", "fieldName":"卡券使用次数" }, { "field":"share_page_pv", "fieldName":"广告分享次数" }, { "field":"share_page_uv", "fieldName":"广告分享人数" }, { "field":"nointerest_pv", "fieldName":"不感兴趣点击次数" } ], "tableFile":[ { "field":"date", "width":140, "title":"时间", "fixed":"left" }, { "field":"clientName", "width":140, "title":"广告主名称", "fixed":"left" }, { "field":"adId", "width":100, "title":"广告id", "fixed":"left" }, { "field":"adName", "width":140, "title":"广告名称", "fixed":"left" }, { "field":"balance", "width":140, "title":"余额", "fixed":"left" }, { "field":"quest_reservation_pv", "width":100, "title":"销售线索量" } ] }最终演示效果
2016年01月10日
6,043 阅读
0 评论
28 点赞
1
2
3
4
...
11