首页 文章 精选 留言 我的

精选列表

搜索[代码增强],共10049篇文章
优秀的个人博客,低调大师

使用HanLP增强Elasticsearch分词功能

hanlp-ext 插件源码地址:http://git.oschina.net/hualongdata/hanlp-ext 或 https://github.com/hualongdata/hanlp-ext Elasticsearch 默认对中文分词是按“字”进行分词的,这是肯定不能达到我们进行分词搜索的要求的。官方有一个 SmartCN 中文分词插件,另外还有一个 IK 分词插件使用也比较广。但这里,我们采用 HanLP 这款 自然语言处理工具 来进行中文分词。 ElasticsearchElasticsearch 的默认分词效果是惨不忍睹的。 GET /_analyze?pretty { "text" : ["重庆华龙网海数科技有限公司"] } 输出: { "tokens": [ { "token": "重", "start_offset": 0, "end_offset": 1, "type": "<IDEOGRAPHIC>", "position": 0 }, { "token": "庆", "start_offset": 1, "end_offset": 2, "type": "<IDEOGRAPHIC>", "position": 1 }, { "token": "华", "start_offset": 2, "end_offset": 3, "type": "<IDEOGRAPHIC>", "position": 2 }, { "token": "龙", "start_offset": 3, "end_offset": 4, "type": "<IDEOGRAPHIC>", "position": 3 }, { "token": "网", "start_offset": 4, "end_offset": 5, "type": "<IDEOGRAPHIC>", "position": 4 }, { "token": "海", "start_offset": 5, "end_offset": 6, "type": "<IDEOGRAPHIC>", "position": 5 }, { "token": "数", "start_offset": 6, "end_offset": 7, "type": "<IDEOGRAPHIC>", "position": 6 }, { "token": "科", "start_offset": 7, "end_offset": 8, "type": "<IDEOGRAPHIC>", "position": 7 }, { "token": "技", "start_offset": 8, "end_offset": 9, "type": "<IDEOGRAPHIC>", "position": 8 }, { "token": "有", "start_offset": 9, "end_offset": 10, "type": "<IDEOGRAPHIC>", "position": 9 }, { "token": "限", "start_offset": 10, "end_offset": 11, "type": "<IDEOGRAPHIC>", "position": 10 }, { "token": "公", "start_offset": 11, "end_offset": 12, "type": "<IDEOGRAPHIC>", "position": 11 }, { "token": "司", "start_offset": 12, "end_offset": 13, "type": "<IDEOGRAPHIC>", "position": 12 } ]}可以看到,默认是按字进行分词的。 elasticsearch-hanlpHanLP HanLP 是一款使用 Java 实现的优秀的,具有如下功能: 中文分词词性标注命名实体识别关键词提取自动摘要短语提取拼音转换简繁转换文本推荐依存句法分析语料库工具安装 elasticsearch-hanlp(安装见:https://github.com/hualongdata/hanlp-ext/tree/master/es-plugin)插件以后,我们再来看看分词效果。 GET /_analyze?pretty { "analyzer" : "hanlp", "text" : ["重庆华龙网海数科技有限公司"] } 输出: { "tokens": [ { "token": "重庆", "start_offset": 0, "end_offset": 2, "type": "ns", "position": 0 }, { "token": "华龙网", "start_offset": 2, "end_offset": 5, "type": "nr", "position": 1 }, { "token": "海数", "start_offset": 5, "end_offset": 7, "type": "nr", "position": 2 }, { "token": "科技", "start_offset": 7, "end_offset": 9, "type": "n", "position": 3 }, { "token": "有限公司", "start_offset": 9, "end_offset": 13, "type": "nis", "position": 4 } ]}HanLP 的功能不止简单的中文分词,有很多功能都可以集成到 Elasticsearch 中。 文章来源于羊八井的博客

优秀的个人博客,低调大师

增强型MonkeyRunner 脚本计划

前一段时间写的monkeyrunner资料 http://youxilua.blog.51cto.com/3357586/772666 功能说明: 可以自动安装apk到android模拟器或者android实机 可以截取设定好activity运行在android模拟器或者android实机上的效果图 截图根据设备名和截取时间保存 能够自动设别所有运行中的android模拟器或者android实机 能够自动安装在特定文件夹下所有的apk文件到android模拟器或者实机 功能实现: 环境配置: 设置好android /tootls 和 android /platform-tools 目录的到环境变量中,确保adb命令能够在cmd下正常运行 脚本编写: 该功能需要创建以下几个文件 componentName.txt 使用约定 每一行为需要运行的activity的完整名字 例如: kg.tom/.HandlerThreadActivity kg.monkey/.MonkeyActivity takeSnap.bat @echo off rem 获取当前运行设备 adb devices > devices.txt rem 获取APK文件 dir apk /B > apk.txt rem 运行monkeyrunner 脚本 monkeyrunner work.py xxxx 核心运行脚本: #导入我们需要用到的包和类并且起别名 import sys,time,datetime from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner import MonkeyDevice as md from com.android.monkeyrunner import MonkeyImage as mi deviceslist = [] devices = [] snapshot = [] templist = [] f = open("devices.txt") while True: line = f.readline() if line: templist.append(line.strip()) else: break; f.close() templist.pop() for i in range(len(templist)): deviceslist.append(templist[i].split('\t')) fc = open("componentName.txt") complist = [] while True: comp = fc.readline() if comp: complist.append(comp.strip()) else: break; fc.close() fp = open("apk.txt") apklist = [] while True: apk = fp.readline() if apk: apklist.append(apk.strip()) else: break; print 'apk list :'print apklist print 'start componentName list :' print complist print 'devices list:'print deviceslist for i in range(1,len(deviceslist)): print 'current devices:' print deviceslist[i] devices.append(mr.waitForConnection(1.0,deviceslist[i][0])) #安装apk文件 for j in range(len(apklist)): devices[i-1].installPackage('apk/'+apklist[j]) #启动activity for k in range(len(complist)): print 'current start activity:' print complist[k] devices[i-1].startActivity(component=complist[k]) #设置延时秒数 mr.sleep(5.0) #---------------- #这里可进行一定的UI操作 #---------------- #mr.sleep(3.0) #进行截图 snapshot.append(devices[i-1].takeSnapshot()) print 'end snapshot' #创建时间字符串 t = time.strftime("%Y-%m-%d-%X",time.localtime()) t = t.replace(":","-") #保存截图 package = complist[k].replace('/.','.') snapshot[0].writeToFile('takeSnapshot/'+deviceslist[i][0]+'-'+t+'-'+package+'.png','png'); snapshot.pop() 由于之前毫无编写python的经验,只能写成这样了,欢迎高手补充!!!!!! 使用: 把tools文件夹里面的全部文件,同样放在android sdk tools 文件夹下即可,运行takeSnap.bat就可以获取到多个设备运行时的截图了,这个期间…你可以选择去泡一杯咖啡…耗时情况…看你要测试几个设备,还有如何测试了…… 效果图: 三个虚拟机,在一台实机,测试两个apk在这些设备的运行境况 以下为全部截图文件: 以后可能会更新的部分和改善的地方 1,支持从外部读取monkeyrunner 脚本进行多设备运行…其实..现在这个也可以…只是没写上 2,同一样设备的截图放置在一样设备名的文件,(这个…其实补充起来也很快…不过,要做完善就要判断设备名与创建文件名是否合法等等,不过…我感觉,将所有截图放到一个文件夹下更方便用来比较,就没写了,有兴趣的自行补充…同时,也顺便贴到这里来吧…) 3,由于,本人的脚步编写功底实在是烂,不知道如何在运行环境中设置环境变量,就不得已要在android sdk tools目录 下运行,如果,觉得这个脚步还可以,希望帮忙完善,能够达到在任意目录下… 4,当设备是离线状态无法判断,不过,在以上的脚本中已经实现了获取设备的状态,只是,很少,碰到就懒得补充了…. 5,如果,出现无法连接设备…那么请再运行一遍…如果…还不行…就重启吧…这跟脚本没关系吧…貌似…就是有这种问题… 6,最后,附上下载地址: 本文转自 liam2199 博客,原文链接: http://blog.51cto.com/youxilua/772652 如需转载请自行联系原作者

优秀的个人博客,低调大师

【20160924】GOCVHelper 图像增强部分(3)

//顶帽去光差,radius为模板半径 MatmoveLightDiff(Matsrc,intradius){ Matdst; Matsrcclone=src.clone(); Matmask=Mat::zeros(radius*2,radius*2,CV_8U); circle(mask,Point(radius,radius),radius,Scalar(255),-1); //顶帽 erode(srcclone,srcclone,mask); dilate(srcclone,srcclone,mask); dst=src-srcclone; returndst; } 算法来自于冈萨雷斯《数字图像处理教程》形态学篇章。完全按照教程实现,具备一定作用。 //将DEPTH_8U型二值图像进行细化经典的Zhang并行快速细化算法 //细化算法 voidthin(constMat&src,Mat&dst,constintiterations){ constintheight=src.rows-1; constintwidth=src.cols-1; //拷贝一个数组给另一个数组 if(src.data!=dst.data) src.copyTo(dst); intn=0,i=0,j=0; MattmpImg; uchar*pU,*pC,*pD; boolisFinished=FALSE; for(n=0;n<iterations;n++){ dst.copyTo(tmpImg); isFinished=FALSE;//一次先行后列扫描开始 //扫描过程一开始 for(i=1;i<height;i++){ pU=tmpImg.ptr<uchar>(i-1); pC=tmpImg.ptr<uchar>(i); pD=tmpImg.ptr<uchar>(i+1); for(intj=1;j<width;j++){ if(pC[j]>0){ intap=0; intp2=(pU[j]>0); intp3=(pU[j+1]>0); if(p2==0&&p3==1) ap++; intp4=(pC[j+1]>0); if(p3==0&&p4==1) ap++; intp5=(pD[j+1]>0); if(p4==0&&p5==1) ap++; intp6=(pD[j]>0); if(p5==0&&p6==1) ap++; intp7=(pD[j-1]>0); if(p6==0&&p7==1) ap++; intp8=(pC[j-1]>0); if(p7==0&&p8==1) ap++; intp9=(pU[j-1]>0); if(p8==0&&p9==1) ap++; if(p9==0&&p2==1) ap++; if((p2+p3+p4+p5+p6+p7+p8+p9)>1&&(p2+p3+p4+p5+p6+p7+p8+p9)<7){ if(ap==1){ if((p2*p4*p6==0)&&(p4*p6*p8==0)){ dst.ptr<uchar>(i)[j]=0; isFinished=TRUE; } } } } }//扫描过程一结束 dst.copyTo(tmpImg); //扫描过程二开始 for(i=1;i<height;i++){ pU=tmpImg.ptr<uchar>(i-1); pC=tmpImg.ptr<uchar>(i); pD=tmpImg.ptr<uchar>(i+1); for(intj=1;j<width;j++){ if(pC[j]>0){ intap=0; intp2=(pU[j]>0); intp3=(pU[j+1]>0); if(p2==0&&p3==1) ap++; intp4=(pC[j+1]>0); if(p3==0&&p4==1) ap++; intp5=(pD[j+1]>0); if(p4==0&&p5==1) ap++; intp6=(pD[j]>0); if(p5==0&&p6==1) ap++; intp7=(pD[j-1]>0); if(p6==0&&p7==1) ap++; intp8=(pC[j-1]>0); if(p7==0&&p8==1) ap++; intp9=(pU[j-1]>0); if(p8==0&&p9==1) ap++; if(p9==0&&p2==1) ap++; if((p2+p3+p4+p5+p6+p7+p8+p9)>1&&(p2+p3+p4+p5+p6+p7+p8+p9)<7){ if(ap==1){ if((p2*p4*p8==0)&&(p2*p6*p8==0)){ dst.ptr<uchar>(i)[j]=0; isFinished=TRUE; } } } } } }//一次先行后列扫描完成 //如果在扫描过程中没有删除点,则提前退出 if(isFinished==FALSE) break; } } } #endofthin 细化算法,在处理毛笔字一类的时候效果很好。使用的过程中,注意需要保留的部分要处理为白色,也就是scalar(255) 来自为知笔记(Wiz) 目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

优秀的个人博客,低调大师

【20160924】GOCVHelper 图像增强部分(2)

//填充孔洞 //fillholes MatfillHoles(Matsrc){ Matdst=getInnerHoles(src); threshold(dst,dst,0,255,THRESH_BINARY_INV); dst=src+dst; returndst; } //获得图像中白色的比率 floatgetWhiteRate(Matsrc){ intiWhiteSum=0; for(intx=0;x<src.rows;x++){ for(inty=0;y<src.cols;y++){ if(src.at<uchar>(x,y)!=0) iWhiteSum=iWhiteSum+1; } } return(float)iWhiteSum/(float)(src.rows*src.cols); } //获得内部孔洞图像 MatgetInnerHoles(Matsrc){ Matclone=src.clone(); srand((unsigned)time(NULL));//生成时间种子 floatfPreRate=getWhiteRate(clone); floatfAftRate=0; do{ clone=src.clone(); //xy对于colsrows floodFill(clone,Point((int)rand()%src.cols,(int)rand()%src.rows),Scalar(255)); fAftRate=getWhiteRate(clone); }while(fAftRate<0.6); returnclone; } //endoffillHoles 填充孔洞算法是我参考相关资料自己实现的。填充孔洞的关键在于获得“内部孔洞图像”。我采用的方法是在图像上随机寻找一个点作为floodfill的初始点,然后以scalar(255)来进行填充。重复这个过程,直到整个图片的白色值占到了全部图像的60%. 填充前 填充后 来自为知笔记(Wiz) 目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

优秀的个人博客,低调大师

【20160924】GOCVHelper MFC增强算法(3)

//获得当前目录路径 staticCStringGetLocalPath(){ CStringcsCfgFilePath; GetModuleFileName(NULL,csCfgFilePath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); csCfgFilePath.ReleaseBuffer(); intnPos=csCfgFilePath.ReverseFind('\\'); csCfgFilePath=csCfgFilePath.Left(nPos); returncsCfgFilePath; } //获得.exe路径 staticCStringGetExePath() { CStringstrPath; GetModuleFileName(NULL,strPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); strPath.ReleaseBuffer(); returnstrPath; } MFC程序涉及的时候存在一个问题,就是某些操作会修改自动"当前路径"的值。这两个函数能够获得当前的路径。 //开机自动运行 staticBOOLSetAutoRun(CStringstrPath,boolflag) { CStringstr; HKEYhRegKey; BOOLbResult; str=_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"); if(RegOpenKey(HKEY_LOCAL_MACHINE,str,&hRegKey)!=ERROR_SUCCESS) bResult=FALSE; else { _splitpath(strPath.GetBuffer(0),NULL,NULL,str.GetBufferSetLength(MAX_PATH+1),NULL); strPath.ReleaseBuffer(); str.ReleaseBuffer();//str是键的名字 if(flag){ if(::RegSetValueEx(hRegKey,str,0,REG_SZ,(CONSTBYTE*)strPath.GetBuffer(0),strPath.GetLength())!=ERROR_SUCCESS) bResult=FALSE; else bResult=TRUE; }else{ if(::RegDeleteValue(hRegKey,str)!=ERROR_SUCCESS) bResult=FALSE; else bResult=TRUE; } strPath.ReleaseBuffer(); } returnbResult; } 这个无需更多说明。 来自为知笔记(Wiz) 目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

优秀的个人博客,低调大师

Rook v1.18 发布,存储增强

Rook v1.18 版本现已发布,这是一个功能丰富的版本,进一步提升了 Kubernetes 存储能力。本次 v1.18 版本带来了很多 Ceph 存储提供者的新功能。 Ceph CSI Operator Ceph CSI Operator 现在是默认且推荐的组件,用于配置 RBD、CephFS 和 NFS 卷的 CSI 驱动。此前,CSI 驱动由 Rook 自动配置。现在 CSI Operator 独立运行,管理 Ceph-CSI 驱动。 升级期间及整个 v1.18.x 版本中,Rook 会自动将旧的 CSI 配置转换为新的 CSI Operator CR,转换过程对用户透明。未来的 v1.19 版本中,Rook 将不再直接控制这些设置,让高级用户有更大灵活性。届时会发布新指南,讲解如何直接配置 Ceph CSI Operator CR。 目前需要注意: 安装时(详见快速入门指南),需要新建一个 manifest 文件:csi-operator.yaml 通过 Helm 安装时,rook-ceph chart 中新增的csi.rookUseCsiOperator设置默认启用,会自动安装 Ceph CSI Operator。 自 v1.15 起,CSI Operator 一直处于实验阶段,但稳定性已得到提升。如果遇到阻塞问题,可以通过在operator.yaml设置ROOK_USE_CSI_OPERATOR: false或 Helm 设置csi.rookUseCsiOperator: false来禁用 CSI Operator,回退到旧的 CSI 驱动。禁用后请务必提交问题报告。 Ceph CSI 3.15 Ceph CSI v3.15 版本带来了 RBD、CephFS 和 NFS 驱动的多项新特性和改进。此版本既支持通过 Ceph CSI Operator 配置,也支持 Rook 直接配置。下一版本(预计 12 月)将强制通过 Ceph CSI Operator 配置 CSI 驱动。届时会发布配置指南。 CephX 密钥轮换 该功能目前处于实验阶段。 Ceph 和 Rook 团队合作实现了 CephX 认证密钥的轮换功能。本次发布了新的实验性 API,支持 CephX 密钥轮换。新部署的 Rook 集群会在部分资源中显示新的 cephx 状态,也可以通过spec.security.cephx设置启动密钥轮换。 注意事项: 只有 Ceph 版本 v19.2.3 及以上支持 Rook 所需的密钥轮换功能。 Rook 管理的 Ceph 管理密钥暂时不能轮换,预计会在 v1.18 的补丁版本中支持,保证企业级可靠性。 由于 Ceph 架构限制,Ceph v19 版本的 Monitor(mon)密钥暂不支持轮换。Rook 和 Ceph 正在合作,争取未来 Ceph 版本安全支持 mon 密钥轮换。 完整密钥轮换文档见官网。 节点拓扑验证 创建 OSD 时可以通过节点标签配置拓扑。Ceph 对 CRUSH map 的拓扑有严格要求。之前拓扑无效时,只会在 Rook operator 日志中出现难懂错误。现在,Rook 会在创建 OSD 前验证拓扑有效性,无效时拒绝创建,并在 operator 日志中输出详细错误。 无效拓扑示例: 拓扑名称在集群中必须唯一,比如不能让机架和区域重名。 同名的子拓扑不能跨不同故障域存在,比如两个不同区域不能包含同名机架。 已有集群检测到无效拓扑时,Rook 仅记录警告并继续运行。 资源 ID 存储类通常从池(RBD)或文件系统(CephFS)配置卷。为支持多租户隔离,也可使用特定 RADOS 命名空间(RBD)或子卷组(CephFS)。之前创建这类存储类需由 Rook 生成 ID 并从 CR 状态中解析。现在可以直接在相关 CR 上声明 clusterID,简化流程。详情见: CephBlockPoolRadosNamespace CephFilesystemSubvolumeGroup Monitor 故障转移 在某些情况下,如果 Monitor(mon)失去法定人数,将自动故障转移。此前会等待 10-20 分钟超时,给 mon 机会恢复。现在如果分配的 K8s 节点已不存在,mon 会立即故障转移,无需等待超时。 版本支持 Ceph Tentacle v20 预计未来 1-2 个月内,Ceph 团队将发布 Ceph Tentacle(v20.2.0)版本。Rook 已开始测试并准备支持该版本的新特性。 Ceph 正式发布后,Rook 会第一时间添加官方支持。目前 Rook 仍持续测试 Ceph Reef v18 和 Ceph Squid v19。 Kubernetes v1.29 - v1.34 Rook 现在最低支持 Kubernetes v1.29,最高支持即将发布的 v1.34。Rook CI 会针对这些版本做测试,确保兼容性。如果仍需使用更旧版本 Kubernetes,虽未完全测试,但并无硬性阻止。 Helm v3.13+ 此前只测试最新 Helm 版本,文档也只要求 3.x 版本。现在 Rook 支持最近六个次版本及其补丁版本,具体支持 Helm 3.13 及以上版本。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册